From 49814fea0f7254b5d6475a87bb0d76c36df397d0 Mon Sep 17 00:00:00 2001 From: Aleksey Date: Fri, 18 Jun 2021 15:09:28 +0300 Subject: [PATCH 001/595] Update dependecies --- build.gradle | 6 +++--- gradle.properties | 10 +++++----- gradle/wrapper/gradle-wrapper.properties | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/build.gradle b/build.gradle index 83414897..9f2e81dc 100644 --- a/build.gradle +++ b/build.gradle @@ -7,12 +7,12 @@ buildscript { plugins { id 'idea' id 'eclipse' - id 'fabric-loom' version '0.7-SNAPSHOT' + id 'fabric-loom' version '0.8-SNAPSHOT' id 'maven-publish' } -sourceCompatibility = JavaVersion.VERSION_1_8 -targetCompatibility = JavaVersion.VERSION_1_8 +sourceCompatibility = JavaVersion.VERSION_16 +targetCompatibility = JavaVersion.VERSION_16 archivesBaseName = project.archives_base_name version = project.mod_version diff --git a/gradle.properties b/gradle.properties index 56332e1e..9f297e85 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,9 +3,9 @@ org.gradle.jvmargs=-Xmx2G # Fabric Properties # check these on https://fabricmc.net/use -minecraft_version=1.16.5 -yarn_mappings=6 -loader_version=0.11.3 +minecraft_version= 1.17 +yarn_mappings= 6 +loader_version= 0.11.6 # Mod Properties mod_version = 0.9.7-pre @@ -15,7 +15,7 @@ archives_base_name = better-end # Dependencies # currently not on the main fabric site, check on the maven: https://maven.fabricmc.net/net/fabricmc/fabric-api/fabric-api patchouli_version = 50-FABRIC -fabric_version = 0.32.9+1.16 +fabric_version = 0.35.2+1.17 canvas_version = 1.0.+ bclib_version = 0.1.38 -rei_version = 5.8.10 \ No newline at end of file +rei_version = 6.0.251-alpha \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index f371643e..69a97150 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.0-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists From 772e6b38e33a31216c46d1c83eacccedf76805c5 Mon Sep 17 00:00:00 2001 From: Aleksey Date: Fri, 18 Jun 2021 15:09:28 +0300 Subject: [PATCH 002/595] Update dependecies --- build.gradle | 6 +++--- gradle.properties | 10 +++++----- gradle/wrapper/gradle-wrapper.properties | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/build.gradle b/build.gradle index 83414897..9f2e81dc 100644 --- a/build.gradle +++ b/build.gradle @@ -7,12 +7,12 @@ buildscript { plugins { id 'idea' id 'eclipse' - id 'fabric-loom' version '0.7-SNAPSHOT' + id 'fabric-loom' version '0.8-SNAPSHOT' id 'maven-publish' } -sourceCompatibility = JavaVersion.VERSION_1_8 -targetCompatibility = JavaVersion.VERSION_1_8 +sourceCompatibility = JavaVersion.VERSION_16 +targetCompatibility = JavaVersion.VERSION_16 archivesBaseName = project.archives_base_name version = project.mod_version diff --git a/gradle.properties b/gradle.properties index f902a279..1736bc3f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,9 +3,9 @@ org.gradle.jvmargs=-Xmx2G # Fabric Properties # check these on https://fabricmc.net/use -minecraft_version=1.16.5 -yarn_mappings=6 -loader_version=0.11.3 +minecraft_version= 1.17 +yarn_mappings= 6 +loader_version= 0.11.6 # Mod Properties mod_version = 0.9.8-pre @@ -15,7 +15,7 @@ archives_base_name = better-end # Dependencies # currently not on the main fabric site, check on the maven: https://maven.fabricmc.net/net/fabricmc/fabric-api/fabric-api patchouli_version = 50-FABRIC -fabric_version = 0.32.9+1.16 +fabric_version = 0.35.2+1.17 canvas_version = 1.0.+ bclib_version = 0.1.38 -rei_version = 5.8.10 \ No newline at end of file +rei_version = 6.0.251-alpha \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index f371643e..69a97150 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.0-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists From b0922d967fa76da6def15bdb93c6cea162484e0a Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Sun, 20 Jun 2021 18:49:53 +0300 Subject: [PATCH 003/595] Server side crash fix --- gradle.properties | 4 ++-- src/main/java/ru/betterend/blocks/BulbVineLanternBlock.java | 3 +++ src/main/java/ru/betterend/blocks/ChandelierBlock.java | 5 +++++ src/main/java/ru/betterend/blocks/EmeraldIceBlock.java | 3 +++ .../java/ru/betterend/blocks/HydraluxPetalColoredBlock.java | 3 +++ src/main/java/ru/betterend/blocks/JellyshroomCapBlock.java | 4 ++++ .../java/ru/betterend/blocks/UmbrellaTreeMembraneBlock.java | 1 + src/main/java/ru/betterend/blocks/basis/EndLanternBlock.java | 3 +++ src/main/java/ru/betterend/blocks/basis/PedestalBlock.java | 5 +++++ .../java/ru/betterend/blocks/basis/StoneLanternBlock.java | 3 +++ src/main/java/ru/betterend/item/EnchantedItem.java | 3 +++ src/main/java/ru/betterend/item/EndAnvilItem.java | 3 +++ src/main/java/ru/betterend/item/tool/EndHammerItem.java | 3 +++ src/main/java/ru/betterend/rituals/InfusionRitual.java | 1 - src/main/resources/fabric.mod.json | 2 +- 15 files changed, 42 insertions(+), 4 deletions(-) diff --git a/gradle.properties b/gradle.properties index f902a279..a15787e2 100644 --- a/gradle.properties +++ b/gradle.properties @@ -8,7 +8,7 @@ yarn_mappings=6 loader_version=0.11.3 # Mod Properties -mod_version = 0.9.8-pre +mod_version = 0.9.8.1-pre maven_group = ru.betterend archives_base_name = better-end @@ -17,5 +17,5 @@ archives_base_name = better-end patchouli_version = 50-FABRIC fabric_version = 0.32.9+1.16 canvas_version = 1.0.+ -bclib_version = 0.1.38 +bclib_version = 0.1.42 rei_version = 5.8.10 \ No newline at end of file diff --git a/src/main/java/ru/betterend/blocks/BulbVineLanternBlock.java b/src/main/java/ru/betterend/blocks/BulbVineLanternBlock.java index 0302faab..dc0ad6c3 100644 --- a/src/main/java/ru/betterend/blocks/BulbVineLanternBlock.java +++ b/src/main/java/ru/betterend/blocks/BulbVineLanternBlock.java @@ -7,6 +7,8 @@ import org.jetbrains.annotations.Nullable; import com.google.common.collect.Maps; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; import net.minecraft.client.renderer.block.model.BlockModel; @@ -57,6 +59,7 @@ public class BulbVineLanternBlock extends EndLanternBlock implements IRenderType } @Override + @Environment(EnvType.CLIENT) public @Nullable BlockModel getBlockModel(ResourceLocation resourceLocation, BlockState blockState) { Map textures = Maps.newHashMap(); textures.put("%glow%", getGlowTexture()); diff --git a/src/main/java/ru/betterend/blocks/ChandelierBlock.java b/src/main/java/ru/betterend/blocks/ChandelierBlock.java index 21a906f7..622eeb5e 100644 --- a/src/main/java/ru/betterend/blocks/ChandelierBlock.java +++ b/src/main/java/ru/betterend/blocks/ChandelierBlock.java @@ -8,6 +8,8 @@ import org.jetbrains.annotations.Nullable; import com.google.common.collect.Maps; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.client.renderer.block.model.BlockModel; import net.minecraft.client.resources.model.BlockModelRotation; @@ -46,11 +48,13 @@ public class ChandelierBlock extends BaseAttachedBlock implements IRenderTyped, } @Override + @Environment(EnvType.CLIENT) public BlockModel getItemModel(ResourceLocation blockId) { return ModelsHelper.createItemModel(blockId); } @Override + @Environment(EnvType.CLIENT) public @Nullable BlockModel getBlockModel(ResourceLocation resourceLocation, BlockState blockState) { Optional pattern; switch (blockState.getValue(FACING)) { @@ -67,6 +71,7 @@ public class ChandelierBlock extends BaseAttachedBlock implements IRenderTyped, } @Override + @Environment(EnvType.CLIENT) public UnbakedModel getModelVariant(ResourceLocation stateId, BlockState blockState, Map modelCache) { String state = "_wall"; BlockModelRotation rotation = BlockModelRotation.X0_Y0; diff --git a/src/main/java/ru/betterend/blocks/EmeraldIceBlock.java b/src/main/java/ru/betterend/blocks/EmeraldIceBlock.java index f8c010f1..e4ebe572 100644 --- a/src/main/java/ru/betterend/blocks/EmeraldIceBlock.java +++ b/src/main/java/ru/betterend/blocks/EmeraldIceBlock.java @@ -6,6 +6,8 @@ import java.util.Random; import org.jetbrains.annotations.Nullable; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.client.renderer.block.model.BlockModel; import net.minecraft.core.BlockPos; @@ -85,6 +87,7 @@ public class EmeraldIceBlock extends HalfTransparentBlock implements IRenderType } @Override + @Environment(EnvType.CLIENT) public BlockModel getItemModel(ResourceLocation resourceLocation) { return getBlockModel(resourceLocation, defaultBlockState()); } diff --git a/src/main/java/ru/betterend/blocks/HydraluxPetalColoredBlock.java b/src/main/java/ru/betterend/blocks/HydraluxPetalColoredBlock.java index f9a882b5..599bbe15 100644 --- a/src/main/java/ru/betterend/blocks/HydraluxPetalColoredBlock.java +++ b/src/main/java/ru/betterend/blocks/HydraluxPetalColoredBlock.java @@ -4,6 +4,8 @@ import java.util.Optional; import org.jetbrains.annotations.Nullable; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.client.color.block.BlockColor; import net.minecraft.client.color.item.ItemColor; @@ -31,6 +33,7 @@ public class HydraluxPetalColoredBlock extends HydraluxPetalBlock implements ICo } @Override + @Environment(EnvType.CLIENT) public @Nullable BlockModel getBlockModel(ResourceLocation resourceLocation, BlockState blockState) { String path = "betterend:block/block_petal_colored"; Optional pattern = Patterns.createJson(Patterns.BLOCK_PETAL_COLORED, path, path); diff --git a/src/main/java/ru/betterend/blocks/JellyshroomCapBlock.java b/src/main/java/ru/betterend/blocks/JellyshroomCapBlock.java index caf38d89..681e3578 100644 --- a/src/main/java/ru/betterend/blocks/JellyshroomCapBlock.java +++ b/src/main/java/ru/betterend/blocks/JellyshroomCapBlock.java @@ -7,6 +7,8 @@ import org.jetbrains.annotations.Nullable; import com.google.common.collect.Lists; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.client.color.block.BlockColor; import net.minecraft.client.color.item.ItemColor; @@ -71,11 +73,13 @@ public class JellyshroomCapBlock extends SlimeBlock implements IRenderTyped, Blo } @Override + @Environment(EnvType.CLIENT) public BlockModel getItemModel(ResourceLocation resourceLocation) { return getBlockModel(resourceLocation, defaultBlockState()); } @Override + @Environment(EnvType.CLIENT) public @Nullable BlockModel getBlockModel(ResourceLocation resourceLocation, BlockState blockState) { Optional pattern = Patterns.createJson(Patterns.BLOCK_COLORED, "jellyshroom_cap"); return ModelsHelper.fromPattern(pattern); diff --git a/src/main/java/ru/betterend/blocks/UmbrellaTreeMembraneBlock.java b/src/main/java/ru/betterend/blocks/UmbrellaTreeMembraneBlock.java index 67ad0a06..b267bf84 100644 --- a/src/main/java/ru/betterend/blocks/UmbrellaTreeMembraneBlock.java +++ b/src/main/java/ru/betterend/blocks/UmbrellaTreeMembraneBlock.java @@ -81,6 +81,7 @@ public class UmbrellaTreeMembraneBlock extends SlimeBlock implements IRenderType } @Override + @Environment(EnvType.CLIENT) public BlockModel getItemModel(ResourceLocation resourceLocation) { return getBlockModel(resourceLocation, defaultBlockState()); } diff --git a/src/main/java/ru/betterend/blocks/basis/EndLanternBlock.java b/src/main/java/ru/betterend/blocks/basis/EndLanternBlock.java index f66fa6dc..f4ada8b3 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndLanternBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndLanternBlock.java @@ -2,6 +2,8 @@ package ru.betterend.blocks.basis; import java.util.Map; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.client.resources.model.UnbakedModel; import net.minecraft.core.BlockPos; @@ -125,6 +127,7 @@ public class EndLanternBlock extends BaseBlockNotFull implements SimpleWaterlogg } @Override + @Environment(EnvType.CLIENT) public UnbakedModel getModelVariant(ResourceLocation stateId, BlockState blockState, Map modelCache) { String floor = blockState.getValue(IS_FLOOR) ? "_floor" : ""; ResourceLocation modelId = new ResourceLocation(stateId.getNamespace(), diff --git a/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java b/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java index 886e8435..2f91a682 100644 --- a/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java @@ -10,6 +10,8 @@ import org.jetbrains.annotations.Nullable; import com.google.common.collect.Lists; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.client.renderer.block.model.BlockModel; import net.minecraft.client.resources.model.UnbakedModel; @@ -370,11 +372,13 @@ public class PedestalBlock extends BaseBlockNotFull implements EntityBlock { } @Override + @Environment(EnvType.CLIENT) public BlockModel getItemModel(ResourceLocation blockId) { return getBlockModel(blockId, defaultBlockState()); } @Override + @Environment(EnvType.CLIENT) public @Nullable BlockModel getBlockModel(ResourceLocation resourceLocation, BlockState blockState) { Map textures = createTexturesMap(); PedestalState state = blockState.getValue(STATE); @@ -401,6 +405,7 @@ public class PedestalBlock extends BaseBlockNotFull implements EntityBlock { } @Override + @Environment(EnvType.CLIENT) public UnbakedModel getModelVariant(ResourceLocation stateId, BlockState blockState, Map modelCache) { PedestalState state = blockState.getValue(STATE); ResourceLocation modelId = new ResourceLocation(stateId.getNamespace(), diff --git a/src/main/java/ru/betterend/blocks/basis/StoneLanternBlock.java b/src/main/java/ru/betterend/blocks/basis/StoneLanternBlock.java index b7319079..b8f2b7c9 100644 --- a/src/main/java/ru/betterend/blocks/basis/StoneLanternBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/StoneLanternBlock.java @@ -4,6 +4,8 @@ import java.util.Optional; import org.jetbrains.annotations.Nullable; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.client.color.block.BlockColor; import net.minecraft.client.color.item.ItemColor; @@ -44,6 +46,7 @@ public class StoneLanternBlock extends EndLanternBlock implements IColorProvider } @Override + @Environment(EnvType.CLIENT) public @Nullable BlockModel getBlockModel(ResourceLocation resourceLocation, BlockState blockState) { String blockName = resourceLocation.getPath(); Optional pattern = blockState.getValue(IS_FLOOR) ? diff --git a/src/main/java/ru/betterend/item/EnchantedItem.java b/src/main/java/ru/betterend/item/EnchantedItem.java index d210c855..814b9644 100644 --- a/src/main/java/ru/betterend/item/EnchantedItem.java +++ b/src/main/java/ru/betterend/item/EnchantedItem.java @@ -1,5 +1,7 @@ package ru.betterend.item; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import net.minecraft.client.renderer.block.model.BlockModel; import net.minecraft.core.Registry; import net.minecraft.resources.ResourceLocation; @@ -25,6 +27,7 @@ public class EnchantedItem extends ModelProviderItem { } @Override + @Environment(EnvType.CLIENT) public BlockModel getItemModel(ResourceLocation resourceLocation) { ResourceLocation sourceId = Registry.ITEM.getKey(source); return ModelsHelper.createItemModel(sourceId); diff --git a/src/main/java/ru/betterend/item/EndAnvilItem.java b/src/main/java/ru/betterend/item/EndAnvilItem.java index 9b8b4d04..c1b1625c 100644 --- a/src/main/java/ru/betterend/item/EndAnvilItem.java +++ b/src/main/java/ru/betterend/item/EndAnvilItem.java @@ -1,5 +1,7 @@ package ru.betterend.item; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import net.minecraft.client.renderer.block.model.BlockModel; import net.minecraft.core.Registry; import net.minecraft.resources.ResourceLocation; @@ -30,6 +32,7 @@ public class EndAnvilItem extends BaseAnvilItem { } @Override + @Environment(EnvType.CLIENT) public BlockModel getItemModel(ResourceLocation resourceLocation) { Block block = getBlock(); ResourceLocation blockId = Registry.BLOCK.getKey(block); diff --git a/src/main/java/ru/betterend/item/tool/EndHammerItem.java b/src/main/java/ru/betterend/item/tool/EndHammerItem.java index fa990cf9..0cef9ded 100644 --- a/src/main/java/ru/betterend/item/tool/EndHammerItem.java +++ b/src/main/java/ru/betterend/item/tool/EndHammerItem.java @@ -8,6 +8,8 @@ import com.google.common.collect.Multimap; import com.google.common.collect.Sets; import io.netty.util.internal.ThreadLocalRandom; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.tool.attribute.v1.DynamicAttributeTool; import net.minecraft.client.renderer.block.model.BlockModel; import net.minecraft.core.BlockPos; @@ -133,6 +135,7 @@ public class EndHammerItem extends DiggerItem implements DynamicAttributeTool, I } @Override + @Environment(EnvType.CLIENT) public BlockModel getItemModel(ResourceLocation resourceLocation) { return ModelsHelper.createHandheldItem(resourceLocation); } diff --git a/src/main/java/ru/betterend/rituals/InfusionRitual.java b/src/main/java/ru/betterend/rituals/InfusionRitual.java index f240ec47..005e6b38 100644 --- a/src/main/java/ru/betterend/rituals/InfusionRitual.java +++ b/src/main/java/ru/betterend/rituals/InfusionRitual.java @@ -11,7 +11,6 @@ import net.minecraft.nbt.CompoundTag; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.Container; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index b880fc77..90a89ea6 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -46,7 +46,7 @@ "fabricloader": ">=0.11.0", "fabric": ">=0.32.0", "minecraft": ">=1.16.4", - "bclib": ">=0.1.38" + "bclib": ">=0.1.42" }, "suggests": { "byg": ">=1.1.3", From ff3194fedf97713d3fb22beea7b3f386abc0a4dc Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Mon, 21 Jun 2021 01:22:30 +0300 Subject: [PATCH 004/595] Small water plant placing fix --- gradle.properties | 2 +- src/main/java/ru/betterend/blocks/FlamaeaBlock.java | 2 +- src/main/java/ru/betterend/interfaces/ISpetialItem.java | 7 ------- 3 files changed, 2 insertions(+), 9 deletions(-) delete mode 100644 src/main/java/ru/betterend/interfaces/ISpetialItem.java diff --git a/gradle.properties b/gradle.properties index a15787e2..85f2c954 100644 --- a/gradle.properties +++ b/gradle.properties @@ -8,7 +8,7 @@ yarn_mappings=6 loader_version=0.11.3 # Mod Properties -mod_version = 0.9.8.1-pre +mod_version = 0.9.8.2-pre maven_group = ru.betterend archives_base_name = better-end diff --git a/src/main/java/ru/betterend/blocks/FlamaeaBlock.java b/src/main/java/ru/betterend/blocks/FlamaeaBlock.java index bba1a69d..03879d2f 100644 --- a/src/main/java/ru/betterend/blocks/FlamaeaBlock.java +++ b/src/main/java/ru/betterend/blocks/FlamaeaBlock.java @@ -18,8 +18,8 @@ import net.minecraft.world.level.material.Material; import net.minecraft.world.level.storage.loot.LootContext; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; +import ru.bclib.interfaces.ISpetialItem; import ru.betterend.blocks.basis.EndPlantBlock; -import ru.betterend.interfaces.ISpetialItem; public class FlamaeaBlock extends EndPlantBlock implements ISpetialItem { private static final VoxelShape SHAPE = Block.box(0, 0, 0, 16, 1, 16); diff --git a/src/main/java/ru/betterend/interfaces/ISpetialItem.java b/src/main/java/ru/betterend/interfaces/ISpetialItem.java deleted file mode 100644 index ef19bc36..00000000 --- a/src/main/java/ru/betterend/interfaces/ISpetialItem.java +++ /dev/null @@ -1,7 +0,0 @@ -package ru.betterend.interfaces; - -public interface ISpetialItem { - public int getStackSize(); - - public boolean canPlaceOnWater(); -} From bed07d2ad79afb6da9ca471ee1ea90edf8ccc759 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Mon, 21 Jun 2021 12:16:54 +0300 Subject: [PATCH 005/595] Fixed missing caves in most biomes --- .../java/ru/betterend/registry/EndBiomes.java | 16 ++++------------ .../java/ru/betterend/world/biome/EndBiome.java | 12 ++++++++++-- .../world/generator/BetterEndBiomeSource.java | 3 ++- 3 files changed, 16 insertions(+), 15 deletions(-) diff --git a/src/main/java/ru/betterend/registry/EndBiomes.java b/src/main/java/ru/betterend/registry/EndBiomes.java index b39fd679..f3cdcbc9 100644 --- a/src/main/java/ru/betterend/registry/EndBiomes.java +++ b/src/main/java/ru/betterend/registry/EndBiomes.java @@ -61,7 +61,6 @@ import ru.betterend.world.generator.BiomeType; import ru.betterend.world.generator.GeneratorOptions; public class EndBiomes { - private static final Map ID_MAP = Maps.newHashMap(); public static final Set FABRIC_VOID = Sets.newHashSet(); private static final Set SUBBIOMES_UNMUTABLES = Sets.newHashSet(); @@ -154,6 +153,7 @@ public class EndBiomes { hasCaves = JsonFactory.getBoolean(element.getAsJsonObject(), "has_caves", true); } EndBiome endBiome = new EndBiome(id, biome, fog, chance, hasCaves); + System.out.println("Added biome: " + endBiome); if (isVoid) { VOID_BIOMES.addBiomeMutable(endBiome); @@ -161,7 +161,7 @@ public class EndBiomes { else { LAND_BIOMES.addBiomeMutable(endBiome); } - ID_MAP.put(id, endBiome); + BiomeAPI.registerBiome(endBiome); } } } @@ -274,7 +274,7 @@ public class EndBiomes { parent.addSubBiome(endBiome); SUBBIOMES.add(endBiome); SUBBIOMES_UNMUTABLES.add(endBiome.getID()); - ID_MAP.put(endBiome.getID(), endBiome); + BiomeAPI.registerBiome(endBiome); } return endBiome; } @@ -291,7 +291,6 @@ public class EndBiomes { parent.addSubBiome(biome); SUBBIOMES.add(biome); SUBBIOMES_UNMUTABLES.add(biome.getID()); - ID_MAP.put(biome.getID(), biome); BiomeAPI.addEndLandBiomeToFabricApi(biome); } return biome; @@ -307,7 +306,6 @@ public class EndBiomes { if (Configs.BIOME_CONFIG.getBoolean(biome.getID(), "enabled", true)) { BiomeAPI.registerBiome(biome); addToPicker(biome, type); - ID_MAP.put(biome.getID(), biome); if (type == BiomeType.LAND) { BiomeAPI.addEndLandBiomeToFabricApi(biome); } @@ -328,7 +326,6 @@ public class EndBiomes { BiomeAPI.registerBiome(biome); SUBBIOMES.add(biome); SUBBIOMES_UNMUTABLES.add(biome.getID()); - ID_MAP.put(biome.getID(), biome); BiomeAPI.addEndLandBiomeToFabricApi(biome); } return biome; @@ -341,7 +338,7 @@ public class EndBiomes { */ public static void addSubBiomeIntegration(EndBiome biome, ResourceLocation parent) { if (Configs.BIOME_CONFIG.getBoolean(biome.getID(), "enabled", true)) { - EndBiome parentBiome = ID_MAP.get(parent); + BCLBiome parentBiome = BiomeAPI.getBiome(parent); if (parentBiome != null && !parentBiome.containsSubBiome(biome)) { parentBiome.addSubBiome(biome); } @@ -369,7 +366,6 @@ public class EndBiomes { if (Configs.BIOME_CONFIG.getBoolean(biome.getID(), "enabled", true)) { BiomeAPI.registerBiome(biome); CAVE_BIOMES.addBiome(biome); - ID_MAP.put(biome.getID(), biome); } return biome; } @@ -377,8 +373,4 @@ public class EndBiomes { public static EndCaveBiome getCaveBiome(int x, int z) { return (EndCaveBiome) caveBiomeMap.getBiome(x, z); } - - public static boolean hasBiome(ResourceLocation biomeID) { - return ID_MAP.containsKey(biomeID); - } } diff --git a/src/main/java/ru/betterend/world/biome/EndBiome.java b/src/main/java/ru/betterend/world/biome/EndBiome.java index e2c210b5..b0e33d89 100644 --- a/src/main/java/ru/betterend/world/biome/EndBiome.java +++ b/src/main/java/ru/betterend/world/biome/EndBiome.java @@ -5,14 +5,22 @@ import net.minecraft.world.level.biome.Biome; import ru.bclib.world.biomes.BCLBiome; import ru.bclib.world.biomes.BCLBiomeDef; import ru.betterend.config.Configs; +import ru.betterend.registry.EndFeatures; public class EndBiome extends BCLBiome { - public EndBiome(BCLBiomeDef definition) { - super(definition.loadConfigValues(Configs.BIOME_CONFIG)); + public EndBiome(BCLBiomeDef def) { + super(updateDef(def)); + } public EndBiome(ResourceLocation id, Biome biome, float fogDensity, float genChance, boolean hasCaves) { super(id, biome, fogDensity, genChance); this.addCustomData("has_caves", hasCaves); } + + private static BCLBiomeDef updateDef(BCLBiomeDef def) { + def.loadConfigValues(Configs.BIOME_CONFIG); + EndFeatures.addDefaultFeatures(def); + return def; + } } diff --git a/src/main/java/ru/betterend/world/generator/BetterEndBiomeSource.java b/src/main/java/ru/betterend/world/generator/BetterEndBiomeSource.java index 602a095b..c5f81571 100644 --- a/src/main/java/ru/betterend/world/generator/BetterEndBiomeSource.java +++ b/src/main/java/ru/betterend/world/generator/BetterEndBiomeSource.java @@ -63,7 +63,8 @@ public class BetterEndBiomeSource extends BiomeSource { private static List getBiomes(Registry biomeRegistry) { List list = Lists.newArrayList(); biomeRegistry.forEach((biome) -> { - if (EndBiomes.hasBiome(biomeRegistry.getKey(biome))) { + BCLBiome bclBiome = BiomeAPI.getBiome(biomeRegistry.getKey(biome)); + if (bclBiome instanceof EndBiome) { list.add(biome); } }); From 684f3073ca4b836c3792429702f424df702a2000 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Mon, 21 Jun 2021 12:25:26 +0300 Subject: [PATCH 006/595] Fixed missing cave population & tags --- .../java/ru/betterend/registry/EndBiomes.java | 1 - .../java/ru/betterend/registry/EndTags.java | 47 +++---------------- 2 files changed, 6 insertions(+), 42 deletions(-) diff --git a/src/main/java/ru/betterend/registry/EndBiomes.java b/src/main/java/ru/betterend/registry/EndBiomes.java index f3cdcbc9..7dd8ee5f 100644 --- a/src/main/java/ru/betterend/registry/EndBiomes.java +++ b/src/main/java/ru/betterend/registry/EndBiomes.java @@ -153,7 +153,6 @@ public class EndBiomes { hasCaves = JsonFactory.getBoolean(element.getAsJsonObject(), "has_caves", true); } EndBiome endBiome = new EndBiome(id, biome, fog, chance, hasCaves); - System.out.println("Added biome: " + endBiome); if (isVoid) { VOID_BIOMES.addBiomeMutable(endBiome); diff --git a/src/main/java/ru/betterend/registry/EndTags.java b/src/main/java/ru/betterend/registry/EndTags.java index 7ce95c65..bcae1aff 100644 --- a/src/main/java/ru/betterend/registry/EndTags.java +++ b/src/main/java/ru/betterend/registry/EndTags.java @@ -1,20 +1,14 @@ package ru.betterend.registry; import java.util.List; -import java.util.function.Supplier; - import com.google.common.collect.Lists; -import net.fabricmc.fabric.api.tag.TagRegistry; import net.fabricmc.fabric.impl.tool.attribute.ToolManagerImpl; import net.fabricmc.fabric.impl.tool.attribute.handlers.ModdedToolsVanillaBlocksToolHandler; import net.minecraft.core.Registry; -import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.BlockTags; import net.minecraft.tags.ItemTags; import net.minecraft.tags.Tag; -import net.minecraft.tags.Tag.Named; -import net.minecraft.tags.TagCollection; import net.minecraft.world.food.FoodProperties; import net.minecraft.world.item.Item; import net.minecraft.world.level.biome.Biome; @@ -39,43 +33,12 @@ public class EndTags { // https://fabricmc.net/wiki/tutorial:tags // Block Tags - public static final Tag.Named PEDESTALS = makeBlockTag("pedestal"); - public static final Tag.Named END_STONES = makeCommonBlockTag("end_stones"); - public static final Tag.Named DRAGON_IMMUNE = getMCBlockTag("dragon_immune"); + public static final Tag.Named PEDESTALS = TagAPI.makeBlockTag(BetterEnd.MOD_ID, "pedestal"); + public static final Tag.Named END_STONES = TagAPI.makeCommonBlockTag("end_stones"); + public static final Tag.Named DRAGON_IMMUNE = TagAPI.getMCBlockTag("dragon_immune"); // Item Tags - public final static Tag.Named HAMMERS = makeFabricItemTag("hammers"); - - public static Tag.Named makeTag(Supplier> containerSupplier, ResourceLocation id) { - Tag tag = containerSupplier.get().getTag(id); - return tag == null ? TagRegistry.create(id, containerSupplier) : (Named) tag; - } - - public static Tag.Named makeBlockTag(String name) { - return makeTag(BlockTags::getAllTags, BetterEnd.makeID(name)); - } - - public static Tag.Named makeItemTag(String name) { - return makeTag(ItemTags::getAllTags, BetterEnd.makeID(name)); - } - - public static Tag.Named makeCommonBlockTag(String name) { - return makeTag(BlockTags::getAllTags, new ResourceLocation("c", name)); - } - - public static Tag.Named makeCommonItemTag(String name) { - return makeTag(ItemTags::getAllTags, new ResourceLocation("c", name)); - } - - public static Tag.Named makeFabricItemTag(String name) { - return makeTag(ItemTags::getAllTags, new ResourceLocation("fabric", name)); - } - - public static Tag.Named getMCBlockTag(String name) { - ResourceLocation id = new ResourceLocation(name); - Tag tag = BlockTags.getAllTags().getTag(id); - return tag == null ? (Named) TagRegistry.block(id) : (Named) tag; - } + public final static Tag.Named HAMMERS = TagAPI.makeItemTag("fabric", "hammers"); public static void register() { TagAPI.addEndGround(EndBlocks.THALLASIUM.ore); @@ -104,6 +67,8 @@ public class EndTags { ComposterBlockAccessor.callAdd(0.1F, block); } }); + TagAPI.addEndGround(EndBlocks.CAVE_MOSS); + TagHelper.addTag(BlockTags.NYLIUM, EndBlocks.CAVE_MOSS); BonemealAPI.addSpreadableBlock(EndBlocks.CAVE_MOSS); List hammers = Lists.newArrayList(); From 4dce2d5d7eebccb82a9e0fc55ba2fa056cbcd4d0 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Mon, 21 Jun 2021 12:46:52 +0300 Subject: [PATCH 007/595] Fix for caves breaking surface vertically --- gradle.properties | 2 +- .../terrain/caves/TunelCaveFeature.java | 33 +++++++++++++++++-- 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/gradle.properties b/gradle.properties index 85f2c954..b169f1c8 100644 --- a/gradle.properties +++ b/gradle.properties @@ -8,7 +8,7 @@ yarn_mappings=6 loader_version=0.11.3 # Mod Properties -mod_version = 0.9.8.2-pre +mod_version = 0.9.8.3-pre maven_group = ru.betterend archives_base_name = better-end diff --git a/src/main/java/ru/betterend/world/features/terrain/caves/TunelCaveFeature.java b/src/main/java/ru/betterend/world/features/terrain/caves/TunelCaveFeature.java index ed518538..cac45184 100644 --- a/src/main/java/ru/betterend/world/features/terrain/caves/TunelCaveFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/caves/TunelCaveFeature.java @@ -12,14 +12,17 @@ import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; import net.minecraft.util.Mth; import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.Heightmap.Types; import net.minecraft.world.level.levelgen.feature.Feature; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import ru.bclib.api.BiomeAPI; import ru.bclib.api.TagAPI; import ru.bclib.util.BlocksHelper; +import ru.bclib.world.biomes.BCLBiome; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBiomes; import ru.betterend.world.biome.cave.EndCaveBiome; @@ -43,17 +46,30 @@ public class TunelCaveFeature extends EndCaveFeature { Set positions = Sets.newHashSet(); MutableBlockPos pos = new MutableBlockPos(); + + float a = hasCaves(world, pos.set(x1, 0, z1)) ? 1F : 0F; + float b = hasCaves(world, pos.set(x2, 0, z1)) ? 1F : 0F; + float c = hasCaves(world, pos.set(x1, 0, z2)) ? 1F : 0F; + float d = hasCaves(world, pos.set(x2, 0, z2)) ? 1F : 0F; + for (int x = x1; x < x2; x++) { pos.setX(x); + float dx = (float) (x - x1) / 16F; + float da = Mth.lerp(dx, a, b); + float db = Mth.lerp(dx, c, d); for (int z = z1; z < z2; z++) { pos.setZ(z); + float dz = (float) (z - z1) / 16F; + float density = 1 - Mth.lerp(dz, da, db); + int wheight = world.getHeight(Types.WORLD_SURFACE_WG, x, z); for (int y = 0; y < y2; y++) { pos.setY(y); + float gradient = 1 - Mth.clamp((wheight - y) * 0.1F, 0F, 1F); float val = Mth.abs((float) noiseH.eval(x * 0.02, y * 0.01, z * 0.02)); float vert = Mth.sin((y + (float) noiseV.eval(x * 0.01, z * 0.01) * 20) * 0.1F) * 0.9F; float dist = (float) noiseD.eval(x * 0.1, y * 0.1, z * 0.1) * 0.12F; - vert *= vert; - if (val + vert + dist < 0.15 && world.getBlockState(pos).is(TagAPI.GEN_TERRAIN) && noWaterNear(world, pos)) { + val = (val + vert * vert + dist) + density + gradient; + if (val < 0.15 && world.getBlockState(pos).is(TagAPI.GEN_TERRAIN) && noWaterNear(world, pos)) { BlocksHelper.setWithoutUpdate(world, pos, AIR); positions.add(pos.immutable()); int height = world.getHeight(Types.WORLD_SURFACE_WG, pos.getX(), pos.getZ()); @@ -192,4 +208,17 @@ public class TunelCaveFeature extends EndCaveFeature { } }); } + + protected boolean hasCaves(WorldGenLevel world, BlockPos pos) { + return hasCavesInBiome(world, pos.offset(-8, 0, -8)) && + hasCavesInBiome(world, pos.offset(8, 0, -8)) && + hasCavesInBiome(world, pos.offset(-8, 0, 8)) && + hasCavesInBiome(world, pos.offset(8, 0, 8)); + } + + protected boolean hasCavesInBiome(WorldGenLevel world, BlockPos pos) { + Biome biome = world.getBiome(pos); + BCLBiome endBiome = BiomeAPI.getFromBiome(biome); + return endBiome.getCustomData("has_caves", true); + } } From 37394eba114387f59ca4242104cfaa26f6c3a0ba Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Mon, 21 Jun 2021 21:38:56 +0300 Subject: [PATCH 008/595] Parallel cave generation & block fixing --- .../java/ru/betterend/util/BlockFixer.java | 328 +++++++++--------- .../terrain/caves/EndCaveFeature.java | 22 +- .../terrain/caves/RoundCaveFeature.java | 69 ++-- .../terrain/caves/TunelCaveFeature.java | 59 ++-- 4 files changed, 243 insertions(+), 235 deletions(-) diff --git a/src/main/java/ru/betterend/util/BlockFixer.java b/src/main/java/ru/betterend/util/BlockFixer.java index 9e9a0dcb..f0cdbc91 100644 --- a/src/main/java/ru/betterend/util/BlockFixer.java +++ b/src/main/java/ru/betterend/util/BlockFixer.java @@ -1,6 +1,7 @@ package ru.betterend.util; import java.util.Set; +import java.util.stream.IntStream; import com.google.common.collect.Sets; @@ -20,187 +21,194 @@ import ru.betterend.blocks.basis.FurBlock; import ru.betterend.registry.EndBlocks; public class BlockFixer { - private static final MutableBlockPos POS = new MutableBlockPos(); private static final BlockState AIR = Blocks.AIR.defaultBlockState(); private static final BlockState WATER = Blocks.WATER.defaultBlockState(); - + public static void fixBlocks(LevelAccessor world, BlockPos start, BlockPos end) { - BlockState state; - Set doubleCheck = Sets.newHashSet(); - for (int x = start.getX(); x <= end.getX(); x++) { - POS.setX(x); - for (int z = start.getZ(); z <= end.getZ(); z++) { - POS.setZ(z); - for (int y = start.getY(); y <= end.getY(); y++) { - POS.setY(y); - state = world.getBlockState(POS); - - if (state.getBlock() instanceof FurBlock) { - doubleCheck.add(POS.immutable()); - } - // Liquids - else if (!state.getFluidState().isEmpty()) { - if (!state.canSurvive(world, POS)) { - BlocksHelper.setWithoutUpdate(world, POS, WATER); - POS.setY(POS.getY() - 1); - state = world.getBlockState(POS); - while (!state.canSurvive(world, POS)) { - state = state.getFluidState().isEmpty() ? AIR : WATER; - BlocksHelper.setWithoutUpdate(world, POS, state); - POS.setY(POS.getY() - 1); - state = world.getBlockState(POS); - } - } - POS.setY(y - 1); - if (world.isEmptyBlock(POS)) { - POS.setY(y); - while (!world.getFluidState(POS).isEmpty()) { - BlocksHelper.setWithoutUpdate(world, POS, AIR); - POS.setY(POS.getY() + 1); - } - continue; - } - for (Direction dir : BlocksHelper.HORIZONTAL) { - if (world.isEmptyBlock(POS.relative(dir))) { - world.getLiquidTicks().scheduleTick(POS, state.getFluidState().getType(), 0); - break; - } - } - } - else if (state.is(EndBlocks.SMARAGDANT_CRYSTAL)) { + Set doubleCheck = Sets.newConcurrentHashSet(); + int dx = end.getX() - start.getX() + 1; + int dz = end.getZ() - start.getZ() + 1; + int count = dx * dz; + IntStream.range(0, count).parallel().forEach(index -> { + MutableBlockPos POS = new MutableBlockPos(); + POS.setX((index % dx) + start.getX()); + POS.setZ((index / dx) + start.getZ()); + BlockState state; + for (int y = start.getY(); y <= end.getY(); y++) { + POS.setY(y); + state = world.getBlockState(POS); + + if (state.getBlock() instanceof FurBlock) { + doubleCheck.add(POS.immutable()); + } + // Liquids + else if (!state.getFluidState().isEmpty()) { + if (!state.canSurvive(world, POS)) { + setWithoutUpdate(world, POS, WATER); POS.setY(POS.getY() - 1); - if (world.isEmptyBlock(POS)) { + state = world.getBlockState(POS); + while (!state.canSurvive(world, POS)) { + state = state.getFluidState().isEmpty() ? AIR : WATER; + setWithoutUpdate(world, POS, state); + POS.setY(POS.getY() - 1); + state = world.getBlockState(POS); + } + } + POS.setY(y - 1); + if (world.isEmptyBlock(POS)) { + POS.setY(y); + while (!world.getFluidState(POS).isEmpty()) { + setWithoutUpdate(world, POS, AIR); POS.setY(POS.getY() + 1); - while (state.is(EndBlocks.SMARAGDANT_CRYSTAL)) { - BlocksHelper.setWithoutUpdate(world, POS, AIR); + } + continue; + } + for (Direction dir : BlocksHelper.HORIZONTAL) { + if (world.isEmptyBlock(POS.relative(dir))) { + world.getLiquidTicks().scheduleTick(POS, state.getFluidState().getType(), 0); + break; + } + } + } + else if (state.is(EndBlocks.SMARAGDANT_CRYSTAL)) { + POS.setY(POS.getY() - 1); + if (world.isEmptyBlock(POS)) { + POS.setY(POS.getY() + 1); + while (state.is(EndBlocks.SMARAGDANT_CRYSTAL)) { + setWithoutUpdate(world, POS, AIR); + POS.setY(POS.getY() + 1); + state = world.getBlockState(POS); + } + } + } + else if (state.getBlock() instanceof StalactiteBlock) { + if (!state.canSurvive(world, POS)) { + if (world.getBlockState(POS.above()).getBlock() instanceof StalactiteBlock) { + while (state.getBlock() instanceof StalactiteBlock) { + setWithoutUpdate(world, POS, AIR); POS.setY(POS.getY() + 1); state = world.getBlockState(POS); } } - } - else if (state.getBlock() instanceof StalactiteBlock) { - if (!state.canSurvive(world, POS)) { - if (world.getBlockState(POS.above()).getBlock() instanceof StalactiteBlock) { - while (state.getBlock() instanceof StalactiteBlock) { - BlocksHelper.setWithoutUpdate(world, POS, AIR); - POS.setY(POS.getY() + 1); - state = world.getBlockState(POS); - } - } - else { - while (state.getBlock() instanceof StalactiteBlock) { - BlocksHelper.setWithoutUpdate(world, POS, AIR); - POS.setY(POS.getY() - 1); - state = world.getBlockState(POS); - } - } - } - } - else if (state.is(EndBlocks.CAVE_PUMPKIN)) { - if (!world.getBlockState(POS.above()).is(EndBlocks.CAVE_PUMPKIN_SEED)) { - BlocksHelper.setWithoutUpdate(world, POS, AIR); - } - } - else if (!state.canSurvive(world, POS)) { - // Chorus - if (state.is(Blocks.CHORUS_PLANT)) { - Set ends = Sets.newHashSet(); - Set add = Sets.newHashSet(); - ends.add(POS.immutable()); - - for (int i = 0; i < 64 && !ends.isEmpty(); i++) { - ends.forEach((pos) -> { - BlocksHelper.setWithoutUpdate(world, pos, AIR); - for (Direction dir : BlocksHelper.HORIZONTAL) { - BlockPos p = pos.relative(dir); - BlockState st = world.getBlockState(p); - if ((st.is(Blocks.CHORUS_PLANT) || st.is(Blocks.CHORUS_FLOWER)) && !st.canSurvive(world, p)) { - add.add(p); - } - } - BlockPos p = pos.above(); - BlockState st = world.getBlockState(p); - if ((st.is(Blocks.CHORUS_PLANT) || st.is(Blocks.CHORUS_FLOWER)) && !st.canSurvive(world, p)) { - add.add(p); - } - }); - ends.clear(); - ends.addAll(add); - add.clear(); - } - } - // Vines - else if (state.getBlock() instanceof BaseVineBlock) { - while (world.getBlockState(POS).getBlock() instanceof BaseVineBlock) { - BlocksHelper.setWithoutUpdate(world, POS, AIR); - POS.setY(POS.getY() - 1); - } - } - // Falling blocks - else if (state.getBlock() instanceof FallingBlock) { - BlockState falling = state; - - POS.setY(POS.getY() - 1); - state = world.getBlockState(POS); - - int ray = BlocksHelper.downRayRep(world, POS.immutable(), 64); - if (ray > 32) { - BlocksHelper.setWithoutUpdate(world, POS, Blocks.END_STONE.defaultBlockState()); - if (world.getRandom().nextBoolean()) { - POS.setY(POS.getY() - 1); - state = world.getBlockState(POS); - BlocksHelper.setWithoutUpdate(world, POS, Blocks.END_STONE.defaultBlockState()); - } - } - else { - POS.setY(y); - BlockState replacement = AIR; - for (Direction dir : BlocksHelper.HORIZONTAL) { - state = world.getBlockState(POS.relative(dir)); - if (!state.getFluidState().isEmpty()) { - replacement = state; - break; - } - } - BlocksHelper.setWithoutUpdate(world, POS, replacement); - POS.setY(y - ray); - BlocksHelper.setWithoutUpdate(world, POS, falling); - } - } - // Blocks without support else { - // Blue Vine - if (state.getBlock() instanceof BlueVineBlock) { - while (state.is(EndBlocks.BLUE_VINE) || state.is(EndBlocks.BLUE_VINE_LANTERN) || state.is(EndBlocks.BLUE_VINE_FUR)) { - BlocksHelper.setWithoutUpdate(world, POS, AIR); - POS.setY(POS.getY() + 1); - state = world.getBlockState(POS); - } - } - // Double plants - if (state.getBlock() instanceof BaseDoublePlantBlock) { - BlocksHelper.setWithoutUpdate(world, POS, AIR); - POS.setY(POS.getY() + 1); - BlocksHelper.setWithoutUpdate(world, POS, AIR); - } - // Other blocks - else { - BlocksHelper.setWithoutUpdate(world, POS, getAirOrFluid(state)); + while (state.getBlock() instanceof StalactiteBlock) { + setWithoutUpdate(world, POS, AIR); + POS.setY(POS.getY() - 1); + state = world.getBlockState(POS); } } } } + else if (state.is(EndBlocks.CAVE_PUMPKIN)) { + if (!world.getBlockState(POS.above()).is(EndBlocks.CAVE_PUMPKIN_SEED)) { + setWithoutUpdate(world, POS, AIR); + } + } + else if (!state.canSurvive(world, POS)) { + // Chorus + if (state.is(Blocks.CHORUS_PLANT)) { + Set ends = Sets.newHashSet(); + Set add = Sets.newHashSet(); + ends.add(POS.immutable()); + + for (int i = 0; i < 64 && !ends.isEmpty(); i++) { + ends.forEach((pos) -> { + setWithoutUpdate(world, pos, AIR); + for (Direction dir : BlocksHelper.HORIZONTAL) { + BlockPos p = pos.relative(dir); + BlockState st = world.getBlockState(p); + if ((st.is(Blocks.CHORUS_PLANT) || st.is(Blocks.CHORUS_FLOWER)) && !st.canSurvive(world, p)) { + add.add(p); + } + } + BlockPos p = pos.above(); + BlockState st = world.getBlockState(p); + if ((st.is(Blocks.CHORUS_PLANT) || st.is(Blocks.CHORUS_FLOWER)) && !st.canSurvive(world, p)) { + add.add(p); + } + }); + ends.clear(); + ends.addAll(add); + add.clear(); + } + } + // Vines + else if (state.getBlock() instanceof BaseVineBlock) { + while (world.getBlockState(POS).getBlock() instanceof BaseVineBlock) { + setWithoutUpdate(world, POS, AIR); + POS.setY(POS.getY() - 1); + } + } + // Falling blocks + else if (state.getBlock() instanceof FallingBlock) { + BlockState falling = state; + + POS.setY(POS.getY() - 1); + state = world.getBlockState(POS); + + int ray = BlocksHelper.downRayRep(world, POS.immutable(), 64); + if (ray > 32) { + setWithoutUpdate(world, POS, Blocks.END_STONE.defaultBlockState()); + if (world.getRandom().nextBoolean()) { + POS.setY(POS.getY() - 1); + state = world.getBlockState(POS); + setWithoutUpdate(world, POS, Blocks.END_STONE.defaultBlockState()); + } + } + else { + POS.setY(y); + BlockState replacement = AIR; + for (Direction dir : BlocksHelper.HORIZONTAL) { + state = world.getBlockState(POS.relative(dir)); + if (!state.getFluidState().isEmpty()) { + replacement = state; + break; + } + } + setWithoutUpdate(world, POS, replacement); + POS.setY(y - ray); + setWithoutUpdate(world, POS, falling); + } + } + // Blocks without support + else { + // Blue Vine + if (state.getBlock() instanceof BlueVineBlock) { + while (state.is(EndBlocks.BLUE_VINE) || state.is(EndBlocks.BLUE_VINE_LANTERN) || state.is(EndBlocks.BLUE_VINE_FUR)) { + setWithoutUpdate(world, POS, AIR); + POS.setY(POS.getY() + 1); + state = world.getBlockState(POS); + } + } + // Double plants + if (state.getBlock() instanceof BaseDoublePlantBlock) { + setWithoutUpdate(world, POS, AIR); + POS.setY(POS.getY() + 1); + setWithoutUpdate(world, POS, AIR); + } + // Other blocks + else { + setWithoutUpdate(world, POS, getAirOrFluid(state)); + } + } + } } - } - + }); + doubleCheck.forEach((pos) -> { if (!world.getBlockState(pos).canSurvive(world, pos)) { - BlocksHelper.setWithoutUpdate(world, pos, AIR); + setWithoutUpdate(world, pos, AIR); } }); } - + private static BlockState getAirOrFluid(BlockState state) { return state.getFluidState().isEmpty() ? AIR : state.getFluidState().createLegacyBlock(); } + + private static void setWithoutUpdate(LevelAccessor world, BlockPos pos, BlockState state) { + synchronized (world) { + BlocksHelper.setWithoutUpdate(world, pos, state); + } + } } diff --git a/src/main/java/ru/betterend/world/features/terrain/caves/EndCaveFeature.java b/src/main/java/ru/betterend/world/features/terrain/caves/EndCaveFeature.java index 964fa6b3..61abf3ce 100644 --- a/src/main/java/ru/betterend/world/features/terrain/caves/EndCaveFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/caves/EndCaveFeature.java @@ -58,19 +58,17 @@ public abstract class EndCaveFeature extends DefaultFeature { if (!caveBlocks.isEmpty()) { if (biome != null) { setBiomes(world, biome, caveBlocks); - Set floorPositions = Sets.newHashSet(); - Set ceilPositions = Sets.newHashSet(); - MutableBlockPos mut = new MutableBlockPos(); - caveBlocks.forEach((bpos) -> { - mut.set(bpos); - if (world.getBlockState(mut).getMaterial().isReplaceable()) { - mut.setY(bpos.getY() - 1); - if (world.getBlockState(mut).is(TagAPI.GEN_TERRAIN)) { - floorPositions.add(mut.immutable()); + Set floorPositions = Sets.newConcurrentHashSet(); + Set ceilPositions = Sets.newConcurrentHashSet(); + caveBlocks.parallelStream().forEach((bpos) -> { + if (world.getBlockState(bpos).getMaterial().isReplaceable()) { + BlockPos side = bpos.below(); + if (world.getBlockState(side).is(TagAPI.GEN_TERRAIN)) { + floorPositions.add(side); } - mut.setY(bpos.getY() + 1); - if (world.getBlockState(mut).is(TagAPI.GEN_TERRAIN)) { - ceilPositions.add(mut.immutable()); + side = bpos.above(); + if (world.getBlockState(side).is(TagAPI.GEN_TERRAIN)) { + ceilPositions.add(side); } } }); diff --git a/src/main/java/ru/betterend/world/features/terrain/caves/RoundCaveFeature.java b/src/main/java/ru/betterend/world/features/terrain/caves/RoundCaveFeature.java index 58364bd6..05d2179f 100644 --- a/src/main/java/ru/betterend/world/features/terrain/caves/RoundCaveFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/caves/RoundCaveFeature.java @@ -2,6 +2,7 @@ package ru.betterend.world.features.terrain.caves; import java.util.Random; import java.util.Set; +import java.util.stream.IntStream; import com.google.common.collect.Sets; @@ -30,47 +31,45 @@ public class RoundCaveFeature extends EndCaveFeature { double hr = radius * 0.75; double nr = radius * 0.25; - BlockState state; - MutableBlockPos bpos = new MutableBlockPos(); - Set blocks = Sets.newHashSet(); - for (int x = x1; x <= x2; x++) { - int xsq = x - center.getX(); - xsq *= xsq; + int dx = x2 - x1 + 1; + int dz = z2 - z1 + 1; + int count = dx * dz; + Set blocks = Sets.newConcurrentHashSet(); + IntStream.range(0, count).parallel().forEach(index -> { + MutableBlockPos bpos = new MutableBlockPos(); + int x = (index % dx) + x1; + int z = (index / dx) + z1; bpos.setX(x); - for (int z = z1; z <= z2; z++) { - int zsq = z - center.getZ(); - zsq *= zsq; - bpos.setZ(z); - for (int y = y1; y <= y2; y++) { - int ysq = y - center.getY(); - ysq *= 1.6; - ysq *= ysq; + bpos.setZ(z); + int xsq = MHelper.sqr(x - center.getX()); + int zsq = MHelper.sqr(z - center.getZ()); + int dxz = xsq + zsq; + BlockState state; + for (int y = y1; y <= y2; y++) { + int ysq = (int) MHelper.sqr((y - center.getY()) * 1.6); + double r = noise.eval(x * 0.1, y * 0.1, z * 0.1) * nr + hr; + double dist = dxz + ysq; + if (dist < r * r) { bpos.setY(y); - double r = noise.eval(x * 0.1, y * 0.1, z * 0.1) * nr + hr; - double dist = xsq + ysq + zsq; - if (dist < r * r) { - state = world.getBlockState(bpos); - if (isReplaceable(state) && !isWaterNear(world, bpos)) { - BlocksHelper.setWithoutUpdate(world, bpos, CAVE_AIR); - blocks.add(bpos.immutable()); - - while (state.getMaterial().equals(Material.LEAVES)) { - BlocksHelper.setWithoutUpdate(world, bpos, CAVE_AIR); - bpos.setY(bpos.getY() + 1); - state = world.getBlockState(bpos); - } - - bpos.setY(y - 1); - while (state.getMaterial().equals(Material.LEAVES)) { - BlocksHelper.setWithoutUpdate(world, bpos, CAVE_AIR); - bpos.setY(bpos.getY() - 1); - state = world.getBlockState(bpos); - } + state = world.getBlockState(bpos); + if (isReplaceable(state) && !isWaterNear(world, bpos)) { + blocks.add(bpos.immutable()); + + while (state.getMaterial().equals(Material.LEAVES)) { + bpos.setY(bpos.getY() + 1); + state = world.getBlockState(bpos); + } + + bpos.setY(y - 1); + while (state.getMaterial().equals(Material.LEAVES)) { + bpos.setY(bpos.getY() - 1); + state = world.getBlockState(bpos); } } } } - } + }); + blocks.forEach(bpos -> BlocksHelper.setWithoutUpdate(world, bpos, CAVE_AIR)); return blocks; } diff --git a/src/main/java/ru/betterend/world/features/terrain/caves/TunelCaveFeature.java b/src/main/java/ru/betterend/world/features/terrain/caves/TunelCaveFeature.java index cac45184..24cbea5a 100644 --- a/src/main/java/ru/betterend/world/features/terrain/caves/TunelCaveFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/caves/TunelCaveFeature.java @@ -3,6 +3,7 @@ package ru.betterend.world.features.terrain.caves; import java.util.Map; import java.util.Random; import java.util.Set; +import java.util.stream.IntStream; import com.google.common.collect.Maps; import com.google.common.collect.Sets; @@ -15,6 +16,7 @@ import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkAccess; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.Heightmap.Types; import net.minecraft.world.level.levelgen.feature.Feature; @@ -34,55 +36,56 @@ public class TunelCaveFeature extends EndCaveFeature { if ((long) cx * (long) cx + (long) cz + (long) cz < 256) { return Sets.newHashSet(); } + int x1 = cx << 4; int z1 = cz << 4; int x2 = x1 + 16; int z2 = z1 + 16; - int y2 = world.getHeight(); + Random rand = new Random(world.getSeed()); OpenSimplexNoise noiseH = new OpenSimplexNoise(rand.nextInt()); OpenSimplexNoise noiseV = new OpenSimplexNoise(rand.nextInt()); OpenSimplexNoise noiseD = new OpenSimplexNoise(rand.nextInt()); - Set positions = Sets.newHashSet(); - MutableBlockPos pos = new MutableBlockPos(); + Set positions = Sets.newConcurrentHashSet(); - float a = hasCaves(world, pos.set(x1, 0, z1)) ? 1F : 0F; - float b = hasCaves(world, pos.set(x2, 0, z1)) ? 1F : 0F; - float c = hasCaves(world, pos.set(x1, 0, z2)) ? 1F : 0F; - float d = hasCaves(world, pos.set(x2, 0, z2)) ? 1F : 0F; + float a = hasCaves(world, new BlockPos(x1, 0, z1)) ? 1F : 0F; + float b = hasCaves(world, new BlockPos(x2, 0, z1)) ? 1F : 0F; + float c = hasCaves(world, new BlockPos(x1, 0, z2)) ? 1F : 0F; + float d = hasCaves(world, new BlockPos(x2, 0, z2)) ? 1F : 0F; - for (int x = x1; x < x2; x++) { - pos.setX(x); - float dx = (float) (x - x1) / 16F; + ChunkAccess chunk = world.getChunk(cx, cz); + IntStream.range(0, 256).parallel().forEach(index -> { + MutableBlockPos pos = new MutableBlockPos(); + int x = index & 15; + int z = index >> 4; + int wheight = chunk.getHeight(Types.WORLD_SURFACE_WG, x, z); + float dx = x / 16F; + float dz = z / 16F; + pos.setX(x + x1); + pos.setZ(z + z1); float da = Mth.lerp(dx, a, b); float db = Mth.lerp(dx, c, d); - for (int z = z1; z < z2; z++) { - pos.setZ(z); - float dz = (float) (z - z1) / 16F; - float density = 1 - Mth.lerp(dz, da, db); - int wheight = world.getHeight(Types.WORLD_SURFACE_WG, x, z); - for (int y = 0; y < y2; y++) { + float density = 1 - Mth.lerp(dz, da, db); + if (density < 0.5) { + for (int y = 0; y < wheight; y++) { pos.setY(y); float gradient = 1 - Mth.clamp((wheight - y) * 0.1F, 0F, 1F); - float val = Mth.abs((float) noiseH.eval(x * 0.02, y * 0.01, z * 0.02)); - float vert = Mth.sin((y + (float) noiseV.eval(x * 0.01, z * 0.01) * 20) * 0.1F) * 0.9F; - float dist = (float) noiseD.eval(x * 0.1, y * 0.1, z * 0.1) * 0.12F; + if (gradient > 0.5) { + break; + } + float val = Mth.abs((float) noiseH.eval(pos.getX() * 0.02, y * 0.01, pos.getZ() * 0.02)); + float vert = Mth.sin((y + (float) noiseV.eval(pos.getX() * 0.01, pos.getZ() * 0.01) * 20) * 0.1F) * 0.9F; + float dist = (float) noiseD.eval(pos.getX() * 0.1, y * 0.1, pos.getZ() * 0.1) * 0.12F; val = (val + vert * vert + dist) + density + gradient; if (val < 0.15 && world.getBlockState(pos).is(TagAPI.GEN_TERRAIN) && noWaterNear(world, pos)) { - BlocksHelper.setWithoutUpdate(world, pos, AIR); positions.add(pos.immutable()); - int height = world.getHeight(Types.WORLD_SURFACE_WG, pos.getX(), pos.getZ()); - if (height < pos.getY() + 4) { - while (pos.getY() < height && noWaterNear(world, pos)) { - pos.setY(pos.getY() + 1); - BlocksHelper.setWithoutUpdate(world, pos, AIR); - } - } } } } - } + }); + positions.forEach(bpos -> BlocksHelper.setWithoutUpdate(world, bpos, CAVE_AIR)); + return positions; } From 262b2496549b1034cdc447ad78343de778b67010 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Mon, 21 Jun 2021 21:52:05 +0300 Subject: [PATCH 009/595] Version change --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index b169f1c8..012f8840 100644 --- a/gradle.properties +++ b/gradle.properties @@ -8,7 +8,7 @@ yarn_mappings=6 loader_version=0.11.3 # Mod Properties -mod_version = 0.9.8.3-pre +mod_version = 0.9.8.4-pre maven_group = ru.betterend archives_base_name = better-end From 30204a2aeeecb051c33129a0bcb1c562b293c76d Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Tue, 22 Jun 2021 13:32:44 +0300 Subject: [PATCH 010/595] Wrong chest registry fix --- gradle.properties | 2 +- src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/gradle.properties b/gradle.properties index 012f8840..7c15972e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -8,7 +8,7 @@ yarn_mappings=6 loader_version=0.11.3 # Mod Properties -mod_version = 0.9.8.4-pre +mod_version = 0.9.8.5-pre maven_group = ru.betterend archives_base_name = better-end diff --git a/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java b/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java index c42dc9e9..57df31f3 100644 --- a/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java +++ b/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java @@ -16,6 +16,7 @@ import ru.bclib.blocks.BaseBarkBlock; import ru.bclib.blocks.BaseBarrelBlock; import ru.bclib.blocks.BaseBlock; import ru.bclib.blocks.BaseBookshelfBlock; +import ru.bclib.blocks.BaseChestBlock; import ru.bclib.blocks.BaseComposterBlock; import ru.bclib.blocks.BaseCraftingTableBlock; import ru.bclib.blocks.BaseDoorBlock; @@ -90,7 +91,7 @@ public class WoodenMaterial { ladder = EndBlocks.registerBlock(name + "_ladder", new BaseLadderBlock(planks)); sign = EndBlocks.registerBlock(name + "_sign", new BaseSignBlock(planks)); - chest = EndBlocks.registerBlock(name + "_chest", new BaseFenceBlock(planks)); + chest = EndBlocks.registerBlock(name + "_chest", new BaseChestBlock(planks)); barrel = EndBlocks.registerBlock(name + "_barrel", new BaseBarrelBlock(planks)); shelf = EndBlocks.registerBlock(name + "_bookshelf", new BaseBookshelfBlock(planks)); composter = EndBlocks.registerBlock(name + "_composter", new BaseComposterBlock(planks)); From 08fc14439abcf251d0bfda23138ed40152aa4eac Mon Sep 17 00:00:00 2001 From: Frank Bauer Date: Wed, 23 Jun 2021 17:27:12 +0200 Subject: [PATCH 011/595] Compiler Fixes for `EndStoneSmelter` --- .../ru/betterend/blocks/EndStoneSmelter.java | 28 ++++--- .../entities/EndStoneSmelterBlockEntity.java | 74 +++++++++---------- 2 files changed, 52 insertions(+), 50 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/EndStoneSmelter.java b/src/main/java/ru/betterend/blocks/EndStoneSmelter.java index 46e17878..9065479e 100644 --- a/src/main/java/ru/betterend/blocks/EndStoneSmelter.java +++ b/src/main/java/ru/betterend/blocks/EndStoneSmelter.java @@ -1,10 +1,6 @@ package ru.betterend.blocks; -import java.util.List; -import java.util.Random; - import com.google.common.collect.Lists; - import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; @@ -21,13 +17,10 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.HorizontalDirectionalBlock; -import net.minecraft.world.level.block.Mirror; -import net.minecraft.world.level.block.RenderShape; -import net.minecraft.world.level.block.Rotation; -import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityTicker; +import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.block.state.properties.BlockStateProperties; @@ -38,8 +31,13 @@ import net.minecraft.world.level.material.MaterialColor; import net.minecraft.world.level.storage.loot.LootContext; import net.minecraft.world.level.storage.loot.parameters.LootContextParams; import net.minecraft.world.phys.BlockHitResult; +import org.jetbrains.annotations.Nullable; import ru.bclib.blocks.BaseBlockWithEntity; import ru.betterend.blocks.entities.EndStoneSmelterBlockEntity; +import ru.betterend.registry.EndBlockEntities; + +import java.util.List; +import java.util.Random; public class EndStoneSmelter extends BaseBlockWithEntity { public static final DirectionProperty FACING = HorizontalDirectionalBlock.FACING; @@ -79,8 +77,8 @@ public class EndStoneSmelter extends BaseBlockWithEntity { } @Override - public BlockEntity newBlockEntity(BlockGetter world) { - return new EndStoneSmelterBlockEntity(); + public BlockEntity newBlockEntity(BlockPos blockPos, BlockState blockState) { + return new EndStoneSmelterBlockEntity(blockPos, blockState); } @Override @@ -149,4 +147,10 @@ public class EndStoneSmelter extends BaseBlockWithEntity { world.addParticle(ParticleTypes.SMOKE, x + offX, y + offY, z + offZ, 0.0D, 0.0D, 0.0D); } } + + + @Nullable + public BlockEntityTicker getTicker(Level level, BlockEntityType blockEntityType) { + return level.isClientSide() ? null : createTickerHelper(blockEntityType, EndBlockEntities.END_STONE_SMELTER, EndStoneSmelterBlockEntity::tick); + } } diff --git a/src/main/java/ru/betterend/blocks/entities/EndStoneSmelterBlockEntity.java b/src/main/java/ru/betterend/blocks/entities/EndStoneSmelterBlockEntity.java index 49516b35..b471f713 100644 --- a/src/main/java/ru/betterend/blocks/entities/EndStoneSmelterBlockEntity.java +++ b/src/main/java/ru/betterend/blocks/entities/EndStoneSmelterBlockEntity.java @@ -1,15 +1,11 @@ package ru.betterend.blocks.entities; -import java.util.Iterator; -import java.util.List; -import java.util.Map; - import com.google.common.collect.Lists; import com.google.common.collect.Maps; - import it.unimi.dsi.fastutil.objects.Object2IntMap.Entry; import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; import net.fabricmc.fabric.api.registry.FuelRegistry; +import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.NonNullList; import net.minecraft.nbt.CompoundTag; @@ -37,7 +33,6 @@ import net.minecraft.world.level.ItemLike; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.AbstractFurnaceBlockEntity; import net.minecraft.world.level.block.entity.BaseContainerBlockEntity; -import net.minecraft.world.level.block.entity.TickableBlockEntity; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.Vec3; import ru.betterend.BetterEnd; @@ -46,7 +41,11 @@ import ru.betterend.client.gui.EndStoneSmelterScreenHandler; import ru.betterend.recipe.builders.AlloyingRecipe; import ru.betterend.registry.EndBlockEntities; -public class EndStoneSmelterBlockEntity extends BaseContainerBlockEntity implements WorldlyContainer, RecipeHolder, StackedContentsCompatible, TickableBlockEntity { +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +public class EndStoneSmelterBlockEntity extends BaseContainerBlockEntity implements WorldlyContainer, RecipeHolder, StackedContentsCompatible { private static final int[] TOP_SLOTS = new int[] { 0, 1 }; private static final int[] BOTTOM_SLOTS = new int[] { 2, 3 }; @@ -62,8 +61,8 @@ public class EndStoneSmelterBlockEntity extends BaseContainerBlockEntity impleme private int burnTime; private int fuelTime; - public EndStoneSmelterBlockEntity() { - super(EndBlockEntities.END_STONE_SMELTER); + public EndStoneSmelterBlockEntity(BlockPos blockPos, BlockState blockState) { + super(EndBlockEntities.END_STONE_SMELTER, blockPos, blockState); this.inventory = NonNullList.withSize(4, ItemStack.EMPTY); this.recipesUsed = new Object2IntOpenHashMap<>(); this.propertyDelegate = new ContainerData() { @@ -225,61 +224,60 @@ public class EndStoneSmelterBlockEntity extends BaseContainerBlockEntity impleme return new EndStoneSmelterScreenHandler(syncId, playerInventory, this, propertyDelegate); } - @Override - public void tick() { - if (level == null) return; + public static void tick(Level tickLevel, BlockPos tickPos, BlockState tickState, EndStoneSmelterBlockEntity blockEntity) { + if (tickLevel == null) return; - boolean initialBurning = isBurning(); + boolean initialBurning = blockEntity.isBurning(); if (initialBurning) { - burnTime--; + blockEntity.burnTime--; } boolean burning = initialBurning; - if (!level.isClientSide) { - ItemStack fuel = inventory.get(2); - if (!burning && (fuel.isEmpty() || inventory.get(0).isEmpty() && inventory.get(1).isEmpty())) { - if (smeltTime > 0) { - smeltTime = Mth.clamp(smeltTime - 2, 0, smeltTimeTotal); + if (!tickLevel.isClientSide) { + ItemStack fuel = blockEntity.inventory.get(2); + if (!burning && (fuel.isEmpty() || blockEntity.inventory.get(0).isEmpty() && blockEntity.inventory.get(1).isEmpty())) { + if (blockEntity.smeltTime > 0) { + blockEntity.smeltTime = Mth.clamp(blockEntity.smeltTime - 2, 0, blockEntity.smeltTimeTotal); } } else { - Recipe recipe = level.getRecipeManager().getRecipeFor(AlloyingRecipe.TYPE, this, level).orElse(null); + Recipe recipe = tickLevel.getRecipeManager().getRecipeFor(AlloyingRecipe.TYPE, blockEntity, tickLevel).orElse(null); if (recipe == null) { - recipe = level.getRecipeManager().getRecipeFor(RecipeType.BLASTING, this, level).orElse(null); + recipe = tickLevel.getRecipeManager().getRecipeFor(RecipeType.BLASTING, blockEntity, tickLevel).orElse(null); } - boolean accepted = this.canAcceptRecipeOutput(recipe); + boolean accepted = blockEntity.canAcceptRecipeOutput(recipe); if (!burning && accepted) { - burnTime = getFuelTime(fuel); - fuelTime = burnTime; - burning = isBurning(); + blockEntity.burnTime = blockEntity.getFuelTime(fuel); + blockEntity.fuelTime = blockEntity.burnTime; + burning = blockEntity.isBurning(); if (burning) { if (!fuel.isEmpty()) { Item item = fuel.getItem(); fuel.shrink(1); if (fuel.isEmpty()) { Item remainFuel = item.getCraftingRemainingItem(); - inventory.set(2, remainFuel == null ? ItemStack.EMPTY : new ItemStack(remainFuel)); + blockEntity.inventory.set(2, remainFuel == null ? ItemStack.EMPTY : new ItemStack(remainFuel)); } } - setChanged(); + blockEntity.setChanged(); } } if (burning && accepted) { - this.smeltTime++; - if (smeltTime == smeltTimeTotal) { - smeltTime = 0; - smeltTimeTotal = getSmeltTime(); - craftRecipe(recipe); - setChanged(); + blockEntity.smeltTime++; + if (blockEntity.smeltTime == blockEntity.smeltTimeTotal) { + blockEntity.smeltTime = 0; + blockEntity.smeltTimeTotal = blockEntity.getSmeltTime(); + blockEntity.craftRecipe(recipe); + blockEntity.setChanged(); } } else { - smeltTime = 0; + blockEntity.smeltTime = 0; } } if (initialBurning != burning) { - level.setBlock(worldPosition, level.getBlockState(worldPosition).setValue(EndStoneSmelter.LIT, burning), 3); - setChanged(); + tickLevel.setBlock(tickPos, tickState.setValue(EndStoneSmelter.LIT, burning), 3); + blockEntity.setChanged(); } } } @@ -395,8 +393,8 @@ public class EndStoneSmelterBlockEntity extends BaseContainerBlockEntity impleme } @Override - public void load(BlockState state, CompoundTag tag) { - super.load(state, tag); + public void load(CompoundTag tag) { + super.load(tag); inventory = NonNullList.withSize(getContainerSize(), ItemStack.EMPTY); ContainerHelper.loadAllItems(tag, inventory); burnTime = tag.getShort("BurnTime"); From 0ac3814cd5c5078eca450ed8d924831efd23283a Mon Sep 17 00:00:00 2001 From: Frank Bauer Date: Wed, 23 Jun 2021 20:30:49 +0200 Subject: [PATCH 012/595] Updated `tick` --- .../betterend/blocks/basis/PedestalBlock.java | 14 +++++++++++ .../entities/BlockEntityHydrothermalVent.java | 15 ++++++------ .../blocks/entities/PedestalBlockEntity.java | 24 +++++++++---------- 3 files changed, 33 insertions(+), 20 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java b/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java index 2f91a682..6b580345 100644 --- a/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java @@ -6,6 +6,8 @@ import java.util.List; import java.util.Map; import java.util.Optional; +import net.minecraft.world.level.block.entity.BlockEntityTicker; +import net.minecraft.world.level.block.entity.BlockEntityType; import org.jetbrains.annotations.Nullable; import com.google.common.collect.Lists; @@ -48,9 +50,11 @@ import ru.bclib.client.models.ModelsHelper; import ru.betterend.blocks.EndBlockProperties; import ru.betterend.blocks.EndBlockProperties.PedestalState; import ru.betterend.blocks.InfusionPedestal; +import ru.betterend.blocks.entities.EndStoneSmelterBlockEntity; import ru.betterend.blocks.entities.InfusionPedestalEntity; import ru.betterend.blocks.entities.PedestalBlockEntity; import ru.betterend.client.models.Patterns; +import ru.betterend.registry.EndBlockEntities; import ru.betterend.registry.EndBlocks; import ru.betterend.rituals.InfusionRitual; @@ -428,6 +432,16 @@ public class PedestalBlock extends BaseBlockNotFull implements EntityBlock { } }; } + + @Nullable + public BlockEntityTicker getTicker(Level level, BlockEntityType blockEntityType) { + return level.isClientSide() ? null : createTickerHelper(blockEntityType, EndBlockEntities.PEDESTAL, PedestalBlockEntity::tick); + } + + @Nullable + protected static BlockEntityTicker createTickerHelper(BlockEntityType blockEntityType, BlockEntityType blockEntityType2, BlockEntityTicker blockEntityTicker) { + return blockEntityType2 == blockEntityType ? blockEntityTicker : null; + } static { VoxelShape basinUp = Block.box(2, 3, 2, 14, 4, 14); diff --git a/src/main/java/ru/betterend/blocks/entities/BlockEntityHydrothermalVent.java b/src/main/java/ru/betterend/blocks/entities/BlockEntityHydrothermalVent.java index ecce043d..cc21085d 100644 --- a/src/main/java/ru/betterend/blocks/entities/BlockEntityHydrothermalVent.java +++ b/src/main/java/ru/betterend/blocks/entities/BlockEntityHydrothermalVent.java @@ -2,6 +2,7 @@ package ru.betterend.blocks.entities; import java.util.List; +import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; import net.minecraft.core.particles.ParticleTypes; @@ -9,8 +10,8 @@ import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.item.ElytraItem; import net.minecraft.world.item.Item; +import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.level.block.entity.TickableBlockEntity; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; @@ -20,18 +21,16 @@ import ru.betterend.registry.EndBlockEntities; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndParticles; -public class BlockEntityHydrothermalVent extends BlockEntity implements TickableBlockEntity { +public class BlockEntityHydrothermalVent extends BlockEntity { private final static Vec3 POSITIVE_Y = new Vec3(0.0f, 1.0f, 0.0f); - public BlockEntityHydrothermalVent() { - super(EndBlockEntities.HYDROTHERMAL_VENT); + public BlockEntityHydrothermalVent(BlockPos blockPos, BlockState blockState) { + super(EndBlockEntities.HYDROTHERMAL_VENT, blockPos, blockState); } - @Override - public void tick() { + public static void tick(Level level, BlockPos worldPosition, BlockState state, BlockEntityHydrothermalVent blockEntity) { if (level != null) { - BlockState state = getBlockState(); if (state.is(EndBlocks.HYDROTHERMAL_VENT)) { boolean active = state.getValue(HydrothermalVentBlock.ACTIVATED); if (active && level.random.nextInt(20) == 0) { @@ -56,7 +55,7 @@ public class BlockEntityHydrothermalVent extends BlockEntity implements Tickable double mult = active ? 3.0 : 5.0; float force = (float) ((1.0 - (mutable.getY() / box.maxY)) / mult); entities.stream().filter(entity -> (int) entity.getY() == mutable.getY() && - hasElytra(entity) && entity.isFallFlying()) + blockEntity.hasElytra(entity) && entity.isFallFlying()) .forEach(entity -> entity.moveRelative(force, POSITIVE_Y)); } mutable.move(Direction.UP); diff --git a/src/main/java/ru/betterend/blocks/entities/PedestalBlockEntity.java b/src/main/java/ru/betterend/blocks/entities/PedestalBlockEntity.java index 5dfe65e0..83a56db3 100644 --- a/src/main/java/ru/betterend/blocks/entities/PedestalBlockEntity.java +++ b/src/main/java/ru/betterend/blocks/entities/PedestalBlockEntity.java @@ -1,26 +1,27 @@ package ru.betterend.blocks.entities; import net.fabricmc.fabric.api.block.entity.BlockEntityClientSerializable; +import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.Container; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; -import net.minecraft.world.level.block.entity.TickableBlockEntity; import net.minecraft.world.level.block.state.BlockState; import ru.betterend.blocks.basis.PedestalBlock; import ru.betterend.registry.EndBlockEntities; import ru.betterend.registry.EndItems; -public class PedestalBlockEntity extends BlockEntity implements Container, TickableBlockEntity, BlockEntityClientSerializable { +public class PedestalBlockEntity extends BlockEntity implements Container, BlockEntityClientSerializable { private ItemStack activeItem = ItemStack.EMPTY; private final int maxAge = 314; private int age; - public PedestalBlockEntity() { - super(EndBlockEntities.PEDESTAL); + public PedestalBlockEntity(BlockPos blockPos, BlockState blockState) { + super(EndBlockEntities.PEDESTAL, blockPos, blockState); } public PedestalBlockEntity(BlockEntityType type) { @@ -103,8 +104,8 @@ public class PedestalBlockEntity extends BlockEntity implements Container, Ticka } @Override - public void load(BlockState state, CompoundTag tag) { - super.load(state, tag); + public void load(CompoundTag tag) { + super.load(tag); fromTag(tag); } @@ -131,12 +132,11 @@ public class PedestalBlockEntity extends BlockEntity implements Container, Ticka } } - @Override - public void tick() { - if (!isEmpty()) { - age++; - if (age > maxAge) { - age = 0; + public static void tick(Level tickLevel, BlockPos tickPos, BlockState tickState, PedestalBlockEntity blockEntity) { + if (!blockEntity.isEmpty()) { + blockEntity.age++; + if (blockEntity.age > blockEntity.maxAge) { + blockEntity.age = 0; } } } From cfa765437c7339719b63a9c5362218a9e0e363c6 Mon Sep 17 00:00:00 2001 From: Frank Bauer Date: Wed, 23 Jun 2021 20:31:56 +0200 Subject: [PATCH 013/595] =?UTF-8?q?=C3=80geable`,=20`MobBucketItem`,=20`Un?= =?UTF-8?q?iformGenerator`=20and=20`ShuffleList`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/ru/betterend/entity/DragonflyEntity.java | 4 ++-- src/main/java/ru/betterend/entity/SilkMothEntity.java | 4 ++-- .../java/ru/betterend/integration/byg/BYGIntegration.java | 4 ++-- src/main/java/ru/betterend/item/EndBucketItem.java | 4 ++-- src/main/java/ru/betterend/util/LootTableUtil.java | 6 +++--- .../java/ru/betterend/world/biome/cave/EndCaveBiome.java | 6 +++--- 6 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/main/java/ru/betterend/entity/DragonflyEntity.java b/src/main/java/ru/betterend/entity/DragonflyEntity.java index 63ff1ed3..998228cf 100644 --- a/src/main/java/ru/betterend/entity/DragonflyEntity.java +++ b/src/main/java/ru/betterend/entity/DragonflyEntity.java @@ -6,7 +6,7 @@ import java.util.Random; import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerLevel; import net.minecraft.sounds.SoundEvent; -import net.minecraft.world.entity.AgableMob; +import net.minecraft.world.entity.AgeableMob; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.Mob; @@ -194,7 +194,7 @@ public class DragonflyEntity extends Animal implements FlyingAnimal { } @Override - public AgableMob getBreedOffspring(ServerLevel world, AgableMob entity) { + public AgeableMob getBreedOffspring(ServerLevel world, AgeableMob entity) { return EndEntities.DRAGONFLY.create(world); } diff --git a/src/main/java/ru/betterend/entity/SilkMothEntity.java b/src/main/java/ru/betterend/entity/SilkMothEntity.java index 4c54e387..98f3ac16 100644 --- a/src/main/java/ru/betterend/entity/SilkMothEntity.java +++ b/src/main/java/ru/betterend/entity/SilkMothEntity.java @@ -16,7 +16,7 @@ import net.minecraft.server.level.ServerLevel; import net.minecraft.sounds.SoundEvents; import net.minecraft.sounds.SoundSource; import net.minecraft.world.damagesource.DamageSource; -import net.minecraft.world.entity.AgableMob; +import net.minecraft.world.entity.AgeableMob; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.Mob; @@ -162,7 +162,7 @@ public class SilkMothEntity extends Animal implements FlyingAnimal { } @Override - public AgableMob getBreedOffspring(ServerLevel world, AgableMob entity) { + public AgeableMob getBreedOffspring(ServerLevel world, AgeableMob entity) { return EndEntities.SILK_MOTH.create(world); } diff --git a/src/main/java/ru/betterend/integration/byg/BYGIntegration.java b/src/main/java/ru/betterend/integration/byg/BYGIntegration.java index 7306d1dd..845c63e4 100644 --- a/src/main/java/ru/betterend/integration/byg/BYGIntegration.java +++ b/src/main/java/ru/betterend/integration/byg/BYGIntegration.java @@ -5,7 +5,7 @@ import java.util.stream.Collectors; import net.minecraft.data.BuiltinRegistries; import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.ai.behavior.WeightedList; +import net.minecraft.world.entity.ai.behavior.ShufflingList; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.block.Block; import ru.bclib.api.BiomeAPI; @@ -62,7 +62,7 @@ public class BYGIntegration extends ModIntegration implements EndBiomeIntegratio EndBiomes.LAND_BIOMES.removeMutableBiome(biomeID); EndBiomes.VOID_BIOMES.addBiomeMutable(endBiome); } - WeightedList subBiomes = this.getAndExecuteRuntime(biomeClass, obj, "getHills"); + ShufflingList subBiomes = this.getAndExecuteRuntime(biomeClass, obj, "getHills"); if (subBiomes != null) { subBiomes.stream().collect(Collectors.toList()).forEach((id) -> { BCLBiome subBiome = BiomeAPI.getBiome(id); diff --git a/src/main/java/ru/betterend/item/EndBucketItem.java b/src/main/java/ru/betterend/item/EndBucketItem.java index 7d7a729a..bccc0c06 100644 --- a/src/main/java/ru/betterend/item/EndBucketItem.java +++ b/src/main/java/ru/betterend/item/EndBucketItem.java @@ -1,12 +1,12 @@ package ru.betterend.item; import net.minecraft.world.entity.EntityType; -import net.minecraft.world.item.FishBucketItem; +import net.minecraft.world.item.MobBucketItem; import net.minecraft.world.level.material.Fluids; import ru.bclib.client.models.ItemModelProvider; import ru.betterend.registry.EndItems; -public class EndBucketItem extends FishBucketItem implements ItemModelProvider { +public class EndBucketItem extends MobBucketItem implements ItemModelProvider { public EndBucketItem(EntityType type) { super(type, Fluids.WATER, EndItems.makeEndItemSettings().stacksTo(1)); } diff --git a/src/main/java/ru/betterend/util/LootTableUtil.java b/src/main/java/ru/betterend/util/LootTableUtil.java index 1b8cb09d..f7439249 100644 --- a/src/main/java/ru/betterend/util/LootTableUtil.java +++ b/src/main/java/ru/betterend/util/LootTableUtil.java @@ -4,9 +4,9 @@ import net.fabricmc.fabric.api.loot.v1.FabricLootPoolBuilder; import net.fabricmc.fabric.api.loot.v1.event.LootTableLoadingCallback; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.Items; -import net.minecraft.world.level.storage.loot.RandomValueBounds; import net.minecraft.world.level.storage.loot.entries.LootItem; import net.minecraft.world.level.storage.loot.predicates.LootItemRandomChanceCondition; +import net.minecraft.world.level.storage.loot.providers.number.UniformGenerator; import ru.betterend.registry.EndItems; public class LootTableUtil { @@ -16,13 +16,13 @@ public class LootTableUtil { LootTableLoadingCallback.EVENT.register((resourceManager, lootManager, id, supplier, setter) -> { if (END_CITY_TREASURE_ID.equals(id)) { FabricLootPoolBuilder builder = FabricLootPoolBuilder.builder(); - builder.setRolls(RandomValueBounds.between(0, 5)); + builder.setRolls(UniformGenerator.between(0, 5)); builder.withCondition(LootItemRandomChanceCondition.randomChance(0.5f).build()); builder.withEntry(LootItem.lootTableItem(Items.GHAST_TEAR).build()); supplier.withPool(builder); builder = FabricLootPoolBuilder.builder(); - builder.setRolls(RandomValueBounds.between(0, 5)); + builder.setRolls(UniformGenerator.between(0, 5)); builder.withCondition(LootItemRandomChanceCondition.randomChance(0.1f).build()); builder.withEntry(LootItem.lootTableItem(EndItems.MUSIC_DISC_STRANGE_AND_ALIEN).build()); builder.withEntry(LootItem.lootTableItem(EndItems.MUSIC_DISC_GRASPING_AT_STARS).build()); diff --git a/src/main/java/ru/betterend/world/biome/cave/EndCaveBiome.java b/src/main/java/ru/betterend/world/biome/cave/EndCaveBiome.java index e25ea7db..79af7269 100644 --- a/src/main/java/ru/betterend/world/biome/cave/EndCaveBiome.java +++ b/src/main/java/ru/betterend/world/biome/cave/EndCaveBiome.java @@ -3,7 +3,7 @@ package ru.betterend.world.biome.cave; import java.util.Random; import net.minecraft.core.BlockPos; -import net.minecraft.world.entity.ai.behavior.WeightedList; +import net.minecraft.world.entity.ai.behavior.ShufflingList; import net.minecraft.world.level.biome.Biome.BiomeCategory; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.levelgen.feature.Feature; @@ -16,8 +16,8 @@ import ru.betterend.world.biome.EndBiome; import ru.betterend.world.features.terrain.caves.CaveChunkPopulatorFeature; public class EndCaveBiome extends EndBiome { - private WeightedList> floorFeatures = new WeightedList>(); - private WeightedList> ceilFeatures = new WeightedList>(); + private ShufflingList> floorFeatures = new ShufflingList>(); + private ShufflingList> ceilFeatures = new ShufflingList>(); public EndCaveBiome(BCLBiomeDef definition) { super(makeDef(definition)); From 4f053c161a4e19c4b820ed8ff2c3f4e292067fe9 Mon Sep 17 00:00:00 2001 From: Frank Bauer Date: Wed, 23 Jun 2021 21:59:24 +0200 Subject: [PATCH 014/595] More compiler fixes --- .../ru/betterend/blocks/EndPortalBlock.java | 4 +-- .../blocks/HelixTreeLeavesBlock.java | 2 +- .../blocks/HydrothermalVentBlock.java | 4 +-- .../ru/betterend/blocks/InfusionPedestal.java | 4 +-- .../ru/betterend/blocks/NeedlegrassBlock.java | 2 +- .../betterend/blocks/SilkMothHiveBlock.java | 2 +- .../blocks/SmallJellyshroomBlock.java | 2 +- .../blocks/VentBubbleColumnBlock.java | 15 +++++++-- .../ru/betterend/blocks/basis/FurBlock.java | 2 +- .../betterend/blocks/basis/PedestalBlock.java | 6 ++-- .../entities/InfusionPedestalEntity.java | 21 +++++++++---- .../blocks/entities/PedestalBlockEntity.java | 16 ++++++---- .../client/render/PedestalItemRenderer.java | 2 +- .../ru/betterend/entity/CubozoaEntity.java | 2 +- .../ru/betterend/entity/DragonflyEntity.java | 31 +++++++++---------- .../ru/betterend/entity/EndFishEntity.java | 2 +- .../ru/betterend/entity/SilkMothEntity.java | 22 ++++++------- .../item/model/CrystaliteArmorProvider.java | 4 +-- .../betterend/registry/EndModelProviders.java | 6 ++-- .../ru/betterend/rituals/EternalRitual.java | 2 +- 20 files changed, 84 insertions(+), 67 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/EndPortalBlock.java b/src/main/java/ru/betterend/blocks/EndPortalBlock.java index 6d5ab346..a419608e 100644 --- a/src/main/java/ru/betterend/blocks/EndPortalBlock.java +++ b/src/main/java/ru/betterend/blocks/EndPortalBlock.java @@ -94,7 +94,7 @@ public class EndPortalBlock extends NetherPortalBlock implements IRenderTyped, I if (exitPos == null) return; if (entity instanceof ServerPlayer && ((ServerPlayer) entity).isCreative()) { ((ServerPlayer) entity).teleportTo(destination, exitPos.getX() + 0.5, exitPos.getY(), - exitPos.getZ() + 0.5, entity.yRot, entity.xRot); + exitPos.getZ() + 0.5, entity.getYRot(), entity.getXRot()); } else { ((TeleportingEntity) entity).be_setExitPos(exitPos); Optional teleported = Optional.ofNullable(entity.changeDimension(destination)); @@ -114,7 +114,7 @@ public class EndPortalBlock extends NetherPortalBlock implements IRenderTyped, I private BlockPos findExitPos(ServerLevel currentWorld, ServerLevel targetWorld, BlockPos currentPos, Entity entity) { if (targetWorld == null) return null; - Registry registry = targetWorld.registryAccess().dimensionTypes(); + Registry registry = targetWorld.registryAccess().registryOrThrow(Registry.DIMENSION_TYPE_REGISTRY); ResourceLocation targetWorldId = targetWorld.dimension().location(); ResourceLocation currentWorldId = currentWorld.dimension().location(); double targetMultiplier = Objects.requireNonNull(registry.get(targetWorldId)).coordinateScale(); diff --git a/src/main/java/ru/betterend/blocks/HelixTreeLeavesBlock.java b/src/main/java/ru/betterend/blocks/HelixTreeLeavesBlock.java index 625d503c..2a15a97e 100644 --- a/src/main/java/ru/betterend/blocks/HelixTreeLeavesBlock.java +++ b/src/main/java/ru/betterend/blocks/HelixTreeLeavesBlock.java @@ -79,7 +79,7 @@ public class HelixTreeLeavesBlock extends BaseBlock implements IColorProvider { public List getDrops(BlockState state, LootContext.Builder builder) { ItemStack tool = builder.getParameter(LootContextParams.TOOL); if (tool != null) { - if (tool.getItem().is(FabricToolTags.SHEARS) || tool.isCorrectToolForDrops(state) || EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) { + if (tool.is(FabricToolTags.SHEARS) || tool.isCorrectToolForDrops(state) || EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) { return Collections.singletonList(new ItemStack(this)); } int fortune = EnchantmentHelper.getItemEnchantmentLevel(Enchantments.BLOCK_FORTUNE, tool); diff --git a/src/main/java/ru/betterend/blocks/HydrothermalVentBlock.java b/src/main/java/ru/betterend/blocks/HydrothermalVentBlock.java index 806455f5..96a55828 100644 --- a/src/main/java/ru/betterend/blocks/HydrothermalVentBlock.java +++ b/src/main/java/ru/betterend/blocks/HydrothermalVentBlock.java @@ -108,8 +108,8 @@ public class HydrothermalVentBlock extends BaseBlockNotFull implements EntityBlo } @Override - public BlockEntity newBlockEntity(BlockGetter world) { - return new BlockEntityHydrothermalVent(); + public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { + return new BlockEntityHydrothermalVent(pos, state); } @Override diff --git a/src/main/java/ru/betterend/blocks/InfusionPedestal.java b/src/main/java/ru/betterend/blocks/InfusionPedestal.java index 2604055d..4b49d48d 100644 --- a/src/main/java/ru/betterend/blocks/InfusionPedestal.java +++ b/src/main/java/ru/betterend/blocks/InfusionPedestal.java @@ -44,8 +44,8 @@ public class InfusionPedestal extends PedestalBlock { } @Override - public BlockEntity newBlockEntity(BlockGetter world) { - return new InfusionPedestalEntity(); + public BlockEntity newBlockEntity(BlockPos blockPos, BlockState blockState) { + return new InfusionPedestalEntity(blockPos, blockState); } @Override diff --git a/src/main/java/ru/betterend/blocks/NeedlegrassBlock.java b/src/main/java/ru/betterend/blocks/NeedlegrassBlock.java index 57807754..12d61fa8 100644 --- a/src/main/java/ru/betterend/blocks/NeedlegrassBlock.java +++ b/src/main/java/ru/betterend/blocks/NeedlegrassBlock.java @@ -34,7 +34,7 @@ public class NeedlegrassBlock extends EndPlantBlock { @Override public List getDrops(BlockState state, LootContext.Builder builder) { ItemStack tool = builder.getParameter(LootContextParams.TOOL); - if (tool != null && tool.getItem().is(FabricToolTags.SHEARS) || EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) { + if (tool != null && tool.is(FabricToolTags.SHEARS) || EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) { return Lists.newArrayList(new ItemStack(this)); } else { diff --git a/src/main/java/ru/betterend/blocks/SilkMothHiveBlock.java b/src/main/java/ru/betterend/blocks/SilkMothHiveBlock.java index a769f1a3..7cfc5aa6 100644 --- a/src/main/java/ru/betterend/blocks/SilkMothHiveBlock.java +++ b/src/main/java/ru/betterend/blocks/SilkMothHiveBlock.java @@ -89,7 +89,7 @@ public class SilkMothHiveBlock extends BaseBlock { public InteractionResult use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) { if (hand == InteractionHand.MAIN_HAND) { ItemStack stack = player.getMainHandItem(); - if (stack.getItem().is(FabricToolTags.SHEARS) && state.getValue(FULLNESS) == 3) { + if (stack.is(FabricToolTags.SHEARS) && state.getValue(FULLNESS) == 3) { BlocksHelper.setWithUpdate(world, pos, state.setValue(FULLNESS, 0)); Direction dir = state.getValue(FACING); double px = pos.getX() + dir.getStepX() + 0.5; diff --git a/src/main/java/ru/betterend/blocks/SmallJellyshroomBlock.java b/src/main/java/ru/betterend/blocks/SmallJellyshroomBlock.java index 60aac3b5..7456529d 100644 --- a/src/main/java/ru/betterend/blocks/SmallJellyshroomBlock.java +++ b/src/main/java/ru/betterend/blocks/SmallJellyshroomBlock.java @@ -56,7 +56,7 @@ public class SmallJellyshroomBlock extends BaseAttachedBlock implements IRenderT @Override public List getDrops(BlockState state, LootContext.Builder builder) { ItemStack tool = builder.getParameter(LootContextParams.TOOL); - if (tool != null && tool.getItem().is(FabricToolTags.SHEARS) || EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) { + if (tool != null && tool.is(FabricToolTags.SHEARS) || EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) { return Lists.newArrayList(new ItemStack(this)); } else { diff --git a/src/main/java/ru/betterend/blocks/VentBubbleColumnBlock.java b/src/main/java/ru/betterend/blocks/VentBubbleColumnBlock.java index e58333b7..2c337d21 100644 --- a/src/main/java/ru/betterend/blocks/VentBubbleColumnBlock.java +++ b/src/main/java/ru/betterend/blocks/VentBubbleColumnBlock.java @@ -1,5 +1,6 @@ package ru.betterend.blocks; +import java.util.Optional; import java.util.Random; import net.fabricmc.api.EnvType; @@ -9,9 +10,12 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.particles.ParticleTypes; import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundEvent; import net.minecraft.sounds.SoundEvents; import net.minecraft.sounds.SoundSource; import net.minecraft.world.entity.Entity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; @@ -38,9 +42,9 @@ public class VentBubbleColumnBlock extends Block implements BucketPickup, Liquid } @Override - public Fluid takeLiquid(LevelAccessor world, BlockPos pos, BlockState state) { + public ItemStack pickupBlock(LevelAccessor world, BlockPos pos, BlockState state) { world.setBlock(pos, Blocks.AIR.defaultBlockState(), 11); - return Fluids.WATER; + return new ItemStack(Items.WATER_BUCKET); } @Override @@ -120,4 +124,11 @@ public class VentBubbleColumnBlock extends Block implements BucketPickup, Liquid public FluidState getFluidState(BlockState state) { return Fluids.WATER.getSource(false); } + + + + @Override + public Optional getPickupSound() { + return Fluids.WATER.getPickupSound(); + } } diff --git a/src/main/java/ru/betterend/blocks/basis/FurBlock.java b/src/main/java/ru/betterend/blocks/basis/FurBlock.java index 0514f5b5..9f2b20aa 100644 --- a/src/main/java/ru/betterend/blocks/basis/FurBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/FurBlock.java @@ -62,7 +62,7 @@ public class FurBlock extends BaseAttachedBlock implements IRenderTyped { @Override public List getDrops(BlockState state, LootContext.Builder builder) { ItemStack tool = builder.getParameter(LootContextParams.TOOL); - if (tool != null && tool.getItem().is(FabricToolTags.SHEARS) || EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) { + if (tool != null && tool.is(FabricToolTags.SHEARS) || EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) { return Lists.newArrayList(new ItemStack(this)); } else if (dropChance < 1 || MHelper.RANDOM.nextInt(dropChance) == 0) { diff --git a/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java b/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java index 6b580345..d6a389fc 100644 --- a/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java @@ -355,8 +355,8 @@ public class PedestalBlock extends BaseBlockNotFull implements EntityBlock { } @Override - public BlockEntity newBlockEntity(BlockGetter world) { - return new PedestalBlockEntity(); + public BlockEntity newBlockEntity(BlockPos blockPos, BlockState blockState) { + return new PedestalBlockEntity(blockPos, blockState); } public boolean hasUniqueEntity() { @@ -440,7 +440,7 @@ public class PedestalBlock extends BaseBlockNotFull implements EntityBlock { @Nullable protected static BlockEntityTicker createTickerHelper(BlockEntityType blockEntityType, BlockEntityType blockEntityType2, BlockEntityTicker blockEntityTicker) { - return blockEntityType2 == blockEntityType ? blockEntityTicker : null; + return blockEntityType2 == blockEntityType ? (BlockEntityTicker) blockEntityTicker : null; } static { diff --git a/src/main/java/ru/betterend/blocks/entities/InfusionPedestalEntity.java b/src/main/java/ru/betterend/blocks/entities/InfusionPedestalEntity.java index 2a6a4029..b13054dc 100644 --- a/src/main/java/ru/betterend/blocks/entities/InfusionPedestalEntity.java +++ b/src/main/java/ru/betterend/blocks/entities/InfusionPedestalEntity.java @@ -3,6 +3,7 @@ package ru.betterend.blocks.entities; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; import ru.betterend.registry.EndBlockEntities; import ru.betterend.rituals.InfusionRitual; @@ -10,13 +11,21 @@ public class InfusionPedestalEntity extends PedestalBlockEntity { private InfusionRitual linkedRitual; - public InfusionPedestalEntity() { - super(EndBlockEntities.INFUSION_PEDESTAL); + public InfusionPedestalEntity(BlockPos blockPos, BlockState blockState) { + super(EndBlockEntities.INFUSION_PEDESTAL, blockPos, blockState); + } + + @Override + public void setLevel(Level world){ + super.setLevel(world); + if (hasRitual()) { + linkedRitual.setLocation(world, this.getBlockPos()); + } else { + linkRitual(new InfusionRitual(this, world, this.getBlockPos())); + } } - @Override public void setLevelAndPosition(Level world, BlockPos pos) { - super.setLevelAndPosition(world, pos); if (hasRitual()) { linkedRitual.setLocation(world, pos); } else { @@ -37,11 +46,11 @@ public class InfusionPedestalEntity extends PedestalBlockEntity { } @Override - public void tick() { + protected void tick(Level tickLevel, BlockPos tickPos, BlockState tickState){ if (hasRitual()) { linkedRitual.tick(); } - super.tick(); + super.tick(tickLevel, tickPos, tickState); } @Override diff --git a/src/main/java/ru/betterend/blocks/entities/PedestalBlockEntity.java b/src/main/java/ru/betterend/blocks/entities/PedestalBlockEntity.java index 83a56db3..1f917f00 100644 --- a/src/main/java/ru/betterend/blocks/entities/PedestalBlockEntity.java +++ b/src/main/java/ru/betterend/blocks/entities/PedestalBlockEntity.java @@ -20,7 +20,7 @@ public class PedestalBlockEntity extends BlockEntity implements Container, Block private final int maxAge = 314; private int age; - public PedestalBlockEntity(BlockPos blockPos, BlockState blockState) { + public PedestalBlockEntity(BlockEntityType blockEntityType, BlockPos blockPos, BlockState blockState) { super(EndBlockEntities.PEDESTAL, blockPos, blockState); } @@ -132,12 +132,16 @@ public class PedestalBlockEntity extends BlockEntity implements Container, Block } } - public static void tick(Level tickLevel, BlockPos tickPos, BlockState tickState, PedestalBlockEntity blockEntity) { - if (!blockEntity.isEmpty()) { - blockEntity.age++; - if (blockEntity.age > blockEntity.maxAge) { - blockEntity.age = 0; + protected void tick(Level tickLevel, BlockPos tickPos, BlockState tickState){ + if (!this.isEmpty()) { + this.age++; + if (this.age > this.maxAge) { + this.age = 0; } } } + + public static void tick(Level tickLevel, BlockPos tickPos, BlockState tickState, PedestalBlockEntity blockEntity) { + blockEntity.tick(tickLevel, tickPos, tickState); + } } diff --git a/src/main/java/ru/betterend/client/render/PedestalItemRenderer.java b/src/main/java/ru/betterend/client/render/PedestalItemRenderer.java index e66cdee8..1002bb3d 100644 --- a/src/main/java/ru/betterend/client/render/PedestalItemRenderer.java +++ b/src/main/java/ru/betterend/client/render/PedestalItemRenderer.java @@ -24,7 +24,7 @@ import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndItems; @Environment(EnvType.CLIENT) -public class PedestalItemRenderer extends BlockEntityRenderer { +public class PedestalItemRenderer implements BlockEntityRenderer { public PedestalItemRenderer(BlockEntityRenderDispatcher dispatcher) { super(dispatcher); diff --git a/src/main/java/ru/betterend/entity/CubozoaEntity.java b/src/main/java/ru/betterend/entity/CubozoaEntity.java index e58053f4..794bcbf9 100644 --- a/src/main/java/ru/betterend/entity/CubozoaEntity.java +++ b/src/main/java/ru/betterend/entity/CubozoaEntity.java @@ -91,7 +91,7 @@ public class CubozoaEntity extends AbstractSchoolingFish { } @Override - protected ItemStack getBucketItemStack() { + public ItemStack getBucketItemStack() { ItemStack bucket = EndItems.BUCKET_CUBOZOA.getDefaultInstance(); CompoundTag tag = bucket.getOrCreateTag(); tag.putByte("Variant", entityData.get(VARIANT)); diff --git a/src/main/java/ru/betterend/entity/DragonflyEntity.java b/src/main/java/ru/betterend/entity/DragonflyEntity.java index 998228cf..b2a07c71 100644 --- a/src/main/java/ru/betterend/entity/DragonflyEntity.java +++ b/src/main/java/ru/betterend/entity/DragonflyEntity.java @@ -6,11 +6,8 @@ import java.util.Random; import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerLevel; import net.minecraft.sounds.SoundEvent; -import net.minecraft.world.entity.AgeableMob; -import net.minecraft.world.entity.EntityType; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.Mob; -import net.minecraft.world.entity.MobSpawnType; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.*; import net.minecraft.world.entity.ai.attributes.AttributeSupplier; import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.entity.ai.control.FlyingMoveControl; @@ -21,6 +18,8 @@ import net.minecraft.world.entity.ai.goal.FollowParentGoal; import net.minecraft.world.entity.ai.goal.Goal; import net.minecraft.world.entity.ai.navigation.FlyingPathNavigation; import net.minecraft.world.entity.ai.navigation.PathNavigation; +import net.minecraft.world.entity.ai.util.AirAndWaterRandomPos; +import net.minecraft.world.entity.ai.util.HoverRandomPos; import net.minecraft.world.entity.ai.util.RandomPos; import net.minecraft.world.entity.animal.Animal; import net.minecraft.world.entity.animal.FlyingAnimal; @@ -98,18 +97,18 @@ public class DragonflyEntity extends Animal implements FlyingAnimal { } @Override - protected boolean makeFlySound() { - return true; - } - - @Override - public boolean causeFallDamage(float fallDistance, float damageMultiplier) { + public boolean causeFallDamage(float fallDistance, float damageMultiplier, DamageSource damageSource) { return false; } @Override - public boolean isMovementNoisy() { - return false; + protected Entity.MovementEmission getMovementEmission() { + return Entity.MovementEmission.EVENTS; + } + + @Override + public boolean isFlying() { + return !this.onGround; } @Override @@ -168,11 +167,11 @@ public class DragonflyEntity extends Animal implements FlyingAnimal { private Vec3 getRandomLocation() { int h = BlocksHelper.downRay(DragonflyEntity.this.level, DragonflyEntity.this.blockPosition(), 16); Vec3 rotation = DragonflyEntity.this.getViewVector(0.0F); - Vec3 airPos = RandomPos.getAboveLandPos(DragonflyEntity.this, 8, 7, rotation, 1.5707964F, 2, 1); + Vec3 airPos = HoverRandomPos.getPos(DragonflyEntity.this, 8, 7, rotation.x, rotation.z, 1.5707964F, 3, 1); if (airPos != null) { if (isInVoid(airPos)) { for (int i = 0; i < 8; i++) { - airPos = RandomPos.getAboveLandPos(DragonflyEntity.this, 16, 7, rotation, MHelper.PI2, 2, 1); + airPos = HoverRandomPos.getPos(DragonflyEntity.this, 16, 7, rotation.x, rotation.z, MHelper.PI2, 3, 1); if (airPos != null && !isInVoid(airPos)) { return airPos; } @@ -184,7 +183,7 @@ public class DragonflyEntity extends Animal implements FlyingAnimal { } return airPos; } - return RandomPos.getAirPos(DragonflyEntity.this, 8, 4, -2, rotation, 1.5707963705062866D); + return AirAndWaterRandomPos.getPos(DragonflyEntity.this, 8, 4, -2, rotation.x, rotation.z, 1.5707963705062866D); } private boolean isInVoid(Vec3 pos) { diff --git a/src/main/java/ru/betterend/entity/EndFishEntity.java b/src/main/java/ru/betterend/entity/EndFishEntity.java index dec0cad8..c0550ac2 100644 --- a/src/main/java/ru/betterend/entity/EndFishEntity.java +++ b/src/main/java/ru/betterend/entity/EndFishEntity.java @@ -88,7 +88,7 @@ public class EndFishEntity extends AbstractSchoolingFish { } @Override - protected ItemStack getBucketItemStack() { + public ItemStack getBucketItemStack() { ItemStack bucket = EndItems.BUCKET_END_FISH.getDefaultInstance(); CompoundTag tag = bucket.getOrCreateTag(); tag.putByte("variant", entityData.get(VARIANT)); diff --git a/src/main/java/ru/betterend/entity/SilkMothEntity.java b/src/main/java/ru/betterend/entity/SilkMothEntity.java index 98f3ac16..927bc096 100644 --- a/src/main/java/ru/betterend/entity/SilkMothEntity.java +++ b/src/main/java/ru/betterend/entity/SilkMothEntity.java @@ -4,6 +4,7 @@ import java.util.EnumSet; import java.util.List; import java.util.Random; +import net.minecraft.world.entity.*; import org.jetbrains.annotations.Nullable; import net.minecraft.core.BlockPos; @@ -16,11 +17,6 @@ import net.minecraft.server.level.ServerLevel; import net.minecraft.sounds.SoundEvents; import net.minecraft.sounds.SoundSource; import net.minecraft.world.damagesource.DamageSource; -import net.minecraft.world.entity.AgeableMob; -import net.minecraft.world.entity.EntityType; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.Mob; -import net.minecraft.world.entity.MobSpawnType; import net.minecraft.world.entity.ai.attributes.AttributeSupplier; import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.entity.ai.control.FlyingMoveControl; @@ -142,18 +138,18 @@ public class SilkMothEntity extends Animal implements FlyingAnimal { } @Override - protected boolean makeFlySound() { - return true; - } - - @Override - public boolean causeFallDamage(float fallDistance, float damageMultiplier) { + public boolean causeFallDamage(float fallDistance, float damageMultiplier, DamageSource damageSource) { return false; } @Override - public boolean isMovementNoisy() { - return false; + protected Entity.MovementEmission getMovementEmission() { + return Entity.MovementEmission.EVENTS; + } + + @Override + public boolean isFlying() { + return !this.onGround; } @Override diff --git a/src/main/java/ru/betterend/item/model/CrystaliteArmorProvider.java b/src/main/java/ru/betterend/item/model/CrystaliteArmorProvider.java index b631ad7e..1bba7c04 100644 --- a/src/main/java/ru/betterend/item/model/CrystaliteArmorProvider.java +++ b/src/main/java/ru/betterend/item/model/CrystaliteArmorProvider.java @@ -7,8 +7,6 @@ import com.google.common.collect.Lists; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.fabricmc.fabric.api.client.rendering.v1.ArmorRenderingRegistry.ModelProvider; -import net.fabricmc.fabric.api.client.rendering.v1.ArmorRenderingRegistry.TextureProvider; import net.minecraft.client.model.HumanoidModel; import net.minecraft.client.player.AbstractClientPlayer; import net.minecraft.resources.ResourceLocation; @@ -20,7 +18,7 @@ import ru.betterend.item.CrystaliteArmor; import ru.betterend.registry.EndItems; @Environment(EnvType.CLIENT) -public class CrystaliteArmorProvider implements ModelProvider, TextureProvider { +public class CrystaliteArmorProvider /*implements ModelProvider, TextureProvider*/ { private final static ResourceLocation FIRST_LAYER = new ResourceLocation("textures/models/armor/crystalite_layer_1.png"); private final static ResourceLocation SECOND_LAYER = new ResourceLocation("textures/models/armor/crystalite_layer_2.png"); private final static CrystaliteHelmetModel HELMET_MODEL = new CrystaliteHelmetModel(1.0F); diff --git a/src/main/java/ru/betterend/registry/EndModelProviders.java b/src/main/java/ru/betterend/registry/EndModelProviders.java index 80952641..c9d2d3e5 100644 --- a/src/main/java/ru/betterend/registry/EndModelProviders.java +++ b/src/main/java/ru/betterend/registry/EndModelProviders.java @@ -2,7 +2,6 @@ package ru.betterend.registry; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.fabricmc.fabric.api.client.rendering.v1.ArmorRenderingRegistry; import ru.betterend.item.model.CrystaliteArmorProvider; @Environment(EnvType.CLIENT) @@ -11,7 +10,8 @@ public class EndModelProviders { public final static CrystaliteArmorProvider CRYSTALITE_PROVIDER = new CrystaliteArmorProvider(); public final static void register() { - ArmorRenderingRegistry.registerModel(CRYSTALITE_PROVIDER, CRYSTALITE_PROVIDER.getRenderedItems()); - ArmorRenderingRegistry.registerTexture(CRYSTALITE_PROVIDER, CRYSTALITE_PROVIDER.getRenderedItems()); + throw new RuntimeException("Needs Fix for 1.17"); + //ArmorRenderingRegistry.registerModel(CRYSTALITE_PROVIDER, CRYSTALITE_PROVIDER.getRenderedItems()); + //ArmorRenderingRegistry.registerTexture(CRYSTALITE_PROVIDER, CRYSTALITE_PROVIDER.getRenderedItems()); } } diff --git a/src/main/java/ru/betterend/rituals/EternalRitual.java b/src/main/java/ru/betterend/rituals/EternalRitual.java index 1d7ebbdc..60e126c4 100644 --- a/src/main/java/ru/betterend/rituals/EternalRitual.java +++ b/src/main/java/ru/betterend/rituals/EternalRitual.java @@ -293,7 +293,7 @@ public class EternalRitual { private BlockPos findPortalPos(int portalId) { MinecraftServer server = world.getServer(); ServerLevel targetWorld = (ServerLevel) getTargetWorld(portalId); - Registry registry = Objects.requireNonNull(server).registryAccess().dimensionTypes(); + Registry registry = Objects.requireNonNull(server).registryAccess().registryOrThrow(Registry.DIMENSION_TYPE_REGISTRY); double multiplier = Objects.requireNonNull(registry.get(targetWorldId)).coordinateScale(); BlockPos.MutableBlockPos basePos = center.mutable().set(center.getX() / multiplier, center.getY(), center.getZ() / multiplier); BlockPos framePos = findFrame(targetWorld, basePos.mutable()); From e541763ada61270ecd308b32455da5ad843af7b7 Mon Sep 17 00:00:00 2001 From: Frank Bauer Date: Wed, 23 Jun 2021 22:23:20 +0200 Subject: [PATCH 015/595] Additional compiler fixes --- src/main/java/ru/betterend/blocks/EndStoneSmelter.java | 1 - src/main/java/ru/betterend/blocks/EternalPedestal.java | 4 ++-- src/main/java/ru/betterend/blocks/SilkMothNestBlock.java | 2 +- .../java/ru/betterend/blocks/SmallAmaranitaBlock.java | 9 +++++---- .../java/ru/betterend/blocks/SmallJellyshroomBlock.java | 3 ++- .../java/ru/betterend/blocks/basis/PedestalBlock.java | 1 - .../betterend/blocks/entities/EternalPedestalEntity.java | 5 +++-- src/main/java/ru/betterend/entity/DragonflyEntity.java | 1 - .../java/ru/betterend/entity/ShadowWalkerEntity.java | 2 +- src/main/java/ru/betterend/entity/SilkMothEntity.java | 8 +++++--- 10 files changed, 19 insertions(+), 17 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/EndStoneSmelter.java b/src/main/java/ru/betterend/blocks/EndStoneSmelter.java index 9065479e..1a25bf56 100644 --- a/src/main/java/ru/betterend/blocks/EndStoneSmelter.java +++ b/src/main/java/ru/betterend/blocks/EndStoneSmelter.java @@ -15,7 +15,6 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.context.BlockPlaceContext; -import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.entity.BlockEntity; diff --git a/src/main/java/ru/betterend/blocks/EternalPedestal.java b/src/main/java/ru/betterend/blocks/EternalPedestal.java index e1b5404e..c3087233 100644 --- a/src/main/java/ru/betterend/blocks/EternalPedestal.java +++ b/src/main/java/ru/betterend/blocks/EternalPedestal.java @@ -126,8 +126,8 @@ public class EternalPedestal extends PedestalBlock { } @Override - public BlockEntity newBlockEntity(BlockGetter world) { - return new EternalPedestalEntity(); + public BlockEntity newBlockEntity(BlockPos blockPos, BlockState blockState) { + return new EternalPedestalEntity(blockPos, blockState); } @Override diff --git a/src/main/java/ru/betterend/blocks/SilkMothNestBlock.java b/src/main/java/ru/betterend/blocks/SilkMothNestBlock.java index 2d13649d..52e52178 100644 --- a/src/main/java/ru/betterend/blocks/SilkMothNestBlock.java +++ b/src/main/java/ru/betterend/blocks/SilkMothNestBlock.java @@ -150,7 +150,7 @@ public class SilkMothNestBlock extends BaseBlock implements IRenderTyped { public InteractionResult use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) { if (hand == InteractionHand.MAIN_HAND) { ItemStack stack = player.getMainHandItem(); - if (stack.getItem().is(FabricToolTags.SHEARS) && state.getValue(ACTIVE) && state.getValue(FULLNESS) == 3) { + if (stack.is(FabricToolTags.SHEARS) && state.getValue(ACTIVE) && state.getValue(FULLNESS) == 3) { BlocksHelper.setWithUpdate(world, pos, state.setValue(FULLNESS, 0)); Direction dir = state.getValue(FACING); double px = pos.getX() + dir.getStepX() + 0.5; diff --git a/src/main/java/ru/betterend/blocks/SmallAmaranitaBlock.java b/src/main/java/ru/betterend/blocks/SmallAmaranitaBlock.java index 2bc6059b..13eb1b34 100644 --- a/src/main/java/ru/betterend/blocks/SmallAmaranitaBlock.java +++ b/src/main/java/ru/betterend/blocks/SmallAmaranitaBlock.java @@ -1,7 +1,5 @@ package ru.betterend.blocks; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.level.BlockGetter; @@ -9,6 +7,7 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; @@ -17,6 +16,8 @@ import ru.betterend.blocks.basis.EndPlantBlock; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; +import java.util.Random; + public class SmallAmaranitaBlock extends EndPlantBlock { private static final VoxelShape SHAPE = Block.box(4, 0, 4, 12, 10, 12); @@ -29,7 +30,7 @@ public class SmallAmaranitaBlock extends EndPlantBlock { public void performBonemeal(ServerLevel world, Random random, BlockPos pos, BlockState state) { BlockPos bigPos = growBig(world, pos); if (bigPos != null) { - if (EndFeatures.GIGANTIC_AMARANITA.getFeature().place(world, null, random, bigPos, null)) { + if (EndFeatures.GIGANTIC_AMARANITA.getFeature().place(new FeaturePlaceContext<>(world, null, random, bigPos, null))) { replaceMushroom(world, bigPos); replaceMushroom(world, bigPos.south()); replaceMushroom(world, bigPos.east()); @@ -37,7 +38,7 @@ public class SmallAmaranitaBlock extends EndPlantBlock { } return; } - EndFeatures.LARGE_AMARANITA.getFeature().place(world, null, random, pos, null); + EndFeatures.LARGE_AMARANITA.getFeature().place(new FeaturePlaceContext<>(world, null, random, pos, null)); } @Override diff --git a/src/main/java/ru/betterend/blocks/SmallJellyshroomBlock.java b/src/main/java/ru/betterend/blocks/SmallJellyshroomBlock.java index 7456529d..1f76d9ec 100644 --- a/src/main/java/ru/betterend/blocks/SmallJellyshroomBlock.java +++ b/src/main/java/ru/betterend/blocks/SmallJellyshroomBlock.java @@ -23,6 +23,7 @@ import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.BonemealableBlock; import net.minecraft.world.level.block.SoundType; import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.material.Material; import net.minecraft.world.level.storage.loot.LootContext; import net.minecraft.world.level.storage.loot.parameters.LootContextParams; @@ -99,6 +100,6 @@ public class SmallJellyshroomBlock extends BaseAttachedBlock implements IRenderT @Override public void performBonemeal(ServerLevel world, Random random, BlockPos pos, BlockState state) { BlocksHelper.setWithUpdate(world, pos, Blocks.AIR); - EndFeatures.JELLYSHROOM.getFeature().place(world, null, random, pos, null); + EndFeatures.JELLYSHROOM.getFeature().place(new FeaturePlaceContext<>(world, null, random, pos, null)); } } diff --git a/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java b/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java index d6a389fc..433ff1e8 100644 --- a/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java @@ -50,7 +50,6 @@ import ru.bclib.client.models.ModelsHelper; import ru.betterend.blocks.EndBlockProperties; import ru.betterend.blocks.EndBlockProperties.PedestalState; import ru.betterend.blocks.InfusionPedestal; -import ru.betterend.blocks.entities.EndStoneSmelterBlockEntity; import ru.betterend.blocks.entities.InfusionPedestalEntity; import ru.betterend.blocks.entities.PedestalBlockEntity; import ru.betterend.client.models.Patterns; diff --git a/src/main/java/ru/betterend/blocks/entities/EternalPedestalEntity.java b/src/main/java/ru/betterend/blocks/entities/EternalPedestalEntity.java index d4da8a18..78bf9b6e 100644 --- a/src/main/java/ru/betterend/blocks/entities/EternalPedestalEntity.java +++ b/src/main/java/ru/betterend/blocks/entities/EternalPedestalEntity.java @@ -3,14 +3,15 @@ package ru.betterend.blocks.entities; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; import ru.betterend.registry.EndBlockEntities; import ru.betterend.rituals.EternalRitual; public class EternalPedestalEntity extends PedestalBlockEntity { private EternalRitual linkedRitual; - public EternalPedestalEntity() { - super(EndBlockEntities.ETERNAL_PEDESTAL); + public EternalPedestalEntity(BlockPos blockPos, BlockState blockState) { + super(EndBlockEntities.ETERNAL_PEDESTAL, blockPos, blockState); } public boolean hasRitual() { diff --git a/src/main/java/ru/betterend/entity/DragonflyEntity.java b/src/main/java/ru/betterend/entity/DragonflyEntity.java index b2a07c71..0429c4ba 100644 --- a/src/main/java/ru/betterend/entity/DragonflyEntity.java +++ b/src/main/java/ru/betterend/entity/DragonflyEntity.java @@ -20,7 +20,6 @@ import net.minecraft.world.entity.ai.navigation.FlyingPathNavigation; import net.minecraft.world.entity.ai.navigation.PathNavigation; import net.minecraft.world.entity.ai.util.AirAndWaterRandomPos; import net.minecraft.world.entity.ai.util.HoverRandomPos; -import net.minecraft.world.entity.ai.util.RandomPos; import net.minecraft.world.entity.animal.Animal; import net.minecraft.world.entity.animal.FlyingAnimal; import net.minecraft.world.entity.player.Player; diff --git a/src/main/java/ru/betterend/entity/ShadowWalkerEntity.java b/src/main/java/ru/betterend/entity/ShadowWalkerEntity.java index 100bccac..bf5f2fd0 100644 --- a/src/main/java/ru/betterend/entity/ShadowWalkerEntity.java +++ b/src/main/java/ru/betterend/entity/ShadowWalkerEntity.java @@ -96,7 +96,7 @@ public class ShadowWalkerEntity extends Monster { } @Override - protected float getVoicePitch() { + public float getVoicePitch() { return MHelper.randRange(0.75F, 1.25F, random); } diff --git a/src/main/java/ru/betterend/entity/SilkMothEntity.java b/src/main/java/ru/betterend/entity/SilkMothEntity.java index 927bc096..b2320f81 100644 --- a/src/main/java/ru/betterend/entity/SilkMothEntity.java +++ b/src/main/java/ru/betterend/entity/SilkMothEntity.java @@ -5,6 +5,8 @@ import java.util.List; import java.util.Random; import net.minecraft.world.entity.*; +import net.minecraft.world.entity.ai.util.AirAndWaterRandomPos; +import net.minecraft.world.entity.ai.util.HoverRandomPos; import org.jetbrains.annotations.Nullable; import net.minecraft.core.BlockPos; @@ -235,8 +237,8 @@ public class SilkMothEntity extends Animal implements FlyingAnimal { @Nullable private Vec3 getRandomLocation() { Vec3 vec3d3 = SilkMothEntity.this.getViewVector(0.0F); - Vec3 vec3d4 = RandomPos.getAboveLandPos(SilkMothEntity.this, 8, 7, vec3d3, 1.5707964F, 2, 1); - return vec3d4 != null ? vec3d4 : RandomPos.getAirPos(SilkMothEntity.this, 8, 4, -2, vec3d3, 1.5707963705062866D); + Vec3 vec3d4 = HoverRandomPos.getPos(SilkMothEntity.this, 8, 7, vec3d3.x, vec3d3.z, 1.5707964F, 3, 1); + return vec3d4 != null ? vec3d4 : AirAndWaterRandomPos.getPos(SilkMothEntity.this, 8, 4, -2, vec3d3.x, vec3d3.z, 1.5707963705062866D); } } @@ -295,7 +297,7 @@ public class SilkMothEntity extends Animal implements FlyingAnimal { BlocksHelper.setWithUpdate(SilkMothEntity.this.hiveWorld, SilkMothEntity.this.hivePos, state.setValue(EndBlockProperties.FULLNESS, fullness)); } SilkMothEntity.this.level.playSound(null, SilkMothEntity.this.entrance, SoundEvents.BEEHIVE_ENTER, SoundSource.BLOCKS, 1, 1); - SilkMothEntity.this.remove(); + SilkMothEntity.this.discard(); } else { SilkMothEntity.this.hivePos = null; From 9372ecf28fc9bfc7131f7960e2919567bd9795e7 Mon Sep 17 00:00:00 2001 From: Frank Bauer Date: Wed, 23 Jun 2021 22:23:35 +0200 Subject: [PATCH 016/595] version updates --- build.gradle | 2 +- gradle.properties | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/build.gradle b/build.gradle index 9f2e81dc..2227b888 100644 --- a/build.gradle +++ b/build.gradle @@ -33,7 +33,7 @@ dependencies { modImplementation "net.fabricmc:fabric-loader:${project.loader_version}" modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}" - useApi "vazkii.patchouli:Patchouli:1.16.4-${project.patchouli_version}" + //useApi "vazkii.patchouli:Patchouli:1.16.4-${project.patchouli_version}" useApi "com.github.paulevsGitch:BCLib:${project.bclib_version}" useOptional "me.shedaniel:RoughlyEnoughItems:${project.rei_version}" diff --git a/gradle.properties b/gradle.properties index b9c4fd41..31e7b8e7 100644 --- a/gradle.properties +++ b/gradle.properties @@ -15,7 +15,7 @@ archives_base_name = better-end # Dependencies # currently not on the main fabric site, check on the maven: https://maven.fabricmc.net/net/fabricmc/fabric-api/fabric-api patchouli_version = 50-FABRIC -fabric_version = 0.35.2+1.17 +fabric_version = 0.36.0+1.17 canvas_version = 1.0.+ -bclib_version = 0.1.42 +bclib_version = 0.1.43 rei_version = 5.8.+ \ No newline at end of file From d8383121e35978cba1f325fc920f53a1b608a28c Mon Sep 17 00:00:00 2001 From: Frank Bauer Date: Wed, 23 Jun 2021 23:21:16 +0200 Subject: [PATCH 017/595] *Cubozoa* Model --- .../entity/model/CubozoaEntityModel.java | 132 +++++++++++------- .../RendererEntityCubozoa.java | 9 +- .../registry/EndEntitiesRenders.java | 41 ++++-- 3 files changed, 118 insertions(+), 64 deletions(-) rename src/main/java/ru/betterend/entity/{render => model}/RendererEntityCubozoa.java (84%) diff --git a/src/main/java/ru/betterend/entity/model/CubozoaEntityModel.java b/src/main/java/ru/betterend/entity/model/CubozoaEntityModel.java index 91f0abda..b01a5b9c 100644 --- a/src/main/java/ru/betterend/entity/model/CubozoaEntityModel.java +++ b/src/main/java/ru/betterend/entity/model/CubozoaEntityModel.java @@ -2,46 +2,66 @@ package ru.betterend.entity.model; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; - import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartNames; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; import net.minecraft.client.renderer.RenderType; import net.minecraft.util.Mth; import ru.betterend.entity.CubozoaEntity; public class CubozoaEntityModel extends BlockBenchModel { - private final ModelPart model; - private final ModelPart main_cube_r1; - private final ModelPart tentacle_center_1; - private final ModelPart tentacle_1; - private final ModelPart tentacle_center_2; - private final ModelPart tentacle_2; - private final ModelPart tentacle_center_3; - private final ModelPart tentacle_3; - private final ModelPart tentacle_center_4; - private final ModelPart tentacle_4; - private float scaleY; - private float scaleXZ; + private final static int TENTACLE_COUNT = 4; - public CubozoaEntityModel() { - super(RenderType::entityTranslucent); - - texWidth = 48; - texHeight = 48; - - model = new ModelPart(this); + private final ModelPart model; + private final ModelPart[] tentacle_center; + private final ModelPart[] tentacle; + private float scaleY; + private float scaleXZ; + + public static LayerDefinition getTexturedModelData() { + MeshDefinition modelData = new MeshDefinition(); + PartDefinition modelPartData = modelData.getRoot(); + + PartDefinition bodyPart = modelPartData.addOrReplaceChild(PartNames.BODY, CubeListBuilder.create() + .texOffs(0, 17) + .addBox(-2.0F, -12.5F, -2.0F, 4.0F, 4.0F, 4.0F), PartPose.offset(0.0F, 24.0F, 0.0F)); + /*model = new ModelPart(this); model.setPos(0.0F, 24.0F, 0.0F); - model.texOffs(0, 17).addBox(-2.0F, -12.5F, -2.0F, 4.0F, 4.0F, 4.0F, 0.0F); + model.texOffs(0, 17).addBox(-2.0F, -12.5F, -2.0F, 4.0F, 4.0F, 4.0F, 0.0F);*/ - main_cube_r1 = new ModelPart(this); + bodyPart.addOrReplaceChild("main_cube_r1", CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-5.0F, -7.0F, -5.0F, 10.0F, 7.0F, 10.0F), PartPose.offsetAndRotation(0.0F, -14.0F, 0.0F, 0.0F, 0.0F, -3.1416F)); + + /*main_cube_r1 = new ModelPart(this); main_cube_r1.setPos(0.0F, -14.0F, 0.0F); model.addChild(main_cube_r1); setRotationAngle(main_cube_r1, 0.0F, 0.0F, -3.1416F); - main_cube_r1.texOffs(0, 0).addBox(-5.0F, -7.0F, -5.0F, 10.0F, 7.0F, 10.0F, 0.0F); + main_cube_r1.texOffs(0, 0).addBox(-5.0F, -7.0F, -5.0F, 10.0F, 7.0F, 10.0F, 0.0F);*/ + float[] angles = {0, (float)Math.PI/-2, (float)Math.PI, (float)Math.PI/2}; - tentacle_center_1 = new ModelPart(this); + for (int i=1; i<=TENTACLE_COUNT; i++){ + PartDefinition tentaclePart = bodyPart + .addOrReplaceChild("tentacle_center_"+i, + CubeListBuilder.create(), + PartPose.offsetAndRotation( + 0.0F, 0.0F, 0.0F, + 0.0F, -1.5708F, 0.0F + ) + ); + + tentaclePart.addOrReplaceChild("tentacle_"+i, CubeListBuilder.create() + .texOffs(16, 17) + .addBox(-4.0F, 0.0F, 0.0F, 8.0F, 7.0F, 0.0F), + PartPose.offset(0.0F, -7.0F, 4.5F)); + } + /*tentacle_center_1 = new ModelPart(this); tentacle_center_1.setPos(0.0F, 0.0F, 0.0F); model.addChild(tentacle_center_1); - tentacle_1 = new ModelPart(this); tentacle_1.setPos(0.0F, -7.0F, 4.5F); @@ -52,7 +72,6 @@ public class CubozoaEntityModel extends BlockBenchModel { tentacle_center_2.setPos(0.0F, 0.0F, 0.0F); model.addChild(tentacle_center_2); setRotationAngle(tentacle_center_2, 0.0F, -1.5708F, 0.0F); - tentacle_2 = new ModelPart(this); tentacle_2.setPos(0.0F, -7.0F, 4.5F); @@ -63,7 +82,6 @@ public class CubozoaEntityModel extends BlockBenchModel { tentacle_center_3.setPos(0.0F, 0.0F, 0.0F); model.addChild(tentacle_center_3); setRotationAngle(tentacle_center_3, 0.0F, 3.1416F, 0.0F); - tentacle_3 = new ModelPart(this); tentacle_3.setPos(0.0F, -7.0F, 4.5F); @@ -74,31 +92,47 @@ public class CubozoaEntityModel extends BlockBenchModel { tentacle_center_4.setPos(0.0F, 0.0F, 0.0F); model.addChild(tentacle_center_4); setRotationAngle(tentacle_center_4, 0.0F, 1.5708F, 0.0F); - + tentacle_4 = new ModelPart(this); tentacle_4.setPos(0.0F, -7.0F, 4.5F); tentacle_center_4.addChild(tentacle_4); - tentacle_4.texOffs(16, 17).addBox(-4.0F, 0.0F, 0.0F, 8.0F, 7.0F, 0.0F, 0.0F); - } - - @Override - public void setupAnim(CubozoaEntity entity, float limbAngle, float limbDistance, float animationProgress, float headYaw, float headPitch) { - float sin = Mth.sin(animationProgress * 0.13F); - scaleY = sin * 0.1F + 0.9F; - scaleXZ = Mth.sin(animationProgress * 0.13F + 3.14F) * 0.1F + 0.9F; - - tentacle_1.xRot = sin * 0.15F; - tentacle_2.xRot = sin * 0.15F; - tentacle_3.xRot = sin * 0.15F; - tentacle_4.xRot = sin * 0.15F; - } + tentacle_4.texOffs(16, 17).addBox(-4.0F, 0.0F, 0.0F, 8.0F, 7.0F, 0.0F, 0.0F);*/ - @Override - public void renderToBuffer(PoseStack matrices, VertexConsumer vertices, int light, int overlay, float red, float green, float blue, float alpha) { - matrices.pushPose(); - matrices.scale(scaleXZ, scaleY, scaleXZ); - model.render(matrices, vertices, light, overlay); - matrices.popPose(); - } + /* texWidth = 48; + texHeight = 48; */ + return LayerDefinition.create(modelData, 48, 48); + } + + public CubozoaEntityModel(ModelPart modelPart) { + super(RenderType::entityTranslucent); + + tentacle = new ModelPart[TENTACLE_COUNT]; + tentacle_center = new ModelPart[TENTACLE_COUNT]; + + model = modelPart.getChild(PartNames.BODY); + for (int i=1; i<=TENTACLE_COUNT; i++){ + tentacle_center[i] = model.getChild("tentacle_center_"+i); + tentacle[i] = tentacle_center[i].getChild("tentacle_"+i); + } + } + + @Override + public void setupAnim(CubozoaEntity entity, float limbAngle, float limbDistance, float animationProgress, float headYaw, float headPitch) { + float sin = Mth.sin(animationProgress * 0.13F); + scaleY = sin * 0.1F + 0.9F; + scaleXZ = Mth.sin(animationProgress * 0.13F + 3.14F) * 0.1F + 0.9F; + + for (int i=1; i<=TENTACLE_COUNT; i++){ + tentacle[i].xRot = sin * 0.15f; + } + } + + @Override + public void renderToBuffer(PoseStack matrices, VertexConsumer vertices, int light, int overlay, float red, float green, float blue, float alpha) { + matrices.pushPose(); + matrices.scale(scaleXZ, scaleY, scaleXZ); + model.render(matrices, vertices, light, overlay); + matrices.popPose(); + } } diff --git a/src/main/java/ru/betterend/entity/render/RendererEntityCubozoa.java b/src/main/java/ru/betterend/entity/model/RendererEntityCubozoa.java similarity index 84% rename from src/main/java/ru/betterend/entity/render/RendererEntityCubozoa.java rename to src/main/java/ru/betterend/entity/model/RendererEntityCubozoa.java index 5b6b78fe..27500043 100644 --- a/src/main/java/ru/betterend/entity/render/RendererEntityCubozoa.java +++ b/src/main/java/ru/betterend/entity/model/RendererEntityCubozoa.java @@ -1,11 +1,11 @@ -package ru.betterend.entity.render; +package ru.betterend.entity.model; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; -import net.minecraft.client.renderer.entity.EntityRenderDispatcher; +import net.minecraft.client.renderer.entity.EntityRendererProvider; import net.minecraft.client.renderer.entity.MobRenderer; import net.minecraft.client.renderer.entity.layers.EyesLayer; import net.minecraft.client.renderer.texture.OverlayTexture; @@ -13,13 +13,14 @@ import net.minecraft.resources.ResourceLocation; import ru.betterend.BetterEnd; import ru.betterend.entity.CubozoaEntity; import ru.betterend.entity.model.CubozoaEntityModel; +import ru.betterend.registry.EndEntitiesRenders; public class RendererEntityCubozoa extends MobRenderer { private static final ResourceLocation[] TEXTURE = new ResourceLocation[2]; private static final RenderType[] GLOW = new RenderType[2]; - public RendererEntityCubozoa(EntityRenderDispatcher entityRenderDispatcher) { - super(entityRenderDispatcher, new CubozoaEntityModel(), 0.5f); + public RendererEntityCubozoa(EntityRendererProvider.Context ctx) { + super(ctx, new CubozoaEntityModel(ctx.bakeLayer(EndEntitiesRenders.DRAGONFLY_MODEL)), 0.5f); this.addLayer(new EyesLayer(this) { @Override public RenderType renderType() { diff --git a/src/main/java/ru/betterend/registry/EndEntitiesRenders.java b/src/main/java/ru/betterend/registry/EndEntitiesRenders.java index 30384554..d1e59f53 100644 --- a/src/main/java/ru/betterend/registry/EndEntitiesRenders.java +++ b/src/main/java/ru/betterend/registry/EndEntitiesRenders.java @@ -2,11 +2,16 @@ package ru.betterend.registry; import java.util.function.Function; +import net.fabricmc.fabric.api.client.rendereregistry.v1.EntityModelLayerRegistry; import net.fabricmc.fabric.api.client.rendereregistry.v1.EntityRendererRegistry; +import net.minecraft.client.model.geom.ModelLayerLocation; import net.minecraft.client.renderer.entity.EntityRenderDispatcher; import net.minecraft.client.renderer.entity.MobRenderer; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.EntityType; -import ru.betterend.entity.render.RendererEntityCubozoa; +import ru.betterend.BetterEnd; +import ru.betterend.entity.model.CubozoaEntityModel; +import ru.betterend.entity.model.RendererEntityCubozoa; import ru.betterend.entity.render.RendererEntityDragonfly; import ru.betterend.entity.render.RendererEntityEndFish; import ru.betterend.entity.render.RendererEntityEndSlime; @@ -14,19 +19,33 @@ import ru.betterend.entity.render.RendererEntityShadowWalker; import ru.betterend.entity.render.SilkMothEntityRenderer; public class EndEntitiesRenders { + public static final ModelLayerLocation DRAGONFLY_MODEL = registerMain("dragonfly"); public static void register() { - register(EndEntities.DRAGONFLY, RendererEntityDragonfly::new); - register(EndEntities.END_SLIME, RendererEntityEndSlime::new); - register(EndEntities.END_FISH, RendererEntityEndFish::new); - register(EndEntities.SHADOW_WALKER, RendererEntityShadowWalker::new); - register(EndEntities.CUBOZOA, RendererEntityCubozoa::new); - register(EndEntities.SILK_MOTH, SilkMothEntityRenderer::new); + register(EndEntities.DRAGONFLY, RendererEntityDragonfly.class); + register(EndEntities.END_SLIME, RendererEntityEndSlime.class); + register(EndEntities.END_FISH, RendererEntityEndFish.class); + register(EndEntities.SHADOW_WALKER, RendererEntityShadowWalker.class); + register(EndEntities.CUBOZOA, RendererEntityCubozoa.class); + register(EndEntities.SILK_MOTH, SilkMothEntityRenderer.class); + + EntityModelLayerRegistry.registerModelLayer(DRAGONFLY_MODEL, CubozoaEntityModel::getTexturedModelData); } - - private static void register(EntityType type, Function> render) { - EntityRendererRegistry.INSTANCE.register(type, (entityRenderDispatcher, context) -> { - return render.apply(entityRenderDispatcher); + + private static void register(EntityType type, Class> renderer) { + EntityRendererRegistry.INSTANCE.register(type, (context) -> { + MobRenderer render = null; + try { + render = renderer.getConstructor(context.getClass()).newInstance(context); + } + catch (Exception e) { + e.printStackTrace(); + } + return render; }); } + + private static ModelLayerLocation registerMain(String id){ + return new ModelLayerLocation(new ResourceLocation(BetterEnd.MOD_ID, id), "main"); + } } From 6e9d8e8b49dcf45f5c1c56552a73f5a06488ce73 Mon Sep 17 00:00:00 2001 From: Frank Bauer Date: Wed, 23 Jun 2021 23:50:30 +0200 Subject: [PATCH 018/595] using getters for `abilities` and `yRot` --- .../java/ru/betterend/entity/EndSlimeEntity.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/ru/betterend/entity/EndSlimeEntity.java b/src/main/java/ru/betterend/entity/EndSlimeEntity.java index 24662f26..f790dbb5 100644 --- a/src/main/java/ru/betterend/entity/EndSlimeEntity.java +++ b/src/main/java/ru/betterend/entity/EndSlimeEntity.java @@ -322,7 +322,7 @@ public class EndSlimeEntity extends Slime { return false; } else { - return livingEntity instanceof Player && ((Player) livingEntity).abilities.invulnerable ? false : EndSlimeEntity.this.getMoveControl() instanceof EndSlimeMoveControl; + return livingEntity instanceof Player && ((Player) livingEntity).getAbilities().invulnerable ? false : EndSlimeEntity.this.getMoveControl() instanceof EndSlimeMoveControl; } } @@ -339,7 +339,7 @@ public class EndSlimeEntity extends Slime { else if (!livingEntity.isAlive()) { return false; } - else if (livingEntity instanceof Player && ((Player) livingEntity).abilities.invulnerable) { + else if (livingEntity instanceof Player && ((Player) livingEntity).getAbilities().invulnerable) { return false; } else { @@ -349,7 +349,7 @@ public class EndSlimeEntity extends Slime { public void tick() { EndSlimeEntity.this.lookAt(EndSlimeEntity.this.getTarget(), 10.0F, 10.0F); - ((EndSlimeMoveControl) EndSlimeEntity.this.getMoveControl()).look(EndSlimeEntity.this.yRot, EndSlimeEntity.this.isDealsDamage()); + ((EndSlimeMoveControl) EndSlimeEntity.this.getMoveControl()).look(EndSlimeEntity.this.getYRot(), EndSlimeEntity.this.isDealsDamage()); } } @@ -360,7 +360,7 @@ public class EndSlimeEntity extends Slime { public EndSlimeMoveControl(EndSlimeEntity slime) { super(slime); - this.targetYaw = 180.0F * slime.yRot / 3.1415927F; + this.targetYaw = 180.0F * slime.getYRot() / 3.1415927F; } public void look(float targetYaw, boolean jumpOften) { @@ -374,9 +374,9 @@ public class EndSlimeEntity extends Slime { } public void tick() { - this.mob.yRot = this.rotlerp(this.mob.yRot, this.targetYaw, 90.0F); - this.mob.yHeadRot = this.mob.yRot; - this.mob.yBodyRot = this.mob.yRot; + this.mob.setYRot(this.rotlerp(this.mob.getYRot(), this.targetYaw, 90.0F)); + this.mob.yHeadRot = this.mob.getYRot(); + this.mob.yBodyRot = this.mob.getYRot(); if (this.operation != MoveControl.Operation.MOVE_TO) { this.mob.setZza(0.0F); } From d6696feb16aa28197148b2e0b8497fccec46c8bc Mon Sep 17 00:00:00 2001 From: Frank Bauer Date: Wed, 23 Jun 2021 23:50:46 +0200 Subject: [PATCH 019/595] Signature changes --- src/main/java/ru/betterend/blocks/LumecornSeedBlock.java | 3 ++- .../ru/betterend/blocks/entities/PedestalBlockEntity.java | 6 +++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/LumecornSeedBlock.java b/src/main/java/ru/betterend/blocks/LumecornSeedBlock.java index ed04a881..ec666d67 100644 --- a/src/main/java/ru/betterend/blocks/LumecornSeedBlock.java +++ b/src/main/java/ru/betterend/blocks/LumecornSeedBlock.java @@ -6,6 +6,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.state.BlockBehaviour; import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import ru.betterend.blocks.basis.EndPlantWithAgeBlock; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; @@ -14,7 +15,7 @@ public class LumecornSeedBlock extends EndPlantWithAgeBlock { @Override public void growAdult(WorldGenLevel world, Random random, BlockPos pos) { - EndFeatures.LUMECORN.getFeature().place(world, null, random, pos, null); + EndFeatures.LUMECORN.getFeature().place(new FeaturePlaceContext<>(world, null, random, pos, null)); } @Override diff --git a/src/main/java/ru/betterend/blocks/entities/PedestalBlockEntity.java b/src/main/java/ru/betterend/blocks/entities/PedestalBlockEntity.java index 1f917f00..c41a16bd 100644 --- a/src/main/java/ru/betterend/blocks/entities/PedestalBlockEntity.java +++ b/src/main/java/ru/betterend/blocks/entities/PedestalBlockEntity.java @@ -19,9 +19,13 @@ public class PedestalBlockEntity extends BlockEntity implements Container, Block private final int maxAge = 314; private int age; + + public PedestalBlockEntity(BlockPos blockPos, BlockState blockState) { + this(EndBlockEntities.PEDESTAL, blockPos, blockState); + } public PedestalBlockEntity(BlockEntityType blockEntityType, BlockPos blockPos, BlockState blockState) { - super(EndBlockEntities.PEDESTAL, blockPos, blockState); + super(blockEntityType, blockPos, blockState); } public PedestalBlockEntity(BlockEntityType type) { From e5bf933758bdf7bfa9e128b62aad1db5c9b034df Mon Sep 17 00:00:00 2001 From: Frank Bauer Date: Thu, 24 Jun 2021 09:19:20 +0200 Subject: [PATCH 020/595] Render *EndSlime* --- .../ru/betterend/entity/EndSlimeEntity.java | 5 +- .../entity/model/EndSlimeEntityModel.java | 100 +++++++++++++++--- .../RendererEntityCubozoa.java | 2 +- .../entity/render/RendererEntityEndSlime.java | 21 ++-- .../java/ru/betterend/interfaces/ISlime.java | 3 + .../ru/betterend/mixin/common/SlimeMixin.java | 14 ++- .../registry/EndEntitiesRenders.java | 16 +-- 7 files changed, 124 insertions(+), 37 deletions(-) rename src/main/java/ru/betterend/entity/{model => render}/RendererEntityCubozoa.java (96%) diff --git a/src/main/java/ru/betterend/entity/EndSlimeEntity.java b/src/main/java/ru/betterend/entity/EndSlimeEntity.java index f790dbb5..48393a06 100644 --- a/src/main/java/ru/betterend/entity/EndSlimeEntity.java +++ b/src/main/java/ru/betterend/entity/EndSlimeEntity.java @@ -116,7 +116,7 @@ public class EndSlimeEntity extends Slime { } @Override - public void remove() { + public void remove(RemovalReason reason) { int i = this.getSize(); if (!this.level.isClientSide && i > 1 && this.isDeadOrDying()) { Component text = this.getCustomName(); @@ -144,7 +144,8 @@ public class EndSlimeEntity extends Slime { this.level.addFreshEntity(slimeEntity); } } - this.removed = true; + + ((ISlime)this).entityRemove(reason); } @Override diff --git a/src/main/java/ru/betterend/entity/model/EndSlimeEntityModel.java b/src/main/java/ru/betterend/entity/model/EndSlimeEntityModel.java index 5d3bb97d..2abf6c55 100644 --- a/src/main/java/ru/betterend/entity/model/EndSlimeEntityModel.java +++ b/src/main/java/ru/betterend/entity/model/EndSlimeEntityModel.java @@ -6,37 +6,90 @@ import com.mojang.blaze3d.vertex.VertexConsumer; import net.minecraft.client.model.ListModel; import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartNames; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; import net.minecraft.client.renderer.RenderType; import ru.bclib.util.MHelper; import ru.betterend.entity.EndSlimeEntity; public class EndSlimeEntityModel extends ListModel { - private final ModelPart flower; - private final ModelPart crop; private final ModelPart innerCube; private final ModelPart rightEye; private final ModelPart leftEye; private final ModelPart mouth; + private final ModelPart flower; + private final ModelPart crop; - public EndSlimeEntityModel(boolean onlyShell) { - super(RenderType::entityCutout); + public static LayerDefinition getShellOnlyTexturedModelData() { + return getTexturedModelData(true); + } + public static LayerDefinition getCompleteTexturedModelData() { + return getTexturedModelData(false); + } - this.innerCube = new ModelPart(this, 0, 16); - this.rightEye = new ModelPart(this, 32, 0); - this.leftEye = new ModelPart(this, 32, 4); - this.mouth = new ModelPart(this, 32, 8); - this.flower = new ModelPart(this); - this.crop = new ModelPart(this); + private static LayerDefinition getTexturedModelData(boolean onlyShell) { + MeshDefinition modelData = new MeshDefinition(); + PartDefinition modelPartData = modelData.getRoot(); + //this.innerCube = new ModelPart(this, 0, 16); if (onlyShell) { - this.innerCube.texOffs(0, 0); - this.innerCube.addBox(-4.0F, 16.0F, -4.0F, 8.0F, 8.0F, 8.0F); + modelPartData.addOrReplaceChild(PartNames.BODY, CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-4.0F, 16.0F, -4.0F, 8.0F, 8.0F, 8.0F), + PartPose.ZERO); + /* this.innerCube.texOffs(0, 0); + this.innerCube.addBox(-4.0F, 16.0F, -4.0F, 8.0F, 8.0F, 8.0F);*/ } else { - this.innerCube.addBox(-3.0F, 17.0F, -3.0F, 6.0F, 6.0F, 6.0F); - this.rightEye.addBox(-3.25F, 18.0F, -3.5F, 2.0F, 2.0F, 2.0F); - this.leftEye.addBox(1.25F, 18.0F, -3.5F, 2.0F, 2.0F, 2.0F); - this.mouth.addBox(0.0F, 21.0F, -3.5F, 1.0F, 1.0F, 1.0F); + modelPartData.addOrReplaceChild(PartNames.BODY, CubeListBuilder.create() + .texOffs(0, 16) + .addBox(-3.0F, 17.0F, -3.0F, 6.0F, 6.0F, 6.0F), + PartPose.ZERO); + //this.innerCube.addBox(-3.0F, 17.0F, -3.0F, 6.0F, 6.0F, 6.0F); + modelPartData.addOrReplaceChild(PartNames.RIGHT_EYE, CubeListBuilder.create() + .texOffs(32, 0) + .addBox(-3.25F, 18.0F, -3.5F, 2.0F, 2.0F, 2.0F), + PartPose.ZERO); + //this.rightEye = new ModelPart(this, 32, 0); + //this.rightEye.addBox(-3.25F, 18.0F, -3.5F, 2.0F, 2.0F, 2.0F); + + modelPartData.addOrReplaceChild(PartNames.LEFT_EYE, CubeListBuilder.create() + .texOffs(32, 4) + .addBox(1.25F, 18.0F, -3.5F, 2.0F, 2.0F, 2.0F), + PartPose.ZERO); + //this.leftEye = new ModelPart(this, 32, 4); + //this.leftEye.addBox(1.25F, 18.0F, -3.5F, 2.0F, 2.0F, 2.0F); + + modelPartData.addOrReplaceChild(PartNames.MOUTH, CubeListBuilder.create() + .texOffs(32, 8) + .addBox(0.0F, 21.0F, -3.5F, 1.0F, 1.0F, 1.0F), + PartPose.ZERO); + //this.mouth = new ModelPart(this, 32, 8); + //this.mouth.addBox(0.0F, 21.0F, -3.5F, 1.0F, 1.0F, 1.0F); + + PartDefinition flowerPart = modelPartData.addOrReplaceChild("flower", CubeListBuilder.create(), PartPose.ZERO); + PartDefinition cropPart = modelPartData.addOrReplaceChild("crop", CubeListBuilder.create(), PartPose.ZERO); + + for (int i = 0; i < 6; i++) { + final PartDefinition parent = i<4?flowerPart:cropPart; + final float rot = MHelper.degreesToRadians( i<4 ? (i * 45F) : ((i-4) * 90F + 45F) ); + + PartDefinition petalRotPart = parent.addOrReplaceChild("petalRot_"+i, + CubeListBuilder.create(), + PartPose.offsetAndRotation(0,0,0,0,rot, 0)); + + + petalRotPart.addOrReplaceChild("petal_"+i, + CubeListBuilder.create() + .texOffs(40, 0) + .addBox(0.0F, 0.0F, 0.0F, 8.0F, 8.0F, 0.0F), + PartPose.offset(-4, 8, 0)); + } + /* this.flower = new ModelPart(this); for (int i = 0; i < 4; i++) { ModelPart petalRot = new ModelPart(this); petalRot.yRot = MHelper.degreesToRadians(i * 45F); @@ -48,6 +101,7 @@ public class EndSlimeEntityModel extends ListModel this.flower.addChild(petalRot); petalRot.addChild(petal); } + this.crop = new ModelPart(this); for (int i = 0; i < 2; i++) { ModelPart petalRot = new ModelPart(this); @@ -60,7 +114,21 @@ public class EndSlimeEntityModel extends ListModel this.crop.addChild(petalRot); petalRot.addChild(petal); } + */ } + + return LayerDefinition.create(modelData, 64, 32); + } + + public EndSlimeEntityModel(ModelPart modelPart) { + super(RenderType::entityCutout); + + innerCube = modelPart.getChild(PartNames.BODY); + rightEye = modelPart.getChild(PartNames.RIGHT_EYE); + leftEye = modelPart.getChild(PartNames.LEFT_EYE); + mouth = modelPart.getChild(PartNames.MOUTH); + flower = modelPart.getChild("flower"); + crop = modelPart.getChild("crop"); } @Override diff --git a/src/main/java/ru/betterend/entity/model/RendererEntityCubozoa.java b/src/main/java/ru/betterend/entity/render/RendererEntityCubozoa.java similarity index 96% rename from src/main/java/ru/betterend/entity/model/RendererEntityCubozoa.java rename to src/main/java/ru/betterend/entity/render/RendererEntityCubozoa.java index 27500043..d9a3fa47 100644 --- a/src/main/java/ru/betterend/entity/model/RendererEntityCubozoa.java +++ b/src/main/java/ru/betterend/entity/render/RendererEntityCubozoa.java @@ -20,7 +20,7 @@ public class RendererEntityCubozoa extends MobRenderer(this) { @Override public RenderType renderType() { diff --git a/src/main/java/ru/betterend/entity/render/RendererEntityEndSlime.java b/src/main/java/ru/betterend/entity/render/RendererEntityEndSlime.java index 3fad8fc1..39fdf210 100644 --- a/src/main/java/ru/betterend/entity/render/RendererEntityEndSlime.java +++ b/src/main/java/ru/betterend/entity/render/RendererEntityEndSlime.java @@ -5,10 +5,7 @@ import com.mojang.blaze3d.vertex.VertexConsumer; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; -import net.minecraft.client.renderer.entity.EntityRenderDispatcher; -import net.minecraft.client.renderer.entity.LivingEntityRenderer; -import net.minecraft.client.renderer.entity.MobRenderer; -import net.minecraft.client.renderer.entity.RenderLayerParent; +import net.minecraft.client.renderer.entity.*; import net.minecraft.client.renderer.entity.layers.EyesLayer; import net.minecraft.client.renderer.entity.layers.RenderLayer; import net.minecraft.client.renderer.texture.OverlayTexture; @@ -16,15 +13,17 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.util.Mth; import ru.betterend.BetterEnd; import ru.betterend.entity.EndSlimeEntity; +import ru.betterend.entity.model.CubozoaEntityModel; import ru.betterend.entity.model.EndSlimeEntityModel; +import ru.betterend.registry.EndEntitiesRenders; public class RendererEntityEndSlime extends MobRenderer> { private static final ResourceLocation TEXTURE[] = new ResourceLocation[4]; private static final RenderType GLOW[] = new RenderType[4]; - public RendererEntityEndSlime(EntityRenderDispatcher entityRenderDispatcher) { - super(entityRenderDispatcher, new EndSlimeEntityModel(false), 0.25F); - this.addLayer(new OverlayFeatureRenderer(this)); + public RendererEntityEndSlime(EntityRendererProvider.Context ctx) { + super(ctx, new EndSlimeEntityModel<>(ctx.bakeLayer(EndEntitiesRenders.END_SLIME_MODEL)), 0.25f); + this.addLayer(new OverlayFeatureRenderer(this, ctx)); this.addLayer(new EyesLayer>(this) { @Override public RenderType renderType() { @@ -69,11 +68,13 @@ public class RendererEntityEndSlime extends MobRenderer extends RenderLayer> { - private final EndSlimeEntityModel modelOrdinal = new EndSlimeEntityModel(true); - private final EndSlimeEntityModel modelLake = new EndSlimeEntityModel(true); + private final EndSlimeEntityModel modelOrdinal; + private final EndSlimeEntityModel modelLake; - public OverlayFeatureRenderer(RenderLayerParent> featureRendererContext) { + public OverlayFeatureRenderer(RenderLayerParent> featureRendererContext, EntityRendererProvider.Context ctx) { super(featureRendererContext); + modelOrdinal = new EndSlimeEntityModel<>(ctx.bakeLayer(EndEntitiesRenders.END_SLIME_SHELL_MODEL)); + modelLake = new EndSlimeEntityModel<>(ctx.bakeLayer(EndEntitiesRenders.END_SLIME_SHELL_MODEL)); } public void render(PoseStack matrixStack, MultiBufferSource vertexConsumerProvider, int i, T livingEntity, diff --git a/src/main/java/ru/betterend/interfaces/ISlime.java b/src/main/java/ru/betterend/interfaces/ISlime.java index 7df19bc6..3994ad34 100644 --- a/src/main/java/ru/betterend/interfaces/ISlime.java +++ b/src/main/java/ru/betterend/interfaces/ISlime.java @@ -1,5 +1,8 @@ package ru.betterend.interfaces; +import net.minecraft.world.entity.Entity; + public interface ISlime { public void be_setSlimeSize(int size, boolean heal); + void entityRemove(Entity.RemovalReason removalReason); } diff --git a/src/main/java/ru/betterend/mixin/common/SlimeMixin.java b/src/main/java/ru/betterend/mixin/common/SlimeMixin.java index 5d5ba94f..a6a9509c 100644 --- a/src/main/java/ru/betterend/mixin/common/SlimeMixin.java +++ b/src/main/java/ru/betterend/mixin/common/SlimeMixin.java @@ -1,5 +1,8 @@ package ru.betterend.mixin.common; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.level.Level; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -7,7 +10,11 @@ import net.minecraft.world.entity.monster.Slime; import ru.betterend.interfaces.ISlime; @Mixin(Slime.class) -public class SlimeMixin implements ISlime { +public abstract class SlimeMixin extends Entity implements ISlime { + public SlimeMixin(EntityType entityType, Level level) { + super(entityType, level); + } + @Shadow protected void setSize(int size, boolean heal) {} @@ -15,4 +22,9 @@ public class SlimeMixin implements ISlime { public void be_setSlimeSize(int size, boolean heal) { setSize(size, heal); } + + @Override + public void entityRemove(Entity.RemovalReason removalReason){ + super.remove(removalReason); + } } diff --git a/src/main/java/ru/betterend/registry/EndEntitiesRenders.java b/src/main/java/ru/betterend/registry/EndEntitiesRenders.java index d1e59f53..95746fcb 100644 --- a/src/main/java/ru/betterend/registry/EndEntitiesRenders.java +++ b/src/main/java/ru/betterend/registry/EndEntitiesRenders.java @@ -1,17 +1,15 @@ package ru.betterend.registry; -import java.util.function.Function; - import net.fabricmc.fabric.api.client.rendereregistry.v1.EntityModelLayerRegistry; import net.fabricmc.fabric.api.client.rendereregistry.v1.EntityRendererRegistry; import net.minecraft.client.model.geom.ModelLayerLocation; -import net.minecraft.client.renderer.entity.EntityRenderDispatcher; import net.minecraft.client.renderer.entity.MobRenderer; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.EntityType; import ru.betterend.BetterEnd; import ru.betterend.entity.model.CubozoaEntityModel; -import ru.betterend.entity.model.RendererEntityCubozoa; +import ru.betterend.entity.model.EndSlimeEntityModel; +import ru.betterend.entity.render.RendererEntityCubozoa; import ru.betterend.entity.render.RendererEntityDragonfly; import ru.betterend.entity.render.RendererEntityEndFish; import ru.betterend.entity.render.RendererEntityEndSlime; @@ -19,8 +17,10 @@ import ru.betterend.entity.render.RendererEntityShadowWalker; import ru.betterend.entity.render.SilkMothEntityRenderer; public class EndEntitiesRenders { - public static final ModelLayerLocation DRAGONFLY_MODEL = registerMain("dragonfly"); - + public static final ModelLayerLocation CUBOZOA_MODEL = registerMain("cubozoa"); + public static final ModelLayerLocation END_SLIME_SHELL_MODEL = registerMain("endslime_shell"); + public static final ModelLayerLocation END_SLIME_MODEL = registerMain("endslime"); + public static void register() { register(EndEntities.DRAGONFLY, RendererEntityDragonfly.class); register(EndEntities.END_SLIME, RendererEntityEndSlime.class); @@ -29,7 +29,9 @@ public class EndEntitiesRenders { register(EndEntities.CUBOZOA, RendererEntityCubozoa.class); register(EndEntities.SILK_MOTH, SilkMothEntityRenderer.class); - EntityModelLayerRegistry.registerModelLayer(DRAGONFLY_MODEL, CubozoaEntityModel::getTexturedModelData); + EntityModelLayerRegistry.registerModelLayer(CUBOZOA_MODEL, CubozoaEntityModel::getTexturedModelData); + EntityModelLayerRegistry.registerModelLayer(END_SLIME_SHELL_MODEL, EndSlimeEntityModel::getShellOnlyTexturedModelData); + EntityModelLayerRegistry.registerModelLayer(END_SLIME_MODEL, EndSlimeEntityModel::getCompleteTexturedModelData); } private static void register(EntityType type, Class> renderer) { From fd062bf9a9ca88d9dedef5943078172e8682561a Mon Sep 17 00:00:00 2001 From: Frank Bauer Date: Thu, 24 Jun 2021 09:19:46 +0200 Subject: [PATCH 021/595] Minor fixes --- src/main/java/ru/betterend/blocks/HydraluxPetalBlock.java | 3 ++- .../betterend/blocks/entities/EternalPedestalEntity.java | 7 ++++++- .../ru/betterend/entity/render/RendererEntityCubozoa.java | 2 +- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/HydraluxPetalBlock.java b/src/main/java/ru/betterend/blocks/HydraluxPetalBlock.java index 5c82d09a..c1157780 100644 --- a/src/main/java/ru/betterend/blocks/HydraluxPetalBlock.java +++ b/src/main/java/ru/betterend/blocks/HydraluxPetalBlock.java @@ -6,6 +6,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.world.entity.Entity; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.material.Material; import net.minecraft.world.level.material.MaterialColor; import ru.bclib.blocks.BaseBlock; @@ -26,5 +27,5 @@ public class HydraluxPetalBlock extends BaseBlock { } @Override - public void fallOn(Level world, BlockPos pos, Entity entity, float distance) {} + public void fallOn(Level level, BlockState blockState, BlockPos blockPos, Entity entity, float f) {} } diff --git a/src/main/java/ru/betterend/blocks/entities/EternalPedestalEntity.java b/src/main/java/ru/betterend/blocks/entities/EternalPedestalEntity.java index 78bf9b6e..0490da3a 100644 --- a/src/main/java/ru/betterend/blocks/entities/EternalPedestalEntity.java +++ b/src/main/java/ru/betterend/blocks/entities/EternalPedestalEntity.java @@ -27,8 +27,13 @@ public class EternalPedestalEntity extends PedestalBlockEntity { } @Override + public void setLevel(Level world) { + if (hasRitual()) { + linkedRitual.setWorld(world); + } + } + public void setLevelAndPosition(Level world, BlockPos pos) { - super.setLevelAndPosition(world, pos); if (hasRitual()) { linkedRitual.setWorld(world); } diff --git a/src/main/java/ru/betterend/entity/render/RendererEntityCubozoa.java b/src/main/java/ru/betterend/entity/render/RendererEntityCubozoa.java index d9a3fa47..d3358b8d 100644 --- a/src/main/java/ru/betterend/entity/render/RendererEntityCubozoa.java +++ b/src/main/java/ru/betterend/entity/render/RendererEntityCubozoa.java @@ -1,4 +1,4 @@ -package ru.betterend.entity.model; +package ru.betterend.entity.render; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; From 813880aa19063b7beee6e717da1d13687d7c587f Mon Sep 17 00:00:00 2001 From: Frank Bauer Date: Thu, 24 Jun 2021 10:09:02 +0200 Subject: [PATCH 022/595] *Dragonfly* Model --- .../entity/model/DragonflyEntityModel.java | 194 ++++++++++++------ .../render/RendererEntityDragonfly.java | 7 +- .../registry/EndEntitiesRenders.java | 5 +- 3 files changed, 144 insertions(+), 62 deletions(-) diff --git a/src/main/java/ru/betterend/entity/model/DragonflyEntityModel.java b/src/main/java/ru/betterend/entity/model/DragonflyEntityModel.java index 88162bc2..8885af2f 100644 --- a/src/main/java/ru/betterend/entity/model/DragonflyEntityModel.java +++ b/src/main/java/ru/betterend/entity/model/DragonflyEntityModel.java @@ -4,103 +4,179 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartNames; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; import net.minecraft.client.renderer.RenderType; import ru.betterend.entity.DragonflyEntity; public class DragonflyEntityModel extends BlockBenchModel { - private final ModelPart model; - private final ModelPart head; - private final ModelPart tail; - private final ModelPart tail_2; - private final ModelPart wing_1; - private final ModelPart wing_2; - private final ModelPart wing_3; - private final ModelPart wing_4; - private final ModelPart legs_1; - private final ModelPart legs_2; + private final ModelPart model; + private final ModelPart head; + private final ModelPart tail; + private final ModelPart tail_2; + private final ModelPart wing_1; + private final ModelPart wing_2; + private final ModelPart wing_3; + private final ModelPart wing_4; + private final ModelPart legs_1; + private final ModelPart legs_2; - public DragonflyEntityModel() { - super(RenderType::entityCutout); + public static LayerDefinition getTexturedModelData() { + MeshDefinition modelData = new MeshDefinition(); + PartDefinition modelPartData = modelData.getRoot(); - texWidth = 64; - texHeight = 64; - - model = new ModelPart(this); + PartDefinition bodyPart = modelPartData.addOrReplaceChild(PartNames.BODY, CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-4.0F, -4.0F, 0.0F, 4.0F, 4.0F, 9.0F), + PartPose.offset(2.0F, 21.5F, -4.0F)); + /*model = new ModelPart(this); model.setPos(2.0F, 21.5F, -4.0F); - model.texOffs(0, 0).addBox(-4.0F, -4.0F, 0.0F, 4.0F, 4.0F, 9.0F, 0.0F); + model.texOffs(0, 0).addBox(-4.0F, -4.0F, 0.0F, 4.0F, 4.0F, 9.0F, 0.0F);*/ - head = new ModelPart(this); + bodyPart.addOrReplaceChild(PartNames.HEAD, CubeListBuilder.create() + .texOffs(17, 0) + .addBox(-1.5F, -1.5F, -2.5F, 3.0F, 3.0F, 3.0F), + PartPose.offsetAndRotation(-2.0F, -2.0F, 0.0F, + 0.3491F, 0.0F, 0.0F)); + /*head = new ModelPart(this); head.setPos(-2.0F, -2.0F, 0.0F); model.addChild(head); setRotationAngle(head, 0.3491F, 0.0F, 0.0F); - head.texOffs(17, 0).addBox(-1.5F, -1.5F, -2.5F, 3.0F, 3.0F, 3.0F, 0.0F); + head.texOffs(17, 0).addBox(-1.5F, -1.5F, -2.5F, 3.0F, 3.0F, 3.0F, 0.0F);*/ + PartDefinition tailPart = bodyPart.addOrReplaceChild(PartNames.TAIL, CubeListBuilder.create() + .texOffs(26, 0) + .addBox(-1.5F, -1.5F, 0.0F, 3.0F, 3.0F, 7.0F), + PartPose.offset(-2.0F, -2.0F, 9.0F)); + /* tail = new ModelPart(this); tail.setPos(-2.0F, -2.0F, 9.0F); model.addChild(tail); tail.texOffs(26, 0).addBox(-1.5F, -1.5F, 0.0F, 3.0F, 3.0F, 7.0F, 0.0F); + */ + tailPart.addOrReplaceChild(PartNames.TAIL_FIN, CubeListBuilder.create() + .texOffs(36, 0) + .addBox(-1.0F, -1.0F, 0.0F, 2.0F, 2.0F, 10.0F), + PartPose.offset(0.0F, 0.0F, 7.0F)); + + /* tail_2 = new ModelPart(this); tail_2.setPos(0.0F, 0.0F, 7.0F); tail.addChild(tail_2); tail_2.texOffs(36, 0).addBox(-1.0F, -1.0F, 0.0F, 2.0F, 2.0F, 10.0F, 0.0F); + */ - wing_1 = new ModelPart(this); + bodyPart.addOrReplaceChild(PartNames.LEFT_WING, CubeListBuilder.create() + .texOffs(0, 13) + .addBox(-15.0F, 0.0F, -3.0F, 15.0F, 0.0F, 4.0F), + PartPose.offset(-2.0F, -4.0F, 4.0F)); + + /*wing_1 = new ModelPart(this); wing_1.setPos(-2.0F, -4.0F, 4.0F); model.addChild(wing_1); - wing_1.texOffs(0, 13).addBox(-15.0F, 0.0F, -3.0F, 15.0F, 0.0F, 4.0F, 0.0F); + wing_1.texOffs(0, 13).addBox(-15.0F, 0.0F, -3.0F, 15.0F, 0.0F, 4.0F, 0.0F);*/ - wing_2 = new ModelPart(this); + bodyPart.addOrReplaceChild(PartNames.RIGHT_WING, CubeListBuilder.create() + .mirror() + .texOffs(0, 13) + .addBox(0.0F, 0.0F, -3.0F, 15.0F, 0.0F, 4.0F), + PartPose.offset(-2.0F, -4.0F, 4.0F)); + /*wing_2 = new ModelPart(this); wing_2.setPos(-2.0F, -4.0F, 4.0F); model.addChild(wing_2); wing_2.mirror = true; - wing_2.texOffs(0, 13).addBox(0.0F, 0.0F, -3.0F, 15.0F, 0.0F, 4.0F, 0.0F); + wing_2.texOffs(0, 13).addBox(0.0F, 0.0F, -3.0F, 15.0F, 0.0F, 4.0F, 0.0F);*/ - wing_3 = new ModelPart(this); + bodyPart.addOrReplaceChild(PartNames.LEFT_WING_BASE, CubeListBuilder.create() + .texOffs(4, 17) + .addBox(-12.0F, 0.0F, -2.5F, 12.0F, 0.0F, 3.0F), + PartPose.offset(-2.0F, -4.0F, 8.0F)); + /*wing_3 = new ModelPart(this); wing_3.setPos(-2.0F, -4.0F, 8.0F); model.addChild(wing_3); - wing_3.texOffs(4, 17).addBox(-12.0F, 0.0F, -2.5F, 12.0F, 0.0F, 3.0F, 0.0F); + wing_3.texOffs(4, 17).addBox(-12.0F, 0.0F, -2.5F, 12.0F, 0.0F, 3.0F, 0.0F);*/ - wing_4 = new ModelPart(this); - wing_4.setPos(-2.0F, -4.0F, 8.0F); - model.addChild(wing_4); - wing_4.mirror = true; - wing_4.texOffs(4, 17).addBox(0.0F, 0.0F, -2.5F, 12.0F, 0.0F, 3.0F, 0.0F); + bodyPart.addOrReplaceChild(PartNames.RIGHT_WING_BASE, CubeListBuilder.create() + .mirror() + .texOffs(4, 17) + .addBox(0.0F, 0.0F, -2.5F, 12.0F, 0.0F, 3.0F), + PartPose.offset(-2.0F, -4.0F, 8.0F)); + /*wing_4 = new ModelPart(this); + wing_4.setPos(-2.0F, -4.0F, 8.0F); + model.addChild(wing_4); + wing_4.mirror = true; + wing_4.texOffs(4, 17).addBox(0.0F, 0.0F, -2.5F, 12.0F, 0.0F, 3.0F, 0.0F);*/ - legs_1 = new ModelPart(this); - legs_1.setPos(-1.0F, 0.0F, 1.0F); - model.addChild(legs_1); - setRotationAngle(legs_1, 0.0F, 0.0F, -0.5236F); - legs_1.texOffs(50, 1).addBox(0.0F, 0.0F, 0.0F, 0.0F, 3.0F, 6.0F, 0.0F); + bodyPart.addOrReplaceChild(PartNames.LEFT_LEG, CubeListBuilder.create() + .texOffs(50, 1) + .addBox(0.0F, 0.0F, 0.0F, 0.0F, 3.0F, 6.0F), + PartPose.offsetAndRotation(-1.0F, 0.0F, 1.0F, + 0.0F, 0.0F, -0.5236F)); + /*legs_1 = new ModelPart(this); + legs_1.setPos(-1.0F, 0.0F, 1.0F); + model.addChild(legs_1); + setRotationAngle(legs_1, 0.0F, 0.0F, -0.5236F); + legs_1.texOffs(50, 1).addBox(0.0F, 0.0F, 0.0F, 0.0F, 3.0F, 6.0F, 0.0F);*/ - legs_2 = new ModelPart(this); - legs_2.setPos(-3.0F, 0.0F, 1.0F); - model.addChild(legs_2); - setRotationAngle(legs_2, 0.0F, 0.0F, 0.5236F); - legs_2.texOffs(50, 1).addBox(0.0F, 0.0F, 0.0F, 0.0F, 3.0F, 6.0F, 0.0F); - } + bodyPart.addOrReplaceChild(PartNames.RIGHT_LEG, CubeListBuilder.create() + .texOffs(50, 1) + .addBox(0.0F, 0.0F, 0.0F, 0.0F, 3.0F, 6.0F), + PartPose.offsetAndRotation(-3.0F, 0.0F, 1.0F, + 0.0F, 0.0F, 0.5236F)); + /*legs_2 = new ModelPart(this); + legs_2.setPos(-3.0F, 0.0F, 1.0F); + model.addChild(legs_2); + setRotationAngle(legs_2, 0.0F, 0.0F, 0.5236F); + legs_2.texOffs(50, 1).addBox(0.0F, 0.0F, 0.0F, 0.0F, 3.0F, 6.0F, 0.0F);*/ - @Override - public void setupAnim(DragonflyEntity entity, float limbAngle, float limbDistance, float animationProgress, - float headYaw, float headPitch) { - float progress = animationProgress * 2F; + /* + texWidth = 64; + texHeight = 64; + */ + return LayerDefinition.create(modelData, 64, 64); + } - wing_1.zRot = 0.3491F + (float) Math.sin(progress) * 0.3491F; - wing_2.zRot = -wing_1.zRot; + public DragonflyEntityModel(ModelPart modelPart) { + super(RenderType::entityCutout); - wing_3.zRot = 0.3491F + (float) Math.cos(progress) * 0.3491F; - wing_4.zRot = -wing_3.zRot; + model = modelPart.getChild(PartNames.BODY); + head = modelPart.getChild(PartNames.HEAD); + tail = modelPart.getChild(PartNames.TAIL); + tail_2 = modelPart.getChild(PartNames.TAIL_FIN); + wing_1 = modelPart.getChild(PartNames.LEFT_WING); + wing_2 = modelPart.getChild(PartNames.RIGHT_WING); + wing_3 = modelPart.getChild(PartNames.LEFT_WING_TIP); + wing_4 = modelPart.getChild(PartNames.RIGHT_WING_BASE); + legs_1 = modelPart.getChild(PartNames.LEFT_LEG); + legs_2 = modelPart.getChild(PartNames.RIGHT_LEG); + } - progress = animationProgress * 0.05F; + @Override + public void setupAnim(DragonflyEntity entity, float limbAngle, float limbDistance, float animationProgress, + float headYaw, float headPitch) { + float progress = animationProgress * 2F; - head.xRot = 0.3491F + (float) Math.sin(progress * 0.7F) * 0.1F; - tail.xRot = (float) Math.cos(progress) * 0.05F - 0.05F; - tail_2.xRot = -tail.xRot * 1.5F; - } + wing_1.zRot = 0.3491F + (float) Math.sin(progress) * 0.3491F; + wing_2.zRot = -wing_1.zRot; - @Override - public void renderToBuffer(PoseStack matrices, VertexConsumer vertices, int light, int overlay, float red, - float green, float blue, float alpha) { - model.render(matrices, vertices, light, overlay); - } + wing_3.zRot = 0.3491F + (float) Math.cos(progress) * 0.3491F; + wing_4.zRot = -wing_3.zRot; + + progress = animationProgress * 0.05F; + + head.xRot = 0.3491F + (float) Math.sin(progress * 0.7F) * 0.1F; + tail.xRot = (float) Math.cos(progress) * 0.05F - 0.05F; + tail_2.xRot = -tail.xRot * 1.5F; + } + + @Override + public void renderToBuffer(PoseStack matrices, VertexConsumer vertices, int light, int overlay, float red, + float green, float blue, float alpha) { + model.render(matrices, vertices, light, overlay); + } } diff --git a/src/main/java/ru/betterend/entity/render/RendererEntityDragonfly.java b/src/main/java/ru/betterend/entity/render/RendererEntityDragonfly.java index 37e82160..7d8ac881 100644 --- a/src/main/java/ru/betterend/entity/render/RendererEntityDragonfly.java +++ b/src/main/java/ru/betterend/entity/render/RendererEntityDragonfly.java @@ -2,19 +2,22 @@ package ru.betterend.entity.render; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.entity.EntityRenderDispatcher; +import net.minecraft.client.renderer.entity.EntityRendererProvider; import net.minecraft.client.renderer.entity.MobRenderer; import net.minecraft.client.renderer.entity.layers.EyesLayer; import net.minecraft.resources.ResourceLocation; import ru.betterend.BetterEnd; import ru.betterend.entity.DragonflyEntity; +import ru.betterend.entity.model.CubozoaEntityModel; import ru.betterend.entity.model.DragonflyEntityModel; +import ru.betterend.registry.EndEntitiesRenders; public class RendererEntityDragonfly extends MobRenderer { private static final ResourceLocation TEXTURE = BetterEnd.makeID("textures/entity/dragonfly.png"); private static final RenderType GLOW = RenderType.eyes(BetterEnd.makeID("textures/entity/dragonfly_glow.png")); - public RendererEntityDragonfly(EntityRenderDispatcher entityRenderDispatcher) { - super(entityRenderDispatcher, new DragonflyEntityModel(), 0.5f); + public RendererEntityDragonfly(EntityRendererProvider.Context ctx) { + super(ctx, new DragonflyEntityModel(ctx.bakeLayer(EndEntitiesRenders.DRAGONFLY_MODEL)), 0.5f); this.addLayer(new EyesLayer(this) { @Override public RenderType renderType() { diff --git a/src/main/java/ru/betterend/registry/EndEntitiesRenders.java b/src/main/java/ru/betterend/registry/EndEntitiesRenders.java index 95746fcb..2be580fa 100644 --- a/src/main/java/ru/betterend/registry/EndEntitiesRenders.java +++ b/src/main/java/ru/betterend/registry/EndEntitiesRenders.java @@ -8,6 +8,7 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.EntityType; import ru.betterend.BetterEnd; import ru.betterend.entity.model.CubozoaEntityModel; +import ru.betterend.entity.model.DragonflyEntityModel; import ru.betterend.entity.model.EndSlimeEntityModel; import ru.betterend.entity.render.RendererEntityCubozoa; import ru.betterend.entity.render.RendererEntityDragonfly; @@ -18,6 +19,7 @@ import ru.betterend.entity.render.SilkMothEntityRenderer; public class EndEntitiesRenders { public static final ModelLayerLocation CUBOZOA_MODEL = registerMain("cubozoa"); + public static final ModelLayerLocation DRAGONFLY_MODEL = registerMain("dragonfly"); public static final ModelLayerLocation END_SLIME_SHELL_MODEL = registerMain("endslime_shell"); public static final ModelLayerLocation END_SLIME_MODEL = registerMain("endslime"); @@ -29,9 +31,10 @@ public class EndEntitiesRenders { register(EndEntities.CUBOZOA, RendererEntityCubozoa.class); register(EndEntities.SILK_MOTH, SilkMothEntityRenderer.class); - EntityModelLayerRegistry.registerModelLayer(CUBOZOA_MODEL, CubozoaEntityModel::getTexturedModelData); + EntityModelLayerRegistry.registerModelLayer(DRAGONFLY_MODEL, DragonflyEntityModel::getTexturedModelData); EntityModelLayerRegistry.registerModelLayer(END_SLIME_SHELL_MODEL, EndSlimeEntityModel::getShellOnlyTexturedModelData); EntityModelLayerRegistry.registerModelLayer(END_SLIME_MODEL, EndSlimeEntityModel::getCompleteTexturedModelData); + EntityModelLayerRegistry.registerModelLayer(CUBOZOA_MODEL, CubozoaEntityModel::getTexturedModelData); } private static void register(EntityType type, Class> renderer) { From b0ecc1152c9f924efc4222ce9bc7faeb91560785 Mon Sep 17 00:00:00 2001 From: Frank Bauer Date: Thu, 24 Jun 2021 10:21:50 +0200 Subject: [PATCH 023/595] *EndFish* Model --- .../entity/model/EndFishEntityModel.java | 86 +++++++++++++++---- .../entity/render/RendererEntityEndFish.java | 7 +- .../registry/EndEntitiesRenders.java | 6 +- 3 files changed, 78 insertions(+), 21 deletions(-) diff --git a/src/main/java/ru/betterend/entity/model/EndFishEntityModel.java b/src/main/java/ru/betterend/entity/model/EndFishEntityModel.java index ebfe8f7b..11e402fc 100644 --- a/src/main/java/ru/betterend/entity/model/EndFishEntityModel.java +++ b/src/main/java/ru/betterend/entity/model/EndFishEntityModel.java @@ -4,6 +4,12 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartNames; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; import net.minecraft.client.renderer.RenderType; import ru.betterend.entity.EndFishEntity; @@ -15,47 +21,91 @@ public class EndFishEntityModel extends BlockBenchModel { private final ModelPart fin_right; private final ModelPart fin_left; - public EndFishEntityModel() { - super(RenderType::entityCutout); + public static LayerDefinition getTexturedModelData() { + MeshDefinition modelData = new MeshDefinition(); + PartDefinition modelPartData = modelData.getRoot(); - texWidth = 32; - texHeight = 32; - - model = new ModelPart(this); + PartDefinition bodyPart = modelPartData.addOrReplaceChild(PartNames.BODY, CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-1.0F, -2.0F, -4.0F, 2.0F, 4.0F, 8.0F), + PartPose.offset(0.0F, 20.0F, 0.0F)); + /*model = new ModelPart(this); model.setPos(0.0F, 20.0F, 0.0F); - model.texOffs(0, 0).addBox(-1.0F, -2.0F, -4.0F, 2.0F, 4.0F, 8.0F, 0.0F); + model.texOffs(0, 0).addBox(-1.0F, -2.0F, -4.0F, 2.0F, 4.0F, 8.0F, 0.0F);*/ - fin_top = new ModelPart(this); - fin_top.setPos(0.0F, -2.0F, -4.0F); + modelPartData.addOrReplaceChild(PartNames.TOP_FIN, CubeListBuilder.create() + .texOffs(0, 6) + .addBox(0.0F, -8.0F, 0.0F, 0.0F, 8.0F, 6.0F), + PartPose.offsetAndRotation(0.0F, -2.0F, -4.0F, + -0.6981F, 0.0F, 0.0F)); + /*fin_top.setPos(0.0F, -2.0F, -4.0F); model.addChild(fin_top); setRotationAngle(fin_top, -0.6981F, 0.0F, 0.0F); - fin_top.texOffs(0, 6).addBox(0.0F, -8.0F, 0.0F, 0.0F, 8.0F, 6.0F, 0.0F); + fin_top.texOffs(0, 6).addBox(0.0F, -8.0F, 0.0F, 0.0F, 8.0F, 6.0F, 0.0F);* + */ - fin_bottom = new ModelPart(this); + modelPartData.addOrReplaceChild(PartNames.BOTTOM_FIN, CubeListBuilder.create() + .texOffs(0, 6) + .addBox(0.0F, 0.0F, 0.0F, 0.0F, 8.0F, 6.0F), + PartPose.offsetAndRotation(0.0F, 2.0F, -4.0F, + 0.6981F, 0.0F, 0.0F)); + /*fin_bottom = new ModelPart(this); fin_bottom.setPos(0.0F, 2.0F, -4.0F); model.addChild(fin_bottom); setRotationAngle(fin_bottom, 0.6981F, 0.0F, 0.0F); - fin_bottom.texOffs(0, 6).addBox(0.0F, 0.0F, 0.0F, 0.0F, 8.0F, 6.0F, 0.0F); + fin_bottom.texOffs(0, 6).addBox(0.0F, 0.0F, 0.0F, 0.0F, 8.0F, 6.0F, 0.0F);*/ - flipper = new ModelPart(this); + modelPartData.addOrReplaceChild(PartNames.TAIL_FIN, CubeListBuilder.create() + .texOffs(0, 15) + .addBox(0.0F, -5.0F, 0.0F, 0.0F, 5.0F, 5.0F), + PartPose.offsetAndRotation(0.0F, 0.0F, 2.0F, + -0.7854F, 0.0F, 0.0F)); + /*flipper = new ModelPart(this); flipper.setPos(0.0F, 0.0F, 2.0F); model.addChild(flipper); setRotationAngle(flipper, -0.7854F, 0.0F, 0.0F); - flipper.texOffs(0, 15).addBox(0.0F, -5.0F, 0.0F, 0.0F, 5.0F, 5.0F, 0.0F); + flipper.texOffs(0, 15).addBox(0.0F, -5.0F, 0.0F, 0.0F, 5.0F, 5.0F, 0.0F);*/ - fin_right = new ModelPart(this); + modelPartData.addOrReplaceChild(PartNames.RIGHT_FIN, CubeListBuilder.create() + .texOffs(0, 25) + .addBox(-3.7071F, 0.7071F, -1.5F, 3.0F, 0.0F, 3.0F), + PartPose.offsetAndRotation(-1.0F, 0.0F, -1.0F, + 1.5708F, 0.7854F, 0.0F)); + /*fin_right = new ModelPart(this); fin_right.setPos(-1.0F, 0.0F, -1.0F); model.addChild(fin_right); setRotationAngle(fin_right, 1.5708F, 0.7854F, 0.0F); - fin_right.texOffs(0, 25).addBox(-3.7071F, 0.7071F, -1.5F, 3.0F, 0.0F, 3.0F, 0.0F); + fin_right.texOffs(0, 25).addBox(-3.7071F, 0.7071F, -1.5F, 3.0F, 0.0F, 3.0F, 0.0F);*/ - fin_left = new ModelPart(this); + modelPartData.addOrReplaceChild(PartNames.LEFT_FIN, CubeListBuilder.create() + .mirror() + .texOffs(0, 25) + .addBox(0.7071F, 0.7071F, -1.5F, 3.0F, 0.0F, 3.0F), + PartPose.offsetAndRotation(-1.0F, 0.0F, -1.0F, + 1.5708F, -0.7854F, 0.0F)); + /*fin_left = new ModelPart(this); fin_left.setPos(1.0F, 0.0F, -1.0F); model.addChild(fin_left); setRotationAngle(fin_left, 1.5708F, -0.7854F, 0.0F); - fin_left.texOffs(0, 25).addBox(0.7071F, 0.7071F, -1.5F, 3.0F, 0.0F, 3.0F, 0.0F, true); + fin_left.texOffs(0, 25).addBox(0.7071F, 0.7071F, -1.5F, 3.0F, 0.0F, 3.0F, 0.0F, true);*/ + + /* + texWidth = 32; + texHeight = 32; + */ + return LayerDefinition.create(modelData, 32, 32); } + public EndFishEntityModel(ModelPart modelPart) { + super(RenderType::entityCutout); + + model = modelPart.getChild(PartNames.BODY); + fin_top = modelPart.getChild(PartNames.TOP_FIN); + fin_bottom = modelPart.getChild(PartNames.BOTTOM_FIN); + flipper = modelPart.getChild(PartNames.TAIL_FIN); + fin_right = modelPart.getChild(PartNames.RIGHT_FIN); + fin_left = modelPart.getChild(PartNames.LEFT_FIN);} + @Override public void setupAnim(EndFishEntity entity, float limbAngle, float limbDistance, float animationProgress, float headYaw, float headPitch) { diff --git a/src/main/java/ru/betterend/entity/render/RendererEntityEndFish.java b/src/main/java/ru/betterend/entity/render/RendererEntityEndFish.java index fce70f61..767a3d74 100644 --- a/src/main/java/ru/betterend/entity/render/RendererEntityEndFish.java +++ b/src/main/java/ru/betterend/entity/render/RendererEntityEndFish.java @@ -6,20 +6,23 @@ import com.mojang.blaze3d.vertex.VertexConsumer; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.entity.EntityRenderDispatcher; +import net.minecraft.client.renderer.entity.EntityRendererProvider; import net.minecraft.client.renderer.entity.MobRenderer; import net.minecraft.client.renderer.entity.layers.EyesLayer; import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.resources.ResourceLocation; import ru.betterend.BetterEnd; import ru.betterend.entity.EndFishEntity; +import ru.betterend.entity.model.DragonflyEntityModel; import ru.betterend.entity.model.EndFishEntityModel; +import ru.betterend.registry.EndEntitiesRenders; public class RendererEntityEndFish extends MobRenderer { private static final ResourceLocation[] TEXTURE = new ResourceLocation[EndFishEntity.VARIANTS]; private static final RenderType[] GLOW = new RenderType[EndFishEntity.VARIANTS]; - public RendererEntityEndFish(EntityRenderDispatcher entityRenderDispatcher) { - super(entityRenderDispatcher, new EndFishEntityModel(), 0.5f); + public RendererEntityEndFish(EntityRendererProvider.Context ctx) { + super(ctx, new EndFishEntityModel(ctx.bakeLayer(EndEntitiesRenders.END_FISH_MODEL)), 0.5f); this.addLayer(new EyesLayer(this) { @Override public RenderType renderType() { diff --git a/src/main/java/ru/betterend/registry/EndEntitiesRenders.java b/src/main/java/ru/betterend/registry/EndEntitiesRenders.java index 2be580fa..45470a48 100644 --- a/src/main/java/ru/betterend/registry/EndEntitiesRenders.java +++ b/src/main/java/ru/betterend/registry/EndEntitiesRenders.java @@ -9,6 +9,7 @@ import net.minecraft.world.entity.EntityType; import ru.betterend.BetterEnd; import ru.betterend.entity.model.CubozoaEntityModel; import ru.betterend.entity.model.DragonflyEntityModel; +import ru.betterend.entity.model.EndFishEntityModel; import ru.betterend.entity.model.EndSlimeEntityModel; import ru.betterend.entity.render.RendererEntityCubozoa; import ru.betterend.entity.render.RendererEntityDragonfly; @@ -18,10 +19,12 @@ import ru.betterend.entity.render.RendererEntityShadowWalker; import ru.betterend.entity.render.SilkMothEntityRenderer; public class EndEntitiesRenders { - public static final ModelLayerLocation CUBOZOA_MODEL = registerMain("cubozoa"); + public static final ModelLayerLocation DRAGONFLY_MODEL = registerMain("dragonfly"); public static final ModelLayerLocation END_SLIME_SHELL_MODEL = registerMain("endslime_shell"); public static final ModelLayerLocation END_SLIME_MODEL = registerMain("endslime"); + public static final ModelLayerLocation END_FISH_MODEL = registerMain("endfish"); + public static final ModelLayerLocation CUBOZOA_MODEL = registerMain("cubozoa"); public static void register() { register(EndEntities.DRAGONFLY, RendererEntityDragonfly.class); @@ -34,6 +37,7 @@ public class EndEntitiesRenders { EntityModelLayerRegistry.registerModelLayer(DRAGONFLY_MODEL, DragonflyEntityModel::getTexturedModelData); EntityModelLayerRegistry.registerModelLayer(END_SLIME_SHELL_MODEL, EndSlimeEntityModel::getShellOnlyTexturedModelData); EntityModelLayerRegistry.registerModelLayer(END_SLIME_MODEL, EndSlimeEntityModel::getCompleteTexturedModelData); + EntityModelLayerRegistry.registerModelLayer(END_FISH_MODEL, EndFishEntityModel::getTexturedModelData); EntityModelLayerRegistry.registerModelLayer(CUBOZOA_MODEL, CubozoaEntityModel::getTexturedModelData); } From fb29dd75f75325f954edade64c84c1a1df3f9fb3 Mon Sep 17 00:00:00 2001 From: Frank Bauer Date: Thu, 24 Jun 2021 10:58:05 +0200 Subject: [PATCH 024/595] *SilkMoth* Model --- .../entity/model/SilkMothEntityModel.java | 126 +++++++++++++++++- .../entity/render/SilkMothEntityRenderer.java | 7 +- .../registry/EndEntitiesRenders.java | 7 +- 3 files changed, 129 insertions(+), 11 deletions(-) diff --git a/src/main/java/ru/betterend/entity/model/SilkMothEntityModel.java b/src/main/java/ru/betterend/entity/model/SilkMothEntityModel.java index 5d21fafe..989c3684 100644 --- a/src/main/java/ru/betterend/entity/model/SilkMothEntityModel.java +++ b/src/main/java/ru/betterend/entity/model/SilkMothEntityModel.java @@ -4,6 +4,12 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartNames; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; import net.minecraft.client.renderer.RenderType; import net.minecraft.util.Mth; import ru.betterend.entity.SilkMothEntity; @@ -25,13 +31,123 @@ public class SilkMothEntityModel extends BlockBenchModel { private final ModelPart wingL_r1; private final ModelPart abdomen_r1; - public SilkMothEntityModel() { + public static LayerDefinition getTexturedModelData() { + MeshDefinition modelData = new MeshDefinition(); + PartDefinition modelPartData = modelData.getRoot(); + + PartDefinition legsL = modelPartData.addOrReplaceChild(PartNames.LEFT_LEG, CubeListBuilder.create() + .texOffs(0, 0), + PartPose.offsetAndRotation(1.5f, 19.9f, -0.45f, + 0.0f, 0.0f, 0.6981f)); + + legsL.addOrReplaceChild("cube_r1", CubeListBuilder.create() + .addBox(0.0216f, 0.0f, -0.5976f, 3.0f, 0.0f, 1.0f) + .texOffs(0, 13), + PartPose.offsetAndRotation(0.0f, 0.0f, -1.0f, + 0.0f, 0.2182f, 0.3927f)); + + legsL.addOrReplaceChild("cube_r2", CubeListBuilder.create() + .addBox(0.0f, 0.0f, -0.6f, 3.0f, 0.0f, 1.0f) + .texOffs(0, 15), + PartPose.offsetAndRotation(0.5f, 0.1f, -0.05f, + 0.0f, 0.0f, 0.3927f)); + + legsL.addOrReplaceChild("cube_r3", CubeListBuilder.create() + .addBox(0.0f, 0.0f, -0.5f, 3.0f, 0.0f, 1.0f) + .texOffs(0, 14), + PartPose.offsetAndRotation(0.0f, 0.0f, 0.9f, + 0.0f, -0.2182f, 0.3927f)); + + PartDefinition legsR = modelPartData.addOrReplaceChild(PartNames.RIGHT_LEG, CubeListBuilder.create() + .texOffs(0, 0), + PartPose.offsetAndRotation(-1.5f, 19.9f, -0.55f, + 0.0f, 3.1416f, -0.6545f)); + + legsR.addOrReplaceChild("cube_r4", CubeListBuilder.create() + .addBox(0.0f, 0.0f, -0.5f, 3.0f, 0.0f, 1.0f) + .texOffs(0, 10), + PartPose.offsetAndRotation(0.0f, 0.0f, -1.0f, + 0.0f, 0.2182f, 0.3927f)); + + legsR.addOrReplaceChild("cube_r5", CubeListBuilder.create() + .addBox(0.0f, 0.0f, -0.4f, 3.0f, 0.0f, 1.0f) + .texOffs(0, 11), + PartPose.offsetAndRotation(0.5f, 0.1f, -0.05f, + 0.0f, 0.0f, 0.3927f)); + + legsR.addOrReplaceChild("cube_r6", CubeListBuilder.create() + .addBox(0.0216f, 0.0f, -0.4024f, 3.0f, 0.0f, 1.0f) + .texOffs(0, 12), + PartPose.offsetAndRotation(0.0f, 0.0f, 0.9f, + 0.0f, -0.2182f, 0.3927f)); + + PartDefinition head_pivot = modelPartData.addOrReplaceChild(PartNames.HEAD, CubeListBuilder.create() + .addBox(-1.5f, -1.5f, -2.0f, 3.0f, 3.0f, 3.0f) + .texOffs(15, 10), + PartPose.offset(0.0f, 18.0f, -3.0f)); + + head_pivot.addOrReplaceChild("tendril_r_r1", CubeListBuilder.create() + .mirror() + .addBox(-1.5f, -5.0f, 0.0f, 3.0f, 5.0f, 0.0f) + .texOffs(23, 0), + PartPose.offsetAndRotation(1.0f, -1.15f, -1.0f, + 0.0f, 0.0f, 0.3927f)); + + head_pivot.addOrReplaceChild("tendril_r_r2", CubeListBuilder.create() + .addBox(-1.5f, -5.0f, 0.0f, 3.0f, 5.0f, 0.0f) + .texOffs(23, 0), + PartPose.offsetAndRotation(-1.0f, -1.15f, -1.0f, + 0.0f, 0.0f, -0.3927f)); + + PartDefinition bb_main = modelPartData.addOrReplaceChild(PartNames.BODY, CubeListBuilder.create() + .addBox(-2.5f, -8.5f, -3.0f, 5.0f, 5.0f, 3.0f) + .texOffs(19, 19), + PartPose.offset(0.0f, 24.0f, 0.0f)); + + bb_main.addOrReplaceChild(PartNames.RIGHT_WING, CubeListBuilder.create() + .mirror() + .addBox(-7.0f, 0.0f, -3.0f, 9.0f, 0.0f, 5.0f) + .texOffs(0, 5), + PartPose.offsetAndRotation(-1.5f, -6.5f, 0.5f, + 0.0f, 0.0f, 0.3927f)); + + bb_main.addOrReplaceChild(PartNames.LEFT_WING, CubeListBuilder.create() + .addBox(-2.0f, 0.0f, -3.0f, 9.0f, 0.0f, 5.0f) + .texOffs(0, 5), + PartPose.offsetAndRotation(1.5f, -6.5f, 0.5f, + 0.0f, 0.0f, -0.3927f)); + + bb_main.addOrReplaceChild("abdomen_r1", CubeListBuilder.create() + .addBox(-3.0f, -4.0f, -1.0f, 4.0f, 4.0f, 7.0f) + .texOffs(0, 10), + PartPose.offsetAndRotation(1.0f, -3.9f, 0.0f, + -0.3927f, 0.0f, 0.0f)); + + /*texWidth = 64; + texHeight = 64;*/ + return LayerDefinition.create(modelData, 64, 64); + } + + public SilkMothEntityModel(ModelPart modelPart) { super(RenderType::entityCutout); - texWidth = 64; - texHeight = 64; + legsL = modelPart.getChild(PartNames.LEFT_LEG); + cube_r1 = legsL.getChild("cube_r1"); + cube_r2 = legsL.getChild("cube_r2"); + cube_r3 = legsL.getChild("cube_r3"); + legsR = modelPart.getChild(PartNames.RIGHT_LEG); + cube_r4 = legsR.getChild("cube_r4"); + cube_r5 = legsR.getChild("cube_r5"); + cube_r6 = legsR.getChild("cube_r6"); + head_pivot = modelPart.getChild(PartNames.HEAD); + tendril_r_r1 = head_pivot.getChild("tendril_r_r1"); + tendril_r_r2 = head_pivot.getChild("tendril_r_r2"); + bb_main = modelPart.getChild(PartNames.BODY); + wingR_r1 = bb_main.getChild(PartNames.RIGHT_WING); + wingL_r1 = bb_main.getChild(PartNames.LEFT_WING); + abdomen_r1 = bb_main.getChild("abdomen_r1"); - legsL = new ModelPart(this); + /*legsL = new ModelPart(this); legsL.setPos(1.5F, 19.9F, -0.45F); setRotationAngle(legsL, 0.0F, 0.0F, 0.6981F); @@ -111,7 +227,7 @@ public class SilkMothEntityModel extends BlockBenchModel { abdomen_r1.setPos(1.0F, -3.9F, 0.0F); bb_main.addChild(abdomen_r1); setRotationAngle(abdomen_r1, -0.3927F, 0.0F, 0.0F); - abdomen_r1.texOffs(0, 10).addBox(-3.0F, -4.0F, -1.0F, 4.0F, 4.0F, 7.0F, 0.0F); + abdomen_r1.texOffs(0, 10).addBox(-3.0F, -4.0F, -1.0F, 4.0F, 4.0F, 7.0F, 0.0F);*/ } @Override diff --git a/src/main/java/ru/betterend/entity/render/SilkMothEntityRenderer.java b/src/main/java/ru/betterend/entity/render/SilkMothEntityRenderer.java index 7d3a2745..62f27a00 100644 --- a/src/main/java/ru/betterend/entity/render/SilkMothEntityRenderer.java +++ b/src/main/java/ru/betterend/entity/render/SilkMothEntityRenderer.java @@ -1,17 +1,20 @@ package ru.betterend.entity.render; import net.minecraft.client.renderer.entity.EntityRenderDispatcher; +import net.minecraft.client.renderer.entity.EntityRendererProvider; import net.minecraft.client.renderer.entity.MobRenderer; import net.minecraft.resources.ResourceLocation; import ru.betterend.BetterEnd; import ru.betterend.entity.SilkMothEntity; +import ru.betterend.entity.model.CubozoaEntityModel; import ru.betterend.entity.model.SilkMothEntityModel; +import ru.betterend.registry.EndEntitiesRenders; public class SilkMothEntityRenderer extends MobRenderer { private static final ResourceLocation TEXTURE = BetterEnd.makeID("textures/entity/silk_moth.png"); - public SilkMothEntityRenderer(EntityRenderDispatcher entityRenderDispatcher) { - super(entityRenderDispatcher, new SilkMothEntityModel(), 0.5f); + public SilkMothEntityRenderer(EntityRendererProvider.Context ctx) { + super(ctx, new SilkMothEntityModel(ctx.bakeLayer(EndEntitiesRenders.SILK_MOTH_MODEL)), 0.5f); } @Override diff --git a/src/main/java/ru/betterend/registry/EndEntitiesRenders.java b/src/main/java/ru/betterend/registry/EndEntitiesRenders.java index 45470a48..e873ce0a 100644 --- a/src/main/java/ru/betterend/registry/EndEntitiesRenders.java +++ b/src/main/java/ru/betterend/registry/EndEntitiesRenders.java @@ -7,10 +7,7 @@ import net.minecraft.client.renderer.entity.MobRenderer; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.EntityType; import ru.betterend.BetterEnd; -import ru.betterend.entity.model.CubozoaEntityModel; -import ru.betterend.entity.model.DragonflyEntityModel; -import ru.betterend.entity.model.EndFishEntityModel; -import ru.betterend.entity.model.EndSlimeEntityModel; +import ru.betterend.entity.model.*; import ru.betterend.entity.render.RendererEntityCubozoa; import ru.betterend.entity.render.RendererEntityDragonfly; import ru.betterend.entity.render.RendererEntityEndFish; @@ -25,6 +22,7 @@ public class EndEntitiesRenders { public static final ModelLayerLocation END_SLIME_MODEL = registerMain("endslime"); public static final ModelLayerLocation END_FISH_MODEL = registerMain("endfish"); public static final ModelLayerLocation CUBOZOA_MODEL = registerMain("cubozoa"); + public static final ModelLayerLocation SILK_MOTH_MODEL = registerMain("silkmoth"); public static void register() { register(EndEntities.DRAGONFLY, RendererEntityDragonfly.class); @@ -39,6 +37,7 @@ public class EndEntitiesRenders { EntityModelLayerRegistry.registerModelLayer(END_SLIME_MODEL, EndSlimeEntityModel::getCompleteTexturedModelData); EntityModelLayerRegistry.registerModelLayer(END_FISH_MODEL, EndFishEntityModel::getTexturedModelData); EntityModelLayerRegistry.registerModelLayer(CUBOZOA_MODEL, CubozoaEntityModel::getTexturedModelData); + EntityModelLayerRegistry.registerModelLayer(SILK_MOTH_MODEL, SilkMothEntityModel::getTexturedModelData); } private static void register(EntityType type, Class> renderer) { From df8eb8f04048f3ee5648290a40300c06b104252b Mon Sep 17 00:00:00 2001 From: Frank Bauer Date: Thu, 24 Jun 2021 10:58:39 +0200 Subject: [PATCH 025/595] Helper to convert old RenderModel calls to new syntax --- .gitignore | 2 + Convert.java | 189 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 191 insertions(+) create mode 100644 Convert.java diff --git a/.gitignore b/.gitignore index 514dd716..f1309d16 100644 --- a/.gitignore +++ b/.gitignore @@ -29,3 +29,5 @@ bin/ run/ output/ *.log +Convert.class +ModelPart.class diff --git a/Convert.java b/Convert.java new file mode 100644 index 00000000..23a8aba8 --- /dev/null +++ b/Convert.java @@ -0,0 +1,189 @@ + +class ModelPart { + static java.util.ArrayList parts = new java.util.ArrayList<>(20); + final String name; + ModelPart parent = null; + boolean mirror = false; + + float x=0, y=0, z=0, rx=0, ry=0, rz=0; + int u=0, v=0; + float bx=0,by=0,bz=0,ba=0,bb=0,bc=0; + + + boolean hadBox = false; + ModelPart(Convert c, String name){ + this.name = name; + parts.add(this); + } + + ModelPart setPos(float x, float y, float z){ + this.x=x; + this.y=y; + this.z=z; + return this; + } + + ModelPart setRotationAngle(float x, float y, float z){ + this.rx=x; + this.ry=y; + this.rz=z; + return this; + } + + ModelPart addChild(ModelPart p){ + p.parent = this; + return this; + } + + ModelPart texOffs(int u, int v){ + this.u=u; + this.v=v; + return this; + } + + ModelPart addBox(float x, float y, float z, float a, float b, float c, float _d){ + bx=x; + by=y; + bz=z; + ba=a; + bb=b; + bc=c; + hadBox = true; + return this; + } + ModelPart addBox(float x, float y, float z, float a, float b, float c, float _d, boolean mirror){ + this.mirror = mirror; + bx=x; + by=y; + bz=z; + ba=a; + bb=b; + bc=c; + hadBox = true; + return this; + } + + public String toString(){ + String pName = parent==null?"modelPartData":parent.name; + String s = "PartDefinition " + name + " = "; + s += pName+".addOrReplaceChild(\""+name+"\", CubeListBuilder.create()\n"; + if (this.mirror) s+= ".mirror()\n"; + if (this.hadBox) s+= ".addBox("+bx+"f, "+by+"f, "+bz+"f, "+ba+"f, "+bb+"f, "+bc+"f)\n"; + s+= ".texOffs("+u+", "+v+"),\n"; + if (x==0 && y==0 && z==0 && rx==0 && ry==0 && rz==0){ + s+= "PartPose.ZERO"; + } else if (rx==0 && ry==0 && rz==0){ + s+= "PartPose.offset("+x+"f, "+y+"f, "+z+"f)"; + } else { + s+= "PartPose.offsetAndRotation("+x+"f, "+y+"f, "+z+"f, \n"+rx+"f, "+ry+"f, "+rz+"f)"; + } + s +=");"; + + return s; + } + + public static void print(){ + for(ModelPart p : parts){ + System.out.println(p); + System.out.println(); + } + + for(ModelPart p : parts){ + String pName = p.parent==null?"modelPart":p.parent.name; + System.out.println(p.name +" = "+pName+".getChild(\""+p.name+"\");"); + } + } +} +public class Convert { + public static void main(String[] args){ + new Convert().c(); + + ModelPart.print(); + } + void setRotationAngle(ModelPart p, float x, float y, float z){ + p.setRotationAngle(x, y, z); + } + public void c (){ + ModelPart legsL = new ModelPart(this, "legsL"); + legsL.setPos(1.5F, 19.9F, -0.45F); + setRotationAngle(legsL, 0.0F, 0.0F, 0.6981F); + + ModelPart cube_r1 = new ModelPart(this, "cube_r1"); + cube_r1.setPos(0.0F, 0.0F, -1.0F); + legsL.addChild(cube_r1); + setRotationAngle(cube_r1, 0.0F, 0.2182F, 0.3927F); + cube_r1.texOffs(0, 13).addBox(0.0216F, 0.0F, -0.5976F, 3.0F, 0.0F, 1.0F, 0.0F); + + ModelPart cube_r2 = new ModelPart(this, "cube_r2"); + cube_r2.setPos(0.5F, 0.1F, -0.05F); + legsL.addChild(cube_r2); + setRotationAngle(cube_r2, 0.0F, 0.0F, 0.3927F); + cube_r2.texOffs(0, 15).addBox(0.0F, 0.0F, -0.6F, 3.0F, 0.0F, 1.0F, 0.0F); + + ModelPart cube_r3 = new ModelPart(this, "cube_r3"); + cube_r3.setPos(0.0F, 0.0F, 0.9F); + legsL.addChild(cube_r3); + setRotationAngle(cube_r3, 0.0F, -0.2182F, 0.3927F); + cube_r3.texOffs(0, 14).addBox(0.0F, 0.0F, -0.5F, 3.0F, 0.0F, 1.0F, 0.0F); + + ModelPart legsR = new ModelPart(this,"legsR"); + legsR.setPos(-1.5F, 19.9F, -0.55F); + setRotationAngle(legsR, 0.0F, 3.1416F, -0.6545F); + + ModelPart cube_r4 = new ModelPart(this, "cube_r4"); + cube_r4.setPos(0.0F, 0.0F, -1.0F); + legsR.addChild(cube_r4); + setRotationAngle(cube_r4, 0.0F, 0.2182F, 0.3927F); + cube_r4.texOffs(0, 10).addBox(0.0F, 0.0F, -0.5F, 3.0F, 0.0F, 1.0F, 0.0F); + + ModelPart cube_r5 = new ModelPart(this, "cube_r5"); + cube_r5.setPos(0.5F, 0.1F, -0.05F); + legsR.addChild(cube_r5); + setRotationAngle(cube_r5, 0.0F, 0.0F, 0.3927F); + cube_r5.texOffs(0, 11).addBox(0.0F, 0.0F, -0.4F, 3.0F, 0.0F, 1.0F, 0.0F); + + ModelPart cube_r6 = new ModelPart(this, "cube_r6"); + cube_r6.setPos(0.0F, 0.0F, 0.9F); + legsR.addChild(cube_r6); + setRotationAngle(cube_r6, 0.0F, -0.2182F, 0.3927F); + cube_r6.texOffs(0, 12).addBox(0.0216F, 0.0F, -0.4024F, 3.0F, 0.0F, 1.0F, 0.0F); + + ModelPart head_pivot = new ModelPart(this, "head_pivot"); + head_pivot.setPos(0.0F, 18.0F, -3.0F); + head_pivot.texOffs(15, 10).addBox(-1.5F, -1.5F, -2.0F, 3.0F, 3.0F, 3.0F, 0.0F); + + ModelPart tendril_r_r1 = new ModelPart(this, "tendril_r_r1"); + tendril_r_r1.setPos(1.0F, -1.15F, -1.0F); + head_pivot.addChild(tendril_r_r1); + setRotationAngle(tendril_r_r1, 0.0F, 0.0F, 0.3927F); + tendril_r_r1.texOffs(23, 0).addBox(-1.5F, -5.0F, 0.0F, 3.0F, 5.0F, 0.0F, 0.0F, true); + + ModelPart tendril_r_r2 = new ModelPart(this, "tendril_r_r2"); + tendril_r_r2.setPos(-1.0F, -1.15F, -1.0F); + head_pivot.addChild(tendril_r_r2); + setRotationAngle(tendril_r_r2, 0.0F, 0.0F, -0.3927F); + tendril_r_r2.texOffs(23, 0).addBox(-1.5F, -5.0F, 0.0F, 3.0F, 5.0F, 0.0F, 0.0F); + + ModelPart bb_main = new ModelPart(this, "bb_main"); + bb_main.setPos(0.0F, 24.0F, 0.0F); + bb_main.texOffs(19, 19).addBox(-2.5F, -8.5F, -3.0F, 5.0F, 5.0F, 3.0F, 0.0F); + + ModelPart wingR_r1 = new ModelPart(this, "wingR_r1"); + wingR_r1.setPos(-1.5F, -6.5F, 0.5F); + bb_main.addChild(wingR_r1); + setRotationAngle(wingR_r1, 0.0F, 0.0F, 0.3927F); + wingR_r1.texOffs(0, 5).addBox(-7.0F, 0.0F, -3.0F, 9.0F, 0.0F, 5.0F, 0.0F, true); + + ModelPart wingL_r1 = new ModelPart(this, "wingL_r1"); + wingL_r1.setPos(1.5F, -6.5F, 0.5F); + bb_main.addChild(wingL_r1); + setRotationAngle(wingL_r1, 0.0F, 0.0F, -0.3927F); + wingL_r1.texOffs(0, 5).addBox(-2.0F, 0.0F, -3.0F, 9.0F, 0.0F, 5.0F, 0.0F); + + ModelPart abdomen_r1 = new ModelPart(this, "abdomen_r1"); + abdomen_r1.setPos(1.0F, -3.9F, 0.0F); + bb_main.addChild(abdomen_r1); + setRotationAngle(abdomen_r1, -0.3927F, 0.0F, 0.0F); + abdomen_r1.texOffs(0, 10).addBox(-3.0F, -4.0F, -1.0F, 4.0F, 4.0F, 7.0F, 0.0F); + } +} From e03c8433db0b1a593e0f3a67463dd00571ecbc06 Mon Sep 17 00:00:00 2001 From: Frank Bauer Date: Thu, 24 Jun 2021 11:03:04 +0200 Subject: [PATCH 026/595] *ShadowWalker* renderer --- .../entity/render/RendererEntityShadowWalker.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/ru/betterend/entity/render/RendererEntityShadowWalker.java b/src/main/java/ru/betterend/entity/render/RendererEntityShadowWalker.java index d75db944..5aa547d6 100644 --- a/src/main/java/ru/betterend/entity/render/RendererEntityShadowWalker.java +++ b/src/main/java/ru/betterend/entity/render/RendererEntityShadowWalker.java @@ -1,7 +1,9 @@ package ru.betterend.entity.render; import net.minecraft.client.model.PlayerModel; +import net.minecraft.client.model.geom.ModelLayers; import net.minecraft.client.renderer.entity.EntityRenderDispatcher; +import net.minecraft.client.renderer.entity.EntityRendererProvider; import net.minecraft.client.renderer.entity.HumanoidMobRenderer; import net.minecraft.resources.ResourceLocation; import ru.betterend.BetterEnd; @@ -11,8 +13,9 @@ public class RendererEntityShadowWalker extends HumanoidMobRenderer> { private static final ResourceLocation TEXTURE = BetterEnd.makeID("textures/entity/shadow_walker.png"); - public RendererEntityShadowWalker(EntityRenderDispatcher entityRenderDispatcher) { - super(entityRenderDispatcher, new PlayerModel(0.0F, false), 0.5F); + public RendererEntityShadowWalker(EntityRendererProvider.Context ctx) { + super(ctx, new PlayerModel(ctx.bakeLayer(ModelLayers.PLAYER), false), 0.5F); + //super(entityRenderDispatcher, new PlayerModel(0.0F, false), 0.5F); } @Override From 8531be7b944a8be6f54928c313d191c5dda562c6 Mon Sep 17 00:00:00 2001 From: Frank Bauer Date: Thu, 24 Jun 2021 11:48:31 +0200 Subject: [PATCH 027/595] *ArmoredElytra* Fixes --- .../client/render/ArmoredElytraLayer.java | 9 ++++-- .../item/model/ArmoredElytraModel.java | 31 +++++++++++++++---- .../mixin/client/ArmorStandRendererMixin.java | 19 ++++++------ .../client/HumanoidMobRendererMixin.java | 11 ++++--- .../mixin/client/PlayerRendererMixin.java | 11 ++++--- .../registry/EndEntitiesRenders.java | 6 ++++ 6 files changed, 58 insertions(+), 29 deletions(-) diff --git a/src/main/java/ru/betterend/client/render/ArmoredElytraLayer.java b/src/main/java/ru/betterend/client/render/ArmoredElytraLayer.java index 6f729286..f066b38e 100644 --- a/src/main/java/ru/betterend/client/render/ArmoredElytraLayer.java +++ b/src/main/java/ru/betterend/client/render/ArmoredElytraLayer.java @@ -4,6 +4,7 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import net.minecraft.client.model.EntityModel; +import net.minecraft.client.model.geom.EntityModelSet; import net.minecraft.client.player.AbstractClientPlayer; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; @@ -18,12 +19,14 @@ import net.minecraft.world.entity.player.PlayerModelPart; import net.minecraft.world.item.ItemStack; import ru.betterend.interfaces.FallFlyingItem; import ru.betterend.item.model.ArmoredElytraModel; +import ru.betterend.registry.EndEntitiesRenders; public class ArmoredElytraLayer> extends ElytraLayer { - private final ArmoredElytraModel elytraModel = new ArmoredElytraModel<>(); + private final ArmoredElytraModel elytraModel; - public ArmoredElytraLayer(RenderLayerParent renderLayerParent) { - super(renderLayerParent); + public ArmoredElytraLayer(RenderLayerParent renderLayerParent, EntityModelSet entityModelSet) { + super(renderLayerParent, entityModelSet); + elytraModel = new ArmoredElytraModel<>(entityModelSet.bakeLayer(EndEntitiesRenders.ARMORED_ELYTRA)); } public void render(PoseStack poseStack, MultiBufferSource multiBufferSource, int i, T livingEntity, float f, float g, float h, float j, float k, float l) { diff --git a/src/main/java/ru/betterend/item/model/ArmoredElytraModel.java b/src/main/java/ru/betterend/item/model/ArmoredElytraModel.java index d5b5c1a0..e19c8077 100644 --- a/src/main/java/ru/betterend/item/model/ArmoredElytraModel.java +++ b/src/main/java/ru/betterend/item/model/ArmoredElytraModel.java @@ -4,6 +4,12 @@ import com.google.common.collect.ImmutableList; import net.minecraft.client.model.AgeableListModel; import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartNames; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; import net.minecraft.client.player.AbstractClientPlayer; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.phys.Vec3; @@ -12,12 +18,25 @@ public class ArmoredElytraModel extends AgeableListModel private final ModelPart rightWing; private final ModelPart leftWing; - public ArmoredElytraModel() { - this.leftWing = new ModelPart(this, 22, 0); - this.leftWing.addBox(-10.0F, 0.0F, 0.0F, 10.0F, 20.0F, 2.0F, 1.0F); - this.rightWing = new ModelPart(this, 22, 0); - this.rightWing.mirror = true; - this.rightWing.addBox(0.0F, 0.0F, 0.0F, 10.0F, 20.0F, 2.0F, 1.0F); + public static LayerDefinition getTexturedModelData() { + MeshDefinition modelData = new MeshDefinition(); + PartDefinition modelPartData = modelData.getRoot(); + modelPartData.addOrReplaceChild(PartNames.LEFT_WING, CubeListBuilder.create() + .addBox(-10.0f, 0.0f, 0.0f, 10.0f, 20.0f, 2.0f) + .texOffs(22, 0), + PartPose.ZERO); + + modelPartData.addOrReplaceChild(PartNames.RIGHT_WING, CubeListBuilder.create() + .mirror() + .addBox(0.0f, 0.0f, 0.0f, 10.0f, 20.0f, 2.0f) + .texOffs(22, 0), + PartPose.ZERO); + + return LayerDefinition.create(modelData, 48, 48); + } + public ArmoredElytraModel(ModelPart modelPart) { + leftWing = modelPart.getChild(PartNames.LEFT_WING); + rightWing = modelPart.getChild(PartNames.RIGHT_WING); } protected Iterable headParts() { diff --git a/src/main/java/ru/betterend/mixin/client/ArmorStandRendererMixin.java b/src/main/java/ru/betterend/mixin/client/ArmorStandRendererMixin.java index d3e11b1a..61174938 100644 --- a/src/main/java/ru/betterend/mixin/client/ArmorStandRendererMixin.java +++ b/src/main/java/ru/betterend/mixin/client/ArmorStandRendererMixin.java @@ -1,26 +1,25 @@ package ru.betterend.mixin.client; +import net.minecraft.client.model.ArmorStandArmorModel; +import net.minecraft.client.renderer.entity.ArmorStandRenderer; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.entity.LivingEntityRenderer; +import net.minecraft.world.entity.decoration.ArmorStand; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import net.minecraft.client.model.ArmorStandArmorModel; -import net.minecraft.client.renderer.entity.ArmorStandRenderer; -import net.minecraft.client.renderer.entity.EntityRenderDispatcher; -import net.minecraft.client.renderer.entity.LivingEntityRenderer; -import net.minecraft.world.entity.decoration.ArmorStand; import ru.betterend.client.render.ArmoredElytraLayer; @Mixin(ArmorStandRenderer.class) public abstract class ArmorStandRendererMixin extends LivingEntityRenderer { - public ArmorStandRendererMixin(EntityRenderDispatcher entityRenderDispatcher, ArmorStandArmorModel entityModel, float f) { - super(entityRenderDispatcher, entityModel, f); + public ArmorStandRendererMixin(EntityRendererProvider.Context context, ArmorStandArmorModel entityModel, float f) { + super(context, entityModel, f); } @Inject(method = "*", at = @At("TAIL")) - public void be_addCustomLayer(EntityRenderDispatcher entityRenderDispatcher, CallbackInfo info) { - addLayer(new ArmoredElytraLayer<>(this)); + public void be_addCustomLayer(EntityRendererProvider.Context context, CallbackInfo ci) { + addLayer(new ArmoredElytraLayer<>(this, context.getModelSet())); } } diff --git a/src/main/java/ru/betterend/mixin/client/HumanoidMobRendererMixin.java b/src/main/java/ru/betterend/mixin/client/HumanoidMobRendererMixin.java index cc034cd5..47079dd2 100644 --- a/src/main/java/ru/betterend/mixin/client/HumanoidMobRendererMixin.java +++ b/src/main/java/ru/betterend/mixin/client/HumanoidMobRendererMixin.java @@ -1,5 +1,6 @@ package ru.betterend.mixin.client; +import net.minecraft.client.renderer.entity.EntityRendererProvider; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -15,12 +16,12 @@ import ru.betterend.client.render.ArmoredElytraLayer; @Mixin(HumanoidMobRenderer.class) public abstract class HumanoidMobRendererMixin> extends MobRenderer { - public HumanoidMobRendererMixin(EntityRenderDispatcher entityRenderDispatcher, M entityModel, float f) { - super(entityRenderDispatcher, entityModel, f); + public HumanoidMobRendererMixin(EntityRendererProvider.Context context, M entityModel, float f) { + super(context, entityModel, f); } - @Inject(method = "*", at = @At("TAIL")) - public void be_addCustomLayer(EntityRenderDispatcher entityRenderDispatcher, M humanoidModel, float f, float g, float h, float i, CallbackInfo info) { - addLayer(new ArmoredElytraLayer<>(this)); + @Inject(method = "(Lnet/minecraft/client/renderer/entity/EntityRendererProvider$Context;Lnet/minecraft/client/model/HumanoidModel;FFFF)V", at = @At("TAIL")) + public void be_addCustomLayer(EntityRendererProvider.Context context, M humanoidModel, float f, float g, float h, float i, CallbackInfo ci) { + addLayer(new ArmoredElytraLayer<>(this, context.getModelSet())); } } diff --git a/src/main/java/ru/betterend/mixin/client/PlayerRendererMixin.java b/src/main/java/ru/betterend/mixin/client/PlayerRendererMixin.java index d435dd52..93c2fdb0 100644 --- a/src/main/java/ru/betterend/mixin/client/PlayerRendererMixin.java +++ b/src/main/java/ru/betterend/mixin/client/PlayerRendererMixin.java @@ -1,5 +1,6 @@ package ru.betterend.mixin.client; +import net.minecraft.client.renderer.entity.EntityRendererProvider; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -15,12 +16,12 @@ import ru.betterend.client.render.ArmoredElytraLayer; @Mixin(PlayerRenderer.class) public abstract class PlayerRendererMixin extends LivingEntityRenderer> { - public PlayerRendererMixin(EntityRenderDispatcher entityRenderDispatcher, PlayerModel entityModel, float f) { - super(entityRenderDispatcher, entityModel, f); + public PlayerRendererMixin(EntityRendererProvider.Context context, PlayerModel entityModel, float f) { + super(context, entityModel, f); } - @Inject(method = "(Lnet/minecraft/client/renderer/entity/EntityRenderDispatcher;Z)V", at = @At("TAIL")) - public void be_addCustomLayer(EntityRenderDispatcher entityRenderDispatcher, boolean bl, CallbackInfo info) { - addLayer(new ArmoredElytraLayer<>(this)); + @Inject(method = "*", at = @At("TAIL")) + public void be_addCustomLayer(EntityRendererProvider.Context context, boolean bl, CallbackInfo ci) { + addLayer(new ArmoredElytraLayer<>(this, context.getModelSet())); } } diff --git a/src/main/java/ru/betterend/registry/EndEntitiesRenders.java b/src/main/java/ru/betterend/registry/EndEntitiesRenders.java index e873ce0a..96b35fe2 100644 --- a/src/main/java/ru/betterend/registry/EndEntitiesRenders.java +++ b/src/main/java/ru/betterend/registry/EndEntitiesRenders.java @@ -14,6 +14,7 @@ import ru.betterend.entity.render.RendererEntityEndFish; import ru.betterend.entity.render.RendererEntityEndSlime; import ru.betterend.entity.render.RendererEntityShadowWalker; import ru.betterend.entity.render.SilkMothEntityRenderer; +import ru.betterend.item.model.ArmoredElytraModel; public class EndEntitiesRenders { @@ -24,6 +25,9 @@ public class EndEntitiesRenders { public static final ModelLayerLocation CUBOZOA_MODEL = registerMain("cubozoa"); public static final ModelLayerLocation SILK_MOTH_MODEL = registerMain("silkmoth"); + //Not sure if this should go to another registry + public static final ModelLayerLocation ARMORED_ELYTRA = registerMain("armored_elytra"); + public static void register() { register(EndEntities.DRAGONFLY, RendererEntityDragonfly.class); register(EndEntities.END_SLIME, RendererEntityEndSlime.class); @@ -38,6 +42,8 @@ public class EndEntitiesRenders { EntityModelLayerRegistry.registerModelLayer(END_FISH_MODEL, EndFishEntityModel::getTexturedModelData); EntityModelLayerRegistry.registerModelLayer(CUBOZOA_MODEL, CubozoaEntityModel::getTexturedModelData); EntityModelLayerRegistry.registerModelLayer(SILK_MOTH_MODEL, SilkMothEntityModel::getTexturedModelData); + + EntityModelLayerRegistry.registerModelLayer(ARMORED_ELYTRA, ArmoredElytraModel::getTexturedModelData); } private static void register(EntityType type, Class> renderer) { From 036d594012eb15bdd61e65d78ff4b0db3dfa130f Mon Sep 17 00:00:00 2001 From: Frank Bauer Date: Thu, 24 Jun 2021 12:13:09 +0200 Subject: [PATCH 028/595] updated `isFeatureChunk` and `generatePieces` Signatures --- .../mixin/common/EndCityFeatureMixin.java | 9 ++++---- .../features/EternalPortalStructure.java | 23 +++++++++++-------- .../features/FeatureBaseStructure.java | 21 +++++++++-------- .../features/GiantIceStarStructure.java | 15 +++++++----- .../features/MegaLakeSmallStructure.java | 17 ++++++++------ .../features/MegaLakeStructure.java | 17 ++++++++------ .../features/MountainStructure.java | 17 ++++++++------ .../features/PaintedMountainStructure.java | 17 ++++++++------ .../features/SDFStructureFeature.java | 17 ++++++++------ 9 files changed, 88 insertions(+), 65 deletions(-) diff --git a/src/main/java/ru/betterend/mixin/common/EndCityFeatureMixin.java b/src/main/java/ru/betterend/mixin/common/EndCityFeatureMixin.java index e91f8949..5a054c59 100644 --- a/src/main/java/ru/betterend/mixin/common/EndCityFeatureMixin.java +++ b/src/main/java/ru/betterend/mixin/common/EndCityFeatureMixin.java @@ -1,5 +1,6 @@ package ru.betterend.mixin.common; +import net.minecraft.world.level.LevelHeightAccessor; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -18,15 +19,15 @@ import ru.betterend.world.generator.GeneratorOptions; @Mixin(EndCityFeature.class) public class EndCityFeatureMixin { @Inject(method = "isFeatureChunk", at = @At("HEAD"), cancellable = true) - private void be_isFeatureChunk(ChunkGenerator chunkGenerator, BiomeSource biomeSource, long l, WorldgenRandom chunkRandom, int i, int j, Biome biome, ChunkPos chunkPos, NoneFeatureConfiguration defaultFeatureConfig, CallbackInfoReturnable info) { + private void be_isFeatureChunk(ChunkGenerator chunkGenerator, BiomeSource biomeSource, long l, WorldgenRandom chunkRandom, ChunkPos pos, Biome biome, ChunkPos chunkPos, NoneFeatureConfiguration defaultFeatureConfig, LevelHeightAccessor levelHeightAccessor, CallbackInfoReturnable info) { if (GeneratorOptions.useNewGenerator()) { int chance = GeneratorOptions.getEndCityFailChance(); if (chance == 0) { - info.setReturnValue(getYPositionForFeature(i, j, chunkGenerator) >= 60); + info.setReturnValue(getYPositionForFeature(pos, chunkGenerator, levelHeightAccessor) >= 60); info.cancel(); } else if (chunkRandom.nextInt(chance) == 0){ - info.setReturnValue(getYPositionForFeature(i, j, chunkGenerator) >= 60); + info.setReturnValue(getYPositionForFeature(pos, chunkGenerator, levelHeightAccessor) >= 60); info.cancel(); } else { @@ -37,7 +38,7 @@ public class EndCityFeatureMixin { } @Shadow - private static int getYPositionForFeature(int chunkX, int chunkZ, ChunkGenerator chunkGenerator) { + private static int getYPositionForFeature(ChunkPos pos, ChunkGenerator chunkGenerator, LevelHeightAccessor levelHeightAccessor) { return 0; } } diff --git a/src/main/java/ru/betterend/world/structures/features/EternalPortalStructure.java b/src/main/java/ru/betterend/world/structures/features/EternalPortalStructure.java index f67a71d4..d137ea66 100644 --- a/src/main/java/ru/betterend/world/structures/features/EternalPortalStructure.java +++ b/src/main/java/ru/betterend/world/structures/features/EternalPortalStructure.java @@ -4,6 +4,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.RegistryAccess; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.LevelHeightAccessor; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.biome.BiomeSource; import net.minecraft.world.level.chunk.ChunkGenerator; @@ -26,16 +27,16 @@ public class EternalPortalStructure extends FeatureBaseStructure { private static final StructureTemplate STRUCTURE = StructureHelper.readStructure(STRUCTURE_ID); @Override - protected boolean isFeatureChunk(ChunkGenerator chunkGenerator, BiomeSource biomeSource, long worldSeed, WorldgenRandom chunkRandom, int chunkX, int chunkZ, Biome biome, ChunkPos chunkPos, NoneFeatureConfiguration featureConfig) { + protected boolean isFeatureChunk(ChunkGenerator chunkGenerator, BiomeSource biomeSource, long worldSeed, WorldgenRandom chunkRandom, ChunkPos pos, Biome biome, ChunkPos chunkPos, NoneFeatureConfiguration featureConfig, LevelHeightAccessor levelHeightAccessor) { long x = (long) chunkPos.x * (long) chunkPos.x; long z = (long) chunkPos.z * (long) chunkPos.z; if (x + z < 1024L) { return false; } - if (chunkGenerator.getBaseHeight((chunkX << 4) | 8, (chunkZ << 4) | 8, Heightmap.Types.WORLD_SURFACE_WG) < 10) { + if (chunkGenerator.getBaseHeight(pos.getBlockX(8), pos.getBlockX(8), Heightmap.Types.WORLD_SURFACE_WG, levelHeightAccessor) < 10) { return false; } - return super.isFeatureChunk(chunkGenerator, biomeSource, worldSeed, chunkRandom, chunkX, chunkZ, biome, chunkPos, featureConfig); + return super.isFeatureChunk(chunkGenerator, biomeSource, worldSeed, chunkRandom, pos, biome, chunkPos, featureConfig, levelHeightAccessor); } @Override @@ -44,19 +45,21 @@ public class EternalPortalStructure extends FeatureBaseStructure { } public static class PortalStructureStart extends StructureStart { - public PortalStructureStart(StructureFeature feature, int chunkX, int chunkZ, BoundingBox box, int references, long seed) { - super(feature, chunkX, chunkZ, box, references, seed); + public PortalStructureStart(StructureFeature feature, ChunkPos pos, int references, long seed) { + super(feature, pos, references, seed); } + @Override - public void generatePieces(RegistryAccess registryManager, ChunkGenerator chunkGenerator, StructureManager manager, int chunkX, int chunkZ, Biome biome, NoneFeatureConfiguration config) { - int x = (chunkX << 4) | MHelper.randRange(4, 12, random); - int z = (chunkZ << 4) | MHelper.randRange(4, 12, random); - int y = chunkGenerator.getBaseHeight(x, z, Types.WORLD_SURFACE_WG); + public void generatePieces(RegistryAccess registryManager, ChunkGenerator chunkGenerator, StructureManager structureManager, ChunkPos chunkPos, Biome biome, NoneFeatureConfiguration featureConfiguration, LevelHeightAccessor levelHeightAccessor) { + int x = chunkPos.getBlockX( MHelper.randRange(4, 12, random)); + int z =chunkPos.getBlockZ( MHelper.randRange(4, 12, random)); + int y = chunkGenerator.getBaseHeight(x, z, Types.WORLD_SURFACE_WG, levelHeightAccessor); if (y > 4) { this.pieces.add(new NBTPiece(STRUCTURE_ID, STRUCTURE, new BlockPos(x, y - 4, z), random.nextInt(5), true, random)); } - this.calculateBoundingBox(); + //bbox is calculated lazy on get + //this.calculateBoundingBox(); } } } diff --git a/src/main/java/ru/betterend/world/structures/features/FeatureBaseStructure.java b/src/main/java/ru/betterend/world/structures/features/FeatureBaseStructure.java index 219ec6f5..64690626 100644 --- a/src/main/java/ru/betterend/world/structures/features/FeatureBaseStructure.java +++ b/src/main/java/ru/betterend/world/structures/features/FeatureBaseStructure.java @@ -3,6 +3,7 @@ package ru.betterend.world.structures.features; import java.util.Random; import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.LevelHeightAccessor; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.biome.BiomeSource; import net.minecraft.world.level.block.Blocks; @@ -22,12 +23,12 @@ public abstract class FeatureBaseStructure extends StructureFeature= 20; + protected boolean isFeatureChunk(ChunkGenerator chunkGenerator, BiomeSource biomeSource, long worldSeed, WorldgenRandom chunkRandom, ChunkPos pos, Biome biome, ChunkPos chunkPos, NoneFeatureConfiguration featureConfig, LevelHeightAccessor levelHeightAccessor) { + return getGenerationHeight(pos, chunkGenerator, levelHeightAccessor) >= 20; } - private static int getGenerationHeight(int chunkX, int chunkZ, ChunkGenerator chunkGenerator) { - Random random = new Random((long) (chunkX + chunkZ * 10387313)); + private static int getGenerationHeight(ChunkPos chunkPos, ChunkGenerator chunkGenerator, LevelHeightAccessor levelHeightAccessor) { + Random random = new Random((long) (chunkPos.x + chunkPos.z * 10387313)); Rotation blockRotation = Rotation.getRandom(random); int i = 5; int j = 5; @@ -40,12 +41,12 @@ public abstract class FeatureBaseStructure extends StructureFeature { - public StarStructureStart(StructureFeature feature, int chunkX, int chunkZ, BoundingBox box, int references, long seed) { - super(feature, chunkX, chunkZ, box, references, seed); + public StarStructureStart(StructureFeature feature, ChunkPos pos, int references, long seed) { + super(feature, pos, references, seed); } @Override - public void generatePieces(RegistryAccess registryManager, ChunkGenerator chunkGenerator, StructureManager manager, int chunkX, int chunkZ, Biome biome, NoneFeatureConfiguration config) { - int x = (chunkX << 4) | MHelper.randRange(4, 12, random); - int z = (chunkZ << 4) | MHelper.randRange(4, 12, random); + public void generatePieces(RegistryAccess registryManager, ChunkGenerator chunkGenerator, StructureManager structureManager, ChunkPos chunkPos, Biome biome, NoneFeatureConfiguration featureConfiguration, LevelHeightAccessor levelHeightAccessor) { + int x = chunkPos.getBlockX(MHelper.randRange(4, 12, random)); + int z = chunkPos.getBlockZ( MHelper.randRange(4, 12, random)); BlockPos start = new BlockPos(x, MHelper.randRange(32, 128, random), z); VoxelPiece piece = new VoxelPiece((world) -> { ((SDFStructureFeature) this.getFeature()).getSDF(start, this.random).fillRecursive(world, start); }, random.nextInt()); this.pieces.add(piece); - this.calculateBoundingBox(); + + //this.calculateBoundingBox(); } } } diff --git a/src/main/java/ru/betterend/world/structures/features/MegaLakeSmallStructure.java b/src/main/java/ru/betterend/world/structures/features/MegaLakeSmallStructure.java index d4397767..c9e96d74 100644 --- a/src/main/java/ru/betterend/world/structures/features/MegaLakeSmallStructure.java +++ b/src/main/java/ru/betterend/world/structures/features/MegaLakeSmallStructure.java @@ -2,6 +2,8 @@ package ru.betterend.world.structures.features; import net.minecraft.core.BlockPos; import net.minecraft.core.RegistryAccess; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.LevelHeightAccessor; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.Heightmap.Types; @@ -20,22 +22,23 @@ public class MegaLakeSmallStructure extends FeatureBaseStructure { } public static class SDFStructureStart extends StructureStart { - public SDFStructureStart(StructureFeature feature, int chunkX, int chunkZ, BoundingBox box, int references, long seed) { - super(feature, chunkX, chunkZ, box, references, seed); + public SDFStructureStart(StructureFeature feature, ChunkPos chunkPos, int references, long seed) { + super(feature, chunkPos, references, seed); } @Override - public void generatePieces(RegistryAccess registryManager, ChunkGenerator chunkGenerator, StructureManager manager, int chunkX, int chunkZ, Biome biome, NoneFeatureConfiguration config) { - int x = (chunkX << 4) | MHelper.randRange(4, 12, random); - int z = (chunkZ << 4) | MHelper.randRange(4, 12, random); - int y = chunkGenerator.getBaseHeight(x, z, Types.WORLD_SURFACE_WG); + public void generatePieces(RegistryAccess registryManager, ChunkGenerator chunkGenerator, StructureManager structureManager, ChunkPos chunkPos, Biome biome, NoneFeatureConfiguration featureConfiguration, LevelHeightAccessor levelHeightAccessor) { + int x = chunkPos.getBlockX( MHelper.randRange(4, 12, random)); + int z = chunkPos.getBlockZ(MHelper.randRange(4, 12, random)); + int y = chunkGenerator.getBaseHeight(x, z, Types.WORLD_SURFACE_WG, levelHeightAccessor); if (y > 5) { float radius = MHelper.randRange(20, 40, random); float depth = MHelper.randRange(5, 10, random); LakePiece piece = new LakePiece(new BlockPos(x, y, z), radius, depth, random, biome); this.pieces.add(piece); } - this.calculateBoundingBox(); + + //this.calculateBoundingBox(); } } } diff --git a/src/main/java/ru/betterend/world/structures/features/MegaLakeStructure.java b/src/main/java/ru/betterend/world/structures/features/MegaLakeStructure.java index 2d554d4c..d536fe46 100644 --- a/src/main/java/ru/betterend/world/structures/features/MegaLakeStructure.java +++ b/src/main/java/ru/betterend/world/structures/features/MegaLakeStructure.java @@ -2,6 +2,8 @@ package ru.betterend.world.structures.features; import net.minecraft.core.BlockPos; import net.minecraft.core.RegistryAccess; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.LevelHeightAccessor; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.Heightmap.Types; @@ -20,22 +22,23 @@ public class MegaLakeStructure extends FeatureBaseStructure { } public static class SDFStructureStart extends StructureStart { - public SDFStructureStart(StructureFeature feature, int chunkX, int chunkZ, BoundingBox box, int references, long seed) { - super(feature, chunkX, chunkZ, box, references, seed); + public SDFStructureStart(StructureFeature feature, ChunkPos chunkPos, int references, long seed) { + super(feature, chunkPos, references, seed); } @Override - public void generatePieces(RegistryAccess registryManager, ChunkGenerator chunkGenerator, StructureManager manager, int chunkX, int chunkZ, Biome biome, NoneFeatureConfiguration config) { - int x = (chunkX << 4) | MHelper.randRange(4, 12, random); - int z = (chunkZ << 4) | MHelper.randRange(4, 12, random); - int y = chunkGenerator.getBaseHeight(x, z, Types.WORLD_SURFACE_WG); + public void generatePieces(RegistryAccess registryManager, ChunkGenerator chunkGenerator, StructureManager structureManager, ChunkPos chunkPos, Biome biome, NoneFeatureConfiguration featureConfiguration, LevelHeightAccessor levelHeightAccessor) { + int x = chunkPos.getBlockX(MHelper.randRange(4, 12, random)); + int z = chunkPos.getBlockZ(MHelper.randRange(4, 12, random)); + int y = chunkGenerator.getBaseHeight(x, z, Types.WORLD_SURFACE_WG, levelHeightAccessor); if (y > 5) { float radius = MHelper.randRange(32, 64, random); float depth = MHelper.randRange(7, 15, random); LakePiece piece = new LakePiece(new BlockPos(x, y, z), radius, depth, random, biome); this.pieces.add(piece); } - this.calculateBoundingBox(); + + //this.calculateBoundingBox(); } } } diff --git a/src/main/java/ru/betterend/world/structures/features/MountainStructure.java b/src/main/java/ru/betterend/world/structures/features/MountainStructure.java index a968c7d1..5be93f26 100644 --- a/src/main/java/ru/betterend/world/structures/features/MountainStructure.java +++ b/src/main/java/ru/betterend/world/structures/features/MountainStructure.java @@ -2,6 +2,8 @@ package ru.betterend.world.structures.features; import net.minecraft.core.BlockPos; import net.minecraft.core.RegistryAccess; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.LevelHeightAccessor; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.Heightmap.Types; @@ -20,22 +22,23 @@ public class MountainStructure extends FeatureBaseStructure { } public static class SDFStructureStart extends StructureStart { - public SDFStructureStart(StructureFeature feature, int chunkX, int chunkZ, BoundingBox box, int references, long seed) { - super(feature, chunkX, chunkZ, box, references, seed); + public SDFStructureStart(StructureFeature feature, ChunkPos chunkPos, int references, long seed) { + super(feature, chunkPos, references, seed); } @Override - public void generatePieces(RegistryAccess registryManager, ChunkGenerator chunkGenerator, StructureManager manager, int chunkX, int chunkZ, Biome biome, NoneFeatureConfiguration config) { - int x = (chunkX << 4) | MHelper.randRange(4, 12, random); - int z = (chunkZ << 4) | MHelper.randRange(4, 12, random); - int y = chunkGenerator.getBaseHeight(x, z, Types.WORLD_SURFACE_WG); + public void generatePieces(RegistryAccess registryManager, ChunkGenerator chunkGenerator, StructureManager structureManager, ChunkPos chunkPos, Biome biome, NoneFeatureConfiguration featureConfiguration, LevelHeightAccessor levelHeightAccessor) { + int x = chunkPos.getBlockX(MHelper.randRange(4, 12, random)); + int z =chunkPos.getBlockZ(MHelper.randRange(4, 12, random)); + int y = chunkGenerator.getBaseHeight(x, z, Types.WORLD_SURFACE_WG, levelHeightAccessor); if (y > 5) { float radius = MHelper.randRange(50, 100, random); float height = radius * MHelper.randRange(0.8F, 1.2F, random); CrystalMountainPiece piece = new CrystalMountainPiece(new BlockPos(x, y, z), radius, height, random, biome); this.pieces.add(piece); } - this.calculateBoundingBox(); + + //this.calculateBoundingBox(); } } } diff --git a/src/main/java/ru/betterend/world/structures/features/PaintedMountainStructure.java b/src/main/java/ru/betterend/world/structures/features/PaintedMountainStructure.java index cbb6735a..d78bd5ca 100644 --- a/src/main/java/ru/betterend/world/structures/features/PaintedMountainStructure.java +++ b/src/main/java/ru/betterend/world/structures/features/PaintedMountainStructure.java @@ -2,6 +2,8 @@ package ru.betterend.world.structures.features; import net.minecraft.core.BlockPos; import net.minecraft.core.RegistryAccess; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.LevelHeightAccessor; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; @@ -25,15 +27,15 @@ public class PaintedMountainStructure extends FeatureBaseStructure { } public static class SDFStructureStart extends StructureStart { - public SDFStructureStart(StructureFeature feature, int chunkX, int chunkZ, BoundingBox box, int references, long seed) { - super(feature, chunkX, chunkZ, box, references, seed); + public SDFStructureStart(StructureFeature feature, ChunkPos chunkPos, int references, long seed) { + super(feature, chunkPos, references, seed); } @Override - public void generatePieces(RegistryAccess registryManager, ChunkGenerator chunkGenerator, StructureManager manager, int chunkX, int chunkZ, Biome biome, NoneFeatureConfiguration config) { - int x = (chunkX << 4) | MHelper.randRange(4, 12, random); - int z = (chunkZ << 4) | MHelper.randRange(4, 12, random); - int y = chunkGenerator.getBaseHeight(x, z, Types.WORLD_SURFACE_WG); + public void generatePieces(RegistryAccess registryManager, ChunkGenerator chunkGenerator, StructureManager structureManager, ChunkPos chunkPos, Biome biome, NoneFeatureConfiguration featureConfiguration, LevelHeightAccessor levelHeightAccessor) { + int x = chunkPos.getBlockX(MHelper.randRange(4, 12, random)); + int z = chunkPos.getBlockZ(MHelper.randRange(4, 12, random)); + int y = chunkGenerator.getBaseHeight(x, z, Types.WORLD_SURFACE_WG, levelHeightAccessor); if (y > 50) { float radius = MHelper.randRange(50, 100, random); float height = radius * MHelper.randRange(0.4F, 0.6F, random); @@ -44,7 +46,8 @@ public class PaintedMountainStructure extends FeatureBaseStructure { } this.pieces.add(new PaintedMountainPiece(new BlockPos(x, y, z), radius, height, random, biome, slises )); } - this.calculateBoundingBox(); + + //this.calculateBoundingBox(); } } diff --git a/src/main/java/ru/betterend/world/structures/features/SDFStructureFeature.java b/src/main/java/ru/betterend/world/structures/features/SDFStructureFeature.java index 40e28a3c..cc33b475 100644 --- a/src/main/java/ru/betterend/world/structures/features/SDFStructureFeature.java +++ b/src/main/java/ru/betterend/world/structures/features/SDFStructureFeature.java @@ -4,6 +4,8 @@ import java.util.Random; import net.minecraft.core.BlockPos; import net.minecraft.core.RegistryAccess; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.LevelHeightAccessor; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.Heightmap.Types; @@ -26,21 +28,22 @@ public abstract class SDFStructureFeature extends FeatureBaseStructure { } public static class SDFStructureStart extends StructureStart { - public SDFStructureStart(StructureFeature feature, int chunkX, int chunkZ, BoundingBox box, int references, long seed) { - super(feature, chunkX, chunkZ, box, references, seed); + public SDFStructureStart(StructureFeature feature, ChunkPos chunkPos, int references, long seed) { + super(feature, chunkPos, references, seed); } @Override - public void generatePieces(RegistryAccess registryManager, ChunkGenerator chunkGenerator, StructureManager manager, int chunkX, int chunkZ, Biome biome, NoneFeatureConfiguration config) { - int x = (chunkX << 4) | MHelper.randRange(4, 12, random); - int z = (chunkZ << 4) | MHelper.randRange(4, 12, random); - int y = chunkGenerator.getBaseHeight(x, z, Types.WORLD_SURFACE_WG); + public void generatePieces(RegistryAccess registryManager, ChunkGenerator chunkGenerator, StructureManager structureManager, ChunkPos chunkPos, Biome biome, NoneFeatureConfiguration featureConfiguration, LevelHeightAccessor levelHeightAccessor) { + int x = chunkPos.getBlockX(MHelper.randRange(4, 12, random)); + int z = chunkPos.getBlockZ(MHelper.randRange(4, 12, random)); + int y = chunkGenerator.getBaseHeight(x, z, Types.WORLD_SURFACE_WG, levelHeightAccessor); if (y > 5) { BlockPos start = new BlockPos(x, y, z); VoxelPiece piece = new VoxelPiece((world) -> { ((SDFStructureFeature) this.getFeature()).getSDF(start, this.random).fillRecursive(world, start); }, random.nextInt()); this.pieces.add(piece); } - this.calculateBoundingBox(); + + //this.calculateBoundingBox(); } } } From 32f9bf288ee79f3a2d46ca9316ce58d2810af244 Mon Sep 17 00:00:00 2001 From: Frank Bauer Date: Thu, 24 Jun 2021 12:33:49 +0200 Subject: [PATCH 029/595] `StructurePiece` constructor and `addAdditionalSaveData` Signature --- .../world/structures/piece/BasePiece.java | 5 +++-- .../world/structures/piece/CavePiece.java | 17 +++++++++-------- .../world/structures/piece/LakePiece.java | 18 ++++++++++-------- .../world/structures/piece/MountainPiece.java | 5 +++-- .../world/structures/piece/NBTPiece.java | 5 +++-- .../structures/piece/PaintedMountainPiece.java | 5 +++-- .../world/structures/piece/VoxelPiece.java | 5 +++-- 7 files changed, 34 insertions(+), 26 deletions(-) diff --git a/src/main/java/ru/betterend/world/structures/piece/BasePiece.java b/src/main/java/ru/betterend/world/structures/piece/BasePiece.java index b5ce64f8..957de957 100644 --- a/src/main/java/ru/betterend/world/structures/piece/BasePiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/BasePiece.java @@ -2,11 +2,12 @@ package ru.betterend.world.structures.piece; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.level.levelgen.feature.StructurePieceType; +import net.minecraft.world.level.levelgen.structure.BoundingBox; import net.minecraft.world.level.levelgen.structure.StructurePiece; public abstract class BasePiece extends StructurePiece { - protected BasePiece(StructurePieceType type, int i) { - super(type, i); + protected BasePiece(StructurePieceType type, int i, BoundingBox boundingBox) { + super(type, i, boundingBox); } protected BasePiece(StructurePieceType type, CompoundTag tag) { diff --git a/src/main/java/ru/betterend/world/structures/piece/CavePiece.java b/src/main/java/ru/betterend/world/structures/piece/CavePiece.java index a964e0e7..258b3ab4 100644 --- a/src/main/java/ru/betterend/world/structures/piece/CavePiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/CavePiece.java @@ -6,6 +6,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtUtils; +import net.minecraft.server.level.ServerLevel; import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.StructureFeatureManager; import net.minecraft.world.level.WorldGenLevel; @@ -25,7 +26,7 @@ public class CavePiece extends BasePiece { private float radius; public CavePiece(BlockPos center, float radius, int id) { - super(EndStructures.CAVE_PIECE, id); + super(EndStructures.CAVE_PIECE, id, null); this.center = center; this.radius = radius; this.noise = new OpenSimplexNoise(MHelper.getSeed(534, center.getX(), center.getZ())); @@ -39,12 +40,12 @@ public class CavePiece extends BasePiece { @Override public boolean postProcess(WorldGenLevel world, StructureFeatureManager arg, ChunkGenerator chunkGenerator, Random random, BoundingBox blockBox, ChunkPos chunkPos, BlockPos blockPos) { - int x1 = MHelper.max(this.boundingBox.x0, blockBox.x0); - int z1 = MHelper.max(this.boundingBox.z0, blockBox.z0); - int x2 = MHelper.min(this.boundingBox.x1, blockBox.x1); - int z2 = MHelper.min(this.boundingBox.z1, blockBox.z1); - int y1 = this.boundingBox.y0; - int y2 = this.boundingBox.y1; + int x1 = MHelper.max(this.boundingBox.minX(), blockBox.minX()); + int z1 = MHelper.max(this.boundingBox.minZ(), blockBox.minZ()); + int x2 = MHelper.min(this.boundingBox.maxX(), blockBox.maxX()); + int z2 = MHelper.min(this.boundingBox.maxZ(), blockBox.maxZ()); + int y1 = this.boundingBox.minY(); + int y2 = this.boundingBox.maxY(); double hr = radius * 0.75; double nr = radius * 0.25; @@ -83,7 +84,7 @@ public class CavePiece extends BasePiece { } @Override - protected void addAdditionalSaveData(CompoundTag tag) { + protected void addAdditionalSaveData(ServerLevel serverLevel, CompoundTag tag) { tag.put("center", NbtUtils.writeBlockPos(center)); tag.putFloat("radius", radius); } diff --git a/src/main/java/ru/betterend/world/structures/piece/LakePiece.java b/src/main/java/ru/betterend/world/structures/piece/LakePiece.java index b304d42e..5a2e10cb 100644 --- a/src/main/java/ru/betterend/world/structures/piece/LakePiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/LakePiece.java @@ -8,9 +8,11 @@ import com.google.common.collect.Maps; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; +import net.minecraft.core.SectionPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtUtils; import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; import net.minecraft.util.Mth; import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.StructureFeatureManager; @@ -46,7 +48,7 @@ public class LakePiece extends BasePiece { private ResourceLocation biomeID; public LakePiece(BlockPos center, float radius, float depth, Random random, Biome biome) { - super(EndStructures.LAKE_PIECE, random.nextInt()); + super(EndStructures.LAKE_PIECE, random.nextInt(), null); this.center = center; this.radius = radius; this.depth = depth; @@ -63,7 +65,7 @@ public class LakePiece extends BasePiece { } @Override - protected void addAdditionalSaveData(CompoundTag tag) { + protected void addAdditionalSaveData(ServerLevel serverLevel, CompoundTag tag) { tag.put("center", NbtUtils.writeBlockPos(center)); tag.putFloat("radius", radius); tag.putFloat("depth", depth); @@ -84,10 +86,10 @@ public class LakePiece extends BasePiece { @Override public boolean postProcess(WorldGenLevel world, StructureFeatureManager arg, ChunkGenerator chunkGenerator, Random random, BoundingBox blockBox, ChunkPos chunkPos, BlockPos blockPos) { - int minY = this.boundingBox.y0; - int maxY = this.boundingBox.y1; - int sx = chunkPos.x << 4; - int sz = chunkPos.z << 4; + int minY = this.boundingBox.minY(); + int maxY = this.boundingBox.maxY(); + int sx = SectionPos.sectionToBlockCoord(chunkPos.x); + int sz = SectionPos.sectionToBlockCoord(chunkPos.z); MutableBlockPos mut = new MutableBlockPos(); ChunkAccess chunk = world.getChunk(chunkPos.x, chunkPos.z); for (int x = 0; x < 16; x++) { @@ -144,8 +146,8 @@ public class LakePiece extends BasePiece { } private void fixWater(WorldGenLevel world, ChunkAccess chunk, MutableBlockPos mut, Random random, int sx, int sz) { - int minY = this.boundingBox.y0; - int maxY = this.boundingBox.y1; + int minY = this.boundingBox.minY(); + int maxY = this.boundingBox.maxY(); for (int x = 0; x < 16; x++) { mut.setX(x); for (int z = 0; z < 16; z++) { diff --git a/src/main/java/ru/betterend/world/structures/piece/MountainPiece.java b/src/main/java/ru/betterend/world/structures/piece/MountainPiece.java index bc2ef668..2521d869 100644 --- a/src/main/java/ru/betterend/world/structures/piece/MountainPiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/MountainPiece.java @@ -10,6 +10,7 @@ import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtUtils; import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; import net.minecraft.util.Mth; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.biome.Biome; @@ -34,7 +35,7 @@ public abstract class MountainPiece extends BasePiece { protected int seed2; public MountainPiece(StructurePieceType type, BlockPos center, float radius, float height, Random random, Biome biome) { - super(type, random.nextInt()); + super(type, random.nextInt(), null); this.center = center; this.radius = radius; this.height = height; @@ -53,7 +54,7 @@ public abstract class MountainPiece extends BasePiece { } @Override - protected void addAdditionalSaveData(CompoundTag tag) { + protected void addAdditionalSaveData(ServerLevel serverLevel, CompoundTag tag) { tag.put("center", NbtUtils.writeBlockPos(center)); tag.putFloat("radius", radius); tag.putFloat("height", height); diff --git a/src/main/java/ru/betterend/world/structures/piece/NBTPiece.java b/src/main/java/ru/betterend/world/structures/piece/NBTPiece.java index bc5388f3..996336bd 100644 --- a/src/main/java/ru/betterend/world/structures/piece/NBTPiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/NBTPiece.java @@ -6,6 +6,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtUtils; import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.StructureFeatureManager; import net.minecraft.world.level.WorldGenLevel; @@ -30,7 +31,7 @@ public class NBTPiece extends BasePiece { private boolean cover; public NBTPiece(ResourceLocation structureID, StructureTemplate structure, BlockPos pos, int erosion, boolean cover, Random random) { - super(EndStructures.NBT_PIECE, random.nextInt()); + super(EndStructures.NBT_PIECE, random.nextInt(), null); this.structureID = structureID; this.structure = structure; this.rotation = Rotation.getRandom(random); @@ -47,7 +48,7 @@ public class NBTPiece extends BasePiece { } @Override - protected void addAdditionalSaveData(CompoundTag tag) { + protected void addAdditionalSaveData(ServerLevel serverLevel, CompoundTag tag) { tag.putString("structureID", structureID.toString()); tag.putInt("rotation", rotation.ordinal()); tag.putInt("mirror", mirror.ordinal()); diff --git a/src/main/java/ru/betterend/world/structures/piece/PaintedMountainPiece.java b/src/main/java/ru/betterend/world/structures/piece/PaintedMountainPiece.java index cbbaa91d..f3029f74 100644 --- a/src/main/java/ru/betterend/world/structures/piece/PaintedMountainPiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/PaintedMountainPiece.java @@ -7,6 +7,7 @@ import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; import net.minecraft.nbt.NbtUtils; +import net.minecraft.server.level.ServerLevel; import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.StructureFeatureManager; import net.minecraft.world.level.WorldGenLevel; @@ -33,8 +34,8 @@ public class PaintedMountainPiece extends MountainPiece { } @Override - protected void addAdditionalSaveData(CompoundTag tag) { - super.addAdditionalSaveData(tag); + protected void addAdditionalSaveData(ServerLevel serverLevel, CompoundTag tag) { + super.addAdditionalSaveData(serverLevel, tag); ListTag slise = new ListTag(); for (BlockState state: slises) { slise.add(NbtUtils.writeBlockState(state)); diff --git a/src/main/java/ru/betterend/world/structures/piece/VoxelPiece.java b/src/main/java/ru/betterend/world/structures/piece/VoxelPiece.java index 08a4a100..67c0e2f7 100644 --- a/src/main/java/ru/betterend/world/structures/piece/VoxelPiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/VoxelPiece.java @@ -5,6 +5,7 @@ import java.util.function.Consumer; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; +import net.minecraft.server.level.ServerLevel; import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.StructureFeatureManager; import net.minecraft.world.level.WorldGenLevel; @@ -18,7 +19,7 @@ public class VoxelPiece extends BasePiece { private StructureWorld world; public VoxelPiece(Consumer function, int id) { - super(EndStructures.VOXEL_PIECE, id); + super(EndStructures.VOXEL_PIECE, id, null); world = new StructureWorld(); function.accept(world); this.boundingBox = world.getBounds(); @@ -30,7 +31,7 @@ public class VoxelPiece extends BasePiece { } @Override - protected void addAdditionalSaveData(CompoundTag tag) { + protected void addAdditionalSaveData(ServerLevel serverLevel, CompoundTag compoundTag) { tag.put("world", world.toBNT()); } From 855593193278a2b6de39b9355e19471de2efd5b4 Mon Sep 17 00:00:00 2001 From: Frank Bauer Date: Thu, 24 Jun 2021 12:34:12 +0200 Subject: [PATCH 030/595] Another round of minor changes --- Convert.java | 101 ++++-------------- .../betterend/blocks/MengerSpongeBlock.java | 4 +- .../blocks/entities/PedestalBlockEntity.java | 4 - .../mixin/common/AnvilMenuMixin.java | 2 +- .../mixin/common/ServerPlayerMixin.java | 10 +- .../ru/betterend/noise/OpenSimplexNoise.java | 2 +- 6 files changed, 29 insertions(+), 94 deletions(-) diff --git a/Convert.java b/Convert.java index 23a8aba8..15ff66c6 100644 --- a/Convert.java +++ b/Convert.java @@ -12,7 +12,14 @@ class ModelPart { boolean hadBox = false; ModelPart(Convert c, String name){ + this(c, 0, 0, name); + + } + + ModelPart(Convert c, int u, int v, String name){ this.name = name; + this.u = u; + this.v = v; parts.add(this); } @@ -83,10 +90,18 @@ class ModelPart { } public static void print(){ + System.out.println("public static LayerDefinition getTexturedModelData() {"); + System.out.println(" MeshDefinition modelData = new MeshDefinition();"); + System.out.println(" PartDefinition modelPartData = modelData.getRoot();"); for(ModelPart p : parts){ System.out.println(p); System.out.println(); } + System.out.println("return LayerDefinition.create(modelData, 48, 48);"); + System.out.println("}"); + + System.out.println(); + System.out.println(); for(ModelPart p : parts){ String pName = p.parent==null?"modelPart":p.parent.name; @@ -104,86 +119,10 @@ public class Convert { p.setRotationAngle(x, y, z); } public void c (){ - ModelPart legsL = new ModelPart(this, "legsL"); - legsL.setPos(1.5F, 19.9F, -0.45F); - setRotationAngle(legsL, 0.0F, 0.0F, 0.6981F); - - ModelPart cube_r1 = new ModelPart(this, "cube_r1"); - cube_r1.setPos(0.0F, 0.0F, -1.0F); - legsL.addChild(cube_r1); - setRotationAngle(cube_r1, 0.0F, 0.2182F, 0.3927F); - cube_r1.texOffs(0, 13).addBox(0.0216F, 0.0F, -0.5976F, 3.0F, 0.0F, 1.0F, 0.0F); - - ModelPart cube_r2 = new ModelPart(this, "cube_r2"); - cube_r2.setPos(0.5F, 0.1F, -0.05F); - legsL.addChild(cube_r2); - setRotationAngle(cube_r2, 0.0F, 0.0F, 0.3927F); - cube_r2.texOffs(0, 15).addBox(0.0F, 0.0F, -0.6F, 3.0F, 0.0F, 1.0F, 0.0F); - - ModelPart cube_r3 = new ModelPart(this, "cube_r3"); - cube_r3.setPos(0.0F, 0.0F, 0.9F); - legsL.addChild(cube_r3); - setRotationAngle(cube_r3, 0.0F, -0.2182F, 0.3927F); - cube_r3.texOffs(0, 14).addBox(0.0F, 0.0F, -0.5F, 3.0F, 0.0F, 1.0F, 0.0F); - - ModelPart legsR = new ModelPart(this,"legsR"); - legsR.setPos(-1.5F, 19.9F, -0.55F); - setRotationAngle(legsR, 0.0F, 3.1416F, -0.6545F); - - ModelPart cube_r4 = new ModelPart(this, "cube_r4"); - cube_r4.setPos(0.0F, 0.0F, -1.0F); - legsR.addChild(cube_r4); - setRotationAngle(cube_r4, 0.0F, 0.2182F, 0.3927F); - cube_r4.texOffs(0, 10).addBox(0.0F, 0.0F, -0.5F, 3.0F, 0.0F, 1.0F, 0.0F); - - ModelPart cube_r5 = new ModelPart(this, "cube_r5"); - cube_r5.setPos(0.5F, 0.1F, -0.05F); - legsR.addChild(cube_r5); - setRotationAngle(cube_r5, 0.0F, 0.0F, 0.3927F); - cube_r5.texOffs(0, 11).addBox(0.0F, 0.0F, -0.4F, 3.0F, 0.0F, 1.0F, 0.0F); - - ModelPart cube_r6 = new ModelPart(this, "cube_r6"); - cube_r6.setPos(0.0F, 0.0F, 0.9F); - legsR.addChild(cube_r6); - setRotationAngle(cube_r6, 0.0F, -0.2182F, 0.3927F); - cube_r6.texOffs(0, 12).addBox(0.0216F, 0.0F, -0.4024F, 3.0F, 0.0F, 1.0F, 0.0F); - - ModelPart head_pivot = new ModelPart(this, "head_pivot"); - head_pivot.setPos(0.0F, 18.0F, -3.0F); - head_pivot.texOffs(15, 10).addBox(-1.5F, -1.5F, -2.0F, 3.0F, 3.0F, 3.0F, 0.0F); - - ModelPart tendril_r_r1 = new ModelPart(this, "tendril_r_r1"); - tendril_r_r1.setPos(1.0F, -1.15F, -1.0F); - head_pivot.addChild(tendril_r_r1); - setRotationAngle(tendril_r_r1, 0.0F, 0.0F, 0.3927F); - tendril_r_r1.texOffs(23, 0).addBox(-1.5F, -5.0F, 0.0F, 3.0F, 5.0F, 0.0F, 0.0F, true); - - ModelPart tendril_r_r2 = new ModelPart(this, "tendril_r_r2"); - tendril_r_r2.setPos(-1.0F, -1.15F, -1.0F); - head_pivot.addChild(tendril_r_r2); - setRotationAngle(tendril_r_r2, 0.0F, 0.0F, -0.3927F); - tendril_r_r2.texOffs(23, 0).addBox(-1.5F, -5.0F, 0.0F, 3.0F, 5.0F, 0.0F, 0.0F); - - ModelPart bb_main = new ModelPart(this, "bb_main"); - bb_main.setPos(0.0F, 24.0F, 0.0F); - bb_main.texOffs(19, 19).addBox(-2.5F, -8.5F, -3.0F, 5.0F, 5.0F, 3.0F, 0.0F); - - ModelPart wingR_r1 = new ModelPart(this, "wingR_r1"); - wingR_r1.setPos(-1.5F, -6.5F, 0.5F); - bb_main.addChild(wingR_r1); - setRotationAngle(wingR_r1, 0.0F, 0.0F, 0.3927F); - wingR_r1.texOffs(0, 5).addBox(-7.0F, 0.0F, -3.0F, 9.0F, 0.0F, 5.0F, 0.0F, true); - - ModelPart wingL_r1 = new ModelPart(this, "wingL_r1"); - wingL_r1.setPos(1.5F, -6.5F, 0.5F); - bb_main.addChild(wingL_r1); - setRotationAngle(wingL_r1, 0.0F, 0.0F, -0.3927F); - wingL_r1.texOffs(0, 5).addBox(-2.0F, 0.0F, -3.0F, 9.0F, 0.0F, 5.0F, 0.0F); - - ModelPart abdomen_r1 = new ModelPart(this, "abdomen_r1"); - abdomen_r1.setPos(1.0F, -3.9F, 0.0F); - bb_main.addChild(abdomen_r1); - setRotationAngle(abdomen_r1, -0.3927F, 0.0F, 0.0F); - abdomen_r1.texOffs(0, 10).addBox(-3.0F, -4.0F, -1.0F, 4.0F, 4.0F, 7.0F, 0.0F); + ModelPart leftWing = new ModelPart(this, 22, 0, "leftWing"); + leftWing.addBox(-10.0F, 0.0F, 0.0F, 10.0F, 20.0F, 2.0F, 1.0F); + ModelPart rightWing = new ModelPart(this, 22, 0, "rightWing"); + rightWing.mirror = true; + rightWing.addBox(0.0F, 0.0F, 0.0F, 10.0F, 20.0F, 2.0F, 1.0F); } } diff --git a/src/main/java/ru/betterend/blocks/MengerSpongeBlock.java b/src/main/java/ru/betterend/blocks/MengerSpongeBlock.java index d644fcaf..6890f22a 100644 --- a/src/main/java/ru/betterend/blocks/MengerSpongeBlock.java +++ b/src/main/java/ru/betterend/blocks/MengerSpongeBlock.java @@ -61,7 +61,7 @@ public class MengerSpongeBlock extends BaseBlockNotFull implements IRenderTyped FluidState fluidState = world.getFluidState(blockPos2); Material material = blockState.getMaterial(); if (fluidState.is(FluidTags.WATER)) { - if (blockState.getBlock() instanceof BucketPickup && ((BucketPickup) blockState.getBlock()).takeLiquid(world, blockPos2, blockState) != Fluids.EMPTY) { + if (blockState.getBlock() instanceof BucketPickup && !((BucketPickup) blockState.getBlock()).pickupBlock(world, blockPos2, blockState).isEmpty()) { ++i; if (j < 6) { queue.add(new Tuple<>(blockPos2, j + 1)); @@ -73,7 +73,7 @@ public class MengerSpongeBlock extends BaseBlockNotFull implements IRenderTyped queue.add(new Tuple<>(blockPos2, j + 1)); } } else if (material == Material.WATER_PLANT || material == Material.REPLACEABLE_WATER_PLANT) { - BlockEntity blockEntity = blockState.getBlock().isEntityBlock() ? world.getBlockEntity(blockPos2) : null; + BlockEntity blockEntity = blockState.hasBlockEntity() ? world.getBlockEntity(blockPos2) : null; dropResources(blockState, world, blockPos2, blockEntity); world.setBlock(blockPos2, Blocks.AIR.defaultBlockState(), 3); ++i; diff --git a/src/main/java/ru/betterend/blocks/entities/PedestalBlockEntity.java b/src/main/java/ru/betterend/blocks/entities/PedestalBlockEntity.java index c41a16bd..c7668f2d 100644 --- a/src/main/java/ru/betterend/blocks/entities/PedestalBlockEntity.java +++ b/src/main/java/ru/betterend/blocks/entities/PedestalBlockEntity.java @@ -28,10 +28,6 @@ public class PedestalBlockEntity extends BlockEntity implements Container, Block super(blockEntityType, blockPos, blockState); } - public PedestalBlockEntity(BlockEntityType type) { - super(type); - } - public int getAge() { return age; } diff --git a/src/main/java/ru/betterend/mixin/common/AnvilMenuMixin.java b/src/main/java/ru/betterend/mixin/common/AnvilMenuMixin.java index 41683dec..4d2c61b6 100644 --- a/src/main/java/ru/betterend/mixin/common/AnvilMenuMixin.java +++ b/src/main/java/ru/betterend/mixin/common/AnvilMenuMixin.java @@ -72,7 +72,7 @@ public abstract class AnvilMenuMixin extends ItemCombinerMenu implements AnvilSc slotsChanged(inputSlots); access.execute((world, blockPos) -> { BlockState anvilState = world.getBlockState(blockPos); - if (!player.abilities.instabuild && anvilState.is(BlockTags.ANVIL) && player.getRandom().nextDouble() < 0.1) { + if (!player.getAbilities().instabuild && anvilState.is(BlockTags.ANVIL) && player.getRandom().nextDouble() < 0.1) { BlockState landingState = EndAnvilBlock.applyDamage(anvilState); if (landingState == null) { world.removeBlock(blockPos, false); diff --git a/src/main/java/ru/betterend/mixin/common/ServerPlayerMixin.java b/src/main/java/ru/betterend/mixin/common/ServerPlayerMixin.java index 1f85de89..dad6df0d 100644 --- a/src/main/java/ru/betterend/mixin/common/ServerPlayerMixin.java +++ b/src/main/java/ru/betterend/mixin/common/ServerPlayerMixin.java @@ -69,7 +69,7 @@ public abstract class ServerPlayerMixin extends Player implements TeleportingEnt @Inject(method = "findDimensionEntryPoint", at = @At("HEAD"), cancellable = true) protected void be_getTeleportTarget(ServerLevel destination, CallbackInfoReturnable info) { if (be_canTeleport()) { - info.setReturnValue(new PortalInfo(new Vec3(exitPos.getX() + 0.5, exitPos.getY(), exitPos.getZ() + 0.5), getDeltaMovement(), yRot, xRot)); + info.setReturnValue(new PortalInfo(new Vec3(exitPos.getX() + 0.5, exitPos.getY(), exitPos.getZ() + 0.5), getDeltaMovement(), getYRot(), getXRot())); } } @@ -85,21 +85,21 @@ public abstract class ServerPlayerMixin extends Player implements TeleportingEnt connection.send(new ClientboundChangeDifficultyPacket(worldProperties.getDifficulty(), worldProperties.isDifficultyLocked())); PlayerList playerManager = server.getPlayerList(); playerManager.sendPlayerPermissionLevel(player); - serverWorld.removePlayerImmediately(player); - removed = false; + serverWorld.removePlayerImmediately(player, RemovalReason.CHANGED_DIMENSION); + unsetRemoved(); PortalInfo teleportTarget = findDimensionEntryPoint(destination); if (teleportTarget != null) { serverWorld.getProfiler().push("moving"); serverWorld.getProfiler().pop(); serverWorld.getProfiler().push("placing"); - setLevel(destination); + this.level = destination; destination.addDuringPortalTeleport(player); setRot(teleportTarget.yRot, teleportTarget.xRot); moveTo(teleportTarget.pos.x, teleportTarget.pos.y, teleportTarget.pos.z); serverWorld.getProfiler().pop(); triggerDimensionChangeTriggers(serverWorld); gameMode.setLevel(destination); - connection.send(new ClientboundPlayerAbilitiesPacket(abilities)); + connection.send(new ClientboundPlayerAbilitiesPacket(getAbilities())); playerManager.sendLevelInfo(player, destination); playerManager.sendAllPlayerInfo(player); diff --git a/src/main/java/ru/betterend/noise/OpenSimplexNoise.java b/src/main/java/ru/betterend/noise/OpenSimplexNoise.java index 3389bfbc..bf4b1680 100644 --- a/src/main/java/ru/betterend/noise/OpenSimplexNoise.java +++ b/src/main/java/ru/betterend/noise/OpenSimplexNoise.java @@ -16,7 +16,7 @@ package ru.betterend.noise; * will be the same when ported to other languages. */ -public class OpenSimplexNoise { +public final class OpenSimplexNoise { private static final double STRETCH_CONSTANT_2D = -0.211324865405187; // (1/Math.sqrt(2+1)-1)/2; private static final double SQUISH_CONSTANT_2D = 0.366025403784439; // (Math.sqrt(2+1)-1)/2; private static final double STRETCH_CONSTANT_3D = -1.0 / 6; // (1/Math.sqrt(3+1)-1)/3; From f6cbb159175360b3420e04516e4234e151a4bd73 Mon Sep 17 00:00:00 2001 From: Frank Bauer Date: Thu, 24 Jun 2021 12:50:22 +0200 Subject: [PATCH 031/595] Fixed `LivingEntityMixin` --- .../java/ru/betterend/mixin/common/LivingEntityMixin.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/ru/betterend/mixin/common/LivingEntityMixin.java b/src/main/java/ru/betterend/mixin/common/LivingEntityMixin.java index b4e430d6..67aec1fc 100644 --- a/src/main/java/ru/betterend/mixin/common/LivingEntityMixin.java +++ b/src/main/java/ru/betterend/mixin/common/LivingEntityMixin.java @@ -99,7 +99,7 @@ public abstract class LivingEntityMixin extends Entity { this.lastAttacker = source.getEntity(); } - @ModifyArg(method = "hurt", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/LivingEntity;knockback(FDD)V")) + @ModifyArg(method = "hurt", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/LivingEntity;knockback(DDD)V")) private float be_increaseKnockback(float value, double x, double z) { if (lastAttacker != null && lastAttacker instanceof LivingEntity) { LivingEntity attacker = (LivingEntity) lastAttacker; @@ -144,9 +144,9 @@ public abstract class LivingEntityMixin extends Entity { Vec3 lookAngle = getLookAngle(); double d = 0.08D; - float rotX = xRot * 0.017453292F; + float rotX = getXRot() * 0.017453292F; double k = Math.sqrt(lookAngle.x * lookAngle.x + lookAngle.z * lookAngle.z); - double l = Math.sqrt(getHorizontalDistanceSqr(moveDelta)); + double l = moveDelta.horizontalDistance(); double lookLen = lookAngle.length(); float n = Mth.cos(rotX); n = (float) (n * n * Math.min(1.0D, lookLen / 0.4D)); @@ -172,7 +172,7 @@ public abstract class LivingEntityMixin extends Entity { move(MoverType.SELF, moveDelta); if (!level.isClientSide) { if (horizontalCollision) { - coef = Math.sqrt(getHorizontalDistanceSqr(moveDelta)); + coef = moveDelta.horizontalDistance(); double r = l - coef; float dmg = (float) (r * 10.0D - 3.0D); if (dmg > 0.0F) { From 4bf09362be8c4f7844905e689c4b5e58785bb99b Mon Sep 17 00:00:00 2001 From: Frank Bauer Date: Thu, 24 Jun 2021 14:47:23 +0200 Subject: [PATCH 032/595] Fixed `PlayerListMixin` --- .../mixin/common/PlayerListMixin.java | 148 ++++++++++-------- 1 file changed, 80 insertions(+), 68 deletions(-) diff --git a/src/main/java/ru/betterend/mixin/common/PlayerListMixin.java b/src/main/java/ru/betterend/mixin/common/PlayerListMixin.java index 408fb3fa..97a9f1b2 100644 --- a/src/main/java/ru/betterend/mixin/common/PlayerListMixin.java +++ b/src/main/java/ru/betterend/mixin/common/PlayerListMixin.java @@ -1,9 +1,6 @@ package ru.betterend.mixin.common; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.UUID; +import java.util.*; import org.apache.logging.log4j.Logger; import org.jetbrains.annotations.Nullable; @@ -84,141 +81,153 @@ public class PlayerListMixin { private Map playersByUUID; @Inject(method = "placeNewPlayer", at = @At(value = "HEAD"), cancellable = true) - public void be_placeNewPlayer(Connection connection, ServerPlayer player, CallbackInfo info) { + public void be_placeNewPlayer(Connection connection, ServerPlayer serverPlayer, CallbackInfo info) { if (GeneratorOptions.swapOverworldToEnd()) { - GameProfile gameProfile = player.getGameProfile(); + GameProfile gameProfile = serverPlayer.getGameProfile(); GameProfileCache userCache = this.server.getProfileCache(); GameProfile gameProfile2 = userCache.get(gameProfile.getId()); String string = gameProfile2 == null ? gameProfile.getName() : gameProfile2.getName(); userCache.add(gameProfile); - CompoundTag compoundTag = this.load(player); + CompoundTag compoundTag = this.load(serverPlayer); ResourceKey var23; if (compoundTag != null) { DataResult> var10000 = DimensionType.parseLegacy(new Dynamic(NbtOps.INSTANCE, compoundTag.get("Dimension"))); Logger var10001 = LOGGER; - var10001.getClass(); + Objects.requireNonNull(var10001); var23 = (ResourceKey) var10000.resultOrPartial(var10001::error).orElse(Level.END); - } - else { + } else { var23 = Level.END; } ResourceKey registryKey = var23; - ServerLevel serverWorld = this.server.getLevel(registryKey); - ServerLevel serverWorld3; - if (serverWorld == null) { + ServerLevel serverLevel = this.server.getLevel(registryKey); + ServerLevel serverLevel3; + if (serverLevel == null) { LOGGER.warn("Unknown respawn dimension {}, defaulting to overworld", registryKey); - serverWorld3 = this.server.overworld(); - } - else { - serverWorld3 = serverWorld; + serverLevel3 = this.server.overworld(); + } else { + serverLevel3 = serverLevel; } - player.setLevel(serverWorld3); - player.gameMode.setLevel((ServerLevel) player.level); + serverPlayer.setLevel(serverLevel3); + //serverPlayer.gameMode.setLevel((ServerLevel) serverPlayer.level); String string2 = "local"; if (connection.getRemoteAddress() != null) { string2 = connection.getRemoteAddress().toString(); } - LOGGER.info("{}[{}] logged in with entity id {} at ({}, {}, {})", player.getName().getString(), string2, player.getId(), player.getX(), player.getY(), player.getZ()); - LevelData worldProperties = serverWorld3.getLevelData(); - this.updatePlayerGameMode(player, (ServerPlayer) null, serverWorld3); - ServerGamePacketListenerImpl serverPlayNetworkHandler = new ServerGamePacketListenerImpl(this.server, connection, player); - GameRules gameRules = serverWorld3.getGameRules(); + LOGGER.info("{}[{}] logged in with entity id {} at ({}, {}, {})", serverPlayer.getName().getString(), string2, + serverPlayer.getId(), serverPlayer.getX(), serverPlayer.getY(), serverPlayer.getZ()); + LevelData worldProperties = serverLevel3.getLevelData(); + serverPlayer.loadGameTypes(compoundTag); + //this.updatePlayerGameMode(serverPlayer, (ServerPlayer) null, serverLevel3); + ServerGamePacketListenerImpl serverPlayNetworkHandler = new ServerGamePacketListenerImpl(this.server, + connection, serverPlayer); + GameRules gameRules = serverLevel3.getGameRules(); boolean bl = gameRules.getBoolean(GameRules.RULE_DO_IMMEDIATE_RESPAWN); boolean bl2 = gameRules.getBoolean(GameRules.RULE_REDUCEDDEBUGINFO); - serverPlayNetworkHandler.send(new ClientboundLoginPacket(player.getId(), player.gameMode.getGameModeForPlayer(), player.gameMode.getPreviousGameModeForPlayer(), BiomeManager.obfuscateSeed(serverWorld3.getSeed()), - worldProperties.isHardcore(), this.server.levelKeys(), this.registryHolder, serverWorld3.dimensionType(), serverWorld3.dimension(), this.getPlayerCount(), this.viewDistance, bl2, !bl, - serverWorld3.isDebug(), serverWorld3.isFlat())); - serverPlayNetworkHandler.send(new ClientboundCustomPayloadPacket(ClientboundCustomPayloadPacket.BRAND, (new FriendlyByteBuf(Unpooled.buffer())).writeUtf(this.getServer().getServerModName()))); - serverPlayNetworkHandler.send(new ClientboundChangeDifficultyPacket(worldProperties.getDifficulty(), worldProperties.isDifficultyLocked())); - serverPlayNetworkHandler.send(new ClientboundPlayerAbilitiesPacket(player.abilities)); - serverPlayNetworkHandler.send(new ClientboundSetCarriedItemPacket(player.inventory.selected)); - serverPlayNetworkHandler.send(new ClientboundUpdateRecipesPacket(this.server.getRecipeManager().getRecipes())); - serverPlayNetworkHandler.send(new ClientboundUpdateTagsPacket(this.server.getTags())); - this.sendPlayerPermissionLevel(player); - player.getStats().markAllDirty(); - player.getRecipeBook().sendInitialRecipeBook(player); - this.updateEntireScoreboard(serverWorld3.getScoreboard(), player); + serverPlayNetworkHandler.send(new ClientboundLoginPacket(serverPlayer.getId(), + serverPlayer.gameMode.getGameModeForPlayer(), serverPlayer.gameMode.getPreviousGameModeForPlayer(), + BiomeManager.obfuscateSeed(serverLevel3.getSeed()), worldProperties.isHardcore(), + this.server.levelKeys(), this.registryHolder, serverLevel3.dimensionType(), serverLevel3.dimension(), + this.getMaxPlayers(), this.viewDistance, bl2, !bl, serverLevel3.isDebug(), serverLevel3.isFlat())); + serverPlayNetworkHandler.send(new ClientboundCustomPayloadPacket(ClientboundCustomPayloadPacket.BRAND, + (new FriendlyByteBuf(Unpooled.buffer())).writeUtf(this.getServer().getServerModName()))); + serverPlayNetworkHandler + .send(new ClientboundChangeDifficultyPacket(worldProperties.getDifficulty(), worldProperties.isDifficultyLocked())); + serverPlayNetworkHandler.send(new ClientboundPlayerAbilitiesPacket(serverPlayer.getAbilities())); + serverPlayNetworkHandler.send(new ClientboundSetCarriedItemPacket(serverPlayer.getInventory().selected)); + serverPlayNetworkHandler + .send(new ClientboundUpdateRecipesPacket(this.server.getRecipeManager().getRecipes())); + serverPlayNetworkHandler + .send(new ClientboundUpdateTagsPacket(this.server.getTags().serializeToNetwork(this.registryHolder))); + this.sendPlayerPermissionLevel(serverPlayer); + serverPlayer.getStats().markAllDirty(); + serverPlayer.getRecipeBook().sendInitialRecipeBook(serverPlayer); + this.updateEntireScoreboard(serverLevel3.getScoreboard(), serverPlayer); this.server.invalidateStatus(); TranslatableComponent mutableText2; - if (player.getGameProfile().getName().equalsIgnoreCase(string)) { - mutableText2 = new TranslatableComponent("multiplayer.player.joined", new Object[] { player.getDisplayName() }); - } - else { - mutableText2 = new TranslatableComponent("multiplayer.player.joined.renamed", new Object[] { player.getDisplayName(), string }); + if (serverPlayer.getGameProfile().getName().equalsIgnoreCase(string)) { + mutableText2 = new TranslatableComponent("multiplayer.player.joined", + new Object[] { serverPlayer.getDisplayName() }); + } else { + mutableText2 = new TranslatableComponent("multiplayer.player.joined.renamed", + new Object[] { serverPlayer.getDisplayName(), string }); } this.broadcastMessage(mutableText2.withStyle(ChatFormatting.YELLOW), ChatType.SYSTEM, Util.NIL_UUID); - serverPlayNetworkHandler.teleport(player.getX(), player.getY(), player.getZ(), player.yRot, player.xRot); - this.players.add(player); - this.playersByUUID.put(player.getUUID(), player); - this.broadcastAll(new ClientboundPlayerInfoPacket(ClientboundPlayerInfoPacket.Action.ADD_PLAYER, new ServerPlayer[] { player })); + serverPlayNetworkHandler.teleport(serverPlayer.getX(), serverPlayer.getY(), serverPlayer.getZ(), + serverPlayer.getYRot(), serverPlayer.getXRot()); + this.players.add(serverPlayer); + this.playersByUUID.put(serverPlayer.getUUID(), serverPlayer); + this.broadcastAll(new ClientboundPlayerInfoPacket(ClientboundPlayerInfoPacket.Action.ADD_PLAYER, + new ServerPlayer[] { serverPlayer })); for (int i = 0; i < this.players.size(); ++i) { - player.connection.send(new ClientboundPlayerInfoPacket(ClientboundPlayerInfoPacket.Action.ADD_PLAYER, new ServerPlayer[] { (ServerPlayer) this.players.get(i) })); + serverPlayer.connection.send(new ClientboundPlayerInfoPacket(ClientboundPlayerInfoPacket.Action.ADD_PLAYER, + new ServerPlayer[] { (ServerPlayer) this.players.get(i) })); } - serverWorld3.addNewPlayer(player); - this.server.getCustomBossEvents().onPlayerConnect(player); - this.sendLevelInfo(player, serverWorld3); + serverLevel3.addNewPlayer(serverPlayer); + this.server.getCustomBossEvents().onPlayerConnect(serverPlayer); + this.sendLevelInfo(serverPlayer, serverLevel3); if (!this.server.getResourcePack().isEmpty()) { - player.sendTexturePack(this.server.getResourcePack(), this.server.getResourcePackHash()); + serverPlayer.sendTexturePack(this.server.getResourcePack(), this.server.getResourcePackHash(), + this.server.isResourcePackRequired(), this.server.getResourcePackPrompt()); } - Iterator var24 = player.getActiveEffects().iterator(); + Iterator var24 = serverPlayer.getActiveEffects().iterator(); while (var24.hasNext()) { MobEffectInstance statusEffectInstance = (MobEffectInstance) var24.next(); - serverPlayNetworkHandler.send(new ClientboundUpdateMobEffectPacket(player.getId(), statusEffectInstance)); + serverPlayNetworkHandler + .send(new ClientboundUpdateMobEffectPacket(serverPlayer.getId(), statusEffectInstance)); } if (compoundTag != null && compoundTag.contains("RootVehicle", 10)) { CompoundTag compoundTag2 = compoundTag.getCompound("RootVehicle"); - Entity entity = EntityType.loadEntityRecursive(compoundTag2.getCompound("Entity"), serverWorld3, (vehicle) -> { - return !serverWorld3.addWithUUID(vehicle) ? null : vehicle; - }); + Entity entity = EntityType.loadEntityRecursive(compoundTag2.getCompound("Entity"), serverLevel3, + (vehicle) -> { + return !serverLevel3.addWithUUID(vehicle) ? null : vehicle; + }); if (entity != null) { UUID uUID2; if (compoundTag2.hasUUID("Attach")) { uUID2 = compoundTag2.getUUID("Attach"); - } - else { + } else { uUID2 = null; } Iterator var21; Entity entity3; if (entity.getUUID().equals(uUID2)) { - player.startRiding(entity, true); - } - else { + serverPlayer.startRiding(entity, true); + } else { var21 = entity.getIndirectPassengers().iterator(); while (var21.hasNext()) { entity3 = (Entity) var21.next(); if (entity3.getUUID().equals(uUID2)) { - player.startRiding(entity3, true); + serverPlayer.startRiding(entity3, true); break; } } } - if (!player.isPassenger()) { + if (!serverPlayer.isPassenger()) { LOGGER.warn("Couldn't reattach entity to player"); - serverWorld3.despawn(entity); + entity.discard(); var21 = entity.getIndirectPassengers().iterator(); while (var21.hasNext()) { entity3 = (Entity) var21.next(); - serverWorld3.despawn(entity3); + entity3.discard(); } } } } - player.initMenu(); + serverPlayer.initInventoryMenu(); info.cancel(); } } @@ -228,8 +237,8 @@ public class PlayerListMixin { return null; } - @Shadow - private void updatePlayerGameMode(ServerPlayer player, @Nullable ServerPlayer oldPlayer, ServerLevel world) {} + // @Shadow + // private void updatePlayerGameMode(ServerPlayer player, @Nullable ServerPlayer oldPlayer, ServerLevel world) {} @Shadow public void sendPlayerPermissionLevel(ServerPlayer player) {} @@ -239,6 +248,9 @@ public class PlayerListMixin { return 0; } + @Shadow + public int getMaxPlayers() { return 0; } + @Shadow public MinecraftServer getServer() { return null; From a82f30b95db457b984b9f09f481e62b12e0425fb Mon Sep 17 00:00:00 2001 From: Frank Bauer Date: Thu, 24 Jun 2021 15:10:10 +0200 Subject: [PATCH 033/595] Fixed 'place'-Methods --- .../byg/features/OldBulbisTreeFeature.java | 11 +++++++---- .../mixin/common/SpikeFeatureMixin.java | 10 ++++++---- .../world/features/BiomeIslandFeature.java | 6 ++++-- .../world/features/CavePumpkinFeature.java | 7 +++++-- .../world/features/CrashedShipFeature.java | 13 ++++++++----- .../features/FullHeightScatterFeature.java | 7 +++++-- .../features/InvertedScatterFeature.java | 7 +++++-- .../world/features/NeonCactusFeature.java | 6 +++++- .../world/features/ScatterFeature.java | 7 +++++-- .../world/features/SilkMothNestFeature.java | 7 +++++-- .../world/features/WallScatterFeature.java | 6 +++++- .../world/features/bushes/BushFeature.java | 11 +++++++---- .../features/bushes/BushWithOuterFeature.java | 11 +++++++---- .../bushes/LargeAmaranitaFeature.java | 9 ++++++--- .../world/features/bushes/Lumecorn.java | 9 ++++++--- .../features/bushes/TenaneaBushFeature.java | 9 ++++++--- .../world/structures/piece/NBTPiece.java | 19 +++++++++++-------- 17 files changed, 103 insertions(+), 52 deletions(-) diff --git a/src/main/java/ru/betterend/integration/byg/features/OldBulbisTreeFeature.java b/src/main/java/ru/betterend/integration/byg/features/OldBulbisTreeFeature.java index 41830663..265c46fc 100644 --- a/src/main/java/ru/betterend/integration/byg/features/OldBulbisTreeFeature.java +++ b/src/main/java/ru/betterend/integration/byg/features/OldBulbisTreeFeature.java @@ -13,6 +13,7 @@ import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; import net.minecraft.world.phys.AABB; @@ -36,11 +37,13 @@ public class OldBulbisTreeFeature extends DefaultFeature { private static final List SIDE; @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - NoneFeatureConfiguration config) { - if (!world.getBlockState(pos.below()).getBlock().is(TagAPI.END_GROUND)) + public boolean place(FeaturePlaceContext featureConfig) { + Random random = featureConfig.random(); + BlockPos pos = featureConfig.origin(); + WorldGenLevel world = featureConfig.level(); + if (!world.getBlockState(pos.below()).is(TagAPI.END_GROUND)) return false; - if (!world.getBlockState(pos.below(4)).getBlock().is(TagAPI.GEN_TERRAIN)) + if (!world.getBlockState(pos.below(4)).is(TagAPI.GEN_TERRAIN)) return false; BlockState stem = Integrations.BYG.getDefaultState("bulbis_stem"); diff --git a/src/main/java/ru/betterend/mixin/common/SpikeFeatureMixin.java b/src/main/java/ru/betterend/mixin/common/SpikeFeatureMixin.java index 58b3001e..67bdf428 100644 --- a/src/main/java/ru/betterend/mixin/common/SpikeFeatureMixin.java +++ b/src/main/java/ru/betterend/mixin/common/SpikeFeatureMixin.java @@ -2,6 +2,8 @@ package ru.betterend.mixin.common; import java.util.Random; +import net.minecraft.core.Vec3i; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -34,7 +36,7 @@ import ru.betterend.world.generator.GeneratorOptions; @Mixin(SpikeFeature.class) public class SpikeFeatureMixin { @Inject(method = "place", at = @At("HEAD"), cancellable = true) - private void be_place(WorldGenLevel structureWorldAccess, ChunkGenerator chunkGenerator, Random random, BlockPos blockPos, SpikeConfiguration endSpikeFeatureConfig, CallbackInfoReturnable info) { + private void be_place(FeaturePlaceContext featurePlaceContext, CallbackInfoReturnable info) { if (!GeneratorOptions.hasPillars()) { info.setReturnValue(false); } @@ -70,7 +72,7 @@ public class SpikeFeatureMixin { radius--; StructureTemplate base = StructureHelper.readStructure(BetterEnd.makeID("pillars/pillar_base_" + radius)); StructureTemplate top = StructureHelper.readStructure(BetterEnd.makeID("pillars/pillar_top_" + radius + (spike.isGuarded() ? "_cage" : ""))); - BlockPos side = base.getSize(); + Vec3i side = base.getSize(); BlockPos pos1 = new BlockPos(x - (side.getX() >> 1), minY - 3, z - (side.getZ() >> 1)); minY = pos1.getY() + side.getY(); side = top.getSize(); @@ -78,8 +80,8 @@ public class SpikeFeatureMixin { maxY = pos2.getY(); StructurePlaceSettings data = new StructurePlaceSettings(); - base.placeInWorldChunk(world, pos1, data, random); - top.placeInWorldChunk(world, pos2, data, random); + base.placeInWorld(world, pos1, pos1, data, random, 2); + top.placeInWorld(world, pos2, pos2, data, random, 2); int r2 = radius * radius + 1; MutableBlockPos mut = new MutableBlockPos(); diff --git a/src/main/java/ru/betterend/world/features/BiomeIslandFeature.java b/src/main/java/ru/betterend/world/features/BiomeIslandFeature.java index b58474a3..91e5ccd5 100644 --- a/src/main/java/ru/betterend/world/features/BiomeIslandFeature.java +++ b/src/main/java/ru/betterend/world/features/BiomeIslandFeature.java @@ -9,6 +9,7 @@ import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.levelgen.surfacebuilders.SurfaceBuilderBaseConfiguration; import net.minecraft.world.level.levelgen.surfacebuilders.SurfaceBuilderConfiguration; @@ -29,8 +30,9 @@ public class BiomeIslandFeature extends DefaultFeature { private static BlockState underBlock = Blocks.DIRT.defaultBlockState(); @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - NoneFeatureConfiguration config) { + public boolean place(FeaturePlaceContext featureConfig) { + BlockPos pos = featureConfig.origin(); + WorldGenLevel world = featureConfig.level(); Biome biome = world.getBiome(pos); SurfaceBuilderConfiguration surfaceConfig = biome.getGenerationSettings().getSurfaceBuilderConfig(); BlockState topMaterial = surfaceConfig.getTopMaterial(); diff --git a/src/main/java/ru/betterend/world/features/CavePumpkinFeature.java b/src/main/java/ru/betterend/world/features/CavePumpkinFeature.java index 839f6120..c0fb60d3 100644 --- a/src/main/java/ru/betterend/world/features/CavePumpkinFeature.java +++ b/src/main/java/ru/betterend/world/features/CavePumpkinFeature.java @@ -5,6 +5,7 @@ import java.util.Random; import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.bclib.api.TagAPI; import ru.bclib.util.BlocksHelper; @@ -14,8 +15,10 @@ import ru.betterend.registry.EndBlocks; public class CavePumpkinFeature extends DefaultFeature { @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - NoneFeatureConfiguration config) { + public boolean place(FeaturePlaceContext featureConfig) { + Random random = featureConfig.random(); + BlockPos pos = featureConfig.origin(); + WorldGenLevel world = featureConfig.level(); if (!world.getBlockState(pos.above()).is(TagAPI.GEN_TERRAIN) || !world.isEmptyBlock(pos) || !world.isEmptyBlock(pos.below())) { return false; diff --git a/src/main/java/ru/betterend/world/features/CrashedShipFeature.java b/src/main/java/ru/betterend/world/features/CrashedShipFeature.java index 4be8dfdd..a0f92fad 100644 --- a/src/main/java/ru/betterend/world/features/CrashedShipFeature.java +++ b/src/main/java/ru/betterend/world/features/CrashedShipFeature.java @@ -11,6 +11,7 @@ import net.minecraft.world.level.block.Mirror; import net.minecraft.world.level.block.Rotation; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.levelgen.structure.BoundingBox; import net.minecraft.world.level.levelgen.structure.templatesystem.BlockIgnoreProcessor; @@ -75,8 +76,10 @@ public class CrashedShipFeature extends NBTStructureFeature { } @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos center, - NoneFeatureConfiguration featureConfig) { + public boolean place(FeaturePlaceContext featureConfig) { + Random random = featureConfig.random(); + BlockPos center = featureConfig.origin(); + WorldGenLevel world = featureConfig.level(); center = new BlockPos(((center.getX() >> 4) << 4) | 8, 128, ((center.getZ() >> 4) << 4) | 8); center = getGround(world, center); BoundingBox bounds = makeBox(center); @@ -88,7 +91,7 @@ public class CrashedShipFeature extends NBTStructureFeature { StructureTemplate structure = getStructure(world, center, random); Rotation rotation = getRotation(world, center, random); Mirror mirror = getMirror(world, center, random); - BlockPos offset = StructureTemplate.transform(structure.getSize(), mirror, rotation, BlockPos.ZERO); + BlockPos offset = StructureTemplate.transform(new BlockPos(structure.getSize()), mirror, rotation, BlockPos.ZERO); center = center.offset(0, getYOffset(structure, world, center, random) + 0.5, 0); StructurePlaceSettings placementData = new StructurePlaceSettings().setRotation(rotation).setMirror(mirror); center = center.offset(-offset.getX() * 0.5, 0, -offset.getZ() * 0.5); @@ -97,10 +100,10 @@ public class CrashedShipFeature extends NBTStructureFeature { bounds = StructureHelper.intersectBoxes(bounds, structB); addStructureData(placementData); - structure.placeInWorldChunk(world, center, placementData.setBoundingBox(bounds), random); + structure.placeInWorld(world, center, center, placementData.setBoundingBox(bounds), random, 2); StructureHelper.erodeIntense(world, bounds, random); - BlockFixer.fixBlocks(world, new BlockPos(bounds.x0, bounds.y0, bounds.z0), new BlockPos(bounds.x1, bounds.y1, bounds.z1)); + BlockFixer.fixBlocks(world, new BlockPos(bounds.minX(), bounds.minY(), bounds.minZ()), new BlockPos(bounds.maxX(), bounds.maxY(), bounds.maxZ())); return true; } diff --git a/src/main/java/ru/betterend/world/features/FullHeightScatterFeature.java b/src/main/java/ru/betterend/world/features/FullHeightScatterFeature.java index 9912e3be..7e47884d 100644 --- a/src/main/java/ru/betterend/world/features/FullHeightScatterFeature.java +++ b/src/main/java/ru/betterend/world/features/FullHeightScatterFeature.java @@ -7,6 +7,7 @@ import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.Heightmap; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.bclib.util.BlocksHelper; import ru.bclib.util.MHelper; @@ -26,8 +27,10 @@ public abstract class FullHeightScatterFeature extends DefaultFeature { public abstract void generate(WorldGenLevel world, Random random, BlockPos blockPos); @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos center, - NoneFeatureConfiguration featureConfig) { + public boolean place(FeaturePlaceContext featureConfig) { + Random random = featureConfig.random(); + BlockPos center = featureConfig.origin(); + WorldGenLevel world = featureConfig.level(); int maxY = world.getHeight(Heightmap.Types.WORLD_SURFACE_WG, center.getX(), center.getZ()); int minY = BlocksHelper.upRay(world, new BlockPos(center.getX(), 0, center.getZ()), maxY); for (int y = maxY; y > minY; y--) { diff --git a/src/main/java/ru/betterend/world/features/InvertedScatterFeature.java b/src/main/java/ru/betterend/world/features/InvertedScatterFeature.java index c0807972..404a4755 100644 --- a/src/main/java/ru/betterend/world/features/InvertedScatterFeature.java +++ b/src/main/java/ru/betterend/world/features/InvertedScatterFeature.java @@ -7,6 +7,7 @@ import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.Heightmap; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.bclib.util.BlocksHelper; import ru.bclib.util.MHelper; @@ -26,8 +27,10 @@ public abstract class InvertedScatterFeature extends DefaultFeature { public abstract void generate(WorldGenLevel world, Random random, BlockPos blockPos); @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos center, - NoneFeatureConfiguration featureConfig) { + public boolean place(FeaturePlaceContext featureConfig) { + Random random = featureConfig.random(); + BlockPos center = featureConfig.origin(); + WorldGenLevel world = featureConfig.level(); int maxY = world.getHeight(Heightmap.Types.WORLD_SURFACE, center.getX(), center.getZ()); int minY = BlocksHelper.upRay(world, new BlockPos(center.getX(), 0, center.getZ()), maxY); for (int y = maxY; y > minY; y--) { diff --git a/src/main/java/ru/betterend/world/features/NeonCactusFeature.java b/src/main/java/ru/betterend/world/features/NeonCactusFeature.java index 523e4dac..6a31d307 100644 --- a/src/main/java/ru/betterend/world/features/NeonCactusFeature.java +++ b/src/main/java/ru/betterend/world/features/NeonCactusFeature.java @@ -6,6 +6,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.bclib.world.features.DefaultFeature; import ru.betterend.blocks.NeonCactusPlantBlock; @@ -13,7 +14,10 @@ import ru.betterend.registry.EndBlocks; public class NeonCactusFeature extends DefaultFeature { @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, NoneFeatureConfiguration config) { + public boolean place(FeaturePlaceContext featureConfig) { + Random random = featureConfig.random(); + BlockPos pos = featureConfig.origin(); + WorldGenLevel world = featureConfig.level(); BlockState ground = world.getBlockState(pos.below()); if (!ground.is(EndBlocks.ENDSTONE_DUST) && !ground.is(EndBlocks.END_MOSS)) { return false; diff --git a/src/main/java/ru/betterend/world/features/ScatterFeature.java b/src/main/java/ru/betterend/world/features/ScatterFeature.java index 620be106..d65c6845 100644 --- a/src/main/java/ru/betterend/world/features/ScatterFeature.java +++ b/src/main/java/ru/betterend/world/features/ScatterFeature.java @@ -6,6 +6,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.bclib.api.TagAPI; import ru.bclib.util.BlocksHelper; @@ -56,8 +57,10 @@ public abstract class ScatterFeature extends DefaultFeature { } @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos center, - NoneFeatureConfiguration featureConfig) { + public boolean place(FeaturePlaceContext featureConfig) { + Random random = featureConfig.random(); + BlockPos center = featureConfig.origin(); + WorldGenLevel world = featureConfig.level(); center = getCenterGround(world, center); if (!canSpawn(world, center)) { diff --git a/src/main/java/ru/betterend/world/features/SilkMothNestFeature.java b/src/main/java/ru/betterend/world/features/SilkMothNestFeature.java index 25ca6aed..dbadb296 100644 --- a/src/main/java/ru/betterend/world/features/SilkMothNestFeature.java +++ b/src/main/java/ru/betterend/world/features/SilkMothNestFeature.java @@ -11,6 +11,7 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.BlockStateProperties; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.Heightmap; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.bclib.blocks.BlockProperties; import ru.bclib.util.BlocksHelper; @@ -34,8 +35,10 @@ public class SilkMothNestFeature extends DefaultFeature { } @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos center, - NoneFeatureConfiguration featureConfig) { + public boolean place(FeaturePlaceContext featureConfig) { + Random random = featureConfig.random(); + BlockPos center = featureConfig.origin(); + WorldGenLevel world = featureConfig.level(); int maxY = world.getHeight(Heightmap.Types.WORLD_SURFACE, center.getX(), center.getZ()); int minY = BlocksHelper.upRay(world, new BlockPos(center.getX(), 0, center.getZ()), maxY); POS.set(center); diff --git a/src/main/java/ru/betterend/world/features/WallScatterFeature.java b/src/main/java/ru/betterend/world/features/WallScatterFeature.java index d9dee786..3bd6e23c 100644 --- a/src/main/java/ru/betterend/world/features/WallScatterFeature.java +++ b/src/main/java/ru/betterend/world/features/WallScatterFeature.java @@ -8,6 +8,7 @@ import net.minecraft.core.Direction; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.Heightmap; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.bclib.util.BlocksHelper; import ru.bclib.util.MHelper; @@ -26,7 +27,10 @@ public abstract class WallScatterFeature extends DefaultFeature { public abstract void generate(WorldGenLevel world, Random random, BlockPos pos, Direction dir); @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos center, NoneFeatureConfiguration featureConfig) { + public boolean place(FeaturePlaceContext featureConfig) { + Random random = featureConfig.random(); + BlockPos center = featureConfig.origin(); + WorldGenLevel world = featureConfig.level(); int maxY = world.getHeight(Heightmap.Types.WORLD_SURFACE, center.getX(), center.getZ()); int minY = BlocksHelper.upRay(world, new BlockPos(center.getX(), 0, center.getZ()), maxY); if (maxY < 10 || maxY < minY) { diff --git a/src/main/java/ru/betterend/world/features/bushes/BushFeature.java b/src/main/java/ru/betterend/world/features/bushes/BushFeature.java index d3a78ecc..7ac27e3f 100644 --- a/src/main/java/ru/betterend/world/features/bushes/BushFeature.java +++ b/src/main/java/ru/betterend/world/features/bushes/BushFeature.java @@ -10,6 +10,7 @@ import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.LeavesBlock; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; import ru.bclib.api.TagAPI; @@ -35,10 +36,12 @@ public class BushFeature extends DefaultFeature { } @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - NoneFeatureConfiguration config) { - if (!world.getBlockState(pos.below()).getBlock().is(TagAPI.END_GROUND) - && !world.getBlockState(pos.above()).getBlock().is(TagAPI.END_GROUND)) + public boolean place(FeaturePlaceContext featureConfig) { + Random random = featureConfig.random(); + BlockPos pos = featureConfig.origin(); + WorldGenLevel world = featureConfig.level(); + if (!world.getBlockState(pos.below()).is(TagAPI.END_GROUND) + && !world.getBlockState(pos.above()).is(TagAPI.END_GROUND)) return false; float radius = MHelper.randRange(1.8F, 3.5F, random); diff --git a/src/main/java/ru/betterend/world/features/bushes/BushWithOuterFeature.java b/src/main/java/ru/betterend/world/features/bushes/BushWithOuterFeature.java index 67daa795..09e87425 100644 --- a/src/main/java/ru/betterend/world/features/bushes/BushWithOuterFeature.java +++ b/src/main/java/ru/betterend/world/features/bushes/BushWithOuterFeature.java @@ -11,6 +11,7 @@ import net.minecraft.world.level.block.LeavesBlock; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.BlockStateProperties; import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; import ru.bclib.api.TagAPI; @@ -39,10 +40,12 @@ public class BushWithOuterFeature extends DefaultFeature { } @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - NoneFeatureConfiguration config) { - if (!world.getBlockState(pos.below()).getBlock().is(TagAPI.END_GROUND) - && !world.getBlockState(pos.above()).getBlock().is(TagAPI.END_GROUND)) + public boolean place(FeaturePlaceContext featureConfig) { + Random random = featureConfig.random(); + BlockPos pos = featureConfig.origin(); + WorldGenLevel world = featureConfig.level(); + if (!world.getBlockState(pos.below()).is(TagAPI.END_GROUND) + && !world.getBlockState(pos.above()).is(TagAPI.END_GROUND)) return false; float radius = MHelper.randRange(1.8F, 3.5F, random); diff --git a/src/main/java/ru/betterend/world/features/bushes/LargeAmaranitaFeature.java b/src/main/java/ru/betterend/world/features/bushes/LargeAmaranitaFeature.java index a3c8018a..6ae29c7d 100644 --- a/src/main/java/ru/betterend/world/features/bushes/LargeAmaranitaFeature.java +++ b/src/main/java/ru/betterend/world/features/bushes/LargeAmaranitaFeature.java @@ -8,6 +8,7 @@ import net.minecraft.core.Direction; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.bclib.api.TagAPI; import ru.bclib.blocks.BlockProperties; @@ -19,9 +20,11 @@ import ru.betterend.registry.EndBlocks; public class LargeAmaranitaFeature extends DefaultFeature { @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - NoneFeatureConfiguration config) { - if (!world.getBlockState(pos.below()).getBlock().is(TagAPI.END_GROUND)) + public boolean place(FeaturePlaceContext featureConfig) { + Random random = featureConfig.random(); + BlockPos pos = featureConfig.origin(); + WorldGenLevel world = featureConfig.level(); + if (!world.getBlockState(pos.below()).is(TagAPI.END_GROUND)) return false; MutableBlockPos mut = new MutableBlockPos().set(pos); diff --git a/src/main/java/ru/betterend/world/features/bushes/Lumecorn.java b/src/main/java/ru/betterend/world/features/bushes/Lumecorn.java index ec9b0682..b0d2e81b 100644 --- a/src/main/java/ru/betterend/world/features/bushes/Lumecorn.java +++ b/src/main/java/ru/betterend/world/features/bushes/Lumecorn.java @@ -8,6 +8,7 @@ import net.minecraft.core.Direction; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.bclib.api.TagAPI; import ru.bclib.util.BlocksHelper; @@ -19,9 +20,11 @@ import ru.betterend.registry.EndBlocks; public class Lumecorn extends DefaultFeature { @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - NoneFeatureConfiguration config) { - if (!world.getBlockState(pos.below()).getBlock().is(TagAPI.END_GROUND)) + public boolean place(FeaturePlaceContext featureConfig) { + Random random = featureConfig.random(); + BlockPos pos = featureConfig.origin(); + WorldGenLevel world = featureConfig.level(); + if (!world.getBlockState(pos.below()).is(TagAPI.END_GROUND)) return false; int height = MHelper.randRange(4, 7, random); diff --git a/src/main/java/ru/betterend/world/features/bushes/TenaneaBushFeature.java b/src/main/java/ru/betterend/world/features/bushes/TenaneaBushFeature.java index 21e7d95e..eba26562 100644 --- a/src/main/java/ru/betterend/world/features/bushes/TenaneaBushFeature.java +++ b/src/main/java/ru/betterend/world/features/bushes/TenaneaBushFeature.java @@ -13,6 +13,7 @@ import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.LeavesBlock; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; import ru.bclib.api.TagAPI; @@ -39,9 +40,11 @@ public class TenaneaBushFeature extends DefaultFeature { } @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - NoneFeatureConfiguration config) { - if (!world.getBlockState(pos.below()).getBlock().is(TagAPI.END_GROUND)) + public boolean place(FeaturePlaceContext featureConfig) { + Random random = featureConfig.random(); + BlockPos pos = featureConfig.origin(); + WorldGenLevel world = featureConfig.level(); + if (!world.getBlockState(pos.below()).is(TagAPI.END_GROUND)) return false; float radius = MHelper.randRange(1.8F, 3.5F, random); diff --git a/src/main/java/ru/betterend/world/structures/piece/NBTPiece.java b/src/main/java/ru/betterend/world/structures/piece/NBTPiece.java index 996336bd..a4cd0e32 100644 --- a/src/main/java/ru/betterend/world/structures/piece/NBTPiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/NBTPiece.java @@ -3,6 +3,7 @@ package ru.betterend.world.structures.piece; import java.util.Random; import net.minecraft.core.BlockPos; +import net.minecraft.core.Vec3i; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtUtils; import net.minecraft.resources.ResourceLocation; @@ -70,16 +71,18 @@ public class NBTPiece extends BasePiece { @Override public boolean postProcess(WorldGenLevel world, StructureFeatureManager arg, ChunkGenerator chunkGenerator, Random random, BoundingBox blockBox, ChunkPos chunkPos, BlockPos blockPos) { - BoundingBox bounds = new BoundingBox(blockBox); - bounds.y1 = this.boundingBox.y1; - bounds.y0 = this.boundingBox.y0; + BoundingBox bounds = BoundingBox.fromCorners( + new Vec3i(blockBox.minX(), this.boundingBox.minY(), blockBox.minZ()), + new Vec3i(blockBox.maxX(), this.boundingBox.maxX(), blockBox.maxZ()) + ); StructurePlaceSettings placementData = new StructurePlaceSettings().setRotation(rotation).setMirror(mirror).setBoundingBox(bounds); - structure.placeInWorldChunk(world, pos, placementData, random); + structure.placeInWorld(world, pos, pos, placementData, random, 2); if (erosion > 0) { - bounds.x1 = MHelper.min(bounds.x1, boundingBox.x1); - bounds.x0 = MHelper.max(bounds.x0, boundingBox.x0); - bounds.z1 = MHelper.min(bounds.z1, boundingBox.z1); - bounds.z0 = MHelper.max(bounds.z0, boundingBox.z0); + int x1 = MHelper.min(bounds.maxX(), boundingBox.maxX()); + int x0 = MHelper.max(bounds.minX(), boundingBox.minX()); + int z1 = MHelper.min(bounds.maxZ(), boundingBox.maxZ()); + int z0 = MHelper.max(bounds.minZ(), boundingBox.minZ()); + bounds = BoundingBox.fromCorners(new Vec3i(x0, bounds.minY(), z0), new Vec3i(x1, bounds.maxY(), z1)); StructureHelper.erode(world, bounds, erosion, random); } if (cover) { From 05f59b48568e4525fcf27aa49a854e62c389c071 Mon Sep 17 00:00:00 2001 From: Frank Bauer Date: Thu, 24 Jun 2021 15:24:14 +0200 Subject: [PATCH 034/595] Fixed `place`-Methods (Pt. II) --- .../integration/byg/biomes/NightshadeRedwoods.java | 2 +- .../byg/features/BigEtherTreeFeature.java | 8 ++++++-- .../features/terrain/BigAuroraCrystalFeature.java | 7 +++++-- .../world/features/terrain/DesertLakeFeature.java | 11 +++++++---- .../world/features/terrain/EndLakeFeature.java | 11 +++++++---- .../world/features/terrain/FallenPillarFeature.java | 6 +++++- .../world/features/terrain/FloatingSpireFeature.java | 10 +++++++--- .../world/features/terrain/GeyserFeature.java | 11 +++++++---- .../world/features/terrain/IceStarFeature.java | 7 +++++-- .../features/terrain/ObsidianBoulderFeature.java | 7 +++++-- .../terrain/ObsidianPillarBasementFeature.java | 12 +++++++----- .../world/features/terrain/OreLayerFeature.java | 7 +++++-- .../world/features/terrain/SingleBlockFeature.java | 6 +++++- .../features/terrain/SmaragdantCrystalFeature.java | 7 +++++-- .../world/features/terrain/SpireFeature.java | 10 +++++++--- .../world/features/terrain/StalactiteFeature.java | 7 +++++-- .../world/features/terrain/SulphurHillFeature.java | 7 +++++-- .../world/features/terrain/SulphuricCaveFeature.java | 7 +++++-- 18 files changed, 99 insertions(+), 44 deletions(-) diff --git a/src/main/java/ru/betterend/integration/byg/biomes/NightshadeRedwoods.java b/src/main/java/ru/betterend/integration/byg/biomes/NightshadeRedwoods.java index 61e48d18..1dea5e1f 100644 --- a/src/main/java/ru/betterend/integration/byg/biomes/NightshadeRedwoods.java +++ b/src/main/java/ru/betterend/integration/byg/biomes/NightshadeRedwoods.java @@ -54,7 +54,7 @@ public class NightshadeRedwoods extends EndBiome { }); for (MobCategory group: MobCategory.values()) { - List list = biome.getMobSettings().getMobs(group); + List list = biome.getMobSettings().getMobs(group).unwrap(); list.forEach((entry) -> { def.addMobSpawn(entry); }); diff --git a/src/main/java/ru/betterend/integration/byg/features/BigEtherTreeFeature.java b/src/main/java/ru/betterend/integration/byg/features/BigEtherTreeFeature.java index 4883e4a5..4bf26f6f 100644 --- a/src/main/java/ru/betterend/integration/byg/features/BigEtherTreeFeature.java +++ b/src/main/java/ru/betterend/integration/byg/features/BigEtherTreeFeature.java @@ -10,6 +10,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; import ru.bclib.api.TagAPI; @@ -21,8 +22,11 @@ import ru.betterend.integration.Integrations; public class BigEtherTreeFeature extends DefaultFeature { @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, NoneFeatureConfiguration config) { - if (!world.getBlockState(pos.below()).getBlock().is(TagAPI.END_GROUND)) + public boolean place(FeaturePlaceContext featureConfig) { + Random random = featureConfig.random(); + BlockPos pos = featureConfig.origin(); + WorldGenLevel world = featureConfig.level(); + if (!world.getBlockState(pos.below()).is(TagAPI.END_GROUND)) return false; BlockState log = Integrations.BYG.getDefaultState("ether_log"); diff --git a/src/main/java/ru/betterend/world/features/terrain/BigAuroraCrystalFeature.java b/src/main/java/ru/betterend/world/features/terrain/BigAuroraCrystalFeature.java index 5ccdefe2..5587ea78 100644 --- a/src/main/java/ru/betterend/world/features/terrain/BigAuroraCrystalFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/BigAuroraCrystalFeature.java @@ -7,6 +7,7 @@ import com.mojang.math.Vector3f; import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; import ru.bclib.api.TagAPI; @@ -20,8 +21,10 @@ import ru.betterend.registry.EndBlocks; public class BigAuroraCrystalFeature extends DefaultFeature { @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - NoneFeatureConfiguration config) { + public boolean place(FeaturePlaceContext featureConfig) { + Random random = featureConfig.random(); + BlockPos pos = featureConfig.origin(); + WorldGenLevel world = featureConfig.level(); int maxY = pos.getY() + BlocksHelper.upRay(world, pos, 16); int minY = pos.getY() - BlocksHelper.downRay(world, pos, 16); diff --git a/src/main/java/ru/betterend/world/features/terrain/DesertLakeFeature.java b/src/main/java/ru/betterend/world/features/terrain/DesertLakeFeature.java index 7724bae3..3ffbf476 100644 --- a/src/main/java/ru/betterend/world/features/terrain/DesertLakeFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/DesertLakeFeature.java @@ -8,6 +8,7 @@ import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.FluidState; import net.minecraft.world.level.material.Material; @@ -25,7 +26,10 @@ public class DesertLakeFeature extends DefaultFeature { private static final MutableBlockPos POS = new MutableBlockPos(); @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos blockPos, NoneFeatureConfiguration featureConfig) { + public boolean place(FeaturePlaceContext featureConfig) { + Random random = featureConfig.random(); + BlockPos blockPos = featureConfig.origin(); + WorldGenLevel world = featureConfig.level(); double radius = MHelper.randRange(8.0, 15.0, random); double depth = radius * 0.5 * MHelper.randRange(0.8, 1.2, random); int dist = MHelper.floor(radius); @@ -163,7 +167,7 @@ public class DesertLakeFeature extends DefaultFeature { BlocksHelper.setWithoutUpdate(world, POS, state); } pos = POS.below(); - if (world.getBlockState(pos).getBlock().is(TagAPI.GEN_TERRAIN)) { + if (world.getBlockState(pos).is(TagAPI.GEN_TERRAIN)) { BlocksHelper.setWithoutUpdate(world, pos, EndBlocks.ENDSTONE_DUST.defaultBlockState()); } pos = POS.above(); @@ -205,7 +209,6 @@ public class DesertLakeFeature extends DefaultFeature { || state.is(TagAPI.GEN_TERRAIN) || state.is(EndBlocks.ENDSTONE_DUST) || state.getMaterial().equals(Material.PLANT) - || state.getMaterial().equals(Material.WATER_PLANT) - || state.getMaterial().equals(Material.CORAL); + || state.getMaterial().equals(Material.WATER_PLANT); } } diff --git a/src/main/java/ru/betterend/world/features/terrain/EndLakeFeature.java b/src/main/java/ru/betterend/world/features/terrain/EndLakeFeature.java index 55075fcb..48734de6 100644 --- a/src/main/java/ru/betterend/world/features/terrain/EndLakeFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/EndLakeFeature.java @@ -8,6 +8,7 @@ import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.FluidState; import net.minecraft.world.level.material.Material; @@ -25,7 +26,10 @@ public class EndLakeFeature extends DefaultFeature { private static final MutableBlockPos POS = new MutableBlockPos(); @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos blockPos, NoneFeatureConfiguration featureConfig) { + public boolean place(FeaturePlaceContext featureConfig) { + Random random = featureConfig.random(); + BlockPos blockPos = featureConfig.origin(); + WorldGenLevel world = featureConfig.level(); double radius = MHelper.randRange(10.0, 20.0, random); double depth = radius * 0.5 * MHelper.randRange(0.8, 1.2, random); int dist = MHelper.floor(radius); @@ -163,7 +167,7 @@ public class EndLakeFeature extends DefaultFeature { BlocksHelper.setWithoutUpdate(world, POS, state); } pos = POS.below(); - if (world.getBlockState(pos).getBlock().is(TagAPI.GEN_TERRAIN)) { + if (world.getBlockState(pos).is(TagAPI.GEN_TERRAIN)) { BlocksHelper.setWithoutUpdate(world, pos, EndBlocks.ENDSTONE_DUST.defaultBlockState()); } pos = POS.above(); @@ -199,7 +203,6 @@ public class EndLakeFeature extends DefaultFeature { || state.is(TagAPI.GEN_TERRAIN) || state.is(EndBlocks.ENDSTONE_DUST) || state.getMaterial().equals(Material.PLANT) - || state.getMaterial().equals(Material.WATER_PLANT) - || state.getMaterial().equals(Material.CORAL); + || state.getMaterial().equals(Material.WATER_PLANT); } } diff --git a/src/main/java/ru/betterend/world/features/terrain/FallenPillarFeature.java b/src/main/java/ru/betterend/world/features/terrain/FallenPillarFeature.java index f0b9e545..8a1a518a 100644 --- a/src/main/java/ru/betterend/world/features/terrain/FallenPillarFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/FallenPillarFeature.java @@ -9,6 +9,7 @@ import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; import ru.bclib.api.TagAPI; @@ -24,7 +25,10 @@ import ru.betterend.registry.EndBlocks; public class FallenPillarFeature extends DefaultFeature { @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, NoneFeatureConfiguration config) { + public boolean place(FeaturePlaceContext featureConfig) { + Random random = featureConfig.random(); + BlockPos pos = featureConfig.origin(); + WorldGenLevel world = featureConfig.level(); pos = getPosOnSurface(world, new BlockPos(pos.getX() + random.nextInt(16), pos.getY(), pos.getZ() + random.nextInt(16))); if (!world.getBlockState(pos.below(5)).is(TagAPI.GEN_TERRAIN)) { diff --git a/src/main/java/ru/betterend/world/features/terrain/FloatingSpireFeature.java b/src/main/java/ru/betterend/world/features/terrain/FloatingSpireFeature.java index af955ffe..63540189 100644 --- a/src/main/java/ru/betterend/world/features/terrain/FloatingSpireFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/FloatingSpireFeature.java @@ -10,6 +10,7 @@ import net.minecraft.core.Direction; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.bclib.api.BiomeAPI; import ru.bclib.sdf.SDF; @@ -22,8 +23,11 @@ import ru.betterend.registry.EndFeatures; public class FloatingSpireFeature extends SpireFeature { @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - NoneFeatureConfiguration config) { + public boolean place(FeaturePlaceContext featureConfig) { + Random random = featureConfig.random(); + BlockPos pos = featureConfig.origin(); + WorldGenLevel world = featureConfig.level(); + ChunkGenerator chunkGenerator = featureConfig.chunkGenerator(); int minY = getYOnSurface(world, pos.getX(), pos.getZ()); int y = minY > 57 ? MHelper.floor(MHelper.randRange(minY, minY * 2, random) * 0.5F + 32) : MHelper.randRange(64, 192, random); @@ -64,7 +68,7 @@ public class FloatingSpireFeature extends SpireFeature { support.forEach((bpos) -> { if (BiomeAPI.getFromBiome(world.getBiome(bpos)) == EndBiomes.BLOSSOMING_SPIRES) { - EndFeatures.TENANEA_BUSH.getFeature().place(world, chunkGenerator, random, bpos, null); + EndFeatures.TENANEA_BUSH.getFeature().place(new FeaturePlaceContext<>(world, chunkGenerator, random, bpos, null)); } }); diff --git a/src/main/java/ru/betterend/world/features/terrain/GeyserFeature.java b/src/main/java/ru/betterend/world/features/terrain/GeyserFeature.java index 61da80ad..ad7fbb3e 100644 --- a/src/main/java/ru/betterend/world/features/terrain/GeyserFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/GeyserFeature.java @@ -14,6 +14,7 @@ import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.HorizontalDirectionalBlock; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; import ru.bclib.api.TagAPI; @@ -47,9 +48,11 @@ public class GeyserFeature extends DefaultFeature { private static final Direction[] HORIZONTAL = BlocksHelper.makeHorizontal(); @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - NoneFeatureConfiguration config) { - pos = getPosOnSurfaceWG(world, pos); + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + final WorldGenLevel world = featureConfig.level(); + final BlockPos pos = getPosOnSurfaceWG(world, featureConfig.origin()); + final ChunkGenerator chunkGenerator = featureConfig.chunkGenerator(); if (pos.getY() < 10) { return false; @@ -241,7 +244,7 @@ public class GeyserFeature extends DefaultFeature { } } - EndFeatures.SULPHURIC_LAKE.getFeature().place(world, chunkGenerator, random, pos, null); + EndFeatures.SULPHURIC_LAKE.getFeature().place(new FeaturePlaceContext<>(world, chunkGenerator, random, pos, null)); double distance = radius1 * 1.7; BlockPos start = pos.offset(-distance, -halfHeight - 15 - distance, -distance); diff --git a/src/main/java/ru/betterend/world/features/terrain/IceStarFeature.java b/src/main/java/ru/betterend/world/features/terrain/IceStarFeature.java index c76424ff..34a4f0f7 100644 --- a/src/main/java/ru/betterend/world/features/terrain/IceStarFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/IceStarFeature.java @@ -10,6 +10,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.bclib.sdf.SDF; import ru.bclib.sdf.operator.SDFRotation; @@ -34,8 +35,10 @@ public class IceStarFeature extends DefaultFeature { } @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - NoneFeatureConfiguration config) { + public boolean place(FeaturePlaceContext featureConfig) { + Random random = featureConfig.random(); + BlockPos pos = featureConfig.origin(); + WorldGenLevel world = featureConfig.level(); float size = MHelper.randRange(minSize, maxSize, random); int count = MHelper.randRange(minCount, maxCount, random); List points = getFibonacciPoints(count); diff --git a/src/main/java/ru/betterend/world/features/terrain/ObsidianBoulderFeature.java b/src/main/java/ru/betterend/world/features/terrain/ObsidianBoulderFeature.java index 840f53f1..624f3ac1 100644 --- a/src/main/java/ru/betterend/world/features/terrain/ObsidianBoulderFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/ObsidianBoulderFeature.java @@ -7,6 +7,7 @@ import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; import ru.bclib.api.TagAPI; @@ -21,8 +22,10 @@ import ru.betterend.registry.EndBlocks; public class ObsidianBoulderFeature extends DefaultFeature { @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - NoneFeatureConfiguration config) { + public boolean place(FeaturePlaceContext featureConfig) { + Random random = featureConfig.random(); + BlockPos pos = featureConfig.origin(); + WorldGenLevel world = featureConfig.level(); pos = getPosOnSurface(world, new BlockPos(pos.getX() + random.nextInt(16), pos.getY(), pos.getZ() + random.nextInt(16))); if (!world.getBlockState(pos.below()).is(TagAPI.END_GROUND)) { diff --git a/src/main/java/ru/betterend/world/features/terrain/ObsidianPillarBasementFeature.java b/src/main/java/ru/betterend/world/features/terrain/ObsidianPillarBasementFeature.java index 3106db14..1551b04d 100644 --- a/src/main/java/ru/betterend/world/features/terrain/ObsidianPillarBasementFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/ObsidianPillarBasementFeature.java @@ -1,14 +1,11 @@ package ru.betterend.world.features.terrain; -import java.util.Random; - import com.mojang.math.Vector3f; - import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; import ru.bclib.api.TagAPI; @@ -24,9 +21,14 @@ import ru.bclib.world.features.DefaultFeature; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; +import java.util.Random; + public class ObsidianPillarBasementFeature extends DefaultFeature { @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, NoneFeatureConfiguration config) { + public boolean place(FeaturePlaceContext featureConfig) { + Random random = featureConfig.random(); + BlockPos pos = featureConfig.origin(); + WorldGenLevel world = featureConfig.level(); pos = getPosOnSurface(world, new BlockPos(pos.getX() + random.nextInt(16), pos.getY(), pos.getZ() + random.nextInt(16))); if (!world.getBlockState(pos.below(5)).is(TagAPI.GEN_TERRAIN)) { return false; diff --git a/src/main/java/ru/betterend/world/features/terrain/OreLayerFeature.java b/src/main/java/ru/betterend/world/features/terrain/OreLayerFeature.java index 0bbb70ea..15348622 100644 --- a/src/main/java/ru/betterend/world/features/terrain/OreLayerFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/OreLayerFeature.java @@ -7,6 +7,7 @@ import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.bclib.sdf.SDF; import ru.bclib.sdf.operator.SDFCoordModify; @@ -35,8 +36,10 @@ public class OreLayerFeature extends DefaultFeature { } @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - NoneFeatureConfiguration config) { + public boolean place(FeaturePlaceContext featureConfig) { + Random random = featureConfig.random(); + BlockPos pos = featureConfig.origin(); + WorldGenLevel world = featureConfig.level(); float radius = this.radius * 0.5F; int r = MHelper.floor(radius + 1); int posX = MHelper.randRange(Math.max(r - 16, 0), Math.min(31 - r, 15), random) + pos.getX(); diff --git a/src/main/java/ru/betterend/world/features/terrain/SingleBlockFeature.java b/src/main/java/ru/betterend/world/features/terrain/SingleBlockFeature.java index 8fceba8d..87cc3f4b 100644 --- a/src/main/java/ru/betterend/world/features/terrain/SingleBlockFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/SingleBlockFeature.java @@ -8,6 +8,7 @@ import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.BlockStateProperties; import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.bclib.api.TagAPI; import ru.bclib.util.BlocksHelper; @@ -21,7 +22,10 @@ public class SingleBlockFeature extends DefaultFeature { } @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, NoneFeatureConfiguration config) { + public boolean place(FeaturePlaceContext featureConfig) { + Random random = featureConfig.random(); + BlockPos pos = featureConfig.origin(); + WorldGenLevel world = featureConfig.level(); if (!world.getBlockState(pos.below()).is(TagAPI.GEN_TERRAIN)) { return false; } diff --git a/src/main/java/ru/betterend/world/features/terrain/SmaragdantCrystalFeature.java b/src/main/java/ru/betterend/world/features/terrain/SmaragdantCrystalFeature.java index 447138b1..56749973 100644 --- a/src/main/java/ru/betterend/world/features/terrain/SmaragdantCrystalFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/SmaragdantCrystalFeature.java @@ -8,6 +8,7 @@ import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.BlockStateProperties; import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.bclib.api.TagAPI; import ru.bclib.util.BlocksHelper; @@ -17,8 +18,10 @@ import ru.betterend.registry.EndBlocks; public class SmaragdantCrystalFeature extends DefaultFeature { @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - NoneFeatureConfiguration config) { + public boolean place(FeaturePlaceContext featureConfig) { + Random random = featureConfig.random(); + BlockPos pos = featureConfig.origin(); + WorldGenLevel world = featureConfig.level(); if (!world.getBlockState(pos.below()).is(TagAPI.GEN_TERRAIN)) { return false; } diff --git a/src/main/java/ru/betterend/world/features/terrain/SpireFeature.java b/src/main/java/ru/betterend/world/features/terrain/SpireFeature.java index bf14a674..16d3d359 100644 --- a/src/main/java/ru/betterend/world/features/terrain/SpireFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/SpireFeature.java @@ -13,6 +13,7 @@ import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.LeavesBlock; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; import ru.bclib.api.BiomeAPI; @@ -32,8 +33,11 @@ public class SpireFeature extends DefaultFeature { protected static final Function REPLACE; @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - NoneFeatureConfiguration config) { + public boolean place(FeaturePlaceContext featureConfig) { + Random random = featureConfig.random(); + BlockPos pos = featureConfig.origin(); + WorldGenLevel world = featureConfig.level(); + ChunkGenerator chunkGenerator = featureConfig.chunkGenerator(); pos = getPosOnSurfaceWG(world, pos); if (pos.getY() < 10 || !world.getBlockState(pos.below(3)).is(TagAPI.GEN_TERRAIN) || !world.getBlockState(pos.below(6)).is(TagAPI.GEN_TERRAIN)) { @@ -68,7 +72,7 @@ public class SpireFeature extends DefaultFeature { support.forEach((bpos) -> { if (BiomeAPI.getFromBiome(world.getBiome(bpos)) == EndBiomes.BLOSSOMING_SPIRES) { - EndFeatures.TENANEA_BUSH.getFeature().place(world, chunkGenerator, random, bpos, null); + EndFeatures.TENANEA_BUSH.getFeature().place(new FeaturePlaceContext<>(world, chunkGenerator, random, bpos, null)); } }); diff --git a/src/main/java/ru/betterend/world/features/terrain/StalactiteFeature.java b/src/main/java/ru/betterend/world/features/terrain/StalactiteFeature.java index 06e5bcfb..5c6f1a01 100644 --- a/src/main/java/ru/betterend/world/features/terrain/StalactiteFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/StalactiteFeature.java @@ -10,6 +10,7 @@ import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.BlockStateProperties; import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.bclib.api.TagAPI; import ru.bclib.blocks.StalactiteBlock; @@ -28,8 +29,10 @@ public class StalactiteFeature extends DefaultFeature { } @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - NoneFeatureConfiguration config) { + public boolean place(FeaturePlaceContext featureConfig) { + Random random = featureConfig.random(); + BlockPos pos = featureConfig.origin(); + WorldGenLevel world = featureConfig.level(); if (!isGround(world.getBlockState(ceiling ? pos.above() : pos.below()).getBlock())) { return false; } diff --git a/src/main/java/ru/betterend/world/features/terrain/SulphurHillFeature.java b/src/main/java/ru/betterend/world/features/terrain/SulphurHillFeature.java index eefaf3e7..59c362ef 100644 --- a/src/main/java/ru/betterend/world/features/terrain/SulphurHillFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/SulphurHillFeature.java @@ -9,6 +9,7 @@ import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.bclib.blocks.BlockProperties; import ru.bclib.util.BlocksHelper; @@ -19,8 +20,10 @@ import ru.betterend.registry.EndBlocks; public class SulphurHillFeature extends DefaultFeature { @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - NoneFeatureConfiguration config) { + public boolean place(FeaturePlaceContext featureConfig) { + Random random = featureConfig.random(); + BlockPos pos = featureConfig.origin(); + WorldGenLevel world = featureConfig.level(); pos = getPosOnSurfaceWG(world, pos); if (pos.getY() < 57 || pos.getY() > 70) { return false; diff --git a/src/main/java/ru/betterend/world/features/terrain/SulphuricCaveFeature.java b/src/main/java/ru/betterend/world/features/terrain/SulphuricCaveFeature.java index a314095b..cbdd8e7c 100644 --- a/src/main/java/ru/betterend/world/features/terrain/SulphuricCaveFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/SulphuricCaveFeature.java @@ -14,6 +14,7 @@ import net.minecraft.world.level.block.HorizontalDirectionalBlock; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.Heightmap; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; import ru.bclib.api.TagAPI; @@ -32,8 +33,10 @@ public class SulphuricCaveFeature extends DefaultFeature { private static final Direction[] HORIZONTAL = BlocksHelper.makeHorizontal(); @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - NoneFeatureConfiguration config) { + public boolean place(FeaturePlaceContext featureConfig) { + Random random = featureConfig.random(); + BlockPos pos = featureConfig.origin(); + WorldGenLevel world = featureConfig.level(); int radius = MHelper.randRange(10, 30, random); int top = world.getHeight(Heightmap.Types.WORLD_SURFACE_WG, pos.getX(), pos.getZ()); From 20859ae133897b3ac10b8653c6e52eee0a6cb6f8 Mon Sep 17 00:00:00 2001 From: Frank Bauer Date: Thu, 24 Jun 2021 16:02:41 +0200 Subject: [PATCH 035/595] Updated `OldBulbisGardens` --- .../integration/byg/biomes/OldBulbisGardens.java | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/main/java/ru/betterend/integration/byg/biomes/OldBulbisGardens.java b/src/main/java/ru/betterend/integration/byg/biomes/OldBulbisGardens.java index 27bcd5a0..acea5a96 100644 --- a/src/main/java/ru/betterend/integration/byg/biomes/OldBulbisGardens.java +++ b/src/main/java/ru/betterend/integration/byg/biomes/OldBulbisGardens.java @@ -16,6 +16,8 @@ import net.minecraft.world.level.biome.MobSpawnSettings.SpawnerData; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.levelgen.GenerationStep.Decoration; import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; +import net.minecraft.world.level.levelgen.feature.Feature; +import net.minecraft.world.level.levelgen.placement.ConfiguredDecorator; import ru.bclib.BCLib; import ru.bclib.world.biomes.BCLBiomeDef; import ru.betterend.BetterEnd; @@ -24,6 +26,14 @@ import ru.betterend.integration.byg.features.BYGFeatures; import ru.betterend.registry.EndFeatures; import ru.betterend.world.biome.EndBiome; +class FeaturesAccesor extends Features{ + static ConfiguredDecorator shadowHEIGHTMAP_SQUARE; + + static { + shadowHEIGHTMAP_SQUARE = Decorators.HEIGHTMAP_SQUARE; + } +} + public class OldBulbisGardens extends EndBiome { public OldBulbisGardens() { super(makeDef()); @@ -54,7 +64,7 @@ public class OldBulbisGardens extends EndBiome { } for (MobCategory group: MobCategory.values()) { - List list = biome.getMobSettings().getMobs(group); + List list = biome.getMobSettings().getMobs(group).unwrap(); list.forEach((entry) -> { def.addMobSpawn(entry); }); @@ -70,7 +80,7 @@ public class OldBulbisGardens extends EndBiome { getter = vegetal.get(i); ConfiguredFeature feature = getter.get(); ResourceLocation id = BetterEnd.makeID("obg_feature_" + i); - feature = Registry.register(BuiltinRegistries.CONFIGURED_FEATURE, id, feature.decorated(Features.Decorators.HEIGHTMAP_SQUARE).countRandom(1)); + feature = Registry.register(BuiltinRegistries.CONFIGURED_FEATURE, id, feature.decorated(FeaturesAccesor.shadowHEIGHTMAP_SQUARE).countRandom(1)); def.addFeature(Decoration.VEGETAL_DECORATION, feature); } // Grasses and other features From fdd61262c558279248db584cf95b768005a62a49 Mon Sep 17 00:00:00 2001 From: Frank Bauer Date: Thu, 24 Jun 2021 16:03:04 +0200 Subject: [PATCH 036/595] TODOs and `WorldRenderMixin` Update --- .../mixin/client/WorldRendererMixin.java | 58 ++++++++++++------- .../betterend/registry/EndModelProviders.java | 1 + 2 files changed, 38 insertions(+), 21 deletions(-) diff --git a/src/main/java/ru/betterend/mixin/client/WorldRendererMixin.java b/src/main/java/ru/betterend/mixin/client/WorldRendererMixin.java index b24d3517..953d7053 100644 --- a/src/main/java/ru/betterend/mixin/client/WorldRendererMixin.java +++ b/src/main/java/ru/betterend/mixin/client/WorldRendererMixin.java @@ -2,6 +2,7 @@ package ru.betterend.mixin.client; import java.util.Random; +import com.mojang.math.Matrix4f; import org.lwjgl.opengl.GL11; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; @@ -92,7 +93,7 @@ public class WorldRendererMixin { } @Inject(method = "renderSky", at = @At("HEAD"), cancellable = true) - private void be_renderBetterEndSky(PoseStack matrices, float tickDelta, CallbackInfo info) { + private void be_renderBetterEndSky(PoseStack matrices, Matrix4f matrix4f, float tickDelta, Runnable runnable, CallbackInfo info) { if (ClientOptions.isCustomSky() && minecraft.level.effects().skyType() == DimensionSpecialEffects.SkyType.END) { time = (ticks % 360000) * 0.000017453292F; time2 = time * 2; @@ -108,8 +109,9 @@ public class WorldRendererMixin { RenderSystem.depthMask(false); } else { - RenderSystem.enableAlphaTest(); - RenderSystem.alphaFunc(516, 0.0F); + //TODO: Removed in 1.17 + //RenderSystem.enableAlphaTest(); + //RenderSystem.alphaFunc(516, 0.0F); RenderSystem.enableBlend(); } @@ -120,23 +122,27 @@ public class WorldRendererMixin { if (blindA > 0) { matrices.pushPose(); matrices.mulPose(new Quaternion(0, time, 0, false)); - textureManager.bind(HORIZON); + RenderSystem.setShaderTexture(0, HORIZON); + //textureManager.bind(HORIZON); be_renderBuffer(matrices, horizon, DefaultVertexFormat.POSITION_TEX, 0.77F, 0.31F, 0.73F, 0.7F * blindA); matrices.popPose(); matrices.pushPose(); matrices.mulPose(new Quaternion(0, -time, 0, false)); - textureManager.bind(NEBULA_1); + //textureManager.bind(NEBULA_1); + RenderSystem.setShaderTexture(0, NEBULA_1); be_renderBuffer(matrices, nebulas1, DefaultVertexFormat.POSITION_TEX, 0.77F, 0.31F, 0.73F, blind02); matrices.popPose(); matrices.pushPose(); matrices.mulPose(new Quaternion(0, time2, 0, false)); - textureManager.bind(NEBULA_2); + //textureManager.bind(NEBULA_2); + RenderSystem.setShaderTexture(0, NEBULA_2); be_renderBuffer(matrices, nebulas2, DefaultVertexFormat.POSITION_TEX, 0.77F, 0.31F, 0.73F, blind02); matrices.popPose(); - - textureManager.bind(STARS); + + //textureManager.bind(STARS); + RenderSystem.setShaderTexture(0, STARS); matrices.pushPose(); matrices.mulPose(axis3.rotation(time)); @@ -152,7 +158,8 @@ public class WorldRendererMixin { float a = (BackgroundInfo.fogDensity - 1F); if (a > 0) { if (a > 1) a = 1; - textureManager.bind(FOG); + RenderSystem.setShaderTexture(0, FOG); + //textureManager.bind(FOG); be_renderBuffer(matrices, fog, DefaultVertexFormat.POSITION_TEX, BackgroundInfo.fogColorRed, BackgroundInfo.fogColorGreen, BackgroundInfo.fogColorBlue, a); } @@ -178,10 +185,12 @@ public class WorldRendererMixin { } private void be_renderBuffer(PoseStack matrices, VertexBuffer buffer, VertexFormat format, float r, float g, float b, float a) { - RenderSystem.color4f(r, g, b, a); + RenderSystem.setShaderColor(r, g, b, a); buffer.bind(); - format.setupBufferState(0L); - buffer.draw(matrices.last().pose(), 7); + //format.setupBufferState(0L); + //buffer.draw(matrices.last().pose(), 7); + format.setupBufferState(); + buffer.draw(); VertexBuffer.unbind(); format.clearBufferState(); } @@ -203,7 +212,10 @@ public class WorldRendererMixin { buffer.close(); } - buffer = new VertexBuffer(DefaultVertexFormat.POSITION); + //TODO: Test if this is working correct + //Format is set in the DrawState + //buffer = new VertexBuffer(DefaultVertexFormat.POSITION); + buffer = new VertexBuffer(); be_makeStars(bufferBuilder, minSize, maxSize, count, seed); bufferBuilder.end(); buffer.upload(bufferBuilder); @@ -216,7 +228,8 @@ public class WorldRendererMixin { buffer.close(); } - buffer = new VertexBuffer(DefaultVertexFormat.POSITION_TEX); + // buffer = new VertexBuffer(DefaultVertexFormat.POSITION_TEX); + buffer = new VertexBuffer(); be_makeUVStars(bufferBuilder, minSize, maxSize, count, seed); bufferBuilder.end(); buffer.upload(bufferBuilder); @@ -229,7 +242,8 @@ public class WorldRendererMixin { buffer.close(); } - buffer = new VertexBuffer(DefaultVertexFormat.POSITION_TEX); + // buffer = new VertexBuffer(DefaultVertexFormat.POSITION_TEX); + buffer = new VertexBuffer(); be_makeFarFog(bufferBuilder, minSize, maxSize, count, seed); bufferBuilder.end(); buffer.upload(bufferBuilder); @@ -242,7 +256,8 @@ public class WorldRendererMixin { buffer.close(); } - buffer = new VertexBuffer(DefaultVertexFormat.POSITION_TEX); + // buffer = new VertexBuffer(DefaultVertexFormat.POSITION_TEX); + buffer = new VertexBuffer(); be_makeCylinder(bufferBuilder, 16, 50, 100); bufferBuilder.end(); buffer.upload(bufferBuilder); @@ -255,7 +270,8 @@ public class WorldRendererMixin { buffer.close(); } - buffer = new VertexBuffer(DefaultVertexFormat.POSITION_TEX); + // buffer = new VertexBuffer(DefaultVertexFormat.POSITION_TEX); + buffer = new VertexBuffer(); be_makeCylinder(bufferBuilder, 16, 50, 70); bufferBuilder.end(); buffer.upload(bufferBuilder); @@ -265,7 +281,7 @@ public class WorldRendererMixin { private void be_makeStars(BufferBuilder buffer, double minSize, double maxSize, int count, long seed) { Random random = new Random(seed); - buffer.begin(7, DefaultVertexFormat.POSITION); + buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION); for (int i = 0; i < count; ++i) { double posX = random.nextDouble() * 2.0 - 1.0; @@ -308,7 +324,7 @@ public class WorldRendererMixin { private void be_makeUVStars(BufferBuilder buffer, double minSize, double maxSize, int count, long seed) { Random random = new Random(seed); - buffer.begin(7, DefaultVertexFormat.POSITION_TEX); + buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX); for (int i = 0; i < count; ++i) { double posX = random.nextDouble() * 2.0 - 1.0; @@ -356,7 +372,7 @@ public class WorldRendererMixin { private void be_makeFarFog(BufferBuilder buffer, double minSize, double maxSize, int count, long seed) { Random random = new Random(seed); - buffer.begin(7, DefaultVertexFormat.POSITION_TEX); + buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX); for (int i = 0; i < count; ++i) { double posX = random.nextDouble() * 2.0 - 1.0; @@ -406,7 +422,7 @@ public class WorldRendererMixin { } private void be_makeCylinder(BufferBuilder buffer, int segments, double height, double radius) { - buffer.begin(7, DefaultVertexFormat.POSITION_TEX); + buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX); for (int i = 0; i < segments; i ++) { double a1 = (double) i * Math.PI * 2.0 / (double) segments; double a2 = (double) (i + 1) * Math.PI * 2.0 / (double) segments; diff --git a/src/main/java/ru/betterend/registry/EndModelProviders.java b/src/main/java/ru/betterend/registry/EndModelProviders.java index c9d2d3e5..f0a4e35b 100644 --- a/src/main/java/ru/betterend/registry/EndModelProviders.java +++ b/src/main/java/ru/betterend/registry/EndModelProviders.java @@ -10,6 +10,7 @@ public class EndModelProviders { public final static CrystaliteArmorProvider CRYSTALITE_PROVIDER = new CrystaliteArmorProvider(); public final static void register() { + //TODO: Needs Fix in 1.17 throw new RuntimeException("Needs Fix for 1.17"); //ArmorRenderingRegistry.registerModel(CRYSTALITE_PROVIDER, CRYSTALITE_PROVIDER.getRenderedItems()); //ArmorRenderingRegistry.registerTexture(CRYSTALITE_PROVIDER, CRYSTALITE_PROVIDER.getRenderedItems()); From 10a9a817252a83c32d42b93fde92ae834f00d286 Mon Sep 17 00:00:00 2001 From: Frank Bauer Date: Thu, 24 Jun 2021 17:11:48 +0200 Subject: [PATCH 037/595] Various smaller updates --- Convert.java | 27 ++++-- .../client/render/PedestalItemRenderer.java | 2 +- .../byg/features/BigEtherTreeFeature.java | 6 +- .../NightshadeRedwoodTreeFeature.java | 9 +- .../byg/features/OldBulbisTreeFeature.java | 6 +- .../java/ru/betterend/item/ArmoredElytra.java | 2 +- .../ru/betterend/item/CrystaliteElytra.java | 2 +- .../item/model/CrystaliteArmorProvider.java | 4 +- .../item/model/CrystaliteChestplateModel.java | 89 ++++++++++++++----- .../mixin/common/ChorusPlantFeatureMixin.java | 20 +++-- .../mixin/common/EndPodiumFeatureMixin.java | 36 ++++---- .../betterend/mixin/common/EntityMixin.java | 19 ++-- .../registry/EndEntitiesRenders.java | 5 ++ .../world/features/BiomeIslandFeature.java | 4 +- .../world/features/CavePumpkinFeature.java | 6 +- .../world/features/CrashedShipFeature.java | 4 +- .../features/FullHeightScatterFeature.java | 6 +- .../features/InvertedScatterFeature.java | 6 +- .../world/features/NeonCactusFeature.java | 6 +- .../world/features/ScatterFeature.java | 4 +- .../world/features/SilkMothNestFeature.java | 6 +- .../world/features/WallScatterFeature.java | 6 +- .../world/features/bushes/BushFeature.java | 6 +- .../features/bushes/BushWithOuterFeature.java | 6 +- .../bushes/LargeAmaranitaFeature.java | 6 +- .../world/features/bushes/Lumecorn.java | 6 +- .../features/bushes/TenaneaBushFeature.java | 6 +- .../terrain/BigAuroraCrystalFeature.java | 4 +- .../features/terrain/DesertLakeFeature.java | 4 +- .../features/terrain/EndLakeFeature.java | 6 +- .../features/terrain/FallenPillarFeature.java | 4 +- .../terrain/FloatingSpireFeature.java | 6 +- .../features/terrain/IceStarFeature.java | 4 +- .../terrain/ObsidianBoulderFeature.java | 4 +- .../ObsidianPillarBasementFeature.java | 4 +- .../features/terrain/OreLayerFeature.java | 6 +- .../features/terrain/SingleBlockFeature.java | 6 +- .../terrain/SmaragdantCrystalFeature.java | 6 +- .../world/features/terrain/SpireFeature.java | 6 +- .../features/terrain/StalactiteFeature.java | 6 +- .../features/terrain/SulphurHillFeature.java | 4 +- .../terrain/SulphuricCaveFeature.java | 4 +- .../terrain/SulphuricLakeFeature.java | 15 ++-- .../features/terrain/SurfaceVentFeature.java | 12 +-- .../caves/CaveChunkPopulatorFeature.java | 10 ++- .../terrain/caves/EndCaveFeature.java | 20 +++-- .../terrain/caves/TunelCaveFeature.java | 22 ++--- .../features/trees/DragonTreeFeature.java | 9 +- .../trees/GiganticAmaranitaFeature.java | 9 +- .../features/trees/HelixTreeFeature.java | 9 +- .../features/trees/JellyshroomFeature.java | 9 +- .../features/trees/LacugroveFeature.java | 7 +- .../world/features/trees/LucerniaFeature.java | 26 +++--- .../trees/MossyGlowshroomFeature.java | 27 +++--- .../trees/PythadendronTreeFeature.java | 16 ++-- .../world/features/trees/TenaneaFeature.java | 25 +++--- .../features/trees/UmbrellaTreeFeature.java | 28 +++--- .../world/structures/piece/CavePiece.java | 2 +- .../piece/CrystalMountainPiece.java | 5 +- .../world/structures/piece/LakePiece.java | 2 +- .../world/structures/piece/MountainPiece.java | 6 +- .../world/structures/piece/NBTPiece.java | 2 +- .../piece/PaintedMountainPiece.java | 4 +- .../world/structures/piece/VoxelPiece.java | 4 +- 64 files changed, 372 insertions(+), 276 deletions(-) diff --git a/Convert.java b/Convert.java index 15ff66c6..58b4420c 100644 --- a/Convert.java +++ b/Convert.java @@ -119,10 +119,27 @@ public class Convert { p.setRotationAngle(x, y, z); } public void c (){ - ModelPart leftWing = new ModelPart(this, 22, 0, "leftWing"); - leftWing.addBox(-10.0F, 0.0F, 0.0F, 10.0F, 20.0F, 2.0F, 1.0F); - ModelPart rightWing = new ModelPart(this, 22, 0, "rightWing"); - rightWing.mirror = true; - rightWing.addBox(0.0F, 0.0F, 0.0F, 10.0F, 20.0F, 2.0F, 1.0F); + boolean thinArms = true; + float scale = 0; + ModelPart body = new ModelPart(this, 16, 16, "body"); + body.addBox(-4.0F, 0.0F, -2.0F, 8.0F, 12.0F, 4.0F, scale + 0.25F); + body.setPos(0.0F, 0.0F, 0.0F); + if (thinArms) { + ModelPart leftShoulder = new ModelPart(this, 41, 32, "leftShoulder"); + leftShoulder.addBox(-1.0F, -2.5F, -2.0F, 3.0F, 12.0F, 4.0F, scale + 0.35F); + leftShoulder.setPos(5.0F, 2.5F, 0.0F); + leftShoulder.mirror = true; + ModelPart rightShoulder = new ModelPart(this, 41, 16, "rightShoulder"); + rightShoulder.addBox(-2.0F, -2.5F, -2.0F, 3.0F, 12.0F, 4.0F, scale + 0.35F); + rightShoulder.setPos(-5.0F, 2.5F, 10.0F); + } else { + ModelPart leftShoulder = new ModelPart(this, 40, 32, "leftShoulder"); + leftShoulder.addBox(-1.0F, -2.5F, -2.0F, 4.0F, 12.0F, 4.0F, scale + 0.45F); + leftShoulder.setPos(5.0F, 2.0F, 0.0F); + leftShoulder.mirror = true; + ModelPart rightShoulder = new ModelPart(this, 40, 16, "rightShoulder"); + rightShoulder.addBox(-3.0F, -2.5F, -2.0F, 4.0F, 12.0F, 4.0F, scale + 0.45F); + rightShoulder.setPos(-5.0F, 2.0F, 10.0F); + } } } diff --git a/src/main/java/ru/betterend/client/render/PedestalItemRenderer.java b/src/main/java/ru/betterend/client/render/PedestalItemRenderer.java index 1002bb3d..94c4e175 100644 --- a/src/main/java/ru/betterend/client/render/PedestalItemRenderer.java +++ b/src/main/java/ru/betterend/client/render/PedestalItemRenderer.java @@ -27,7 +27,7 @@ import ru.betterend.registry.EndItems; public class PedestalItemRenderer implements BlockEntityRenderer { public PedestalItemRenderer(BlockEntityRenderDispatcher dispatcher) { - super(dispatcher); + super(); } @Override diff --git a/src/main/java/ru/betterend/integration/byg/features/BigEtherTreeFeature.java b/src/main/java/ru/betterend/integration/byg/features/BigEtherTreeFeature.java index 4bf26f6f..83ccf491 100644 --- a/src/main/java/ru/betterend/integration/byg/features/BigEtherTreeFeature.java +++ b/src/main/java/ru/betterend/integration/byg/features/BigEtherTreeFeature.java @@ -23,9 +23,9 @@ import ru.betterend.integration.Integrations; public class BigEtherTreeFeature extends DefaultFeature { @Override public boolean place(FeaturePlaceContext featureConfig) { - Random random = featureConfig.random(); - BlockPos pos = featureConfig.origin(); - WorldGenLevel world = featureConfig.level(); + final Random random = featureConfig.random(); + final BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); if (!world.getBlockState(pos.below()).is(TagAPI.END_GROUND)) return false; diff --git a/src/main/java/ru/betterend/integration/byg/features/NightshadeRedwoodTreeFeature.java b/src/main/java/ru/betterend/integration/byg/features/NightshadeRedwoodTreeFeature.java index 43cd3689..2ae7f845 100644 --- a/src/main/java/ru/betterend/integration/byg/features/NightshadeRedwoodTreeFeature.java +++ b/src/main/java/ru/betterend/integration/byg/features/NightshadeRedwoodTreeFeature.java @@ -15,6 +15,7 @@ import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.LeavesBlock; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; import ru.bclib.api.TagAPI; @@ -35,9 +36,11 @@ public class NightshadeRedwoodTreeFeature extends DefaultFeature { private static final List BRANCH; @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - NoneFeatureConfiguration config) { - if (!world.getBlockState(pos.below()).getBlock().is(TagAPI.END_GROUND)) + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + final BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); + if (!world.getBlockState(pos.below()).is(TagAPI.END_GROUND)) return false; BlockState log = Integrations.BYG.getDefaultState("nightshade_log"); diff --git a/src/main/java/ru/betterend/integration/byg/features/OldBulbisTreeFeature.java b/src/main/java/ru/betterend/integration/byg/features/OldBulbisTreeFeature.java index 265c46fc..1d4c7999 100644 --- a/src/main/java/ru/betterend/integration/byg/features/OldBulbisTreeFeature.java +++ b/src/main/java/ru/betterend/integration/byg/features/OldBulbisTreeFeature.java @@ -38,9 +38,9 @@ public class OldBulbisTreeFeature extends DefaultFeature { @Override public boolean place(FeaturePlaceContext featureConfig) { - Random random = featureConfig.random(); - BlockPos pos = featureConfig.origin(); - WorldGenLevel world = featureConfig.level(); + final Random random = featureConfig.random(); + final BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); if (!world.getBlockState(pos.below()).is(TagAPI.END_GROUND)) return false; if (!world.getBlockState(pos.below(4)).is(TagAPI.GEN_TERRAIN)) diff --git a/src/main/java/ru/betterend/item/ArmoredElytra.java b/src/main/java/ru/betterend/item/ArmoredElytra.java index b1953792..1e163318 100644 --- a/src/main/java/ru/betterend/item/ArmoredElytra.java +++ b/src/main/java/ru/betterend/item/ArmoredElytra.java @@ -71,6 +71,6 @@ public class ArmoredElytra extends BaseArmorItem implements MultiModelItem, Fall @Environment(EnvType.CLIENT) public void registerModelPredicate() { FabricModelPredicateProviderRegistry.register(this, new ResourceLocation("broken"), - (itemStack, clientLevel, livingEntity) -> ElytraItem.isFlyEnabled(itemStack) ? 0.0F : 1.0F); + (itemStack, clientLevel, livingEntity, id) -> ElytraItem.isFlyEnabled(itemStack) ? 0.0F : 1.0F); } } diff --git a/src/main/java/ru/betterend/item/CrystaliteElytra.java b/src/main/java/ru/betterend/item/CrystaliteElytra.java index 489eaf3f..a8995c5a 100644 --- a/src/main/java/ru/betterend/item/CrystaliteElytra.java +++ b/src/main/java/ru/betterend/item/CrystaliteElytra.java @@ -63,6 +63,6 @@ public class CrystaliteElytra extends CrystaliteArmor implements MultiModelItem, @Override public void registerModelPredicate() { FabricModelPredicateProviderRegistry.register(this, new ResourceLocation("broken"), - (itemStack, clientLevel, livingEntity) -> ElytraItem.isFlyEnabled(itemStack) ? 0.0F : 1.0F); + (itemStack, clientLevel, livingEntity, i) -> ElytraItem.isFlyEnabled(itemStack) ? 0.0F : 1.0F); } } diff --git a/src/main/java/ru/betterend/item/model/CrystaliteArmorProvider.java b/src/main/java/ru/betterend/item/model/CrystaliteArmorProvider.java index 1bba7c04..01442190 100644 --- a/src/main/java/ru/betterend/item/model/CrystaliteArmorProvider.java +++ b/src/main/java/ru/betterend/item/model/CrystaliteArmorProvider.java @@ -22,8 +22,8 @@ public class CrystaliteArmorProvider /*implements ModelProvider, TextureProvider private final static ResourceLocation FIRST_LAYER = new ResourceLocation("textures/models/armor/crystalite_layer_1.png"); private final static ResourceLocation SECOND_LAYER = new ResourceLocation("textures/models/armor/crystalite_layer_2.png"); private final static CrystaliteHelmetModel HELMET_MODEL = new CrystaliteHelmetModel(1.0F); - private final static CrystaliteChestplateModel CHEST_MODEL = new CrystaliteChestplateModel(1.0F, false); - private final static CrystaliteChestplateModel CHEST_MODEL_SLIM = new CrystaliteChestplateModel(1.0F, true); + private final static CrystaliteChestplateModel CHEST_MODEL = CrystaliteChestplateModel.regularModel(null); + private final static CrystaliteChestplateModel CHEST_MODEL_SLIM = CrystaliteChestplateModel.thinModel(null); private final static CrystaliteLeggingsModel LEGGINGS_MODEL = new CrystaliteLeggingsModel(1.0F); private final static CrystaliteBootsModel BOOTS_MODEL = new CrystaliteBootsModel(1.0F); diff --git a/src/main/java/ru/betterend/item/model/CrystaliteChestplateModel.java b/src/main/java/ru/betterend/item/model/CrystaliteChestplateModel.java index 1942f9d6..dc4b673b 100644 --- a/src/main/java/ru/betterend/item/model/CrystaliteChestplateModel.java +++ b/src/main/java/ru/betterend/item/model/CrystaliteChestplateModel.java @@ -6,40 +6,85 @@ import com.google.common.collect.Lists; import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.model.geom.EntityModelSet; import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartNames; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.*; import net.minecraft.client.renderer.RenderType; import net.minecraft.world.entity.HumanoidArm; import net.minecraft.world.entity.LivingEntity; +import ru.betterend.registry.EndEntitiesRenders; public class CrystaliteChestplateModel extends HumanoidModel { public ModelPart leftShoulder; public ModelPart rightShoulder; private final boolean thinArms; - - public CrystaliteChestplateModel(float scale, boolean thinArms) { - super(RenderType::entityTranslucent, scale, 0.0F, 64, 48); - this.thinArms = thinArms; - this.body = new ModelPart(this, 16, 16); - this.body.addBox(-4.0F, 0.0F, -2.0F, 8.0F, 12.0F, 4.0F, scale + 0.25F); - this.body.setPos(0.0F, 0.0F, 0.0F); + + public static LayerDefinition getRegularTexturedModelData(){ + return getTexturedModelData(1.0f, false); + } + + public static LayerDefinition getThinTexturedModelData(){ + return getTexturedModelData(1.0f, true); + } + + private static LayerDefinition getTexturedModelData(float scale, boolean thinArms) { + MeshDefinition modelData = new MeshDefinition(); + PartDefinition modelPartData = modelData.getRoot(); + CubeDeformation deformation = new CubeDeformation(scale + 0.25F); + PartDefinition body = modelPartData.addOrReplaceChild(PartNames.BODY, CubeListBuilder.create() + .addBox(-4.0f, 0.0f, -2.0f, 8.0f, 12.0f, 4.0f, deformation) + .texOffs(16, 16), + PartPose.ZERO); + if (thinArms) { - this.leftShoulder = new ModelPart(this, 41, 32); - this.leftShoulder.addBox(-1.0F, -2.5F, -2.0F, 3.0F, 12.0F, 4.0F, scale + 0.35F); - this.leftShoulder.setPos(5.0F, 2.5F, 0.0F); - this.leftShoulder.mirror = true; - this.rightShoulder = new ModelPart(this, 41, 16); - this.rightShoulder.addBox(-2.0F, -2.5F, -2.0F, 3.0F, 12.0F, 4.0F, scale + 0.35F); - this.rightShoulder.setPos(-5.0F, 2.5F, 10.0F); + deformation = new CubeDeformation(scale + 0.45F); + PartDefinition leftShoulder = modelPartData.addOrReplaceChild("leftShoulder", CubeListBuilder.create() + .mirror() + .addBox(-1.0f, -2.5f, -2.0f, 4.0f, 12.0f, 4.0f, deformation) + .texOffs(40, 32), + PartPose.offset(5.0f, 2.0f, 0.0f)); + + PartDefinition rightShoulder = modelPartData.addOrReplaceChild("rightShoulder", CubeListBuilder.create() + .addBox(-3.0f, -2.5f, -2.0f, 4.0f, 12.0f, 4.0f, deformation) + .texOffs(40, 16), + PartPose.offset(-5.0f, 2.0f, 10.0f)); } else { - this.leftShoulder = new ModelPart(this, 40, 32); - this.leftShoulder.addBox(-1.0F, -2.5F, -2.0F, 4.0F, 12.0F, 4.0F, scale + 0.45F); - this.leftShoulder.setPos(5.0F, 2.0F, 0.0F); - this.leftShoulder.mirror = true; - this.rightShoulder = new ModelPart(this, 40, 16); - this.rightShoulder.addBox(-3.0F, -2.5F, -2.0F, 4.0F, 12.0F, 4.0F, scale + 0.45F); - this.rightShoulder.setPos(-5.0F, 2.0F, 10.0F); + deformation = new CubeDeformation(scale + 0.45F); + PartDefinition leftShoulder = modelPartData.addOrReplaceChild("leftShoulder", CubeListBuilder.create() + .mirror() + .addBox(-1.0f, -2.5f, -2.0f, 4.0f, 12.0f, 4.0f, deformation) + .texOffs(40, 32), + PartPose.offset(5.0f, 2.0f, 0.0f)); + + PartDefinition rightShoulder = modelPartData.addOrReplaceChild("rightShoulder", CubeListBuilder.create() + .addBox(-3.0f, -2.5f, -2.0f, 4.0f, 12.0f, 4.0f, deformation) + .texOffs(40, 16), + PartPose.offset(-5.0f, 2.0f, 10.0f)); } + return LayerDefinition.create(modelData, 64, 48); + } + + final ModelPart localBody; + + public static CrystaliteChestplateModel regularModel(EntityModelSet entityModelSet){ + if (entityModelSet==null) throw new RuntimeException("Need to get a ModelSet"); + return new CrystaliteChestplateModel(entityModelSet.bakeLayer(EndEntitiesRenders.CRYSTALITE_CHESTPLATE), false); + } + + public static CrystaliteChestplateModel thinModel(EntityModelSet entityModelSet){ + if (entityModelSet==null) throw new RuntimeException("Need to get a ModelSet"); + return new CrystaliteChestplateModel(entityModelSet.bakeLayer(EndEntitiesRenders.CRYSTALITE_CHESTPLATE_THIN), true); + } + + protected CrystaliteChestplateModel(ModelPart modelPart, boolean thinArms) { + super(modelPart, RenderType::entityTranslucent); + this.thinArms = thinArms; + localBody = modelPart.getChild(PartNames.BODY); + leftShoulder = modelPart.getChild("leftShoulder"); + rightShoulder = modelPart.getChild("rightShoulder"); } @Override @@ -56,7 +101,7 @@ public class CrystaliteChestplateModel extends HumanoidModel { @Override protected Iterable bodyParts() { - return Lists.newArrayList(body, leftShoulder, rightShoulder); + return Lists.newArrayList(localBody, leftShoulder, rightShoulder); } @Override diff --git a/src/main/java/ru/betterend/mixin/common/ChorusPlantFeatureMixin.java b/src/main/java/ru/betterend/mixin/common/ChorusPlantFeatureMixin.java index 044538ce..61974050 100644 --- a/src/main/java/ru/betterend/mixin/common/ChorusPlantFeatureMixin.java +++ b/src/main/java/ru/betterend/mixin/common/ChorusPlantFeatureMixin.java @@ -1,31 +1,33 @@ package ru.betterend.mixin.common; -import java.util.Random; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.ChorusFlowerBlock; import net.minecraft.world.level.block.PipeBlock; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.feature.ChorusPlantFeature; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import ru.bclib.util.BlocksHelper; import ru.bclib.util.MHelper; import ru.betterend.blocks.VanillaBlockProperties; import ru.betterend.registry.EndBlocks; import ru.betterend.world.generator.GeneratorOptions; +import java.util.Random; + @Mixin(ChorusPlantFeature.class) public class ChorusPlantFeatureMixin { @Inject(method = "place", at = @At("HEAD"), cancellable = true) - private void be_place(WorldGenLevel structureWorldAccess, ChunkGenerator chunkGenerator, Random random, BlockPos blockPos, NoneFeatureConfiguration defaultFeatureConfig, CallbackInfoReturnable info) { + private void be_place(FeaturePlaceContext featureConfig, CallbackInfoReturnable info) { + final Random random = featureConfig.random(); + final BlockPos blockPos = featureConfig.origin(); + final WorldGenLevel structureWorldAccess = featureConfig.level(); if (structureWorldAccess.isEmptyBlock(blockPos) && structureWorldAccess.getBlockState(blockPos.below()).is(EndBlocks.CHORUS_NYLIUM)) { ChorusFlowerBlock.generatePlant(structureWorldAccess, blockPos, random, MHelper.randRange(8, 16, random)); BlockState bottom = structureWorldAccess.getBlockState(blockPos); diff --git a/src/main/java/ru/betterend/mixin/common/EndPodiumFeatureMixin.java b/src/main/java/ru/betterend/mixin/common/EndPodiumFeatureMixin.java index 20c73a27..33bcf523 100644 --- a/src/main/java/ru/betterend/mixin/common/EndPodiumFeatureMixin.java +++ b/src/main/java/ru/betterend/mixin/common/EndPodiumFeatureMixin.java @@ -1,7 +1,16 @@ package ru.betterend.mixin.common; -import java.util.Random; - +import net.minecraft.core.BlockPos; +import net.minecraft.core.Vec3i; +import net.minecraft.nbt.NbtUtils; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.chunk.ChunkStatus; +import net.minecraft.world.level.levelgen.Heightmap.Types; +import net.minecraft.world.level.levelgen.feature.EndPodiumFeature; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructurePlaceSettings; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -9,22 +18,13 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.ModifyVariable; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -import net.minecraft.core.BlockPos; -import net.minecraft.nbt.NbtUtils; -import net.minecraft.world.level.WorldGenLevel; -import net.minecraft.world.level.chunk.ChunkGenerator; -import net.minecraft.world.level.chunk.ChunkStatus; -import net.minecraft.world.level.levelgen.Heightmap.Types; -import net.minecraft.world.level.levelgen.feature.EndPodiumFeature; -import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; -import net.minecraft.world.level.levelgen.structure.templatesystem.StructurePlaceSettings; -import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate; import ru.bclib.api.WorldDataAPI; import ru.bclib.util.StructureHelper; import ru.betterend.BetterEnd; import ru.betterend.world.generator.GeneratorOptions; +import java.util.Random; + @Mixin(EndPodiumFeature.class) public class EndPodiumFeatureMixin { @Final @@ -32,17 +32,19 @@ public class EndPodiumFeatureMixin { private boolean active; @Inject(method = "place", at = @At("HEAD"), cancellable = true) - private void be_place(WorldGenLevel world, ChunkGenerator generator, Random random, BlockPos blockPos, NoneFeatureConfiguration config, CallbackInfoReturnable info) { + private void be_place(FeaturePlaceContext featurePlaceContext, CallbackInfoReturnable info) { if (!GeneratorOptions.hasPortal()) { info.setReturnValue(false); info.cancel(); } else if (GeneratorOptions.replacePortal()) { - blockPos = be_updatePos(blockPos, world); + Random random = featurePlaceContext.random(); + WorldGenLevel world = featurePlaceContext.level(); + BlockPos blockPos = be_updatePos(featurePlaceContext.origin(), world); StructureTemplate structure = StructureHelper.readStructure(BetterEnd.makeID(active ? "portal/end_portal_active" : "portal/end_portal_inactive")); - BlockPos size = structure.getSize(); + Vec3i size = structure.getSize(); blockPos = blockPos.offset(-(size.getX() >> 1), -1, -(size.getZ() >> 1)); - structure.placeInWorldChunk(world, blockPos, new StructurePlaceSettings(), random); + structure.placeInWorld(world, blockPos, blockPos, new StructurePlaceSettings(), random, 2); info.setReturnValue(true); info.cancel(); } diff --git a/src/main/java/ru/betterend/mixin/common/EntityMixin.java b/src/main/java/ru/betterend/mixin/common/EntityMixin.java index 4f9372b8..6504ed98 100644 --- a/src/main/java/ru/betterend/mixin/common/EntityMixin.java +++ b/src/main/java/ru/betterend/mixin/common/EntityMixin.java @@ -22,8 +22,7 @@ public abstract class EntityMixin implements TeleportingEntity { public float yRot; @Shadow public float xRot; - @Shadow - public boolean removed; + @Shadow public Level level; @@ -40,11 +39,16 @@ public abstract class EntityMixin implements TeleportingEntity { @Shadow protected abstract PortalInfo findDimensionEntryPoint(ServerLevel destination); + @Shadow + protected abstract void removeAfterChangingDimensions(); + + @Shadow public abstract boolean isRemoved(); + private BlockPos exitPos; @Inject(method = "changeDimension", at = @At("HEAD"), cancellable = true) public void be_changeDimension(ServerLevel destination, CallbackInfoReturnable info) { - if (!removed && be_canTeleport() && level instanceof ServerLevel) { + if (!isRemoved() && be_canTeleport() && level instanceof ServerLevel) { unRide(); level.getProfiler().push("changeDimension"); level.getProfiler().push("reposition"); @@ -54,11 +58,14 @@ public abstract class EntityMixin implements TeleportingEntity { Entity entity = getType().create(destination); if (entity != null) { entity.restoreFrom(Entity.class.cast(this)); - entity.moveTo(teleportTarget.pos.x, teleportTarget.pos.y, teleportTarget.pos.z, teleportTarget.yRot, entity.xRot); + entity.moveTo(teleportTarget.pos.x, teleportTarget.pos.y, teleportTarget.pos.z, teleportTarget.yRot, entity.getXRot()); entity.setDeltaMovement(teleportTarget.speed); - destination.addFromAnotherDimension(entity); + //TODO: check if this works as intended in 1.17 + + destination.addDuringTeleport(entity); } - removed = true; + + this.removeAfterChangingDimensions(); level.getProfiler().pop(); ((ServerLevel) level).resetEmptyTime(); destination.resetEmptyTime(); diff --git a/src/main/java/ru/betterend/registry/EndEntitiesRenders.java b/src/main/java/ru/betterend/registry/EndEntitiesRenders.java index 96b35fe2..e2920b67 100644 --- a/src/main/java/ru/betterend/registry/EndEntitiesRenders.java +++ b/src/main/java/ru/betterend/registry/EndEntitiesRenders.java @@ -15,6 +15,7 @@ import ru.betterend.entity.render.RendererEntityEndSlime; import ru.betterend.entity.render.RendererEntityShadowWalker; import ru.betterend.entity.render.SilkMothEntityRenderer; import ru.betterend.item.model.ArmoredElytraModel; +import ru.betterend.item.model.CrystaliteChestplateModel; public class EndEntitiesRenders { @@ -27,6 +28,8 @@ public class EndEntitiesRenders { //Not sure if this should go to another registry public static final ModelLayerLocation ARMORED_ELYTRA = registerMain("armored_elytra"); + public static final ModelLayerLocation CRYSTALITE_CHESTPLATE = registerMain("crystalite_chestplate"); + public static final ModelLayerLocation CRYSTALITE_CHESTPLATE_THIN = registerMain("crystalite_chestplate_thin"); public static void register() { register(EndEntities.DRAGONFLY, RendererEntityDragonfly.class); @@ -44,6 +47,8 @@ public class EndEntitiesRenders { EntityModelLayerRegistry.registerModelLayer(SILK_MOTH_MODEL, SilkMothEntityModel::getTexturedModelData); EntityModelLayerRegistry.registerModelLayer(ARMORED_ELYTRA, ArmoredElytraModel::getTexturedModelData); + EntityModelLayerRegistry.registerModelLayer(CRYSTALITE_CHESTPLATE, CrystaliteChestplateModel::getRegularTexturedModelData); + EntityModelLayerRegistry.registerModelLayer(CRYSTALITE_CHESTPLATE_THIN, CrystaliteChestplateModel::getThinTexturedModelData); } private static void register(EntityType type, Class> renderer) { diff --git a/src/main/java/ru/betterend/world/features/BiomeIslandFeature.java b/src/main/java/ru/betterend/world/features/BiomeIslandFeature.java index 91e5ccd5..d8e9f498 100644 --- a/src/main/java/ru/betterend/world/features/BiomeIslandFeature.java +++ b/src/main/java/ru/betterend/world/features/BiomeIslandFeature.java @@ -31,8 +31,8 @@ public class BiomeIslandFeature extends DefaultFeature { @Override public boolean place(FeaturePlaceContext featureConfig) { - BlockPos pos = featureConfig.origin(); - WorldGenLevel world = featureConfig.level(); + final BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); Biome biome = world.getBiome(pos); SurfaceBuilderConfiguration surfaceConfig = biome.getGenerationSettings().getSurfaceBuilderConfig(); BlockState topMaterial = surfaceConfig.getTopMaterial(); diff --git a/src/main/java/ru/betterend/world/features/CavePumpkinFeature.java b/src/main/java/ru/betterend/world/features/CavePumpkinFeature.java index c0fb60d3..945f427d 100644 --- a/src/main/java/ru/betterend/world/features/CavePumpkinFeature.java +++ b/src/main/java/ru/betterend/world/features/CavePumpkinFeature.java @@ -16,9 +16,9 @@ import ru.betterend.registry.EndBlocks; public class CavePumpkinFeature extends DefaultFeature { @Override public boolean place(FeaturePlaceContext featureConfig) { - Random random = featureConfig.random(); - BlockPos pos = featureConfig.origin(); - WorldGenLevel world = featureConfig.level(); + final Random random = featureConfig.random(); + final BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); if (!world.getBlockState(pos.above()).is(TagAPI.GEN_TERRAIN) || !world.isEmptyBlock(pos) || !world.isEmptyBlock(pos.below())) { return false; diff --git a/src/main/java/ru/betterend/world/features/CrashedShipFeature.java b/src/main/java/ru/betterend/world/features/CrashedShipFeature.java index a0f92fad..097db624 100644 --- a/src/main/java/ru/betterend/world/features/CrashedShipFeature.java +++ b/src/main/java/ru/betterend/world/features/CrashedShipFeature.java @@ -77,9 +77,9 @@ public class CrashedShipFeature extends NBTStructureFeature { @Override public boolean place(FeaturePlaceContext featureConfig) { - Random random = featureConfig.random(); + final Random random = featureConfig.random(); BlockPos center = featureConfig.origin(); - WorldGenLevel world = featureConfig.level(); + final WorldGenLevel world = featureConfig.level(); center = new BlockPos(((center.getX() >> 4) << 4) | 8, 128, ((center.getZ() >> 4) << 4) | 8); center = getGround(world, center); BoundingBox bounds = makeBox(center); diff --git a/src/main/java/ru/betterend/world/features/FullHeightScatterFeature.java b/src/main/java/ru/betterend/world/features/FullHeightScatterFeature.java index 7e47884d..9f506a10 100644 --- a/src/main/java/ru/betterend/world/features/FullHeightScatterFeature.java +++ b/src/main/java/ru/betterend/world/features/FullHeightScatterFeature.java @@ -28,9 +28,9 @@ public abstract class FullHeightScatterFeature extends DefaultFeature { @Override public boolean place(FeaturePlaceContext featureConfig) { - Random random = featureConfig.random(); - BlockPos center = featureConfig.origin(); - WorldGenLevel world = featureConfig.level(); + final Random random = featureConfig.random(); + final BlockPos center = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); int maxY = world.getHeight(Heightmap.Types.WORLD_SURFACE_WG, center.getX(), center.getZ()); int minY = BlocksHelper.upRay(world, new BlockPos(center.getX(), 0, center.getZ()), maxY); for (int y = maxY; y > minY; y--) { diff --git a/src/main/java/ru/betterend/world/features/InvertedScatterFeature.java b/src/main/java/ru/betterend/world/features/InvertedScatterFeature.java index 404a4755..93362b72 100644 --- a/src/main/java/ru/betterend/world/features/InvertedScatterFeature.java +++ b/src/main/java/ru/betterend/world/features/InvertedScatterFeature.java @@ -28,9 +28,9 @@ public abstract class InvertedScatterFeature extends DefaultFeature { @Override public boolean place(FeaturePlaceContext featureConfig) { - Random random = featureConfig.random(); - BlockPos center = featureConfig.origin(); - WorldGenLevel world = featureConfig.level(); + final Random random = featureConfig.random(); + final BlockPos center = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); int maxY = world.getHeight(Heightmap.Types.WORLD_SURFACE, center.getX(), center.getZ()); int minY = BlocksHelper.upRay(world, new BlockPos(center.getX(), 0, center.getZ()), maxY); for (int y = maxY; y > minY; y--) { diff --git a/src/main/java/ru/betterend/world/features/NeonCactusFeature.java b/src/main/java/ru/betterend/world/features/NeonCactusFeature.java index 6a31d307..ef31a912 100644 --- a/src/main/java/ru/betterend/world/features/NeonCactusFeature.java +++ b/src/main/java/ru/betterend/world/features/NeonCactusFeature.java @@ -15,9 +15,9 @@ import ru.betterend.registry.EndBlocks; public class NeonCactusFeature extends DefaultFeature { @Override public boolean place(FeaturePlaceContext featureConfig) { - Random random = featureConfig.random(); - BlockPos pos = featureConfig.origin(); - WorldGenLevel world = featureConfig.level(); + final Random random = featureConfig.random(); + final BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); BlockState ground = world.getBlockState(pos.below()); if (!ground.is(EndBlocks.ENDSTONE_DUST) && !ground.is(EndBlocks.END_MOSS)) { return false; diff --git a/src/main/java/ru/betterend/world/features/ScatterFeature.java b/src/main/java/ru/betterend/world/features/ScatterFeature.java index d65c6845..4ff0a207 100644 --- a/src/main/java/ru/betterend/world/features/ScatterFeature.java +++ b/src/main/java/ru/betterend/world/features/ScatterFeature.java @@ -58,9 +58,9 @@ public abstract class ScatterFeature extends DefaultFeature { @Override public boolean place(FeaturePlaceContext featureConfig) { - Random random = featureConfig.random(); + final Random random = featureConfig.random(); BlockPos center = featureConfig.origin(); - WorldGenLevel world = featureConfig.level(); + final WorldGenLevel world = featureConfig.level(); center = getCenterGround(world, center); if (!canSpawn(world, center)) { diff --git a/src/main/java/ru/betterend/world/features/SilkMothNestFeature.java b/src/main/java/ru/betterend/world/features/SilkMothNestFeature.java index dbadb296..a0e551c2 100644 --- a/src/main/java/ru/betterend/world/features/SilkMothNestFeature.java +++ b/src/main/java/ru/betterend/world/features/SilkMothNestFeature.java @@ -36,9 +36,9 @@ public class SilkMothNestFeature extends DefaultFeature { @Override public boolean place(FeaturePlaceContext featureConfig) { - Random random = featureConfig.random(); - BlockPos center = featureConfig.origin(); - WorldGenLevel world = featureConfig.level(); + final Random random = featureConfig.random(); + final BlockPos center = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); int maxY = world.getHeight(Heightmap.Types.WORLD_SURFACE, center.getX(), center.getZ()); int minY = BlocksHelper.upRay(world, new BlockPos(center.getX(), 0, center.getZ()), maxY); POS.set(center); diff --git a/src/main/java/ru/betterend/world/features/WallScatterFeature.java b/src/main/java/ru/betterend/world/features/WallScatterFeature.java index 3bd6e23c..c73fb652 100644 --- a/src/main/java/ru/betterend/world/features/WallScatterFeature.java +++ b/src/main/java/ru/betterend/world/features/WallScatterFeature.java @@ -28,9 +28,9 @@ public abstract class WallScatterFeature extends DefaultFeature { @Override public boolean place(FeaturePlaceContext featureConfig) { - Random random = featureConfig.random(); - BlockPos center = featureConfig.origin(); - WorldGenLevel world = featureConfig.level(); + final Random random = featureConfig.random(); + final BlockPos center = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); int maxY = world.getHeight(Heightmap.Types.WORLD_SURFACE, center.getX(), center.getZ()); int minY = BlocksHelper.upRay(world, new BlockPos(center.getX(), 0, center.getZ()), maxY); if (maxY < 10 || maxY < minY) { diff --git a/src/main/java/ru/betterend/world/features/bushes/BushFeature.java b/src/main/java/ru/betterend/world/features/bushes/BushFeature.java index 7ac27e3f..92611c31 100644 --- a/src/main/java/ru/betterend/world/features/bushes/BushFeature.java +++ b/src/main/java/ru/betterend/world/features/bushes/BushFeature.java @@ -37,9 +37,9 @@ public class BushFeature extends DefaultFeature { @Override public boolean place(FeaturePlaceContext featureConfig) { - Random random = featureConfig.random(); - BlockPos pos = featureConfig.origin(); - WorldGenLevel world = featureConfig.level(); + final Random random = featureConfig.random(); + final BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); if (!world.getBlockState(pos.below()).is(TagAPI.END_GROUND) && !world.getBlockState(pos.above()).is(TagAPI.END_GROUND)) return false; diff --git a/src/main/java/ru/betterend/world/features/bushes/BushWithOuterFeature.java b/src/main/java/ru/betterend/world/features/bushes/BushWithOuterFeature.java index 09e87425..e50fdee5 100644 --- a/src/main/java/ru/betterend/world/features/bushes/BushWithOuterFeature.java +++ b/src/main/java/ru/betterend/world/features/bushes/BushWithOuterFeature.java @@ -41,9 +41,9 @@ public class BushWithOuterFeature extends DefaultFeature { @Override public boolean place(FeaturePlaceContext featureConfig) { - Random random = featureConfig.random(); - BlockPos pos = featureConfig.origin(); - WorldGenLevel world = featureConfig.level(); + final Random random = featureConfig.random(); + final BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); if (!world.getBlockState(pos.below()).is(TagAPI.END_GROUND) && !world.getBlockState(pos.above()).is(TagAPI.END_GROUND)) return false; diff --git a/src/main/java/ru/betterend/world/features/bushes/LargeAmaranitaFeature.java b/src/main/java/ru/betterend/world/features/bushes/LargeAmaranitaFeature.java index 6ae29c7d..1d75c1d8 100644 --- a/src/main/java/ru/betterend/world/features/bushes/LargeAmaranitaFeature.java +++ b/src/main/java/ru/betterend/world/features/bushes/LargeAmaranitaFeature.java @@ -21,9 +21,9 @@ import ru.betterend.registry.EndBlocks; public class LargeAmaranitaFeature extends DefaultFeature { @Override public boolean place(FeaturePlaceContext featureConfig) { - Random random = featureConfig.random(); - BlockPos pos = featureConfig.origin(); - WorldGenLevel world = featureConfig.level(); + final Random random = featureConfig.random(); + final BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); if (!world.getBlockState(pos.below()).is(TagAPI.END_GROUND)) return false; diff --git a/src/main/java/ru/betterend/world/features/bushes/Lumecorn.java b/src/main/java/ru/betterend/world/features/bushes/Lumecorn.java index b0d2e81b..e513327f 100644 --- a/src/main/java/ru/betterend/world/features/bushes/Lumecorn.java +++ b/src/main/java/ru/betterend/world/features/bushes/Lumecorn.java @@ -21,9 +21,9 @@ import ru.betterend.registry.EndBlocks; public class Lumecorn extends DefaultFeature { @Override public boolean place(FeaturePlaceContext featureConfig) { - Random random = featureConfig.random(); - BlockPos pos = featureConfig.origin(); - WorldGenLevel world = featureConfig.level(); + final Random random = featureConfig.random(); + final BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); if (!world.getBlockState(pos.below()).is(TagAPI.END_GROUND)) return false; diff --git a/src/main/java/ru/betterend/world/features/bushes/TenaneaBushFeature.java b/src/main/java/ru/betterend/world/features/bushes/TenaneaBushFeature.java index eba26562..5487d04e 100644 --- a/src/main/java/ru/betterend/world/features/bushes/TenaneaBushFeature.java +++ b/src/main/java/ru/betterend/world/features/bushes/TenaneaBushFeature.java @@ -41,9 +41,9 @@ public class TenaneaBushFeature extends DefaultFeature { @Override public boolean place(FeaturePlaceContext featureConfig) { - Random random = featureConfig.random(); - BlockPos pos = featureConfig.origin(); - WorldGenLevel world = featureConfig.level(); + final Random random = featureConfig.random(); + final BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); if (!world.getBlockState(pos.below()).is(TagAPI.END_GROUND)) return false; diff --git a/src/main/java/ru/betterend/world/features/terrain/BigAuroraCrystalFeature.java b/src/main/java/ru/betterend/world/features/terrain/BigAuroraCrystalFeature.java index 5587ea78..8e9ed62a 100644 --- a/src/main/java/ru/betterend/world/features/terrain/BigAuroraCrystalFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/BigAuroraCrystalFeature.java @@ -22,9 +22,9 @@ import ru.betterend.registry.EndBlocks; public class BigAuroraCrystalFeature extends DefaultFeature { @Override public boolean place(FeaturePlaceContext featureConfig) { - Random random = featureConfig.random(); + final Random random = featureConfig.random(); BlockPos pos = featureConfig.origin(); - WorldGenLevel world = featureConfig.level(); + final WorldGenLevel world = featureConfig.level(); int maxY = pos.getY() + BlocksHelper.upRay(world, pos, 16); int minY = pos.getY() - BlocksHelper.downRay(world, pos, 16); diff --git a/src/main/java/ru/betterend/world/features/terrain/DesertLakeFeature.java b/src/main/java/ru/betterend/world/features/terrain/DesertLakeFeature.java index 3ffbf476..b843d16d 100644 --- a/src/main/java/ru/betterend/world/features/terrain/DesertLakeFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/DesertLakeFeature.java @@ -27,9 +27,9 @@ public class DesertLakeFeature extends DefaultFeature { @Override public boolean place(FeaturePlaceContext featureConfig) { - Random random = featureConfig.random(); + final Random random = featureConfig.random(); BlockPos blockPos = featureConfig.origin(); - WorldGenLevel world = featureConfig.level(); + final WorldGenLevel world = featureConfig.level(); double radius = MHelper.randRange(8.0, 15.0, random); double depth = radius * 0.5 * MHelper.randRange(0.8, 1.2, random); int dist = MHelper.floor(radius); diff --git a/src/main/java/ru/betterend/world/features/terrain/EndLakeFeature.java b/src/main/java/ru/betterend/world/features/terrain/EndLakeFeature.java index 48734de6..54c1b903 100644 --- a/src/main/java/ru/betterend/world/features/terrain/EndLakeFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/EndLakeFeature.java @@ -27,9 +27,9 @@ public class EndLakeFeature extends DefaultFeature { @Override public boolean place(FeaturePlaceContext featureConfig) { - Random random = featureConfig.random(); - BlockPos blockPos = featureConfig.origin(); - WorldGenLevel world = featureConfig.level(); + final Random random = featureConfig.random(); + final BlockPos blockPos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); double radius = MHelper.randRange(10.0, 20.0, random); double depth = radius * 0.5 * MHelper.randRange(0.8, 1.2, random); int dist = MHelper.floor(radius); diff --git a/src/main/java/ru/betterend/world/features/terrain/FallenPillarFeature.java b/src/main/java/ru/betterend/world/features/terrain/FallenPillarFeature.java index 8a1a518a..8e387bfe 100644 --- a/src/main/java/ru/betterend/world/features/terrain/FallenPillarFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/FallenPillarFeature.java @@ -26,9 +26,9 @@ import ru.betterend.registry.EndBlocks; public class FallenPillarFeature extends DefaultFeature { @Override public boolean place(FeaturePlaceContext featureConfig) { - Random random = featureConfig.random(); + final Random random = featureConfig.random(); BlockPos pos = featureConfig.origin(); - WorldGenLevel world = featureConfig.level(); + final WorldGenLevel world = featureConfig.level(); pos = getPosOnSurface(world, new BlockPos(pos.getX() + random.nextInt(16), pos.getY(), pos.getZ() + random.nextInt(16))); if (!world.getBlockState(pos.below(5)).is(TagAPI.GEN_TERRAIN)) { diff --git a/src/main/java/ru/betterend/world/features/terrain/FloatingSpireFeature.java b/src/main/java/ru/betterend/world/features/terrain/FloatingSpireFeature.java index 63540189..00bae11b 100644 --- a/src/main/java/ru/betterend/world/features/terrain/FloatingSpireFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/FloatingSpireFeature.java @@ -24,10 +24,10 @@ import ru.betterend.registry.EndFeatures; public class FloatingSpireFeature extends SpireFeature { @Override public boolean place(FeaturePlaceContext featureConfig) { - Random random = featureConfig.random(); + final Random random = featureConfig.random(); BlockPos pos = featureConfig.origin(); - WorldGenLevel world = featureConfig.level(); - ChunkGenerator chunkGenerator = featureConfig.chunkGenerator(); + final WorldGenLevel world = featureConfig.level(); + final ChunkGenerator chunkGenerator = featureConfig.chunkGenerator(); int minY = getYOnSurface(world, pos.getX(), pos.getZ()); int y = minY > 57 ? MHelper.floor(MHelper.randRange(minY, minY * 2, random) * 0.5F + 32) : MHelper.randRange(64, 192, random); diff --git a/src/main/java/ru/betterend/world/features/terrain/IceStarFeature.java b/src/main/java/ru/betterend/world/features/terrain/IceStarFeature.java index 34a4f0f7..565b862e 100644 --- a/src/main/java/ru/betterend/world/features/terrain/IceStarFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/IceStarFeature.java @@ -36,9 +36,9 @@ public class IceStarFeature extends DefaultFeature { @Override public boolean place(FeaturePlaceContext featureConfig) { - Random random = featureConfig.random(); + final Random random = featureConfig.random(); BlockPos pos = featureConfig.origin(); - WorldGenLevel world = featureConfig.level(); + final WorldGenLevel world = featureConfig.level(); float size = MHelper.randRange(minSize, maxSize, random); int count = MHelper.randRange(minCount, maxCount, random); List points = getFibonacciPoints(count); diff --git a/src/main/java/ru/betterend/world/features/terrain/ObsidianBoulderFeature.java b/src/main/java/ru/betterend/world/features/terrain/ObsidianBoulderFeature.java index 624f3ac1..0616e35e 100644 --- a/src/main/java/ru/betterend/world/features/terrain/ObsidianBoulderFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/ObsidianBoulderFeature.java @@ -23,9 +23,9 @@ import ru.betterend.registry.EndBlocks; public class ObsidianBoulderFeature extends DefaultFeature { @Override public boolean place(FeaturePlaceContext featureConfig) { - Random random = featureConfig.random(); + final Random random = featureConfig.random(); BlockPos pos = featureConfig.origin(); - WorldGenLevel world = featureConfig.level(); + final WorldGenLevel world = featureConfig.level(); pos = getPosOnSurface(world, new BlockPos(pos.getX() + random.nextInt(16), pos.getY(), pos.getZ() + random.nextInt(16))); if (!world.getBlockState(pos.below()).is(TagAPI.END_GROUND)) { diff --git a/src/main/java/ru/betterend/world/features/terrain/ObsidianPillarBasementFeature.java b/src/main/java/ru/betterend/world/features/terrain/ObsidianPillarBasementFeature.java index 1551b04d..2c4db528 100644 --- a/src/main/java/ru/betterend/world/features/terrain/ObsidianPillarBasementFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/ObsidianPillarBasementFeature.java @@ -26,9 +26,9 @@ import java.util.Random; public class ObsidianPillarBasementFeature extends DefaultFeature { @Override public boolean place(FeaturePlaceContext featureConfig) { - Random random = featureConfig.random(); + final Random random = featureConfig.random(); BlockPos pos = featureConfig.origin(); - WorldGenLevel world = featureConfig.level(); + final WorldGenLevel world = featureConfig.level(); pos = getPosOnSurface(world, new BlockPos(pos.getX() + random.nextInt(16), pos.getY(), pos.getZ() + random.nextInt(16))); if (!world.getBlockState(pos.below(5)).is(TagAPI.GEN_TERRAIN)) { return false; diff --git a/src/main/java/ru/betterend/world/features/terrain/OreLayerFeature.java b/src/main/java/ru/betterend/world/features/terrain/OreLayerFeature.java index 15348622..b045ce0e 100644 --- a/src/main/java/ru/betterend/world/features/terrain/OreLayerFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/OreLayerFeature.java @@ -37,9 +37,9 @@ public class OreLayerFeature extends DefaultFeature { @Override public boolean place(FeaturePlaceContext featureConfig) { - Random random = featureConfig.random(); - BlockPos pos = featureConfig.origin(); - WorldGenLevel world = featureConfig.level(); + final Random random = featureConfig.random(); + final BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); float radius = this.radius * 0.5F; int r = MHelper.floor(radius + 1); int posX = MHelper.randRange(Math.max(r - 16, 0), Math.min(31 - r, 15), random) + pos.getX(); diff --git a/src/main/java/ru/betterend/world/features/terrain/SingleBlockFeature.java b/src/main/java/ru/betterend/world/features/terrain/SingleBlockFeature.java index 87cc3f4b..b652985d 100644 --- a/src/main/java/ru/betterend/world/features/terrain/SingleBlockFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/SingleBlockFeature.java @@ -23,9 +23,9 @@ public class SingleBlockFeature extends DefaultFeature { @Override public boolean place(FeaturePlaceContext featureConfig) { - Random random = featureConfig.random(); - BlockPos pos = featureConfig.origin(); - WorldGenLevel world = featureConfig.level(); + final Random random = featureConfig.random(); + final BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); if (!world.getBlockState(pos.below()).is(TagAPI.GEN_TERRAIN)) { return false; } diff --git a/src/main/java/ru/betterend/world/features/terrain/SmaragdantCrystalFeature.java b/src/main/java/ru/betterend/world/features/terrain/SmaragdantCrystalFeature.java index 56749973..f63d9c19 100644 --- a/src/main/java/ru/betterend/world/features/terrain/SmaragdantCrystalFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/SmaragdantCrystalFeature.java @@ -19,9 +19,9 @@ import ru.betterend.registry.EndBlocks; public class SmaragdantCrystalFeature extends DefaultFeature { @Override public boolean place(FeaturePlaceContext featureConfig) { - Random random = featureConfig.random(); - BlockPos pos = featureConfig.origin(); - WorldGenLevel world = featureConfig.level(); + final Random random = featureConfig.random(); + final BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); if (!world.getBlockState(pos.below()).is(TagAPI.GEN_TERRAIN)) { return false; } diff --git a/src/main/java/ru/betterend/world/features/terrain/SpireFeature.java b/src/main/java/ru/betterend/world/features/terrain/SpireFeature.java index 16d3d359..4b92b35d 100644 --- a/src/main/java/ru/betterend/world/features/terrain/SpireFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/SpireFeature.java @@ -34,10 +34,10 @@ public class SpireFeature extends DefaultFeature { @Override public boolean place(FeaturePlaceContext featureConfig) { - Random random = featureConfig.random(); + final Random random = featureConfig.random(); BlockPos pos = featureConfig.origin(); - WorldGenLevel world = featureConfig.level(); - ChunkGenerator chunkGenerator = featureConfig.chunkGenerator(); + final WorldGenLevel world = featureConfig.level(); + final ChunkGenerator chunkGenerator = featureConfig.chunkGenerator(); pos = getPosOnSurfaceWG(world, pos); if (pos.getY() < 10 || !world.getBlockState(pos.below(3)).is(TagAPI.GEN_TERRAIN) || !world.getBlockState(pos.below(6)).is(TagAPI.GEN_TERRAIN)) { diff --git a/src/main/java/ru/betterend/world/features/terrain/StalactiteFeature.java b/src/main/java/ru/betterend/world/features/terrain/StalactiteFeature.java index 5c6f1a01..bf018b8b 100644 --- a/src/main/java/ru/betterend/world/features/terrain/StalactiteFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/StalactiteFeature.java @@ -30,9 +30,9 @@ public class StalactiteFeature extends DefaultFeature { @Override public boolean place(FeaturePlaceContext featureConfig) { - Random random = featureConfig.random(); - BlockPos pos = featureConfig.origin(); - WorldGenLevel world = featureConfig.level(); + final Random random = featureConfig.random(); + final BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); if (!isGround(world.getBlockState(ceiling ? pos.above() : pos.below()).getBlock())) { return false; } diff --git a/src/main/java/ru/betterend/world/features/terrain/SulphurHillFeature.java b/src/main/java/ru/betterend/world/features/terrain/SulphurHillFeature.java index 59c362ef..d81440eb 100644 --- a/src/main/java/ru/betterend/world/features/terrain/SulphurHillFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/SulphurHillFeature.java @@ -21,9 +21,9 @@ import ru.betterend.registry.EndBlocks; public class SulphurHillFeature extends DefaultFeature { @Override public boolean place(FeaturePlaceContext featureConfig) { - Random random = featureConfig.random(); + final Random random = featureConfig.random(); BlockPos pos = featureConfig.origin(); - WorldGenLevel world = featureConfig.level(); + final WorldGenLevel world = featureConfig.level(); pos = getPosOnSurfaceWG(world, pos); if (pos.getY() < 57 || pos.getY() > 70) { return false; diff --git a/src/main/java/ru/betterend/world/features/terrain/SulphuricCaveFeature.java b/src/main/java/ru/betterend/world/features/terrain/SulphuricCaveFeature.java index cbdd8e7c..365c89c8 100644 --- a/src/main/java/ru/betterend/world/features/terrain/SulphuricCaveFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/SulphuricCaveFeature.java @@ -34,9 +34,9 @@ public class SulphuricCaveFeature extends DefaultFeature { @Override public boolean place(FeaturePlaceContext featureConfig) { - Random random = featureConfig.random(); + final Random random = featureConfig.random(); BlockPos pos = featureConfig.origin(); - WorldGenLevel world = featureConfig.level(); + final WorldGenLevel world = featureConfig.level(); int radius = MHelper.randRange(10, 30, random); int top = world.getHeight(Heightmap.Types.WORLD_SURFACE_WG, pos.getX(), pos.getZ()); diff --git a/src/main/java/ru/betterend/world/features/terrain/SulphuricLakeFeature.java b/src/main/java/ru/betterend/world/features/terrain/SulphuricLakeFeature.java index 07d49e00..7e3ba1b0 100644 --- a/src/main/java/ru/betterend/world/features/terrain/SulphuricLakeFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/SulphuricLakeFeature.java @@ -1,17 +1,13 @@ package ru.betterend.world.features.terrain; -import java.util.Random; -import java.util.Set; - import com.google.common.collect.Sets; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Fluids; import ru.bclib.api.TagAPI; @@ -23,13 +19,18 @@ import ru.betterend.blocks.SulphurCrystalBlock; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; +import java.util.Random; +import java.util.Set; + public class SulphuricLakeFeature extends DefaultFeature { private static final OpenSimplexNoise NOISE = new OpenSimplexNoise(15152); private static final MutableBlockPos POS = new MutableBlockPos(); @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos blockPos, - NoneFeatureConfiguration featureConfig) { + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + BlockPos blockPos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); blockPos = getPosOnSurfaceWG(world, blockPos); if (blockPos.getY() < 57) { diff --git a/src/main/java/ru/betterend/world/features/terrain/SurfaceVentFeature.java b/src/main/java/ru/betterend/world/features/terrain/SurfaceVentFeature.java index 61bdc174..e3b98484 100644 --- a/src/main/java/ru/betterend/world/features/terrain/SurfaceVentFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/SurfaceVentFeature.java @@ -1,12 +1,10 @@ package ru.betterend.world.features.terrain; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.bclib.api.TagAPI; import ru.bclib.util.BlocksHelper; @@ -15,10 +13,14 @@ import ru.bclib.world.features.DefaultFeature; import ru.betterend.blocks.HydrothermalVentBlock; import ru.betterend.registry.EndBlocks; +import java.util.Random; + public class SurfaceVentFeature extends DefaultFeature { @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - NoneFeatureConfiguration config) { + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); pos = getPosOnSurface(world, new BlockPos(pos.getX() + random.nextInt(16), pos.getY(), pos.getZ() + random.nextInt(16))); if (!world.getBlockState(pos.below(3)).is(TagAPI.GEN_TERRAIN)) { diff --git a/src/main/java/ru/betterend/world/features/terrain/caves/CaveChunkPopulatorFeature.java b/src/main/java/ru/betterend/world/features/terrain/caves/CaveChunkPopulatorFeature.java index 00d5f28a..55c9c377 100644 --- a/src/main/java/ru/betterend/world/features/terrain/caves/CaveChunkPopulatorFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/caves/CaveChunkPopulatorFeature.java @@ -14,6 +14,7 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkAccess; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.feature.Feature; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.bclib.api.TagAPI; import ru.bclib.util.BlocksHelper; @@ -29,7 +30,10 @@ public class CaveChunkPopulatorFeature extends DefaultFeature { } @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, NoneFeatureConfiguration config) { + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + final BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); Set floorPositions = Sets.newHashSet(); Set ceilPositions = Sets.newHashSet(); int sx = (pos.getX() >> 4) << 4; @@ -111,7 +115,7 @@ public class CaveChunkPopulatorFeature extends DefaultFeature { if (density > 0 && random.nextFloat() <= density) { Feature feature = biome.getFloorFeature(random); if (feature != null) { - feature.place(world, null, random, pos.above(), null); + feature.place(new FeaturePlaceContext<>(world, null, random, pos.above(), null)); } } }); @@ -127,7 +131,7 @@ public class CaveChunkPopulatorFeature extends DefaultFeature { if (density > 0 && random.nextFloat() <= density) { Feature feature = biome.getCeilFeature(random); if (feature != null) { - feature.place(world, null, random, pos.below(), null); + feature.place(new FeaturePlaceContext<>(world, null, random, pos.below(), null)); } } }); diff --git a/src/main/java/ru/betterend/world/features/terrain/caves/EndCaveFeature.java b/src/main/java/ru/betterend/world/features/terrain/caves/EndCaveFeature.java index 61abf3ce..9d2bc596 100644 --- a/src/main/java/ru/betterend/world/features/terrain/caves/EndCaveFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/caves/EndCaveFeature.java @@ -1,12 +1,7 @@ package ru.betterend.world.features.terrain.caves; -import java.util.List; -import java.util.Random; -import java.util.Set; - import com.google.common.collect.Lists; import com.google.common.collect.Sets; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; @@ -15,9 +10,9 @@ import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.Heightmap; import net.minecraft.world.level.levelgen.feature.Feature; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.bclib.api.BiomeAPI; import ru.bclib.api.TagAPI; @@ -30,6 +25,10 @@ import ru.betterend.registry.EndBiomes; import ru.betterend.util.BlockFixer; import ru.betterend.world.biome.cave.EndCaveBiome; +import java.util.List; +import java.util.Random; +import java.util.Set; + public abstract class EndCaveFeature extends DefaultFeature { protected static final BlockState CAVE_AIR = Blocks.CAVE_AIR.defaultBlockState(); protected static final BlockState END_STONE = Blocks.END_STONE.defaultBlockState(); @@ -37,7 +36,10 @@ public abstract class EndCaveFeature extends DefaultFeature { private static final Vec3i[] SPHERE; @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, NoneFeatureConfiguration config) { + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + final BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); if (pos.getX() * pos.getX() + pos.getZ() * pos.getZ() <= 2500) { return false; } @@ -94,7 +96,7 @@ public abstract class EndCaveFeature extends DefaultFeature { if (density > 0 && random.nextFloat() <= density) { Feature feature = biome.getFloorFeature(random); if (feature != null) { - feature.place(world, null, random, pos.above(), null); + feature.place(new FeaturePlaceContext<>(world, null, random, pos.above(), null)); } } }); @@ -110,7 +112,7 @@ public abstract class EndCaveFeature extends DefaultFeature { if (density > 0 && random.nextFloat() <= density) { Feature feature = biome.getCeilFeature(random); if (feature != null) { - feature.place(world, null, random, pos.below(), null); + feature.place(new FeaturePlaceContext<>(world, null, random, pos.below(), null)); } } }); diff --git a/src/main/java/ru/betterend/world/features/terrain/caves/TunelCaveFeature.java b/src/main/java/ru/betterend/world/features/terrain/caves/TunelCaveFeature.java index 24cbea5a..42ee724b 100644 --- a/src/main/java/ru/betterend/world/features/terrain/caves/TunelCaveFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/caves/TunelCaveFeature.java @@ -1,13 +1,7 @@ package ru.betterend.world.features.terrain.caves; -import java.util.Map; -import java.util.Random; -import java.util.Set; -import java.util.stream.IntStream; - import com.google.common.collect.Maps; import com.google.common.collect.Sets; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; @@ -17,9 +11,9 @@ import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkAccess; -import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.Heightmap.Types; import net.minecraft.world.level.levelgen.feature.Feature; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.bclib.api.BiomeAPI; import ru.bclib.api.TagAPI; @@ -29,6 +23,11 @@ import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBiomes; import ru.betterend.world.biome.cave.EndCaveBiome; +import java.util.Map; +import java.util.Random; +import java.util.Set; +import java.util.stream.IntStream; + public class TunelCaveFeature extends EndCaveFeature { private Set generate(WorldGenLevel world, BlockPos center, Random random) { int cx = center.getX() >> 4; @@ -107,7 +106,10 @@ public class TunelCaveFeature extends EndCaveFeature { } @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, NoneFeatureConfiguration config) { + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + final BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); if (pos.getX() * pos.getX() + pos.getZ() * pos.getZ() <= 2500) { return false; } @@ -189,7 +191,7 @@ public class TunelCaveFeature extends EndCaveFeature { if (density > 0 && random.nextFloat() <= density) { Feature feature = biome.getFloorFeature(random); if (feature != null) { - feature.place(world, null, random, pos.above(), null); + feature.place(new FeaturePlaceContext<>(world, null, random, pos.above(), null)); } } }); @@ -206,7 +208,7 @@ public class TunelCaveFeature extends EndCaveFeature { if (density > 0 && random.nextFloat() <= density) { Feature feature = biome.getCeilFeature(random); if (feature != null) { - feature.place(world, null, random, pos.below(), null); + feature.place(new FeaturePlaceContext<>(world, null, random, pos.below(), null)); } } }); diff --git a/src/main/java/ru/betterend/world/features/trees/DragonTreeFeature.java b/src/main/java/ru/betterend/world/features/trees/DragonTreeFeature.java index b03576fe..d41dab55 100644 --- a/src/main/java/ru/betterend/world/features/trees/DragonTreeFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/DragonTreeFeature.java @@ -14,6 +14,7 @@ import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.LeavesBlock; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; import ru.bclib.api.TagAPI; @@ -42,9 +43,11 @@ public class DragonTreeFeature extends DefaultFeature { private static final List ROOT; @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - NoneFeatureConfiguration config) { - if (!world.getBlockState(pos.below()).getBlock().is(TagAPI.END_GROUND)) + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + final BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); + if (!world.getBlockState(pos.below()).is(TagAPI.END_GROUND)) return false; float size = MHelper.randRange(10, 25, random); diff --git a/src/main/java/ru/betterend/world/features/trees/GiganticAmaranitaFeature.java b/src/main/java/ru/betterend/world/features/trees/GiganticAmaranitaFeature.java index 849cb05e..33853a15 100644 --- a/src/main/java/ru/betterend/world/features/trees/GiganticAmaranitaFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/GiganticAmaranitaFeature.java @@ -15,6 +15,7 @@ import net.minecraft.util.Mth; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; import ru.bclib.api.TagAPI; @@ -33,9 +34,11 @@ public class GiganticAmaranitaFeature extends DefaultFeature { private static final Function POST; @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - NoneFeatureConfiguration config) { - if (!world.getBlockState(pos.below()).getBlock().is(TagAPI.END_GROUND)) + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + final BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); + if (!world.getBlockState(pos.below()).is(TagAPI.END_GROUND)) return false; float size = MHelper.randRange(5, 10, random); diff --git a/src/main/java/ru/betterend/world/features/trees/HelixTreeFeature.java b/src/main/java/ru/betterend/world/features/trees/HelixTreeFeature.java index 038ae0fc..90b07868 100644 --- a/src/main/java/ru/betterend/world/features/trees/HelixTreeFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/HelixTreeFeature.java @@ -13,6 +13,7 @@ import net.minecraft.util.Mth; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.phys.AABB; import ru.bclib.api.TagAPI; @@ -34,9 +35,11 @@ public class HelixTreeFeature extends DefaultFeature { private static final Function POST; @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - NoneFeatureConfiguration config) { - if (!world.getBlockState(pos.below()).getBlock().is(TagAPI.END_GROUND)) + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + final BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); + if (!world.getBlockState(pos.below()).is(TagAPI.END_GROUND)) return false; BlocksHelper.setWithoutUpdate(world, pos, AIR); diff --git a/src/main/java/ru/betterend/world/features/trees/JellyshroomFeature.java b/src/main/java/ru/betterend/world/features/trees/JellyshroomFeature.java index 3680e707..8bcd9e6e 100644 --- a/src/main/java/ru/betterend/world/features/trees/JellyshroomFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/JellyshroomFeature.java @@ -12,6 +12,7 @@ import net.minecraft.util.Mth; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; import ru.bclib.api.TagAPI; @@ -33,9 +34,11 @@ public class JellyshroomFeature extends DefaultFeature { private static final List ROOT; @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - NoneFeatureConfiguration config) { - if (!world.getBlockState(pos.below()).getBlock().is(TagAPI.END_GROUND)) + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + final BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); + if (!world.getBlockState(pos.below()).is(TagAPI.END_GROUND)) return false; BlockState bark = EndBlocks.JELLYSHROOM.bark.defaultBlockState(); diff --git a/src/main/java/ru/betterend/world/features/trees/LacugroveFeature.java b/src/main/java/ru/betterend/world/features/trees/LacugroveFeature.java index 9485d5ce..4f916282 100644 --- a/src/main/java/ru/betterend/world/features/trees/LacugroveFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/LacugroveFeature.java @@ -13,6 +13,7 @@ import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.LeavesBlock; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; import ru.bclib.api.TagAPI; @@ -35,8 +36,10 @@ public class LacugroveFeature extends DefaultFeature { private static final Function POST; @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - NoneFeatureConfiguration config) { + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + final BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); if (!world.getBlockState(pos.below()).is(TagAPI.END_GROUND)) return false; diff --git a/src/main/java/ru/betterend/world/features/trees/LucerniaFeature.java b/src/main/java/ru/betterend/world/features/trees/LucerniaFeature.java index b8a8ffc6..b01e66ee 100644 --- a/src/main/java/ru/betterend/world/features/trees/LucerniaFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/LucerniaFeature.java @@ -1,30 +1,21 @@ package ru.betterend.world.features.trees; -import java.util.List; -import java.util.Random; -import java.util.function.Function; - import com.google.common.collect.Lists; import com.mojang.math.Vector3f; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.LeavesBlock; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; import ru.bclib.api.TagAPI; import ru.bclib.blocks.BlockProperties; import ru.bclib.blocks.BlockProperties.TripleShape; import ru.bclib.sdf.SDF; -import ru.bclib.sdf.operator.SDFDisplacement; -import ru.bclib.sdf.operator.SDFScale; -import ru.bclib.sdf.operator.SDFScale3D; -import ru.bclib.sdf.operator.SDFSubtraction; -import ru.bclib.sdf.operator.SDFTranslate; +import ru.bclib.sdf.operator.*; import ru.bclib.sdf.primitive.SDFSphere; import ru.bclib.util.BlocksHelper; import ru.bclib.util.MHelper; @@ -34,6 +25,10 @@ import ru.betterend.blocks.basis.FurBlock; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; +import java.util.List; +import java.util.Random; +import java.util.function.Function; + public class LucerniaFeature extends DefaultFeature { private static final Direction[] DIRECTIONS = Direction.values(); private static final Function REPLACE; @@ -42,9 +37,12 @@ public class LucerniaFeature extends DefaultFeature { private static final List ROOT; @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - NoneFeatureConfiguration config) { - if (!world.getBlockState(pos.below()).getBlock().is(TagAPI.END_GROUND)) + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + final BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); + final NoneFeatureConfiguration config = featureConfig.config(); + if (!world.getBlockState(pos.below()).is(TagAPI.END_GROUND)) return false; float size = MHelper.randRange(12, 20, random); diff --git a/src/main/java/ru/betterend/world/features/trees/MossyGlowshroomFeature.java b/src/main/java/ru/betterend/world/features/trees/MossyGlowshroomFeature.java index fd076dbc..abea454d 100644 --- a/src/main/java/ru/betterend/world/features/trees/MossyGlowshroomFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/MossyGlowshroomFeature.java @@ -1,29 +1,16 @@ package ru.betterend.world.features.trees; -import java.util.List; -import java.util.Random; -import java.util.function.Function; - import com.mojang.math.Vector3f; - import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; import ru.bclib.api.TagAPI; import ru.bclib.sdf.SDF; -import ru.bclib.sdf.operator.SDFBinary; -import ru.bclib.sdf.operator.SDFCoordModify; -import ru.bclib.sdf.operator.SDFFlatWave; -import ru.bclib.sdf.operator.SDFScale; -import ru.bclib.sdf.operator.SDFScale3D; -import ru.bclib.sdf.operator.SDFSmoothUnion; -import ru.bclib.sdf.operator.SDFSubtraction; -import ru.bclib.sdf.operator.SDFTranslate; -import ru.bclib.sdf.operator.SDFUnion; +import ru.bclib.sdf.operator.*; import ru.bclib.sdf.primitive.SDFCappedCone; import ru.bclib.sdf.primitive.SDFPrimitive; import ru.bclib.sdf.primitive.SDFSphere; @@ -36,6 +23,10 @@ import ru.betterend.blocks.basis.FurBlock; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; +import java.util.List; +import java.util.Random; +import java.util.function.Function; + public class MossyGlowshroomFeature extends DefaultFeature { private static final Function REPLACE; private static final Vector3f CENTER = new Vector3f(); @@ -49,8 +40,10 @@ public class MossyGlowshroomFeature extends DefaultFeature { private static final SDFPrimitive ROOTS; @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos blockPos, - NoneFeatureConfiguration featureConfig) { + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + final BlockPos blockPos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); BlockState down = world.getBlockState(blockPos.below()); if (!down.is(EndBlocks.END_MYCELIUM) && !down.is(EndBlocks.END_MOSS)) return false; diff --git a/src/main/java/ru/betterend/world/features/trees/PythadendronTreeFeature.java b/src/main/java/ru/betterend/world/features/trees/PythadendronTreeFeature.java index 178bc53c..a3b24fda 100644 --- a/src/main/java/ru/betterend/world/features/trees/PythadendronTreeFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/PythadendronTreeFeature.java @@ -1,18 +1,13 @@ package ru.betterend.world.features.trees; -import java.util.List; -import java.util.Random; -import java.util.function.Function; - import com.mojang.math.Vector3f; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.LeavesBlock; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; import ru.bclib.api.TagAPI; @@ -30,13 +25,20 @@ import ru.bclib.world.features.DefaultFeature; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; +import java.util.List; +import java.util.Random; +import java.util.function.Function; + public class PythadendronTreeFeature extends DefaultFeature { private static final Function REPLACE; private static final Function IGNORE; private static final Function POST; @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, NoneFeatureConfiguration config) { + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + final BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); if (world.getBlockState(pos.below()).getBlock() != EndBlocks.CHORUS_NYLIUM) { return false; } diff --git a/src/main/java/ru/betterend/world/features/trees/TenaneaFeature.java b/src/main/java/ru/betterend/world/features/trees/TenaneaFeature.java index 7f9c7ecb..9a1016a0 100644 --- a/src/main/java/ru/betterend/world/features/trees/TenaneaFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/TenaneaFeature.java @@ -1,30 +1,21 @@ package ru.betterend.world.features.trees; -import java.util.List; -import java.util.Random; -import java.util.function.Function; - import com.google.common.collect.Lists; import com.mojang.math.Vector3f; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.LeavesBlock; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; import ru.bclib.api.TagAPI; import ru.bclib.blocks.BlockProperties; import ru.bclib.blocks.BlockProperties.TripleShape; import ru.bclib.sdf.SDF; -import ru.bclib.sdf.operator.SDFDisplacement; -import ru.bclib.sdf.operator.SDFScale; -import ru.bclib.sdf.operator.SDFScale3D; -import ru.bclib.sdf.operator.SDFSubtraction; -import ru.bclib.sdf.operator.SDFTranslate; +import ru.bclib.sdf.operator.*; import ru.bclib.sdf.primitive.SDFSphere; import ru.bclib.util.BlocksHelper; import ru.bclib.util.MHelper; @@ -34,6 +25,10 @@ import ru.betterend.blocks.basis.FurBlock; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; +import java.util.List; +import java.util.Random; +import java.util.function.Function; + public class TenaneaFeature extends DefaultFeature { private static final Direction[] DIRECTIONS = Direction.values(); private static final Function REPLACE; @@ -41,9 +36,11 @@ public class TenaneaFeature extends DefaultFeature { private static final List SPLINE; @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - NoneFeatureConfiguration config) { - if (!world.getBlockState(pos.below()).getBlock().is(TagAPI.END_GROUND)) + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + final BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); + if (!world.getBlockState(pos.below()).is(TagAPI.END_GROUND)) return false; float size = MHelper.randRange(7, 10, random); diff --git a/src/main/java/ru/betterend/world/features/trees/UmbrellaTreeFeature.java b/src/main/java/ru/betterend/world/features/trees/UmbrellaTreeFeature.java index f2f7366e..db947168 100644 --- a/src/main/java/ru/betterend/world/features/trees/UmbrellaTreeFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/UmbrellaTreeFeature.java @@ -1,30 +1,19 @@ package ru.betterend.world.features.trees; -import java.util.List; -import java.util.Random; -import java.util.function.Function; - import com.google.common.collect.Lists; import com.mojang.math.Vector3f; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; import net.minecraft.util.Mth; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; import ru.bclib.api.TagAPI; import ru.bclib.sdf.SDF; -import ru.bclib.sdf.operator.SDFFlatWave; -import ru.bclib.sdf.operator.SDFScale; -import ru.bclib.sdf.operator.SDFScale3D; -import ru.bclib.sdf.operator.SDFSmoothUnion; -import ru.bclib.sdf.operator.SDFSubtraction; -import ru.bclib.sdf.operator.SDFTranslate; -import ru.bclib.sdf.operator.SDFUnion; +import ru.bclib.sdf.operator.*; import ru.bclib.sdf.primitive.SDFSphere; import ru.bclib.util.BlocksHelper; import ru.bclib.util.MHelper; @@ -34,15 +23,22 @@ import ru.betterend.blocks.UmbrellaTreeClusterBlock; import ru.betterend.blocks.UmbrellaTreeMembraneBlock; import ru.betterend.registry.EndBlocks; +import java.util.List; +import java.util.Random; +import java.util.function.Function; + public class UmbrellaTreeFeature extends DefaultFeature { private static final Function REPLACE; private static final List SPLINE; private static final List ROOT; @Override - public boolean place(WorldGenLevel world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, - NoneFeatureConfiguration config) { - if (!world.getBlockState(pos.below()).getBlock().is(TagAPI.END_GROUND)) + public boolean place(FeaturePlaceContext featureConfig) { + final Random random = featureConfig.random(); + final BlockPos pos = featureConfig.origin(); + final WorldGenLevel world = featureConfig.level(); + final NoneFeatureConfiguration config = featureConfig.config(); + if (!world.getBlockState(pos.below()).is(TagAPI.END_GROUND)) return false; BlockState wood = EndBlocks.UMBRELLA_TREE.bark.defaultBlockState(); diff --git a/src/main/java/ru/betterend/world/structures/piece/CavePiece.java b/src/main/java/ru/betterend/world/structures/piece/CavePiece.java index 258b3ab4..86b9220b 100644 --- a/src/main/java/ru/betterend/world/structures/piece/CavePiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/CavePiece.java @@ -33,7 +33,7 @@ public class CavePiece extends BasePiece { makeBoundingBox(); } - public CavePiece(StructureManager manager, CompoundTag tag) { + public CavePiece(ServerLevel serverLevel, CompoundTag tag) { super(EndStructures.CAVE_PIECE, tag); makeBoundingBox(); } diff --git a/src/main/java/ru/betterend/world/structures/piece/CrystalMountainPiece.java b/src/main/java/ru/betterend/world/structures/piece/CrystalMountainPiece.java index e7a77628..9fb60aab 100644 --- a/src/main/java/ru/betterend/world/structures/piece/CrystalMountainPiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/CrystalMountainPiece.java @@ -5,6 +5,7 @@ import java.util.Random; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.nbt.CompoundTag; +import net.minecraft.server.level.ServerLevel; import net.minecraft.util.Mth; import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.StructureFeatureManager; @@ -32,8 +33,8 @@ public class CrystalMountainPiece extends MountainPiece { top = biome.getGenerationSettings().getSurfaceBuilderConfig().getTopMaterial(); } - public CrystalMountainPiece(StructureManager manager, CompoundTag tag) { - super(EndStructures.MOUNTAIN_PIECE, manager, tag); + public CrystalMountainPiece(ServerLevel serverLevel, CompoundTag tag) { + super(EndStructures.MOUNTAIN_PIECE, serverLevel, tag); } @Override diff --git a/src/main/java/ru/betterend/world/structures/piece/LakePiece.java b/src/main/java/ru/betterend/world/structures/piece/LakePiece.java index 5a2e10cb..e4a17575 100644 --- a/src/main/java/ru/betterend/world/structures/piece/LakePiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/LakePiece.java @@ -59,7 +59,7 @@ public class LakePiece extends BasePiece { makeBoundingBox(); } - public LakePiece(StructureManager manager, CompoundTag tag) { + public LakePiece(ServerLevel serverLevel, CompoundTag tag) { super(EndStructures.LAKE_PIECE, tag); makeBoundingBox(); } diff --git a/src/main/java/ru/betterend/world/structures/piece/MountainPiece.java b/src/main/java/ru/betterend/world/structures/piece/MountainPiece.java index 2521d869..791d9ff3 100644 --- a/src/main/java/ru/betterend/world/structures/piece/MountainPiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/MountainPiece.java @@ -48,7 +48,7 @@ public abstract class MountainPiece extends BasePiece { makeBoundingBox(); } - public MountainPiece(StructurePieceType type, StructureManager manager, CompoundTag tag) { + public MountainPiece(StructurePieceType type, ServerLevel serverLevel, CompoundTag tag) { super(type, tag); makeBoundingBox(); } @@ -130,9 +130,11 @@ public abstract class MountainPiece extends BasePiece { private void makeBoundingBox() { int minX = MHelper.floor(center.getX() - radius); + int minY = MHelper.floor(center.getY() - radius); int minZ = MHelper.floor(center.getZ() - radius); int maxX = MHelper.floor(center.getX() + radius + 1); + int maxY = MHelper.floor(center.getY() + radius + 1); int maxZ = MHelper.floor(center.getZ() + radius + 1); - this.boundingBox = new BoundingBox(minX, minZ, maxX, maxZ); + this.boundingBox = new BoundingBox(minX, minY, minZ, maxX, maxY, maxZ); } } diff --git a/src/main/java/ru/betterend/world/structures/piece/NBTPiece.java b/src/main/java/ru/betterend/world/structures/piece/NBTPiece.java index a4cd0e32..31710bfa 100644 --- a/src/main/java/ru/betterend/world/structures/piece/NBTPiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/NBTPiece.java @@ -43,7 +43,7 @@ public class NBTPiece extends BasePiece { makeBoundingBox(); } - public NBTPiece(StructureManager manager, CompoundTag tag) { + public NBTPiece(ServerLevel serverLevel, CompoundTag tag) { super(EndStructures.NBT_PIECE, tag); makeBoundingBox(); } diff --git a/src/main/java/ru/betterend/world/structures/piece/PaintedMountainPiece.java b/src/main/java/ru/betterend/world/structures/piece/PaintedMountainPiece.java index f3029f74..c10e9740 100644 --- a/src/main/java/ru/betterend/world/structures/piece/PaintedMountainPiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/PaintedMountainPiece.java @@ -29,8 +29,8 @@ public class PaintedMountainPiece extends MountainPiece { this.slises = slises; } - public PaintedMountainPiece(StructureManager manager, CompoundTag tag) { - super(EndStructures.PAINTED_MOUNTAIN_PIECE, manager, tag); + public PaintedMountainPiece(ServerLevel serverLevel, CompoundTag tag) { + super(EndStructures.PAINTED_MOUNTAIN_PIECE, serverLevel, tag); } @Override diff --git a/src/main/java/ru/betterend/world/structures/piece/VoxelPiece.java b/src/main/java/ru/betterend/world/structures/piece/VoxelPiece.java index 67c0e2f7..5209c40e 100644 --- a/src/main/java/ru/betterend/world/structures/piece/VoxelPiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/VoxelPiece.java @@ -25,13 +25,13 @@ public class VoxelPiece extends BasePiece { this.boundingBox = world.getBounds(); } - public VoxelPiece(StructureManager manager, CompoundTag tag) { + public VoxelPiece(ServerLevel level, CompoundTag tag) { super(EndStructures.VOXEL_PIECE, tag); this.boundingBox = world.getBounds(); } @Override - protected void addAdditionalSaveData(ServerLevel serverLevel, CompoundTag compoundTag) { + protected void addAdditionalSaveData(ServerLevel serverLevel, CompoundTag tag) { tag.put("world", world.toBNT()); } From 371d491e5f7df141214590ac08559fd4ccf07c03 Mon Sep 17 00:00:00 2001 From: Frank Bauer Date: Thu, 24 Jun 2021 17:32:02 +0200 Subject: [PATCH 038/595] Updated Armor Models --- Convert.java | 41 ++++++++-------- .../item/model/CrystaliteBootsModel.java | 34 +++++++++---- .../item/model/CrystaliteHelmetModel.java | 26 +++++++--- .../item/model/CrystaliteLeggingsModel.java | 48 ++++++++++++++----- 4 files changed, 102 insertions(+), 47 deletions(-) diff --git a/Convert.java b/Convert.java index 58b4420c..8c72c762 100644 --- a/Convert.java +++ b/Convert.java @@ -8,6 +8,7 @@ class ModelPart { float x=0, y=0, z=0, rx=0, ry=0, rz=0; int u=0, v=0; float bx=0,by=0,bz=0,ba=0,bb=0,bc=0; + float scale = 1; boolean hadBox = false; @@ -55,6 +56,7 @@ class ModelPart { ba=a; bb=b; bc=c; + scale = _d; hadBox = true; return this; } @@ -71,11 +73,20 @@ class ModelPart { } public String toString(){ + String s = ""; String pName = parent==null?"modelPartData":parent.name; - String s = "PartDefinition " + name + " = "; + if (scale!=1){ + s += "CubeDeformation deformation_"+name+" = new CubeDeformation("+scale+"f);\n"; + } + s += "PartDefinition " + name + " = "; s += pName+".addOrReplaceChild(\""+name+"\", CubeListBuilder.create()\n"; if (this.mirror) s+= ".mirror()\n"; - if (this.hadBox) s+= ".addBox("+bx+"f, "+by+"f, "+bz+"f, "+ba+"f, "+bb+"f, "+bc+"f)\n"; + if (this.hadBox) { + if (scale!=1) + s+= ".addBox("+bx+"f, "+by+"f, "+bz+"f, "+ba+"f, "+bb+"f, "+bc+"f, deformation_"+name+")\n"; + else + s+= ".addBox("+bx+"f, "+by+"f, "+bz+"f, "+ba+"f, "+bb+"f, "+bc+"f)\n"; + } s+= ".texOffs("+u+", "+v+"),\n"; if (x==0 && y==0 && z==0 && rx==0 && ry==0 && rz==0){ s+= "PartPose.ZERO"; @@ -119,27 +130,15 @@ public class Convert { p.setRotationAngle(x, y, z); } public void c (){ - boolean thinArms = true; float scale = 0; ModelPart body = new ModelPart(this, 16, 16, "body"); - body.addBox(-4.0F, 0.0F, -2.0F, 8.0F, 12.0F, 4.0F, scale + 0.25F); + body.addBox(-4.0F, 0.0F, -2.0F, 8.0F, 12.0F, 4.0F, scale); body.setPos(0.0F, 0.0F, 0.0F); - if (thinArms) { - ModelPart leftShoulder = new ModelPart(this, 41, 32, "leftShoulder"); - leftShoulder.addBox(-1.0F, -2.5F, -2.0F, 3.0F, 12.0F, 4.0F, scale + 0.35F); - leftShoulder.setPos(5.0F, 2.5F, 0.0F); - leftShoulder.mirror = true; - ModelPart rightShoulder = new ModelPart(this, 41, 16, "rightShoulder"); - rightShoulder.addBox(-2.0F, -2.5F, -2.0F, 3.0F, 12.0F, 4.0F, scale + 0.35F); - rightShoulder.setPos(-5.0F, 2.5F, 10.0F); - } else { - ModelPart leftShoulder = new ModelPart(this, 40, 32, "leftShoulder"); - leftShoulder.addBox(-1.0F, -2.5F, -2.0F, 4.0F, 12.0F, 4.0F, scale + 0.45F); - leftShoulder.setPos(5.0F, 2.0F, 0.0F); - leftShoulder.mirror = true; - ModelPart rightShoulder = new ModelPart(this, 40, 16, "rightShoulder"); - rightShoulder.addBox(-3.0F, -2.5F, -2.0F, 4.0F, 12.0F, 4.0F, scale + 0.45F); - rightShoulder.setPos(-5.0F, 2.0F, 10.0F); - } + ModelPart leftLeg = new ModelPart(this, 0, 32, "leftLeg"); + leftLeg.addBox(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F, scale); + leftLeg.setPos(1.9F, 12.0F, 0.0F); + ModelPart rightLeg = new ModelPart(this, 0, 16, "rightLeg"); + rightLeg.addBox(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F, scale); + rightLeg.setPos(-1.9F, 12.0F, 0.0F); } } diff --git a/src/main/java/ru/betterend/item/model/CrystaliteBootsModel.java b/src/main/java/ru/betterend/item/model/CrystaliteBootsModel.java index d1a37fde..bdf20f12 100644 --- a/src/main/java/ru/betterend/item/model/CrystaliteBootsModel.java +++ b/src/main/java/ru/betterend/item/model/CrystaliteBootsModel.java @@ -6,6 +6,8 @@ import com.google.common.collect.Lists; import net.minecraft.client.model.HumanoidModel; import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.*; import net.minecraft.client.renderer.RenderType; import net.minecraft.world.entity.LivingEntity; @@ -13,15 +15,31 @@ public class CrystaliteBootsModel extends HumanoidModel { public ModelPart leftBoot; public ModelPart rightBoot; + + public static LayerDefinition getTexturedModelData() { + final float scale = 1.0f; + MeshDefinition modelData = new MeshDefinition(); + PartDefinition modelPartData = modelData.getRoot(); + CubeDeformation deformation = new CubeDeformation(scale + 0.25f); + + modelPartData.addOrReplaceChild("leftBoot", CubeListBuilder.create() + .addBox(-2.0f, 0.0f, -2.0f, 4.0f, 12.0f, 4.0f, deformation) + .texOffs(0, 32), + PartPose.offset(1.9f, 12.0f, 0.0f)); + + modelPartData.addOrReplaceChild("rightBoot", CubeListBuilder.create() + .addBox(-2.0f, 0.0f, -2.0f, 4.0f, 12.0f, 4.0f, deformation) + .texOffs(0, 16), + PartPose.offset(-1.9f, 12.0f, 0.0f)); + + return LayerDefinition.create(modelData, 64, 48); + } - public CrystaliteBootsModel(float scale) { - super(RenderType::entityTranslucent, scale, 0.0F, 64, 48); - this.leftBoot = new ModelPart(this, 0, 32); - this.leftBoot.addBox(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F, scale + 0.25F); - this.leftBoot.setPos(1.9F, 12.0F, 0.0F); - this.rightBoot = new ModelPart(this, 0, 16); - this.rightBoot.addBox(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F, scale + 0.25F); - this.rightBoot.setPos(-1.9F, 12.0F, 0.0F); + public CrystaliteBootsModel(ModelPart modelPart) { + super(modelPart, RenderType::entityTranslucent); + + leftBoot = modelPart.getChild("leftBoot"); + rightBoot = modelPart.getChild("rightBoot"); } @Override diff --git a/src/main/java/ru/betterend/item/model/CrystaliteHelmetModel.java b/src/main/java/ru/betterend/item/model/CrystaliteHelmetModel.java index 3513c2f4..f84b4eba 100644 --- a/src/main/java/ru/betterend/item/model/CrystaliteHelmetModel.java +++ b/src/main/java/ru/betterend/item/model/CrystaliteHelmetModel.java @@ -8,17 +8,31 @@ import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.model.HumanoidModel; import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartNames; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.*; import net.minecraft.client.renderer.RenderType; import net.minecraft.world.entity.LivingEntity; @Environment(EnvType.CLIENT) public class CrystaliteHelmetModel extends HumanoidModel { + final ModelPart myHat; + public static LayerDefinition getTexturedModelData() { + final float scale = 1.0f; + MeshDefinition modelData = new MeshDefinition(); + PartDefinition modelPartData = modelData.getRoot(); + CubeDeformation deformation_hat = new CubeDeformation(scale + 0.5f); + PartDefinition hat = modelPartData.addOrReplaceChild(PartNames.HAT, CubeListBuilder.create() + .addBox(-4.0f, -8.0f, -4.0f, 8.0f, 8.0f, 8.0f, deformation_hat) + .texOffs(0, 0), + PartPose.ZERO); - public CrystaliteHelmetModel(float scale) { - super(RenderType::entityTranslucent, scale, 0.0F, 64, 48); - this.hat = new ModelPart(this, 0, 0); - this.hat.addBox(-4.0F, -8.0F, -4.0F, 8.0F, 8.0F, 8.0F, scale + 0.5F); - this.hat.setPos(0.0F, 0.0F, 0.0F); + return LayerDefinition.create(modelData, 64, 48); + } + public CrystaliteHelmetModel(ModelPart modelPart) { + super(modelPart, RenderType::entityTranslucent); + + myHat = modelPart.getChild(PartNames.HAT); } @Override @@ -28,6 +42,6 @@ public class CrystaliteHelmetModel extends HumanoidModel { @Override protected Iterable bodyParts() { - return Lists.newArrayList(hat); + return Lists.newArrayList(myHat); } } diff --git a/src/main/java/ru/betterend/item/model/CrystaliteLeggingsModel.java b/src/main/java/ru/betterend/item/model/CrystaliteLeggingsModel.java index 54772ebd..6641834c 100644 --- a/src/main/java/ru/betterend/item/model/CrystaliteLeggingsModel.java +++ b/src/main/java/ru/betterend/item/model/CrystaliteLeggingsModel.java @@ -6,22 +6,46 @@ import com.google.common.collect.Lists; import net.minecraft.client.model.HumanoidModel; import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartNames; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.*; import net.minecraft.client.renderer.RenderType; import net.minecraft.world.entity.LivingEntity; public class CrystaliteLeggingsModel extends HumanoidModel { + public static LayerDefinition getTexturedModelData() { + float scale = 1.0f; + MeshDefinition modelData = new MeshDefinition(); + PartDefinition modelPartData = modelData.getRoot(); + CubeDeformation deformation = new CubeDeformation(scale); + modelPartData.addOrReplaceChild(PartNames.BODY, CubeListBuilder.create() + .addBox(-4.0f, 0.0f, -2.0f, 8.0f, 12.0f, 4.0f, deformation) + .texOffs(16, 16), + PartPose.ZERO); - public CrystaliteLeggingsModel(float scale) { - super(RenderType::entityTranslucent, scale, 0.0F, 64, 48); - this.body = new ModelPart(this, 16, 16); - this.body.addBox(-4.0F, 0.0F, -2.0F, 8.0F, 12.0F, 4.0F, scale); - this.body.setPos(0.0F, 0.0F, 0.0F); - this.leftLeg = new ModelPart(this, 0, 32); - this.leftLeg.addBox(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F, scale); - this.leftLeg.setPos(1.9F, 12.0F, 0.0F); - this.rightLeg = new ModelPart(this, 0, 16); - this.rightLeg.addBox(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F, scale); - this.rightLeg.setPos(-1.9F, 12.0F, 0.0F); + modelPartData.addOrReplaceChild(PartNames.LEFT_LEG, CubeListBuilder.create() + .addBox(-2.0f, 0.0f, -2.0f, 4.0f, 12.0f, 4.0f, deformation) + .texOffs(0, 32), + PartPose.offset(1.9f, 12.0f, 0.0f)); + + modelPartData.addOrReplaceChild(PartNames.RIGHT_LEG, CubeListBuilder.create() + .addBox(-2.0f, 0.0f, -2.0f, 4.0f, 12.0f, 4.0f, deformation) + .texOffs(0, 16), + PartPose.offset(-1.9f, 12.0f, 0.0f)); + + return LayerDefinition.create(modelData, 64, 48); + } + + final ModelPart myBody; + final ModelPart myLeftLeg; + final ModelPart myRightLeg; + + public CrystaliteLeggingsModel(ModelPart modelPart) { + super(modelPart, RenderType::entityTranslucent); + + myBody = modelPart.getChild(PartNames.BODY); + myLeftLeg = modelPart.getChild(PartNames.LEFT_LEG); + myRightLeg = modelPart.getChild(PartNames.RIGHT_LEG); } @Override @@ -31,6 +55,6 @@ public class CrystaliteLeggingsModel extends HumanoidModel { @Override protected Iterable bodyParts() { - return Lists.newArrayList(body, rightLeg, leftLeg); + return Lists.newArrayList(myBody, myRightLeg, myLeftLeg); } } From aca43764ad7dbff8e3c2e2db6ea512dfa60fdcf1 Mon Sep 17 00:00:00 2001 From: Frank Bauer Date: Thu, 24 Jun 2021 17:57:53 +0200 Subject: [PATCH 039/595] Updated `PedestalItemRenderer` --- .../java/ru/betterend/client/render/PedestalItemRenderer.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/ru/betterend/client/render/PedestalItemRenderer.java b/src/main/java/ru/betterend/client/render/PedestalItemRenderer.java index 94c4e175..6320eab7 100644 --- a/src/main/java/ru/betterend/client/render/PedestalItemRenderer.java +++ b/src/main/java/ru/betterend/client/render/PedestalItemRenderer.java @@ -10,6 +10,8 @@ import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.block.model.ItemTransforms; import net.minecraft.client.renderer.blockentity.BlockEntityRenderDispatcher; import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; +import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; +import net.minecraft.client.renderer.entity.EntityRendererProvider; import net.minecraft.client.resources.model.BakedModel; import net.minecraft.util.Mth; import net.minecraft.world.item.BlockItem; @@ -26,7 +28,7 @@ import ru.betterend.registry.EndItems; @Environment(EnvType.CLIENT) public class PedestalItemRenderer implements BlockEntityRenderer { - public PedestalItemRenderer(BlockEntityRenderDispatcher dispatcher) { + public PedestalItemRenderer(BlockEntityRendererProvider.Context ctx) { super(); } From 78bf62bdca846b5f7c344022e410589ff34809e4 Mon Sep 17 00:00:00 2001 From: Frank Bauer Date: Thu, 24 Jun 2021 17:58:09 +0200 Subject: [PATCH 040/595] Biome Features Updated --- .../java/ru/betterend/item/EndBucketItem.java | 3 ++- .../mixin/common/ShuffelingListMixin.java | 26 +++++++++++++++++++ .../util/ShuffelingListExtended.java | 11 ++++++++ .../world/biome/cave/EndCaveBiome.java | 17 ++++++------ .../features/terrain/EndLakeFeature.java | 7 +++-- .../caves/CaveChunkPopulatorFeature.java | 4 +-- .../terrain/caves/EndCaveFeature.java | 4 +-- .../terrain/caves/TunelCaveFeature.java | 4 +-- 8 files changed, 57 insertions(+), 19 deletions(-) create mode 100644 src/main/java/ru/betterend/mixin/common/ShuffelingListMixin.java create mode 100644 src/main/java/ru/betterend/util/ShuffelingListExtended.java diff --git a/src/main/java/ru/betterend/item/EndBucketItem.java b/src/main/java/ru/betterend/item/EndBucketItem.java index bccc0c06..3886a75e 100644 --- a/src/main/java/ru/betterend/item/EndBucketItem.java +++ b/src/main/java/ru/betterend/item/EndBucketItem.java @@ -1,5 +1,6 @@ package ru.betterend.item; +import net.minecraft.sounds.SoundEvents; import net.minecraft.world.entity.EntityType; import net.minecraft.world.item.MobBucketItem; import net.minecraft.world.level.material.Fluids; @@ -8,6 +9,6 @@ import ru.betterend.registry.EndItems; public class EndBucketItem extends MobBucketItem implements ItemModelProvider { public EndBucketItem(EntityType type) { - super(type, Fluids.WATER, EndItems.makeEndItemSettings().stacksTo(1)); + super(type, Fluids.WATER, SoundEvents.BUCKET_EMPTY, EndItems.makeEndItemSettings().stacksTo(1)); } } diff --git a/src/main/java/ru/betterend/mixin/common/ShuffelingListMixin.java b/src/main/java/ru/betterend/mixin/common/ShuffelingListMixin.java new file mode 100644 index 00000000..f1823dbc --- /dev/null +++ b/src/main/java/ru/betterend/mixin/common/ShuffelingListMixin.java @@ -0,0 +1,26 @@ +package ru.betterend.mixin.common; + +import net.minecraft.world.entity.ai.behavior.ShufflingList; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import ru.betterend.util.ShuffelingListExtended; + +import java.util.List; +import java.util.Random; +import java.util.stream.Stream; + +@Mixin(ShufflingList.class) +public abstract class ShuffelingListMixin implements ShuffelingListExtended { + @Shadow @Final protected List> entries; + + public boolean isEmpty() { + return this.entries.isEmpty(); + } + + @Shadow public abstract ShufflingList shuffle(); + + public U getOne() { + return this.shuffle().stream().findFirst().orElseThrow(RuntimeException::new); + } +} diff --git a/src/main/java/ru/betterend/util/ShuffelingListExtended.java b/src/main/java/ru/betterend/util/ShuffelingListExtended.java new file mode 100644 index 00000000..2e265ff3 --- /dev/null +++ b/src/main/java/ru/betterend/util/ShuffelingListExtended.java @@ -0,0 +1,11 @@ +package ru.betterend.util; + +import net.minecraft.world.entity.ai.behavior.ShufflingList; +import org.spongepowered.asm.mixin.Shadow; + +import java.util.Random; + +public interface ShuffelingListExtended { + public boolean isEmpty(); + public U getOne(); +} diff --git a/src/main/java/ru/betterend/world/biome/cave/EndCaveBiome.java b/src/main/java/ru/betterend/world/biome/cave/EndCaveBiome.java index 79af7269..9f19ed15 100644 --- a/src/main/java/ru/betterend/world/biome/cave/EndCaveBiome.java +++ b/src/main/java/ru/betterend/world/biome/cave/EndCaveBiome.java @@ -1,7 +1,5 @@ package ru.betterend.world.biome.cave; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.world.entity.ai.behavior.ShufflingList; import net.minecraft.world.level.biome.Biome.BiomeCategory; @@ -12,12 +10,15 @@ import ru.bclib.world.biomes.BCLBiomeDef; import ru.bclib.world.features.BCLFeature; import ru.betterend.BetterEnd; import ru.betterend.registry.EndSounds; +import ru.betterend.util.ShuffelingListExtended; import ru.betterend.world.biome.EndBiome; import ru.betterend.world.features.terrain.caves.CaveChunkPopulatorFeature; +import java.util.Random; + public class EndCaveBiome extends EndBiome { - private ShufflingList> floorFeatures = new ShufflingList>(); - private ShufflingList> ceilFeatures = new ShufflingList>(); + final private ShufflingList> floorFeatures = new ShufflingList<>(); + final private ShufflingList> ceilFeatures = new ShufflingList<>(); public EndCaveBiome(BCLBiomeDef definition) { super(makeDef(definition)); @@ -42,12 +43,12 @@ public class EndCaveBiome extends EndBiome { ceilFeatures.add(feature, weight); } - public Feature getFloorFeature(Random random) { - return floorFeatures.isEmpty() ? null : floorFeatures.getOne(random); + public Feature getFloorFeature() { + return ((ShuffelingListExtended>)floorFeatures).isEmpty() ? null : ((ShuffelingListExtended>)floorFeatures).getOne(); } - public Feature getCeilFeature(Random random) { - return ceilFeatures.isEmpty() ? null : ceilFeatures.getOne(random); + public Feature getCeilFeature() { + return ((ShuffelingListExtended>)ceilFeatures).isEmpty() ? null : ((ShuffelingListExtended>)ceilFeatures).getOne(); } public float getFloorDensity() { diff --git a/src/main/java/ru/betterend/world/features/terrain/EndLakeFeature.java b/src/main/java/ru/betterend/world/features/terrain/EndLakeFeature.java index 54c1b903..3a0e2c25 100644 --- a/src/main/java/ru/betterend/world/features/terrain/EndLakeFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/EndLakeFeature.java @@ -1,13 +1,10 @@ package ru.betterend.world.features.terrain; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.FluidState; @@ -20,6 +17,8 @@ import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; import ru.betterend.util.BlockFixer; +import java.util.Random; + public class EndLakeFeature extends DefaultFeature { private static final BlockState END_STONE = Blocks.END_STONE.defaultBlockState(); private static final OpenSimplexNoise NOISE = new OpenSimplexNoise(15152); @@ -28,7 +27,7 @@ public class EndLakeFeature extends DefaultFeature { @Override public boolean place(FeaturePlaceContext featureConfig) { final Random random = featureConfig.random(); - final BlockPos blockPos = featureConfig.origin(); + BlockPos blockPos = featureConfig.origin(); final WorldGenLevel world = featureConfig.level(); double radius = MHelper.randRange(10.0, 20.0, random); double depth = radius * 0.5 * MHelper.randRange(0.8, 1.2, random); diff --git a/src/main/java/ru/betterend/world/features/terrain/caves/CaveChunkPopulatorFeature.java b/src/main/java/ru/betterend/world/features/terrain/caves/CaveChunkPopulatorFeature.java index 55c9c377..da5274a6 100644 --- a/src/main/java/ru/betterend/world/features/terrain/caves/CaveChunkPopulatorFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/caves/CaveChunkPopulatorFeature.java @@ -113,7 +113,7 @@ public class CaveChunkPopulatorFeature extends DefaultFeature { floorPositions.forEach((pos) -> { BlocksHelper.setWithoutUpdate(world, pos, surfaceBlock); if (density > 0 && random.nextFloat() <= density) { - Feature feature = biome.getFloorFeature(random); + Feature feature = biome.getFloorFeature(); if (feature != null) { feature.place(new FeaturePlaceContext<>(world, null, random, pos.above(), null)); } @@ -129,7 +129,7 @@ public class CaveChunkPopulatorFeature extends DefaultFeature { BlocksHelper.setWithoutUpdate(world, pos, ceilBlock); } if (density > 0 && random.nextFloat() <= density) { - Feature feature = biome.getCeilFeature(random); + Feature feature = biome.getCeilFeature(); if (feature != null) { feature.place(new FeaturePlaceContext<>(world, null, random, pos.below(), null)); } diff --git a/src/main/java/ru/betterend/world/features/terrain/caves/EndCaveFeature.java b/src/main/java/ru/betterend/world/features/terrain/caves/EndCaveFeature.java index 9d2bc596..6c6509e1 100644 --- a/src/main/java/ru/betterend/world/features/terrain/caves/EndCaveFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/caves/EndCaveFeature.java @@ -94,7 +94,7 @@ public abstract class EndCaveFeature extends DefaultFeature { BlocksHelper.setWithoutUpdate(world, pos, surfaceBlock); } if (density > 0 && random.nextFloat() <= density) { - Feature feature = biome.getFloorFeature(random); + Feature feature = biome.getFloorFeature(); if (feature != null) { feature.place(new FeaturePlaceContext<>(world, null, random, pos.above(), null)); } @@ -110,7 +110,7 @@ public abstract class EndCaveFeature extends DefaultFeature { BlocksHelper.setWithoutUpdate(world, pos, ceilBlock); } if (density > 0 && random.nextFloat() <= density) { - Feature feature = biome.getCeilFeature(random); + Feature feature = biome.getCeilFeature(); if (feature != null) { feature.place(new FeaturePlaceContext<>(world, null, random, pos.below(), null)); } diff --git a/src/main/java/ru/betterend/world/features/terrain/caves/TunelCaveFeature.java b/src/main/java/ru/betterend/world/features/terrain/caves/TunelCaveFeature.java index 42ee724b..c5acfec3 100644 --- a/src/main/java/ru/betterend/world/features/terrain/caves/TunelCaveFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/caves/TunelCaveFeature.java @@ -189,7 +189,7 @@ public class TunelCaveFeature extends EndCaveFeature { BlocksHelper.setWithoutUpdate(world, pos, surfaceBlock); } if (density > 0 && random.nextFloat() <= density) { - Feature feature = biome.getFloorFeature(random); + Feature feature = biome.getFloorFeature(); if (feature != null) { feature.place(new FeaturePlaceContext<>(world, null, random, pos.above(), null)); } @@ -206,7 +206,7 @@ public class TunelCaveFeature extends EndCaveFeature { BlocksHelper.setWithoutUpdate(world, pos, ceilBlock); } if (density > 0 && random.nextFloat() <= density) { - Feature feature = biome.getCeilFeature(random); + Feature feature = biome.getCeilFeature(); if (feature != null) { feature.place(new FeaturePlaceContext<>(world, null, random, pos.below(), null)); } From 3fbacddf3cc6613b1a1f7fbea167e74e0f81406c Mon Sep 17 00:00:00 2001 From: Frank Bauer Date: Thu, 24 Jun 2021 18:54:22 +0200 Subject: [PATCH 041/595] Smaller UI updates --- .../client/gui/EndStoneSmelterScreen.java | 15 +++++++++------ .../client/gui/EndStoneSmelterScreenHandler.java | 5 +++++ .../client/gui/slot/SmelterOutputSlot.java | 3 +-- .../ru/betterend/item/tool/EndHammerItem.java | 4 +++- .../world/surface/SulphuricSurfaceBuilder.java | 10 +++++----- 5 files changed, 23 insertions(+), 14 deletions(-) diff --git a/src/main/java/ru/betterend/client/gui/EndStoneSmelterScreen.java b/src/main/java/ru/betterend/client/gui/EndStoneSmelterScreen.java index c030ed9f..a7f66c33 100644 --- a/src/main/java/ru/betterend/client/gui/EndStoneSmelterScreen.java +++ b/src/main/java/ru/betterend/client/gui/EndStoneSmelterScreen.java @@ -32,13 +32,14 @@ public class EndStoneSmelterScreen extends AbstractContainerScreen { - recipeBook.initVisuals(narrow); + leftPos = recipeBook.updateScreenPosition(width, imageWidth); + addRenderableWidget(new ImageButton(leftPos + 20, height / 2 - 49, 20, 18, 0, 0, 19, RECIPE_BUTTON_TEXTURE, (buttonWidget) -> { + recipeBook.initVisuals(); recipeBook.toggleVisibility(); - leftPos = recipeBook.updateScreenPosition(narrow, width, imageWidth); + leftPos = recipeBook.updateScreenPosition( width, imageWidth); ((ImageButton) buttonWidget).setPosition(leftPos + 20, height / 2 - 49); })); titleLabelX = (imageWidth - font.width(title)) / 2; @@ -109,8 +110,10 @@ public class EndStoneSmelterScreen extends AbstractContainerScreen { return RecipeBookType.BLAST_FURNACE; } + @Override + public boolean shouldMoveToInventory(int i) { + return i != this.getResultSlotIndex(); + } + @Override public boolean stillValid(Player player) { return inventory.stillValid(player); diff --git a/src/main/java/ru/betterend/client/gui/slot/SmelterOutputSlot.java b/src/main/java/ru/betterend/client/gui/slot/SmelterOutputSlot.java index 212eb179..3b4d0edc 100644 --- a/src/main/java/ru/betterend/client/gui/slot/SmelterOutputSlot.java +++ b/src/main/java/ru/betterend/client/gui/slot/SmelterOutputSlot.java @@ -28,10 +28,9 @@ public class SmelterOutputSlot extends Slot { return super.remove(amount); } - public ItemStack onTake(Player player, ItemStack stack) { + public void onTake(Player player, ItemStack stack) { this.checkTakeAchievements(stack); super.onTake(player, stack); - return stack; } protected void onQuickCraft(ItemStack stack, int amount) { diff --git a/src/main/java/ru/betterend/item/tool/EndHammerItem.java b/src/main/java/ru/betterend/item/tool/EndHammerItem.java index 0cef9ded..93e21ace 100644 --- a/src/main/java/ru/betterend/item/tool/EndHammerItem.java +++ b/src/main/java/ru/betterend/item/tool/EndHammerItem.java @@ -14,6 +14,7 @@ import net.fabricmc.fabric.api.tool.attribute.v1.DynamicAttributeTool; import net.minecraft.client.renderer.block.model.BlockModel; import net.minecraft.core.BlockPos; import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.BlockTags; import net.minecraft.tags.Tag; import net.minecraft.util.Mth; import net.minecraft.world.entity.EquipmentSlot; @@ -40,7 +41,8 @@ public class EndHammerItem extends DiggerItem implements DynamicAttributeTool, I private final Multimap attributeModifiers; public EndHammerItem(Tier material, float attackDamage, float attackSpeed, double knockback, Properties settings) { - super(attackDamage, attackSpeed, material, Sets.newHashSet(), settings); + //we override all methods that access BlockTags.MINEABLE_WITH_PICKAXE in the superclass, so this should not matter + super(attackDamage, attackSpeed, material, BlockTags.MINEABLE_WITH_PICKAXE, settings); Builder builder = ImmutableMultimap.builder(); builder.put(Attributes.ATTACK_DAMAGE, new AttributeModifier(BASE_ATTACK_DAMAGE_UUID, "Weapon modifier", attackDamage + material.getAttackDamageBonus(), AttributeModifier.Operation.ADDITION)); diff --git a/src/main/java/ru/betterend/world/surface/SulphuricSurfaceBuilder.java b/src/main/java/ru/betterend/world/surface/SulphuricSurfaceBuilder.java index 90841b95..59c2742e 100644 --- a/src/main/java/ru/betterend/world/surface/SulphuricSurfaceBuilder.java +++ b/src/main/java/ru/betterend/world/surface/SulphuricSurfaceBuilder.java @@ -19,19 +19,19 @@ public class SulphuricSurfaceBuilder extends SurfaceBuilder Date: Thu, 24 Jun 2021 19:21:26 +0200 Subject: [PATCH 042/595] Rendering fixes --- Convert.java | 32 ++++++++---- .../gui/EndStoneSmelterRecipeBookScreen.java | 3 +- .../client/render/EndCrystalRenderer.java | 29 +++++++++-- .../client/render/EternalCrystalRenderer.java | 49 ++++++++++++++++--- .../client/render/PedestalItemRenderer.java | 3 +- .../entity/model/CubozoaEntityModel.java | 1 - 6 files changed, 94 insertions(+), 23 deletions(-) diff --git a/Convert.java b/Convert.java index 8c72c762..3e7e914b 100644 --- a/Convert.java +++ b/Convert.java @@ -9,6 +9,8 @@ class ModelPart { int u=0, v=0; float bx=0,by=0,bz=0,ba=0,bb=0,bc=0; float scale = 1; + static int wd = 64; + static int hg = 32; boolean hadBox = false; @@ -24,6 +26,15 @@ class ModelPart { parts.add(this); } + ModelPart(int wd, int hg, int u, int v, String name){ + this.name = name; + this.u = u; + this.v = v; + ModelPart.wd = wd; + ModelPart.hg = hg; + parts.add(this); + } + ModelPart setPos(float x, float y, float z){ this.x=x; this.y=y; @@ -48,6 +59,9 @@ class ModelPart { this.v=v; return this; } + ModelPart addBox(float x, float y, float z, float a, float b, float c){ + return addBox(x, y, z, a, b, c, 1); + } ModelPart addBox(float x, float y, float z, float a, float b, float c, float _d){ bx=x; @@ -108,7 +122,7 @@ class ModelPart { System.out.println(p); System.out.println(); } - System.out.println("return LayerDefinition.create(modelData, 48, 48);"); + System.out.println("return LayerDefinition.create(modelData, "+wd+", "+hg+");"); System.out.println("}"); System.out.println(); @@ -131,14 +145,12 @@ public class Convert { } public void c (){ float scale = 0; - ModelPart body = new ModelPart(this, 16, 16, "body"); - body.addBox(-4.0F, 0.0F, -2.0F, 8.0F, 12.0F, 4.0F, scale); - body.setPos(0.0F, 0.0F, 0.0F); - ModelPart leftLeg = new ModelPart(this, 0, 32, "leftLeg"); - leftLeg.addBox(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F, scale); - leftLeg.setPos(1.9F, 12.0F, 0.0F); - ModelPart rightLeg = new ModelPart(this, 0, 16, "rightLeg"); - rightLeg.addBox(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F, scale); - rightLeg.setPos(-1.9F, 12.0F, 0.0F); + ModelPart[] SHARDS = new ModelPart[4]; + SHARDS[0] = new ModelPart(16, 16, 2, 4, "SHARDS[0]").addBox(-5.0F, 1.0F, -3.0F, 2.0F, 8.0F, 2.0F); + SHARDS[1] = new ModelPart(16, 16, 2, 4, "SHARDS[1]").addBox(3.0F, -1.0F, -1.0F, 2.0F, 8.0F, 2.0F); + SHARDS[2] = new ModelPart(16, 16, 2, 4, "SHARDS[2]").addBox(-1.0F, 0.0F, -5.0F, 2.0F, 4.0F, 2.0F); + SHARDS[3] = new ModelPart(16, 16, 2, 4, "SHARDS[3]").addBox(0.0F, 3.0F, 4.0F, 2.0F, 6.0F, 2.0F); + ModelPart CORE = new ModelPart(16, 16, 0, 0, "CORE"); + CORE.addBox(-2.0F, -2.0F, -2.0F, 4.0F, 12.0F, 4.0F); } } diff --git a/src/main/java/ru/betterend/client/gui/EndStoneSmelterRecipeBookScreen.java b/src/main/java/ru/betterend/client/gui/EndStoneSmelterRecipeBookScreen.java index 1ed760f5..7e1fe5a2 100644 --- a/src/main/java/ru/betterend/client/gui/EndStoneSmelterRecipeBookScreen.java +++ b/src/main/java/ru/betterend/client/gui/EndStoneSmelterRecipeBookScreen.java @@ -79,7 +79,8 @@ public class EndStoneSmelterRecipeBookScreen extends BlastingRecipeBookComponent int slotX = this.fuelSlot.x + x; int slotY = this.fuelSlot.y + y; GuiComponent.fill(matrices, slotX, slotY, slotX + 16, slotY + 16, 822018048); - this.minecraft.getItemRenderer().renderAndDecorateItem(minecraft.player, this.getFuel().getDefaultInstance(), slotX, slotY); + //TODO: test k=0 + this.minecraft.getItemRenderer().renderAndDecorateItem(minecraft.player, this.getFuel().getDefaultInstance(), slotX, slotY,0); RenderSystem.depthFunc(516); GuiComponent.fill(matrices, slotX, slotY, slotX + 16, slotY + 16, 822083583); RenderSystem.depthFunc(515); diff --git a/src/main/java/ru/betterend/client/render/EndCrystalRenderer.java b/src/main/java/ru/betterend/client/render/EndCrystalRenderer.java index c75dfc93..7686b156 100644 --- a/src/main/java/ru/betterend/client/render/EndCrystalRenderer.java +++ b/src/main/java/ru/betterend/client/render/EndCrystalRenderer.java @@ -6,6 +6,11 @@ import com.mojang.math.Quaternion; import com.mojang.math.Vector3f; import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.texture.OverlayTexture; @@ -41,14 +46,30 @@ public class EndCrystalRenderer { CORE.render(matrices, vertexConsumer, light, OverlayTexture.NO_OVERLAY); matrices.popPose(); } + + public static LayerDefinition getTexturedModelData() { + MeshDefinition modelData = new MeshDefinition(); + PartDefinition modelPartData = modelData.getRoot(); + modelPartData.addOrReplaceChild("FRAME", CubeListBuilder.create() + .addBox(-4.0f, -4.0f, -4.0f, 8.0f, 8.0f, 8.0f) + .texOffs(0, 0), + PartPose.ZERO); + + modelPartData.addOrReplaceChild("CORE", CubeListBuilder.create() + .addBox(-4.0f, -4.0f, -4.0f, 8.0f, 8.0f, 8.0f) + .texOffs(32, 0), + PartPose.ZERO); + + return LayerDefinition.create(modelData, 64, 32); + } static { END_CRYSTAL = RenderType.entityCutoutNoCull(CRYSTAL_TEXTURE); RenderType.entitySmoothCutout(CRYSTAL_BEAM_TEXTURE); SINE_45_DEGREES = (float) Math.sin(0.7853981633974483D); - FRAME = new ModelPart(64, 32, 0, 0); - FRAME.addBox(-4.0F, -4.0F, -4.0F, 8.0F, 8.0F, 8.0F); - CORE = new ModelPart(64, 32, 32, 0); - CORE.addBox(-4.0F, -4.0F, -4.0F, 8.0F, 8.0F, 8.0F); + + ModelPart root = getTexturedModelData().bakeRoot(); + FRAME = root.getChild("FRAME"); + CORE = root.getChild("CORE"); } } diff --git a/src/main/java/ru/betterend/client/render/EternalCrystalRenderer.java b/src/main/java/ru/betterend/client/render/EternalCrystalRenderer.java index f9100d9d..452ac2f5 100644 --- a/src/main/java/ru/betterend/client/render/EternalCrystalRenderer.java +++ b/src/main/java/ru/betterend/client/render/EternalCrystalRenderer.java @@ -5,6 +5,11 @@ import com.mojang.blaze3d.vertex.VertexConsumer; import com.mojang.math.Vector3f; import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.texture.OverlayTexture; @@ -56,15 +61,47 @@ public class EternalCrystalRenderer { return ColorUtil.toFloatArray(ColorUtil.color(r, g, b)); } + + public static LayerDefinition getTexturedModelData() { + MeshDefinition modelData = new MeshDefinition(); + PartDefinition modelPartData = modelData.getRoot(); + modelPartData.addOrReplaceChild("SHARDS_0", CubeListBuilder.create() + .addBox(-5.0f, 1.0f, -3.0f, 2.0f, 8.0f, 2.0f) + .texOffs(2, 4), + PartPose.ZERO); + + modelPartData.addOrReplaceChild("SHARDS_1", CubeListBuilder.create() + .addBox(3.0f, -1.0f, -1.0f, 2.0f, 8.0f, 2.0f) + .texOffs(2, 4), + PartPose.ZERO); + + modelPartData.addOrReplaceChild("SHARDS_2", CubeListBuilder.create() + .addBox(-1.0f, 0.0f, -5.0f, 2.0f, 4.0f, 2.0f) + .texOffs(2, 4), + PartPose.ZERO); + + modelPartData.addOrReplaceChild("SHARDS_3", CubeListBuilder.create() + .addBox(0.0f, 3.0f, 4.0f, 2.0f, 6.0f, 2.0f) + .texOffs(2, 4), + PartPose.ZERO); + + modelPartData.addOrReplaceChild("CORE", CubeListBuilder.create() + .addBox(-2.0f, -2.0f, -2.0f, 4.0f, 12.0f, 4.0f) + .texOffs(0, 0), + PartPose.ZERO); + + return LayerDefinition.create(modelData, 16, 16); + } static { RENDER_LAYER = RenderType.beaconBeam(BetterEnd.makeID("textures/entity/eternal_crystal.png"), true); SHARDS = new ModelPart[4]; - SHARDS[0] = new ModelPart(16, 16, 2, 4).addBox(-5.0F, 1.0F, -3.0F, 2.0F, 8.0F, 2.0F); - SHARDS[1] = new ModelPart(16, 16, 2, 4).addBox(3.0F, -1.0F, -1.0F, 2.0F, 8.0F, 2.0F); - SHARDS[2] = new ModelPart(16, 16, 2, 4).addBox(-1.0F, 0.0F, -5.0F, 2.0F, 4.0F, 2.0F); - SHARDS[3] = new ModelPart(16, 16, 2, 4).addBox(0.0F, 3.0F, 4.0F, 2.0F, 6.0F, 2.0F); - CORE = new ModelPart(16, 16, 0, 0); - CORE.addBox(-2.0F, -2.0F, -2.0F, 4.0F, 12.0F, 4.0F); + + ModelPart root = getTexturedModelData().bakeRoot(); + SHARDS[0] = root.getChild("SHARDS_0"); + SHARDS[1] = root.getChild("SHARDS_1"); + SHARDS[2] = root.getChild("SHARDS_2"); + SHARDS[3] = root.getChild("SHARDS_3"); + CORE = root.getChild("CORE"); } } diff --git a/src/main/java/ru/betterend/client/render/PedestalItemRenderer.java b/src/main/java/ru/betterend/client/render/PedestalItemRenderer.java index 6320eab7..b5164f1b 100644 --- a/src/main/java/ru/betterend/client/render/PedestalItemRenderer.java +++ b/src/main/java/ru/betterend/client/render/PedestalItemRenderer.java @@ -46,7 +46,8 @@ public class PedestalItemRenderer implements Bloc matrices.pushPose(); Minecraft minecraft = Minecraft.getInstance(); - BakedModel model = minecraft.getItemRenderer().getModel(activeItem, world, null); + //TODO: check i=0 + BakedModel model = minecraft.getItemRenderer().getModel(activeItem, world, null, 0); Vector3f translate = model.getTransforms().ground.translation; PedestalBlock pedestal = (PedestalBlock) state.getBlock(); matrices.translate(translate.x(), translate.y(), translate.z()); diff --git a/src/main/java/ru/betterend/entity/model/CubozoaEntityModel.java b/src/main/java/ru/betterend/entity/model/CubozoaEntityModel.java index b01a5b9c..d0651499 100644 --- a/src/main/java/ru/betterend/entity/model/CubozoaEntityModel.java +++ b/src/main/java/ru/betterend/entity/model/CubozoaEntityModel.java @@ -106,7 +106,6 @@ public class CubozoaEntityModel extends BlockBenchModel { public CubozoaEntityModel(ModelPart modelPart) { super(RenderType::entityTranslucent); - tentacle = new ModelPart[TENTACLE_COUNT]; tentacle_center = new ModelPart[TENTACLE_COUNT]; From 539a574cca48fc849940d4d5e511966fa30dd9b2 Mon Sep 17 00:00:00 2001 From: Frank Bauer Date: Thu, 24 Jun 2021 19:30:53 +0200 Subject: [PATCH 043/595] Using `FabricBlockEntityTypeBuilder` --- .../ru/betterend/registry/EndBlockEntities.java | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/main/java/ru/betterend/registry/EndBlockEntities.java b/src/main/java/ru/betterend/registry/EndBlockEntities.java index 93535912..7157ebc0 100644 --- a/src/main/java/ru/betterend/registry/EndBlockEntities.java +++ b/src/main/java/ru/betterend/registry/EndBlockEntities.java @@ -1,5 +1,6 @@ package ru.betterend.registry; +import net.fabricmc.fabric.api.object.builder.v1.block.entity.FabricBlockEntityTypeBuilder; import net.minecraft.core.Registry; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.BlockEntity; @@ -15,18 +16,20 @@ import ru.betterend.blocks.entities.PedestalBlockEntity; public class EndBlockEntities { public final static BlockEntityType END_STONE_SMELTER = registerBlockEntity(EndStoneSmelter.ID, - BlockEntityType.Builder.of(EndStoneSmelterBlockEntity::new, EndBlocks.END_STONE_SMELTER)); + FabricBlockEntityTypeBuilder.create(EndStoneSmelterBlockEntity::new, EndBlocks.END_STONE_SMELTER)); public final static BlockEntityType PEDESTAL = registerBlockEntity("pedestal", - BlockEntityType.Builder.of(PedestalBlockEntity::new, getPedestals())); + FabricBlockEntityTypeBuilder.create(PedestalBlockEntity::new, getPedestals())); public final static BlockEntityType ETERNAL_PEDESTAL = registerBlockEntity("eternal_pedestal", - BlockEntityType.Builder.of(EternalPedestalEntity::new, EndBlocks.ETERNAL_PEDESTAL)); + FabricBlockEntityTypeBuilder.create(EternalPedestalEntity::new, EndBlocks.ETERNAL_PEDESTAL)); public final static BlockEntityType INFUSION_PEDESTAL = registerBlockEntity("infusion_pedestal", - BlockEntityType.Builder.of(InfusionPedestalEntity::new, EndBlocks.INFUSION_PEDESTAL)); + FabricBlockEntityTypeBuilder.create(InfusionPedestalEntity::new, EndBlocks.INFUSION_PEDESTAL)); public final static BlockEntityType HYDROTHERMAL_VENT = registerBlockEntity("hydrother_malvent", - BlockEntityType.Builder.of(BlockEntityHydrothermalVent::new, EndBlocks.HYDROTHERMAL_VENT)); + FabricBlockEntityTypeBuilder.create(BlockEntityHydrothermalVent::new, EndBlocks.HYDROTHERMAL_VENT)); - public static BlockEntityType registerBlockEntity(String id, BlockEntityType.Builder builder) { + public static BlockEntityType registerBlockEntity(String id, FabricBlockEntityTypeBuilder builder) { return Registry.register(Registry.BLOCK_ENTITY_TYPE, BetterEnd.makeID(id), builder.build(null)); + + //return Registry.register(Registry.BLOCK_ENTITY_TYPE, BetterEnd.makeID(id), builder.build(null)); } public static void register() {} From 2d130fac96bb122300d579b2cf28a522c4475eb3 Mon Sep 17 00:00:00 2001 From: Frank Bauer Date: Thu, 24 Jun 2021 19:40:38 +0200 Subject: [PATCH 044/595] Make sure `CrystaliteArmorProvider` compiles --- .../item/model/CrystaliteArmorProvider.java | 15 ++++++++------- .../item/model/CrystaliteBootsModel.java | 6 ++++++ .../item/model/CrystaliteChestplateModel.java | 10 ++++------ .../item/model/CrystaliteHelmetModel.java | 8 ++++++++ .../item/model/CrystaliteLeggingsModel.java | 6 ++++++ .../betterend/registry/EndEntitiesRenders.java | 16 ++++++++-------- 6 files changed, 40 insertions(+), 21 deletions(-) diff --git a/src/main/java/ru/betterend/item/model/CrystaliteArmorProvider.java b/src/main/java/ru/betterend/item/model/CrystaliteArmorProvider.java index 01442190..1e5b603b 100644 --- a/src/main/java/ru/betterend/item/model/CrystaliteArmorProvider.java +++ b/src/main/java/ru/betterend/item/model/CrystaliteArmorProvider.java @@ -19,15 +19,16 @@ import ru.betterend.registry.EndItems; @Environment(EnvType.CLIENT) public class CrystaliteArmorProvider /*implements ModelProvider, TextureProvider*/ { + //TODO: find new registry private final static ResourceLocation FIRST_LAYER = new ResourceLocation("textures/models/armor/crystalite_layer_1.png"); private final static ResourceLocation SECOND_LAYER = new ResourceLocation("textures/models/armor/crystalite_layer_2.png"); - private final static CrystaliteHelmetModel HELMET_MODEL = new CrystaliteHelmetModel(1.0F); - private final static CrystaliteChestplateModel CHEST_MODEL = CrystaliteChestplateModel.regularModel(null); - private final static CrystaliteChestplateModel CHEST_MODEL_SLIM = CrystaliteChestplateModel.thinModel(null); - private final static CrystaliteLeggingsModel LEGGINGS_MODEL = new CrystaliteLeggingsModel(1.0F); - private final static CrystaliteBootsModel BOOTS_MODEL = new CrystaliteBootsModel(1.0F); + private final static CrystaliteHelmetModel HELMET_MODEL = CrystaliteHelmetModel.createModel(null); + private final static CrystaliteChestplateModel CHEST_MODEL = CrystaliteChestplateModel.createRegularModel(null); + private final static CrystaliteChestplateModel CHEST_MODEL_SLIM = CrystaliteChestplateModel.createThinModel(null); + private final static CrystaliteLeggingsModel LEGGINGS_MODEL = CrystaliteLeggingsModel.createModel(null); + private final static CrystaliteBootsModel BOOTS_MODEL = CrystaliteBootsModel.createModel(null); - @Override + //@Override public @NotNull ResourceLocation getArmorTexture(LivingEntity entity, ItemStack stack, EquipmentSlot slot, boolean secondLayer, @Nullable String suffix, ResourceLocation defaultTexture) { if (!isStackValid(stack)) return defaultTexture; @@ -35,7 +36,7 @@ public class CrystaliteArmorProvider /*implements ModelProvider, TextureProvider return FIRST_LAYER; } - @Override + //@Override public @NotNull HumanoidModel getArmorModel(LivingEntity entity, ItemStack stack, EquipmentSlot slot, HumanoidModel defaultModel) { if (!isStackValid(stack)) return defaultModel; diff --git a/src/main/java/ru/betterend/item/model/CrystaliteBootsModel.java b/src/main/java/ru/betterend/item/model/CrystaliteBootsModel.java index bdf20f12..7a9b90ff 100644 --- a/src/main/java/ru/betterend/item/model/CrystaliteBootsModel.java +++ b/src/main/java/ru/betterend/item/model/CrystaliteBootsModel.java @@ -5,11 +5,13 @@ import java.util.Collections; import com.google.common.collect.Lists; import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.model.geom.EntityModelSet; import net.minecraft.client.model.geom.ModelPart; import net.minecraft.client.model.geom.PartPose; import net.minecraft.client.model.geom.builders.*; import net.minecraft.client.renderer.RenderType; import net.minecraft.world.entity.LivingEntity; +import ru.betterend.registry.EndEntitiesRenders; public class CrystaliteBootsModel extends HumanoidModel { @@ -34,6 +36,10 @@ public class CrystaliteBootsModel extends HumanoidModel { return LayerDefinition.create(modelData, 64, 48); } + + public static CrystaliteBootsModel createModel(EntityModelSet entityModelSet){ + return new CrystaliteBootsModel(entityModelSet==null?getTexturedModelData().bakeRoot():entityModelSet.bakeLayer(EndEntitiesRenders.CRYSTALITE_BOOTS)); + } public CrystaliteBootsModel(ModelPart modelPart) { super(modelPart, RenderType::entityTranslucent); diff --git a/src/main/java/ru/betterend/item/model/CrystaliteChestplateModel.java b/src/main/java/ru/betterend/item/model/CrystaliteChestplateModel.java index dc4b673b..51b705fe 100644 --- a/src/main/java/ru/betterend/item/model/CrystaliteChestplateModel.java +++ b/src/main/java/ru/betterend/item/model/CrystaliteChestplateModel.java @@ -69,14 +69,12 @@ public class CrystaliteChestplateModel extends HumanoidModel { final ModelPart localBody; - public static CrystaliteChestplateModel regularModel(EntityModelSet entityModelSet){ - if (entityModelSet==null) throw new RuntimeException("Need to get a ModelSet"); - return new CrystaliteChestplateModel(entityModelSet.bakeLayer(EndEntitiesRenders.CRYSTALITE_CHESTPLATE), false); + public static CrystaliteChestplateModel createRegularModel(EntityModelSet entityModelSet){ + return new CrystaliteChestplateModel(entityModelSet==null?getRegularTexturedModelData().bakeRoot():entityModelSet.bakeLayer(EndEntitiesRenders.CRYSTALITE_CHESTPLATE), false); } - public static CrystaliteChestplateModel thinModel(EntityModelSet entityModelSet){ - if (entityModelSet==null) throw new RuntimeException("Need to get a ModelSet"); - return new CrystaliteChestplateModel(entityModelSet.bakeLayer(EndEntitiesRenders.CRYSTALITE_CHESTPLATE_THIN), true); + public static CrystaliteChestplateModel createThinModel(EntityModelSet entityModelSet){ + return new CrystaliteChestplateModel(entityModelSet==null?getThinTexturedModelData().bakeRoot():entityModelSet.bakeLayer(EndEntitiesRenders.CRYSTALITE_CHESTPLATE_THIN), true); } protected CrystaliteChestplateModel(ModelPart modelPart, boolean thinArms) { diff --git a/src/main/java/ru/betterend/item/model/CrystaliteHelmetModel.java b/src/main/java/ru/betterend/item/model/CrystaliteHelmetModel.java index f84b4eba..489d75e5 100644 --- a/src/main/java/ru/betterend/item/model/CrystaliteHelmetModel.java +++ b/src/main/java/ru/betterend/item/model/CrystaliteHelmetModel.java @@ -7,12 +7,14 @@ import com.google.common.collect.Lists; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.model.geom.EntityModelSet; import net.minecraft.client.model.geom.ModelPart; import net.minecraft.client.model.geom.PartNames; import net.minecraft.client.model.geom.PartPose; import net.minecraft.client.model.geom.builders.*; import net.minecraft.client.renderer.RenderType; import net.minecraft.world.entity.LivingEntity; +import ru.betterend.registry.EndEntitiesRenders; @Environment(EnvType.CLIENT) public class CrystaliteHelmetModel extends HumanoidModel { @@ -29,6 +31,12 @@ public class CrystaliteHelmetModel extends HumanoidModel { return LayerDefinition.create(modelData, 64, 48); } + + public static CrystaliteHelmetModel createModel(EntityModelSet entityModelSet){ + return new CrystaliteHelmetModel(entityModelSet==null?getTexturedModelData().bakeRoot():entityModelSet.bakeLayer(EndEntitiesRenders.CRYSTALITE_HELMET)); + } + + public CrystaliteHelmetModel(ModelPart modelPart) { super(modelPart, RenderType::entityTranslucent); diff --git a/src/main/java/ru/betterend/item/model/CrystaliteLeggingsModel.java b/src/main/java/ru/betterend/item/model/CrystaliteLeggingsModel.java index 6641834c..b8a7ecbc 100644 --- a/src/main/java/ru/betterend/item/model/CrystaliteLeggingsModel.java +++ b/src/main/java/ru/betterend/item/model/CrystaliteLeggingsModel.java @@ -5,12 +5,14 @@ import java.util.Collections; import com.google.common.collect.Lists; import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.model.geom.EntityModelSet; import net.minecraft.client.model.geom.ModelPart; import net.minecraft.client.model.geom.PartNames; import net.minecraft.client.model.geom.PartPose; import net.minecraft.client.model.geom.builders.*; import net.minecraft.client.renderer.RenderType; import net.minecraft.world.entity.LivingEntity; +import ru.betterend.registry.EndEntitiesRenders; public class CrystaliteLeggingsModel extends HumanoidModel { public static LayerDefinition getTexturedModelData() { @@ -40,6 +42,10 @@ public class CrystaliteLeggingsModel extends HumanoidModel { final ModelPart myLeftLeg; final ModelPart myRightLeg; + public static CrystaliteLeggingsModel createModel(EntityModelSet entityModelSet){ + return new CrystaliteLeggingsModel(entityModelSet==null?getTexturedModelData().bakeRoot():entityModelSet.bakeLayer(EndEntitiesRenders.CRYSTALITE_LEGGINGS)); + } + public CrystaliteLeggingsModel(ModelPart modelPart) { super(modelPart, RenderType::entityTranslucent); diff --git a/src/main/java/ru/betterend/registry/EndEntitiesRenders.java b/src/main/java/ru/betterend/registry/EndEntitiesRenders.java index e2920b67..c91df925 100644 --- a/src/main/java/ru/betterend/registry/EndEntitiesRenders.java +++ b/src/main/java/ru/betterend/registry/EndEntitiesRenders.java @@ -8,14 +8,8 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.EntityType; import ru.betterend.BetterEnd; import ru.betterend.entity.model.*; -import ru.betterend.entity.render.RendererEntityCubozoa; -import ru.betterend.entity.render.RendererEntityDragonfly; -import ru.betterend.entity.render.RendererEntityEndFish; -import ru.betterend.entity.render.RendererEntityEndSlime; -import ru.betterend.entity.render.RendererEntityShadowWalker; -import ru.betterend.entity.render.SilkMothEntityRenderer; -import ru.betterend.item.model.ArmoredElytraModel; -import ru.betterend.item.model.CrystaliteChestplateModel; +import ru.betterend.entity.render.*; +import ru.betterend.item.model.*; public class EndEntitiesRenders { @@ -30,6 +24,9 @@ public class EndEntitiesRenders { public static final ModelLayerLocation ARMORED_ELYTRA = registerMain("armored_elytra"); public static final ModelLayerLocation CRYSTALITE_CHESTPLATE = registerMain("crystalite_chestplate"); public static final ModelLayerLocation CRYSTALITE_CHESTPLATE_THIN = registerMain("crystalite_chestplate_thin"); + public static final ModelLayerLocation CRYSTALITE_HELMET = registerMain("crystalite_helmet"); + public static final ModelLayerLocation CRYSTALITE_LEGGINGS = registerMain("crystalite_leggings"); + public static final ModelLayerLocation CRYSTALITE_BOOTS = registerMain("crystalite_boots"); public static void register() { register(EndEntities.DRAGONFLY, RendererEntityDragonfly.class); @@ -49,6 +46,9 @@ public class EndEntitiesRenders { EntityModelLayerRegistry.registerModelLayer(ARMORED_ELYTRA, ArmoredElytraModel::getTexturedModelData); EntityModelLayerRegistry.registerModelLayer(CRYSTALITE_CHESTPLATE, CrystaliteChestplateModel::getRegularTexturedModelData); EntityModelLayerRegistry.registerModelLayer(CRYSTALITE_CHESTPLATE_THIN, CrystaliteChestplateModel::getThinTexturedModelData); + EntityModelLayerRegistry.registerModelLayer(CRYSTALITE_HELMET, CrystaliteHelmetModel::getTexturedModelData); + EntityModelLayerRegistry.registerModelLayer(CRYSTALITE_LEGGINGS, CrystaliteLeggingsModel::getTexturedModelData); + EntityModelLayerRegistry.registerModelLayer(CRYSTALITE_BOOTS, CrystaliteBootsModel::getTexturedModelData); } private static void register(EntityType type, Class> renderer) { From 63b524af628c44d75a94ce411e5a89712e92e1cf Mon Sep 17 00:00:00 2001 From: Frank Bauer Date: Thu, 24 Jun 2021 21:14:20 +0200 Subject: [PATCH 045/595] rei for 1.17 --- build.gradle | 7 +++---- gradle.properties | 2 +- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/build.gradle b/build.gradle index 2227b888..852dd540 100644 --- a/build.gradle +++ b/build.gradle @@ -19,8 +19,7 @@ version = project.mod_version group = project.maven_group repositories { - maven { url "https://maven.dblsaiko.net/" } - maven { url "https://server.bbkr.space:8081/artifactory/libs-release/" } + maven { url "https://maven.dblsaiko.net/" } maven { url "https://maven.fabricmc.net/" } maven { url 'https://maven.blamejared.com' } maven { url "https://maven.shedaniel.me/" } @@ -36,8 +35,8 @@ dependencies { //useApi "vazkii.patchouli:Patchouli:1.16.4-${project.patchouli_version}" useApi "com.github.paulevsGitch:BCLib:${project.bclib_version}" - useOptional "me.shedaniel:RoughlyEnoughItems:${project.rei_version}" - useOptional "me.shedaniel:RoughlyEnoughItems-api:${project.rei_version}" + useOptional "me.shedaniel:RoughlyEnoughItems-fabric:${project.rei_version}" + useOptional "me.shedaniel:RoughlyEnoughItems-api-fabric:${project.rei_version}" //useOptional "grondag:canvas-mc116:${project.canvas_version}" } diff --git a/gradle.properties b/gradle.properties index 31e7b8e7..303d7ccc 100644 --- a/gradle.properties +++ b/gradle.properties @@ -18,4 +18,4 @@ patchouli_version = 50-FABRIC fabric_version = 0.36.0+1.17 canvas_version = 1.0.+ bclib_version = 0.1.43 -rei_version = 5.8.+ \ No newline at end of file +rei_version = 6.0.258-alpha \ No newline at end of file From aa1b0d87bbd6bc06543eae3b177eca97ea5f0a24 Mon Sep 17 00:00:00 2001 From: Frank Bauer Date: Thu, 24 Jun 2021 22:36:27 +0200 Subject: [PATCH 046/595] Some fixes for **rei** 6.x --- .../integration/rei/REIAlloyingCategory.java | 59 +++++++------- .../integration/rei/REIAlloyingDisplay.java | 81 +++++++++---------- .../rei/REIAlloyingFuelCategory.java | 59 +++++++------- .../rei/REIAlloyingFuelDisplay.java | 38 ++++----- 4 files changed, 113 insertions(+), 124 deletions(-) diff --git a/src/main/java/ru/betterend/integration/rei/REIAlloyingCategory.java b/src/main/java/ru/betterend/integration/rei/REIAlloyingCategory.java index 507cfc15..ea8adbb0 100644 --- a/src/main/java/ru/betterend/integration/rei/REIAlloyingCategory.java +++ b/src/main/java/ru/betterend/integration/rei/REIAlloyingCategory.java @@ -1,43 +1,42 @@ package ru.betterend.integration.rei; +import com.google.common.collect.Lists; +import com.mojang.blaze3d.vertex.PoseStack; +import it.unimi.dsi.fastutil.ints.IntList; +import me.shedaniel.math.Point; +import me.shedaniel.math.Rectangle; +import me.shedaniel.rei.api.client.gui.DisplayRenderer; +import me.shedaniel.rei.api.client.gui.SimpleDisplayRenderer; +import me.shedaniel.rei.api.client.gui.widgets.Widget; +import me.shedaniel.rei.api.client.gui.widgets.Widgets; +import me.shedaniel.rei.api.client.registry.display.TransferDisplayCategory; +import me.shedaniel.rei.api.common.category.CategoryIdentifier; +import me.shedaniel.rei.api.common.entry.EntryIngredient; +import me.shedaniel.rei.api.common.entry.EntryStack; +import net.minecraft.client.gui.GuiComponent; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TranslatableComponent; +import org.jetbrains.annotations.NotNull; +import ru.betterend.recipe.builders.AlloyingRecipe; +import ru.betterend.registry.EndBlocks; + import java.text.DecimalFormat; import java.util.List; -import org.jetbrains.annotations.NotNull; - -import com.google.common.collect.Lists; -import com.mojang.blaze3d.vertex.PoseStack; - -import it.unimi.dsi.fastutil.ints.IntList; -import me.shedaniel.math.Point; -import me.shedaniel.math.Rectangle; -import me.shedaniel.rei.api.EntryStack; -import me.shedaniel.rei.api.TransferRecipeCategory; -import me.shedaniel.rei.api.widgets.Widgets; -import me.shedaniel.rei.gui.entries.RecipeEntry; -import me.shedaniel.rei.gui.entries.SimpleRecipeEntry; -import me.shedaniel.rei.gui.widget.Widget; -import net.minecraft.client.gui.GuiComponent; -import net.minecraft.network.chat.TranslatableComponent; -import net.minecraft.resources.ResourceLocation; -import ru.betterend.recipe.builders.AlloyingRecipe; -import ru.betterend.registry.EndBlocks; -import ru.betterend.util.LangUtil; - -public class REIAlloyingCategory implements TransferRecipeCategory { +public class REIAlloyingCategory implements TransferDisplayCategory { @Override - public @NotNull ResourceLocation getIdentifier() { + public @NotNull CategoryIdentifier getCategoryIdentifier() { return AlloyingRecipe.ID; } @Override - public @NotNull String getCategoryName() { - return LangUtil.translate(EndBlocks.END_STONE_SMELTER.getDescriptionId()); + public @NotNull Component getTitle() { + return new TranslatableComponent(EndBlocks.END_STONE_SMELTER.getDescriptionId()); } @Override - public @NotNull EntryStack getLogo() { + public @NotNull EntryStack getIcon() { return REIPlugin.END_STONE_SMELTER; } @@ -53,14 +52,14 @@ public class REIAlloyingCategory implements TransferRecipeCategory> inputEntries = display.getInputEntries(); + List inputEntries = display.getInputEntries(); widgets.add(Widgets.createSlot(new Point(startPoint.x - 20, startPoint.y + 1)).entries(inputEntries.get(0)).markInput()); if (inputEntries.size() > 1) { widgets.add(Widgets.createSlot(new Point(startPoint.x + 1, startPoint.y + 1)).entries(inputEntries.get(1)).markInput()); } else { widgets.add(Widgets.createSlot(new Point(startPoint.x + 1, startPoint.y + 1)).entries(Lists.newArrayList()).markInput()); } - widgets.add(Widgets.createSlot(new Point(startPoint.x + 61, startPoint.y + 9)).entries(display.getResultingEntries().get(0)).disableBackground().markOutput()); + widgets.add(Widgets.createSlot(new Point(startPoint.x + 61, startPoint.y + 9)).entries(display.getOutputEntries().get(0)).disableBackground().markOutput()); return widgets; } @@ -78,8 +77,8 @@ public class REIAlloyingCategory implements TransferRecipeCategory fuel; private Recipe recipe; - private List> input; - private List output; private float xp; private double smeltTime; + + public REIAlloyingDisplay(AlloyingRecipe recipe) { + super( + EntryIngredients.ofIngredients(recipe.getIngredients()), + Collections.singletonList(EntryIngredients.of(recipe.getResultItem())) + ); this.recipe = recipe; - this.input = EntryStack.ofIngredients(recipe.getIngredients()); - this.output = Collections.singletonList(EntryStack.create(recipe.getResultItem())); this.xp = recipe.getExperience(); this.smeltTime = recipe.getSmeltTime(); } public REIAlloyingDisplay(BlastingRecipe recipe) { + super( + EntryIngredients.ofIngredients(recipe.getIngredients()), + Collections.singletonList(EntryIngredients.of(recipe.getResultItem())) + ); this.recipe = recipe; - this.input = EntryStack.ofIngredients(recipe.getIngredients()); - this.output = Collections.singletonList(EntryStack.create(recipe.getResultItem())); this.xp = recipe.getExperience(); this.smeltTime = recipe.getCookingTime(); } @@ -51,29 +56,19 @@ public class REIAlloyingDisplay implements TransferRecipeDisplay { } @Override - public @NotNull Optional getRecipeLocation() { + public @NotNull Optional getDisplayLocation() { return Optional.ofNullable(recipe).map(Recipe::getId); } - - @Override - public @NotNull List> getInputEntries() { - return this.input; - } - - @Override - public @NotNull List> getResultingEntries() { - return Collections.singletonList(output); - } @Override - public @NotNull ResourceLocation getRecipeCategory() { + public CategoryIdentifier getCategoryIdentifier() { return AlloyingRecipe.ID; } - @Override - public @NotNull List> getRequiredEntries() { - return this.input; - } + // @Override + // public @NotNull List> getRequiredEntries() { + // return this.input; + // } public float getXp() { return this.xp; @@ -97,14 +92,14 @@ public class REIAlloyingDisplay implements TransferRecipeDisplay { return 1; } - @Override - public List> getOrganisedInputEntries(ContainerInfo containerInfo, AbstractContainerMenu container) { - return this.input; - } + // @Override + // public List> getOrganisedInputEntries(ContainerInfo containerInfo, AbstractContainerMenu container) { + // return this.input; + // } static { fuel = EndStoneSmelterBlockEntity.availableFuels().keySet().stream() - .map(Item::getDefaultInstance).map(EntryStack::create) + .map(Item::getDefaultInstance).map(EntryStacks::of) .map(e -> e.setting(EntryStack.Settings.TOOLTIP_APPEND_EXTRA, stack -> Collections.singletonList(new TranslatableComponent("category.rei.smelting.fuel") .withStyle(ChatFormatting.YELLOW)))).collect(Collectors.toList()); } diff --git a/src/main/java/ru/betterend/integration/rei/REIAlloyingFuelCategory.java b/src/main/java/ru/betterend/integration/rei/REIAlloyingFuelCategory.java index 8b7a552a..930d3e3e 100644 --- a/src/main/java/ru/betterend/integration/rei/REIAlloyingFuelCategory.java +++ b/src/main/java/ru/betterend/integration/rei/REIAlloyingFuelCategory.java @@ -1,40 +1,39 @@ package ru.betterend.integration.rei; +import com.google.common.collect.Lists; +import com.mojang.blaze3d.vertex.PoseStack; +import me.shedaniel.math.Point; +import me.shedaniel.math.Rectangle; +import me.shedaniel.rei.api.client.gui.DisplayRenderer; +import me.shedaniel.rei.api.client.gui.widgets.Slot; +import me.shedaniel.rei.api.client.gui.widgets.Tooltip; +import me.shedaniel.rei.api.client.gui.widgets.Widget; +import me.shedaniel.rei.api.client.gui.widgets.Widgets; +import me.shedaniel.rei.api.client.registry.display.DisplayCategory; +import me.shedaniel.rei.api.common.category.CategoryIdentifier; +import me.shedaniel.rei.api.common.entry.EntryStack; +import me.shedaniel.rei.api.common.util.EntryStacks; +import net.minecraft.client.Minecraft; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.world.item.Items; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + import java.text.DecimalFormat; import java.util.List; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import com.google.common.collect.Lists; -import com.mojang.blaze3d.vertex.PoseStack; - -import me.shedaniel.math.Point; -import me.shedaniel.math.Rectangle; -import me.shedaniel.rei.api.EntryStack; -import me.shedaniel.rei.api.RecipeCategory; -import me.shedaniel.rei.api.widgets.Slot; -import me.shedaniel.rei.api.widgets.Tooltip; -import me.shedaniel.rei.api.widgets.Widgets; -import me.shedaniel.rei.gui.entries.RecipeEntry; -import me.shedaniel.rei.gui.widget.Widget; -import net.minecraft.client.Minecraft; -import net.minecraft.client.resources.language.I18n; -import net.minecraft.network.chat.TranslatableComponent; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.item.Items; - -public class REIAlloyingFuelCategory implements RecipeCategory { +public class REIAlloyingFuelCategory implements DisplayCategory { private static final DecimalFormat DECIMAL_FORMAT = new DecimalFormat("#.##"); @Override - public @NotNull ResourceLocation getIdentifier() { + public @NotNull CategoryIdentifier getCategoryIdentifier() { return REIPlugin.ALLOYING_FUEL; } @Override - public @NotNull String getCategoryName() { - return I18n.get("category.rei.fuel"); + public @NotNull Component getTitle() { + return new TranslatableComponent("category.rei.fuel"); } @Override @@ -43,12 +42,12 @@ public class REIAlloyingFuelCategory implements RecipeCategory setupDisplay(REIAlloyingFuelDisplay recipeDisplay, Rectangle bounds) { + public List setupDisplay(REIAlloyingFuelDisplay recipeDisplay, Rectangle bounds) { Point startPoint = new Point(bounds.getCenterX() - 41, bounds.getCenterY() - 17); String burnTime = DECIMAL_FORMAT.format(recipeDisplay.getFuelTime()); List widgets = Lists.newArrayList(); @@ -61,10 +60,10 @@ public class REIAlloyingFuelCategory implements RecipeCategory fuel, CompoundTag tag) { + this(fuel, tag.getInt("fuelTime")); + } + + public REIAlloyingFuelDisplay(List fuel, int fuelTime) { + super(fuel, Collections.emptyList()); this.fuelTime = fuelTime; } + /*public REIAlloyingFuelDisplay(EntryStack fuel, int fuelTime) { + this.fuel = fuel; + this.fuelTime = fuelTime; + }*/ @Override - public @NotNull List> getInputEntries() { - return Collections.singletonList(Collections.singletonList(fuel)); - } - - @Override - public @NotNull List> getResultingEntries() { - return Collections.emptyList(); - } - - @Override - public @NotNull ResourceLocation getRecipeCategory() { + public CategoryIdentifier getCategoryIdentifier() { return REIPlugin.ALLOYING_FUEL; } From 49386dc7e137733e1a94eb3457d8f1afa4c684b1 Mon Sep 17 00:00:00 2001 From: Frank Bauer Date: Thu, 24 Jun 2021 23:02:29 +0200 Subject: [PATCH 047/595] Continued work on **rei** --- .../integration/rei/REIAlloyingCategory.java | 7 +- .../integration/rei/REIAlloyingDisplay.java | 4 +- .../integration/rei/REIAnvilCategory.java | 59 +++++++--------- .../integration/rei/REIAnvilDisplay.java | 62 +++++++---------- .../integration/rei/REIInfusionCategory.java | 55 +++++++-------- .../integration/rei/REIInfusionDisplay.java | 67 +++++++------------ .../betterend/integration/rei/REIPlugin.java | 31 +++++---- 7 files changed, 120 insertions(+), 165 deletions(-) diff --git a/src/main/java/ru/betterend/integration/rei/REIAlloyingCategory.java b/src/main/java/ru/betterend/integration/rei/REIAlloyingCategory.java index ea8adbb0..1d915bc9 100644 --- a/src/main/java/ru/betterend/integration/rei/REIAlloyingCategory.java +++ b/src/main/java/ru/betterend/integration/rei/REIAlloyingCategory.java @@ -27,7 +27,7 @@ public class REIAlloyingCategory implements TransferDisplayCategory recipe; private float xp; private double smeltTime; - - public REIAlloyingDisplay(AlloyingRecipe recipe) { super( @@ -62,7 +60,7 @@ public class REIAlloyingDisplay extends BasicDisplay implements SimpleGridMenuDi @Override public CategoryIdentifier getCategoryIdentifier() { - return AlloyingRecipe.ID; + return REIPlugin.ALLOYING; } // @Override diff --git a/src/main/java/ru/betterend/integration/rei/REIAnvilCategory.java b/src/main/java/ru/betterend/integration/rei/REIAnvilCategory.java index fddf1a83..3e11b3dd 100644 --- a/src/main/java/ru/betterend/integration/rei/REIAnvilCategory.java +++ b/src/main/java/ru/betterend/integration/rei/REIAnvilCategory.java @@ -1,49 +1,47 @@ package ru.betterend.integration.rei; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; -import java.util.stream.Collectors; - -import org.jetbrains.annotations.NotNull; - import com.google.common.collect.Lists; import com.mojang.blaze3d.vertex.PoseStack; - import it.unimi.dsi.fastutil.ints.IntList; import me.shedaniel.math.Point; import me.shedaniel.math.Rectangle; -import me.shedaniel.rei.api.EntryStack; -import me.shedaniel.rei.api.TransferRecipeCategory; -import me.shedaniel.rei.api.widgets.Widgets; -import me.shedaniel.rei.gui.entries.RecipeEntry; -import me.shedaniel.rei.gui.entries.SimpleRecipeEntry; -import me.shedaniel.rei.gui.widget.Widget; +import me.shedaniel.rei.api.client.gui.widgets.Widget; +import me.shedaniel.rei.api.client.gui.widgets.Widgets; +import me.shedaniel.rei.api.client.registry.display.TransferDisplayCategory; +import me.shedaniel.rei.api.common.category.CategoryIdentifier; +import me.shedaniel.rei.api.common.entry.EntryIngredient; +import me.shedaniel.rei.api.common.entry.EntryStack; import net.minecraft.client.gui.GuiComponent; +import net.minecraft.network.chat.Component; import net.minecraft.network.chat.TranslatableComponent; -import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.BlockItem; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; +import org.jetbrains.annotations.NotNull; import ru.betterend.blocks.basis.EndAnvilBlock; -import ru.betterend.util.LangUtil; -public class REIAnvilCategory implements TransferRecipeCategory { +import java.util.Arrays; +import java.util.Collection; +import java.util.List; +import java.util.stream.Collectors; + +public class REIAnvilCategory implements TransferDisplayCategory { @Override - public @NotNull ResourceLocation getIdentifier() { + public @NotNull CategoryIdentifier getCategoryIdentifier() { return REIPlugin.SMITHING; } @Override - public @NotNull String getCategoryName() { - return LangUtil.translate(Blocks.ANVIL.getDescriptionId()); + public @NotNull Component getTitle() { + return new TranslatableComponent(Blocks.ANVIL.getDescriptionId()); } - + @Override - public @NotNull EntryStack getLogo() { + public @NotNull EntryStack getIcon() { return REIPlugin.ANVILS[0]; } + @Override public @NotNull List setupDisplay(REIAnvilDisplay display, Rectangle bounds) { @@ -53,23 +51,23 @@ public class REIAnvilCategory implements TransferRecipeCategory int x = startPoint.x + 10; int y = startPoint.y; widgets.add(Widgets.createResultSlotBackground(new Point(x + 61, y + 5))); - List> inputEntries = display.getInputEntries(); - List materials = inputEntries.get(1); + List inputEntries = display.getInputEntries(); + EntryIngredient materials = inputEntries.get(1); int anvilLevel = display.getAnvilLevel(); - List anvils = Arrays.stream(REIPlugin.ANVILS).filter(anvil -> { - Block block = ((BlockItem) anvil.getItem()).getBlock(); + Collection> anvils = Arrays.stream(REIPlugin.ANVILS).filter(anvil -> { + Block block = ((BlockItem) anvil.getValue()).getBlock(); if (block instanceof EndAnvilBlock) { return ((EndAnvilBlock) block).getCraftingLevel() >= anvilLevel; } return anvilLevel == 1; }).collect(Collectors.toList()); - materials.forEach(entryStack -> entryStack.setAmount(display.getInputCount())); + //materials.forEach(entryStack -> entryStack.setAmount(display.getInputCount())); widgets.add(Widgets.createArrow(new Point(x + 24, y + 4))); widgets.add(Widgets.createLabel(new Point(bounds.x + bounds.width - 7, bounds.y + bounds.height - 15), new TranslatableComponent("category.rei.damage.amount&dmg", display.getDamage())).noShadow().rightAligned().color(0xFF404040, 0xFFBBBBBB)); widgets.add(Widgets.createSlot(new Point(x - 20, y + 4)).entries(materials).markInput()); widgets.add(Widgets.createSlot(new Point(x + 1, y + 4)).entries(inputEntries.get(0)).markInput()); - widgets.add(Widgets.createSlot(new Point(x + 61, y + 5)).entries(display.getResultingEntries().get(0)).disableBackground().markOutput()); + widgets.add(Widgets.createSlot(new Point(x + 61, y + 5)).entries(display.getOutputEntries().get(0)).disableBackground().markOutput()); widgets.add(Widgets.createSlot(new Point(x - 9, y + 25)).entries(anvils)); return widgets; @@ -88,11 +86,6 @@ public class REIAnvilCategory implements TransferRecipeCategory matrices.popPose(); } - @Override - public @NotNull RecipeEntry getSimpleRenderer(REIAnvilDisplay recipe) { - return SimpleRecipeEntry.from(Collections.singletonList(recipe.getInputEntries().get(0)), recipe.getResultingEntries()); - } - @Override public int getDisplayHeight() { return 60; diff --git a/src/main/java/ru/betterend/integration/rei/REIAnvilDisplay.java b/src/main/java/ru/betterend/integration/rei/REIAnvilDisplay.java index 3ca2f929..2c039d47 100644 --- a/src/main/java/ru/betterend/integration/rei/REIAnvilDisplay.java +++ b/src/main/java/ru/betterend/integration/rei/REIAnvilDisplay.java @@ -1,29 +1,27 @@ package ru.betterend.integration.rei; -import java.util.Collections; -import java.util.List; -import java.util.Optional; - -import org.jetbrains.annotations.NotNull; - -import me.shedaniel.rei.api.EntryStack; -import me.shedaniel.rei.api.TransferRecipeDisplay; -import me.shedaniel.rei.server.ContainerInfo; +import me.shedaniel.rei.api.common.category.CategoryIdentifier; +import me.shedaniel.rei.api.common.display.SimpleGridMenuDisplay; +import me.shedaniel.rei.api.common.display.basic.BasicDisplay; +import me.shedaniel.rei.api.common.util.EntryIngredients; import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.item.crafting.Recipe; +import org.jetbrains.annotations.NotNull; import ru.betterend.recipe.builders.AnvilRecipe; -public class REIAnvilDisplay implements TransferRecipeDisplay { +import java.util.Collections; +import java.util.Optional; + +public class REIAnvilDisplay extends BasicDisplay implements SimpleGridMenuDisplay { private final AnvilRecipe recipe; - private final List> input; - private final List output; public REIAnvilDisplay(AnvilRecipe recipe) { + super( + EntryIngredients.ofIngredients(recipe.getIngredients()), + Collections.singletonList(EntryIngredients.of(recipe.getResultItem())) + ); this.recipe = recipe; - this.input = EntryStack.ofIngredients(recipe.getIngredients()); - this.output = Collections.singletonList(EntryStack.create(recipe.getResultItem())); } public int getDamage() { @@ -37,31 +35,21 @@ public class REIAnvilDisplay implements TransferRecipeDisplay { public int getAnvilLevel() { return recipe.getAnvilLevel(); } - + @Override - public @NotNull Optional getRecipeLocation() { + public @NotNull Optional getDisplayLocation() { return Optional.ofNullable(recipe).map(Recipe::getId); } @Override - public @NotNull List> getInputEntries() { - return this.input; - } - - @Override - public @NotNull List> getResultingEntries() { - return Collections.singletonList(output); - } - - @Override - public @NotNull ResourceLocation getRecipeCategory() { + public CategoryIdentifier getCategoryIdentifier() { return REIPlugin.SMITHING; } - @Override - public @NotNull List> getRequiredEntries() { - return input; - } + // @Override + // public @NotNull List> getRequiredEntries() { + // return input; + // } @Override public int getWidth() { @@ -73,9 +61,9 @@ public class REIAnvilDisplay implements TransferRecipeDisplay { return 1; } - @Override - public List> getOrganisedInputEntries(ContainerInfo containerInfo, - AbstractContainerMenu container) { - return input; - } + // @Override + // public List> getOrganisedInputEntries(ContainerInfo containerInfo, + // AbstractContainerMenu container) { + // return input; + // } } diff --git a/src/main/java/ru/betterend/integration/rei/REIInfusionCategory.java b/src/main/java/ru/betterend/integration/rei/REIInfusionCategory.java index 5acb5b12..152a83b4 100644 --- a/src/main/java/ru/betterend/integration/rei/REIInfusionCategory.java +++ b/src/main/java/ru/betterend/integration/rei/REIInfusionCategory.java @@ -1,59 +1,55 @@ package ru.betterend.integration.rei; -import java.util.List; - -import org.jetbrains.annotations.NotNull; - import com.google.common.collect.Lists; import com.mojang.blaze3d.vertex.PoseStack; - import it.unimi.dsi.fastutil.ints.IntList; import me.shedaniel.math.Point; import me.shedaniel.math.Rectangle; -import me.shedaniel.rei.api.EntryStack; -import me.shedaniel.rei.api.TransferRecipeCategory; -import me.shedaniel.rei.api.widgets.Widgets; -import me.shedaniel.rei.gui.entries.RecipeEntry; -import me.shedaniel.rei.gui.entries.SimpleRecipeEntry; -import me.shedaniel.rei.gui.widget.Widget; +import me.shedaniel.rei.api.client.gui.DisplayRenderer; +import me.shedaniel.rei.api.client.gui.SimpleDisplayRenderer; +import me.shedaniel.rei.api.client.gui.widgets.Widget; +import me.shedaniel.rei.api.client.gui.widgets.Widgets; +import me.shedaniel.rei.api.client.registry.display.TransferDisplayCategory; +import me.shedaniel.rei.api.common.category.CategoryIdentifier; +import me.shedaniel.rei.api.common.entry.EntryIngredient; +import me.shedaniel.rei.api.common.entry.EntryStack; +import net.minecraft.network.chat.Component; import net.minecraft.network.chat.TranslatableComponent; import net.minecraft.resources.ResourceLocation; +import org.jetbrains.annotations.NotNull; import ru.betterend.BetterEnd; import ru.betterend.recipe.builders.InfusionRecipe; import ru.betterend.registry.EndBlocks; -import ru.betterend.util.LangUtil; -public class REIInfusionCategory implements TransferRecipeCategory { +import java.util.List; + +public class REIInfusionCategory implements TransferDisplayCategory { private final static ResourceLocation BACKGROUND = BetterEnd.makeID("textures/gui/rei_infusion.png"); @Override - public @NotNull ResourceLocation getIdentifier() { - return InfusionRecipe.ID; + public @NotNull CategoryIdentifier getCategoryIdentifier() { + return REIPlugin.INFUSION; } @Override - public @NotNull String getCategoryName() { - return LangUtil.translate(EndBlocks.INFUSION_PEDESTAL.getDescriptionId()); + public @NotNull Component getTitle() { + return new TranslatableComponent(EndBlocks.INFUSION_PEDESTAL.getDescriptionId()); } @Override - public @NotNull EntryStack getLogo() { + public @NotNull EntryStack getIcon() { return REIPlugin.INFUSION_RITUAL; } - - @Override - public @NotNull RecipeEntry getSimpleRenderer(REIInfusionDisplay recipe) { - return SimpleRecipeEntry.from(recipe.getInputEntries(), recipe.getResultingEntries()); - } + @Override public @NotNull List setupDisplay(REIInfusionDisplay display, Rectangle bounds) { Point centerPoint = new Point(bounds.getCenterX() - 34, bounds.getCenterY() - 2); List widgets = Lists.newArrayList(); widgets.add(Widgets.createRecipeBase(bounds)); - List> inputEntries = display.getInputEntries(); - List> outputEntries = display.getResultingEntries(); + List inputEntries = display.getInputEntries(); + List outputEntries = display.getOutputEntries(); widgets.add(Widgets.createTexturedWidget(BACKGROUND, bounds.x, bounds.y, 0, 0, 150, 104, 150, 104)); widgets.add(Widgets.createSlot(centerPoint).entries(inputEntries.get(0)).disableBackground().markInput()); widgets.add(Widgets.createSlot(new Point(centerPoint.x, centerPoint.y - 28)).entries(inputEntries.get(1)).disableBackground().markInput()); @@ -69,13 +65,14 @@ public class REIInfusionCategory implements TransferRecipeCategory widgets, Rectangle bounds, - REIInfusionDisplay display, IntList redSlots) {} @Override public int getDisplayHeight() { return 104; } + + @Override + public void renderRedSlots(PoseStack matrices, List widgets, Rectangle bounds, REIInfusionDisplay display, IntList redSlots) { + + } } diff --git a/src/main/java/ru/betterend/integration/rei/REIInfusionDisplay.java b/src/main/java/ru/betterend/integration/rei/REIInfusionDisplay.java index d8411bc9..860f386f 100644 --- a/src/main/java/ru/betterend/integration/rei/REIInfusionDisplay.java +++ b/src/main/java/ru/betterend/integration/rei/REIInfusionDisplay.java @@ -1,38 +1,29 @@ package ru.betterend.integration.rei; -import java.util.Collections; -import java.util.List; -import java.util.Optional; - -import org.jetbrains.annotations.NotNull; - -import com.google.common.collect.Lists; - -import me.shedaniel.rei.api.EntryStack; -import me.shedaniel.rei.api.TransferRecipeDisplay; -import me.shedaniel.rei.server.ContainerInfo; +import me.shedaniel.rei.api.common.category.CategoryIdentifier; +import me.shedaniel.rei.api.common.display.SimpleGridMenuDisplay; +import me.shedaniel.rei.api.common.display.basic.BasicDisplay; +import me.shedaniel.rei.api.common.util.EntryIngredients; import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.item.crafting.Recipe; -import ru.betterend.recipe.builders.AlloyingRecipe; +import org.jetbrains.annotations.NotNull; import ru.betterend.recipe.builders.InfusionRecipe; -public class REIInfusionDisplay implements TransferRecipeDisplay { +import java.util.Collections; +import java.util.Optional; + +public class REIInfusionDisplay extends BasicDisplay implements SimpleGridMenuDisplay { private final InfusionRecipe recipe; - private final List> input; - private final List output; private final int time; public REIInfusionDisplay(InfusionRecipe recipe) { + super( + EntryIngredients.ofIngredients(recipe.getIngredients()), + Collections.singletonList(EntryIngredients.of(recipe.getResultItem())) + ); this.recipe = recipe; - this.input = Lists.newArrayList(); - this.output = Collections.singletonList(EntryStack.create(recipe.getResultItem())); this.time = recipe.getInfusionTime(); - - recipe.getIngredients().forEach(ingredient -> { - input.add(EntryStack.ofIngredient(ingredient)); - }); } public int getInfusionTime() { @@ -40,29 +31,19 @@ public class REIInfusionDisplay implements TransferRecipeDisplay { } @Override - public @NotNull Optional getRecipeLocation() { + public @NotNull Optional getDisplayLocation() { return Optional.ofNullable(recipe).map(Recipe::getId); } @Override - public @NotNull List> getInputEntries() { - return this.input; + public CategoryIdentifier getCategoryIdentifier() { + return REIPlugin.INFUSION; } - @Override - public @NotNull List> getResultingEntries() { - return Collections.singletonList(output); - } - - @Override - public @NotNull ResourceLocation getRecipeCategory() { - return AlloyingRecipe.ID; - } - - @Override - public @NotNull List> getRequiredEntries() { - return this.input; - } + // @Override + // public @NotNull List> getRequiredEntries() { + // return this.input; + // } @Override public int getWidth() { @@ -74,8 +55,8 @@ public class REIInfusionDisplay implements TransferRecipeDisplay { return 0; } - @Override - public List> getOrganisedInputEntries(ContainerInfo containerInfo, AbstractContainerMenu container) { - return this.input; - } + // @Override + // public List> getOrganisedInputEntries(ContainerInfo containerInfo, AbstractContainerMenu container) { + // return this.input; + //} } diff --git a/src/main/java/ru/betterend/integration/rei/REIPlugin.java b/src/main/java/ru/betterend/integration/rei/REIPlugin.java index e05fd55d..c3779269 100644 --- a/src/main/java/ru/betterend/integration/rei/REIPlugin.java +++ b/src/main/java/ru/betterend/integration/rei/REIPlugin.java @@ -1,13 +1,11 @@ package ru.betterend.integration.rei; -import java.util.List; -import java.util.stream.Collectors; - import com.google.common.collect.Lists; - -import me.shedaniel.rei.api.EntryStack; import me.shedaniel.rei.api.RecipeHelper; -import me.shedaniel.rei.api.plugins.REIPluginV0; +import me.shedaniel.rei.api.client.plugins.REIClientPlugin; +import me.shedaniel.rei.api.client.registry.category.CategoryRegistry; +import me.shedaniel.rei.api.common.category.CategoryIdentifier; +import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.plugin.DefaultPlugin; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; @@ -23,14 +21,18 @@ import ru.betterend.recipe.builders.AnvilRecipe; import ru.betterend.recipe.builders.InfusionRecipe; import ru.betterend.registry.EndBlocks; +import java.util.List; +import java.util.stream.Collectors; + +//https://github.com/shedaniel/RoughlyEnoughItems/blob/6.x-1.17/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/DefaultClientPlugin.java @Environment(EnvType.CLIENT) -public class REIPlugin implements REIPluginV0 { +public class REIPlugin implements REIClientPlugin { public final static ResourceLocation PLUGIN_ID = BetterEnd.makeID("rei_plugin"); - public final static ResourceLocation ALLOYING_FUEL = BetterEnd.makeID("alloying_fuel"); - public final static ResourceLocation ALLOYING = AlloyingRecipe.ID; - public final static ResourceLocation SMITHING = AnvilRecipe.ID; - public final static ResourceLocation INFUSION = InfusionRecipe.ID; + public final static CategoryIdentifier ALLOYING_FUEL = CategoryIdentifier.of(BetterEnd.MOD_ID, "alloying_fuel"); + public final static CategoryIdentifier ALLOYING = AlloyingRecipe.ID; + public final static CategoryIdentifier SMITHING = CategoryIdentifier.of(BetterEnd.MOD_ID, AnvilRecipe.ID.getPath()); + public final static CategoryIdentifier INFUSION = InfusionRecipe.ID; public final static EntryStack END_STONE_SMELTER = EntryStack.create(EndBlocks.END_STONE_SMELTER); public final static EntryStack INFUSION_RITUAL = EntryStack.create(EndBlocks.INFUSION_PEDESTAL); @@ -69,12 +71,13 @@ public class REIPlugin implements REIPluginV0 { } @Override - public void registerPluginCategories(RecipeHelper recipeHelper) { - recipeHelper.registerCategories( + public void registerCategories(CategoryRegistry registry) { + registry.add( new REIAlloyingFuelCategory(), new REIAlloyingCategory(), new REIInfusionCategory(), - new REIAnvilCategory()); + new REIAnvilCategory() + ); } static { From 072e8b47dbddfaff6944b42880926af35c4ed5ef Mon Sep 17 00:00:00 2001 From: Frank Bauer Date: Thu, 24 Jun 2021 23:27:34 +0200 Subject: [PATCH 048/595] Make sure REI does compile (deactivated some code for the moment!) --- .../integration/rei/REIAnvilCategory.java | 2 +- .../integration/rei/REIContainer.java | 7 +-- .../integration/rei/REIInfusionCategory.java | 3 - .../betterend/integration/rei/REIPlugin.java | 60 ++++++++++--------- 4 files changed, 33 insertions(+), 39 deletions(-) diff --git a/src/main/java/ru/betterend/integration/rei/REIAnvilCategory.java b/src/main/java/ru/betterend/integration/rei/REIAnvilCategory.java index 3e11b3dd..479ef998 100644 --- a/src/main/java/ru/betterend/integration/rei/REIAnvilCategory.java +++ b/src/main/java/ru/betterend/integration/rei/REIAnvilCategory.java @@ -54,7 +54,7 @@ public class REIAnvilCategory implements TransferDisplayCategory inputEntries = display.getInputEntries(); EntryIngredient materials = inputEntries.get(1); int anvilLevel = display.getAnvilLevel(); - Collection> anvils = Arrays.stream(REIPlugin.ANVILS).filter(anvil -> { + List anvils = Arrays.stream(REIPlugin.ANVILS).filter(anvil -> { Block block = ((BlockItem) anvil.getValue()).getBlock(); if (block instanceof EndAnvilBlock) { return ((EndAnvilBlock) block).getCraftingLevel() >= anvilLevel; diff --git a/src/main/java/ru/betterend/integration/rei/REIContainer.java b/src/main/java/ru/betterend/integration/rei/REIContainer.java index 9d6a0118..47bfa4e8 100644 --- a/src/main/java/ru/betterend/integration/rei/REIContainer.java +++ b/src/main/java/ru/betterend/integration/rei/REIContainer.java @@ -1,14 +1,9 @@ package ru.betterend.integration.rei; -import me.shedaniel.rei.plugin.containers.CraftingContainerInfoWrapper; -import me.shedaniel.rei.server.ContainerInfoHandler; -import ru.betterend.client.gui.EndStoneSmelterScreenHandler; -import ru.betterend.recipe.builders.AlloyingRecipe; - public class REIContainer implements Runnable { @Override public void run() { - ContainerInfoHandler.registerContainerInfo(AlloyingRecipe.ID, CraftingContainerInfoWrapper.create(EndStoneSmelterScreenHandler.class)); + //ContainerInfoHandler.registerContainerInfo(AlloyingRecipe.ID, CraftingContainerInfoWrapper.create(EndStoneSmelterScreenHandler.class)); } } diff --git a/src/main/java/ru/betterend/integration/rei/REIInfusionCategory.java b/src/main/java/ru/betterend/integration/rei/REIInfusionCategory.java index 152a83b4..eeb77143 100644 --- a/src/main/java/ru/betterend/integration/rei/REIInfusionCategory.java +++ b/src/main/java/ru/betterend/integration/rei/REIInfusionCategory.java @@ -5,8 +5,6 @@ import com.mojang.blaze3d.vertex.PoseStack; import it.unimi.dsi.fastutil.ints.IntList; import me.shedaniel.math.Point; import me.shedaniel.math.Rectangle; -import me.shedaniel.rei.api.client.gui.DisplayRenderer; -import me.shedaniel.rei.api.client.gui.SimpleDisplayRenderer; import me.shedaniel.rei.api.client.gui.widgets.Widget; import me.shedaniel.rei.api.client.gui.widgets.Widgets; import me.shedaniel.rei.api.client.registry.display.TransferDisplayCategory; @@ -18,7 +16,6 @@ import net.minecraft.network.chat.TranslatableComponent; import net.minecraft.resources.ResourceLocation; import org.jetbrains.annotations.NotNull; import ru.betterend.BetterEnd; -import ru.betterend.recipe.builders.InfusionRecipe; import ru.betterend.registry.EndBlocks; import java.util.List; diff --git a/src/main/java/ru/betterend/integration/rei/REIPlugin.java b/src/main/java/ru/betterend/integration/rei/REIPlugin.java index c3779269..3400310a 100644 --- a/src/main/java/ru/betterend/integration/rei/REIPlugin.java +++ b/src/main/java/ru/betterend/integration/rei/REIPlugin.java @@ -1,17 +1,17 @@ package ru.betterend.integration.rei; import com.google.common.collect.Lists; -import me.shedaniel.rei.api.RecipeHelper; import me.shedaniel.rei.api.client.plugins.REIClientPlugin; import me.shedaniel.rei.api.client.registry.category.CategoryRegistry; import me.shedaniel.rei.api.common.category.CategoryIdentifier; import me.shedaniel.rei.api.common.entry.EntryStack; -import me.shedaniel.rei.plugin.DefaultPlugin; +import me.shedaniel.rei.api.common.util.EntryIngredients; +import me.shedaniel.rei.api.common.util.EntryStacks; +import me.shedaniel.rei.impl.ClientInternals; +import me.shedaniel.rei.plugin.common.DefaultPlugin; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.fabricmc.fabric.impl.content.registry.FuelRegistryImpl; import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.item.crafting.BlastingRecipe; import net.minecraft.world.level.block.Blocks; import ru.bclib.blocks.BaseFurnaceBlock; import ru.betterend.BetterEnd; @@ -22,6 +22,7 @@ import ru.betterend.recipe.builders.InfusionRecipe; import ru.betterend.registry.EndBlocks; import java.util.List; +import java.util.function.Supplier; import java.util.stream.Collectors; //https://github.com/shedaniel/RoughlyEnoughItems/blob/6.x-1.17/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/DefaultClientPlugin.java @@ -34,17 +35,21 @@ public class REIPlugin implements REIClientPlugin { public final static CategoryIdentifier SMITHING = CategoryIdentifier.of(BetterEnd.MOD_ID, AnvilRecipe.ID.getPath()); public final static CategoryIdentifier INFUSION = InfusionRecipe.ID; - public final static EntryStack END_STONE_SMELTER = EntryStack.create(EndBlocks.END_STONE_SMELTER); - public final static EntryStack INFUSION_RITUAL = EntryStack.create(EndBlocks.INFUSION_PEDESTAL); + public final static EntryStack END_STONE_SMELTER = EntryStacks.of(EndBlocks.END_STONE_SMELTER); + public final static EntryStack INFUSION_RITUAL = EntryStacks.of(EndBlocks.INFUSION_PEDESTAL); public final static EntryStack[] FURNACES; public final static EntryStack[] ANVILS; - @Override - public ResourceLocation getPluginIdentifier() { - return PLUGIN_ID; - } + //@Override + //public ResourceLocation getPluginIdentifier() { + // return PLUGIN_ID; + //} + + //public REIPlugin() { + // ClientInternals.attachInstance((Supplier) () -> this, PLUGIN_ID); + //} - @Override + /*@Override public void registerRecipeDisplays(RecipeHelper recipeHelper) { recipeHelper.registerRecipes(ALLOYING, AlloyingRecipe.class, REIAlloyingDisplay::new); recipeHelper.registerRecipes(ALLOYING, BlastingRecipe.class, REIAlloyingDisplay::new); @@ -52,23 +57,10 @@ public class REIPlugin implements REIClientPlugin { recipeHelper.registerRecipes(INFUSION, InfusionRecipe.class, REIInfusionDisplay::new); FuelRegistryImpl.INSTANCE.getFuelTimes().forEach((item, time) -> { if (time >= 2000) { - recipeHelper.registerDisplay(new REIAlloyingFuelDisplay(EntryStack.create(item), time)); + recipeHelper.registerDisplay(new REIAlloyingFuelDisplay(EntryStack.of(item), time)); } }); - } - - @Override - public void registerOthers(RecipeHelper recipeHelper) { - recipeHelper.registerWorkingStations(ALLOYING_FUEL, END_STONE_SMELTER); - recipeHelper.registerWorkingStations(ALLOYING, END_STONE_SMELTER); - recipeHelper.registerWorkingStations(INFUSION, INFUSION_RITUAL); - recipeHelper.registerWorkingStations(SMITHING, ANVILS); - recipeHelper.removeAutoCraftButton(ALLOYING_FUEL); - recipeHelper.removeAutoCraftButton(SMITHING); - - recipeHelper.registerWorkingStations(DefaultPlugin.SMELTING, FURNACES); - recipeHelper.registerWorkingStations(DefaultPlugin.FUEL, FURNACES); - } + }*/ @Override public void registerCategories(CategoryRegistry registry) { @@ -78,14 +70,24 @@ public class REIPlugin implements REIClientPlugin { new REIInfusionCategory(), new REIAnvilCategory() ); + + registry.addWorkstations(ALLOYING_FUEL, END_STONE_SMELTER); + registry.addWorkstations(ALLOYING, END_STONE_SMELTER); + registry.addWorkstations(INFUSION, INFUSION_RITUAL); + registry.addWorkstations(SMITHING, ANVILS); + registry.removePlusButton(ALLOYING_FUEL); + registry.removePlusButton(SMITHING); + + registry.addWorkstations(DefaultPlugin.SMELTING, FURNACES); + registry.addWorkstations(DefaultPlugin.FUEL, FURNACES); } static { - List anvils = Lists.newArrayList(EntryStack.ofItems(EndBlocks.getModBlocks().stream() + List anvils = Lists.newArrayList(EntryIngredients.ofItems(EndBlocks.getModBlocks().stream() .filter(EndAnvilBlock.class::isInstance).collect(Collectors.toList()))); - anvils.add(0, EntryStack.create(Blocks.ANVIL)); + anvils.add(0, EntryStacks.of(Blocks.ANVIL)); ANVILS = anvils.toArray(new EntryStack[0]); - FURNACES = Lists.newArrayList(EntryStack.ofItems(EndBlocks.getModBlocks().stream() + FURNACES = Lists.newArrayList(EntryIngredients.ofItems(EndBlocks.getModBlocks().stream() .filter(BaseFurnaceBlock.class::isInstance).collect(Collectors.toList()))) .toArray(new EntryStack[0]); } From e104752c6df31355bdbb06beb3139e9e879132ac Mon Sep 17 00:00:00 2001 From: Frank Bauer Date: Thu, 24 Jun 2021 23:27:49 +0200 Subject: [PATCH 049/595] Fixed argument mixin --- .../java/ru/betterend/mixin/common/LivingEntityMixin.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/ru/betterend/mixin/common/LivingEntityMixin.java b/src/main/java/ru/betterend/mixin/common/LivingEntityMixin.java index 67aec1fc..56382ae2 100644 --- a/src/main/java/ru/betterend/mixin/common/LivingEntityMixin.java +++ b/src/main/java/ru/betterend/mixin/common/LivingEntityMixin.java @@ -99,8 +99,8 @@ public abstract class LivingEntityMixin extends Entity { this.lastAttacker = source.getEntity(); } - @ModifyArg(method = "hurt", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/LivingEntity;knockback(DDD)V")) - private float be_increaseKnockback(float value, double x, double z) { + @ModifyArg(method = "hurt", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/LivingEntity;knockback(DDD)V"), index=0) + private double be_increaseKnockback(double value, double x, double z) { if (lastAttacker != null && lastAttacker instanceof LivingEntity) { LivingEntity attacker = (LivingEntity) lastAttacker; value += this.be_getKnockback(attacker.getMainHandItem().getItem()); From e25ab5698d1bbe3677ccc545fb21ae7755e096a8 Mon Sep 17 00:00:00 2001 From: Frank Bauer Date: Fri, 25 Jun 2021 00:00:09 +0200 Subject: [PATCH 050/595] Mixin Fixes --- .../client/ClientPlayNetworkHandlerMixin.java | 2 ++ .../mixin/client/ContextGsonAccessor.java | 14 ------------- .../client/HumanoidMobRendererMixin.java | 10 ++++----- .../mixin/client/PlayerRendererMixin.java | 10 ++++----- .../mixin/common/AnvilMenuMixin.java | 5 +++-- .../mixin/common/ChorusPlantBlockMixin.java | 2 +- .../common/ChunkBiomeContainerMixin.java | 11 +++++----- .../betterend/mixin/common/EntityMixin.java | 4 ++-- .../mixin/common/MinecraftServerMixin.java | 18 ++++++++-------- .../common/NoiseBasedChunkGeneratorMixin.java | 4 ++-- .../mixin/common/PlayerListMixin.java | 9 +++----- .../mixin/common/ServerPlayerMixin.java | 2 +- .../mixin/common/ShuffelingListMixin.java | 2 -- .../mixin/common/SpikeFeatureMixin.java | 21 ++++++++----------- 14 files changed, 45 insertions(+), 69 deletions(-) delete mode 100644 src/main/java/ru/betterend/mixin/client/ContextGsonAccessor.java diff --git a/src/main/java/ru/betterend/mixin/client/ClientPlayNetworkHandlerMixin.java b/src/main/java/ru/betterend/mixin/client/ClientPlayNetworkHandlerMixin.java index 6acaf8e9..8e7b7e23 100644 --- a/src/main/java/ru/betterend/mixin/client/ClientPlayNetworkHandlerMixin.java +++ b/src/main/java/ru/betterend/mixin/client/ClientPlayNetworkHandlerMixin.java @@ -1,5 +1,6 @@ package ru.betterend.mixin.client; +import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -18,6 +19,7 @@ import ru.bclib.client.gui.BlockSignEditScreen; @Mixin(ClientPacketListener.class) public class ClientPlayNetworkHandlerMixin { + @Final @Shadow private Minecraft minecraft; diff --git a/src/main/java/ru/betterend/mixin/client/ContextGsonAccessor.java b/src/main/java/ru/betterend/mixin/client/ContextGsonAccessor.java deleted file mode 100644 index 484b3a65..00000000 --- a/src/main/java/ru/betterend/mixin/client/ContextGsonAccessor.java +++ /dev/null @@ -1,14 +0,0 @@ -package ru.betterend.mixin.client; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -import com.google.gson.Gson; - -import net.minecraft.client.renderer.block.model.BlockModelDefinition; - -@Mixin(BlockModelDefinition.Context.class) -public interface ContextGsonAccessor { - @Accessor - Gson getGson(); -} diff --git a/src/main/java/ru/betterend/mixin/client/HumanoidMobRendererMixin.java b/src/main/java/ru/betterend/mixin/client/HumanoidMobRendererMixin.java index 47079dd2..f922d7b7 100644 --- a/src/main/java/ru/betterend/mixin/client/HumanoidMobRendererMixin.java +++ b/src/main/java/ru/betterend/mixin/client/HumanoidMobRendererMixin.java @@ -1,16 +1,14 @@ package ru.betterend.mixin.client; +import net.minecraft.client.model.HumanoidModel; import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.entity.HumanoidMobRenderer; +import net.minecraft.client.renderer.entity.MobRenderer; +import net.minecraft.world.entity.Mob; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import net.minecraft.client.model.HumanoidModel; -import net.minecraft.client.renderer.entity.EntityRenderDispatcher; -import net.minecraft.client.renderer.entity.HumanoidMobRenderer; -import net.minecraft.client.renderer.entity.MobRenderer; -import net.minecraft.world.entity.Mob; import ru.betterend.client.render.ArmoredElytraLayer; @Mixin(HumanoidMobRenderer.class) diff --git a/src/main/java/ru/betterend/mixin/client/PlayerRendererMixin.java b/src/main/java/ru/betterend/mixin/client/PlayerRendererMixin.java index 93c2fdb0..8c92033c 100644 --- a/src/main/java/ru/betterend/mixin/client/PlayerRendererMixin.java +++ b/src/main/java/ru/betterend/mixin/client/PlayerRendererMixin.java @@ -1,16 +1,14 @@ package ru.betterend.mixin.client; +import net.minecraft.client.model.PlayerModel; +import net.minecraft.client.player.AbstractClientPlayer; import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.entity.LivingEntityRenderer; +import net.minecraft.client.renderer.entity.player.PlayerRenderer; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import net.minecraft.client.model.PlayerModel; -import net.minecraft.client.player.AbstractClientPlayer; -import net.minecraft.client.renderer.entity.EntityRenderDispatcher; -import net.minecraft.client.renderer.entity.LivingEntityRenderer; -import net.minecraft.client.renderer.entity.player.PlayerRenderer; import ru.betterend.client.render.ArmoredElytraLayer; @Mixin(PlayerRenderer.class) diff --git a/src/main/java/ru/betterend/mixin/common/AnvilMenuMixin.java b/src/main/java/ru/betterend/mixin/common/AnvilMenuMixin.java index 4d2c61b6..92615cdf 100644 --- a/src/main/java/ru/betterend/mixin/common/AnvilMenuMixin.java +++ b/src/main/java/ru/betterend/mixin/common/AnvilMenuMixin.java @@ -65,7 +65,7 @@ public abstract class AnvilMenuMixin extends ItemCombinerMenu implements AnvilSc } @Inject(method = "onTake", at = @At("HEAD"), cancellable = true) - protected void be_onTakeOutput(Player player, ItemStack stack, CallbackInfoReturnable info) { + protected void be_onTakeOutput(Player player, ItemStack stack, CallbackInfo info) { if (be_currentRecipe != null) { inputSlots.getItem(0).shrink(be_currentRecipe.getInputCount()); stack = be_currentRecipe.craft(inputSlots, player); @@ -85,7 +85,8 @@ public abstract class AnvilMenuMixin extends ItemCombinerMenu implements AnvilSc world.levelEvent(1030, blockPos, 0); } }); - info.setReturnValue(stack); + //TODO: no more return, does this still work? + //info.setReturnValue(stack); } } diff --git a/src/main/java/ru/betterend/mixin/common/ChorusPlantBlockMixin.java b/src/main/java/ru/betterend/mixin/common/ChorusPlantBlockMixin.java index 43427483..eaa91743 100644 --- a/src/main/java/ru/betterend/mixin/common/ChorusPlantBlockMixin.java +++ b/src/main/java/ru/betterend/mixin/common/ChorusPlantBlockMixin.java @@ -46,7 +46,7 @@ public abstract class ChorusPlantBlockMixin extends Block { } } - @Inject(method = "getStateForPlacement", at = @At("RETURN"), cancellable = true) + @Inject(method = "getStateForPlacement(Lnet/minecraft/world/item/context/BlockPlaceContext;)Lnet/minecraft/world/level/block/state/BlockState;", at = @At("RETURN"), cancellable = true) private void be_getStateForPlacement(BlockPlaceContext ctx, CallbackInfoReturnable info) { BlockPos pos = ctx.getClickedPos(); Level world = ctx.getLevel(); diff --git a/src/main/java/ru/betterend/mixin/common/ChunkBiomeContainerMixin.java b/src/main/java/ru/betterend/mixin/common/ChunkBiomeContainerMixin.java index 4ff99959..2a10659e 100644 --- a/src/main/java/ru/betterend/mixin/common/ChunkBiomeContainerMixin.java +++ b/src/main/java/ru/betterend/mixin/common/ChunkBiomeContainerMixin.java @@ -27,11 +27,7 @@ public class ChunkBiomeContainerMixin implements IBiomeArray { @Final @Shadow - public static int HORIZONTAL_MASK; - - @Final - @Shadow - public static int VERTICAL_MASK; + private static int HORIZONTAL_MASK; @Override public void be_setBiome(Biome biome, BlockPos pos) { @@ -78,9 +74,12 @@ public class ChunkBiomeContainerMixin implements IBiomeArray { biomes[index] = biome; } + @Shadow @Final private int quartMinY; + @Shadow @Final private int quartHeight; + private int be_getArrayIndex(int biomeX, int biomeY, int biomeZ) { int i = biomeX & HORIZONTAL_MASK; - int j = Mth.clamp(biomeY, 0, VERTICAL_MASK); + int j = Mth.clamp(biomeY - this.quartMinY, 0, this.quartHeight); int k = biomeZ & HORIZONTAL_MASK; return j << WIDTH_BITS + WIDTH_BITS | k << WIDTH_BITS | i; } diff --git a/src/main/java/ru/betterend/mixin/common/EntityMixin.java b/src/main/java/ru/betterend/mixin/common/EntityMixin.java index 6504ed98..52a4f80a 100644 --- a/src/main/java/ru/betterend/mixin/common/EntityMixin.java +++ b/src/main/java/ru/betterend/mixin/common/EntityMixin.java @@ -19,9 +19,9 @@ import ru.betterend.interfaces.TeleportingEntity; @Mixin(Entity.class) public abstract class EntityMixin implements TeleportingEntity { @Shadow - public float yRot; + private float yRot; @Shadow - public float xRot; + private float xRot; @Shadow public Level level; diff --git a/src/main/java/ru/betterend/mixin/common/MinecraftServerMixin.java b/src/main/java/ru/betterend/mixin/common/MinecraftServerMixin.java index 1c3d5f0a..e6cf8cfd 100644 --- a/src/main/java/ru/betterend/mixin/common/MinecraftServerMixin.java +++ b/src/main/java/ru/betterend/mixin/common/MinecraftServerMixin.java @@ -22,7 +22,7 @@ import net.minecraft.world.level.storage.WorldData; import ru.betterend.world.generator.GeneratorOptions; @Mixin(MinecraftServer.class) -public class MinecraftServerMixin { +public abstract class MinecraftServerMixin { @Shadow private ServerResources resources; @@ -35,7 +35,7 @@ public class MinecraftServerMixin { protected WorldData worldData; @Inject(method = "overworld", at = @At(value = "HEAD"), cancellable = true) - private final void be_overworld(CallbackInfoReturnable info) { + private void be_overworld(CallbackInfoReturnable info) { if (GeneratorOptions.swapOverworldToEnd()) { ServerLevel world = levels.get(Level.END); if (world == null) { @@ -47,7 +47,7 @@ public class MinecraftServerMixin { } @Inject(method = "createLevels", at = @At(value = "TAIL")) - private final void be_createLevels(ChunkProgressListener worldGenerationProgressListener, CallbackInfo info) { + private void be_createLevels(ChunkProgressListener worldGenerationProgressListener, CallbackInfo info) { if (GeneratorOptions.swapOverworldToEnd()) { ServerLevel world = levels.get(Level.END); if (world == null) { @@ -57,20 +57,20 @@ public class MinecraftServerMixin { ServerLevelData serverWorldProperties = worldData.overworldData(); net.minecraft.world.level.levelgen.WorldGenSettings generatorOptions = worldData.worldGenSettings(); boolean bl = generatorOptions.isDebug(); - setInitialSpawn(world, serverWorldProperties, generatorOptions.generateBonusChest(), bl, true); + setInitialSpawn(world, serverWorldProperties, generatorOptions.generateBonusChest(), bl); } } - + + @Shadow private static void setInitialSpawn(ServerLevel serverLevel, ServerLevelData serverLevelData, boolean bl, boolean bl2) {}; + @Inject(method = "setInitialSpawn", at = @At(value = "HEAD"), cancellable = true) - private static void be_setInitialSpawn(ServerLevel world, ServerLevelData serverWorldProperties, boolean bonusChest, boolean debugWorld, boolean bl, CallbackInfo info) { + private static void be_setInitialSpawn(ServerLevel world, ServerLevelData serverWorldProperties, boolean bonusChest, boolean debugWorld, CallbackInfo info) { if (GeneratorOptions.swapOverworldToEnd() && world.dimension() == Level.OVERWORLD) { info.cancel(); } } - @Shadow - private static void setInitialSpawn(ServerLevel world, ServerLevelData serverWorldProperties, boolean bonusChest, boolean debugWorld, boolean bl) {} - + @Shadow public PlayerList getPlayerList() { return null; diff --git a/src/main/java/ru/betterend/mixin/common/NoiseBasedChunkGeneratorMixin.java b/src/main/java/ru/betterend/mixin/common/NoiseBasedChunkGeneratorMixin.java index 8d59913e..c39fa3e3 100644 --- a/src/main/java/ru/betterend/mixin/common/NoiseBasedChunkGeneratorMixin.java +++ b/src/main/java/ru/betterend/mixin/common/NoiseBasedChunkGeneratorMixin.java @@ -32,8 +32,8 @@ public abstract class NoiseBasedChunkGeneratorMixin extends ChunkGenerator { TerrainGenerator.initNoise(seed); } - @Inject(method = "fillNoiseColumn([DII)V", at = @At("HEAD"), cancellable = true, allow = 2) - private void be_fillNoiseColumn(double[] buffer, int x, int z, CallbackInfo info) { + @Inject(method = "fillNoiseColumn([DIIII)V", at = @At("HEAD"), cancellable = true, allow = 2) + private void be_fillNoiseColumn(double[] buffer, int x, int z, int k, int l, CallbackInfo info) { if (GeneratorOptions.useNewGenerator() && settings.get().stable(NoiseGeneratorSettings.END)) { TerrainGenerator.fillTerrainDensity(buffer, x, z, getBiomeSource()); info.cancel(); diff --git a/src/main/java/ru/betterend/mixin/common/PlayerListMixin.java b/src/main/java/ru/betterend/mixin/common/PlayerListMixin.java index 97a9f1b2..8eeb51d3 100644 --- a/src/main/java/ru/betterend/mixin/common/PlayerListMixin.java +++ b/src/main/java/ru/betterend/mixin/common/PlayerListMixin.java @@ -163,9 +163,9 @@ public class PlayerListMixin { this.broadcastAll(new ClientboundPlayerInfoPacket(ClientboundPlayerInfoPacket.Action.ADD_PLAYER, new ServerPlayer[] { serverPlayer })); - for (int i = 0; i < this.players.size(); ++i) { + for (ServerPlayer player : this.players) { serverPlayer.connection.send(new ClientboundPlayerInfoPacket(ClientboundPlayerInfoPacket.Action.ADD_PLAYER, - new ServerPlayer[] { (ServerPlayer) this.players.get(i) })); + new ServerPlayer[]{(ServerPlayer) player})); } serverLevel3.addNewPlayer(serverPlayer); @@ -176,10 +176,7 @@ public class PlayerListMixin { this.server.isResourcePackRequired(), this.server.getResourcePackPrompt()); } - Iterator var24 = serverPlayer.getActiveEffects().iterator(); - - while (var24.hasNext()) { - MobEffectInstance statusEffectInstance = (MobEffectInstance) var24.next(); + for (MobEffectInstance statusEffectInstance : serverPlayer.getActiveEffects()) { serverPlayNetworkHandler .send(new ClientboundUpdateMobEffectPacket(serverPlayer.getId(), statusEffectInstance)); } diff --git a/src/main/java/ru/betterend/mixin/common/ServerPlayerMixin.java b/src/main/java/ru/betterend/mixin/common/ServerPlayerMixin.java index dad6df0d..eb7a99d1 100644 --- a/src/main/java/ru/betterend/mixin/common/ServerPlayerMixin.java +++ b/src/main/java/ru/betterend/mixin/common/ServerPlayerMixin.java @@ -132,7 +132,7 @@ public abstract class ServerPlayerMixin extends Player implements TeleportingEnt } @Shadow - abstract ServerLevel getLevel(); + public abstract ServerLevel getLevel(); @Shadow abstract void triggerDimensionChangeTriggers(ServerLevel origin); diff --git a/src/main/java/ru/betterend/mixin/common/ShuffelingListMixin.java b/src/main/java/ru/betterend/mixin/common/ShuffelingListMixin.java index f1823dbc..3f709fba 100644 --- a/src/main/java/ru/betterend/mixin/common/ShuffelingListMixin.java +++ b/src/main/java/ru/betterend/mixin/common/ShuffelingListMixin.java @@ -7,8 +7,6 @@ import org.spongepowered.asm.mixin.Shadow; import ru.betterend.util.ShuffelingListExtended; import java.util.List; -import java.util.Random; -import java.util.stream.Stream; @Mixin(ShufflingList.class) public abstract class ShuffelingListMixin implements ShuffelingListExtended { diff --git a/src/main/java/ru/betterend/mixin/common/SpikeFeatureMixin.java b/src/main/java/ru/betterend/mixin/common/SpikeFeatureMixin.java index 67bdf428..3a4c5e48 100644 --- a/src/main/java/ru/betterend/mixin/common/SpikeFeatureMixin.java +++ b/src/main/java/ru/betterend/mixin/common/SpikeFeatureMixin.java @@ -1,38 +1,35 @@ package ru.betterend.mixin.common; -import java.util.Random; - -import net.minecraft.core.Vec3i; -import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; +import net.minecraft.core.Vec3i; import net.minecraft.nbt.CompoundTag; import net.minecraft.util.Mth; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.boss.enderdragon.EndCrystal; import net.minecraft.world.level.ServerLevelAccessor; -import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.IronBarsBlock; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.Heightmap.Types; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.SpikeFeature; import net.minecraft.world.level.levelgen.feature.configurations.SpikeConfiguration; import net.minecraft.world.level.levelgen.structure.templatesystem.StructurePlaceSettings; import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import ru.bclib.api.WorldDataAPI; import ru.bclib.util.BlocksHelper; import ru.bclib.util.StructureHelper; import ru.betterend.BetterEnd; import ru.betterend.world.generator.GeneratorOptions; +import java.util.Random; + @Mixin(SpikeFeature.class) public class SpikeFeatureMixin { @Inject(method = "place", at = @At("HEAD"), cancellable = true) From 42b436e4082c8569257116225fc5ab8033d40e0b Mon Sep 17 00:00:00 2001 From: Frank Bauer Date: Fri, 25 Jun 2021 00:00:30 +0200 Subject: [PATCH 051/595] Type changes --- src/main/java/ru/betterend/recipe/builders/AlloyingRecipe.java | 3 ++- src/main/java/ru/betterend/recipe/builders/InfusionRecipe.java | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/ru/betterend/recipe/builders/AlloyingRecipe.java b/src/main/java/ru/betterend/recipe/builders/AlloyingRecipe.java index 98e79b2c..0f962887 100644 --- a/src/main/java/ru/betterend/recipe/builders/AlloyingRecipe.java +++ b/src/main/java/ru/betterend/recipe/builders/AlloyingRecipe.java @@ -3,6 +3,7 @@ package ru.betterend.recipe.builders; import com.google.gson.JsonArray; import com.google.gson.JsonObject; +import me.shedaniel.rei.api.common.category.CategoryIdentifier; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.core.NonNullList; @@ -32,7 +33,7 @@ public class AlloyingRecipe implements Recipe, BetterEndRecipe { public final static String GROUP = "alloying"; public final static RecipeType TYPE = BCLRecipeManager.registerType(BetterEnd.MOD_ID, GROUP); public final static Serializer SERIALIZER = BCLRecipeManager.registerSerializer(BetterEnd.MOD_ID, GROUP, new Serializer()); - public final static ResourceLocation ID = BetterEnd.makeID(GROUP); + public final static CategoryIdentifier ID = CategoryIdentifier.of(BetterEnd.MOD_ID, GROUP); protected final RecipeType type; protected final ResourceLocation id; diff --git a/src/main/java/ru/betterend/recipe/builders/InfusionRecipe.java b/src/main/java/ru/betterend/recipe/builders/InfusionRecipe.java index b05b2f37..1773c10d 100644 --- a/src/main/java/ru/betterend/recipe/builders/InfusionRecipe.java +++ b/src/main/java/ru/betterend/recipe/builders/InfusionRecipe.java @@ -4,6 +4,7 @@ import java.util.Arrays; import com.google.gson.JsonObject; +import me.shedaniel.rei.api.common.category.CategoryIdentifier; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.core.NonNullList; @@ -29,7 +30,7 @@ public class InfusionRecipe implements Recipe, BetterEndRecipe { public final static String GROUP = "infusion"; public final static RecipeType TYPE = BCLRecipeManager.registerType(BetterEnd.MOD_ID, GROUP); public final static Serializer SERIALIZER = BCLRecipeManager.registerSerializer(BetterEnd.MOD_ID, GROUP, new Serializer()); - public final static ResourceLocation ID = BetterEnd.makeID(GROUP); + public final static CategoryIdentifier ID = CategoryIdentifier.of(BetterEnd.MOD_ID, GROUP); private final ResourceLocation id; private final Ingredient[] catalysts; From daefcc4dbfa7957245e92388eae89ec6f540aae2 Mon Sep 17 00:00:00 2001 From: Aleksey Date: Sun, 27 Jun 2021 17:30:15 +0300 Subject: [PATCH 052/595] Fix #216 and #217 --- build.gradle | 6 +++++- gradle.properties | 2 +- src/main/java/ru/betterend/blocks/EndStoneSmelter.java | 4 ++-- .../blocks/entities/EndStoneSmelterBlockEntity.java | 6 +++--- src/main/resources/fabric.mod.json | 2 +- 5 files changed, 12 insertions(+), 8 deletions(-) diff --git a/build.gradle b/build.gradle index 83414897..4411ad02 100644 --- a/build.gradle +++ b/build.gradle @@ -70,12 +70,16 @@ def useApi(String dep) { processResources { inputs.property "version", project.version - duplicatesStrategy = 'WARN' + duplicatesStrategy = 'EXCLUDE' from(sourceSets.main.resources.srcDirs) { include "fabric.mod.json" expand "version": project.version } + + from(sourceSets.main.resources.srcDirs) { + exclude "fabric.mod.json" + } } // ensure that the encoding is set to UTF-8, no matter what the system default is diff --git a/gradle.properties b/gradle.properties index 7c15972e..5f798ac2 100644 --- a/gradle.properties +++ b/gradle.properties @@ -17,5 +17,5 @@ archives_base_name = better-end patchouli_version = 50-FABRIC fabric_version = 0.32.9+1.16 canvas_version = 1.0.+ -bclib_version = 0.1.42 +bclib_version = 0.1.44 rei_version = 5.8.10 \ No newline at end of file diff --git a/src/main/java/ru/betterend/blocks/EndStoneSmelter.java b/src/main/java/ru/betterend/blocks/EndStoneSmelter.java index 46e17878..2cf18798 100644 --- a/src/main/java/ru/betterend/blocks/EndStoneSmelter.java +++ b/src/main/java/ru/betterend/blocks/EndStoneSmelter.java @@ -52,7 +52,7 @@ public class EndStoneSmelter extends BaseBlockWithEntity { .resistance(100F) .requiresCorrectToolForDrops() .sound(SoundType.STONE)); - this.registerDefaultState(this.stateDefinition.any() + registerDefaultState(this.stateDefinition.any() .setValue(FACING, Direction.NORTH) .setValue(LIT, false)); } @@ -75,7 +75,7 @@ public class EndStoneSmelter extends BaseBlockWithEntity { @Override public BlockState getStateForPlacement(BlockPlaceContext ctx) { - return this.defaultBlockState().setValue(FACING, ctx.getHorizontalDirection().getOpposite()); + return defaultBlockState().setValue(FACING, ctx.getHorizontalDirection().getOpposite()); } @Override diff --git a/src/main/java/ru/betterend/blocks/entities/EndStoneSmelterBlockEntity.java b/src/main/java/ru/betterend/blocks/entities/EndStoneSmelterBlockEntity.java index 49516b35..27c54ef4 100644 --- a/src/main/java/ru/betterend/blocks/entities/EndStoneSmelterBlockEntity.java +++ b/src/main/java/ru/betterend/blocks/entities/EndStoneSmelterBlockEntity.java @@ -246,7 +246,7 @@ public class EndStoneSmelterBlockEntity extends BaseContainerBlockEntity impleme if (recipe == null) { recipe = level.getRecipeManager().getRecipeFor(RecipeType.BLASTING, this, level).orElse(null); } - boolean accepted = this.canAcceptRecipeOutput(recipe); + boolean accepted = canAcceptRecipeOutput(recipe); if (!burning && accepted) { burnTime = getFuelTime(fuel); fuelTime = burnTime; @@ -265,7 +265,7 @@ public class EndStoneSmelterBlockEntity extends BaseContainerBlockEntity impleme } if (burning && accepted) { - this.smeltTime++; + smeltTime++; if (smeltTime == smeltTimeTotal) { smeltTime = 0; smeltTimeTotal = getSmeltTime(); @@ -276,7 +276,7 @@ public class EndStoneSmelterBlockEntity extends BaseContainerBlockEntity impleme smeltTime = 0; } } - + burning = isBurning(); if (initialBurning != burning) { level.setBlock(worldPosition, level.getBlockState(worldPosition).setValue(EndStoneSmelter.LIT, burning), 3); setChanged(); diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 90a89ea6..6e5c72a4 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -46,7 +46,7 @@ "fabricloader": ">=0.11.0", "fabric": ">=0.32.0", "minecraft": ">=1.16.4", - "bclib": ">=0.1.42" + "bclib": ">=0.1.44" }, "suggests": { "byg": ">=1.1.3", From 90f865d1afba4cc8a98a1007b7570caf077f887a Mon Sep 17 00:00:00 2001 From: Frank Bauer Date: Mon, 28 Jun 2021 12:14:56 +0200 Subject: [PATCH 053/595] Fixed model Bugs --- .../entity/model/CubozoaEntityModel.java | 4 +-- .../entity/model/DragonflyEntityModel.java | 18 +++++------ .../entity/model/EndSlimeEntityModel.java | 30 ++++++++++++++----- .../{REIPlugin.java => REIPluginClient.java} | 5 +++- 4 files changed, 38 insertions(+), 19 deletions(-) rename src/main/java/ru/betterend/integration/rei/{REIPlugin.java => REIPluginClient.java} (92%) diff --git a/src/main/java/ru/betterend/entity/model/CubozoaEntityModel.java b/src/main/java/ru/betterend/entity/model/CubozoaEntityModel.java index d0651499..191f2554 100644 --- a/src/main/java/ru/betterend/entity/model/CubozoaEntityModel.java +++ b/src/main/java/ru/betterend/entity/model/CubozoaEntityModel.java @@ -111,8 +111,8 @@ public class CubozoaEntityModel extends BlockBenchModel { model = modelPart.getChild(PartNames.BODY); for (int i=1; i<=TENTACLE_COUNT; i++){ - tentacle_center[i] = model.getChild("tentacle_center_"+i); - tentacle[i] = tentacle_center[i].getChild("tentacle_"+i); + tentacle_center[i-1] = model.getChild("tentacle_center_"+i); + tentacle[i-1] = tentacle_center[i-1].getChild("tentacle_"+i); } } diff --git a/src/main/java/ru/betterend/entity/model/DragonflyEntityModel.java b/src/main/java/ru/betterend/entity/model/DragonflyEntityModel.java index 8885af2f..aaf1bc9f 100644 --- a/src/main/java/ru/betterend/entity/model/DragonflyEntityModel.java +++ b/src/main/java/ru/betterend/entity/model/DragonflyEntityModel.java @@ -145,15 +145,15 @@ public class DragonflyEntityModel extends BlockBenchModel { super(RenderType::entityCutout); model = modelPart.getChild(PartNames.BODY); - head = modelPart.getChild(PartNames.HEAD); - tail = modelPart.getChild(PartNames.TAIL); - tail_2 = modelPart.getChild(PartNames.TAIL_FIN); - wing_1 = modelPart.getChild(PartNames.LEFT_WING); - wing_2 = modelPart.getChild(PartNames.RIGHT_WING); - wing_3 = modelPart.getChild(PartNames.LEFT_WING_TIP); - wing_4 = modelPart.getChild(PartNames.RIGHT_WING_BASE); - legs_1 = modelPart.getChild(PartNames.LEFT_LEG); - legs_2 = modelPart.getChild(PartNames.RIGHT_LEG); + head = model.getChild(PartNames.HEAD); + tail = model.getChild(PartNames.TAIL); + tail_2 = tail.getChild(PartNames.TAIL_FIN); + wing_1 = model.getChild(PartNames.LEFT_WING); + wing_2 = model.getChild(PartNames.RIGHT_WING); + wing_3 = model.getChild(PartNames.LEFT_WING_BASE); + wing_4 = model.getChild(PartNames.RIGHT_WING_BASE); + legs_1 = model.getChild(PartNames.LEFT_LEG); + legs_2 = model.getChild(PartNames.RIGHT_LEG); } @Override diff --git a/src/main/java/ru/betterend/entity/model/EndSlimeEntityModel.java b/src/main/java/ru/betterend/entity/model/EndSlimeEntityModel.java index 2abf6c55..54609256 100644 --- a/src/main/java/ru/betterend/entity/model/EndSlimeEntityModel.java +++ b/src/main/java/ru/betterend/entity/model/EndSlimeEntityModel.java @@ -120,15 +120,23 @@ public class EndSlimeEntityModel extends ListModel return LayerDefinition.create(modelData, 64, 32); } - public EndSlimeEntityModel(ModelPart modelPart) { + public EndSlimeEntityModel(ModelPart modelPart, boolean onlyShell) { super(RenderType::entityCutout); innerCube = modelPart.getChild(PartNames.BODY); - rightEye = modelPart.getChild(PartNames.RIGHT_EYE); - leftEye = modelPart.getChild(PartNames.LEFT_EYE); - mouth = modelPart.getChild(PartNames.MOUTH); - flower = modelPart.getChild("flower"); - crop = modelPart.getChild("crop"); + if (!onlyShell) { + rightEye = modelPart.getChild(PartNames.RIGHT_EYE); + leftEye = modelPart.getChild(PartNames.LEFT_EYE); + mouth = modelPart.getChild(PartNames.MOUTH); + flower = modelPart.getChild("flower"); + crop = modelPart.getChild("crop"); + } else { + rightEye = null; + leftEye = null; + mouth = null; + flower = null; + crop = null; + } } @Override @@ -144,8 +152,16 @@ public class EndSlimeEntityModel extends ListModel crop.render(matrices, vertices, light, overlay); } + private boolean isOnlyShell(){ + return rightEye==null; + } + @Override public Iterable parts() { - return ImmutableList.of(this.innerCube, this.rightEye, this.leftEye, this.mouth); + if (isOnlyShell()) { + return ImmutableList.of(this.innerCube); + } else { + return ImmutableList.of(this.innerCube, this.rightEye, this.leftEye, this.mouth); + } } } diff --git a/src/main/java/ru/betterend/integration/rei/REIPlugin.java b/src/main/java/ru/betterend/integration/rei/REIPluginClient.java similarity index 92% rename from src/main/java/ru/betterend/integration/rei/REIPlugin.java rename to src/main/java/ru/betterend/integration/rei/REIPluginClient.java index 3400310a..287f5016 100644 --- a/src/main/java/ru/betterend/integration/rei/REIPlugin.java +++ b/src/main/java/ru/betterend/integration/rei/REIPluginClient.java @@ -5,6 +5,7 @@ import me.shedaniel.rei.api.client.plugins.REIClientPlugin; import me.shedaniel.rei.api.client.registry.category.CategoryRegistry; import me.shedaniel.rei.api.common.category.CategoryIdentifier; import me.shedaniel.rei.api.common.entry.EntryStack; +import me.shedaniel.rei.api.common.plugins.REIServerPlugin; import me.shedaniel.rei.api.common.util.EntryIngredients; import me.shedaniel.rei.api.common.util.EntryStacks; import me.shedaniel.rei.impl.ClientInternals; @@ -20,6 +21,7 @@ import ru.betterend.recipe.builders.AlloyingRecipe; import ru.betterend.recipe.builders.AnvilRecipe; import ru.betterend.recipe.builders.InfusionRecipe; import ru.betterend.registry.EndBlocks; +import org.jetbrains.annotations.ApiStatus; import java.util.List; import java.util.function.Supplier; @@ -27,7 +29,8 @@ import java.util.stream.Collectors; //https://github.com/shedaniel/RoughlyEnoughItems/blob/6.x-1.17/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/DefaultClientPlugin.java @Environment(EnvType.CLIENT) -public class REIPlugin implements REIClientPlugin { +@ApiStatus.Internal +public class REIPlugin implements me.shedaniel.rei.api.client.plugins.REIClientPlugin { public final static ResourceLocation PLUGIN_ID = BetterEnd.makeID("rei_plugin"); public final static CategoryIdentifier ALLOYING_FUEL = CategoryIdentifier.of(BetterEnd.MOD_ID, "alloying_fuel"); From fb645f8f583936f9ef83a8498120f5138a7ee195 Mon Sep 17 00:00:00 2001 From: Frank Bauer Date: Mon, 28 Jun 2021 12:15:48 +0200 Subject: [PATCH 054/595] Fixed some class names --- src/main/java/ru/betterend/registry/EndEntities.java | 5 +++-- src/main/java/ru/betterend/registry/EndFeatures.java | 5 ++++- src/main/java/ru/betterend/registry/EndItems.java | 3 ++- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/main/java/ru/betterend/registry/EndEntities.java b/src/main/java/ru/betterend/registry/EndEntities.java index 0dedbfac..35138b6c 100644 --- a/src/main/java/ru/betterend/registry/EndEntities.java +++ b/src/main/java/ru/betterend/registry/EndEntities.java @@ -9,6 +9,7 @@ import net.minecraft.world.entity.EntityDimensions; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.EntityType.EntityFactory; import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.Mob; import net.minecraft.world.entity.MobCategory; import net.minecraft.world.entity.ai.attributes.AttributeSupplier.Builder; import ru.bclib.util.ColorUtil; @@ -47,8 +48,8 @@ public class EndEntities { } return type; } - - private static EntityType register(String name, MobCategory group, float width, float height, EntityFactory entity, Builder attributes, boolean fixedSize, int eggColor, int dotsColor) { + + private static EntityType register(String name, MobCategory group, float width, float height, EntityFactory entity, Builder attributes, boolean fixedSize, int eggColor, int dotsColor) { ResourceLocation id = BetterEnd.makeID(name); EntityType type = FabricEntityTypeBuilder.create(group, entity).dimensions(fixedSize ? EntityDimensions.fixed(width, height) : EntityDimensions.scalable(width, height)).build(); if (Configs.ENTITY_CONFIG.getBooleanRoot(id.getPath(), true)) { diff --git a/src/main/java/ru/betterend/registry/EndFeatures.java b/src/main/java/ru/betterend/registry/EndFeatures.java index 0983d21f..73168e37 100644 --- a/src/main/java/ru/betterend/registry/EndFeatures.java +++ b/src/main/java/ru/betterend/registry/EndFeatures.java @@ -19,6 +19,7 @@ import net.minecraft.world.level.levelgen.placement.FeatureDecorator; import ru.bclib.api.BiomeAPI; import ru.bclib.world.biomes.BCLBiome; import ru.bclib.world.biomes.BCLBiomeDef; +import ru.bclib.world.features.BCLDecorators; import ru.bclib.world.features.BCLFeature; import ru.bclib.world.features.DefaultFeature; import ru.betterend.BetterEnd; @@ -239,7 +240,9 @@ public class EndFeatures { public static final DefaultFeature END_STONE_STALACTITE_CAVEMOSS = new StalactiteFeature(true, EndBlocks.END_STONE_STALACTITE_CAVEMOSS, Blocks.END_STONE, EndBlocks.CAVE_MOSS); public static final DefaultFeature END_STONE_STALAGMITE_CAVEMOSS = new StalactiteFeature(false, EndBlocks.END_STONE_STALACTITE_CAVEMOSS, EndBlocks.CAVE_MOSS); public static final DefaultFeature CAVE_PUMPKIN = new CavePumpkinFeature(); - + + + private static BCLFeature redisterVegetation(String name, Feature feature, int density) { return BCLFeature.makeVegetationFeature(BetterEnd.makeID(name), feature, density); } diff --git a/src/main/java/ru/betterend/registry/EndItems.java b/src/main/java/ru/betterend/registry/EndItems.java index f37b456a..e302d163 100644 --- a/src/main/java/ru/betterend/registry/EndItems.java +++ b/src/main/java/ru/betterend/registry/EndItems.java @@ -2,6 +2,7 @@ package ru.betterend.registry; import java.util.List; +import net.minecraft.world.entity.Mob; import org.jetbrains.annotations.NotNull; import net.fabricmc.fabric.api.item.v1.FabricItemSettings; @@ -175,7 +176,7 @@ public class EndItems extends ItemsRegistry { return getItemRegistry().registerTool(name, item); } - public static Item registerEndEgg(String name, EntityType type, int background, int dots) { + public static Item registerEndEgg(String name, EntityType type, int background, int dots) { return getItemRegistry().registerEgg(name, type, background, dots); } From 3d6f0adc5651a07ca3fd6ab2fda92ef51d280992 Mon Sep 17 00:00:00 2001 From: Frank Bauer Date: Mon, 28 Jun 2021 12:20:31 +0200 Subject: [PATCH 055/595] Added Patchouli back --- build.gradle | 2 +- gradle.properties | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 852dd540..1d3129bc 100644 --- a/build.gradle +++ b/build.gradle @@ -32,7 +32,7 @@ dependencies { modImplementation "net.fabricmc:fabric-loader:${project.loader_version}" modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}" - //useApi "vazkii.patchouli:Patchouli:1.16.4-${project.patchouli_version}" + useApi "vazkii.patchouli:Patchouli:1.17-${project.patchouli_version}" useApi "com.github.paulevsGitch:BCLib:${project.bclib_version}" useOptional "me.shedaniel:RoughlyEnoughItems-fabric:${project.rei_version}" diff --git a/gradle.properties b/gradle.properties index 303d7ccc..942e0feb 100644 --- a/gradle.properties +++ b/gradle.properties @@ -14,7 +14,7 @@ archives_base_name = better-end # Dependencies # currently not on the main fabric site, check on the maven: https://maven.fabricmc.net/net/fabricmc/fabric-api/fabric-api -patchouli_version = 50-FABRIC +patchouli_version = 55-FABRIC-SNAPSHOT fabric_version = 0.36.0+1.17 canvas_version = 1.0.+ bclib_version = 0.1.43 From 770f12ee200c8c9fd40ac85f1f8148a7022ddb5c Mon Sep 17 00:00:00 2001 From: Frank Bauer Date: Mon, 28 Jun 2021 17:35:10 +0200 Subject: [PATCH 056/595] Fixed UV-Coordinate rendering --- Convert.java | 48 ++++-- .../client/render/EndCrystalRenderer.java | 8 +- .../client/render/EternalCrystalRenderer.java | 20 +-- .../entity/model/CubozoaEntityModel.java | 2 +- .../entity/model/EndSlimeEntityModel.java | 7 +- .../entity/model/SilkMothEntityModel.java | 138 +++++++++--------- .../entity/render/RendererEntityEndSlime.java | 6 +- .../item/model/ArmoredElytraModel.java | 8 +- .../item/model/CrystaliteBootsModel.java | 21 ++- .../item/model/CrystaliteChestplateModel.java | 32 ++-- .../item/model/CrystaliteHelmetModel.java | 17 ++- .../item/model/CrystaliteLeggingsModel.java | 24 ++- 12 files changed, 204 insertions(+), 127 deletions(-) diff --git a/Convert.java b/Convert.java index 3e7e914b..3de64d73 100644 --- a/Convert.java +++ b/Convert.java @@ -94,14 +94,18 @@ class ModelPart { } s += "PartDefinition " + name + " = "; s += pName+".addOrReplaceChild(\""+name+"\", CubeListBuilder.create()\n"; - if (this.mirror) s+= ".mirror()\n"; + if (this.mirror) s+= ".mirror()\n"; + s+= ".texOffs("+u+", "+v+")"; if (this.hadBox) { + s+= "\n"; if (scale!=1) - s+= ".addBox("+bx+"f, "+by+"f, "+bz+"f, "+ba+"f, "+bb+"f, "+bc+"f, deformation_"+name+")\n"; + s+= ".addBox("+bx+"f, "+by+"f, "+bz+"f, "+ba+"f, "+bb+"f, "+bc+"f, deformation_"+name+"),\n"; else - s+= ".addBox("+bx+"f, "+by+"f, "+bz+"f, "+ba+"f, "+bb+"f, "+bc+"f)\n"; + s+= ".addBox("+bx+"f, "+by+"f, "+bz+"f, "+ba+"f, "+bb+"f, "+bc+"f),\n"; + } else { + s+= ",\n"; } - s+= ".texOffs("+u+", "+v+"),\n"; + if (x==0 && y==0 && z==0 && rx==0 && ry==0 && rz==0){ s+= "PartPose.ZERO"; } else if (rx==0 && ry==0 && rz==0){ @@ -144,13 +148,33 @@ public class Convert { p.setRotationAngle(x, y, z); } public void c (){ - float scale = 0; - ModelPart[] SHARDS = new ModelPart[4]; - SHARDS[0] = new ModelPart(16, 16, 2, 4, "SHARDS[0]").addBox(-5.0F, 1.0F, -3.0F, 2.0F, 8.0F, 2.0F); - SHARDS[1] = new ModelPart(16, 16, 2, 4, "SHARDS[1]").addBox(3.0F, -1.0F, -1.0F, 2.0F, 8.0F, 2.0F); - SHARDS[2] = new ModelPart(16, 16, 2, 4, "SHARDS[2]").addBox(-1.0F, 0.0F, -5.0F, 2.0F, 4.0F, 2.0F); - SHARDS[3] = new ModelPart(16, 16, 2, 4, "SHARDS[3]").addBox(0.0F, 3.0F, 4.0F, 2.0F, 6.0F, 2.0F); - ModelPart CORE = new ModelPart(16, 16, 0, 0, "CORE"); - CORE.addBox(-2.0F, -2.0F, -2.0F, 4.0F, 12.0F, 4.0F); + float scale = 1; + ModelPart partC = new ModelPart(64, 64, 0, 19, "partC"); + partC.addBox(1.0F, 0.0F, 1.0F, 14.0F, 9.0F, 14.0F, 0.0F); + ModelPart partA = new ModelPart(64, 64, 0, 0,"partA"); + partA.addBox(1.0F, 0.0F, 0.0F, 14.0F, 5.0F, 14.0F, 0.0F); + partA.y = 9.0F; + partA.z = 1.0F; + ModelPart partB = new ModelPart(64, 64, 0, 0, "partB"); + partB.addBox(7.0F, -1.0F, 15.0F, 2.0F, 4.0F, 1.0F, 0.0F); + partB.y = 8.0F; + ModelPart partRightC = new ModelPart(64, 64, 0, 19, "partRightC"); + partRightC.addBox(1.0F, 0.0F, 1.0F, 15.0F, 9.0F, 14.0F, 0.0F); + ModelPart partRightA = new ModelPart(64, 64, 0, 0, "partRightA"); + partRightA.addBox(1.0F, 0.0F, 0.0F, 15.0F, 5.0F, 14.0F, 0.0F); + partRightA.y = 9.0F; + partRightA.z = 1.0F; + ModelPart partRightB = new ModelPart(64, 64, 0, 0, "partRightB"); + partRightB.addBox(15.0F, -1.0F, 15.0F, 1.0F, 4.0F, 1.0F, 0.0F); + partRightB.y = 8.0F; + ModelPart partLeftC = new ModelPart(64, 64, 0, 19, "partLeftC"); + partLeftC.addBox(0.0F, 0.0F, 1.0F, 15.0F, 9.0F, 14.0F, 0.0F); + ModelPart partLeftA = new ModelPart(64, 64, 0, 0, "partLeftA"); + partLeftA.addBox(0.0F, 0.0F, 0.0F, 15.0F, 5.0F, 14.0F, 0.0F); + partLeftA.y = 9.0F; + partLeftA.z = 1.0F; + ModelPart partLeftB = new ModelPart(64, 64, 0, 0, "partLeftB"); + partLeftB.addBox(0.0F, -1.0F, 15.0F, 1.0F, 4.0F, 1.0F, 0.0F); + partLeftB.y = 8.0F; } } diff --git a/src/main/java/ru/betterend/client/render/EndCrystalRenderer.java b/src/main/java/ru/betterend/client/render/EndCrystalRenderer.java index 7686b156..abd37797 100644 --- a/src/main/java/ru/betterend/client/render/EndCrystalRenderer.java +++ b/src/main/java/ru/betterend/client/render/EndCrystalRenderer.java @@ -51,13 +51,13 @@ public class EndCrystalRenderer { MeshDefinition modelData = new MeshDefinition(); PartDefinition modelPartData = modelData.getRoot(); modelPartData.addOrReplaceChild("FRAME", CubeListBuilder.create() - .addBox(-4.0f, -4.0f, -4.0f, 8.0f, 8.0f, 8.0f) - .texOffs(0, 0), + .texOffs(0, 0) + .addBox(-4.0f, -4.0f, -4.0f, 8.0f, 8.0f, 8.0f), PartPose.ZERO); modelPartData.addOrReplaceChild("CORE", CubeListBuilder.create() - .addBox(-4.0f, -4.0f, -4.0f, 8.0f, 8.0f, 8.0f) - .texOffs(32, 0), + .texOffs(32, 0) + .addBox(-4.0f, -4.0f, -4.0f, 8.0f, 8.0f, 8.0f), PartPose.ZERO); return LayerDefinition.create(modelData, 64, 32); diff --git a/src/main/java/ru/betterend/client/render/EternalCrystalRenderer.java b/src/main/java/ru/betterend/client/render/EternalCrystalRenderer.java index 452ac2f5..7baa3672 100644 --- a/src/main/java/ru/betterend/client/render/EternalCrystalRenderer.java +++ b/src/main/java/ru/betterend/client/render/EternalCrystalRenderer.java @@ -66,28 +66,28 @@ public class EternalCrystalRenderer { MeshDefinition modelData = new MeshDefinition(); PartDefinition modelPartData = modelData.getRoot(); modelPartData.addOrReplaceChild("SHARDS_0", CubeListBuilder.create() - .addBox(-5.0f, 1.0f, -3.0f, 2.0f, 8.0f, 2.0f) - .texOffs(2, 4), + .texOffs(2, 4) + .addBox(-5.0f, 1.0f, -3.0f, 2.0f, 8.0f, 2.0f), PartPose.ZERO); modelPartData.addOrReplaceChild("SHARDS_1", CubeListBuilder.create() - .addBox(3.0f, -1.0f, -1.0f, 2.0f, 8.0f, 2.0f) - .texOffs(2, 4), + .texOffs(2, 4) + .addBox(3.0f, -1.0f, -1.0f, 2.0f, 8.0f, 2.0f), PartPose.ZERO); modelPartData.addOrReplaceChild("SHARDS_2", CubeListBuilder.create() - .addBox(-1.0f, 0.0f, -5.0f, 2.0f, 4.0f, 2.0f) - .texOffs(2, 4), + .texOffs(2, 4) + .addBox(-1.0f, 0.0f, -5.0f, 2.0f, 4.0f, 2.0f), PartPose.ZERO); modelPartData.addOrReplaceChild("SHARDS_3", CubeListBuilder.create() - .addBox(0.0f, 3.0f, 4.0f, 2.0f, 6.0f, 2.0f) - .texOffs(2, 4), + .texOffs(2, 4) + .addBox(0.0f, 3.0f, 4.0f, 2.0f, 6.0f, 2.0f), PartPose.ZERO); modelPartData.addOrReplaceChild("CORE", CubeListBuilder.create() - .addBox(-2.0f, -2.0f, -2.0f, 4.0f, 12.0f, 4.0f) - .texOffs(0, 0), + .texOffs(0, 0) + .addBox(-2.0f, -2.0f, -2.0f, 4.0f, 12.0f, 4.0f), PartPose.ZERO); return LayerDefinition.create(modelData, 16, 16); diff --git a/src/main/java/ru/betterend/entity/model/CubozoaEntityModel.java b/src/main/java/ru/betterend/entity/model/CubozoaEntityModel.java index 191f2554..86bda8c0 100644 --- a/src/main/java/ru/betterend/entity/model/CubozoaEntityModel.java +++ b/src/main/java/ru/betterend/entity/model/CubozoaEntityModel.java @@ -122,7 +122,7 @@ public class CubozoaEntityModel extends BlockBenchModel { scaleY = sin * 0.1F + 0.9F; scaleXZ = Mth.sin(animationProgress * 0.13F + 3.14F) * 0.1F + 0.9F; - for (int i=1; i<=TENTACLE_COUNT; i++){ + for (int i=0; i extends ListModel { private final ModelPart innerCube; @@ -120,9 +123,11 @@ public class EndSlimeEntityModel extends ListModel return LayerDefinition.create(modelData, 64, 32); } - public EndSlimeEntityModel(ModelPart modelPart, boolean onlyShell) { + public EndSlimeEntityModel(EntityModelSet modelSet, boolean onlyShell){ super(RenderType::entityCutout); + ModelPart modelPart = modelSet.bakeLayer(onlyShell ? EndEntitiesRenders.END_SLIME_SHELL_MODEL : EndEntitiesRenders.END_SLIME_MODEL); + innerCube = modelPart.getChild(PartNames.BODY); if (!onlyShell) { rightEye = modelPart.getChild(PartNames.RIGHT_EYE); diff --git a/src/main/java/ru/betterend/entity/model/SilkMothEntityModel.java b/src/main/java/ru/betterend/entity/model/SilkMothEntityModel.java index 989c3684..f50ef2c2 100644 --- a/src/main/java/ru/betterend/entity/model/SilkMothEntityModel.java +++ b/src/main/java/ru/betterend/entity/model/SilkMothEntityModel.java @@ -15,25 +15,25 @@ import net.minecraft.util.Mth; import ru.betterend.entity.SilkMothEntity; public class SilkMothEntityModel extends BlockBenchModel { - private final ModelPart legsL; - private final ModelPart cube_r1; - private final ModelPart cube_r2; - private final ModelPart cube_r3; - private final ModelPart legsR; - private final ModelPart cube_r4; - private final ModelPart cube_r5; - private final ModelPart cube_r6; - private final ModelPart head_pivot; - private final ModelPart tendril_r_r1; - private final ModelPart tendril_r_r2; - private final ModelPart bb_main; - private final ModelPart wingR_r1; - private final ModelPart wingL_r1; - private final ModelPart abdomen_r1; + private final ModelPart legsL; + private final ModelPart cube_r1; + private final ModelPart cube_r2; + private final ModelPart cube_r3; + private final ModelPart legsR; + private final ModelPart cube_r4; + private final ModelPart cube_r5; + private final ModelPart cube_r6; + private final ModelPart head_pivot; + private final ModelPart tendril_r_r1; + private final ModelPart tendril_r_r2; + private final ModelPart bb_main; + private final ModelPart wingR_r1; + private final ModelPart wingL_r1; + private final ModelPart abdomen_r1; - public static LayerDefinition getTexturedModelData() { - MeshDefinition modelData = new MeshDefinition(); - PartDefinition modelPartData = modelData.getRoot(); + public static LayerDefinition getTexturedModelData() { + MeshDefinition modelData = new MeshDefinition(); + PartDefinition modelPartData = modelData.getRoot(); PartDefinition legsL = modelPartData.addOrReplaceChild(PartNames.LEFT_LEG, CubeListBuilder.create() .texOffs(0, 0), @@ -41,20 +41,20 @@ public class SilkMothEntityModel extends BlockBenchModel { 0.0f, 0.0f, 0.6981f)); legsL.addOrReplaceChild("cube_r1", CubeListBuilder.create() - .addBox(0.0216f, 0.0f, -0.5976f, 3.0f, 0.0f, 1.0f) - .texOffs(0, 13), + .texOffs(0, 13) + .addBox(0.0216f, 0.0f, -0.5976f, 3.0f, 0.0f, 1.0f), PartPose.offsetAndRotation(0.0f, 0.0f, -1.0f, 0.0f, 0.2182f, 0.3927f)); legsL.addOrReplaceChild("cube_r2", CubeListBuilder.create() - .addBox(0.0f, 0.0f, -0.6f, 3.0f, 0.0f, 1.0f) - .texOffs(0, 15), + .texOffs(0, 15) + .addBox(0.0f, 0.0f, -0.6f, 3.0f, 0.0f, 1.0f), PartPose.offsetAndRotation(0.5f, 0.1f, -0.05f, 0.0f, 0.0f, 0.3927f)); legsL.addOrReplaceChild("cube_r3", CubeListBuilder.create() - .addBox(0.0f, 0.0f, -0.5f, 3.0f, 0.0f, 1.0f) - .texOffs(0, 14), + .texOffs(0, 14) + .addBox(0.0f, 0.0f, -0.5f, 3.0f, 0.0f, 1.0f), PartPose.offsetAndRotation(0.0f, 0.0f, 0.9f, 0.0f, -0.2182f, 0.3927f)); @@ -64,72 +64,72 @@ public class SilkMothEntityModel extends BlockBenchModel { 0.0f, 3.1416f, -0.6545f)); legsR.addOrReplaceChild("cube_r4", CubeListBuilder.create() - .addBox(0.0f, 0.0f, -0.5f, 3.0f, 0.0f, 1.0f) - .texOffs(0, 10), + .texOffs(0, 10) + .addBox(0.0f, 0.0f, -0.5f, 3.0f, 0.0f, 1.0f), PartPose.offsetAndRotation(0.0f, 0.0f, -1.0f, 0.0f, 0.2182f, 0.3927f)); legsR.addOrReplaceChild("cube_r5", CubeListBuilder.create() - .addBox(0.0f, 0.0f, -0.4f, 3.0f, 0.0f, 1.0f) - .texOffs(0, 11), + .texOffs(0, 11) + .addBox(0.0f, 0.0f, -0.4f, 3.0f, 0.0f, 1.0f), PartPose.offsetAndRotation(0.5f, 0.1f, -0.05f, 0.0f, 0.0f, 0.3927f)); legsR.addOrReplaceChild("cube_r6", CubeListBuilder.create() - .addBox(0.0216f, 0.0f, -0.4024f, 3.0f, 0.0f, 1.0f) - .texOffs(0, 12), + .texOffs(0, 12) + .addBox(0.0216f, 0.0f, -0.4024f, 3.0f, 0.0f, 1.0f), PartPose.offsetAndRotation(0.0f, 0.0f, 0.9f, 0.0f, -0.2182f, 0.3927f)); PartDefinition head_pivot = modelPartData.addOrReplaceChild(PartNames.HEAD, CubeListBuilder.create() - .addBox(-1.5f, -1.5f, -2.0f, 3.0f, 3.0f, 3.0f) - .texOffs(15, 10), + .texOffs(15, 10) + .addBox(-1.5f, -1.5f, -2.0f, 3.0f, 3.0f, 3.0f), PartPose.offset(0.0f, 18.0f, -3.0f)); head_pivot.addOrReplaceChild("tendril_r_r1", CubeListBuilder.create() .mirror() - .addBox(-1.5f, -5.0f, 0.0f, 3.0f, 5.0f, 0.0f) - .texOffs(23, 0), + .texOffs(23, 0) + .addBox(-1.5f, -5.0f, 0.0f, 3.0f, 5.0f, 0.0f), PartPose.offsetAndRotation(1.0f, -1.15f, -1.0f, 0.0f, 0.0f, 0.3927f)); head_pivot.addOrReplaceChild("tendril_r_r2", CubeListBuilder.create() - .addBox(-1.5f, -5.0f, 0.0f, 3.0f, 5.0f, 0.0f) - .texOffs(23, 0), + .texOffs(23, 0) + .addBox(-1.5f, -5.0f, 0.0f, 3.0f, 5.0f, 0.0f), PartPose.offsetAndRotation(-1.0f, -1.15f, -1.0f, 0.0f, 0.0f, -0.3927f)); PartDefinition bb_main = modelPartData.addOrReplaceChild(PartNames.BODY, CubeListBuilder.create() - .addBox(-2.5f, -8.5f, -3.0f, 5.0f, 5.0f, 3.0f) - .texOffs(19, 19), + .texOffs(19, 19) + .addBox(-2.5f, -8.5f, -3.0f, 5.0f, 5.0f, 3.0f), PartPose.offset(0.0f, 24.0f, 0.0f)); bb_main.addOrReplaceChild(PartNames.RIGHT_WING, CubeListBuilder.create() .mirror() - .addBox(-7.0f, 0.0f, -3.0f, 9.0f, 0.0f, 5.0f) - .texOffs(0, 5), + .texOffs(0, 5) + .addBox(-7.0f, 0.0f, -3.0f, 9.0f, 0.0f, 5.0f), PartPose.offsetAndRotation(-1.5f, -6.5f, 0.5f, 0.0f, 0.0f, 0.3927f)); bb_main.addOrReplaceChild(PartNames.LEFT_WING, CubeListBuilder.create() - .addBox(-2.0f, 0.0f, -3.0f, 9.0f, 0.0f, 5.0f) - .texOffs(0, 5), + .texOffs(0, 5) + .addBox(-2.0f, 0.0f, -3.0f, 9.0f, 0.0f, 5.0f), PartPose.offsetAndRotation(1.5f, -6.5f, 0.5f, 0.0f, 0.0f, -0.3927f)); bb_main.addOrReplaceChild("abdomen_r1", CubeListBuilder.create() - .addBox(-3.0f, -4.0f, -1.0f, 4.0f, 4.0f, 7.0f) - .texOffs(0, 10), + .texOffs(0, 10) + .addBox(-3.0f, -4.0f, -1.0f, 4.0f, 4.0f, 7.0f), PartPose.offsetAndRotation(1.0f, -3.9f, 0.0f, -0.3927f, 0.0f, 0.0f)); /*texWidth = 64; texHeight = 64;*/ - return LayerDefinition.create(modelData, 64, 64); - } + return LayerDefinition.create(modelData, 64, 64); + } - public SilkMothEntityModel(ModelPart modelPart) { - super(RenderType::entityCutout); + public SilkMothEntityModel(ModelPart modelPart) { + super(RenderType::entityCutout); legsL = modelPart.getChild(PartNames.LEFT_LEG); cube_r1 = legsL.getChild("cube_r1"); @@ -228,27 +228,27 @@ public class SilkMothEntityModel extends BlockBenchModel { bb_main.addChild(abdomen_r1); setRotationAngle(abdomen_r1, -0.3927F, 0.0F, 0.0F); abdomen_r1.texOffs(0, 10).addBox(-3.0F, -4.0F, -1.0F, 4.0F, 4.0F, 7.0F, 0.0F);*/ - } + } - @Override - public void setupAnim(SilkMothEntity entity, float limbAngle, float limbDistance, float animationProgress, - float headYaw, float headPitch) { - wingR_r1.zRot = Mth.sin(animationProgress * 2F) * 0.4F + 0.3927F; - wingL_r1.zRot = -wingR_r1.zRot; - head_pivot.xRot = Mth.sin(animationProgress * 0.03F) * 0.1F; - tendril_r_r1.zRot = Mth.sin(animationProgress * 0.07F) * 0.2F + 0.3927F; - tendril_r_r2.zRot = -tendril_r_r1.zRot; - abdomen_r1.xRot = Mth.sin(animationProgress * 0.05F) * 0.1F - 0.3927F; - legsR.zRot = Mth.sin(animationProgress * 0.07F) * 0.1F - 0.6545F; - legsL.zRot = -legsR.zRot; - } + @Override + public void setupAnim(SilkMothEntity entity, float limbAngle, float limbDistance, float animationProgress, + float headYaw, float headPitch) { + wingR_r1.zRot = Mth.sin(animationProgress * 2F) * 0.4F + 0.3927F; + wingL_r1.zRot = -wingR_r1.zRot; + head_pivot.xRot = Mth.sin(animationProgress * 0.03F) * 0.1F; + tendril_r_r1.zRot = Mth.sin(animationProgress * 0.07F) * 0.2F + 0.3927F; + tendril_r_r2.zRot = -tendril_r_r1.zRot; + abdomen_r1.xRot = Mth.sin(animationProgress * 0.05F) * 0.1F - 0.3927F; + legsR.zRot = Mth.sin(animationProgress * 0.07F) * 0.1F - 0.6545F; + legsL.zRot = -legsR.zRot; + } - @Override - public void renderToBuffer(PoseStack matrices, VertexConsumer vertices, int light, int overlay, float red, - float green, float blue, float alpha) { - bb_main.render(matrices, vertices, light, overlay); - head_pivot.render(matrices, vertices, light, overlay); - legsL.render(matrices, vertices, light, overlay); - legsR.render(matrices, vertices, light, overlay); - } + @Override + public void renderToBuffer(PoseStack matrices, VertexConsumer vertices, int light, int overlay, float red, + float green, float blue, float alpha) { + bb_main.render(matrices, vertices, light, overlay); + head_pivot.render(matrices, vertices, light, overlay); + legsL.render(matrices, vertices, light, overlay); + legsR.render(matrices, vertices, light, overlay); + } } diff --git a/src/main/java/ru/betterend/entity/render/RendererEntityEndSlime.java b/src/main/java/ru/betterend/entity/render/RendererEntityEndSlime.java index 39fdf210..67813e04 100644 --- a/src/main/java/ru/betterend/entity/render/RendererEntityEndSlime.java +++ b/src/main/java/ru/betterend/entity/render/RendererEntityEndSlime.java @@ -22,7 +22,7 @@ public class RendererEntityEndSlime extends MobRenderer(ctx.bakeLayer(EndEntitiesRenders.END_SLIME_MODEL)), 0.25f); + super(ctx, new EndSlimeEntityModel<>(ctx.getModelSet(), false), 0.25f); this.addLayer(new OverlayFeatureRenderer(this, ctx)); this.addLayer(new EyesLayer>(this) { @Override @@ -73,8 +73,8 @@ public class RendererEntityEndSlime extends MobRenderer> featureRendererContext, EntityRendererProvider.Context ctx) { super(featureRendererContext); - modelOrdinal = new EndSlimeEntityModel<>(ctx.bakeLayer(EndEntitiesRenders.END_SLIME_SHELL_MODEL)); - modelLake = new EndSlimeEntityModel<>(ctx.bakeLayer(EndEntitiesRenders.END_SLIME_SHELL_MODEL)); + modelOrdinal = new EndSlimeEntityModel<>(ctx.getModelSet(), true); + modelLake = new EndSlimeEntityModel<>(ctx.getModelSet(), true); } public void render(PoseStack matrixStack, MultiBufferSource vertexConsumerProvider, int i, T livingEntity, diff --git a/src/main/java/ru/betterend/item/model/ArmoredElytraModel.java b/src/main/java/ru/betterend/item/model/ArmoredElytraModel.java index e19c8077..c853908f 100644 --- a/src/main/java/ru/betterend/item/model/ArmoredElytraModel.java +++ b/src/main/java/ru/betterend/item/model/ArmoredElytraModel.java @@ -22,14 +22,14 @@ public class ArmoredElytraModel extends AgeableListModel MeshDefinition modelData = new MeshDefinition(); PartDefinition modelPartData = modelData.getRoot(); modelPartData.addOrReplaceChild(PartNames.LEFT_WING, CubeListBuilder.create() - .addBox(-10.0f, 0.0f, 0.0f, 10.0f, 20.0f, 2.0f) - .texOffs(22, 0), + .texOffs(22, 0) + .addBox(-10.0f, 0.0f, 0.0f, 10.0f, 20.0f, 2.0f), PartPose.ZERO); modelPartData.addOrReplaceChild(PartNames.RIGHT_WING, CubeListBuilder.create() .mirror() - .addBox(0.0f, 0.0f, 0.0f, 10.0f, 20.0f, 2.0f) - .texOffs(22, 0), + .texOffs(22, 0) + .addBox(0.0f, 0.0f, 0.0f, 10.0f, 20.0f, 2.0f), PartPose.ZERO); return LayerDefinition.create(modelData, 48, 48); diff --git a/src/main/java/ru/betterend/item/model/CrystaliteBootsModel.java b/src/main/java/ru/betterend/item/model/CrystaliteBootsModel.java index 7a9b90ff..525d2ced 100644 --- a/src/main/java/ru/betterend/item/model/CrystaliteBootsModel.java +++ b/src/main/java/ru/betterend/item/model/CrystaliteBootsModel.java @@ -22,16 +22,27 @@ public class CrystaliteBootsModel extends HumanoidModel { final float scale = 1.0f; MeshDefinition modelData = new MeshDefinition(); PartDefinition modelPartData = modelData.getRoot(); - CubeDeformation deformation = new CubeDeformation(scale + 0.25f); + // TODO: see if we need to subclass HumanoidModel + // Humanoid model tries to retrieve all parts in it's constructor, + // so we need to add empty Nodes + modelPartData.addOrReplaceChild("head", CubeListBuilder.create(), PartPose.ZERO); + modelPartData.addOrReplaceChild("hat", CubeListBuilder.create(), PartPose.ZERO); + modelPartData.addOrReplaceChild("body", CubeListBuilder.create(), PartPose.ZERO); + modelPartData.addOrReplaceChild("right_arm", CubeListBuilder.create(), PartPose.ZERO); + modelPartData.addOrReplaceChild("left_arm", CubeListBuilder.create(), PartPose.ZERO); + modelPartData.addOrReplaceChild("right_leg", CubeListBuilder.create(), PartPose.ZERO); + modelPartData.addOrReplaceChild("left_leg", CubeListBuilder.create(), PartPose.ZERO); + + CubeDeformation deformation = new CubeDeformation(scale + 0.25f); modelPartData.addOrReplaceChild("leftBoot", CubeListBuilder.create() - .addBox(-2.0f, 0.0f, -2.0f, 4.0f, 12.0f, 4.0f, deformation) - .texOffs(0, 32), + .texOffs(0, 32) + .addBox(-2.0f, 0.0f, -2.0f, 4.0f, 12.0f, 4.0f, deformation), PartPose.offset(1.9f, 12.0f, 0.0f)); modelPartData.addOrReplaceChild("rightBoot", CubeListBuilder.create() - .addBox(-2.0f, 0.0f, -2.0f, 4.0f, 12.0f, 4.0f, deformation) - .texOffs(0, 16), + .texOffs(0, 16) + .addBox(-2.0f, 0.0f, -2.0f, 4.0f, 12.0f, 4.0f, deformation), PartPose.offset(-1.9f, 12.0f, 0.0f)); return LayerDefinition.create(modelData, 64, 48); diff --git a/src/main/java/ru/betterend/item/model/CrystaliteChestplateModel.java b/src/main/java/ru/betterend/item/model/CrystaliteChestplateModel.java index 51b705fe..058ec7d1 100644 --- a/src/main/java/ru/betterend/item/model/CrystaliteChestplateModel.java +++ b/src/main/java/ru/betterend/item/model/CrystaliteChestplateModel.java @@ -33,35 +33,47 @@ public class CrystaliteChestplateModel extends HumanoidModel { private static LayerDefinition getTexturedModelData(float scale, boolean thinArms) { MeshDefinition modelData = new MeshDefinition(); PartDefinition modelPartData = modelData.getRoot(); + + // TODO: see if we need to subclass HumanoidModel + // Humanoid model tries to retrieve all parts in it's constructor, + // so we need to add empty Nodes + modelPartData.addOrReplaceChild("head", CubeListBuilder.create(), PartPose.ZERO); + modelPartData.addOrReplaceChild("hat", CubeListBuilder.create(), PartPose.ZERO); + // modelPartData.addOrReplaceChild("body", CubeListBuilder.create(), PartPose.ZERO); + modelPartData.addOrReplaceChild("right_arm", CubeListBuilder.create(), PartPose.ZERO); + modelPartData.addOrReplaceChild("left_arm", CubeListBuilder.create(), PartPose.ZERO); + modelPartData.addOrReplaceChild("right_leg", CubeListBuilder.create(), PartPose.ZERO); + modelPartData.addOrReplaceChild("left_leg", CubeListBuilder.create(), PartPose.ZERO); + CubeDeformation deformation = new CubeDeformation(scale + 0.25F); PartDefinition body = modelPartData.addOrReplaceChild(PartNames.BODY, CubeListBuilder.create() - .addBox(-4.0f, 0.0f, -2.0f, 8.0f, 12.0f, 4.0f, deformation) - .texOffs(16, 16), + .texOffs(16, 16) + .addBox(-4.0f, 0.0f, -2.0f, 8.0f, 12.0f, 4.0f, deformation), PartPose.ZERO); if (thinArms) { deformation = new CubeDeformation(scale + 0.45F); PartDefinition leftShoulder = modelPartData.addOrReplaceChild("leftShoulder", CubeListBuilder.create() .mirror() - .addBox(-1.0f, -2.5f, -2.0f, 4.0f, 12.0f, 4.0f, deformation) - .texOffs(40, 32), + .texOffs(40, 32) + .addBox(-1.0f, -2.5f, -2.0f, 4.0f, 12.0f, 4.0f, deformation), PartPose.offset(5.0f, 2.0f, 0.0f)); PartDefinition rightShoulder = modelPartData.addOrReplaceChild("rightShoulder", CubeListBuilder.create() - .addBox(-3.0f, -2.5f, -2.0f, 4.0f, 12.0f, 4.0f, deformation) - .texOffs(40, 16), + .texOffs(40, 16) + .addBox(-3.0f, -2.5f, -2.0f, 4.0f, 12.0f, 4.0f, deformation), PartPose.offset(-5.0f, 2.0f, 10.0f)); } else { deformation = new CubeDeformation(scale + 0.45F); PartDefinition leftShoulder = modelPartData.addOrReplaceChild("leftShoulder", CubeListBuilder.create() .mirror() - .addBox(-1.0f, -2.5f, -2.0f, 4.0f, 12.0f, 4.0f, deformation) - .texOffs(40, 32), + .texOffs(40, 32) + .addBox(-1.0f, -2.5f, -2.0f, 4.0f, 12.0f, 4.0f, deformation), PartPose.offset(5.0f, 2.0f, 0.0f)); PartDefinition rightShoulder = modelPartData.addOrReplaceChild("rightShoulder", CubeListBuilder.create() - .addBox(-3.0f, -2.5f, -2.0f, 4.0f, 12.0f, 4.0f, deformation) - .texOffs(40, 16), + .texOffs(40, 16) + .addBox(-3.0f, -2.5f, -2.0f, 4.0f, 12.0f, 4.0f, deformation), PartPose.offset(-5.0f, 2.0f, 10.0f)); } return LayerDefinition.create(modelData, 64, 48); diff --git a/src/main/java/ru/betterend/item/model/CrystaliteHelmetModel.java b/src/main/java/ru/betterend/item/model/CrystaliteHelmetModel.java index 489d75e5..0c5518d0 100644 --- a/src/main/java/ru/betterend/item/model/CrystaliteHelmetModel.java +++ b/src/main/java/ru/betterend/item/model/CrystaliteHelmetModel.java @@ -15,6 +15,7 @@ import net.minecraft.client.model.geom.builders.*; import net.minecraft.client.renderer.RenderType; import net.minecraft.world.entity.LivingEntity; import ru.betterend.registry.EndEntitiesRenders; +import shadow.fabric.impl.client.rendering.ArmorProviderExtensions; @Environment(EnvType.CLIENT) public class CrystaliteHelmetModel extends HumanoidModel { @@ -23,10 +24,22 @@ public class CrystaliteHelmetModel extends HumanoidModel { final float scale = 1.0f; MeshDefinition modelData = new MeshDefinition(); PartDefinition modelPartData = modelData.getRoot(); + + // TODO: see if we need to subclass HumanoidModel + // Humanoid model tries to retrieve all parts in it's constructor, + // so we need to add empty Nodes + modelPartData.addOrReplaceChild("head", CubeListBuilder.create(), PartPose.ZERO); + //modelPartData.addOrReplaceChild("hat", CubeListBuilder.create(), PartPose.ZERO); + modelPartData.addOrReplaceChild("body", CubeListBuilder.create(), PartPose.ZERO); + modelPartData.addOrReplaceChild("right_arm", CubeListBuilder.create(), PartPose.ZERO); + modelPartData.addOrReplaceChild("left_arm", CubeListBuilder.create(), PartPose.ZERO); + modelPartData.addOrReplaceChild("right_leg", CubeListBuilder.create(), PartPose.ZERO); + modelPartData.addOrReplaceChild("left_leg", CubeListBuilder.create(), PartPose.ZERO); + CubeDeformation deformation_hat = new CubeDeformation(scale + 0.5f); PartDefinition hat = modelPartData.addOrReplaceChild(PartNames.HAT, CubeListBuilder.create() - .addBox(-4.0f, -8.0f, -4.0f, 8.0f, 8.0f, 8.0f, deformation_hat) - .texOffs(0, 0), + .texOffs(0, 0) + .addBox(-4.0f, -8.0f, -4.0f, 8.0f, 8.0f, 8.0f, deformation_hat), PartPose.ZERO); return LayerDefinition.create(modelData, 64, 48); diff --git a/src/main/java/ru/betterend/item/model/CrystaliteLeggingsModel.java b/src/main/java/ru/betterend/item/model/CrystaliteLeggingsModel.java index b8a7ecbc..0d7c6a32 100644 --- a/src/main/java/ru/betterend/item/model/CrystaliteLeggingsModel.java +++ b/src/main/java/ru/betterend/item/model/CrystaliteLeggingsModel.java @@ -19,20 +19,32 @@ public class CrystaliteLeggingsModel extends HumanoidModel { float scale = 1.0f; MeshDefinition modelData = new MeshDefinition(); PartDefinition modelPartData = modelData.getRoot(); + + // TODO: see if we need to subclass HumanoidModel + // Humanoid model tries to retrieve all parts in it's constructor, + // so we need to add empty Nodes + modelPartData.addOrReplaceChild("head", CubeListBuilder.create(), PartPose.ZERO); + modelPartData.addOrReplaceChild("hat", CubeListBuilder.create(), PartPose.ZERO); + // modelPartData.addOrReplaceChild("body", CubeListBuilder.create(), PartPose.ZERO); + modelPartData.addOrReplaceChild("right_arm", CubeListBuilder.create(), PartPose.ZERO); + modelPartData.addOrReplaceChild("left_arm", CubeListBuilder.create(), PartPose.ZERO); + // modelPartData.addOrReplaceChild("right_leg", CubeListBuilder.create(), PartPose.ZERO); + // modelPartData.addOrReplaceChild("left_leg", CubeListBuilder.create(), PartPose.ZERO); + CubeDeformation deformation = new CubeDeformation(scale); modelPartData.addOrReplaceChild(PartNames.BODY, CubeListBuilder.create() - .addBox(-4.0f, 0.0f, -2.0f, 8.0f, 12.0f, 4.0f, deformation) - .texOffs(16, 16), + .texOffs(16, 16) + .addBox(-4.0f, 0.0f, -2.0f, 8.0f, 12.0f, 4.0f, deformation), PartPose.ZERO); modelPartData.addOrReplaceChild(PartNames.LEFT_LEG, CubeListBuilder.create() - .addBox(-2.0f, 0.0f, -2.0f, 4.0f, 12.0f, 4.0f, deformation) - .texOffs(0, 32), + .texOffs(0, 32) + .addBox(-2.0f, 0.0f, -2.0f, 4.0f, 12.0f, 4.0f, deformation), PartPose.offset(1.9f, 12.0f, 0.0f)); modelPartData.addOrReplaceChild(PartNames.RIGHT_LEG, CubeListBuilder.create() - .addBox(-2.0f, 0.0f, -2.0f, 4.0f, 12.0f, 4.0f, deformation) - .texOffs(0, 16), + .texOffs(0, 16) + .addBox(-2.0f, 0.0f, -2.0f, 4.0f, 12.0f, 4.0f, deformation), PartPose.offset(-1.9f, 12.0f, 0.0f)); return LayerDefinition.create(modelData, 64, 48); From 2aa6243f405ba50ebd1d83759cb9a8b7fc9e242e Mon Sep 17 00:00:00 2001 From: Frank Bauer Date: Mon, 28 Jun 2021 22:12:19 +0200 Subject: [PATCH 057/595] Fixed runtime crashes --- .../java/ru/betterend/blocks/BubbleCoralBlock.java | 4 ++-- .../java/ru/betterend/blocks/EndStoneSmelter.java | 3 ++- .../ru/betterend/blocks/basis/PedestalBlock.java | 3 ++- src/main/resources/betterend.mixins.client.json | 14 +++++++------- src/main/resources/betterend.mixins.common.json | 7 ++++--- 5 files changed, 17 insertions(+), 14 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/BubbleCoralBlock.java b/src/main/java/ru/betterend/blocks/BubbleCoralBlock.java index 22bbaa67..6963455a 100644 --- a/src/main/java/ru/betterend/blocks/BubbleCoralBlock.java +++ b/src/main/java/ru/betterend/blocks/BubbleCoralBlock.java @@ -1,7 +1,5 @@ package ru.betterend.blocks; -import java.util.Random; - import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; @@ -19,6 +17,8 @@ import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; import ru.betterend.blocks.basis.EndUnderwaterPlantBlock; +import java.util.Random; + public class BubbleCoralBlock extends EndUnderwaterPlantBlock { private static final VoxelShape SHAPE = Block.box(0, 0, 0, 16, 14, 16); diff --git a/src/main/java/ru/betterend/blocks/EndStoneSmelter.java b/src/main/java/ru/betterend/blocks/EndStoneSmelter.java index 1a25bf56..e7281b88 100644 --- a/src/main/java/ru/betterend/blocks/EndStoneSmelter.java +++ b/src/main/java/ru/betterend/blocks/EndStoneSmelter.java @@ -148,8 +148,9 @@ public class EndStoneSmelter extends BaseBlockWithEntity { } + @Override @Nullable - public BlockEntityTicker getTicker(Level level, BlockEntityType blockEntityType) { + public BlockEntityTicker getTicker(Level level, BlockState blockState, BlockEntityType blockEntityType) { return level.isClientSide() ? null : createTickerHelper(blockEntityType, EndBlockEntities.END_STONE_SMELTER, EndStoneSmelterBlockEntity::tick); } } diff --git a/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java b/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java index 433ff1e8..81407855 100644 --- a/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java @@ -432,8 +432,9 @@ public class PedestalBlock extends BaseBlockNotFull implements EntityBlock { }; } + @Override @Nullable - public BlockEntityTicker getTicker(Level level, BlockEntityType blockEntityType) { + public BlockEntityTicker getTicker(Level level, BlockState blockState, BlockEntityType blockEntityType) { return level.isClientSide() ? null : createTickerHelper(blockEntityType, EndBlockEntities.PEDESTAL, PedestalBlockEntity::tick); } diff --git a/src/main/resources/betterend.mixins.client.json b/src/main/resources/betterend.mixins.client.json index 084bbab4..6fd0fc05 100644 --- a/src/main/resources/betterend.mixins.client.json +++ b/src/main/resources/betterend.mixins.client.json @@ -2,23 +2,23 @@ "required": true, "minVersion": "0.8", "package": "ru.betterend.mixin.client", - "compatibilityLevel": "JAVA_8", + "compatibilityLevel": "JAVA_16", "client": [ "AbstractSoundInstanceAccessor", "ClientPlayNetworkHandlerMixin", - "HumanoidMobRendererMixin", - "ArmorStandRendererMixin", + "HumanoidMobRendererMixin", + "ArmorStandRendererMixin", "ClientRecipeBookMixin", "MinecraftClientMixin", - "PlayerRendererMixin", + "PlayerRendererMixin", "WorldRendererMixin", "MusicTrackerMixin", "AnvilScreenMixin", "BiomeColorsMixin", "ModelLoaderMixin", - "LocalPlayerMixin", - "CapeLayerMixin", - "ItemStackMixin" + "LocalPlayerMixin", + "CapeLayerMixin", + "ItemStackMixin" ], "injectors": { "defaultRequire": 1 diff --git a/src/main/resources/betterend.mixins.common.json b/src/main/resources/betterend.mixins.common.json index e4d533ea..901e1855 100644 --- a/src/main/resources/betterend.mixins.common.json +++ b/src/main/resources/betterend.mixins.common.json @@ -2,7 +2,7 @@ "required": true, "minVersion": "0.8", "package": "ru.betterend.mixin.common", - "compatibilityLevel": "JAVA_8", + "compatibilityLevel": "JAVA_16", "mixins": [ "BiomeGenerationSettingsAccessor", "NoiseBasedChunkGeneratorMixin", @@ -22,7 +22,7 @@ "CraftingMenuMixin", "LivingEntityMixin", "ServerPlayerMixin", - "SpikeFeatureMixin", + "SpikeFeatureMixin", "ServerLevelMixin", "PlayerListMixin", "AnvilMenuMixin", @@ -31,7 +31,8 @@ "MonsterMixin", "EntityMixin", "PlayerMixin", - "SlimeMixin" + "SlimeMixin", + "ShuffelingListMixin" ], "injectors": { "defaultRequire": 1 From ea62902ee8c236361c0c5647329203d9b8b0ba16 Mon Sep 17 00:00:00 2001 From: Frank Bauer Date: Mon, 28 Jun 2021 22:39:37 +0200 Subject: [PATCH 058/595] Fixed `EndPodiumFeatureMixin` --- .../ru/betterend/mixin/common/EndPodiumFeatureMixin.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/ru/betterend/mixin/common/EndPodiumFeatureMixin.java b/src/main/java/ru/betterend/mixin/common/EndPodiumFeatureMixin.java index 33bcf523..a10f460b 100644 --- a/src/main/java/ru/betterend/mixin/common/EndPodiumFeatureMixin.java +++ b/src/main/java/ru/betterend/mixin/common/EndPodiumFeatureMixin.java @@ -51,8 +51,10 @@ public class EndPodiumFeatureMixin { } @ModifyVariable(method = "place", ordinal = 0, at = @At("HEAD")) - private BlockPos be_setPosOnGround(BlockPos blockPos, WorldGenLevel world) { - return be_updatePos(blockPos, world); + private FeaturePlaceContext be_setPosOnGround(FeaturePlaceContext featurePlaceContext) { + WorldGenLevel world = featurePlaceContext.level(); + BlockPos pos = be_updatePos(featurePlaceContext.origin(), world); + return new FeaturePlaceContext(world, featurePlaceContext.chunkGenerator(), featurePlaceContext.random(), pos, featurePlaceContext.config()); } private BlockPos be_updatePos(BlockPos blockPos, WorldGenLevel world) { From 13e169c4588d0d1bc57fb05d2865ed16204e0a63 Mon Sep 17 00:00:00 2001 From: Aleksey Date: Tue, 29 Jun 2021 21:14:28 +0300 Subject: [PATCH 059/595] Possible avoid #214 --- build.gradle | 3 +++ .../ru/betterend/mixin/common/LivingEntityMixin.java | 9 +++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 4411ad02..ce8b3995 100644 --- a/build.gradle +++ b/build.gradle @@ -46,6 +46,7 @@ def useOptional(String dep) { exclude group: "net.fabricmc.fabric-api" exclude group: "net.fabricmc" if (!dep.contains("me.shedaniel")) { + exclude group: "me.shedaniel.cloth" exclude group: "me.shedaniel" } } @@ -53,6 +54,7 @@ def useOptional(String dep) { exclude group: "net.fabricmc.fabric-api" exclude group: "net.fabricmc" if (!dep.contains("me.shedaniel")) { + exclude group: "me.shedaniel.cloth" exclude group: "me.shedaniel" } } @@ -63,6 +65,7 @@ def useApi(String dep) { exclude group: "net.fabricmc.fabric-api" exclude group: "net.fabricmc" if (!dep.contains("me.shedaniel")) { + exclude group: "me.shedaniel.cloth" exclude group: "me.shedaniel" } } diff --git a/src/main/java/ru/betterend/mixin/common/LivingEntityMixin.java b/src/main/java/ru/betterend/mixin/common/LivingEntityMixin.java index b4e430d6..93c28174 100644 --- a/src/main/java/ru/betterend/mixin/common/LivingEntityMixin.java +++ b/src/main/java/ru/betterend/mixin/common/LivingEntityMixin.java @@ -32,6 +32,7 @@ import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.phys.Vec3; +import ru.betterend.BetterEnd; import ru.betterend.interfaces.FallFlyingItem; import ru.betterend.interfaces.MobEffectApplier; import ru.betterend.item.CrystaliteArmor; @@ -89,8 +90,12 @@ public abstract class LivingEntityMixin extends Entity { @Inject(method = "canBeAffected", at = @At("HEAD"), cancellable = true) public void be_canBeAffected(MobEffectInstance mobEffectInstance, CallbackInfoReturnable info) { - if (mobEffectInstance.getEffect() == MobEffects.BLINDNESS && getAttributes().getValue(EndAttributes.BLINDNESS_RESISTANCE) > 0.0) { - info.setReturnValue(false); + try { + if (mobEffectInstance.getEffect() == MobEffects.BLINDNESS && getAttributes().getValue(EndAttributes.BLINDNESS_RESISTANCE) > 0.0) { + info.setReturnValue(false); + } + } catch (Exception ex) { + BetterEnd.LOGGER.warning("Blindness resistance attribute haven't registered."); } } From e7c85c8148e2bffc348abf42c84697fb7550de27 Mon Sep 17 00:00:00 2001 From: Frank Bauer Date: Tue, 29 Jun 2021 20:23:19 +0200 Subject: [PATCH 060/595] Partially working REI --- .../integration/rei/REIAlloyingCategory.java | 8 +-- .../integration/rei/REIAlloyingDisplay.java | 22 +++---- .../rei/REIAlloyingFuelDisplay.java | 8 +-- .../integration/rei/REIAnvilCategory.java | 12 ++-- .../integration/rei/REIBlastingDisplay.java | 10 +++ .../integration/rei/REIContainer.java | 3 + .../integration/rei/REIInfusionCategory.java | 5 +- .../{REIPluginClient.java => REIPlugin.java} | 66 ++++++++++++------- src/main/resources/fabric.mod.json | 7 +- 9 files changed, 85 insertions(+), 56 deletions(-) create mode 100644 src/main/java/ru/betterend/integration/rei/REIBlastingDisplay.java rename src/main/java/ru/betterend/integration/rei/{REIPluginClient.java => REIPlugin.java} (55%) diff --git a/src/main/java/ru/betterend/integration/rei/REIAlloyingCategory.java b/src/main/java/ru/betterend/integration/rei/REIAlloyingCategory.java index 1d915bc9..2a777fe2 100644 --- a/src/main/java/ru/betterend/integration/rei/REIAlloyingCategory.java +++ b/src/main/java/ru/betterend/integration/rei/REIAlloyingCategory.java @@ -5,19 +5,18 @@ import com.mojang.blaze3d.vertex.PoseStack; import it.unimi.dsi.fastutil.ints.IntList; import me.shedaniel.math.Point; import me.shedaniel.math.Rectangle; -import me.shedaniel.rei.api.client.gui.DisplayRenderer; -import me.shedaniel.rei.api.client.gui.SimpleDisplayRenderer; import me.shedaniel.rei.api.client.gui.widgets.Widget; import me.shedaniel.rei.api.client.gui.widgets.Widgets; import me.shedaniel.rei.api.client.registry.display.TransferDisplayCategory; import me.shedaniel.rei.api.common.category.CategoryIdentifier; import me.shedaniel.rei.api.common.entry.EntryIngredient; import me.shedaniel.rei.api.common.entry.EntryStack; +import me.shedaniel.rei.api.common.util.EntryStacks; import net.minecraft.client.gui.GuiComponent; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.world.item.Items; import org.jetbrains.annotations.NotNull; -import ru.betterend.recipe.builders.AlloyingRecipe; import ru.betterend.registry.EndBlocks; import java.text.DecimalFormat; @@ -37,7 +36,8 @@ public class REIAlloyingCategory implements TransferDisplayCategory recipe; private float xp; private double smeltTime; + + public REIAlloyingDisplay(AlloyingRecipe recipe) { + this(recipe, recipe.getExperience(), recipe.getSmeltTime()); + } + protected REIAlloyingDisplay(Recipe recipe, float xp, double smeltTime) { super( EntryIngredients.ofIngredients(recipe.getIngredients()), Collections.singletonList(EntryIngredients.of(recipe.getResultItem())) ); this.recipe = recipe; - this.xp = recipe.getExperience(); - this.smeltTime = recipe.getSmeltTime(); + this.xp = xp; + this.smeltTime = smeltTime; } - - public REIAlloyingDisplay(BlastingRecipe recipe) { - super( - EntryIngredients.ofIngredients(recipe.getIngredients()), - Collections.singletonList(EntryIngredients.of(recipe.getResultItem())) - ); - this.recipe = recipe; - this.xp = recipe.getExperience(); - this.smeltTime = recipe.getCookingTime(); - } - + + public static List getFuel() { return fuel; } diff --git a/src/main/java/ru/betterend/integration/rei/REIAlloyingFuelDisplay.java b/src/main/java/ru/betterend/integration/rei/REIAlloyingFuelDisplay.java index c177c5fa..7e9d64e1 100644 --- a/src/main/java/ru/betterend/integration/rei/REIAlloyingFuelDisplay.java +++ b/src/main/java/ru/betterend/integration/rei/REIAlloyingFuelDisplay.java @@ -8,7 +8,7 @@ import net.minecraft.nbt.CompoundTag; import java.util.Collections; import java.util.List; -public class REIAlloyingFuelDisplay extends BasicDisplay { +public abstract class REIAlloyingFuelDisplay extends BasicDisplay { private final int fuelTime; public REIAlloyingFuelDisplay(List fuel, CompoundTag tag) { @@ -24,10 +24,10 @@ public class REIAlloyingFuelDisplay extends BasicDisplay { this.fuelTime = fuelTime; }*/ - @Override + /*@Override public CategoryIdentifier getCategoryIdentifier() { - return REIPlugin.ALLOYING_FUEL; - } + return REIPluginClient.ALLOYING_FUEL; + }*/ public int getFuelTime() { return fuelTime; diff --git a/src/main/java/ru/betterend/integration/rei/REIAnvilCategory.java b/src/main/java/ru/betterend/integration/rei/REIAnvilCategory.java index 479ef998..694376cc 100644 --- a/src/main/java/ru/betterend/integration/rei/REIAnvilCategory.java +++ b/src/main/java/ru/betterend/integration/rei/REIAnvilCategory.java @@ -11,17 +11,18 @@ import me.shedaniel.rei.api.client.registry.display.TransferDisplayCategory; import me.shedaniel.rei.api.common.category.CategoryIdentifier; import me.shedaniel.rei.api.common.entry.EntryIngredient; import me.shedaniel.rei.api.common.entry.EntryStack; +import me.shedaniel.rei.api.common.util.EntryStacks; import net.minecraft.client.gui.GuiComponent; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.TranslatableComponent; import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.Items; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; import org.jetbrains.annotations.NotNull; import ru.betterend.blocks.basis.EndAnvilBlock; import java.util.Arrays; -import java.util.Collection; import java.util.List; import java.util.stream.Collectors; @@ -39,11 +40,12 @@ public class REIAnvilCategory implements TransferDisplayCategory setupDisplay(REIAnvilDisplay display, Rectangle bounds) { Point startPoint = new Point(bounds.getCenterX() - 41, bounds.y + 10); List widgets = Lists.newArrayList(); @@ -54,7 +56,7 @@ public class REIAnvilCategory implements TransferDisplayCategory inputEntries = display.getInputEntries(); EntryIngredient materials = inputEntries.get(1); int anvilLevel = display.getAnvilLevel(); - List anvils = Arrays.stream(REIPlugin.ANVILS).filter(anvil -> { + List anvils = Arrays.stream(REIPluginClient.ANVILS).filter(anvil -> { Block block = ((BlockItem) anvil.getValue()).getBlock(); if (block instanceof EndAnvilBlock) { return ((EndAnvilBlock) block).getCraftingLevel() >= anvilLevel; @@ -71,7 +73,7 @@ public class REIAnvilCategory implements TransferDisplayCategory widgets, Rectangle bounds, REIAnvilDisplay display, diff --git a/src/main/java/ru/betterend/integration/rei/REIBlastingDisplay.java b/src/main/java/ru/betterend/integration/rei/REIBlastingDisplay.java new file mode 100644 index 00000000..3dc0fc5d --- /dev/null +++ b/src/main/java/ru/betterend/integration/rei/REIBlastingDisplay.java @@ -0,0 +1,10 @@ +package ru.betterend.integration.rei; + +import net.minecraft.world.item.crafting.BlastingRecipe; +import ru.betterend.recipe.builders.AlloyingRecipe; + +public class REIBlastingDisplay extends REIAlloyingDisplay{ + public REIBlastingDisplay(BlastingRecipe recipe) { + super(recipe, recipe.getExperience(), recipe.getCookingTime()); + } +} diff --git a/src/main/java/ru/betterend/integration/rei/REIContainer.java b/src/main/java/ru/betterend/integration/rei/REIContainer.java index 47bfa4e8..3b9c7299 100644 --- a/src/main/java/ru/betterend/integration/rei/REIContainer.java +++ b/src/main/java/ru/betterend/integration/rei/REIContainer.java @@ -1,5 +1,8 @@ package ru.betterend.integration.rei; +import ru.betterend.client.gui.EndStoneSmelterScreenHandler; +import ru.betterend.recipe.builders.AlloyingRecipe; + public class REIContainer implements Runnable { @Override diff --git a/src/main/java/ru/betterend/integration/rei/REIInfusionCategory.java b/src/main/java/ru/betterend/integration/rei/REIInfusionCategory.java index eeb77143..92c4ed5f 100644 --- a/src/main/java/ru/betterend/integration/rei/REIInfusionCategory.java +++ b/src/main/java/ru/betterend/integration/rei/REIInfusionCategory.java @@ -11,9 +11,11 @@ import me.shedaniel.rei.api.client.registry.display.TransferDisplayCategory; import me.shedaniel.rei.api.common.category.CategoryIdentifier; import me.shedaniel.rei.api.common.entry.EntryIngredient; import me.shedaniel.rei.api.common.entry.EntryStack; +import me.shedaniel.rei.api.common.util.EntryStacks; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.TranslatableComponent; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.Items; import org.jetbrains.annotations.NotNull; import ru.betterend.BetterEnd; import ru.betterend.registry.EndBlocks; @@ -36,7 +38,8 @@ public class REIInfusionCategory implements TransferDisplayCategory) () -> this, PLUGIN_ID); - //} /*@Override public void registerRecipeDisplays(RecipeHelper recipeHelper) { @@ -64,6 +68,14 @@ public class REIPlugin implements me.shedaniel.rei.api.client.plugins.REIClientP } }); }*/ + + @Override + public void registerDisplays(DisplayRegistry registry) { + registry.registerRecipeFiller(AlloyingRecipe.class, AlloyingRecipe.TYPE, REIAlloyingDisplay::new); + registry.registerRecipeFiller(BlastingRecipe.class, RecipeType.BLASTING, REIBlastingDisplay::new); + registry.registerRecipeFiller(AnvilRecipe.class, AnvilRecipe.TYPE, REIAnvilDisplay::new); + registry.registerRecipeFiller(InfusionRecipe.class, InfusionRecipe.TYPE, REIInfusionDisplay::new); + } @Override public void registerCategories(CategoryRegistry registry) { @@ -74,24 +86,30 @@ public class REIPlugin implements me.shedaniel.rei.api.client.plugins.REIClientP new REIAnvilCategory() ); - registry.addWorkstations(ALLOYING_FUEL, END_STONE_SMELTER); - registry.addWorkstations(ALLOYING, END_STONE_SMELTER); - registry.addWorkstations(INFUSION, INFUSION_RITUAL); - registry.addWorkstations(SMITHING, ANVILS); + //registry.addWorkstations(ALLOYING_FUEL, END_STONE_SMELTER); + //registry.addWorkstations(ALLOYING, END_STONE_SMELTER); + //registry.addWorkstations(INFUSION, INFUSION_RITUAL); + //registry.addWorkstations(SMITHING, ANVILS); registry.removePlusButton(ALLOYING_FUEL); registry.removePlusButton(SMITHING); - registry.addWorkstations(DefaultPlugin.SMELTING, FURNACES); - registry.addWorkstations(DefaultPlugin.FUEL, FURNACES); - } + //registry.addWorkstations(DefaultPlugin.SMELTING, FURNACES); + //registry.addWorkstations(DefaultPlugin.FUEL, FURNACES); + } + static EntryType BLOCK = EntryType.deferred(new ResourceLocation("block")); static { - List anvils = Lists.newArrayList(EntryIngredients.ofItems(EndBlocks.getModBlocks().stream() + //initialize static state + EndPortals.loadPortals(); + System.out.println(EndBlocks.END_STONE_SMELTER + " - " + EndBlocks.END_STONE_SMELTER.asItem()); + //END_STONE_SMELTER = EntryStacks.of(EndBlocks.END_STONE_SMELTER.asItem()); + /*List anvils = Lists.newArrayList(EntryIngredients.ofItems(EndBlocks.getModBlocks().stream() .filter(EndAnvilBlock.class::isInstance).collect(Collectors.toList()))); anvils.add(0, EntryStacks.of(Blocks.ANVIL)); - ANVILS = anvils.toArray(new EntryStack[0]); - FURNACES = Lists.newArrayList(EntryIngredients.ofItems(EndBlocks.getModBlocks().stream() + ANVILS = anvils.toArray(new EntryStack[0]);*/ + + /*FURNACES = Lists.newArrayList(EntryIngredients.ofItems(EndBlocks.getModBlocks().stream() .filter(BaseFurnaceBlock.class::isInstance).collect(Collectors.toList()))) - .toArray(new EntryStack[0]); + .toArray(new EntryStack[0]);*/ } } diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 90a89ea6..4ca4089f 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -31,11 +31,8 @@ "ru.betterend.client.BetterEndClient" ], "rei_plugins": [ - "ru.betterend.integration.rei.REIPlugin" - ], - "rei_containers": [ - "ru.betterend.integration.rei.REIContainer" - ] + "ru.betterend.integration.rei.REIPlugin" + ] }, "mixins": [ "betterend.mixins.common.json", From c5fb15604296a28e6d1e8d80c86f42b70a74ef19 Mon Sep 17 00:00:00 2001 From: Frank Bauer Date: Tue, 29 Jun 2021 21:32:55 +0200 Subject: [PATCH 061/595] Fixes for REI --- .../integration/rei/REIAlloyingCategory.java | 7 +- .../rei/REIAlloyingFuelDisplay.java | 8 +- .../integration/rei/REIAnvilCategory.java | 14 ++- .../integration/rei/REIInfusionCategory.java | 8 +- .../betterend/integration/rei/REIPlugin.java | 91 +++++++++---------- 5 files changed, 67 insertions(+), 61 deletions(-) diff --git a/src/main/java/ru/betterend/integration/rei/REIAlloyingCategory.java b/src/main/java/ru/betterend/integration/rei/REIAlloyingCategory.java index 2a777fe2..0b11a5f8 100644 --- a/src/main/java/ru/betterend/integration/rei/REIAlloyingCategory.java +++ b/src/main/java/ru/betterend/integration/rei/REIAlloyingCategory.java @@ -23,6 +23,10 @@ import java.text.DecimalFormat; import java.util.List; public class REIAlloyingCategory implements TransferDisplayCategory { + private final EntryStack ICON; + REIAlloyingCategory(EntryStack icon){ + ICON = icon; + } @Override public @NotNull CategoryIdentifier getCategoryIdentifier() { @@ -36,8 +40,7 @@ public class REIAlloyingCategory implements TransferDisplayCategory fuel, CompoundTag tag) { @@ -24,10 +24,10 @@ public abstract class REIAlloyingFuelDisplay extends BasicDisplay { this.fuelTime = fuelTime; }*/ - /*@Override + @Override public CategoryIdentifier getCategoryIdentifier() { - return REIPluginClient.ALLOYING_FUEL; - }*/ + return REIPlugin.ALLOYING_FUEL; + } public int getFuelTime() { return fuelTime; diff --git a/src/main/java/ru/betterend/integration/rei/REIAnvilCategory.java b/src/main/java/ru/betterend/integration/rei/REIAnvilCategory.java index 694376cc..7875148f 100644 --- a/src/main/java/ru/betterend/integration/rei/REIAnvilCategory.java +++ b/src/main/java/ru/betterend/integration/rei/REIAnvilCategory.java @@ -27,6 +27,11 @@ import java.util.List; import java.util.stream.Collectors; public class REIAnvilCategory implements TransferDisplayCategory { + private final EntryStack[] ANVILS; + + REIAnvilCategory(EntryStack[] anvils){ + ANVILS = anvils; + } @Override public @NotNull CategoryIdentifier getCategoryIdentifier() { @@ -40,12 +45,11 @@ public class REIAnvilCategory implements TransferDisplayCategory setupDisplay(REIAnvilDisplay display, Rectangle bounds) { Point startPoint = new Point(bounds.getCenterX() - 41, bounds.y + 10); List widgets = Lists.newArrayList(); @@ -56,7 +60,7 @@ public class REIAnvilCategory implements TransferDisplayCategory inputEntries = display.getInputEntries(); EntryIngredient materials = inputEntries.get(1); int anvilLevel = display.getAnvilLevel(); - List anvils = Arrays.stream(REIPluginClient.ANVILS).filter(anvil -> { + List anvils = Arrays.stream(ANVILS).filter(anvil -> { Block block = ((BlockItem) anvil.getValue()).getBlock(); if (block instanceof EndAnvilBlock) { return ((EndAnvilBlock) block).getCraftingLevel() >= anvilLevel; @@ -73,7 +77,7 @@ public class REIAnvilCategory implements TransferDisplayCategory widgets, Rectangle bounds, REIAnvilDisplay display, diff --git a/src/main/java/ru/betterend/integration/rei/REIInfusionCategory.java b/src/main/java/ru/betterend/integration/rei/REIInfusionCategory.java index 92c4ed5f..1ab786a7 100644 --- a/src/main/java/ru/betterend/integration/rei/REIInfusionCategory.java +++ b/src/main/java/ru/betterend/integration/rei/REIInfusionCategory.java @@ -25,6 +25,11 @@ import java.util.List; public class REIInfusionCategory implements TransferDisplayCategory { private final static ResourceLocation BACKGROUND = BetterEnd.makeID("textures/gui/rei_infusion.png"); + private final EntryStack ICON; + + REIInfusionCategory(EntryStack icon){ + ICON = icon; + } @Override public @NotNull CategoryIdentifier getCategoryIdentifier() { @@ -38,8 +43,7 @@ public class REIInfusionCategory implements TransferDisplayCategory { - if (time >= 2000) { - recipeHelper.registerDisplay(new REIAlloyingFuelDisplay(EntryStack.of(item), time)); - } - }); - }*/ + void init(){ + //we need to initialize those variables after the static initialization + //otherwise the registry does not know the BlockItems + if (END_STONE_SMELTER!=null) { + return; + } + + END_STONE_SMELTER = EntryStacks.of(EndBlocks.END_STONE_SMELTER); + INFUSION_RITUAL = EntryStacks.of(EndBlocks.INFUSION_PEDESTAL); + + List anvils = Lists.newArrayList(EntryIngredients.ofItems(EndBlocks.getModBlocks().stream() + .filter(EndAnvilBlock.class::isInstance).collect(Collectors.toList()))); + anvils.add(0, EntryStacks.of(Blocks.ANVIL)); + ANVILS = anvils.toArray(new EntryStack[0]); + + FURNACES = Lists.newArrayList(EntryIngredients.ofItems(EndBlocks.getModBlocks().stream() + .filter(BaseFurnaceBlock.class::isInstance).collect(Collectors.toList()))) + .toArray(new EntryStack[0]); + } @Override public void registerDisplays(DisplayRegistry registry) { @@ -75,41 +77,34 @@ public final static int VAL = 13; registry.registerRecipeFiller(BlastingRecipe.class, RecipeType.BLASTING, REIBlastingDisplay::new); registry.registerRecipeFiller(AnvilRecipe.class, AnvilRecipe.TYPE, REIAnvilDisplay::new); registry.registerRecipeFiller(InfusionRecipe.class, InfusionRecipe.TYPE, REIInfusionDisplay::new); + + FuelRegistryImpl.INSTANCE.getFuelTimes().forEach((item, time) -> { + if (time >= 2000) { + final List list = Arrays.asList(EntryIngredients.of(item)); + registry.add(new REIAlloyingFuelDisplay(list, time)); + } + }); } @Override public void registerCategories(CategoryRegistry registry) { + init(); + registry.add( new REIAlloyingFuelCategory(), - new REIAlloyingCategory(), - new REIInfusionCategory(), - new REIAnvilCategory() + new REIAlloyingCategory(END_STONE_SMELTER), + new REIInfusionCategory(INFUSION_RITUAL), + new REIAnvilCategory(ANVILS) ); - //registry.addWorkstations(ALLOYING_FUEL, END_STONE_SMELTER); - //registry.addWorkstations(ALLOYING, END_STONE_SMELTER); - //registry.addWorkstations(INFUSION, INFUSION_RITUAL); - //registry.addWorkstations(SMITHING, ANVILS); + registry.addWorkstations(ALLOYING_FUEL, END_STONE_SMELTER); + registry.addWorkstations(ALLOYING, END_STONE_SMELTER); + registry.addWorkstations(INFUSION, INFUSION_RITUAL); + registry.addWorkstations(SMITHING, ANVILS); registry.removePlusButton(ALLOYING_FUEL); registry.removePlusButton(SMITHING); - //registry.addWorkstations(DefaultPlugin.SMELTING, FURNACES); - //registry.addWorkstations(DefaultPlugin.FUEL, FURNACES); - - } - static EntryType BLOCK = EntryType.deferred(new ResourceLocation("block")); - static { - //initialize static state - EndPortals.loadPortals(); - System.out.println(EndBlocks.END_STONE_SMELTER + " - " + EndBlocks.END_STONE_SMELTER.asItem()); - //END_STONE_SMELTER = EntryStacks.of(EndBlocks.END_STONE_SMELTER.asItem()); - /*List anvils = Lists.newArrayList(EntryIngredients.ofItems(EndBlocks.getModBlocks().stream() - .filter(EndAnvilBlock.class::isInstance).collect(Collectors.toList()))); - anvils.add(0, EntryStacks.of(Blocks.ANVIL)); - ANVILS = anvils.toArray(new EntryStack[0]);*/ - - /*FURNACES = Lists.newArrayList(EntryIngredients.ofItems(EndBlocks.getModBlocks().stream() - .filter(BaseFurnaceBlock.class::isInstance).collect(Collectors.toList()))) - .toArray(new EntryStack[0]);*/ + registry.addWorkstations(DefaultPlugin.SMELTING, FURNACES); + registry.addWorkstations(DefaultPlugin.FUEL, FURNACES); } } From b6c4e73481f237c7198565f7644b79837fc0e88e Mon Sep 17 00:00:00 2001 From: Frank Bauer Date: Tue, 29 Jun 2021 22:02:30 +0200 Subject: [PATCH 062/595] Fixed crash for anvil items on REI --- .../ru/betterend/integration/rei/REIAnvilCategory.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/java/ru/betterend/integration/rei/REIAnvilCategory.java b/src/main/java/ru/betterend/integration/rei/REIAnvilCategory.java index 7875148f..92456f5a 100644 --- a/src/main/java/ru/betterend/integration/rei/REIAnvilCategory.java +++ b/src/main/java/ru/betterend/integration/rei/REIAnvilCategory.java @@ -16,6 +16,7 @@ import net.minecraft.client.gui.GuiComponent; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.TranslatableComponent; import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; @@ -61,7 +62,11 @@ public class REIAnvilCategory implements TransferDisplayCategory { - Block block = ((BlockItem) anvil.getValue()).getBlock(); + Object value = anvil.getValue(); + if (value instanceof ItemStack){ + value = ((ItemStack) value).getItem(); + } + Block block = ((BlockItem) value).getBlock(); if (block instanceof EndAnvilBlock) { return ((EndAnvilBlock) block).getCraftingLevel() >= anvilLevel; } From ab6d015c98ff4c716ace065e23f2e638527566b9 Mon Sep 17 00:00:00 2001 From: Frank Bauer Date: Tue, 29 Jun 2021 23:05:36 +0200 Subject: [PATCH 063/595] Fixed Tick for `InfusionPedestal` --- .../ru/betterend/blocks/basis/PedestalBlock.java | 7 ++++++- .../blocks/entities/InfusionPedestalEntity.java | 11 +++++------ .../blocks/entities/PedestalBlockEntity.java | 14 +++++--------- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java b/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java index 81407855..8d79e82f 100644 --- a/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java @@ -435,7 +435,12 @@ public class PedestalBlock extends BaseBlockNotFull implements EntityBlock { @Override @Nullable public BlockEntityTicker getTicker(Level level, BlockState blockState, BlockEntityType blockEntityType) { - return level.isClientSide() ? null : createTickerHelper(blockEntityType, EndBlockEntities.PEDESTAL, PedestalBlockEntity::tick); + if (level.isClientSide) return null; + + BlockEntityTicker ticker = createTickerHelper(blockEntityType, EndBlockEntities.PEDESTAL, PedestalBlockEntity::tick); + if (ticker!=null) return ticker; + + return createTickerHelper(blockEntityType, EndBlockEntities.INFUSION_PEDESTAL, InfusionPedestalEntity::tick); } @Nullable diff --git a/src/main/java/ru/betterend/blocks/entities/InfusionPedestalEntity.java b/src/main/java/ru/betterend/blocks/entities/InfusionPedestalEntity.java index b13054dc..924c2af7 100644 --- a/src/main/java/ru/betterend/blocks/entities/InfusionPedestalEntity.java +++ b/src/main/java/ru/betterend/blocks/entities/InfusionPedestalEntity.java @@ -44,13 +44,12 @@ public class InfusionPedestalEntity extends PedestalBlockEntity { public boolean hasRitual() { return linkedRitual != null; } - - @Override - protected void tick(Level tickLevel, BlockPos tickPos, BlockState tickState){ - if (hasRitual()) { - linkedRitual.tick(); + + public static void tick(Level tickLevel, BlockPos tickPos, BlockState tickState, InfusionPedestalEntity blockEntity) { + if (blockEntity.hasRitual()) { + blockEntity.linkedRitual.tick(); } - super.tick(tickLevel, tickPos, tickState); + PedestalBlockEntity.tick(tickLevel, tickPos, tickState, blockEntity); } @Override diff --git a/src/main/java/ru/betterend/blocks/entities/PedestalBlockEntity.java b/src/main/java/ru/betterend/blocks/entities/PedestalBlockEntity.java index c7668f2d..27dd586e 100644 --- a/src/main/java/ru/betterend/blocks/entities/PedestalBlockEntity.java +++ b/src/main/java/ru/betterend/blocks/entities/PedestalBlockEntity.java @@ -132,16 +132,12 @@ public class PedestalBlockEntity extends BlockEntity implements Container, Block } } - protected void tick(Level tickLevel, BlockPos tickPos, BlockState tickState){ - if (!this.isEmpty()) { - this.age++; - if (this.age > this.maxAge) { - this.age = 0; + public static void tick(Level tickLevel, BlockPos tickPos, BlockState tickState, PedestalBlockEntity blockEntity) { + if (!blockEntity.isEmpty()) { + blockEntity.age++; + if (blockEntity.age > blockEntity.maxAge) { + blockEntity.age = 0; } } } - - public static void tick(Level tickLevel, BlockPos tickPos, BlockState tickState, PedestalBlockEntity blockEntity) { - blockEntity.tick(tickLevel, tickPos, tickState); - } } From 2ba7ed4ec8fc87631ed655a0959913f11ddbffa8 Mon Sep 17 00:00:00 2001 From: Frank Bauer Date: Tue, 29 Jun 2021 23:33:32 +0200 Subject: [PATCH 064/595] Fixed crash for unplacable Anvil --- src/main/java/ru/betterend/item/EndAnvilItem.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/ru/betterend/item/EndAnvilItem.java b/src/main/java/ru/betterend/item/EndAnvilItem.java index c1b1625c..0b178487 100644 --- a/src/main/java/ru/betterend/item/EndAnvilItem.java +++ b/src/main/java/ru/betterend/item/EndAnvilItem.java @@ -27,7 +27,9 @@ public class EndAnvilItem extends BaseAnvilItem { BlockState blockState = super.getPlacementState(blockPlaceContext); ItemStack stack = blockPlaceContext.getItemInHand(); int durability = stack.getOrCreateTag().getInt(DURABILITY); - blockState = blockState.setValue(((EndAnvilBlock) blockState.getBlock()).getDurability(), durability); + if (blockState!=null) { + blockState = blockState.setValue(((EndAnvilBlock) blockState.getBlock()).getDurability(), durability); + } return blockState; } From 9a28623230284778ea996929c1c834ffc61d7678 Mon Sep 17 00:00:00 2001 From: Frank Bauer Date: Wed, 30 Jun 2021 12:23:27 +0200 Subject: [PATCH 065/595] Fabric 1.17 does not contain the `ArmorRenderingRegistry`. Temporarily added the missing files to a shadow-namespace to allw testing of the CrystaliteArmor. --- .../item/model/CrystaliteArmorProvider.java | 7 +- .../betterend/registry/EndModelProviders.java | 7 +- .../rendering/v1/ArmorRenderingRegistry.java | 168 ++++++++++++++++++ .../rendering/ArmorProviderExtensions.java | 37 ++++ .../rendering/ArmorRenderingRegistryImpl.java | 82 +++++++++ .../rendering/MixinArmorFeatureRenderer.java | 107 +++++++++++ .../mixin/client/rendering/MixinItem.java | 57 ++++++ .../resources/betterend.mixins.shadow.json | 13 ++ src/main/resources/fabric.mod.json | 3 +- 9 files changed, 474 insertions(+), 7 deletions(-) create mode 100644 src/main/java/shadow/fabric/api/client/rendering/v1/ArmorRenderingRegistry.java create mode 100644 src/main/java/shadow/fabric/impl/client/rendering/ArmorProviderExtensions.java create mode 100644 src/main/java/shadow/fabric/impl/client/rendering/ArmorRenderingRegistryImpl.java create mode 100644 src/main/java/shadow/fabric/mixin/client/rendering/MixinArmorFeatureRenderer.java create mode 100644 src/main/java/shadow/fabric/mixin/client/rendering/MixinItem.java create mode 100644 src/main/resources/betterend.mixins.shadow.json diff --git a/src/main/java/ru/betterend/item/model/CrystaliteArmorProvider.java b/src/main/java/ru/betterend/item/model/CrystaliteArmorProvider.java index 1e5b603b..d1da3318 100644 --- a/src/main/java/ru/betterend/item/model/CrystaliteArmorProvider.java +++ b/src/main/java/ru/betterend/item/model/CrystaliteArmorProvider.java @@ -1,5 +1,7 @@ package ru.betterend.item.model; +import net.minecraft.client.renderer.entity.layers.HumanoidArmorLayer; +import net.minecraft.world.item.ArmorMaterial; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -16,9 +18,10 @@ import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import ru.betterend.item.CrystaliteArmor; import ru.betterend.registry.EndItems; +import shadow.fabric.api.client.rendering.v1.ArmorRenderingRegistry; @Environment(EnvType.CLIENT) -public class CrystaliteArmorProvider /*implements ModelProvider, TextureProvider*/ { +public class CrystaliteArmorProvider implements ArmorRenderingRegistry.ModelProvider, ArmorRenderingRegistry.TextureProvider { //TODO: find new registry private final static ResourceLocation FIRST_LAYER = new ResourceLocation("textures/models/armor/crystalite_layer_1.png"); private final static ResourceLocation SECOND_LAYER = new ResourceLocation("textures/models/armor/crystalite_layer_2.png"); @@ -27,7 +30,7 @@ public class CrystaliteArmorProvider /*implements ModelProvider, TextureProvider private final static CrystaliteChestplateModel CHEST_MODEL_SLIM = CrystaliteChestplateModel.createThinModel(null); private final static CrystaliteLeggingsModel LEGGINGS_MODEL = CrystaliteLeggingsModel.createModel(null); private final static CrystaliteBootsModel BOOTS_MODEL = CrystaliteBootsModel.createModel(null); - + //@Override public @NotNull ResourceLocation getArmorTexture(LivingEntity entity, ItemStack stack, EquipmentSlot slot, boolean secondLayer, @Nullable String suffix, ResourceLocation defaultTexture) { diff --git a/src/main/java/ru/betterend/registry/EndModelProviders.java b/src/main/java/ru/betterend/registry/EndModelProviders.java index f0a4e35b..0bcb41ce 100644 --- a/src/main/java/ru/betterend/registry/EndModelProviders.java +++ b/src/main/java/ru/betterend/registry/EndModelProviders.java @@ -3,6 +3,7 @@ package ru.betterend.registry; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import ru.betterend.item.model.CrystaliteArmorProvider; +import shadow.fabric.api.client.rendering.v1.ArmorRenderingRegistry; @Environment(EnvType.CLIENT) public class EndModelProviders { @@ -10,9 +11,7 @@ public class EndModelProviders { public final static CrystaliteArmorProvider CRYSTALITE_PROVIDER = new CrystaliteArmorProvider(); public final static void register() { - //TODO: Needs Fix in 1.17 - throw new RuntimeException("Needs Fix for 1.17"); - //ArmorRenderingRegistry.registerModel(CRYSTALITE_PROVIDER, CRYSTALITE_PROVIDER.getRenderedItems()); - //ArmorRenderingRegistry.registerTexture(CRYSTALITE_PROVIDER, CRYSTALITE_PROVIDER.getRenderedItems()); + ArmorRenderingRegistry.registerModel(CRYSTALITE_PROVIDER, CRYSTALITE_PROVIDER.getRenderedItems()); + ArmorRenderingRegistry.registerTexture(CRYSTALITE_PROVIDER, CRYSTALITE_PROVIDER.getRenderedItems()); } } diff --git a/src/main/java/shadow/fabric/api/client/rendering/v1/ArmorRenderingRegistry.java b/src/main/java/shadow/fabric/api/client/rendering/v1/ArmorRenderingRegistry.java new file mode 100644 index 00000000..068baebc --- /dev/null +++ b/src/main/java/shadow/fabric/api/client/rendering/v1/ArmorRenderingRegistry.java @@ -0,0 +1,168 @@ +/* + * Copyright (c) 2016, 2017, 2018, 2019 FabricMC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + /* + This file is a refactor from fabric-api, based on the work of shedaniel. + */ + + +package shadow.fabric.api.client.rendering.v1; + +import java.util.Arrays; + +import shadow.fabric.impl.client.rendering.ArmorRenderingRegistryImpl; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; + +/** + * A class for registering custom armor models and textures for {@link Item}, to be provided by a {@link ModelProvider} or {@link TextureProvider}. + * + *

This can be used to replace existing vanilla armor models and textures conditionally, however each {@link Item} + * instance can only allow one {@link ModelProvider} or {@link TextureProvider} respectively, causing potential conflicts + * with other mods if you replace the model or texture for vanilla items. Consider using a separate item instead.

+ * + *

A custom model would probably also require a custom texture to go along it, the model will use the vanilla texture if it is undefined.

+ * + *

Since armor textures identifier in vanilla is hardcoded to be in the {@code minecraft} namespace, this registry can also be + * used to use a custom namespace if desired.

+ */ +@Environment(EnvType.CLIENT) +public final class ArmorRenderingRegistry { + private ArmorRenderingRegistry() { + } + + /** + * Registers a provider for custom armor models for an item. + * + * @param provider the provider for the model + * @param items the items to be registered for + */ + public static void registerModel(@Nullable ModelProvider provider, Item... items) { + registerModel(provider, Arrays.asList(items)); + } + + /** + * Registers a provider for custom armor models for an item. + * + * @param provider the provider for the model + * @param items the items to be registered for + */ + public static void registerModel(@Nullable ModelProvider provider, Iterable items) { + ArmorRenderingRegistryImpl.registerModel(provider, items); + } + + /** + * Registers a provider for custom texture models for an item. + * + * @param provider the provider for the texture + * @param items the items to be registered for + */ + public static void registerTexture(@Nullable TextureProvider provider, Item... items) { + registerTexture(provider, Arrays.asList(items)); + } + + /** + * Registers a provider for custom texture models for an item. + * + * @param provider the provider for the texture + * @param items the items to be registered for + */ + public static void registerTexture(@Nullable TextureProvider provider, Iterable items) { + ArmorRenderingRegistryImpl.registerTexture(provider, items); + } + + /** + * Register simple armor items to use the vanilla armor file name under the mods namespace. + * + * @param identifier The namespace + path to use for the armor texture location. + * @param items the items to be registered + */ + public static void registerSimpleTexture(ResourceLocation identifier, Item... items) { + registerTexture((entity, stack, slot, secondLayer, suffix, defaultTexture) -> { + return new ResourceLocation(identifier.getNamespace(), "textures/models/armor/" + identifier.getPath() + "_layer_" + (secondLayer ? 2 : 1) + (suffix == null ? "" : "_" + suffix) + ".png"); + }, items); + } + + /** + * Gets the model of the armor piece. + * + * @param entity The entity equipping the armor + * @param stack The item stack of the armor + * @param slot The slot which the armor is in + * @param defaultModel The default model that vanilla provides + * @return The model of the armor piece. + */ + @NotNull + public static HumanoidModel getArmorModel(LivingEntity entity, ItemStack stack, EquipmentSlot slot, HumanoidModel defaultModel) { + return ArmorRenderingRegistryImpl.getArmorModel(entity, stack, slot, defaultModel); + } + + /** + * Gets the armor texture {@link net.minecraft.resources.ResourceLocation}. + * + * @param entity The entity equipping the armor + * @param stack The item stack of the armor + * @param slot The slot which the armor is in + * @param secondLayer True if using the second texture layer + * @param suffix The texture suffix, used in vanilla by {@link net.minecraft.world.item.DyeableArmorItem} + * @param defaultTexture The default vanilla texture identifier + * @return the custom armor texture identifier, return null to use the vanilla ones. Defaulted to the item's registry id. + */ + @NotNull + public static ResourceLocation getArmorTexture(LivingEntity entity, ItemStack stack, EquipmentSlot slot, boolean secondLayer, @Nullable String suffix, ResourceLocation defaultTexture) { + return ArmorRenderingRegistryImpl.getArmorTexture(entity, stack, slot, secondLayer, suffix, defaultTexture); + } + + @FunctionalInterface + @Environment(EnvType.CLIENT) + public interface ModelProvider { + /** + * Gets the model of the armor piece. + * + * @param entity The entity equipping the armor + * @param stack The item stack of the armor + * @param slot The slot which the armor is in + * @param defaultModel The default vanilla armor model + * @return The model of the armor piece. Should never be null. + */ + @NotNull + HumanoidModel getArmorModel(LivingEntity entity, ItemStack stack, EquipmentSlot slot, HumanoidModel defaultModel); + } + + @FunctionalInterface + @Environment(EnvType.CLIENT) + public interface TextureProvider { + /** + * Gets the armor texture {@link net.minecraft.resources.ResourceLocation}. + * + * @param entity The entity equipping the armor + * @param stack The item stack of the armor + * @param slot The slot which the armor is in + * @param defaultTexture The default vanilla texture identifier + * @return the custom armor texture identifier. Should never be null. + */ + @NotNull + ResourceLocation getArmorTexture(LivingEntity entity, ItemStack stack, EquipmentSlot slot, boolean secondLayer, @Nullable String suffix, ResourceLocation defaultTexture); + } +} diff --git a/src/main/java/shadow/fabric/impl/client/rendering/ArmorProviderExtensions.java b/src/main/java/shadow/fabric/impl/client/rendering/ArmorProviderExtensions.java new file mode 100644 index 00000000..2f076f8a --- /dev/null +++ b/src/main/java/shadow/fabric/impl/client/rendering/ArmorProviderExtensions.java @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2016, 2017, 2018, 2019 FabricMC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + /* + This file is a refactor from fabric-api, based on the work of shedaniel. + */ + + +package shadow.fabric.impl.client.rendering; + +import shadow.fabric.api.client.rendering.v1.ArmorRenderingRegistry; +import org.jetbrains.annotations.Nullable; + +public interface ArmorProviderExtensions { + @Nullable + ArmorRenderingRegistry.ModelProvider fabric_getArmorModelProvider(); + + @Nullable + ArmorRenderingRegistry.TextureProvider fabric_getArmorTextureProvider(); + + void fabric_setArmorModelProvider(@Nullable ArmorRenderingRegistry.ModelProvider provider); + + void fabric_setArmorTextureProvider(@Nullable ArmorRenderingRegistry.TextureProvider provider); +} diff --git a/src/main/java/shadow/fabric/impl/client/rendering/ArmorRenderingRegistryImpl.java b/src/main/java/shadow/fabric/impl/client/rendering/ArmorRenderingRegistryImpl.java new file mode 100644 index 00000000..35ae8c14 --- /dev/null +++ b/src/main/java/shadow/fabric/impl/client/rendering/ArmorRenderingRegistryImpl.java @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2016, 2017, 2018, 2019 FabricMC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + /* + This file is a refactor from fabric-api, based on the work of shedaniel. + */ + + +package shadow.fabric.impl.client.rendering; + +import java.util.Objects; + +import shadow.fabric.api.client.rendering.v1.ArmorRenderingRegistry; +import org.jetbrains.annotations.Nullable; +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; + +public final class ArmorRenderingRegistryImpl { + private ArmorRenderingRegistryImpl() { + } + + public static void registerModel(ArmorRenderingRegistry.ModelProvider provider, Iterable items) { + Objects.requireNonNull(items); + + for (Item item : items) { + Objects.requireNonNull(item); + + ((ArmorProviderExtensions) item).fabric_setArmorModelProvider(provider); + } + } + + public static void registerTexture(ArmorRenderingRegistry.TextureProvider provider, Iterable items) { + Objects.requireNonNull(items); + + for (Item item : items) { + Objects.requireNonNull(item); + + ((ArmorProviderExtensions) item).fabric_setArmorTextureProvider(provider); + } + } + + public static HumanoidModel getArmorModel(LivingEntity entity, ItemStack stack, EquipmentSlot slot, HumanoidModel defaultModel) { + if (!stack.isEmpty()) { + ArmorRenderingRegistry.ModelProvider provider = ((ArmorProviderExtensions) stack.getItem()).fabric_getArmorModelProvider(); + + if (provider != null) { + return provider.getArmorModel(entity, stack, slot, defaultModel); + } + } + + return defaultModel; + } + + public static ResourceLocation getArmorTexture(LivingEntity entity, ItemStack stack, EquipmentSlot slot, boolean secondLayer, @Nullable String suffix, ResourceLocation defaultTexture) { + if (!stack.isEmpty()) { + ArmorRenderingRegistry.TextureProvider provider = ((ArmorProviderExtensions) stack.getItem()).fabric_getArmorTextureProvider(); + + if (provider != null) { + return provider.getArmorTexture(entity, stack, slot, secondLayer, suffix, defaultTexture); + } + } + + return defaultTexture; + } +} diff --git a/src/main/java/shadow/fabric/mixin/client/rendering/MixinArmorFeatureRenderer.java b/src/main/java/shadow/fabric/mixin/client/rendering/MixinArmorFeatureRenderer.java new file mode 100644 index 00000000..5b678eee --- /dev/null +++ b/src/main/java/shadow/fabric/mixin/client/rendering/MixinArmorFeatureRenderer.java @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2016, 2017, 2018, 2019 FabricMC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + /* + This file is a refactor from fabric-api, based on the work of shedaniel. + */ + + +package shadow.fabric.mixin.client.rendering; + +import com.mojang.blaze3d.vertex.PoseStack; +import java.util.Map; +import java.util.Objects; + +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import org.spongepowered.asm.mixin.injection.callback.LocalCapture; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import shadow.fabric.api.client.rendering.v1.ArmorRenderingRegistry; +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.entity.RenderLayerParent; +import net.minecraft.client.renderer.entity.layers.HumanoidArmorLayer; +import net.minecraft.client.renderer.entity.layers.RenderLayer; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ArmorItem; +import net.minecraft.world.item.ItemStack; + +@Mixin(HumanoidArmorLayer.class) +@Environment(EnvType.CLIENT) +public abstract class MixinArmorFeatureRenderer extends RenderLayer { + @Shadow + @Final + private static Map ARMOR_LOCATION_CACHE; + + public MixinArmorFeatureRenderer(RenderLayerParent context) { + super(context); + + } + + @Unique + private LivingEntity storedEntity; + @Unique + private EquipmentSlot storedSlot; + + @Inject(method = "render", at = @At("HEAD")) + private void storeEntity(PoseStack matrixStack, MultiBufferSource vertexConsumerProvider, int i, LivingEntity livingEntity, float f, float g, float h, float j, float k, float l, CallbackInfo ci) { + // We store the living entity wearing the armor before we render + this.storedEntity = livingEntity; + } + + @Inject(method = "renderArmorPiece", at = @At("HEAD")) + private void storeSlot(PoseStack matrices, MultiBufferSource vertexConsumers, LivingEntity livingEntity, EquipmentSlot slot, int i, HumanoidModel bipedEntityModel, CallbackInfo ci) { + // We store the current armor slot that is rendering before we render each armor piece + this.storedSlot = slot; + } + + @Inject(method = "render", at = @At("RETURN")) + private void removeStored(PoseStack matrixStack, MultiBufferSource vertexConsumerProvider, int i, LivingEntity livingEntity, float f, float g, float h, float j, float k, float l, CallbackInfo ci) { + // We remove the stored data after we render + this.storedEntity = null; + this.storedSlot = null; + } + + @Inject(method = "getArmorModel", at = @At("RETURN"), cancellable = true) + private void selectArmorModel(EquipmentSlot slot, CallbackInfoReturnable> cir) { + ItemStack stack = storedEntity.getItemBySlot(slot); + + HumanoidModel defaultModel = cir.getReturnValue(); + HumanoidModel model = ArmorRenderingRegistry.getArmorModel(storedEntity, stack, slot, defaultModel); + + if (model != defaultModel) { + cir.setReturnValue(model); + } + } + + @Inject(method = "getArmorLocation", at = @At(value = "INVOKE", target = "Ljava/util/Map;computeIfAbsent(Ljava/lang/Object;Ljava/util/function/Function;)Ljava/lang/Object;"), cancellable = true, locals = LocalCapture.CAPTURE_FAILHARD) + private void getArmorTexture(ArmorItem armorItem, boolean secondLayer, /* @Nullable */ String suffix, CallbackInfoReturnable cir, String vanillaIdentifier) { + String texture = ArmorRenderingRegistry.getArmorTexture(storedEntity, storedEntity.getItemBySlot(storedSlot), storedSlot, secondLayer, suffix, new ResourceLocation(vanillaIdentifier)).toString(); + + if (!Objects.equals(texture, vanillaIdentifier)) { + cir.setReturnValue(ARMOR_LOCATION_CACHE.computeIfAbsent(texture, ResourceLocation::new)); + } + } +} diff --git a/src/main/java/shadow/fabric/mixin/client/rendering/MixinItem.java b/src/main/java/shadow/fabric/mixin/client/rendering/MixinItem.java new file mode 100644 index 00000000..aa5c6bab --- /dev/null +++ b/src/main/java/shadow/fabric/mixin/client/rendering/MixinItem.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2016, 2017, 2018, 2019 FabricMC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + /* + This file is a refactor from fabric-api, based on the work of shedaniel. + */ + +package shadow.fabric.mixin.client.rendering; + + +import net.minecraft.world.item.Item; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +import shadow.fabric.api.client.rendering.v1.ArmorRenderingRegistry; +import shadow.fabric.impl.client.rendering.ArmorProviderExtensions; + + +@Mixin(Item.class) +public class MixinItem implements ArmorProviderExtensions { + @Unique + private ArmorRenderingRegistry.ModelProvider armorModelProvider; + @Unique + private ArmorRenderingRegistry.TextureProvider armorTextureProvider; + + @Override + public ArmorRenderingRegistry.ModelProvider fabric_getArmorModelProvider() { + return armorModelProvider; + } + + @Override + public ArmorRenderingRegistry.TextureProvider fabric_getArmorTextureProvider() { + return armorTextureProvider; + } + + @Override + public void fabric_setArmorModelProvider(ArmorRenderingRegistry.ModelProvider provider) { + armorModelProvider = provider; + } + + @Override + public void fabric_setArmorTextureProvider(ArmorRenderingRegistry.TextureProvider provider) { + armorTextureProvider = provider; + } +} \ No newline at end of file diff --git a/src/main/resources/betterend.mixins.shadow.json b/src/main/resources/betterend.mixins.shadow.json new file mode 100644 index 00000000..08955be4 --- /dev/null +++ b/src/main/resources/betterend.mixins.shadow.json @@ -0,0 +1,13 @@ +{ + "required": true, + "minVersion": "0.8", + "package": "shadow.fabric.mixin.client.rendering", + "compatibilityLevel": "JAVA_16", + "client": [ + "MixinArmorFeatureRenderer", + "MixinItem" + ], + "injectors": { + "defaultRequire": 1 + } +} diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 4ca4089f..adb47c1c 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -36,7 +36,8 @@ }, "mixins": [ "betterend.mixins.common.json", - "betterend.mixins.client.json" + "betterend.mixins.client.json", + "betterend.mixins.shadow.json" ], "depends": { From 3386f1c6b0fb75debedc4049f50cac7b84600cb7 Mon Sep 17 00:00:00 2001 From: Frank Bauer Date: Wed, 30 Jun 2021 12:25:01 +0200 Subject: [PATCH 066/595] Latest REI Version --- gradle.properties | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/gradle.properties b/gradle.properties index 942e0feb..cc05f040 100644 --- a/gradle.properties +++ b/gradle.properties @@ -17,5 +17,4 @@ archives_base_name = better-end patchouli_version = 55-FABRIC-SNAPSHOT fabric_version = 0.36.0+1.17 canvas_version = 1.0.+ -bclib_version = 0.1.43 -rei_version = 6.0.258-alpha \ No newline at end of file +rei_version = 6.0.260-alpha \ No newline at end of file From 2b71f7782a8794d3b12219cf73c4d40606ff6a14 Mon Sep 17 00:00:00 2001 From: Frank Bauer Date: Wed, 30 Jun 2021 13:24:01 +0200 Subject: [PATCH 067/595] Updated EndSky-Rendering --- .../mixin/client/WorldRendererMixin.java | 33 +++++++++---------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/src/main/java/ru/betterend/mixin/client/WorldRendererMixin.java b/src/main/java/ru/betterend/mixin/client/WorldRendererMixin.java index 953d7053..b419cbab 100644 --- a/src/main/java/ru/betterend/mixin/client/WorldRendererMixin.java +++ b/src/main/java/ru/betterend/mixin/client/WorldRendererMixin.java @@ -2,7 +2,9 @@ package ru.betterend.mixin.client; import java.util.Random; +import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.math.Matrix4f; +import net.minecraft.client.renderer.GameRenderer; import org.lwjgl.opengl.GL11; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; @@ -113,6 +115,7 @@ public class WorldRendererMixin { //RenderSystem.enableAlphaTest(); //RenderSystem.alphaFunc(516, 0.0F); RenderSystem.enableBlend(); + RenderSystem.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA); } float blindA = 1F - BackgroundInfo.blindness; @@ -123,35 +126,31 @@ public class WorldRendererMixin { matrices.pushPose(); matrices.mulPose(new Quaternion(0, time, 0, false)); RenderSystem.setShaderTexture(0, HORIZON); - //textureManager.bind(HORIZON); - be_renderBuffer(matrices, horizon, DefaultVertexFormat.POSITION_TEX, 0.77F, 0.31F, 0.73F, 0.7F * blindA); + be_renderBuffer(matrices, matrix4f, horizon, DefaultVertexFormat.POSITION_TEX, 0.77F, 0.31F, 0.73F, 0.7F * blindA); matrices.popPose(); matrices.pushPose(); matrices.mulPose(new Quaternion(0, -time, 0, false)); - //textureManager.bind(NEBULA_1); RenderSystem.setShaderTexture(0, NEBULA_1); - be_renderBuffer(matrices, nebulas1, DefaultVertexFormat.POSITION_TEX, 0.77F, 0.31F, 0.73F, blind02); + be_renderBuffer(matrices, matrix4f, nebulas1, DefaultVertexFormat.POSITION_TEX, 0.77F, 0.31F, 0.73F, blind02); matrices.popPose(); matrices.pushPose(); matrices.mulPose(new Quaternion(0, time2, 0, false)); - //textureManager.bind(NEBULA_2); RenderSystem.setShaderTexture(0, NEBULA_2); - be_renderBuffer(matrices, nebulas2, DefaultVertexFormat.POSITION_TEX, 0.77F, 0.31F, 0.73F, blind02); + be_renderBuffer(matrices, matrix4f, nebulas2, DefaultVertexFormat.POSITION_TEX, 0.77F, 0.31F, 0.73F, blind02); matrices.popPose(); - //textureManager.bind(STARS); RenderSystem.setShaderTexture(0, STARS); matrices.pushPose(); matrices.mulPose(axis3.rotation(time)); - be_renderBuffer(matrices, stars3, DefaultVertexFormat.POSITION_TEX, 0.77F, 0.31F, 0.73F, blind06); + be_renderBuffer(matrices, matrix4f ,stars3, DefaultVertexFormat.POSITION_TEX, 0.77F, 0.31F, 0.73F, blind06); matrices.popPose(); matrices.pushPose(); matrices.mulPose(axis4.rotation(time2)); - be_renderBuffer(matrices, stars4, DefaultVertexFormat.POSITION_TEX, 1F, 1F, 1F, blind06); + be_renderBuffer(matrices, matrix4f, stars4, DefaultVertexFormat.POSITION_TEX, 1F, 1F, 1F, blind06); matrices.popPose(); } @@ -159,8 +158,7 @@ public class WorldRendererMixin { if (a > 0) { if (a > 1) a = 1; RenderSystem.setShaderTexture(0, FOG); - //textureManager.bind(FOG); - be_renderBuffer(matrices, fog, DefaultVertexFormat.POSITION_TEX, BackgroundInfo.fogColorRed, BackgroundInfo.fogColorGreen, BackgroundInfo.fogColorBlue, a); + be_renderBuffer(matrices, matrix4f, fog, DefaultVertexFormat.POSITION_TEX, BackgroundInfo.fogColorRed, BackgroundInfo.fogColorGreen, BackgroundInfo.fogColorBlue, a); } RenderSystem.disableTexture(); @@ -168,29 +166,30 @@ public class WorldRendererMixin { if (blindA > 0) { matrices.pushPose(); matrices.mulPose(axis1.rotation(time3)); - be_renderBuffer(matrices, stars1, DefaultVertexFormat.POSITION, 1, 1, 1, blind06); + be_renderBuffer(matrices, matrix4f, stars1, DefaultVertexFormat.POSITION, 1, 1, 1, blind06); matrices.popPose(); matrices.pushPose(); matrices.mulPose(axis2.rotation(time2)); - be_renderBuffer(matrices, stars2, DefaultVertexFormat.POSITION, 0.95F, 0.64F, 0.93F, blind06); + be_renderBuffer(matrices, matrix4f, stars2, DefaultVertexFormat.POSITION, 0.95F, 0.64F, 0.93F, blind06); matrices.popPose(); } RenderSystem.enableTexture(); RenderSystem.depthMask(true); + RenderSystem.defaultBlendFunc(); + RenderSystem.disableBlend(); info.cancel(); } } - private void be_renderBuffer(PoseStack matrices, VertexBuffer buffer, VertexFormat format, float r, float g, float b, float a) { + private void be_renderBuffer(PoseStack matrices, Matrix4f matrix4f, VertexBuffer buffer, VertexFormat format, float r, float g, float b, float a) { RenderSystem.setShaderColor(r, g, b, a); buffer.bind(); - //format.setupBufferState(0L); - //buffer.draw(matrices.last().pose(), 7); format.setupBufferState(); - buffer.draw(); + buffer.drawWithShader(matrices.last().pose(), matrix4f, GameRenderer.getPositionTexShader()); + VertexBuffer.unbind(); format.clearBufferState(); } From 3f225c59a172447f327245fa80e591c59342c5a9 Mon Sep 17 00:00:00 2001 From: Aleksey Date: Wed, 30 Jun 2021 16:20:16 +0300 Subject: [PATCH 068/595] Possibility to add NBT data for Infusion recipes output (#215) --- build.gradle | 26 +++++++++---------- gradle.properties | 8 +++--- .../mixin/common/LivingEntityMixin.java | 2 +- .../particle/InfusionParticleType.java | 13 +++++----- .../recipe/builders/InfusionRecipe.java | 14 ++++++++++ 5 files changed, 38 insertions(+), 25 deletions(-) diff --git a/build.gradle b/build.gradle index ce8b3995..9a618e8b 100644 --- a/build.gradle +++ b/build.gradle @@ -43,30 +43,30 @@ dependencies { def useOptional(String dep) { dependencies.modRuntime (dep) { - exclude group: "net.fabricmc.fabric-api" - exclude group: "net.fabricmc" + exclude group: 'net.fabricmc.fabric-api' + exclude group: 'net.fabricmc' if (!dep.contains("me.shedaniel")) { - exclude group: "me.shedaniel.cloth" - exclude group: "me.shedaniel" + exclude group: 'me.shedaniel.cloth' + exclude group: 'me.shedaniel' } } dependencies.modCompileOnly (dep) { - exclude group: "net.fabricmc.fabric-api" - exclude group: "net.fabricmc" + exclude group: 'net.fabricmc.fabric-api' + exclude group: 'net.fabricmc' if (!dep.contains("me.shedaniel")) { - exclude group: "me.shedaniel.cloth" - exclude group: "me.shedaniel" + exclude group: 'me.shedaniel.cloth' + exclude group: 'me.shedaniel' } } } def useApi(String dep) { dependencies.modApi (dep) { - exclude group: "net.fabricmc.fabric-api" - exclude group: "net.fabricmc" + exclude group: 'net.fabricmc.fabric-api' + exclude group: 'net.fabricmc' if (!dep.contains("me.shedaniel")) { - exclude group: "me.shedaniel.cloth" - exclude group: "me.shedaniel" + exclude group: 'me.shedaniel.cloth' + exclude group: 'me.shedaniel' } } } @@ -162,4 +162,4 @@ task release(dependsOn: [remapJar, sourcesJar, javadocJar]) { // // uncomment to publish to the local maven // // mavenLocal() // } -//} +//} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 5f798ac2..a0581cf9 100644 --- a/gradle.properties +++ b/gradle.properties @@ -14,8 +14,8 @@ archives_base_name = better-end # Dependencies # currently not on the main fabric site, check on the maven: https://maven.fabricmc.net/net/fabricmc/fabric-api/fabric-api -patchouli_version = 50-FABRIC -fabric_version = 0.32.9+1.16 -canvas_version = 1.0.+ +patchouli_version = 53-FABRIC +fabric_version = 0.36.0+1.16 bclib_version = 0.1.44 -rei_version = 5.8.10 \ No newline at end of file +rei_version = 5.12.248 +canvas_version = 1.0.+ \ No newline at end of file diff --git a/src/main/java/ru/betterend/mixin/common/LivingEntityMixin.java b/src/main/java/ru/betterend/mixin/common/LivingEntityMixin.java index 93c28174..565976a8 100644 --- a/src/main/java/ru/betterend/mixin/common/LivingEntityMixin.java +++ b/src/main/java/ru/betterend/mixin/common/LivingEntityMixin.java @@ -95,7 +95,7 @@ public abstract class LivingEntityMixin extends Entity { info.setReturnValue(false); } } catch (Exception ex) { - BetterEnd.LOGGER.warning("Blindness resistance attribute haven't registered."); + BetterEnd.LOGGER.warning("Blindness resistance attribute haven't been registered."); } } diff --git a/src/main/java/ru/betterend/particle/InfusionParticleType.java b/src/main/java/ru/betterend/particle/InfusionParticleType.java index 672f3ab9..bda8fe13 100644 --- a/src/main/java/ru/betterend/particle/InfusionParticleType.java +++ b/src/main/java/ru/betterend/particle/InfusionParticleType.java @@ -17,11 +17,10 @@ import ru.bclib.util.ColorUtil; import ru.betterend.registry.EndParticles; public class InfusionParticleType extends ParticleType implements ParticleOptions { - public static final Codec CODEC = ItemStack.CODEC.xmap(itemStack -> { - return new InfusionParticleType(EndParticles.INFUSION, itemStack); - }, infusionParticleType -> { - return infusionParticleType.itemStack; - }); + public static final Codec CODEC = ItemStack.CODEC.xmap( + itemStack -> new InfusionParticleType(EndParticles.INFUSION, itemStack), + infusionParticleType -> infusionParticleType.itemStack); + public static final ParticleOptions.Deserializer PARAMETERS_FACTORY = new ParticleOptions.Deserializer() { public InfusionParticleType fromCommand(ParticleType particleType, StringReader stringReader) throws CommandSyntaxException { stringReader.expect(' '); @@ -35,8 +34,8 @@ public class InfusionParticleType extends ParticleType imp } }; - private ParticleType type; - private ItemStack itemStack; + private final ParticleType type; + private final ItemStack itemStack; public InfusionParticleType(ParticleType particleType, ItemStack stack) { super(true, PARAMETERS_FACTORY); diff --git a/src/main/java/ru/betterend/recipe/builders/InfusionRecipe.java b/src/main/java/ru/betterend/recipe/builders/InfusionRecipe.java index b05b2f37..f1186d59 100644 --- a/src/main/java/ru/betterend/recipe/builders/InfusionRecipe.java +++ b/src/main/java/ru/betterend/recipe/builders/InfusionRecipe.java @@ -4,11 +4,15 @@ import java.util.Arrays; import com.google.gson.JsonObject; +import com.mojang.brigadier.exceptions.CommandSyntaxException; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; +import net.fabricmc.fabric.api.util.NbtType; import net.minecraft.core.NonNullList; +import net.minecraft.nbt.*; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.TagLoader; import net.minecraft.util.GsonHelper; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.Ingredient; @@ -17,6 +21,7 @@ import net.minecraft.world.item.crafting.RecipeSerializer; import net.minecraft.world.item.crafting.RecipeType; import net.minecraft.world.level.ItemLike; import net.minecraft.world.level.Level; +import net.minecraft.world.level.storage.loot.GsonAdapterFactory; import ru.bclib.recipes.BCLRecipeManager; import ru.betterend.BetterEnd; import ru.betterend.config.Configs; @@ -209,6 +214,15 @@ public class InfusionRecipe implements Recipe, BetterEndRecipe { if (recipe.output == null) { throw new IllegalStateException("Output item does not exists!"); } + if (result.has("nbt")) { + try { + String nbtData = GsonHelper.getAsString(result, "nbt"); + CompoundTag nbt = TagParser.parseTag(nbtData); + recipe.output.setTag(nbt); + } catch (CommandSyntaxException ex) { + BetterEnd.LOGGER.warning("Error parse nbt data for output.", ex); + } + } recipe.group = GsonHelper.getAsString(json, "group", GROUP); recipe.time = GsonHelper.getAsInt(json, "time", 1); From e28dcf1ee4032fcc58b1ec03ba5c14e66a269825 Mon Sep 17 00:00:00 2001 From: Aleksey Date: Wed, 30 Jun 2021 16:23:32 +0300 Subject: [PATCH 069/595] Possibility to add NBT data for Anvil recipes output --- .../ru/betterend/recipe/builders/AnvilRecipe.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/main/java/ru/betterend/recipe/builders/AnvilRecipe.java b/src/main/java/ru/betterend/recipe/builders/AnvilRecipe.java index 2a9ed475..0bee9b39 100644 --- a/src/main/java/ru/betterend/recipe/builders/AnvilRecipe.java +++ b/src/main/java/ru/betterend/recipe/builders/AnvilRecipe.java @@ -4,9 +4,12 @@ import java.util.Objects; import com.google.gson.JsonObject; +import com.mojang.brigadier.exceptions.CommandSyntaxException; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.core.NonNullList; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.TagParser; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.Tag; @@ -276,6 +279,15 @@ public class AnvilRecipe implements Recipe, BetterEndRecipe { if (output == null) { throw new IllegalStateException("Output item does not exists!"); } + if (result.has("nbt")) { + try { + String nbtData = GsonHelper.getAsString(result, "nbt"); + CompoundTag nbt = TagParser.parseTag(nbtData); + output.setTag(nbt); + } catch (CommandSyntaxException ex) { + BetterEnd.LOGGER.warning("Error parse nbt data for output.", ex); + } + } int inputCount = GsonHelper.getAsInt(json, "inputCount", 1); int toolLevel = GsonHelper.getAsInt(json, "toolLevel", 1); int anvilLevel = GsonHelper.getAsInt(json, "anvilLevel", 1); From 8c1f9567a518ac3a80b0de2db8a51623db9bb73f Mon Sep 17 00:00:00 2001 From: Frank Bauer Date: Sun, 4 Jul 2021 18:53:00 +0200 Subject: [PATCH 070/595] Automatic tool configuration for Blocks --- .../ru/betterend/blocks/AeterniumBlock.java | 4 +++- .../betterend/blocks/AmaranitaStemBlock.java | 4 ++-- .../java/ru/betterend/blocks/AmberBlock.java | 4 ++-- .../blocks/AncientEmeraldIceBlock.java | 3 +-- .../ru/betterend/blocks/BrimstoneBlock.java | 3 +-- .../ru/betterend/blocks/CavePumpkinBlock.java | 4 ++-- .../ru/betterend/blocks/ChandelierBlock.java | 11 +++++++++-- .../ru/betterend/blocks/CharcoalBlock.java | 4 ++-- .../betterend/blocks/DenseEmeraldIceBlock.java | 4 ++-- .../ru/betterend/blocks/EmeraldIceBlock.java | 4 ++-- .../ru/betterend/blocks/EndLotusStemBlock.java | 3 +-- .../ru/betterend/blocks/EndPortalBlock.java | 4 ++-- .../ru/betterend/blocks/EndStoneSmelter.java | 18 +++++++++++++----- .../java/ru/betterend/blocks/EnderBlock.java | 2 ++ .../ru/betterend/blocks/EndstoneDustBlock.java | 4 ++-- .../betterend/blocks/JellyshroomCapBlock.java | 4 ++-- .../ru/betterend/blocks/MengerSpongeBlock.java | 5 ++--- .../betterend/blocks/MengerSpongeWetBlock.java | 3 +-- .../ru/betterend/blocks/MissingTileBlock.java | 4 ++-- .../betterend/blocks/MossyDragonBoneBlock.java | 4 ++-- .../ru/betterend/blocks/MossyObsidian.java | 4 ++-- .../ru/betterend/blocks/NeonCactusBlock.java | 4 ++-- .../betterend/blocks/NeonCactusPlantBlock.java | 3 +-- .../betterend/blocks/RespawnObeliskBlock.java | 3 +-- .../blocks/UmbrellaTreeClusterBlock.java | 3 +-- .../blocks/UmbrellaTreeClusterEmptyBlock.java | 3 +-- .../blocks/UmbrellaTreeMembraneBlock.java | 4 ++-- .../blocks/basis/EndLanternBlock.java | 4 ++-- .../betterend/blocks/basis/PedestalBlock.java | 15 +++++++-------- .../blocks/basis/StoneLanternBlock.java | 4 ++-- .../blocks/complex/ColoredMaterial.java | 2 +- .../complex/CrystalSubblocksMaterial.java | 3 ++- .../blocks/complex/MetalMaterial.java | 11 ++++++----- .../blocks/complex/StoneMaterial.java | 3 ++- .../blocks/complex/WoodenMaterial.java | 3 ++- 35 files changed, 89 insertions(+), 76 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/AeterniumBlock.java b/src/main/java/ru/betterend/blocks/AeterniumBlock.java index d176689d..f6369d15 100644 --- a/src/main/java/ru/betterend/blocks/AeterniumBlock.java +++ b/src/main/java/ru/betterend/blocks/AeterniumBlock.java @@ -3,6 +3,7 @@ package ru.betterend.blocks; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; import net.minecraft.core.BlockPos; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.block.SoundType; @@ -17,7 +18,8 @@ public class AeterniumBlock extends BaseBlock { super(FabricBlockSettings.of(Material.METAL, MaterialColor.COLOR_GRAY) .hardness(65F) .resistance(1200F) - .requiresCorrectToolForDrops() + .breakByTool(FabricToolTags.PICKAXES) + .requiresCorrectToolForDrops() .sound(SoundType.NETHERITE_BLOCK)); } diff --git a/src/main/java/ru/betterend/blocks/AmaranitaStemBlock.java b/src/main/java/ru/betterend/blocks/AmaranitaStemBlock.java index 47885625..cfb07510 100644 --- a/src/main/java/ru/betterend/blocks/AmaranitaStemBlock.java +++ b/src/main/java/ru/betterend/blocks/AmaranitaStemBlock.java @@ -1,12 +1,12 @@ package ru.betterend.blocks; -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.material.MaterialColor; import ru.bclib.blocks.BaseRotatedPillarBlock; +import ru.bclib.util.BlocksHelper; public class AmaranitaStemBlock extends BaseRotatedPillarBlock { public AmaranitaStemBlock() { - super(FabricBlockSettings.copyOf(Blocks.OAK_PLANKS).materialColor(MaterialColor.COLOR_LIGHT_GREEN)); + super(BlocksHelper.copySettingsOf(Blocks.OAK_PLANKS).materialColor(MaterialColor.COLOR_LIGHT_GREEN)); } } diff --git a/src/main/java/ru/betterend/blocks/AmberBlock.java b/src/main/java/ru/betterend/blocks/AmberBlock.java index feedaea8..a26ea970 100644 --- a/src/main/java/ru/betterend/blocks/AmberBlock.java +++ b/src/main/java/ru/betterend/blocks/AmberBlock.java @@ -1,12 +1,12 @@ package ru.betterend.blocks; -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.material.MaterialColor; import ru.bclib.blocks.BaseBlock; +import ru.bclib.util.BlocksHelper; public class AmberBlock extends BaseBlock { public AmberBlock() { - super(FabricBlockSettings.copyOf(Blocks.DIAMOND_BLOCK).materialColor(MaterialColor.COLOR_YELLOW)); + super(BlocksHelper.copySettingsOf(Blocks.DIAMOND_BLOCK).materialColor(MaterialColor.COLOR_YELLOW)); } } diff --git a/src/main/java/ru/betterend/blocks/AncientEmeraldIceBlock.java b/src/main/java/ru/betterend/blocks/AncientEmeraldIceBlock.java index 2c73a6d1..c1a62a76 100644 --- a/src/main/java/ru/betterend/blocks/AncientEmeraldIceBlock.java +++ b/src/main/java/ru/betterend/blocks/AncientEmeraldIceBlock.java @@ -4,7 +4,6 @@ import java.util.Collections; import java.util.List; import java.util.Random; -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; @@ -23,7 +22,7 @@ import ru.betterend.registry.EndParticles; public class AncientEmeraldIceBlock extends BaseBlock { public AncientEmeraldIceBlock() { - super(FabricBlockSettings.copyOf(Blocks.BLUE_ICE).randomTicks()); + super(BlocksHelper.copySettingsOf(Blocks.BLUE_ICE).randomTicks()); } @Override diff --git a/src/main/java/ru/betterend/blocks/BrimstoneBlock.java b/src/main/java/ru/betterend/blocks/BrimstoneBlock.java index e26d2ce1..2e816be9 100644 --- a/src/main/java/ru/betterend/blocks/BrimstoneBlock.java +++ b/src/main/java/ru/betterend/blocks/BrimstoneBlock.java @@ -4,7 +4,6 @@ import java.util.Random; import org.jetbrains.annotations.Nullable; -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -29,7 +28,7 @@ public class BrimstoneBlock extends BaseBlock { public static final BooleanProperty ACTIVATED = BlockProperties.ACTIVE; public BrimstoneBlock() { - super(FabricBlockSettings.copyOf(Blocks.END_STONE).materialColor(MaterialColor.COLOR_BROWN).randomTicks()); + super(BlocksHelper.copySettingsOf(Blocks.END_STONE).materialColor(MaterialColor.COLOR_BROWN).randomTicks()); registerDefaultState(stateDefinition.any().setValue(ACTIVATED, false)); } diff --git a/src/main/java/ru/betterend/blocks/CavePumpkinBlock.java b/src/main/java/ru/betterend/blocks/CavePumpkinBlock.java index f61aa0cb..a4c6c4af 100644 --- a/src/main/java/ru/betterend/blocks/CavePumpkinBlock.java +++ b/src/main/java/ru/betterend/blocks/CavePumpkinBlock.java @@ -3,7 +3,6 @@ package ru.betterend.blocks; import java.util.Collections; import java.util.List; -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.core.BlockPos; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.BlockGetter; @@ -20,6 +19,7 @@ import ru.bclib.blocks.BaseBlockNotFull; import ru.bclib.blocks.BlockProperties; import ru.bclib.client.render.BCLRenderLayer; import ru.bclib.interfaces.IRenderTyped; +import ru.bclib.util.BlocksHelper; import ru.betterend.registry.EndBlocks; public class CavePumpkinBlock extends BaseBlockNotFull implements IRenderTyped { @@ -28,7 +28,7 @@ public class CavePumpkinBlock extends BaseBlockNotFull implements IRenderTyped { private static final VoxelShape SHAPE_BIG; public CavePumpkinBlock() { - super(FabricBlockSettings.copyOf(Blocks.PUMPKIN).luminance((state) -> state.getValue(SMALL) ? 10 : 15)); + super(BlocksHelper.copySettingsOf(Blocks.PUMPKIN).luminance((state) -> state.getValue(SMALL) ? 10 : 15)); registerDefaultState(defaultBlockState().setValue(SMALL, false)); } diff --git a/src/main/java/ru/betterend/blocks/ChandelierBlock.java b/src/main/java/ru/betterend/blocks/ChandelierBlock.java index 622eeb5e..2b218dc7 100644 --- a/src/main/java/ru/betterend/blocks/ChandelierBlock.java +++ b/src/main/java/ru/betterend/blocks/ChandelierBlock.java @@ -10,7 +10,7 @@ import com.google.common.collect.Maps; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; import net.minecraft.client.renderer.block.model.BlockModel; import net.minecraft.client.resources.model.BlockModelRotation; import net.minecraft.client.resources.model.UnbakedModel; @@ -28,13 +28,20 @@ import ru.bclib.client.models.BlockModelProvider; import ru.bclib.client.models.ModelsHelper; import ru.bclib.client.render.BCLRenderLayer; import ru.bclib.interfaces.IRenderTyped; +import ru.bclib.util.BlocksHelper; import ru.betterend.client.models.Patterns; public class ChandelierBlock extends BaseAttachedBlock implements IRenderTyped, BlockModelProvider { private static final EnumMap BOUNDING_SHAPES = Maps.newEnumMap(Direction.class); public ChandelierBlock(Block source) { - super(FabricBlockSettings.copyOf(source).luminance(15).noCollission().noOcclusion().requiresCorrectToolForDrops()); + super(BlocksHelper.copySettingsOf(source) + .breakByTool(FabricToolTags.PICKAXES) + .luminance(15) + .noCollission() + .noOcclusion() + .requiresCorrectToolForDrops() + ); } @Override diff --git a/src/main/java/ru/betterend/blocks/CharcoalBlock.java b/src/main/java/ru/betterend/blocks/CharcoalBlock.java index d9fa10a8..9e9df4c4 100644 --- a/src/main/java/ru/betterend/blocks/CharcoalBlock.java +++ b/src/main/java/ru/betterend/blocks/CharcoalBlock.java @@ -1,13 +1,13 @@ package ru.betterend.blocks; -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.registry.FuelRegistry; import net.minecraft.world.level.block.Blocks; import ru.bclib.blocks.BaseBlock; +import ru.bclib.util.BlocksHelper; public class CharcoalBlock extends BaseBlock { public CharcoalBlock() { - super(FabricBlockSettings.copyOf(Blocks.COAL_BLOCK)); + super(BlocksHelper.copySettingsOf(Blocks.COAL_BLOCK)); FuelRegistry.INSTANCE.add(this, 16000); } } diff --git a/src/main/java/ru/betterend/blocks/DenseEmeraldIceBlock.java b/src/main/java/ru/betterend/blocks/DenseEmeraldIceBlock.java index ece46509..3c20c640 100644 --- a/src/main/java/ru/betterend/blocks/DenseEmeraldIceBlock.java +++ b/src/main/java/ru/betterend/blocks/DenseEmeraldIceBlock.java @@ -3,7 +3,6 @@ package ru.betterend.blocks; import java.util.Collections; import java.util.List; -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.enchantment.EnchantmentHelper; import net.minecraft.world.item.enchantment.Enchantments; @@ -14,10 +13,11 @@ import net.minecraft.world.level.storage.loot.parameters.LootContextParams; import ru.bclib.blocks.BaseBlock; import ru.bclib.client.render.BCLRenderLayer; import ru.bclib.interfaces.IRenderTyped; +import ru.bclib.util.BlocksHelper; public class DenseEmeraldIceBlock extends BaseBlock implements IRenderTyped { public DenseEmeraldIceBlock() { - super(FabricBlockSettings.copyOf(Blocks.PACKED_ICE)); + super(BlocksHelper.copySettingsOf(Blocks.PACKED_ICE)); } @Override diff --git a/src/main/java/ru/betterend/blocks/EmeraldIceBlock.java b/src/main/java/ru/betterend/blocks/EmeraldIceBlock.java index e4ebe572..ab078c7f 100644 --- a/src/main/java/ru/betterend/blocks/EmeraldIceBlock.java +++ b/src/main/java/ru/betterend/blocks/EmeraldIceBlock.java @@ -8,7 +8,6 @@ import org.jetbrains.annotations.Nullable; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.client.renderer.block.model.BlockModel; import net.minecraft.core.BlockPos; import net.minecraft.resources.ResourceLocation; @@ -29,10 +28,11 @@ import net.minecraft.world.level.storage.loot.parameters.LootContextParams; import ru.bclib.client.models.BlockModelProvider; import ru.bclib.client.render.BCLRenderLayer; import ru.bclib.interfaces.IRenderTyped; +import ru.bclib.util.BlocksHelper; public class EmeraldIceBlock extends HalfTransparentBlock implements IRenderTyped, BlockModelProvider { public EmeraldIceBlock() { - super(FabricBlockSettings.copyOf(Blocks.ICE)); + super(BlocksHelper.copySettingsOf(Blocks.ICE)); } @Override diff --git a/src/main/java/ru/betterend/blocks/EndLotusStemBlock.java b/src/main/java/ru/betterend/blocks/EndLotusStemBlock.java index 0c27ece2..260fa4e2 100644 --- a/src/main/java/ru/betterend/blocks/EndLotusStemBlock.java +++ b/src/main/java/ru/betterend/blocks/EndLotusStemBlock.java @@ -4,7 +4,6 @@ import java.util.Map; import com.google.common.collect.Maps; -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; @@ -40,7 +39,7 @@ public class EndLotusStemBlock extends BaseBlock implements SimpleWaterloggedBlo private static final Map SHAPES = Maps.newEnumMap(Axis.class); public EndLotusStemBlock() { - super(FabricBlockSettings.copyOf(Blocks.OAK_PLANKS)); + super(BlocksHelper.copySettingsOf(Blocks.OAK_PLANKS)); this.registerDefaultState(defaultBlockState().setValue(WATERLOGGED, false).setValue(SHAPE, TripleShape.MIDDLE).setValue(LEAF, false).setValue(FACING, Direction.UP)); } diff --git a/src/main/java/ru/betterend/blocks/EndPortalBlock.java b/src/main/java/ru/betterend/blocks/EndPortalBlock.java index a419608e..ab12343f 100644 --- a/src/main/java/ru/betterend/blocks/EndPortalBlock.java +++ b/src/main/java/ru/betterend/blocks/EndPortalBlock.java @@ -6,7 +6,6 @@ import java.util.Random; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.client.color.block.BlockColor; import net.minecraft.client.color.item.ItemColor; import net.minecraft.core.BlockPos; @@ -35,6 +34,7 @@ import net.minecraft.world.level.dimension.DimensionType; import ru.bclib.client.render.BCLRenderLayer; import ru.bclib.interfaces.IColorProvider; import ru.bclib.interfaces.IRenderTyped; +import ru.bclib.util.BlocksHelper; import ru.betterend.interfaces.TeleportingEntity; import ru.betterend.registry.EndParticles; import ru.betterend.registry.EndPortals; @@ -44,7 +44,7 @@ public class EndPortalBlock extends NetherPortalBlock implements IRenderTyped, I public static final IntegerProperty PORTAL = EndBlockProperties.PORTAL; public EndPortalBlock() { - super(FabricBlockSettings.copyOf(Blocks.NETHER_PORTAL).resistance(Blocks.BEDROCK.getExplosionResistance()).luminance(15)); + super(BlocksHelper.copySettingsOf(Blocks.NETHER_PORTAL).resistance(Blocks.BEDROCK.getExplosionResistance()).luminance(15)); } @Override diff --git a/src/main/java/ru/betterend/blocks/EndStoneSmelter.java b/src/main/java/ru/betterend/blocks/EndStoneSmelter.java index e7281b88..d921ef0e 100644 --- a/src/main/java/ru/betterend/blocks/EndStoneSmelter.java +++ b/src/main/java/ru/betterend/blocks/EndStoneSmelter.java @@ -1,9 +1,15 @@ package ru.betterend.blocks; +import java.util.List; +import java.util.Random; + import com.google.common.collect.Lists; +import org.jetbrains.annotations.Nullable; + import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.particles.ParticleTypes; @@ -16,7 +22,12 @@ import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.*; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.HorizontalDirectionalBlock; +import net.minecraft.world.level.block.Mirror; +import net.minecraft.world.level.block.RenderShape; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.SoundType; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityTicker; import net.minecraft.world.level.block.entity.BlockEntityType; @@ -30,14 +41,10 @@ import net.minecraft.world.level.material.MaterialColor; import net.minecraft.world.level.storage.loot.LootContext; import net.minecraft.world.level.storage.loot.parameters.LootContextParams; import net.minecraft.world.phys.BlockHitResult; -import org.jetbrains.annotations.Nullable; import ru.bclib.blocks.BaseBlockWithEntity; import ru.betterend.blocks.entities.EndStoneSmelterBlockEntity; import ru.betterend.registry.EndBlockEntities; -import java.util.List; -import java.util.Random; - public class EndStoneSmelter extends BaseBlockWithEntity { public static final DirectionProperty FACING = HorizontalDirectionalBlock.FACING; public static final BooleanProperty LIT = BlockStateProperties.LIT; @@ -47,6 +54,7 @@ public class EndStoneSmelter extends BaseBlockWithEntity { super(FabricBlockSettings.of(Material.STONE, MaterialColor.COLOR_GRAY) .hardness(4F) .resistance(100F) + .breakByTool(FabricToolTags.PICKAXES) .requiresCorrectToolForDrops() .sound(SoundType.STONE)); this.registerDefaultState(this.stateDefinition.any() diff --git a/src/main/java/ru/betterend/blocks/EnderBlock.java b/src/main/java/ru/betterend/blocks/EnderBlock.java index 31469430..65994654 100644 --- a/src/main/java/ru/betterend/blocks/EnderBlock.java +++ b/src/main/java/ru/betterend/blocks/EnderBlock.java @@ -3,6 +3,7 @@ package ru.betterend.blocks; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; import net.minecraft.core.BlockPos; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.block.SoundType; @@ -17,6 +18,7 @@ public class EnderBlock extends BaseBlock { super(FabricBlockSettings.of(Material.STONE, MaterialColor.WARPED_WART_BLOCK) .hardness(5F) .resistance(6F) + .breakByTool(FabricToolTags.PICKAXES) .requiresCorrectToolForDrops() .sound(SoundType.STONE)); } diff --git a/src/main/java/ru/betterend/blocks/EndstoneDustBlock.java b/src/main/java/ru/betterend/blocks/EndstoneDustBlock.java index 28ca0d6e..72c70d69 100644 --- a/src/main/java/ru/betterend/blocks/EndstoneDustBlock.java +++ b/src/main/java/ru/betterend/blocks/EndstoneDustBlock.java @@ -5,7 +5,6 @@ import java.util.List; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; import net.minecraft.core.BlockPos; import net.minecraft.world.item.ItemStack; @@ -14,6 +13,7 @@ import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.FallingBlock; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.storage.loot.LootContext; +import ru.bclib.util.BlocksHelper; import ru.bclib.util.ColorUtil; public class EndstoneDustBlock extends FallingBlock { @@ -21,7 +21,7 @@ public class EndstoneDustBlock extends FallingBlock { private static final int COLOR = ColorUtil.color(226, 239, 168); public EndstoneDustBlock() { - super(FabricBlockSettings.copyOf(Blocks.SAND) + super(BlocksHelper.copySettingsOf(Blocks.SAND) .breakByTool(FabricToolTags.SHOVELS) .materialColor(Blocks.END_STONE.defaultMaterialColor())); } diff --git a/src/main/java/ru/betterend/blocks/JellyshroomCapBlock.java b/src/main/java/ru/betterend/blocks/JellyshroomCapBlock.java index 681e3578..7f1a7d9a 100644 --- a/src/main/java/ru/betterend/blocks/JellyshroomCapBlock.java +++ b/src/main/java/ru/betterend/blocks/JellyshroomCapBlock.java @@ -9,7 +9,6 @@ import com.google.common.collect.Lists; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.client.color.block.BlockColor; import net.minecraft.client.color.item.ItemColor; import net.minecraft.client.renderer.block.model.BlockModel; @@ -30,6 +29,7 @@ import ru.bclib.client.models.ModelsHelper; import ru.bclib.client.render.BCLRenderLayer; import ru.bclib.interfaces.IColorProvider; import ru.bclib.interfaces.IRenderTyped; +import ru.bclib.util.BlocksHelper; import ru.bclib.util.ColorUtil; import ru.bclib.util.MHelper; import ru.betterend.client.models.Patterns; @@ -43,7 +43,7 @@ public class JellyshroomCapBlock extends SlimeBlock implements IRenderTyped, Blo private final int coloritem; public JellyshroomCapBlock(int r1, int g1, int b1, int r2, int g2, int b2) { - super(FabricBlockSettings.copyOf(Blocks.SLIME_BLOCK)); + super(BlocksHelper.copySettingsOf(Blocks.SLIME_BLOCK)); colorStart = new Vec3i(r1, g1, b1); colorEnd = new Vec3i(r2, g2, b2); coloritem = ColorUtil.color((r1 + r2) >> 1, (g1 + g2) >> 1, (b1 + b2) >> 1); diff --git a/src/main/java/ru/betterend/blocks/MengerSpongeBlock.java b/src/main/java/ru/betterend/blocks/MengerSpongeBlock.java index 6890f22a..798d28ba 100644 --- a/src/main/java/ru/betterend/blocks/MengerSpongeBlock.java +++ b/src/main/java/ru/betterend/blocks/MengerSpongeBlock.java @@ -4,7 +4,6 @@ import java.util.Queue; import com.google.common.collect.Lists; -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.tags.FluidTags; @@ -17,17 +16,17 @@ import net.minecraft.world.level.block.LiquidBlock; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.material.FluidState; -import net.minecraft.world.level.material.Fluids; import net.minecraft.world.level.material.Material; import ru.bclib.blocks.BaseBlockNotFull; import ru.bclib.client.render.BCLRenderLayer; import ru.bclib.interfaces.IRenderTyped; +import ru.bclib.util.BlocksHelper; import ru.betterend.registry.EndBlocks; @SuppressWarnings("deprecation") public class MengerSpongeBlock extends BaseBlockNotFull implements IRenderTyped { public MengerSpongeBlock() { - super(FabricBlockSettings.copyOf(Blocks.SPONGE).noOcclusion()); + super(BlocksHelper.copySettingsOf(Blocks.SPONGE).noOcclusion()); } @Override diff --git a/src/main/java/ru/betterend/blocks/MengerSpongeWetBlock.java b/src/main/java/ru/betterend/blocks/MengerSpongeWetBlock.java index 0908d9f3..82c58413 100644 --- a/src/main/java/ru/betterend/blocks/MengerSpongeWetBlock.java +++ b/src/main/java/ru/betterend/blocks/MengerSpongeWetBlock.java @@ -4,7 +4,6 @@ import java.util.Random; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.particles.ParticleTypes; @@ -28,7 +27,7 @@ import ru.betterend.registry.EndBlocks; @SuppressWarnings("deprecation") public class MengerSpongeWetBlock extends BaseBlockNotFull implements IRenderTyped { public MengerSpongeWetBlock() { - super(FabricBlockSettings.copyOf(Blocks.WET_SPONGE).noOcclusion()); + super(BlocksHelper.copySettingsOf(Blocks.WET_SPONGE).noOcclusion()); } @Override diff --git a/src/main/java/ru/betterend/blocks/MissingTileBlock.java b/src/main/java/ru/betterend/blocks/MissingTileBlock.java index 7a516557..2bc243f6 100644 --- a/src/main/java/ru/betterend/blocks/MissingTileBlock.java +++ b/src/main/java/ru/betterend/blocks/MissingTileBlock.java @@ -1,11 +1,11 @@ package ru.betterend.blocks; -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.world.level.block.Blocks; import ru.bclib.blocks.BaseBlock; +import ru.bclib.util.BlocksHelper; public class MissingTileBlock extends BaseBlock { public MissingTileBlock() { - super(FabricBlockSettings.copyOf(Blocks.END_STONE)); + super(BlocksHelper.copySettingsOf(Blocks.END_STONE)); } } diff --git a/src/main/java/ru/betterend/blocks/MossyDragonBoneBlock.java b/src/main/java/ru/betterend/blocks/MossyDragonBoneBlock.java index b7d3e7e1..ff885715 100644 --- a/src/main/java/ru/betterend/blocks/MossyDragonBoneBlock.java +++ b/src/main/java/ru/betterend/blocks/MossyDragonBoneBlock.java @@ -4,7 +4,6 @@ import java.util.Collections; import java.util.List; import java.util.Random; -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; @@ -19,12 +18,13 @@ import net.minecraft.world.level.lighting.LayerLightEngine; import net.minecraft.world.level.storage.loot.LootContext; import net.minecraft.world.level.storage.loot.parameters.LootContextParams; import ru.bclib.blocks.BaseRotatedPillarBlock; +import ru.bclib.util.BlocksHelper; import ru.betterend.registry.EndBlocks; @SuppressWarnings("deprecation") public class MossyDragonBoneBlock extends BaseRotatedPillarBlock { public MossyDragonBoneBlock() { - super(FabricBlockSettings.copyOf(Blocks.BONE_BLOCK).hardness(0.5F).randomTicks()); + super(BlocksHelper.copySettingsOf(Blocks.BONE_BLOCK).hardness(0.5F).randomTicks()); } @Override diff --git a/src/main/java/ru/betterend/blocks/MossyObsidian.java b/src/main/java/ru/betterend/blocks/MossyObsidian.java index d3423fdf..d17588f5 100644 --- a/src/main/java/ru/betterend/blocks/MossyObsidian.java +++ b/src/main/java/ru/betterend/blocks/MossyObsidian.java @@ -4,7 +4,6 @@ import java.util.Collections; import java.util.List; import java.util.Random; -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; @@ -19,10 +18,11 @@ import net.minecraft.world.level.lighting.LayerLightEngine; import net.minecraft.world.level.storage.loot.LootContext; import net.minecraft.world.level.storage.loot.parameters.LootContextParams; import ru.bclib.blocks.BaseBlock; +import ru.bclib.util.BlocksHelper; public class MossyObsidian extends BaseBlock { public MossyObsidian() { - super(FabricBlockSettings.copyOf(Blocks.OBSIDIAN).hardness(3).randomTicks()); + super(BlocksHelper.copySettingsOf(Blocks.OBSIDIAN).hardness(3).randomTicks()); } @Override diff --git a/src/main/java/ru/betterend/blocks/NeonCactusBlock.java b/src/main/java/ru/betterend/blocks/NeonCactusBlock.java index 2d1d9acd..bc6fb3ef 100644 --- a/src/main/java/ru/betterend/blocks/NeonCactusBlock.java +++ b/src/main/java/ru/betterend/blocks/NeonCactusBlock.java @@ -1,11 +1,11 @@ package ru.betterend.blocks; -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.world.level.block.Blocks; import ru.bclib.blocks.BaseRotatedPillarBlock; +import ru.bclib.util.BlocksHelper; public class NeonCactusBlock extends BaseRotatedPillarBlock { public NeonCactusBlock() { - super(FabricBlockSettings.copyOf(Blocks.CACTUS).luminance(15)); + super(BlocksHelper.copySettingsOf(Blocks.CACTUS).luminance(15)); } } diff --git a/src/main/java/ru/betterend/blocks/NeonCactusPlantBlock.java b/src/main/java/ru/betterend/blocks/NeonCactusPlantBlock.java index 568ea567..666e9308 100644 --- a/src/main/java/ru/betterend/blocks/NeonCactusPlantBlock.java +++ b/src/main/java/ru/betterend/blocks/NeonCactusPlantBlock.java @@ -7,7 +7,6 @@ import java.util.Random; import com.google.common.collect.Lists; import com.google.common.collect.Maps; -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; @@ -64,7 +63,7 @@ public class NeonCactusPlantBlock extends BaseBlockNotFull implements SimpleWate private static final int MAX_LENGTH = 12; public NeonCactusPlantBlock() { - super(FabricBlockSettings.copyOf(Blocks.CACTUS).luminance(15).randomTicks()); + super(BlocksHelper.copySettingsOf(Blocks.CACTUS).luminance(15).randomTicks()); registerDefaultState(defaultBlockState().setValue(WATERLOGGED, false).setValue(FACING, Direction.UP).setValue(SHAPE, TripleShape.TOP)); } diff --git a/src/main/java/ru/betterend/blocks/RespawnObeliskBlock.java b/src/main/java/ru/betterend/blocks/RespawnObeliskBlock.java index 48b5e923..2d274a1a 100644 --- a/src/main/java/ru/betterend/blocks/RespawnObeliskBlock.java +++ b/src/main/java/ru/betterend/blocks/RespawnObeliskBlock.java @@ -6,7 +6,6 @@ import org.jetbrains.annotations.Nullable; import com.google.common.collect.Lists; -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.client.color.block.BlockColor; import net.minecraft.client.color.item.ItemColor; import net.minecraft.core.BlockPos; @@ -54,7 +53,7 @@ public class RespawnObeliskBlock extends BaseBlock implements IColorProvider, IR public static final EnumProperty SHAPE = BlockProperties.TRIPLE_SHAPE; public RespawnObeliskBlock() { - super(FabricBlockSettings.copyOf(Blocks.END_STONE).luminance((state) -> { + super(BlocksHelper.copySettingsOf(Blocks.END_STONE).luminance((state) -> { return (state.getValue(SHAPE) == TripleShape.BOTTOM) ? 0 : 15; })); } diff --git a/src/main/java/ru/betterend/blocks/UmbrellaTreeClusterBlock.java b/src/main/java/ru/betterend/blocks/UmbrellaTreeClusterBlock.java index a8d3dcb0..c4d0a1c1 100644 --- a/src/main/java/ru/betterend/blocks/UmbrellaTreeClusterBlock.java +++ b/src/main/java/ru/betterend/blocks/UmbrellaTreeClusterBlock.java @@ -1,6 +1,5 @@ package ru.betterend.blocks; -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.core.BlockPos; import net.minecraft.sounds.SoundEvents; import net.minecraft.sounds.SoundSource; @@ -27,7 +26,7 @@ public class UmbrellaTreeClusterBlock extends BaseBlock { public static final BooleanProperty NATURAL = BlockProperties.NATURAL; public UmbrellaTreeClusterBlock() { - super(FabricBlockSettings.copyOf(Blocks.NETHER_WART_BLOCK) + super(BlocksHelper.copySettingsOf(Blocks.NETHER_WART_BLOCK) .materialColor(MaterialColor.COLOR_PURPLE) .luminance(15)); registerDefaultState(stateDefinition.any().setValue(NATURAL, false)); diff --git a/src/main/java/ru/betterend/blocks/UmbrellaTreeClusterEmptyBlock.java b/src/main/java/ru/betterend/blocks/UmbrellaTreeClusterEmptyBlock.java index d6569aa3..f176f4aa 100644 --- a/src/main/java/ru/betterend/blocks/UmbrellaTreeClusterEmptyBlock.java +++ b/src/main/java/ru/betterend/blocks/UmbrellaTreeClusterEmptyBlock.java @@ -2,7 +2,6 @@ package ru.betterend.blocks; import java.util.Random; -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.level.block.Block; @@ -19,7 +18,7 @@ public class UmbrellaTreeClusterEmptyBlock extends BaseBlock { public static final BooleanProperty NATURAL = EndBlockProperties.NATURAL; public UmbrellaTreeClusterEmptyBlock() { - super(FabricBlockSettings.copyOf(Blocks.NETHER_WART_BLOCK) + super(BlocksHelper.copySettingsOf(Blocks.NETHER_WART_BLOCK) .materialColor(MaterialColor.COLOR_PURPLE) .randomTicks()); registerDefaultState(stateDefinition.any().setValue(NATURAL, false)); diff --git a/src/main/java/ru/betterend/blocks/UmbrellaTreeMembraneBlock.java b/src/main/java/ru/betterend/blocks/UmbrellaTreeMembraneBlock.java index b267bf84..7d6b4713 100644 --- a/src/main/java/ru/betterend/blocks/UmbrellaTreeMembraneBlock.java +++ b/src/main/java/ru/betterend/blocks/UmbrellaTreeMembraneBlock.java @@ -7,7 +7,6 @@ import com.google.common.collect.Lists; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.client.renderer.block.model.BlockModel; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -25,6 +24,7 @@ import net.minecraft.world.level.storage.loot.LootContext; import ru.bclib.client.models.BlockModelProvider; import ru.bclib.client.render.BCLRenderLayer; import ru.bclib.interfaces.IRenderTyped; +import ru.bclib.util.BlocksHelper; import ru.bclib.util.MHelper; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; @@ -34,7 +34,7 @@ public class UmbrellaTreeMembraneBlock extends SlimeBlock implements IRenderType private static final OpenSimplexNoise NOISE = new OpenSimplexNoise(0); public UmbrellaTreeMembraneBlock() { - super(FabricBlockSettings.copyOf(Blocks.SLIME_BLOCK)); + super(BlocksHelper.copySettingsOf(Blocks.SLIME_BLOCK)); } @Override diff --git a/src/main/java/ru/betterend/blocks/basis/EndLanternBlock.java b/src/main/java/ru/betterend/blocks/basis/EndLanternBlock.java index f4ada8b3..cc801110 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndLanternBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndLanternBlock.java @@ -4,7 +4,6 @@ import java.util.Map; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.client.resources.model.UnbakedModel; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -27,6 +26,7 @@ import net.minecraft.world.level.material.Fluids; import ru.bclib.blocks.BaseBlockNotFull; import ru.bclib.blocks.BlockProperties; import ru.bclib.client.models.ModelsHelper; +import ru.bclib.util.BlocksHelper; @SuppressWarnings("deprecation") public class EndLanternBlock extends BaseBlockNotFull implements SimpleWaterloggedBlock, LiquidBlockContainer { @@ -34,7 +34,7 @@ public class EndLanternBlock extends BaseBlockNotFull implements SimpleWaterlogg public static final BooleanProperty WATERLOGGED = BlockStateProperties.WATERLOGGED; public EndLanternBlock(Block source) { - this(FabricBlockSettings.copyOf(source).luminance(15).noOcclusion()); + this(BlocksHelper.copySettingsOf(source).luminance(15).noOcclusion()); } public EndLanternBlock(Properties settings) { diff --git a/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java b/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java index 8d79e82f..80355ff3 100644 --- a/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java @@ -6,15 +6,9 @@ import java.util.List; import java.util.Map; import java.util.Optional; -import net.minecraft.world.level.block.entity.BlockEntityTicker; -import net.minecraft.world.level.block.entity.BlockEntityType; +import com.google.common.collect.Lists; import org.jetbrains.annotations.Nullable; -import com.google.common.collect.Lists; - -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.client.renderer.block.model.BlockModel; import net.minecraft.client.resources.model.UnbakedModel; import net.minecraft.core.BlockPos; @@ -34,6 +28,8 @@ import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.EntityBlock; import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityTicker; +import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.block.state.properties.BooleanProperty; @@ -44,9 +40,12 @@ import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.Shapes; import net.minecraft.world.phys.shapes.VoxelShape; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import ru.bclib.blocks.BaseBlockNotFull; import ru.bclib.blocks.BlockProperties; import ru.bclib.client.models.ModelsHelper; +import ru.bclib.util.BlocksHelper; import ru.betterend.blocks.EndBlockProperties; import ru.betterend.blocks.EndBlockProperties.PedestalState; import ru.betterend.blocks.InfusionPedestal; @@ -98,7 +97,7 @@ public class PedestalBlock extends BaseBlockNotFull implements EntityBlock { protected float height = 1.0F; public PedestalBlock(Block parent) { - super(FabricBlockSettings.copyOf(parent).luminance(state -> state.getValue(HAS_LIGHT) ? 12 : 0)); + super(BlocksHelper.copySettingsOf(parent).luminance(state -> state.getValue(HAS_LIGHT) ? 12 : 0)); this.registerDefaultState(stateDefinition.any().setValue(STATE, PedestalState.DEFAULT).setValue(HAS_ITEM, false).setValue(HAS_LIGHT, false)); this.parent = parent; } diff --git a/src/main/java/ru/betterend/blocks/basis/StoneLanternBlock.java b/src/main/java/ru/betterend/blocks/basis/StoneLanternBlock.java index b8f2b7c9..6aea47ec 100644 --- a/src/main/java/ru/betterend/blocks/basis/StoneLanternBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/StoneLanternBlock.java @@ -6,7 +6,6 @@ import org.jetbrains.annotations.Nullable; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.client.color.block.BlockColor; import net.minecraft.client.color.item.ItemColor; import net.minecraft.client.renderer.block.model.BlockModel; @@ -19,6 +18,7 @@ import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; import ru.bclib.client.models.ModelsHelper; import ru.bclib.interfaces.IColorProvider; +import ru.bclib.util.BlocksHelper; import ru.betterend.client.models.Patterns; import ru.betterend.registry.EndBlocks; @@ -27,7 +27,7 @@ public class StoneLanternBlock extends EndLanternBlock implements IColorProvider private static final VoxelShape SHAPE_FLOOR = Block.box(3, 0, 3, 13, 15, 13); public StoneLanternBlock(Block source) { - super(FabricBlockSettings.copyOf(source).luminance(15)); + super(BlocksHelper.copySettingsOf(source).luminance(15)); } @Override diff --git a/src/main/java/ru/betterend/blocks/complex/ColoredMaterial.java b/src/main/java/ru/betterend/blocks/complex/ColoredMaterial.java index 9ae68e51..5b4ac1ea 100644 --- a/src/main/java/ru/betterend/blocks/complex/ColoredMaterial.java +++ b/src/main/java/ru/betterend/blocks/complex/ColoredMaterial.java @@ -31,7 +31,7 @@ public class ColoredMaterial { String id = Registry.BLOCK.getKey(source).getPath(); colors.forEach((color, name) -> { String blockName = id + "_" + name; - Block block = constructor.apply(FabricBlockSettings.copyOf(source).materialColor(MaterialColor.COLOR_BLACK)); + Block block = constructor.apply(BlocksHelper.copySettingsOf(source).materialColor(MaterialColor.COLOR_BLACK)); EndBlocks.registerBlock(blockName, block); if (craftEight) { GridRecipe.make(BetterEnd.MOD_ID, blockName, block).checkConfig(Configs.RECIPE_CONFIG).setOutputCount(8).setShape("###", "#D#", "###").addMaterial('#', source).addMaterial('D', dyes.get(color)).build(); diff --git a/src/main/java/ru/betterend/blocks/complex/CrystalSubblocksMaterial.java b/src/main/java/ru/betterend/blocks/complex/CrystalSubblocksMaterial.java index 1e82ff4c..4fdf1cae 100644 --- a/src/main/java/ru/betterend/blocks/complex/CrystalSubblocksMaterial.java +++ b/src/main/java/ru/betterend/blocks/complex/CrystalSubblocksMaterial.java @@ -10,6 +10,7 @@ import ru.bclib.blocks.BaseSlabBlock; import ru.bclib.blocks.BaseStairsBlock; import ru.bclib.blocks.BaseWallBlock; import ru.bclib.recipes.GridRecipe; +import ru.bclib.util.BlocksHelper; import ru.bclib.util.TagHelper; import ru.betterend.BetterEnd; import ru.betterend.blocks.EndPedestal; @@ -31,7 +32,7 @@ public class CrystalSubblocksMaterial { public final Block brick_wall; public CrystalSubblocksMaterial(String name, Block source) { - FabricBlockSettings material = FabricBlockSettings.copyOf(source); + FabricBlockSettings material = BlocksHelper.copySettingsOf(source); polished = EndBlocks.registerBlock(name + "_polished", new BaseBlock(material)); tiles = EndBlocks.registerBlock(name + "_tiles", new BaseBlock(material)); pillar = EndBlocks.registerBlock(name + "_pillar", new BaseRotatedPillarBlock(material)); diff --git a/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java b/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java index 4f5577bd..75ca826e 100644 --- a/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java +++ b/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java @@ -31,6 +31,7 @@ import ru.bclib.items.tool.BaseSwordItem; import ru.bclib.recipes.FurnaceRecipe; import ru.bclib.recipes.GridRecipe; import ru.bclib.recipes.SmithingTableRecipe; +import ru.bclib.util.BlocksHelper; import ru.bclib.util.TagHelper; import ru.betterend.BetterEnd; import ru.betterend.blocks.BulbVineLanternBlock; @@ -90,26 +91,26 @@ public class MetalMaterial { public final Item boots; public static MetalMaterial makeNormal(String name, MaterialColor color, Tier material, ArmorMaterial armor) { - return new MetalMaterial(name, true, FabricBlockSettings.copyOf(Blocks.IRON_BLOCK).materialColor(color), EndItems.makeEndItemSettings(), material, armor); + return new MetalMaterial(name, true, BlocksHelper.copySettingsOf(Blocks.IRON_BLOCK).materialColor(color), EndItems.makeEndItemSettings(), material, armor); } public static MetalMaterial makeNormal(String name, MaterialColor color, float hardness, float resistance, Tier material, ArmorMaterial armor) { - return new MetalMaterial(name, true, FabricBlockSettings.copyOf(Blocks.IRON_BLOCK).materialColor(color).hardness(hardness).resistance(resistance), EndItems.makeEndItemSettings(), material, armor); + return new MetalMaterial(name, true, BlocksHelper.copySettingsOf(Blocks.IRON_BLOCK).materialColor(color).hardness(hardness).resistance(resistance), EndItems.makeEndItemSettings(), material, armor); } public static MetalMaterial makeOreless(String name, MaterialColor color, Tier material, ArmorMaterial armor) { - return new MetalMaterial(name, false, FabricBlockSettings.copyOf(Blocks.IRON_BLOCK).materialColor(color), EndItems.makeEndItemSettings(), material, armor); + return new MetalMaterial(name, false, BlocksHelper.copySettingsOf(Blocks.IRON_BLOCK).materialColor(color), EndItems.makeEndItemSettings(), material, armor); } public static MetalMaterial makeOreless(String name, MaterialColor color, float hardness, float resistance, Tier material, ArmorMaterial armor) { - return new MetalMaterial(name, false, FabricBlockSettings.copyOf(Blocks.IRON_BLOCK).materialColor(color).hardness(hardness).resistance(resistance), EndItems.makeEndItemSettings(), material, armor); + return new MetalMaterial(name, false, BlocksHelper.copySettingsOf(Blocks.IRON_BLOCK).materialColor(color).hardness(hardness).resistance(resistance), EndItems.makeEndItemSettings(), material, armor); } private MetalMaterial(String name, boolean hasOre, FabricBlockSettings settings, Properties itemSettings, Tier material, ArmorMaterial armor) { BlockBehaviour.Properties lanternProperties = FabricBlockSettings.copyOf(settings).hardness(1).resistance(1).luminance(15).sound(SoundType.LANTERN); final int level = material.getLevel(); - ore = hasOre ? EndBlocks.registerBlock(name + "_ore", new BaseBlock(FabricBlockSettings.copyOf(Blocks.END_STONE))) : null; + ore = hasOre ? EndBlocks.registerBlock(name + "_ore", new BaseBlock(BlocksHelper.copySettingsOf(Blocks.END_STONE))) : null; block = EndBlocks.registerBlock(name + "_block", new BaseBlock(settings)); tile = EndBlocks.registerBlock(name + "_tile", new BaseBlock(settings)); stairs = EndBlocks.registerBlock(name + "_stairs", new BaseStairsBlock(tile)); diff --git a/src/main/java/ru/betterend/blocks/complex/StoneMaterial.java b/src/main/java/ru/betterend/blocks/complex/StoneMaterial.java index 125c391e..43050297 100644 --- a/src/main/java/ru/betterend/blocks/complex/StoneMaterial.java +++ b/src/main/java/ru/betterend/blocks/complex/StoneMaterial.java @@ -16,6 +16,7 @@ import ru.bclib.blocks.BaseStoneButtonBlock; import ru.bclib.blocks.BaseWallBlock; import ru.bclib.blocks.StonePressurePlateBlock; import ru.bclib.recipes.GridRecipe; +import ru.bclib.util.BlocksHelper; import ru.bclib.util.TagHelper; import ru.betterend.BetterEnd; import ru.betterend.blocks.EndPedestal; @@ -46,7 +47,7 @@ public class StoneMaterial { public final Block furnace; public StoneMaterial(String name, MaterialColor color) { - FabricBlockSettings material = FabricBlockSettings.copyOf(Blocks.END_STONE).materialColor(color); + FabricBlockSettings material = BlocksHelper.copySettingsOf(Blocks.END_STONE).materialColor(color); stone = EndBlocks.registerBlock(name, new BaseBlock(material)); polished = EndBlocks.registerBlock(name + "_polished", new BaseBlock(material)); diff --git a/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java b/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java index 57df31f3..174c73ed 100644 --- a/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java +++ b/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java @@ -33,6 +33,7 @@ import ru.bclib.blocks.BaseWoodenButtonBlock; import ru.bclib.blocks.StripableBarkBlock; import ru.bclib.blocks.WoodenPressurePlateBlock; import ru.bclib.recipes.GridRecipe; +import ru.bclib.util.BlocksHelper; import ru.bclib.util.TagHelper; import ru.betterend.BetterEnd; import ru.betterend.config.Configs; @@ -69,7 +70,7 @@ public class WoodenMaterial { public final Tag.Named logItemTag; public WoodenMaterial(String name, MaterialColor woodColor, MaterialColor planksColor) { - FabricBlockSettings materialPlanks = FabricBlockSettings.copyOf(Blocks.OAK_PLANKS).materialColor(planksColor); + FabricBlockSettings materialPlanks = BlocksHelper.copySettingsOf(Blocks.OAK_PLANKS).materialColor(planksColor); log_stripped = EndBlocks.registerBlock(name + "_stripped_log", new BaseRotatedPillarBlock(materialPlanks)); bark_stripped = EndBlocks.registerBlock(name + "_stripped_bark", new BaseBarkBlock(materialPlanks)); From 18d78acd07a51bef54d5832d9abf526e21d9a580 Mon Sep 17 00:00:00 2001 From: Frank Bauer Date: Sun, 4 Jul 2021 23:48:37 +0200 Subject: [PATCH 071/595] Revert "Automatic tool configuration for Blocks" This reverts commit 8c1f9567a518ac3a80b0de2db8a51623db9bb73f. --- .../ru/betterend/blocks/AeterniumBlock.java | 4 +--- .../betterend/blocks/AmaranitaStemBlock.java | 4 ++-- .../java/ru/betterend/blocks/AmberBlock.java | 4 ++-- .../blocks/AncientEmeraldIceBlock.java | 3 ++- .../ru/betterend/blocks/BrimstoneBlock.java | 3 ++- .../ru/betterend/blocks/CavePumpkinBlock.java | 4 ++-- .../ru/betterend/blocks/ChandelierBlock.java | 11 ++--------- .../ru/betterend/blocks/CharcoalBlock.java | 4 ++-- .../betterend/blocks/DenseEmeraldIceBlock.java | 4 ++-- .../ru/betterend/blocks/EmeraldIceBlock.java | 4 ++-- .../ru/betterend/blocks/EndLotusStemBlock.java | 3 ++- .../ru/betterend/blocks/EndPortalBlock.java | 4 ++-- .../ru/betterend/blocks/EndStoneSmelter.java | 18 +++++------------- .../java/ru/betterend/blocks/EnderBlock.java | 2 -- .../ru/betterend/blocks/EndstoneDustBlock.java | 4 ++-- .../betterend/blocks/JellyshroomCapBlock.java | 4 ++-- .../ru/betterend/blocks/MengerSpongeBlock.java | 5 +++-- .../betterend/blocks/MengerSpongeWetBlock.java | 3 ++- .../ru/betterend/blocks/MissingTileBlock.java | 4 ++-- .../betterend/blocks/MossyDragonBoneBlock.java | 4 ++-- .../ru/betterend/blocks/MossyObsidian.java | 4 ++-- .../ru/betterend/blocks/NeonCactusBlock.java | 4 ++-- .../betterend/blocks/NeonCactusPlantBlock.java | 3 ++- .../betterend/blocks/RespawnObeliskBlock.java | 3 ++- .../blocks/UmbrellaTreeClusterBlock.java | 3 ++- .../blocks/UmbrellaTreeClusterEmptyBlock.java | 3 ++- .../blocks/UmbrellaTreeMembraneBlock.java | 4 ++-- .../blocks/basis/EndLanternBlock.java | 4 ++-- .../betterend/blocks/basis/PedestalBlock.java | 15 ++++++++------- .../blocks/basis/StoneLanternBlock.java | 4 ++-- .../blocks/complex/ColoredMaterial.java | 2 +- .../complex/CrystalSubblocksMaterial.java | 3 +-- .../blocks/complex/MetalMaterial.java | 11 +++++------ .../blocks/complex/StoneMaterial.java | 3 +-- .../blocks/complex/WoodenMaterial.java | 3 +-- 35 files changed, 76 insertions(+), 89 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/AeterniumBlock.java b/src/main/java/ru/betterend/blocks/AeterniumBlock.java index f6369d15..d176689d 100644 --- a/src/main/java/ru/betterend/blocks/AeterniumBlock.java +++ b/src/main/java/ru/betterend/blocks/AeterniumBlock.java @@ -3,7 +3,6 @@ package ru.betterend.blocks; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; import net.minecraft.core.BlockPos; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.block.SoundType; @@ -18,8 +17,7 @@ public class AeterniumBlock extends BaseBlock { super(FabricBlockSettings.of(Material.METAL, MaterialColor.COLOR_GRAY) .hardness(65F) .resistance(1200F) - .breakByTool(FabricToolTags.PICKAXES) - .requiresCorrectToolForDrops() + .requiresCorrectToolForDrops() .sound(SoundType.NETHERITE_BLOCK)); } diff --git a/src/main/java/ru/betterend/blocks/AmaranitaStemBlock.java b/src/main/java/ru/betterend/blocks/AmaranitaStemBlock.java index cfb07510..47885625 100644 --- a/src/main/java/ru/betterend/blocks/AmaranitaStemBlock.java +++ b/src/main/java/ru/betterend/blocks/AmaranitaStemBlock.java @@ -1,12 +1,12 @@ package ru.betterend.blocks; +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.material.MaterialColor; import ru.bclib.blocks.BaseRotatedPillarBlock; -import ru.bclib.util.BlocksHelper; public class AmaranitaStemBlock extends BaseRotatedPillarBlock { public AmaranitaStemBlock() { - super(BlocksHelper.copySettingsOf(Blocks.OAK_PLANKS).materialColor(MaterialColor.COLOR_LIGHT_GREEN)); + super(FabricBlockSettings.copyOf(Blocks.OAK_PLANKS).materialColor(MaterialColor.COLOR_LIGHT_GREEN)); } } diff --git a/src/main/java/ru/betterend/blocks/AmberBlock.java b/src/main/java/ru/betterend/blocks/AmberBlock.java index a26ea970..feedaea8 100644 --- a/src/main/java/ru/betterend/blocks/AmberBlock.java +++ b/src/main/java/ru/betterend/blocks/AmberBlock.java @@ -1,12 +1,12 @@ package ru.betterend.blocks; +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.material.MaterialColor; import ru.bclib.blocks.BaseBlock; -import ru.bclib.util.BlocksHelper; public class AmberBlock extends BaseBlock { public AmberBlock() { - super(BlocksHelper.copySettingsOf(Blocks.DIAMOND_BLOCK).materialColor(MaterialColor.COLOR_YELLOW)); + super(FabricBlockSettings.copyOf(Blocks.DIAMOND_BLOCK).materialColor(MaterialColor.COLOR_YELLOW)); } } diff --git a/src/main/java/ru/betterend/blocks/AncientEmeraldIceBlock.java b/src/main/java/ru/betterend/blocks/AncientEmeraldIceBlock.java index c1a62a76..2c73a6d1 100644 --- a/src/main/java/ru/betterend/blocks/AncientEmeraldIceBlock.java +++ b/src/main/java/ru/betterend/blocks/AncientEmeraldIceBlock.java @@ -4,6 +4,7 @@ import java.util.Collections; import java.util.List; import java.util.Random; +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; @@ -22,7 +23,7 @@ import ru.betterend.registry.EndParticles; public class AncientEmeraldIceBlock extends BaseBlock { public AncientEmeraldIceBlock() { - super(BlocksHelper.copySettingsOf(Blocks.BLUE_ICE).randomTicks()); + super(FabricBlockSettings.copyOf(Blocks.BLUE_ICE).randomTicks()); } @Override diff --git a/src/main/java/ru/betterend/blocks/BrimstoneBlock.java b/src/main/java/ru/betterend/blocks/BrimstoneBlock.java index 2e816be9..e26d2ce1 100644 --- a/src/main/java/ru/betterend/blocks/BrimstoneBlock.java +++ b/src/main/java/ru/betterend/blocks/BrimstoneBlock.java @@ -4,6 +4,7 @@ import java.util.Random; import org.jetbrains.annotations.Nullable; +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -28,7 +29,7 @@ public class BrimstoneBlock extends BaseBlock { public static final BooleanProperty ACTIVATED = BlockProperties.ACTIVE; public BrimstoneBlock() { - super(BlocksHelper.copySettingsOf(Blocks.END_STONE).materialColor(MaterialColor.COLOR_BROWN).randomTicks()); + super(FabricBlockSettings.copyOf(Blocks.END_STONE).materialColor(MaterialColor.COLOR_BROWN).randomTicks()); registerDefaultState(stateDefinition.any().setValue(ACTIVATED, false)); } diff --git a/src/main/java/ru/betterend/blocks/CavePumpkinBlock.java b/src/main/java/ru/betterend/blocks/CavePumpkinBlock.java index a4c6c4af..f61aa0cb 100644 --- a/src/main/java/ru/betterend/blocks/CavePumpkinBlock.java +++ b/src/main/java/ru/betterend/blocks/CavePumpkinBlock.java @@ -3,6 +3,7 @@ package ru.betterend.blocks; import java.util.Collections; import java.util.List; +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.core.BlockPos; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.BlockGetter; @@ -19,7 +20,6 @@ import ru.bclib.blocks.BaseBlockNotFull; import ru.bclib.blocks.BlockProperties; import ru.bclib.client.render.BCLRenderLayer; import ru.bclib.interfaces.IRenderTyped; -import ru.bclib.util.BlocksHelper; import ru.betterend.registry.EndBlocks; public class CavePumpkinBlock extends BaseBlockNotFull implements IRenderTyped { @@ -28,7 +28,7 @@ public class CavePumpkinBlock extends BaseBlockNotFull implements IRenderTyped { private static final VoxelShape SHAPE_BIG; public CavePumpkinBlock() { - super(BlocksHelper.copySettingsOf(Blocks.PUMPKIN).luminance((state) -> state.getValue(SMALL) ? 10 : 15)); + super(FabricBlockSettings.copyOf(Blocks.PUMPKIN).luminance((state) -> state.getValue(SMALL) ? 10 : 15)); registerDefaultState(defaultBlockState().setValue(SMALL, false)); } diff --git a/src/main/java/ru/betterend/blocks/ChandelierBlock.java b/src/main/java/ru/betterend/blocks/ChandelierBlock.java index 2b218dc7..622eeb5e 100644 --- a/src/main/java/ru/betterend/blocks/ChandelierBlock.java +++ b/src/main/java/ru/betterend/blocks/ChandelierBlock.java @@ -10,7 +10,7 @@ import com.google.common.collect.Maps; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.client.renderer.block.model.BlockModel; import net.minecraft.client.resources.model.BlockModelRotation; import net.minecraft.client.resources.model.UnbakedModel; @@ -28,20 +28,13 @@ import ru.bclib.client.models.BlockModelProvider; import ru.bclib.client.models.ModelsHelper; import ru.bclib.client.render.BCLRenderLayer; import ru.bclib.interfaces.IRenderTyped; -import ru.bclib.util.BlocksHelper; import ru.betterend.client.models.Patterns; public class ChandelierBlock extends BaseAttachedBlock implements IRenderTyped, BlockModelProvider { private static final EnumMap BOUNDING_SHAPES = Maps.newEnumMap(Direction.class); public ChandelierBlock(Block source) { - super(BlocksHelper.copySettingsOf(source) - .breakByTool(FabricToolTags.PICKAXES) - .luminance(15) - .noCollission() - .noOcclusion() - .requiresCorrectToolForDrops() - ); + super(FabricBlockSettings.copyOf(source).luminance(15).noCollission().noOcclusion().requiresCorrectToolForDrops()); } @Override diff --git a/src/main/java/ru/betterend/blocks/CharcoalBlock.java b/src/main/java/ru/betterend/blocks/CharcoalBlock.java index 9e9df4c4..d9fa10a8 100644 --- a/src/main/java/ru/betterend/blocks/CharcoalBlock.java +++ b/src/main/java/ru/betterend/blocks/CharcoalBlock.java @@ -1,13 +1,13 @@ package ru.betterend.blocks; +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.registry.FuelRegistry; import net.minecraft.world.level.block.Blocks; import ru.bclib.blocks.BaseBlock; -import ru.bclib.util.BlocksHelper; public class CharcoalBlock extends BaseBlock { public CharcoalBlock() { - super(BlocksHelper.copySettingsOf(Blocks.COAL_BLOCK)); + super(FabricBlockSettings.copyOf(Blocks.COAL_BLOCK)); FuelRegistry.INSTANCE.add(this, 16000); } } diff --git a/src/main/java/ru/betterend/blocks/DenseEmeraldIceBlock.java b/src/main/java/ru/betterend/blocks/DenseEmeraldIceBlock.java index 3c20c640..ece46509 100644 --- a/src/main/java/ru/betterend/blocks/DenseEmeraldIceBlock.java +++ b/src/main/java/ru/betterend/blocks/DenseEmeraldIceBlock.java @@ -3,6 +3,7 @@ package ru.betterend.blocks; import java.util.Collections; import java.util.List; +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.enchantment.EnchantmentHelper; import net.minecraft.world.item.enchantment.Enchantments; @@ -13,11 +14,10 @@ import net.minecraft.world.level.storage.loot.parameters.LootContextParams; import ru.bclib.blocks.BaseBlock; import ru.bclib.client.render.BCLRenderLayer; import ru.bclib.interfaces.IRenderTyped; -import ru.bclib.util.BlocksHelper; public class DenseEmeraldIceBlock extends BaseBlock implements IRenderTyped { public DenseEmeraldIceBlock() { - super(BlocksHelper.copySettingsOf(Blocks.PACKED_ICE)); + super(FabricBlockSettings.copyOf(Blocks.PACKED_ICE)); } @Override diff --git a/src/main/java/ru/betterend/blocks/EmeraldIceBlock.java b/src/main/java/ru/betterend/blocks/EmeraldIceBlock.java index ab078c7f..e4ebe572 100644 --- a/src/main/java/ru/betterend/blocks/EmeraldIceBlock.java +++ b/src/main/java/ru/betterend/blocks/EmeraldIceBlock.java @@ -8,6 +8,7 @@ import org.jetbrains.annotations.Nullable; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.client.renderer.block.model.BlockModel; import net.minecraft.core.BlockPos; import net.minecraft.resources.ResourceLocation; @@ -28,11 +29,10 @@ import net.minecraft.world.level.storage.loot.parameters.LootContextParams; import ru.bclib.client.models.BlockModelProvider; import ru.bclib.client.render.BCLRenderLayer; import ru.bclib.interfaces.IRenderTyped; -import ru.bclib.util.BlocksHelper; public class EmeraldIceBlock extends HalfTransparentBlock implements IRenderTyped, BlockModelProvider { public EmeraldIceBlock() { - super(BlocksHelper.copySettingsOf(Blocks.ICE)); + super(FabricBlockSettings.copyOf(Blocks.ICE)); } @Override diff --git a/src/main/java/ru/betterend/blocks/EndLotusStemBlock.java b/src/main/java/ru/betterend/blocks/EndLotusStemBlock.java index 260fa4e2..0c27ece2 100644 --- a/src/main/java/ru/betterend/blocks/EndLotusStemBlock.java +++ b/src/main/java/ru/betterend/blocks/EndLotusStemBlock.java @@ -4,6 +4,7 @@ import java.util.Map; import com.google.common.collect.Maps; +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; @@ -39,7 +40,7 @@ public class EndLotusStemBlock extends BaseBlock implements SimpleWaterloggedBlo private static final Map SHAPES = Maps.newEnumMap(Axis.class); public EndLotusStemBlock() { - super(BlocksHelper.copySettingsOf(Blocks.OAK_PLANKS)); + super(FabricBlockSettings.copyOf(Blocks.OAK_PLANKS)); this.registerDefaultState(defaultBlockState().setValue(WATERLOGGED, false).setValue(SHAPE, TripleShape.MIDDLE).setValue(LEAF, false).setValue(FACING, Direction.UP)); } diff --git a/src/main/java/ru/betterend/blocks/EndPortalBlock.java b/src/main/java/ru/betterend/blocks/EndPortalBlock.java index ab12343f..a419608e 100644 --- a/src/main/java/ru/betterend/blocks/EndPortalBlock.java +++ b/src/main/java/ru/betterend/blocks/EndPortalBlock.java @@ -6,6 +6,7 @@ import java.util.Random; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.client.color.block.BlockColor; import net.minecraft.client.color.item.ItemColor; import net.minecraft.core.BlockPos; @@ -34,7 +35,6 @@ import net.minecraft.world.level.dimension.DimensionType; import ru.bclib.client.render.BCLRenderLayer; import ru.bclib.interfaces.IColorProvider; import ru.bclib.interfaces.IRenderTyped; -import ru.bclib.util.BlocksHelper; import ru.betterend.interfaces.TeleportingEntity; import ru.betterend.registry.EndParticles; import ru.betterend.registry.EndPortals; @@ -44,7 +44,7 @@ public class EndPortalBlock extends NetherPortalBlock implements IRenderTyped, I public static final IntegerProperty PORTAL = EndBlockProperties.PORTAL; public EndPortalBlock() { - super(BlocksHelper.copySettingsOf(Blocks.NETHER_PORTAL).resistance(Blocks.BEDROCK.getExplosionResistance()).luminance(15)); + super(FabricBlockSettings.copyOf(Blocks.NETHER_PORTAL).resistance(Blocks.BEDROCK.getExplosionResistance()).luminance(15)); } @Override diff --git a/src/main/java/ru/betterend/blocks/EndStoneSmelter.java b/src/main/java/ru/betterend/blocks/EndStoneSmelter.java index d921ef0e..e7281b88 100644 --- a/src/main/java/ru/betterend/blocks/EndStoneSmelter.java +++ b/src/main/java/ru/betterend/blocks/EndStoneSmelter.java @@ -1,15 +1,9 @@ package ru.betterend.blocks; -import java.util.List; -import java.util.Random; - import com.google.common.collect.Lists; -import org.jetbrains.annotations.Nullable; - import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.particles.ParticleTypes; @@ -22,12 +16,7 @@ import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.HorizontalDirectionalBlock; -import net.minecraft.world.level.block.Mirror; -import net.minecraft.world.level.block.RenderShape; -import net.minecraft.world.level.block.Rotation; -import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityTicker; import net.minecraft.world.level.block.entity.BlockEntityType; @@ -41,10 +30,14 @@ import net.minecraft.world.level.material.MaterialColor; import net.minecraft.world.level.storage.loot.LootContext; import net.minecraft.world.level.storage.loot.parameters.LootContextParams; import net.minecraft.world.phys.BlockHitResult; +import org.jetbrains.annotations.Nullable; import ru.bclib.blocks.BaseBlockWithEntity; import ru.betterend.blocks.entities.EndStoneSmelterBlockEntity; import ru.betterend.registry.EndBlockEntities; +import java.util.List; +import java.util.Random; + public class EndStoneSmelter extends BaseBlockWithEntity { public static final DirectionProperty FACING = HorizontalDirectionalBlock.FACING; public static final BooleanProperty LIT = BlockStateProperties.LIT; @@ -54,7 +47,6 @@ public class EndStoneSmelter extends BaseBlockWithEntity { super(FabricBlockSettings.of(Material.STONE, MaterialColor.COLOR_GRAY) .hardness(4F) .resistance(100F) - .breakByTool(FabricToolTags.PICKAXES) .requiresCorrectToolForDrops() .sound(SoundType.STONE)); this.registerDefaultState(this.stateDefinition.any() diff --git a/src/main/java/ru/betterend/blocks/EnderBlock.java b/src/main/java/ru/betterend/blocks/EnderBlock.java index 65994654..31469430 100644 --- a/src/main/java/ru/betterend/blocks/EnderBlock.java +++ b/src/main/java/ru/betterend/blocks/EnderBlock.java @@ -3,7 +3,6 @@ package ru.betterend.blocks; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; import net.minecraft.core.BlockPos; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.block.SoundType; @@ -18,7 +17,6 @@ public class EnderBlock extends BaseBlock { super(FabricBlockSettings.of(Material.STONE, MaterialColor.WARPED_WART_BLOCK) .hardness(5F) .resistance(6F) - .breakByTool(FabricToolTags.PICKAXES) .requiresCorrectToolForDrops() .sound(SoundType.STONE)); } diff --git a/src/main/java/ru/betterend/blocks/EndstoneDustBlock.java b/src/main/java/ru/betterend/blocks/EndstoneDustBlock.java index 72c70d69..28ca0d6e 100644 --- a/src/main/java/ru/betterend/blocks/EndstoneDustBlock.java +++ b/src/main/java/ru/betterend/blocks/EndstoneDustBlock.java @@ -5,6 +5,7 @@ import java.util.List; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; import net.minecraft.core.BlockPos; import net.minecraft.world.item.ItemStack; @@ -13,7 +14,6 @@ import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.FallingBlock; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.storage.loot.LootContext; -import ru.bclib.util.BlocksHelper; import ru.bclib.util.ColorUtil; public class EndstoneDustBlock extends FallingBlock { @@ -21,7 +21,7 @@ public class EndstoneDustBlock extends FallingBlock { private static final int COLOR = ColorUtil.color(226, 239, 168); public EndstoneDustBlock() { - super(BlocksHelper.copySettingsOf(Blocks.SAND) + super(FabricBlockSettings.copyOf(Blocks.SAND) .breakByTool(FabricToolTags.SHOVELS) .materialColor(Blocks.END_STONE.defaultMaterialColor())); } diff --git a/src/main/java/ru/betterend/blocks/JellyshroomCapBlock.java b/src/main/java/ru/betterend/blocks/JellyshroomCapBlock.java index 7f1a7d9a..681e3578 100644 --- a/src/main/java/ru/betterend/blocks/JellyshroomCapBlock.java +++ b/src/main/java/ru/betterend/blocks/JellyshroomCapBlock.java @@ -9,6 +9,7 @@ import com.google.common.collect.Lists; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.client.color.block.BlockColor; import net.minecraft.client.color.item.ItemColor; import net.minecraft.client.renderer.block.model.BlockModel; @@ -29,7 +30,6 @@ import ru.bclib.client.models.ModelsHelper; import ru.bclib.client.render.BCLRenderLayer; import ru.bclib.interfaces.IColorProvider; import ru.bclib.interfaces.IRenderTyped; -import ru.bclib.util.BlocksHelper; import ru.bclib.util.ColorUtil; import ru.bclib.util.MHelper; import ru.betterend.client.models.Patterns; @@ -43,7 +43,7 @@ public class JellyshroomCapBlock extends SlimeBlock implements IRenderTyped, Blo private final int coloritem; public JellyshroomCapBlock(int r1, int g1, int b1, int r2, int g2, int b2) { - super(BlocksHelper.copySettingsOf(Blocks.SLIME_BLOCK)); + super(FabricBlockSettings.copyOf(Blocks.SLIME_BLOCK)); colorStart = new Vec3i(r1, g1, b1); colorEnd = new Vec3i(r2, g2, b2); coloritem = ColorUtil.color((r1 + r2) >> 1, (g1 + g2) >> 1, (b1 + b2) >> 1); diff --git a/src/main/java/ru/betterend/blocks/MengerSpongeBlock.java b/src/main/java/ru/betterend/blocks/MengerSpongeBlock.java index 798d28ba..6890f22a 100644 --- a/src/main/java/ru/betterend/blocks/MengerSpongeBlock.java +++ b/src/main/java/ru/betterend/blocks/MengerSpongeBlock.java @@ -4,6 +4,7 @@ import java.util.Queue; import com.google.common.collect.Lists; +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.tags.FluidTags; @@ -16,17 +17,17 @@ import net.minecraft.world.level.block.LiquidBlock; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.level.material.Fluids; import net.minecraft.world.level.material.Material; import ru.bclib.blocks.BaseBlockNotFull; import ru.bclib.client.render.BCLRenderLayer; import ru.bclib.interfaces.IRenderTyped; -import ru.bclib.util.BlocksHelper; import ru.betterend.registry.EndBlocks; @SuppressWarnings("deprecation") public class MengerSpongeBlock extends BaseBlockNotFull implements IRenderTyped { public MengerSpongeBlock() { - super(BlocksHelper.copySettingsOf(Blocks.SPONGE).noOcclusion()); + super(FabricBlockSettings.copyOf(Blocks.SPONGE).noOcclusion()); } @Override diff --git a/src/main/java/ru/betterend/blocks/MengerSpongeWetBlock.java b/src/main/java/ru/betterend/blocks/MengerSpongeWetBlock.java index 82c58413..0908d9f3 100644 --- a/src/main/java/ru/betterend/blocks/MengerSpongeWetBlock.java +++ b/src/main/java/ru/betterend/blocks/MengerSpongeWetBlock.java @@ -4,6 +4,7 @@ import java.util.Random; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.particles.ParticleTypes; @@ -27,7 +28,7 @@ import ru.betterend.registry.EndBlocks; @SuppressWarnings("deprecation") public class MengerSpongeWetBlock extends BaseBlockNotFull implements IRenderTyped { public MengerSpongeWetBlock() { - super(BlocksHelper.copySettingsOf(Blocks.WET_SPONGE).noOcclusion()); + super(FabricBlockSettings.copyOf(Blocks.WET_SPONGE).noOcclusion()); } @Override diff --git a/src/main/java/ru/betterend/blocks/MissingTileBlock.java b/src/main/java/ru/betterend/blocks/MissingTileBlock.java index 2bc243f6..7a516557 100644 --- a/src/main/java/ru/betterend/blocks/MissingTileBlock.java +++ b/src/main/java/ru/betterend/blocks/MissingTileBlock.java @@ -1,11 +1,11 @@ package ru.betterend.blocks; +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.world.level.block.Blocks; import ru.bclib.blocks.BaseBlock; -import ru.bclib.util.BlocksHelper; public class MissingTileBlock extends BaseBlock { public MissingTileBlock() { - super(BlocksHelper.copySettingsOf(Blocks.END_STONE)); + super(FabricBlockSettings.copyOf(Blocks.END_STONE)); } } diff --git a/src/main/java/ru/betterend/blocks/MossyDragonBoneBlock.java b/src/main/java/ru/betterend/blocks/MossyDragonBoneBlock.java index ff885715..b7d3e7e1 100644 --- a/src/main/java/ru/betterend/blocks/MossyDragonBoneBlock.java +++ b/src/main/java/ru/betterend/blocks/MossyDragonBoneBlock.java @@ -4,6 +4,7 @@ import java.util.Collections; import java.util.List; import java.util.Random; +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; @@ -18,13 +19,12 @@ import net.minecraft.world.level.lighting.LayerLightEngine; import net.minecraft.world.level.storage.loot.LootContext; import net.minecraft.world.level.storage.loot.parameters.LootContextParams; import ru.bclib.blocks.BaseRotatedPillarBlock; -import ru.bclib.util.BlocksHelper; import ru.betterend.registry.EndBlocks; @SuppressWarnings("deprecation") public class MossyDragonBoneBlock extends BaseRotatedPillarBlock { public MossyDragonBoneBlock() { - super(BlocksHelper.copySettingsOf(Blocks.BONE_BLOCK).hardness(0.5F).randomTicks()); + super(FabricBlockSettings.copyOf(Blocks.BONE_BLOCK).hardness(0.5F).randomTicks()); } @Override diff --git a/src/main/java/ru/betterend/blocks/MossyObsidian.java b/src/main/java/ru/betterend/blocks/MossyObsidian.java index d17588f5..d3423fdf 100644 --- a/src/main/java/ru/betterend/blocks/MossyObsidian.java +++ b/src/main/java/ru/betterend/blocks/MossyObsidian.java @@ -4,6 +4,7 @@ import java.util.Collections; import java.util.List; import java.util.Random; +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; @@ -18,11 +19,10 @@ import net.minecraft.world.level.lighting.LayerLightEngine; import net.minecraft.world.level.storage.loot.LootContext; import net.minecraft.world.level.storage.loot.parameters.LootContextParams; import ru.bclib.blocks.BaseBlock; -import ru.bclib.util.BlocksHelper; public class MossyObsidian extends BaseBlock { public MossyObsidian() { - super(BlocksHelper.copySettingsOf(Blocks.OBSIDIAN).hardness(3).randomTicks()); + super(FabricBlockSettings.copyOf(Blocks.OBSIDIAN).hardness(3).randomTicks()); } @Override diff --git a/src/main/java/ru/betterend/blocks/NeonCactusBlock.java b/src/main/java/ru/betterend/blocks/NeonCactusBlock.java index bc6fb3ef..2d1d9acd 100644 --- a/src/main/java/ru/betterend/blocks/NeonCactusBlock.java +++ b/src/main/java/ru/betterend/blocks/NeonCactusBlock.java @@ -1,11 +1,11 @@ package ru.betterend.blocks; +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.world.level.block.Blocks; import ru.bclib.blocks.BaseRotatedPillarBlock; -import ru.bclib.util.BlocksHelper; public class NeonCactusBlock extends BaseRotatedPillarBlock { public NeonCactusBlock() { - super(BlocksHelper.copySettingsOf(Blocks.CACTUS).luminance(15)); + super(FabricBlockSettings.copyOf(Blocks.CACTUS).luminance(15)); } } diff --git a/src/main/java/ru/betterend/blocks/NeonCactusPlantBlock.java b/src/main/java/ru/betterend/blocks/NeonCactusPlantBlock.java index 666e9308..568ea567 100644 --- a/src/main/java/ru/betterend/blocks/NeonCactusPlantBlock.java +++ b/src/main/java/ru/betterend/blocks/NeonCactusPlantBlock.java @@ -7,6 +7,7 @@ import java.util.Random; import com.google.common.collect.Lists; import com.google.common.collect.Maps; +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; @@ -63,7 +64,7 @@ public class NeonCactusPlantBlock extends BaseBlockNotFull implements SimpleWate private static final int MAX_LENGTH = 12; public NeonCactusPlantBlock() { - super(BlocksHelper.copySettingsOf(Blocks.CACTUS).luminance(15).randomTicks()); + super(FabricBlockSettings.copyOf(Blocks.CACTUS).luminance(15).randomTicks()); registerDefaultState(defaultBlockState().setValue(WATERLOGGED, false).setValue(FACING, Direction.UP).setValue(SHAPE, TripleShape.TOP)); } diff --git a/src/main/java/ru/betterend/blocks/RespawnObeliskBlock.java b/src/main/java/ru/betterend/blocks/RespawnObeliskBlock.java index 2d274a1a..48b5e923 100644 --- a/src/main/java/ru/betterend/blocks/RespawnObeliskBlock.java +++ b/src/main/java/ru/betterend/blocks/RespawnObeliskBlock.java @@ -6,6 +6,7 @@ import org.jetbrains.annotations.Nullable; import com.google.common.collect.Lists; +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.client.color.block.BlockColor; import net.minecraft.client.color.item.ItemColor; import net.minecraft.core.BlockPos; @@ -53,7 +54,7 @@ public class RespawnObeliskBlock extends BaseBlock implements IColorProvider, IR public static final EnumProperty SHAPE = BlockProperties.TRIPLE_SHAPE; public RespawnObeliskBlock() { - super(BlocksHelper.copySettingsOf(Blocks.END_STONE).luminance((state) -> { + super(FabricBlockSettings.copyOf(Blocks.END_STONE).luminance((state) -> { return (state.getValue(SHAPE) == TripleShape.BOTTOM) ? 0 : 15; })); } diff --git a/src/main/java/ru/betterend/blocks/UmbrellaTreeClusterBlock.java b/src/main/java/ru/betterend/blocks/UmbrellaTreeClusterBlock.java index c4d0a1c1..a8d3dcb0 100644 --- a/src/main/java/ru/betterend/blocks/UmbrellaTreeClusterBlock.java +++ b/src/main/java/ru/betterend/blocks/UmbrellaTreeClusterBlock.java @@ -1,5 +1,6 @@ package ru.betterend.blocks; +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.core.BlockPos; import net.minecraft.sounds.SoundEvents; import net.minecraft.sounds.SoundSource; @@ -26,7 +27,7 @@ public class UmbrellaTreeClusterBlock extends BaseBlock { public static final BooleanProperty NATURAL = BlockProperties.NATURAL; public UmbrellaTreeClusterBlock() { - super(BlocksHelper.copySettingsOf(Blocks.NETHER_WART_BLOCK) + super(FabricBlockSettings.copyOf(Blocks.NETHER_WART_BLOCK) .materialColor(MaterialColor.COLOR_PURPLE) .luminance(15)); registerDefaultState(stateDefinition.any().setValue(NATURAL, false)); diff --git a/src/main/java/ru/betterend/blocks/UmbrellaTreeClusterEmptyBlock.java b/src/main/java/ru/betterend/blocks/UmbrellaTreeClusterEmptyBlock.java index f176f4aa..d6569aa3 100644 --- a/src/main/java/ru/betterend/blocks/UmbrellaTreeClusterEmptyBlock.java +++ b/src/main/java/ru/betterend/blocks/UmbrellaTreeClusterEmptyBlock.java @@ -2,6 +2,7 @@ package ru.betterend.blocks; import java.util.Random; +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.level.block.Block; @@ -18,7 +19,7 @@ public class UmbrellaTreeClusterEmptyBlock extends BaseBlock { public static final BooleanProperty NATURAL = EndBlockProperties.NATURAL; public UmbrellaTreeClusterEmptyBlock() { - super(BlocksHelper.copySettingsOf(Blocks.NETHER_WART_BLOCK) + super(FabricBlockSettings.copyOf(Blocks.NETHER_WART_BLOCK) .materialColor(MaterialColor.COLOR_PURPLE) .randomTicks()); registerDefaultState(stateDefinition.any().setValue(NATURAL, false)); diff --git a/src/main/java/ru/betterend/blocks/UmbrellaTreeMembraneBlock.java b/src/main/java/ru/betterend/blocks/UmbrellaTreeMembraneBlock.java index 7d6b4713..b267bf84 100644 --- a/src/main/java/ru/betterend/blocks/UmbrellaTreeMembraneBlock.java +++ b/src/main/java/ru/betterend/blocks/UmbrellaTreeMembraneBlock.java @@ -7,6 +7,7 @@ import com.google.common.collect.Lists; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.client.renderer.block.model.BlockModel; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -24,7 +25,6 @@ import net.minecraft.world.level.storage.loot.LootContext; import ru.bclib.client.models.BlockModelProvider; import ru.bclib.client.render.BCLRenderLayer; import ru.bclib.interfaces.IRenderTyped; -import ru.bclib.util.BlocksHelper; import ru.bclib.util.MHelper; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; @@ -34,7 +34,7 @@ public class UmbrellaTreeMembraneBlock extends SlimeBlock implements IRenderType private static final OpenSimplexNoise NOISE = new OpenSimplexNoise(0); public UmbrellaTreeMembraneBlock() { - super(BlocksHelper.copySettingsOf(Blocks.SLIME_BLOCK)); + super(FabricBlockSettings.copyOf(Blocks.SLIME_BLOCK)); } @Override diff --git a/src/main/java/ru/betterend/blocks/basis/EndLanternBlock.java b/src/main/java/ru/betterend/blocks/basis/EndLanternBlock.java index cc801110..f4ada8b3 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndLanternBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndLanternBlock.java @@ -4,6 +4,7 @@ import java.util.Map; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.client.resources.model.UnbakedModel; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -26,7 +27,6 @@ import net.minecraft.world.level.material.Fluids; import ru.bclib.blocks.BaseBlockNotFull; import ru.bclib.blocks.BlockProperties; import ru.bclib.client.models.ModelsHelper; -import ru.bclib.util.BlocksHelper; @SuppressWarnings("deprecation") public class EndLanternBlock extends BaseBlockNotFull implements SimpleWaterloggedBlock, LiquidBlockContainer { @@ -34,7 +34,7 @@ public class EndLanternBlock extends BaseBlockNotFull implements SimpleWaterlogg public static final BooleanProperty WATERLOGGED = BlockStateProperties.WATERLOGGED; public EndLanternBlock(Block source) { - this(BlocksHelper.copySettingsOf(source).luminance(15).noOcclusion()); + this(FabricBlockSettings.copyOf(source).luminance(15).noOcclusion()); } public EndLanternBlock(Properties settings) { diff --git a/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java b/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java index 80355ff3..8d79e82f 100644 --- a/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java @@ -6,9 +6,15 @@ import java.util.List; import java.util.Map; import java.util.Optional; -import com.google.common.collect.Lists; +import net.minecraft.world.level.block.entity.BlockEntityTicker; +import net.minecraft.world.level.block.entity.BlockEntityType; import org.jetbrains.annotations.Nullable; +import com.google.common.collect.Lists; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.client.renderer.block.model.BlockModel; import net.minecraft.client.resources.model.UnbakedModel; import net.minecraft.core.BlockPos; @@ -28,8 +34,6 @@ import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.EntityBlock; import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.level.block.entity.BlockEntityTicker; -import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.block.state.properties.BooleanProperty; @@ -40,12 +44,9 @@ import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.Shapes; import net.minecraft.world.phys.shapes.VoxelShape; -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; import ru.bclib.blocks.BaseBlockNotFull; import ru.bclib.blocks.BlockProperties; import ru.bclib.client.models.ModelsHelper; -import ru.bclib.util.BlocksHelper; import ru.betterend.blocks.EndBlockProperties; import ru.betterend.blocks.EndBlockProperties.PedestalState; import ru.betterend.blocks.InfusionPedestal; @@ -97,7 +98,7 @@ public class PedestalBlock extends BaseBlockNotFull implements EntityBlock { protected float height = 1.0F; public PedestalBlock(Block parent) { - super(BlocksHelper.copySettingsOf(parent).luminance(state -> state.getValue(HAS_LIGHT) ? 12 : 0)); + super(FabricBlockSettings.copyOf(parent).luminance(state -> state.getValue(HAS_LIGHT) ? 12 : 0)); this.registerDefaultState(stateDefinition.any().setValue(STATE, PedestalState.DEFAULT).setValue(HAS_ITEM, false).setValue(HAS_LIGHT, false)); this.parent = parent; } diff --git a/src/main/java/ru/betterend/blocks/basis/StoneLanternBlock.java b/src/main/java/ru/betterend/blocks/basis/StoneLanternBlock.java index 6aea47ec..b8f2b7c9 100644 --- a/src/main/java/ru/betterend/blocks/basis/StoneLanternBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/StoneLanternBlock.java @@ -6,6 +6,7 @@ import org.jetbrains.annotations.Nullable; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.client.color.block.BlockColor; import net.minecraft.client.color.item.ItemColor; import net.minecraft.client.renderer.block.model.BlockModel; @@ -18,7 +19,6 @@ import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; import ru.bclib.client.models.ModelsHelper; import ru.bclib.interfaces.IColorProvider; -import ru.bclib.util.BlocksHelper; import ru.betterend.client.models.Patterns; import ru.betterend.registry.EndBlocks; @@ -27,7 +27,7 @@ public class StoneLanternBlock extends EndLanternBlock implements IColorProvider private static final VoxelShape SHAPE_FLOOR = Block.box(3, 0, 3, 13, 15, 13); public StoneLanternBlock(Block source) { - super(BlocksHelper.copySettingsOf(source).luminance(15)); + super(FabricBlockSettings.copyOf(source).luminance(15)); } @Override diff --git a/src/main/java/ru/betterend/blocks/complex/ColoredMaterial.java b/src/main/java/ru/betterend/blocks/complex/ColoredMaterial.java index 5b4ac1ea..9ae68e51 100644 --- a/src/main/java/ru/betterend/blocks/complex/ColoredMaterial.java +++ b/src/main/java/ru/betterend/blocks/complex/ColoredMaterial.java @@ -31,7 +31,7 @@ public class ColoredMaterial { String id = Registry.BLOCK.getKey(source).getPath(); colors.forEach((color, name) -> { String blockName = id + "_" + name; - Block block = constructor.apply(BlocksHelper.copySettingsOf(source).materialColor(MaterialColor.COLOR_BLACK)); + Block block = constructor.apply(FabricBlockSettings.copyOf(source).materialColor(MaterialColor.COLOR_BLACK)); EndBlocks.registerBlock(blockName, block); if (craftEight) { GridRecipe.make(BetterEnd.MOD_ID, blockName, block).checkConfig(Configs.RECIPE_CONFIG).setOutputCount(8).setShape("###", "#D#", "###").addMaterial('#', source).addMaterial('D', dyes.get(color)).build(); diff --git a/src/main/java/ru/betterend/blocks/complex/CrystalSubblocksMaterial.java b/src/main/java/ru/betterend/blocks/complex/CrystalSubblocksMaterial.java index 4fdf1cae..1e82ff4c 100644 --- a/src/main/java/ru/betterend/blocks/complex/CrystalSubblocksMaterial.java +++ b/src/main/java/ru/betterend/blocks/complex/CrystalSubblocksMaterial.java @@ -10,7 +10,6 @@ import ru.bclib.blocks.BaseSlabBlock; import ru.bclib.blocks.BaseStairsBlock; import ru.bclib.blocks.BaseWallBlock; import ru.bclib.recipes.GridRecipe; -import ru.bclib.util.BlocksHelper; import ru.bclib.util.TagHelper; import ru.betterend.BetterEnd; import ru.betterend.blocks.EndPedestal; @@ -32,7 +31,7 @@ public class CrystalSubblocksMaterial { public final Block brick_wall; public CrystalSubblocksMaterial(String name, Block source) { - FabricBlockSettings material = BlocksHelper.copySettingsOf(source); + FabricBlockSettings material = FabricBlockSettings.copyOf(source); polished = EndBlocks.registerBlock(name + "_polished", new BaseBlock(material)); tiles = EndBlocks.registerBlock(name + "_tiles", new BaseBlock(material)); pillar = EndBlocks.registerBlock(name + "_pillar", new BaseRotatedPillarBlock(material)); diff --git a/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java b/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java index 75ca826e..4f5577bd 100644 --- a/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java +++ b/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java @@ -31,7 +31,6 @@ import ru.bclib.items.tool.BaseSwordItem; import ru.bclib.recipes.FurnaceRecipe; import ru.bclib.recipes.GridRecipe; import ru.bclib.recipes.SmithingTableRecipe; -import ru.bclib.util.BlocksHelper; import ru.bclib.util.TagHelper; import ru.betterend.BetterEnd; import ru.betterend.blocks.BulbVineLanternBlock; @@ -91,26 +90,26 @@ public class MetalMaterial { public final Item boots; public static MetalMaterial makeNormal(String name, MaterialColor color, Tier material, ArmorMaterial armor) { - return new MetalMaterial(name, true, BlocksHelper.copySettingsOf(Blocks.IRON_BLOCK).materialColor(color), EndItems.makeEndItemSettings(), material, armor); + return new MetalMaterial(name, true, FabricBlockSettings.copyOf(Blocks.IRON_BLOCK).materialColor(color), EndItems.makeEndItemSettings(), material, armor); } public static MetalMaterial makeNormal(String name, MaterialColor color, float hardness, float resistance, Tier material, ArmorMaterial armor) { - return new MetalMaterial(name, true, BlocksHelper.copySettingsOf(Blocks.IRON_BLOCK).materialColor(color).hardness(hardness).resistance(resistance), EndItems.makeEndItemSettings(), material, armor); + return new MetalMaterial(name, true, FabricBlockSettings.copyOf(Blocks.IRON_BLOCK).materialColor(color).hardness(hardness).resistance(resistance), EndItems.makeEndItemSettings(), material, armor); } public static MetalMaterial makeOreless(String name, MaterialColor color, Tier material, ArmorMaterial armor) { - return new MetalMaterial(name, false, BlocksHelper.copySettingsOf(Blocks.IRON_BLOCK).materialColor(color), EndItems.makeEndItemSettings(), material, armor); + return new MetalMaterial(name, false, FabricBlockSettings.copyOf(Blocks.IRON_BLOCK).materialColor(color), EndItems.makeEndItemSettings(), material, armor); } public static MetalMaterial makeOreless(String name, MaterialColor color, float hardness, float resistance, Tier material, ArmorMaterial armor) { - return new MetalMaterial(name, false, BlocksHelper.copySettingsOf(Blocks.IRON_BLOCK).materialColor(color).hardness(hardness).resistance(resistance), EndItems.makeEndItemSettings(), material, armor); + return new MetalMaterial(name, false, FabricBlockSettings.copyOf(Blocks.IRON_BLOCK).materialColor(color).hardness(hardness).resistance(resistance), EndItems.makeEndItemSettings(), material, armor); } private MetalMaterial(String name, boolean hasOre, FabricBlockSettings settings, Properties itemSettings, Tier material, ArmorMaterial armor) { BlockBehaviour.Properties lanternProperties = FabricBlockSettings.copyOf(settings).hardness(1).resistance(1).luminance(15).sound(SoundType.LANTERN); final int level = material.getLevel(); - ore = hasOre ? EndBlocks.registerBlock(name + "_ore", new BaseBlock(BlocksHelper.copySettingsOf(Blocks.END_STONE))) : null; + ore = hasOre ? EndBlocks.registerBlock(name + "_ore", new BaseBlock(FabricBlockSettings.copyOf(Blocks.END_STONE))) : null; block = EndBlocks.registerBlock(name + "_block", new BaseBlock(settings)); tile = EndBlocks.registerBlock(name + "_tile", new BaseBlock(settings)); stairs = EndBlocks.registerBlock(name + "_stairs", new BaseStairsBlock(tile)); diff --git a/src/main/java/ru/betterend/blocks/complex/StoneMaterial.java b/src/main/java/ru/betterend/blocks/complex/StoneMaterial.java index 43050297..125c391e 100644 --- a/src/main/java/ru/betterend/blocks/complex/StoneMaterial.java +++ b/src/main/java/ru/betterend/blocks/complex/StoneMaterial.java @@ -16,7 +16,6 @@ import ru.bclib.blocks.BaseStoneButtonBlock; import ru.bclib.blocks.BaseWallBlock; import ru.bclib.blocks.StonePressurePlateBlock; import ru.bclib.recipes.GridRecipe; -import ru.bclib.util.BlocksHelper; import ru.bclib.util.TagHelper; import ru.betterend.BetterEnd; import ru.betterend.blocks.EndPedestal; @@ -47,7 +46,7 @@ public class StoneMaterial { public final Block furnace; public StoneMaterial(String name, MaterialColor color) { - FabricBlockSettings material = BlocksHelper.copySettingsOf(Blocks.END_STONE).materialColor(color); + FabricBlockSettings material = FabricBlockSettings.copyOf(Blocks.END_STONE).materialColor(color); stone = EndBlocks.registerBlock(name, new BaseBlock(material)); polished = EndBlocks.registerBlock(name + "_polished", new BaseBlock(material)); diff --git a/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java b/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java index 174c73ed..57df31f3 100644 --- a/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java +++ b/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java @@ -33,7 +33,6 @@ import ru.bclib.blocks.BaseWoodenButtonBlock; import ru.bclib.blocks.StripableBarkBlock; import ru.bclib.blocks.WoodenPressurePlateBlock; import ru.bclib.recipes.GridRecipe; -import ru.bclib.util.BlocksHelper; import ru.bclib.util.TagHelper; import ru.betterend.BetterEnd; import ru.betterend.config.Configs; @@ -70,7 +69,7 @@ public class WoodenMaterial { public final Tag.Named logItemTag; public WoodenMaterial(String name, MaterialColor woodColor, MaterialColor planksColor) { - FabricBlockSettings materialPlanks = BlocksHelper.copySettingsOf(Blocks.OAK_PLANKS).materialColor(planksColor); + FabricBlockSettings materialPlanks = FabricBlockSettings.copyOf(Blocks.OAK_PLANKS).materialColor(planksColor); log_stripped = EndBlocks.registerBlock(name + "_stripped_log", new BaseRotatedPillarBlock(materialPlanks)); bark_stripped = EndBlocks.registerBlock(name + "_stripped_bark", new BaseBarkBlock(materialPlanks)); From 9db7f4d94074991c09cc3d16addf7bb0c9a9b525 Mon Sep 17 00:00:00 2001 From: Frank Bauer Date: Sun, 4 Jul 2021 23:54:40 +0200 Subject: [PATCH 072/595] Added mining labels --- src/main/java/ru/betterend/minigTools.txt | 593 ++++++++++++++++++ .../minecraft/tags/blocks/mineable/axe.json | 31 + .../minecraft/tags/blocks/mineable/hoe.json | 14 + .../tags/blocks/mineable/pickaxe.json | 251 ++++++++ .../tags/blocks/mineable/shovel.json | 6 + 5 files changed, 895 insertions(+) create mode 100644 src/main/java/ru/betterend/minigTools.txt create mode 100644 src/main/resources/data/minecraft/tags/blocks/mineable/axe.json create mode 100644 src/main/resources/data/minecraft/tags/blocks/mineable/hoe.json create mode 100644 src/main/resources/data/minecraft/tags/blocks/mineable/pickaxe.json create mode 100644 src/main/resources/data/minecraft/tags/blocks/mineable/shovel.json diff --git a/src/main/java/ru/betterend/minigTools.txt b/src/main/java/ru/betterend/minigTools.txt new file mode 100644 index 00000000..28523ccc --- /dev/null +++ b/src/main/java/ru/betterend/minigTools.txt @@ -0,0 +1,593 @@ +SHOVELS: + "betterend:endstone_dust", + +HOES: + "betterend:amber_root_seed", + "betterend:blossom_berry_seed", + "betterend:chorus_mushroom_seed", + "betterend:dragon_tree_leaves", + "betterend:lacugrove_leaves", + "betterend:lucernia_leaves", + "betterend:pythadendron_leaves", + "betterend:shadow_berry", + "betterend:tenanea_leaves", + +SWORDS: + +AXES: + "betterend:amaranita_cap", + "betterend:amaranita_hymenophore", + "betterend:amaranita_lantern", + "betterend:aurant_polypore", + "betterend:blue_vine_lantern", + "betterend:filalux_lantern", + "betterend:hydralux_petal_block", + "betterend:hydralux_petal_block_black", + "betterend:hydralux_petal_block_blue", + "betterend:hydralux_petal_block_brown", + "betterend:hydralux_petal_block_cyan", + "betterend:hydralux_petal_block_gray", + "betterend:hydralux_petal_block_green", + "betterend:hydralux_petal_block_light_blue", + "betterend:hydralux_petal_block_light_gray", + "betterend:hydralux_petal_block_lime", + "betterend:hydralux_petal_block_magenta", + "betterend:hydralux_petal_block_orange", + "betterend:hydralux_petal_block_pink", + "betterend:hydralux_petal_block_purple", + "betterend:hydralux_petal_block_red", + "betterend:hydralux_petal_block_white", + "betterend:hydralux_petal_block_yellow", + "betterend:mossy_glowshroom_cap", + "betterend:mossy_glowshroom_hymenophore", + "betterend:purple_polypore", + +SHEARS: + "betterend:aeridium", + "betterend:amaranita_fur", + "betterend:amber_grass", + "betterend:blooming_cooksonia", + "betterend:blue_vine_fur", + "betterend:blue_vine_seed", + "betterend:bolux_mushroom", + "betterend:bubble_coral", + "betterend:bulb_moss", + "betterend:bulb_vine", + "betterend:bulb_vine_seed", + "betterend:bushy_grass", + "betterend:cave_grass", + "betterend:cave_pumpkin_seed", + "betterend:charnia_cyan", + "betterend:charnia_green", + "betterend:charnia_light_blue", + "betterend:charnia_orange", + "betterend:charnia_purple", + "betterend:charnia_red", + "betterend:chorus_grass", + "betterend:clawfern", + "betterend:creeping_moss", + "betterend:crystal_grass", + "betterend:cyan_moss", + "betterend:dense_vine", + "betterend:dragon_tree_leaves", + "betterend:end_lily_seed", + "betterend:end_lotus_seed", + "betterend:filalux", + "betterend:filalux_wings", + "betterend:flamaea", + "betterend:fracturn", + "betterend:globulagus", + "betterend:glowing_pillar_leaves", + "betterend:glowing_pillar_luminophor", + "betterend:glowing_pillar_seed", + "betterend:helix_tree_leaves", + "betterend:hydralux_sapling", + "betterend:jungle_fern", + "betterend:jungle_grass", + "betterend:jungle_vine", + "betterend:lacugrove_leaves", + "betterend:lamellarium", + "betterend:lanceleaf_seed", + "betterend:lucernia_leaves", + "betterend:lucernia_outer_leaves", + "betterend:lumecorn_seed", + "betterend:lutebus", + "betterend:magnula", + "betterend:mossy_glowshroom_fur", + "betterend:murkweed", + "betterend:needlegrass", + "betterend:orango", + "betterend:pond_anemone", + "betterend:pythadendron_leaves", + "betterend:rubinea", + "betterend:ruscus", + "betterend:salteago", + "betterend:shadow_plant", + "betterend:small_amaranita_mushroom", + "betterend:small_jellyshroom", + "betterend:tail_moss", + "betterend:tenanea_flowers", + "betterend:tenanea_leaves", + "betterend:tenanea_outer_leaves", + "betterend:tube_worm", + "betterend:twisted_moss", + "betterend:twisted_umbrella_moss", + "betterend:twisted_umbrella_moss_tall", + "betterend:twisted_vine", + "betterend:umbrella_moss", + "betterend:umbrella_moss_tall", + "betterend:vaiolush_fern", + +UNKNOWN: + "betterend:aurora_crystal", + +MISSING: + "betterend:amber_ore", + "betterend:end_stone_stalactite", + "betterend:end_stone_stalactite_cavemoss", + "betterend:ender_ore", + +NONE: + "betterend:amaranita_hyphae", + "betterend:amaranita_stem", + "betterend:ancient_emerald_ice", + "betterend:cave_bush", + "betterend:cave_pumpkin", + "betterend:dense_emerald_ice", + "betterend:dense_snow", + "betterend:dragon_tree_bark", + "betterend:dragon_tree_barrel", + "betterend:dragon_tree_bookshelf", + "betterend:dragon_tree_button", + "betterend:dragon_tree_chest", + "betterend:dragon_tree_composter", + "betterend:dragon_tree_crafting_table", + "betterend:dragon_tree_door", + "betterend:dragon_tree_fence", + "betterend:dragon_tree_gate", + "betterend:dragon_tree_ladder", + "betterend:dragon_tree_log", + "betterend:dragon_tree_planks", + "betterend:dragon_tree_plate", + "betterend:dragon_tree_sign", + "betterend:dragon_tree_slab", + "betterend:dragon_tree_stairs", + "betterend:dragon_tree_stripped_bark", + "betterend:dragon_tree_stripped_log", + "betterend:dragon_tree_trapdoor", + "betterend:emerald_ice", + "betterend:end_lotus_bark", + "betterend:end_lotus_barrel", + "betterend:end_lotus_bookshelf", + "betterend:end_lotus_button", + "betterend:end_lotus_chest", + "betterend:end_lotus_composter", + "betterend:end_lotus_crafting_table", + "betterend:end_lotus_door", + "betterend:end_lotus_fence", + "betterend:end_lotus_gate", + "betterend:end_lotus_ladder", + "betterend:end_lotus_log", + "betterend:end_lotus_planks", + "betterend:end_lotus_plate", + "betterend:end_lotus_sign", + "betterend:end_lotus_slab", + "betterend:end_lotus_stairs", + "betterend:end_lotus_stem", + "betterend:end_lotus_stripped_bark", + "betterend:end_lotus_stripped_log", + "betterend:end_lotus_trapdoor", + "betterend:helix_tree_bark", + "betterend:helix_tree_barrel", + "betterend:helix_tree_bookshelf", + "betterend:helix_tree_button", + "betterend:helix_tree_chest", + "betterend:helix_tree_composter", + "betterend:helix_tree_crafting_table", + "betterend:helix_tree_door", + "betterend:helix_tree_fence", + "betterend:helix_tree_gate", + "betterend:helix_tree_ladder", + "betterend:helix_tree_log", + "betterend:helix_tree_planks", + "betterend:helix_tree_plate", + "betterend:helix_tree_sign", + "betterend:helix_tree_slab", + "betterend:helix_tree_stairs", + "betterend:helix_tree_stripped_bark", + "betterend:helix_tree_stripped_log", + "betterend:helix_tree_trapdoor", + "betterend:jellyshroom_bark", + "betterend:jellyshroom_barrel", + "betterend:jellyshroom_bookshelf", + "betterend:jellyshroom_button", + "betterend:jellyshroom_cap_purple", + "betterend:jellyshroom_chest", + "betterend:jellyshroom_composter", + "betterend:jellyshroom_crafting_table", + "betterend:jellyshroom_door", + "betterend:jellyshroom_fence", + "betterend:jellyshroom_gate", + "betterend:jellyshroom_ladder", + "betterend:jellyshroom_log", + "betterend:jellyshroom_planks", + "betterend:jellyshroom_plate", + "betterend:jellyshroom_sign", + "betterend:jellyshroom_slab", + "betterend:jellyshroom_stairs", + "betterend:jellyshroom_stripped_bark", + "betterend:jellyshroom_stripped_log", + "betterend:jellyshroom_trapdoor", + "betterend:lacugrove_bark", + "betterend:lacugrove_barrel", + "betterend:lacugrove_bookshelf", + "betterend:lacugrove_button", + "betterend:lacugrove_chest", + "betterend:lacugrove_composter", + "betterend:lacugrove_crafting_table", + "betterend:lacugrove_door", + "betterend:lacugrove_fence", + "betterend:lacugrove_gate", + "betterend:lacugrove_ladder", + "betterend:lacugrove_log", + "betterend:lacugrove_planks", + "betterend:lacugrove_plate", + "betterend:lacugrove_sign", + "betterend:lacugrove_slab", + "betterend:lacugrove_stairs", + "betterend:lacugrove_stripped_bark", + "betterend:lacugrove_stripped_log", + "betterend:lacugrove_trapdoor", + "betterend:lucernia_bark", + "betterend:lucernia_barrel", + "betterend:lucernia_bookshelf", + "betterend:lucernia_button", + "betterend:lucernia_chest", + "betterend:lucernia_composter", + "betterend:lucernia_crafting_table", + "betterend:lucernia_door", + "betterend:lucernia_fence", + "betterend:lucernia_gate", + "betterend:lucernia_ladder", + "betterend:lucernia_log", + "betterend:lucernia_planks", + "betterend:lucernia_plate", + "betterend:lucernia_sign", + "betterend:lucernia_slab", + "betterend:lucernia_stairs", + "betterend:lucernia_stripped_bark", + "betterend:lucernia_stripped_log", + "betterend:lucernia_trapdoor", + "betterend:menger_sponge", + "betterend:menger_sponge_wet", + "betterend:mossy_glowshroom_bark", + "betterend:mossy_glowshroom_barrel", + "betterend:mossy_glowshroom_bookshelf", + "betterend:mossy_glowshroom_button", + "betterend:mossy_glowshroom_chest", + "betterend:mossy_glowshroom_composter", + "betterend:mossy_glowshroom_crafting_table", + "betterend:mossy_glowshroom_door", + "betterend:mossy_glowshroom_fence", + "betterend:mossy_glowshroom_gate", + "betterend:mossy_glowshroom_ladder", + "betterend:mossy_glowshroom_log", + "betterend:mossy_glowshroom_planks", + "betterend:mossy_glowshroom_plate", + "betterend:mossy_glowshroom_sign", + "betterend:mossy_glowshroom_slab", + "betterend:mossy_glowshroom_stairs", + "betterend:mossy_glowshroom_stripped_bark", + "betterend:mossy_glowshroom_stripped_log", + "betterend:mossy_glowshroom_trapdoor", + "betterend:neon_cactus", + "betterend:neon_cactus_block", + "betterend:neon_cactus_slab", + "betterend:neon_cactus_stairs", + "betterend:pythadendron_bark", + "betterend:pythadendron_barrel", + "betterend:pythadendron_bookshelf", + "betterend:pythadendron_button", + "betterend:pythadendron_chest", + "betterend:pythadendron_composter", + "betterend:pythadendron_crafting_table", + "betterend:pythadendron_door", + "betterend:pythadendron_fence", + "betterend:pythadendron_gate", + "betterend:pythadendron_ladder", + "betterend:pythadendron_log", + "betterend:pythadendron_planks", + "betterend:pythadendron_plate", + "betterend:pythadendron_sign", + "betterend:pythadendron_slab", + "betterend:pythadendron_stairs", + "betterend:pythadendron_stripped_bark", + "betterend:pythadendron_stripped_log", + "betterend:pythadendron_trapdoor", + "betterend:silk_moth_nest", + "betterend:tenanea_bark", + "betterend:tenanea_barrel", + "betterend:tenanea_bookshelf", + "betterend:tenanea_button", + "betterend:tenanea_chest", + "betterend:tenanea_composter", + "betterend:tenanea_crafting_table", + "betterend:tenanea_door", + "betterend:tenanea_fence", + "betterend:tenanea_gate", + "betterend:tenanea_ladder", + "betterend:tenanea_log", + "betterend:tenanea_planks", + "betterend:tenanea_plate", + "betterend:tenanea_sign", + "betterend:tenanea_slab", + "betterend:tenanea_stairs", + "betterend:tenanea_stripped_bark", + "betterend:tenanea_stripped_log", + "betterend:tenanea_trapdoor", + "betterend:umbrella_tree_bark", + "betterend:umbrella_tree_barrel", + "betterend:umbrella_tree_bookshelf", + "betterend:umbrella_tree_button", + "betterend:umbrella_tree_chest", + "betterend:umbrella_tree_cluster", + "betterend:umbrella_tree_cluster_empty", + "betterend:umbrella_tree_composter", + "betterend:umbrella_tree_crafting_table", + "betterend:umbrella_tree_door", + "betterend:umbrella_tree_fence", + "betterend:umbrella_tree_gate", + "betterend:umbrella_tree_ladder", + "betterend:umbrella_tree_log", + "betterend:umbrella_tree_membrane", + "betterend:umbrella_tree_planks", + "betterend:umbrella_tree_plate", + "betterend:umbrella_tree_sign", + "betterend:umbrella_tree_slab", + "betterend:umbrella_tree_stairs", + "betterend:umbrella_tree_stripped_bark", + "betterend:umbrella_tree_stripped_log", + "betterend:umbrella_tree_trapdoor", + +PICKAXES: + "betterend:aeternium_anvil", + "betterend:aeternium_block", + "betterend:amber_block", + "betterend:amber_moss", + "betterend:amber_moss_path", + "betterend:andesite_lantern", + "betterend:andesite_pedestal", + "betterend:aurora_crystal", + "betterend:azure_jadestone", + "betterend:azure_jadestone_bricks", + "betterend:azure_jadestone_bricks_slab", + "betterend:azure_jadestone_bricks_stairs", + "betterend:azure_jadestone_bricks_wall", + "betterend:azure_jadestone_button", + "betterend:azure_jadestone_furnace", + "betterend:azure_jadestone_lantern", + "betterend:azure_jadestone_pedestal", + "betterend:azure_jadestone_pillar", + "betterend:azure_jadestone_plate", + "betterend:azure_jadestone_polished", + "betterend:azure_jadestone_slab", + "betterend:azure_jadestone_stairs", + "betterend:azure_jadestone_tiles", + "betterend:azure_jadestone_wall", + "betterend:blackstone_lantern", + "betterend:brimstone", + "betterend:cave_moss", + "betterend:cave_moss_path", + "betterend:charcoal_block", + "betterend:chorus_nylium", + "betterend:chorus_nylium_path", + "betterend:crystal_moss", + "betterend:crystal_moss_path", + "betterend:diorite_lantern", + "betterend:diorite_pedestal", + "betterend:dragon_bone_block", + "betterend:dragon_bone_slab", + "betterend:dragon_bone_stairs", + "betterend:end_moss", + "betterend:end_moss_path", + "betterend:end_mycelium", + "betterend:end_mycelium_path", + "betterend:end_stone_furnace", + "betterend:end_stone_lantern", + "betterend:end_stone_smelter", + "betterend:ender_block", + "betterend:eternal_pedestal", + "betterend:flavolite", + "betterend:flavolite_bricks", + "betterend:flavolite_bricks_slab", + "betterend:flavolite_bricks_stairs", + "betterend:flavolite_bricks_wall", + "betterend:flavolite_button", + "betterend:flavolite_furnace", + "betterend:flavolite_lantern", + "betterend:flavolite_pedestal", + "betterend:flavolite_pillar", + "betterend:flavolite_plate", + "betterend:flavolite_polished", + "betterend:flavolite_runed", + "betterend:flavolite_runed_eternal", + "betterend:flavolite_slab", + "betterend:flavolite_stairs", + "betterend:flavolite_tiles", + "betterend:flavolite_wall", + "betterend:gold_chandelier", + "betterend:granite_lantern", + "betterend:granite_pedestal", + "betterend:hydrothermal_vent", + "betterend:infusion_pedestal", + "betterend:iron_bulb_lantern", + "betterend:iron_bulb_lantern_black", + "betterend:iron_bulb_lantern_blue", + "betterend:iron_bulb_lantern_brown", + "betterend:iron_bulb_lantern_cyan", + "betterend:iron_bulb_lantern_gray", + "betterend:iron_bulb_lantern_green", + "betterend:iron_bulb_lantern_light_blue", + "betterend:iron_bulb_lantern_light_gray", + "betterend:iron_bulb_lantern_lime", + "betterend:iron_bulb_lantern_magenta", + "betterend:iron_bulb_lantern_orange", + "betterend:iron_bulb_lantern_pink", + "betterend:iron_bulb_lantern_purple", + "betterend:iron_bulb_lantern_red", + "betterend:iron_bulb_lantern_white", + "betterend:iron_bulb_lantern_yellow", + "betterend:iron_chandelier", + "betterend:jungle_moss", + "betterend:jungle_moss_path", + "betterend:missing_tile", + "betterend:mossy_dragon_bone", + "betterend:mossy_obsidian", + "betterend:pink_moss", + "betterend:pink_moss_path", + "betterend:purpur_lantern", + "betterend:purpur_pedestal", + "betterend:quartz_lantern", + "betterend:quartz_pedestal", + "betterend:respawn_obelisk", + "betterend:rutiscus", + "betterend:rutiscus_path", + "betterend:sandy_jadestone", + "betterend:sandy_jadestone_bricks", + "betterend:sandy_jadestone_bricks_slab", + "betterend:sandy_jadestone_bricks_stairs", + "betterend:sandy_jadestone_bricks_wall", + "betterend:sandy_jadestone_button", + "betterend:sandy_jadestone_furnace", + "betterend:sandy_jadestone_lantern", + "betterend:sandy_jadestone_pedestal", + "betterend:sandy_jadestone_pillar", + "betterend:sandy_jadestone_plate", + "betterend:sandy_jadestone_polished", + "betterend:sandy_jadestone_slab", + "betterend:sandy_jadestone_stairs", + "betterend:sandy_jadestone_tiles", + "betterend:sandy_jadestone_wall", + "betterend:sangnum", + "betterend:sangnum_path", + "betterend:shadow_grass", + "betterend:shadow_grass_path", + "betterend:smaragdant_crystal", + "betterend:smaragdant_crystal_bricks", + "betterend:smaragdant_crystal_bricks_slab", + "betterend:smaragdant_crystal_bricks_stairs", + "betterend:smaragdant_crystal_bricks_wall", + "betterend:smaragdant_crystal_pedestal", + "betterend:smaragdant_crystal_pillar", + "betterend:smaragdant_crystal_polished", + "betterend:smaragdant_crystal_shard", + "betterend:smaragdant_crystal_slab", + "betterend:smaragdant_crystal_stairs", + "betterend:smaragdant_crystal_tiles", + "betterend:smaragdant_crystal_wall", + "betterend:sulphur_crystal", + "betterend:sulphuric_rock", + "betterend:sulphuric_rock_bricks", + "betterend:sulphuric_rock_bricks_slab", + "betterend:sulphuric_rock_bricks_stairs", + "betterend:sulphuric_rock_bricks_wall", + "betterend:sulphuric_rock_button", + "betterend:sulphuric_rock_furnace", + "betterend:sulphuric_rock_lantern", + "betterend:sulphuric_rock_pedestal", + "betterend:sulphuric_rock_pillar", + "betterend:sulphuric_rock_plate", + "betterend:sulphuric_rock_polished", + "betterend:sulphuric_rock_slab", + "betterend:sulphuric_rock_stairs", + "betterend:sulphuric_rock_tiles", + "betterend:sulphuric_rock_wall", + "betterend:terminite_anvil", + "betterend:terminite_bars", + "betterend:terminite_block", + "betterend:terminite_bulb_lantern", + "betterend:terminite_bulb_lantern_black", + "betterend:terminite_bulb_lantern_blue", + "betterend:terminite_bulb_lantern_brown", + "betterend:terminite_bulb_lantern_cyan", + "betterend:terminite_bulb_lantern_gray", + "betterend:terminite_bulb_lantern_green", + "betterend:terminite_bulb_lantern_light_blue", + "betterend:terminite_bulb_lantern_light_gray", + "betterend:terminite_bulb_lantern_lime", + "betterend:terminite_bulb_lantern_magenta", + "betterend:terminite_bulb_lantern_orange", + "betterend:terminite_bulb_lantern_pink", + "betterend:terminite_bulb_lantern_purple", + "betterend:terminite_bulb_lantern_red", + "betterend:terminite_bulb_lantern_white", + "betterend:terminite_bulb_lantern_yellow", + "betterend:terminite_chain", + "betterend:terminite_chandelier", + "betterend:terminite_door", + "betterend:terminite_plate", + "betterend:terminite_slab", + "betterend:terminite_stairs", + "betterend:terminite_tile", + "betterend:terminite_trapdoor", + "betterend:thallasium_anvil", + "betterend:thallasium_bars", + "betterend:thallasium_block", + "betterend:thallasium_bulb_lantern", + "betterend:thallasium_bulb_lantern_black", + "betterend:thallasium_bulb_lantern_blue", + "betterend:thallasium_bulb_lantern_brown", + "betterend:thallasium_bulb_lantern_cyan", + "betterend:thallasium_bulb_lantern_gray", + "betterend:thallasium_bulb_lantern_green", + "betterend:thallasium_bulb_lantern_light_blue", + "betterend:thallasium_bulb_lantern_light_gray", + "betterend:thallasium_bulb_lantern_lime", + "betterend:thallasium_bulb_lantern_magenta", + "betterend:thallasium_bulb_lantern_orange", + "betterend:thallasium_bulb_lantern_pink", + "betterend:thallasium_bulb_lantern_purple", + "betterend:thallasium_bulb_lantern_red", + "betterend:thallasium_bulb_lantern_white", + "betterend:thallasium_bulb_lantern_yellow", + "betterend:thallasium_chain", + "betterend:thallasium_chandelier", + "betterend:thallasium_door", + "betterend:thallasium_ore", + "betterend:thallasium_plate", + "betterend:thallasium_slab", + "betterend:thallasium_stairs", + "betterend:thallasium_tile", + "betterend:thallasium_trapdoor", + "betterend:violecite", + "betterend:violecite_bricks", + "betterend:violecite_bricks_slab", + "betterend:violecite_bricks_stairs", + "betterend:violecite_bricks_wall", + "betterend:violecite_button", + "betterend:violecite_furnace", + "betterend:violecite_lantern", + "betterend:violecite_pedestal", + "betterend:violecite_pillar", + "betterend:violecite_plate", + "betterend:violecite_polished", + "betterend:violecite_slab", + "betterend:violecite_stairs", + "betterend:violecite_tiles", + "betterend:violecite_wall", + "betterend:virid_jadestone", + "betterend:virid_jadestone_bricks", + "betterend:virid_jadestone_bricks_slab", + "betterend:virid_jadestone_bricks_stairs", + "betterend:virid_jadestone_bricks_wall", + "betterend:virid_jadestone_button", + "betterend:virid_jadestone_furnace", + "betterend:virid_jadestone_lantern", + "betterend:virid_jadestone_pedestal", + "betterend:virid_jadestone_pillar", + "betterend:virid_jadestone_plate", + "betterend:virid_jadestone_polished", + "betterend:virid_jadestone_slab", + "betterend:virid_jadestone_stairs", + "betterend:virid_jadestone_tiles", + "betterend:virid_jadestone_wall", \ No newline at end of file diff --git a/src/main/resources/data/minecraft/tags/blocks/mineable/axe.json b/src/main/resources/data/minecraft/tags/blocks/mineable/axe.json new file mode 100644 index 00000000..538c9e24 --- /dev/null +++ b/src/main/resources/data/minecraft/tags/blocks/mineable/axe.json @@ -0,0 +1,31 @@ +{ + "replace": "false", + "values": [ + "betterend:amaranita_cap", + "betterend:amaranita_hymenophore", + "betterend:amaranita_lantern", + "betterend:aurant_polypore", + "betterend:blue_vine_lantern", + "betterend:filalux_lantern", + "betterend:hydralux_petal_block", + "betterend:hydralux_petal_block_black", + "betterend:hydralux_petal_block_blue", + "betterend:hydralux_petal_block_brown", + "betterend:hydralux_petal_block_cyan", + "betterend:hydralux_petal_block_gray", + "betterend:hydralux_petal_block_green", + "betterend:hydralux_petal_block_light_blue", + "betterend:hydralux_petal_block_light_gray", + "betterend:hydralux_petal_block_lime", + "betterend:hydralux_petal_block_magenta", + "betterend:hydralux_petal_block_orange", + "betterend:hydralux_petal_block_pink", + "betterend:hydralux_petal_block_purple", + "betterend:hydralux_petal_block_red", + "betterend:hydralux_petal_block_white", + "betterend:hydralux_petal_block_yellow", + "betterend:mossy_glowshroom_cap", + "betterend:mossy_glowshroom_hymenophore", + "betterend:purple_polypore" + ] +} \ No newline at end of file diff --git a/src/main/resources/data/minecraft/tags/blocks/mineable/hoe.json b/src/main/resources/data/minecraft/tags/blocks/mineable/hoe.json new file mode 100644 index 00000000..b90eeee2 --- /dev/null +++ b/src/main/resources/data/minecraft/tags/blocks/mineable/hoe.json @@ -0,0 +1,14 @@ +{ + "replace": "false", + "values": [ + "betterend:amber_root_seed", + "betterend:blossom_berry_seed", + "betterend:chorus_mushroom_seed", + "betterend:dragon_tree_leaves", + "betterend:lacugrove_leaves", + "betterend:lucernia_leaves", + "betterend:pythadendron_leaves", + "betterend:shadow_berry", + "betterend:tenanea_leaves" + ] +} \ No newline at end of file diff --git a/src/main/resources/data/minecraft/tags/blocks/mineable/pickaxe.json b/src/main/resources/data/minecraft/tags/blocks/mineable/pickaxe.json new file mode 100644 index 00000000..a6e13734 --- /dev/null +++ b/src/main/resources/data/minecraft/tags/blocks/mineable/pickaxe.json @@ -0,0 +1,251 @@ +{ + "replace": "false", + "values": [ + "betterend:aeternium_anvil", + "betterend:aeternium_block", + "betterend:amber_block", + "betterend:amber_moss", + "betterend:amber_moss_path", + "betterend:andesite_lantern", + "betterend:andesite_pedestal", + "betterend:aurora_crystal", + "betterend:azure_jadestone", + "betterend:azure_jadestone_bricks", + "betterend:azure_jadestone_bricks_slab", + "betterend:azure_jadestone_bricks_stairs", + "betterend:azure_jadestone_bricks_wall", + "betterend:azure_jadestone_button", + "betterend:azure_jadestone_furnace", + "betterend:azure_jadestone_lantern", + "betterend:azure_jadestone_pedestal", + "betterend:azure_jadestone_pillar", + "betterend:azure_jadestone_plate", + "betterend:azure_jadestone_polished", + "betterend:azure_jadestone_slab", + "betterend:azure_jadestone_stairs", + "betterend:azure_jadestone_tiles", + "betterend:azure_jadestone_wall", + "betterend:blackstone_lantern", + "betterend:brimstone", + "betterend:cave_moss", + "betterend:cave_moss_path", + "betterend:charcoal_block", + "betterend:chorus_nylium", + "betterend:chorus_nylium_path", + "betterend:crystal_moss", + "betterend:crystal_moss_path", + "betterend:diorite_lantern", + "betterend:diorite_pedestal", + "betterend:dragon_bone_block", + "betterend:dragon_bone_slab", + "betterend:dragon_bone_stairs", + "betterend:end_moss", + "betterend:end_moss_path", + "betterend:end_mycelium", + "betterend:end_mycelium_path", + "betterend:end_stone_furnace", + "betterend:end_stone_lantern", + "betterend:end_stone_smelter", + "betterend:ender_block", + "betterend:eternal_pedestal", + "betterend:flavolite", + "betterend:flavolite_bricks", + "betterend:flavolite_bricks_slab", + "betterend:flavolite_bricks_stairs", + "betterend:flavolite_bricks_wall", + "betterend:flavolite_button", + "betterend:flavolite_furnace", + "betterend:flavolite_lantern", + "betterend:flavolite_pedestal", + "betterend:flavolite_pillar", + "betterend:flavolite_plate", + "betterend:flavolite_polished", + "betterend:flavolite_runed", + "betterend:flavolite_runed_eternal", + "betterend:flavolite_slab", + "betterend:flavolite_stairs", + "betterend:flavolite_tiles", + "betterend:flavolite_wall", + "betterend:gold_chandelier", + "betterend:granite_lantern", + "betterend:granite_pedestal", + "betterend:hydrothermal_vent", + "betterend:infusion_pedestal", + "betterend:iron_bulb_lantern", + "betterend:iron_bulb_lantern_black", + "betterend:iron_bulb_lantern_blue", + "betterend:iron_bulb_lantern_brown", + "betterend:iron_bulb_lantern_cyan", + "betterend:iron_bulb_lantern_gray", + "betterend:iron_bulb_lantern_green", + "betterend:iron_bulb_lantern_light_blue", + "betterend:iron_bulb_lantern_light_gray", + "betterend:iron_bulb_lantern_lime", + "betterend:iron_bulb_lantern_magenta", + "betterend:iron_bulb_lantern_orange", + "betterend:iron_bulb_lantern_pink", + "betterend:iron_bulb_lantern_purple", + "betterend:iron_bulb_lantern_red", + "betterend:iron_bulb_lantern_white", + "betterend:iron_bulb_lantern_yellow", + "betterend:iron_chandelier", + "betterend:jungle_moss", + "betterend:jungle_moss_path", + "betterend:missing_tile", + "betterend:mossy_dragon_bone", + "betterend:mossy_obsidian", + "betterend:pink_moss", + "betterend:pink_moss_path", + "betterend:purpur_lantern", + "betterend:purpur_pedestal", + "betterend:quartz_lantern", + "betterend:quartz_pedestal", + "betterend:respawn_obelisk", + "betterend:rutiscus", + "betterend:rutiscus_path", + "betterend:sandy_jadestone", + "betterend:sandy_jadestone_bricks", + "betterend:sandy_jadestone_bricks_slab", + "betterend:sandy_jadestone_bricks_stairs", + "betterend:sandy_jadestone_bricks_wall", + "betterend:sandy_jadestone_button", + "betterend:sandy_jadestone_furnace", + "betterend:sandy_jadestone_lantern", + "betterend:sandy_jadestone_pedestal", + "betterend:sandy_jadestone_pillar", + "betterend:sandy_jadestone_plate", + "betterend:sandy_jadestone_polished", + "betterend:sandy_jadestone_slab", + "betterend:sandy_jadestone_stairs", + "betterend:sandy_jadestone_tiles", + "betterend:sandy_jadestone_wall", + "betterend:sangnum", + "betterend:sangnum_path", + "betterend:shadow_grass", + "betterend:shadow_grass_path", + "betterend:smaragdant_crystal", + "betterend:smaragdant_crystal_bricks", + "betterend:smaragdant_crystal_bricks_slab", + "betterend:smaragdant_crystal_bricks_stairs", + "betterend:smaragdant_crystal_bricks_wall", + "betterend:smaragdant_crystal_pedestal", + "betterend:smaragdant_crystal_pillar", + "betterend:smaragdant_crystal_polished", + "betterend:smaragdant_crystal_shard", + "betterend:smaragdant_crystal_slab", + "betterend:smaragdant_crystal_stairs", + "betterend:smaragdant_crystal_tiles", + "betterend:smaragdant_crystal_wall", + "betterend:sulphur_crystal", + "betterend:sulphuric_rock", + "betterend:sulphuric_rock_bricks", + "betterend:sulphuric_rock_bricks_slab", + "betterend:sulphuric_rock_bricks_stairs", + "betterend:sulphuric_rock_bricks_wall", + "betterend:sulphuric_rock_button", + "betterend:sulphuric_rock_furnace", + "betterend:sulphuric_rock_lantern", + "betterend:sulphuric_rock_pedestal", + "betterend:sulphuric_rock_pillar", + "betterend:sulphuric_rock_plate", + "betterend:sulphuric_rock_polished", + "betterend:sulphuric_rock_slab", + "betterend:sulphuric_rock_stairs", + "betterend:sulphuric_rock_tiles", + "betterend:sulphuric_rock_wall", + "betterend:terminite_anvil", + "betterend:terminite_bars", + "betterend:terminite_block", + "betterend:terminite_bulb_lantern", + "betterend:terminite_bulb_lantern_black", + "betterend:terminite_bulb_lantern_blue", + "betterend:terminite_bulb_lantern_brown", + "betterend:terminite_bulb_lantern_cyan", + "betterend:terminite_bulb_lantern_gray", + "betterend:terminite_bulb_lantern_green", + "betterend:terminite_bulb_lantern_light_blue", + "betterend:terminite_bulb_lantern_light_gray", + "betterend:terminite_bulb_lantern_lime", + "betterend:terminite_bulb_lantern_magenta", + "betterend:terminite_bulb_lantern_orange", + "betterend:terminite_bulb_lantern_pink", + "betterend:terminite_bulb_lantern_purple", + "betterend:terminite_bulb_lantern_red", + "betterend:terminite_bulb_lantern_white", + "betterend:terminite_bulb_lantern_yellow", + "betterend:terminite_chain", + "betterend:terminite_chandelier", + "betterend:terminite_door", + "betterend:terminite_plate", + "betterend:terminite_slab", + "betterend:terminite_stairs", + "betterend:terminite_tile", + "betterend:terminite_trapdoor", + "betterend:thallasium_anvil", + "betterend:thallasium_bars", + "betterend:thallasium_block", + "betterend:thallasium_bulb_lantern", + "betterend:thallasium_bulb_lantern_black", + "betterend:thallasium_bulb_lantern_blue", + "betterend:thallasium_bulb_lantern_brown", + "betterend:thallasium_bulb_lantern_cyan", + "betterend:thallasium_bulb_lantern_gray", + "betterend:thallasium_bulb_lantern_green", + "betterend:thallasium_bulb_lantern_light_blue", + "betterend:thallasium_bulb_lantern_light_gray", + "betterend:thallasium_bulb_lantern_lime", + "betterend:thallasium_bulb_lantern_magenta", + "betterend:thallasium_bulb_lantern_orange", + "betterend:thallasium_bulb_lantern_pink", + "betterend:thallasium_bulb_lantern_purple", + "betterend:thallasium_bulb_lantern_red", + "betterend:thallasium_bulb_lantern_white", + "betterend:thallasium_bulb_lantern_yellow", + "betterend:thallasium_chain", + "betterend:thallasium_chandelier", + "betterend:thallasium_door", + "betterend:thallasium_ore", + "betterend:thallasium_plate", + "betterend:thallasium_slab", + "betterend:thallasium_stairs", + "betterend:thallasium_tile", + "betterend:thallasium_trapdoor", + "betterend:violecite", + "betterend:violecite_bricks", + "betterend:violecite_bricks_slab", + "betterend:violecite_bricks_stairs", + "betterend:violecite_bricks_wall", + "betterend:violecite_button", + "betterend:violecite_furnace", + "betterend:violecite_lantern", + "betterend:violecite_pedestal", + "betterend:violecite_pillar", + "betterend:violecite_plate", + "betterend:violecite_polished", + "betterend:violecite_slab", + "betterend:violecite_stairs", + "betterend:violecite_tiles", + "betterend:violecite_wall", + "betterend:virid_jadestone", + "betterend:virid_jadestone_bricks", + "betterend:virid_jadestone_bricks_slab", + "betterend:virid_jadestone_bricks_stairs", + "betterend:virid_jadestone_bricks_wall", + "betterend:virid_jadestone_button", + "betterend:virid_jadestone_furnace", + "betterend:virid_jadestone_lantern", + "betterend:virid_jadestone_pedestal", + "betterend:virid_jadestone_pillar", + "betterend:virid_jadestone_plate", + "betterend:virid_jadestone_polished", + "betterend:virid_jadestone_slab", + "betterend:virid_jadestone_stairs", + "betterend:virid_jadestone_tiles", + "betterend:virid_jadestone_wall", + + "betterend:amber_ore", + "betterend:end_stone_stalactite", + "betterend:end_stone_stalactite_cavemoss", + "betterend:ender_ore" + ] +} \ No newline at end of file diff --git a/src/main/resources/data/minecraft/tags/blocks/mineable/shovel.json b/src/main/resources/data/minecraft/tags/blocks/mineable/shovel.json new file mode 100644 index 00000000..31f7636d --- /dev/null +++ b/src/main/resources/data/minecraft/tags/blocks/mineable/shovel.json @@ -0,0 +1,6 @@ +{ + "replace": "false", + "values": [ + "betterend:endstone_dust" + ] +} \ No newline at end of file From 885a72486d5f480dd88bd84f09fad80c0f22fe25 Mon Sep 17 00:00:00 2001 From: Frank Bauer Date: Wed, 7 Jul 2021 13:39:33 +0200 Subject: [PATCH 073/595] Updated Versions for 1.17.1 --- gradle.properties | 9 +++++---- src/main/resources/fabric.mod.json | 8 ++++---- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/gradle.properties b/gradle.properties index cc05f040..61345e6d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,18 +3,19 @@ org.gradle.jvmargs=-Xmx2G # Fabric Properties # check these on https://fabricmc.net/use -minecraft_version= 1.17 +minecraft_version= 1.17.1 yarn_mappings= 6 loader_version= 0.11.6 # Mod Properties -mod_version = 0.9.8.5-pre +mod_version = 0.10.0-pre maven_group = ru.betterend archives_base_name = better-end # Dependencies # currently not on the main fabric site, check on the maven: https://maven.fabricmc.net/net/fabricmc/fabric-api/fabric-api patchouli_version = 55-FABRIC-SNAPSHOT -fabric_version = 0.36.0+1.17 +fabric_version = 0.36.1+1.17 canvas_version = 1.0.+ -rei_version = 6.0.260-alpha \ No newline at end of file +bclib_version = 0.2.0 +rei_version = 6.0.262-alpha \ No newline at end of file diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index adb47c1c..d19705e1 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -41,10 +41,10 @@ ], "depends": { - "fabricloader": ">=0.11.0", - "fabric": ">=0.32.0", - "minecraft": ">=1.16.4", - "bclib": ">=0.1.42" + "fabricloader": ">=0.11.6", + "fabric": ">=0.36.0", + "minecraft": ">=1.17", + "bclib": ">=0.2.0" }, "suggests": { "byg": ">=1.1.3", From 18bc3a96646f7af7df745797b4f0bca2390d2e49 Mon Sep 17 00:00:00 2001 From: Frank Bauer Date: Wed, 7 Jul 2021 13:49:27 +0200 Subject: [PATCH 074/595] Fixes for 1.17.1 --- .../client/gui/EndStoneSmelterScreen.java | 4 +-- .../mixin/common/PlayerListMixin.java | 28 ++++++++++--------- 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/src/main/java/ru/betterend/client/gui/EndStoneSmelterScreen.java b/src/main/java/ru/betterend/client/gui/EndStoneSmelterScreen.java index a7f66c33..14ed9b49 100644 --- a/src/main/java/ru/betterend/client/gui/EndStoneSmelterScreen.java +++ b/src/main/java/ru/betterend/client/gui/EndStoneSmelterScreen.java @@ -46,8 +46,8 @@ public class EndStoneSmelterScreen extends AbstractContainerScreen gameProfile2 = userCache.get(gameProfile.getId()); + String string = gameProfile2.isPresent() ? gameProfile2.get().getName() : gameProfile.getName(); userCache.add(gameProfile); CompoundTag compoundTag = this.load(serverPlayer); ResourceKey var23; From 5a7a00ddd5e1ad45de136460f0e0357623fd5772 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Wed, 7 Jul 2021 22:04:38 +0300 Subject: [PATCH 075/595] Pickaxe mining speed fixes --- .../blocks/complex/MetalMaterial.java | 3 ++- .../ru/betterend/item/tool/EndPickaxe.java | 21 +++++++++++++++++++ .../java/ru/betterend/registry/EndItems.java | 3 ++- 3 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 src/main/java/ru/betterend/item/tool/EndPickaxe.java diff --git a/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java b/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java index 4f5577bd..92c45505 100644 --- a/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java +++ b/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java @@ -41,6 +41,7 @@ import ru.betterend.config.Configs; import ru.betterend.item.EndAnvilItem; import ru.betterend.item.EndArmorItem; import ru.betterend.item.tool.EndHammerItem; +import ru.betterend.item.tool.EndPickaxe; import ru.betterend.recipe.builders.AlloyingRecipe; import ru.betterend.recipe.builders.AnvilRecipe; import ru.betterend.registry.EndBlocks; @@ -136,7 +137,7 @@ public class MetalMaterial { shovel = EndItems.registerEndTool(name + "_shovel", new BaseShovelItem(material, 1.5F, -3.0F, itemSettings)); sword = EndItems.registerEndTool(name + "_sword", new BaseSwordItem(material, 3, -2.4F, itemSettings)); - pickaxe = EndItems.registerEndTool(name + "_pickaxe", new BasePickaxeItem(material, 1, -2.8F, itemSettings)); + pickaxe = EndItems.registerEndTool(name + "_pickaxe", new EndPickaxe(material, 1, -2.8F, itemSettings)); axe = EndItems.registerEndTool(name + "_axe", new BaseAxeItem(material, 6.0F, -3.0F, itemSettings)); hoe = EndItems.registerEndTool(name + "_hoe", new BaseHoeItem(material, -3, 0.0F, itemSettings)); hammer = EndItems.registerEndTool(name + "_hammer", new EndHammerItem(material, 5.0F, -3.2F, 0.3D, itemSettings)); diff --git a/src/main/java/ru/betterend/item/tool/EndPickaxe.java b/src/main/java/ru/betterend/item/tool/EndPickaxe.java new file mode 100644 index 00000000..bf8494fa --- /dev/null +++ b/src/main/java/ru/betterend/item/tool/EndPickaxe.java @@ -0,0 +1,21 @@ +package ru.betterend.item.tool; + +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Tier; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import ru.bclib.items.tool.BasePickaxeItem; + +public class EndPickaxe extends BasePickaxeItem { + public EndPickaxe(Tier material, int attackDamage, float attackSpeed, Properties settings) { + super(material, attackDamage, attackSpeed, settings); + } + + @Override + public float getDestroySpeed(ItemStack stack, BlockState state) { + if (state.is(Blocks.END_STONE) && this.getTier().getLevel() > 2) { + return this.speed * 3; + } + return super.getDestroySpeed(stack, state); + } +} diff --git a/src/main/java/ru/betterend/registry/EndItems.java b/src/main/java/ru/betterend/registry/EndItems.java index e302d163..c3696b29 100644 --- a/src/main/java/ru/betterend/registry/EndItems.java +++ b/src/main/java/ru/betterend/registry/EndItems.java @@ -41,6 +41,7 @@ import ru.betterend.item.EternalCrystalItem; import ru.betterend.item.material.EndArmorMaterial; import ru.betterend.item.material.EndToolMaterial; import ru.betterend.item.tool.EndHammerItem; +import ru.betterend.item.tool.EndPickaxe; import ru.betterend.tab.CreativeTabs; public class EndItems extends ItemsRegistry { @@ -88,7 +89,7 @@ public class EndItems extends ItemsRegistry { // Tools // public static final TieredItem AETERNIUM_SHOVEL = registerEndTool("aeternium_shovel", new BaseShovelItem(EndToolMaterial.AETERNIUM, 1.5F, -3.0F, makeEndItemSettings().fireResistant())); public static final TieredItem AETERNIUM_SWORD = registerEndTool("aeternium_sword", new BaseSwordItem(EndToolMaterial.AETERNIUM, 3, -2.4F, makeEndItemSettings().fireResistant())); - public static final TieredItem AETERNIUM_PICKAXE = registerEndTool("aeternium_pickaxe", new BasePickaxeItem(EndToolMaterial.AETERNIUM, 1, -2.8F, makeEndItemSettings().fireResistant())); + public static final TieredItem AETERNIUM_PICKAXE = registerEndTool("aeternium_pickaxe", new EndPickaxe(EndToolMaterial.AETERNIUM, 1, -2.8F, makeEndItemSettings().fireResistant())); public static final TieredItem AETERNIUM_AXE = registerEndTool("aeternium_axe", new BaseAxeItem(EndToolMaterial.AETERNIUM, 5.0F, -3.0F, makeEndItemSettings().fireResistant())); public static final TieredItem AETERNIUM_HOE = registerEndTool("aeternium_hoe", new BaseHoeItem(EndToolMaterial.AETERNIUM, -3, 0.0F, makeEndItemSettings().fireResistant())); public static final TieredItem AETERNIUM_HAMMER = registerEndTool("aeternium_hammer", new EndHammerItem(EndToolMaterial.AETERNIUM, 6.0F, -3.0F, 0.3D, makeEndItemSettings().fireResistant())); From 2591cb1555b3471af47b86995f04edf26d2521ea Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Wed, 7 Jul 2021 22:27:09 +0300 Subject: [PATCH 076/595] Fast lakes fix --- src/main/java/ru/betterend/registry/EndFeatures.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/ru/betterend/registry/EndFeatures.java b/src/main/java/ru/betterend/registry/EndFeatures.java index 73168e37..453a6449 100644 --- a/src/main/java/ru/betterend/registry/EndFeatures.java +++ b/src/main/java/ru/betterend/registry/EndFeatures.java @@ -252,7 +252,8 @@ public class EndFeatures { } private static BCLFeature registerLake(String name, Feature feature, int chance) { - return BCLFeature.makeLakeFeature(BetterEnd.makeID(name), feature, chance); + //return BCLFeature.makeLakeFeature(BetterEnd.makeID(name), feature, chance); + return BCLFeature.makeRawGenFeature(BetterEnd.makeID(name), feature, chance); } private static BCLFeature registerChanced(String name, Feature feature, int chance) { From 43e127bf753a40ed4c53f893c9c28aa4402d5972 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Wed, 7 Jul 2021 22:56:14 +0300 Subject: [PATCH 077/595] New ores recipes & smelter light fix --- .../ru/betterend/blocks/AuroraCrystalBlock.java | 3 ++- .../ru/betterend/blocks/EndStoneSmelter.java | 5 ++--- .../betterend/blocks/complex/MetalMaterial.java | 3 ++- .../ru/betterend/item/tool/EndHammerItem.java | 5 +++-- .../ru/betterend/recipe/AlloyingRecipes.java | 12 ++++++++++-- .../betterend/recipe/builders/AnvilRecipe.java | 5 +++-- .../java/ru/betterend/registry/EndTags.java | 17 +++++++++++------ 7 files changed, 33 insertions(+), 17 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/AuroraCrystalBlock.java b/src/main/java/ru/betterend/blocks/AuroraCrystalBlock.java index 22473aa7..1d8a2e8e 100644 --- a/src/main/java/ru/betterend/blocks/AuroraCrystalBlock.java +++ b/src/main/java/ru/betterend/blocks/AuroraCrystalBlock.java @@ -20,6 +20,7 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.material.Material; import net.minecraft.world.level.storage.loot.LootContext; import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import ru.bclib.api.TagAPI; import ru.bclib.client.render.BCLRenderLayer; import ru.bclib.interfaces.IColorProvider; import ru.bclib.interfaces.IRenderTyped; @@ -36,7 +37,7 @@ public class AuroraCrystalBlock extends AbstractGlassBlock implements IRenderTyp public AuroraCrystalBlock() { super(FabricBlockSettings.of(Material.GLASS) .breakByTool(FabricToolTags.PICKAXES) - .breakByTool(EndTags.HAMMERS) + .breakByTool(TagAPI.HAMMERS) .hardness(1F) .resistance(1F) .luminance(15) diff --git a/src/main/java/ru/betterend/blocks/EndStoneSmelter.java b/src/main/java/ru/betterend/blocks/EndStoneSmelter.java index 8a0b9b0d..071fba3e 100644 --- a/src/main/java/ru/betterend/blocks/EndStoneSmelter.java +++ b/src/main/java/ru/betterend/blocks/EndStoneSmelter.java @@ -45,13 +45,12 @@ public class EndStoneSmelter extends BaseBlockWithEntity { public EndStoneSmelter() { super(FabricBlockSettings.of(Material.STONE, MaterialColor.COLOR_GRAY) + .luminance(state -> state.getValue(LIT) ? 15 : 0) .hardness(4F) .resistance(100F) .requiresCorrectToolForDrops() .sound(SoundType.STONE)); - registerDefaultState(this.stateDefinition.any() - .setValue(FACING, Direction.NORTH) - .setValue(LIT, false)); + registerDefaultState(this.stateDefinition.any().setValue(FACING, Direction.NORTH).setValue(LIT, false)); } public InteractionResult use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) { diff --git a/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java b/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java index 92c45505..1fdb2f5f 100644 --- a/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java +++ b/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java @@ -14,6 +14,7 @@ import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.SoundType; import net.minecraft.world.level.block.state.BlockBehaviour; import net.minecraft.world.level.material.MaterialColor; +import ru.bclib.api.TagAPI; import ru.bclib.blocks.BaseBlock; import ru.bclib.blocks.BaseChainBlock; import ru.bclib.blocks.BaseDoorBlock; @@ -213,6 +214,6 @@ public class MetalMaterial { TagHelper.addTag(BlockTags.ANVIL, anvilBlock); TagHelper.addTag(BlockTags.BEACON_BASE_BLOCKS, block); TagHelper.addTag(ItemTags.BEACON_PAYMENT_ITEMS, ingot); - TagHelper.addTag(EndTags.DRAGON_IMMUNE, ore, bars); + TagHelper.addTag(TagAPI.DRAGON_IMMUNE, ore, bars); } } \ No newline at end of file diff --git a/src/main/java/ru/betterend/item/tool/EndHammerItem.java b/src/main/java/ru/betterend/item/tool/EndHammerItem.java index 93e21ace..9ec7c149 100644 --- a/src/main/java/ru/betterend/item/tool/EndHammerItem.java +++ b/src/main/java/ru/betterend/item/tool/EndHammerItem.java @@ -31,6 +31,7 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.material.Material; +import ru.bclib.api.TagAPI; import ru.bclib.client.models.ItemModelProvider; import ru.bclib.client.models.ModelsHelper; import ru.betterend.registry.EndTags; @@ -96,7 +97,7 @@ public class EndHammerItem extends DiggerItem implements DynamicAttributeTool, I @Override public float getMiningSpeedMultiplier(Tag tag, BlockState state, ItemStack stack, LivingEntity user) { - if (tag.equals(EndTags.HAMMERS)) { + if (tag.equals(TagAPI.HAMMERS)) { return this.getDestroySpeed(stack, state); } return 1.0F; @@ -104,7 +105,7 @@ public class EndHammerItem extends DiggerItem implements DynamicAttributeTool, I @Override public int getMiningLevel(Tag tag, BlockState state, ItemStack stack, LivingEntity user) { - if (tag.equals(EndTags.HAMMERS)) { + if (tag.equals(TagAPI.HAMMERS)) { return this.getTier().getLevel(); } return 0; diff --git a/src/main/java/ru/betterend/recipe/AlloyingRecipes.java b/src/main/java/ru/betterend/recipe/AlloyingRecipes.java index 9d6dfc88..404a8aa4 100644 --- a/src/main/java/ru/betterend/recipe/AlloyingRecipes.java +++ b/src/main/java/ru/betterend/recipe/AlloyingRecipes.java @@ -1,23 +1,31 @@ package ru.betterend.recipe; +import net.minecraft.tags.ItemTags; import net.minecraft.world.item.Items; +import net.minecraft.world.level.ItemLike; import net.minecraft.world.level.block.Blocks; import ru.betterend.recipe.builders.AlloyingRecipe; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndItems; +import ru.betterend.registry.EndTags; public class AlloyingRecipes { public static void register() { AlloyingRecipe.Builder.create("additional_iron") - .setInput(Blocks.IRON_ORE, Blocks.IRON_ORE) + .setInput(EndTags.ALLOYING_IRON, EndTags.ALLOYING_IRON) .setOutput(Items.IRON_INGOT, 3) .setExpiriense(2.1F) .build(); AlloyingRecipe.Builder.create("additional_gold") - .setInput(Blocks.GOLD_ORE, Blocks.GOLD_ORE) + .setInput(EndTags.ALLOYING_GOLD, EndTags.ALLOYING_GOLD) .setOutput(Items.GOLD_INGOT, 3) .setExpiriense(3F) .build(); + AlloyingRecipe.Builder.create("additional_gold") + .setInput(EndTags.ALLOYING_COPPER, EndTags.ALLOYING_COPPER) + .setOutput(Items.COPPER_INGOT, 3) + .setExpiriense(3F) + .build(); AlloyingRecipe.Builder.create("additional_netherite") .setInput(Blocks.ANCIENT_DEBRIS, Blocks.ANCIENT_DEBRIS) .setOutput(Items.NETHERITE_SCRAP, 3) diff --git a/src/main/java/ru/betterend/recipe/builders/AnvilRecipe.java b/src/main/java/ru/betterend/recipe/builders/AnvilRecipe.java index 0bee9b39..887e5d6a 100644 --- a/src/main/java/ru/betterend/recipe/builders/AnvilRecipe.java +++ b/src/main/java/ru/betterend/recipe/builders/AnvilRecipe.java @@ -26,6 +26,7 @@ import net.minecraft.world.item.crafting.RecipeSerializer; import net.minecraft.world.item.crafting.RecipeType; import net.minecraft.world.level.ItemLike; import net.minecraft.world.level.Level; +import ru.bclib.api.TagAPI; import ru.bclib.recipes.BCLRecipeManager; import ru.betterend.BetterEnd; import ru.betterend.config.Configs; @@ -98,7 +99,7 @@ public class AnvilRecipe implements Recipe, BetterEndRecipe { public boolean matches(Container craftingInventory) { ItemStack hammer = craftingInventory.getItem(1); - if (hammer.isEmpty() || !EndTags.HAMMERS.contains(hammer.getItem())) { + if (hammer.isEmpty() || !TagAPI.HAMMERS.contains(hammer.getItem())) { return false; } ItemStack material = craftingInventory.getItem(0); @@ -124,7 +125,7 @@ public class AnvilRecipe implements Recipe, BetterEndRecipe { @Override public NonNullList getIngredients() { NonNullList defaultedList = NonNullList.create(); - defaultedList.add(Ingredient.of(EndTags.HAMMERS.getValues().stream().filter(hammer -> + defaultedList.add(Ingredient.of(TagAPI.HAMMERS.getValues().stream().filter(hammer -> ((TieredItem) hammer).getTier().getLevel() >= toolLevel).map(ItemStack::new))); defaultedList.add(input); diff --git a/src/main/java/ru/betterend/registry/EndTags.java b/src/main/java/ru/betterend/registry/EndTags.java index bcae1aff..d3a9a6dc 100644 --- a/src/main/java/ru/betterend/registry/EndTags.java +++ b/src/main/java/ru/betterend/registry/EndTags.java @@ -11,6 +11,7 @@ import net.minecraft.tags.ItemTags; import net.minecraft.tags.Tag; import net.minecraft.world.food.FoodProperties; import net.minecraft.world.item.Item; +import net.minecraft.world.item.Items; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.biome.Biome.BiomeCategory; import net.minecraft.world.level.block.Block; @@ -35,10 +36,10 @@ public class EndTags { // Block Tags public static final Tag.Named PEDESTALS = TagAPI.makeBlockTag(BetterEnd.MOD_ID, "pedestal"); public static final Tag.Named END_STONES = TagAPI.makeCommonBlockTag("end_stones"); - public static final Tag.Named DRAGON_IMMUNE = TagAPI.getMCBlockTag("dragon_immune"); - - // Item Tags - public final static Tag.Named HAMMERS = TagAPI.makeItemTag("fabric", "hammers"); + + public static final Tag.Named ALLOYING_IRON = TagAPI.makeItemTag(BetterEnd.MOD_ID, "alloying_iron"); + public static final Tag.Named ALLOYING_GOLD = TagAPI.makeItemTag(BetterEnd.MOD_ID, "alloying_gold"); + public static final Tag.Named ALLOYING_COPPER = TagAPI.makeItemTag(BetterEnd.MOD_ID, "alloying_copper"); public static void register() { TagAPI.addEndGround(EndBlocks.THALLASIUM.ore); @@ -84,7 +85,7 @@ public class EndTags { hammers.add(item); } }); - ToolManagerImpl.tag(HAMMERS).register(new ModdedToolsVanillaBlocksToolHandler(hammers)); + ToolManagerImpl.tag(TagAPI.HAMMERS).register(new ModdedToolsVanillaBlocksToolHandler(hammers)); TagHelper.addTag( TagAPI.GEN_TERRAIN, @@ -101,13 +102,17 @@ public class EndTags { TagHelper.addTag(BlockTags.ANVIL, EndBlocks.AETERNIUM_ANVIL); TagHelper.addTag(BlockTags.BEACON_BASE_BLOCKS, EndBlocks.AETERNIUM_BLOCK); TagHelper.addTag(ItemTags.BEACON_PAYMENT_ITEMS, EndItems.AETERNIUM_INGOT); - TagHelper.addTag(EndTags.DRAGON_IMMUNE, + TagHelper.addTag(TagAPI.DRAGON_IMMUNE, EndBlocks.ENDER_ORE, EndBlocks.ETERNAL_PEDESTAL, EndBlocks.FLAVOLITE_RUNED_ETERNAL, EndBlocks.FLAVOLITE_RUNED ); TagHelper.addTag(TagAPI.IRON_INGOTS, EndBlocks.THALLASIUM.ingot); + + TagHelper.addTag(ALLOYING_IRON, Items.IRON_ORE, Items.DEEPSLATE_IRON_ORE, Items.RAW_IRON); + TagHelper.addTag(ALLOYING_GOLD, Items.GOLD_ORE, Items.DEEPSLATE_GOLD_ORE, Items.RAW_GOLD); + TagHelper.addTag(ALLOYING_COPPER, Items.COPPER_ORE, Items.DEEPSLATE_COPPER_ORE, Items.RAW_COPPER); } public static void addTerrainTags(Registry biomeRegistry) { From 2d93ac3853fe71902b1dc966072ed1b4c6b4d504 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Wed, 7 Jul 2021 23:05:37 +0300 Subject: [PATCH 078/595] Ore generation tweaks --- src/main/java/ru/betterend/registry/EndFeatures.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/main/java/ru/betterend/registry/EndFeatures.java b/src/main/java/ru/betterend/registry/EndFeatures.java index 453a6449..f81838e9 100644 --- a/src/main/java/ru/betterend/registry/EndFeatures.java +++ b/src/main/java/ru/betterend/registry/EndFeatures.java @@ -215,9 +215,9 @@ public class EndFeatures { public static final BCLFeature TUNEL_CAVE = BCLFeature.makeChunkFeature(BetterEnd.makeID("tunel_cave"), new TunelCaveFeature()); // Ores // - public static final BCLFeature THALLASIUM_ORE = registerOre("thallasium_ore", EndBlocks.THALLASIUM.ore, 12, 6, 0, 16, 128); - public static final BCLFeature ENDER_ORE = registerOre("ender_ore", EndBlocks.ENDER_ORE, 8, 3, 0, 16, 128); - public static final BCLFeature AMBER_ORE = registerOre("amber_ore", EndBlocks.AMBER_ORE, 12, 6, 0, 16, 128); + public static final BCLFeature THALLASIUM_ORE = registerOre("thallasium_ore", EndBlocks.THALLASIUM.ore, 32, 12, 0, 5, 128); + public static final BCLFeature ENDER_ORE = registerOre("ender_ore", EndBlocks.ENDER_ORE, 16, 4, 0, 5, 128); + public static final BCLFeature AMBER_ORE = registerOre("amber_ore", EndBlocks.AMBER_ORE, 24, 6, 0, 5, 128); public static final BCLFeature VIOLECITE_LAYER = registerLayer("violecite_layer", EndBlocks.VIOLECITE, 15, 16, 128, 8); public static final BCLFeature FLAVOLITE_LAYER = registerLayer("flavolite_layer", EndBlocks.FLAVOLITE, 12, 16, 128, 6); @@ -241,8 +241,6 @@ public class EndFeatures { public static final DefaultFeature END_STONE_STALAGMITE_CAVEMOSS = new StalactiteFeature(false, EndBlocks.END_STONE_STALACTITE_CAVEMOSS, EndBlocks.CAVE_MOSS); public static final DefaultFeature CAVE_PUMPKIN = new CavePumpkinFeature(); - - private static BCLFeature redisterVegetation(String name, Feature feature, int density) { return BCLFeature.makeVegetationFeature(BetterEnd.makeID(name), feature, density); } From 9d604b2d25b065d80dcddea1e8cff60f2a289b7e Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Wed, 7 Jul 2021 23:27:32 +0300 Subject: [PATCH 079/595] Raw thallasium, more ore tweaks --- .../blocks/complex/MetalMaterial.java | 20 ++++++++++++++---- .../ru/betterend/registry/EndFeatures.java | 4 ++-- .../assets/betterend/lang/en_us.json | 1 + .../assets/betterend/lang/ru_ru.json | 1 + .../textures/item/thallasium_raw.png | Bin 0 -> 254 bytes 5 files changed, 20 insertions(+), 6 deletions(-) create mode 100644 src/main/resources/assets/betterend/textures/item/thallasium_raw.png diff --git a/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java b/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java index 1fdb2f5f..d9526eb9 100644 --- a/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java +++ b/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java @@ -3,6 +3,7 @@ package ru.betterend.blocks.complex; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.tags.BlockTags; import net.minecraft.tags.ItemTags; +import net.minecraft.tags.Tag; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.item.ArmorMaterial; import net.minecraft.world.item.Item; @@ -19,6 +20,7 @@ import ru.bclib.blocks.BaseBlock; import ru.bclib.blocks.BaseChainBlock; import ru.bclib.blocks.BaseDoorBlock; import ru.bclib.blocks.BaseMetalBarsBlock; +import ru.bclib.blocks.BaseOreBlock; import ru.bclib.blocks.BaseSlabBlock; import ru.bclib.blocks.BaseStairsBlock; import ru.bclib.blocks.BaseTrapdoorBlock; @@ -68,6 +70,7 @@ public class MetalMaterial { public final Block anvilBlock; public final Item anvilItem; + public final Item rawOre; public final Item nugget; public final Item ingot; @@ -90,6 +93,8 @@ public class MetalMaterial { public final Item chestplate; public final Item leggings; public final Item boots; + + public final Tag.Named alloyingOre; public static MetalMaterial makeNormal(String name, MaterialColor color, Tier material, ArmorMaterial armor) { return new MetalMaterial(name, true, FabricBlockSettings.copyOf(Blocks.IRON_BLOCK).materialColor(color), EndItems.makeEndItemSettings(), material, armor); @@ -110,8 +115,14 @@ public class MetalMaterial { private MetalMaterial(String name, boolean hasOre, FabricBlockSettings settings, Properties itemSettings, Tier material, ArmorMaterial armor) { BlockBehaviour.Properties lanternProperties = FabricBlockSettings.copyOf(settings).hardness(1).resistance(1).luminance(15).sound(SoundType.LANTERN); final int level = material.getLevel(); - - ore = hasOre ? EndBlocks.registerBlock(name + "_ore", new BaseBlock(FabricBlockSettings.copyOf(Blocks.END_STONE))) : null; + + rawOre = hasOre ? EndItems.registerEndItem(name + "_raw", new ModelProviderItem(itemSettings)) : null; + ore = hasOre ? EndBlocks.registerBlock(name + "_ore", new BaseOreBlock(rawOre, 1, 3, 1)) : null; + alloyingOre = hasOre ? TagAPI.makeItemTag(BetterEnd.MOD_ID, name + "_alloying") : null; + if (hasOre) { + TagHelper.addTag(alloyingOre, ore, rawOre); + } + block = EndBlocks.registerBlock(name + "_block", new BaseBlock(settings)); tile = EndBlocks.registerBlock(name + "_tile", new BaseBlock(settings)); stairs = EndBlocks.registerBlock(name + "_stairs", new BaseStairsBlock(tile)); @@ -153,8 +164,9 @@ public class MetalMaterial { anvilItem = EndItems.registerEndItem(name + "_anvil_item", new EndAnvilItem(anvilBlock)); if (hasOre) { - FurnaceRecipe.make(BetterEnd.MOD_ID, name + "_ingot_furnace", ore, ingot).checkConfig(Configs.RECIPE_CONFIG).setGroup("end_ingot").buildWithBlasting(); - AlloyingRecipe.Builder.create(name + "_ingot_alloy").setInput(ore, ore).setOutput(ingot, 3).setExpiriense(2.1F).build(); + FurnaceRecipe.make(BetterEnd.MOD_ID, name + "_ingot_furnace_ore", ore, ingot).checkConfig(Configs.RECIPE_CONFIG).setGroup("end_ingot").buildWithBlasting(); + FurnaceRecipe.make(BetterEnd.MOD_ID, name + "_ingot_furnace_raw", rawOre, ingot).checkConfig(Configs.RECIPE_CONFIG).setGroup("end_ingot").buildWithBlasting(); + AlloyingRecipe.Builder.create(name + "_ingot_alloy").setInput(alloyingOre, alloyingOre).setOutput(ingot, 3).setExpiriense(2.1F).build(); } // Basic recipes diff --git a/src/main/java/ru/betterend/registry/EndFeatures.java b/src/main/java/ru/betterend/registry/EndFeatures.java index f81838e9..214efdde 100644 --- a/src/main/java/ru/betterend/registry/EndFeatures.java +++ b/src/main/java/ru/betterend/registry/EndFeatures.java @@ -215,8 +215,8 @@ public class EndFeatures { public static final BCLFeature TUNEL_CAVE = BCLFeature.makeChunkFeature(BetterEnd.makeID("tunel_cave"), new TunelCaveFeature()); // Ores // - public static final BCLFeature THALLASIUM_ORE = registerOre("thallasium_ore", EndBlocks.THALLASIUM.ore, 32, 12, 0, 5, 128); - public static final BCLFeature ENDER_ORE = registerOre("ender_ore", EndBlocks.ENDER_ORE, 16, 4, 0, 5, 128); + public static final BCLFeature THALLASIUM_ORE = registerOre("thallasium_ore", EndBlocks.THALLASIUM.ore, 24, 8, 0, 5, 128); + public static final BCLFeature ENDER_ORE = registerOre("ender_ore", EndBlocks.ENDER_ORE, 12, 4, 0, 5, 128); public static final BCLFeature AMBER_ORE = registerOre("amber_ore", EndBlocks.AMBER_ORE, 24, 6, 0, 5, 128); public static final BCLFeature VIOLECITE_LAYER = registerLayer("violecite_layer", EndBlocks.VIOLECITE, 15, 16, 128, 8); public static final BCLFeature FLAVOLITE_LAYER = registerLayer("flavolite_layer", EndBlocks.FLAVOLITE, 12, 16, 128, 6); diff --git a/src/main/resources/assets/betterend/lang/en_us.json b/src/main/resources/assets/betterend/lang/en_us.json index 32e011b0..df012d66 100644 --- a/src/main/resources/assets/betterend/lang/en_us.json +++ b/src/main/resources/assets/betterend/lang/en_us.json @@ -598,6 +598,7 @@ "item.betterend.silk_fiber": "Silk Fiber", "item.betterend.spawn_egg_silk_moth": "Silk Moth Spawn Egg", + "item.betterend.thallasium_raw": "Raw Thallasium", "block.betterend.thallasium_ore": "Thallasium Ore", "item.betterend.thallasium_axe": "Thallasium Axe", "item.betterend.thallasium_hoe": "Thallasium Hoe", diff --git a/src/main/resources/assets/betterend/lang/ru_ru.json b/src/main/resources/assets/betterend/lang/ru_ru.json index 1db5508b..de2fb5b4 100644 --- a/src/main/resources/assets/betterend/lang/ru_ru.json +++ b/src/main/resources/assets/betterend/lang/ru_ru.json @@ -618,6 +618,7 @@ "item.betterend.silk_fiber": "Шёлковое волокно", "item.betterend.spawn_egg_silk_moth": "Яйцо призыва шелковичной моли", + "item.betterend.thallasium_raw": "Необработанный талласий", "block.betterend.thallasium_ore": "Талласиевая руда", "item.betterend.thallasium_axe": "Талласиевый топор", "item.betterend.thallasium_hoe": "Талласиевая мотыга", diff --git a/src/main/resources/assets/betterend/textures/item/thallasium_raw.png b/src/main/resources/assets/betterend/textures/item/thallasium_raw.png new file mode 100644 index 0000000000000000000000000000000000000000..5e88bfa3110110a8877c150e44756a35b8a407e2 GIT binary patch literal 254 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~l>na*S0JsE z)nMK*(`DBBkPZ7Q&tED(f2ryE<<7fTm%O;O@6)~WKOYr8h_(f)<0%R93ugF_0Gvkx z)PUjzo-U3d5>s>iqxlXS@N^aaQP}&x*8R4x@6wO#$0Yhc^1rJnE}NaZr&8zJ;)ZP5 zJ0e?n)^Hs@zp!xn6l-bCTWbW~i0u+NJ?GtL5uGP#PhB>jm;Jn|XGYPa@Q%v1T}rF> qFXz1=>ijJD+?Aw+{~7 Date: Thu, 8 Jul 2021 00:21:47 +0300 Subject: [PATCH 080/595] Code style changes, entities fixes --- src/main/java/ru/betterend/BetterEnd.java | 6 +- .../ru/betterend/api/BetterEndPlugin.java | 36 +- .../blocks/AncientEmeraldIceBlock.java | 18 +- .../betterend/blocks/AuroraCrystalBlock.java | 36 +- .../ru/betterend/blocks/BlueVineBlock.java | 4 +- .../blocks/BlueVineLanternBlock.java | 8 +- .../betterend/blocks/BlueVineSeedBlock.java | 12 +- .../betterend/blocks/BoluxMushroomBlock.java | 17 +- .../ru/betterend/blocks/BrimstoneBlock.java | 19 +- .../ru/betterend/blocks/BubbleCoralBlock.java | 8 +- .../ru/betterend/blocks/BulbVineBlock.java | 11 +- .../blocks/BulbVineLanternBlock.java | 20 +- .../blocks/BulbVineLanternColoredBlock.java | 4 +- .../betterend/blocks/BulbVineSeedBlock.java | 4 +- .../ru/betterend/blocks/CavePumpkinBlock.java | 18 +- .../blocks/CavePumpkinVineBlock.java | 15 +- .../ru/betterend/blocks/ChandelierBlock.java | 18 +- .../ru/betterend/blocks/ChorusGrassBlock.java | 2 +- .../blocks/DenseEmeraldIceBlock.java | 8 +- .../blocks/DragonTreeSaplingBlock.java | 2 +- .../ru/betterend/blocks/EmeraldIceBlock.java | 13 +- .../betterend/blocks/EndBlockProperties.java | 40 +- .../ru/betterend/blocks/EndLilyBlock.java | 27 +- .../ru/betterend/blocks/EndLilySeedBlock.java | 6 +- .../betterend/blocks/EndLotusFlowerBlock.java | 19 +- .../betterend/blocks/EndLotusLeafBlock.java | 14 +- .../betterend/blocks/EndLotusSeedBlock.java | 34 +- .../betterend/blocks/EndLotusStemBlock.java | 19 +- .../java/ru/betterend/blocks/EndPedestal.java | 9 +- .../ru/betterend/blocks/EndPortalBlock.java | 40 +- .../ru/betterend/blocks/EndStoneSmelter.java | 22 +- .../betterend/blocks/EndstoneDustBlock.java | 10 +- .../ru/betterend/blocks/EternalPedestal.java | 30 +- .../ru/betterend/blocks/FilaluxBlock.java | 2 +- .../betterend/blocks/FilaluxWingsBlock.java | 11 +- .../ru/betterend/blocks/FlamaeaBlock.java | 13 +- .../ru/betterend/blocks/GlowingMossBlock.java | 20 +- .../blocks/GlowingPillarLuminophorBlock.java | 8 +- .../blocks/GlowingPillarRootsBlock.java | 6 +- .../blocks/GlowingPillarSeedBlock.java | 17 +- .../blocks/HelixTreeLeavesBlock.java | 17 +- .../ru/betterend/blocks/HydraluxBlock.java | 19 +- .../betterend/blocks/HydraluxPetalBlock.java | 7 +- .../blocks/HydraluxPetalColoredBlock.java | 9 +- .../blocks/HydraluxSaplingBlock.java | 14 +- .../blocks/HydrothermalVentBlock.java | 29 +- .../ru/betterend/blocks/InfusionPedestal.java | 9 +- .../betterend/blocks/JellyshroomCapBlock.java | 20 +- .../blocks/LacugroveSaplingBlock.java | 2 +- .../ru/betterend/blocks/LanceleafBlock.java | 14 +- .../betterend/blocks/LanceleafSeedBlock.java | 8 +- .../betterend/blocks/LargeAmaranitaBlock.java | 18 +- .../blocks/LucerniaSaplingBlock.java | 2 +- .../ru/betterend/blocks/LumecornBlock.java | 20 +- .../betterend/blocks/LumecornSeedBlock.java | 8 +- .../betterend/blocks/MengerSpongeBlock.java | 18 +- .../blocks/MengerSpongeWetBlock.java | 8 +- .../blocks/MossyDragonBoneBlock.java | 36 +- .../blocks/MossyGlowshroomCapBlock.java | 4 +- .../blocks/MossyGlowshroomSaplingBlock.java | 2 +- .../ru/betterend/blocks/MossyObsidian.java | 38 +- .../ru/betterend/blocks/MurkweedBlock.java | 10 +- .../ru/betterend/blocks/NeedlegrassBlock.java | 9 +- .../blocks/NeonCactusPlantBlock.java | 95 +- .../ru/betterend/blocks/PedestalVanilla.java | 9 +- .../ru/betterend/blocks/PondAnemoneBlock.java | 12 +- .../blocks/PythadendronSaplingBlock.java | 2 +- .../betterend/blocks/RespawnObeliskBlock.java | 38 +- .../ru/betterend/blocks/RunedFlavolite.java | 23 +- .../ru/betterend/blocks/ShadowBerryBlock.java | 4 +- .../ru/betterend/blocks/ShadowGrassBlock.java | 4 +- .../betterend/blocks/SilkMothHiveBlock.java | 20 +- .../betterend/blocks/SilkMothNestBlock.java | 32 +- .../betterend/blocks/SmallAmaranitaBlock.java | 14 +- .../blocks/SmallJellyshroomBlock.java | 19 +- .../blocks/SmaragdantCrystalShardBlock.java | 23 +- .../betterend/blocks/SulphurCrystalBlock.java | 29 +- .../betterend/blocks/TenaneaFlowersBlock.java | 31 +- .../betterend/blocks/TenaneaSaplingBlock.java | 2 +- .../betterend/blocks/TerrainPlantBlock.java | 6 +- .../blocks/TwistedUmbrellaMossBlock.java | 34 +- .../blocks/TwistedUmbrellaMossTallBlock.java | 8 +- .../betterend/blocks/UmbrellaMossBlock.java | 34 +- .../blocks/UmbrellaMossTallBlock.java | 8 +- .../blocks/UmbrellaTreeClusterBlock.java | 6 +- .../blocks/UmbrellaTreeClusterEmptyBlock.java | 10 +- .../blocks/UmbrellaTreeMembraneBlock.java | 19 +- .../blocks/UmbrellaTreeSaplingBlock.java | 4 +- .../blocks/VentBubbleColumnBlock.java | 13 +- .../betterend/blocks/basis/EndAnvilBlock.java | 13 +- .../blocks/basis/EndLanternBlock.java | 20 +- .../blocks/basis/EndPlantWithAgeBlock.java | 3 +- .../blocks/basis/EndUnderwaterPlantBlock.java | 3 +- .../basis/EndUnderwaterWallPlantBlock.java | 3 +- .../blocks/basis/EndWallPlantBlock.java | 3 +- .../ru/betterend/blocks/basis/FurBlock.java | 17 +- .../betterend/blocks/basis/PedestalBlock.java | 141 ++- .../blocks/basis/StoneLanternBlock.java | 13 +- .../blocks/complex/ColoredMaterial.java | 19 +- .../complex/CrystalSubblocksMaterial.java | 14 +- .../blocks/complex/MetalMaterial.java | 46 +- .../blocks/complex/StoneMaterial.java | 26 +- .../blocks/complex/WoodenMaterial.java | 44 +- .../entities/BlockEntityHydrothermalVent.java | 7 +- .../entities/EndStoneSmelterBlockEntity.java | 131 +- .../entities/EternalPedestalEntity.java | 12 +- .../entities/InfusionPedestalEntity.java | 18 +- .../blocks/entities/PedestalBlockEntity.java | 19 +- .../ru/betterend/client/BetterEndClient.java | 6 +- .../ru/betterend/client/ClientOptions.java | 4 +- .../gui/EndStoneSmelterRecipeBookScreen.java | 21 +- .../client/gui/EndStoneSmelterScreen.java | 15 +- .../gui/EndStoneSmelterScreenHandler.java | 38 +- .../client/gui/slot/SmelterFuelSlot.java | 4 +- .../ru/betterend/client/models/Patterns.java | 29 +- .../client/render/ArmoredElytraLayer.java | 4 +- .../betterend/client/render/BeamRenderer.java | 15 +- .../client/render/EndCrystalRenderer.java | 11 +- .../client/render/EternalCrystalRenderer.java | 27 +- .../client/render/PedestalItemRenderer.java | 20 +- .../java/ru/betterend/config/Configs.java | 4 +- .../ru/betterend/effects/EndEnchantments.java | 7 +- .../java/ru/betterend/effects/EndPotions.java | 6 +- .../enchantment/EndVeilEnchantment.java | 4 +- .../effects/status/EndVeilEffect.java | 2 +- .../ru/betterend/entity/CubozoaEntity.java | 20 +- .../ru/betterend/entity/DragonflyEntity.java | 20 +- .../ru/betterend/entity/EndFishEntity.java | 38 +- .../ru/betterend/entity/EndSlimeEntity.java | 62 +- .../betterend/entity/ShadowWalkerEntity.java | 35 +- .../ru/betterend/entity/SilkMothEntity.java | 61 +- .../entity/model/BlockBenchModel.java | 8 +- .../entity/model/CubozoaEntityModel.java | 169 +-- .../entity/model/DragonflyEntityModel.java | 262 ++-- .../entity/model/EndFishEntityModel.java | 97 +- .../entity/model/EndSlimeEntityModel.java | 108 +- .../entity/model/SilkMothEntityModel.java | 376 +++--- .../entity/render/RendererEntityCubozoa.java | 7 +- .../render/RendererEntityDragonfly.java | 32 +- .../entity/render/RendererEntityEndFish.java | 7 +- .../entity/render/RendererEntityEndSlime.java | 19 +- .../render/RendererEntityShadowWalker.java | 1 - .../entity/render/SilkMothEntityRenderer.java | 18 +- .../betterend/events/ItemTooltipCallback.java | 4 +- .../events/PlayerAdvancementsCallback.java | 2 +- .../FlamboyantRefabricatedIntegration.java | 15 +- .../betterend/integration/Integrations.java | 24 +- .../integration/NourishIntegration.java | 52 +- .../betterend/integration/byg/BYGBlocks.java | 7 +- .../integration/byg/BYGIntegration.java | 10 +- .../integration/byg/biomes/BYGBiomes.java | 4 +- .../byg/biomes/NightshadeRedwoods.java | 16 +- .../byg/biomes/OldBulbisGardens.java | 33 +- .../integration/byg/features/BYGFeatures.java | 9 +- .../byg/features/BigEtherTreeFeature.java | 8 +- .../NightshadeRedwoodTreeFeature.java | 8 +- .../byg/features/OldBulbisTreeFeature.java | 14 +- .../integration/rei/REIAlloyingCategory.java | 16 +- .../integration/rei/REIAlloyingDisplay.java | 17 +- .../integration/rei/REIAnvilCategory.java | 12 +- .../integration/rei/REIAnvilDisplay.java | 8 +- .../integration/rei/REIBlastingDisplay.java | 9 +- .../integration/rei/REIContainer.java | 3 - .../integration/rei/REIInfusionCategory.java | 12 +- .../integration/rei/REIInfusionDisplay.java | 10 +- .../betterend/integration/rei/REIPlugin.java | 23 +- .../AnvilScreenHandlerExtended.java | 10 +- .../betterend/interfaces/BetterEndRecipe.java | 3 +- .../betterend/interfaces/FallFlyingItem.java | 1 + .../ru/betterend/interfaces/IBiomeList.java | 4 +- .../java/ru/betterend/interfaces/ISlime.java | 1 + .../interfaces/TeleportingEntity.java | 2 + .../ru/betterend/item/CrystaliteBoots.java | 7 +- .../betterend/item/CrystaliteChestplate.java | 7 +- .../ru/betterend/item/CrystaliteHelmet.java | 4 +- .../ru/betterend/item/CrystaliteLeggings.java | 4 +- .../java/ru/betterend/item/EndAnvilItem.java | 2 +- .../java/ru/betterend/item/EndArmorItem.java | 7 +- .../java/ru/betterend/item/GuideBookItem.java | 37 +- .../item/material/EndArmorMaterial.java | 22 +- .../item/material/EndToolMaterial.java | 8 +- .../item/model/ArmoredElytraModel.java | 14 +- .../item/model/CrystaliteArmorProvider.java | 20 +- .../item/model/CrystaliteBootsModel.java | 25 +- .../item/model/CrystaliteChestplateModel.java | 49 +- .../item/model/CrystaliteHelmetModel.java | 23 +- .../item/model/CrystaliteLeggingsModel.java | 23 +- .../ru/betterend/item/tool/EndHammerItem.java | 30 +- .../client/AbstractSoundInstanceAccessor.java | 3 +- .../mixin/client/AnvilScreenMixin.java | 42 +- .../mixin/client/ArmorStandRendererMixin.java | 2 +- .../mixin/client/BiomeColorsMixin.java | 21 +- .../mixin/client/CapeLayerMixin.java | 10 +- .../client/ClientPlayNetworkHandlerMixin.java | 16 +- .../mixin/client/ClientRecipeBookMixin.java | 9 +- .../mixin/client/ItemStackMixin.java | 13 +- .../mixin/client/LocalPlayerMixin.java | 16 +- .../mixin/client/MinecraftClientMixin.java | 23 +- .../mixin/client/ModelLoaderMixin.java | 7 +- .../mixin/client/MusicTrackerMixin.java | 33 +- .../mixin/client/WorldRendererMixin.java | 102 +- .../mixin/common/AnvilMenuMixin.java | 56 +- .../BiomeGenerationSettingsAccessor.java | 17 +- .../mixin/common/BlockBehaviourMixin.java | 14 +- .../mixin/common/ChorusFlowerBlockMixin.java | 47 +- .../mixin/common/ChorusPlantBlockMixin.java | 19 +- .../common/ChunkBiomeContainerMixin.java | 35 +- .../mixin/common/ComposterBlockAccessor.java | 5 +- .../mixin/common/CraftingMenuMixin.java | 9 +- .../mixin/common/DimensionTypeMixin.java | 11 +- .../mixin/common/EnchantmentMenuMixin.java | 19 +- .../mixin/common/EndCityFeatureMixin.java | 17 +- .../mixin/common/EndDragonFightMixin.java | 30 +- .../mixin/common/EndPodiumFeatureMixin.java | 10 +- .../betterend/mixin/common/EndSpikeMixin.java | 9 +- .../betterend/mixin/common/EnderManMixin.java | 9 +- .../betterend/mixin/common/EntityMixin.java | 26 +- .../mixin/common/LivingEntityMixin.java | 34 +- .../mixin/common/MinecraftServerMixin.java | 35 +- .../betterend/mixin/common/MonsterMixin.java | 19 +- .../common/NoiseBasedChunkGeneratorMixin.java | 23 +- .../mixin/common/PlayerAdvancementsMixin.java | 9 +- .../mixin/common/PlayerListMixin.java | 54 +- .../betterend/mixin/common/PlayerMixin.java | 15 +- .../mixin/common/PotionBrewingAccessor.java | 5 +- .../mixin/common/ServerLevelMixin.java | 39 +- .../mixin/common/ServerPlayerMixin.java | 18 +- .../mixin/common/ShuffelingListMixin.java | 19 +- .../ru/betterend/mixin/common/SlimeMixin.java | 10 +- .../mixin/common/SpikeFeatureMixin.java | 16 +- .../common/WeightedBiomePickerMixin.java | 20 +- .../ru/betterend/noise/OpenSimplexNoise.java | 537 +++++--- .../betterend/particle/FireflyParticle.java | 14 +- .../betterend/particle/InfusionParticle.java | 11 +- .../particle/InfusionParticleType.java | 9 +- .../particle/ParticleBlackSpore.java | 20 +- .../ru/betterend/particle/ParticleGeyser.java | 12 +- .../particle/ParticleGlowingSphere.java | 14 +- .../particle/ParticleJungleSpore.java | 10 +- .../betterend/particle/ParticleSnowflake.java | 22 +- .../betterend/particle/ParticleSulphur.java | 22 +- .../particle/ParticleTenaneaPetal.java | 24 +- .../particle/PaticlePortalSphere.java | 12 +- .../particle/SmaragdantParticle.java | 20 +- .../ru/betterend/recipe/AlloyingRecipes.java | 58 +- .../ru/betterend/recipe/AnvilRecipes.java | 106 +- .../ru/betterend/recipe/CraftingRecipes.java | 32 +- .../ru/betterend/recipe/InfusionRecipes.java | 1090 ++++++++--------- .../ru/betterend/recipe/SmithingRecipes.java | 158 +-- .../recipe/builders/AlloyingRecipe.java | 66 +- .../recipe/builders/AnvilRecipe.java | 68 +- .../recipe/builders/InfusionRecipe.java | 54 +- .../java/ru/betterend/registry/EndBiomes.java | 111 +- .../betterend/registry/EndBlockEntities.java | 7 +- .../java/ru/betterend/registry/EndBlocks.java | 207 +++- .../ru/betterend/registry/EndEntities.java | 5 +- .../registry/EndEntitiesRenders.java | 21 +- .../ru/betterend/registry/EndFeatures.java | 77 +- .../java/ru/betterend/registry/EndItems.java | 40 +- .../betterend/registry/EndModelProviders.java | 2 +- .../ru/betterend/registry/EndParticles.java | 8 +- .../ru/betterend/registry/EndPortals.java | 45 +- .../java/ru/betterend/registry/EndSounds.java | 13 +- .../ru/betterend/registry/EndStructures.java | 23 +- .../java/ru/betterend/registry/EndTags.java | 42 +- .../ru/betterend/rituals/EternalRitual.java | 77 +- .../ru/betterend/rituals/InfusionRitual.java | 46 +- .../java/ru/betterend/tab/CreativeTabs.java | 4 +- .../java/ru/betterend/util/BlockFixer.java | 7 +- .../ru/betterend/util/BonemealPlants.java | 18 +- .../ru/betterend/util/FeaturesHelper.java | 13 +- src/main/java/ru/betterend/util/ItemUtil.java | 21 +- src/main/java/ru/betterend/util/LangUtil.java | 16 +- .../java/ru/betterend/util/LootTableUtil.java | 2 +- .../java/ru/betterend/util/RecipeHelper.java | 5 +- .../util/ShuffelingListExtended.java | 10 +- .../java/ru/betterend/util/SpawnHelper.java | 4 +- .../ru/betterend/world/biome/EndBiome.java | 4 +- .../biome/cave/EmptyAuroraCaveBiome.java | 8 +- .../world/biome/cave/EmptyEndCaveBiome.java | 4 +- .../biome/cave/EmptySmaragdantCaveBiome.java | 8 +- .../world/biome/cave/EndCaveBiome.java | 30 +- .../world/biome/cave/JadeCaveBiome.java | 10 +- .../world/biome/cave/LushAuroraCaveBiome.java | 10 +- .../biome/cave/LushSmaragdantCaveBiome.java | 8 +- .../world/features/BiomeIslandFeature.java | 6 +- .../world/features/BlueVineFeature.java | 6 +- .../world/features/CavePumpkinFeature.java | 5 +- .../world/features/CharniaFeature.java | 2 +- .../world/features/CrashedShipFeature.java | 9 +- .../world/features/DoublePlantFeature.java | 8 +- .../world/features/EndLilyFeature.java | 6 +- .../world/features/EndLotusFeature.java | 6 +- .../world/features/EndLotusLeafFeature.java | 22 +- .../world/features/FilaluxFeature.java | 6 +- .../features/FullHeightScatterFeature.java | 7 +- .../world/features/GlowPillarFeature.java | 6 +- .../world/features/HydraluxFeature.java | 6 +- .../features/InvertedScatterFeature.java | 7 +- .../world/features/LanceleafFeature.java | 6 +- .../world/features/MengerSpongeFeature.java | 12 +- .../world/features/NeonCactusFeature.java | 7 +- .../world/features/ScatterFeature.java | 10 +- .../world/features/SilkMothNestFeature.java | 5 +- .../SingleInvertedScatterFeature.java | 6 +- .../world/features/SinglePlantFeature.java | 18 +- .../world/features/SkyScatterFeature.java | 20 +- .../features/UnderwaterPlantFeature.java | 8 +- .../features/UnderwaterPlantScatter.java | 20 +- .../betterend/world/features/VineFeature.java | 14 +- .../world/features/WallPlantFeature.java | 6 +- .../world/features/WallPlantOnLogFeature.java | 4 +- .../world/features/WallScatterFeature.java | 5 +- .../world/features/bushes/BushFeature.java | 13 +- .../features/bushes/BushWithOuterFeature.java | 13 +- .../bushes/LargeAmaranitaFeature.java | 5 +- .../world/features/bushes/Lumecorn.java | 8 +- .../features/bushes/TenaneaBushFeature.java | 16 +- .../terrain/BigAuroraCrystalFeature.java | 6 +- .../features/terrain/DesertLakeFeature.java | 5 +- .../features/terrain/FallenPillarFeature.java | 6 +- .../terrain/FloatingSpireFeature.java | 10 +- .../world/features/terrain/GeyserFeature.java | 7 +- .../features/terrain/IceStarFeature.java | 19 +- .../terrain/ObsidianBoulderFeature.java | 5 +- .../features/terrain/OreLayerFeature.java | 5 +- .../features/terrain/SingleBlockFeature.java | 5 +- .../terrain/SmaragdantCrystalFeature.java | 5 +- .../world/features/terrain/SpireFeature.java | 12 +- .../features/terrain/StalactiteFeature.java | 5 +- .../features/terrain/SulphurHillFeature.java | 8 +- .../terrain/SulphuricCaveFeature.java | 14 +- .../terrain/SulphuricLakeFeature.java | 12 +- .../caves/CaveChunkPopulatorFeature.java | 14 +- .../terrain/caves/EndCaveFeature.java | 14 +- .../terrain/caves/RoundCaveFeature.java | 23 +- .../terrain/caves/TunelCaveFeature.java | 32 +- .../features/trees/DragonTreeFeature.java | 10 +- .../trees/GiganticAmaranitaFeature.java | 19 +- .../features/trees/HelixTreeFeature.java | 17 +- .../features/trees/JellyshroomFeature.java | 13 +- .../features/trees/LacugroveFeature.java | 13 +- .../world/features/trees/LucerniaFeature.java | 11 +- .../trees/MossyGlowshroomFeature.java | 10 +- .../trees/PythadendronTreeFeature.java | 2 +- .../world/features/trees/TenaneaFeature.java | 9 +- .../features/trees/UmbrellaTreeFeature.java | 11 +- .../world/generator/BetterEndBiomeSource.java | 27 +- .../world/generator/GeneratorOptions.java | 36 +- .../world/generator/IslandLayer.java | 43 +- .../world/generator/LayerOptions.java | 12 +- .../world/generator/TerrainGenerator.java | 63 +- .../world/structures/EndStructureFeature.java | 16 +- .../features/EternalPortalStructure.java | 11 +- .../features/FeatureBaseStructure.java | 14 +- .../features/GiantIceStarStructure.java | 32 +- .../GiantMossyGlowshroomStructure.java | 35 +- .../features/MegaLakeSmallStructure.java | 5 +- .../features/MegaLakeStructure.java | 3 +- .../features/MountainStructure.java | 5 +- .../features/PaintedMountainStructure.java | 11 +- .../features/SDFStructureFeature.java | 15 +- .../world/structures/piece/BasePiece.java | 2 +- .../world/structures/piece/CavePiece.java | 15 +- .../piece/CrystalMountainPiece.java | 17 +- .../world/structures/piece/LakePiece.java | 40 +- .../world/structures/piece/MountainPiece.java | 26 +- .../world/structures/piece/NBTPiece.java | 13 +- .../piece/PaintedMountainPiece.java | 12 +- .../world/structures/piece/VoxelPiece.java | 9 +- .../surface/SulphuricSurfaceBuilder.java | 10 +- .../world/surface/SurfaceBuilders.java | 11 +- .../rendering/v1/ArmorRenderingRegistry.java | 224 ++-- .../rendering/ArmorProviderExtensions.java | 14 +- .../rendering/ArmorRenderingRegistryImpl.java | 76 +- .../rendering/MixinArmorFeatureRenderer.java | 110 +- .../mixin/client/rendering/MixinItem.java | 40 +- 377 files changed, 5038 insertions(+), 4914 deletions(-) diff --git a/src/main/java/ru/betterend/BetterEnd.java b/src/main/java/ru/betterend/BetterEnd.java index df163a84..b18c01fe 100644 --- a/src/main/java/ru/betterend/BetterEnd.java +++ b/src/main/java/ru/betterend/BetterEnd.java @@ -33,7 +33,7 @@ import ru.betterend.world.surface.SurfaceBuilders; public class BetterEnd implements ModInitializer { public static final String MOD_ID = "betterend"; public static final Logger LOGGER = new Logger(MOD_ID); - + @Override public void onInitialize() { WorldDataAPI.registerModCache(MOD_ID); @@ -62,11 +62,11 @@ public class BetterEnd implements ModInitializer { Integrations.init(); Configs.saveConfigs(); } - + public static ResourceLocation makeID(String path) { return new ResourceLocation(MOD_ID, path); } - + public static String getStringId(String id) { return String.format("%s:%s", MOD_ID, id); } diff --git a/src/main/java/ru/betterend/api/BetterEndPlugin.java b/src/main/java/ru/betterend/api/BetterEndPlugin.java index 4b278aec..afc8daeb 100644 --- a/src/main/java/ru/betterend/api/BetterEndPlugin.java +++ b/src/main/java/ru/betterend/api/BetterEndPlugin.java @@ -2,29 +2,33 @@ package ru.betterend.api; public interface BetterEndPlugin { /** - * Alloying recipes registration. - * See AlloyingRecipe.Builder for details. + * Alloying recipes registration. + * See AlloyingRecipe.Builder for details. */ - default void registerAlloyingRecipes() {} - + default void registerAlloyingRecipes() { + } + /** - * Smithing recipes registration. - * See AnvilSmithingRecipe.Builder for details. + * Smithing recipes registration. + * See AnvilSmithingRecipe.Builder for details. */ - default void registerSmithingRecipes() {} - + default void registerSmithingRecipes() { + } + /** - * Additional biomes registration. - * See BiomeRegistry.registerBiome for details. + * Additional biomes registration. + * See BiomeRegistry.registerBiome for details. */ - default void registerEndBiomes() {} - + default void registerEndBiomes() { + } + /** - * Register other mod stuff, for example, EndHammers. + * Register other mod stuff, for example, EndHammers. */ - default void registerOthers() {} - - + default void registerOthers() { + } + + public static void register(BetterEndPlugin plugin) { plugin.registerAlloyingRecipes(); plugin.registerSmithingRecipes(); diff --git a/src/main/java/ru/betterend/blocks/AncientEmeraldIceBlock.java b/src/main/java/ru/betterend/blocks/AncientEmeraldIceBlock.java index 2c73a6d1..ce9f48a7 100644 --- a/src/main/java/ru/betterend/blocks/AncientEmeraldIceBlock.java +++ b/src/main/java/ru/betterend/blocks/AncientEmeraldIceBlock.java @@ -1,9 +1,5 @@ package ru.betterend.blocks; -import java.util.Collections; -import java.util.List; -import java.util.Random; - import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -21,15 +17,19 @@ import ru.bclib.util.MHelper; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndParticles; +import java.util.Collections; +import java.util.List; +import java.util.Random; + public class AncientEmeraldIceBlock extends BaseBlock { public AncientEmeraldIceBlock() { super(FabricBlockSettings.copyOf(Blocks.BLUE_ICE).randomTicks()); } - + @Override public void randomTick(BlockState state, ServerLevel world, BlockPos pos, Random random) { Direction dir = BlocksHelper.randomDirection(random); - + if (random.nextBoolean()) { int x = MHelper.randRange(-2, 2, random); int y = MHelper.randRange(-2, 2, random); @@ -40,7 +40,7 @@ public class AncientEmeraldIceBlock extends BaseBlock { makeParticles(world, p, random); } } - + pos = pos.relative(dir); state = world.getBlockState(pos); if (state.is(Blocks.WATER)) { @@ -52,11 +52,11 @@ public class AncientEmeraldIceBlock extends BaseBlock { makeParticles(world, pos, random); } } - + private void makeParticles(ServerLevel world, BlockPos pos, Random random) { world.sendParticles(EndParticles.SNOWFLAKE, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, 20, 0.5, 0.5, 0.5, 0); } - + @Override public List getDrops(BlockState state, LootContext.Builder builder) { ItemStack tool = builder.getOptionalParameter(LootContextParams.TOOL); diff --git a/src/main/java/ru/betterend/blocks/AuroraCrystalBlock.java b/src/main/java/ru/betterend/blocks/AuroraCrystalBlock.java index 1d8a2e8e..a69171d5 100644 --- a/src/main/java/ru/betterend/blocks/AuroraCrystalBlock.java +++ b/src/main/java/ru/betterend/blocks/AuroraCrystalBlock.java @@ -1,9 +1,6 @@ package ru.betterend.blocks; -import java.util.List; - import com.google.common.collect.Lists; - import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; import net.minecraft.client.color.block.BlockColor; @@ -27,13 +24,14 @@ import ru.bclib.interfaces.IRenderTyped; import ru.bclib.util.ColorUtil; import ru.bclib.util.MHelper; import ru.betterend.registry.EndItems; -import ru.betterend.registry.EndTags; + +import java.util.List; public class AuroraCrystalBlock extends AbstractGlassBlock implements IRenderTyped, IColorProvider { public static final Vec3i[] COLORS; private static final int MIN_DROP = 1; private static final int MAX_DROP = 4; - + public AuroraCrystalBlock() { super(FabricBlockSettings.of(Material.GLASS) .breakByTool(FabricToolTags.PICKAXES) @@ -51,22 +49,23 @@ public class AuroraCrystalBlock extends AbstractGlassBlock implements IRenderTyp return (state, world, pos, tintIndex) -> { if (pos == null) { pos = BlockPos.ZERO; - }; - + } + ; + long i = (long) pos.getX() + (long) pos.getY() + (long) pos.getZ(); double delta = i * 0.1; int index = MHelper.floor(delta); int index2 = (index + 1) & 3; delta -= index; index &= 3; - + Vec3i color1 = COLORS[index]; Vec3i color2 = COLORS[index2]; - + int r = MHelper.floor(Mth.lerp(delta, color1.getX(), color2.getX())); int g = MHelper.floor(Mth.lerp(delta, color1.getY(), color2.getY())); int b = MHelper.floor(Mth.lerp(delta, color1.getZ(), color2.getZ())); - + return ColorUtil.color(r, g, b); }; } @@ -82,7 +81,7 @@ public class AuroraCrystalBlock extends AbstractGlassBlock implements IRenderTyp public BCLRenderLayer getRenderLayer() { return BCLRenderLayer.TRANSLUCENT; } - + @Override public List getDrops(BlockState state, LootContext.Builder builder) { ItemStack tool = builder.getParameter(LootContextParams.TOOL); @@ -100,20 +99,21 @@ public class AuroraCrystalBlock extends AbstractGlassBlock implements IRenderTyp return Lists.newArrayList(new ItemStack(EndItems.CRYSTAL_SHARDS, max)); } count = MHelper.randRange(min, max, MHelper.RANDOM); - } else { + } + else { count = MHelper.randRange(MIN_DROP, MAX_DROP, MHelper.RANDOM); } return Lists.newArrayList(new ItemStack(EndItems.CRYSTAL_SHARDS, count)); } return Lists.newArrayList(); } - + static { - COLORS = new Vec3i[] { - new Vec3i(247, 77, 161), - new Vec3i(120, 184, 255), - new Vec3i(120, 255, 168), - new Vec3i(243, 58, 255) + COLORS = new Vec3i[]{ + new Vec3i(247, 77, 161), + new Vec3i(120, 184, 255), + new Vec3i(120, 255, 168), + new Vec3i(243, 58, 255) }; } } diff --git a/src/main/java/ru/betterend/blocks/BlueVineBlock.java b/src/main/java/ru/betterend/blocks/BlueVineBlock.java index 5e13a8f5..c73f3add 100644 --- a/src/main/java/ru/betterend/blocks/BlueVineBlock.java +++ b/src/main/java/ru/betterend/blocks/BlueVineBlock.java @@ -10,12 +10,12 @@ import ru.betterend.registry.EndBlocks; public class BlueVineBlock extends UpDownPlantBlock { public static final EnumProperty SHAPE = BlockProperties.TRIPLE_SHAPE; - + @Override protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(SHAPE); } - + @Override protected boolean isTerrain(BlockState state) { return state.getBlock() == EndBlocks.END_MOSS || state.getBlock() == EndBlocks.END_MYCELIUM; diff --git a/src/main/java/ru/betterend/blocks/BlueVineLanternBlock.java b/src/main/java/ru/betterend/blocks/BlueVineLanternBlock.java index bec0c00e..98509b60 100644 --- a/src/main/java/ru/betterend/blocks/BlueVineLanternBlock.java +++ b/src/main/java/ru/betterend/blocks/BlueVineLanternBlock.java @@ -19,17 +19,17 @@ import ru.betterend.registry.EndBlocks; public class BlueVineLanternBlock extends BaseBlock { public static final BooleanProperty NATURAL = BlockProperties.NATURAL; - + public BlueVineLanternBlock() { super(FabricBlockSettings.of(Material.WOOD).breakByTool(FabricToolTags.AXES).luminance(15).sound(SoundType.WART_BLOCK)); this.registerDefaultState(this.stateDefinition.any().setValue(NATURAL, false)); } - + @Override public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { return !state.getValue(NATURAL) || world.getBlockState(pos.below()).getBlock() == EndBlocks.BLUE_VINE; } - + @Override public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, BlockPos pos, BlockPos neighborPos) { if (!canSurvive(state, world, pos)) { @@ -39,7 +39,7 @@ public class BlueVineLanternBlock extends BaseBlock { return state; } } - + @Override protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(NATURAL); diff --git a/src/main/java/ru/betterend/blocks/BlueVineSeedBlock.java b/src/main/java/ru/betterend/blocks/BlueVineSeedBlock.java index 8f8edc36..c80586dd 100644 --- a/src/main/java/ru/betterend/blocks/BlueVineSeedBlock.java +++ b/src/main/java/ru/betterend/blocks/BlueVineSeedBlock.java @@ -1,7 +1,5 @@ package ru.betterend.blocks; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.WorldGenLevel; @@ -14,6 +12,8 @@ import ru.betterend.blocks.basis.EndPlantWithAgeBlock; import ru.betterend.blocks.basis.FurBlock; import ru.betterend.registry.EndBlocks; +import java.util.Random; + public class BlueVineSeedBlock extends EndPlantWithAgeBlock { @Override public void growAdult(WorldGenLevel world, Random random, BlockPos pos) { @@ -29,10 +29,10 @@ public class BlueVineSeedBlock extends EndPlantWithAgeBlock { BlocksHelper.setWithoutUpdate(world, pos.above(height), EndBlocks.BLUE_VINE.defaultBlockState().setValue(BlockProperties.TRIPLE_SHAPE, BlockProperties.TripleShape.TOP)); placeLantern(world, pos.above(height + 1)); } - + private void placeLantern(WorldGenLevel world, BlockPos pos) { BlocksHelper.setWithoutUpdate(world, pos, EndBlocks.BLUE_VINE_LANTERN.defaultBlockState().setValue(BlueVineLanternBlock.NATURAL, true)); - for (Direction dir: BlocksHelper.HORIZONTAL) { + for (Direction dir : BlocksHelper.HORIZONTAL) { BlockPos p = pos.relative(dir); if (world.isEmptyBlock(p)) { BlocksHelper.setWithoutUpdate(world, p, EndBlocks.BLUE_VINE_FUR.defaultBlockState().setValue(FurBlock.FACING, dir)); @@ -42,12 +42,12 @@ public class BlueVineSeedBlock extends EndPlantWithAgeBlock { BlocksHelper.setWithoutUpdate(world, pos.above(), EndBlocks.BLUE_VINE_FUR.defaultBlockState().setValue(FurBlock.FACING, Direction.UP)); } } - + @Override protected boolean isTerrain(BlockState state) { return state.is(EndBlocks.END_MOSS) || state.is(EndBlocks.END_MYCELIUM); } - + @Override public BlockBehaviour.OffsetType getOffsetType() { return BlockBehaviour.OffsetType.NONE; diff --git a/src/main/java/ru/betterend/blocks/BoluxMushroomBlock.java b/src/main/java/ru/betterend/blocks/BoluxMushroomBlock.java index a7c95243..83d9c0d7 100644 --- a/src/main/java/ru/betterend/blocks/BoluxMushroomBlock.java +++ b/src/main/java/ru/betterend/blocks/BoluxMushroomBlock.java @@ -1,10 +1,6 @@ package ru.betterend.blocks; -import java.util.List; -import java.util.Random; - import com.google.common.collect.Lists; - import net.minecraft.core.BlockPos; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.BlockGetter; @@ -18,18 +14,21 @@ import net.minecraft.world.phys.shapes.VoxelShape; import ru.betterend.blocks.basis.EndPlantBlock; import ru.betterend.registry.EndBlocks; +import java.util.List; +import java.util.Random; + public class BoluxMushroomBlock extends EndPlantBlock { private static final VoxelShape SHAPE = Block.box(1, 0, 1, 15, 9, 15); - + public BoluxMushroomBlock() { super(10); } - + @Override protected boolean isTerrain(BlockState state) { return state.is(EndBlocks.RUTISCUS); } - + @Override public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { return SHAPE; @@ -39,7 +38,7 @@ public class BoluxMushroomBlock extends EndPlantBlock { public BlockBehaviour.OffsetType getOffsetType() { return BlockBehaviour.OffsetType.NONE; } - + @Override public boolean isValidBonemealTarget(BlockGetter world, BlockPos pos, BlockState state, boolean isClient) { return false; @@ -49,7 +48,7 @@ public class BoluxMushroomBlock extends EndPlantBlock { public boolean isBonemealSuccess(Level world, Random random, BlockPos pos, BlockState state) { return false; } - + @Override public List getDrops(BlockState state, LootContext.Builder builder) { return Lists.newArrayList(new ItemStack(this)); diff --git a/src/main/java/ru/betterend/blocks/BrimstoneBlock.java b/src/main/java/ru/betterend/blocks/BrimstoneBlock.java index e26d2ce1..2a2e9140 100644 --- a/src/main/java/ru/betterend/blocks/BrimstoneBlock.java +++ b/src/main/java/ru/betterend/blocks/BrimstoneBlock.java @@ -1,9 +1,5 @@ package ru.betterend.blocks; -import java.util.Random; - -import org.jetbrains.annotations.Nullable; - import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.core.BlockPos; @@ -20,19 +16,22 @@ import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.block.state.properties.BooleanProperty; import net.minecraft.world.level.material.Fluids; import net.minecraft.world.level.material.MaterialColor; +import org.jetbrains.annotations.Nullable; import ru.bclib.blocks.BaseBlock; import ru.bclib.blocks.BlockProperties; import ru.bclib.util.BlocksHelper; import ru.betterend.registry.EndBlocks; +import java.util.Random; + public class BrimstoneBlock extends BaseBlock { public static final BooleanProperty ACTIVATED = BlockProperties.ACTIVE; - + public BrimstoneBlock() { super(FabricBlockSettings.copyOf(Blocks.END_STONE).materialColor(MaterialColor.COLOR_BROWN).randomTicks()); registerDefaultState(stateDefinition.any().setValue(ACTIVATED, false)); } - + @Override protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(ACTIVATED); @@ -44,13 +43,13 @@ public class BrimstoneBlock extends BaseBlock { updateChunks((ClientLevel) world, pos); } } - + public void destroy(LevelAccessor world, BlockPos pos, BlockState state) { if (world.isClientSide()) { updateChunks((ClientLevel) world, pos); } } - + private void updateChunks(ClientLevel world, BlockPos pos) { int y = pos.getY() >> 4; int x1 = (pos.getX() - 2) >> 4; @@ -63,11 +62,11 @@ public class BrimstoneBlock extends BaseBlock { } } } - + @Override public void tick(BlockState state, ServerLevel world, BlockPos pos, Random random) { boolean deactivate = true; - for (Direction dir: BlocksHelper.DIRECTIONS) { + for (Direction dir : BlocksHelper.DIRECTIONS) { if (world.getFluidState(pos.relative(dir)).getType().equals(Fluids.WATER)) { deactivate = false; break; diff --git a/src/main/java/ru/betterend/blocks/BubbleCoralBlock.java b/src/main/java/ru/betterend/blocks/BubbleCoralBlock.java index 6963455a..34d15af6 100644 --- a/src/main/java/ru/betterend/blocks/BubbleCoralBlock.java +++ b/src/main/java/ru/betterend/blocks/BubbleCoralBlock.java @@ -22,7 +22,7 @@ import java.util.Random; public class BubbleCoralBlock extends EndUnderwaterPlantBlock { private static final VoxelShape SHAPE = Block.box(0, 0, 0, 16, 14, 16); - + public BubbleCoralBlock() { super(FabricBlockSettings.of(Material.WATER_PLANT) .breakByTool(FabricToolTags.SHEARS) @@ -30,7 +30,7 @@ public class BubbleCoralBlock extends EndUnderwaterPlantBlock { .sound(SoundType.CORAL_BLOCK) .noCollission()); } - + @Override public BlockBehaviour.OffsetType getOffsetType() { return BlockBehaviour.OffsetType.NONE; @@ -43,12 +43,12 @@ public class BubbleCoralBlock extends EndUnderwaterPlantBlock { double z = pos.getZ() + random.nextDouble(); world.addParticle(ParticleTypes.BUBBLE, x, y, z, 0.0D, 0.0D, 0.0D); } - + @Override public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { return SHAPE; } - + @Override public boolean isValidBonemealTarget(BlockGetter world, BlockPos pos, BlockState state, boolean isClient) { return false; diff --git a/src/main/java/ru/betterend/blocks/BulbVineBlock.java b/src/main/java/ru/betterend/blocks/BulbVineBlock.java index 09b53a11..7eb1985b 100644 --- a/src/main/java/ru/betterend/blocks/BulbVineBlock.java +++ b/src/main/java/ru/betterend/blocks/BulbVineBlock.java @@ -1,9 +1,6 @@ package ru.betterend.blocks; -import java.util.List; - import com.google.common.collect.Lists; - import net.minecraft.core.BlockPos; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.BlockGetter; @@ -16,11 +13,13 @@ import ru.bclib.util.MHelper; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndItems; +import java.util.List; + public class BulbVineBlock extends BaseVineBlock { public BulbVineBlock() { super(15, true); } - + @Override public List getDrops(BlockState state, LootContext.Builder builder) { if (state.getValue(SHAPE) == TripleShape.BOTTOM) { @@ -33,12 +32,12 @@ public class BulbVineBlock extends BaseVineBlock { return Lists.newArrayList(); } } - + @Override public boolean isValidBonemealTarget(BlockGetter world, BlockPos pos, BlockState state, boolean isClient) { return false; } - + @Override public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { boolean canPlace = super.canSurvive(state, world, pos); diff --git a/src/main/java/ru/betterend/blocks/BulbVineLanternBlock.java b/src/main/java/ru/betterend/blocks/BulbVineLanternBlock.java index dc0ad6c3..b18b29d9 100644 --- a/src/main/java/ru/betterend/blocks/BulbVineLanternBlock.java +++ b/src/main/java/ru/betterend/blocks/BulbVineLanternBlock.java @@ -1,12 +1,6 @@ package ru.betterend.blocks; -import java.util.Map; -import java.util.Optional; - -import org.jetbrains.annotations.Nullable; - import com.google.common.collect.Maps; - import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; @@ -22,6 +16,7 @@ import net.minecraft.world.level.material.Material; import net.minecraft.world.level.material.MaterialColor; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; +import org.jetbrains.annotations.Nullable; import ru.bclib.client.models.BlockModelProvider; import ru.bclib.client.models.ModelsHelper; import ru.bclib.client.render.BCLRenderLayer; @@ -29,10 +24,13 @@ import ru.bclib.interfaces.IRenderTyped; import ru.betterend.blocks.basis.EndLanternBlock; import ru.betterend.client.models.Patterns; +import java.util.Map; +import java.util.Optional; + public class BulbVineLanternBlock extends EndLanternBlock implements IRenderTyped, BlockModelProvider { private static final VoxelShape SHAPE_CEIL = Block.box(4, 4, 4, 12, 16, 12); private static final VoxelShape SHAPE_FLOOR = Block.box(4, 0, 4, 12, 12, 12); - + public BulbVineLanternBlock() { this(FabricBlockSettings.of(Material.METAL) .hardness(1) @@ -43,11 +41,11 @@ public class BulbVineLanternBlock extends EndLanternBlock implements IRenderType .requiresCorrectToolForDrops() .sound(SoundType.LANTERN)); } - + public BulbVineLanternBlock(Properties settings) { super(settings); } - + @Override public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { return state.getValue(IS_FLOOR) ? SHAPE_FLOOR : SHAPE_CEIL; @@ -69,13 +67,13 @@ public class BulbVineLanternBlock extends EndLanternBlock implements IRenderType Patterns.createJson(Patterns.BLOCK_BULB_LANTERN_CEIL, textures); return ModelsHelper.fromPattern(pattern); } - + protected String getMetalTexture(ResourceLocation blockId) { String name = blockId.getPath(); name = name.substring(0, name.indexOf('_')); return name + "_bulb_vine_lantern_metal"; } - + protected String getGlowTexture() { return "bulb_vine_lantern_bulb"; } diff --git a/src/main/java/ru/betterend/blocks/BulbVineLanternColoredBlock.java b/src/main/java/ru/betterend/blocks/BulbVineLanternColoredBlock.java index 4eab8f1a..cfde3ec7 100644 --- a/src/main/java/ru/betterend/blocks/BulbVineLanternColoredBlock.java +++ b/src/main/java/ru/betterend/blocks/BulbVineLanternColoredBlock.java @@ -21,7 +21,7 @@ public class BulbVineLanternColoredBlock extends BulbVineLanternBlock implements public ItemColor getItemProvider() { return (stack, tintIndex) -> getColor(); } - + private int getColor() { int color = BlocksHelper.getBlockColor(this); int b = (color & 255); @@ -30,7 +30,7 @@ public class BulbVineLanternColoredBlock extends BulbVineLanternBlock implements float[] hsv = ColorUtil.RGBtoHSB(r, g, b, new float[3]); return ColorUtil.HSBtoRGB(hsv[0], hsv[1], hsv[1] > 0.2 ? 1 : hsv[2]); } - + @Override protected String getGlowTexture() { return "bulb_vine_lantern_overlay"; diff --git a/src/main/java/ru/betterend/blocks/BulbVineSeedBlock.java b/src/main/java/ru/betterend/blocks/BulbVineSeedBlock.java index e0fa5161..73e1c97d 100644 --- a/src/main/java/ru/betterend/blocks/BulbVineSeedBlock.java +++ b/src/main/java/ru/betterend/blocks/BulbVineSeedBlock.java @@ -1,7 +1,5 @@ package ru.betterend.blocks; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.tags.BlockTags; import net.minecraft.world.level.LevelReader; @@ -14,6 +12,8 @@ import ru.bclib.util.BlocksHelper; import ru.betterend.blocks.basis.EndPlantWithAgeBlock; import ru.betterend.registry.EndBlocks; +import java.util.Random; + public class BulbVineSeedBlock extends EndPlantWithAgeBlock { @Override diff --git a/src/main/java/ru/betterend/blocks/CavePumpkinBlock.java b/src/main/java/ru/betterend/blocks/CavePumpkinBlock.java index f61aa0cb..6b1feb7e 100644 --- a/src/main/java/ru/betterend/blocks/CavePumpkinBlock.java +++ b/src/main/java/ru/betterend/blocks/CavePumpkinBlock.java @@ -1,8 +1,5 @@ package ru.betterend.blocks; -import java.util.Collections; -import java.util.List; - import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.core.BlockPos; import net.minecraft.world.item.ItemStack; @@ -22,21 +19,24 @@ import ru.bclib.client.render.BCLRenderLayer; import ru.bclib.interfaces.IRenderTyped; import ru.betterend.registry.EndBlocks; +import java.util.Collections; +import java.util.List; + public class CavePumpkinBlock extends BaseBlockNotFull implements IRenderTyped { public static final BooleanProperty SMALL = BlockProperties.SMALL; private static final VoxelShape SHAPE_SMALL; private static final VoxelShape SHAPE_BIG; - + public CavePumpkinBlock() { super(FabricBlockSettings.copyOf(Blocks.PUMPKIN).luminance((state) -> state.getValue(SMALL) ? 10 : 15)); registerDefaultState(defaultBlockState().setValue(SMALL, false)); } - + @Override protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(SMALL); } - + @Override public BCLRenderLayer getRenderLayer() { return BCLRenderLayer.CUTOUT; @@ -46,18 +46,18 @@ public class CavePumpkinBlock extends BaseBlockNotFull implements IRenderTyped { public VoxelShape getShape(BlockState state, BlockGetter world, BlockPos pos, CollisionContext context) { return state.getValue(SMALL) ? SHAPE_SMALL : SHAPE_BIG; } - + @Override public List getDrops(BlockState state, LootContext.Builder builder) { return state.getValue(SMALL) ? Collections.singletonList(new ItemStack(EndBlocks.CAVE_PUMPKIN_SEED)) : Collections.singletonList(new ItemStack(this)); } - + static { VoxelShape lantern = Block.box(1, 0, 1, 15, 13, 15); VoxelShape cap = Block.box(0, 12, 0, 16, 15, 16); VoxelShape top = Block.box(5, 15, 5, 11, 16, 11); SHAPE_BIG = Shapes.or(lantern, cap, top); - + lantern = Block.box(1, 7, 1, 15, 13, 15); cap = Block.box(4, 12, 4, 12, 15, 12); top = Block.box(6, 15, 6, 10, 16, 10); diff --git a/src/main/java/ru/betterend/blocks/CavePumpkinVineBlock.java b/src/main/java/ru/betterend/blocks/CavePumpkinVineBlock.java index 9e5278d9..4d59e2d9 100644 --- a/src/main/java/ru/betterend/blocks/CavePumpkinVineBlock.java +++ b/src/main/java/ru/betterend/blocks/CavePumpkinVineBlock.java @@ -1,7 +1,5 @@ package ru.betterend.blocks; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; @@ -18,15 +16,17 @@ import ru.bclib.blocks.BlockProperties; import ru.betterend.blocks.basis.EndPlantWithAgeBlock; import ru.betterend.registry.EndBlocks; +import java.util.Random; + public class CavePumpkinVineBlock extends EndPlantWithAgeBlock { private static final VoxelShape SHAPE = Block.box(4, 0, 4, 12, 16, 12); - + @Override public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { BlockState down = world.getBlockState(pos.above()); return isTerrain(down); } - + @Override public void performBonemeal(ServerLevel world, Random random, BlockPos pos, BlockState state) { int age = state.getValue(AGE); @@ -45,8 +45,9 @@ public class CavePumpkinVineBlock extends EndPlantWithAgeBlock { } @Override - public void growAdult(WorldGenLevel world, Random random, BlockPos pos) {} - + public void growAdult(WorldGenLevel world, Random random, BlockPos pos) { + } + @Override public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, BlockPos pos, BlockPos neighborPos) { state = super.updateShape(state, facing, neighborState, world, pos, neighborPos); @@ -63,7 +64,7 @@ public class CavePumpkinVineBlock extends EndPlantWithAgeBlock { public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { return SHAPE; } - + @Override public BlockBehaviour.OffsetType getOffsetType() { return BlockBehaviour.OffsetType.NONE; diff --git a/src/main/java/ru/betterend/blocks/ChandelierBlock.java b/src/main/java/ru/betterend/blocks/ChandelierBlock.java index 622eeb5e..f998c29e 100644 --- a/src/main/java/ru/betterend/blocks/ChandelierBlock.java +++ b/src/main/java/ru/betterend/blocks/ChandelierBlock.java @@ -1,13 +1,6 @@ package ru.betterend.blocks; -import java.util.EnumMap; -import java.util.Map; -import java.util.Optional; - -import org.jetbrains.annotations.Nullable; - import com.google.common.collect.Maps; - import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; @@ -23,6 +16,7 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.Shapes; import net.minecraft.world.phys.shapes.VoxelShape; +import org.jetbrains.annotations.Nullable; import ru.bclib.blocks.BaseAttachedBlock; import ru.bclib.client.models.BlockModelProvider; import ru.bclib.client.models.ModelsHelper; @@ -30,18 +24,22 @@ import ru.bclib.client.render.BCLRenderLayer; import ru.bclib.interfaces.IRenderTyped; import ru.betterend.client.models.Patterns; +import java.util.EnumMap; +import java.util.Map; +import java.util.Optional; + public class ChandelierBlock extends BaseAttachedBlock implements IRenderTyped, BlockModelProvider { private static final EnumMap BOUNDING_SHAPES = Maps.newEnumMap(Direction.class); - + public ChandelierBlock(Block source) { super(FabricBlockSettings.copyOf(source).luminance(15).noCollission().noOcclusion().requiresCorrectToolForDrops()); } - + @Override public BCLRenderLayer getRenderLayer() { return BCLRenderLayer.CUTOUT; } - + @Override public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { return BOUNDING_SHAPES.get(state.getValue(FACING)); diff --git a/src/main/java/ru/betterend/blocks/ChorusGrassBlock.java b/src/main/java/ru/betterend/blocks/ChorusGrassBlock.java index 71635d36..66bb0d7d 100644 --- a/src/main/java/ru/betterend/blocks/ChorusGrassBlock.java +++ b/src/main/java/ru/betterend/blocks/ChorusGrassBlock.java @@ -8,7 +8,7 @@ public class ChorusGrassBlock extends EndPlantBlock { public ChorusGrassBlock() { super(true); } - + @Override protected boolean isTerrain(BlockState state) { return state.getBlock() == EndBlocks.CHORUS_NYLIUM; diff --git a/src/main/java/ru/betterend/blocks/DenseEmeraldIceBlock.java b/src/main/java/ru/betterend/blocks/DenseEmeraldIceBlock.java index ece46509..dfea39df 100644 --- a/src/main/java/ru/betterend/blocks/DenseEmeraldIceBlock.java +++ b/src/main/java/ru/betterend/blocks/DenseEmeraldIceBlock.java @@ -1,8 +1,5 @@ package ru.betterend.blocks; -import java.util.Collections; -import java.util.List; - import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.enchantment.EnchantmentHelper; @@ -15,6 +12,9 @@ import ru.bclib.blocks.BaseBlock; import ru.bclib.client.render.BCLRenderLayer; import ru.bclib.interfaces.IRenderTyped; +import java.util.Collections; +import java.util.List; + public class DenseEmeraldIceBlock extends BaseBlock implements IRenderTyped { public DenseEmeraldIceBlock() { super(FabricBlockSettings.copyOf(Blocks.PACKED_ICE)); @@ -24,7 +24,7 @@ public class DenseEmeraldIceBlock extends BaseBlock implements IRenderTyped { public BCLRenderLayer getRenderLayer() { return BCLRenderLayer.TRANSLUCENT; } - + @Override public List getDrops(BlockState state, LootContext.Builder builder) { ItemStack tool = builder.getOptionalParameter(LootContextParams.TOOL); diff --git a/src/main/java/ru/betterend/blocks/DragonTreeSaplingBlock.java b/src/main/java/ru/betterend/blocks/DragonTreeSaplingBlock.java index 12310aab..882bd275 100644 --- a/src/main/java/ru/betterend/blocks/DragonTreeSaplingBlock.java +++ b/src/main/java/ru/betterend/blocks/DragonTreeSaplingBlock.java @@ -17,7 +17,7 @@ public class DragonTreeSaplingBlock extends FeatureSaplingBlock { protected Feature getFeature() { return EndFeatures.DRAGON_TREE.getFeature(); } - + @Override public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { return world.getBlockState(pos.below()).is(EndBlocks.SHADOW_GRASS); diff --git a/src/main/java/ru/betterend/blocks/EmeraldIceBlock.java b/src/main/java/ru/betterend/blocks/EmeraldIceBlock.java index e4ebe572..20466312 100644 --- a/src/main/java/ru/betterend/blocks/EmeraldIceBlock.java +++ b/src/main/java/ru/betterend/blocks/EmeraldIceBlock.java @@ -1,11 +1,5 @@ package ru.betterend.blocks; -import java.util.Collections; -import java.util.List; -import java.util.Random; - -import org.jetbrains.annotations.Nullable; - import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; @@ -26,10 +20,15 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.material.Material; import net.minecraft.world.level.storage.loot.LootContext; import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import org.jetbrains.annotations.Nullable; import ru.bclib.client.models.BlockModelProvider; import ru.bclib.client.render.BCLRenderLayer; import ru.bclib.interfaces.IRenderTyped; +import java.util.Collections; +import java.util.List; +import java.util.Random; + public class EmeraldIceBlock extends HalfTransparentBlock implements IRenderTyped, BlockModelProvider { public EmeraldIceBlock() { super(FabricBlockSettings.copyOf(Blocks.ICE)); @@ -74,7 +73,7 @@ public class EmeraldIceBlock extends HalfTransparentBlock implements IRenderType world.neighborChanged(pos, Blocks.WATER, pos); } } - + @Override public List getDrops(BlockState state, LootContext.Builder builder) { ItemStack tool = builder.getOptionalParameter(LootContextParams.TOOL); diff --git a/src/main/java/ru/betterend/blocks/EndBlockProperties.java b/src/main/java/ru/betterend/blocks/EndBlockProperties.java index 233c5f05..5f40740e 100644 --- a/src/main/java/ru/betterend/blocks/EndBlockProperties.java +++ b/src/main/java/ru/betterend/blocks/EndBlockProperties.java @@ -11,10 +11,10 @@ public class EndBlockProperties extends BlockProperties { public static final EnumProperty HYDRALUX_SHAPE = EnumProperty.create("shape", HydraluxShape.class); public static final EnumProperty PEDESTAL_STATE = EnumProperty.create("state", PedestalState.class); public static final EnumProperty CACTUS_BOTTOM = EnumProperty.create("bottom", CactusBottom.class); - + public static final BooleanProperty HAS_ITEM = BooleanProperty.create("has_item"); public static final IntegerProperty PORTAL = IntegerProperty.create("portal", 0, EndPortals.getCount()); - + public enum PedestalState implements StringRepresentable { PEDESTAL_TOP("pedestal_top"), COLUMN_TOP("column_top"), @@ -22,24 +22,24 @@ public class EndBlockProperties extends BlockProperties { PILLAR("pillar"), COLUMN("column"), DEFAULT("default"); - + private final String name; - + PedestalState(String name) { this.name = name; } - + @Override public String getSerializedName() { return this.name; } - + @Override public String toString() { return this.name; } } - + public enum HydraluxShape implements StringRepresentable { FLOWER_BIG_BOTTOM("flower_big_bottom", true), FLOWER_BIG_TOP("flower_big_top", true), @@ -47,10 +47,10 @@ public class EndBlockProperties extends BlockProperties { FLOWER_SMALL_TOP("flower_small_top", true), VINE("vine", false), ROOTS("roots", false); - + private final String name; private final boolean glow; - + HydraluxShape(String name, boolean glow) { this.name = name; this.glow = glow; @@ -60,17 +60,17 @@ public class EndBlockProperties extends BlockProperties { public String getSerializedName() { return name; } - + @Override public String toString() { return name; } - + public boolean hasGlow() { return glow; } } - + public enum LumecornShape implements StringRepresentable { LIGHT_TOP("light_top", 15), LIGHT_TOP_MIDDLE("light_top_middle", 15), @@ -79,10 +79,10 @@ public class EndBlockProperties extends BlockProperties { MIDDLE("middle", 0), BOTTOM_BIG("bottom_big", 0), BOTTOM_SMALL("bottom_small", 0); - + private final String name; private final int light; - + LumecornShape(String name, int light) { this.name = name; this.light = light; @@ -92,24 +92,24 @@ public class EndBlockProperties extends BlockProperties { public String getSerializedName() { return name; } - + @Override public String toString() { return name; } - + public int getLight() { return light; } } - + public enum CactusBottom implements StringRepresentable { EMPTY("empty"), SAND("sand"), MOSS("moss"); - + private final String name; - + CactusBottom(String name) { this.name = name; } @@ -118,7 +118,7 @@ public class EndBlockProperties extends BlockProperties { public String getSerializedName() { return name; } - + @Override public String toString() { return name; diff --git a/src/main/java/ru/betterend/blocks/EndLilyBlock.java b/src/main/java/ru/betterend/blocks/EndLilyBlock.java index 63b4dcb4..f4bfa0b9 100644 --- a/src/main/java/ru/betterend/blocks/EndLilyBlock.java +++ b/src/main/java/ru/betterend/blocks/EndLilyBlock.java @@ -1,11 +1,6 @@ package ru.betterend.blocks; -import java.util.Collections; -import java.util.List; -import java.util.Random; - import com.google.common.collect.Lists; - import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; @@ -37,11 +32,15 @@ import ru.betterend.blocks.basis.EndUnderwaterPlantBlock; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndItems; +import java.util.Collections; +import java.util.List; +import java.util.Random; + public class EndLilyBlock extends EndUnderwaterPlantBlock { public static final EnumProperty SHAPE = BlockProperties.TRIPLE_SHAPE; private static final VoxelShape SHAPE_BOTTOM = Block.box(4, 0, 4, 12, 16, 12); private static final VoxelShape SHAPE_TOP = Block.box(2, 0, 2, 14, 6, 14); - + public EndLilyBlock() { super(FabricBlockSettings.of(Material.WATER_PLANT) .breakByTool(FabricToolTags.SHEARS) @@ -50,7 +49,7 @@ public class EndLilyBlock extends EndUnderwaterPlantBlock { .lightLevel((state) -> state.getValue(SHAPE) == TripleShape.TOP ? 13 : 0) .noCollission()); } - + @Override public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, BlockPos pos, BlockPos neighborPos) { if (!canSurvive(state, world, pos)) { @@ -60,24 +59,24 @@ public class EndLilyBlock extends EndUnderwaterPlantBlock { return state; } } - + @Override public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { Vec3 vec3d = state.getOffset(view, pos); VoxelShape shape = state.getValue(SHAPE) == TripleShape.TOP ? SHAPE_TOP : SHAPE_BOTTOM; return shape.move(vec3d.x, vec3d.y, vec3d.z); } - + @Override protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(SHAPE); } - + @Override public FluidState getFluidState(BlockState state) { return state.getValue(SHAPE) == TripleShape.TOP ? Fluids.EMPTY.defaultFluidState() : Fluids.WATER.getSource(false); } - + @Override public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { if (state.getValue(SHAPE) == TripleShape.TOP) { @@ -92,7 +91,7 @@ public class EndLilyBlock extends EndUnderwaterPlantBlock { return up.getBlock() == this && down.getBlock() == this; } } - + @Override public List getDrops(BlockState state, LootContext.Builder builder) { if (state.getValue(SHAPE) == TripleShape.TOP) { @@ -100,13 +99,13 @@ public class EndLilyBlock extends EndUnderwaterPlantBlock { } return Collections.emptyList(); } - + @Override @Environment(EnvType.CLIENT) public ItemStack getCloneItemStack(BlockGetter world, BlockPos pos, BlockState state) { return new ItemStack(EndBlocks.END_LILY_SEED); } - + @Override public boolean isValidBonemealTarget(BlockGetter world, BlockPos pos, BlockState state, boolean isClient) { return false; diff --git a/src/main/java/ru/betterend/blocks/EndLilySeedBlock.java b/src/main/java/ru/betterend/blocks/EndLilySeedBlock.java index b955a39f..e85797e2 100644 --- a/src/main/java/ru/betterend/blocks/EndLilySeedBlock.java +++ b/src/main/java/ru/betterend/blocks/EndLilySeedBlock.java @@ -1,7 +1,5 @@ package ru.betterend.blocks; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.state.BlockState; @@ -12,6 +10,8 @@ import ru.bclib.blocks.UnderwaterPlantWithAgeBlock; import ru.bclib.util.BlocksHelper; import ru.betterend.registry.EndBlocks; +import java.util.Random; + public class EndLilySeedBlock extends UnderwaterPlantWithAgeBlock { @Override public void grow(WorldGenLevel world, Random random, BlockPos pos) { @@ -25,7 +25,7 @@ public class EndLilySeedBlock extends UnderwaterPlantWithAgeBlock { BlocksHelper.setWithoutUpdate(world, up, EndBlocks.END_LILY.defaultBlockState().setValue(EndLilyBlock.SHAPE, TripleShape.TOP)); } } - + private boolean canGrow(WorldGenLevel world, BlockPos pos) { BlockPos up = pos.above(); while (world.getBlockState(up).getFluidState().getType().equals(Fluids.WATER.getSource())) { diff --git a/src/main/java/ru/betterend/blocks/EndLotusFlowerBlock.java b/src/main/java/ru/betterend/blocks/EndLotusFlowerBlock.java index d79a31ac..a7da3edc 100644 --- a/src/main/java/ru/betterend/blocks/EndLotusFlowerBlock.java +++ b/src/main/java/ru/betterend/blocks/EndLotusFlowerBlock.java @@ -1,9 +1,6 @@ package ru.betterend.blocks; -import java.util.List; - import com.google.common.collect.Lists; - import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; @@ -21,40 +18,42 @@ import ru.bclib.util.MHelper; import ru.betterend.blocks.basis.EndPlantBlock; import ru.betterend.registry.EndBlocks; +import java.util.List; + public class EndLotusFlowerBlock extends EndPlantBlock { private static final VoxelShape SHAPE_OUTLINE = Block.box(2, 0, 2, 14, 14, 14); private static final VoxelShape SHAPE_COLLISION = Block.box(0, 0, 0, 16, 2, 16); - + public EndLotusFlowerBlock() { super(FabricBlockSettings.of(Material.PLANT).luminance(15).noOcclusion()); } - + @Override protected boolean isTerrain(BlockState state) { return state.is(EndBlocks.END_LOTUS_STEM); } - + @Override public BlockBehaviour.OffsetType getOffsetType() { return BlockBehaviour.OffsetType.NONE; } - + @Override public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { return SHAPE_OUTLINE; } - + @Override public VoxelShape getCollisionShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { return SHAPE_COLLISION; } - + @Override public List getDrops(BlockState state, LootContext.Builder builder) { int count = MHelper.randRange(1, 2, MHelper.RANDOM); return Lists.newArrayList(new ItemStack(EndBlocks.END_LOTUS_SEED, count)); } - + @Override @Environment(EnvType.CLIENT) public ItemStack getCloneItemStack(BlockGetter world, BlockPos pos, BlockState state) { diff --git a/src/main/java/ru/betterend/blocks/EndLotusLeafBlock.java b/src/main/java/ru/betterend/blocks/EndLotusLeafBlock.java index af3199f3..7b9644a7 100644 --- a/src/main/java/ru/betterend/blocks/EndLotusLeafBlock.java +++ b/src/main/java/ru/betterend/blocks/EndLotusLeafBlock.java @@ -32,27 +32,27 @@ public class EndLotusLeafBlock extends BaseBlockNotFull implements IRenderTyped public static final EnumProperty HORIZONTAL_FACING = BlockStateProperties.HORIZONTAL_FACING; public static final EnumProperty SHAPE = BlockProperties.TRIPLE_SHAPE; private static final VoxelShape VSHAPE = Block.box(0, 0, 0, 16, 1, 16); - + public EndLotusLeafBlock() { super(FabricBlockSettings.of(Material.PLANT).noOcclusion().sound(SoundType.WET_GRASS)); } - + @Override public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { BlockState down = world.getBlockState(pos.below()); return !down.getFluidState().isEmpty() && down.getFluidState().getType() instanceof WaterFluid; } - + @Override protected void createBlockStateDefinition(StateDefinition.Builder builder) { builder.add(SHAPE, HORIZONTAL_FACING); } - + @Override public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { return VSHAPE; } - + @Override public BlockState rotate(BlockState state, Rotation rotation) { return BlocksHelper.rotateHorizontal(state, rotation, HORIZONTAL_FACING); @@ -62,12 +62,12 @@ public class EndLotusLeafBlock extends BaseBlockNotFull implements IRenderTyped public BlockState mirror(BlockState state, Mirror mirror) { return BlocksHelper.mirrorHorizontal(state, mirror, HORIZONTAL_FACING); } - + @Override public BCLRenderLayer getRenderLayer() { return BCLRenderLayer.CUTOUT; } - + @Override @Environment(EnvType.CLIENT) public ItemStack getCloneItemStack(BlockGetter world, BlockPos pos, BlockState state) { diff --git a/src/main/java/ru/betterend/blocks/EndLotusSeedBlock.java b/src/main/java/ru/betterend/blocks/EndLotusSeedBlock.java index de268c6a..73ca66ff 100644 --- a/src/main/java/ru/betterend/blocks/EndLotusSeedBlock.java +++ b/src/main/java/ru/betterend/blocks/EndLotusSeedBlock.java @@ -1,7 +1,5 @@ package ru.betterend.blocks; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; @@ -14,6 +12,8 @@ import ru.bclib.blocks.UnderwaterPlantWithAgeBlock; import ru.bclib.util.BlocksHelper; import ru.betterend.registry.EndBlocks; +import java.util.Random; + public class EndLotusSeedBlock extends UnderwaterPlantWithAgeBlock { @Override public void grow(WorldGenLevel world, Random random, BlockPos pos) { @@ -22,7 +22,7 @@ public class EndLotusSeedBlock extends UnderwaterPlantWithAgeBlock { BlockState roots = EndBlocks.END_LOTUS_STEM.defaultBlockState().setValue(EndLotusStemBlock.SHAPE, TripleShape.BOTTOM).setValue(EndLotusStemBlock.WATERLOGGED, true); BlockState stem = EndBlocks.END_LOTUS_STEM.defaultBlockState(); BlockState flower = EndBlocks.END_LOTUS_FLOWER.defaultBlockState(); - + BlocksHelper.setWithoutUpdate(world, pos, roots); MutableBlockPos bpos = new MutableBlockPos().set(pos); bpos.setY(bpos.getY() + 1); @@ -30,7 +30,7 @@ public class EndLotusSeedBlock extends UnderwaterPlantWithAgeBlock { BlocksHelper.setWithoutUpdate(world, bpos, stem.setValue(EndLotusStemBlock.WATERLOGGED, true)); bpos.setY(bpos.getY() + 1); } - + int height = random.nextBoolean() ? 0 : random.nextBoolean() ? 1 : random.nextBoolean() ? 1 : -1; TripleShape shape = (height == 0) ? TripleShape.TOP : TripleShape.MIDDLE; Direction dir = BlocksHelper.randomHorizontal(random); @@ -42,7 +42,7 @@ public class EndLotusSeedBlock extends UnderwaterPlantWithAgeBlock { else { BlocksHelper.setWithoutUpdate(world, bpos, stem.setValue(EndLotusStemBlock.SHAPE, shape)); } - + bpos.setY(bpos.getY() + 1); for (int i = 1; i <= height; i++) { if (!world.isEmptyBlock(bpos)) { @@ -56,11 +56,11 @@ public class EndLotusSeedBlock extends UnderwaterPlantWithAgeBlock { BlocksHelper.setWithoutUpdate(world, bpos, stem); bpos.setY(bpos.getY() + 1); } - + if (!world.isEmptyBlock(bpos) || height < 0) { bpos.setY(bpos.getY() - 1); } - + BlocksHelper.setWithoutUpdate(world, bpos, flower); bpos.setY(bpos.getY() - 1); stem = world.getBlockState(bpos); @@ -70,15 +70,15 @@ public class EndLotusSeedBlock extends UnderwaterPlantWithAgeBlock { stem = stem.setValue(EndLotusStemBlock.WATERLOGGED, true); } } - + if (world.getBlockState(bpos.relative(dir)).is(EndBlocks.END_LOTUS_LEAF)) { stem = stem.setValue(EndLotusStemBlock.LEAF, true).setValue(EndLotusStemBlock.FACING, dir); } - + BlocksHelper.setWithoutUpdate(world, bpos, stem.setValue(EndLotusStemBlock.SHAPE, TripleShape.TOP)); } } - + private boolean canGrow(WorldGenLevel world, BlockPos pos) { MutableBlockPos bpos = new MutableBlockPos(); bpos.set(pos); @@ -87,31 +87,31 @@ public class EndLotusSeedBlock extends UnderwaterPlantWithAgeBlock { } return world.isEmptyBlock(bpos) && world.isEmptyBlock(bpos.above()); } - + private void generateLeaf(WorldGenLevel world, BlockPos pos) { MutableBlockPos p = new MutableBlockPos(); BlockState leaf = EndBlocks.END_LOTUS_LEAF.defaultBlockState(); BlocksHelper.setWithoutUpdate(world, pos, leaf.setValue(EndLotusLeafBlock.SHAPE, TripleShape.BOTTOM)); - for (Direction move: BlocksHelper.HORIZONTAL) { + for (Direction move : BlocksHelper.HORIZONTAL) { BlocksHelper.setWithoutUpdate(world, p.set(pos).move(move), leaf.setValue(EndLotusLeafBlock.HORIZONTAL_FACING, move).setValue(EndLotusLeafBlock.SHAPE, TripleShape.MIDDLE)); } - for (int i = 0; i < 4; i ++) { + for (int i = 0; i < 4; i++) { Direction d1 = BlocksHelper.HORIZONTAL[i]; Direction d2 = BlocksHelper.HORIZONTAL[(i + 1) & 3]; BlocksHelper.setWithoutUpdate(world, p.set(pos).move(d1).move(d2), leaf.setValue(EndLotusLeafBlock.HORIZONTAL_FACING, d1).setValue(EndLotusLeafBlock.SHAPE, TripleShape.TOP)); } } - + private boolean hasLeaf(WorldGenLevel world, BlockPos pos) { MutableBlockPos p = new MutableBlockPos(); p.setY(pos.getY()); int count = 0; - for (int x = -1; x < 2; x ++) { + for (int x = -1; x < 2; x++) { p.setX(pos.getX() + x); - for (int z = -1; z < 2; z ++) { + for (int z = -1; z < 2; z++) { p.setZ(pos.getZ() + z); if (world.isEmptyBlock(p) && !world.getFluidState(p.below()).isEmpty()) - count ++; + count++; } } return count == 9; diff --git a/src/main/java/ru/betterend/blocks/EndLotusStemBlock.java b/src/main/java/ru/betterend/blocks/EndLotusStemBlock.java index 0c27ece2..05a3c639 100644 --- a/src/main/java/ru/betterend/blocks/EndLotusStemBlock.java +++ b/src/main/java/ru/betterend/blocks/EndLotusStemBlock.java @@ -1,9 +1,6 @@ package ru.betterend.blocks; -import java.util.Map; - import com.google.common.collect.Maps; - import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -32,28 +29,30 @@ import ru.bclib.client.render.BCLRenderLayer; import ru.bclib.interfaces.IRenderTyped; import ru.bclib.util.BlocksHelper; +import java.util.Map; + public class EndLotusStemBlock extends BaseBlock implements SimpleWaterloggedBlock, IRenderTyped { public static final EnumProperty FACING = BlockStateProperties.FACING; public static final BooleanProperty WATERLOGGED = BlockStateProperties.WATERLOGGED; public static final BooleanProperty LEAF = BooleanProperty.create("leaf"); public static final EnumProperty SHAPE = BlockProperties.TRIPLE_SHAPE; private static final Map SHAPES = Maps.newEnumMap(Axis.class); - + public EndLotusStemBlock() { super(FabricBlockSettings.copyOf(Blocks.OAK_PLANKS)); this.registerDefaultState(defaultBlockState().setValue(WATERLOGGED, false).setValue(SHAPE, TripleShape.MIDDLE).setValue(LEAF, false).setValue(FACING, Direction.UP)); } - + @Override public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { return state.getValue(LEAF) ? SHAPES.get(Axis.Y) : SHAPES.get(state.getValue(FACING).getAxis()); } - + @Override protected void createBlockStateDefinition(StateDefinition.Builder builder) { builder.add(FACING, WATERLOGGED, SHAPE, LEAF); } - + @Override public FluidState getFluidState(BlockState state) { return state.getValue(WATERLOGGED) ? Fluids.WATER.getSource(false) : super.getFluidState(state); @@ -65,7 +64,7 @@ public class EndLotusStemBlock extends BaseBlock implements SimpleWaterloggedBlo BlockPos blockPos = ctx.getClickedPos(); return this.defaultBlockState().setValue(WATERLOGGED, worldAccess.getFluidState(blockPos).getType() == Fluids.WATER).setValue(FACING, ctx.getClickedFace()); } - + @Override public BlockState rotate(BlockState state, Rotation rotation) { return BlocksHelper.rotateHorizontal(state, rotation, FACING); @@ -83,12 +82,12 @@ public class EndLotusStemBlock extends BaseBlock implements SimpleWaterloggedBlo } return state; } - + @Override public BCLRenderLayer getRenderLayer() { return BCLRenderLayer.CUTOUT; } - + static { SHAPES.put(Axis.X, Block.box(0, 6, 6, 16, 10, 10)); SHAPES.put(Axis.Y, Block.box(6, 0, 6, 10, 16, 10)); diff --git a/src/main/java/ru/betterend/blocks/EndPedestal.java b/src/main/java/ru/betterend/blocks/EndPedestal.java index be4b0a78..a86c2a31 100644 --- a/src/main/java/ru/betterend/blocks/EndPedestal.java +++ b/src/main/java/ru/betterend/blocks/EndPedestal.java @@ -1,14 +1,14 @@ package ru.betterend.blocks; -import java.util.HashMap; -import java.util.Map; - import net.minecraft.core.Registry; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.block.Block; import ru.betterend.BetterEnd; import ru.betterend.blocks.basis.PedestalBlock; +import java.util.HashMap; +import java.util.Map; + public class EndPedestal extends PedestalBlock { public EndPedestal(Block parent) { @@ -21,8 +21,9 @@ public class EndPedestal extends PedestalBlock { String name = blockId.getPath(); return new HashMap() { private static final long serialVersionUID = 1L; + { - put("%mod%", BetterEnd.MOD_ID ); + put("%mod%", BetterEnd.MOD_ID); put("%top%", name + "_polished"); put("%base%", name + "_polished"); put("%pillar%", name + "_pillar_side"); diff --git a/src/main/java/ru/betterend/blocks/EndPortalBlock.java b/src/main/java/ru/betterend/blocks/EndPortalBlock.java index a419608e..e4dc81ab 100644 --- a/src/main/java/ru/betterend/blocks/EndPortalBlock.java +++ b/src/main/java/ru/betterend/blocks/EndPortalBlock.java @@ -1,9 +1,5 @@ package ru.betterend.blocks; -import java.util.Objects; -import java.util.Optional; -import java.util.Random; - import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; @@ -40,6 +36,10 @@ import ru.betterend.registry.EndParticles; import ru.betterend.registry.EndPortals; import ru.betterend.rituals.EternalRitual; +import java.util.Objects; +import java.util.Optional; +import java.util.Random; + public class EndPortalBlock extends NetherPortalBlock implements IRenderTyped, IColorProvider { public static final IntegerProperty PORTAL = EndBlockProperties.PORTAL; @@ -52,7 +52,7 @@ public class EndPortalBlock extends NetherPortalBlock implements IRenderTyped, I super.createBlockStateDefinition(builder); builder.add(PORTAL); } - + @Override @Environment(EnvType.CLIENT) public void animateTick(BlockState state, Level world, BlockPos pos, Random random) { @@ -66,7 +66,8 @@ public class EndPortalBlock extends NetherPortalBlock implements IRenderTyped, I int k = random.nextInt(2) * 2 - 1; if (!world.getBlockState(pos.west()).is(this) && !world.getBlockState(pos.east()).is(this)) { x = pos.getX() + 0.5D + 0.25D * k; - } else { + } + else { z = pos.getZ() + 0.5D + 0.25D * k; } @@ -74,13 +75,14 @@ public class EndPortalBlock extends NetherPortalBlock implements IRenderTyped, I } @Override - public void randomTick(BlockState state, ServerLevel world, BlockPos pos, Random random) {} - + public void randomTick(BlockState state, ServerLevel world, BlockPos pos, Random random) { + } + @Override public BlockState updateShape(BlockState state, Direction direction, BlockState newState, LevelAccessor world, BlockPos pos, BlockPos posFrom) { return state; } - + @Override public void entityInside(BlockState state, Level world, BlockPos pos, Entity entity) { if (world.isClientSide || !validate(entity)) return; @@ -95,7 +97,8 @@ public class EndPortalBlock extends NetherPortalBlock implements IRenderTyped, I if (entity instanceof ServerPlayer && ((ServerPlayer) entity).isCreative()) { ((ServerPlayer) entity).teleportTo(destination, exitPos.getX() + 0.5, exitPos.getY(), exitPos.getZ() + 0.5, entity.getYRot(), entity.getXRot()); - } else { + } + else { ((TeleportingEntity) entity).be_setExitPos(exitPos); Optional teleported = Optional.ofNullable(entity.changeDimension(destination)); teleported.ifPresent(Entity::setPortalCooldown); @@ -106,12 +109,12 @@ public class EndPortalBlock extends NetherPortalBlock implements IRenderTyped, I return !entity.isPassenger() && !entity.isVehicle() && entity.canChangeDimensions() && !entity.isOnPortalCooldown(); } - + @Override public BCLRenderLayer getRenderLayer() { return BCLRenderLayer.TRANSLUCENT; } - + private BlockPos findExitPos(ServerLevel currentWorld, ServerLevel targetWorld, BlockPos currentPos, Entity entity) { if (targetWorld == null) return null; Registry registry = targetWorld.registryAccess().registryOrThrow(Registry.DIMENSION_TYPE_REGISTRY); @@ -143,11 +146,11 @@ public class EndPortalBlock extends NetherPortalBlock implements IRenderTyped, I } return null; } - + private MutableBlockPos findCenter(Level world, MutableBlockPos pos, Direction.Axis axis) { return findCenter(world, pos, axis, 1); } - + private MutableBlockPos findCenter(Level world, MutableBlockPos pos, Direction.Axis axis, int step) { if (step > 8) return pos; BlockState right, left; @@ -159,11 +162,14 @@ public class EndPortalBlock extends NetherPortalBlock implements IRenderTyped, I BlockState down = world.getBlockState(pos.below()); if (down.is(this)) { return findCenter(world, pos.move(Direction.DOWN), axis, step); - } else if (right.is(this) && left.is(this)) { + } + else if (right.is(this) && left.is(this)) { return pos; - } else if (right.is(this)) { + } + else if (right.is(this)) { return findCenter(world, pos.move(rightDir), axis, ++step); - } else if (left.is(this)) { + } + else if (left.is(this)) { return findCenter(world, pos.move(leftDir), axis, ++step); } return pos; diff --git a/src/main/java/ru/betterend/blocks/EndStoneSmelter.java b/src/main/java/ru/betterend/blocks/EndStoneSmelter.java index 071fba3e..5b08ab4f 100644 --- a/src/main/java/ru/betterend/blocks/EndStoneSmelter.java +++ b/src/main/java/ru/betterend/blocks/EndStoneSmelter.java @@ -16,7 +16,12 @@ import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.*; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.HorizontalDirectionalBlock; +import net.minecraft.world.level.block.Mirror; +import net.minecraft.world.level.block.RenderShape; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.SoundType; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityTicker; import net.minecraft.world.level.block.entity.BlockEntityType; @@ -52,11 +57,12 @@ public class EndStoneSmelter extends BaseBlockWithEntity { .sound(SoundType.STONE)); registerDefaultState(this.stateDefinition.any().setValue(FACING, Direction.NORTH).setValue(LIT, false)); } - + public InteractionResult use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) { if (world.isClientSide) { return InteractionResult.SUCCESS; - } else { + } + else { this.openScreen(world, pos, player); return InteractionResult.CONSUME; } @@ -68,17 +74,17 @@ public class EndStoneSmelter extends BaseBlockWithEntity { player.openMenu((EndStoneSmelterBlockEntity) blockEntity); } } - + @Override public BlockState getStateForPlacement(BlockPlaceContext ctx) { return defaultBlockState().setValue(FACING, ctx.getHorizontalDirection().getOpposite()); } - + @Override public BlockEntity newBlockEntity(BlockPos blockPos, BlockState blockState) { return new EndStoneSmelterBlockEntity(blockPos, blockState); } - + @Override public List getDrops(BlockState state, LootContext.Builder builder) { List drop = Lists.newArrayList(new ItemStack(this)); @@ -125,7 +131,7 @@ public class EndStoneSmelter extends BaseBlockWithEntity { protected void createBlockStateDefinition(StateDefinition.Builder builder) { builder.add(FACING, LIT); } - + @Environment(EnvType.CLIENT) public void animateTick(BlockState state, Level world, BlockPos pos, Random random) { if (state.getValue(LIT)) { @@ -133,7 +139,7 @@ public class EndStoneSmelter extends BaseBlockWithEntity { double y = pos.getY(); double z = pos.getZ() + 0.5D; if (random.nextDouble() < 0.1D) { - world.playLocalSound(x, y, z, SoundEvents.BLASTFURNACE_FIRE_CRACKLE, SoundSource.BLOCKS, 1.0F, 1.0F, false); + world.playLocalSound(x, y, z, SoundEvents.BLASTFURNACE_FIRE_CRACKLE, SoundSource.BLOCKS, 1.0F, 1.0F, false); } Direction direction = state.getValue(FACING); diff --git a/src/main/java/ru/betterend/blocks/EndstoneDustBlock.java b/src/main/java/ru/betterend/blocks/EndstoneDustBlock.java index 28ca0d6e..4dc094f3 100644 --- a/src/main/java/ru/betterend/blocks/EndstoneDustBlock.java +++ b/src/main/java/ru/betterend/blocks/EndstoneDustBlock.java @@ -1,8 +1,5 @@ package ru.betterend.blocks; -import java.util.Collections; -import java.util.List; - import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; @@ -16,16 +13,19 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.storage.loot.LootContext; import ru.bclib.util.ColorUtil; +import java.util.Collections; +import java.util.List; + public class EndstoneDustBlock extends FallingBlock { @Environment(EnvType.CLIENT) private static final int COLOR = ColorUtil.color(226, 239, 168); - + public EndstoneDustBlock() { super(FabricBlockSettings.copyOf(Blocks.SAND) .breakByTool(FabricToolTags.SHOVELS) .materialColor(Blocks.END_STONE.defaultMaterialColor())); } - + @Override public List getDrops(BlockState state, LootContext.Builder builder) { return Collections.singletonList(new ItemStack(this)); diff --git a/src/main/java/ru/betterend/blocks/EternalPedestal.java b/src/main/java/ru/betterend/blocks/EternalPedestal.java index c3087233..e699bc08 100644 --- a/src/main/java/ru/betterend/blocks/EternalPedestal.java +++ b/src/main/java/ru/betterend/blocks/EternalPedestal.java @@ -1,9 +1,6 @@ package ru.betterend.blocks; -import java.util.List; - import com.google.common.collect.Lists; - import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Registry; @@ -28,14 +25,16 @@ import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndPortals; import ru.betterend.rituals.EternalRitual; +import java.util.List; + public class EternalPedestal extends PedestalBlock { public static final BooleanProperty ACTIVATED = EndBlockProperties.ACTIVE; - + public EternalPedestal() { super(EndBlocks.FLAVOLITE_RUNED_ETERNAL); this.registerDefaultState(defaultBlockState().setValue(ACTIVATED, false)); } - + @Override public void checkRitual(Level world, BlockPos pos) { BlockEntity blockEntity = world.getBlockEntity(pos); @@ -50,21 +49,24 @@ public class EternalPedestal extends PedestalBlock { int portalId; if (targetWorld != null) { portalId = EndPortals.getPortalIdByWorld(targetWorld); - } else { + } + else { portalId = EndPortals.getPortalIdByWorld(EndPortals.OVERWORLD_ID); } ritual.disablePortal(portalId); } } world.setBlockAndUpdate(pos, updatedState.setValue(ACTIVATED, false).setValue(HAS_LIGHT, false)); - } else { + } + else { ItemStack itemStack = pedestal.getItem(0); ResourceLocation id = Registry.ITEM.getKey(itemStack.getItem()); if (EndPortals.isAvailableItem(id)) { world.setBlockAndUpdate(pos, updatedState.setValue(ACTIVATED, true).setValue(HAS_LIGHT, true)); if (pedestal.hasRitual()) { pedestal.getRitual().checkStructure(); - } else { + } + else { EternalRitual ritual = new EternalRitual(world, pos); ritual.checkStructure(); } @@ -72,7 +74,7 @@ public class EternalPedestal extends PedestalBlock { } } } - + @Override @Deprecated public BlockState updateShape(BlockState state, Direction direction, BlockState newState, LevelAccessor world, BlockPos pos, BlockPos posFrom) { @@ -83,23 +85,23 @@ public class EternalPedestal extends PedestalBlock { } return updated; } - + @Override @Deprecated public float getDestroyProgress(BlockState state, Player player, BlockGetter world, BlockPos pos) { return 0.0F; } - + @Override public float getExplosionResistance() { return Blocks.BEDROCK.getExplosionResistance(); } - + @Override public boolean dropFromExplosion(Explosion explosion) { return false; } - + @Override public List getDrops(BlockState state, LootContext.Builder builder) { if (state.is(this)) { @@ -118,7 +120,7 @@ public class EternalPedestal extends PedestalBlock { } return drop; } - + @Override protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { super.createBlockStateDefinition(stateManager); diff --git a/src/main/java/ru/betterend/blocks/FilaluxBlock.java b/src/main/java/ru/betterend/blocks/FilaluxBlock.java index 55d35214..3d09def1 100644 --- a/src/main/java/ru/betterend/blocks/FilaluxBlock.java +++ b/src/main/java/ru/betterend/blocks/FilaluxBlock.java @@ -7,7 +7,7 @@ public class FilaluxBlock extends BaseVineBlock { public FilaluxBlock() { super(15, true); } - + @Override public BlockBehaviour.OffsetType getOffsetType() { return BlockBehaviour.OffsetType.NONE; diff --git a/src/main/java/ru/betterend/blocks/FilaluxWingsBlock.java b/src/main/java/ru/betterend/blocks/FilaluxWingsBlock.java index 7a3ef492..3b1392a4 100644 --- a/src/main/java/ru/betterend/blocks/FilaluxWingsBlock.java +++ b/src/main/java/ru/betterend/blocks/FilaluxWingsBlock.java @@ -1,9 +1,6 @@ package ru.betterend.blocks; -import java.util.EnumMap; - import com.google.common.collect.Maps; - import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; import net.minecraft.core.BlockPos; @@ -19,9 +16,11 @@ import ru.bclib.blocks.BaseAttachedBlock; import ru.bclib.client.render.BCLRenderLayer; import ru.bclib.interfaces.IRenderTyped; +import java.util.EnumMap; + public class FilaluxWingsBlock extends BaseAttachedBlock implements IRenderTyped { private static final EnumMap BOUNDING_SHAPES = Maps.newEnumMap(Direction.class); - + public FilaluxWingsBlock() { super(FabricBlockSettings.of(Material.PLANT).breakByTool(FabricToolTags.SHEARS).sound(SoundType.WET_GRASS).noCollission()); } @@ -30,12 +29,12 @@ public class FilaluxWingsBlock extends BaseAttachedBlock implements IRenderTyped public BCLRenderLayer getRenderLayer() { return BCLRenderLayer.CUTOUT; } - + @Override public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { return BOUNDING_SHAPES.get(state.getValue(FACING)); } - + static { BOUNDING_SHAPES.put(Direction.UP, Shapes.box(0.0, 0.0, 0.0, 1.0, 0.5, 1.0)); BOUNDING_SHAPES.put(Direction.DOWN, Shapes.box(0.0, 0.5, 0.0, 1.0, 1.0, 1.0)); diff --git a/src/main/java/ru/betterend/blocks/FlamaeaBlock.java b/src/main/java/ru/betterend/blocks/FlamaeaBlock.java index 03879d2f..e9a5a1ea 100644 --- a/src/main/java/ru/betterend/blocks/FlamaeaBlock.java +++ b/src/main/java/ru/betterend/blocks/FlamaeaBlock.java @@ -1,9 +1,6 @@ package ru.betterend.blocks; -import java.util.List; - import com.google.common.collect.Lists; - import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; import net.minecraft.core.BlockPos; @@ -21,21 +18,23 @@ import net.minecraft.world.phys.shapes.VoxelShape; import ru.bclib.interfaces.ISpetialItem; import ru.betterend.blocks.basis.EndPlantBlock; +import java.util.List; + public class FlamaeaBlock extends EndPlantBlock implements ISpetialItem { private static final VoxelShape SHAPE = Block.box(0, 0, 0, 16, 1, 16); - + public FlamaeaBlock() { super(FabricBlockSettings.of(Material.PLANT) .breakByTool(FabricToolTags.SHEARS) .breakByHand(true) .sound(SoundType.WET_GRASS)); } - + @Override protected boolean isTerrain(BlockState state) { return state.is(Blocks.WATER); } - + @Override public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { return SHAPE; @@ -45,7 +44,7 @@ public class FlamaeaBlock extends EndPlantBlock implements ISpetialItem { public BlockBehaviour.OffsetType getOffsetType() { return BlockBehaviour.OffsetType.NONE; } - + @Override public List getDrops(BlockState state, LootContext.Builder builder) { return Lists.newArrayList(new ItemStack(this)); diff --git a/src/main/java/ru/betterend/blocks/GlowingMossBlock.java b/src/main/java/ru/betterend/blocks/GlowingMossBlock.java index 22191437..10b21eab 100644 --- a/src/main/java/ru/betterend/blocks/GlowingMossBlock.java +++ b/src/main/java/ru/betterend/blocks/GlowingMossBlock.java @@ -12,19 +12,19 @@ public class GlowingMossBlock extends EndPlantBlock { public GlowingMossBlock(int light) { super(light); } - + @Override protected boolean isTerrain(BlockState state) { return state.getBlock() == EndBlocks.END_MOSS || state.getBlock() == EndBlocks.END_MYCELIUM; } - - @Environment(EnvType.CLIENT) - public boolean hasEmissiveLighting(BlockGetter world, BlockPos pos) { - return true; - } - @Environment(EnvType.CLIENT) - public float getAmbientOcclusionLightLevel(BlockGetter world, BlockPos pos) { - return 1F; - } + @Environment(EnvType.CLIENT) + public boolean hasEmissiveLighting(BlockGetter world, BlockPos pos) { + return true; + } + + @Environment(EnvType.CLIENT) + public float getAmbientOcclusionLightLevel(BlockGetter world, BlockPos pos) { + return 1F; + } } \ No newline at end of file diff --git a/src/main/java/ru/betterend/blocks/GlowingPillarLuminophorBlock.java b/src/main/java/ru/betterend/blocks/GlowingPillarLuminophorBlock.java index 1a3c6fe0..b2b5b903 100644 --- a/src/main/java/ru/betterend/blocks/GlowingPillarLuminophorBlock.java +++ b/src/main/java/ru/betterend/blocks/GlowingPillarLuminophorBlock.java @@ -19,7 +19,7 @@ import ru.betterend.registry.EndBlocks; public class GlowingPillarLuminophorBlock extends BaseBlock { public static final BooleanProperty NATURAL = EndBlockProperties.NATURAL; - + public GlowingPillarLuminophorBlock() { super(FabricBlockSettings.of(Material.LEAVES) .materialColor(MaterialColor.COLOR_ORANGE) @@ -29,12 +29,12 @@ public class GlowingPillarLuminophorBlock extends BaseBlock { .sound(SoundType.GRASS)); this.registerDefaultState(this.stateDefinition.any().setValue(NATURAL, false)); } - + @Override public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { return !state.getValue(NATURAL) || world.getBlockState(pos.below()).is(EndBlocks.GLOWING_PILLAR_ROOTS); } - + @Override public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, BlockPos pos, BlockPos neighborPos) { if (!canSurvive(state, world, pos)) { @@ -44,7 +44,7 @@ public class GlowingPillarLuminophorBlock extends BaseBlock { return state; } } - + @Override protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(NATURAL); diff --git a/src/main/java/ru/betterend/blocks/GlowingPillarRootsBlock.java b/src/main/java/ru/betterend/blocks/GlowingPillarRootsBlock.java index fe1f49ef..4af0f1ac 100644 --- a/src/main/java/ru/betterend/blocks/GlowingPillarRootsBlock.java +++ b/src/main/java/ru/betterend/blocks/GlowingPillarRootsBlock.java @@ -16,17 +16,17 @@ import ru.betterend.registry.EndBlocks; public class GlowingPillarRootsBlock extends UpDownPlantBlock { public static final EnumProperty SHAPE = BlockProperties.TRIPLE_SHAPE; - + @Override protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(SHAPE); } - + @Override protected boolean isTerrain(BlockState state) { return state.is(EndBlocks.AMBER_MOSS); } - + @Override @Environment(EnvType.CLIENT) public ItemStack getCloneItemStack(BlockGetter world, BlockPos pos, BlockState state) { diff --git a/src/main/java/ru/betterend/blocks/GlowingPillarSeedBlock.java b/src/main/java/ru/betterend/blocks/GlowingPillarSeedBlock.java index fa20609d..549f8664 100644 --- a/src/main/java/ru/betterend/blocks/GlowingPillarSeedBlock.java +++ b/src/main/java/ru/betterend/blocks/GlowingPillarSeedBlock.java @@ -1,7 +1,5 @@ package ru.betterend.blocks; -import java.util.Random; - import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; import net.minecraft.core.BlockPos; @@ -20,6 +18,8 @@ import ru.bclib.util.MHelper; import ru.betterend.blocks.basis.EndPlantWithAgeBlock; import ru.betterend.registry.EndBlocks; +import java.util.Random; + public class GlowingPillarSeedBlock extends EndPlantWithAgeBlock { public GlowingPillarSeedBlock() { @@ -31,7 +31,7 @@ public class GlowingPillarSeedBlock extends EndPlantWithAgeBlock { .randomTicks() .noCollission()); } - + @Override public void growAdult(WorldGenLevel world, Random random, BlockPos pos) { int height = MHelper.randRange(1, 2, random); @@ -39,19 +39,20 @@ public class GlowingPillarSeedBlock extends EndPlantWithAgeBlock { if (h < height) { return; } - + MutableBlockPos mut = new MutableBlockPos().set(pos); BlockState roots = EndBlocks.GLOWING_PILLAR_ROOTS.defaultBlockState(); if (height < 2) { BlocksHelper.setWithUpdate(world, mut, roots.setValue(BlockProperties.TRIPLE_SHAPE, TripleShape.MIDDLE)); - } else { + } + else { BlocksHelper.setWithUpdate(world, mut, roots.setValue(BlockProperties.TRIPLE_SHAPE, TripleShape.BOTTOM)); mut.move(Direction.UP); BlocksHelper.setWithUpdate(world, mut, roots.setValue(BlockProperties.TRIPLE_SHAPE, TripleShape.TOP)); } mut.move(Direction.UP); BlocksHelper.setWithUpdate(world, mut, EndBlocks.GLOWING_PILLAR_LUMINOPHOR.defaultBlockState().setValue(BlueVineLanternBlock.NATURAL, true)); - for (Direction dir: BlocksHelper.DIRECTIONS) { + for (Direction dir : BlocksHelper.DIRECTIONS) { pos = mut.relative(dir); if (world.isEmptyBlock(pos)) { BlocksHelper.setWithUpdate(world, pos, EndBlocks.GLOWING_PILLAR_LEAVES.defaultBlockState().setValue(BlockStateProperties.FACING, dir)); @@ -62,12 +63,12 @@ public class GlowingPillarSeedBlock extends EndPlantWithAgeBlock { BlocksHelper.setWithUpdate(world, mut, EndBlocks.GLOWING_PILLAR_LEAVES.defaultBlockState().setValue(BlockStateProperties.FACING, Direction.UP)); } } - + @Override protected boolean isTerrain(BlockState state) { return state.is(EndBlocks.AMBER_MOSS); } - + @Override public BlockBehaviour.OffsetType getOffsetType() { return BlockBehaviour.OffsetType.NONE; diff --git a/src/main/java/ru/betterend/blocks/HelixTreeLeavesBlock.java b/src/main/java/ru/betterend/blocks/HelixTreeLeavesBlock.java index 2a15a97e..3f893e82 100644 --- a/src/main/java/ru/betterend/blocks/HelixTreeLeavesBlock.java +++ b/src/main/java/ru/betterend/blocks/HelixTreeLeavesBlock.java @@ -1,10 +1,6 @@ package ru.betterend.blocks; -import java.util.Collections; -import java.util.List; - import com.google.common.collect.Lists; - import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; import net.minecraft.client.color.block.BlockColor; @@ -30,10 +26,13 @@ import ru.bclib.util.MHelper; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; +import java.util.Collections; +import java.util.List; + public class HelixTreeLeavesBlock extends BaseBlock implements IColorProvider { public static final IntegerProperty COLOR = EndBlockProperties.COLOR; private static final OpenSimplexNoise NOISE = new OpenSimplexNoise(0); - + public HelixTreeLeavesBlock() { super(FabricBlockSettings.of(Material.LEAVES) .materialColor(MaterialColor.COLOR_ORANGE) @@ -42,7 +41,7 @@ public class HelixTreeLeavesBlock extends BaseBlock implements IColorProvider { .sound(SoundType.GRASS) .strength(0.2F)); } - + @Override protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(COLOR); @@ -61,7 +60,7 @@ public class HelixTreeLeavesBlock extends BaseBlock implements IColorProvider { return ColorUtil.color(237, getGreen(4), 20); }; } - + @Override public BlockState getStateForPlacement(BlockPlaceContext ctx) { double px = ctx.getClickedPos().getX() * 0.1; @@ -69,12 +68,12 @@ public class HelixTreeLeavesBlock extends BaseBlock implements IColorProvider { double pz = ctx.getClickedPos().getZ() * 0.1; return this.defaultBlockState().setValue(COLOR, MHelper.floor(NOISE.eval(px, py, pz) * 3.5 + 4)); } - + private int getGreen(int color) { float delta = color / 7F; return (int) Mth.lerp(delta, 80, 158); } - + @Override public List getDrops(BlockState state, LootContext.Builder builder) { ItemStack tool = builder.getParameter(LootContextParams.TOOL); diff --git a/src/main/java/ru/betterend/blocks/HydraluxBlock.java b/src/main/java/ru/betterend/blocks/HydraluxBlock.java index 9169bfaf..f5f93876 100644 --- a/src/main/java/ru/betterend/blocks/HydraluxBlock.java +++ b/src/main/java/ru/betterend/blocks/HydraluxBlock.java @@ -1,11 +1,6 @@ package ru.betterend.blocks; -import java.util.Collections; -import java.util.List; -import java.util.Random; - import com.google.common.collect.Lists; - import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; @@ -29,10 +24,14 @@ import ru.betterend.blocks.EndBlockProperties.HydraluxShape; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndItems; +import java.util.Collections; +import java.util.List; +import java.util.Random; + public class HydraluxBlock extends UnderwaterPlantBlock { public static final EnumProperty SHAPE = EndBlockProperties.HYDRALUX_SHAPE; - + public HydraluxBlock() { super(FabricBlockSettings.of(Material.WATER_PLANT) .breakByTool(FabricToolTags.SHEARS) @@ -41,12 +40,12 @@ public class HydraluxBlock extends UnderwaterPlantBlock { .lightLevel((state) -> state.getValue(SHAPE).hasGlow() ? 15 : 0) .noCollission()); } - + @Override protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(SHAPE); } - + @Override public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { BlockState down = world.getBlockState(pos.below()); @@ -76,13 +75,13 @@ public class HydraluxBlock extends UnderwaterPlantBlock { public boolean isBonemealSuccess(Level world, Random random, BlockPos pos, BlockState state) { return false; } - + @Override @Environment(EnvType.CLIENT) public ItemStack getCloneItemStack(BlockGetter world, BlockPos pos, BlockState state) { return new ItemStack(EndBlocks.HYDRALUX_SAPLING); } - + @Override public List getDrops(BlockState state, LootContext.Builder builder) { HydraluxShape shape = state.getValue(SHAPE); diff --git a/src/main/java/ru/betterend/blocks/HydraluxPetalBlock.java b/src/main/java/ru/betterend/blocks/HydraluxPetalBlock.java index c1157780..14c08d7d 100644 --- a/src/main/java/ru/betterend/blocks/HydraluxPetalBlock.java +++ b/src/main/java/ru/betterend/blocks/HydraluxPetalBlock.java @@ -21,11 +21,12 @@ public class HydraluxPetalBlock extends BaseBlock { .materialColor(MaterialColor.PODZOL) .sound(SoundType.WART_BLOCK)); } - + public HydraluxPetalBlock(Properties settings) { super(settings); } - + @Override - public void fallOn(Level level, BlockState blockState, BlockPos blockPos, Entity entity, float f) {} + public void fallOn(Level level, BlockState blockState, BlockPos blockPos, Entity entity, float f) { + } } diff --git a/src/main/java/ru/betterend/blocks/HydraluxPetalColoredBlock.java b/src/main/java/ru/betterend/blocks/HydraluxPetalColoredBlock.java index 599bbe15..0b27b837 100644 --- a/src/main/java/ru/betterend/blocks/HydraluxPetalColoredBlock.java +++ b/src/main/java/ru/betterend/blocks/HydraluxPetalColoredBlock.java @@ -1,9 +1,5 @@ package ru.betterend.blocks; -import java.util.Optional; - -import org.jetbrains.annotations.Nullable; - import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; @@ -12,16 +8,19 @@ import net.minecraft.client.color.item.ItemColor; import net.minecraft.client.renderer.block.model.BlockModel; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.block.state.BlockState; +import org.jetbrains.annotations.Nullable; import ru.bclib.client.models.ModelsHelper; import ru.bclib.interfaces.IColorProvider; import ru.bclib.util.BlocksHelper; import ru.betterend.client.models.Patterns; +import java.util.Optional; + public class HydraluxPetalColoredBlock extends HydraluxPetalBlock implements IColorProvider { public HydraluxPetalColoredBlock(FabricBlockSettings settings) { super(settings); } - + @Override public BlockColor getProvider() { return (state, world, pos, tintIndex) -> BlocksHelper.getBlockColor(this); diff --git a/src/main/java/ru/betterend/blocks/HydraluxSaplingBlock.java b/src/main/java/ru/betterend/blocks/HydraluxSaplingBlock.java index f3b11147..05a2cf0b 100644 --- a/src/main/java/ru/betterend/blocks/HydraluxSaplingBlock.java +++ b/src/main/java/ru/betterend/blocks/HydraluxSaplingBlock.java @@ -1,7 +1,5 @@ package ru.betterend.blocks; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.world.level.WorldGenLevel; @@ -13,20 +11,22 @@ import ru.bclib.util.MHelper; import ru.betterend.blocks.EndBlockProperties.HydraluxShape; import ru.betterend.registry.EndBlocks; +import java.util.Random; + public class HydraluxSaplingBlock extends UnderwaterPlantWithAgeBlock { @Override public void grow(WorldGenLevel world, Random random, BlockPos pos) { int h = MHelper.randRange(4, 8, random); MutableBlockPos mut = new MutableBlockPos().set(pos); - + for (int i = 1; i < h; i++) { mut.setY(pos.getY() + i); if (!world.getBlockState(mut).is(Blocks.WATER)) { return; } } - + mut.setY(pos.getY()); BlockState state = EndBlocks.HYDRALUX.defaultBlockState(); BlocksHelper.setWithoutUpdate(world, pos, state.setValue(EndBlockProperties.HYDRALUX_SHAPE, HydraluxShape.ROOTS)); @@ -34,15 +34,15 @@ public class HydraluxSaplingBlock extends UnderwaterPlantWithAgeBlock { mut.setY(pos.getY() + i); BlocksHelper.setWithoutUpdate(world, mut, state.setValue(EndBlockProperties.HYDRALUX_SHAPE, HydraluxShape.VINE)); } - + mut.setY(mut.getY() + 1); boolean big = random.nextBoolean(); BlocksHelper.setWithoutUpdate(world, mut, state.setValue(EndBlockProperties.HYDRALUX_SHAPE, big ? HydraluxShape.FLOWER_BIG_BOTTOM : HydraluxShape.FLOWER_SMALL_BOTTOM)); - + mut.setY(mut.getY() + 1); BlocksHelper.setWithoutUpdate(world, mut, state.setValue(EndBlockProperties.HYDRALUX_SHAPE, big ? HydraluxShape.FLOWER_BIG_TOP : HydraluxShape.FLOWER_SMALL_TOP)); } - + @Override protected boolean isTerrain(BlockState state) { return state.is(EndBlocks.SULPHURIC_ROCK.stone); diff --git a/src/main/java/ru/betterend/blocks/HydrothermalVentBlock.java b/src/main/java/ru/betterend/blocks/HydrothermalVentBlock.java index 96a55828..0eb88aea 100644 --- a/src/main/java/ru/betterend/blocks/HydrothermalVentBlock.java +++ b/src/main/java/ru/betterend/blocks/HydrothermalVentBlock.java @@ -1,9 +1,5 @@ package ru.betterend.blocks; -import java.util.Random; - -import org.jetbrains.annotations.Nullable; - import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; @@ -36,6 +32,7 @@ import net.minecraft.world.level.material.Fluids; import net.minecraft.world.level.material.Material; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; +import org.jetbrains.annotations.Nullable; import ru.bclib.blocks.BaseBlockNotFull; import ru.bclib.blocks.BlockProperties; import ru.bclib.util.BlocksHelper; @@ -43,12 +40,14 @@ import ru.betterend.blocks.entities.BlockEntityHydrothermalVent; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndParticles; +import java.util.Random; + @SuppressWarnings("deprecation") public class HydrothermalVentBlock extends BaseBlockNotFull implements EntityBlock, LiquidBlockContainer, SimpleWaterloggedBlock { public static final BooleanProperty WATERLOGGED = BlockStateProperties.WATERLOGGED; public static final BooleanProperty ACTIVATED = BlockProperties.ACTIVE; private static final VoxelShape SHAPE = Block.box(1, 1, 1, 15, 16, 15); - + public HydrothermalVentBlock() { super(FabricBlockSettings.of(Material.STONE) .breakByTool(FabricToolTags.PICKAXES) @@ -57,17 +56,17 @@ public class HydrothermalVentBlock extends BaseBlockNotFull implements EntityBlo .requiresCorrectToolForDrops()); this.registerDefaultState(defaultBlockState().setValue(WATERLOGGED, true).setValue(ACTIVATED, false)); } - + @Override protected void createBlockStateDefinition(StateDefinition.Builder builder) { builder.add(WATERLOGGED, ACTIVATED); } - + @Override public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { return SHAPE; } - + @Override public boolean canPlaceLiquid(BlockGetter world, BlockPos pos, BlockState state, Fluid fluid) { return false; @@ -77,13 +76,13 @@ public class HydrothermalVentBlock extends BaseBlockNotFull implements EntityBlo public boolean placeLiquid(LevelAccessor world, BlockPos pos, BlockState state, FluidState fluidState) { return false; } - + @Override public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { state = world.getBlockState(pos.below()); return state.is(EndBlocks.SULPHURIC_ROCK.stone); } - + @Override public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, BlockPos pos, BlockPos neighborPos) { if (!canSurvive(state, world, pos)) { @@ -94,14 +93,14 @@ public class HydrothermalVentBlock extends BaseBlockNotFull implements EntityBlo } return state; } - + @Override public BlockState getStateForPlacement(BlockPlaceContext ctx) { LevelAccessor worldAccess = ctx.getLevel(); BlockPos blockPos = ctx.getClickedPos(); return this.defaultBlockState().setValue(WATERLOGGED, worldAccess.getFluidState(blockPos).getType() == Fluids.WATER); } - + @Override public FluidState getFluidState(BlockState state) { return state.getValue(WATERLOGGED) ? Fluids.WATER.getSource(false) : super.getFluidState(state); @@ -120,14 +119,14 @@ public class HydrothermalVentBlock extends BaseBlockNotFull implements EntityBlo world.getBlockTicks().scheduleTick(up, EndBlocks.VENT_BUBBLE_COLUMN, 5); } } - + @Override public void setPlacedBy(Level world, BlockPos pos, BlockState state, @Nullable LivingEntity placer, ItemStack itemStack) { if (world instanceof ServerLevel && state.getValue(WATERLOGGED) && world.getBlockState(pos.above()).is(Blocks.WATER)) { - tick(state,(ServerLevel) world, pos, world.random); + tick(state, (ServerLevel) world, pos, world.random); } } - + @Environment(EnvType.CLIENT) public void animateTick(BlockState state, Level world, BlockPos pos, Random random) { if (!state.getValue(ACTIVATED) && random.nextBoolean()) { diff --git a/src/main/java/ru/betterend/blocks/InfusionPedestal.java b/src/main/java/ru/betterend/blocks/InfusionPedestal.java index 4b49d48d..d1401a17 100644 --- a/src/main/java/ru/betterend/blocks/InfusionPedestal.java +++ b/src/main/java/ru/betterend/blocks/InfusionPedestal.java @@ -23,7 +23,7 @@ public class InfusionPedestal extends PedestalBlock { super(Blocks.OBSIDIAN); this.height = 1.08F; } - + @Override public void checkRitual(Level world, BlockPos pos) { BlockEntity blockEntity = world.getBlockEntity(pos); @@ -35,14 +35,15 @@ public class InfusionPedestal extends PedestalBlock { ritual.configure(); } pedestal.getRitual().checkRecipe(); - } else { + } + else { InfusionRitual ritual = new InfusionRitual(pedestal, world, pos); pedestal.linkRitual(ritual); ritual.checkRecipe(); } } } - + @Override public BlockEntity newBlockEntity(BlockPos blockPos, BlockState blockState) { return new InfusionPedestalEntity(blockPos, blockState); @@ -57,7 +58,7 @@ public class InfusionPedestal extends PedestalBlock { @Deprecated public VoxelShape getShape(BlockState state, BlockGetter world, BlockPos pos, CollisionContext context) { if (state.is(this)) { - switch(state.getValue(STATE)) { + switch (state.getValue(STATE)) { case PEDESTAL_TOP: { return SHAPE_PEDESTAL_TOP; } diff --git a/src/main/java/ru/betterend/blocks/JellyshroomCapBlock.java b/src/main/java/ru/betterend/blocks/JellyshroomCapBlock.java index 681e3578..b0b857aa 100644 --- a/src/main/java/ru/betterend/blocks/JellyshroomCapBlock.java +++ b/src/main/java/ru/betterend/blocks/JellyshroomCapBlock.java @@ -1,12 +1,6 @@ package ru.betterend.blocks; -import java.util.List; -import java.util.Optional; - -import org.jetbrains.annotations.Nullable; - import com.google.common.collect.Lists; - import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; @@ -25,6 +19,7 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.block.state.properties.IntegerProperty; import net.minecraft.world.level.storage.loot.LootContext; +import org.jetbrains.annotations.Nullable; import ru.bclib.client.models.BlockModelProvider; import ru.bclib.client.models.ModelsHelper; import ru.bclib.client.render.BCLRenderLayer; @@ -35,20 +30,23 @@ import ru.bclib.util.MHelper; import ru.betterend.client.models.Patterns; import ru.betterend.noise.OpenSimplexNoise; +import java.util.List; +import java.util.Optional; + public class JellyshroomCapBlock extends SlimeBlock implements IRenderTyped, BlockModelProvider, IColorProvider { public static final IntegerProperty COLOR = EndBlockProperties.COLOR; private static final OpenSimplexNoise NOISE = new OpenSimplexNoise(0); private final Vec3i colorStart; private final Vec3i colorEnd; private final int coloritem; - + public JellyshroomCapBlock(int r1, int g1, int b1, int r2, int g2, int b2) { super(FabricBlockSettings.copyOf(Blocks.SLIME_BLOCK)); colorStart = new Vec3i(r1, g1, b1); colorEnd = new Vec3i(r2, g2, b2); coloritem = ColorUtil.color((r1 + r2) >> 1, (g1 + g2) >> 1, (b1 + b2) >> 1); } - + @Override public BlockState getStateForPlacement(BlockPlaceContext ctx) { double px = ctx.getClickedPos().getX() * 0.1; @@ -56,17 +54,17 @@ public class JellyshroomCapBlock extends SlimeBlock implements IRenderTyped, Blo double pz = ctx.getClickedPos().getZ() * 0.1; return this.defaultBlockState().setValue(COLOR, MHelper.floor(NOISE.eval(px, py, pz) * 3.5 + 4)); } - + @Override protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(COLOR); } - + @Override public BCLRenderLayer getRenderLayer() { return BCLRenderLayer.TRANSLUCENT; } - + @Override public List getDrops(BlockState state, LootContext.Builder builder) { return Lists.newArrayList(new ItemStack(this)); diff --git a/src/main/java/ru/betterend/blocks/LacugroveSaplingBlock.java b/src/main/java/ru/betterend/blocks/LacugroveSaplingBlock.java index 5c2a678e..f353b7dc 100644 --- a/src/main/java/ru/betterend/blocks/LacugroveSaplingBlock.java +++ b/src/main/java/ru/betterend/blocks/LacugroveSaplingBlock.java @@ -17,7 +17,7 @@ public class LacugroveSaplingBlock extends FeatureSaplingBlock { protected Feature getFeature() { return EndFeatures.LACUGROVE.getFeature(); } - + @Override public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { return world.getBlockState(pos.below()).is(EndBlocks.END_MOSS) || world.getBlockState(pos.below()).is(EndBlocks.ENDSTONE_DUST); diff --git a/src/main/java/ru/betterend/blocks/LanceleafBlock.java b/src/main/java/ru/betterend/blocks/LanceleafBlock.java index a7e29890..081405ab 100644 --- a/src/main/java/ru/betterend/blocks/LanceleafBlock.java +++ b/src/main/java/ru/betterend/blocks/LanceleafBlock.java @@ -1,8 +1,5 @@ package ru.betterend.blocks; -import java.util.Collections; -import java.util.List; - import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.item.ItemStack; @@ -21,11 +18,14 @@ import ru.bclib.util.MHelper; import ru.betterend.blocks.basis.EndPlantBlock; import ru.betterend.registry.EndBlocks; +import java.util.Collections; +import java.util.List; + public class LanceleafBlock extends EndPlantBlock { public static final EnumProperty SHAPE = BlockProperties.PENTA_SHAPE; public static final IntegerProperty ROTATION = BlockProperties.ROTATION; - + public LanceleafBlock() { super(); } @@ -34,7 +34,7 @@ public class LanceleafBlock extends EndPlantBlock { protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(SHAPE, ROTATION); } - + @Override public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { PentaShape shape = state.getValue(SHAPE); @@ -48,7 +48,7 @@ public class LanceleafBlock extends EndPlantBlock { return world.getBlockState(pos.below()).is(this) && world.getBlockState(pos.above()).is(this); } } - + @Override public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, BlockPos pos, BlockPos neighborPos) { if (!canSurvive(state, world, pos)) { @@ -58,7 +58,7 @@ public class LanceleafBlock extends EndPlantBlock { return state; } } - + @Override public List getDrops(BlockState state, LootContext.Builder builder) { if (state.getValue(SHAPE) == PentaShape.BOTTOM) { diff --git a/src/main/java/ru/betterend/blocks/LanceleafSeedBlock.java b/src/main/java/ru/betterend/blocks/LanceleafSeedBlock.java index 8c8455e9..8325e8f7 100644 --- a/src/main/java/ru/betterend/blocks/LanceleafSeedBlock.java +++ b/src/main/java/ru/betterend/blocks/LanceleafSeedBlock.java @@ -1,7 +1,5 @@ package ru.betterend.blocks; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; @@ -15,6 +13,8 @@ import ru.bclib.util.MHelper; import ru.betterend.blocks.basis.EndPlantWithAgeBlock; import ru.betterend.registry.EndBlocks; +import java.util.Random; + public class LanceleafSeedBlock extends EndPlantWithAgeBlock { @Override public void growAdult(WorldGenLevel world, Random random, BlockPos pos) { @@ -34,12 +34,12 @@ public class LanceleafSeedBlock extends EndPlantWithAgeBlock { BlocksHelper.setWithoutUpdate(world, mut.move(Direction.UP), plant.setValue(BlockProperties.PENTA_SHAPE, PentaShape.PRE_TOP)); BlocksHelper.setWithoutUpdate(world, mut.move(Direction.UP), plant.setValue(BlockProperties.PENTA_SHAPE, PentaShape.TOP)); } - + @Override protected boolean isTerrain(BlockState state) { return state.is(EndBlocks.AMBER_MOSS); } - + @Override public BlockBehaviour.OffsetType getOffsetType() { return BlockBehaviour.OffsetType.NONE; diff --git a/src/main/java/ru/betterend/blocks/LargeAmaranitaBlock.java b/src/main/java/ru/betterend/blocks/LargeAmaranitaBlock.java index d45f9de2..098140af 100644 --- a/src/main/java/ru/betterend/blocks/LargeAmaranitaBlock.java +++ b/src/main/java/ru/betterend/blocks/LargeAmaranitaBlock.java @@ -1,7 +1,5 @@ package ru.betterend.blocks; -import java.util.Random; - import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; import net.minecraft.core.BlockPos; @@ -22,11 +20,13 @@ import ru.bclib.blocks.BlockProperties.TripleShape; import ru.betterend.blocks.basis.EndPlantBlock; import ru.betterend.registry.EndBlocks; +import java.util.Random; + public class LargeAmaranitaBlock extends EndPlantBlock { public static final EnumProperty SHAPE = BlockProperties.TRIPLE_SHAPE; private static final VoxelShape SHAPE_BOTTOM = Block.box(4, 0, 4, 12, 14, 12); private static final VoxelShape SHAPE_TOP = Shapes.or(Block.box(1, 3, 1, 15, 16, 15), SHAPE_BOTTOM); - + public LargeAmaranitaBlock() { super(FabricBlockSettings.of(Material.PLANT) .breakByTool(FabricToolTags.SHEARS) @@ -34,22 +34,22 @@ public class LargeAmaranitaBlock extends EndPlantBlock { .sound(SoundType.GRASS) .lightLevel((state) -> (state.getValue(SHAPE) == TripleShape.TOP) ? 15 : 0)); } - + @Override public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { return state.getValue(SHAPE) == TripleShape.TOP ? SHAPE_TOP : SHAPE_BOTTOM; } - + @Override protected boolean isTerrain(BlockState state) { return state.is(EndBlocks.SANGNUM) || state.is(EndBlocks.MOSSY_OBSIDIAN) || state.is(EndBlocks.MOSSY_DRAGON_BONE); } - + @Override protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(SHAPE); } - + @Override public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { TripleShape shape = state.getValue(SHAPE); @@ -63,12 +63,12 @@ public class LargeAmaranitaBlock extends EndPlantBlock { return world.getBlockState(pos.below()).is(this) && world.getBlockState(pos.above()).is(this); } } - + @Override public OffsetType getOffsetType() { return OffsetType.NONE; } - + @Override public boolean isValidBonemealTarget(BlockGetter world, BlockPos pos, BlockState state, boolean isClient) { return false; diff --git a/src/main/java/ru/betterend/blocks/LucerniaSaplingBlock.java b/src/main/java/ru/betterend/blocks/LucerniaSaplingBlock.java index 91ed218a..b174bb8e 100644 --- a/src/main/java/ru/betterend/blocks/LucerniaSaplingBlock.java +++ b/src/main/java/ru/betterend/blocks/LucerniaSaplingBlock.java @@ -17,7 +17,7 @@ public class LucerniaSaplingBlock extends FeatureSaplingBlock { protected Feature getFeature() { return EndFeatures.LUCERNIA.getFeature(); } - + @Override public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { return world.getBlockState(pos.below()).is(EndBlocks.RUTISCUS); diff --git a/src/main/java/ru/betterend/blocks/LumecornBlock.java b/src/main/java/ru/betterend/blocks/LumecornBlock.java index e0717bea..95257dd1 100644 --- a/src/main/java/ru/betterend/blocks/LumecornBlock.java +++ b/src/main/java/ru/betterend/blocks/LumecornBlock.java @@ -1,8 +1,5 @@ package ru.betterend.blocks; -import java.util.Collections; -import java.util.List; - import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; @@ -31,19 +28,22 @@ import ru.betterend.blocks.EndBlockProperties.LumecornShape; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndItems; +import java.util.Collections; +import java.util.List; + @SuppressWarnings("deprecation") public class LumecornBlock extends BaseBlockNotFull implements IRenderTyped { public static final EnumProperty SHAPE = EnumProperty.create("shape", LumecornShape.class); private static final VoxelShape SHAPE_BOTTOM = Block.box(6, 0, 6, 10, 16, 10); private static final VoxelShape SHAPE_TOP = Block.box(6, 0, 6, 10, 8, 10); - + public LumecornBlock() { super(FabricBlockSettings.of(Material.WOOD) .breakByTool(FabricToolTags.AXES) .hardness(0.5F) .luminance(state -> state.getValue(SHAPE).getLight())); } - + @Override protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(SHAPE); @@ -53,12 +53,12 @@ public class LumecornBlock extends BaseBlockNotFull implements IRenderTyped { public BCLRenderLayer getRenderLayer() { return BCLRenderLayer.CUTOUT; } - + @Override public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { return state.getValue(SHAPE) == LumecornShape.LIGHT_TOP ? SHAPE_TOP : SHAPE_BOTTOM; } - + @Override public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { LumecornShape shape = state.getValue(SHAPE); @@ -72,7 +72,7 @@ public class LumecornBlock extends BaseBlockNotFull implements IRenderTyped { return world.getBlockState(pos.below()).is(this) && world.getBlockState(pos.above()).is(this); } } - + @Override public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, BlockPos pos, BlockPos neighborPos) { if (!canSurvive(state, world, pos)) { @@ -82,7 +82,7 @@ public class LumecornBlock extends BaseBlockNotFull implements IRenderTyped { return state; } } - + @Override public List getDrops(BlockState state, LootContext.Builder builder) { LumecornShape shape = state.getValue(SHAPE); @@ -91,7 +91,7 @@ public class LumecornBlock extends BaseBlockNotFull implements IRenderTyped { } return MHelper.RANDOM.nextBoolean() ? Collections.singletonList(new ItemStack(EndItems.LUMECORN_ROD)) : Collections.emptyList(); } - + @Override @Environment(EnvType.CLIENT) public ItemStack getCloneItemStack(BlockGetter world, BlockPos pos, BlockState state) { diff --git a/src/main/java/ru/betterend/blocks/LumecornSeedBlock.java b/src/main/java/ru/betterend/blocks/LumecornSeedBlock.java index ec666d67..b7e7b3af 100644 --- a/src/main/java/ru/betterend/blocks/LumecornSeedBlock.java +++ b/src/main/java/ru/betterend/blocks/LumecornSeedBlock.java @@ -1,7 +1,5 @@ package ru.betterend.blocks; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.state.BlockBehaviour; @@ -11,18 +9,20 @@ import ru.betterend.blocks.basis.EndPlantWithAgeBlock; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; +import java.util.Random; + public class LumecornSeedBlock extends EndPlantWithAgeBlock { @Override public void growAdult(WorldGenLevel world, Random random, BlockPos pos) { EndFeatures.LUMECORN.getFeature().place(new FeaturePlaceContext<>(world, null, random, pos, null)); } - + @Override protected boolean isTerrain(BlockState state) { return state.is(EndBlocks.END_MOSS); } - + @Override public BlockBehaviour.OffsetType getOffsetType() { return BlockBehaviour.OffsetType.NONE; diff --git a/src/main/java/ru/betterend/blocks/MengerSpongeBlock.java b/src/main/java/ru/betterend/blocks/MengerSpongeBlock.java index 6890f22a..8565038b 100644 --- a/src/main/java/ru/betterend/blocks/MengerSpongeBlock.java +++ b/src/main/java/ru/betterend/blocks/MengerSpongeBlock.java @@ -1,9 +1,6 @@ package ru.betterend.blocks; -import java.util.Queue; - import com.google.common.collect.Lists; - import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -17,26 +14,27 @@ import net.minecraft.world.level.block.LiquidBlock; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.material.FluidState; -import net.minecraft.world.level.material.Fluids; import net.minecraft.world.level.material.Material; import ru.bclib.blocks.BaseBlockNotFull; import ru.bclib.client.render.BCLRenderLayer; import ru.bclib.interfaces.IRenderTyped; import ru.betterend.registry.EndBlocks; +import java.util.Queue; + @SuppressWarnings("deprecation") public class MengerSpongeBlock extends BaseBlockNotFull implements IRenderTyped { public MengerSpongeBlock() { super(FabricBlockSettings.copyOf(Blocks.SPONGE).noOcclusion()); } - + @Override public void onPlace(BlockState state, Level world, BlockPos pos, BlockState oldState, boolean notify) { if (absorbWater(world, pos)) { world.setBlockAndUpdate(pos, EndBlocks.MENGER_SPONGE_WET.defaultBlockState()); } } - + @Override public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, BlockPos pos, BlockPos neighborPos) { if (absorbWater(world, pos)) { @@ -66,13 +64,15 @@ public class MengerSpongeBlock extends BaseBlockNotFull implements IRenderTyped if (j < 6) { queue.add(new Tuple<>(blockPos2, j + 1)); } - } else if (blockState.getBlock() instanceof LiquidBlock) { + } + else if (blockState.getBlock() instanceof LiquidBlock) { world.setBlock(blockPos2, Blocks.AIR.defaultBlockState(), 3); ++i; if (j < 6) { queue.add(new Tuple<>(blockPos2, j + 1)); } - } else if (material == Material.WATER_PLANT || material == Material.REPLACEABLE_WATER_PLANT) { + } + else if (material == Material.WATER_PLANT || material == Material.REPLACEABLE_WATER_PLANT) { BlockEntity blockEntity = blockState.hasBlockEntity() ? world.getBlockEntity(blockPos2) : null; dropResources(blockState, world, blockPos2, blockEntity); world.setBlock(blockPos2, Blocks.AIR.defaultBlockState(), 3); @@ -91,7 +91,7 @@ public class MengerSpongeBlock extends BaseBlockNotFull implements IRenderTyped return i > 0; } - + @Override public BCLRenderLayer getRenderLayer() { return BCLRenderLayer.CUTOUT; diff --git a/src/main/java/ru/betterend/blocks/MengerSpongeWetBlock.java b/src/main/java/ru/betterend/blocks/MengerSpongeWetBlock.java index 0908d9f3..2b9dc68b 100644 --- a/src/main/java/ru/betterend/blocks/MengerSpongeWetBlock.java +++ b/src/main/java/ru/betterend/blocks/MengerSpongeWetBlock.java @@ -1,7 +1,5 @@ package ru.betterend.blocks; -import java.util.Random; - import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; @@ -25,6 +23,8 @@ import ru.bclib.interfaces.IRenderTyped; import ru.bclib.util.BlocksHelper; import ru.betterend.registry.EndBlocks; +import java.util.Random; + @SuppressWarnings("deprecation") public class MengerSpongeWetBlock extends BaseBlockNotFull implements IRenderTyped { public MengerSpongeWetBlock() { @@ -94,12 +94,12 @@ public class MengerSpongeWetBlock extends BaseBlockNotFull implements IRenderTyp world.addFreshEntity(drop); } } - + @Override public BCLRenderLayer getRenderLayer() { return BCLRenderLayer.CUTOUT; } - + @Override public FluidState getFluidState(BlockState state) { return Fluids.WATER.getSource(false); diff --git a/src/main/java/ru/betterend/blocks/MossyDragonBoneBlock.java b/src/main/java/ru/betterend/blocks/MossyDragonBoneBlock.java index b7d3e7e1..28bbc7e1 100644 --- a/src/main/java/ru/betterend/blocks/MossyDragonBoneBlock.java +++ b/src/main/java/ru/betterend/blocks/MossyDragonBoneBlock.java @@ -1,9 +1,5 @@ package ru.betterend.blocks; -import java.util.Collections; -import java.util.List; -import java.util.Random; - import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -21,12 +17,16 @@ import net.minecraft.world.level.storage.loot.parameters.LootContextParams; import ru.bclib.blocks.BaseRotatedPillarBlock; import ru.betterend.registry.EndBlocks; +import java.util.Collections; +import java.util.List; +import java.util.Random; + @SuppressWarnings("deprecation") public class MossyDragonBoneBlock extends BaseRotatedPillarBlock { public MossyDragonBoneBlock() { super(FabricBlockSettings.copyOf(Blocks.BONE_BLOCK).hardness(0.5F).randomTicks()); } - + @Override public List getDrops(BlockState state, LootContext.Builder builder) { ItemStack tool = builder.getParameter(LootContextParams.TOOL); @@ -35,7 +35,7 @@ public class MossyDragonBoneBlock extends BaseRotatedPillarBlock { } return Collections.singletonList(new ItemStack(EndBlocks.DRAGON_BONE_BLOCK)); } - + @Override public void randomTick(BlockState state, ServerLevel world, BlockPos pos, Random random) { if (random.nextInt(16) == 0 && !canSurvive(state, world, pos)) { @@ -45,15 +45,17 @@ public class MossyDragonBoneBlock extends BaseRotatedPillarBlock { @Override public boolean canSurvive(BlockState state, LevelReader worldView, BlockPos pos) { - BlockPos blockPos = pos.above(); - BlockState blockState = worldView.getBlockState(blockPos); - if (blockState.is(Blocks.SNOW) && blockState.getValue(SnowLayerBlock.LAYERS) == 1) { - return true; - } else if (blockState.getFluidState().getAmount() == 8) { - return false; - } else { - int i = LayerLightEngine.getLightBlockInto(worldView, state, pos, blockState, blockPos, Direction.UP, blockState.getLightBlock(worldView, blockPos)); - return i < 5; - } - } + BlockPos blockPos = pos.above(); + BlockState blockState = worldView.getBlockState(blockPos); + if (blockState.is(Blocks.SNOW) && blockState.getValue(SnowLayerBlock.LAYERS) == 1) { + return true; + } + else if (blockState.getFluidState().getAmount() == 8) { + return false; + } + else { + int i = LayerLightEngine.getLightBlockInto(worldView, state, pos, blockState, blockPos, Direction.UP, blockState.getLightBlock(worldView, blockPos)); + return i < 5; + } + } } diff --git a/src/main/java/ru/betterend/blocks/MossyGlowshroomCapBlock.java b/src/main/java/ru/betterend/blocks/MossyGlowshroomCapBlock.java index 982d4cf6..c004ce87 100644 --- a/src/main/java/ru/betterend/blocks/MossyGlowshroomCapBlock.java +++ b/src/main/java/ru/betterend/blocks/MossyGlowshroomCapBlock.java @@ -14,12 +14,12 @@ import ru.betterend.registry.EndBlocks; public class MossyGlowshroomCapBlock extends BaseBlock { public static final BooleanProperty TRANSITION = EndBlockProperties.TRANSITION; - + public MossyGlowshroomCapBlock() { super(FabricBlockSettings.of(Material.WOOD).breakByTool(FabricToolTags.AXES).sound(SoundType.WOOD)); this.registerDefaultState(this.stateDefinition.any().setValue(TRANSITION, false)); } - + public BlockState getStateForPlacement(BlockPlaceContext ctx) { return this.defaultBlockState().setValue(TRANSITION, EndBlocks.MOSSY_GLOWSHROOM.isTreeLog(ctx.getLevel().getBlockState(ctx.getClickedPos().below()))); } diff --git a/src/main/java/ru/betterend/blocks/MossyGlowshroomSaplingBlock.java b/src/main/java/ru/betterend/blocks/MossyGlowshroomSaplingBlock.java index da75416d..64bc3c75 100644 --- a/src/main/java/ru/betterend/blocks/MossyGlowshroomSaplingBlock.java +++ b/src/main/java/ru/betterend/blocks/MossyGlowshroomSaplingBlock.java @@ -18,7 +18,7 @@ public class MossyGlowshroomSaplingBlock extends FeatureSaplingBlock { protected Feature getFeature() { return EndFeatures.MOSSY_GLOWSHROOM.getFeature(); } - + @Override public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { return world.getBlockState(pos.below()).is(EndBlocks.END_MOSS) || world.getBlockState(pos.below()).is(EndBlocks.END_MYCELIUM); diff --git a/src/main/java/ru/betterend/blocks/MossyObsidian.java b/src/main/java/ru/betterend/blocks/MossyObsidian.java index d3423fdf..b601c482 100644 --- a/src/main/java/ru/betterend/blocks/MossyObsidian.java +++ b/src/main/java/ru/betterend/blocks/MossyObsidian.java @@ -1,9 +1,5 @@ package ru.betterend.blocks; -import java.util.Collections; -import java.util.List; -import java.util.Random; - import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -20,11 +16,15 @@ import net.minecraft.world.level.storage.loot.LootContext; import net.minecraft.world.level.storage.loot.parameters.LootContextParams; import ru.bclib.blocks.BaseBlock; +import java.util.Collections; +import java.util.List; +import java.util.Random; + public class MossyObsidian extends BaseBlock { public MossyObsidian() { super(FabricBlockSettings.copyOf(Blocks.OBSIDIAN).hardness(3).randomTicks()); } - + @Override public List getDrops(BlockState state, LootContext.Builder builder) { ItemStack tool = builder.getParameter(LootContextParams.TOOL); @@ -33,24 +33,26 @@ public class MossyObsidian extends BaseBlock { } return Collections.singletonList(new ItemStack(Blocks.OBSIDIAN)); } - + @Override public void randomTick(BlockState state, ServerLevel world, BlockPos pos, Random random) { if (random.nextInt(16) == 0 && !canSurvive(state, world, pos)) { world.setBlockAndUpdate(pos, Blocks.OBSIDIAN.defaultBlockState()); } } - + public boolean canSurvive(BlockState state, LevelReader worldView, BlockPos pos) { - BlockPos blockPos = pos.above(); - BlockState blockState = worldView.getBlockState(blockPos); - if (blockState.is(Blocks.SNOW) && (Integer)blockState.getValue(SnowLayerBlock.LAYERS) == 1) { - return true; - } else if (blockState.getFluidState().getAmount() == 8) { - return false; - } else { - int i = LayerLightEngine.getLightBlockInto(worldView, state, pos, blockState, blockPos, Direction.UP, blockState.getLightBlock(worldView, blockPos)); - return i < 5; - } - } + BlockPos blockPos = pos.above(); + BlockState blockState = worldView.getBlockState(blockPos); + if (blockState.is(Blocks.SNOW) && (Integer) blockState.getValue(SnowLayerBlock.LAYERS) == 1) { + return true; + } + else if (blockState.getFluidState().getAmount() == 8) { + return false; + } + else { + int i = LayerLightEngine.getLightBlockInto(worldView, state, pos, blockState, blockPos, Direction.UP, blockState.getLightBlock(worldView, blockPos)); + return i < 5; + } + } } diff --git a/src/main/java/ru/betterend/blocks/MurkweedBlock.java b/src/main/java/ru/betterend/blocks/MurkweedBlock.java index cd7ec961..673fff3a 100644 --- a/src/main/java/ru/betterend/blocks/MurkweedBlock.java +++ b/src/main/java/ru/betterend/blocks/MurkweedBlock.java @@ -1,7 +1,5 @@ package ru.betterend.blocks; -import java.util.Random; - import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.core.BlockPos; @@ -17,6 +15,8 @@ import net.minecraft.world.level.pathfinder.PathComputationType; import ru.betterend.blocks.basis.EndPlantBlock; import ru.betterend.registry.EndBlocks; +import java.util.Random; + public class MurkweedBlock extends EndPlantBlock { @Override @Environment(EnvType.CLIENT) @@ -27,19 +27,19 @@ public class MurkweedBlock extends EndPlantBlock { double v = random.nextDouble() * 0.1; world.addParticle(ParticleTypes.ENTITY_EFFECT, x, y, z, v, v, v); } - + @Override public void entityInside(BlockState state, Level world, BlockPos pos, Entity entity) { if (entity instanceof LivingEntity && !((LivingEntity) entity).hasEffect(MobEffects.BLINDNESS)) { ((LivingEntity) entity).addEffect(new MobEffectInstance(MobEffects.BLINDNESS, 50)); } } - + @Override protected boolean isTerrain(BlockState state) { return state.is(EndBlocks.SHADOW_GRASS); } - + @Override public boolean isPathfindable(BlockState state, BlockGetter world, BlockPos pos, PathComputationType type) { return false; diff --git a/src/main/java/ru/betterend/blocks/NeedlegrassBlock.java b/src/main/java/ru/betterend/blocks/NeedlegrassBlock.java index 12d61fa8..7f55cd31 100644 --- a/src/main/java/ru/betterend/blocks/NeedlegrassBlock.java +++ b/src/main/java/ru/betterend/blocks/NeedlegrassBlock.java @@ -1,9 +1,6 @@ package ru.betterend.blocks; -import java.util.List; - import com.google.common.collect.Lists; - import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; import net.minecraft.core.BlockPos; import net.minecraft.world.damagesource.DamageSource; @@ -23,6 +20,8 @@ import ru.bclib.util.MHelper; import ru.betterend.blocks.basis.EndPlantBlock; import ru.betterend.registry.EndBlocks; +import java.util.List; + public class NeedlegrassBlock extends EndPlantBlock { @Override public void entityInside(BlockState state, Level world, BlockPos pos, Entity entity) { @@ -30,7 +29,7 @@ public class NeedlegrassBlock extends EndPlantBlock { entity.hurt(DamageSource.CACTUS, 0.1F); } } - + @Override public List getDrops(BlockState state, LootContext.Builder builder) { ItemStack tool = builder.getParameter(LootContextParams.TOOL); @@ -41,7 +40,7 @@ public class NeedlegrassBlock extends EndPlantBlock { return Lists.newArrayList(new ItemStack(Items.STICK, MHelper.randRange(0, 2, MHelper.RANDOM))); } } - + @Override protected boolean isTerrain(BlockState state) { return state.is(EndBlocks.SHADOW_GRASS); diff --git a/src/main/java/ru/betterend/blocks/NeonCactusPlantBlock.java b/src/main/java/ru/betterend/blocks/NeonCactusPlantBlock.java index 568ea567..8cd897ef 100644 --- a/src/main/java/ru/betterend/blocks/NeonCactusPlantBlock.java +++ b/src/main/java/ru/betterend/blocks/NeonCactusPlantBlock.java @@ -1,12 +1,7 @@ package ru.betterend.blocks; -import java.util.EnumMap; -import java.util.List; -import java.util.Random; - import com.google.common.collect.Lists; import com.google.common.collect.Maps; - import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; @@ -48,13 +43,17 @@ import ru.bclib.util.MHelper; import ru.betterend.blocks.EndBlockProperties.CactusBottom; import ru.betterend.registry.EndBlocks; +import java.util.EnumMap; +import java.util.List; +import java.util.Random; + @SuppressWarnings("deprecation") public class NeonCactusPlantBlock extends BaseBlockNotFull implements SimpleWaterloggedBlock, IRenderTyped { public static final EnumProperty SHAPE = BlockProperties.TRIPLE_SHAPE; public static final EnumProperty CACTUS_BOTTOM = EndBlockProperties.CACTUS_BOTTOM; public static final BooleanProperty WATERLOGGED = BlockStateProperties.WATERLOGGED; public static final DirectionProperty FACING = BlockStateProperties.FACING; - + private static final EnumMap BIG_SHAPES_OPEN = Maps.newEnumMap(Direction.class); private static final EnumMap MEDIUM_SHAPES_OPEN = Maps.newEnumMap(Direction.class); private static final EnumMap SMALL_SHAPES_OPEN = Maps.newEnumMap(Direction.class); @@ -62,17 +61,17 @@ public class NeonCactusPlantBlock extends BaseBlockNotFull implements SimpleWate private static final EnumMap MEDIUM_SHAPES = Maps.newEnumMap(Axis.class); private static final EnumMap SMALL_SHAPES = Maps.newEnumMap(Axis.class); private static final int MAX_LENGTH = 12; - + public NeonCactusPlantBlock() { super(FabricBlockSettings.copyOf(Blocks.CACTUS).luminance(15).randomTicks()); registerDefaultState(defaultBlockState().setValue(WATERLOGGED, false).setValue(FACING, Direction.UP).setValue(SHAPE, TripleShape.TOP)); } - + @Override protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(SHAPE, CACTUS_BOTTOM, WATERLOGGED, FACING); } - + @Override public BlockState getStateForPlacement(BlockPlaceContext ctx) { LevelAccessor world = ctx.getLevel(); @@ -91,7 +90,7 @@ public class NeonCactusPlantBlock extends BaseBlockNotFull implements SimpleWate } return state; } - + @Override public BlockState rotate(BlockState state, Rotation rotation) { return BlocksHelper.rotateHorizontal(state, rotation, FACING); @@ -101,12 +100,12 @@ public class NeonCactusPlantBlock extends BaseBlockNotFull implements SimpleWate public BlockState mirror(BlockState state, Mirror mirror) { return BlocksHelper.mirrorHorizontal(state, mirror, FACING); } - + @Override public FluidState getFluidState(BlockState state) { return state.getValue(WATERLOGGED) ? Fluids.WATER.getSource(false) : super.getFluidState(state); } - + @Override public BlockState updateShape(BlockState state, Direction direction, BlockState newState, LevelAccessor world, BlockPos pos, BlockPos posFrom) { world.getBlockTicks().scheduleTick(pos, this, 2); @@ -126,19 +125,19 @@ public class NeonCactusPlantBlock extends BaseBlockNotFull implements SimpleWate } return state; } - + @Override public void tick(BlockState blockState, ServerLevel serverLevel, BlockPos blockPos, Random random) { if (!blockState.canSurvive(serverLevel, blockPos)) { serverLevel.destroyBlock(blockPos, true, null, 1); } } - + @Override public BCLRenderLayer getRenderLayer() { return BCLRenderLayer.CUTOUT; } - + @Override public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { TripleShape shape = state.getValue(SHAPE); @@ -158,7 +157,7 @@ public class NeonCactusPlantBlock extends BaseBlockNotFull implements SimpleWate return shape == TripleShape.MIDDLE ? MEDIUM_SHAPES_OPEN.get(dir) : SMALL_SHAPES_OPEN.get(dir); } } - + @Override public boolean canSurvive(BlockState state, LevelReader level, BlockPos pos) { Direction dir = state.getValue(FACING); @@ -166,12 +165,12 @@ public class NeonCactusPlantBlock extends BaseBlockNotFull implements SimpleWate BlockState support = level.getBlockState(supportPos); return support.is(this) || support.isFaceSturdy(level, supportPos, dir); } - + @Override public void randomTick(BlockState state, ServerLevel world, BlockPos pos, Random random) { if (!this.canSurvive(state, world, pos) || random.nextInt(8) > 0) { return; - } + } Direction dir = state.getValue(FACING); if (!world.isEmptyBlock(pos.relative(dir))) { return; @@ -201,11 +200,11 @@ public class NeonCactusPlantBlock extends BaseBlockNotFull implements SimpleWate BlocksHelper.setWithoutUpdate(world, pos.relative(dir), placement); mutateStem(placement, world, pos, MAX_LENGTH); } - + public void growPlant(WorldGenLevel world, BlockPos pos, Random random) { growPlant(world, pos, random, MHelper.randRange(MAX_LENGTH >> 1, MAX_LENGTH, random)); } - + public void growPlant(WorldGenLevel world, BlockPos pos, Random random, int iterations) { BlockState state = defaultBlockState(); BlockState downState = world.getBlockState(pos.below()); @@ -231,7 +230,7 @@ public class NeonCactusPlantBlock extends BaseBlockNotFull implements SimpleWate } } } - + private boolean growIteration(WorldGenLevel world, MutableBlockPos pos, Random random, List ends, int length) { BlockState state = world.getBlockState(pos); if (!state.is(this)) { @@ -265,7 +264,7 @@ public class NeonCactusPlantBlock extends BaseBlockNotFull implements SimpleWate pos.move(dir); return true; } - + private Direction getSideDirection(WorldGenLevel world, BlockPos pos, BlockState iterState, Direction dir, Random random) { MutableBlockPos iterPos = pos.mutable(); Direction startDir = dir; @@ -273,7 +272,7 @@ public class NeonCactusPlantBlock extends BaseBlockNotFull implements SimpleWate while (iterState.is(this) && startDir.getAxis().isVertical()) { startDir = iterState.getValue(FACING); if (lastDir == null) { - for (Direction side: BlocksHelper.HORIZONTAL) { + for (Direction side : BlocksHelper.HORIZONTAL) { BlockState sideState = world.getBlockState(iterPos.relative(side)); if (sideState.is(this)) { Direction sideDir = sideState.getValue(FACING); @@ -287,7 +286,7 @@ public class NeonCactusPlantBlock extends BaseBlockNotFull implements SimpleWate iterPos.move(dir); iterState = world.getBlockState(iterPos); } - + Direction side = lastDir == null ? BlocksHelper.randomHorizontal(random) : lastDir.getClockWise(); if (side.getOpposite() == startDir) { side = side.getOpposite(); @@ -299,12 +298,12 @@ public class NeonCactusPlantBlock extends BaseBlockNotFull implements SimpleWate public boolean isPathfindable(BlockState blockState, BlockGetter blockGetter, BlockPos blockPos, PathComputationType pathComputationType) { return false; } - + @Override public void entityInside(BlockState blockState, Level level, BlockPos blockPos, Entity entity) { entity.hurt(DamageSource.CACTUS, 1.0F); } - + private int getLength(BlockState state, ServerLevel world, BlockPos pos, int max) { int length = 0; Direction dir = state.getValue(FACING).getOpposite(); @@ -319,11 +318,11 @@ public class NeonCactusPlantBlock extends BaseBlockNotFull implements SimpleWate break; } dir = state.getValue(FACING).getOpposite(); - length ++; + length++; } return length; } - + private int getHorizontal(BlockState state, WorldGenLevel world, BlockPos pos, int max) { int count = 0; Direction dir = state.getValue(FACING).getOpposite(); @@ -338,11 +337,11 @@ public class NeonCactusPlantBlock extends BaseBlockNotFull implements SimpleWate if (dir.getStepY() != 0) { break; } - count ++; + count++; } return count; } - + private void mutateStem(BlockState state, WorldGenLevel world, BlockPos pos, int max) { Direction dir = state.getValue(FACING).getOpposite(); MutableBlockPos mut = new MutableBlockPos().set(pos); @@ -361,39 +360,39 @@ public class NeonCactusPlantBlock extends BaseBlockNotFull implements SimpleWate } } } - + static { BIG_SHAPES.put(Axis.X, Block.box(0, 2, 2, 16, 14, 14)); BIG_SHAPES.put(Axis.Y, Block.box(2, 0, 2, 14, 16, 14)); BIG_SHAPES.put(Axis.Z, Block.box(2, 2, 0, 14, 14, 16)); - + MEDIUM_SHAPES.put(Axis.X, Block.box(0, 3, 3, 16, 13, 13)); MEDIUM_SHAPES.put(Axis.Y, Block.box(3, 0, 3, 13, 16, 13)); MEDIUM_SHAPES.put(Axis.Z, Block.box(3, 3, 0, 13, 13, 16)); - + SMALL_SHAPES.put(Axis.X, Block.box(0, 4, 4, 16, 12, 12)); SMALL_SHAPES.put(Axis.Y, Block.box(4, 0, 4, 12, 16, 12)); SMALL_SHAPES.put(Axis.Z, Block.box(4, 4, 0, 12, 12, 16)); - - BIG_SHAPES_OPEN.put(Direction.UP, Block.box(2, 0, 2, 14, 14, 14)); - BIG_SHAPES_OPEN.put(Direction.DOWN, Block.box(2, 2, 2, 14, 16, 14)); + + BIG_SHAPES_OPEN.put(Direction.UP, Block.box(2, 0, 2, 14, 14, 14)); + BIG_SHAPES_OPEN.put(Direction.DOWN, Block.box(2, 2, 2, 14, 16, 14)); BIG_SHAPES_OPEN.put(Direction.NORTH, Block.box(2, 2, 2, 14, 14, 16)); BIG_SHAPES_OPEN.put(Direction.SOUTH, Block.box(2, 2, 0, 14, 14, 14)); - BIG_SHAPES_OPEN.put(Direction.WEST, Block.box(2, 2, 2, 16, 14, 14)); - BIG_SHAPES_OPEN.put(Direction.EAST, Block.box(0, 2, 2, 14, 14, 14)); - - MEDIUM_SHAPES_OPEN.put(Direction.UP, Block.box(3, 0, 3, 13, 13, 13)); - MEDIUM_SHAPES_OPEN.put(Direction.DOWN, Block.box(3, 3, 3, 13, 16, 13)); + BIG_SHAPES_OPEN.put(Direction.WEST, Block.box(2, 2, 2, 16, 14, 14)); + BIG_SHAPES_OPEN.put(Direction.EAST, Block.box(0, 2, 2, 14, 14, 14)); + + MEDIUM_SHAPES_OPEN.put(Direction.UP, Block.box(3, 0, 3, 13, 13, 13)); + MEDIUM_SHAPES_OPEN.put(Direction.DOWN, Block.box(3, 3, 3, 13, 16, 13)); MEDIUM_SHAPES_OPEN.put(Direction.NORTH, Block.box(3, 3, 3, 13, 13, 16)); MEDIUM_SHAPES_OPEN.put(Direction.SOUTH, Block.box(3, 3, 0, 13, 13, 13)); - MEDIUM_SHAPES_OPEN.put(Direction.WEST, Block.box(3, 3, 3, 16, 13, 13)); - MEDIUM_SHAPES_OPEN.put(Direction.EAST, Block.box(0, 3, 3, 13, 13, 13)); - - SMALL_SHAPES_OPEN.put(Direction.UP, Block.box(4, 0, 4, 12, 12, 12)); - SMALL_SHAPES_OPEN.put(Direction.DOWN, Block.box(4, 4, 4, 12, 16, 12)); + MEDIUM_SHAPES_OPEN.put(Direction.WEST, Block.box(3, 3, 3, 16, 13, 13)); + MEDIUM_SHAPES_OPEN.put(Direction.EAST, Block.box(0, 3, 3, 13, 13, 13)); + + SMALL_SHAPES_OPEN.put(Direction.UP, Block.box(4, 0, 4, 12, 12, 12)); + SMALL_SHAPES_OPEN.put(Direction.DOWN, Block.box(4, 4, 4, 12, 16, 12)); SMALL_SHAPES_OPEN.put(Direction.NORTH, Block.box(4, 4, 4, 12, 12, 16)); SMALL_SHAPES_OPEN.put(Direction.SOUTH, Block.box(4, 4, 0, 12, 12, 12)); - SMALL_SHAPES_OPEN.put(Direction.WEST, Block.box(4, 4, 4, 16, 12, 12)); - SMALL_SHAPES_OPEN.put(Direction.EAST, Block.box(0, 4, 4, 12, 12, 12)); + SMALL_SHAPES_OPEN.put(Direction.WEST, Block.box(4, 4, 4, 16, 12, 12)); + SMALL_SHAPES_OPEN.put(Direction.EAST, Block.box(0, 4, 4, 12, 12, 12)); } } diff --git a/src/main/java/ru/betterend/blocks/PedestalVanilla.java b/src/main/java/ru/betterend/blocks/PedestalVanilla.java index 77eafd9d..bc729cc9 100644 --- a/src/main/java/ru/betterend/blocks/PedestalVanilla.java +++ b/src/main/java/ru/betterend/blocks/PedestalVanilla.java @@ -1,13 +1,13 @@ package ru.betterend.blocks; -import java.util.HashMap; -import java.util.Map; - import net.minecraft.core.Registry; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.block.Block; import ru.betterend.blocks.basis.PedestalBlock; +import java.util.HashMap; +import java.util.Map; + public class PedestalVanilla extends PedestalBlock { public PedestalVanilla(Block parent) { @@ -20,8 +20,9 @@ public class PedestalVanilla extends PedestalBlock { String name = blockId.getPath().replace("_block", ""); return new HashMap() { private static final long serialVersionUID = 1L; + { - put("%mod%", blockId.getNamespace() ); + put("%mod%", blockId.getNamespace()); put("%top%", "polished_" + name); put("%base%", "polished_" + name); put("%pillar%", name + "_pillar"); diff --git a/src/main/java/ru/betterend/blocks/PondAnemoneBlock.java b/src/main/java/ru/betterend/blocks/PondAnemoneBlock.java index 8a485ed2..9ac012a2 100644 --- a/src/main/java/ru/betterend/blocks/PondAnemoneBlock.java +++ b/src/main/java/ru/betterend/blocks/PondAnemoneBlock.java @@ -1,7 +1,5 @@ package ru.betterend.blocks; -import java.util.Random; - import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; @@ -19,9 +17,11 @@ import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; import ru.betterend.blocks.basis.EndUnderwaterPlantBlock; +import java.util.Random; + public class PondAnemoneBlock extends EndUnderwaterPlantBlock { private static final VoxelShape SHAPE = Block.box(2, 0, 2, 14, 14, 14); - + public PondAnemoneBlock() { super(FabricBlockSettings.of(Material.WATER_PLANT) .breakByTool(FabricToolTags.SHEARS) @@ -30,7 +30,7 @@ public class PondAnemoneBlock extends EndUnderwaterPlantBlock { .sound(SoundType.CORAL_BLOCK) .noCollission()); } - + @Override public BlockBehaviour.OffsetType getOffsetType() { return BlockBehaviour.OffsetType.NONE; @@ -43,12 +43,12 @@ public class PondAnemoneBlock extends EndUnderwaterPlantBlock { double z = pos.getZ() + random.nextDouble(); world.addParticle(ParticleTypes.BUBBLE, x, y, z, 0.0D, 0.0D, 0.0D); } - + @Override public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { return SHAPE; } - + @Override public boolean isValidBonemealTarget(BlockGetter world, BlockPos pos, BlockState state, boolean isClient) { return false; diff --git a/src/main/java/ru/betterend/blocks/PythadendronSaplingBlock.java b/src/main/java/ru/betterend/blocks/PythadendronSaplingBlock.java index 1f01907e..580b129a 100644 --- a/src/main/java/ru/betterend/blocks/PythadendronSaplingBlock.java +++ b/src/main/java/ru/betterend/blocks/PythadendronSaplingBlock.java @@ -17,7 +17,7 @@ public class PythadendronSaplingBlock extends FeatureSaplingBlock { protected Feature getFeature() { return EndFeatures.PYTHADENDRON_TREE.getFeature(); } - + @Override public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { return world.getBlockState(pos.below()).is(EndBlocks.CHORUS_NYLIUM); diff --git a/src/main/java/ru/betterend/blocks/RespawnObeliskBlock.java b/src/main/java/ru/betterend/blocks/RespawnObeliskBlock.java index 48b5e923..c43bc723 100644 --- a/src/main/java/ru/betterend/blocks/RespawnObeliskBlock.java +++ b/src/main/java/ru/betterend/blocks/RespawnObeliskBlock.java @@ -1,11 +1,6 @@ package ru.betterend.blocks; -import java.util.List; - -import org.jetbrains.annotations.Nullable; - import com.google.common.collect.Lists; - import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.client.color.block.BlockColor; import net.minecraft.client.color.item.ItemColor; @@ -35,6 +30,7 @@ import net.minecraft.world.level.storage.loot.LootContext; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; +import org.jetbrains.annotations.Nullable; import ru.bclib.blocks.BaseBlock; import ru.bclib.blocks.BlockProperties; import ru.bclib.blocks.BlockProperties.TripleShape; @@ -47,28 +43,30 @@ import ru.betterend.particle.InfusionParticleType; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndItems; +import java.util.List; + public class RespawnObeliskBlock extends BaseBlock implements IColorProvider, IRenderTyped { private static final VoxelShape VOXEL_SHAPE_BOTTOM = Block.box(1, 0, 1, 15, 16, 15); private static final VoxelShape VOXEL_SHAPE_MIDDLE_TOP = Block.box(2, 0, 2, 14, 16, 14); - + public static final EnumProperty SHAPE = BlockProperties.TRIPLE_SHAPE; - + public RespawnObeliskBlock() { super(FabricBlockSettings.copyOf(Blocks.END_STONE).luminance((state) -> { return (state.getValue(SHAPE) == TripleShape.BOTTOM) ? 0 : 15; })); } - + @Override public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { return (state.getValue(SHAPE) == TripleShape.BOTTOM) ? VOXEL_SHAPE_BOTTOM : VOXEL_SHAPE_MIDDLE_TOP; } - + @Override protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(SHAPE); } - + @Override public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { for (int i = 0; i < 3; i++) { @@ -78,7 +76,7 @@ public class RespawnObeliskBlock extends BaseBlock implements IColorProvider, IR } return true; } - + @Override public void setPlacedBy(Level world, BlockPos pos, BlockState state, @Nullable LivingEntity placer, ItemStack itemStack) { state = this.defaultBlockState(); @@ -86,7 +84,7 @@ public class RespawnObeliskBlock extends BaseBlock implements IColorProvider, IR BlocksHelper.setWithUpdate(world, pos.above(), state.setValue(SHAPE, TripleShape.MIDDLE)); BlocksHelper.setWithUpdate(world, pos.above(2), state.setValue(SHAPE, TripleShape.TOP)); } - + @Override public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, BlockPos pos, BlockPos neighborPos) { TripleShape shape = state.getValue(SHAPE); @@ -115,7 +113,7 @@ public class RespawnObeliskBlock extends BaseBlock implements IColorProvider, IR } } } - + @Override public void playerWillDestroy(Level world, BlockPos pos, BlockState state, Player player) { if (player.isCreative()) { @@ -129,7 +127,7 @@ public class RespawnObeliskBlock extends BaseBlock implements IColorProvider, IR } super.playerWillDestroy(world, pos, state, player); } - + @Override public List getDrops(BlockState state, LootContext.Builder builder) { if (state.getValue(SHAPE) == TripleShape.BOTTOM) { @@ -144,12 +142,12 @@ public class RespawnObeliskBlock extends BaseBlock implements IColorProvider, IR public BCLRenderLayer getRenderLayer() { return BCLRenderLayer.TRANSLUCENT; } - + @Override public BlockColor getProvider() { return ((IColorProvider) EndBlocks.AURORA_CRYSTAL).getProvider(); } - + @Override public ItemColor getItemProvider() { return (stack, tintIndex) -> { @@ -193,10 +191,10 @@ public class RespawnObeliskBlock extends BaseBlock implements IColorProvider, IR ((ServerLevel) world).sendParticles(particle, px, py1, pz, 20, 0.14, 0.5, 0.14, 0.1); ((ServerLevel) world).sendParticles(particle, px, py2, pz, 20, 0.14, 0.3, 0.14, 0.1); } - world.playSound(null, px, py, py, SoundEvents.RESPAWN_ANCHOR_SET_SPAWN, SoundSource.BLOCKS, 1F, 1F); - if (!player.isCreative()) { - itemStack.shrink(6); - } + world.playSound(null, px, py, py, SoundEvents.RESPAWN_ANCHOR_SET_SPAWN, SoundSource.BLOCKS, 1F, 1F); + if (!player.isCreative()) { + itemStack.shrink(6); + } } return player.isCreative() ? InteractionResult.PASS : InteractionResult.sidedSuccess(world.isClientSide); } diff --git a/src/main/java/ru/betterend/blocks/RunedFlavolite.java b/src/main/java/ru/betterend/blocks/RunedFlavolite.java index 9cae1cea..a7502123 100644 --- a/src/main/java/ru/betterend/blocks/RunedFlavolite.java +++ b/src/main/java/ru/betterend/blocks/RunedFlavolite.java @@ -1,9 +1,6 @@ package ru.betterend.blocks; -import java.util.List; - import com.google.common.collect.Lists; - import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Explosion; @@ -18,30 +15,32 @@ import ru.bclib.blocks.BlockProperties; import ru.bclib.util.BlocksHelper; import ru.betterend.registry.EndBlocks; +import java.util.List; + public class RunedFlavolite extends BaseBlock { public static final BooleanProperty ACTIVATED = BlockProperties.ACTIVE; public RunedFlavolite(boolean unbreakable) { super(FabricBlockSettings.copyOf(EndBlocks.FLAVOLITE.polished) - .strength( - unbreakable ? -1 : 1, - unbreakable ? Blocks.BEDROCK.getExplosionResistance() : Blocks.OBSIDIAN.getExplosionResistance() - ).luminance(state -> { - return state.getValue(ACTIVATED) ? 8 : 0; - })); + .strength( + unbreakable ? -1 : 1, + unbreakable ? Blocks.BEDROCK.getExplosionResistance() : Blocks.OBSIDIAN.getExplosionResistance() + ).luminance(state -> { + return state.getValue(ACTIVATED) ? 8 : 0; + })); this.registerDefaultState(stateDefinition.any().setValue(ACTIVATED, false)); } - + @Override protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(ACTIVATED); } - + @Override public boolean dropFromExplosion(Explosion explosion) { return !BlocksHelper.isInvulnerableUnsafe(this.defaultBlockState()); } - + @Override public List getDrops(BlockState state, LootContext.Builder builder) { if (BlocksHelper.isInvulnerableUnsafe(this.defaultBlockState())) { diff --git a/src/main/java/ru/betterend/blocks/ShadowBerryBlock.java b/src/main/java/ru/betterend/blocks/ShadowBerryBlock.java index 997a8f85..41b72758 100644 --- a/src/main/java/ru/betterend/blocks/ShadowBerryBlock.java +++ b/src/main/java/ru/betterend/blocks/ShadowBerryBlock.java @@ -12,11 +12,11 @@ import ru.betterend.registry.EndItems; public class ShadowBerryBlock extends BaseCropBlock { private static final VoxelShape SHAPE = Block.box(1, 0, 1, 15, 8, 15); - + public ShadowBerryBlock() { super(EndItems.SHADOW_BERRY_RAW, EndBlocks.SHADOW_GRASS); } - + @Override public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { return SHAPE; diff --git a/src/main/java/ru/betterend/blocks/ShadowGrassBlock.java b/src/main/java/ru/betterend/blocks/ShadowGrassBlock.java index 99740b04..7149ec83 100644 --- a/src/main/java/ru/betterend/blocks/ShadowGrassBlock.java +++ b/src/main/java/ru/betterend/blocks/ShadowGrassBlock.java @@ -1,7 +1,5 @@ package ru.betterend.blocks; -import java.util.Random; - import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.core.BlockPos; @@ -11,6 +9,8 @@ import net.minecraft.world.level.material.MaterialColor; import ru.betterend.blocks.basis.EndTerrainBlock; import ru.betterend.registry.EndParticles; +import java.util.Random; + public class ShadowGrassBlock extends EndTerrainBlock { public ShadowGrassBlock() { super(MaterialColor.COLOR_BLACK); diff --git a/src/main/java/ru/betterend/blocks/SilkMothHiveBlock.java b/src/main/java/ru/betterend/blocks/SilkMothHiveBlock.java index 7cfc5aa6..9ecb7761 100644 --- a/src/main/java/ru/betterend/blocks/SilkMothHiveBlock.java +++ b/src/main/java/ru/betterend/blocks/SilkMothHiveBlock.java @@ -1,7 +1,5 @@ package ru.betterend.blocks; -import java.util.Random; - import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; import net.minecraft.core.BlockPos; @@ -36,26 +34,28 @@ import ru.betterend.entity.SilkMothEntity; import ru.betterend.registry.EndEntities; import ru.betterend.registry.EndItems; +import java.util.Random; + public class SilkMothHiveBlock extends BaseBlock { public static final DirectionProperty FACING = BlockStateProperties.HORIZONTAL_FACING; public static final IntegerProperty FULLNESS = EndBlockProperties.FULLNESS; - + public SilkMothHiveBlock() { super(FabricBlockSettings.of(Material.WOOD).breakByHand(true).hardness(0.5F).resistance(0.1F).sound(SoundType.WOOL).noOcclusion().randomTicks()); this.registerDefaultState(defaultBlockState().setValue(FULLNESS, 0)); } - + @Override protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(FACING, FULLNESS); } - + @Override public BlockState getStateForPlacement(BlockPlaceContext ctx) { Direction dir = ctx.getHorizontalDirection().getOpposite(); return this.defaultBlockState().setValue(FACING, dir); } - + @Override public BlockState rotate(BlockState state, Rotation rotation) { return BlocksHelper.rotateHorizontal(state, rotation, FACING); @@ -65,7 +65,7 @@ public class SilkMothHiveBlock extends BaseBlock { public BlockState mirror(BlockState state, Mirror mirror) { return BlocksHelper.mirrorHorizontal(state, mirror, FACING); } - + @Override public void randomTick(BlockState state, ServerLevel world, BlockPos pos, Random random) { Direction dir = state.getValue(FACING); @@ -73,7 +73,9 @@ public class SilkMothHiveBlock extends BaseBlock { if (!world.getBlockState(spawn).isAir()) { return; } - int count = world.getEntities(EndEntities.SILK_MOTH, new AABB(pos).inflate(16), (entity) -> { return true; }).size(); + int count = world.getEntities(EndEntities.SILK_MOTH, new AABB(pos).inflate(16), (entity) -> { + return true; + }).size(); if (count > 6) { return; } @@ -84,7 +86,7 @@ public class SilkMothHiveBlock extends BaseBlock { world.addFreshEntity(moth); world.playSound(null, pos, SoundEvents.BEEHIVE_EXIT, SoundSource.BLOCKS, 1, 1); } - + @Override public InteractionResult use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) { if (hand == InteractionHand.MAIN_HAND) { diff --git a/src/main/java/ru/betterend/blocks/SilkMothNestBlock.java b/src/main/java/ru/betterend/blocks/SilkMothNestBlock.java index 52e52178..b21f8758 100644 --- a/src/main/java/ru/betterend/blocks/SilkMothNestBlock.java +++ b/src/main/java/ru/betterend/blocks/SilkMothNestBlock.java @@ -1,9 +1,5 @@ package ru.betterend.blocks; -import java.util.Collections; -import java.util.List; -import java.util.Random; - import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; import net.minecraft.core.BlockPos; @@ -48,23 +44,27 @@ import ru.betterend.entity.SilkMothEntity; import ru.betterend.registry.EndEntities; import ru.betterend.registry.EndItems; +import java.util.Collections; +import java.util.List; +import java.util.Random; + public class SilkMothNestBlock extends BaseBlock implements IRenderTyped { public static final BooleanProperty ACTIVE = EndBlockProperties.ACTIVE; public static final DirectionProperty FACING = BlockStateProperties.HORIZONTAL_FACING; public static final IntegerProperty FULLNESS = EndBlockProperties.FULLNESS; private static final VoxelShape TOP = box(6, 0, 6, 10, 16, 10); private static final VoxelShape BOTTOM = box(0, 0, 0, 16, 16, 16); - + public SilkMothNestBlock() { super(FabricBlockSettings.of(Material.WOOL).hardness(0.5F).resistance(0.1F).sound(SoundType.WOOL).noOcclusion().randomTicks()); this.registerDefaultState(defaultBlockState().setValue(ACTIVE, true).setValue(FULLNESS, 0)); } - + @Override protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(ACTIVE, FACING, FULLNESS); } - + @Override public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { return state.getValue(ACTIVE) ? BOTTOM : TOP; @@ -74,13 +74,13 @@ public class SilkMothNestBlock extends BaseBlock implements IRenderTyped { public BCLRenderLayer getRenderLayer() { return BCLRenderLayer.CUTOUT; } - + @Override public BlockState getStateForPlacement(BlockPlaceContext ctx) { Direction dir = ctx.getHorizontalDirection().getOpposite(); return this.defaultBlockState().setValue(FACING, dir); } - + @Override public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, BlockPos pos, BlockPos neighborPos) { if (!state.getValue(ACTIVE)) { @@ -93,7 +93,7 @@ public class SilkMothNestBlock extends BaseBlock implements IRenderTyped { } return state; } - + @Override public BlockState rotate(BlockState state, Rotation rotation) { return BlocksHelper.rotateHorizontal(state, rotation, FACING); @@ -103,12 +103,12 @@ public class SilkMothNestBlock extends BaseBlock implements IRenderTyped { public BlockState mirror(BlockState state, Mirror mirror) { return BlocksHelper.mirrorHorizontal(state, mirror, FACING); } - + @Override public List getDrops(BlockState state, LootContext.Builder builder) { return state.getValue(ACTIVE) ? Collections.singletonList(new ItemStack(this)) : Collections.emptyList(); } - + @Override public void playerWillDestroy(Level world, BlockPos pos, BlockState state, Player player) { if (!state.getValue(ACTIVE) && player.isCreative()) { @@ -120,7 +120,7 @@ public class SilkMothNestBlock extends BaseBlock implements IRenderTyped { } super.playerWillDestroy(world, pos, state, player); } - + @Override public void randomTick(BlockState state, ServerLevel world, BlockPos pos, Random random) { if (!state.getValue(ACTIVE)) { @@ -134,7 +134,9 @@ public class SilkMothNestBlock extends BaseBlock implements IRenderTyped { if (!world.getBlockState(spawn).isAir()) { return; } - int count = world.getEntities(EndEntities.SILK_MOTH, new AABB(pos).inflate(16), (entity) -> { return true; }).size(); + int count = world.getEntities(EndEntities.SILK_MOTH, new AABB(pos).inflate(16), (entity) -> { + return true; + }).size(); if (count > 6) { return; } @@ -145,7 +147,7 @@ public class SilkMothNestBlock extends BaseBlock implements IRenderTyped { world.addFreshEntity(moth); world.playSound(null, pos, SoundEvents.BEEHIVE_EXIT, SoundSource.BLOCKS, 1, 1); } - + @Override public InteractionResult use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) { if (hand == InteractionHand.MAIN_HAND) { diff --git a/src/main/java/ru/betterend/blocks/SmallAmaranitaBlock.java b/src/main/java/ru/betterend/blocks/SmallAmaranitaBlock.java index 13eb1b34..8a82e638 100644 --- a/src/main/java/ru/betterend/blocks/SmallAmaranitaBlock.java +++ b/src/main/java/ru/betterend/blocks/SmallAmaranitaBlock.java @@ -20,12 +20,12 @@ import java.util.Random; public class SmallAmaranitaBlock extends EndPlantBlock { private static final VoxelShape SHAPE = Block.box(4, 0, 4, 12, 10, 12); - + @Override protected boolean isTerrain(BlockState state) { return state.is(EndBlocks.SANGNUM) || state.is(EndBlocks.MOSSY_OBSIDIAN) || state.is(EndBlocks.MOSSY_DRAGON_BONE); } - + @Override public void performBonemeal(ServerLevel world, Random random, BlockPos pos, BlockState state) { BlockPos bigPos = growBig(world, pos); @@ -40,13 +40,13 @@ public class SmallAmaranitaBlock extends EndPlantBlock { } EndFeatures.LARGE_AMARANITA.getFeature().place(new FeaturePlaceContext<>(world, null, random, pos, null)); } - + @Override public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { Vec3 vec3d = state.getOffset(view, pos); return SHAPE.move(vec3d.x, vec3d.y, vec3d.z); } - + private BlockPos growBig(ServerLevel world, BlockPos pos) { for (int x = -1; x < 2; x++) { for (int z = -1; z < 2; z++) { @@ -58,20 +58,20 @@ public class SmallAmaranitaBlock extends EndPlantBlock { } return null; } - + private boolean checkFrame(ServerLevel world, BlockPos pos) { return world.getBlockState(pos).is(this) && world.getBlockState(pos.south()).is(this) && world.getBlockState(pos.east()).is(this) && world.getBlockState(pos.south().east()).is(this); } - + private void replaceMushroom(ServerLevel world, BlockPos pos) { if (world.getBlockState(pos).is(this)) { BlocksHelper.setWithUpdate(world, pos, Blocks.AIR); } } - + @Override public boolean isBonemealSuccess(Level world, Random random, BlockPos pos, BlockState state) { return random.nextInt(8) == 0; diff --git a/src/main/java/ru/betterend/blocks/SmallJellyshroomBlock.java b/src/main/java/ru/betterend/blocks/SmallJellyshroomBlock.java index 1f76d9ec..a9f2a3cf 100644 --- a/src/main/java/ru/betterend/blocks/SmallJellyshroomBlock.java +++ b/src/main/java/ru/betterend/blocks/SmallJellyshroomBlock.java @@ -1,12 +1,7 @@ package ru.betterend.blocks; -import java.util.EnumMap; -import java.util.List; -import java.util.Random; - import com.google.common.collect.Lists; import com.google.common.collect.Maps; - import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; import net.minecraft.core.BlockPos; @@ -37,9 +32,13 @@ import ru.bclib.interfaces.IRenderTyped; import ru.bclib.util.BlocksHelper; import ru.betterend.registry.EndFeatures; +import java.util.EnumMap; +import java.util.List; +import java.util.Random; + public class SmallJellyshroomBlock extends BaseAttachedBlock implements IRenderTyped, BonemealableBlock { private static final EnumMap BOUNDING_SHAPES = Maps.newEnumMap(Direction.class); - + public SmallJellyshroomBlock() { super(FabricBlockSettings.of(Material.PLANT) .breakByTool(FabricToolTags.SHEARS) @@ -53,7 +52,7 @@ public class SmallJellyshroomBlock extends BaseAttachedBlock implements IRenderT public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { return BOUNDING_SHAPES.get(state.getValue(FACING)); } - + @Override public List getDrops(BlockState state, LootContext.Builder builder) { ItemStack tool = builder.getParameter(LootContextParams.TOOL); @@ -64,7 +63,7 @@ public class SmallJellyshroomBlock extends BaseAttachedBlock implements IRenderT return Lists.newArrayList(); } } - + @Override public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { Direction direction = state.getValue(FACING); @@ -72,12 +71,12 @@ public class SmallJellyshroomBlock extends BaseAttachedBlock implements IRenderT BlockState support = world.getBlockState(blockPos); return canSupportCenter(world, blockPos, direction) && support.canOcclude() && support.getLightEmission() == 0; } - + @Override public BCLRenderLayer getRenderLayer() { return BCLRenderLayer.CUTOUT; } - + static { BOUNDING_SHAPES.put(Direction.UP, Block.box(3, 0, 3, 13, 16, 13)); BOUNDING_SHAPES.put(Direction.DOWN, Block.box(3, 0, 3, 13, 16, 13)); diff --git a/src/main/java/ru/betterend/blocks/SmaragdantCrystalShardBlock.java b/src/main/java/ru/betterend/blocks/SmaragdantCrystalShardBlock.java index a4bb26d2..2831a2b4 100644 --- a/src/main/java/ru/betterend/blocks/SmaragdantCrystalShardBlock.java +++ b/src/main/java/ru/betterend/blocks/SmaragdantCrystalShardBlock.java @@ -1,9 +1,6 @@ package ru.betterend.blocks; -import java.util.EnumMap; - import com.google.common.collect.Maps; - import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; import net.minecraft.core.BlockPos; @@ -32,11 +29,13 @@ import ru.bclib.blocks.BaseAttachedBlock; import ru.bclib.client.render.BCLRenderLayer; import ru.bclib.interfaces.IRenderTyped; +import java.util.EnumMap; + @SuppressWarnings("deprecation") public class SmaragdantCrystalShardBlock extends BaseAttachedBlock implements IRenderTyped, SimpleWaterloggedBlock, LiquidBlockContainer { private static final EnumMap BOUNDING_SHAPES = Maps.newEnumMap(Direction.class); public static final BooleanProperty WATERLOGGED = BlockStateProperties.WATERLOGGED; - + public SmaragdantCrystalShardBlock() { super(FabricBlockSettings.of(Material.STONE) .materialColor(MaterialColor.COLOR_GREEN) @@ -46,18 +45,18 @@ public class SmaragdantCrystalShardBlock extends BaseAttachedBlock implements IR .requiresCorrectToolForDrops() .noCollission()); } - + @Override protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { super.createBlockStateDefinition(stateManager); stateManager.add(WATERLOGGED); } - + @Override public BCLRenderLayer getRenderLayer() { return BCLRenderLayer.CUTOUT; } - + @Override public boolean canPlaceLiquid(BlockGetter world, BlockPos pos, BlockState state, Fluid fluid) { return !state.getValue(WATERLOGGED); @@ -67,7 +66,7 @@ public class SmaragdantCrystalShardBlock extends BaseAttachedBlock implements IR public boolean placeLiquid(LevelAccessor world, BlockPos pos, BlockState state, FluidState fluidState) { return !state.getValue(WATERLOGGED); } - + @Override public BlockState getStateForPlacement(BlockPlaceContext ctx) { BlockState state = super.getStateForPlacement(ctx); @@ -79,24 +78,24 @@ public class SmaragdantCrystalShardBlock extends BaseAttachedBlock implements IR } return null; } - + @Override public FluidState getFluidState(BlockState state) { return state.getValue(WATERLOGGED) ? Fluids.WATER.getSource(false) : Fluids.EMPTY.defaultFluidState(); } - + @Override public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { return BOUNDING_SHAPES.get(state.getValue(FACING)); } - + @Override public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { Direction direction = state.getValue(FACING); BlockPos blockPos = pos.relative(direction.getOpposite()); return world.getBlockState(blockPos).isFaceSturdy(world, blockPos, direction); } - + static { BOUNDING_SHAPES.put(Direction.UP, Shapes.box(0.125, 0.0, 0.125, 0.875F, 0.875F, 0.875F)); BOUNDING_SHAPES.put(Direction.DOWN, Shapes.box(0.125, 0.125, 0.125, 0.875F, 1.0, 0.875F)); diff --git a/src/main/java/ru/betterend/blocks/SulphurCrystalBlock.java b/src/main/java/ru/betterend/blocks/SulphurCrystalBlock.java index 7d6c0727..e2534aaa 100644 --- a/src/main/java/ru/betterend/blocks/SulphurCrystalBlock.java +++ b/src/main/java/ru/betterend/blocks/SulphurCrystalBlock.java @@ -1,12 +1,7 @@ package ru.betterend.blocks; -import java.util.Collections; -import java.util.EnumMap; -import java.util.List; - import com.google.common.collect.Lists; import com.google.common.collect.Maps; - import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; import net.minecraft.core.BlockPos; @@ -41,12 +36,16 @@ import ru.bclib.util.MHelper; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndItems; +import java.util.Collections; +import java.util.EnumMap; +import java.util.List; + @SuppressWarnings("deprecation") public class SulphurCrystalBlock extends BaseAttachedBlock implements IRenderTyped, SimpleWaterloggedBlock, LiquidBlockContainer { private static final EnumMap BOUNDING_SHAPES = Maps.newEnumMap(Direction.class); public static final IntegerProperty AGE = IntegerProperty.create("age", 0, 2); public static final BooleanProperty WATERLOGGED = BlockStateProperties.WATERLOGGED; - + public SulphurCrystalBlock() { super(FabricBlockSettings.of(Material.STONE) .materialColor(MaterialColor.COLOR_YELLOW) @@ -55,23 +54,23 @@ public class SulphurCrystalBlock extends BaseAttachedBlock implements IRenderTyp .requiresCorrectToolForDrops() .noCollission()); } - + @Override protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { super.createBlockStateDefinition(stateManager); stateManager.add(AGE, WATERLOGGED); } - + @Override public BCLRenderLayer getRenderLayer() { return BCLRenderLayer.CUTOUT; } - + @Override public List getDrops(BlockState state, LootContext.Builder builder) { return state.getValue(AGE) < 2 ? Collections.emptyList() : Lists.newArrayList(new ItemStack(EndItems.CRYSTALLINE_SULPHUR, MHelper.randRange(1, 3, MHelper.RANDOM))); } - + @Override public boolean canPlaceLiquid(BlockGetter world, BlockPos pos, BlockState state, Fluid fluid) { return !state.getValue(WATERLOGGED); @@ -81,7 +80,7 @@ public class SulphurCrystalBlock extends BaseAttachedBlock implements IRenderTyp public boolean placeLiquid(LevelAccessor world, BlockPos pos, BlockState state, FluidState fluidState) { return !state.getValue(WATERLOGGED); } - + @Override public BlockState getStateForPlacement(BlockPlaceContext ctx) { BlockState state = super.getStateForPlacement(ctx); @@ -93,24 +92,24 @@ public class SulphurCrystalBlock extends BaseAttachedBlock implements IRenderTyp } return null; } - + @Override public FluidState getFluidState(BlockState state) { return state.getValue(WATERLOGGED) ? Fluids.WATER.getSource(false) : Fluids.EMPTY.defaultFluidState(); } - + @Override public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { return BOUNDING_SHAPES.get(state.getValue(FACING)); } - + @Override public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { Direction direction = state.getValue(FACING); BlockPos blockPos = pos.relative(direction.getOpposite()); return world.getBlockState(blockPos).is(EndBlocks.BRIMSTONE); } - + static { BOUNDING_SHAPES.put(Direction.UP, Shapes.box(0.125, 0.0, 0.125, 0.875F, 0.5, 0.875F)); BOUNDING_SHAPES.put(Direction.DOWN, Shapes.box(0.125, 0.5, 0.125, 0.875F, 1.0, 0.875F)); diff --git a/src/main/java/ru/betterend/blocks/TenaneaFlowersBlock.java b/src/main/java/ru/betterend/blocks/TenaneaFlowersBlock.java index 775878b6..c1b32bf0 100644 --- a/src/main/java/ru/betterend/blocks/TenaneaFlowersBlock.java +++ b/src/main/java/ru/betterend/blocks/TenaneaFlowersBlock.java @@ -1,7 +1,5 @@ package ru.betterend.blocks; -import java.util.Random; - import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.color.block.BlockColor; @@ -18,9 +16,11 @@ import ru.bclib.util.ColorUtil; import ru.bclib.util.MHelper; import ru.betterend.registry.EndParticles; +import java.util.Random; + public class TenaneaFlowersBlock extends BaseVineBlock implements IColorProvider { public static final Vec3i[] COLORS; - + public TenaneaFlowersBlock() { super(15); } @@ -30,22 +30,23 @@ public class TenaneaFlowersBlock extends BaseVineBlock implements IColorProvider return (state, world, pos, tintIndex) -> { if (pos == null) { pos = BlockPos.ZERO; - }; + } + ; long i = (MHelper.getRandom(pos.getX(), pos.getZ()) & 63) + pos.getY(); double delta = i * 0.1; int index = MHelper.floor(delta); int index2 = (index + 1) & 3; delta -= index; index &= 3; - + Vec3i color1 = COLORS[index]; Vec3i color2 = COLORS[index2]; - + int r = MHelper.floor(Mth.lerp(delta, color1.getX(), color2.getX())); int g = MHelper.floor(Mth.lerp(delta, color1.getY(), color2.getY())); int b = MHelper.floor(Mth.lerp(delta, color1.getZ(), color2.getZ())); float[] hsb = ColorUtil.RGBtoHSB(r, g, b, new float[3]); - + return ColorUtil.HSBtoRGB(hsb[0], MHelper.max(0.5F, hsb[1]), hsb[2]); }; } @@ -54,12 +55,12 @@ public class TenaneaFlowersBlock extends BaseVineBlock implements IColorProvider public ItemColor getItemProvider() { return (stack, tintIndex) -> ColorUtil.color(255, 255, 255); } - + @Override public boolean isValidBonemealTarget(BlockGetter world, BlockPos pos, BlockState state, boolean isClient) { return false; } - + @Environment(EnvType.CLIENT) public void animateTick(BlockState state, Level world, BlockPos pos, Random random) { super.animateTick(state, world, pos, random); @@ -70,13 +71,13 @@ public class TenaneaFlowersBlock extends BaseVineBlock implements IColorProvider world.addParticle(EndParticles.TENANEA_PETAL, x, y, z, 0, 0, 0); } } - + static { - COLORS = new Vec3i[] { - new Vec3i(250, 111, 222), - new Vec3i(167, 89, 255), - new Vec3i(120, 207, 239), - new Vec3i(255, 87, 182) + COLORS = new Vec3i[]{ + new Vec3i(250, 111, 222), + new Vec3i(167, 89, 255), + new Vec3i(120, 207, 239), + new Vec3i(255, 87, 182) }; } } diff --git a/src/main/java/ru/betterend/blocks/TenaneaSaplingBlock.java b/src/main/java/ru/betterend/blocks/TenaneaSaplingBlock.java index 9928dcc6..5a91977e 100644 --- a/src/main/java/ru/betterend/blocks/TenaneaSaplingBlock.java +++ b/src/main/java/ru/betterend/blocks/TenaneaSaplingBlock.java @@ -17,7 +17,7 @@ public class TenaneaSaplingBlock extends FeatureSaplingBlock { protected Feature getFeature() { return EndFeatures.TENANEA.getFeature(); } - + @Override public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { return world.getBlockState(pos.below()).is(EndBlocks.PINK_MOSS); diff --git a/src/main/java/ru/betterend/blocks/TerrainPlantBlock.java b/src/main/java/ru/betterend/blocks/TerrainPlantBlock.java index 090b3b15..3f1ba358 100644 --- a/src/main/java/ru/betterend/blocks/TerrainPlantBlock.java +++ b/src/main/java/ru/betterend/blocks/TerrainPlantBlock.java @@ -6,15 +6,15 @@ import ru.betterend.blocks.basis.EndPlantBlock; public class TerrainPlantBlock extends EndPlantBlock { private final Block[] ground; - + public TerrainPlantBlock(Block... ground) { super(true); this.ground = ground; } - + @Override protected boolean isTerrain(BlockState state) { - for (Block block: ground) { + for (Block block : ground) { if (state.is(block)) { return true; } diff --git a/src/main/java/ru/betterend/blocks/TwistedUmbrellaMossBlock.java b/src/main/java/ru/betterend/blocks/TwistedUmbrellaMossBlock.java index 9fc3ffa2..e0977aa2 100644 --- a/src/main/java/ru/betterend/blocks/TwistedUmbrellaMossBlock.java +++ b/src/main/java/ru/betterend/blocks/TwistedUmbrellaMossBlock.java @@ -1,7 +1,5 @@ package ru.betterend.blocks; -import java.util.Random; - import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.core.BlockPos; @@ -14,34 +12,36 @@ import ru.bclib.util.BlocksHelper; import ru.betterend.blocks.basis.EndPlantBlock; import ru.betterend.registry.EndBlocks; +import java.util.Random; + public class TwistedUmbrellaMossBlock extends EndPlantBlock { public TwistedUmbrellaMossBlock() { super(11); } - + @Override protected boolean isTerrain(BlockState state) { return state.is(EndBlocks.END_MOSS) || state.is(EndBlocks.END_MYCELIUM) || state.is(EndBlocks.JUNGLE_MOSS); } - - @Environment(EnvType.CLIENT) - public boolean hasEmissiveLighting(BlockGetter world, BlockPos pos) { - return true; - } - @Environment(EnvType.CLIENT) - public float getAmbientOcclusionLightLevel(BlockGetter world, BlockPos pos) { - return 1F; - } - - @Override + @Environment(EnvType.CLIENT) + public boolean hasEmissiveLighting(BlockGetter world, BlockPos pos) { + return true; + } + + @Environment(EnvType.CLIENT) + public float getAmbientOcclusionLightLevel(BlockGetter world, BlockPos pos) { + return 1F; + } + + @Override public boolean isBonemealSuccess(Level world, Random random, BlockPos pos, BlockState state) { return world.isEmptyBlock(pos.above()); } - - @Override + + @Override public void performBonemeal(ServerLevel world, Random random, BlockPos pos, BlockState state) { - int rot = world.random.nextInt(4); + int rot = world.random.nextInt(4); BlockState bs = EndBlocks.TWISTED_UMBRELLA_MOSS_TALL.defaultBlockState().setValue(BaseDoublePlantBlock.ROTATION, rot); BlocksHelper.setWithoutUpdate(world, pos, bs); BlocksHelper.setWithoutUpdate(world, pos.above(), bs.setValue(BaseDoublePlantBlock.TOP, true)); diff --git a/src/main/java/ru/betterend/blocks/TwistedUmbrellaMossTallBlock.java b/src/main/java/ru/betterend/blocks/TwistedUmbrellaMossTallBlock.java index b33c8235..07bff735 100644 --- a/src/main/java/ru/betterend/blocks/TwistedUmbrellaMossTallBlock.java +++ b/src/main/java/ru/betterend/blocks/TwistedUmbrellaMossTallBlock.java @@ -1,7 +1,5 @@ package ru.betterend.blocks; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.item.ItemEntity; @@ -10,17 +8,19 @@ import net.minecraft.world.level.block.state.BlockState; import ru.bclib.blocks.BaseDoublePlantBlock; import ru.betterend.registry.EndBlocks; +import java.util.Random; + public class TwistedUmbrellaMossTallBlock extends BaseDoublePlantBlock { public TwistedUmbrellaMossTallBlock() { super(12); } - + @Override public void performBonemeal(ServerLevel world, Random random, BlockPos pos, BlockState state) { ItemEntity item = new ItemEntity(world, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, new ItemStack(EndBlocks.TWISTED_UMBRELLA_MOSS)); world.addFreshEntity(item); } - + @Override protected boolean isTerrain(BlockState state) { return state.is(EndBlocks.END_MOSS) || state.is(EndBlocks.END_MYCELIUM) || state.is(EndBlocks.JUNGLE_MOSS); diff --git a/src/main/java/ru/betterend/blocks/UmbrellaMossBlock.java b/src/main/java/ru/betterend/blocks/UmbrellaMossBlock.java index 44525319..08ad3fea 100644 --- a/src/main/java/ru/betterend/blocks/UmbrellaMossBlock.java +++ b/src/main/java/ru/betterend/blocks/UmbrellaMossBlock.java @@ -1,7 +1,5 @@ package ru.betterend.blocks; -import java.util.Random; - import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.core.BlockPos; @@ -14,34 +12,36 @@ import ru.bclib.util.BlocksHelper; import ru.betterend.blocks.basis.EndPlantBlock; import ru.betterend.registry.EndBlocks; +import java.util.Random; + public class UmbrellaMossBlock extends EndPlantBlock { public UmbrellaMossBlock() { super(11); } - + @Override protected boolean isTerrain(BlockState state) { return state.is(EndBlocks.END_MOSS) || state.is(EndBlocks.END_MYCELIUM) || state.is(EndBlocks.JUNGLE_MOSS); } - - @Environment(EnvType.CLIENT) - public boolean hasEmissiveLighting(BlockGetter world, BlockPos pos) { - return true; - } - @Environment(EnvType.CLIENT) - public float getAmbientOcclusionLightLevel(BlockGetter world, BlockPos pos) { - return 1F; - } - - @Override + @Environment(EnvType.CLIENT) + public boolean hasEmissiveLighting(BlockGetter world, BlockPos pos) { + return true; + } + + @Environment(EnvType.CLIENT) + public float getAmbientOcclusionLightLevel(BlockGetter world, BlockPos pos) { + return 1F; + } + + @Override public boolean isBonemealSuccess(Level world, Random random, BlockPos pos, BlockState state) { return world.isEmptyBlock(pos.above()); } - - @Override + + @Override public void performBonemeal(ServerLevel world, Random random, BlockPos pos, BlockState state) { - int rot = world.random.nextInt(4); + int rot = world.random.nextInt(4); BlockState bs = EndBlocks.UMBRELLA_MOSS_TALL.defaultBlockState().setValue(BaseDoublePlantBlock.ROTATION, rot); BlocksHelper.setWithoutUpdate(world, pos, bs); BlocksHelper.setWithoutUpdate(world, pos.above(), bs.setValue(BaseDoublePlantBlock.TOP, true)); diff --git a/src/main/java/ru/betterend/blocks/UmbrellaMossTallBlock.java b/src/main/java/ru/betterend/blocks/UmbrellaMossTallBlock.java index 18d15ee2..e89bc3c0 100644 --- a/src/main/java/ru/betterend/blocks/UmbrellaMossTallBlock.java +++ b/src/main/java/ru/betterend/blocks/UmbrellaMossTallBlock.java @@ -1,7 +1,5 @@ package ru.betterend.blocks; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.item.ItemEntity; @@ -10,17 +8,19 @@ import net.minecraft.world.level.block.state.BlockState; import ru.bclib.blocks.BaseDoublePlantBlock; import ru.betterend.registry.EndBlocks; +import java.util.Random; + public class UmbrellaMossTallBlock extends BaseDoublePlantBlock { public UmbrellaMossTallBlock() { super(12); } - + @Override public void performBonemeal(ServerLevel world, Random random, BlockPos pos, BlockState state) { ItemEntity item = new ItemEntity(world, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, new ItemStack(EndBlocks.UMBRELLA_MOSS)); world.addFreshEntity(item); } - + @Override protected boolean isTerrain(BlockState state) { return state.is(EndBlocks.END_MOSS) || state.is(EndBlocks.END_MYCELIUM) || state.is(EndBlocks.JUNGLE_MOSS); diff --git a/src/main/java/ru/betterend/blocks/UmbrellaTreeClusterBlock.java b/src/main/java/ru/betterend/blocks/UmbrellaTreeClusterBlock.java index a8d3dcb0..0ba01d1f 100644 --- a/src/main/java/ru/betterend/blocks/UmbrellaTreeClusterBlock.java +++ b/src/main/java/ru/betterend/blocks/UmbrellaTreeClusterBlock.java @@ -25,19 +25,19 @@ import ru.betterend.registry.EndItems; public class UmbrellaTreeClusterBlock extends BaseBlock { public static final BooleanProperty NATURAL = BlockProperties.NATURAL; - + public UmbrellaTreeClusterBlock() { super(FabricBlockSettings.copyOf(Blocks.NETHER_WART_BLOCK) .materialColor(MaterialColor.COLOR_PURPLE) .luminance(15)); registerDefaultState(stateDefinition.any().setValue(NATURAL, false)); } - + @Override protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(NATURAL); } - + @Override public InteractionResult use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) { ItemStack stack = player.getMainHandItem(); diff --git a/src/main/java/ru/betterend/blocks/UmbrellaTreeClusterEmptyBlock.java b/src/main/java/ru/betterend/blocks/UmbrellaTreeClusterEmptyBlock.java index d6569aa3..0c5abc6e 100644 --- a/src/main/java/ru/betterend/blocks/UmbrellaTreeClusterEmptyBlock.java +++ b/src/main/java/ru/betterend/blocks/UmbrellaTreeClusterEmptyBlock.java @@ -1,7 +1,5 @@ package ru.betterend.blocks; -import java.util.Random; - import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerLevel; @@ -15,21 +13,23 @@ import ru.bclib.blocks.BaseBlock; import ru.bclib.util.BlocksHelper; import ru.betterend.registry.EndBlocks; +import java.util.Random; + public class UmbrellaTreeClusterEmptyBlock extends BaseBlock { public static final BooleanProperty NATURAL = EndBlockProperties.NATURAL; - + public UmbrellaTreeClusterEmptyBlock() { super(FabricBlockSettings.copyOf(Blocks.NETHER_WART_BLOCK) .materialColor(MaterialColor.COLOR_PURPLE) .randomTicks()); registerDefaultState(stateDefinition.any().setValue(NATURAL, false)); } - + @Override protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(NATURAL); } - + @Override public void tick(BlockState state, ServerLevel world, BlockPos pos, Random random) { if (state.getValue(NATURAL) && random.nextInt(16) == 0) { diff --git a/src/main/java/ru/betterend/blocks/UmbrellaTreeMembraneBlock.java b/src/main/java/ru/betterend/blocks/UmbrellaTreeMembraneBlock.java index b267bf84..1f2e0683 100644 --- a/src/main/java/ru/betterend/blocks/UmbrellaTreeMembraneBlock.java +++ b/src/main/java/ru/betterend/blocks/UmbrellaTreeMembraneBlock.java @@ -1,10 +1,6 @@ package ru.betterend.blocks; -import java.util.Collections; -import java.util.List; - import com.google.common.collect.Lists; - import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; @@ -29,14 +25,17 @@ import ru.bclib.util.MHelper; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; +import java.util.Collections; +import java.util.List; + public class UmbrellaTreeMembraneBlock extends SlimeBlock implements IRenderTyped, BlockModelProvider { public static final IntegerProperty COLOR = EndBlockProperties.COLOR; private static final OpenSimplexNoise NOISE = new OpenSimplexNoise(0); - + public UmbrellaTreeMembraneBlock() { super(FabricBlockSettings.copyOf(Blocks.SLIME_BLOCK)); } - + @Override public BlockState getStateForPlacement(BlockPlaceContext ctx) { double px = ctx.getClickedPos().getX() * 0.1; @@ -44,17 +43,17 @@ public class UmbrellaTreeMembraneBlock extends SlimeBlock implements IRenderType double pz = ctx.getClickedPos().getZ() * 0.1; return this.defaultBlockState().setValue(COLOR, MHelper.floor(NOISE.eval(px, py, pz) * 3.5 + 4)); } - + @Override protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(COLOR); } - + @Override public BCLRenderLayer getRenderLayer() { return BCLRenderLayer.TRANSLUCENT; } - + @Override public List getDrops(BlockState state, LootContext.Builder builder) { if (state.getValue(COLOR) > 0) { @@ -69,7 +68,7 @@ public class UmbrellaTreeMembraneBlock extends SlimeBlock implements IRenderType public boolean propagatesSkylightDown(BlockState state, BlockGetter world, BlockPos pos) { return state.getValue(COLOR) > 0; } - + @Environment(EnvType.CLIENT) public boolean skipRendering(BlockState state, BlockState stateFrom, Direction direction) { if (state.getValue(COLOR) > 0) { diff --git a/src/main/java/ru/betterend/blocks/UmbrellaTreeSaplingBlock.java b/src/main/java/ru/betterend/blocks/UmbrellaTreeSaplingBlock.java index 652b0b83..46eebfb8 100644 --- a/src/main/java/ru/betterend/blocks/UmbrellaTreeSaplingBlock.java +++ b/src/main/java/ru/betterend/blocks/UmbrellaTreeSaplingBlock.java @@ -18,12 +18,12 @@ public class UmbrellaTreeSaplingBlock extends FeatureSaplingBlock { protected Feature getFeature() { return EndFeatures.UMBRELLA_TREE.getFeature(); } - + @Override public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { return world.getBlockState(pos.below()).is(EndBlocks.JUNGLE_MOSS); } - + @Override public BCLRenderLayer getRenderLayer() { return BCLRenderLayer.TRANSLUCENT; diff --git a/src/main/java/ru/betterend/blocks/VentBubbleColumnBlock.java b/src/main/java/ru/betterend/blocks/VentBubbleColumnBlock.java index 2c337d21..174a7739 100644 --- a/src/main/java/ru/betterend/blocks/VentBubbleColumnBlock.java +++ b/src/main/java/ru/betterend/blocks/VentBubbleColumnBlock.java @@ -1,8 +1,5 @@ package ru.betterend.blocks; -import java.util.Optional; -import java.util.Random; - import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; @@ -36,6 +33,9 @@ import net.minecraft.world.phys.shapes.VoxelShape; import ru.bclib.util.BlocksHelper; import ru.betterend.registry.EndBlocks; +import java.util.Optional; +import java.util.Random; + public class VentBubbleColumnBlock extends Block implements BucketPickup, LiquidBlockContainer { public VentBubbleColumnBlock() { super(FabricBlockSettings.of(Material.BUBBLE_COLUMN).noOcclusion().noCollission().noDrops()); @@ -46,7 +46,7 @@ public class VentBubbleColumnBlock extends Block implements BucketPickup, Liquid world.setBlock(pos, Blocks.AIR.defaultBlockState(), 11); return new ItemStack(Items.WATER_BUCKET); } - + @Override public RenderShape getRenderShape(BlockState state) { return RenderShape.INVISIBLE; @@ -109,7 +109,7 @@ public class VentBubbleColumnBlock extends Block implements BucketPickup, Liquid entity.onInsideBubbleColumn(false); } } - + @Override public boolean canPlaceLiquid(BlockGetter world, BlockPos pos, BlockState state, Fluid fluid) { return false; @@ -119,14 +119,13 @@ public class VentBubbleColumnBlock extends Block implements BucketPickup, Liquid public boolean placeLiquid(LevelAccessor world, BlockPos pos, BlockState state, FluidState fluidState) { return false; } - + @Override public FluidState getFluidState(BlockState state) { return Fluids.WATER.getSource(false); } - @Override public Optional getPickupSound() { return Fluids.WATER.getPickupSound(); diff --git a/src/main/java/ru/betterend/blocks/basis/EndAnvilBlock.java b/src/main/java/ru/betterend/blocks/basis/EndAnvilBlock.java index 893bbf2f..406d26dd 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndAnvilBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndAnvilBlock.java @@ -1,8 +1,5 @@ package ru.betterend.blocks.basis; -import java.util.List; -import java.util.Objects; - import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.context.BlockPlaceContext; @@ -17,13 +14,16 @@ import ru.bclib.blocks.BaseAnvilBlock; import ru.betterend.blocks.complex.MetalMaterial; import ru.betterend.item.EndAnvilItem; +import java.util.List; +import java.util.Objects; + public class EndAnvilBlock extends BaseAnvilBlock { protected final int level; protected IntegerProperty durability; protected MetalMaterial metalMaterial; protected int maxDurability; - + public EndAnvilBlock(MaterialColor color, int level) { super(color); this.level = level; @@ -81,7 +81,7 @@ public class EndAnvilBlock extends BaseAnvilBlock { super.createBlockStateDefinition(builder); builder.add(getDurability()); } - + public int getCraftingLevel() { return level; } @@ -109,7 +109,8 @@ public class EndAnvilBlock extends BaseAnvilBlock { if (destructionProperty.getPossibleValues().contains(destruction)) { try { return fallingState.setValue(destructionProperty, destruction); - } catch (Exception ex) { + } + catch (Exception ex) { return null; } } diff --git a/src/main/java/ru/betterend/blocks/basis/EndLanternBlock.java b/src/main/java/ru/betterend/blocks/basis/EndLanternBlock.java index f4ada8b3..f5509ed6 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndLanternBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndLanternBlock.java @@ -1,7 +1,5 @@ package ru.betterend.blocks.basis; -import java.util.Map; - import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; @@ -28,24 +26,26 @@ import ru.bclib.blocks.BaseBlockNotFull; import ru.bclib.blocks.BlockProperties; import ru.bclib.client.models.ModelsHelper; +import java.util.Map; + @SuppressWarnings("deprecation") public class EndLanternBlock extends BaseBlockNotFull implements SimpleWaterloggedBlock, LiquidBlockContainer { public static final BooleanProperty IS_FLOOR = BlockProperties.IS_FLOOR; public static final BooleanProperty WATERLOGGED = BlockStateProperties.WATERLOGGED; - + public EndLanternBlock(Block source) { this(FabricBlockSettings.copyOf(source).luminance(15).noOcclusion()); } - + public EndLanternBlock(Properties settings) { super(settings.noOcclusion()); } - + @Override protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(IS_FLOOR, WATERLOGGED); } - + @Override public BlockState getStateForPlacement(BlockPlaceContext ctx) { LevelReader worldView = ctx.getLevel(); @@ -86,7 +86,7 @@ public class EndLanternBlock extends BaseBlockNotFull implements SimpleWaterlogg } } } - + @Override public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { if (state.getValue(IS_FLOOR)) { @@ -96,7 +96,7 @@ public class EndLanternBlock extends BaseBlockNotFull implements SimpleWaterlogg return canSupportCenter(world, pos.above(), Direction.DOWN); } } - + @Override public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, BlockPos pos, BlockPos neighborPos) { Boolean water = state.getValue(WATERLOGGED); @@ -110,7 +110,7 @@ public class EndLanternBlock extends BaseBlockNotFull implements SimpleWaterlogg return state; } } - + @Override public boolean canPlaceLiquid(BlockGetter world, BlockPos pos, BlockState state, Fluid fluid) { return false; @@ -120,7 +120,7 @@ public class EndLanternBlock extends BaseBlockNotFull implements SimpleWaterlogg public boolean placeLiquid(LevelAccessor world, BlockPos pos, BlockState state, FluidState fluidState) { return false; } - + @Override public FluidState getFluidState(BlockState state) { return state.getValue(WATERLOGGED) ? Fluids.WATER.getSource(false) : Fluids.EMPTY.defaultFluidState(); diff --git a/src/main/java/ru/betterend/blocks/basis/EndPlantWithAgeBlock.java b/src/main/java/ru/betterend/blocks/basis/EndPlantWithAgeBlock.java index c3d2045b..8956b9de 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndPlantWithAgeBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndPlantWithAgeBlock.java @@ -6,7 +6,8 @@ import ru.bclib.blocks.BasePlantWithAgeBlock; public abstract class EndPlantWithAgeBlock extends BasePlantWithAgeBlock { - public EndPlantWithAgeBlock() {} + public EndPlantWithAgeBlock() { + } public EndPlantWithAgeBlock(Properties settings) { super(settings); diff --git a/src/main/java/ru/betterend/blocks/basis/EndUnderwaterPlantBlock.java b/src/main/java/ru/betterend/blocks/basis/EndUnderwaterPlantBlock.java index 747095d2..de41a686 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndUnderwaterPlantBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndUnderwaterPlantBlock.java @@ -6,7 +6,8 @@ import ru.bclib.blocks.UnderwaterPlantBlock; public class EndUnderwaterPlantBlock extends UnderwaterPlantBlock { - public EndUnderwaterPlantBlock() {} + public EndUnderwaterPlantBlock() { + } public EndUnderwaterPlantBlock(int light) { super(light); diff --git a/src/main/java/ru/betterend/blocks/basis/EndUnderwaterWallPlantBlock.java b/src/main/java/ru/betterend/blocks/basis/EndUnderwaterWallPlantBlock.java index 59bb034d..032eea09 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndUnderwaterWallPlantBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndUnderwaterWallPlantBlock.java @@ -6,7 +6,8 @@ import ru.bclib.blocks.BaseUnderwaterWallPlantBlock; public class EndUnderwaterWallPlantBlock extends BaseUnderwaterWallPlantBlock { - public EndUnderwaterWallPlantBlock() {} + public EndUnderwaterWallPlantBlock() { + } public EndUnderwaterWallPlantBlock(int light) { super(light); diff --git a/src/main/java/ru/betterend/blocks/basis/EndWallPlantBlock.java b/src/main/java/ru/betterend/blocks/basis/EndWallPlantBlock.java index 35288cbf..9b7f6a8e 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndWallPlantBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndWallPlantBlock.java @@ -5,7 +5,8 @@ import ru.bclib.api.TagAPI; import ru.bclib.blocks.BaseWallPlantBlock; public class EndWallPlantBlock extends BaseWallPlantBlock { - public EndWallPlantBlock() {} + public EndWallPlantBlock() { + } public EndWallPlantBlock(int light) { super(light); diff --git a/src/main/java/ru/betterend/blocks/basis/FurBlock.java b/src/main/java/ru/betterend/blocks/basis/FurBlock.java index 9f2b20aa..96e2ce4a 100644 --- a/src/main/java/ru/betterend/blocks/basis/FurBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/FurBlock.java @@ -1,11 +1,7 @@ package ru.betterend.blocks.basis; -import java.util.EnumMap; -import java.util.List; - import com.google.common.collect.Lists; import com.google.common.collect.Maps; - import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; import net.minecraft.core.BlockPos; @@ -28,11 +24,14 @@ import ru.bclib.client.render.BCLRenderLayer; import ru.bclib.interfaces.IRenderTyped; import ru.bclib.util.MHelper; +import java.util.EnumMap; +import java.util.List; + public class FurBlock extends BaseAttachedBlock implements IRenderTyped { private static final EnumMap BOUNDING_SHAPES = Maps.newEnumMap(Direction.class); private final ItemLike drop; private final int dropChance; - + public FurBlock(ItemLike drop, int light, int dropChance, boolean wet) { super(FabricBlockSettings.of(Material.REPLACEABLE_PLANT) .breakByTool(FabricToolTags.SHEARS) @@ -43,7 +42,7 @@ public class FurBlock extends BaseAttachedBlock implements IRenderTyped { this.drop = drop; this.dropChance = dropChance; } - + public FurBlock(ItemLike drop, int dropChance) { super(FabricBlockSettings.of(Material.REPLACEABLE_PLANT) .breakByTool(FabricToolTags.SHEARS) @@ -58,7 +57,7 @@ public class FurBlock extends BaseAttachedBlock implements IRenderTyped { public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { return BOUNDING_SHAPES.get(state.getValue(FACING)); } - + @Override public List getDrops(BlockState state, LootContext.Builder builder) { ItemStack tool = builder.getParameter(LootContextParams.TOOL); @@ -72,12 +71,12 @@ public class FurBlock extends BaseAttachedBlock implements IRenderTyped { return Lists.newArrayList(); } } - + @Override public BCLRenderLayer getRenderLayer() { return BCLRenderLayer.CUTOUT; } - + static { BOUNDING_SHAPES.put(Direction.UP, Shapes.box(0.0, 0.0, 0.0, 1.0, 0.5, 1.0)); BOUNDING_SHAPES.put(Direction.DOWN, Shapes.box(0.0, 0.5, 0.0, 1.0, 1.0, 1.0)); diff --git a/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java b/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java index 8d79e82f..117c82d5 100644 --- a/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java @@ -1,17 +1,6 @@ package ru.betterend.blocks.basis; -import java.awt.Point; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; - -import net.minecraft.world.level.block.entity.BlockEntityTicker; -import net.minecraft.world.level.block.entity.BlockEntityType; -import org.jetbrains.annotations.Nullable; - import com.google.common.collect.Lists; - import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; @@ -34,6 +23,8 @@ import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.EntityBlock; import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityTicker; +import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.block.state.properties.BooleanProperty; @@ -44,6 +35,7 @@ import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.Shapes; import net.minecraft.world.phys.shapes.VoxelShape; +import org.jetbrains.annotations.Nullable; import ru.bclib.blocks.BaseBlockNotFull; import ru.bclib.blocks.BlockProperties; import ru.bclib.client.models.ModelsHelper; @@ -57,59 +49,63 @@ import ru.betterend.registry.EndBlockEntities; import ru.betterend.registry.EndBlocks; import ru.betterend.rituals.InfusionRitual; +import java.awt.Point; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; + @SuppressWarnings({"deprecation"}) public class PedestalBlock extends BaseBlockNotFull implements EntityBlock { public final static EnumProperty STATE = EndBlockProperties.PEDESTAL_STATE; public static final BooleanProperty HAS_ITEM = EndBlockProperties.HAS_ITEM; public static final BooleanProperty HAS_LIGHT = BlockProperties.HAS_LIGHT; - + private static final VoxelShape SHAPE_DEFAULT; private static final VoxelShape SHAPE_COLUMN; private static final VoxelShape SHAPE_PILLAR; private static final VoxelShape SHAPE_PEDESTAL_TOP; private static final VoxelShape SHAPE_COLUMN_TOP; private static final VoxelShape SHAPE_BOTTOM; - + /** - * * Register new Pedestal block with Better End mod id. - * - * @param name pedestal name + * + * @param name pedestal name * @param source source block * @return new Pedestal block with Better End id. */ public static Block registerPedestal(String name, Block source) { return EndBlocks.registerBlock(name, new PedestalBlock(source)); } - + /** - * * Register new Pedestal block with specified mod id. - * - * @param id pedestal id + * + * @param id pedestal id * @param source source block * @return new Pedestal block with specified id. */ public static Block registerPedestal(ResourceLocation id, Block source) { return EndBlocks.registerBlock(id, new PedestalBlock(source)); } - + protected final Block parent; protected float height = 1.0F; - + public PedestalBlock(Block parent) { super(FabricBlockSettings.copyOf(parent).luminance(state -> state.getValue(HAS_LIGHT) ? 12 : 0)); this.registerDefaultState(stateDefinition.any().setValue(STATE, PedestalState.DEFAULT).setValue(HAS_ITEM, false).setValue(HAS_LIGHT, false)); this.parent = parent; } - + public float getHeight(BlockState state) { if (state.getBlock() instanceof PedestalBlock && state.getValue(STATE) == PedestalState.PEDESTAL_TOP) { return this.height - 0.2F; } return this.height; } - + @Override @Deprecated public InteractionResult use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) { @@ -126,7 +122,8 @@ public class PedestalBlock extends BaseBlockNotFull implements EntityBlock { pedestal.setItem(0, itemStack); checkRitual(world, pos); return InteractionResult.SUCCESS; - } else { + } + else { ItemStack itemStack = pedestal.getItem(0); if (player.addItem(itemStack)) { pedestal.removeItemNoUpdate(0); @@ -142,7 +139,7 @@ public class PedestalBlock extends BaseBlockNotFull implements EntityBlock { @Override public void destroy(LevelAccessor levelAccessor, BlockPos blockPos, BlockState blockState) { MutableBlockPos posMutable = new MutableBlockPos(); - for (Point point: InfusionRitual.getMap()) { + for (Point point : InfusionRitual.getMap()) { posMutable.set(blockPos).move(point.x, 0, point.y); BlockState state = levelAccessor.getBlockState(posMutable); if (state.getBlock() instanceof InfusionPedestal) { @@ -160,7 +157,7 @@ public class PedestalBlock extends BaseBlockNotFull implements EntityBlock { public void checkRitual(Level world, BlockPos pos) { MutableBlockPos posMutable = new MutableBlockPos(); - for (Point point: InfusionRitual.getMap()) { + for (Point point : InfusionRitual.getMap()) { posMutable.set(pos).move(point.x, 0, point.y); BlockState state = world.getBlockState(posMutable); if (state.getBlock() instanceof InfusionPedestal) { @@ -169,7 +166,7 @@ public class PedestalBlock extends BaseBlockNotFull implements EntityBlock { } } } - + @Override @Nullable public BlockState getStateForPlacement(BlockPlaceContext context) { @@ -182,18 +179,22 @@ public class PedestalBlock extends BaseBlockNotFull implements EntityBlock { boolean hasPedestalUnder = downState.getBlock() instanceof PedestalBlock; if (!hasPedestalOver && hasPedestalUnder && upSideSolid) { return defaultBlockState().setValue(STATE, PedestalState.COLUMN_TOP); - } else if (!hasPedestalOver && !hasPedestalUnder && upSideSolid) { + } + else if (!hasPedestalOver && !hasPedestalUnder && upSideSolid) { return defaultBlockState().setValue(STATE, PedestalState.COLUMN); - } else if (hasPedestalUnder && hasPedestalOver) { + } + else if (hasPedestalUnder && hasPedestalOver) { return defaultBlockState().setValue(STATE, PedestalState.PILLAR); - } else if (hasPedestalUnder) { + } + else if (hasPedestalUnder) { return defaultBlockState().setValue(STATE, PedestalState.PEDESTAL_TOP); - } else if (hasPedestalOver) { + } + else if (hasPedestalOver) { return defaultBlockState().setValue(STATE, PedestalState.BOTTOM); } return defaultBlockState(); } - + @Override @Deprecated public BlockState updateShape(BlockState state, Direction direction, BlockState newState, LevelAccessor world, BlockPos pos, BlockPos posFrom) { @@ -204,7 +205,7 @@ public class PedestalBlock extends BaseBlockNotFull implements EntityBlock { } return updated; } - + private BlockState getUpdatedState(BlockState state, Direction direction, BlockState newState, LevelAccessor world, BlockPos pos, BlockPos posFrom) { if (!state.is(this)) return state.updateShape(direction, newState, world, pos, posFrom); if (direction != Direction.UP && direction != Direction.DOWN) return state; @@ -216,21 +217,27 @@ public class PedestalBlock extends BaseBlockNotFull implements EntityBlock { if (direction == Direction.UP) { upSideSolid = newState.isFaceSturdy(world, posFrom, Direction.DOWN) || newState.is(BlockTags.WALLS); hasPedestalOver = newState.getBlock() instanceof PedestalBlock; - } else { + } + else { hasPedestalUnder = newState.getBlock() instanceof PedestalBlock; } BlockState updatedState; if (!hasPedestalOver && hasPedestalUnder && upSideSolid) { updatedState = state.setValue(STATE, PedestalState.COLUMN_TOP); - } else if (!hasPedestalOver && !hasPedestalUnder && upSideSolid) { + } + else if (!hasPedestalOver && !hasPedestalUnder && upSideSolid) { updatedState = state.setValue(STATE, PedestalState.COLUMN); - } else if (hasPedestalUnder && hasPedestalOver) { + } + else if (hasPedestalUnder && hasPedestalOver) { updatedState = state.setValue(STATE, PedestalState.PILLAR); - } else if (hasPedestalUnder) { + } + else if (hasPedestalUnder) { updatedState = state.setValue(STATE, PedestalState.PEDESTAL_TOP); - } else if (hasPedestalOver) { + } + else if (hasPedestalOver) { updatedState = state.setValue(STATE, PedestalState.BOTTOM); - } else { + } + else { updatedState = state.setValue(STATE, PedestalState.DEFAULT); } if (!isPlaceable(updatedState)) { @@ -238,7 +245,7 @@ public class PedestalBlock extends BaseBlockNotFull implements EntityBlock { } return updatedState; } - + @Override public List getDrops(BlockState state, LootContext.Builder builder) { List drop = Lists.newArrayList(super.getDrops(state, builder)); @@ -251,13 +258,14 @@ public class PedestalBlock extends BaseBlockNotFull implements EntityBlock { drop.add(pedestal.getItem(0)); } } - } else { + } + else { return drop; } } return drop; } - + private void moveStoredStack(LevelAccessor world, BlockState state, BlockPos pos) { BlockEntity blockEntity = world.getBlockEntity(pos); if (blockEntity instanceof PedestalBlockEntity && state.is(this)) { @@ -268,34 +276,39 @@ public class PedestalBlock extends BaseBlockNotFull implements EntityBlock { } } } - + private void moveStoredStack(BlockEntity blockEntity, LevelAccessor world, ItemStack stack, BlockPos pos) { BlockState state = world.getBlockState(pos); if (!state.is(this)) { dropStoredStack(blockEntity, stack, pos); - } else if (state.getValue(STATE).equals(PedestalState.PILLAR)) { + } + else if (state.getValue(STATE).equals(PedestalState.PILLAR)) { moveStoredStack(blockEntity, world, stack, pos.above()); - } else if (!isPlaceable(state)) { + } + else if (!isPlaceable(state)) { dropStoredStack(blockEntity, stack, pos); - } else if (blockEntity instanceof PedestalBlockEntity) { + } + else if (blockEntity instanceof PedestalBlockEntity) { PedestalBlockEntity pedestal = (PedestalBlockEntity) blockEntity; if (pedestal.isEmpty()) { pedestal.setItem(0, stack); - } else { + } + else { dropStoredStack(blockEntity, stack, pos); } - } else { + } + else { dropStoredStack(blockEntity, stack, pos); } } - + private void dropStoredStack(BlockEntity blockEntity, ItemStack stack, BlockPos pos) { if (blockEntity != null && blockEntity.getLevel() != null) { Level world = blockEntity.getLevel(); Block.popResource(world, getDropPos(world, pos), stack); } } - + private BlockPos getDropPos(LevelAccessor world, BlockPos pos) { BlockPos dropPos; if (world.getBlockState(pos).isAir()) { @@ -304,7 +317,7 @@ public class PedestalBlock extends BaseBlockNotFull implements EntityBlock { if (world.getBlockState(pos.above()).isAir()) { return pos.above(); } - for(int i = 2; i < Direction.values().length; i++) { + for (int i = 2; i < Direction.values().length; i++) { dropPos = pos.relative(Direction.from3DDataValue(i)); if (world.getBlockState(dropPos).isAir()) { return dropPos.immutable(); @@ -312,19 +325,19 @@ public class PedestalBlock extends BaseBlockNotFull implements EntityBlock { } return getDropPos(world, pos.above()); } - + public boolean isPlaceable(BlockState state) { if (!state.is(this)) return false; PedestalState currentState = state.getValue(STATE); return currentState == PedestalState.DEFAULT || - currentState == PedestalState.PEDESTAL_TOP; + currentState == PedestalState.PEDESTAL_TOP; } - + @Override @Deprecated public VoxelShape getShape(BlockState state, BlockGetter world, BlockPos pos, CollisionContext context) { if (state.is(this)) { - switch(state.getValue(STATE)) { + switch (state.getValue(STATE)) { case BOTTOM: { return SHAPE_BOTTOM; } @@ -347,7 +360,7 @@ public class PedestalBlock extends BaseBlockNotFull implements EntityBlock { } return super.getShape(state, world, pos, context); } - + @Override protected void createBlockStateDefinition(StateDefinition.Builder stateManager) { stateManager.add(STATE, HAS_ITEM, HAS_LIGHT); @@ -361,13 +374,13 @@ public class PedestalBlock extends BaseBlockNotFull implements EntityBlock { public boolean hasUniqueEntity() { return false; } - + @Override @Deprecated public boolean hasAnalogOutputSignal(BlockState state) { return state.getBlock() instanceof PedestalBlock; } - + @Override @Deprecated public int getAnalogOutputSignal(BlockState state, Level world, BlockPos pos) { @@ -402,7 +415,8 @@ public class PedestalBlock extends BaseBlockNotFull implements EntityBlock { case PILLAR: pattern = Patterns.createJson(Patterns.BLOCK_PEDESTAL_PILLAR, textures); break; - default: break; + default: + break; } return ModelsHelper.fromPattern(pattern); } @@ -422,8 +436,9 @@ public class PedestalBlock extends BaseBlockNotFull implements EntityBlock { String name = blockId.getPath(); return new HashMap() { private static final long serialVersionUID = 1L; + { - put("%mod%", blockId.getNamespace() ); + put("%mod%", blockId.getNamespace()); put("%top%", name + "_top"); put("%base%", name + "_base"); put("%pillar%", name + "_pillar"); @@ -438,7 +453,7 @@ public class PedestalBlock extends BaseBlockNotFull implements EntityBlock { if (level.isClientSide) return null; BlockEntityTicker ticker = createTickerHelper(blockEntityType, EndBlockEntities.PEDESTAL, PedestalBlockEntity::tick); - if (ticker!=null) return ticker; + if (ticker != null) return ticker; return createTickerHelper(blockEntityType, EndBlockEntities.INFUSION_PEDESTAL, InfusionPedestalEntity::tick); } @@ -447,7 +462,7 @@ public class PedestalBlock extends BaseBlockNotFull implements EntityBlock { protected static BlockEntityTicker createTickerHelper(BlockEntityType blockEntityType, BlockEntityType blockEntityType2, BlockEntityTicker blockEntityTicker) { return blockEntityType2 == blockEntityType ? (BlockEntityTicker) blockEntityTicker : null; } - + static { VoxelShape basinUp = Block.box(2, 3, 2, 14, 4, 14); VoxelShape basinDown = Block.box(0, 0, 0, 16, 3, 16); diff --git a/src/main/java/ru/betterend/blocks/basis/StoneLanternBlock.java b/src/main/java/ru/betterend/blocks/basis/StoneLanternBlock.java index b8f2b7c9..d421cd5d 100644 --- a/src/main/java/ru/betterend/blocks/basis/StoneLanternBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/StoneLanternBlock.java @@ -1,9 +1,5 @@ package ru.betterend.blocks.basis; -import java.util.Optional; - -import org.jetbrains.annotations.Nullable; - import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; @@ -17,19 +13,22 @@ import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; +import org.jetbrains.annotations.Nullable; import ru.bclib.client.models.ModelsHelper; import ru.bclib.interfaces.IColorProvider; import ru.betterend.client.models.Patterns; import ru.betterend.registry.EndBlocks; +import java.util.Optional; + public class StoneLanternBlock extends EndLanternBlock implements IColorProvider { private static final VoxelShape SHAPE_CEIL = Block.box(3, 1, 3, 13, 16, 13); private static final VoxelShape SHAPE_FLOOR = Block.box(3, 0, 3, 13, 15, 13); - + public StoneLanternBlock(Block source) { super(FabricBlockSettings.copyOf(source).luminance(15)); } - + @Override public BlockColor getProvider() { return ((IColorProvider) EndBlocks.AURORA_CRYSTAL).getProvider(); @@ -39,7 +38,7 @@ public class StoneLanternBlock extends EndLanternBlock implements IColorProvider public ItemColor getItemProvider() { return ((IColorProvider) EndBlocks.AURORA_CRYSTAL).getItemProvider(); } - + @Override public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { return state.getValue(IS_FLOOR) ? SHAPE_FLOOR : SHAPE_CEIL; diff --git a/src/main/java/ru/betterend/blocks/complex/ColoredMaterial.java b/src/main/java/ru/betterend/blocks/complex/ColoredMaterial.java index 9ae68e51..16a2c92e 100644 --- a/src/main/java/ru/betterend/blocks/complex/ColoredMaterial.java +++ b/src/main/java/ru/betterend/blocks/complex/ColoredMaterial.java @@ -1,10 +1,6 @@ package ru.betterend.blocks.complex; -import java.util.Map; -import java.util.function.Function; - import com.google.common.collect.Maps; - import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.core.Registry; import net.minecraft.world.item.DyeColor; @@ -18,15 +14,18 @@ import ru.betterend.BetterEnd; import ru.betterend.config.Configs; import ru.betterend.registry.EndBlocks; +import java.util.Map; +import java.util.function.Function; + public class ColoredMaterial { private static final Map DYES = Maps.newHashMap(); private static final Map COLORS = Maps.newHashMap(); private final Map colors = Maps.newHashMap(); - + public ColoredMaterial(Function constructor, Block source, boolean craftEight) { this(constructor, source, COLORS, DYES, craftEight); } - + public ColoredMaterial(Function constructor, Block source, Map colors, Map dyes, boolean craftEight) { String id = Registry.BLOCK.getKey(source).getPath(); colors.forEach((color, name) -> { @@ -43,17 +42,17 @@ public class ColoredMaterial { BlocksHelper.addBlockColor(block, color); }); } - + public Block getByColor(DyeColor color) { return colors.get(color.getMaterialColor().col); } - + public Block getByColor(int color) { return colors.get(color); } - + static { - for (DyeColor color: DyeColor.values()) { + for (DyeColor color : DyeColor.values()) { int colorRGB = color.getMaterialColor().col; COLORS.put(colorRGB, color.getName()); DYES.put(colorRGB, DyeItem.byColor(color)); diff --git a/src/main/java/ru/betterend/blocks/complex/CrystalSubblocksMaterial.java b/src/main/java/ru/betterend/blocks/complex/CrystalSubblocksMaterial.java index 1e82ff4c..c5d240b1 100644 --- a/src/main/java/ru/betterend/blocks/complex/CrystalSubblocksMaterial.java +++ b/src/main/java/ru/betterend/blocks/complex/CrystalSubblocksMaterial.java @@ -29,7 +29,7 @@ public class CrystalSubblocksMaterial { public final Block brick_stairs; public final Block brick_slab; public final Block brick_wall; - + public CrystalSubblocksMaterial(String name, Block source) { FabricBlockSettings material = FabricBlockSettings.copyOf(source); polished = EndBlocks.registerBlock(name + "_polished", new BaseBlock(material)); @@ -43,29 +43,29 @@ public class CrystalSubblocksMaterial { brick_stairs = EndBlocks.registerBlock(name + "_bricks_stairs", new BaseStairsBlock(bricks)); brick_slab = EndBlocks.registerBlock(name + "_bricks_slab", new BaseSlabBlock(bricks)); brick_wall = EndBlocks.registerBlock(name + "_bricks_wall", new BaseWallBlock(bricks)); - + // Recipes // GridRecipe.make(BetterEnd.MOD_ID, name + "_bricks", bricks).checkConfig(Configs.RECIPE_CONFIG).setOutputCount(4).setShape("##", "##").addMaterial('#', source).setGroup("end_bricks").build(); GridRecipe.make(BetterEnd.MOD_ID, name + "_polished", polished).checkConfig(Configs.RECIPE_CONFIG).setOutputCount(4).setShape("##", "##").addMaterial('#', bricks).setGroup("end_tile").build(); GridRecipe.make(BetterEnd.MOD_ID, name + "_tiles", tiles).checkConfig(Configs.RECIPE_CONFIG).setOutputCount(4).setShape("##", "##").addMaterial('#', polished).setGroup("end_small_tile").build(); GridRecipe.make(BetterEnd.MOD_ID, name + "_pillar", pillar).checkConfig(Configs.RECIPE_CONFIG).setShape("#", "#").addMaterial('#', slab).setGroup("end_pillar").build(); - + GridRecipe.make(BetterEnd.MOD_ID, name + "_stairs", stairs).checkConfig(Configs.RECIPE_CONFIG).setOutputCount(4).setShape("# ", "## ", "###").addMaterial('#', source).setGroup("end_stone_stairs").build(); GridRecipe.make(BetterEnd.MOD_ID, name + "_slab", slab).checkConfig(Configs.RECIPE_CONFIG).setOutputCount(6).setShape("###").addMaterial('#', source).setGroup("end_stone_slabs").build(); GridRecipe.make(BetterEnd.MOD_ID, name + "_bricks_stairs", brick_stairs).checkConfig(Configs.RECIPE_CONFIG).setOutputCount(4).setShape("# ", "## ", "###").addMaterial('#', bricks).setGroup("end_stone_stairs").build(); GridRecipe.make(BetterEnd.MOD_ID, name + "_bricks_slab", brick_slab).checkConfig(Configs.RECIPE_CONFIG).setOutputCount(6).setShape("###").addMaterial('#', bricks).setGroup("end_stone_slabs").build(); - + GridRecipe.make(BetterEnd.MOD_ID, name + "_wall", wall).checkConfig(Configs.RECIPE_CONFIG).setOutputCount(6).setShape("###", "###").addMaterial('#', source).setGroup("end_wall").build(); GridRecipe.make(BetterEnd.MOD_ID, name + "_bricks_wall", brick_wall).checkConfig(Configs.RECIPE_CONFIG).setOutputCount(6).setShape("###", "###").addMaterial('#', bricks).setGroup("end_wall").build(); - + CraftingRecipes.registerPedestal(name + "_pedestal", pedestal, slab, pillar); - + // Item Tags // TagHelper.addTag(ItemTags.SLABS, slab, brick_slab); TagHelper.addTag(ItemTags.STONE_BRICKS, bricks); TagHelper.addTag(ItemTags.STONE_CRAFTING_MATERIALS, source); TagHelper.addTag(ItemTags.STONE_TOOL_MATERIALS, source); - + // Block Tags // TagHelper.addTag(BlockTags.STONE_BRICKS, bricks); TagHelper.addTag(BlockTags.WALLS, wall, brick_wall); diff --git a/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java b/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java index d9526eb9..cb057d54 100644 --- a/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java +++ b/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java @@ -28,7 +28,6 @@ import ru.bclib.blocks.WoodenPressurePlateBlock; import ru.bclib.items.ModelProviderItem; import ru.bclib.items.tool.BaseAxeItem; import ru.bclib.items.tool.BaseHoeItem; -import ru.bclib.items.tool.BasePickaxeItem; import ru.bclib.items.tool.BaseShovelItem; import ru.bclib.items.tool.BaseSwordItem; import ru.bclib.recipes.FurnaceRecipe; @@ -49,7 +48,6 @@ import ru.betterend.recipe.builders.AlloyingRecipe; import ru.betterend.recipe.builders.AnvilRecipe; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndItems; -import ru.betterend.registry.EndTags; public class MetalMaterial { public final Block ore; @@ -62,7 +60,7 @@ public class MetalMaterial { public final Block chain; public final Block stairs; public final Block slab; - + public final Block chandelier; public final Block bulb_lantern; public final ColoredMaterial bulb_lantern_colored; @@ -73,21 +71,21 @@ public class MetalMaterial { public final Item rawOre; public final Item nugget; public final Item ingot; - + public final Item shovelHead; public final Item pickaxeHead; public final Item axeHead; public final Item hoeHead; public final Item swordBlade; public final Item swordHandle; - + public final Item shovel; public final Item sword; public final Item pickaxe; public final Item axe; public final Item hoe; public final Item hammer; - + public final Item forgedPlate; public final Item helmet; public final Item chestplate; @@ -95,23 +93,23 @@ public class MetalMaterial { public final Item boots; public final Tag.Named alloyingOre; - + public static MetalMaterial makeNormal(String name, MaterialColor color, Tier material, ArmorMaterial armor) { return new MetalMaterial(name, true, FabricBlockSettings.copyOf(Blocks.IRON_BLOCK).materialColor(color), EndItems.makeEndItemSettings(), material, armor); } - + public static MetalMaterial makeNormal(String name, MaterialColor color, float hardness, float resistance, Tier material, ArmorMaterial armor) { return new MetalMaterial(name, true, FabricBlockSettings.copyOf(Blocks.IRON_BLOCK).materialColor(color).hardness(hardness).resistance(resistance), EndItems.makeEndItemSettings(), material, armor); } - + public static MetalMaterial makeOreless(String name, MaterialColor color, Tier material, ArmorMaterial armor) { return new MetalMaterial(name, false, FabricBlockSettings.copyOf(Blocks.IRON_BLOCK).materialColor(color), EndItems.makeEndItemSettings(), material, armor); } - + public static MetalMaterial makeOreless(String name, MaterialColor color, float hardness, float resistance, Tier material, ArmorMaterial armor) { return new MetalMaterial(name, false, FabricBlockSettings.copyOf(Blocks.IRON_BLOCK).materialColor(color).hardness(hardness).resistance(resistance), EndItems.makeEndItemSettings(), material, armor); } - + private MetalMaterial(String name, boolean hasOre, FabricBlockSettings settings, Properties itemSettings, Tier material, ArmorMaterial armor) { BlockBehaviour.Properties lanternProperties = FabricBlockSettings.copyOf(settings).hardness(1).resistance(1).luminance(15).sound(SoundType.LANTERN); final int level = material.getLevel(); @@ -132,28 +130,28 @@ public class MetalMaterial { bars = EndBlocks.registerBlock(name + "_bars", new BaseMetalBarsBlock(block)); chain = EndBlocks.registerBlock(name + "_chain", new BaseChainBlock(block.defaultMaterialColor())); pressurePlate = EndBlocks.registerBlock(name + "_plate", new WoodenPressurePlateBlock(block)); - + chandelier = EndBlocks.registerBlock(name + "_chandelier", new ChandelierBlock(block)); bulb_lantern = EndBlocks.registerBlock(name + "_bulb_lantern", new BulbVineLanternBlock(lanternProperties)); bulb_lantern_colored = new ColoredMaterial(BulbVineLanternColoredBlock::new, bulb_lantern, false); nugget = EndItems.registerEndItem(name + "_nugget", new ModelProviderItem(itemSettings)); ingot = EndItems.registerEndItem(name + "_ingot", new ModelProviderItem(itemSettings)); - + shovelHead = EndItems.registerEndItem(name + "_shovel_head"); pickaxeHead = EndItems.registerEndItem(name + "_pickaxe_head"); axeHead = EndItems.registerEndItem(name + "_axe_head"); hoeHead = EndItems.registerEndItem(name + "_hoe_head"); swordBlade = EndItems.registerEndItem(name + "_sword_blade"); swordHandle = EndItems.registerEndItem(name + "_sword_handle"); - + shovel = EndItems.registerEndTool(name + "_shovel", new BaseShovelItem(material, 1.5F, -3.0F, itemSettings)); sword = EndItems.registerEndTool(name + "_sword", new BaseSwordItem(material, 3, -2.4F, itemSettings)); pickaxe = EndItems.registerEndTool(name + "_pickaxe", new EndPickaxe(material, 1, -2.8F, itemSettings)); axe = EndItems.registerEndTool(name + "_axe", new BaseAxeItem(material, 6.0F, -3.0F, itemSettings)); hoe = EndItems.registerEndTool(name + "_hoe", new BaseHoeItem(material, -3, 0.0F, itemSettings)); hammer = EndItems.registerEndTool(name + "_hammer", new EndHammerItem(material, 5.0F, -3.2F, 0.3D, itemSettings)); - + forgedPlate = EndItems.registerEndItem(name + "_forged_plate"); helmet = EndItems.registerEndItem(name + "_helmet", new EndArmorItem(armor, EquipmentSlot.HEAD, itemSettings)); chestplate = EndItems.registerEndItem(name + "_chestplate", new EndArmorItem(armor, EquipmentSlot.CHEST, itemSettings)); @@ -162,19 +160,19 @@ public class MetalMaterial { anvilBlock = EndBlocks.registerBlock(name + "_anvil", new EndAnvilBlock(this, block.defaultMaterialColor(), level)); anvilItem = EndItems.registerEndItem(name + "_anvil_item", new EndAnvilItem(anvilBlock)); - + if (hasOre) { FurnaceRecipe.make(BetterEnd.MOD_ID, name + "_ingot_furnace_ore", ore, ingot).checkConfig(Configs.RECIPE_CONFIG).setGroup("end_ingot").buildWithBlasting(); FurnaceRecipe.make(BetterEnd.MOD_ID, name + "_ingot_furnace_raw", rawOre, ingot).checkConfig(Configs.RECIPE_CONFIG).setGroup("end_ingot").buildWithBlasting(); AlloyingRecipe.Builder.create(name + "_ingot_alloy").setInput(alloyingOre, alloyingOre).setOutput(ingot, 3).setExpiriense(2.1F).build(); } - + // Basic recipes GridRecipe.make(BetterEnd.MOD_ID, name + "_ingot_from_nuggets", ingot).checkConfig(Configs.RECIPE_CONFIG).setShape("###", "###", "###").addMaterial('#', nugget).setGroup("end_metal_ingots_nug").build(); GridRecipe.make(BetterEnd.MOD_ID, name + "_nuggets_from_ingot", nugget).checkConfig(Configs.RECIPE_CONFIG).setOutputCount(9).setList("#").addMaterial('#', ingot).setGroup("end_metal_nuggets_ing").build(); GridRecipe.make(BetterEnd.MOD_ID, name + "_block", block).checkConfig(Configs.RECIPE_CONFIG).setShape("###", "###", "###").addMaterial('#', ingot).setGroup("end_metal_blocks").build(); GridRecipe.make(BetterEnd.MOD_ID, name + "_ingot_from_block", ingot).checkConfig(Configs.RECIPE_CONFIG).setOutputCount(9).setList("#").addMaterial('#', block).setGroup("end_metal_ingots").build(); - + // Block recipes GridRecipe.make(BetterEnd.MOD_ID, name + "_tile", tile).checkConfig(Configs.RECIPE_CONFIG).setOutputCount(4).setShape("##", "##").addMaterial('#', block).setGroup("end_metal_tiles").build(); GridRecipe.make(BetterEnd.MOD_ID, name + "_bars", bars).checkConfig(Configs.RECIPE_CONFIG).setOutputCount(16).setShape("###", "###").addMaterial('#', ingot).setGroup("end_metal_bars").build(); @@ -186,9 +184,9 @@ public class MetalMaterial { GridRecipe.make(BetterEnd.MOD_ID, name + "_chain", chain).checkConfig(Configs.RECIPE_CONFIG).setShape("N", "#", "N").addMaterial('#', ingot).addMaterial('N', nugget).setGroup("end_metal_chain").build(); GridRecipe.make(BetterEnd.MOD_ID, name + "_anvil", anvilBlock).checkConfig(Configs.RECIPE_CONFIG).setShape("###", " I ", "III").addMaterial('#', block, tile).addMaterial('I', ingot).setGroup("end_metal_anvil").build(); GridRecipe.make(BetterEnd.MOD_ID, name + "_bulb_lantern", bulb_lantern).checkConfig(Configs.RECIPE_CONFIG).setShape("C", "I", "#").addMaterial('C', chain).addMaterial('I', ingot).addMaterial('#', EndItems.GLOWING_BULB).build(); - + GridRecipe.make(BetterEnd.MOD_ID, name + "_chandelier", chandelier).checkConfig(Configs.RECIPE_CONFIG).setShape("I#I", " # ").addMaterial('#', ingot).addMaterial('I', EndItems.LUMECORN_ROD).setGroup("end_metal_chandelier").build(); - + // Tools & armor into nuggets FurnaceRecipe.make(BetterEnd.MOD_ID, name + "_axe_nugget", axe, nugget).checkConfig(Configs.RECIPE_CONFIG).setGroup("end_nugget").buildWithBlasting(); FurnaceRecipe.make(BetterEnd.MOD_ID, name + "_hoe_nugget", hoe, nugget).checkConfig(Configs.RECIPE_CONFIG).setGroup("end_nugget").buildWithBlasting(); @@ -199,7 +197,7 @@ public class MetalMaterial { FurnaceRecipe.make(BetterEnd.MOD_ID, name + "_chestplate_nugget", chestplate, nugget).checkConfig(Configs.RECIPE_CONFIG).setGroup("end_nugget").buildWithBlasting(); FurnaceRecipe.make(BetterEnd.MOD_ID, name + "_leggings_nugget", leggings, nugget).checkConfig(Configs.RECIPE_CONFIG).setGroup("end_nugget").buildWithBlasting(); FurnaceRecipe.make(BetterEnd.MOD_ID, name + "_boots_nugget", boots, nugget).checkConfig(Configs.RECIPE_CONFIG).setGroup("end_nugget").buildWithBlasting(); - + // Tool parts from ingots AnvilRecipe.Builder.create(name + "_shovel_head").setInput(ingot).setOutput(shovelHead).setAnvilLevel(level).setToolLevel(level).setDamage(level).build(); AnvilRecipe.Builder.create(name + "_pickaxe_head").setInput(ingot).setInputCount(3).setOutput(pickaxeHead).setAnvilLevel(level).setToolLevel(level).setDamage(level).build(); @@ -207,7 +205,7 @@ public class MetalMaterial { AnvilRecipe.Builder.create(name + "_hoe_head").setInput(ingot).setInputCount(2).setOutput(hoeHead).setAnvilLevel(level).setToolLevel(level).setDamage(level).build(); AnvilRecipe.Builder.create(name + "_sword_blade").setInput(ingot).setOutput(swordBlade).setAnvilLevel(level).setToolLevel(level).setDamage(level).build(); AnvilRecipe.Builder.create(name + "_forged_plate").setInput(ingot).setOutput(forgedPlate).setAnvilLevel(level).setToolLevel(level).setDamage(level).build(); - + // Tools from parts SmithingTableRecipe.create(BetterEnd.MOD_ID, name + "_hammer").checkConfig(Configs.RECIPE_CONFIG).setResult(hammer).setBase(block).setAddition(Items.STICK).build(); SmithingTableRecipe.create(BetterEnd.MOD_ID, name + "_axe").checkConfig(Configs.RECIPE_CONFIG).setResult(axe).setBase(axeHead).setAddition(Items.STICK).build(); @@ -216,13 +214,13 @@ public class MetalMaterial { SmithingTableRecipe.create(BetterEnd.MOD_ID, name + "_sword_handle").checkConfig(Configs.RECIPE_CONFIG).setResult(swordHandle).setBase(ingot).setAddition(Items.STICK).build(); SmithingTableRecipe.create(BetterEnd.MOD_ID, name + "_sword").checkConfig(Configs.RECIPE_CONFIG).setResult(sword).setBase(swordBlade).setAddition(swordHandle).build(); SmithingTableRecipe.create(BetterEnd.MOD_ID, name + "_shovel").checkConfig(Configs.RECIPE_CONFIG).setResult(shovel).setBase(shovelHead).setAddition(Items.STICK).build(); - + // Armor crafting GridRecipe.make(BetterEnd.MOD_ID, name + "_helmet", helmet).checkConfig(Configs.RECIPE_CONFIG).setShape("###", "# #").addMaterial('#', forgedPlate).setGroup("end_metal_helmets").build(); GridRecipe.make(BetterEnd.MOD_ID, name + "_chestplate", chestplate).checkConfig(Configs.RECIPE_CONFIG).setShape("# #", "###", "###").addMaterial('#', forgedPlate).setGroup("end_metal_chestplates").build(); GridRecipe.make(BetterEnd.MOD_ID, name + "_leggings", leggings).checkConfig(Configs.RECIPE_CONFIG).setShape("###", "# #", "# #").addMaterial('#', forgedPlate).setGroup("end_metal_leggings").build(); GridRecipe.make(BetterEnd.MOD_ID, name + "_boots", boots).checkConfig(Configs.RECIPE_CONFIG).setShape("# #", "# #").addMaterial('#', forgedPlate).setGroup("end_metal_boots").build(); - + TagHelper.addTag(BlockTags.ANVIL, anvilBlock); TagHelper.addTag(BlockTags.BEACON_BASE_BLOCKS, block); TagHelper.addTag(ItemTags.BEACON_PAYMENT_ITEMS, ingot); diff --git a/src/main/java/ru/betterend/blocks/complex/StoneMaterial.java b/src/main/java/ru/betterend/blocks/complex/StoneMaterial.java index 125c391e..26aed797 100644 --- a/src/main/java/ru/betterend/blocks/complex/StoneMaterial.java +++ b/src/main/java/ru/betterend/blocks/complex/StoneMaterial.java @@ -27,7 +27,7 @@ import ru.betterend.registry.EndItems; public class StoneMaterial { public final Block stone; - + public final Block polished; public final Block tiles; public final Block pillar; @@ -38,16 +38,16 @@ public class StoneMaterial { public final Block pressure_plate; public final Block pedestal; public final Block lantern; - + public final Block bricks; public final Block brick_stairs; public final Block brick_slab; public final Block brick_wall; public final Block furnace; - + public StoneMaterial(String name, MaterialColor color) { FabricBlockSettings material = FabricBlockSettings.copyOf(Blocks.END_STONE).materialColor(color); - + stone = EndBlocks.registerBlock(name, new BaseBlock(material)); polished = EndBlocks.registerBlock(name + "_polished", new BaseBlock(material)); tiles = EndBlocks.registerBlock(name + "_tiles", new BaseBlock(material)); @@ -59,48 +59,48 @@ public class StoneMaterial { pressure_plate = EndBlocks.registerBlock(name + "_plate", new StonePressurePlateBlock(stone)); pedestal = EndBlocks.registerBlock(name + "_pedestal", new EndPedestal(stone)); lantern = EndBlocks.registerBlock(name + "_lantern", new StoneLanternBlock(stone)); - + bricks = EndBlocks.registerBlock(name + "_bricks", new BaseBlock(material)); brick_stairs = EndBlocks.registerBlock(name + "_bricks_stairs", new BaseStairsBlock(bricks)); brick_slab = EndBlocks.registerBlock(name + "_bricks_slab", new BaseSlabBlock(bricks)); brick_wall = EndBlocks.registerBlock(name + "_bricks_wall", new BaseWallBlock(bricks)); furnace = EndBlocks.registerBlock(name + "_furnace", new BaseFurnaceBlock(bricks)); - + // Recipes // GridRecipe.make(BetterEnd.MOD_ID, name + "_bricks", bricks).checkConfig(Configs.RECIPE_CONFIG).setOutputCount(4).setShape("##", "##").addMaterial('#', stone).setGroup("end_bricks").build(); GridRecipe.make(BetterEnd.MOD_ID, name + "_polished", polished).checkConfig(Configs.RECIPE_CONFIG).setOutputCount(4).setShape("##", "##").addMaterial('#', bricks).setGroup("end_tile").build(); GridRecipe.make(BetterEnd.MOD_ID, name + "_tiles", tiles).checkConfig(Configs.RECIPE_CONFIG).setOutputCount(4).setShape("##", "##").addMaterial('#', polished).setGroup("end_small_tile").build(); GridRecipe.make(BetterEnd.MOD_ID, name + "_pillar", pillar).checkConfig(Configs.RECIPE_CONFIG).setShape("#", "#").addMaterial('#', slab).setGroup("end_pillar").build(); - + GridRecipe.make(BetterEnd.MOD_ID, name + "_stairs", stairs).checkConfig(Configs.RECIPE_CONFIG).setOutputCount(4).setShape("# ", "## ", "###").addMaterial('#', stone).setGroup("end_stone_stairs").build(); GridRecipe.make(BetterEnd.MOD_ID, name + "_slab", slab).checkConfig(Configs.RECIPE_CONFIG).setOutputCount(6).setShape("###").addMaterial('#', stone).setGroup("end_stone_slabs").build(); GridRecipe.make(BetterEnd.MOD_ID, name + "_bricks_stairs", brick_stairs).checkConfig(Configs.RECIPE_CONFIG).setOutputCount(4).setShape("# ", "## ", "###").addMaterial('#', bricks).setGroup("end_stone_stairs").build(); GridRecipe.make(BetterEnd.MOD_ID, name + "_bricks_slab", brick_slab).checkConfig(Configs.RECIPE_CONFIG).setOutputCount(6).setShape("###").addMaterial('#', bricks).setGroup("end_stone_slabs").build(); - + GridRecipe.make(BetterEnd.MOD_ID, name + "_wall", wall).checkConfig(Configs.RECIPE_CONFIG).setOutputCount(6).setShape("###", "###").addMaterial('#', stone).setGroup("end_wall").build(); GridRecipe.make(BetterEnd.MOD_ID, name + "_bricks_wall", brick_wall).checkConfig(Configs.RECIPE_CONFIG).setOutputCount(6).setShape("###", "###").addMaterial('#', bricks).setGroup("end_wall").build(); - + GridRecipe.make(BetterEnd.MOD_ID, name + "_button", button).checkConfig(Configs.RECIPE_CONFIG).setList("#").addMaterial('#', stone).setGroup("end_stone_buttons").build(); GridRecipe.make(BetterEnd.MOD_ID, name + "_pressure_plate", pressure_plate).checkConfig(Configs.RECIPE_CONFIG).setShape("##").addMaterial('#', stone).setGroup("end_stone_plates").build(); GridRecipe.make(BetterEnd.MOD_ID, name + "_lantern", lantern).checkConfig(Configs.RECIPE_CONFIG).setShape("S", "#", "S").addMaterial('#', EndItems.CRYSTAL_SHARDS).addMaterial('S', slab, brick_slab).setGroup("end_stone_lanterns").build(); GridRecipe.make(BetterEnd.MOD_ID, name + "_furnace", furnace).checkConfig(Configs.RECIPE_CONFIG).setShape("###", "# #", "###").addMaterial('#', stone).setGroup("end_stone_furnaces").build(); - + CraftingRecipes.registerPedestal(name + "_pedestal", pedestal, slab, pillar); - + // Item Tags // TagHelper.addTag(ItemTags.SLABS, slab, brick_slab); TagHelper.addTag(ItemTags.STONE_BRICKS, bricks); TagHelper.addTag(ItemTags.STONE_CRAFTING_MATERIALS, stone); TagHelper.addTag(ItemTags.STONE_TOOL_MATERIALS, stone); TagHelper.addTag(TagAPI.FURNACES, furnace); - + // Block Tags // TagHelper.addTag(BlockTags.STONE_BRICKS, bricks); TagHelper.addTag(BlockTags.WALLS, wall, brick_wall); TagHelper.addTag(BlockTags.SLABS, slab, brick_slab); TagHelper.addTags(pressure_plate, BlockTags.PRESSURE_PLATES, BlockTags.STONE_PRESSURE_PLATES); TagHelper.addTag(TagAPI.END_STONES, stone); - + TagHelper.addTag(TagAPI.DRAGON_IMMUNE, stone, stairs, slab, wall); } } \ No newline at end of file diff --git a/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java b/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java index 57df31f3..9c17ae2f 100644 --- a/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java +++ b/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java @@ -55,28 +55,28 @@ public class WoodenMaterial { public final Block pressurePlate; public final Block trapdoor; public final Block door; - + public final Block craftingTable; public final Block ladder; public final Block sign; - + public final Block chest; public final Block barrel; public final Block shelf; public final Block composter; - + public final Tag.Named logBlockTag; public final Tag.Named logItemTag; - + public WoodenMaterial(String name, MaterialColor woodColor, MaterialColor planksColor) { FabricBlockSettings materialPlanks = FabricBlockSettings.copyOf(Blocks.OAK_PLANKS).materialColor(planksColor); - + log_stripped = EndBlocks.registerBlock(name + "_stripped_log", new BaseRotatedPillarBlock(materialPlanks)); bark_stripped = EndBlocks.registerBlock(name + "_stripped_bark", new BaseBarkBlock(materialPlanks)); - + log = EndBlocks.registerBlock(name + "_log", new BaseStripableLogBlock(woodColor, log_stripped)); bark = EndBlocks.registerBlock(name + "_bark", new StripableBarkBlock(woodColor, bark_stripped)); - + planks = EndBlocks.registerBlock(name + "_planks", new BaseBlock(materialPlanks)); stairs = EndBlocks.registerBlock(name + "_stairs", new BaseStairsBlock(planks)); slab = EndBlocks.registerBlock(name + "_slab", new BaseSlabBlock(planks)); @@ -86,16 +86,16 @@ public class WoodenMaterial { pressurePlate = EndBlocks.registerBlock(name + "_plate", new WoodenPressurePlateBlock(planks)); trapdoor = EndBlocks.registerBlock(name + "_trapdoor", new BaseTrapdoorBlock(planks)); door = EndBlocks.registerBlock(name + "_door", new BaseDoorBlock(planks)); - + craftingTable = EndBlocks.registerBlock(name + "_crafting_table", new BaseCraftingTableBlock(planks)); ladder = EndBlocks.registerBlock(name + "_ladder", new BaseLadderBlock(planks)); sign = EndBlocks.registerBlock(name + "_sign", new BaseSignBlock(planks)); - + chest = EndBlocks.registerBlock(name + "_chest", new BaseChestBlock(planks)); barrel = EndBlocks.registerBlock(name + "_barrel", new BaseBarrelBlock(planks)); shelf = EndBlocks.registerBlock(name + "_bookshelf", new BaseBookshelfBlock(planks)); composter = EndBlocks.registerBlock(name + "_composter", new BaseComposterBlock(planks)); - + // Recipes // GridRecipe.make(BetterEnd.MOD_ID, name + "_planks", planks).checkConfig(Configs.RECIPE_CONFIG).setOutputCount(4).setList("#").addMaterial('#', log, bark, log_stripped, bark_stripped).setGroup("end_planks").build(); GridRecipe.make(BetterEnd.MOD_ID, name + "_stairs", stairs).checkConfig(Configs.RECIPE_CONFIG).setOutputCount(4).setShape("# ", "## ", "###").addMaterial('#', planks).setGroup("end_planks_stairs").build(); @@ -116,13 +116,13 @@ public class WoodenMaterial { GridRecipe.make(BetterEnd.MOD_ID, name + "_log", log).checkConfig(Configs.RECIPE_CONFIG).setShape("##", "##").addMaterial('#', bark).setOutputCount(3).build(); GridRecipe.make(BetterEnd.MOD_ID, name + "_composter", composter).checkConfig(Configs.RECIPE_CONFIG).setShape("# #", "# #", "###").addMaterial('#', slab).build(); GridRecipe.make(BetterEnd.MOD_ID, name + "_shulker", Items.SHULKER_BOX).checkConfig(Configs.RECIPE_CONFIG).setShape("S", "#", "S").addMaterial('S', Items.SHULKER_SHELL).addMaterial('#', chest).build(); - + // Item Tags // TagHelper.addTag(ItemTags.PLANKS, planks); TagHelper.addTag(ItemTags.WOODEN_PRESSURE_PLATES, pressurePlate); TagHelper.addTag(ItemTags.LOGS, log, bark, log_stripped, bark_stripped); TagHelper.addTag(ItemTags.LOGS_THAT_BURN, log, bark, log_stripped, bark_stripped); - + TagHelper.addTags(button, ItemTags.WOODEN_BUTTONS, ItemTags.BUTTONS); TagHelper.addTags(door, ItemTags.WOODEN_DOORS, ItemTags.DOORS); TagHelper.addTags(fence, ItemTags.WOODEN_FENCES, ItemTags.FENCES); @@ -130,13 +130,13 @@ public class WoodenMaterial { TagHelper.addTags(stairs, ItemTags.WOODEN_STAIRS, ItemTags.STAIRS); TagHelper.addTags(trapdoor, ItemTags.WOODEN_TRAPDOORS, ItemTags.TRAPDOORS); TagHelper.addTag(TagAPI.ITEM_CHEST, chest); - + // Block Tags // TagHelper.addTag(BlockTags.PLANKS, planks); TagHelper.addTag(BlockTags.CLIMBABLE, ladder); TagHelper.addTag(BlockTags.LOGS, log, bark, log_stripped, bark_stripped); TagHelper.addTag(BlockTags.LOGS_THAT_BURN, log, bark, log_stripped, bark_stripped); - + TagHelper.addTags(button, BlockTags.WOODEN_BUTTONS, BlockTags.BUTTONS); TagHelper.addTags(door, BlockTags.WOODEN_DOORS, BlockTags.DOORS); TagHelper.addTags(fence, BlockTags.WOODEN_FENCES, BlockTags.FENCES); @@ -145,42 +145,42 @@ public class WoodenMaterial { TagHelper.addTags(trapdoor, BlockTags.WOODEN_TRAPDOORS, BlockTags.TRAPDOORS); TagHelper.addTag(TagAPI.BOOKSHELVES, shelf); TagHelper.addTag(TagAPI.BLOCK_CHEST, chest); - + logBlockTag = TagAPI.makeBlockTag(BetterEnd.MOD_ID, name + "_logs"); logItemTag = TagAPI.makeItemTag(BetterEnd.MOD_ID, name + "_logs"); TagHelper.addTag(logBlockTag, log_stripped, bark_stripped, log, bark); TagHelper.addTag(logItemTag, log_stripped, bark_stripped, log, bark); - + FlammableBlockRegistry.getDefaultInstance().add(log, 5, 5); FlammableBlockRegistry.getDefaultInstance().add(bark, 5, 5); FlammableBlockRegistry.getDefaultInstance().add(log_stripped, 5, 5); FlammableBlockRegistry.getDefaultInstance().add(bark_stripped, 5, 5); - + FlammableBlockRegistry.getDefaultInstance().add(planks, 5, 20); FlammableBlockRegistry.getDefaultInstance().add(stairs, 5, 20); FlammableBlockRegistry.getDefaultInstance().add(slab, 5, 20); - + FlammableBlockRegistry.getDefaultInstance().add(fence, 5, 20); FlammableBlockRegistry.getDefaultInstance().add(gate, 5, 20); FlammableBlockRegistry.getDefaultInstance().add(button, 5, 20); FlammableBlockRegistry.getDefaultInstance().add(pressurePlate, 5, 20); FlammableBlockRegistry.getDefaultInstance().add(trapdoor, 5, 20); FlammableBlockRegistry.getDefaultInstance().add(door, 5, 20); - + FlammableBlockRegistry.getDefaultInstance().add(craftingTable, 5, 20); FlammableBlockRegistry.getDefaultInstance().add(ladder, 5, 20); FlammableBlockRegistry.getDefaultInstance().add(sign, 5, 20); - + FlammableBlockRegistry.getDefaultInstance().add(chest, 5, 20); FlammableBlockRegistry.getDefaultInstance().add(barrel, 5, 20); FlammableBlockRegistry.getDefaultInstance().add(shelf, 5, 20); FlammableBlockRegistry.getDefaultInstance().add(composter, 5, 20); } - + public boolean isTreeLog(Block block) { return block == log || block == bark; } - + public boolean isTreeLog(BlockState state) { return isTreeLog(state.getBlock()); } diff --git a/src/main/java/ru/betterend/blocks/entities/BlockEntityHydrothermalVent.java b/src/main/java/ru/betterend/blocks/entities/BlockEntityHydrothermalVent.java index cc21085d..710bac7c 100644 --- a/src/main/java/ru/betterend/blocks/entities/BlockEntityHydrothermalVent.java +++ b/src/main/java/ru/betterend/blocks/entities/BlockEntityHydrothermalVent.java @@ -1,7 +1,5 @@ package ru.betterend.blocks.entities; -import java.util.List; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; @@ -21,6 +19,8 @@ import ru.betterend.registry.EndBlockEntities; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndParticles; +import java.util.List; + public class BlockEntityHydrothermalVent extends BlockEntity { private final static Vec3 POSITIVE_Y = new Vec3(0.0f, 1.0f, 0.0f); @@ -39,7 +39,8 @@ public class BlockEntityHydrothermalVent extends BlockEntity { double z = worldPosition.getZ() + level.random.nextDouble(); if (state.getValue(HydrothermalVentBlock.WATERLOGGED)) { level.addParticle(EndParticles.GEYSER_PARTICLE, x, y, z, 0, 0, 0); - } else { + } + else { level.addParticle(ParticleTypes.BUBBLE, x, y, z, 0, 0, 0); } } diff --git a/src/main/java/ru/betterend/blocks/entities/EndStoneSmelterBlockEntity.java b/src/main/java/ru/betterend/blocks/entities/EndStoneSmelterBlockEntity.java index 91614dc5..c53f7b40 100644 --- a/src/main/java/ru/betterend/blocks/entities/EndStoneSmelterBlockEntity.java +++ b/src/main/java/ru/betterend/blocks/entities/EndStoneSmelterBlockEntity.java @@ -47,11 +47,11 @@ import java.util.Map; public class EndStoneSmelterBlockEntity extends BaseContainerBlockEntity implements WorldlyContainer, RecipeHolder, StackedContentsCompatible { - private static final int[] TOP_SLOTS = new int[] { 0, 1 }; - private static final int[] BOTTOM_SLOTS = new int[] { 2, 3 }; - private static final int[] SIDE_SLOTS = new int[] { 1, 2 }; + private static final int[] TOP_SLOTS = new int[]{0, 1}; + private static final int[] BOTTOM_SLOTS = new int[]{2, 3}; + private static final int[] SIDE_SLOTS = new int[]{1, 2}; private static final Map AVAILABLE_FUELS = Maps.newHashMap(); - + private final Object2IntOpenHashMap recipesUsed; protected NonNullList inventory; protected final ContainerData propertyDelegate; @@ -60,47 +60,47 @@ public class EndStoneSmelterBlockEntity extends BaseContainerBlockEntity impleme private int smeltTime; private int burnTime; private int fuelTime; - + public EndStoneSmelterBlockEntity(BlockPos blockPos, BlockState blockState) { super(EndBlockEntities.END_STONE_SMELTER, blockPos, blockState); this.inventory = NonNullList.withSize(4, ItemStack.EMPTY); this.recipesUsed = new Object2IntOpenHashMap<>(); - this.propertyDelegate = new ContainerData() { - public int get(int index) { - switch(index) { - case 0: - return EndStoneSmelterBlockEntity.this.burnTime; - case 1: - return EndStoneSmelterBlockEntity.this.fuelTime; - case 2: - return EndStoneSmelterBlockEntity.this.smeltTime; - case 3: - return EndStoneSmelterBlockEntity.this.smeltTimeTotal; - default: - return 0; - } - } + this.propertyDelegate = new ContainerData() { + public int get(int index) { + switch (index) { + case 0: + return EndStoneSmelterBlockEntity.this.burnTime; + case 1: + return EndStoneSmelterBlockEntity.this.fuelTime; + case 2: + return EndStoneSmelterBlockEntity.this.smeltTime; + case 3: + return EndStoneSmelterBlockEntity.this.smeltTimeTotal; + default: + return 0; + } + } - public void set(int index, int value) { - switch(index) { - case 0: - EndStoneSmelterBlockEntity.this.burnTime = value; - break; - case 1: - EndStoneSmelterBlockEntity.this.fuelTime = value; - break; - case 2: - EndStoneSmelterBlockEntity.this.smeltTime = value; - break; - case 3: - EndStoneSmelterBlockEntity.this.smeltTimeTotal = value; - } - } + public void set(int index, int value) { + switch (index) { + case 0: + EndStoneSmelterBlockEntity.this.burnTime = value; + break; + case 1: + EndStoneSmelterBlockEntity.this.fuelTime = value; + break; + case 2: + EndStoneSmelterBlockEntity.this.smeltTime = value; + break; + case 3: + EndStoneSmelterBlockEntity.this.smeltTimeTotal = value; + } + } - public int getCount() { - return 4; - } - }; + public int getCount() { + return 4; + } + }; } private boolean isBurning() { @@ -121,7 +121,8 @@ public class EndStoneSmelterBlockEntity extends BaseContainerBlockEntity impleme return true; } itemStack = iterator.next(); - } while (itemStack.isEmpty()); + } + while (itemStack.isEmpty()); return false; } @@ -155,19 +156,19 @@ public class EndStoneSmelterBlockEntity extends BaseContainerBlockEntity impleme setChanged(); } } - + protected int getSmeltTime() { if (level == null) return 200; int smeltTime = level.getRecipeManager().getRecipeFor(AlloyingRecipe.TYPE, this, level) .map(AlloyingRecipe::getSmeltTime).orElse(0); if (smeltTime == 0) { smeltTime = level.getRecipeManager().getRecipeFor(RecipeType.BLASTING, this, level) - .map(BlastingRecipe::getCookingTime).orElse(200); + .map(BlastingRecipe::getCookingTime).orElse(200); smeltTime /= 1.5; } return smeltTime; } - + public void dropExperience(Player player) { if (level == null) return; List> list = Lists.newArrayList(); @@ -177,7 +178,8 @@ public class EndStoneSmelterBlockEntity extends BaseContainerBlockEntity impleme if (recipe instanceof AlloyingRecipe) { AlloyingRecipe alloying = (AlloyingRecipe) recipe; dropExperience(player.level, player.position(), entry.getIntValue(), alloying.getExperience()); - } else { + } + else { BlastingRecipe blasting = (BlastingRecipe) recipe; dropExperience(player.level, player.position(), entry.getIntValue(), blasting.getExperience()); } @@ -186,7 +188,7 @@ public class EndStoneSmelterBlockEntity extends BaseContainerBlockEntity impleme player.awardRecipes(list); recipesUsed.clear(); } - + private void dropExperience(Level world, Vec3 vec3d, int count, float amount) { int expTotal = Mth.floor(count * amount); float g = Mth.frac(count * amount); @@ -194,7 +196,7 @@ public class EndStoneSmelterBlockEntity extends BaseContainerBlockEntity impleme expTotal++; } - while(expTotal > 0) { + while (expTotal > 0) { int expVal = ExperienceOrb.getExperienceValue(expTotal); expTotal -= expVal; world.addFreshEntity(new ExperienceOrb(world, vec3d.x, vec3d.y, vec3d.z, expVal)); @@ -239,7 +241,8 @@ public class EndStoneSmelterBlockEntity extends BaseContainerBlockEntity impleme if (blockEntity.smeltTime > 0) { blockEntity.smeltTime = Mth.clamp(blockEntity.smeltTime - 2, 0, blockEntity.smeltTimeTotal); } - } else { + } + else { Recipe recipe = tickLevel.getRecipeManager().getRecipeFor(AlloyingRecipe.TYPE, blockEntity, tickLevel).orElse(null); if (recipe == null) { recipe = tickLevel.getRecipeManager().getRecipeFor(RecipeType.BLASTING, blockEntity, tickLevel).orElse(null); @@ -270,7 +273,8 @@ public class EndStoneSmelterBlockEntity extends BaseContainerBlockEntity impleme blockEntity.craftRecipe(recipe); blockEntity.setChanged(); } - } else { + } + else { blockEntity.smeltTime = 0; } } @@ -281,14 +285,15 @@ public class EndStoneSmelterBlockEntity extends BaseContainerBlockEntity impleme } } } - + protected boolean canAcceptRecipeOutput(Recipe recipe) { if (recipe == null) return false; boolean validInput; if (recipe instanceof AlloyingRecipe) { validInput = !inventory.get(0).isEmpty() && !inventory.get(1).isEmpty(); - } else { + } + else { validInput = !inventory.get(0).isEmpty() || !inventory.get(1).isEmpty(); } @@ -316,12 +321,13 @@ public class EndStoneSmelterBlockEntity extends BaseContainerBlockEntity impleme private void craftRecipe(Recipe recipe) { if (recipe == null || !canAcceptRecipeOutput(recipe)) return; - + ItemStack result = recipe.getResultItem(); ItemStack output = inventory.get(3); if (output.isEmpty()) { inventory.set(3, result.copy()); - } else if (output.getItem() == result.getItem()) { + } + else if (output.getItem() == result.getItem()) { output.grow(result.getCount()); } @@ -329,14 +335,16 @@ public class EndStoneSmelterBlockEntity extends BaseContainerBlockEntity impleme if (!this.level.isClientSide) { setRecipeUsed(recipe); } - + if (recipe instanceof AlloyingRecipe) { inventory.get(0).shrink(1); inventory.get(1).shrink(1); - } else { + } + else { if (!inventory.get(0).isEmpty()) { inventory.get(0).shrink(1); - } else { + } + else { inventory.get(1).shrink(1); } } @@ -391,7 +399,7 @@ public class EndStoneSmelterBlockEntity extends BaseContainerBlockEntity impleme Item item = fuel.getItem(); return AVAILABLE_FUELS.getOrDefault(item, getFabricFuel(fuel)); } - + @Override public void load(CompoundTag tag) { super.load(tag); @@ -406,7 +414,7 @@ public class EndStoneSmelterBlockEntity extends BaseContainerBlockEntity impleme recipesUsed.put(new ResourceLocation(id), compoundTag.getInt(id)); } } - + @Override public CompoundTag save(CompoundTag tag) { super.save(tag); @@ -418,14 +426,15 @@ public class EndStoneSmelterBlockEntity extends BaseContainerBlockEntity impleme CompoundTag usedRecipes = new CompoundTag(); recipesUsed.forEach((identifier, integer) -> usedRecipes.putInt(identifier.toString(), integer)); tag.put("RecipesUsed", usedRecipes); - + return tag; } - + public boolean canPlaceItem(int slot, ItemStack stack) { if (slot == 3) { return false; - } else if (slot != 2) { + } + else if (slot != 2) { return true; } ItemStack itemStack = this.inventory.get(2); @@ -443,7 +452,7 @@ public class EndStoneSmelterBlockEntity extends BaseContainerBlockEntity impleme public static Map availableFuels() { return AVAILABLE_FUELS; } - + private static int getFabricFuel(ItemStack stack) { Integer ticks = FuelRegistry.INSTANCE.get(stack.getItem()); return ticks == null ? 0 : ticks; diff --git a/src/main/java/ru/betterend/blocks/entities/EternalPedestalEntity.java b/src/main/java/ru/betterend/blocks/entities/EternalPedestalEntity.java index 0490da3a..7697033f 100644 --- a/src/main/java/ru/betterend/blocks/entities/EternalPedestalEntity.java +++ b/src/main/java/ru/betterend/blocks/entities/EternalPedestalEntity.java @@ -9,30 +9,30 @@ import ru.betterend.rituals.EternalRitual; public class EternalPedestalEntity extends PedestalBlockEntity { private EternalRitual linkedRitual; - + public EternalPedestalEntity(BlockPos blockPos, BlockState blockState) { super(EndBlockEntities.ETERNAL_PEDESTAL, blockPos, blockState); } - + public boolean hasRitual() { return linkedRitual != null; } - + public void linkRitual(EternalRitual ritual) { this.linkedRitual = ritual; } - + public EternalRitual getRitual() { return linkedRitual; } - + @Override public void setLevel(Level world) { if (hasRitual()) { linkedRitual.setWorld(world); } } - + public void setLevelAndPosition(Level world, BlockPos pos) { if (hasRitual()) { linkedRitual.setWorld(world); diff --git a/src/main/java/ru/betterend/blocks/entities/InfusionPedestalEntity.java b/src/main/java/ru/betterend/blocks/entities/InfusionPedestalEntity.java index 924c2af7..1136d154 100644 --- a/src/main/java/ru/betterend/blocks/entities/InfusionPedestalEntity.java +++ b/src/main/java/ru/betterend/blocks/entities/InfusionPedestalEntity.java @@ -10,37 +10,39 @@ import ru.betterend.rituals.InfusionRitual; public class InfusionPedestalEntity extends PedestalBlockEntity { private InfusionRitual linkedRitual; - + public InfusionPedestalEntity(BlockPos blockPos, BlockState blockState) { super(EndBlockEntities.INFUSION_PEDESTAL, blockPos, blockState); } @Override - public void setLevel(Level world){ + public void setLevel(Level world) { super.setLevel(world); if (hasRitual()) { linkedRitual.setLocation(world, this.getBlockPos()); - } else { + } + else { linkRitual(new InfusionRitual(this, world, this.getBlockPos())); } } - + public void setLevelAndPosition(Level world, BlockPos pos) { if (hasRitual()) { linkedRitual.setLocation(world, pos); - } else { + } + else { linkRitual(new InfusionRitual(this, world, pos)); } } - + public void linkRitual(InfusionRitual ritual) { linkedRitual = ritual; } - + public InfusionRitual getRitual() { return linkedRitual; } - + public boolean hasRitual() { return linkedRitual != null; } diff --git a/src/main/java/ru/betterend/blocks/entities/PedestalBlockEntity.java b/src/main/java/ru/betterend/blocks/entities/PedestalBlockEntity.java index 27dd586e..dab530c0 100644 --- a/src/main/java/ru/betterend/blocks/entities/PedestalBlockEntity.java +++ b/src/main/java/ru/betterend/blocks/entities/PedestalBlockEntity.java @@ -16,22 +16,22 @@ import ru.betterend.registry.EndItems; public class PedestalBlockEntity extends BlockEntity implements Container, BlockEntityClientSerializable { private ItemStack activeItem = ItemStack.EMPTY; - + private final int maxAge = 314; private int age; public PedestalBlockEntity(BlockPos blockPos, BlockState blockState) { this(EndBlockEntities.PEDESTAL, blockPos, blockState); } - + public PedestalBlockEntity(BlockEntityType blockEntityType, BlockPos blockPos, BlockState blockState) { super(blockEntityType, blockPos, blockState); } - + public int getAge() { return age; } - + public int getMaxAge() { return maxAge; } @@ -55,7 +55,7 @@ public class PedestalBlockEntity extends BlockEntity implements Container, Block public ItemStack removeItem(int slot, int amount) { return removeItemNoUpdate(slot); } - + @Override public boolean canPlaceItem(int slot, ItemStack stack) { return isEmpty(); @@ -79,7 +79,7 @@ public class PedestalBlockEntity extends BlockEntity implements Container, Block activeItem = stack.split(1); setChanged(); } - + @Override public void setChanged() { if (level != null && !level.isClientSide) { @@ -88,7 +88,8 @@ public class PedestalBlockEntity extends BlockEntity implements Container, Block BlockState trueState = state.setValue(PedestalBlock.HAS_ITEM, !isEmpty()); if (activeItem.getItem() == EndItems.ETERNAL_CRYSTAL) { trueState = trueState.setValue(PedestalBlock.HAS_LIGHT, true); - } else { + } + else { trueState = trueState.setValue(PedestalBlock.HAS_LIGHT, false); } level.setBlockAndUpdate(worldPosition, trueState); @@ -97,12 +98,12 @@ public class PedestalBlockEntity extends BlockEntity implements Container, Block super.setChanged(); } - + @Override public boolean stillValid(Player player) { return true; } - + @Override public void load(CompoundTag tag) { super.load(tag); diff --git a/src/main/java/ru/betterend/client/BetterEndClient.java b/src/main/java/ru/betterend/client/BetterEndClient.java index 2a83e0c5..73859941 100644 --- a/src/main/java/ru/betterend/client/BetterEndClient.java +++ b/src/main/java/ru/betterend/client/BetterEndClient.java @@ -1,7 +1,5 @@ package ru.betterend.client; -import java.util.List; - import net.fabricmc.api.ClientModInitializer; import net.fabricmc.fabric.api.blockrenderlayer.v1.BlockRenderLayerMap; import net.minecraft.ChatFormatting; @@ -30,6 +28,8 @@ import ru.betterend.registry.EndModelProviders; import ru.betterend.registry.EndParticles; import ru.betterend.registry.EndScreens; +import java.util.List; + public class BetterEndClient implements ClientModInitializer { @Override public void onInitializeClient() { @@ -43,7 +43,7 @@ public class BetterEndClient implements ClientModInitializer { ClientOptions.init(); registerRenderers(); registerTooltips(); - + if (BCLib.isDevEnvironment()) { TranslationHelper.printMissingNames(BetterEnd.MOD_ID); } diff --git a/src/main/java/ru/betterend/client/ClientOptions.java b/src/main/java/ru/betterend/client/ClientOptions.java index d80f950c..a82bfe9a 100644 --- a/src/main/java/ru/betterend/client/ClientOptions.java +++ b/src/main/java/ru/betterend/client/ClientOptions.java @@ -7,7 +7,7 @@ public class ClientOptions { private static boolean useFogDensity; private static boolean blendBiomeMusic; private static boolean sulfurWaterColor; - + public static void init() { customSky = Configs.CLENT_CONFIG.getBooleanRoot("customSky", true); useFogDensity = Configs.CLENT_CONFIG.getBooleanRoot("useFogDensity", true); @@ -39,7 +39,7 @@ public class ClientOptions { public static void setBlendBiomeMusic(boolean blendBiomeMusic) { ClientOptions.blendBiomeMusic = blendBiomeMusic; } - + public static boolean useSulfurWaterColor() { return sulfurWaterColor; } diff --git a/src/main/java/ru/betterend/client/gui/EndStoneSmelterRecipeBookScreen.java b/src/main/java/ru/betterend/client/gui/EndStoneSmelterRecipeBookScreen.java index 7e1fe5a2..c794b5d2 100644 --- a/src/main/java/ru/betterend/client/gui/EndStoneSmelterRecipeBookScreen.java +++ b/src/main/java/ru/betterend/client/gui/EndStoneSmelterRecipeBookScreen.java @@ -1,12 +1,7 @@ package ru.betterend.client.gui; -import java.util.Iterator; -import java.util.List; -import java.util.Set; - import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; - import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.gui.GuiComponent; @@ -20,6 +15,10 @@ import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.item.crafting.Recipe; import ru.betterend.blocks.entities.EndStoneSmelterBlockEntity; +import java.util.Iterator; +import java.util.List; +import java.util.Set; + @Environment(EnvType.CLIENT) public class EndStoneSmelterRecipeBookScreen extends BlastingRecipeBookComponent { private Iterator fuelIterator; @@ -27,12 +26,12 @@ public class EndStoneSmelterRecipeBookScreen extends BlastingRecipeBookComponent private Slot fuelSlot; private Item currentItem; private float frameTime; - + @Override protected Set getFuelItems() { return EndStoneSmelterBlockEntity.availableFuels().keySet(); } - + @Override public void slotClicked(Slot slot) { super.slotClicked(slot); @@ -40,7 +39,7 @@ public class EndStoneSmelterRecipeBookScreen extends BlastingRecipeBookComponent this.fuelSlot = null; } } - + @Override public void setupGhostRecipe(Recipe recipe, List slots) { this.ghostRecipe.clear(); @@ -49,7 +48,7 @@ public class EndStoneSmelterRecipeBookScreen extends BlastingRecipeBookComponent this.ghostRecipe.addIngredient(Ingredient.of(result), (slots.get(3)).x, (slots.get(3)).y); NonNullList inputs = recipe.getIngredients(); Iterator iterator = inputs.iterator(); - for(int i = 0; i < 2; i++) { + for (int i = 0; i < 2; i++) { if (!iterator.hasNext()) { return; } @@ -67,7 +66,7 @@ public class EndStoneSmelterRecipeBookScreen extends BlastingRecipeBookComponent this.fuelIterator = this.fuels.iterator(); this.currentItem = null; } - + @Override public void renderGhostRecipe(PoseStack matrices, int x, int y, boolean bl, float f) { this.ghostRecipe.render(matrices, minecraft, x, y, bl, f); @@ -80,7 +79,7 @@ public class EndStoneSmelterRecipeBookScreen extends BlastingRecipeBookComponent int slotY = this.fuelSlot.y + y; GuiComponent.fill(matrices, slotX, slotY, slotX + 16, slotY + 16, 822018048); //TODO: test k=0 - this.minecraft.getItemRenderer().renderAndDecorateItem(minecraft.player, this.getFuel().getDefaultInstance(), slotX, slotY,0); + this.minecraft.getItemRenderer().renderAndDecorateItem(minecraft.player, this.getFuel().getDefaultInstance(), slotX, slotY, 0); RenderSystem.depthFunc(516); GuiComponent.fill(matrices, slotX, slotY, slotX + 16, slotY + 16, 822083583); RenderSystem.depthFunc(515); diff --git a/src/main/java/ru/betterend/client/gui/EndStoneSmelterScreen.java b/src/main/java/ru/betterend/client/gui/EndStoneSmelterScreen.java index 14ed9b49..c1cce315 100644 --- a/src/main/java/ru/betterend/client/gui/EndStoneSmelterScreen.java +++ b/src/main/java/ru/betterend/client/gui/EndStoneSmelterScreen.java @@ -2,7 +2,6 @@ package ru.betterend.client.gui; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; - import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.gui.components.ImageButton; @@ -21,15 +20,15 @@ public class EndStoneSmelterScreen extends AbstractContainerScreen { recipeBook.initVisuals(); recipeBook.toggleVisibility(); - leftPos = recipeBook.updateScreenPosition( width, imageWidth); + leftPos = recipeBook.updateScreenPosition(width, imageWidth); ((ImageButton) buttonWidget).setPosition(leftPos + 20, height / 2 - 49); })); titleLabelX = (imageWidth - font.width(title)) / 2; @@ -57,7 +56,8 @@ public class EndStoneSmelterScreen extends AbstractContainerScreen { public final static MenuType HANDLER_TYPE = ScreenHandlerRegistry.registerSimple( BetterEnd.makeID(EndStoneSmelter.ID), EndStoneSmelterScreenHandler::new); - + private final Container inventory; private final ContainerData propertyDelegate; protected final Level world; - + public EndStoneSmelterScreenHandler(int syncId, Inventory playerInventory) { this(syncId, playerInventory, new SimpleContainer(4), new SimpleContainerData(4)); } - + public EndStoneSmelterScreenHandler(int syncId, Inventory playerInventory, Container inventory, ContainerData propertyDelegate) { super(HANDLER_TYPE, syncId); this.inventory = inventory; this.propertyDelegate = propertyDelegate; this.world = playerInventory.player.level; - + addDataSlots(propertyDelegate); addSlot(new Slot(inventory, 0, 45, 17)); addSlot(new Slot(inventory, 1, 67, 17)); addSlot(new SmelterFuelSlot(this, inventory, 2, 56, 53)); addSlot(new SmelterOutputSlot(playerInventory.player, inventory, 3, 129, 35)); - for(int i = 0; i < 3; ++i) { - for(int j = 0; j < 9; ++j) { + for (int i = 0; i < 3; ++i) { + for (int j = 0; j < 9; ++j) { addSlot(new Slot(playerInventory, j + i * 9 + 9, 8 + j * 18, 84 + i * 18)); } } - for(int i = 0; i < 9; ++i) { + for (int i = 0; i < 9; ++i) { addSlot(new Slot(playerInventory, i, 8 + i * 18, 142)); } } - + @Override public MenuType getType() { return HANDLER_TYPE; @@ -124,7 +124,7 @@ public class EndStoneSmelterScreenHandler extends RecipeBookMenu { public boolean isFuel(ItemStack itemStack) { return EndStoneSmelterBlockEntity.canUseAsFuel(itemStack); } - + @Override public ItemStack quickMoveStack(Player player, int index) { Slot slot = slots.get(index); @@ -137,29 +137,35 @@ public class EndStoneSmelterScreenHandler extends RecipeBookMenu { return ItemStack.EMPTY; } slot.onQuickCraft(slotStack, itemStack); - } else if (index != 2 && index != 1 && index != 0) { + } + else if (index != 2 && index != 1 && index != 0) { if (isSmeltable(slotStack)) { if (!moveItemStackTo(slotStack, 0, 2, false)) { return ItemStack.EMPTY; } - } else if (isFuel(slotStack)) { + } + else if (isFuel(slotStack)) { if (!moveItemStackTo(slotStack, 2, 3, false)) { return ItemStack.EMPTY; } - } else if (index < 31) { + } + else if (index < 31) { if (!moveItemStackTo(slotStack, 31, 40, false)) { return ItemStack.EMPTY; } - } else if (index < 40 && !moveItemStackTo(slotStack, 4, 31, false)) { + } + else if (index < 40 && !moveItemStackTo(slotStack, 4, 31, false)) { return ItemStack.EMPTY; } - } else if (!moveItemStackTo(slotStack, 4, 40, false)) { + } + else if (!moveItemStackTo(slotStack, 4, 40, false)) { return ItemStack.EMPTY; } if (slotStack.isEmpty()) { slot.set(ItemStack.EMPTY); - } else { + } + else { slot.setChanged(); } @@ -171,7 +177,7 @@ public class EndStoneSmelterScreenHandler extends RecipeBookMenu { return itemStack; } - + @Environment(EnvType.CLIENT) public int getSmeltProgress() { int time = propertyDelegate.get(2); diff --git a/src/main/java/ru/betterend/client/gui/slot/SmelterFuelSlot.java b/src/main/java/ru/betterend/client/gui/slot/SmelterFuelSlot.java index 06ec70a5..3ff61a84 100644 --- a/src/main/java/ru/betterend/client/gui/slot/SmelterFuelSlot.java +++ b/src/main/java/ru/betterend/client/gui/slot/SmelterFuelSlot.java @@ -9,12 +9,12 @@ import ru.betterend.client.gui.EndStoneSmelterScreenHandler; public class SmelterFuelSlot extends Slot { private final EndStoneSmelterScreenHandler handler; - + public SmelterFuelSlot(EndStoneSmelterScreenHandler handler, Container inventory, int index, int x, int y) { super(inventory, index, x, y); this.handler = handler; } - + public boolean mayPlace(ItemStack stack) { return this.handler.isFuel(stack) || FurnaceFuelSlot.isBucket(stack); } diff --git a/src/main/java/ru/betterend/client/models/Patterns.java b/src/main/java/ru/betterend/client/models/Patterns.java index d78a1327..4da3a10f 100644 --- a/src/main/java/ru/betterend/client/models/Patterns.java +++ b/src/main/java/ru/betterend/client/models/Patterns.java @@ -1,5 +1,11 @@ package ru.betterend.client.models; +import com.google.common.collect.Maps; +import net.minecraft.client.Minecraft; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.packs.resources.ResourceManager; +import ru.betterend.BetterEnd; + import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; @@ -10,13 +16,6 @@ import java.util.Map.Entry; import java.util.Optional; import java.util.stream.Collectors; -import com.google.common.collect.Maps; - -import net.minecraft.client.Minecraft; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.packs.resources.ResourceManager; -import ru.betterend.BetterEnd; - public class Patterns { //Block Models public final static ResourceLocation BLOCK_EMPTY = BetterEnd.makeID("patterns/block/empty.json"); @@ -75,7 +74,7 @@ public class Patterns { public final static ResourceLocation BLOCK_FURNACE_LIT = BetterEnd.makeID("patterns/block/furnace_glow.json"); public final static ResourceLocation BLOCK_TOP_SIDE_BOTTOM = BetterEnd.makeID("patterns/block/top_side_bottom.json"); public final static ResourceLocation BLOCK_PATH = BetterEnd.makeID("patterns/block/path.json"); - + //Item Models public final static ResourceLocation ITEM_WALL = BetterEnd.makeID("patterns/item/pattern_wall.json"); public final static ResourceLocation ITEM_FENCE = BetterEnd.makeID("patterns/item/pattern_fence.json"); @@ -93,25 +92,28 @@ public class Patterns { public static Optional createBlockSimple(String name) { return Patterns.createJson(Patterns.BLOCK_BASE, name, name); } + public static Optional createBlockPillar(String name) { return Patterns.createJson(Patterns.BLOCK_PILLAR, name, name); } - + public static String createJson(Reader data, String parent, String block) { try (BufferedReader buffer = new BufferedReader(data)) { return buffer.lines().collect(Collectors.joining()) .replace("%parent%", parent) .replace("%block%", block); - } catch (Exception ex) { + } + catch (Exception ex) { return null; } } - + public static Optional createJson(ResourceLocation patternId, String parent, String block) { ResourceManager resourceManager = Minecraft.getInstance().getResourceManager(); try (InputStream input = resourceManager.getResource(patternId).getInputStream()) { return Optional.ofNullable(createJson(new InputStreamReader(input, StandardCharsets.UTF_8), parent, block)); - } catch (Exception ex) { + } + catch (Exception ex) { return Optional.empty(); } } @@ -131,7 +133,8 @@ public class Patterns { json = json.replace(texture.getKey(), texture.getValue()); } return Optional.of(json); - } catch (Exception ex) { + } + catch (Exception ex) { return Optional.empty(); } } diff --git a/src/main/java/ru/betterend/client/render/ArmoredElytraLayer.java b/src/main/java/ru/betterend/client/render/ArmoredElytraLayer.java index f066b38e..174ed8b9 100644 --- a/src/main/java/ru/betterend/client/render/ArmoredElytraLayer.java +++ b/src/main/java/ru/betterend/client/render/ArmoredElytraLayer.java @@ -2,7 +2,6 @@ package ru.betterend.client.render; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; - import net.minecraft.client.model.EntityModel; import net.minecraft.client.model.geom.EntityModelSet; import net.minecraft.client.player.AbstractClientPlayer; @@ -37,7 +36,8 @@ public class ArmoredElytraLayer AbstractClientPlayer abstractClientPlayer = (AbstractClientPlayer) livingEntity; if (abstractClientPlayer.isElytraLoaded() && abstractClientPlayer.getElytraTextureLocation() != null) { wingsTexture = abstractClientPlayer.getElytraTextureLocation(); - } else if (abstractClientPlayer.isCapeLoaded() && abstractClientPlayer.getCloakTextureLocation() != null && abstractClientPlayer.isModelPartShown(PlayerModelPart.CAPE)) { + } + else if (abstractClientPlayer.isCapeLoaded() && abstractClientPlayer.getCloakTextureLocation() != null && abstractClientPlayer.isModelPartShown(PlayerModelPart.CAPE)) { wingsTexture = abstractClientPlayer.getCloakTextureLocation(); } } diff --git a/src/main/java/ru/betterend/client/render/BeamRenderer.java b/src/main/java/ru/betterend/client/render/BeamRenderer.java index 88de8add..a623f094 100644 --- a/src/main/java/ru/betterend/client/render/BeamRenderer.java +++ b/src/main/java/ru/betterend/client/render/BeamRenderer.java @@ -5,7 +5,6 @@ import com.mojang.blaze3d.vertex.VertexConsumer; import com.mojang.math.Matrix3f; import com.mojang.math.Matrix4f; import com.mojang.math.Vector3f; - import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.texture.OverlayTexture; @@ -14,26 +13,26 @@ import net.minecraft.util.Mth; public class BeamRenderer { private static final ResourceLocation BEAM_TEXTURE = new ResourceLocation("textures/entity/end_gateway_beam.png"); - + public static void renderLightBeam(PoseStack matrices, MultiBufferSource vertexConsumers, int age, float tick, int minY, int maxY, float[] colors, float alpha, float beamIn, float beamOut) { float red = colors[0]; float green = colors[1]; float blue = colors[2]; - + int maxBY = minY + maxY; float delta = maxY < 0 ? tick : -tick; - float fractDelta = Mth.frac(delta * 0.2F - (float) Mth.floor(delta * 0.1F)); + float fractDelta = Mth.frac(delta * 0.2F - (float) Mth.floor(delta * 0.1F)); float xIn = -beamIn; float minV = Mth.clamp(fractDelta - 1.0F, 0.0F, 1.0F); float maxV = (float) maxY * (0.5F / beamIn) + minV; float rotation = (age + tick) / 25.0F + 6.0F; - + VertexConsumer vertexConsumer = vertexConsumers.getBuffer(RenderType.beaconBeam(BEAM_TEXTURE, true)); - + matrices.pushPose(); matrices.mulPose(Vector3f.YP.rotation(-rotation)); renderBeam(matrices, vertexConsumer, red, green, blue, alpha, minY, maxBY, beamIn, 0.0F, 0.0F, beamIn, 0.0F, xIn, xIn, 0.0F, 0.0F, 1.0F, minV, maxV); - + float xOut = -beamOut; maxV = (float) maxY + minV; renderBeam(matrices, vertexConsumer, red, green, blue, alpha, minY, maxBY, xOut, xOut, beamOut, xOut, xOut, beamOut, beamOut, beamOut, 0.0F, 1.0F, minV, maxV); @@ -43,7 +42,7 @@ public class BeamRenderer { private static void renderBeam(PoseStack matrices, VertexConsumer vertexConsumer, float red, float green, float blue, float alpha, int minY, int maxY, float x1, float d1, float x2, float d2, float x3, float d3, float x4, float d4, float minU, float maxU, float minV, float maxV) { PoseStack.Pose entry = matrices.last(); Matrix4f matrix4f = entry.pose(); - Matrix3f matrix3f = entry.normal(); + Matrix3f matrix3f = entry.normal(); renderBeam(matrix4f, matrix3f, vertexConsumer, red, green, blue, alpha, maxY, minY, x1, d1, x2, d2, minU, maxU, minV, maxV); renderBeam(matrix4f, matrix3f, vertexConsumer, red, green, blue, alpha, maxY, minY, x4, d4, x3, d3, minU, maxU, minV, maxV); renderBeam(matrix4f, matrix3f, vertexConsumer, red, green, blue, alpha, maxY, minY, x2, d2, x4, d4, minU, maxU, minV, maxV); diff --git a/src/main/java/ru/betterend/client/render/EndCrystalRenderer.java b/src/main/java/ru/betterend/client/render/EndCrystalRenderer.java index abd37797..d03473e3 100644 --- a/src/main/java/ru/betterend/client/render/EndCrystalRenderer.java +++ b/src/main/java/ru/betterend/client/render/EndCrystalRenderer.java @@ -4,7 +4,6 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import com.mojang.math.Quaternion; import com.mojang.math.Vector3f; - import net.minecraft.client.model.geom.ModelPart; import net.minecraft.client.model.geom.PartPose; import net.minecraft.client.model.geom.builders.CubeListBuilder; @@ -24,7 +23,7 @@ public class EndCrystalRenderer { private static final ModelPart FRAME; private static final int AGE_CYCLE = 240; private static final float SINE_45_DEGREES; - + public static void render(int age, int maxAge, float tickDelta, PoseStack matrices, MultiBufferSource vertexConsumerProvider, int light) { float k = (float) AGE_CYCLE / maxAge; float rotation = (age * k + tickDelta) * 3.0F; @@ -51,18 +50,18 @@ public class EndCrystalRenderer { MeshDefinition modelData = new MeshDefinition(); PartDefinition modelPartData = modelData.getRoot(); modelPartData.addOrReplaceChild("FRAME", CubeListBuilder.create() - .texOffs(0, 0) - .addBox(-4.0f, -4.0f, -4.0f, 8.0f, 8.0f, 8.0f), + .texOffs(0, 0) + .addBox(-4.0f, -4.0f, -4.0f, 8.0f, 8.0f, 8.0f), PartPose.ZERO); modelPartData.addOrReplaceChild("CORE", CubeListBuilder.create() - .texOffs(32, 0) + .texOffs(32, 0) .addBox(-4.0f, -4.0f, -4.0f, 8.0f, 8.0f, 8.0f), PartPose.ZERO); return LayerDefinition.create(modelData, 64, 32); } - + static { END_CRYSTAL = RenderType.entityCutoutNoCull(CRYSTAL_TEXTURE); RenderType.entitySmoothCutout(CRYSTAL_BEAM_TEXTURE); diff --git a/src/main/java/ru/betterend/client/render/EternalCrystalRenderer.java b/src/main/java/ru/betterend/client/render/EternalCrystalRenderer.java index 7baa3672..a6ecb0ed 100644 --- a/src/main/java/ru/betterend/client/render/EternalCrystalRenderer.java +++ b/src/main/java/ru/betterend/client/render/EternalCrystalRenderer.java @@ -3,7 +3,6 @@ package ru.betterend.client.render; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import com.mojang.math.Vector3f; - import net.minecraft.client.model.geom.ModelPart; import net.minecraft.client.model.geom.PartPose; import net.minecraft.client.model.geom.builders.CubeListBuilder; @@ -24,7 +23,7 @@ public class EternalCrystalRenderer { private static final RenderType RENDER_LAYER; private static final ModelPart[] SHARDS; private static final ModelPart CORE; - + public static void render(int age, float tickDelta, PoseStack matrices, MultiBufferSource vertexConsumerProvider, int light) { VertexConsumer vertexConsumer = vertexConsumerProvider.getBuffer(RENDER_LAYER); float[] colors = colors(age); @@ -33,7 +32,7 @@ public class EternalCrystalRenderer { matrices.scale(0.6F, 0.6F, 0.6F); matrices.mulPose(Vector3f.YP.rotation(rotation)); CORE.render(matrices, vertexConsumer, light, OverlayTexture.NO_OVERLAY, colors[0], colors[1], colors[2], colors[3]); - + for (int i = 0; i < 4; i++) { matrices.pushPose(); float offset = Mth.sin(rotation * 2 + i) * 0.15F; @@ -41,24 +40,24 @@ public class EternalCrystalRenderer { SHARDS[i].render(matrices, vertexConsumer, light, OverlayTexture.NO_OVERLAY, colors[0], colors[1], colors[2], colors[3]); matrices.popPose(); } - + matrices.popPose(); } - + public static float[] colors(int age) { double delta = age * 0.01; int index = MHelper.floor(delta); int index2 = (index + 1) & 3; delta -= index; index &= 3; - + Vec3i color1 = AuroraCrystalBlock.COLORS[index]; Vec3i color2 = AuroraCrystalBlock.COLORS[index2]; - + int r = MHelper.floor(Mth.lerp(delta, color1.getX(), color2.getX())); int g = MHelper.floor(Mth.lerp(delta, color1.getY(), color2.getY())); int b = MHelper.floor(Mth.lerp(delta, color1.getZ(), color2.getZ())); - + return ColorUtil.toFloatArray(ColorUtil.color(r, g, b)); } @@ -66,33 +65,33 @@ public class EternalCrystalRenderer { MeshDefinition modelData = new MeshDefinition(); PartDefinition modelPartData = modelData.getRoot(); modelPartData.addOrReplaceChild("SHARDS_0", CubeListBuilder.create() - .texOffs(2, 4) + .texOffs(2, 4) .addBox(-5.0f, 1.0f, -3.0f, 2.0f, 8.0f, 2.0f), PartPose.ZERO); modelPartData.addOrReplaceChild("SHARDS_1", CubeListBuilder.create() - .texOffs(2, 4) + .texOffs(2, 4) .addBox(3.0f, -1.0f, -1.0f, 2.0f, 8.0f, 2.0f), PartPose.ZERO); modelPartData.addOrReplaceChild("SHARDS_2", CubeListBuilder.create() - .texOffs(2, 4) + .texOffs(2, 4) .addBox(-1.0f, 0.0f, -5.0f, 2.0f, 4.0f, 2.0f), PartPose.ZERO); modelPartData.addOrReplaceChild("SHARDS_3", CubeListBuilder.create() - .texOffs(2, 4) + .texOffs(2, 4) .addBox(0.0f, 3.0f, 4.0f, 2.0f, 6.0f, 2.0f), PartPose.ZERO); modelPartData.addOrReplaceChild("CORE", CubeListBuilder.create() - .texOffs(0, 0) + .texOffs(0, 0) .addBox(-2.0f, -2.0f, -2.0f, 4.0f, 12.0f, 4.0f), PartPose.ZERO); return LayerDefinition.create(modelData, 16, 16); } - + static { RENDER_LAYER = RenderType.beaconBeam(BetterEnd.makeID("textures/entity/eternal_crystal.png"), true); SHARDS = new ModelPart[4]; diff --git a/src/main/java/ru/betterend/client/render/PedestalItemRenderer.java b/src/main/java/ru/betterend/client/render/PedestalItemRenderer.java index b5164f1b..c80a5ba5 100644 --- a/src/main/java/ru/betterend/client/render/PedestalItemRenderer.java +++ b/src/main/java/ru/betterend/client/render/PedestalItemRenderer.java @@ -2,16 +2,13 @@ package ru.betterend.client.render; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.math.Vector3f; - import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.block.model.ItemTransforms; -import net.minecraft.client.renderer.blockentity.BlockEntityRenderDispatcher; import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; -import net.minecraft.client.renderer.entity.EntityRendererProvider; import net.minecraft.client.resources.model.BakedModel; import net.minecraft.util.Mth; import net.minecraft.world.item.BlockItem; @@ -27,21 +24,21 @@ import ru.betterend.registry.EndItems; @Environment(EnvType.CLIENT) public class PedestalItemRenderer implements BlockEntityRenderer { - + public PedestalItemRenderer(BlockEntityRendererProvider.Context ctx) { super(); } @Override public void render(T blockEntity, float tickDelta, PoseStack matrices, - MultiBufferSource vertexConsumers, int light, int overlay) { + MultiBufferSource vertexConsumers, int light, int overlay) { Level world = blockEntity.getLevel(); if (world == null || blockEntity.isEmpty()) return; BlockState state = world.getBlockState(blockEntity.getBlockPos()); if (!(state.getBlock() instanceof PedestalBlock)) return; - + ItemStack activeItem = blockEntity.getItem(0); matrices.pushPose(); @@ -54,23 +51,26 @@ public class PedestalItemRenderer implements Bloc matrices.translate(0.5, pedestal.getHeight(state), 0.5); if (activeItem.getItem() instanceof BlockItem) { matrices.scale(1.5F, 1.5F, 1.5F); - } else { + } + else { matrices.scale(1.25F, 1.25F, 1.25F); } int age = blockEntity.getAge(); if (state.is(EndBlocks.ETERNAL_PEDESTAL) && state.getValue(EternalPedestal.ACTIVATED)) { float[] colors = EternalCrystalRenderer.colors(age); int y = blockEntity.getBlockPos().getY(); - + BeamRenderer.renderLightBeam(matrices, vertexConsumers, age, tickDelta, -y, 1024 - y, colors, 0.25F, 0.13F, 0.16F); float altitude = Mth.sin((blockEntity.getAge() + tickDelta) / 10.0F) * 0.1F + 0.1F; matrices.translate(0.0D, altitude, 0.0D); } if (activeItem.getItem() == Items.END_CRYSTAL) { EndCrystalRenderer.render(age, blockEntity.getMaxAge(), tickDelta, matrices, vertexConsumers, light); - } else if (activeItem.getItem() == EndItems.ETERNAL_CRYSTAL) { + } + else if (activeItem.getItem() == EndItems.ETERNAL_CRYSTAL) { EternalCrystalRenderer.render(age, tickDelta, matrices, vertexConsumers, light); - } else { + } + else { float rotation = (age + tickDelta) / 25.0F + 6.0F; matrices.mulPose(Vector3f.YP.rotation(rotation)); minecraft.getItemRenderer().render(activeItem, ItemTransforms.TransformType.GROUND, false, matrices, vertexConsumers, light, overlay, model); diff --git a/src/main/java/ru/betterend/config/Configs.java b/src/main/java/ru/betterend/config/Configs.java index 98c5d859..e249ddd5 100644 --- a/src/main/java/ru/betterend/config/Configs.java +++ b/src/main/java/ru/betterend/config/Configs.java @@ -18,7 +18,7 @@ public class Configs { @Environment(value = EnvType.CLIENT) public static final PathConfig CLENT_CONFIG = new PathConfig(BetterEnd.MOD_ID, "client"); - + public static void saveConfigs() { ENTITY_CONFIG.saveChanges(); BLOCK_CONFIG.saveChanges(); @@ -26,7 +26,7 @@ public class Configs { ITEM_CONFIG.saveChanges(); GENERATOR_CONFIG.saveChanges(); RECIPE_CONFIG.saveChanges(); - + if (BCLib.isClient()) { CLENT_CONFIG.saveChanges(); } diff --git a/src/main/java/ru/betterend/effects/EndEnchantments.java b/src/main/java/ru/betterend/effects/EndEnchantments.java index 6755a3de..8dd15091 100644 --- a/src/main/java/ru/betterend/effects/EndEnchantments.java +++ b/src/main/java/ru/betterend/effects/EndEnchantments.java @@ -7,10 +7,11 @@ import ru.betterend.effects.enchantment.EndVeilEnchantment; public class EndEnchantments { public final static Enchantment END_VEIL = registerEnchantment("end_veil", new EndVeilEnchantment()); - + public static Enchantment registerEnchantment(String name, Enchantment enchantment) { return Registry.register(Registry.ENCHANTMENT, BetterEnd.makeID(name), enchantment); } - - public static void register() {} + + public static void register() { + } } diff --git a/src/main/java/ru/betterend/effects/EndPotions.java b/src/main/java/ru/betterend/effects/EndPotions.java index 0b2e2394..1151175c 100644 --- a/src/main/java/ru/betterend/effects/EndPotions.java +++ b/src/main/java/ru/betterend/effects/EndPotions.java @@ -14,15 +14,15 @@ import ru.betterend.registry.EndItems; public class EndPotions { public final static Potion END_VEIL = registerPotion("end_veil", EndStatusEffects.END_VEIL, 3600); public final static Potion LONG_END_VEIL = registerPotion("long_end_veil", EndStatusEffects.END_VEIL, 9600); - + public static Potion registerPotion(String name, MobEffect effect, int duration) { return registerPotion(name, new Potion(name, new MobEffectInstance(effect, duration))); } - + public static Potion registerPotion(String name, Potion potion) { return Registry.register(Registry.POTION, BetterEnd.makeID(name), potion); } - + public static void register() { PotionBrewingAccessor.callAddMix(Potions.AWKWARD, EndItems.ENDER_DUST, END_VEIL); PotionBrewingAccessor.callAddMix(END_VEIL, Items.REDSTONE, LONG_END_VEIL); diff --git a/src/main/java/ru/betterend/effects/enchantment/EndVeilEnchantment.java b/src/main/java/ru/betterend/effects/enchantment/EndVeilEnchantment.java index 57d040e9..6a0fa0d0 100644 --- a/src/main/java/ru/betterend/effects/enchantment/EndVeilEnchantment.java +++ b/src/main/java/ru/betterend/effects/enchantment/EndVeilEnchantment.java @@ -7,9 +7,9 @@ import net.minecraft.world.item.enchantment.EnchantmentCategory; public class EndVeilEnchantment extends Enchantment { public EndVeilEnchantment() { - super(Enchantment.Rarity.VERY_RARE, EnchantmentCategory.ARMOR_HEAD, new EquipmentSlot[] { EquipmentSlot.HEAD }); + super(Enchantment.Rarity.VERY_RARE, EnchantmentCategory.ARMOR_HEAD, new EquipmentSlot[]{EquipmentSlot.HEAD}); } - + @Override public boolean isDiscoverable() { return false; diff --git a/src/main/java/ru/betterend/effects/status/EndVeilEffect.java b/src/main/java/ru/betterend/effects/status/EndVeilEffect.java index eff6cbb3..1a324c24 100644 --- a/src/main/java/ru/betterend/effects/status/EndVeilEffect.java +++ b/src/main/java/ru/betterend/effects/status/EndVeilEffect.java @@ -8,7 +8,7 @@ public class EndVeilEffect extends MobEffect { public EndVeilEffect() { super(MobEffectCategory.BENEFICIAL, 0x0D554A); } - + @Override public boolean isDurationEffectTick(int duration, int amplifier) { return false; diff --git a/src/main/java/ru/betterend/entity/CubozoaEntity.java b/src/main/java/ru/betterend/entity/CubozoaEntity.java index 794bcbf9..bfe8def7 100644 --- a/src/main/java/ru/betterend/entity/CubozoaEntity.java +++ b/src/main/java/ru/betterend/entity/CubozoaEntity.java @@ -1,8 +1,5 @@ package ru.betterend.entity; -import java.util.List; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.protocol.game.ClientboundGameEventPacket; @@ -35,6 +32,9 @@ import ru.bclib.api.BiomeAPI; import ru.betterend.registry.EndBiomes; import ru.betterend.registry.EndItems; +import java.util.List; +import java.util.Random; + public class CubozoaEntity extends AbstractSchoolingFish { public static final int VARIANTS = 2; private static final EntityDataAccessor VARIANT = SynchedEntityData.defineId(CubozoaEntity.class, EntityDataSerializers.BYTE); @@ -47,11 +47,11 @@ public class CubozoaEntity extends AbstractSchoolingFish { @Override public SpawnGroupData finalizeSpawn(ServerLevelAccessor world, DifficultyInstance difficulty, MobSpawnType spawnReason, SpawnGroupData entityData, CompoundTag entityTag) { SpawnGroupData data = super.finalizeSpawn(world, difficulty, spawnReason, entityData, entityTag); - + if (BiomeAPI.getFromBiome(world.getBiome(blockPosition())) == EndBiomes.SULPHUR_SPRINGS) { this.entityData.set(VARIANT, (byte) 1); } - + if (entityTag != null) { if (entityTag.contains("Variant")) { this.entityData.set(VARIANT, entityTag.getByte("Variant")); @@ -60,7 +60,7 @@ public class CubozoaEntity extends AbstractSchoolingFish { this.entityData.set(SCALE, entityTag.getByte("Scale")); } } - + this.refreshDimensions(); return data; } @@ -89,7 +89,7 @@ public class CubozoaEntity extends AbstractSchoolingFish { this.entityData.set(SCALE, tag.getByte("Scale")); } } - + @Override public ItemStack getBucketItemStack() { ItemStack bucket = EndItems.BUCKET_CUBOZOA.getDefaultInstance(); @@ -109,7 +109,7 @@ public class CubozoaEntity extends AbstractSchoolingFish { public int getVariant() { return (int) this.entityData.get(VARIANT); } - + public byte getByteScale() { return this.entityData.get(SCALE); } @@ -129,7 +129,7 @@ public class CubozoaEntity extends AbstractSchoolingFish { protected float getStandingEyeHeight(Pose pose, EntityDimensions dimensions) { return dimensions.height * 0.5F; } - + @Override protected void dropFromLootTable(DamageSource source, boolean causedByPlayer) { int count = random.nextInt(3); @@ -143,7 +143,7 @@ public class CubozoaEntity extends AbstractSchoolingFish { protected SoundEvent getFlopSound() { return SoundEvents.SALMON_FLOP; } - + @Override public void playerTouch(Player player) { if (player instanceof ServerPlayer && player.hurt(DamageSource.mobAttack(this), 0.5F)) { diff --git a/src/main/java/ru/betterend/entity/DragonflyEntity.java b/src/main/java/ru/betterend/entity/DragonflyEntity.java index 0429c4ba..ea18a0c4 100644 --- a/src/main/java/ru/betterend/entity/DragonflyEntity.java +++ b/src/main/java/ru/betterend/entity/DragonflyEntity.java @@ -1,13 +1,15 @@ package ru.betterend.entity; -import java.util.EnumSet; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerLevel; import net.minecraft.sounds.SoundEvent; import net.minecraft.world.damagesource.DamageSource; -import net.minecraft.world.entity.*; +import net.minecraft.world.entity.AgeableMob; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.MobSpawnType; import net.minecraft.world.entity.ai.attributes.AttributeSupplier; import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.entity.ai.control.FlyingMoveControl; @@ -36,6 +38,9 @@ import ru.bclib.util.MHelper; import ru.betterend.registry.EndEntities; import ru.betterend.registry.EndSounds; +import java.util.EnumSet; +import java.util.Random; + public class DragonflyEntity extends Animal implements FlyingAnimal { public DragonflyEntity(EntityType entityType, Level world) { super(entityType, world); @@ -53,7 +58,7 @@ public class DragonflyEntity extends Animal implements FlyingAnimal { .add(Attributes.FLYING_SPEED, 1.0D) .add(Attributes.MOVEMENT_SPEED, 0.1D); } - + @Override public boolean canBeLeashed(Player player) { return false; @@ -158,7 +163,8 @@ public class DragonflyEntity extends Animal implements FlyingAnimal { DragonflyEntity.this.navigation.moveTo(path, 1.0D); } } - catch (Exception e) {} + catch (Exception e) { + } } super.start(); } @@ -195,7 +201,7 @@ public class DragonflyEntity extends Animal implements FlyingAnimal { public AgeableMob getBreedOffspring(ServerLevel world, AgeableMob entity) { return EndEntities.DRAGONFLY.create(world); } - + public static boolean canSpawn(EntityType type, ServerLevelAccessor world, MobSpawnType spawnReason, BlockPos pos, Random random) { int y = world.getChunk(pos).getHeight(Types.WORLD_SURFACE, pos.getX() & 15, pos.getY() & 15); return y > 0 && pos.getY() >= y; diff --git a/src/main/java/ru/betterend/entity/EndFishEntity.java b/src/main/java/ru/betterend/entity/EndFishEntity.java index c0550ac2..19d6bf32 100644 --- a/src/main/java/ru/betterend/entity/EndFishEntity.java +++ b/src/main/java/ru/betterend/entity/EndFishEntity.java @@ -1,8 +1,5 @@ package ru.betterend.entity; -import java.util.List; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.core.particles.ParticleTypes; import net.minecraft.nbt.CompoundTag; @@ -30,25 +27,28 @@ import ru.bclib.api.BiomeAPI; import ru.betterend.registry.EndBiomes; import ru.betterend.registry.EndItems; +import java.util.List; +import java.util.Random; + public class EndFishEntity extends AbstractSchoolingFish { public static final int VARIANTS_NORMAL = 5; public static final int VARIANTS_SULPHUR = 3; public static final int VARIANTS = VARIANTS_NORMAL + VARIANTS_SULPHUR; private static final EntityDataAccessor VARIANT = SynchedEntityData.defineId(EndFishEntity.class, EntityDataSerializers.BYTE); private static final EntityDataAccessor SCALE = SynchedEntityData.defineId(EndFishEntity.class, EntityDataSerializers.BYTE); - + public EndFishEntity(EntityType entityType, Level world) { super(entityType, world); } - + @Override public SpawnGroupData finalizeSpawn(ServerLevelAccessor world, DifficultyInstance difficulty, MobSpawnType spawnReason, SpawnGroupData entityData, CompoundTag entityTag) { SpawnGroupData data = super.finalizeSpawn(world, difficulty, spawnReason, entityData, entityTag); - + if (BiomeAPI.getFromBiome(world.getBiome(blockPosition())) == EndBiomes.SULPHUR_SPRINGS) { this.entityData.set(VARIANT, (byte) (random.nextInt(VARIANTS_SULPHUR) + VARIANTS_NORMAL)); } - + if (entityTag != null) { if (entityTag.contains("Variant")) { this.entityData.set(VARIANT, entityTag.getByte("variant")); @@ -57,18 +57,18 @@ public class EndFishEntity extends AbstractSchoolingFish { this.entityData.set(SCALE, entityTag.getByte("scale")); } } - + this.refreshDimensions(); return data; } - + @Override protected void defineSynchedData() { super.defineSynchedData(); this.entityData.define(VARIANT, (byte) this.getRandom().nextInt(VARIANTS_NORMAL)); this.entityData.define(SCALE, (byte) this.getRandom().nextInt(16)); } - + @Override public void addAdditionalSaveData(CompoundTag tag) { super.addAdditionalSaveData(tag); @@ -115,7 +115,7 @@ public class EndFishEntity extends AbstractSchoolingFish { protected SoundEvent getHurtSound(DamageSource source) { return SoundEvents.SALMON_HURT; } - + @Override public void tick() { super.tick(); @@ -126,32 +126,34 @@ public class EndFishEntity extends AbstractSchoolingFish { level.addParticle(ParticleTypes.BUBBLE, x, y, z, 0, 0, 0); } } - + public static AttributeSupplier.Builder createMobAttributes() { return LivingEntity.createLivingAttributes() .add(Attributes.MAX_HEALTH, 2.0) .add(Attributes.FOLLOW_RANGE, 16.0) .add(Attributes.MOVEMENT_SPEED, 0.75); } - + public int getVariant() { return (int) this.entityData.get(VARIANT); } - + public byte getByteScale() { return this.entityData.get(SCALE); } - + public float getScale() { return getByteScale() / 32F + 0.75F; } - + public static boolean canSpawn(EntityType type, ServerLevelAccessor world, MobSpawnType spawnReason, BlockPos pos, Random random) { AABB box = new AABB(pos).inflate(16); - List list = world.getEntitiesOfClass(EndFishEntity.class, box, (entity) -> { return true; }); + List list = world.getEntitiesOfClass(EndFishEntity.class, box, (entity) -> { + return true; + }); return list.size() < 9; } - + @Override protected void dropFromLootTable(DamageSource source, boolean causedByPlayer) { ItemEntity drop = new ItemEntity(level, getX(), getY(), getZ(), new ItemStack(EndItems.END_FISH_RAW)); diff --git a/src/main/java/ru/betterend/entity/EndSlimeEntity.java b/src/main/java/ru/betterend/entity/EndSlimeEntity.java index 48393a06..00a8c861 100644 --- a/src/main/java/ru/betterend/entity/EndSlimeEntity.java +++ b/src/main/java/ru/betterend/entity/EndSlimeEntity.java @@ -1,9 +1,5 @@ package ru.betterend.entity; -import java.util.EnumSet; -import java.util.List; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.particles.ParticleOptions; @@ -45,15 +41,19 @@ import ru.bclib.world.biomes.BCLBiome; import ru.betterend.interfaces.ISlime; import ru.betterend.registry.EndBiomes; +import java.util.EnumSet; +import java.util.List; +import java.util.Random; + public class EndSlimeEntity extends Slime { private static final EntityDataAccessor VARIANT = SynchedEntityData.defineId(EndSlimeEntity.class, EntityDataSerializers.BYTE); private static final MutableBlockPos POS = new MutableBlockPos(); - + public EndSlimeEntity(EntityType entityType, Level world) { super(entityType, world); this.moveControl = new EndSlimeMoveControl(this); } - + protected void registerGoals() { this.goalSelector.addGoal(1, new SwimmingGoal()); this.goalSelector.addGoal(2, new FaceTowardTargetGoal()); @@ -64,7 +64,7 @@ public class EndSlimeEntity extends Slime { })); this.targetSelector.addGoal(3, new NearestAttackableTargetGoal(this, IronGolem.class, true)); } - + public static AttributeSupplier.Builder createMobAttributes() { return LivingEntity.createLivingAttributes() .add(Attributes.MAX_HEALTH, 1.0D) @@ -72,7 +72,7 @@ public class EndSlimeEntity extends Slime { .add(Attributes.FOLLOW_RANGE, 16.0D) .add(Attributes.MOVEMENT_SPEED, 0.15D); } - + @Override public SpawnGroupData finalizeSpawn(ServerLevelAccessor world, DifficultyInstance difficulty, MobSpawnType spawnReason, SpawnGroupData entityData, CompoundTag entityTag) { SpawnGroupData data = super.finalizeSpawn(world, difficulty, spawnReason, entityData, entityTag); @@ -95,7 +95,7 @@ public class EndSlimeEntity extends Slime { super.defineSynchedData(); this.entityData.define(VARIANT, (byte) 0); } - + @Override public void addAdditionalSaveData(CompoundTag tag) { super.addAdditionalSaveData(tag); @@ -114,7 +114,7 @@ public class EndSlimeEntity extends Slime { protected ParticleOptions getParticleType() { return ParticleTypes.PORTAL; } - + @Override public void remove(RemovalReason reason) { int i = this.getSize(); @@ -125,7 +125,7 @@ public class EndSlimeEntity extends Slime { int j = i / 2; int k = 2 + this.random.nextInt(3); int type = this.getSlimeType(); - + for (int l = 0; l < k; ++l) { float g = ((float) (l % 2) - 0.5F) * f; float h = ((float) (l / 2) - 0.5F) * f; @@ -145,9 +145,9 @@ public class EndSlimeEntity extends Slime { } } - ((ISlime)this).entityRemove(reason); + ((ISlime) this).entityRemove(reason); } - + @Override protected void dropFromLootTable(DamageSource source, boolean causedByPlayer) { int maxCount = this.getSize(); @@ -163,15 +163,15 @@ public class EndSlimeEntity extends Slime { ItemEntity drop = new ItemEntity(level, getX(), getY(), getZ(), new ItemStack(Items.SLIME_BALL, count)); this.level.addFreshEntity(drop); } - + public int getSlimeType() { return this.entityData.get(VARIANT).intValue(); } - + public void setSlimeType(int value) { this.entityData.set(VARIANT, (byte) value); } - + protected void setMossy() { setSlimeType(1); } @@ -179,7 +179,7 @@ public class EndSlimeEntity extends Slime { public boolean isMossy() { return getSlimeType() == 1; } - + protected void setLake() { setSlimeType(2); } @@ -187,7 +187,7 @@ public class EndSlimeEntity extends Slime { public boolean isLake() { return getSlimeType() == 2; } - + protected void setAmber(boolean mossy) { this.entityData.set(VARIANT, (byte) 3); } @@ -195,26 +195,28 @@ public class EndSlimeEntity extends Slime { public boolean isAmber() { return this.entityData.get(VARIANT) == 3; } - + public boolean isChorus() { return this.entityData.get(VARIANT) == 0; } - + public static boolean canSpawn(EntityType type, ServerLevelAccessor world, MobSpawnType spawnReason, BlockPos pos, Random random) { return random.nextInt(16) == 0 || isPermanentBiome(world, pos) || (notManyEntities(world, pos, 32, 3) && isWaterNear(world, pos, 32, 8)); } - + private static boolean isPermanentBiome(ServerLevelAccessor world, BlockPos pos) { Biome biome = world.getBiome(pos); return BiomeAPI.getFromBiome(biome) == EndBiomes.CHORUS_FOREST; } - + private static boolean notManyEntities(ServerLevelAccessor world, BlockPos pos, int radius, int maxCount) { AABB box = new AABB(pos).inflate(radius); - List list = world.getEntitiesOfClass(EndSlimeEntity.class, box, (entity) -> { return true; }); + List list = world.getEntitiesOfClass(EndSlimeEntity.class, box, (entity) -> { + return true; + }); return list.size() <= maxCount; } - + private static boolean isWaterNear(ServerLevelAccessor world, BlockPos pos, int radius, int radius2) { for (int x = pos.getX() - radius; x <= pos.getX() + radius; x++) { POS.setX(x); @@ -230,7 +232,7 @@ public class EndSlimeEntity extends Slime { } return false; } - + class MoveGoal extends Goal { public MoveGoal() { this.setFlags(EnumSet.of(Goal.Flag.JUMP, Goal.Flag.MOVE)); @@ -240,7 +242,7 @@ public class EndSlimeEntity extends Slime { if (EndSlimeEntity.this.isPassenger()) { return false; } - + float yaw = EndSlimeEntity.this.getYHeadRot(); float speed = EndSlimeEntity.this.getSpeed(); if (speed > 0.1) { @@ -250,7 +252,7 @@ public class EndSlimeEntity extends Slime { int down = BlocksHelper.downRay(EndSlimeEntity.this.level, pos, 16); return down < 5; } - + return true; } @@ -291,9 +293,9 @@ public class EndSlimeEntity extends Slime { public boolean canUse() { return EndSlimeEntity.this.getTarget() == null && (EndSlimeEntity.this.onGround - || EndSlimeEntity.this.isInWater() - || EndSlimeEntity.this.isInLava() - || EndSlimeEntity.this.hasEffect(MobEffects.LEVITATION)) + || EndSlimeEntity.this.isInWater() + || EndSlimeEntity.this.isInLava() + || EndSlimeEntity.this.hasEffect(MobEffects.LEVITATION)) && EndSlimeEntity.this.getMoveControl() instanceof EndSlimeMoveControl; } diff --git a/src/main/java/ru/betterend/entity/ShadowWalkerEntity.java b/src/main/java/ru/betterend/entity/ShadowWalkerEntity.java index bf5f2fd0..b5c08d8d 100644 --- a/src/main/java/ru/betterend/entity/ShadowWalkerEntity.java +++ b/src/main/java/ru/betterend/entity/ShadowWalkerEntity.java @@ -1,8 +1,5 @@ package ru.betterend.entity; -import java.util.List; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.core.particles.ParticleTypes; import net.minecraft.sounds.SoundEvent; @@ -29,11 +26,14 @@ import net.minecraft.world.phys.AABB; import ru.bclib.util.MHelper; import ru.betterend.registry.EndSounds; +import java.util.List; +import java.util.Random; + public class ShadowWalkerEntity extends Monster { public ShadowWalkerEntity(EntityType entityType, Level world) { super(entityType, world); } - + @Override protected void registerGoals() { this.goalSelector.addGoal(2, new AttackGoal(this, 1.0D, false)); @@ -51,7 +51,7 @@ public class ShadowWalkerEntity extends Monster { .add(Attributes.ARMOR, 2.0) .add(Attributes.SPAWN_REINFORCEMENTS_CHANCE); } - + @Override public void tick() { super.tick(); @@ -71,7 +71,7 @@ public class ShadowWalkerEntity extends Monster { getZ() + random.nextGaussian() * 0.2, 0, 0, 0); } - + @Override protected SoundEvent getAmbientSound() { return EndSounds.ENTITY_SHADOW_WALKER; @@ -88,18 +88,19 @@ public class ShadowWalkerEntity extends Monster { } @Override - protected void playStepSound(BlockPos pos, BlockState state) {} - + protected void playStepSound(BlockPos pos, BlockState state) { + } + @Override protected float getSoundVolume() { return MHelper.randRange(0.25F, 0.5F, random); } - + @Override public float getVoicePitch() { return MHelper.randRange(0.75F, 1.25F, random); } - + @Override public boolean doHurtTarget(Entity target) { boolean attack = super.doHurtTarget(target); @@ -111,24 +112,26 @@ public class ShadowWalkerEntity extends Monster { } return attack; } - + public static boolean canSpawn(EntityType type, ServerLevelAccessor world, MobSpawnType spawnReason, BlockPos pos, Random random) { if (Monster.checkMonsterSpawnRules(type, world, spawnReason, pos, random)) { AABB box = new AABB(pos).inflate(16); - List entities = world.getEntitiesOfClass(ShadowWalkerEntity.class, box, (entity) -> { return true; }); + List entities = world.getEntitiesOfClass(ShadowWalkerEntity.class, box, (entity) -> { + return true; + }); return entities.size() < 6; } return false; } - + private final class AttackGoal extends MeleeAttackGoal { private final ShadowWalkerEntity walker; private int ticks; public AttackGoal(ShadowWalkerEntity walker, double speed, boolean pauseWhenMobIdle) { - super(walker, speed, pauseWhenMobIdle); - this.walker = walker; - } + super(walker, speed, pauseWhenMobIdle); + this.walker = walker; + } public void start() { super.start(); diff --git a/src/main/java/ru/betterend/entity/SilkMothEntity.java b/src/main/java/ru/betterend/entity/SilkMothEntity.java index b2320f81..05192a8a 100644 --- a/src/main/java/ru/betterend/entity/SilkMothEntity.java +++ b/src/main/java/ru/betterend/entity/SilkMothEntity.java @@ -1,14 +1,5 @@ package ru.betterend.entity; -import java.util.EnumSet; -import java.util.List; -import java.util.Random; - -import net.minecraft.world.entity.*; -import net.minecraft.world.entity.ai.util.AirAndWaterRandomPos; -import net.minecraft.world.entity.ai.util.HoverRandomPos; -import org.jetbrains.annotations.Nullable; - import net.minecraft.core.BlockPos; import net.minecraft.core.Registry; import net.minecraft.nbt.CompoundTag; @@ -19,6 +10,12 @@ import net.minecraft.server.level.ServerLevel; import net.minecraft.sounds.SoundEvents; import net.minecraft.sounds.SoundSource; import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.AgeableMob; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.MobSpawnType; import net.minecraft.world.entity.ai.attributes.AttributeSupplier; import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.entity.ai.control.FlyingMoveControl; @@ -29,7 +26,8 @@ import net.minecraft.world.entity.ai.goal.FollowParentGoal; import net.minecraft.world.entity.ai.goal.Goal; import net.minecraft.world.entity.ai.navigation.FlyingPathNavigation; import net.minecraft.world.entity.ai.navigation.PathNavigation; -import net.minecraft.world.entity.ai.util.RandomPos; +import net.minecraft.world.entity.ai.util.AirAndWaterRandomPos; +import net.minecraft.world.entity.ai.util.HoverRandomPos; import net.minecraft.world.entity.animal.Animal; import net.minecraft.world.entity.animal.FlyingAnimal; import net.minecraft.world.entity.item.ItemEntity; @@ -44,6 +42,7 @@ import net.minecraft.world.level.levelgen.Heightmap.Types; import net.minecraft.world.level.pathfinder.BlockPathTypes; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; +import org.jetbrains.annotations.Nullable; import ru.bclib.util.BlocksHelper; import ru.bclib.util.MHelper; import ru.betterend.BetterEnd; @@ -52,11 +51,15 @@ import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndEntities; import ru.betterend.registry.EndItems; +import java.util.EnumSet; +import java.util.List; +import java.util.Random; + public class SilkMothEntity extends Animal implements FlyingAnimal { private BlockPos hivePos; private BlockPos entrance; private Level hiveWorld; - + public SilkMothEntity(EntityType entityType, Level world) { super(entityType, world); this.moveControl = new FlyingMoveControl(this, 20, true); @@ -65,7 +68,7 @@ public class SilkMothEntity extends Animal implements FlyingAnimal { this.setPathfindingMalus(BlockPathTypes.DANGER_FIRE, -1.0F); this.xpReward = 1; } - + public static AttributeSupplier.Builder createMobAttributes() { return LivingEntity.createLivingAttributes() .add(Attributes.MAX_HEALTH, 2.0D) @@ -73,17 +76,17 @@ public class SilkMothEntity extends Animal implements FlyingAnimal { .add(Attributes.FLYING_SPEED, 0.4D) .add(Attributes.MOVEMENT_SPEED, 0.1D); } - + public void setHive(Level world, BlockPos hive) { this.hivePos = hive; this.hiveWorld = world; } - + @Override public boolean canBeLeashed(Player player) { return false; } - + @Override public void addAdditionalSaveData(CompoundTag tag) { if (hivePos != null) { @@ -91,7 +94,7 @@ public class SilkMothEntity extends Animal implements FlyingAnimal { tag.putString("HiveWorld", hiveWorld.dimension().location().toString()); } } - + @Override public void readAdditionalSaveData(CompoundTag tag) { if (tag.contains("HivePos")) { @@ -115,7 +118,7 @@ public class SilkMothEntity extends Animal implements FlyingAnimal { this.goalSelector.addGoal(8, new WanderAroundGoal()); this.goalSelector.addGoal(9, new FloatGoal(this)); } - + @Override protected PathNavigation createNavigation(Level world) { FlyingPathNavigation birdNavigation = new FlyingPathNavigation(this, world) { @@ -163,7 +166,7 @@ public class SilkMothEntity extends Animal implements FlyingAnimal { public AgeableMob getBreedOffspring(ServerLevel world, AgeableMob entity) { return EndEntities.SILK_MOTH.create(world); } - + @Override protected void dropFromLootTable(DamageSource source, boolean causedByPlayer) { int minCount = 0; @@ -180,18 +183,18 @@ public class SilkMothEntity extends Animal implements FlyingAnimal { ItemEntity drop = new ItemEntity(level, getX(), getY(), getZ(), new ItemStack(EndItems.SILK_FIBER, count)); this.level.addFreshEntity(drop); } - + public static boolean canSpawn(EntityType type, ServerLevelAccessor world, MobSpawnType spawnReason, BlockPos pos, Random random) { int y = world.getChunk(pos).getHeight(Types.WORLD_SURFACE, pos.getX() & 15, pos.getY() & 15); return y > 0 && pos.getY() >= y && notManyEntities(world, pos, 32, 1); } - + private static boolean notManyEntities(ServerLevelAccessor world, BlockPos pos, int radius, int maxCount) { AABB box = new AABB(pos).inflate(radius); List list = world.getEntitiesOfClass(SilkMothEntity.class, box, (entity) -> true); return list.size() <= maxCount; } - + class MothLookControl extends LookControl { MothLookControl(Mob entity) { super(entity); @@ -230,7 +233,8 @@ public class SilkMothEntity extends Animal implements FlyingAnimal { try { SilkMothEntity.this.navigation.moveTo(SilkMothEntity.this.navigation.createPath(new BlockPos(vec3d), 1), 1.0D); } - catch (Exception e) {} + catch (Exception e) { + } } } @@ -241,12 +245,12 @@ public class SilkMothEntity extends Animal implements FlyingAnimal { return vec3d4 != null ? vec3d4 : AirAndWaterRandomPos.getPos(SilkMothEntity.this, 8, 4, -2, vec3d3.x, vec3d3.z, 1.5707963705062866D); } } - + class ReturnToHiveGoal extends Goal { ReturnToHiveGoal() { this.setFlags(EnumSet.of(Goal.Flag.MOVE)); } - + @Override public boolean canUse() { return SilkMothEntity.this.hivePos != null @@ -255,12 +259,12 @@ public class SilkMothEntity extends Animal implements FlyingAnimal { && SilkMothEntity.this.random.nextInt(16) == 0 && SilkMothEntity.this.position().distanceToSqr(SilkMothEntity.this.hivePos.getX(), SilkMothEntity.this.hivePos.getY(), SilkMothEntity.this.hivePos.getZ()) < 64; } - + @Override public boolean canContinueToUse() { return SilkMothEntity.this.navigation.isInProgress() && level.getBlockState(entrance).isAir() && (level.getBlockState(hivePos).is(EndBlocks.SILK_MOTH_NEST) || level.getBlockState(hivePos).is(EndBlocks.SILK_MOTH_HIVE)); } - + @Override public void start() { BlockState state = SilkMothEntity.this.level.getBlockState(SilkMothEntity.this.hivePos); @@ -272,9 +276,10 @@ public class SilkMothEntity extends Animal implements FlyingAnimal { SilkMothEntity.this.entrance = SilkMothEntity.this.hivePos.relative(state.getValue(BlockStateProperties.HORIZONTAL_FACING)); SilkMothEntity.this.navigation.moveTo(SilkMothEntity.this.navigation.createPath(entrance, 1), 1.0D); } - catch (Exception e) {} + catch (Exception e) { + } } - + @Override public void tick() { super.tick(); diff --git a/src/main/java/ru/betterend/entity/model/BlockBenchModel.java b/src/main/java/ru/betterend/entity/model/BlockBenchModel.java index cb0758ad..24e18c09 100644 --- a/src/main/java/ru/betterend/entity/model/BlockBenchModel.java +++ b/src/main/java/ru/betterend/entity/model/BlockBenchModel.java @@ -1,22 +1,22 @@ package ru.betterend.entity.model; -import java.util.function.Function; - import net.minecraft.client.model.EntityModel; import net.minecraft.client.model.geom.ModelPart; import net.minecraft.client.renderer.RenderType; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.Entity; +import java.util.function.Function; + public abstract class BlockBenchModel extends EntityModel { public BlockBenchModel() { super(); } - + public BlockBenchModel(Function function) { super(function); } - + protected void setRotationAngle(ModelPart modelRenderer, float x, float y, float z) { modelRenderer.xRot = x; modelRenderer.yRot = y; diff --git a/src/main/java/ru/betterend/entity/model/CubozoaEntityModel.java b/src/main/java/ru/betterend/entity/model/CubozoaEntityModel.java index 86bda8c0..fd0f9f75 100644 --- a/src/main/java/ru/betterend/entity/model/CubozoaEntityModel.java +++ b/src/main/java/ru/betterend/entity/model/CubozoaEntityModel.java @@ -14,124 +14,77 @@ import net.minecraft.util.Mth; import ru.betterend.entity.CubozoaEntity; public class CubozoaEntityModel extends BlockBenchModel { - private final static int TENTACLE_COUNT = 4; + private final static int TENTACLE_COUNT = 4; - private final ModelPart model; - private final ModelPart[] tentacle_center; - private final ModelPart[] tentacle; - private float scaleY; - private float scaleXZ; + private final ModelPart model; + private final ModelPart[] tentacle_center; + private final ModelPart[] tentacle; + private float scaleY; + private float scaleXZ; - public static LayerDefinition getTexturedModelData() { - MeshDefinition modelData = new MeshDefinition(); - PartDefinition modelPartData = modelData.getRoot(); + public static LayerDefinition getTexturedModelData() { + MeshDefinition modelData = new MeshDefinition(); + PartDefinition modelPartData = modelData.getRoot(); - PartDefinition bodyPart = modelPartData.addOrReplaceChild(PartNames.BODY, CubeListBuilder.create() - .texOffs(0, 17) - .addBox(-2.0F, -12.5F, -2.0F, 4.0F, 4.0F, 4.0F), PartPose.offset(0.0F, 24.0F, 0.0F)); - /*model = new ModelPart(this); - model.setPos(0.0F, 24.0F, 0.0F); - model.texOffs(0, 17).addBox(-2.0F, -12.5F, -2.0F, 4.0F, 4.0F, 4.0F, 0.0F);*/ + PartDefinition bodyPart = modelPartData.addOrReplaceChild(PartNames.BODY, + CubeListBuilder + .create() + .texOffs(0, 17) + .addBox(-2.0F, -12.5F, -2.0F, 4.0F, 4.0F, 4.0F), + PartPose.offset(0.0F, 24.0F, 0.0F) + ); - bodyPart.addOrReplaceChild("main_cube_r1", CubeListBuilder.create() - .texOffs(0, 0) - .addBox(-5.0F, -7.0F, -5.0F, 10.0F, 7.0F, 10.0F), PartPose.offsetAndRotation(0.0F, -14.0F, 0.0F, 0.0F, 0.0F, -3.1416F)); + bodyPart.addOrReplaceChild("main_cube_r1", CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-5.0F, -7.0F, -5.0F, 10.0F, 7.0F, 10.0F), PartPose.offsetAndRotation(0.0F, -14.0F, 0.0F, 0.0F, 0.0F, -3.1416F)); - /*main_cube_r1 = new ModelPart(this); - main_cube_r1.setPos(0.0F, -14.0F, 0.0F); - model.addChild(main_cube_r1); - setRotationAngle(main_cube_r1, 0.0F, 0.0F, -3.1416F); - main_cube_r1.texOffs(0, 0).addBox(-5.0F, -7.0F, -5.0F, 10.0F, 7.0F, 10.0F, 0.0F);*/ - float[] angles = {0, (float)Math.PI/-2, (float)Math.PI, (float)Math.PI/2}; + for (int i = 1; i <= TENTACLE_COUNT; i++) { + PartDefinition tentaclePart = bodyPart + .addOrReplaceChild("tentacle_center_" + i, + CubeListBuilder.create(), + PartPose.offsetAndRotation( + 0.0F, 0.0F, 0.0F, + 0.0F, i * 1.5708F, 0.0F + ) + ); - for (int i=1; i<=TENTACLE_COUNT; i++){ - PartDefinition tentaclePart = bodyPart - .addOrReplaceChild("tentacle_center_"+i, - CubeListBuilder.create(), - PartPose.offsetAndRotation( - 0.0F, 0.0F, 0.0F, - 0.0F, -1.5708F, 0.0F - ) - ); + tentaclePart.addOrReplaceChild("tentacle_" + i, CubeListBuilder.create() + .texOffs(16, 17) + .addBox(-4.0F, 0.0F, 0.0F, 8.0F, 7.0F, 0.0F), + PartPose.offset(0.0F, -7.0F, 4.5F)); + } - tentaclePart.addOrReplaceChild("tentacle_"+i, CubeListBuilder.create() - .texOffs(16, 17) - .addBox(-4.0F, 0.0F, 0.0F, 8.0F, 7.0F, 0.0F), - PartPose.offset(0.0F, -7.0F, 4.5F)); - } - /*tentacle_center_1 = new ModelPart(this); - tentacle_center_1.setPos(0.0F, 0.0F, 0.0F); - model.addChild(tentacle_center_1); + return LayerDefinition.create(modelData, 48, 48); + } - tentacle_1 = new ModelPart(this); - tentacle_1.setPos(0.0F, -7.0F, 4.5F); - tentacle_center_1.addChild(tentacle_1); - tentacle_1.texOffs(16, 17).addBox(-4.0F, 0.0F, 0.0F, 8.0F, 7.0F, 0.0F, 0.0F); + public CubozoaEntityModel(ModelPart modelPart) { + super(RenderType::entityTranslucent); + tentacle = new ModelPart[TENTACLE_COUNT]; + tentacle_center = new ModelPart[TENTACLE_COUNT]; - tentacle_center_2 = new ModelPart(this); - tentacle_center_2.setPos(0.0F, 0.0F, 0.0F); - model.addChild(tentacle_center_2); - setRotationAngle(tentacle_center_2, 0.0F, -1.5708F, 0.0F); + model = modelPart.getChild(PartNames.BODY); + for (int i = 1; i <= TENTACLE_COUNT; i++) { + tentacle_center[i - 1] = model.getChild("tentacle_center_" + i); + tentacle[i - 1] = tentacle_center[i - 1].getChild("tentacle_" + i); + } + } - tentacle_2 = new ModelPart(this); - tentacle_2.setPos(0.0F, -7.0F, 4.5F); - tentacle_center_2.addChild(tentacle_2); - tentacle_2.texOffs(16, 17).addBox(-4.0F, 0.0F, 0.0F, 8.0F, 7.0F, 0.0F, 0.0F); + @Override + public void setupAnim(CubozoaEntity entity, float limbAngle, float limbDistance, float animationProgress, float headYaw, float headPitch) { + float sin = Mth.sin(animationProgress * 0.13F); + scaleY = sin * 0.1F + 0.9F; + scaleXZ = Mth.sin(animationProgress * 0.13F + 3.14F) * 0.1F + 0.9F; - tentacle_center_3 = new ModelPart(this); - tentacle_center_3.setPos(0.0F, 0.0F, 0.0F); - model.addChild(tentacle_center_3); - setRotationAngle(tentacle_center_3, 0.0F, 3.1416F, 0.0F); + for (int i = 0; i < TENTACLE_COUNT; i++) { + tentacle[i].xRot = sin * 0.15f; + } + } - tentacle_3 = new ModelPart(this); - tentacle_3.setPos(0.0F, -7.0F, 4.5F); - tentacle_center_3.addChild(tentacle_3); - tentacle_3.texOffs(16, 17).addBox(-4.0F, 0.0F, 0.0F, 8.0F, 7.0F, 0.0F, 0.0F); - - tentacle_center_4 = new ModelPart(this); - tentacle_center_4.setPos(0.0F, 0.0F, 0.0F); - model.addChild(tentacle_center_4); - setRotationAngle(tentacle_center_4, 0.0F, 1.5708F, 0.0F); - - - tentacle_4 = new ModelPart(this); - tentacle_4.setPos(0.0F, -7.0F, 4.5F); - tentacle_center_4.addChild(tentacle_4); - tentacle_4.texOffs(16, 17).addBox(-4.0F, 0.0F, 0.0F, 8.0F, 7.0F, 0.0F, 0.0F);*/ - - /* texWidth = 48; - texHeight = 48; */ - return LayerDefinition.create(modelData, 48, 48); - } - - public CubozoaEntityModel(ModelPart modelPart) { - super(RenderType::entityTranslucent); - tentacle = new ModelPart[TENTACLE_COUNT]; - tentacle_center = new ModelPart[TENTACLE_COUNT]; - - model = modelPart.getChild(PartNames.BODY); - for (int i=1; i<=TENTACLE_COUNT; i++){ - tentacle_center[i-1] = model.getChild("tentacle_center_"+i); - tentacle[i-1] = tentacle_center[i-1].getChild("tentacle_"+i); - } - } - - @Override - public void setupAnim(CubozoaEntity entity, float limbAngle, float limbDistance, float animationProgress, float headYaw, float headPitch) { - float sin = Mth.sin(animationProgress * 0.13F); - scaleY = sin * 0.1F + 0.9F; - scaleXZ = Mth.sin(animationProgress * 0.13F + 3.14F) * 0.1F + 0.9F; - - for (int i=0; i { - private final ModelPart model; - private final ModelPart head; - private final ModelPart tail; - private final ModelPart tail_2; - private final ModelPart wing_1; - private final ModelPart wing_2; - private final ModelPart wing_3; - private final ModelPart wing_4; - private final ModelPart legs_1; - private final ModelPart legs_2; + private final ModelPart model; + private final ModelPart head; + private final ModelPart tail; + private final ModelPart tail_2; + private final ModelPart wing_1; + private final ModelPart wing_2; + private final ModelPart wing_3; + private final ModelPart wing_4; + private final ModelPart legs_1; + private final ModelPart legs_2; - public static LayerDefinition getTexturedModelData() { - MeshDefinition modelData = new MeshDefinition(); - PartDefinition modelPartData = modelData.getRoot(); + public static LayerDefinition getTexturedModelData() { + MeshDefinition modelData = new MeshDefinition(); + PartDefinition modelPartData = modelData.getRoot(); - PartDefinition bodyPart = modelPartData.addOrReplaceChild(PartNames.BODY, CubeListBuilder.create() - .texOffs(0, 0) - .addBox(-4.0F, -4.0F, 0.0F, 4.0F, 4.0F, 9.0F), - PartPose.offset(2.0F, 21.5F, -4.0F)); - /*model = new ModelPart(this); - model.setPos(2.0F, 21.5F, -4.0F); - model.texOffs(0, 0).addBox(-4.0F, -4.0F, 0.0F, 4.0F, 4.0F, 9.0F, 0.0F);*/ + PartDefinition bodyPart = modelPartData.addOrReplaceChild(PartNames.BODY, + CubeListBuilder + .create() + .texOffs(0, 0) + .addBox(-4.0F, -4.0F, 0.0F, 4.0F, 4.0F, 9.0F), + PartPose.offset(2.0F, 21.5F, -4.0F) + ); - bodyPart.addOrReplaceChild(PartNames.HEAD, CubeListBuilder.create() - .texOffs(17, 0) - .addBox(-1.5F, -1.5F, -2.5F, 3.0F, 3.0F, 3.0F), - PartPose.offsetAndRotation(-2.0F, -2.0F, 0.0F, - 0.3491F, 0.0F, 0.0F)); - /*head = new ModelPart(this); - head.setPos(-2.0F, -2.0F, 0.0F); - model.addChild(head); - setRotationAngle(head, 0.3491F, 0.0F, 0.0F); - head.texOffs(17, 0).addBox(-1.5F, -1.5F, -2.5F, 3.0F, 3.0F, 3.0F, 0.0F);*/ + bodyPart.addOrReplaceChild(PartNames.HEAD, + CubeListBuilder + .create() + .texOffs(17, 0) + .addBox(-1.5F, -1.5F, -2.5F, 3.0F, 3.0F, 3.0F), + PartPose.offsetAndRotation(-2.0F, -2.0F, 0.0F, 0.3491F, 0.0F, 0.0F) + ); - PartDefinition tailPart = bodyPart.addOrReplaceChild(PartNames.TAIL, CubeListBuilder.create() - .texOffs(26, 0) - .addBox(-1.5F, -1.5F, 0.0F, 3.0F, 3.0F, 7.0F), - PartPose.offset(-2.0F, -2.0F, 9.0F)); - /* - tail = new ModelPart(this); - tail.setPos(-2.0F, -2.0F, 9.0F); - model.addChild(tail); - tail.texOffs(26, 0).addBox(-1.5F, -1.5F, 0.0F, 3.0F, 3.0F, 7.0F, 0.0F); - */ + PartDefinition tailPart = bodyPart.addOrReplaceChild(PartNames.TAIL, + CubeListBuilder + .create() + .texOffs(26, 0) + .addBox(-1.5F, -1.5F, 0.0F, 3.0F, 3.0F, 7.0F), + PartPose.offset(-2.0F, -2.0F, 9.0F) + ); - tailPart.addOrReplaceChild(PartNames.TAIL_FIN, CubeListBuilder.create() - .texOffs(36, 0) - .addBox(-1.0F, -1.0F, 0.0F, 2.0F, 2.0F, 10.0F), - PartPose.offset(0.0F, 0.0F, 7.0F)); + tailPart.addOrReplaceChild(PartNames.TAIL_FIN, + CubeListBuilder + .create() + .texOffs(36, 0) + .addBox(-1.0F, -1.0F, 0.0F, 2.0F, 2.0F, 10.0F), + PartPose.offset(0.0F, 0.0F, 7.0F) + ); - /* - tail_2 = new ModelPart(this); - tail_2.setPos(0.0F, 0.0F, 7.0F); - tail.addChild(tail_2); - tail_2.texOffs(36, 0).addBox(-1.0F, -1.0F, 0.0F, 2.0F, 2.0F, 10.0F, 0.0F); - */ + bodyPart.addOrReplaceChild(PartNames.LEFT_WING, + CubeListBuilder + .create() + .texOffs(0, 13) + .addBox(-15.0F, 0.0F, -3.0F, 15.0F, 0.0F, 4.0F), + PartPose.offset(-2.0F, -4.0F, 4.0F) + ); - bodyPart.addOrReplaceChild(PartNames.LEFT_WING, CubeListBuilder.create() - .texOffs(0, 13) - .addBox(-15.0F, 0.0F, -3.0F, 15.0F, 0.0F, 4.0F), - PartPose.offset(-2.0F, -4.0F, 4.0F)); + bodyPart.addOrReplaceChild(PartNames.RIGHT_WING, + CubeListBuilder + .create() + .mirror() + .texOffs(0, 13) + .addBox(0.0F, 0.0F, -3.0F, 15.0F, 0.0F, 4.0F), + PartPose.offset(-2.0F, -4.0F, 4.0F) + ); - /*wing_1 = new ModelPart(this); - wing_1.setPos(-2.0F, -4.0F, 4.0F); - model.addChild(wing_1); - wing_1.texOffs(0, 13).addBox(-15.0F, 0.0F, -3.0F, 15.0F, 0.0F, 4.0F, 0.0F);*/ + bodyPart.addOrReplaceChild(PartNames.LEFT_WING_BASE, + CubeListBuilder + .create() + .texOffs(4, 17) + .addBox(-12.0F, 0.0F, -2.5F, 12.0F, 0.0F, 3.0F), + PartPose.offset(-2.0F, -4.0F, 8.0F) + ); - bodyPart.addOrReplaceChild(PartNames.RIGHT_WING, CubeListBuilder.create() - .mirror() - .texOffs(0, 13) - .addBox(0.0F, 0.0F, -3.0F, 15.0F, 0.0F, 4.0F), - PartPose.offset(-2.0F, -4.0F, 4.0F)); - /*wing_2 = new ModelPart(this); - wing_2.setPos(-2.0F, -4.0F, 4.0F); - model.addChild(wing_2); - wing_2.mirror = true; - wing_2.texOffs(0, 13).addBox(0.0F, 0.0F, -3.0F, 15.0F, 0.0F, 4.0F, 0.0F);*/ + bodyPart.addOrReplaceChild(PartNames.RIGHT_WING_BASE, + CubeListBuilder + .create() + .mirror() + .texOffs(4, 17) + .addBox(0.0F, 0.0F, -2.5F, 12.0F, 0.0F, 3.0F), + PartPose.offset(-2.0F, -4.0F, 8.0F) + ); - bodyPart.addOrReplaceChild(PartNames.LEFT_WING_BASE, CubeListBuilder.create() - .texOffs(4, 17) - .addBox(-12.0F, 0.0F, -2.5F, 12.0F, 0.0F, 3.0F), - PartPose.offset(-2.0F, -4.0F, 8.0F)); - /*wing_3 = new ModelPart(this); - wing_3.setPos(-2.0F, -4.0F, 8.0F); - model.addChild(wing_3); - wing_3.texOffs(4, 17).addBox(-12.0F, 0.0F, -2.5F, 12.0F, 0.0F, 3.0F, 0.0F);*/ + bodyPart.addOrReplaceChild(PartNames.LEFT_LEG, + CubeListBuilder + .create() + .texOffs(50, 1) + .addBox(0.0F, 0.0F, 0.0F, 0.0F, 3.0F, 6.0F), + PartPose.offsetAndRotation(-1.0F, 0.0F, 1.0F, 0.0F, 0.0F, -0.5236F) + ); - bodyPart.addOrReplaceChild(PartNames.RIGHT_WING_BASE, CubeListBuilder.create() - .mirror() - .texOffs(4, 17) - .addBox(0.0F, 0.0F, -2.5F, 12.0F, 0.0F, 3.0F), - PartPose.offset(-2.0F, -4.0F, 8.0F)); - /*wing_4 = new ModelPart(this); - wing_4.setPos(-2.0F, -4.0F, 8.0F); - model.addChild(wing_4); - wing_4.mirror = true; - wing_4.texOffs(4, 17).addBox(0.0F, 0.0F, -2.5F, 12.0F, 0.0F, 3.0F, 0.0F);*/ + bodyPart.addOrReplaceChild(PartNames.RIGHT_LEG, + CubeListBuilder + .create() + .texOffs(50, 1) + .addBox(0.0F, 0.0F, 0.0F, 0.0F, 3.0F, 6.0F), + PartPose.offsetAndRotation(-3.0F, 0.0F, 1.0F, 0.0F, 0.0F, 0.5236F) + ); - bodyPart.addOrReplaceChild(PartNames.LEFT_LEG, CubeListBuilder.create() - .texOffs(50, 1) - .addBox(0.0F, 0.0F, 0.0F, 0.0F, 3.0F, 6.0F), - PartPose.offsetAndRotation(-1.0F, 0.0F, 1.0F, - 0.0F, 0.0F, -0.5236F)); - /*legs_1 = new ModelPart(this); - legs_1.setPos(-1.0F, 0.0F, 1.0F); - model.addChild(legs_1); - setRotationAngle(legs_1, 0.0F, 0.0F, -0.5236F); - legs_1.texOffs(50, 1).addBox(0.0F, 0.0F, 0.0F, 0.0F, 3.0F, 6.0F, 0.0F);*/ + return LayerDefinition.create(modelData, 64, 64); + } - bodyPart.addOrReplaceChild(PartNames.RIGHT_LEG, CubeListBuilder.create() - .texOffs(50, 1) - .addBox(0.0F, 0.0F, 0.0F, 0.0F, 3.0F, 6.0F), - PartPose.offsetAndRotation(-3.0F, 0.0F, 1.0F, - 0.0F, 0.0F, 0.5236F)); - /*legs_2 = new ModelPart(this); - legs_2.setPos(-3.0F, 0.0F, 1.0F); - model.addChild(legs_2); - setRotationAngle(legs_2, 0.0F, 0.0F, 0.5236F); - legs_2.texOffs(50, 1).addBox(0.0F, 0.0F, 0.0F, 0.0F, 3.0F, 6.0F, 0.0F);*/ + public DragonflyEntityModel(ModelPart modelPart) { + super(RenderType::entityCutout); - /* - texWidth = 64; - texHeight = 64; - */ - return LayerDefinition.create(modelData, 64, 64); - } + model = modelPart.getChild(PartNames.BODY); + head = model.getChild(PartNames.HEAD); + tail = model.getChild(PartNames.TAIL); + tail_2 = tail.getChild(PartNames.TAIL_FIN); + wing_1 = model.getChild(PartNames.LEFT_WING); + wing_2 = model.getChild(PartNames.RIGHT_WING); + wing_3 = model.getChild(PartNames.LEFT_WING_BASE); + wing_4 = model.getChild(PartNames.RIGHT_WING_BASE); + legs_1 = model.getChild(PartNames.LEFT_LEG); + legs_2 = model.getChild(PartNames.RIGHT_LEG); + } - public DragonflyEntityModel(ModelPart modelPart) { - super(RenderType::entityCutout); + @Override + public void setupAnim(DragonflyEntity entity, float limbAngle, float limbDistance, float animationProgress, float headYaw, float headPitch) { + float progress = animationProgress * 2F; - model = modelPart.getChild(PartNames.BODY); - head = model.getChild(PartNames.HEAD); - tail = model.getChild(PartNames.TAIL); - tail_2 = tail.getChild(PartNames.TAIL_FIN); - wing_1 = model.getChild(PartNames.LEFT_WING); - wing_2 = model.getChild(PartNames.RIGHT_WING); - wing_3 = model.getChild(PartNames.LEFT_WING_BASE); - wing_4 = model.getChild(PartNames.RIGHT_WING_BASE); - legs_1 = model.getChild(PartNames.LEFT_LEG); - legs_2 = model.getChild(PartNames.RIGHT_LEG); - } + wing_1.zRot = 0.3491F + (float) Math.sin(progress) * 0.3491F; + wing_2.zRot = -wing_1.zRot; - @Override - public void setupAnim(DragonflyEntity entity, float limbAngle, float limbDistance, float animationProgress, - float headYaw, float headPitch) { - float progress = animationProgress * 2F; + wing_3.zRot = 0.3491F + (float) Math.cos(progress) * 0.3491F; + wing_4.zRot = -wing_3.zRot; - wing_1.zRot = 0.3491F + (float) Math.sin(progress) * 0.3491F; - wing_2.zRot = -wing_1.zRot; + progress = animationProgress * 0.05F; - wing_3.zRot = 0.3491F + (float) Math.cos(progress) * 0.3491F; - wing_4.zRot = -wing_3.zRot; + head.xRot = 0.3491F + (float) Math.sin(progress * 0.7F) * 0.1F; + tail.xRot = (float) Math.cos(progress) * 0.05F - 0.05F; + tail_2.xRot = -tail.xRot * 1.5F; + } - progress = animationProgress * 0.05F; - - head.xRot = 0.3491F + (float) Math.sin(progress * 0.7F) * 0.1F; - tail.xRot = (float) Math.cos(progress) * 0.05F - 0.05F; - tail_2.xRot = -tail.xRot * 1.5F; - } - - @Override - public void renderToBuffer(PoseStack matrices, VertexConsumer vertices, int light, int overlay, float red, - float green, float blue, float alpha) { - model.render(matrices, vertices, light, overlay); - } + @Override + public void renderToBuffer(PoseStack matrices, VertexConsumer vertices, int light, int overlay, float red, float green, float blue, float alpha) { + model.render(matrices, vertices, light, overlay); + } } diff --git a/src/main/java/ru/betterend/entity/model/EndFishEntityModel.java b/src/main/java/ru/betterend/entity/model/EndFishEntityModel.java index 11e402fc..8a4860e3 100644 --- a/src/main/java/ru/betterend/entity/model/EndFishEntityModel.java +++ b/src/main/java/ru/betterend/entity/model/EndFishEntityModel.java @@ -2,7 +2,6 @@ package ru.betterend.entity.model; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; - import net.minecraft.client.model.geom.ModelPart; import net.minecraft.client.model.geom.PartNames; import net.minecraft.client.model.geom.PartPose; @@ -25,74 +24,55 @@ public class EndFishEntityModel extends BlockBenchModel { MeshDefinition modelData = new MeshDefinition(); PartDefinition modelPartData = modelData.getRoot(); - PartDefinition bodyPart = modelPartData.addOrReplaceChild(PartNames.BODY, CubeListBuilder.create() + PartDefinition bodyPart = modelPartData.addOrReplaceChild(PartNames.BODY, + CubeListBuilder + .create() .texOffs(0, 0) .addBox(-1.0F, -2.0F, -4.0F, 2.0F, 4.0F, 8.0F), - PartPose.offset(0.0F, 20.0F, 0.0F)); - /*model = new ModelPart(this); - model.setPos(0.0F, 20.0F, 0.0F); - model.texOffs(0, 0).addBox(-1.0F, -2.0F, -4.0F, 2.0F, 4.0F, 8.0F, 0.0F);*/ + PartPose.offset(0.0F, 20.0F, 0.0F) + ); - modelPartData.addOrReplaceChild(PartNames.TOP_FIN, CubeListBuilder.create() + bodyPart.addOrReplaceChild(PartNames.TOP_FIN, + CubeListBuilder + .create() .texOffs(0, 6) .addBox(0.0F, -8.0F, 0.0F, 0.0F, 8.0F, 6.0F), - PartPose.offsetAndRotation(0.0F, -2.0F, -4.0F, - -0.6981F, 0.0F, 0.0F)); - /*fin_top.setPos(0.0F, -2.0F, -4.0F); - model.addChild(fin_top); - setRotationAngle(fin_top, -0.6981F, 0.0F, 0.0F); - fin_top.texOffs(0, 6).addBox(0.0F, -8.0F, 0.0F, 0.0F, 8.0F, 6.0F, 0.0F);* - */ + PartPose.offsetAndRotation(0.0F, -2.0F, -4.0F, -0.6981F, 0.0F, 0.0F) + ); - modelPartData.addOrReplaceChild(PartNames.BOTTOM_FIN, CubeListBuilder.create() + bodyPart.addOrReplaceChild(PartNames.BOTTOM_FIN, + CubeListBuilder + .create() .texOffs(0, 6) .addBox(0.0F, 0.0F, 0.0F, 0.0F, 8.0F, 6.0F), - PartPose.offsetAndRotation(0.0F, 2.0F, -4.0F, - 0.6981F, 0.0F, 0.0F)); - /*fin_bottom = new ModelPart(this); - fin_bottom.setPos(0.0F, 2.0F, -4.0F); - model.addChild(fin_bottom); - setRotationAngle(fin_bottom, 0.6981F, 0.0F, 0.0F); - fin_bottom.texOffs(0, 6).addBox(0.0F, 0.0F, 0.0F, 0.0F, 8.0F, 6.0F, 0.0F);*/ + PartPose.offsetAndRotation(0.0F, 2.0F, -4.0F, 0.6981F, 0.0F, 0.0F) + ); - modelPartData.addOrReplaceChild(PartNames.TAIL_FIN, CubeListBuilder.create() + bodyPart.addOrReplaceChild(PartNames.TAIL_FIN, + CubeListBuilder + .create() .texOffs(0, 15) .addBox(0.0F, -5.0F, 0.0F, 0.0F, 5.0F, 5.0F), - PartPose.offsetAndRotation(0.0F, 0.0F, 2.0F, - -0.7854F, 0.0F, 0.0F)); - /*flipper = new ModelPart(this); - flipper.setPos(0.0F, 0.0F, 2.0F); - model.addChild(flipper); - setRotationAngle(flipper, -0.7854F, 0.0F, 0.0F); - flipper.texOffs(0, 15).addBox(0.0F, -5.0F, 0.0F, 0.0F, 5.0F, 5.0F, 0.0F);*/ + PartPose.offsetAndRotation(0.0F, 0.0F, 2.0F, -0.7854F, 0.0F, 0.0F) + ); - modelPartData.addOrReplaceChild(PartNames.RIGHT_FIN, CubeListBuilder.create() + bodyPart.addOrReplaceChild(PartNames.RIGHT_FIN, + CubeListBuilder + .create() .texOffs(0, 25) .addBox(-3.7071F, 0.7071F, -1.5F, 3.0F, 0.0F, 3.0F), - PartPose.offsetAndRotation(-1.0F, 0.0F, -1.0F, - 1.5708F, 0.7854F, 0.0F)); - /*fin_right = new ModelPart(this); - fin_right.setPos(-1.0F, 0.0F, -1.0F); - model.addChild(fin_right); - setRotationAngle(fin_right, 1.5708F, 0.7854F, 0.0F); - fin_right.texOffs(0, 25).addBox(-3.7071F, 0.7071F, -1.5F, 3.0F, 0.0F, 3.0F, 0.0F);*/ + PartPose.offsetAndRotation(-1.0F, 0.0F, -1.0F, 1.5708F, 0.7854F, 0.0F) + ); - modelPartData.addOrReplaceChild(PartNames.LEFT_FIN, CubeListBuilder.create() + bodyPart.addOrReplaceChild(PartNames.LEFT_FIN, + CubeListBuilder + .create() .mirror() .texOffs(0, 25) .addBox(0.7071F, 0.7071F, -1.5F, 3.0F, 0.0F, 3.0F), - PartPose.offsetAndRotation(-1.0F, 0.0F, -1.0F, - 1.5708F, -0.7854F, 0.0F)); - /*fin_left = new ModelPart(this); - fin_left.setPos(1.0F, 0.0F, -1.0F); - model.addChild(fin_left); - setRotationAngle(fin_left, 1.5708F, -0.7854F, 0.0F); - fin_left.texOffs(0, 25).addBox(0.7071F, 0.7071F, -1.5F, 3.0F, 0.0F, 3.0F, 0.0F, true);*/ + PartPose.offsetAndRotation(-1.0F, 0.0F, -1.0F, 1.5708F, -0.7854F, 0.0F) + ); - /* - texWidth = 32; - texHeight = 32; - */ return LayerDefinition.create(modelData, 32, 32); } @@ -100,15 +80,15 @@ public class EndFishEntityModel extends BlockBenchModel { super(RenderType::entityCutout); model = modelPart.getChild(PartNames.BODY); - fin_top = modelPart.getChild(PartNames.TOP_FIN); - fin_bottom = modelPart.getChild(PartNames.BOTTOM_FIN); - flipper = modelPart.getChild(PartNames.TAIL_FIN); - fin_right = modelPart.getChild(PartNames.RIGHT_FIN); - fin_left = modelPart.getChild(PartNames.LEFT_FIN);} + fin_top = model.getChild(PartNames.TOP_FIN); + fin_bottom = model.getChild(PartNames.BOTTOM_FIN); + flipper = model.getChild(PartNames.TAIL_FIN); + fin_right = model.getChild(PartNames.RIGHT_FIN); + fin_left = model.getChild(PartNames.LEFT_FIN); + } @Override - public void setupAnim(EndFishEntity entity, float limbAngle, float limbDistance, float animationProgress, - float headYaw, float headPitch) { + public void setupAnim(EndFishEntity entity, float limbAngle, float limbDistance, float animationProgress, float headYaw, float headPitch) { float s1 = (float) Math.sin(animationProgress * 0.1); float s2 = (float) Math.sin(animationProgress * 0.05); flipper.yRot = s1 * 0.3F; @@ -119,8 +99,7 @@ public class EndFishEntityModel extends BlockBenchModel { } @Override - public void renderToBuffer(PoseStack matrices, VertexConsumer vertices, int light, int overlay, float red, - float green, float blue, float alpha) { + public void renderToBuffer(PoseStack matrices, VertexConsumer vertices, int light, int overlay, float red, float green, float blue, float alpha) { model.render(matrices, vertices, light, overlay); } } diff --git a/src/main/java/ru/betterend/entity/model/EndSlimeEntityModel.java b/src/main/java/ru/betterend/entity/model/EndSlimeEntityModel.java index f2c4c5e7..3fda3e2b 100644 --- a/src/main/java/ru/betterend/entity/model/EndSlimeEntityModel.java +++ b/src/main/java/ru/betterend/entity/model/EndSlimeEntityModel.java @@ -3,10 +3,8 @@ package ru.betterend.entity.model; import com.google.common.collect.ImmutableList; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; - import net.minecraft.client.model.ListModel; import net.minecraft.client.model.geom.EntityModelSet; -import net.minecraft.client.model.geom.ModelLayers; import net.minecraft.client.model.geom.ModelPart; import net.minecraft.client.model.geom.PartNames; import net.minecraft.client.model.geom.PartPose; @@ -30,6 +28,7 @@ public class EndSlimeEntityModel extends ListModel public static LayerDefinition getShellOnlyTexturedModelData() { return getTexturedModelData(true); } + public static LayerDefinition getCompleteTexturedModelData() { return getTexturedModelData(false); } @@ -38,92 +37,74 @@ public class EndSlimeEntityModel extends ListModel MeshDefinition modelData = new MeshDefinition(); PartDefinition modelPartData = modelData.getRoot(); - //this.innerCube = new ModelPart(this, 0, 16); if (onlyShell) { - modelPartData.addOrReplaceChild(PartNames.BODY, CubeListBuilder.create() + modelPartData.addOrReplaceChild(PartNames.BODY, + CubeListBuilder + .create() .texOffs(0, 0) .addBox(-4.0F, 16.0F, -4.0F, 8.0F, 8.0F, 8.0F), - PartPose.ZERO); - /* this.innerCube.texOffs(0, 0); - this.innerCube.addBox(-4.0F, 16.0F, -4.0F, 8.0F, 8.0F, 8.0F);*/ - } else { - modelPartData.addOrReplaceChild(PartNames.BODY, CubeListBuilder.create() + PartPose.ZERO + ); + } + else { + modelPartData.addOrReplaceChild(PartNames.BODY, + CubeListBuilder + .create() .texOffs(0, 16) .addBox(-3.0F, 17.0F, -3.0F, 6.0F, 6.0F, 6.0F), - PartPose.ZERO); - //this.innerCube.addBox(-3.0F, 17.0F, -3.0F, 6.0F, 6.0F, 6.0F); + PartPose.ZERO + ); - modelPartData.addOrReplaceChild(PartNames.RIGHT_EYE, CubeListBuilder.create() + modelPartData.addOrReplaceChild(PartNames.RIGHT_EYE, + CubeListBuilder + .create() .texOffs(32, 0) .addBox(-3.25F, 18.0F, -3.5F, 2.0F, 2.0F, 2.0F), - PartPose.ZERO); - //this.rightEye = new ModelPart(this, 32, 0); - //this.rightEye.addBox(-3.25F, 18.0F, -3.5F, 2.0F, 2.0F, 2.0F); + PartPose.ZERO + ); - modelPartData.addOrReplaceChild(PartNames.LEFT_EYE, CubeListBuilder.create() + modelPartData.addOrReplaceChild(PartNames.LEFT_EYE, + CubeListBuilder + .create() .texOffs(32, 4) .addBox(1.25F, 18.0F, -3.5F, 2.0F, 2.0F, 2.0F), - PartPose.ZERO); - //this.leftEye = new ModelPart(this, 32, 4); - //this.leftEye.addBox(1.25F, 18.0F, -3.5F, 2.0F, 2.0F, 2.0F); + PartPose.ZERO + ); - modelPartData.addOrReplaceChild(PartNames.MOUTH, CubeListBuilder.create() + modelPartData.addOrReplaceChild(PartNames.MOUTH, + CubeListBuilder + .create() .texOffs(32, 8) .addBox(0.0F, 21.0F, -3.5F, 1.0F, 1.0F, 1.0F), - PartPose.ZERO); - //this.mouth = new ModelPart(this, 32, 8); - //this.mouth.addBox(0.0F, 21.0F, -3.5F, 1.0F, 1.0F, 1.0F); + PartPose.ZERO + ); PartDefinition flowerPart = modelPartData.addOrReplaceChild("flower", CubeListBuilder.create(), PartPose.ZERO); PartDefinition cropPart = modelPartData.addOrReplaceChild("crop", CubeListBuilder.create(), PartPose.ZERO); for (int i = 0; i < 6; i++) { - final PartDefinition parent = i<4?flowerPart:cropPart; - final float rot = MHelper.degreesToRadians( i<4 ? (i * 45F) : ((i-4) * 90F + 45F) ); + final PartDefinition parent = i < 4 ? flowerPart : cropPart; + final float rot = MHelper.degreesToRadians(i < 4 ? (i * 45F) : ((i - 4) * 90F + 45F)); - PartDefinition petalRotPart = parent.addOrReplaceChild("petalRot_"+i, + PartDefinition petalRotPart = parent.addOrReplaceChild("petalRot_" + i, CubeListBuilder.create(), - PartPose.offsetAndRotation(0,0,0,0,rot, 0)); + PartPose.offsetAndRotation(0, 0, 0, 0, rot, 0)); - petalRotPart.addOrReplaceChild("petal_"+i, - CubeListBuilder.create() + petalRotPart.addOrReplaceChild("petal_" + i, + CubeListBuilder + .create() .texOffs(40, 0) .addBox(0.0F, 0.0F, 0.0F, 8.0F, 8.0F, 0.0F), - PartPose.offset(-4, 8, 0)); + PartPose.offset(-4, 8, 0) + ); } - /* this.flower = new ModelPart(this); - for (int i = 0; i < 4; i++) { - ModelPart petalRot = new ModelPart(this); - petalRot.yRot = MHelper.degreesToRadians(i * 45F); - - ModelPart petal = new ModelPart(this, 40, 0); - petal.setPos(-4, 8, 0); - petal.addBox(0.0F, 0.0F, 0.0F, 8.0F, 8.0F, 0.0F, 0.0F); - - this.flower.addChild(petalRot); - petalRot.addChild(petal); - } - this.crop = new ModelPart(this); - - for (int i = 0; i < 2; i++) { - ModelPart petalRot = new ModelPart(this); - petalRot.yRot = MHelper.degreesToRadians(i * 90F + 45F); - - ModelPart petal = new ModelPart(this, 40, 0); - petal.setPos(-4, 8, 0); - petal.addBox(0.0F, 0.0F, 0.0F, 8.0F, 8.0F, 0.0F, 0.0F); - - this.crop.addChild(petalRot); - petalRot.addChild(petal); - } - */ } return LayerDefinition.create(modelData, 64, 32); } - public EndSlimeEntityModel(EntityModelSet modelSet, boolean onlyShell){ + public EndSlimeEntityModel(EntityModelSet modelSet, boolean onlyShell) { super(RenderType::entityCutout); ModelPart modelPart = modelSet.bakeLayer(onlyShell ? EndEntitiesRenders.END_SLIME_SHELL_MODEL : EndEntitiesRenders.END_SLIME_MODEL); @@ -135,7 +116,8 @@ public class EndSlimeEntityModel extends ListModel mouth = modelPart.getChild(PartNames.MOUTH); flower = modelPart.getChild("flower"); crop = modelPart.getChild("crop"); - } else { + } + else { rightEye = null; leftEye = null; mouth = null; @@ -145,8 +127,7 @@ public class EndSlimeEntityModel extends ListModel } @Override - public void setupAnim(T entity, float limbAngle, float limbDistance, float animationProgress, float headYaw, - float headPitch) { + public void setupAnim(T entity, float limbAngle, float limbDistance, float animationProgress, float headYaw, float headPitch) { } public void renderFlower(PoseStack matrices, VertexConsumer vertices, int light, int overlay) { @@ -157,15 +138,16 @@ public class EndSlimeEntityModel extends ListModel crop.render(matrices, vertices, light, overlay); } - private boolean isOnlyShell(){ - return rightEye==null; + private boolean isOnlyShell() { + return rightEye == null; } @Override public Iterable parts() { if (isOnlyShell()) { return ImmutableList.of(this.innerCube); - } else { + } + else { return ImmutableList.of(this.innerCube, this.rightEye, this.leftEye, this.mouth); } } diff --git a/src/main/java/ru/betterend/entity/model/SilkMothEntityModel.java b/src/main/java/ru/betterend/entity/model/SilkMothEntityModel.java index f50ef2c2..c0f156b8 100644 --- a/src/main/java/ru/betterend/entity/model/SilkMothEntityModel.java +++ b/src/main/java/ru/betterend/entity/model/SilkMothEntityModel.java @@ -2,7 +2,6 @@ package ru.betterend.entity.model; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; - import net.minecraft.client.model.geom.ModelPart; import net.minecraft.client.model.geom.PartNames; import net.minecraft.client.model.geom.PartPose; @@ -15,240 +14,185 @@ import net.minecraft.util.Mth; import ru.betterend.entity.SilkMothEntity; public class SilkMothEntityModel extends BlockBenchModel { - private final ModelPart legsL; - private final ModelPart cube_r1; - private final ModelPart cube_r2; - private final ModelPart cube_r3; - private final ModelPart legsR; - private final ModelPart cube_r4; - private final ModelPart cube_r5; - private final ModelPart cube_r6; - private final ModelPart head_pivot; - private final ModelPart tendril_r_r1; - private final ModelPart tendril_r_r2; - private final ModelPart bb_main; - private final ModelPart wingR_r1; - private final ModelPart wingL_r1; - private final ModelPart abdomen_r1; + private final ModelPart legsL; + private final ModelPart cube_r1; + private final ModelPart cube_r2; + private final ModelPart cube_r3; + private final ModelPart legsR; + private final ModelPart cube_r4; + private final ModelPart cube_r5; + private final ModelPart cube_r6; + private final ModelPart head_pivot; + private final ModelPart tendril_r_r1; + private final ModelPart tendril_r_r2; + private final ModelPart bb_main; + private final ModelPart wingR_r1; + private final ModelPart wingL_r1; + private final ModelPart abdomen_r1; - public static LayerDefinition getTexturedModelData() { - MeshDefinition modelData = new MeshDefinition(); - PartDefinition modelPartData = modelData.getRoot(); + public static LayerDefinition getTexturedModelData() { + MeshDefinition modelData = new MeshDefinition(); + PartDefinition modelPartData = modelData.getRoot(); - PartDefinition legsL = modelPartData.addOrReplaceChild(PartNames.LEFT_LEG, CubeListBuilder.create() - .texOffs(0, 0), - PartPose.offsetAndRotation(1.5f, 19.9f, -0.45f, - 0.0f, 0.0f, 0.6981f)); + PartDefinition legsL = modelPartData.addOrReplaceChild(PartNames.LEFT_LEG, + CubeListBuilder + .create() + .texOffs(0, 0), + PartPose.offsetAndRotation(1.5f, 19.9f, -0.45f, 0.0f, 0.0f, 0.6981f) + ); - legsL.addOrReplaceChild("cube_r1", CubeListBuilder.create() - .texOffs(0, 13) - .addBox(0.0216f, 0.0f, -0.5976f, 3.0f, 0.0f, 1.0f), - PartPose.offsetAndRotation(0.0f, 0.0f, -1.0f, - 0.0f, 0.2182f, 0.3927f)); + legsL.addOrReplaceChild("cube_r1", + CubeListBuilder + .create() + .texOffs(0, 13) + .addBox(0.0216f, 0.0f, -0.5976f, 3.0f, 0.0f, 1.0f), + PartPose.offsetAndRotation(0.0f, 0.0f, -1.0f, 0.0f, 0.2182f, 0.3927f) + ); - legsL.addOrReplaceChild("cube_r2", CubeListBuilder.create() - .texOffs(0, 15) - .addBox(0.0f, 0.0f, -0.6f, 3.0f, 0.0f, 1.0f), - PartPose.offsetAndRotation(0.5f, 0.1f, -0.05f, - 0.0f, 0.0f, 0.3927f)); + legsL.addOrReplaceChild("cube_r2", + CubeListBuilder + .create() + .texOffs(0, 15) + .addBox(0.0f, 0.0f, -0.6f, 3.0f, 0.0f, 1.0f), + PartPose.offsetAndRotation(0.5f, 0.1f, -0.05f, 0.0f, 0.0f, 0.3927f) + ); - legsL.addOrReplaceChild("cube_r3", CubeListBuilder.create() - .texOffs(0, 14) - .addBox(0.0f, 0.0f, -0.5f, 3.0f, 0.0f, 1.0f), - PartPose.offsetAndRotation(0.0f, 0.0f, 0.9f, - 0.0f, -0.2182f, 0.3927f)); + legsL.addOrReplaceChild("cube_r3", + CubeListBuilder + .create() + .texOffs(0, 14) + .addBox(0.0f, 0.0f, -0.5f, 3.0f, 0.0f, 1.0f), + PartPose.offsetAndRotation(0.0f, 0.0f, 0.9f, 0.0f, -0.2182f, 0.3927f) + ); - PartDefinition legsR = modelPartData.addOrReplaceChild(PartNames.RIGHT_LEG, CubeListBuilder.create() - .texOffs(0, 0), - PartPose.offsetAndRotation(-1.5f, 19.9f, -0.55f, - 0.0f, 3.1416f, -0.6545f)); + PartDefinition legsR = modelPartData.addOrReplaceChild(PartNames.RIGHT_LEG, + CubeListBuilder + .create() + .texOffs(0, 0), + PartPose.offsetAndRotation(-1.5f, 19.9f, -0.55f, 0.0f, 3.1416f, -0.6545f) + ); - legsR.addOrReplaceChild("cube_r4", CubeListBuilder.create() - .texOffs(0, 10) - .addBox(0.0f, 0.0f, -0.5f, 3.0f, 0.0f, 1.0f), - PartPose.offsetAndRotation(0.0f, 0.0f, -1.0f, - 0.0f, 0.2182f, 0.3927f)); + legsR.addOrReplaceChild("cube_r4", + CubeListBuilder + .create() + .texOffs(0, 10) + .addBox(0.0f, 0.0f, -0.5f, 3.0f, 0.0f, 1.0f), + PartPose.offsetAndRotation(0.0f, 0.0f, -1.0f, 0.0f, 0.2182f, 0.3927f) + ); - legsR.addOrReplaceChild("cube_r5", CubeListBuilder.create() - .texOffs(0, 11) - .addBox(0.0f, 0.0f, -0.4f, 3.0f, 0.0f, 1.0f), - PartPose.offsetAndRotation(0.5f, 0.1f, -0.05f, - 0.0f, 0.0f, 0.3927f)); + legsR.addOrReplaceChild("cube_r5", + CubeListBuilder + .create() + .texOffs(0, 11) + .addBox(0.0f, 0.0f, -0.4f, 3.0f, 0.0f, 1.0f), + PartPose.offsetAndRotation(0.5f, 0.1f, -0.05f, 0.0f, 0.0f, 0.3927f) + ); - legsR.addOrReplaceChild("cube_r6", CubeListBuilder.create() - .texOffs(0, 12) - .addBox(0.0216f, 0.0f, -0.4024f, 3.0f, 0.0f, 1.0f), - PartPose.offsetAndRotation(0.0f, 0.0f, 0.9f, - 0.0f, -0.2182f, 0.3927f)); + legsR.addOrReplaceChild("cube_r6", + CubeListBuilder + .create() + .texOffs(0, 12) + .addBox(0.0216f, 0.0f, -0.4024f, 3.0f, 0.0f, 1.0f), + PartPose.offsetAndRotation(0.0f, 0.0f, 0.9f, 0.0f, -0.2182f, 0.3927f) + ); - PartDefinition head_pivot = modelPartData.addOrReplaceChild(PartNames.HEAD, CubeListBuilder.create() - .texOffs(15, 10) - .addBox(-1.5f, -1.5f, -2.0f, 3.0f, 3.0f, 3.0f), - PartPose.offset(0.0f, 18.0f, -3.0f)); + PartDefinition head_pivot = modelPartData.addOrReplaceChild(PartNames.HEAD, + CubeListBuilder + .create() + .texOffs(15, 10) + .addBox(-1.5f, -1.5f, -2.0f, 3.0f, 3.0f, 3.0f), + PartPose.offset(0.0f, 18.0f, -3.0f) + ); - head_pivot.addOrReplaceChild("tendril_r_r1", CubeListBuilder.create() - .mirror() - .texOffs(23, 0) - .addBox(-1.5f, -5.0f, 0.0f, 3.0f, 5.0f, 0.0f), - PartPose.offsetAndRotation(1.0f, -1.15f, -1.0f, - 0.0f, 0.0f, 0.3927f)); + head_pivot.addOrReplaceChild("tendril_r_r1", + CubeListBuilder + .create() + .mirror() + .texOffs(23, 0) + .addBox(-1.5f, -5.0f, 0.0f, 3.0f, 5.0f, 0.0f), + PartPose.offsetAndRotation(1.0f, -1.15f, -1.0f, 0.0f, 0.0f, 0.3927f) + ); - head_pivot.addOrReplaceChild("tendril_r_r2", CubeListBuilder.create() - .texOffs(23, 0) - .addBox(-1.5f, -5.0f, 0.0f, 3.0f, 5.0f, 0.0f), - PartPose.offsetAndRotation(-1.0f, -1.15f, -1.0f, - 0.0f, 0.0f, -0.3927f)); + head_pivot.addOrReplaceChild("tendril_r_r2", + CubeListBuilder + .create() + .texOffs(23, 0) + .addBox(-1.5f, -5.0f, 0.0f, 3.0f, 5.0f, 0.0f), + PartPose.offsetAndRotation(-1.0f, -1.15f, -1.0f, 0.0f, 0.0f, -0.3927f) + ); - PartDefinition bb_main = modelPartData.addOrReplaceChild(PartNames.BODY, CubeListBuilder.create() - .texOffs(19, 19) - .addBox(-2.5f, -8.5f, -3.0f, 5.0f, 5.0f, 3.0f), - PartPose.offset(0.0f, 24.0f, 0.0f)); + PartDefinition bb_main = modelPartData.addOrReplaceChild(PartNames.BODY, + CubeListBuilder + .create() + .texOffs(19, 19) + .addBox(-2.5f, -8.5f, -3.0f, 5.0f, 5.0f, 3.0f), + PartPose.offset(0.0f, 24.0f, 0.0f) + ); - bb_main.addOrReplaceChild(PartNames.RIGHT_WING, CubeListBuilder.create() - .mirror() - .texOffs(0, 5) - .addBox(-7.0f, 0.0f, -3.0f, 9.0f, 0.0f, 5.0f), - PartPose.offsetAndRotation(-1.5f, -6.5f, 0.5f, - 0.0f, 0.0f, 0.3927f)); + bb_main.addOrReplaceChild(PartNames.RIGHT_WING, + CubeListBuilder.create() + .mirror() + .texOffs(0, 5) + .addBox(-7.0f, 0.0f, -3.0f, 9.0f, 0.0f, 5.0f), + PartPose.offsetAndRotation(-1.5f, -6.5f, 0.5f, 0.0f, 0.0f, 0.3927f) + ); - bb_main.addOrReplaceChild(PartNames.LEFT_WING, CubeListBuilder.create() - .texOffs(0, 5) - .addBox(-2.0f, 0.0f, -3.0f, 9.0f, 0.0f, 5.0f), - PartPose.offsetAndRotation(1.5f, -6.5f, 0.5f, - 0.0f, 0.0f, -0.3927f)); + bb_main.addOrReplaceChild(PartNames.LEFT_WING, + CubeListBuilder + .create() + .texOffs(0, 5) + .addBox(-2.0f, 0.0f, -3.0f, 9.0f, 0.0f, 5.0f), + PartPose.offsetAndRotation(1.5f, -6.5f, 0.5f, 0.0f, 0.0f, -0.3927f) + ); - bb_main.addOrReplaceChild("abdomen_r1", CubeListBuilder.create() - .texOffs(0, 10) - .addBox(-3.0f, -4.0f, -1.0f, 4.0f, 4.0f, 7.0f), - PartPose.offsetAndRotation(1.0f, -3.9f, 0.0f, - -0.3927f, 0.0f, 0.0f)); + bb_main.addOrReplaceChild("abdomen_r1", + CubeListBuilder + .create() + .texOffs(0, 10) + .addBox(-3.0f, -4.0f, -1.0f, 4.0f, 4.0f, 7.0f), + PartPose.offsetAndRotation(1.0f, -3.9f, 0.0f, -0.3927f, 0.0f, 0.0f) + ); - /*texWidth = 64; - texHeight = 64;*/ - return LayerDefinition.create(modelData, 64, 64); - } + return LayerDefinition.create(modelData, 64, 64); + } - public SilkMothEntityModel(ModelPart modelPart) { - super(RenderType::entityCutout); + public SilkMothEntityModel(ModelPart modelPart) { + super(RenderType::entityCutout); - legsL = modelPart.getChild(PartNames.LEFT_LEG); - cube_r1 = legsL.getChild("cube_r1"); - cube_r2 = legsL.getChild("cube_r2"); - cube_r3 = legsL.getChild("cube_r3"); - legsR = modelPart.getChild(PartNames.RIGHT_LEG); - cube_r4 = legsR.getChild("cube_r4"); - cube_r5 = legsR.getChild("cube_r5"); - cube_r6 = legsR.getChild("cube_r6"); - head_pivot = modelPart.getChild(PartNames.HEAD); - tendril_r_r1 = head_pivot.getChild("tendril_r_r1"); - tendril_r_r2 = head_pivot.getChild("tendril_r_r2"); - bb_main = modelPart.getChild(PartNames.BODY); - wingR_r1 = bb_main.getChild(PartNames.RIGHT_WING); - wingL_r1 = bb_main.getChild(PartNames.LEFT_WING); - abdomen_r1 = bb_main.getChild("abdomen_r1"); + legsL = modelPart.getChild(PartNames.LEFT_LEG); + cube_r1 = legsL.getChild("cube_r1"); + cube_r2 = legsL.getChild("cube_r2"); + cube_r3 = legsL.getChild("cube_r3"); + legsR = modelPart.getChild(PartNames.RIGHT_LEG); + cube_r4 = legsR.getChild("cube_r4"); + cube_r5 = legsR.getChild("cube_r5"); + cube_r6 = legsR.getChild("cube_r6"); + head_pivot = modelPart.getChild(PartNames.HEAD); + tendril_r_r1 = head_pivot.getChild("tendril_r_r1"); + tendril_r_r2 = head_pivot.getChild("tendril_r_r2"); + bb_main = modelPart.getChild(PartNames.BODY); + wingR_r1 = bb_main.getChild(PartNames.RIGHT_WING); + wingL_r1 = bb_main.getChild(PartNames.LEFT_WING); + abdomen_r1 = bb_main.getChild("abdomen_r1"); + } - /*legsL = new ModelPart(this); - legsL.setPos(1.5F, 19.9F, -0.45F); - setRotationAngle(legsL, 0.0F, 0.0F, 0.6981F); + @Override + public void setupAnim(SilkMothEntity entity, float limbAngle, float limbDistance, float animationProgress, float headYaw, float headPitch) { + wingR_r1.zRot = Mth.sin(animationProgress * 2F) * 0.4F + 0.3927F; + wingL_r1.zRot = -wingR_r1.zRot; + head_pivot.xRot = Mth.sin(animationProgress * 0.03F) * 0.1F; + tendril_r_r1.zRot = Mth.sin(animationProgress * 0.07F) * 0.2F + 0.3927F; + tendril_r_r2.zRot = -tendril_r_r1.zRot; + abdomen_r1.xRot = Mth.sin(animationProgress * 0.05F) * 0.1F - 0.3927F; + legsR.zRot = Mth.sin(animationProgress * 0.07F) * 0.1F - 0.6545F; + legsL.zRot = -legsR.zRot; + } - cube_r1 = new ModelPart(this); - cube_r1.setPos(0.0F, 0.0F, -1.0F); - legsL.addChild(cube_r1); - setRotationAngle(cube_r1, 0.0F, 0.2182F, 0.3927F); - cube_r1.texOffs(0, 13).addBox(0.0216F, 0.0F, -0.5976F, 3.0F, 0.0F, 1.0F, 0.0F); - - cube_r2 = new ModelPart(this); - cube_r2.setPos(0.5F, 0.1F, -0.05F); - legsL.addChild(cube_r2); - setRotationAngle(cube_r2, 0.0F, 0.0F, 0.3927F); - cube_r2.texOffs(0, 15).addBox(0.0F, 0.0F, -0.6F, 3.0F, 0.0F, 1.0F, 0.0F); - - cube_r3 = new ModelPart(this); - cube_r3.setPos(0.0F, 0.0F, 0.9F); - legsL.addChild(cube_r3); - setRotationAngle(cube_r3, 0.0F, -0.2182F, 0.3927F); - cube_r3.texOffs(0, 14).addBox(0.0F, 0.0F, -0.5F, 3.0F, 0.0F, 1.0F, 0.0F); - - legsR = new ModelPart(this); - legsR.setPos(-1.5F, 19.9F, -0.55F); - setRotationAngle(legsR, 0.0F, 3.1416F, -0.6545F); - - cube_r4 = new ModelPart(this); - cube_r4.setPos(0.0F, 0.0F, -1.0F); - legsR.addChild(cube_r4); - setRotationAngle(cube_r4, 0.0F, 0.2182F, 0.3927F); - cube_r4.texOffs(0, 10).addBox(0.0F, 0.0F, -0.5F, 3.0F, 0.0F, 1.0F, 0.0F); - - cube_r5 = new ModelPart(this); - cube_r5.setPos(0.5F, 0.1F, -0.05F); - legsR.addChild(cube_r5); - setRotationAngle(cube_r5, 0.0F, 0.0F, 0.3927F); - cube_r5.texOffs(0, 11).addBox(0.0F, 0.0F, -0.4F, 3.0F, 0.0F, 1.0F, 0.0F); - - cube_r6 = new ModelPart(this); - cube_r6.setPos(0.0F, 0.0F, 0.9F); - legsR.addChild(cube_r6); - setRotationAngle(cube_r6, 0.0F, -0.2182F, 0.3927F); - cube_r6.texOffs(0, 12).addBox(0.0216F, 0.0F, -0.4024F, 3.0F, 0.0F, 1.0F, 0.0F); - - head_pivot = new ModelPart(this); - head_pivot.setPos(0.0F, 18.0F, -3.0F); - head_pivot.texOffs(15, 10).addBox(-1.5F, -1.5F, -2.0F, 3.0F, 3.0F, 3.0F, 0.0F); - - tendril_r_r1 = new ModelPart(this); - tendril_r_r1.setPos(1.0F, -1.15F, -1.0F); - head_pivot.addChild(tendril_r_r1); - setRotationAngle(tendril_r_r1, 0.0F, 0.0F, 0.3927F); - tendril_r_r1.texOffs(23, 0).addBox(-1.5F, -5.0F, 0.0F, 3.0F, 5.0F, 0.0F, 0.0F, true); - - tendril_r_r2 = new ModelPart(this); - tendril_r_r2.setPos(-1.0F, -1.15F, -1.0F); - head_pivot.addChild(tendril_r_r2); - setRotationAngle(tendril_r_r2, 0.0F, 0.0F, -0.3927F); - tendril_r_r2.texOffs(23, 0).addBox(-1.5F, -5.0F, 0.0F, 3.0F, 5.0F, 0.0F, 0.0F); - - bb_main = new ModelPart(this); - bb_main.setPos(0.0F, 24.0F, 0.0F); - bb_main.texOffs(19, 19).addBox(-2.5F, -8.5F, -3.0F, 5.0F, 5.0F, 3.0F, 0.0F); - - wingR_r1 = new ModelPart(this); - wingR_r1.setPos(-1.5F, -6.5F, 0.5F); - bb_main.addChild(wingR_r1); - setRotationAngle(wingR_r1, 0.0F, 0.0F, 0.3927F); - wingR_r1.texOffs(0, 5).addBox(-7.0F, 0.0F, -3.0F, 9.0F, 0.0F, 5.0F, 0.0F, true); - - wingL_r1 = new ModelPart(this); - wingL_r1.setPos(1.5F, -6.5F, 0.5F); - bb_main.addChild(wingL_r1); - setRotationAngle(wingL_r1, 0.0F, 0.0F, -0.3927F); - wingL_r1.texOffs(0, 5).addBox(-2.0F, 0.0F, -3.0F, 9.0F, 0.0F, 5.0F, 0.0F); - - abdomen_r1 = new ModelPart(this); - abdomen_r1.setPos(1.0F, -3.9F, 0.0F); - bb_main.addChild(abdomen_r1); - setRotationAngle(abdomen_r1, -0.3927F, 0.0F, 0.0F); - abdomen_r1.texOffs(0, 10).addBox(-3.0F, -4.0F, -1.0F, 4.0F, 4.0F, 7.0F, 0.0F);*/ - } - - @Override - public void setupAnim(SilkMothEntity entity, float limbAngle, float limbDistance, float animationProgress, - float headYaw, float headPitch) { - wingR_r1.zRot = Mth.sin(animationProgress * 2F) * 0.4F + 0.3927F; - wingL_r1.zRot = -wingR_r1.zRot; - head_pivot.xRot = Mth.sin(animationProgress * 0.03F) * 0.1F; - tendril_r_r1.zRot = Mth.sin(animationProgress * 0.07F) * 0.2F + 0.3927F; - tendril_r_r2.zRot = -tendril_r_r1.zRot; - abdomen_r1.xRot = Mth.sin(animationProgress * 0.05F) * 0.1F - 0.3927F; - legsR.zRot = Mth.sin(animationProgress * 0.07F) * 0.1F - 0.6545F; - legsL.zRot = -legsR.zRot; - } - - @Override - public void renderToBuffer(PoseStack matrices, VertexConsumer vertices, int light, int overlay, float red, - float green, float blue, float alpha) { - bb_main.render(matrices, vertices, light, overlay); - head_pivot.render(matrices, vertices, light, overlay); - legsL.render(matrices, vertices, light, overlay); - legsR.render(matrices, vertices, light, overlay); - } + @Override + public void renderToBuffer(PoseStack matrices, VertexConsumer vertices, int light, int overlay, float red, float green, float blue, float alpha) { + bb_main.render(matrices, vertices, light, overlay); + head_pivot.render(matrices, vertices, light, overlay); + legsL.render(matrices, vertices, light, overlay); + legsR.render(matrices, vertices, light, overlay); + } } diff --git a/src/main/java/ru/betterend/entity/render/RendererEntityCubozoa.java b/src/main/java/ru/betterend/entity/render/RendererEntityCubozoa.java index d3358b8d..e04d4082 100644 --- a/src/main/java/ru/betterend/entity/render/RendererEntityCubozoa.java +++ b/src/main/java/ru/betterend/entity/render/RendererEntityCubozoa.java @@ -2,7 +2,6 @@ package ru.betterend.entity.render; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; - import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.entity.EntityRendererProvider; @@ -32,7 +31,7 @@ public class RendererEntityCubozoa extends MobRenderer { - private static final ResourceLocation TEXTURE = BetterEnd.makeID("textures/entity/dragonfly.png"); - private static final RenderType GLOW = RenderType.eyes(BetterEnd.makeID("textures/entity/dragonfly_glow.png")); + private static final ResourceLocation TEXTURE = BetterEnd.makeID("textures/entity/dragonfly.png"); + private static final RenderType GLOW = RenderType.eyes(BetterEnd.makeID("textures/entity/dragonfly_glow.png")); - public RendererEntityDragonfly(EntityRendererProvider.Context ctx) { - super(ctx, new DragonflyEntityModel(ctx.bakeLayer(EndEntitiesRenders.DRAGONFLY_MODEL)), 0.5f); - this.addLayer(new EyesLayer(this) { - @Override - public RenderType renderType() { - return GLOW; - } - }); - } + public RendererEntityDragonfly(EntityRendererProvider.Context ctx) { + super(ctx, new DragonflyEntityModel(ctx.bakeLayer(EndEntitiesRenders.DRAGONFLY_MODEL)), 0.5f); + this.addLayer(new EyesLayer(this) { + @Override + public RenderType renderType() { + return GLOW; + } + }); + } - @Override - public ResourceLocation getTextureLocation(DragonflyEntity entity) { - return TEXTURE; - } + @Override + public ResourceLocation getTextureLocation(DragonflyEntity entity) { + return TEXTURE; + } } \ No newline at end of file diff --git a/src/main/java/ru/betterend/entity/render/RendererEntityEndFish.java b/src/main/java/ru/betterend/entity/render/RendererEntityEndFish.java index 767a3d74..fc8246e7 100644 --- a/src/main/java/ru/betterend/entity/render/RendererEntityEndFish.java +++ b/src/main/java/ru/betterend/entity/render/RendererEntityEndFish.java @@ -2,10 +2,8 @@ package ru.betterend.entity.render; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; - import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; -import net.minecraft.client.renderer.entity.EntityRenderDispatcher; import net.minecraft.client.renderer.entity.EntityRendererProvider; import net.minecraft.client.renderer.entity.MobRenderer; import net.minecraft.client.renderer.entity.layers.EyesLayer; @@ -13,7 +11,6 @@ import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.resources.ResourceLocation; import ru.betterend.BetterEnd; import ru.betterend.entity.EndFishEntity; -import ru.betterend.entity.model.DragonflyEntityModel; import ru.betterend.entity.model.EndFishEntityModel; import ru.betterend.registry.EndEntitiesRenders; @@ -31,8 +28,8 @@ public class RendererEntityEndFish extends MobRenderer> { private static final ResourceLocation TEXTURE[] = new ResourceLocation[4]; @@ -32,8 +32,8 @@ public class RendererEntityEndSlime extends MobRenderer { - private static final ResourceLocation TEXTURE = BetterEnd.makeID("textures/entity/silk_moth.png"); + private static final ResourceLocation TEXTURE = BetterEnd.makeID("textures/entity/silk_moth.png"); - public SilkMothEntityRenderer(EntityRendererProvider.Context ctx) { - super(ctx, new SilkMothEntityModel(ctx.bakeLayer(EndEntitiesRenders.SILK_MOTH_MODEL)), 0.5f); - } + public SilkMothEntityRenderer(EntityRendererProvider.Context ctx) { + super(ctx, new SilkMothEntityModel(ctx.bakeLayer(EndEntitiesRenders.SILK_MOTH_MODEL)), 0.5f); + } - @Override - public ResourceLocation getTextureLocation(SilkMothEntity entity) { - return TEXTURE; - } + @Override + public ResourceLocation getTextureLocation(SilkMothEntity entity) { + return TEXTURE; + } } \ No newline at end of file diff --git a/src/main/java/ru/betterend/events/ItemTooltipCallback.java b/src/main/java/ru/betterend/events/ItemTooltipCallback.java index 3173e5f6..f0a70655 100644 --- a/src/main/java/ru/betterend/events/ItemTooltipCallback.java +++ b/src/main/java/ru/betterend/events/ItemTooltipCallback.java @@ -1,7 +1,5 @@ package ru.betterend.events; -import java.util.List; - import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.event.Event; @@ -11,6 +9,8 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.TooltipFlag; +import java.util.List; + @Environment(EnvType.CLIENT) public interface ItemTooltipCallback { /** diff --git a/src/main/java/ru/betterend/events/PlayerAdvancementsCallback.java b/src/main/java/ru/betterend/events/PlayerAdvancementsCallback.java index 8c6aca1a..29d0f1aa 100644 --- a/src/main/java/ru/betterend/events/PlayerAdvancementsCallback.java +++ b/src/main/java/ru/betterend/events/PlayerAdvancementsCallback.java @@ -6,7 +6,7 @@ import net.minecraft.advancements.Advancement; import net.minecraft.server.level.ServerPlayer; public interface PlayerAdvancementsCallback { - + Event PLAYER_ADVANCEMENT_COMPLETE = EventFactory.createArrayBacked(PlayerAdvancementsCallback.class, callbacks -> (player, advancement, criterionName) -> { for (PlayerAdvancementsCallback event : callbacks) { event.onAdvancementComplete(player, advancement, criterionName); diff --git a/src/main/java/ru/betterend/integration/FlamboyantRefabricatedIntegration.java b/src/main/java/ru/betterend/integration/FlamboyantRefabricatedIntegration.java index c123c9a9..49c56ea1 100644 --- a/src/main/java/ru/betterend/integration/FlamboyantRefabricatedIntegration.java +++ b/src/main/java/ru/betterend/integration/FlamboyantRefabricatedIntegration.java @@ -1,10 +1,6 @@ package ru.betterend.integration; -import java.awt.Color; -import java.util.Map; - import com.google.common.collect.Maps; - import net.minecraft.world.level.ItemLike; import ru.bclib.integration.ModIntegration; import ru.bclib.util.ColorUtil; @@ -12,6 +8,9 @@ import ru.betterend.blocks.HydraluxPetalColoredBlock; import ru.betterend.blocks.complex.ColoredMaterial; import ru.betterend.registry.EndBlocks; +import java.awt.Color; +import java.util.Map; + public class FlamboyantRefabricatedIntegration extends ModIntegration { public FlamboyantRefabricatedIntegration() { super("flamboyant"); @@ -21,7 +20,7 @@ public class FlamboyantRefabricatedIntegration extends ModIntegration { public void init() { Map colors = Maps.newHashMap(); Map dyes = Maps.newHashMap(); - + addColor("fead1d", "amber", colors, dyes); addColor("bd9a5f", "beige", colors, dyes); addColor("edeada", "cream", colors, dyes); @@ -38,15 +37,15 @@ public class FlamboyantRefabricatedIntegration extends ModIntegration { addColor("6bb1cf", "sky_blue", colors, dyes); addColor("6e8c9c", "slate_gray", colors, dyes); addColor("b02454", "violet", colors, dyes); - + new ColoredMaterial(HydraluxPetalColoredBlock::new, EndBlocks.HYDRALUX_PETAL_BLOCK, colors, dyes, true); } - + private void addColor(String hex, String name, Map colors, Map dyes) { int color = ColorUtil.color(hex); colors.put(color, name); dyes.put(color, getItem(name + "_dye")); - + System.out.println(name + " " + color + " " + new Color(color)); } } diff --git a/src/main/java/ru/betterend/integration/Integrations.java b/src/main/java/ru/betterend/integration/Integrations.java index f611af4d..d4a90d55 100644 --- a/src/main/java/ru/betterend/integration/Integrations.java +++ b/src/main/java/ru/betterend/integration/Integrations.java @@ -18,35 +18,35 @@ public class Integrations { public static final ModIntegration BYG = ModIntegrationAPI.register(new BYGIntegration()); public static final ModIntegration NOURISH = ModIntegrationAPI.register(new NourishIntegration()); public static final ModIntegration FLAMBOYANT_REFABRICATED = ModIntegrationAPI.register(new FlamboyantRefabricatedIntegration()); - + private static boolean hasHydrogen; - + public static void init() { if (hasGuideBook()) { GuideBookItem.register(); - + PlayerAdvancementsCallback.PLAYER_ADVANCEMENT_COMPLETE.register((player, advancement, criterionName) -> { ResourceLocation advId = new ResourceLocation("minecraft:end/enter_end_gateway"); if (advId.equals(advancement.getId())) { player.addItem(new ItemStack(GuideBookItem.GUIDE_BOOK)); } }); - + GridRecipe.make(BetterEnd.MOD_ID, "guide_book", GuideBookItem.GUIDE_BOOK) - .checkConfig(Configs.RECIPE_CONFIG) - .setShape("D", "B", "C") - .addMaterial('D', EndItems.ENDER_DUST) - .addMaterial('B', Items.BOOK) - .addMaterial('C', EndItems.CRYSTAL_SHARDS) - .build(); + .checkConfig(Configs.RECIPE_CONFIG) + .setShape("D", "B", "C") + .addMaterial('D', EndItems.ENDER_DUST) + .addMaterial('B', Items.BOOK) + .addMaterial('C', EndItems.CRYSTAL_SHARDS) + .build(); } hasHydrogen = FabricLoader.getInstance().isModLoaded("hydrogen"); } - + public static boolean hasGuideBook() { return FabricLoader.getInstance().isModLoaded("patchouli"); } - + public static boolean hasHydrogen() { return hasHydrogen; } diff --git a/src/main/java/ru/betterend/integration/NourishIntegration.java b/src/main/java/ru/betterend/integration/NourishIntegration.java index 71f6cd47..abed1ced 100644 --- a/src/main/java/ru/betterend/integration/NourishIntegration.java +++ b/src/main/java/ru/betterend/integration/NourishIntegration.java @@ -17,39 +17,39 @@ public class NourishIntegration extends ModIntegration { Tag.Named fruit = getItemTag("fruit"); Tag.Named protein = getItemTag("protein"); Tag.Named sweets = getItemTag("sweets"); - + TagHelper.addTag( - fats, - EndItems.END_FISH_RAW, - EndItems.END_FISH_COOKED + fats, + EndItems.END_FISH_RAW, + EndItems.END_FISH_COOKED ); TagHelper.addTag( - fruit, - EndItems.SHADOW_BERRY_RAW, - EndItems.SHADOW_BERRY_COOKED, - EndItems.BLOSSOM_BERRY, - EndItems.SHADOW_BERRY_JELLY, - EndItems.SWEET_BERRY_JELLY, - EndItems.BLOSSOM_BERRY_JELLY, - EndItems.AMBER_ROOT_RAW, - EndItems.CHORUS_MUSHROOM_RAW, - EndItems.CHORUS_MUSHROOM_COOKED, - EndItems.BOLUX_MUSHROOM_COOKED + fruit, + EndItems.SHADOW_BERRY_RAW, + EndItems.SHADOW_BERRY_COOKED, + EndItems.BLOSSOM_BERRY, + EndItems.SHADOW_BERRY_JELLY, + EndItems.SWEET_BERRY_JELLY, + EndItems.BLOSSOM_BERRY_JELLY, + EndItems.AMBER_ROOT_RAW, + EndItems.CHORUS_MUSHROOM_RAW, + EndItems.CHORUS_MUSHROOM_COOKED, + EndItems.BOLUX_MUSHROOM_COOKED ); TagHelper.addTag( - protein, - EndItems.END_FISH_RAW, - EndItems.END_FISH_COOKED, - EndItems.CHORUS_MUSHROOM_COOKED, - EndItems.BOLUX_MUSHROOM_COOKED, - EndItems.CAVE_PUMPKIN_PIE + protein, + EndItems.END_FISH_RAW, + EndItems.END_FISH_COOKED, + EndItems.CHORUS_MUSHROOM_COOKED, + EndItems.BOLUX_MUSHROOM_COOKED, + EndItems.CAVE_PUMPKIN_PIE ); TagHelper.addTag( - sweets, - EndItems.SHADOW_BERRY_JELLY, - EndItems.SWEET_BERRY_JELLY, - EndItems.BLOSSOM_BERRY_JELLY, - EndItems.CAVE_PUMPKIN_PIE + sweets, + EndItems.SHADOW_BERRY_JELLY, + EndItems.SWEET_BERRY_JELLY, + EndItems.BLOSSOM_BERRY_JELLY, + EndItems.CAVE_PUMPKIN_PIE ); } } diff --git a/src/main/java/ru/betterend/integration/byg/BYGBlocks.java b/src/main/java/ru/betterend/integration/byg/BYGBlocks.java index 18ceff7a..7107e62a 100644 --- a/src/main/java/ru/betterend/integration/byg/BYGBlocks.java +++ b/src/main/java/ru/betterend/integration/byg/BYGBlocks.java @@ -8,8 +8,9 @@ import ru.betterend.registry.EndBlocks; public class BYGBlocks { public static final Block IVIS_MOSS = EndBlocks.registerBlock("ivis_moss", new EndWallPlantBlock()); public static final Block NIGHTSHADE_MOSS = EndBlocks.registerBlock("nightshade_moss", new EndWallPlantBlock()); - + public static final Block IVIS_VINE = EndBlocks.registerBlock("ivis_vine", new BaseVineBlock()); - - public static void register() {} + + public static void register() { + } } diff --git a/src/main/java/ru/betterend/integration/byg/BYGIntegration.java b/src/main/java/ru/betterend/integration/byg/BYGIntegration.java index 845c63e4..c9e1fbd6 100644 --- a/src/main/java/ru/betterend/integration/byg/BYGIntegration.java +++ b/src/main/java/ru/betterend/integration/byg/BYGIntegration.java @@ -1,8 +1,5 @@ package ru.betterend.integration.byg; -import java.util.List; -import java.util.stream.Collectors; - import net.minecraft.data.BuiltinRegistries; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.ai.behavior.ShufflingList; @@ -19,6 +16,9 @@ import ru.betterend.integration.byg.biomes.BYGBiomes; import ru.betterend.integration.byg.features.BYGFeatures; import ru.betterend.registry.EndBiomes; +import java.util.List; +import java.util.stream.Collectors; + public class BYGIntegration extends ModIntegration implements EndBiomeIntegration { public BYGIntegration() { super("byg"); @@ -38,10 +38,10 @@ public class BYGIntegration extends ModIntegration implements EndBiomeIntegratio @Override public void addBiomes() { BYGBiomes.addBiomes(); - + Class biomeClass = this.getClass("corgiaoc.byg.common.world.biome.BYGEndBiome"); List biomes = this.getStaticFieldValue(biomeClass, "BYG_END_BIOMES"); - + if (biomes != null && biomeClass != null) { biomes.forEach((obj) -> { Biome biome = this.getAndExecuteRuntime(biomeClass, obj, "getBiome"); diff --git a/src/main/java/ru/betterend/integration/byg/biomes/BYGBiomes.java b/src/main/java/ru/betterend/integration/byg/biomes/BYGBiomes.java index 013afbe9..06bc218e 100644 --- a/src/main/java/ru/betterend/integration/byg/biomes/BYGBiomes.java +++ b/src/main/java/ru/betterend/integration/byg/biomes/BYGBiomes.java @@ -9,11 +9,11 @@ public class BYGBiomes { public static final EndBiome OLD_BULBIS_GARDENS = EndBiomes.registerSubBiomeIntegration(new OldBulbisGardens()); public static final EndBiome NIGHTSHADE_REDWOODS = EndBiomes.registerSubBiomeIntegration(new NightshadeRedwoods()); //public static final EndBiome ETHERIAL_GROVE = EndBiomes.registerSubBiomeIntegration(new EterialGrove()); - + public static void register() { System.out.println("Registered " + OLD_BULBIS_GARDENS); } - + public static void addBiomes() { EndBiomes.addSubBiomeIntegration(OLD_BULBIS_GARDENS, Integrations.BYG.getID("bulbis_gardens")); EndBiomes.addSubBiomeIntegration(NIGHTSHADE_REDWOODS, Integrations.BYG.getID("nightshade_forest")); diff --git a/src/main/java/ru/betterend/integration/byg/biomes/NightshadeRedwoods.java b/src/main/java/ru/betterend/integration/byg/biomes/NightshadeRedwoods.java index 1dea5e1f..e99863a3 100644 --- a/src/main/java/ru/betterend/integration/byg/biomes/NightshadeRedwoods.java +++ b/src/main/java/ru/betterend/integration/byg/biomes/NightshadeRedwoods.java @@ -1,7 +1,5 @@ package ru.betterend.integration.byg.biomes; -import java.util.List; - import net.minecraft.core.particles.ParticleTypes; import net.minecraft.sounds.SoundEvent; import net.minecraft.world.entity.MobCategory; @@ -17,15 +15,17 @@ import ru.betterend.integration.byg.features.BYGFeatures; import ru.betterend.registry.EndFeatures; import ru.betterend.world.biome.EndBiome; +import java.util.List; + public class NightshadeRedwoods extends EndBiome { public NightshadeRedwoods() { super(makeDef()); } - + private static BCLBiomeDef makeDef() { Biome biome = Integrations.BYG.getBiome("nightshade_forest"); BiomeSpecialEffects effects = biome.getSpecialEffects(); - + BCLBiomeDef def = new BCLBiomeDef(BetterEnd.makeID("nightshade_redwoods")) .setFogColor(140, 108, 47) .setFogDensity(1.5F) @@ -39,7 +39,7 @@ public class NightshadeRedwoods extends EndBiome { .addFeature(BYGFeatures.NIGHTSHADE_REDWOOD_TREE) .addFeature(BYGFeatures.NIGHTSHADE_MOSS_WOOD) .addFeature(BYGFeatures.NIGHTSHADE_MOSS); - + if (BCLib.isClient()) { SoundEvent loop = effects.getAmbientLoopSoundEvent().get(); SoundEvent music = effects.getBackgroundMusic().get().getEvent(); @@ -52,14 +52,14 @@ public class NightshadeRedwoods extends EndBiome { def.addFeature(Decoration.VEGETAL_DECORATION, feature.get()); }); }); - - for (MobCategory group: MobCategory.values()) { + + for (MobCategory group : MobCategory.values()) { List list = biome.getMobSettings().getMobs(group).unwrap(); list.forEach((entry) -> { def.addMobSpawn(entry); }); } - + return def; } } diff --git a/src/main/java/ru/betterend/integration/byg/biomes/OldBulbisGardens.java b/src/main/java/ru/betterend/integration/byg/biomes/OldBulbisGardens.java index acea5a96..04b11ddd 100644 --- a/src/main/java/ru/betterend/integration/byg/biomes/OldBulbisGardens.java +++ b/src/main/java/ru/betterend/integration/byg/biomes/OldBulbisGardens.java @@ -1,8 +1,5 @@ package ru.betterend.integration.byg.biomes; -import java.util.List; -import java.util.function.Supplier; - import net.minecraft.core.Registry; import net.minecraft.core.particles.ParticleTypes; import net.minecraft.data.BuiltinRegistries; @@ -16,7 +13,6 @@ import net.minecraft.world.level.biome.MobSpawnSettings.SpawnerData; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.levelgen.GenerationStep.Decoration; import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; -import net.minecraft.world.level.levelgen.feature.Feature; import net.minecraft.world.level.levelgen.placement.ConfiguredDecorator; import ru.bclib.BCLib; import ru.bclib.world.biomes.BCLBiomeDef; @@ -26,7 +22,10 @@ import ru.betterend.integration.byg.features.BYGFeatures; import ru.betterend.registry.EndFeatures; import ru.betterend.world.biome.EndBiome; -class FeaturesAccesor extends Features{ +import java.util.List; +import java.util.function.Supplier; + +class FeaturesAccesor extends Features { static ConfiguredDecorator shadowHEIGHTMAP_SQUARE; static { @@ -38,11 +37,11 @@ public class OldBulbisGardens extends EndBiome { public OldBulbisGardens() { super(makeDef()); } - + private static BCLBiomeDef makeDef() { Biome biome = Integrations.BYG.getBiome("bulbis_gardens"); BiomeSpecialEffects effects = biome.getSpecialEffects(); - + Block ivis = Integrations.BYG.getBlock("ivis_phylium"); Block origin = biome.getGenerationSettings().getSurfaceBuilderConfig().getTopMaterial().getBlock(); BCLBiomeDef def = new BCLBiomeDef(BetterEnd.makeID("old_bulbis_gardens")) @@ -54,7 +53,7 @@ public class OldBulbisGardens extends EndBiome { .setSurface(ivis, origin) .addFeature(EndFeatures.END_LAKE_RARE) .addFeature(BYGFeatures.OLD_BULBIS_TREE); - + if (BCLib.isClient()) { SoundEvent loop = effects.getAmbientLoopSoundEvent().get(); SoundEvent music = effects.getBackgroundMusic().get().getEvent(); @@ -62,14 +61,14 @@ public class OldBulbisGardens extends EndBiome { SoundEvent mood = effects.getAmbientMoodSettings().get().getSoundEvent(); def.setLoop(loop).setMusic(music).setAdditions(additions).setMood(mood); } - - for (MobCategory group: MobCategory.values()) { + + for (MobCategory group : MobCategory.values()) { List list = biome.getMobSettings().getMobs(group).unwrap(); list.forEach((entry) -> { def.addMobSpawn(entry); }); } - + List>>> features = biome.getGenerationSettings().features(); List>> vegetal = features.get(Decoration.VEGETAL_DECORATION.ordinal()); if (vegetal.size() > 2) { @@ -90,13 +89,13 @@ public class OldBulbisGardens extends EndBiome { def.addFeature(Decoration.VEGETAL_DECORATION, feature); } } - + def.addFeature(EndFeatures.PURPLE_POLYPORE) - .addFeature(BYGFeatures.IVIS_MOSS_WOOD) - .addFeature(BYGFeatures.IVIS_MOSS) - .addFeature(BYGFeatures.IVIS_VINE) - .addFeature(BYGFeatures.IVIS_SPROUT); - + .addFeature(BYGFeatures.IVIS_MOSS_WOOD) + .addFeature(BYGFeatures.IVIS_MOSS) + .addFeature(BYGFeatures.IVIS_VINE) + .addFeature(BYGFeatures.IVIS_SPROUT); + return def; } } diff --git a/src/main/java/ru/betterend/integration/byg/features/BYGFeatures.java b/src/main/java/ru/betterend/integration/byg/features/BYGFeatures.java index 1a906683..7d1cb873 100644 --- a/src/main/java/ru/betterend/integration/byg/features/BYGFeatures.java +++ b/src/main/java/ru/betterend/integration/byg/features/BYGFeatures.java @@ -19,12 +19,13 @@ public class BYGFeatures { public static final BCLFeature IVIS_MOSS_WOOD = redisterVegetation("ivis_moss_wood", new WallPlantOnLogFeature(BYGBlocks.IVIS_MOSS, 6), 15); public static final BCLFeature NIGHTSHADE_MOSS = redisterVegetation("nightshade_moss", new WallPlantFeature(BYGBlocks.NIGHTSHADE_MOSS, 5), 2); public static final BCLFeature NIGHTSHADE_MOSS_WOOD = redisterVegetation("nightshade_moss_wood", new WallPlantOnLogFeature(BYGBlocks.NIGHTSHADE_MOSS, 5), 8); - + public static final BCLFeature NIGHTSHADE_REDWOOD_TREE = redisterVegetation("nightshade_redwood_tree", new NightshadeRedwoodTreeFeature(), 1); public static final BCLFeature BIG_ETHER_TREE = redisterVegetation("big_ether_tree", new BigEtherTreeFeature(), 1); - - public static void register() {} - + + public static void register() { + } + private static BCLFeature redisterVegetation(String name, Feature feature, int density) { return BCLFeature.makeVegetationFeature(BetterEnd.makeID(name), feature, density); } diff --git a/src/main/java/ru/betterend/integration/byg/features/BigEtherTreeFeature.java b/src/main/java/ru/betterend/integration/byg/features/BigEtherTreeFeature.java index 83ccf491..8d6e4dab 100644 --- a/src/main/java/ru/betterend/integration/byg/features/BigEtherTreeFeature.java +++ b/src/main/java/ru/betterend/integration/byg/features/BigEtherTreeFeature.java @@ -1,15 +1,10 @@ package ru.betterend.integration.byg.features; -import java.util.List; -import java.util.Random; - import com.google.common.base.Function; import com.mojang.math.Vector3f; - import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; @@ -20,6 +15,9 @@ import ru.bclib.util.SplineHelper; import ru.bclib.world.features.DefaultFeature; import ru.betterend.integration.Integrations; +import java.util.List; +import java.util.Random; + public class BigEtherTreeFeature extends DefaultFeature { @Override public boolean place(FeaturePlaceContext featureConfig) { diff --git a/src/main/java/ru/betterend/integration/byg/features/NightshadeRedwoodTreeFeature.java b/src/main/java/ru/betterend/integration/byg/features/NightshadeRedwoodTreeFeature.java index 2ae7f845..dd8ba4ff 100644 --- a/src/main/java/ru/betterend/integration/byg/features/NightshadeRedwoodTreeFeature.java +++ b/src/main/java/ru/betterend/integration/byg/features/NightshadeRedwoodTreeFeature.java @@ -1,12 +1,8 @@ package ru.betterend.integration.byg.features; -import java.util.List; -import java.util.Random; - import com.google.common.base.Function; import com.google.common.collect.Lists; import com.mojang.math.Vector3f; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; @@ -14,7 +10,6 @@ import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.LeavesBlock; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; @@ -32,6 +27,9 @@ import ru.bclib.util.SplineHelper; import ru.bclib.world.features.DefaultFeature; import ru.betterend.integration.Integrations; +import java.util.List; +import java.util.Random; + public class NightshadeRedwoodTreeFeature extends DefaultFeature { private static final List BRANCH; diff --git a/src/main/java/ru/betterend/integration/byg/features/OldBulbisTreeFeature.java b/src/main/java/ru/betterend/integration/byg/features/OldBulbisTreeFeature.java index 1d4c7999..1f2b5cae 100644 --- a/src/main/java/ru/betterend/integration/byg/features/OldBulbisTreeFeature.java +++ b/src/main/java/ru/betterend/integration/byg/features/OldBulbisTreeFeature.java @@ -1,18 +1,12 @@ package ru.betterend.integration.byg.features; -import java.util.List; -import java.util.Random; -import java.util.function.Function; - import com.google.common.collect.Lists; import com.mojang.math.Vector3f; - import net.minecraft.core.BlockPos; import net.minecraft.util.Mth; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; @@ -30,6 +24,10 @@ import ru.bclib.world.features.DefaultFeature; import ru.betterend.integration.Integrations; import ru.betterend.noise.OpenSimplexNoise; +import java.util.List; +import java.util.Random; +import java.util.function.Function; + public class OldBulbisTreeFeature extends DefaultFeature { private static final List SPLINE; private static final List ROOT; @@ -104,7 +102,7 @@ public class OldBulbisTreeFeature extends DefaultFeature { } private void bigSphere(WorldGenLevel world, BlockPos pos, float radius, BlockState cap, BlockState glow, - BlockState wood, Function replacement, Random random) { + BlockState wood, Function replacement, Random random) { OpenSimplexNoise noise = new OpenSimplexNoise(random.nextLong()); SDF sphere = new SDFSphere().setRadius(radius).setBlock(cap); @@ -152,7 +150,7 @@ public class OldBulbisTreeFeature extends DefaultFeature { } private void makeRoots(WorldGenLevel world, BlockPos pos, float radius, Random random, BlockState wood, - Function replacement) { + Function replacement) { int count = (int) (radius * 1.5F); for (int i = 0; i < count; i++) { float angle = (float) i / (float) count * MHelper.PI2; diff --git a/src/main/java/ru/betterend/integration/rei/REIAlloyingCategory.java b/src/main/java/ru/betterend/integration/rei/REIAlloyingCategory.java index 0b11a5f8..369037e9 100644 --- a/src/main/java/ru/betterend/integration/rei/REIAlloyingCategory.java +++ b/src/main/java/ru/betterend/integration/rei/REIAlloyingCategory.java @@ -11,11 +11,9 @@ import me.shedaniel.rei.api.client.registry.display.TransferDisplayCategory; import me.shedaniel.rei.api.common.category.CategoryIdentifier; import me.shedaniel.rei.api.common.entry.EntryIngredient; import me.shedaniel.rei.api.common.entry.EntryStack; -import me.shedaniel.rei.api.common.util.EntryStacks; import net.minecraft.client.gui.GuiComponent; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.TranslatableComponent; -import net.minecraft.world.item.Items; import org.jetbrains.annotations.NotNull; import ru.betterend.registry.EndBlocks; @@ -24,7 +22,8 @@ import java.util.List; public class REIAlloyingCategory implements TransferDisplayCategory { private final EntryStack ICON; - REIAlloyingCategory(EntryStack icon){ + + REIAlloyingCategory(EntryStack icon) { ICON = icon; } @@ -37,12 +36,12 @@ public class REIAlloyingCategory implements TransferDisplayCategory setupDisplay(REIAlloyingDisplay display, Rectangle bounds) { Point startPoint = new Point(bounds.getCenterX() - 41, bounds.y + 10); @@ -59,7 +58,8 @@ public class REIAlloyingCategory implements TransferDisplayCategory 1) { widgets.add(Widgets.createSlot(new Point(startPoint.x + 1, startPoint.y + 1)).entries(inputEntries.get(1)).markInput()); - } else { + } + else { widgets.add(Widgets.createSlot(new Point(startPoint.x + 1, startPoint.y + 1)).entries(Lists.newArrayList()).markInput()); } widgets.add(Widgets.createSlot(new Point(startPoint.x + 61, startPoint.y + 9)).entries(display.getOutputEntries().get(0)).disableBackground().markOutput()); @@ -68,7 +68,7 @@ public class REIAlloyingCategory implements TransferDisplayCategory widgets, Rectangle bounds, REIAlloyingDisplay display, - IntList redSlots) { + IntList redSlots) { Point startPoint = new Point(bounds.getCenterX() - 41, bounds.getCenterY() - 27); matrices.pushPose(); matrices.translate(0, 0, 400); @@ -78,7 +78,7 @@ public class REIAlloyingCategory implements TransferDisplayCategory fuel; - + private Recipe recipe; private float xp; private double smeltTime; - public REIAlloyingDisplay(AlloyingRecipe recipe) { this(recipe, recipe.getExperience(), recipe.getSmeltTime()); } + protected REIAlloyingDisplay(Recipe recipe, float xp, double smeltTime) { super( EntryIngredients.ofIngredients(recipe.getIngredients()), @@ -48,7 +47,7 @@ public class REIAlloyingDisplay extends BasicDisplay implements SimpleGridMenuDi public static List getFuel() { return fuel; } - + @Override public @NotNull Optional getDisplayLocation() { return Optional.ofNullable(recipe).map(Recipe::getId); @@ -58,20 +57,20 @@ public class REIAlloyingDisplay extends BasicDisplay implements SimpleGridMenuDi public CategoryIdentifier getCategoryIdentifier() { return REIPlugin.ALLOYING; } - + // @Override // public @NotNull List> getRequiredEntries() { // return this.input; // } - + public float getXp() { return this.xp; } - + public double getSmeltTime() { return this.smeltTime; } - + public Optional> getOptionalRecipe() { return Optional.ofNullable(recipe); } @@ -90,7 +89,7 @@ public class REIAlloyingDisplay extends BasicDisplay implements SimpleGridMenuDi // public List> getOrganisedInputEntries(ContainerInfo containerInfo, AbstractContainerMenu container) { // return this.input; // } - + static { fuel = EndStoneSmelterBlockEntity.availableFuels().keySet().stream() .map(Item::getDefaultInstance).map(EntryStacks::of) diff --git a/src/main/java/ru/betterend/integration/rei/REIAnvilCategory.java b/src/main/java/ru/betterend/integration/rei/REIAnvilCategory.java index 92456f5a..6be1b8ab 100644 --- a/src/main/java/ru/betterend/integration/rei/REIAnvilCategory.java +++ b/src/main/java/ru/betterend/integration/rei/REIAnvilCategory.java @@ -11,13 +11,11 @@ import me.shedaniel.rei.api.client.registry.display.TransferDisplayCategory; import me.shedaniel.rei.api.common.category.CategoryIdentifier; import me.shedaniel.rei.api.common.entry.EntryIngredient; import me.shedaniel.rei.api.common.entry.EntryStack; -import me.shedaniel.rei.api.common.util.EntryStacks; import net.minecraft.client.gui.GuiComponent; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.TranslatableComponent; import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.Items; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; import org.jetbrains.annotations.NotNull; @@ -30,7 +28,7 @@ import java.util.stream.Collectors; public class REIAnvilCategory implements TransferDisplayCategory { private final EntryStack[] ANVILS; - REIAnvilCategory(EntryStack[] anvils){ + REIAnvilCategory(EntryStack[] anvils) { ANVILS = anvils; } @@ -49,7 +47,7 @@ public class REIAnvilCategory implements TransferDisplayCategory setupDisplay(REIAnvilDisplay display, Rectangle bounds) { Point startPoint = new Point(bounds.getCenterX() - 41, bounds.y + 10); @@ -63,7 +61,7 @@ public class REIAnvilCategory implements TransferDisplayCategory { Object value = anvil.getValue(); - if (value instanceof ItemStack){ + if (value instanceof ItemStack) { value = ((ItemStack) value).getItem(); } Block block = ((BlockItem) value).getBlock(); @@ -86,7 +84,7 @@ public class REIAnvilCategory implements TransferDisplayCategory widgets, Rectangle bounds, REIAnvilDisplay display, - IntList redSlots) { + IntList redSlots) { Point startPoint = new Point(bounds.getCenterX() - 41, bounds.getCenterY() - 27); matrices.pushPose(); matrices.translate(0, 0, 400); @@ -96,7 +94,7 @@ public class REIAnvilCategory implements TransferDisplayCategory getCategoryIdentifier() { return REIPlugin.SMITHING; } - + // @Override // public @NotNull List> getRequiredEntries() { // return input; diff --git a/src/main/java/ru/betterend/integration/rei/REIBlastingDisplay.java b/src/main/java/ru/betterend/integration/rei/REIBlastingDisplay.java index 3dc0fc5d..5a133156 100644 --- a/src/main/java/ru/betterend/integration/rei/REIBlastingDisplay.java +++ b/src/main/java/ru/betterend/integration/rei/REIBlastingDisplay.java @@ -1,10 +1,9 @@ package ru.betterend.integration.rei; import net.minecraft.world.item.crafting.BlastingRecipe; -import ru.betterend.recipe.builders.AlloyingRecipe; -public class REIBlastingDisplay extends REIAlloyingDisplay{ - public REIBlastingDisplay(BlastingRecipe recipe) { - super(recipe, recipe.getExperience(), recipe.getCookingTime()); - } +public class REIBlastingDisplay extends REIAlloyingDisplay { + public REIBlastingDisplay(BlastingRecipe recipe) { + super(recipe, recipe.getExperience(), recipe.getCookingTime()); + } } diff --git a/src/main/java/ru/betterend/integration/rei/REIContainer.java b/src/main/java/ru/betterend/integration/rei/REIContainer.java index 3b9c7299..47bfa4e8 100644 --- a/src/main/java/ru/betterend/integration/rei/REIContainer.java +++ b/src/main/java/ru/betterend/integration/rei/REIContainer.java @@ -1,8 +1,5 @@ package ru.betterend.integration.rei; -import ru.betterend.client.gui.EndStoneSmelterScreenHandler; -import ru.betterend.recipe.builders.AlloyingRecipe; - public class REIContainer implements Runnable { @Override diff --git a/src/main/java/ru/betterend/integration/rei/REIInfusionCategory.java b/src/main/java/ru/betterend/integration/rei/REIInfusionCategory.java index 1ab786a7..f974e304 100644 --- a/src/main/java/ru/betterend/integration/rei/REIInfusionCategory.java +++ b/src/main/java/ru/betterend/integration/rei/REIInfusionCategory.java @@ -11,11 +11,9 @@ import me.shedaniel.rei.api.client.registry.display.TransferDisplayCategory; import me.shedaniel.rei.api.common.category.CategoryIdentifier; import me.shedaniel.rei.api.common.entry.EntryIngredient; import me.shedaniel.rei.api.common.entry.EntryStack; -import me.shedaniel.rei.api.common.util.EntryStacks; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.TranslatableComponent; import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.item.Items; import org.jetbrains.annotations.NotNull; import ru.betterend.BetterEnd; import ru.betterend.registry.EndBlocks; @@ -23,11 +21,11 @@ import ru.betterend.registry.EndBlocks; import java.util.List; public class REIInfusionCategory implements TransferDisplayCategory { - + private final static ResourceLocation BACKGROUND = BetterEnd.makeID("textures/gui/rei_infusion.png"); private final EntryStack ICON; - REIInfusionCategory(EntryStack icon){ + REIInfusionCategory(EntryStack icon) { ICON = icon; } @@ -40,13 +38,13 @@ public class REIInfusionCategory implements TransferDisplayCategory setupDisplay(REIInfusionDisplay display, Rectangle bounds) { Point centerPoint = new Point(bounds.getCenterX() - 34, bounds.getCenterY() - 2); @@ -69,7 +67,7 @@ public class REIInfusionCategory implements TransferDisplayCategory getDisplayLocation() { return Optional.ofNullable(recipe).map(Recipe::getId); @@ -39,7 +39,7 @@ public class REIInfusionDisplay extends BasicDisplay implements SimpleGridMenuDi public CategoryIdentifier getCategoryIdentifier() { return REIPlugin.INFUSION; } - + // @Override // public @NotNull List> getRequiredEntries() { // return this.input; diff --git a/src/main/java/ru/betterend/integration/rei/REIPlugin.java b/src/main/java/ru/betterend/integration/rei/REIPlugin.java index 190c9c8a..c3330b46 100644 --- a/src/main/java/ru/betterend/integration/rei/REIPlugin.java +++ b/src/main/java/ru/betterend/integration/rei/REIPlugin.java @@ -7,22 +7,14 @@ import me.shedaniel.rei.api.client.registry.display.DisplayRegistry; import me.shedaniel.rei.api.common.category.CategoryIdentifier; import me.shedaniel.rei.api.common.entry.EntryIngredient; import me.shedaniel.rei.api.common.entry.EntryStack; -import me.shedaniel.rei.api.common.entry.type.EntryType; import me.shedaniel.rei.api.common.util.EntryIngredients; import me.shedaniel.rei.api.common.util.EntryStacks; -import me.shedaniel.rei.impl.ClientInternals; -import me.shedaniel.rei.impl.Internals; import me.shedaniel.rei.plugin.common.DefaultPlugin; -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; import net.fabricmc.fabric.impl.content.registry.FuelRegistryImpl; import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.Items; import net.minecraft.world.item.crafting.BlastingRecipe; import net.minecraft.world.item.crafting.RecipeType; import net.minecraft.world.level.block.Blocks; -import org.jetbrains.annotations.ApiStatus; import ru.bclib.blocks.BaseFurnaceBlock; import ru.betterend.BetterEnd; import ru.betterend.blocks.basis.EndAnvilBlock; @@ -30,18 +22,15 @@ import ru.betterend.recipe.builders.AlloyingRecipe; import ru.betterend.recipe.builders.AnvilRecipe; import ru.betterend.recipe.builders.InfusionRecipe; import ru.betterend.registry.EndBlocks; -import ru.betterend.registry.EndItems; -import ru.betterend.registry.EndPortals; import java.util.Arrays; import java.util.List; -import java.util.function.Supplier; import java.util.stream.Collectors; //https://github.com/shedaniel/RoughlyEnoughItems/blob/6.x-1.17/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/DefaultClientPlugin.java public class REIPlugin implements REIClientPlugin { public final static ResourceLocation PLUGIN_ID = BetterEnd.makeID("rei_plugin"); - public final static CategoryIdentifier ALLOYING_FUEL = CategoryIdentifier.of(BetterEnd.MOD_ID, "alloying_fuel"); + public final static CategoryIdentifier ALLOYING_FUEL = CategoryIdentifier.of(BetterEnd.MOD_ID, "alloying_fuel"); public final static CategoryIdentifier ALLOYING = AlloyingRecipe.ID; public final static CategoryIdentifier SMITHING = CategoryIdentifier.of(BetterEnd.MOD_ID, AnvilRecipe.ID.getPath()); public final static CategoryIdentifier INFUSION = InfusionRecipe.ID; @@ -51,10 +40,10 @@ public class REIPlugin implements REIClientPlugin { private EntryStack[] ANVILS; private EntryStack[] FURNACES; - void init(){ + void init() { //we need to initialize those variables after the static initialization //otherwise the registry does not know the BlockItems - if (END_STONE_SMELTER!=null) { + if (END_STONE_SMELTER != null) { return; } @@ -78,18 +67,18 @@ public class REIPlugin implements REIClientPlugin { registry.registerRecipeFiller(AnvilRecipe.class, AnvilRecipe.TYPE, REIAnvilDisplay::new); registry.registerRecipeFiller(InfusionRecipe.class, InfusionRecipe.TYPE, REIInfusionDisplay::new); - FuelRegistryImpl.INSTANCE.getFuelTimes().forEach((item, time) -> { + FuelRegistryImpl.INSTANCE.getFuelTimes().forEach((item, time) -> { if (time >= 2000) { final List list = Arrays.asList(EntryIngredients.of(item)); registry.add(new REIAlloyingFuelDisplay(list, time)); } }); } - + @Override public void registerCategories(CategoryRegistry registry) { init(); - + registry.add( new REIAlloyingFuelCategory(), new REIAlloyingCategory(END_STONE_SMELTER), diff --git a/src/main/java/ru/betterend/interfaces/AnvilScreenHandlerExtended.java b/src/main/java/ru/betterend/interfaces/AnvilScreenHandlerExtended.java index 9146ab8e..33a02de5 100644 --- a/src/main/java/ru/betterend/interfaces/AnvilScreenHandlerExtended.java +++ b/src/main/java/ru/betterend/interfaces/AnvilScreenHandlerExtended.java @@ -1,14 +1,16 @@ package ru.betterend.interfaces; -import java.util.List; - import ru.betterend.recipe.builders.AnvilRecipe; +import java.util.List; + public interface AnvilScreenHandlerExtended { void be_updateCurrentRecipe(AnvilRecipe recipe); + AnvilRecipe be_getCurrentRecipe(); + List be_getRecipes(); - + default void be_nextRecipe() { List recipes = be_getRecipes(); if (recipes.size() < 2) return; @@ -19,7 +21,7 @@ public interface AnvilScreenHandlerExtended { } be_updateCurrentRecipe(recipes.get(i)); } - + default void be_previousRecipe() { List recipes = be_getRecipes(); if (recipes.size() < 2) return; diff --git a/src/main/java/ru/betterend/interfaces/BetterEndRecipe.java b/src/main/java/ru/betterend/interfaces/BetterEndRecipe.java index 9f939661..d75eeaae 100644 --- a/src/main/java/ru/betterend/interfaces/BetterEndRecipe.java +++ b/src/main/java/ru/betterend/interfaces/BetterEndRecipe.java @@ -1,3 +1,4 @@ package ru.betterend.interfaces; -public interface BetterEndRecipe {} +public interface BetterEndRecipe { +} diff --git a/src/main/java/ru/betterend/interfaces/FallFlyingItem.java b/src/main/java/ru/betterend/interfaces/FallFlyingItem.java index e75888d7..ea1451f2 100644 --- a/src/main/java/ru/betterend/interfaces/FallFlyingItem.java +++ b/src/main/java/ru/betterend/interfaces/FallFlyingItem.java @@ -4,5 +4,6 @@ import net.minecraft.resources.ResourceLocation; public interface FallFlyingItem { ResourceLocation getModelTexture(); + double getMovementFactor(); } diff --git a/src/main/java/ru/betterend/interfaces/IBiomeList.java b/src/main/java/ru/betterend/interfaces/IBiomeList.java index 4dbbfde4..a1a1047f 100644 --- a/src/main/java/ru/betterend/interfaces/IBiomeList.java +++ b/src/main/java/ru/betterend/interfaces/IBiomeList.java @@ -1,10 +1,10 @@ package ru.betterend.interfaces; -import java.util.List; - import net.minecraft.resources.ResourceKey; import net.minecraft.world.level.biome.Biome; +import java.util.List; + public interface IBiomeList { public List> getBiomes(); } diff --git a/src/main/java/ru/betterend/interfaces/ISlime.java b/src/main/java/ru/betterend/interfaces/ISlime.java index 3994ad34..af7cb878 100644 --- a/src/main/java/ru/betterend/interfaces/ISlime.java +++ b/src/main/java/ru/betterend/interfaces/ISlime.java @@ -4,5 +4,6 @@ import net.minecraft.world.entity.Entity; public interface ISlime { public void be_setSlimeSize(int size, boolean heal); + void entityRemove(Entity.RemovalReason removalReason); } diff --git a/src/main/java/ru/betterend/interfaces/TeleportingEntity.java b/src/main/java/ru/betterend/interfaces/TeleportingEntity.java index cfd23f30..40b20dda 100644 --- a/src/main/java/ru/betterend/interfaces/TeleportingEntity.java +++ b/src/main/java/ru/betterend/interfaces/TeleportingEntity.java @@ -4,6 +4,8 @@ import net.minecraft.core.BlockPos; public interface TeleportingEntity { void be_setExitPos(BlockPos pos); + void be_resetExitPos(); + boolean be_canTeleport(); } diff --git a/src/main/java/ru/betterend/item/CrystaliteBoots.java b/src/main/java/ru/betterend/item/CrystaliteBoots.java index 1b84601e..ee7b032f 100644 --- a/src/main/java/ru/betterend/item/CrystaliteBoots.java +++ b/src/main/java/ru/betterend/item/CrystaliteBoots.java @@ -1,9 +1,5 @@ package ru.betterend.item; -import java.util.List; - -import org.jetbrains.annotations.Nullable; - import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.network.chat.Component; @@ -15,10 +11,13 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Rarity; import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.level.Level; +import org.jetbrains.annotations.Nullable; import ru.betterend.effects.EndStatusEffects; import ru.betterend.interfaces.MobEffectApplier; import ru.betterend.registry.EndItems; +import java.util.List; + public class CrystaliteBoots extends CrystaliteArmor implements MobEffectApplier { public CrystaliteBoots() { diff --git a/src/main/java/ru/betterend/item/CrystaliteChestplate.java b/src/main/java/ru/betterend/item/CrystaliteChestplate.java index 920b3706..023269bb 100644 --- a/src/main/java/ru/betterend/item/CrystaliteChestplate.java +++ b/src/main/java/ru/betterend/item/CrystaliteChestplate.java @@ -1,9 +1,5 @@ package ru.betterend.item; -import java.util.List; - -import org.jetbrains.annotations.Nullable; - import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.network.chat.Component; @@ -15,10 +11,13 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Rarity; import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.level.Level; +import org.jetbrains.annotations.Nullable; import ru.betterend.effects.EndStatusEffects; import ru.betterend.interfaces.MobEffectApplier; import ru.betterend.registry.EndItems; +import java.util.List; + public class CrystaliteChestplate extends CrystaliteArmor implements MobEffectApplier { public CrystaliteChestplate() { diff --git a/src/main/java/ru/betterend/item/CrystaliteHelmet.java b/src/main/java/ru/betterend/item/CrystaliteHelmet.java index ec297001..a9889445 100644 --- a/src/main/java/ru/betterend/item/CrystaliteHelmet.java +++ b/src/main/java/ru/betterend/item/CrystaliteHelmet.java @@ -1,13 +1,13 @@ package ru.betterend.item; -import java.util.UUID; - import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.ai.attributes.AttributeModifier; import net.minecraft.world.item.Rarity; import ru.betterend.registry.EndAttributes; import ru.betterend.registry.EndItems; +import java.util.UUID; + public class CrystaliteHelmet extends CrystaliteArmor { public CrystaliteHelmet() { diff --git a/src/main/java/ru/betterend/item/CrystaliteLeggings.java b/src/main/java/ru/betterend/item/CrystaliteLeggings.java index 4c8d0613..f6b2ac77 100644 --- a/src/main/java/ru/betterend/item/CrystaliteLeggings.java +++ b/src/main/java/ru/betterend/item/CrystaliteLeggings.java @@ -1,13 +1,13 @@ package ru.betterend.item; -import java.util.UUID; - import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.ai.attributes.AttributeModifier; import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.item.Rarity; import ru.betterend.registry.EndItems; +import java.util.UUID; + public class CrystaliteLeggings extends CrystaliteArmor { public CrystaliteLeggings() { diff --git a/src/main/java/ru/betterend/item/EndAnvilItem.java b/src/main/java/ru/betterend/item/EndAnvilItem.java index 0b178487..b0173781 100644 --- a/src/main/java/ru/betterend/item/EndAnvilItem.java +++ b/src/main/java/ru/betterend/item/EndAnvilItem.java @@ -27,7 +27,7 @@ public class EndAnvilItem extends BaseAnvilItem { BlockState blockState = super.getPlacementState(blockPlaceContext); ItemStack stack = blockPlaceContext.getItemInHand(); int durability = stack.getOrCreateTag().getInt(DURABILITY); - if (blockState!=null) { + if (blockState != null) { blockState = blockState.setValue(((EndAnvilBlock) blockState.getBlock()).getDurability(), durability); } return blockState; diff --git a/src/main/java/ru/betterend/item/EndArmorItem.java b/src/main/java/ru/betterend/item/EndArmorItem.java index 1f4bf969..40752e88 100644 --- a/src/main/java/ru/betterend/item/EndArmorItem.java +++ b/src/main/java/ru/betterend/item/EndArmorItem.java @@ -1,10 +1,7 @@ package ru.betterend.item; -import java.util.UUID; - import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; - import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.ai.attributes.Attribute; import net.minecraft.world.entity.ai.attributes.AttributeModifier; @@ -13,9 +10,11 @@ import net.minecraft.world.item.ArmorItem; import net.minecraft.world.item.ArmorMaterial; import ru.bclib.client.models.ItemModelProvider; +import java.util.UUID; + public class EndArmorItem extends ArmorItem implements ItemModelProvider { - protected static final UUID[] ARMOR_MODIFIER_UUID_PER_SLOT = new UUID[] { + protected static final UUID[] ARMOR_MODIFIER_UUID_PER_SLOT = new UUID[]{ UUID.fromString("845DB27C-C624-495F-8C9F-6020A9A58B6B"), UUID.fromString("D8499B04-0E66-4726-AB29-64469D734E0D"), UUID.fromString("9F3D476D-C118-4544-8365-64846904B48E"), diff --git a/src/main/java/ru/betterend/item/GuideBookItem.java b/src/main/java/ru/betterend/item/GuideBookItem.java index 3e7348c4..da0384a4 100644 --- a/src/main/java/ru/betterend/item/GuideBookItem.java +++ b/src/main/java/ru/betterend/item/GuideBookItem.java @@ -1,7 +1,5 @@ package ru.betterend.item; -import java.util.List; - import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; @@ -19,27 +17,30 @@ import ru.betterend.registry.EndItems; import ru.betterend.util.LangUtil; import vazkii.patchouli.api.PatchouliAPI; +import java.util.List; + public class GuideBookItem extends ModelProviderItem { public final static ResourceLocation BOOK_ID = BetterEnd.makeID("guidebook"); public static final Item GUIDE_BOOK = EndItems.registerEndItem(BOOK_ID, new GuideBookItem()); - - public static void register() {} - + + public static void register() { + } + public GuideBookItem() { super(EndItems.makeEndItemSettings().stacksTo(1)); } - - @Override - public InteractionResultHolder use(Level world, Player user, InteractionHand hand) { - if (!world.isClientSide && user instanceof ServerPlayer) { - PatchouliAPI.get().openBookGUI((ServerPlayer) user, BOOK_ID); - return InteractionResultHolder.success(user.getItemInHand(hand)); - } - return InteractionResultHolder.consume(user.getItemInHand(hand)); - } - @Override - public void appendHoverText(ItemStack stack, Level world, List tooltip, TooltipFlag context) { - tooltip.add(LangUtil.getText("book.betterend", "subtitle").withStyle(ChatFormatting.DARK_PURPLE, ChatFormatting.ITALIC)); - } + @Override + public InteractionResultHolder use(Level world, Player user, InteractionHand hand) { + if (!world.isClientSide && user instanceof ServerPlayer) { + PatchouliAPI.get().openBookGUI((ServerPlayer) user, BOOK_ID); + return InteractionResultHolder.success(user.getItemInHand(hand)); + } + return InteractionResultHolder.consume(user.getItemInHand(hand)); + } + + @Override + public void appendHoverText(ItemStack stack, Level world, List tooltip, TooltipFlag context) { + tooltip.add(LangUtil.getText("book.betterend", "subtitle").withStyle(ChatFormatting.DARK_PURPLE, ChatFormatting.ITALIC)); + } } diff --git a/src/main/java/ru/betterend/item/material/EndArmorMaterial.java b/src/main/java/ru/betterend/item/material/EndArmorMaterial.java index 13358a76..1ff8c95c 100644 --- a/src/main/java/ru/betterend/item/material/EndArmorMaterial.java +++ b/src/main/java/ru/betterend/item/material/EndArmorMaterial.java @@ -1,7 +1,5 @@ package ru.betterend.item.material; -import java.util.function.Supplier; - import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.sounds.SoundEvent; @@ -13,21 +11,23 @@ import net.minecraft.world.item.crafting.Ingredient; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndItems; +import java.util.function.Supplier; + public enum EndArmorMaterial implements ArmorMaterial { - THALLASIUM("thallasium", 17, new int[] { 1, 4, 5, 2 }, 12, SoundEvents.ARMOR_EQUIP_IRON, 0.0F, 0.0F, () -> { + THALLASIUM("thallasium", 17, new int[]{1, 4, 5, 2}, 12, SoundEvents.ARMOR_EQUIP_IRON, 0.0F, 0.0F, () -> { return Ingredient.of(EndBlocks.THALLASIUM.ingot); }), - TERMINITE("terminite", 26, new int[] { 3, 6, 7, 3 }, 14, SoundEvents.ARMOR_EQUIP_IRON, 1.0F, 0.05F, () -> { + TERMINITE("terminite", 26, new int[]{3, 6, 7, 3}, 14, SoundEvents.ARMOR_EQUIP_IRON, 1.0F, 0.05F, () -> { return Ingredient.of(EndBlocks.TERMINITE.ingot); }), - AETERNIUM("aeternium", 40, new int[] { 4, 7, 9, 4 }, 18, SoundEvents.ARMOR_EQUIP_NETHERITE, 3.5F, 0.2F, () -> { + AETERNIUM("aeternium", 40, new int[]{4, 7, 9, 4}, 18, SoundEvents.ARMOR_EQUIP_NETHERITE, 3.5F, 0.2F, () -> { return Ingredient.of(EndItems.AETERNIUM_INGOT); }), - CRYSTALITE("crystalite", 30, new int[] { 3, 6, 8, 3 }, 24, SoundEvents.ARMOR_EQUIP_DIAMOND, 1.2F, 0.1F, () -> { + CRYSTALITE("crystalite", 30, new int[]{3, 6, 8, 3}, 24, SoundEvents.ARMOR_EQUIP_DIAMOND, 1.2F, 0.1F, () -> { return Ingredient.of(EndBlocks.TERMINITE.ingot); }); - private static final int[] BASE_DURABILITY = new int[] { 13, 15, 16, 11 }; + private static final int[] BASE_DURABILITY = new int[]{13, 15, 16, 11}; private final String name; private final int durabilityMultiplier; private final int[] protectionAmounts; @@ -36,11 +36,11 @@ public enum EndArmorMaterial implements ArmorMaterial { private final float toughness; private final float knockbackResistance; private final LazyLoadedValue repairIngredient; - + private EndArmorMaterial(String name, int durabilityMultiplier, int[] protectionAmounts, int enchantability, - SoundEvent equipSound, float toughness, float knockbackResistance, - Supplier repairIngredient) { - + SoundEvent equipSound, float toughness, float knockbackResistance, + Supplier repairIngredient) { + this.name = name; this.durabilityMultiplier = durabilityMultiplier; this.protectionAmounts = protectionAmounts; diff --git a/src/main/java/ru/betterend/item/material/EndToolMaterial.java b/src/main/java/ru/betterend/item/material/EndToolMaterial.java index 9c0197ae..fa17936b 100644 --- a/src/main/java/ru/betterend/item/material/EndToolMaterial.java +++ b/src/main/java/ru/betterend/item/material/EndToolMaterial.java @@ -1,13 +1,13 @@ package ru.betterend.item.material; -import java.util.function.Supplier; - import net.minecraft.util.LazyLoadedValue; import net.minecraft.world.item.Tier; import net.minecraft.world.item.crafting.Ingredient; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndItems; +import java.util.function.Supplier; + public enum EndToolMaterial implements Tier { THALLASIUM(2, 320, 7.0F, 1.5F, 12, () -> { return Ingredient.of(EndBlocks.THALLASIUM.ingot); @@ -25,9 +25,9 @@ public enum EndToolMaterial implements Tier { private final int miningLevel; private final int enchantability; private final LazyLoadedValue repairIngredient; - + private EndToolMaterial(int miningLevel, int durability, float miningSpeed, float attackDamage, int enchantability, - Supplier repairIngredient) { + Supplier repairIngredient) { this.durability = durability; this.miningSpeed = miningSpeed; diff --git a/src/main/java/ru/betterend/item/model/ArmoredElytraModel.java b/src/main/java/ru/betterend/item/model/ArmoredElytraModel.java index c853908f..7b6fa214 100644 --- a/src/main/java/ru/betterend/item/model/ArmoredElytraModel.java +++ b/src/main/java/ru/betterend/item/model/ArmoredElytraModel.java @@ -1,7 +1,6 @@ package ru.betterend.item.model; import com.google.common.collect.ImmutableList; - import net.minecraft.client.model.AgeableListModel; import net.minecraft.client.model.geom.ModelPart; import net.minecraft.client.model.geom.PartNames; @@ -22,18 +21,19 @@ public class ArmoredElytraModel extends AgeableListModel MeshDefinition modelData = new MeshDefinition(); PartDefinition modelPartData = modelData.getRoot(); modelPartData.addOrReplaceChild(PartNames.LEFT_WING, CubeListBuilder.create() - .texOffs(22, 0) + .texOffs(22, 0) .addBox(-10.0f, 0.0f, 0.0f, 10.0f, 20.0f, 2.0f), PartPose.ZERO); modelPartData.addOrReplaceChild(PartNames.RIGHT_WING, CubeListBuilder.create() .mirror() - .texOffs(22, 0) + .texOffs(22, 0) .addBox(0.0f, 0.0f, 0.0f, 10.0f, 20.0f, 2.0f), PartPose.ZERO); - return LayerDefinition.create(modelData, 48, 48); + return LayerDefinition.create(modelData, 64, 32); } + public ArmoredElytraModel(ModelPart modelPart) { leftWing = modelPart.getChild(PartNames.LEFT_WING); rightWing = modelPart.getChild(PartNames.RIGHT_WING); @@ -61,7 +61,8 @@ public class ArmoredElytraModel extends AgeableListModel } rotX = coef * 0.34906584F + (1.0F - coef) * rotX; rotZ = coef * -1.5707964F + (1.0F - coef) * rotZ; - } else if (livingEntity.isCrouching()) { + } + else if (livingEntity.isCrouching()) { rotX = 0.6981317F; rotZ = -0.7853982F; rotY = 0.08726646F; @@ -78,7 +79,8 @@ public class ArmoredElytraModel extends AgeableListModel leftWing.xRot = abstractClientPlayer.elytraRotX; leftWing.yRot = abstractClientPlayer.elytraRotY; leftWing.zRot = abstractClientPlayer.elytraRotZ; - } else { + } + else { leftWing.xRot = rotX; leftWing.zRot = rotZ; leftWing.yRot = rotY; diff --git a/src/main/java/ru/betterend/item/model/CrystaliteArmorProvider.java b/src/main/java/ru/betterend/item/model/CrystaliteArmorProvider.java index d1da3318..ee0bf6eb 100644 --- a/src/main/java/ru/betterend/item/model/CrystaliteArmorProvider.java +++ b/src/main/java/ru/betterend/item/model/CrystaliteArmorProvider.java @@ -1,12 +1,6 @@ package ru.betterend.item.model; -import net.minecraft.client.renderer.entity.layers.HumanoidArmorLayer; -import net.minecraft.world.item.ArmorMaterial; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - import com.google.common.collect.Lists; - import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.model.HumanoidModel; @@ -16,6 +10,8 @@ import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import ru.betterend.item.CrystaliteArmor; import ru.betterend.registry.EndItems; import shadow.fabric.api.client.rendering.v1.ArmorRenderingRegistry; @@ -33,7 +29,7 @@ public class CrystaliteArmorProvider implements ArmorRenderingRegistry.ModelProv //@Override public @NotNull ResourceLocation getArmorTexture(LivingEntity entity, ItemStack stack, EquipmentSlot slot, - boolean secondLayer, @Nullable String suffix, ResourceLocation defaultTexture) { + boolean secondLayer, @Nullable String suffix, ResourceLocation defaultTexture) { if (!isStackValid(stack)) return defaultTexture; if (secondLayer) return SECOND_LAYER; return FIRST_LAYER; @@ -41,15 +37,15 @@ public class CrystaliteArmorProvider implements ArmorRenderingRegistry.ModelProv //@Override public @NotNull HumanoidModel getArmorModel(LivingEntity entity, ItemStack stack, - EquipmentSlot slot, HumanoidModel defaultModel) { + EquipmentSlot slot, HumanoidModel defaultModel) { if (!isStackValid(stack)) return defaultModel; - switch(slot) { + switch (slot) { case HEAD: { return HELMET_MODEL; } case CHEST: { if (entity instanceof AbstractClientPlayer && - ((AbstractClientPlayer) entity).getModelName().equals("slim")) { + ((AbstractClientPlayer) entity).getModelName().equals("slim")) { CHEST_MODEL_SLIM.copyPropertiesTo(defaultModel); return CHEST_MODEL_SLIM; } @@ -68,7 +64,7 @@ public class CrystaliteArmorProvider implements ArmorRenderingRegistry.ModelProv } } } - + public Iterable getRenderedItems() { return Lists.newArrayList( EndItems.CRYSTALITE_HELMET, @@ -77,7 +73,7 @@ public class CrystaliteArmorProvider implements ArmorRenderingRegistry.ModelProv EndItems.CRYSTALITE_LEGGINGS, EndItems.CRYSTALITE_BOOTS); } - + private boolean isStackValid(ItemStack stack) { return stack.getItem() instanceof CrystaliteArmor; } diff --git a/src/main/java/ru/betterend/item/model/CrystaliteBootsModel.java b/src/main/java/ru/betterend/item/model/CrystaliteBootsModel.java index 525d2ced..5458e891 100644 --- a/src/main/java/ru/betterend/item/model/CrystaliteBootsModel.java +++ b/src/main/java/ru/betterend/item/model/CrystaliteBootsModel.java @@ -1,18 +1,21 @@ package ru.betterend.item.model; -import java.util.Collections; - import com.google.common.collect.Lists; - import net.minecraft.client.model.HumanoidModel; import net.minecraft.client.model.geom.EntityModelSet; import net.minecraft.client.model.geom.ModelPart; import net.minecraft.client.model.geom.PartPose; -import net.minecraft.client.model.geom.builders.*; +import net.minecraft.client.model.geom.builders.CubeDeformation; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; import net.minecraft.client.renderer.RenderType; import net.minecraft.world.entity.LivingEntity; import ru.betterend.registry.EndEntitiesRenders; +import java.util.Collections; + public class CrystaliteBootsModel extends HumanoidModel { public ModelPart leftBoot; @@ -36,29 +39,29 @@ public class CrystaliteBootsModel extends HumanoidModel { CubeDeformation deformation = new CubeDeformation(scale + 0.25f); modelPartData.addOrReplaceChild("leftBoot", CubeListBuilder.create() - .texOffs(0, 32) + .texOffs(0, 32) .addBox(-2.0f, 0.0f, -2.0f, 4.0f, 12.0f, 4.0f, deformation), PartPose.offset(1.9f, 12.0f, 0.0f)); modelPartData.addOrReplaceChild("rightBoot", CubeListBuilder.create() - .texOffs(0, 16) + .texOffs(0, 16) .addBox(-2.0f, 0.0f, -2.0f, 4.0f, 12.0f, 4.0f, deformation), PartPose.offset(-1.9f, 12.0f, 0.0f)); return LayerDefinition.create(modelData, 64, 48); } - public static CrystaliteBootsModel createModel(EntityModelSet entityModelSet){ - return new CrystaliteBootsModel(entityModelSet==null?getTexturedModelData().bakeRoot():entityModelSet.bakeLayer(EndEntitiesRenders.CRYSTALITE_BOOTS)); + public static CrystaliteBootsModel createModel(EntityModelSet entityModelSet) { + return new CrystaliteBootsModel(entityModelSet == null ? getTexturedModelData().bakeRoot() : entityModelSet.bakeLayer(EndEntitiesRenders.CRYSTALITE_BOOTS)); } - + public CrystaliteBootsModel(ModelPart modelPart) { super(modelPart, RenderType::entityTranslucent); leftBoot = modelPart.getChild("leftBoot"); rightBoot = modelPart.getChild("rightBoot"); } - + @Override public void copyPropertiesTo(HumanoidModel bipedEntityModel) { super.copyPropertiesTo(bipedEntityModel); @@ -70,7 +73,7 @@ public class CrystaliteBootsModel extends HumanoidModel { protected Iterable headParts() { return Collections::emptyIterator; } - + @Override protected Iterable bodyParts() { return Lists.newArrayList(leftBoot, rightBoot); diff --git a/src/main/java/ru/betterend/item/model/CrystaliteChestplateModel.java b/src/main/java/ru/betterend/item/model/CrystaliteChestplateModel.java index 058ec7d1..f784da8f 100644 --- a/src/main/java/ru/betterend/item/model/CrystaliteChestplateModel.java +++ b/src/main/java/ru/betterend/item/model/CrystaliteChestplateModel.java @@ -1,32 +1,35 @@ package ru.betterend.item.model; -import java.util.Collections; - import com.google.common.collect.Lists; import com.mojang.blaze3d.vertex.PoseStack; - import net.minecraft.client.model.HumanoidModel; import net.minecraft.client.model.geom.EntityModelSet; import net.minecraft.client.model.geom.ModelPart; import net.minecraft.client.model.geom.PartNames; import net.minecraft.client.model.geom.PartPose; -import net.minecraft.client.model.geom.builders.*; +import net.minecraft.client.model.geom.builders.CubeDeformation; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; import net.minecraft.client.renderer.RenderType; import net.minecraft.world.entity.HumanoidArm; import net.minecraft.world.entity.LivingEntity; import ru.betterend.registry.EndEntitiesRenders; +import java.util.Collections; + public class CrystaliteChestplateModel extends HumanoidModel { public ModelPart leftShoulder; public ModelPart rightShoulder; private final boolean thinArms; - public static LayerDefinition getRegularTexturedModelData(){ + public static LayerDefinition getRegularTexturedModelData() { return getTexturedModelData(1.0f, false); } - public static LayerDefinition getThinTexturedModelData(){ + public static LayerDefinition getThinTexturedModelData() { return getTexturedModelData(1.0f, true); } @@ -47,7 +50,7 @@ public class CrystaliteChestplateModel extends HumanoidModel { CubeDeformation deformation = new CubeDeformation(scale + 0.25F); PartDefinition body = modelPartData.addOrReplaceChild(PartNames.BODY, CubeListBuilder.create() - .texOffs(16, 16) + .texOffs(16, 16) .addBox(-4.0f, 0.0f, -2.0f, 8.0f, 12.0f, 4.0f, deformation), PartPose.ZERO); @@ -55,24 +58,25 @@ public class CrystaliteChestplateModel extends HumanoidModel { deformation = new CubeDeformation(scale + 0.45F); PartDefinition leftShoulder = modelPartData.addOrReplaceChild("leftShoulder", CubeListBuilder.create() .mirror() - .texOffs(40, 32) + .texOffs(40, 32) .addBox(-1.0f, -2.5f, -2.0f, 4.0f, 12.0f, 4.0f, deformation), PartPose.offset(5.0f, 2.0f, 0.0f)); PartDefinition rightShoulder = modelPartData.addOrReplaceChild("rightShoulder", CubeListBuilder.create() - .texOffs(40, 16) + .texOffs(40, 16) .addBox(-3.0f, -2.5f, -2.0f, 4.0f, 12.0f, 4.0f, deformation), PartPose.offset(-5.0f, 2.0f, 10.0f)); - } else { + } + else { deformation = new CubeDeformation(scale + 0.45F); PartDefinition leftShoulder = modelPartData.addOrReplaceChild("leftShoulder", CubeListBuilder.create() .mirror() - .texOffs(40, 32) + .texOffs(40, 32) .addBox(-1.0f, -2.5f, -2.0f, 4.0f, 12.0f, 4.0f, deformation), PartPose.offset(5.0f, 2.0f, 0.0f)); PartDefinition rightShoulder = modelPartData.addOrReplaceChild("rightShoulder", CubeListBuilder.create() - .texOffs(40, 16) + .texOffs(40, 16) .addBox(-3.0f, -2.5f, -2.0f, 4.0f, 12.0f, 4.0f, deformation), PartPose.offset(-5.0f, 2.0f, 10.0f)); } @@ -81,12 +85,12 @@ public class CrystaliteChestplateModel extends HumanoidModel { final ModelPart localBody; - public static CrystaliteChestplateModel createRegularModel(EntityModelSet entityModelSet){ - return new CrystaliteChestplateModel(entityModelSet==null?getRegularTexturedModelData().bakeRoot():entityModelSet.bakeLayer(EndEntitiesRenders.CRYSTALITE_CHESTPLATE), false); + public static CrystaliteChestplateModel createRegularModel(EntityModelSet entityModelSet) { + return new CrystaliteChestplateModel(entityModelSet == null ? getRegularTexturedModelData().bakeRoot() : entityModelSet.bakeLayer(EndEntitiesRenders.CRYSTALITE_CHESTPLATE), false); } - public static CrystaliteChestplateModel createThinModel(EntityModelSet entityModelSet){ - return new CrystaliteChestplateModel(entityModelSet==null?getThinTexturedModelData().bakeRoot():entityModelSet.bakeLayer(EndEntitiesRenders.CRYSTALITE_CHESTPLATE_THIN), true); + public static CrystaliteChestplateModel createThinModel(EntityModelSet entityModelSet) { + return new CrystaliteChestplateModel(entityModelSet == null ? getThinTexturedModelData().bakeRoot() : entityModelSet.bakeLayer(EndEntitiesRenders.CRYSTALITE_CHESTPLATE_THIN), true); } protected CrystaliteChestplateModel(ModelPart modelPart, boolean thinArms) { @@ -96,33 +100,34 @@ public class CrystaliteChestplateModel extends HumanoidModel { leftShoulder = modelPart.getChild("leftShoulder"); rightShoulder = modelPart.getChild("rightShoulder"); } - + @Override public void copyPropertiesTo(HumanoidModel bipedEntityModel) { super.copyPropertiesTo(bipedEntityModel); this.leftShoulder.copyFrom(leftArm); this.rightShoulder.copyFrom(rightArm); } - + @Override protected Iterable headParts() { return Collections::emptyIterator; } - + @Override protected Iterable bodyParts() { return Lists.newArrayList(localBody, leftShoulder, rightShoulder); } - + @Override public void translateToHand(HumanoidArm arm, PoseStack matrices) { ModelPart modelPart = this.getArm(arm); if (this.thinArms) { - float f = 0.5F * (float)(arm == HumanoidArm.RIGHT ? 1 : -1); + float f = 0.5F * (float) (arm == HumanoidArm.RIGHT ? 1 : -1); modelPart.x += f; modelPart.translateAndRotate(matrices); modelPart.x -= f; - } else { + } + else { modelPart.translateAndRotate(matrices); } } diff --git a/src/main/java/ru/betterend/item/model/CrystaliteHelmetModel.java b/src/main/java/ru/betterend/item/model/CrystaliteHelmetModel.java index 0c5518d0..474980c9 100644 --- a/src/main/java/ru/betterend/item/model/CrystaliteHelmetModel.java +++ b/src/main/java/ru/betterend/item/model/CrystaliteHelmetModel.java @@ -1,9 +1,6 @@ package ru.betterend.item.model; -import java.util.Collections; - import com.google.common.collect.Lists; - import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.model.HumanoidModel; @@ -11,15 +8,21 @@ import net.minecraft.client.model.geom.EntityModelSet; import net.minecraft.client.model.geom.ModelPart; import net.minecraft.client.model.geom.PartNames; import net.minecraft.client.model.geom.PartPose; -import net.minecraft.client.model.geom.builders.*; +import net.minecraft.client.model.geom.builders.CubeDeformation; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; import net.minecraft.client.renderer.RenderType; import net.minecraft.world.entity.LivingEntity; import ru.betterend.registry.EndEntitiesRenders; -import shadow.fabric.impl.client.rendering.ArmorProviderExtensions; + +import java.util.Collections; @Environment(EnvType.CLIENT) public class CrystaliteHelmetModel extends HumanoidModel { final ModelPart myHat; + public static LayerDefinition getTexturedModelData() { final float scale = 1.0f; MeshDefinition modelData = new MeshDefinition(); @@ -38,15 +41,15 @@ public class CrystaliteHelmetModel extends HumanoidModel { CubeDeformation deformation_hat = new CubeDeformation(scale + 0.5f); PartDefinition hat = modelPartData.addOrReplaceChild(PartNames.HAT, CubeListBuilder.create() - .texOffs(0, 0) + .texOffs(0, 0) .addBox(-4.0f, -8.0f, -4.0f, 8.0f, 8.0f, 8.0f, deformation_hat), PartPose.ZERO); return LayerDefinition.create(modelData, 64, 48); } - public static CrystaliteHelmetModel createModel(EntityModelSet entityModelSet){ - return new CrystaliteHelmetModel(entityModelSet==null?getTexturedModelData().bakeRoot():entityModelSet.bakeLayer(EndEntitiesRenders.CRYSTALITE_HELMET)); + public static CrystaliteHelmetModel createModel(EntityModelSet entityModelSet) { + return new CrystaliteHelmetModel(entityModelSet == null ? getTexturedModelData().bakeRoot() : entityModelSet.bakeLayer(EndEntitiesRenders.CRYSTALITE_HELMET)); } @@ -55,12 +58,12 @@ public class CrystaliteHelmetModel extends HumanoidModel { myHat = modelPart.getChild(PartNames.HAT); } - + @Override protected Iterable headParts() { return Collections::emptyIterator; } - + @Override protected Iterable bodyParts() { return Lists.newArrayList(myHat); diff --git a/src/main/java/ru/betterend/item/model/CrystaliteLeggingsModel.java b/src/main/java/ru/betterend/item/model/CrystaliteLeggingsModel.java index 0d7c6a32..0f1a743d 100644 --- a/src/main/java/ru/betterend/item/model/CrystaliteLeggingsModel.java +++ b/src/main/java/ru/betterend/item/model/CrystaliteLeggingsModel.java @@ -1,19 +1,22 @@ package ru.betterend.item.model; -import java.util.Collections; - import com.google.common.collect.Lists; - import net.minecraft.client.model.HumanoidModel; import net.minecraft.client.model.geom.EntityModelSet; import net.minecraft.client.model.geom.ModelPart; import net.minecraft.client.model.geom.PartNames; import net.minecraft.client.model.geom.PartPose; -import net.minecraft.client.model.geom.builders.*; +import net.minecraft.client.model.geom.builders.CubeDeformation; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; import net.minecraft.client.renderer.RenderType; import net.minecraft.world.entity.LivingEntity; import ru.betterend.registry.EndEntitiesRenders; +import java.util.Collections; + public class CrystaliteLeggingsModel extends HumanoidModel { public static LayerDefinition getTexturedModelData() { float scale = 1.0f; @@ -33,17 +36,17 @@ public class CrystaliteLeggingsModel extends HumanoidModel { CubeDeformation deformation = new CubeDeformation(scale); modelPartData.addOrReplaceChild(PartNames.BODY, CubeListBuilder.create() - .texOffs(16, 16) + .texOffs(16, 16) .addBox(-4.0f, 0.0f, -2.0f, 8.0f, 12.0f, 4.0f, deformation), PartPose.ZERO); modelPartData.addOrReplaceChild(PartNames.LEFT_LEG, CubeListBuilder.create() - .texOffs(0, 32) + .texOffs(0, 32) .addBox(-2.0f, 0.0f, -2.0f, 4.0f, 12.0f, 4.0f, deformation), PartPose.offset(1.9f, 12.0f, 0.0f)); modelPartData.addOrReplaceChild(PartNames.RIGHT_LEG, CubeListBuilder.create() - .texOffs(0, 16) + .texOffs(0, 16) .addBox(-2.0f, 0.0f, -2.0f, 4.0f, 12.0f, 4.0f, deformation), PartPose.offset(-1.9f, 12.0f, 0.0f)); @@ -54,8 +57,8 @@ public class CrystaliteLeggingsModel extends HumanoidModel { final ModelPart myLeftLeg; final ModelPart myRightLeg; - public static CrystaliteLeggingsModel createModel(EntityModelSet entityModelSet){ - return new CrystaliteLeggingsModel(entityModelSet==null?getTexturedModelData().bakeRoot():entityModelSet.bakeLayer(EndEntitiesRenders.CRYSTALITE_LEGGINGS)); + public static CrystaliteLeggingsModel createModel(EntityModelSet entityModelSet) { + return new CrystaliteLeggingsModel(entityModelSet == null ? getTexturedModelData().bakeRoot() : entityModelSet.bakeLayer(EndEntitiesRenders.CRYSTALITE_LEGGINGS)); } public CrystaliteLeggingsModel(ModelPart modelPart) { @@ -70,7 +73,7 @@ public class CrystaliteLeggingsModel extends HumanoidModel { protected Iterable headParts() { return Collections::emptyIterator; } - + @Override protected Iterable bodyParts() { return Lists.newArrayList(myBody, myRightLeg, myLeftLeg); diff --git a/src/main/java/ru/betterend/item/tool/EndHammerItem.java b/src/main/java/ru/betterend/item/tool/EndHammerItem.java index 9ec7c149..5f1e11c0 100644 --- a/src/main/java/ru/betterend/item/tool/EndHammerItem.java +++ b/src/main/java/ru/betterend/item/tool/EndHammerItem.java @@ -1,12 +1,8 @@ package ru.betterend.item.tool; -import java.util.UUID; - import com.google.common.collect.ImmutableMultimap; import com.google.common.collect.ImmutableMultimap.Builder; import com.google.common.collect.Multimap; -import com.google.common.collect.Sets; - import io.netty.util.internal.ThreadLocalRandom; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; @@ -34,11 +30,12 @@ import net.minecraft.world.level.material.Material; import ru.bclib.api.TagAPI; import ru.bclib.client.models.ItemModelProvider; import ru.bclib.client.models.ModelsHelper; -import ru.betterend.registry.EndTags; + +import java.util.UUID; public class EndHammerItem extends DiggerItem implements DynamicAttributeTool, ItemModelProvider { public final static UUID ATTACK_KNOCKBACK_MODIFIER_ID = Mth.createInsecureUUID(ThreadLocalRandom.current()); - + private final Multimap attributeModifiers; public EndHammerItem(Tier material, float attackDamage, float attackSpeed, double knockback, Properties settings) { @@ -55,17 +52,17 @@ public class EndHammerItem extends DiggerItem implements DynamicAttributeTool, I @Override public boolean canAttackBlock(BlockState state, Level world, BlockPos pos, Player miner) { return state.getMaterial().equals(Material.STONE) || - state.getMaterial().equals(Material.GLASS) || - state.is(Blocks.DIAMOND_BLOCK) || - state.is(Blocks.EMERALD_BLOCK) || - state.is(Blocks.LAPIS_BLOCK) || - state.is(Blocks.REDSTONE_BLOCK); + state.getMaterial().equals(Material.GLASS) || + state.is(Blocks.DIAMOND_BLOCK) || + state.is(Blocks.EMERALD_BLOCK) || + state.is(Blocks.LAPIS_BLOCK) || + state.is(Blocks.REDSTONE_BLOCK); } @Override public boolean hurtEnemy(ItemStack stack, LivingEntity target, LivingEntity attacker) { stack.hurtAndBreak(1, attacker, ((entity) -> entity.broadcastBreakEvent(EquipmentSlot.MAINHAND))); - + return true; } @@ -87,14 +84,15 @@ public class EndHammerItem extends DiggerItem implements DynamicAttributeTool, I float mult; if (state.is(Blocks.DIAMOND_BLOCK) || state.is(Blocks.EMERALD_BLOCK) || state.is(Blocks.LAPIS_BLOCK) || state.is(Blocks.REDSTONE_BLOCK)) { mult = this.getTier().getSpeed(); - } else { + } + else { mult = this.getTier().getSpeed() / 2.0F; } return Math.max(mult, 1.0F); } return 1.0F; } - + @Override public float getMiningSpeedMultiplier(Tag tag, BlockState state, ItemStack stack, LivingEntity user) { if (tag.equals(TagAPI.HAMMERS)) { @@ -102,7 +100,7 @@ public class EndHammerItem extends DiggerItem implements DynamicAttributeTool, I } return 1.0F; } - + @Override public int getMiningLevel(Tag tag, BlockState state, ItemStack stack, LivingEntity user) { if (tag.equals(TagAPI.HAMMERS)) { @@ -136,7 +134,7 @@ public class EndHammerItem extends DiggerItem implements DynamicAttributeTool, I public Multimap getDefaultAttributeModifiers(EquipmentSlot slot) { return slot == EquipmentSlot.MAINHAND ? this.attributeModifiers : super.getDefaultAttributeModifiers(slot); } - + @Override @Environment(EnvType.CLIENT) public BlockModel getItemModel(ResourceLocation resourceLocation) { diff --git a/src/main/java/ru/betterend/mixin/client/AbstractSoundInstanceAccessor.java b/src/main/java/ru/betterend/mixin/client/AbstractSoundInstanceAccessor.java index 296a013e..9c94ed93 100644 --- a/src/main/java/ru/betterend/mixin/client/AbstractSoundInstanceAccessor.java +++ b/src/main/java/ru/betterend/mixin/client/AbstractSoundInstanceAccessor.java @@ -1,10 +1,9 @@ package ru.betterend.mixin.client; +import net.minecraft.client.resources.sounds.AbstractSoundInstance; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; -import net.minecraft.client.resources.sounds.AbstractSoundInstance; - @Mixin(AbstractSoundInstance.class) public interface AbstractSoundInstanceAccessor { @Accessor("volume") diff --git a/src/main/java/ru/betterend/mixin/client/AnvilScreenMixin.java b/src/main/java/ru/betterend/mixin/client/AnvilScreenMixin.java index 2efb8696..a629fb99 100644 --- a/src/main/java/ru/betterend/mixin/client/AnvilScreenMixin.java +++ b/src/main/java/ru/betterend/mixin/client/AnvilScreenMixin.java @@ -1,16 +1,7 @@ package ru.betterend.mixin.client; -import java.util.List; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - import com.google.common.collect.Lists; import com.mojang.blaze3d.vertex.PoseStack; - import net.minecraft.client.gui.components.AbstractWidget; import net.minecraft.client.gui.components.Button; import net.minecraft.client.gui.components.EditBox; @@ -23,61 +14,70 @@ import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.inventory.AnvilMenu; import net.minecraft.world.item.ItemStack; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import ru.betterend.interfaces.AnvilScreenHandlerExtended; +import java.util.List; + @Mixin(AnvilScreen.class) public class AnvilScreenMixin extends ItemCombinerScreen { @Shadow private EditBox name; - + private final List be_buttons = Lists.newArrayList(); - + public AnvilScreenMixin(AnvilMenu handler, Inventory playerInventory, Component title, - ResourceLocation texture) { + ResourceLocation texture) { super(handler, playerInventory, title, texture); } @Inject(method = "subInit", at = @At("TAIL")) protected void be_subInit(CallbackInfo info) { int x = (width - imageWidth) / 2; - int y = (height - imageHeight) / 2; + int y = (height - imageHeight) / 2; be_buttons.clear(); - be_buttons.add(new Button(x + 8, y + 45, 15, 20, new TextComponent("<"), b -> be_previousRecipe())); + be_buttons.add(new Button(x + 8, y + 45, 15, 20, new TextComponent("<"), b -> be_previousRecipe())); be_buttons.add(new Button(x + 154, y + 45, 15, 20, new TextComponent(">"), b -> be_nextRecipe())); } - + @Inject(method = "renderFg", at = @At("TAIL")) protected void be_renderForeground(PoseStack matrices, int mouseX, int mouseY, float delta, CallbackInfo info) { be_buttons.forEach(button -> { button.render(matrices, mouseX, mouseY, delta); }); } - + @Inject(method = "slotChanged", at = @At("HEAD"), cancellable = true) public void be_onSlotUpdate(AbstractContainerMenu handler, int slotId, ItemStack stack, CallbackInfo info) { AnvilScreenHandlerExtended anvilHandler = (AnvilScreenHandlerExtended) handler; if (anvilHandler.be_getCurrentRecipe() != null) { if (anvilHandler.be_getRecipes().size() > 1) { be_buttons.forEach(button -> button.visible = true); - } else { + } + else { be_buttons.forEach(button -> button.visible = false); } name.setValue(""); info.cancel(); - } else { + } + else { be_buttons.forEach(button -> button.visible = false); } } - + private void be_nextRecipe() { ((AnvilScreenHandlerExtended) menu).be_nextRecipe(); } - + private void be_previousRecipe() { ((AnvilScreenHandlerExtended) menu).be_previousRecipe(); } - + @Override public boolean mouseClicked(double mouseX, double mouseY, int button) { if (minecraft != null) { diff --git a/src/main/java/ru/betterend/mixin/client/ArmorStandRendererMixin.java b/src/main/java/ru/betterend/mixin/client/ArmorStandRendererMixin.java index 61174938..4f61d259 100644 --- a/src/main/java/ru/betterend/mixin/client/ArmorStandRendererMixin.java +++ b/src/main/java/ru/betterend/mixin/client/ArmorStandRendererMixin.java @@ -12,7 +12,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import ru.betterend.client.render.ArmoredElytraLayer; @Mixin(ArmorStandRenderer.class) -public abstract class ArmorStandRendererMixin extends LivingEntityRenderer { +public abstract class ArmorStandRendererMixin extends LivingEntityRenderer { public ArmorStandRendererMixin(EntityRendererProvider.Context context, ArmorStandArmorModel entityModel, float f) { super(context, entityModel, f); diff --git a/src/main/java/ru/betterend/mixin/client/BiomeColorsMixin.java b/src/main/java/ru/betterend/mixin/client/BiomeColorsMixin.java index e15ed5fe..5b4b9af3 100644 --- a/src/main/java/ru/betterend/mixin/client/BiomeColorsMixin.java +++ b/src/main/java/ru/betterend/mixin/client/BiomeColorsMixin.java @@ -1,12 +1,5 @@ package ru.betterend.mixin.client; -import java.awt.Point; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - import net.fabricmc.loader.api.FabricLoader; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.BiomeColors; @@ -14,18 +7,24 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.BlockAndTintGetter; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import ru.bclib.util.BlocksHelper; import ru.bclib.util.ColorUtil; import ru.betterend.client.ClientOptions; import ru.betterend.registry.EndBlocks; +import java.awt.Point; + @Mixin(BiomeColors.class) public class BiomeColorsMixin { private static final int POISON_COLOR = ColorUtil.color(92, 160, 78); private static final int STREAM_COLOR = ColorUtil.color(105, 213, 244); private static final Point[] OFFSETS; private static final boolean HAS_SODIUM; - + @Inject(method = "getAverageWaterColor", at = @At("RETURN"), cancellable = true) private static void be_getWaterColor(BlockAndTintGetter world, BlockPos pos, CallbackInfoReturnable info) { if (ClientOptions.useSulfurWaterColor()) { @@ -43,10 +42,10 @@ public class BiomeColorsMixin { } } } - + static { HAS_SODIUM = FabricLoader.getInstance().isModLoaded("sodium"); - + OFFSETS = new Point[20]; for (int i = 0; i < 3; i++) { int p = i - 1; @@ -55,7 +54,7 @@ public class BiomeColorsMixin { OFFSETS[i + 6] = new Point(-2, p); OFFSETS[i + 9] = new Point(2, p); } - + for (int i = 0; i < 4; i++) { int inner = i + 16; Direction dir = BlocksHelper.HORIZONTAL[i]; diff --git a/src/main/java/ru/betterend/mixin/client/CapeLayerMixin.java b/src/main/java/ru/betterend/mixin/client/CapeLayerMixin.java index 3e0e5dd5..22a68c0e 100644 --- a/src/main/java/ru/betterend/mixin/client/CapeLayerMixin.java +++ b/src/main/java/ru/betterend/mixin/client/CapeLayerMixin.java @@ -1,17 +1,15 @@ package ru.betterend.mixin.client; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - import com.mojang.blaze3d.vertex.PoseStack; - import net.minecraft.client.player.AbstractClientPlayer; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.entity.layers.CapeLayer; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.item.ItemStack; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import ru.betterend.item.ArmoredElytra; @Mixin(CapeLayer.class) diff --git a/src/main/java/ru/betterend/mixin/client/ClientPlayNetworkHandlerMixin.java b/src/main/java/ru/betterend/mixin/client/ClientPlayNetworkHandlerMixin.java index 8e7b7e23..2829daa8 100644 --- a/src/main/java/ru/betterend/mixin/client/ClientPlayNetworkHandlerMixin.java +++ b/src/main/java/ru/betterend/mixin/client/ClientPlayNetworkHandlerMixin.java @@ -1,24 +1,22 @@ package ru.betterend.mixin.client; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.multiplayer.ClientPacketListener; import net.minecraft.network.protocol.PacketUtils; import net.minecraft.network.protocol.game.ClientboundOpenSignEditorPacket; import net.minecraft.world.level.block.entity.BlockEntity; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import ru.bclib.blockentities.BaseSignBlockEntity; import ru.bclib.client.gui.BlockSignEditScreen; @Mixin(ClientPacketListener.class) -public class ClientPlayNetworkHandlerMixin -{ +public class ClientPlayNetworkHandlerMixin { @Final @Shadow private Minecraft minecraft; diff --git a/src/main/java/ru/betterend/mixin/client/ClientRecipeBookMixin.java b/src/main/java/ru/betterend/mixin/client/ClientRecipeBookMixin.java index 4fd3d635..38f5bbb6 100644 --- a/src/main/java/ru/betterend/mixin/client/ClientRecipeBookMixin.java +++ b/src/main/java/ru/betterend/mixin/client/ClientRecipeBookMixin.java @@ -1,13 +1,12 @@ package ru.betterend.mixin.client; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - import net.minecraft.client.ClientRecipeBook; import net.minecraft.client.RecipeBookCategories; import net.minecraft.world.item.crafting.Recipe; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import ru.betterend.interfaces.BetterEndRecipe; @Mixin(ClientRecipeBook.class) diff --git a/src/main/java/ru/betterend/mixin/client/ItemStackMixin.java b/src/main/java/ru/betterend/mixin/client/ItemStackMixin.java index d5f52a97..dd0ffad9 100644 --- a/src/main/java/ru/betterend/mixin/client/ItemStackMixin.java +++ b/src/main/java/ru/betterend/mixin/client/ItemStackMixin.java @@ -1,18 +1,17 @@ package ru.betterend.mixin.client; -import java.util.List; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - import net.minecraft.network.chat.Component; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.TooltipFlag; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import ru.betterend.events.ItemTooltipCallback; +import java.util.List; + @Mixin(ItemStack.class) public class ItemStackMixin { @Inject(method = "getTooltipLines", at = @At("RETURN")) diff --git a/src/main/java/ru/betterend/mixin/client/LocalPlayerMixin.java b/src/main/java/ru/betterend/mixin/client/LocalPlayerMixin.java index 49badc32..a631bb40 100644 --- a/src/main/java/ru/betterend/mixin/client/LocalPlayerMixin.java +++ b/src/main/java/ru/betterend/mixin/client/LocalPlayerMixin.java @@ -1,15 +1,6 @@ package ru.betterend.mixin.client; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.At.Shift; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - import com.mojang.authlib.GameProfile; - import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.multiplayer.ClientPacketListener; import net.minecraft.client.player.AbstractClientPlayer; @@ -18,6 +9,13 @@ import net.minecraft.network.protocol.game.ServerboundPlayerCommandPacket; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.item.ElytraItem; import net.minecraft.world.item.ItemStack; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.At.Shift; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import ru.betterend.interfaces.FallFlyingItem; @Mixin(LocalPlayer.class) diff --git a/src/main/java/ru/betterend/mixin/client/MinecraftClientMixin.java b/src/main/java/ru/betterend/mixin/client/MinecraftClientMixin.java index 81e2e2e4..065f18ba 100644 --- a/src/main/java/ru/betterend/mixin/client/MinecraftClientMixin.java +++ b/src/main/java/ru/betterend/mixin/client/MinecraftClientMixin.java @@ -1,13 +1,5 @@ package ru.betterend.mixin.client; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - import net.minecraft.client.Minecraft; import net.minecraft.client.color.block.BlockColors; import net.minecraft.client.color.item.ItemColors; @@ -21,6 +13,13 @@ import net.minecraft.core.Registry; import net.minecraft.sounds.Music; import net.minecraft.sounds.Musics; import net.minecraft.world.level.Level; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import ru.bclib.interfaces.IColorProvider; import ru.bclib.util.MHelper; @@ -28,14 +27,14 @@ import ru.bclib.util.MHelper; public class MinecraftClientMixin { @Shadow public LocalPlayer player; - + @Shadow public Screen screen; @Final @Shadow public Gui gui; - + @Shadow public ClientLevel level; @@ -46,7 +45,7 @@ public class MinecraftClientMixin { @Final @Shadow private ItemColors itemColors; - + @Inject(method = "*", at = @At("TAIL")) private void be_onInit(GameConfig args, CallbackInfo info) { Registry.BLOCK.forEach(block -> { @@ -57,7 +56,7 @@ public class MinecraftClientMixin { } }); } - + @Inject(method = "getSituationalMusic", at = @At("HEAD"), cancellable = true) private void be_getEndMusic(CallbackInfoReturnable info) { if (!(this.screen instanceof WinScreen) && this.player != null) { diff --git a/src/main/java/ru/betterend/mixin/client/ModelLoaderMixin.java b/src/main/java/ru/betterend/mixin/client/ModelLoaderMixin.java index 4c65b28b..adba0f1a 100644 --- a/src/main/java/ru/betterend/mixin/client/ModelLoaderMixin.java +++ b/src/main/java/ru/betterend/mixin/client/ModelLoaderMixin.java @@ -1,11 +1,10 @@ package ru.betterend.mixin.client; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.ModifyVariable; - import net.minecraft.client.resources.model.ModelBakery; import net.minecraft.resources.ResourceLocation; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyVariable; import ru.betterend.world.generator.GeneratorOptions; @Mixin(ModelBakery.class) diff --git a/src/main/java/ru/betterend/mixin/client/MusicTrackerMixin.java b/src/main/java/ru/betterend/mixin/client/MusicTrackerMixin.java index 7af64b12..8c631b07 100644 --- a/src/main/java/ru/betterend/mixin/client/MusicTrackerMixin.java +++ b/src/main/java/ru/betterend/mixin/client/MusicTrackerMixin.java @@ -1,14 +1,5 @@ package ru.betterend.mixin.client; -import java.util.Random; - -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - import net.minecraft.client.Minecraft; import net.minecraft.client.resources.sounds.AbstractSoundInstance; import net.minecraft.client.resources.sounds.SoundInstance; @@ -16,8 +7,16 @@ import net.minecraft.client.sounds.MusicManager; import net.minecraft.sounds.Music; import net.minecraft.util.Mth; import net.minecraft.world.level.Level; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import ru.betterend.client.ClientOptions; +import java.util.Random; + @Mixin(MusicManager.class) public abstract class MusicTrackerMixin { @Final @@ -27,17 +26,17 @@ public abstract class MusicTrackerMixin { @Final @Shadow private Random random; - + @Shadow private SoundInstance currentMusic; - + @Shadow private int nextSongDelay; - + private static float volume = 1; private static float srcVolume = 0; private static long time; - + @Inject(method = "tick", at = @At("HEAD"), cancellable = true) public void be_onTick(CallbackInfo info) { if (ClientOptions.blendBiomeMusic()) { @@ -80,19 +79,19 @@ public abstract class MusicTrackerMixin { } } } - + private boolean be_isInEnd() { return minecraft.level != null && minecraft.level.dimension().equals(Level.END); } - + private boolean be_shouldChangeSound(Music musicSound) { return currentMusic != null && !musicSound.getEvent().getLocation().equals(this.currentMusic.getLocation()) && musicSound.replaceCurrentMusic(); } - + private boolean be_checkNullSound(Music musicSound) { return musicSound != null && musicSound.getEvent() != null; } - + @Shadow public abstract void startPlaying(Music type); } diff --git a/src/main/java/ru/betterend/mixin/client/WorldRendererMixin.java b/src/main/java/ru/betterend/mixin/client/WorldRendererMixin.java index b419cbab..b0049bca 100644 --- a/src/main/java/ru/betterend/mixin/client/WorldRendererMixin.java +++ b/src/main/java/ru/betterend/mixin/client/WorldRendererMixin.java @@ -1,18 +1,6 @@ package ru.betterend.mixin.client; -import java.util.Random; - import com.mojang.blaze3d.platform.GlStateManager; -import com.mojang.math.Matrix4f; -import net.minecraft.client.renderer.GameRenderer; -import org.lwjgl.opengl.GL11; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.BufferBuilder; import com.mojang.blaze3d.vertex.DefaultVertexFormat; @@ -20,23 +8,33 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.Tesselator; import com.mojang.blaze3d.vertex.VertexBuffer; import com.mojang.blaze3d.vertex.VertexFormat; +import com.mojang.math.Matrix4f; import com.mojang.math.Quaternion; import com.mojang.math.Vector3f; - import net.fabricmc.loader.api.FabricLoader; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.renderer.DimensionSpecialEffects; import net.minecraft.client.renderer.FogRenderer; +import net.minecraft.client.renderer.GameRenderer; import net.minecraft.client.renderer.LevelRenderer; import net.minecraft.client.renderer.RenderBuffers; import net.minecraft.client.renderer.texture.TextureManager; import net.minecraft.resources.ResourceLocation; +import org.lwjgl.opengl.GL11; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import ru.bclib.util.BackgroundInfo; import ru.bclib.util.MHelper; import ru.betterend.BetterEnd; import ru.betterend.client.ClientOptions; +import java.util.Random; + @Mixin(LevelRenderer.class) public class WorldRendererMixin { private static final ResourceLocation NEBULA_1 = BetterEnd.makeID("textures/sky/nebula_2.png"); @@ -44,7 +42,7 @@ public class WorldRendererMixin { private static final ResourceLocation HORIZON = BetterEnd.makeID("textures/sky/nebula_1.png"); private static final ResourceLocation STARS = BetterEnd.makeID("textures/sky/stars.png"); private static final ResourceLocation FOG = BetterEnd.makeID("textures/sky/fog.png"); - + private static VertexBuffer stars1; private static VertexBuffer stars2; private static VertexBuffer stars3; @@ -63,21 +61,21 @@ public class WorldRendererMixin { private static float blind02; private static float blind06; private static boolean directOpenGL = false; - + @Shadow @Final private Minecraft minecraft; - + @Shadow @Final private TextureManager textureManager; - + @Shadow private ClientLevel level; - + @Shadow private int ticks; - + @Inject(method = "*", at = @At("TAIL")) private void be_onInit(Minecraft client, RenderBuffers bufferBuilders, CallbackInfo info) { be_initStars(); @@ -90,20 +88,20 @@ public class WorldRendererMixin { axis2.normalize(); axis3.normalize(); axis4.normalize(); - + directOpenGL = FabricLoader.getInstance().isModLoaded("optifabric") || FabricLoader.getInstance().isModLoaded("immersive_portals"); } - + @Inject(method = "renderSky", at = @At("HEAD"), cancellable = true) private void be_renderBetterEndSky(PoseStack matrices, Matrix4f matrix4f, float tickDelta, Runnable runnable, CallbackInfo info) { if (ClientOptions.isCustomSky() && minecraft.level.effects().skyType() == DimensionSpecialEffects.SkyType.END) { time = (ticks % 360000) * 0.000017453292F; time2 = time * 2; time3 = time * 3; - + FogRenderer.levelFogColor(); RenderSystem.enableTexture(); - + if (directOpenGL) { GL11.glEnable(GL11.GL_ALPHA_TEST); GL11.glAlphaFunc(516, 0.0F); @@ -117,24 +115,24 @@ public class WorldRendererMixin { RenderSystem.enableBlend(); RenderSystem.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA); } - + float blindA = 1F - BackgroundInfo.blindness; blind02 = blindA * 0.2F; blind06 = blindA * 0.6F; - + if (blindA > 0) { matrices.pushPose(); matrices.mulPose(new Quaternion(0, time, 0, false)); RenderSystem.setShaderTexture(0, HORIZON); be_renderBuffer(matrices, matrix4f, horizon, DefaultVertexFormat.POSITION_TEX, 0.77F, 0.31F, 0.73F, 0.7F * blindA); matrices.popPose(); - + matrices.pushPose(); matrices.mulPose(new Quaternion(0, -time, 0, false)); RenderSystem.setShaderTexture(0, NEBULA_1); be_renderBuffer(matrices, matrix4f, nebulas1, DefaultVertexFormat.POSITION_TEX, 0.77F, 0.31F, 0.73F, blind02); matrices.popPose(); - + matrices.pushPose(); matrices.mulPose(new Quaternion(0, time2, 0, false)); RenderSystem.setShaderTexture(0, NEBULA_2); @@ -142,18 +140,18 @@ public class WorldRendererMixin { matrices.popPose(); RenderSystem.setShaderTexture(0, STARS); - + matrices.pushPose(); matrices.mulPose(axis3.rotation(time)); - be_renderBuffer(matrices, matrix4f ,stars3, DefaultVertexFormat.POSITION_TEX, 0.77F, 0.31F, 0.73F, blind06); + be_renderBuffer(matrices, matrix4f, stars3, DefaultVertexFormat.POSITION_TEX, 0.77F, 0.31F, 0.73F, blind06); matrices.popPose(); - + matrices.pushPose(); matrices.mulPose(axis4.rotation(time2)); be_renderBuffer(matrices, matrix4f, stars4, DefaultVertexFormat.POSITION_TEX, 1F, 1F, 1F, blind06); matrices.popPose(); } - + float a = (BackgroundInfo.fogDensity - 1F); if (a > 0) { if (a > 1) a = 1; @@ -162,36 +160,36 @@ public class WorldRendererMixin { } RenderSystem.disableTexture(); - + if (blindA > 0) { matrices.pushPose(); matrices.mulPose(axis1.rotation(time3)); be_renderBuffer(matrices, matrix4f, stars1, DefaultVertexFormat.POSITION, 1, 1, 1, blind06); matrices.popPose(); - + matrices.pushPose(); matrices.mulPose(axis2.rotation(time2)); be_renderBuffer(matrices, matrix4f, stars2, DefaultVertexFormat.POSITION, 0.95F, 0.64F, 0.93F, blind06); matrices.popPose(); } - + RenderSystem.enableTexture(); RenderSystem.depthMask(true); RenderSystem.defaultBlendFunc(); RenderSystem.disableBlend(); - + info.cancel(); } } - + private void be_renderBuffer(PoseStack matrices, Matrix4f matrix4f, VertexBuffer buffer, VertexFormat format, float r, float g, float b, float a) { RenderSystem.setShaderColor(r, g, b, a); buffer.bind(); format.setupBufferState(); buffer.drawWithShader(matrices.last().pose(), matrix4f, GameRenderer.getPositionTexShader()); - VertexBuffer.unbind(); - format.clearBufferState(); + VertexBuffer.unbind(); + format.clearBufferState(); } private void be_initStars() { @@ -205,7 +203,7 @@ public class WorldRendererMixin { horizon = be_buildBufferHorizon(buffer, horizon); fog = be_buildBufferFog(buffer, fog); } - + private VertexBuffer be_buildBufferStars(BufferBuilder bufferBuilder, VertexBuffer buffer, double minSize, double maxSize, int count, long seed) { if (buffer != null) { buffer.close(); @@ -221,7 +219,7 @@ public class WorldRendererMixin { return buffer; } - + private VertexBuffer be_buildBufferUVStars(BufferBuilder bufferBuilder, VertexBuffer buffer, double minSize, double maxSize, int count, long seed) { if (buffer != null) { buffer.close(); @@ -235,7 +233,7 @@ public class WorldRendererMixin { return buffer; } - + private VertexBuffer be_buildBufferFarFog(BufferBuilder bufferBuilder, VertexBuffer buffer, double minSize, double maxSize, int count, long seed) { if (buffer != null) { buffer.close(); @@ -249,7 +247,7 @@ public class WorldRendererMixin { return buffer; } - + private VertexBuffer be_buildBufferHorizon(BufferBuilder bufferBuilder, VertexBuffer buffer) { if (buffer != null) { buffer.close(); @@ -263,7 +261,7 @@ public class WorldRendererMixin { return buffer; } - + private VertexBuffer be_buildBufferFog(BufferBuilder bufferBuilder, VertexBuffer buffer) { if (buffer != null) { buffer.close(); @@ -277,7 +275,7 @@ public class WorldRendererMixin { return buffer; } - + private void be_makeStars(BufferBuilder buffer, double minSize, double maxSize, int count, long seed) { Random random = new Random(seed); buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION); @@ -320,7 +318,7 @@ public class WorldRendererMixin { } } } - + private void be_makeUVStars(BufferBuilder buffer, double minSize, double maxSize, int count, long seed) { Random random = new Random(seed); buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX); @@ -362,13 +360,13 @@ public class WorldRendererMixin { double ah = ab * n + ae * o; float texU = (pos >> 1) & 1; float texV = (((pos + 1) >> 1) & 1) / 4F + minV; - pos ++; + pos++; buffer.vertex(j + af, k + ad, l + ah).uv(texU, texV).endVertex(); } } } } - + private void be_makeFarFog(BufferBuilder buffer, double minSize, double maxSize, int count, long seed) { Random random = new Random(seed); buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX); @@ -413,26 +411,26 @@ public class WorldRendererMixin { double ah = ab * n + ae * o; float texU = (pos >> 1) & 1; float texV = ((pos + 1) >> 1) & 1; - pos ++; + pos++; buffer.vertex(j + af, k + ad, l + ah).uv(texU, texV).endVertex(); } } } } - + private void be_makeCylinder(BufferBuilder buffer, int segments, double height, double radius) { buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX); - for (int i = 0; i < segments; i ++) { + for (int i = 0; i < segments; i++) { double a1 = (double) i * Math.PI * 2.0 / (double) segments; double a2 = (double) (i + 1) * Math.PI * 2.0 / (double) segments; double px1 = Math.sin(a1) * radius; double pz1 = Math.cos(a1) * radius; double px2 = Math.sin(a2) * radius; double pz2 = Math.cos(a2) * radius; - + float u0 = (float) i / (float) segments; float u1 = (float) (i + 1) / (float) segments; - + buffer.vertex(px1, -height, pz1).uv(u0, 0).endVertex(); buffer.vertex(px1, height, pz1).uv(u0, 1).endVertex(); buffer.vertex(px2, height, pz2).uv(u1, 1).endVertex(); diff --git a/src/main/java/ru/betterend/mixin/common/AnvilMenuMixin.java b/src/main/java/ru/betterend/mixin/common/AnvilMenuMixin.java index 92615cdf..0023d35d 100644 --- a/src/main/java/ru/betterend/mixin/common/AnvilMenuMixin.java +++ b/src/main/java/ru/betterend/mixin/common/AnvilMenuMixin.java @@ -1,16 +1,5 @@ package ru.betterend.mixin.common; -import java.util.Collections; -import java.util.List; -import java.util.stream.Collectors; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - import net.minecraft.tags.BlockTags; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Player; @@ -23,10 +12,20 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.RecipeManager; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import ru.betterend.blocks.basis.EndAnvilBlock; import ru.betterend.interfaces.AnvilScreenHandlerExtended; import ru.betterend.recipe.builders.AnvilRecipe; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + @Mixin(AnvilMenu.class) public abstract class AnvilMenuMixin extends ItemCombinerMenu implements AnvilScreenHandlerExtended { private List be_recipes = Collections.emptyList(); @@ -49,21 +48,22 @@ public abstract class AnvilMenuMixin extends ItemCombinerMenu implements AnvilSc return 1; }, 1); anvilLevel.set(level); - } else { + } + else { anvilLevel.set(1); } } - + @Shadow public abstract void createResult(); - + @Inject(method = "mayPickup", at = @At("HEAD"), cancellable = true) protected void be_canTakeOutput(Player player, boolean present, CallbackInfoReturnable info) { if (be_currentRecipe != null) { info.setReturnValue(be_currentRecipe.checkHammerDurability(inputSlots, player)); } } - + @Inject(method = "onTake", at = @At("HEAD"), cancellable = true) protected void be_onTakeOutput(Player player, ItemStack stack, CallbackInfo info) { if (be_currentRecipe != null) { @@ -77,11 +77,13 @@ public abstract class AnvilMenuMixin extends ItemCombinerMenu implements AnvilSc if (landingState == null) { world.removeBlock(blockPos, false); world.levelEvent(1029, blockPos, 0); - } else { + } + else { world.setBlock(blockPos, landingState, 2); world.levelEvent(1030, blockPos, 0); } - } else { + } + else { world.levelEvent(1030, blockPos, 0); } }); @@ -89,7 +91,7 @@ public abstract class AnvilMenuMixin extends ItemCombinerMenu implements AnvilSc //info.setReturnValue(stack); } } - + @Inject(method = "createResult", at = @At("HEAD"), cancellable = true) public void be_updateOutput(CallbackInfo info) { RecipeManager recipeManager = this.player.level.getRecipeManager(); @@ -104,48 +106,50 @@ public abstract class AnvilMenuMixin extends ItemCombinerMenu implements AnvilSc } be_updateResult(); info.cancel(); - } else { + } + else { be_currentRecipe = null; } } } - + @Inject(method = "setItemName", at = @At("HEAD"), cancellable = true) public void be_setNewItemName(String string, CallbackInfo info) { if (be_currentRecipe != null) { info.cancel(); } } - + @Override public boolean clickMenuButton(Player player, int id) { if (id == 0) { be_previousRecipe(); return true; - } else if (id == 1) { + } + else if (id == 1) { be_nextRecipe(); return true; } return super.clickMenuButton(player, id); } - + private void be_updateResult() { if (be_currentRecipe == null) return; resultSlots.setItem(0, be_currentRecipe.assemble(inputSlots)); broadcastChanges(); } - + @Override public void be_updateCurrentRecipe(AnvilRecipe recipe) { this.be_currentRecipe = recipe; be_updateResult(); } - + @Override public AnvilRecipe be_getCurrentRecipe() { return be_currentRecipe; } - + @Override public List be_getRecipes() { return be_recipes; diff --git a/src/main/java/ru/betterend/mixin/common/BiomeGenerationSettingsAccessor.java b/src/main/java/ru/betterend/mixin/common/BiomeGenerationSettingsAccessor.java index eb1f962b..8298551f 100644 --- a/src/main/java/ru/betterend/mixin/common/BiomeGenerationSettingsAccessor.java +++ b/src/main/java/ru/betterend/mixin/common/BiomeGenerationSettingsAccessor.java @@ -1,26 +1,25 @@ package ru.betterend.mixin.common; -import java.util.List; -import java.util.function.Supplier; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - import net.minecraft.world.level.biome.BiomeGenerationSettings; import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeature; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +import java.util.List; +import java.util.function.Supplier; @Mixin(BiomeGenerationSettings.class) public interface BiomeGenerationSettingsAccessor { @Accessor("features") List>>> be_getFeatures(); - + @Accessor("features") void be_setFeatures(List>>> features); - + @Accessor("structureStarts") List>> be_getStructures(); - + @Accessor("structureStarts") void be_setStructures(List>> structures); } diff --git a/src/main/java/ru/betterend/mixin/common/BlockBehaviourMixin.java b/src/main/java/ru/betterend/mixin/common/BlockBehaviourMixin.java index ebc0c0bd..760d6ef1 100644 --- a/src/main/java/ru/betterend/mixin/common/BlockBehaviourMixin.java +++ b/src/main/java/ru/betterend/mixin/common/BlockBehaviourMixin.java @@ -1,14 +1,6 @@ package ru.betterend.mixin.common; -import java.util.List; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - import com.google.common.collect.Lists; - import net.minecraft.util.Mth; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; @@ -19,9 +11,15 @@ import net.minecraft.world.level.block.state.BlockBehaviour; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.storage.loot.LootContext; import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import ru.bclib.util.MHelper; import ru.betterend.item.tool.EndHammerItem; +import java.util.List; + @Mixin(BlockBehaviour.class) public abstract class BlockBehaviourMixin { @Inject(method = "getDrops", at = @At("HEAD"), cancellable = true) diff --git a/src/main/java/ru/betterend/mixin/common/ChorusFlowerBlockMixin.java b/src/main/java/ru/betterend/mixin/common/ChorusFlowerBlockMixin.java index dcd4bc58..3ce40d02 100644 --- a/src/main/java/ru/betterend/mixin/common/ChorusFlowerBlockMixin.java +++ b/src/main/java/ru/betterend/mixin/common/ChorusFlowerBlockMixin.java @@ -1,16 +1,5 @@ package ru.betterend.mixin.common; -import java.util.Random; - -import org.jetbrains.annotations.Nullable; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; @@ -26,17 +15,27 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.BlockStateProperties; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; +import org.jetbrains.annotations.Nullable; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import ru.bclib.api.TagAPI; import ru.bclib.util.BlocksHelper; import ru.betterend.blocks.VanillaBlockProperties; import ru.betterend.registry.EndBlocks; import ru.betterend.world.generator.GeneratorOptions; +import java.util.Random; + @Mixin(value = ChorusFlowerBlock.class, priority = 100) public abstract class ChorusFlowerBlockMixin extends Block { private static final VoxelShape SHAPE_FULL = Block.box(0, 0, 0, 16, 16, 16); private static final VoxelShape SHAPE_HALF = Block.box(0, 0, 0, 16, 4, 16); - + public ChorusFlowerBlockMixin(Properties settings) { super(settings); } @@ -44,7 +43,7 @@ public abstract class ChorusFlowerBlockMixin extends Block { @Final @Shadow private ChorusPlantBlock plant; - + @Inject(method = "canSurvive", at = @At("HEAD"), cancellable = true) private void be_canSurvive(BlockState state, LevelReader world, BlockPos pos, CallbackInfoReturnable info) { if (world.getBlockState(pos.below()).is(EndBlocks.CHORUS_NYLIUM)) { @@ -52,7 +51,7 @@ public abstract class ChorusFlowerBlockMixin extends Block { info.cancel(); } } - + @Inject(method = "randomTick", at = @At("HEAD"), cancellable = true) private void be_randomTick(BlockState state, ServerLevel world, BlockPos pos, Random random, CallbackInfo info) { if (world.getBlockState(pos.below()).is(TagAPI.END_GROUND)) { @@ -72,7 +71,7 @@ public abstract class ChorusFlowerBlockMixin extends Block { } } } - + @Inject(method = "generatePlant", at = @At("RETURN"), cancellable = true) private static void be_generatePlant(LevelAccessor world, BlockPos pos, Random random, int size, CallbackInfo info) { BlockState state = world.getBlockState(pos); @@ -80,16 +79,20 @@ public abstract class ChorusFlowerBlockMixin extends Block { BlocksHelper.setWithoutUpdate(world, pos, state.setValue(VanillaBlockProperties.ROOTS, true)); } } - + @Shadow - private static boolean allNeighborsEmpty(LevelReader world, BlockPos pos, @Nullable Direction exceptDirection) { return false; } - + private static boolean allNeighborsEmpty(LevelReader world, BlockPos pos, @Nullable Direction exceptDirection) { + return false; + } + @Shadow - private void placeGrownFlower(Level world, BlockPos pos, int age) {} - + private void placeGrownFlower(Level world, BlockPos pos, int age) { + } + @Shadow - private void placeDeadFlower(Level world, BlockPos pos) {} - + private void placeDeadFlower(Level world, BlockPos pos) { + } + @Override public VoxelShape getShape(BlockState state, BlockGetter world, BlockPos pos, CollisionContext context) { if (GeneratorOptions.changeChorusPlant()) { diff --git a/src/main/java/ru/betterend/mixin/common/ChorusPlantBlockMixin.java b/src/main/java/ru/betterend/mixin/common/ChorusPlantBlockMixin.java index eaa91743..161df5cc 100644 --- a/src/main/java/ru/betterend/mixin/common/ChorusPlantBlockMixin.java +++ b/src/main/java/ru/betterend/mixin/common/ChorusPlantBlockMixin.java @@ -1,11 +1,5 @@ package ru.betterend.mixin.common; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.item.context.BlockPlaceContext; @@ -20,6 +14,11 @@ import net.minecraft.world.level.block.state.BlockBehaviour; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import ru.bclib.api.TagAPI; import ru.betterend.blocks.VanillaBlockProperties; import ru.betterend.registry.EndBlocks; @@ -37,7 +36,7 @@ public abstract class ChorusPlantBlockMixin extends Block { this.registerDefaultState(this.defaultBlockState().setValue(VanillaBlockProperties.ROOTS, false)); } } - + @Inject(method = "createBlockStateDefinition", at = @At("TAIL")) private void be_createBlockStateDefinition(StateDefinition.Builder builder, CallbackInfo info) { GeneratorOptions.init(); @@ -61,7 +60,7 @@ public abstract class ChorusPlantBlockMixin extends Block { info.cancel(); } } - + @Inject(method = "Lnet/minecraft/world/level/block/ChorusPlantBlock;getStateForPlacement" + "(Lnet/minecraft/world/level/BlockGetter;Lnet/minecraft/core/BlockPos;)" + "Lnet/minecraft/world/level/block/state/BlockState;", @@ -86,7 +85,7 @@ public abstract class ChorusPlantBlockMixin extends Block { } } } - + @Inject(method = "canSurvive", at = @At("HEAD"), cancellable = true) private void be_canSurvive(BlockState state, LevelReader world, BlockPos pos, CallbackInfoReturnable info) { BlockState down = world.getBlockState(pos.below()); @@ -95,7 +94,7 @@ public abstract class ChorusPlantBlockMixin extends Block { info.cancel(); } } - + @Inject(method = "updateShape", at = @At("RETURN"), cancellable = true) private void be_updateShape(BlockState state, Direction direction, BlockState newState, LevelAccessor world, BlockPos pos, BlockPos posFrom, CallbackInfoReturnable info) { BlockState plant = info.getReturnValue(); diff --git a/src/main/java/ru/betterend/mixin/common/ChunkBiomeContainerMixin.java b/src/main/java/ru/betterend/mixin/common/ChunkBiomeContainerMixin.java index 2a10659e..1cd6d74f 100644 --- a/src/main/java/ru/betterend/mixin/common/ChunkBiomeContainerMixin.java +++ b/src/main/java/ru/betterend/mixin/common/ChunkBiomeContainerMixin.java @@ -1,20 +1,19 @@ package ru.betterend.mixin.common; -import java.lang.reflect.Field; - -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; - import net.minecraft.core.BlockPos; import net.minecraft.util.BitStorage; import net.minecraft.util.Mth; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.chunk.ChunkBiomeContainer; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; import ru.betterend.BetterEnd; import ru.betterend.integration.Integrations; import ru.betterend.interfaces.IBiomeArray; +import java.lang.reflect.Field; + @Mixin(ChunkBiomeContainer.class) public class ChunkBiomeContainerMixin implements IBiomeArray { @Final @@ -35,7 +34,7 @@ public class ChunkBiomeContainerMixin implements IBiomeArray { int biomeY = pos.getY() >> 2; int biomeZ = pos.getZ() >> 2; int index = be_getArrayIndex(biomeX, biomeY, biomeZ); - + if (Integrations.hasHydrogen()) { try { ChunkBiomeContainer self = (ChunkBiomeContainer) (Object) this; @@ -70,12 +69,16 @@ public class ChunkBiomeContainerMixin implements IBiomeArray { } return; } - + biomes[index] = biome; } - @Shadow @Final private int quartMinY; - @Shadow @Final private int quartHeight; + @Shadow + @Final + private int quartMinY; + @Shadow + @Final + private int quartHeight; private int be_getArrayIndex(int biomeX, int biomeY, int biomeZ) { int i = biomeX & HORIZONTAL_MASK; @@ -83,21 +86,21 @@ public class ChunkBiomeContainerMixin implements IBiomeArray { int k = biomeZ & HORIZONTAL_MASK; return j << WIDTH_BITS + WIDTH_BITS | k << WIDTH_BITS | i; } - + private Field be_getField(String name) throws Exception { Field field = ChunkBiomeContainer.class.getDeclaredField(name); field.setAccessible(true); return field; } - + private BitStorage be_getHydrogenStorage(ChunkBiomeContainer container) throws Exception { return (BitStorage) be_getField("intArray").get(container); } - + private Biome[] be_getHydrogenPalette(ChunkBiomeContainer container) throws Exception { return (Biome[]) be_getField("palette").get(container); } - + private int be_getHydrogenPaletteIndex(Biome biome, Biome[] palette) { int index = -1; for (int i = 0; i < palette.length; i++) { @@ -108,11 +111,11 @@ public class ChunkBiomeContainerMixin implements IBiomeArray { } return index; } - + private void be_setHydrogenPalette(ChunkBiomeContainer container, Biome[] palette) throws Exception { be_getField("palette").set(container, palette); } - + private void be_setHydrogenStorage(ChunkBiomeContainer container, BitStorage storage) throws Exception { be_getField("intArray").set(container, storage); } diff --git a/src/main/java/ru/betterend/mixin/common/ComposterBlockAccessor.java b/src/main/java/ru/betterend/mixin/common/ComposterBlockAccessor.java index 1d754b20..c0bc899e 100644 --- a/src/main/java/ru/betterend/mixin/common/ComposterBlockAccessor.java +++ b/src/main/java/ru/betterend/mixin/common/ComposterBlockAccessor.java @@ -1,10 +1,9 @@ package ru.betterend.mixin.common; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Invoker; - import net.minecraft.world.level.ItemLike; import net.minecraft.world.level.block.ComposterBlock; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; @Mixin(ComposterBlock.class) public interface ComposterBlockAccessor { diff --git a/src/main/java/ru/betterend/mixin/common/CraftingMenuMixin.java b/src/main/java/ru/betterend/mixin/common/CraftingMenuMixin.java index 11c7f94e..48e81bf2 100644 --- a/src/main/java/ru/betterend/mixin/common/CraftingMenuMixin.java +++ b/src/main/java/ru/betterend/mixin/common/CraftingMenuMixin.java @@ -1,5 +1,9 @@ package ru.betterend.mixin.common; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.ContainerLevelAccess; +import net.minecraft.world.inventory.CraftingMenu; +import net.minecraft.world.level.block.CraftingTableBlock; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -7,11 +11,6 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.inventory.ContainerLevelAccess; -import net.minecraft.world.inventory.CraftingMenu; -import net.minecraft.world.level.block.CraftingTableBlock; - @Mixin(CraftingMenu.class) public abstract class CraftingMenuMixin { @Final diff --git a/src/main/java/ru/betterend/mixin/common/DimensionTypeMixin.java b/src/main/java/ru/betterend/mixin/common/DimensionTypeMixin.java index 5e0ac980..24520f25 100644 --- a/src/main/java/ru/betterend/mixin/common/DimensionTypeMixin.java +++ b/src/main/java/ru/betterend/mixin/common/DimensionTypeMixin.java @@ -1,16 +1,15 @@ package ru.betterend.mixin.common; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - import net.minecraft.core.Registry; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.dimension.DimensionType; import net.minecraft.world.level.levelgen.NoiseBasedChunkGenerator; import net.minecraft.world.level.levelgen.NoiseGeneratorSettings; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import ru.betterend.world.generator.BetterEndBiomeSource; import ru.betterend.world.generator.GeneratorOptions; @@ -21,7 +20,7 @@ public class DimensionTypeMixin { info.setReturnValue(new NoiseBasedChunkGenerator(new BetterEndBiomeSource(biomeRegistry, seed), seed, () -> chunkGeneratorSettingsRegistry.getOrThrow(NoiseGeneratorSettings.END))); } - + @Inject(method = "createDragonFight", at = @At("HEAD"), cancellable = true) private void be_hasEnderDragonFight(CallbackInfoReturnable info) { if (!GeneratorOptions.hasDragonFights()) { diff --git a/src/main/java/ru/betterend/mixin/common/EnchantmentMenuMixin.java b/src/main/java/ru/betterend/mixin/common/EnchantmentMenuMixin.java index 3848fb27..6a4c95e0 100644 --- a/src/main/java/ru/betterend/mixin/common/EnchantmentMenuMixin.java +++ b/src/main/java/ru/betterend/mixin/common/EnchantmentMenuMixin.java @@ -1,15 +1,5 @@ package ru.betterend.mixin.common; -import java.util.List; -import java.util.Random; - -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - import net.minecraft.core.Registry; import net.minecraft.world.Container; import net.minecraft.world.inventory.AbstractContainerMenu; @@ -20,8 +10,17 @@ import net.minecraft.world.inventory.MenuType; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.enchantment.EnchantmentHelper; import net.minecraft.world.item.enchantment.EnchantmentInstance; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import ru.bclib.api.TagAPI; +import java.util.List; +import java.util.Random; + @Mixin(EnchantmentMenu.class) public abstract class EnchantmentMenuMixin extends AbstractContainerMenu { @Final diff --git a/src/main/java/ru/betterend/mixin/common/EndCityFeatureMixin.java b/src/main/java/ru/betterend/mixin/common/EndCityFeatureMixin.java index 5a054c59..6a53bc32 100644 --- a/src/main/java/ru/betterend/mixin/common/EndCityFeatureMixin.java +++ b/src/main/java/ru/betterend/mixin/common/EndCityFeatureMixin.java @@ -1,19 +1,18 @@ package ru.betterend.mixin.common; -import net.minecraft.world.level.LevelHeightAccessor; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.LevelHeightAccessor; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.biome.BiomeSource; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.WorldgenRandom; import net.minecraft.world.level.levelgen.feature.EndCityFeature; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import ru.betterend.world.generator.GeneratorOptions; @Mixin(EndCityFeature.class) @@ -26,7 +25,7 @@ public class EndCityFeatureMixin { info.setReturnValue(getYPositionForFeature(pos, chunkGenerator, levelHeightAccessor) >= 60); info.cancel(); } - else if (chunkRandom.nextInt(chance) == 0){ + else if (chunkRandom.nextInt(chance) == 0) { info.setReturnValue(getYPositionForFeature(pos, chunkGenerator, levelHeightAccessor) >= 60); info.cancel(); } @@ -36,7 +35,7 @@ public class EndCityFeatureMixin { } } } - + @Shadow private static int getYPositionForFeature(ChunkPos pos, ChunkGenerator chunkGenerator, LevelHeightAccessor levelHeightAccessor) { return 0; diff --git a/src/main/java/ru/betterend/mixin/common/EndDragonFightMixin.java b/src/main/java/ru/betterend/mixin/common/EndDragonFightMixin.java index a4dc5b6a..64b9d598 100644 --- a/src/main/java/ru/betterend/mixin/common/EndDragonFightMixin.java +++ b/src/main/java/ru/betterend/mixin/common/EndDragonFightMixin.java @@ -1,17 +1,6 @@ package ru.betterend.mixin.common; -import java.util.List; - -import org.apache.logging.log4j.Logger; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - import com.google.common.collect.Lists; - import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; @@ -21,9 +10,18 @@ import net.minecraft.world.level.block.state.pattern.BlockPattern; import net.minecraft.world.level.dimension.end.DragonRespawnAnimation; import net.minecraft.world.level.dimension.end.EndDragonFight; import net.minecraft.world.phys.AABB; +import org.apache.logging.log4j.Logger; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import ru.bclib.util.BlocksHelper; import ru.betterend.world.generator.GeneratorOptions; +import java.util.List; + @Mixin(EndDragonFight.class) public class EndDragonFightMixin { @Shadow @@ -45,10 +43,12 @@ public class EndDragonFightMixin { } @Shadow - private void spawnExitPortal(boolean bl) {} + private void spawnExitPortal(boolean bl) { + } @Shadow - private void respawnDragon(List list) {} + private void respawnDragon(List list) { + } @Inject(method = "tryRespawn", at = @At("HEAD"), cancellable = true) private void be_tryRespawnDragon(CallbackInfo info) { @@ -73,7 +73,7 @@ public class EndDragonFightMixin { for (Direction dir : BlocksHelper.HORIZONTAL) { BlockPos central = center.relative(dir, 4); List crystalList = level.getEntitiesOfClass(EndCrystal.class, new AABB(central.below(10).south().west(), central.above(10).north().east())); - + int count = crystalList.size(); for (int n = 0; n < count; n++) { EndCrystal crystal = crystalList.get(n); @@ -83,7 +83,7 @@ public class EndDragonFightMixin { n--; } } - + if (crystalList.isEmpty()) { info.cancel(); return; diff --git a/src/main/java/ru/betterend/mixin/common/EndPodiumFeatureMixin.java b/src/main/java/ru/betterend/mixin/common/EndPodiumFeatureMixin.java index a10f460b..bb88dcc2 100644 --- a/src/main/java/ru/betterend/mixin/common/EndPodiumFeatureMixin.java +++ b/src/main/java/ru/betterend/mixin/common/EndPodiumFeatureMixin.java @@ -30,7 +30,7 @@ public class EndPodiumFeatureMixin { @Final @Shadow private boolean active; - + @Inject(method = "place", at = @At("HEAD"), cancellable = true) private void be_place(FeaturePlaceContext featurePlaceContext, CallbackInfoReturnable info) { if (!GeneratorOptions.hasPortal()) { @@ -49,14 +49,14 @@ public class EndPodiumFeatureMixin { info.cancel(); } } - + @ModifyVariable(method = "place", ordinal = 0, at = @At("HEAD")) private FeaturePlaceContext be_setPosOnGround(FeaturePlaceContext featurePlaceContext) { WorldGenLevel world = featurePlaceContext.level(); - BlockPos pos = be_updatePos(featurePlaceContext.origin(), world); - return new FeaturePlaceContext(world, featurePlaceContext.chunkGenerator(), featurePlaceContext.random(), pos, featurePlaceContext.config()); + BlockPos pos = be_updatePos(featurePlaceContext.origin(), world); + return new FeaturePlaceContext(world, featurePlaceContext.chunkGenerator(), featurePlaceContext.random(), pos, featurePlaceContext.config()); } - + private BlockPos be_updatePos(BlockPos blockPos, WorldGenLevel world) { if (GeneratorOptions.useNewGenerator()) { BlockPos pos = GeneratorOptions.getPortalPos(); diff --git a/src/main/java/ru/betterend/mixin/common/EndSpikeMixin.java b/src/main/java/ru/betterend/mixin/common/EndSpikeMixin.java index 94361158..d29bc07c 100644 --- a/src/main/java/ru/betterend/mixin/common/EndSpikeMixin.java +++ b/src/main/java/ru/betterend/mixin/common/EndSpikeMixin.java @@ -1,14 +1,13 @@ package ru.betterend.mixin.common; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.level.levelgen.feature.SpikeFeature.EndSpike; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -import net.minecraft.nbt.CompoundTag; -import net.minecraft.world.level.levelgen.feature.SpikeFeature.EndSpike; import ru.bclib.api.WorldDataAPI; import ru.betterend.BetterEnd; import ru.betterend.world.generator.GeneratorOptions; @@ -31,12 +30,12 @@ public class EndSpikeMixin { info.setReturnValue(maxY); } } - + @Shadow public int getCenterX() { return 0; } - + @Shadow public int getCenterZ() { return 0; diff --git a/src/main/java/ru/betterend/mixin/common/EnderManMixin.java b/src/main/java/ru/betterend/mixin/common/EnderManMixin.java index 4102fef9..dc5f1424 100644 --- a/src/main/java/ru/betterend/mixin/common/EnderManMixin.java +++ b/src/main/java/ru/betterend/mixin/common/EnderManMixin.java @@ -1,14 +1,13 @@ package ru.betterend.mixin.common; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.monster.EnderMan; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.enchantment.EnchantmentHelper; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import ru.betterend.effects.EndEnchantments; import ru.betterend.effects.EndStatusEffects; diff --git a/src/main/java/ru/betterend/mixin/common/EntityMixin.java b/src/main/java/ru/betterend/mixin/common/EntityMixin.java index 52a4f80a..cb37e312 100644 --- a/src/main/java/ru/betterend/mixin/common/EntityMixin.java +++ b/src/main/java/ru/betterend/mixin/common/EntityMixin.java @@ -1,12 +1,5 @@ package ru.betterend.mixin.common; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.Entity; @@ -14,6 +7,12 @@ import net.minecraft.world.entity.EntityType; import net.minecraft.world.level.Level; import net.minecraft.world.level.portal.PortalInfo; import net.minecraft.world.phys.Vec3; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import ru.betterend.interfaces.TeleportingEntity; @Mixin(Entity.class) @@ -25,24 +24,25 @@ public abstract class EntityMixin implements TeleportingEntity { @Shadow public Level level; - + @Final @Shadow public abstract void unRide(); - + @Shadow public abstract Vec3 getDeltaMovement(); - + @Shadow public abstract EntityType getType(); - + @Shadow protected abstract PortalInfo findDimensionEntryPoint(ServerLevel destination); @Shadow protected abstract void removeAfterChangingDimensions(); - @Shadow public abstract boolean isRemoved(); + @Shadow + public abstract boolean isRemoved(); private BlockPos exitPos; @@ -75,7 +75,7 @@ public abstract class EntityMixin implements TeleportingEntity { } } } - + @Inject(method = "findDimensionEntryPoint", at = @At("HEAD"), cancellable = true) protected void be_findDimensionEntryPoint(ServerLevel destination, CallbackInfoReturnable info) { if (be_canTeleport()) { diff --git a/src/main/java/ru/betterend/mixin/common/LivingEntityMixin.java b/src/main/java/ru/betterend/mixin/common/LivingEntityMixin.java index bbf7db3f..c78eda16 100644 --- a/src/main/java/ru/betterend/mixin/common/LivingEntityMixin.java +++ b/src/main/java/ru/betterend/mixin/common/LivingEntityMixin.java @@ -1,16 +1,5 @@ package ru.betterend.mixin.common; -import java.util.Collection; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.At.Shift; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.ModifyArg; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - import net.minecraft.sounds.SoundEvent; import net.minecraft.util.Mth; import net.minecraft.world.damagesource.DamageSource; @@ -32,12 +21,22 @@ import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.phys.Vec3; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.At.Shift; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.ModifyArg; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import ru.betterend.BetterEnd; import ru.betterend.interfaces.FallFlyingItem; import ru.betterend.interfaces.MobEffectApplier; import ru.betterend.item.CrystaliteArmor; import ru.betterend.registry.EndAttributes; +import java.util.Collection; + @Mixin(LivingEntity.class) public abstract class LivingEntityMixin extends Entity { @@ -94,7 +93,8 @@ public abstract class LivingEntityMixin extends Entity { if (mobEffectInstance.getEffect() == MobEffects.BLINDNESS && getAttributes().getValue(EndAttributes.BLINDNESS_RESISTANCE) > 0.0) { info.setReturnValue(false); } - } catch (Exception ex) { + } + catch (Exception ex) { BetterEnd.LOGGER.warning("Blindness resistance attribute haven't been registered."); } } @@ -103,8 +103,8 @@ public abstract class LivingEntityMixin extends Entity { public void be_hurt(DamageSource source, float amount, CallbackInfoReturnable info) { this.lastAttacker = source.getEntity(); } - - @ModifyArg(method = "hurt", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/LivingEntity;knockback(DDD)V"), index=0) + + @ModifyArg(method = "hurt", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/LivingEntity;knockback(DDD)V"), index = 0) private double be_increaseKnockback(double value, double x, double z) { if (lastAttacker != null && lastAttacker instanceof LivingEntity) { LivingEntity attacker = (LivingEntity) lastAttacker; @@ -125,10 +125,12 @@ public abstract class LivingEntityMixin extends Entity { livingEntity -> livingEntity.broadcastBreakEvent(EquipmentSlot.CHEST)); } isFlying = true; - } else { + } + else { isFlying = false; } - } else { + } + else { isFlying = false; } setSharedFlag(7, isFlying); diff --git a/src/main/java/ru/betterend/mixin/common/MinecraftServerMixin.java b/src/main/java/ru/betterend/mixin/common/MinecraftServerMixin.java index e6cf8cfd..a425eaa0 100644 --- a/src/main/java/ru/betterend/mixin/common/MinecraftServerMixin.java +++ b/src/main/java/ru/betterend/mixin/common/MinecraftServerMixin.java @@ -1,15 +1,5 @@ package ru.betterend.mixin.common; -import java.util.Map; - -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - import net.minecraft.resources.ResourceKey; import net.minecraft.server.MinecraftServer; import net.minecraft.server.ServerResources; @@ -19,21 +9,30 @@ import net.minecraft.server.players.PlayerList; import net.minecraft.world.level.Level; import net.minecraft.world.level.storage.ServerLevelData; import net.minecraft.world.level.storage.WorldData; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import ru.betterend.world.generator.GeneratorOptions; +import java.util.Map; + @Mixin(MinecraftServer.class) public abstract class MinecraftServerMixin { @Shadow private ServerResources resources; - + @Final @Shadow private Map, ServerLevel> levels; - + @Final @Shadow protected WorldData worldData; - + @Inject(method = "overworld", at = @At(value = "HEAD"), cancellable = true) private void be_overworld(CallbackInfoReturnable info) { if (GeneratorOptions.swapOverworldToEnd()) { @@ -45,7 +44,7 @@ public abstract class MinecraftServerMixin { info.cancel(); } } - + @Inject(method = "createLevels", at = @At(value = "TAIL")) private void be_createLevels(ChunkProgressListener worldGenerationProgressListener, CallbackInfo info) { if (GeneratorOptions.swapOverworldToEnd()) { @@ -61,7 +60,11 @@ public abstract class MinecraftServerMixin { } } - @Shadow private static void setInitialSpawn(ServerLevel serverLevel, ServerLevelData serverLevelData, boolean bl, boolean bl2) {}; + @Shadow + private static void setInitialSpawn(ServerLevel serverLevel, ServerLevelData serverLevelData, boolean bl, boolean bl2) { + } + + ; @Inject(method = "setInitialSpawn", at = @At(value = "HEAD"), cancellable = true) private static void be_setInitialSpawn(ServerLevel world, ServerLevelData serverWorldProperties, boolean bonusChest, boolean debugWorld, CallbackInfo info) { @@ -69,7 +72,7 @@ public abstract class MinecraftServerMixin { info.cancel(); } } - + @Shadow public PlayerList getPlayerList() { diff --git a/src/main/java/ru/betterend/mixin/common/MonsterMixin.java b/src/main/java/ru/betterend/mixin/common/MonsterMixin.java index b2d77c7c..403f11e0 100644 --- a/src/main/java/ru/betterend/mixin/common/MonsterMixin.java +++ b/src/main/java/ru/betterend/mixin/common/MonsterMixin.java @@ -1,13 +1,5 @@ package ru.betterend.mixin.common; -import java.util.List; -import java.util.Random; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - import net.minecraft.core.BlockPos; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.MobSpawnType; @@ -15,6 +7,13 @@ import net.minecraft.world.entity.monster.EnderMan; import net.minecraft.world.entity.monster.Monster; import net.minecraft.world.level.ServerLevelAccessor; import net.minecraft.world.phys.AABB; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import java.util.List; +import java.util.Random; @Mixin(Monster.class) public class MonsterMixin { @@ -23,7 +22,9 @@ public class MonsterMixin { boolean canSpawn = info.getReturnValue(); if (canSpawn && spawnReason == MobSpawnType.NATURAL && type == EntityType.ENDERMAN) { AABB box = new AABB(pos).inflate(16); - List entities = serverWorldAccess.getEntitiesOfClass(EnderMan.class, box, (entity) -> { return true; }); + List entities = serverWorldAccess.getEntitiesOfClass(EnderMan.class, box, (entity) -> { + return true; + }); info.setReturnValue(entities.size() < 6); } } diff --git a/src/main/java/ru/betterend/mixin/common/NoiseBasedChunkGeneratorMixin.java b/src/main/java/ru/betterend/mixin/common/NoiseBasedChunkGeneratorMixin.java index c39fa3e3..e03b2975 100644 --- a/src/main/java/ru/betterend/mixin/common/NoiseBasedChunkGeneratorMixin.java +++ b/src/main/java/ru/betterend/mixin/common/NoiseBasedChunkGeneratorMixin.java @@ -1,37 +1,36 @@ package ru.betterend.mixin.common; -import java.util.function.Supplier; - -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - import net.minecraft.world.level.biome.BiomeSource; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.NoiseBasedChunkGenerator; import net.minecraft.world.level.levelgen.NoiseGeneratorSettings; import net.minecraft.world.level.levelgen.StructureSettings; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import ru.betterend.world.generator.GeneratorOptions; import ru.betterend.world.generator.TerrainGenerator; +import java.util.function.Supplier; + @Mixin(NoiseBasedChunkGenerator.class) public abstract class NoiseBasedChunkGeneratorMixin extends ChunkGenerator { @Final @Shadow protected Supplier settings; - + public NoiseBasedChunkGeneratorMixin(BiomeSource populationSource, BiomeSource biomeSource, StructureSettings structuresConfig, long worldSeed) { super(populationSource, biomeSource, structuresConfig, worldSeed); } - + @Inject(method = "(Lnet/minecraft/world/level/biome/BiomeSource;Lnet/minecraft/world/level/biome/BiomeSource;JLjava/util/function/Supplier;)V", at = @At("TAIL")) private void beOnInit(BiomeSource populationSource, BiomeSource biomeSource, long seed, Supplier settings, CallbackInfo info) { TerrainGenerator.initNoise(seed); } - + @Inject(method = "fillNoiseColumn([DIIII)V", at = @At("HEAD"), cancellable = true, allow = 2) private void be_fillNoiseColumn(double[] buffer, int x, int z, int k, int l, CallbackInfo info) { if (GeneratorOptions.useNewGenerator() && settings.get().stable(NoiseGeneratorSettings.END)) { diff --git a/src/main/java/ru/betterend/mixin/common/PlayerAdvancementsMixin.java b/src/main/java/ru/betterend/mixin/common/PlayerAdvancementsMixin.java index 6ddf6f04..61042c36 100644 --- a/src/main/java/ru/betterend/mixin/common/PlayerAdvancementsMixin.java +++ b/src/main/java/ru/betterend/mixin/common/PlayerAdvancementsMixin.java @@ -1,22 +1,21 @@ package ru.betterend.mixin.common; +import net.minecraft.advancements.Advancement; +import net.minecraft.server.PlayerAdvancements; +import net.minecraft.server.level.ServerPlayer; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At.Shift; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -import net.minecraft.advancements.Advancement; -import net.minecraft.server.PlayerAdvancements; -import net.minecraft.server.level.ServerPlayer; import ru.betterend.events.PlayerAdvancementsCallback; @Mixin(PlayerAdvancements.class) public abstract class PlayerAdvancementsMixin { @Shadow private ServerPlayer player; - + @Inject(method = "award", at = @At( value = "INVOKE", target = "Lnet/minecraft/advancements/AdvancementRewards;grant(Lnet/minecraft/server/level/ServerPlayer;)V", diff --git a/src/main/java/ru/betterend/mixin/common/PlayerListMixin.java b/src/main/java/ru/betterend/mixin/common/PlayerListMixin.java index b855259b..03ac97f4 100644 --- a/src/main/java/ru/betterend/mixin/common/PlayerListMixin.java +++ b/src/main/java/ru/betterend/mixin/common/PlayerListMixin.java @@ -1,12 +1,5 @@ package ru.betterend.mixin.common; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; -import java.util.UUID; - import com.mojang.authlib.GameProfile; import com.mojang.serialization.DataResult; import com.mojang.serialization.Dynamic; @@ -57,6 +50,13 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import ru.betterend.world.generator.GeneratorOptions; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.UUID; + @Mixin(PlayerList.class) public class PlayerListMixin { @Final @@ -97,7 +97,8 @@ public class PlayerListMixin { Logger var10001 = LOGGER; Objects.requireNonNull(var10001); var23 = (ResourceKey) var10000.resultOrPartial(var10001::error).orElse(Level.END); - } else { + } + else { var23 = Level.END; } @@ -107,7 +108,8 @@ public class PlayerListMixin { if (serverLevel == null) { LOGGER.warn("Unknown respawn dimension {}, defaulting to overworld", registryKey); serverLevel3 = this.server.overworld(); - } else { + } + else { serverLevel3 = serverLevel; } @@ -151,10 +153,11 @@ public class PlayerListMixin { TranslatableComponent mutableText2; if (serverPlayer.getGameProfile().getName().equalsIgnoreCase(string)) { mutableText2 = new TranslatableComponent("multiplayer.player.joined", - new Object[] { serverPlayer.getDisplayName() }); - } else { + new Object[]{serverPlayer.getDisplayName()}); + } + else { mutableText2 = new TranslatableComponent("multiplayer.player.joined.renamed", - new Object[] { serverPlayer.getDisplayName(), string }); + new Object[]{serverPlayer.getDisplayName(), string}); } this.broadcastMessage(mutableText2.withStyle(ChatFormatting.YELLOW), ChatType.SYSTEM, Util.NIL_UUID); @@ -163,7 +166,7 @@ public class PlayerListMixin { this.players.add(serverPlayer); this.playersByUUID.put(serverPlayer.getUUID(), serverPlayer); this.broadcastAll(new ClientboundPlayerInfoPacket(ClientboundPlayerInfoPacket.Action.ADD_PLAYER, - new ServerPlayer[] { serverPlayer })); + new ServerPlayer[]{serverPlayer})); for (ServerPlayer player : this.players) { serverPlayer.connection.send(new ClientboundPlayerInfoPacket(ClientboundPlayerInfoPacket.Action.ADD_PLAYER, @@ -193,7 +196,8 @@ public class PlayerListMixin { UUID uUID2; if (compoundTag2.hasUUID("Attach")) { uUID2 = compoundTag2.getUUID("Attach"); - } else { + } + else { uUID2 = null; } @@ -201,7 +205,8 @@ public class PlayerListMixin { Entity entity3; if (entity.getUUID().equals(uUID2)) { serverPlayer.startRiding(entity, true); - } else { + } + else { var21 = entity.getIndirectPassengers().iterator(); while (var21.hasNext()) { @@ -240,7 +245,8 @@ public class PlayerListMixin { // private void updatePlayerGameMode(ServerPlayer player, @Nullable ServerPlayer oldPlayer, ServerLevel world) {} @Shadow - public void sendPlayerPermissionLevel(ServerPlayer player) {} + public void sendPlayerPermissionLevel(ServerPlayer player) { + } @Shadow public int getPlayerCount() { @@ -248,7 +254,9 @@ public class PlayerListMixin { } @Shadow - public int getMaxPlayers() { return 0; } + public int getMaxPlayers() { + return 0; + } @Shadow public MinecraftServer getServer() { @@ -256,14 +264,18 @@ public class PlayerListMixin { } @Shadow - protected void updateEntireScoreboard(ServerScoreboard scoreboard, ServerPlayer player) {} + protected void updateEntireScoreboard(ServerScoreboard scoreboard, ServerPlayer player) { + } @Shadow - public void broadcastMessage(Component message, ChatType type, UUID senderUuid) {} + public void broadcastMessage(Component message, ChatType type, UUID senderUuid) { + } @Shadow - public void broadcastAll(Packet packet) {} + public void broadcastAll(Packet packet) { + } @Shadow - public void sendLevelInfo(ServerPlayer player, ServerLevel world) {} + public void sendLevelInfo(ServerPlayer player, ServerLevel world) { + } } diff --git a/src/main/java/ru/betterend/mixin/common/PlayerMixin.java b/src/main/java/ru/betterend/mixin/common/PlayerMixin.java index e8ee2a4c..64ffafc3 100644 --- a/src/main/java/ru/betterend/mixin/common/PlayerMixin.java +++ b/src/main/java/ru/betterend/mixin/common/PlayerMixin.java @@ -1,12 +1,5 @@ package ru.betterend.mixin.common; -import java.util.Optional; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; @@ -20,6 +13,10 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.Vec3; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import ru.bclib.blocks.BlockProperties; import ru.bclib.blocks.BlockProperties.TripleShape; import ru.bclib.util.BlocksHelper; @@ -27,6 +24,8 @@ import ru.bclib.util.MHelper; import ru.betterend.interfaces.FallFlyingItem; import ru.betterend.registry.EndBlocks; +import java.util.Optional; + @Mixin(Player.class) public abstract class PlayerMixin extends LivingEntity { @@ -67,7 +66,7 @@ public abstract class PlayerMixin extends LivingEntity { horizontal = BlocksHelper.makeHorizontal(); } MHelper.shuffle(horizontal, world.getRandom()); - for (Direction dir: horizontal) { + for (Direction dir : horizontal) { BlockPos p = pos.relative(dir); BlockState state2 = world.getBlockState(p); if (!state2.getMaterial().blocksMotion() && state2.getCollisionShape(world, pos).isEmpty()) { diff --git a/src/main/java/ru/betterend/mixin/common/PotionBrewingAccessor.java b/src/main/java/ru/betterend/mixin/common/PotionBrewingAccessor.java index 49366687..d863d6cb 100644 --- a/src/main/java/ru/betterend/mixin/common/PotionBrewingAccessor.java +++ b/src/main/java/ru/betterend/mixin/common/PotionBrewingAccessor.java @@ -1,11 +1,10 @@ package ru.betterend.mixin.common; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Invoker; - import net.minecraft.world.item.Item; import net.minecraft.world.item.alchemy.Potion; import net.minecraft.world.item.alchemy.PotionBrewing; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; @Mixin(PotionBrewing.class) public interface PotionBrewingAccessor { diff --git a/src/main/java/ru/betterend/mixin/common/ServerLevelMixin.java b/src/main/java/ru/betterend/mixin/common/ServerLevelMixin.java index ce71752f..d9c184da 100644 --- a/src/main/java/ru/betterend/mixin/common/ServerLevelMixin.java +++ b/src/main/java/ru/betterend/mixin/common/ServerLevelMixin.java @@ -1,16 +1,5 @@ package ru.betterend.mixin.common; -import java.util.List; -import java.util.concurrent.Executor; -import java.util.function.Supplier; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.ModifyArg; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - import net.minecraft.core.BlockPos; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; @@ -27,26 +16,36 @@ import net.minecraft.world.level.dimension.DimensionType; import net.minecraft.world.level.storage.LevelStorageSource; import net.minecraft.world.level.storage.ServerLevelData; import net.minecraft.world.level.storage.WritableLevelData; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.ModifyArg; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import ru.bclib.api.BiomeAPI; import ru.betterend.BetterEnd; import ru.betterend.registry.EndBiomes; import ru.betterend.registry.EndBlocks; import ru.betterend.world.generator.GeneratorOptions; +import java.util.List; +import java.util.concurrent.Executor; +import java.util.function.Supplier; + @Mixin(ServerLevel.class) public abstract class ServerLevelMixin extends Level { private static String be_lastWorld = null; - + protected ServerLevelMixin(WritableLevelData writableLevelData, ResourceKey resourceKey, DimensionType dimensionType, Supplier supplier, boolean bl, boolean bl2, long l) { super(writableLevelData, resourceKey, dimensionType, supplier, bl, bl2, l); } - + @Inject(method = "*", at = @At("TAIL")) private void be_onServerWorldInit(MinecraftServer server, Executor workerExecutor, LevelStorageSource.LevelStorageAccess session, ServerLevelData properties, ResourceKey registryKey, DimensionType dimensionType, ChunkProgressListener worldGenerationProgressListener, ChunkGenerator chunkGenerator, boolean debugWorld, long l, List list, boolean bl, CallbackInfo info) { if (be_lastWorld != null && be_lastWorld.equals(session.getLevelId())) { return; } - + be_lastWorld = session.getLevelId(); ServerLevel world = ServerLevel.class.cast(this); EndBiomes.onWorldLoad(world.getSeed()); @@ -61,13 +60,13 @@ public abstract class ServerLevelMixin extends Level { } } } - + @ModifyArg( - method = "tickChunk", - at = @At( - value = "INVOKE", - target = "Lnet/minecraft/server/level/ServerLevel;setBlockAndUpdate(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;)Z" - ) + method = "tickChunk", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/server/level/ServerLevel;setBlockAndUpdate(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;)Z" + ) ) private BlockState be_modifyTickState(BlockPos pos, BlockState state) { if (state.is(Blocks.ICE)) { diff --git a/src/main/java/ru/betterend/mixin/common/ServerPlayerMixin.java b/src/main/java/ru/betterend/mixin/common/ServerPlayerMixin.java index eb7a99d1..9095fb5f 100644 --- a/src/main/java/ru/betterend/mixin/common/ServerPlayerMixin.java +++ b/src/main/java/ru/betterend/mixin/common/ServerPlayerMixin.java @@ -1,15 +1,6 @@ package ru.betterend.mixin.common; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - import com.mojang.authlib.GameProfile; - import net.minecraft.core.BlockPos; import net.minecraft.network.protocol.game.ClientboundChangeDifficultyPacket; import net.minecraft.network.protocol.game.ClientboundLevelEventPacket; @@ -30,6 +21,13 @@ import net.minecraft.world.level.biome.BiomeManager; import net.minecraft.world.level.portal.PortalInfo; import net.minecraft.world.level.storage.LevelData; import net.minecraft.world.phys.Vec3; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import ru.betterend.interfaces.TeleportingEntity; import ru.betterend.world.generator.GeneratorOptions; @@ -81,7 +79,7 @@ public abstract class ServerPlayerMixin extends Player implements TeleportingEnt LevelData worldProperties = destination.getLevelData(); ServerPlayer player = ServerPlayer.class.cast(this); connection.send(new ClientboundRespawnPacket(destination.dimensionType(), destination.dimension(), BiomeManager.obfuscateSeed(destination.getSeed()), - gameMode.getGameModeForPlayer(),gameMode.getPreviousGameModeForPlayer(), destination.isDebug(), destination.isFlat(), true)); + gameMode.getGameModeForPlayer(), gameMode.getPreviousGameModeForPlayer(), destination.isDebug(), destination.isFlat(), true)); connection.send(new ClientboundChangeDifficultyPacket(worldProperties.getDifficulty(), worldProperties.isDifficultyLocked())); PlayerList playerManager = server.getPlayerList(); playerManager.sendPlayerPermissionLevel(player); diff --git a/src/main/java/ru/betterend/mixin/common/ShuffelingListMixin.java b/src/main/java/ru/betterend/mixin/common/ShuffelingListMixin.java index 3f709fba..22b95808 100644 --- a/src/main/java/ru/betterend/mixin/common/ShuffelingListMixin.java +++ b/src/main/java/ru/betterend/mixin/common/ShuffelingListMixin.java @@ -10,15 +10,18 @@ import java.util.List; @Mixin(ShufflingList.class) public abstract class ShuffelingListMixin implements ShuffelingListExtended { - @Shadow @Final protected List> entries; + @Shadow + @Final + protected List> entries; - public boolean isEmpty() { - return this.entries.isEmpty(); - } + public boolean isEmpty() { + return this.entries.isEmpty(); + } - @Shadow public abstract ShufflingList shuffle(); + @Shadow + public abstract ShufflingList shuffle(); - public U getOne() { - return this.shuffle().stream().findFirst().orElseThrow(RuntimeException::new); - } + public U getOne() { + return this.shuffle().stream().findFirst().orElseThrow(RuntimeException::new); + } } diff --git a/src/main/java/ru/betterend/mixin/common/SlimeMixin.java b/src/main/java/ru/betterend/mixin/common/SlimeMixin.java index a6a9509c..b57d2c19 100644 --- a/src/main/java/ru/betterend/mixin/common/SlimeMixin.java +++ b/src/main/java/ru/betterend/mixin/common/SlimeMixin.java @@ -2,11 +2,10 @@ package ru.betterend.mixin.common; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.monster.Slime; import net.minecraft.world.level.Level; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; - -import net.minecraft.world.entity.monster.Slime; import ru.betterend.interfaces.ISlime; @Mixin(Slime.class) @@ -16,15 +15,16 @@ public abstract class SlimeMixin extends Entity implements ISlime { } @Shadow - protected void setSize(int size, boolean heal) {} - + protected void setSize(int size, boolean heal) { + } + @Override public void be_setSlimeSize(int size, boolean heal) { setSize(size, heal); } @Override - public void entityRemove(Entity.RemovalReason removalReason){ + public void entityRemove(Entity.RemovalReason removalReason) { super.remove(removalReason); } } diff --git a/src/main/java/ru/betterend/mixin/common/SpikeFeatureMixin.java b/src/main/java/ru/betterend/mixin/common/SpikeFeatureMixin.java index 3a4c5e48..80f3eefa 100644 --- a/src/main/java/ru/betterend/mixin/common/SpikeFeatureMixin.java +++ b/src/main/java/ru/betterend/mixin/common/SpikeFeatureMixin.java @@ -45,7 +45,7 @@ public class SpikeFeatureMixin { int z = spike.getCenterZ(); int radius = spike.getRadius(); int minY = 0; - + long lx = (long) x; long lz = (long) z; if (lx * lx + lz * lz < 10000) { @@ -61,10 +61,10 @@ public class SpikeFeatureMixin { else { minY = world.getChunk(x >> 4, z >> 4).getHeight(Types.WORLD_SURFACE, x & 15, z); } - + GeneratorOptions.setDirectSpikeHeight(); int maxY = minY + spike.getHeight() - 64; - + if (GeneratorOptions.replacePillars() && be_radiusInRange(radius)) { radius--; StructureTemplate base = StructureHelper.readStructure(BetterEnd.makeID("pillars/pillar_base_" + radius)); @@ -75,11 +75,11 @@ public class SpikeFeatureMixin { side = top.getSize(); BlockPos pos2 = new BlockPos(x - (side.getX() >> 1), maxY, z - (side.getZ() >> 1)); maxY = pos2.getY(); - + StructurePlaceSettings data = new StructurePlaceSettings(); base.placeInWorld(world, pos1, pos1, data, random, 2); top.placeInWorld(world, pos2, pos2, data, random, 2); - + int r2 = radius * radius + 1; MutableBlockPos mut = new MutableBlockPos(); for (int px = -radius; px <= radius; px++) { @@ -128,13 +128,13 @@ public class SpikeFeatureMixin { mut.setZ(z); mut.setY(maxY); BlocksHelper.setWithoutUpdate(world, mut, Blocks.BEDROCK); - + EndCrystal crystal = EntityType.END_CRYSTAL.create(world.getLevel()); crystal.setBeamTarget(config.getCrystalBeamTarget()); crystal.setInvulnerable(config.isCrystalInvulnerable()); crystal.moveTo(x + 0.5D, maxY + 1, z + 0.5D, random.nextFloat() * 360.0F, 0.0F); world.addFreshEntity(crystal); - + if (spike.isGuarded()) { for (int px = -2; px <= 2; ++px) { boolean bl = Mth.abs(px) == 2; @@ -156,7 +156,7 @@ public class SpikeFeatureMixin { info.cancel(); } - + private boolean be_radiusInRange(int radius) { return radius > 1 && radius < 6; } diff --git a/src/main/java/ru/betterend/mixin/common/WeightedBiomePickerMixin.java b/src/main/java/ru/betterend/mixin/common/WeightedBiomePickerMixin.java index da2c05e6..fd6b15d4 100644 --- a/src/main/java/ru/betterend/mixin/common/WeightedBiomePickerMixin.java +++ b/src/main/java/ru/betterend/mixin/common/WeightedBiomePickerMixin.java @@ -1,37 +1,35 @@ package ru.betterend.mixin.common; -import java.util.List; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - import com.google.common.collect.Lists; - import net.fabricmc.fabric.impl.biome.InternalBiomeData; import net.fabricmc.fabric.impl.biome.WeightedBiomePicker; import net.minecraft.resources.ResourceKey; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.biome.Biomes; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import ru.betterend.interfaces.IBiomeList; +import java.util.List; + @Mixin(value = WeightedBiomePicker.class, remap = false) public class WeightedBiomePickerMixin implements IBiomeList { private final List> biomes = Lists.newArrayList(); - + @Inject(method = "addBiome", at = @At("TAIL")) private void be_addBiome(final ResourceKey biome, final double weight, CallbackInfo info) { if (be_isCorrectPicker(WeightedBiomePicker.class.cast(this))) { biomes.add(biome); } } - + @Override public List> getBiomes() { return biomes; } - + private boolean be_isCorrectPicker(WeightedBiomePicker picker) { return picker == InternalBiomeData.getEndBiomesMap().get(Biomes.SMALL_END_ISLANDS) || picker == InternalBiomeData.getEndBarrensMap().get(Biomes.END_BARRENS); } diff --git a/src/main/java/ru/betterend/noise/OpenSimplexNoise.java b/src/main/java/ru/betterend/noise/OpenSimplexNoise.java index bf4b1680..bf281185 100644 --- a/src/main/java/ru/betterend/noise/OpenSimplexNoise.java +++ b/src/main/java/ru/betterend/noise/OpenSimplexNoise.java @@ -3,7 +3,7 @@ package ru.betterend.noise; /* * OpenSimplex Noise in Java. * by Kurt Spencer - * + * * v1.1 (October 5, 2014) * - Added 2D and 4D implementations. * - Proper gradient sets for all dimensions, from a @@ -132,40 +132,45 @@ public final class OpenSimplexNoise { if (inSum <= 1) { // We're inside the triangle (2-Simplex) at (0,0) double zins = 1 - inSum; if (zins > xins || zins > yins) { // (0,0) is one of the closest two - // triangular vertices + // triangular vertices if (xins > yins) { xsv_ext = xsb + 1; ysv_ext = ysb - 1; dx_ext = dx0 - 1; dy_ext = dy0 + 1; - } else { + } + else { xsv_ext = xsb - 1; ysv_ext = ysb + 1; dx_ext = dx0 + 1; dy_ext = dy0 - 1; } - } else { // (1,0) and (0,1) are the closest two vertices. + } + else { // (1,0) and (0,1) are the closest two vertices. xsv_ext = xsb + 1; ysv_ext = ysb + 1; dx_ext = dx0 - 1 - 2 * SQUISH_CONSTANT_2D; dy_ext = dy0 - 1 - 2 * SQUISH_CONSTANT_2D; } - } else { // We're inside the triangle (2-Simplex) at (1,1) + } + else { // We're inside the triangle (2-Simplex) at (1,1) double zins = 2 - inSum; if (zins < xins || zins < yins) { // (0,0) is one of the closest two - // triangular vertices + // triangular vertices if (xins > yins) { xsv_ext = xsb + 2; ysv_ext = ysb + 0; dx_ext = dx0 - 2 - 2 * SQUISH_CONSTANT_2D; dy_ext = dy0 + 0 - 2 * SQUISH_CONSTANT_2D; - } else { + } + else { xsv_ext = xsb + 0; ysv_ext = ysb + 2; dx_ext = dx0 + 0 - 2 * SQUISH_CONSTANT_2D; dy_ext = dy0 - 2 - 2 * SQUISH_CONSTANT_2D; } - } else { // (1,0) and (0,1) are the closest two vertices. + } + else { // (1,0) and (0,1) are the closest two vertices. dx_ext = dx0; dy_ext = dy0; xsv_ext = xsb; @@ -249,7 +254,8 @@ public final class OpenSimplexNoise { if (aScore >= bScore && zins > bScore) { bScore = zins; bPoint = 0x04; - } else if (aScore < bScore && zins > aScore) { + } + else if (aScore < bScore && zins > aScore) { aScore = zins; aPoint = 0x04; } @@ -260,20 +266,21 @@ public final class OpenSimplexNoise { // (0,0,0) double wins = 1 - inSum; if (wins > aScore || wins > bScore) { // (0,0,0) is one of the - // closest two tetrahedral - // vertices. + // closest two tetrahedral + // vertices. byte c = (bScore > aScore ? bPoint : aPoint); // Our other - // closest - // vertex is the - // closest out - // of a and b. + // closest + // vertex is the + // closest out + // of a and b. if ((c & 0x01) == 0) { xsv_ext0 = xsb - 1; xsv_ext1 = xsb; dx_ext0 = dx0 + 1; dx_ext1 = dx0; - } else { + } + else { xsv_ext0 = xsv_ext1 = xsb + 1; dx_ext0 = dx_ext1 = dx0 - 1; } @@ -284,11 +291,13 @@ public final class OpenSimplexNoise { if ((c & 0x01) == 0) { ysv_ext1 -= 1; dy_ext1 += 1; - } else { + } + else { ysv_ext0 -= 1; dy_ext0 += 1; } - } else { + } + else { ysv_ext0 = ysv_ext1 = ysb + 1; dy_ext0 = dy_ext1 = dy0 - 1; } @@ -298,22 +307,25 @@ public final class OpenSimplexNoise { zsv_ext1 = zsb - 1; dz_ext0 = dz0; dz_ext1 = dz0 + 1; - } else { + } + else { zsv_ext0 = zsv_ext1 = zsb + 1; dz_ext0 = dz_ext1 = dz0 - 1; } - } else { // (0,0,0) is not one of the closest two tetrahedral - // vertices. + } + else { // (0,0,0) is not one of the closest two tetrahedral + // vertices. byte c = (byte) (aPoint | bPoint); // Our two extra vertices are - // determined by the closest - // two. + // determined by the closest + // two. if ((c & 0x01) == 0) { xsv_ext0 = xsb; xsv_ext1 = xsb - 1; dx_ext0 = dx0 - 2 * SQUISH_CONSTANT_3D; dx_ext1 = dx0 + 1 - SQUISH_CONSTANT_3D; - } else { + } + else { xsv_ext0 = xsv_ext1 = xsb + 1; dx_ext0 = dx0 - 1 - 2 * SQUISH_CONSTANT_3D; dx_ext1 = dx0 - 1 - SQUISH_CONSTANT_3D; @@ -324,7 +336,8 @@ public final class OpenSimplexNoise { ysv_ext1 = ysb - 1; dy_ext0 = dy0 - 2 * SQUISH_CONSTANT_3D; dy_ext1 = dy0 + 1 - SQUISH_CONSTANT_3D; - } else { + } + else { ysv_ext0 = ysv_ext1 = ysb + 1; dy_ext0 = dy0 - 1 - 2 * SQUISH_CONSTANT_3D; dy_ext1 = dy0 - 1 - SQUISH_CONSTANT_3D; @@ -335,7 +348,8 @@ public final class OpenSimplexNoise { zsv_ext1 = zsb - 1; dz_ext0 = dz0 - 2 * SQUISH_CONSTANT_3D; dz_ext1 = dz0 + 1 - SQUISH_CONSTANT_3D; - } else { + } + else { zsv_ext0 = zsv_ext1 = zsb + 1; dz_ext0 = dz0 - 1 - 2 * SQUISH_CONSTANT_3D; dz_ext1 = dz0 - 1 - SQUISH_CONSTANT_3D; @@ -378,8 +392,9 @@ public final class OpenSimplexNoise { attn3 *= attn3; value += attn3 * attn3 * extrapolate(xsb + 0, ysb + 0, zsb + 1, dx3, dy3, dz3); } - } else if (inSum >= 2) { // We're inside the tetrahedron (3-Simplex) at - // (1,1,1) + } + else if (inSum >= 2) { // We're inside the tetrahedron (3-Simplex) at + // (1,1,1) // Determine which two tetrahedral vertices are the closest, out of // (1,1,0), (1,0,1), (0,1,1) but not (1,1,1). @@ -390,7 +405,8 @@ public final class OpenSimplexNoise { if (aScore <= bScore && zins < bScore) { bScore = zins; bPoint = 0x03; - } else if (aScore > bScore && zins < aScore) { + } + else if (aScore > bScore && zins < aScore) { aScore = zins; aPoint = 0x03; } @@ -401,20 +417,21 @@ public final class OpenSimplexNoise { // (1,1,1) double wins = 3 - inSum; if (wins < aScore || wins < bScore) { // (1,1,1) is one of the - // closest two tetrahedral - // vertices. + // closest two tetrahedral + // vertices. byte c = (bScore < aScore ? bPoint : aPoint); // Our other - // closest - // vertex is the - // closest out - // of a and b. + // closest + // vertex is the + // closest out + // of a and b. if ((c & 0x01) != 0) { xsv_ext0 = xsb + 2; xsv_ext1 = xsb + 1; dx_ext0 = dx0 - 2 - 3 * SQUISH_CONSTANT_3D; dx_ext1 = dx0 - 1 - 3 * SQUISH_CONSTANT_3D; - } else { + } + else { xsv_ext0 = xsv_ext1 = xsb; dx_ext0 = dx_ext1 = dx0 - 3 * SQUISH_CONSTANT_3D; } @@ -425,11 +442,13 @@ public final class OpenSimplexNoise { if ((c & 0x01) != 0) { ysv_ext1 += 1; dy_ext1 -= 1; - } else { + } + else { ysv_ext0 += 1; dy_ext0 -= 1; } - } else { + } + else { ysv_ext0 = ysv_ext1 = ysb; dy_ext0 = dy_ext1 = dy0 - 3 * SQUISH_CONSTANT_3D; } @@ -439,22 +458,25 @@ public final class OpenSimplexNoise { zsv_ext1 = zsb + 2; dz_ext0 = dz0 - 1 - 3 * SQUISH_CONSTANT_3D; dz_ext1 = dz0 - 2 - 3 * SQUISH_CONSTANT_3D; - } else { + } + else { zsv_ext0 = zsv_ext1 = zsb; dz_ext0 = dz_ext1 = dz0 - 3 * SQUISH_CONSTANT_3D; } - } else { // (1,1,1) is not one of the closest two tetrahedral - // vertices. + } + else { // (1,1,1) is not one of the closest two tetrahedral + // vertices. byte c = (byte) (aPoint & bPoint); // Our two extra vertices are - // determined by the closest - // two. + // determined by the closest + // two. if ((c & 0x01) != 0) { xsv_ext0 = xsb + 1; xsv_ext1 = xsb + 2; dx_ext0 = dx0 - 1 - SQUISH_CONSTANT_3D; dx_ext1 = dx0 - 2 - 2 * SQUISH_CONSTANT_3D; - } else { + } + else { xsv_ext0 = xsv_ext1 = xsb; dx_ext0 = dx0 - SQUISH_CONSTANT_3D; dx_ext1 = dx0 - 2 * SQUISH_CONSTANT_3D; @@ -465,7 +487,8 @@ public final class OpenSimplexNoise { ysv_ext1 = ysb + 2; dy_ext0 = dy0 - 1 - SQUISH_CONSTANT_3D; dy_ext1 = dy0 - 2 - 2 * SQUISH_CONSTANT_3D; - } else { + } + else { ysv_ext0 = ysv_ext1 = ysb; dy_ext0 = dy0 - SQUISH_CONSTANT_3D; dy_ext1 = dy0 - 2 * SQUISH_CONSTANT_3D; @@ -476,7 +499,8 @@ public final class OpenSimplexNoise { zsv_ext1 = zsb + 2; dz_ext0 = dz0 - 1 - SQUISH_CONSTANT_3D; dz_ext1 = dz0 - 2 - 2 * SQUISH_CONSTANT_3D; - } else { + } + else { zsv_ext0 = zsv_ext1 = zsb; dz_ext0 = dz0 - SQUISH_CONSTANT_3D; dz_ext1 = dz0 - 2 * SQUISH_CONSTANT_3D; @@ -522,8 +546,9 @@ public final class OpenSimplexNoise { attn0 *= attn0; value += attn0 * attn0 * extrapolate(xsb + 1, ysb + 1, zsb + 1, dx0, dy0, dz0); } - } else { // We're inside the octahedron (Rectified 3-Simplex) in - // between. + } + else { // We're inside the octahedron (Rectified 3-Simplex) in + // between. double aScore; byte aPoint; boolean aIsFurtherSide; @@ -537,7 +562,8 @@ public final class OpenSimplexNoise { aScore = p1 - 1; aPoint = 0x03; aIsFurtherSide = true; - } else { + } + else { aScore = 1 - p1; aPoint = 0x04; aIsFurtherSide = false; @@ -549,7 +575,8 @@ public final class OpenSimplexNoise { bScore = p2 - 1; bPoint = 0x05; bIsFurtherSide = true; - } else { + } + else { bScore = 1 - p2; bPoint = 0x02; bIsFurtherSide = false; @@ -564,18 +591,21 @@ public final class OpenSimplexNoise { aScore = score; aPoint = 0x06; aIsFurtherSide = true; - } else if (aScore > bScore && bScore < score) { + } + else if (aScore > bScore && bScore < score) { bScore = score; bPoint = 0x06; bIsFurtherSide = true; } - } else { + } + else { double score = 1 - p3; if (aScore <= bScore && aScore < score) { aScore = score; aPoint = 0x01; aIsFurtherSide = false; - } else if (aScore > bScore && bScore < score) { + } + else if (aScore > bScore && bScore < score) { bScore = score; bPoint = 0x01; bIsFurtherSide = false; @@ -604,14 +634,16 @@ public final class OpenSimplexNoise { xsv_ext1 = xsb + 2; ysv_ext1 = ysb; zsv_ext1 = zsb; - } else if ((c & 0x02) != 0) { + } + else if ((c & 0x02) != 0) { dx_ext1 = dx0 - 2 * SQUISH_CONSTANT_3D; dy_ext1 = dy0 - 2 - 2 * SQUISH_CONSTANT_3D; dz_ext1 = dz0 - 2 * SQUISH_CONSTANT_3D; xsv_ext1 = xsb; ysv_ext1 = ysb + 2; zsv_ext1 = zsb; - } else { + } + else { dx_ext1 = dx0 - 2 * SQUISH_CONSTANT_3D; dy_ext1 = dy0 - 2 * SQUISH_CONSTANT_3D; dz_ext1 = dz0 - 2 - 2 * SQUISH_CONSTANT_3D; @@ -619,7 +651,8 @@ public final class OpenSimplexNoise { ysv_ext1 = ysb; zsv_ext1 = zsb + 2; } - } else {// Both closest points on (0,0,0) side + } + else {// Both closest points on (0,0,0) side // One of the two extra points is (0,0,0) dx_ext0 = dx0; @@ -638,14 +671,16 @@ public final class OpenSimplexNoise { xsv_ext1 = xsb - 1; ysv_ext1 = ysb + 1; zsv_ext1 = zsb + 1; - } else if ((c & 0x02) == 0) { + } + else if ((c & 0x02) == 0) { dx_ext1 = dx0 - 1 - SQUISH_CONSTANT_3D; dy_ext1 = dy0 + 1 - SQUISH_CONSTANT_3D; dz_ext1 = dz0 - 1 - SQUISH_CONSTANT_3D; xsv_ext1 = xsb + 1; ysv_ext1 = ysb - 1; zsv_ext1 = zsb + 1; - } else { + } + else { dx_ext1 = dx0 - 1 - SQUISH_CONSTANT_3D; dy_ext1 = dy0 - 1 - SQUISH_CONSTANT_3D; dz_ext1 = dz0 + 1 - SQUISH_CONSTANT_3D; @@ -654,12 +689,14 @@ public final class OpenSimplexNoise { zsv_ext1 = zsb - 1; } } - } else { // One point on (0,0,0) side, one point on (1,1,1) side + } + else { // One point on (0,0,0) side, one point on (1,1,1) side byte c1, c2; if (aIsFurtherSide) { c1 = aPoint; c2 = bPoint; - } else { + } + else { c1 = bPoint; c2 = aPoint; } @@ -672,14 +709,16 @@ public final class OpenSimplexNoise { xsv_ext0 = xsb - 1; ysv_ext0 = ysb + 1; zsv_ext0 = zsb + 1; - } else if ((c1 & 0x02) == 0) { + } + else if ((c1 & 0x02) == 0) { dx_ext0 = dx0 - 1 - SQUISH_CONSTANT_3D; dy_ext0 = dy0 + 1 - SQUISH_CONSTANT_3D; dz_ext0 = dz0 - 1 - SQUISH_CONSTANT_3D; xsv_ext0 = xsb + 1; ysv_ext0 = ysb - 1; zsv_ext0 = zsb + 1; - } else { + } + else { dx_ext0 = dx0 - 1 - SQUISH_CONSTANT_3D; dy_ext0 = dy0 - 1 - SQUISH_CONSTANT_3D; dz_ext0 = dz0 + 1 - SQUISH_CONSTANT_3D; @@ -698,10 +737,12 @@ public final class OpenSimplexNoise { if ((c2 & 0x01) != 0) { dx_ext1 -= 2; xsv_ext1 += 2; - } else if ((c2 & 0x02) != 0) { + } + else if ((c2 & 0x02) != 0) { dy_ext1 -= 2; ysv_ext1 += 2; - } else { + } + else { dz_ext1 -= 2; zsv_ext1 += 2; } @@ -838,7 +879,7 @@ public final class OpenSimplexNoise { double value = 0; if (inSum <= 1) { // We're inside the pentachoron (4-Simplex) at - // (0,0,0,0) + // (0,0,0,0) // Determine which two of (0,0,0,1), (0,0,1,0), (0,1,0,0), (1,0,0,0) // are closest. @@ -849,14 +890,16 @@ public final class OpenSimplexNoise { if (aScore >= bScore && zins > bScore) { bScore = zins; bPoint = 0x04; - } else if (aScore < bScore && zins > aScore) { + } + else if (aScore < bScore && zins > aScore) { aScore = zins; aPoint = 0x04; } if (aScore >= bScore && wins > bScore) { bScore = wins; bPoint = 0x08; - } else if (aScore < bScore && wins > aScore) { + } + else if (aScore < bScore && wins > aScore) { aScore = wins; aPoint = 0x08; } @@ -867,19 +910,20 @@ public final class OpenSimplexNoise { // (0,0,0,0) double uins = 1 - inSum; if (uins > aScore || uins > bScore) { // (0,0,0,0) is one of the - // closest two pentachoron - // vertices. + // closest two pentachoron + // vertices. byte c = (bScore > aScore ? bPoint : aPoint); // Our other - // closest - // vertex is the - // closest out - // of a and b. + // closest + // vertex is the + // closest out + // of a and b. if ((c & 0x01) == 0) { xsv_ext0 = xsb - 1; xsv_ext1 = xsv_ext2 = xsb; dx_ext0 = dx0 + 1; dx_ext1 = dx_ext2 = dx0; - } else { + } + else { xsv_ext0 = xsv_ext1 = xsv_ext2 = xsb + 1; dx_ext0 = dx_ext1 = dx_ext2 = dx0 - 1; } @@ -890,11 +934,13 @@ public final class OpenSimplexNoise { if ((c & 0x01) == 0x01) { ysv_ext0 -= 1; dy_ext0 += 1; - } else { + } + else { ysv_ext1 -= 1; dy_ext1 += 1; } - } else { + } + else { ysv_ext0 = ysv_ext1 = ysv_ext2 = ysb + 1; dy_ext0 = dy_ext1 = dy_ext2 = dy0 - 1; } @@ -906,15 +952,18 @@ public final class OpenSimplexNoise { if ((c & 0x03) == 0x03) { zsv_ext0 -= 1; dz_ext0 += 1; - } else { + } + else { zsv_ext1 -= 1; dz_ext1 += 1; } - } else { + } + else { zsv_ext2 -= 1; dz_ext2 += 1; } - } else { + } + else { zsv_ext0 = zsv_ext1 = zsv_ext2 = zsb + 1; dz_ext0 = dz_ext1 = dz_ext2 = dz0 - 1; } @@ -924,15 +973,17 @@ public final class OpenSimplexNoise { wsv_ext2 = wsb - 1; dw_ext0 = dw_ext1 = dw0; dw_ext2 = dw0 + 1; - } else { + } + else { wsv_ext0 = wsv_ext1 = wsv_ext2 = wsb + 1; dw_ext0 = dw_ext1 = dw_ext2 = dw0 - 1; } - } else { // (0,0,0,0) is not one of the closest two pentachoron - // vertices. + } + else { // (0,0,0,0) is not one of the closest two pentachoron + // vertices. byte c = (byte) (aPoint | bPoint); // Our three extra vertices - // are determined by the - // closest two. + // are determined by the + // closest two. if ((c & 0x01) == 0) { xsv_ext0 = xsv_ext2 = xsb; @@ -940,7 +991,8 @@ public final class OpenSimplexNoise { dx_ext0 = dx0 - 2 * SQUISH_CONSTANT_4D; dx_ext1 = dx0 + 1 - SQUISH_CONSTANT_4D; dx_ext2 = dx0 - SQUISH_CONSTANT_4D; - } else { + } + else { xsv_ext0 = xsv_ext1 = xsv_ext2 = xsb + 1; dx_ext0 = dx0 - 1 - 2 * SQUISH_CONSTANT_4D; dx_ext1 = dx_ext2 = dx0 - 1 - SQUISH_CONSTANT_4D; @@ -953,11 +1005,13 @@ public final class OpenSimplexNoise { if ((c & 0x01) == 0x01) { ysv_ext1 -= 1; dy_ext1 += 1; - } else { + } + else { ysv_ext2 -= 1; dy_ext2 += 1; } - } else { + } + else { ysv_ext0 = ysv_ext1 = ysv_ext2 = ysb + 1; dy_ext0 = dy0 - 1 - 2 * SQUISH_CONSTANT_4D; dy_ext1 = dy_ext2 = dy0 - 1 - SQUISH_CONSTANT_4D; @@ -970,11 +1024,13 @@ public final class OpenSimplexNoise { if ((c & 0x03) == 0x03) { zsv_ext1 -= 1; dz_ext1 += 1; - } else { + } + else { zsv_ext2 -= 1; dz_ext2 += 1; } - } else { + } + else { zsv_ext0 = zsv_ext1 = zsv_ext2 = zsb + 1; dz_ext0 = dz0 - 1 - 2 * SQUISH_CONSTANT_4D; dz_ext1 = dz_ext2 = dz0 - 1 - SQUISH_CONSTANT_4D; @@ -986,7 +1042,8 @@ public final class OpenSimplexNoise { dw_ext0 = dw0 - 2 * SQUISH_CONSTANT_4D; dw_ext1 = dw0 - SQUISH_CONSTANT_4D; dw_ext2 = dw0 + 1 - SQUISH_CONSTANT_4D; - } else { + } + else { wsv_ext0 = wsv_ext1 = wsv_ext2 = wsb + 1; dw_ext0 = dw0 - 1 - 2 * SQUISH_CONSTANT_4D; dw_ext1 = dw_ext2 = dw0 - 1 - SQUISH_CONSTANT_4D; @@ -1043,11 +1100,12 @@ public final class OpenSimplexNoise { attn4 *= attn4; value += attn4 * attn4 * extrapolate(xsb + 0, ysb + 0, zsb + 0, wsb + 1, dx4, dy4, dz4, dw4); } - } else if (inSum >= 3) { // We're inside the pentachoron (4-Simplex) at - // (1,1,1,1) - // Determine which two of (1,1,1,0), - // (1,1,0,1), (1,0,1,1), (0,1,1,1) - // are closest. + } + else if (inSum >= 3) { // We're inside the pentachoron (4-Simplex) at + // (1,1,1,1) + // Determine which two of (1,1,1,0), + // (1,1,0,1), (1,0,1,1), (0,1,1,1) + // are closest. byte aPoint = 0x0E; double aScore = xins; byte bPoint = 0x0D; @@ -1055,14 +1113,16 @@ public final class OpenSimplexNoise { if (aScore <= bScore && zins < bScore) { bScore = zins; bPoint = 0x0B; - } else if (aScore > bScore && zins < aScore) { + } + else if (aScore > bScore && zins < aScore) { aScore = zins; aPoint = 0x0B; } if (aScore <= bScore && wins < bScore) { bScore = wins; bPoint = 0x07; - } else if (aScore > bScore && wins < aScore) { + } + else if (aScore > bScore && wins < aScore) { aScore = wins; aPoint = 0x07; } @@ -1073,20 +1133,21 @@ public final class OpenSimplexNoise { // (0,0,0,0) double uins = 4 - inSum; if (uins < aScore || uins < bScore) { // (1,1,1,1) is one of the - // closest two pentachoron - // vertices. + // closest two pentachoron + // vertices. byte c = (bScore < aScore ? bPoint : aPoint); // Our other - // closest - // vertex is the - // closest out - // of a and b. + // closest + // vertex is the + // closest out + // of a and b. if ((c & 0x01) != 0) { xsv_ext0 = xsb + 2; xsv_ext1 = xsv_ext2 = xsb + 1; dx_ext0 = dx0 - 2 - 4 * SQUISH_CONSTANT_4D; dx_ext1 = dx_ext2 = dx0 - 1 - 4 * SQUISH_CONSTANT_4D; - } else { + } + else { xsv_ext0 = xsv_ext1 = xsv_ext2 = xsb; dx_ext0 = dx_ext1 = dx_ext2 = dx0 - 4 * SQUISH_CONSTANT_4D; } @@ -1097,11 +1158,13 @@ public final class OpenSimplexNoise { if ((c & 0x01) != 0) { ysv_ext1 += 1; dy_ext1 -= 1; - } else { + } + else { ysv_ext0 += 1; dy_ext0 -= 1; } - } else { + } + else { ysv_ext0 = ysv_ext1 = ysv_ext2 = ysb; dy_ext0 = dy_ext1 = dy_ext2 = dy0 - 4 * SQUISH_CONSTANT_4D; } @@ -1113,15 +1176,18 @@ public final class OpenSimplexNoise { if ((c & 0x03) == 0) { zsv_ext0 += 1; dz_ext0 -= 1; - } else { + } + else { zsv_ext1 += 1; dz_ext1 -= 1; } - } else { + } + else { zsv_ext2 += 1; dz_ext2 -= 1; } - } else { + } + else { zsv_ext0 = zsv_ext1 = zsv_ext2 = zsb; dz_ext0 = dz_ext1 = dz_ext2 = dz0 - 4 * SQUISH_CONSTANT_4D; } @@ -1131,15 +1197,17 @@ public final class OpenSimplexNoise { wsv_ext2 = wsb + 2; dw_ext0 = dw_ext1 = dw0 - 1 - 4 * SQUISH_CONSTANT_4D; dw_ext2 = dw0 - 2 - 4 * SQUISH_CONSTANT_4D; - } else { + } + else { wsv_ext0 = wsv_ext1 = wsv_ext2 = wsb; dw_ext0 = dw_ext1 = dw_ext2 = dw0 - 4 * SQUISH_CONSTANT_4D; } - } else { // (1,1,1,1) is not one of the closest two pentachoron - // vertices. + } + else { // (1,1,1,1) is not one of the closest two pentachoron + // vertices. byte c = (byte) (aPoint & bPoint); // Our three extra vertices - // are determined by the - // closest two. + // are determined by the + // closest two. if ((c & 0x01) != 0) { xsv_ext0 = xsv_ext2 = xsb + 1; @@ -1147,7 +1215,8 @@ public final class OpenSimplexNoise { dx_ext0 = dx0 - 1 - 2 * SQUISH_CONSTANT_4D; dx_ext1 = dx0 - 2 - 3 * SQUISH_CONSTANT_4D; dx_ext2 = dx0 - 1 - 3 * SQUISH_CONSTANT_4D; - } else { + } + else { xsv_ext0 = xsv_ext1 = xsv_ext2 = xsb; dx_ext0 = dx0 - 2 * SQUISH_CONSTANT_4D; dx_ext1 = dx_ext2 = dx0 - 3 * SQUISH_CONSTANT_4D; @@ -1160,11 +1229,13 @@ public final class OpenSimplexNoise { if ((c & 0x01) != 0) { ysv_ext2 += 1; dy_ext2 -= 1; - } else { + } + else { ysv_ext1 += 1; dy_ext1 -= 1; } - } else { + } + else { ysv_ext0 = ysv_ext1 = ysv_ext2 = ysb; dy_ext0 = dy0 - 2 * SQUISH_CONSTANT_4D; dy_ext1 = dy_ext2 = dy0 - 3 * SQUISH_CONSTANT_4D; @@ -1177,11 +1248,13 @@ public final class OpenSimplexNoise { if ((c & 0x03) != 0) { zsv_ext2 += 1; dz_ext2 -= 1; - } else { + } + else { zsv_ext1 += 1; dz_ext1 -= 1; } - } else { + } + else { zsv_ext0 = zsv_ext1 = zsv_ext2 = zsb; dz_ext0 = dz0 - 2 * SQUISH_CONSTANT_4D; dz_ext1 = dz_ext2 = dz0 - 3 * SQUISH_CONSTANT_4D; @@ -1193,7 +1266,8 @@ public final class OpenSimplexNoise { dw_ext0 = dw0 - 1 - 2 * SQUISH_CONSTANT_4D; dw_ext1 = dw0 - 1 - 3 * SQUISH_CONSTANT_4D; dw_ext2 = dw0 - 2 - 3 * SQUISH_CONSTANT_4D; - } else { + } + else { wsv_ext0 = wsv_ext1 = wsv_ext2 = wsb; dw_ext0 = dw0 - 2 * SQUISH_CONSTANT_4D; dw_ext1 = dw_ext2 = dw0 - 3 * SQUISH_CONSTANT_4D; @@ -1254,8 +1328,9 @@ public final class OpenSimplexNoise { attn0 *= attn0; value += attn0 * attn0 * extrapolate(xsb + 1, ysb + 1, zsb + 1, wsb + 1, dx0, dy0, dz0, dw0); } - } else if (inSum <= 2) { // We're inside the first dispentachoron - // (Rectified 4-Simplex) + } + else if (inSum <= 2) { // We're inside the first dispentachoron + // (Rectified 4-Simplex) double aScore; byte aPoint; boolean aIsBiggerSide = true; @@ -1267,7 +1342,8 @@ public final class OpenSimplexNoise { if (xins + yins > zins + wins) { aScore = xins + yins; aPoint = 0x03; - } else { + } + else { aScore = zins + wins; aPoint = 0x0C; } @@ -1276,7 +1352,8 @@ public final class OpenSimplexNoise { if (xins + zins > yins + wins) { bScore = xins + zins; bPoint = 0x05; - } else { + } + else { bScore = yins + wins; bPoint = 0x0A; } @@ -1288,16 +1365,19 @@ public final class OpenSimplexNoise { if (aScore >= bScore && score > bScore) { bScore = score; bPoint = 0x09; - } else if (aScore < bScore && score > aScore) { + } + else if (aScore < bScore && score > aScore) { aScore = score; aPoint = 0x09; } - } else { + } + else { double score = yins + zins; if (aScore >= bScore && score > bScore) { bScore = score; bPoint = 0x06; - } else if (aScore < bScore && score > aScore) { + } + else if (aScore < bScore && score > aScore) { aScore = score; aPoint = 0x06; } @@ -1309,7 +1389,8 @@ public final class OpenSimplexNoise { bScore = p1; bPoint = 0x01; bIsBiggerSide = false; - } else if (aScore < bScore && p1 > aScore) { + } + else if (aScore < bScore && p1 > aScore) { aScore = p1; aPoint = 0x01; aIsBiggerSide = false; @@ -1321,7 +1402,8 @@ public final class OpenSimplexNoise { bScore = p2; bPoint = 0x02; bIsBiggerSide = false; - } else if (aScore < bScore && p2 > aScore) { + } + else if (aScore < bScore && p2 > aScore) { aScore = p2; aPoint = 0x02; aIsBiggerSide = false; @@ -1333,7 +1415,8 @@ public final class OpenSimplexNoise { bScore = p3; bPoint = 0x04; bIsBiggerSide = false; - } else if (aScore < bScore && p3 > aScore) { + } + else if (aScore < bScore && p3 > aScore) { aScore = p3; aPoint = 0x04; aIsBiggerSide = false; @@ -1345,7 +1428,8 @@ public final class OpenSimplexNoise { bScore = p4; bPoint = 0x08; bIsBiggerSide = false; - } else if (aScore < bScore && p4 > aScore) { + } + else if (aScore < bScore && p4 > aScore) { aScore = p4; aPoint = 0x08; aIsBiggerSide = false; @@ -1362,7 +1446,8 @@ public final class OpenSimplexNoise { xsv_ext1 = xsb - 1; dx_ext0 = dx0 - 3 * SQUISH_CONSTANT_4D; dx_ext1 = dx0 + 1 - 2 * SQUISH_CONSTANT_4D; - } else { + } + else { xsv_ext0 = xsv_ext1 = xsb + 1; dx_ext0 = dx0 - 1 - 3 * SQUISH_CONSTANT_4D; dx_ext1 = dx0 - 1 - 2 * SQUISH_CONSTANT_4D; @@ -1373,7 +1458,8 @@ public final class OpenSimplexNoise { ysv_ext1 = ysb - 1; dy_ext0 = dy0 - 3 * SQUISH_CONSTANT_4D; dy_ext1 = dy0 + 1 - 2 * SQUISH_CONSTANT_4D; - } else { + } + else { ysv_ext0 = ysv_ext1 = ysb + 1; dy_ext0 = dy0 - 1 - 3 * SQUISH_CONSTANT_4D; dy_ext1 = dy0 - 1 - 2 * SQUISH_CONSTANT_4D; @@ -1384,7 +1470,8 @@ public final class OpenSimplexNoise { zsv_ext1 = zsb - 1; dz_ext0 = dz0 - 3 * SQUISH_CONSTANT_4D; dz_ext1 = dz0 + 1 - 2 * SQUISH_CONSTANT_4D; - } else { + } + else { zsv_ext0 = zsv_ext1 = zsb + 1; dz_ext0 = dz0 - 1 - 3 * SQUISH_CONSTANT_4D; dz_ext1 = dz0 - 1 - 2 * SQUISH_CONSTANT_4D; @@ -1395,7 +1482,8 @@ public final class OpenSimplexNoise { wsv_ext1 = wsb - 1; dw_ext0 = dw0 - 3 * SQUISH_CONSTANT_4D; dw_ext1 = dw0 + 1 - 2 * SQUISH_CONSTANT_4D; - } else { + } + else { wsv_ext0 = wsv_ext1 = wsb + 1; dw_ext0 = dw0 - 1 - 3 * SQUISH_CONSTANT_4D; dw_ext1 = dw0 - 1 - 2 * SQUISH_CONSTANT_4D; @@ -1413,19 +1501,23 @@ public final class OpenSimplexNoise { if ((c2 & 0x01) != 0) { xsv_ext2 += 2; dx_ext2 -= 2; - } else if ((c2 & 0x02) != 0) { + } + else if ((c2 & 0x02) != 0) { ysv_ext2 += 2; dy_ext2 -= 2; - } else if ((c2 & 0x04) != 0) { + } + else if ((c2 & 0x04) != 0) { zsv_ext2 += 2; dz_ext2 -= 2; - } else { + } + else { wsv_ext2 += 2; dw_ext2 -= 2; } - } else { // Both closest points on the smaller side - // One of the two extra points is (0,0,0,0) + } + else { // Both closest points on the smaller side + // One of the two extra points is (0,0,0,0) xsv_ext2 = xsb; ysv_ext2 = ysb; zsv_ext2 = zsb; @@ -1443,7 +1535,8 @@ public final class OpenSimplexNoise { xsv_ext1 = xsb; dx_ext0 = dx0 + 1 - SQUISH_CONSTANT_4D; dx_ext1 = dx0 - SQUISH_CONSTANT_4D; - } else { + } + else { xsv_ext0 = xsv_ext1 = xsb + 1; dx_ext0 = dx_ext1 = dx0 - 1 - SQUISH_CONSTANT_4D; } @@ -1454,11 +1547,13 @@ public final class OpenSimplexNoise { if ((c & 0x01) == 0x01) { ysv_ext0 -= 1; dy_ext0 += 1; - } else { + } + else { ysv_ext1 -= 1; dy_ext1 += 1; } - } else { + } + else { ysv_ext0 = ysv_ext1 = ysb + 1; dy_ext0 = dy_ext1 = dy0 - 1 - SQUISH_CONSTANT_4D; } @@ -1469,11 +1564,13 @@ public final class OpenSimplexNoise { if ((c & 0x03) == 0x03) { zsv_ext0 -= 1; dz_ext0 += 1; - } else { + } + else { zsv_ext1 -= 1; dz_ext1 += 1; } - } else { + } + else { zsv_ext0 = zsv_ext1 = zsb + 1; dz_ext0 = dz_ext1 = dz0 - 1 - SQUISH_CONSTANT_4D; } @@ -1483,18 +1580,21 @@ public final class OpenSimplexNoise { wsv_ext1 = wsb - 1; dw_ext0 = dw0 - SQUISH_CONSTANT_4D; dw_ext1 = dw0 + 1 - SQUISH_CONSTANT_4D; - } else { + } + else { wsv_ext0 = wsv_ext1 = wsb + 1; dw_ext0 = dw_ext1 = dw0 - 1 - SQUISH_CONSTANT_4D; } } - } else { // One point on each "side" + } + else { // One point on each "side" byte c1, c2; if (aIsBiggerSide) { c1 = aPoint; c2 = bPoint; - } else { + } + else { c1 = bPoint; c2 = aPoint; } @@ -1506,7 +1606,8 @@ public final class OpenSimplexNoise { xsv_ext1 = xsb; dx_ext0 = dx0 + 1 - SQUISH_CONSTANT_4D; dx_ext1 = dx0 - SQUISH_CONSTANT_4D; - } else { + } + else { xsv_ext0 = xsv_ext1 = xsb + 1; dx_ext0 = dx_ext1 = dx0 - 1 - SQUISH_CONSTANT_4D; } @@ -1517,11 +1618,13 @@ public final class OpenSimplexNoise { if ((c1 & 0x01) == 0x01) { ysv_ext0 -= 1; dy_ext0 += 1; - } else { + } + else { ysv_ext1 -= 1; dy_ext1 += 1; } - } else { + } + else { ysv_ext0 = ysv_ext1 = ysb + 1; dy_ext0 = dy_ext1 = dy0 - 1 - SQUISH_CONSTANT_4D; } @@ -1532,11 +1635,13 @@ public final class OpenSimplexNoise { if ((c1 & 0x03) == 0x03) { zsv_ext0 -= 1; dz_ext0 += 1; - } else { + } + else { zsv_ext1 -= 1; dz_ext1 += 1; } - } else { + } + else { zsv_ext0 = zsv_ext1 = zsb + 1; dz_ext0 = dz_ext1 = dz0 - 1 - SQUISH_CONSTANT_4D; } @@ -1546,7 +1651,8 @@ public final class OpenSimplexNoise { wsv_ext1 = wsb - 1; dw_ext0 = dw0 - SQUISH_CONSTANT_4D; dw_ext1 = dw0 + 1 - SQUISH_CONSTANT_4D; - } else { + } + else { wsv_ext0 = wsv_ext1 = wsb + 1; dw_ext0 = dw_ext1 = dw0 - 1 - SQUISH_CONSTANT_4D; } @@ -1564,13 +1670,16 @@ public final class OpenSimplexNoise { if ((c2 & 0x01) != 0) { xsv_ext2 += 2; dx_ext2 -= 2; - } else if ((c2 & 0x02) != 0) { + } + else if ((c2 & 0x02) != 0) { ysv_ext2 += 2; dy_ext2 -= 2; - } else if ((c2 & 0x04) != 0) { + } + else if ((c2 & 0x04) != 0) { zsv_ext2 += 2; dz_ext2 -= 2; - } else { + } + else { wsv_ext2 += 2; dw_ext2 -= 2; } @@ -1685,7 +1794,8 @@ public final class OpenSimplexNoise { attn10 *= attn10; value += attn10 * attn10 * extrapolate(xsb + 0, ysb + 0, zsb + 1, wsb + 1, dx10, dy10, dz10, dw10); } - } else { // We're inside the second dispentachoron (Rectified 4-Simplex) + } + else { // We're inside the second dispentachoron (Rectified 4-Simplex) double aScore; byte aPoint; boolean aIsBiggerSide = true; @@ -1697,7 +1807,8 @@ public final class OpenSimplexNoise { if (xins + yins < zins + wins) { aScore = xins + yins; aPoint = 0x0C; - } else { + } + else { aScore = zins + wins; aPoint = 0x03; } @@ -1706,7 +1817,8 @@ public final class OpenSimplexNoise { if (xins + zins < yins + wins) { bScore = xins + zins; bPoint = 0x0A; - } else { + } + else { bScore = yins + wins; bPoint = 0x05; } @@ -1718,16 +1830,19 @@ public final class OpenSimplexNoise { if (aScore <= bScore && score < bScore) { bScore = score; bPoint = 0x06; - } else if (aScore > bScore && score < aScore) { + } + else if (aScore > bScore && score < aScore) { aScore = score; aPoint = 0x06; } - } else { + } + else { double score = yins + zins; if (aScore <= bScore && score < bScore) { bScore = score; bPoint = 0x09; - } else if (aScore > bScore && score < aScore) { + } + else if (aScore > bScore && score < aScore) { aScore = score; aPoint = 0x09; } @@ -1739,7 +1854,8 @@ public final class OpenSimplexNoise { bScore = p1; bPoint = 0x0E; bIsBiggerSide = false; - } else if (aScore > bScore && p1 < aScore) { + } + else if (aScore > bScore && p1 < aScore) { aScore = p1; aPoint = 0x0E; aIsBiggerSide = false; @@ -1751,7 +1867,8 @@ public final class OpenSimplexNoise { bScore = p2; bPoint = 0x0D; bIsBiggerSide = false; - } else if (aScore > bScore && p2 < aScore) { + } + else if (aScore > bScore && p2 < aScore) { aScore = p2; aPoint = 0x0D; aIsBiggerSide = false; @@ -1763,7 +1880,8 @@ public final class OpenSimplexNoise { bScore = p3; bPoint = 0x0B; bIsBiggerSide = false; - } else if (aScore > bScore && p3 < aScore) { + } + else if (aScore > bScore && p3 < aScore) { aScore = p3; aPoint = 0x0B; aIsBiggerSide = false; @@ -1775,7 +1893,8 @@ public final class OpenSimplexNoise { bScore = p4; bPoint = 0x07; bIsBiggerSide = false; - } else if (aScore > bScore && p4 < aScore) { + } + else if (aScore > bScore && p4 < aScore) { aScore = p4; aPoint = 0x07; aIsBiggerSide = false; @@ -1807,17 +1926,20 @@ public final class OpenSimplexNoise { dx_ext0 -= 1; xsv_ext1 += 2; dx_ext1 -= 2; - } else if ((c1 & 0x02) != 0) { + } + else if ((c1 & 0x02) != 0) { ysv_ext0 += 1; dy_ext0 -= 1; ysv_ext1 += 2; dy_ext1 -= 2; - } else if ((c1 & 0x04) != 0) { + } + else if ((c1 & 0x04) != 0) { zsv_ext0 += 1; dz_ext0 -= 1; zsv_ext1 += 2; dz_ext1 -= 2; - } else { + } + else { wsv_ext0 += 1; dw_ext0 -= 1; wsv_ext1 += 2; @@ -1837,18 +1959,22 @@ public final class OpenSimplexNoise { if ((c2 & 0x01) == 0) { xsv_ext2 -= 2; dx_ext2 += 2; - } else if ((c2 & 0x02) == 0) { + } + else if ((c2 & 0x02) == 0) { ysv_ext2 -= 2; dy_ext2 += 2; - } else if ((c2 & 0x04) == 0) { + } + else if ((c2 & 0x04) == 0) { zsv_ext2 -= 2; dz_ext2 += 2; - } else { + } + else { wsv_ext2 -= 2; dw_ext2 += 2; } - } else { // Both closest points on the smaller side - // One of the two extra points is (1,1,1,1) + } + else { // Both closest points on the smaller side + // One of the two extra points is (1,1,1,1) xsv_ext2 = xsb + 1; ysv_ext2 = ysb + 1; zsv_ext2 = zsb + 1; @@ -1866,7 +1992,8 @@ public final class OpenSimplexNoise { xsv_ext1 = xsb + 1; dx_ext0 = dx0 - 2 - 3 * SQUISH_CONSTANT_4D; dx_ext1 = dx0 - 1 - 3 * SQUISH_CONSTANT_4D; - } else { + } + else { xsv_ext0 = xsv_ext1 = xsb; dx_ext0 = dx_ext1 = dx0 - 3 * SQUISH_CONSTANT_4D; } @@ -1877,11 +2004,13 @@ public final class OpenSimplexNoise { if ((c & 0x01) == 0) { ysv_ext0 += 1; dy_ext0 -= 1; - } else { + } + else { ysv_ext1 += 1; dy_ext1 -= 1; } - } else { + } + else { ysv_ext0 = ysv_ext1 = ysb; dy_ext0 = dy_ext1 = dy0 - 3 * SQUISH_CONSTANT_4D; } @@ -1892,11 +2021,13 @@ public final class OpenSimplexNoise { if ((c & 0x03) == 0) { zsv_ext0 += 1; dz_ext0 -= 1; - } else { + } + else { zsv_ext1 += 1; dz_ext1 -= 1; } - } else { + } + else { zsv_ext0 = zsv_ext1 = zsb; dz_ext0 = dz_ext1 = dz0 - 3 * SQUISH_CONSTANT_4D; } @@ -1906,17 +2037,20 @@ public final class OpenSimplexNoise { wsv_ext1 = wsb + 2; dw_ext0 = dw0 - 1 - 3 * SQUISH_CONSTANT_4D; dw_ext1 = dw0 - 2 - 3 * SQUISH_CONSTANT_4D; - } else { + } + else { wsv_ext0 = wsv_ext1 = wsb; dw_ext0 = dw_ext1 = dw0 - 3 * SQUISH_CONSTANT_4D; } } - } else { // One point on each "side" + } + else { // One point on each "side" byte c1, c2; if (aIsBiggerSide) { c1 = aPoint; c2 = bPoint; - } else { + } + else { c1 = bPoint; c2 = aPoint; } @@ -1928,7 +2062,8 @@ public final class OpenSimplexNoise { xsv_ext1 = xsb + 1; dx_ext0 = dx0 - 2 - 3 * SQUISH_CONSTANT_4D; dx_ext1 = dx0 - 1 - 3 * SQUISH_CONSTANT_4D; - } else { + } + else { xsv_ext0 = xsv_ext1 = xsb; dx_ext0 = dx_ext1 = dx0 - 3 * SQUISH_CONSTANT_4D; } @@ -1939,11 +2074,13 @@ public final class OpenSimplexNoise { if ((c1 & 0x01) == 0) { ysv_ext0 += 1; dy_ext0 -= 1; - } else { + } + else { ysv_ext1 += 1; dy_ext1 -= 1; } - } else { + } + else { ysv_ext0 = ysv_ext1 = ysb; dy_ext0 = dy_ext1 = dy0 - 3 * SQUISH_CONSTANT_4D; } @@ -1954,11 +2091,13 @@ public final class OpenSimplexNoise { if ((c1 & 0x03) == 0) { zsv_ext0 += 1; dz_ext0 -= 1; - } else { + } + else { zsv_ext1 += 1; dz_ext1 -= 1; } - } else { + } + else { zsv_ext0 = zsv_ext1 = zsb; dz_ext0 = dz_ext1 = dz0 - 3 * SQUISH_CONSTANT_4D; } @@ -1968,7 +2107,8 @@ public final class OpenSimplexNoise { wsv_ext1 = wsb + 2; dw_ext0 = dw0 - 1 - 3 * SQUISH_CONSTANT_4D; dw_ext1 = dw0 - 2 - 3 * SQUISH_CONSTANT_4D; - } else { + } + else { wsv_ext0 = wsv_ext1 = wsb; dw_ext0 = dw_ext1 = dw0 - 3 * SQUISH_CONSTANT_4D; } @@ -1986,13 +2126,16 @@ public final class OpenSimplexNoise { if ((c2 & 0x01) == 0) { xsv_ext2 -= 2; dx_ext2 += 2; - } else if ((c2 & 0x02) == 0) { + } + else if ((c2 & 0x02) == 0) { ysv_ext2 -= 2; dy_ext2 += 2; - } else if ((c2 & 0x04) == 0) { + } + else if ((c2 & 0x04) == 0) { zsv_ext2 -= 2; dz_ext2 += 2; - } else { + } + else { wsv_ext2 -= 2; dw_ext2 += 2; } @@ -2159,21 +2302,21 @@ public final class OpenSimplexNoise { // Gradients for 2D. They approximate the directions to the // vertices of an octagon from the center. - private static byte[] gradients2D = new byte[] { 5, 2, 2, 5, -5, 2, -2, 5, 5, -2, 2, -5, -5, -2, -2, -5, }; + private static byte[] gradients2D = new byte[]{5, 2, 2, 5, -5, 2, -2, 5, 5, -2, 2, -5, -5, -2, -2, -5,}; // Gradients for 3D. They approximate the directions to the // vertices of a rhombicuboctahedron from the center, skewed so // that the triangular and square facets can be inscribed inside // circles of the same radius. - private static byte[] gradients3D = new byte[] { -11, 4, 4, -4, 11, 4, -4, 4, 11, 11, 4, 4, 4, 11, 4, 4, 4, 11, -11, + private static byte[] gradients3D = new byte[]{-11, 4, 4, -4, 11, 4, -4, 4, 11, 11, 4, 4, 4, 11, 4, 4, 4, 11, -11, -4, 4, -4, -11, 4, -4, -4, 11, 11, -4, 4, 4, -11, 4, 4, -4, 11, -11, 4, -4, -4, 11, -4, -4, 4, -11, 11, 4, - -4, 4, 11, -4, 4, 4, -11, -11, -4, -4, -4, -11, -4, -4, -4, -11, 11, -4, -4, 4, -11, -4, 4, -4, -11, }; + -4, 4, 11, -4, 4, 4, -11, -11, -4, -4, -4, -11, -4, -4, -4, -11, 11, -4, -4, 4, -11, -4, 4, -4, -11,}; // Gradients for 4D. They approximate the directions to the // vertices of a disprismatotesseractihexadecachoron from the center, // skewed so that the tetrahedral and cubic facets can be inscribed inside // spheres of the same radius. - private static byte[] gradients4D = new byte[] { 3, 1, 1, 1, 1, 3, 1, 1, 1, 1, 3, 1, 1, 1, 1, 3, -3, 1, 1, 1, -1, 3, + private static byte[] gradients4D = new byte[]{3, 1, 1, 1, 1, 3, 1, 1, 1, 1, 3, 1, 1, 1, 1, 3, -3, 1, 1, 1, -1, 3, 1, 1, -1, 1, 3, 1, -1, 1, 1, 3, 3, -1, 1, 1, 1, -3, 1, 1, 1, -1, 3, 1, 1, -1, 1, 3, -3, -1, 1, 1, -1, -3, 1, 1, -1, -1, 3, 1, -1, -1, 1, 3, 3, 1, -1, 1, 1, 3, -1, 1, 1, 1, -3, 1, 1, 1, -1, 3, -3, 1, -1, 1, -1, 3, -1, 1, -1, 1, -3, 1, -1, 1, -1, 3, 3, -1, -1, 1, 1, -3, -1, 1, 1, -1, -3, 1, 1, -1, -1, 3, -3, -1, -1, 1, -1, @@ -2181,5 +2324,5 @@ public final class OpenSimplexNoise { -1, 3, 1, -1, -1, 1, 3, -1, -1, 1, 1, -3, 3, -1, 1, -1, 1, -3, 1, -1, 1, -1, 3, -1, 1, -1, 1, -3, -3, -1, 1, -1, -1, -3, 1, -1, -1, -1, 3, -1, -1, -1, 1, -3, 3, 1, -1, -1, 1, 3, -1, -1, 1, 1, -3, -1, 1, 1, -1, -3, -3, 1, -1, -1, -1, 3, -1, -1, -1, 1, -3, -1, -1, 1, -1, -3, 3, -1, -1, -1, 1, -3, -1, -1, 1, -1, -3, -1, 1, -1, - -1, -3, -3, -1, -1, -1, -1, -3, -1, -1, -1, -1, -3, -1, -1, -1, -1, -3, }; + -1, -3, -3, -1, -1, -1, -1, -3, -1, -1, -1, -1, -3, -1, -1, -1, -1, -3,}; } \ No newline at end of file diff --git a/src/main/java/ru/betterend/particle/FireflyParticle.java b/src/main/java/ru/betterend/particle/FireflyParticle.java index 64624178..bf331531 100644 --- a/src/main/java/ru/betterend/particle/FireflyParticle.java +++ b/src/main/java/ru/betterend/particle/FireflyParticle.java @@ -19,7 +19,7 @@ public class FireflyParticle extends SimpleAnimatedParticle { private double nextVX; private double nextVY; private double nextVZ; - + protected FireflyParticle(ClientLevel world, double x, double y, double z, SpriteSet sprites, double r, double g, double b) { super(world, x, y, z, sprites, 0); setSprite(sprites.get(random)); @@ -28,16 +28,16 @@ public class FireflyParticle extends SimpleAnimatedParticle { this.setFadeColor(15916745); this.setSpriteFromAge(sprites); this.setAlpha(0); - + preVX = random.nextGaussian() * 0.02; preVY = random.nextGaussian() * 0.02; preVZ = random.nextGaussian() * 0.02; - + nextVX = random.nextGaussian() * 0.02; nextVY = random.nextGaussian() * 0.02; nextVZ = random.nextGaussian() * 0.02; } - + @Override public void tick() { int ticks = this.age & 31; @@ -50,18 +50,18 @@ public class FireflyParticle extends SimpleAnimatedParticle { nextVZ = random.nextGaussian() * 0.02; } double delta = (double) ticks / 31.0; - + this.xd = Mth.lerp(delta, preVX, nextVX); this.yd = Mth.lerp(delta, preVY, nextVY); this.zd = Mth.lerp(delta, preVZ, nextVZ); - + if (this.age <= 60) { this.setAlpha(this.age / 60F); } else if (this.age > lifetime - 60) { this.setAlpha((lifetime - this.age) / 60F); } - + super.tick(); } diff --git a/src/main/java/ru/betterend/particle/InfusionParticle.java b/src/main/java/ru/betterend/particle/InfusionParticle.java index 8bdac965..b9dbbc7b 100644 --- a/src/main/java/ru/betterend/particle/InfusionParticle.java +++ b/src/main/java/ru/betterend/particle/InfusionParticle.java @@ -10,7 +10,7 @@ import net.minecraft.client.particle.SpriteSet; import net.minecraft.client.particle.TextureSheetParticle; public class InfusionParticle extends TextureSheetParticle { - + private final SpriteSet spriteProvider; public InfusionParticle(ClientLevel clientWorld, double x, double y, double z, double velocityX, double velocityY, double velocityZ, float[] palette, SpriteSet spriteProvider) { @@ -30,7 +30,7 @@ public class InfusionParticle extends TextureSheetParticle { public ParticleRenderType getRenderType() { return ParticleRenderType.PARTICLE_SHEET_TRANSLUCENT; } - + @Override public void tick() { this.xo = this.x; @@ -38,7 +38,8 @@ public class InfusionParticle extends TextureSheetParticle { this.zo = this.z; if (this.age++ >= this.lifetime) { this.remove(); - } else { + } + else { this.setSpriteFromAge(spriteProvider); double velocityX = 2.0D * this.xd * this.random.nextDouble(); double velocityY = 3.0D * this.yd * this.random.nextDouble(); @@ -50,11 +51,11 @@ public class InfusionParticle extends TextureSheetParticle { @Environment(EnvType.CLIENT) public static class InfusionFactory implements ParticleProvider { private final SpriteSet spriteProvider; - + public InfusionFactory(SpriteSet spriteProvider) { this.spriteProvider = spriteProvider; } - + public Particle createParticle(InfusionParticleType particleType, ClientLevel clientWorld, double d, double e, double f, double g, double h, double i) { return new InfusionParticle(clientWorld, d, e, f, g, h, i, particleType.getPalette(), this.spriteProvider); } diff --git a/src/main/java/ru/betterend/particle/InfusionParticleType.java b/src/main/java/ru/betterend/particle/InfusionParticleType.java index bda8fe13..6b0d1080 100644 --- a/src/main/java/ru/betterend/particle/InfusionParticleType.java +++ b/src/main/java/ru/betterend/particle/InfusionParticleType.java @@ -3,7 +3,6 @@ package ru.betterend.particle; import com.mojang.brigadier.StringReader; import com.mojang.brigadier.exceptions.CommandSyntaxException; import com.mojang.serialization.Codec; - import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.commands.arguments.item.ItemInput; @@ -33,20 +32,20 @@ public class InfusionParticleType extends ParticleType imp return new InfusionParticleType(particleType, packetByteBuf.readItem()); } }; - + private final ParticleType type; private final ItemStack itemStack; - + public InfusionParticleType(ParticleType particleType, ItemStack stack) { super(true, PARAMETERS_FACTORY); this.type = particleType; this.itemStack = stack; } - + public InfusionParticleType(ItemStack stack) { this(EndParticles.INFUSION, stack); } - + @Environment(EnvType.CLIENT) public float[] getPalette() { int color = ColorUtil.extractColor(itemStack.getItem()); diff --git a/src/main/java/ru/betterend/particle/ParticleBlackSpore.java b/src/main/java/ru/betterend/particle/ParticleBlackSpore.java index 9278a0c7..21de4ecc 100644 --- a/src/main/java/ru/betterend/particle/ParticleBlackSpore.java +++ b/src/main/java/ru/betterend/particle/ParticleBlackSpore.java @@ -20,25 +20,25 @@ public class ParticleBlackSpore extends SimpleAnimatedParticle { private double nextVX; private double nextVY; private double nextVZ; - + protected ParticleBlackSpore(ClientLevel world, double x, double y, double z, double r, double g, double b, SpriteSet sprites) { super(world, x, y, z, sprites, 0); setSprite(sprites.get(random)); - + this.lifetime = MHelper.randRange(30, 60, random); this.quadSize = MHelper.randRange(0.05F, 0.15F, random); this.setColor(1, 1, 1); this.setAlpha(0); - + preVX = random.nextGaussian() * 0.015; preVY = 0; preVZ = random.nextGaussian() * 0.015; - + nextVX = random.nextGaussian() * 0.015; nextVY = random.nextFloat() * 0.02 + 0.01; nextVZ = random.nextGaussian() * 0.015; } - + @Override public void tick() { int ticks = this.age & 15; @@ -51,25 +51,25 @@ public class ParticleBlackSpore extends SimpleAnimatedParticle { nextVZ = random.nextGaussian() * 0.015; } double delta = (double) ticks / 15.0; - + if (this.age <= 15) { this.setAlpha(this.age / 15F); } else if (this.age >= this.lifetime - 15) { this.setAlpha((this.lifetime - this.age) / 15F); } - + if (this.age >= this.lifetime) { this.remove(); } - + this.xd = Mth.lerp(delta, preVX, nextVX); this.yd = Mth.lerp(delta, preVY, nextVY); this.zd = Mth.lerp(delta, preVZ, nextVZ); - + super.tick(); } - + @Override public ParticleRenderType getRenderType() { return ParticleRenderType.PARTICLE_SHEET_TRANSLUCENT; diff --git a/src/main/java/ru/betterend/particle/ParticleGeyser.java b/src/main/java/ru/betterend/particle/ParticleGeyser.java index 4c7cb531..4fc4476d 100644 --- a/src/main/java/ru/betterend/particle/ParticleGeyser.java +++ b/src/main/java/ru/betterend/particle/ParticleGeyser.java @@ -17,7 +17,7 @@ public class ParticleGeyser extends TextureSheetParticle { private MutableBlockPos mut = new MutableBlockPos(); private boolean changeDir = false; private boolean check = true; - + protected ParticleGeyser(ClientLevel world, double x, double y, double z, double vx, double vy, double vz, SpriteSet sprites) { super(world, x, y, z, vx, vy, vz); pickSprite(sprites); @@ -27,10 +27,10 @@ public class ParticleGeyser extends TextureSheetParticle { this.zd = vz; this.yo = y - 0.125; } - + @Override public void tick() { - + if (this.yo == this.y || this.age > this.lifetime) { this.remove(); } @@ -38,10 +38,10 @@ public class ParticleGeyser extends TextureSheetParticle { if (this.age >= this.lifetime - 200) { this.setAlpha((this.lifetime - this.age) / 200F); } - + this.quadSize += 0.005F; this.yd = 0.125; - + if (changeDir) { changeDir = false; check = false; @@ -56,7 +56,7 @@ public class ParticleGeyser extends TextureSheetParticle { } super.tick(); } - + @Override public ParticleRenderType getRenderType() { return ParticleRenderType.PARTICLE_SHEET_TRANSLUCENT; diff --git a/src/main/java/ru/betterend/particle/ParticleGlowingSphere.java b/src/main/java/ru/betterend/particle/ParticleGlowingSphere.java index 8edea37a..2afd97e8 100644 --- a/src/main/java/ru/betterend/particle/ParticleGlowingSphere.java +++ b/src/main/java/ru/betterend/particle/ParticleGlowingSphere.java @@ -20,7 +20,7 @@ public class ParticleGlowingSphere extends SimpleAnimatedParticle { private double nextVX; private double nextVY; private double nextVZ; - + protected ParticleGlowingSphere(ClientLevel world, double x, double y, double z, SpriteSet sprites, double r, double g, double b) { super(world, x, y, z, sprites, 0); setSprite(sprites.get(random)); @@ -28,19 +28,19 @@ public class ParticleGlowingSphere extends SimpleAnimatedParticle { this.quadSize = MHelper.randRange(0.05F, 0.15F, random); this.setFadeColor(15916745); this.setSpriteFromAge(sprites); - + preVX = random.nextGaussian() * 0.02; preVY = random.nextGaussian() * 0.02; preVZ = random.nextGaussian() * 0.02; - + nextVX = random.nextGaussian() * 0.02; nextVY = random.nextGaussian() * 0.02; nextVZ = random.nextGaussian() * 0.02; } - + @Override public void tick() { - ticks ++; + ticks++; if (ticks > 30) { preVX = nextVX; preVY = nextVY; @@ -51,11 +51,11 @@ public class ParticleGlowingSphere extends SimpleAnimatedParticle { ticks = 0; } double delta = (double) ticks / 30.0; - + this.xd = Mth.lerp(delta, preVX, nextVX); this.yd = Mth.lerp(delta, preVY, nextVY); this.zd = Mth.lerp(delta, preVZ, nextVZ); - + super.tick(); } diff --git a/src/main/java/ru/betterend/particle/ParticleJungleSpore.java b/src/main/java/ru/betterend/particle/ParticleJungleSpore.java index 25e3e916..309f398d 100644 --- a/src/main/java/ru/betterend/particle/ParticleJungleSpore.java +++ b/src/main/java/ru/betterend/particle/ParticleJungleSpore.java @@ -12,7 +12,7 @@ import ru.bclib.util.MHelper; @Environment(EnvType.CLIENT) public class ParticleJungleSpore extends SimpleAnimatedParticle { - + protected ParticleJungleSpore(ClientLevel world, double x, double y, double z, SpriteSet sprites, double r, double g, double b) { super(world, x, y, z, sprites, 0); setSprite(sprites.get(random)); @@ -22,11 +22,11 @@ public class ParticleJungleSpore extends SimpleAnimatedParticle { this.setSpriteFromAge(sprites); this.setAlpha(0); } - + @Override public void tick() { super.tick(); - + int ticks = this.age % 30; if (ticks == 0) { this.xd = random.nextGaussian() * 0.02; @@ -34,7 +34,7 @@ public class ParticleJungleSpore extends SimpleAnimatedParticle { this.zd = random.nextGaussian() * 0.02; ticks = 0; } - + if (this.age <= 30) { float delta = ticks / 30F; this.setAlpha(delta); @@ -48,7 +48,7 @@ public class ParticleJungleSpore extends SimpleAnimatedParticle { else { this.setAlpha(1); } - + this.yd -= 0.001F; this.xd *= 0.99F; this.zd *= 0.99F; diff --git a/src/main/java/ru/betterend/particle/ParticleSnowflake.java b/src/main/java/ru/betterend/particle/ParticleSnowflake.java index e5f2d921..b9724a87 100644 --- a/src/main/java/ru/betterend/particle/ParticleSnowflake.java +++ b/src/main/java/ru/betterend/particle/ParticleSnowflake.java @@ -21,27 +21,27 @@ public class ParticleSnowflake extends TextureSheetParticle { private double nextVX; private double nextVY; private double nextVZ; - + protected ParticleSnowflake(ClientLevel world, double x, double y, double z, double r, double g, double b, SpriteSet sprites) { super(world, x, y, z, r, g, b); pickSprite(sprites); - + this.lifetime = MHelper.randRange(150, 300, random); this.quadSize = MHelper.randRange(0.05F, 0.2F, random); this.setAlpha(0F); - + preVX = random.nextGaussian() * 0.015; preVY = random.nextGaussian() * 0.015; preVZ = random.nextGaussian() * 0.015; - + nextVX = random.nextGaussian() * 0.015; nextVY = random.nextGaussian() * 0.015; nextVZ = random.nextGaussian() * 0.015; } - + @Override public void tick() { - ticks ++; + ticks++; if (ticks > 200) { preVX = nextVX; preVY = nextVY; @@ -55,25 +55,25 @@ public class ParticleSnowflake extends TextureSheetParticle { ticks = 0; } double delta = (double) ticks / 200.0; - + if (this.age <= 40) { this.setAlpha(this.age / 40F); } else if (this.age >= this.lifetime - 40) { this.setAlpha((this.lifetime - this.age) / 40F); } - + if (this.age >= this.lifetime) { this.remove(); } - + this.xd = Mth.lerp(delta, preVX, nextVX); this.yd = Mth.lerp(delta, preVY, nextVY); this.zd = Mth.lerp(delta, preVZ, nextVZ); - + super.tick(); } - + @Override public ParticleRenderType getRenderType() { return ParticleRenderType.PARTICLE_SHEET_TRANSLUCENT; diff --git a/src/main/java/ru/betterend/particle/ParticleSulphur.java b/src/main/java/ru/betterend/particle/ParticleSulphur.java index 049dbe97..2fcf0d47 100644 --- a/src/main/java/ru/betterend/particle/ParticleSulphur.java +++ b/src/main/java/ru/betterend/particle/ParticleSulphur.java @@ -21,28 +21,28 @@ public class ParticleSulphur extends TextureSheetParticle { private double nextVX; private double nextVY; private double nextVZ; - + protected ParticleSulphur(ClientLevel world, double x, double y, double z, double r, double g, double b, SpriteSet sprites) { super(world, x, y, z, r, g, b); pickSprite(sprites); - + this.lifetime = MHelper.randRange(150, 300, random); this.quadSize = MHelper.randRange(0.05F, 0.15F, random); this.setColor(1, 1, 1); this.setAlpha(0); - + preVX = random.nextGaussian() * 0.015; preVY = random.nextGaussian() * 0.015; preVZ = random.nextGaussian() * 0.015; - + nextVX = random.nextGaussian() * 0.015; nextVY = random.nextGaussian() * 0.015; nextVZ = random.nextGaussian() * 0.015; } - + @Override public void tick() { - ticks ++; + ticks++; if (ticks > 200) { preVX = nextVX; preVY = nextVY; @@ -56,25 +56,25 @@ public class ParticleSulphur extends TextureSheetParticle { ticks = 0; } double delta = (double) ticks / 200.0; - + if (this.age <= 40) { this.setAlpha(this.age / 40F); } else if (this.age >= this.lifetime - 40) { this.setAlpha((this.lifetime - this.age) / 40F); } - + if (this.age >= this.lifetime) { this.remove(); } - + this.xd = Mth.lerp(delta, preVX, nextVX); this.yd = Mth.lerp(delta, preVY, nextVY); this.zd = Mth.lerp(delta, preVZ, nextVZ); - + super.tick(); } - + @Override public ParticleRenderType getRenderType() { return ParticleRenderType.PARTICLE_SHEET_TRANSLUCENT; diff --git a/src/main/java/ru/betterend/particle/ParticleTenaneaPetal.java b/src/main/java/ru/betterend/particle/ParticleTenaneaPetal.java index 7bcb882d..0cd51137 100644 --- a/src/main/java/ru/betterend/particle/ParticleTenaneaPetal.java +++ b/src/main/java/ru/betterend/particle/ParticleTenaneaPetal.java @@ -19,18 +19,18 @@ import ru.betterend.registry.EndBlocks; @Environment(EnvType.CLIENT) public class ParticleTenaneaPetal extends TextureSheetParticle { private static BlockColor provider; - + private double preVX; private double preVY; private double preVZ; private double nextVX; private double nextVY; private double nextVZ; - + protected ParticleTenaneaPetal(ClientLevel world, double x, double y, double z, double r, double g, double b, SpriteSet sprites) { super(world, x, y, z, r, g, b); pickSprite(sprites); - + if (provider == null) { IColorProvider block = (IColorProvider) EndBlocks.TENANEA_FLOWERS; provider = block.getProvider(); @@ -39,15 +39,15 @@ public class ParticleTenaneaPetal extends TextureSheetParticle { this.rCol = ((color >> 16) & 255) / 255F; this.gCol = ((color >> 8) & 255) / 255F; this.bCol = ((color) & 255) / 255F; - + this.lifetime = MHelper.randRange(120, 200, random); this.quadSize = MHelper.randRange(0.05F, 0.15F, random); this.setAlpha(0); - + preVX = 0; preVY = 0; preVZ = 0; - + nextVX = random.nextGaussian() * 0.02; nextVY = -random.nextDouble() * 0.02 - 0.02; nextVZ = random.nextGaussian() * 0.02; @@ -57,7 +57,7 @@ public class ParticleTenaneaPetal extends TextureSheetParticle { public int getLightColor(float tint) { return 15728880; } - + @Override public void tick() { int ticks = this.age & 63; @@ -70,25 +70,25 @@ public class ParticleTenaneaPetal extends TextureSheetParticle { nextVZ = random.nextGaussian() * 0.02; } double delta = (double) ticks / 63.0; - + if (this.age <= 40) { this.setAlpha(this.age / 40F); } else if (this.age >= this.lifetime - 40) { this.setAlpha((this.lifetime - this.age) / 40F); } - + if (this.age >= this.lifetime) { this.remove(); } - + this.xd = Mth.lerp(delta, preVX, nextVX); this.yd = Mth.lerp(delta, preVY, nextVY); this.zd = Mth.lerp(delta, preVZ, nextVZ); - + super.tick(); } - + @Override public ParticleRenderType getRenderType() { return ParticleRenderType.PARTICLE_SHEET_TRANSLUCENT; diff --git a/src/main/java/ru/betterend/particle/PaticlePortalSphere.java b/src/main/java/ru/betterend/particle/PaticlePortalSphere.java index 1d0afdd7..65fc17af 100644 --- a/src/main/java/ru/betterend/particle/PaticlePortalSphere.java +++ b/src/main/java/ru/betterend/particle/PaticlePortalSphere.java @@ -19,7 +19,7 @@ public class PaticlePortalSphere extends SimpleAnimatedParticle { private double nextVX; private double nextVY; private double nextVZ; - + public PaticlePortalSphere(ClientLevel world, double x, double y, double z, SpriteSet spriteProvider) { super(world, x, y, z, spriteProvider, 0); setSprite(spriteProvider.get(random)); @@ -28,16 +28,16 @@ public class PaticlePortalSphere extends SimpleAnimatedParticle { this.setColor(0xFEBBD5); this.setFadeColor(0xBBFEE4); this.setSpriteFromAge(spriteProvider); - + preVX = random.nextGaussian() * 0.02; preVY = random.nextGaussian() * 0.02; preVZ = random.nextGaussian() * 0.02; - + nextVX = random.nextGaussian() * 0.02; nextVY = random.nextGaussian() * 0.02; nextVZ = random.nextGaussian() * 0.02; } - + @Override public void tick() { ticks++; @@ -51,11 +51,11 @@ public class PaticlePortalSphere extends SimpleAnimatedParticle { ticks = 0; } double delta = (double) ticks / 30.0; - + this.xd = Mth.lerp(delta, preVX, nextVX); this.yd = Mth.lerp(delta, preVY, nextVY); this.zd = Mth.lerp(delta, preVZ, nextVZ); - + super.tick(); } diff --git a/src/main/java/ru/betterend/particle/SmaragdantParticle.java b/src/main/java/ru/betterend/particle/SmaragdantParticle.java index 38a3ad71..d58d88cb 100644 --- a/src/main/java/ru/betterend/particle/SmaragdantParticle.java +++ b/src/main/java/ru/betterend/particle/SmaragdantParticle.java @@ -20,25 +20,25 @@ public class SmaragdantParticle extends SimpleAnimatedParticle { private double nextVX; private double nextVY; private double nextVZ; - + protected SmaragdantParticle(ClientLevel world, double x, double y, double z, double r, double g, double b, SpriteSet sprites) { super(world, x, y, z, sprites, 0); setSprite(sprites.get(random)); - + this.lifetime = MHelper.randRange(60, 120, random); this.quadSize = MHelper.randRange(0.05F, 0.15F, random); this.setColor(1, 1, 1); this.setAlpha(0); - + preVX = random.nextGaussian() * 0.01; preVY = random.nextGaussian() * 0.01; preVZ = random.nextGaussian() * 0.01; - + nextVX = random.nextGaussian() * 0.01; nextVY = random.nextGaussian() * 0.01; nextVZ = random.nextGaussian() * 0.01; } - + @Override public void tick() { int ticks = this.age & 31; @@ -51,25 +51,25 @@ public class SmaragdantParticle extends SimpleAnimatedParticle { nextVZ = random.nextGaussian() * 0.015; } double delta = (double) ticks / 31.0; - + if (this.age <= 31) { this.setAlpha(this.age / 31F); } else if (this.age >= this.lifetime - 31) { this.setAlpha((this.lifetime - this.age) / 31F); } - + if (this.age >= this.lifetime) { this.remove(); } - + this.xd = Mth.lerp(delta, preVX, nextVX); this.yd = Mth.lerp(delta, preVY, nextVY); this.zd = Mth.lerp(delta, preVZ, nextVZ); - + super.tick(); } - + @Override public ParticleRenderType getRenderType() { return ParticleRenderType.PARTICLE_SHEET_TRANSLUCENT; diff --git a/src/main/java/ru/betterend/recipe/AlloyingRecipes.java b/src/main/java/ru/betterend/recipe/AlloyingRecipes.java index 404a8aa4..f6585a15 100644 --- a/src/main/java/ru/betterend/recipe/AlloyingRecipes.java +++ b/src/main/java/ru/betterend/recipe/AlloyingRecipes.java @@ -1,8 +1,6 @@ package ru.betterend.recipe; -import net.minecraft.tags.ItemTags; import net.minecraft.world.item.Items; -import net.minecraft.world.level.ItemLike; import net.minecraft.world.level.block.Blocks; import ru.betterend.recipe.builders.AlloyingRecipe; import ru.betterend.registry.EndBlocks; @@ -12,43 +10,43 @@ import ru.betterend.registry.EndTags; public class AlloyingRecipes { public static void register() { AlloyingRecipe.Builder.create("additional_iron") - .setInput(EndTags.ALLOYING_IRON, EndTags.ALLOYING_IRON) - .setOutput(Items.IRON_INGOT, 3) - .setExpiriense(2.1F) - .build(); + .setInput(EndTags.ALLOYING_IRON, EndTags.ALLOYING_IRON) + .setOutput(Items.IRON_INGOT, 3) + .setExpiriense(2.1F) + .build(); AlloyingRecipe.Builder.create("additional_gold") - .setInput(EndTags.ALLOYING_GOLD, EndTags.ALLOYING_GOLD) - .setOutput(Items.GOLD_INGOT, 3) - .setExpiriense(3F) - .build(); + .setInput(EndTags.ALLOYING_GOLD, EndTags.ALLOYING_GOLD) + .setOutput(Items.GOLD_INGOT, 3) + .setExpiriense(3F) + .build(); AlloyingRecipe.Builder.create("additional_gold") .setInput(EndTags.ALLOYING_COPPER, EndTags.ALLOYING_COPPER) .setOutput(Items.COPPER_INGOT, 3) .setExpiriense(3F) .build(); AlloyingRecipe.Builder.create("additional_netherite") - .setInput(Blocks.ANCIENT_DEBRIS, Blocks.ANCIENT_DEBRIS) - .setOutput(Items.NETHERITE_SCRAP, 3) - .setExpiriense(6F) - .setSmeltTime(1000) - .build(); + .setInput(Blocks.ANCIENT_DEBRIS, Blocks.ANCIENT_DEBRIS) + .setOutput(Items.NETHERITE_SCRAP, 3) + .setExpiriense(6F) + .setSmeltTime(1000) + .build(); AlloyingRecipe.Builder.create("terminite_ingot") - .setInput(Items.IRON_INGOT, EndItems.ENDER_DUST) - .setOutput(EndBlocks.TERMINITE.ingot, 1) - .setExpiriense(2.5F) - .setSmeltTime(450) - .build(); + .setInput(Items.IRON_INGOT, EndItems.ENDER_DUST) + .setOutput(EndBlocks.TERMINITE.ingot, 1) + .setExpiriense(2.5F) + .setSmeltTime(450) + .build(); AlloyingRecipe.Builder.create("aeternium_ingot") - .setInput(EndBlocks.TERMINITE.ingot, Items.NETHERITE_INGOT) - .setOutput(EndItems.AETERNIUM_INGOT, 1) - .setExpiriense(4.5F) - .setSmeltTime(850) - .build(); + .setInput(EndBlocks.TERMINITE.ingot, Items.NETHERITE_INGOT) + .setOutput(EndItems.AETERNIUM_INGOT, 1) + .setExpiriense(4.5F) + .setSmeltTime(850) + .build(); AlloyingRecipe.Builder.create("terminite_ingot_thallasium") - .setInput(EndBlocks.THALLASIUM.ingot, EndItems.ENDER_DUST) - .setOutput(EndBlocks.TERMINITE.ingot, 1) - .setExpiriense(2.5F) - .setSmeltTime(450) - .build(); + .setInput(EndBlocks.THALLASIUM.ingot, EndItems.ENDER_DUST) + .setOutput(EndBlocks.TERMINITE.ingot, 1) + .setExpiriense(2.5F) + .setSmeltTime(450) + .build(); } } diff --git a/src/main/java/ru/betterend/recipe/AnvilRecipes.java b/src/main/java/ru/betterend/recipe/AnvilRecipes.java index c6c09ead..197eac88 100644 --- a/src/main/java/ru/betterend/recipe/AnvilRecipes.java +++ b/src/main/java/ru/betterend/recipe/AnvilRecipes.java @@ -8,67 +8,67 @@ import ru.betterend.registry.EndItems; public class AnvilRecipes { public static void register() { AnvilRecipe.Builder.create("ender_pearl_to_dust") - .setInput(Items.ENDER_PEARL) - .setOutput(EndItems.ENDER_DUST) - .setToolLevel(4) - .setDamage(5) - .build(); + .setInput(Items.ENDER_PEARL) + .setOutput(EndItems.ENDER_DUST) + .setToolLevel(4) + .setDamage(5) + .build(); AnvilRecipe.Builder.create("ender_shard_to_dust") - .setInput(EndItems.ENDER_SHARD) - .setOutput(EndItems.ENDER_DUST) - .setToolLevel(0) - .setDamage(3) - .build(); - + .setInput(EndItems.ENDER_SHARD) + .setOutput(EndItems.ENDER_DUST) + .setToolLevel(0) + .setDamage(3) + .build(); + int anvilLevel = EndToolMaterial.AETERNIUM.getLevel(); AnvilRecipe.Builder.create("aeternium_axe_head") - .setInput(EndItems.AETERNIUM_INGOT) - .setOutput(EndItems.AETERNIUM_AXE_HEAD) - .setAnvilLevel(anvilLevel) - .setToolLevel(4) - .setDamage(6) - .build(); + .setInput(EndItems.AETERNIUM_INGOT) + .setOutput(EndItems.AETERNIUM_AXE_HEAD) + .setAnvilLevel(anvilLevel) + .setToolLevel(4) + .setDamage(6) + .build(); AnvilRecipe.Builder.create("aeternium_pickaxe_head") - .setInput(EndItems.AETERNIUM_INGOT) - .setOutput(EndItems.AETERNIUM_PICKAXE_HEAD) - .setAnvilLevel(anvilLevel) - .setToolLevel(4) - .setDamage(6) - .build(); + .setInput(EndItems.AETERNIUM_INGOT) + .setOutput(EndItems.AETERNIUM_PICKAXE_HEAD) + .setAnvilLevel(anvilLevel) + .setToolLevel(4) + .setDamage(6) + .build(); AnvilRecipe.Builder.create("aeternium_shovel_head") - .setInput(EndItems.AETERNIUM_INGOT) - .setOutput(EndItems.AETERNIUM_SHOVEL_HEAD) - .setAnvilLevel(anvilLevel) - .setToolLevel(4) - .setDamage(6) - .build(); + .setInput(EndItems.AETERNIUM_INGOT) + .setOutput(EndItems.AETERNIUM_SHOVEL_HEAD) + .setAnvilLevel(anvilLevel) + .setToolLevel(4) + .setDamage(6) + .build(); AnvilRecipe.Builder.create("aeternium_hoe_head") - .setInput(EndItems.AETERNIUM_INGOT) - .setOutput(EndItems.AETERNIUM_HOE_HEAD) - .setAnvilLevel(anvilLevel) - .setToolLevel(4) - .setDamage(6) - .build(); + .setInput(EndItems.AETERNIUM_INGOT) + .setOutput(EndItems.AETERNIUM_HOE_HEAD) + .setAnvilLevel(anvilLevel) + .setToolLevel(4) + .setDamage(6) + .build(); AnvilRecipe.Builder.create("aeternium_hammer_head") - .setInput(EndItems.AETERNIUM_INGOT) - .setOutput(EndItems.AETERNIUM_HAMMER_HEAD) - .setAnvilLevel(anvilLevel) - .setToolLevel(4) - .setDamage(6) - .build(); + .setInput(EndItems.AETERNIUM_INGOT) + .setOutput(EndItems.AETERNIUM_HAMMER_HEAD) + .setAnvilLevel(anvilLevel) + .setToolLevel(4) + .setDamage(6) + .build(); AnvilRecipe.Builder.create("aeternium_sword_blade") - .setInput(EndItems.AETERNIUM_INGOT) - .setOutput(EndItems.AETERNIUM_SWORD_BLADE) - .setAnvilLevel(anvilLevel) - .setToolLevel(4) - .setDamage(6) - .build(); + .setInput(EndItems.AETERNIUM_INGOT) + .setOutput(EndItems.AETERNIUM_SWORD_BLADE) + .setAnvilLevel(anvilLevel) + .setToolLevel(4) + .setDamage(6) + .build(); AnvilRecipe.Builder.create("aeternium_forged_plate") - .setInput(EndItems.AETERNIUM_INGOT) - .setOutput(EndItems.AETERNIUM_FORGED_PLATE) - .setAnvilLevel(anvilLevel) - .setToolLevel(4) - .setDamage(6) - .build(); + .setInput(EndItems.AETERNIUM_INGOT) + .setOutput(EndItems.AETERNIUM_FORGED_PLATE) + .setAnvilLevel(anvilLevel) + .setToolLevel(4) + .setDamage(6) + .build(); } } diff --git a/src/main/java/ru/betterend/recipe/CraftingRecipes.java b/src/main/java/ru/betterend/recipe/CraftingRecipes.java index 121b2aeb..1e619222 100644 --- a/src/main/java/ru/betterend/recipe/CraftingRecipes.java +++ b/src/main/java/ru/betterend/recipe/CraftingRecipes.java @@ -198,24 +198,24 @@ public class CraftingRecipes { GridRecipe.make(BetterEnd.MOD_ID, "filalux_lantern", EndBlocks.FILALUX_LANTERN).checkConfig(Configs.RECIPE_CONFIG).setShape("###", "###", "###").addMaterial('#', EndBlocks.FILALUX).build(); GridRecipe.make(BetterEnd.MOD_ID, "silk_moth_hive", EndBlocks.SILK_MOTH_HIVE) - .checkConfig(Configs.RECIPE_CONFIG).setShape("#L#", "LML", "#L#") - .addMaterial('#', EndBlocks.TENANEA.planks) - .addMaterial('L', EndBlocks.TENANEA_LEAVES) - .addMaterial('M', EndItems.SILK_MOTH_MATRIX) - .build(); - + .checkConfig(Configs.RECIPE_CONFIG).setShape("#L#", "LML", "#L#") + .addMaterial('#', EndBlocks.TENANEA.planks) + .addMaterial('L', EndBlocks.TENANEA_LEAVES) + .addMaterial('M', EndItems.SILK_MOTH_MATRIX) + .build(); + GridRecipe.make(BetterEnd.MOD_ID, "cave_pumpkin_pie", EndItems.CAVE_PUMPKIN_PIE) - .checkConfig(Configs.RECIPE_CONFIG) - .setShape("SBS", "BPB", "SBS") - .addMaterial('P', EndBlocks.CAVE_PUMPKIN) - .addMaterial('B', EndItems.BLOSSOM_BERRY, EndItems.SHADOW_BERRY_RAW).addMaterial('S', Items.SUGAR).build(); - + .checkConfig(Configs.RECIPE_CONFIG) + .setShape("SBS", "BPB", "SBS") + .addMaterial('P', EndBlocks.CAVE_PUMPKIN) + .addMaterial('B', EndItems.BLOSSOM_BERRY, EndItems.SHADOW_BERRY_RAW).addMaterial('S', Items.SUGAR).build(); + GridRecipe.make(BetterEnd.MOD_ID, "cave_pumpkin_seeds", EndBlocks.CAVE_PUMPKIN_SEED) - .checkConfig(Configs.RECIPE_CONFIG) - .setOutputCount(4) - .setList("#") - .addMaterial('#', EndBlocks.CAVE_PUMPKIN) - .build(); + .checkConfig(Configs.RECIPE_CONFIG) + .setOutputCount(4) + .setList("#") + .addMaterial('#', EndBlocks.CAVE_PUMPKIN) + .build(); GridRecipe.make(BetterEnd.MOD_ID, "neon_cactus_block", EndBlocks.NEON_CACTUS_BLOCK).checkConfig(Configs.RECIPE_CONFIG).setShape("##", "##").addMaterial('#', EndBlocks.NEON_CACTUS).build(); GridRecipe.make(BetterEnd.MOD_ID, "neon_cactus_block_slab", EndBlocks.NEON_CACTUS_BLOCK_SLAB).checkConfig(Configs.RECIPE_CONFIG).setShape("###").setOutputCount(6).addMaterial('#', EndBlocks.NEON_CACTUS_BLOCK).build(); diff --git a/src/main/java/ru/betterend/recipe/InfusionRecipes.java b/src/main/java/ru/betterend/recipe/InfusionRecipes.java index b4de0b54..7b3463d6 100644 --- a/src/main/java/ru/betterend/recipe/InfusionRecipes.java +++ b/src/main/java/ru/betterend/recipe/InfusionRecipes.java @@ -14,598 +14,598 @@ import ru.betterend.registry.EndItems; public class InfusionRecipes { public static void register() { InfusionRecipe.Builder.create("runed_flavolite") - .setInput(EndBlocks.FLAVOLITE.polished) - .setOutput(EndBlocks.FLAVOLITE_RUNED) - .addCatalyst(0, EndItems.CRYSTAL_SHARDS) - .addCatalyst(2, EndItems.CRYSTAL_SHARDS) - .addCatalyst(4, EndItems.CRYSTAL_SHARDS) - .addCatalyst(6, EndItems.CRYSTAL_SHARDS) - .setTime(100) - .build(); - + .setInput(EndBlocks.FLAVOLITE.polished) + .setOutput(EndBlocks.FLAVOLITE_RUNED) + .addCatalyst(0, EndItems.CRYSTAL_SHARDS) + .addCatalyst(2, EndItems.CRYSTAL_SHARDS) + .addCatalyst(4, EndItems.CRYSTAL_SHARDS) + .addCatalyst(6, EndItems.CRYSTAL_SHARDS) + .setTime(100) + .build(); + InfusionRecipe.Builder.create("eternal_crystal") - .setInput(Items.END_CRYSTAL) - .setOutput(EndItems.ETERNAL_CRYSTAL) - .addCatalyst(0, EndItems.CRYSTAL_SHARDS) - .addCatalyst(2, EndItems.CRYSTAL_SHARDS) - .addCatalyst(4, EndItems.CRYSTAL_SHARDS) - .addCatalyst(6, EndItems.CRYSTAL_SHARDS) - .addCatalyst(1, EndItems.ENDER_SHARD) - .addCatalyst(3, EndItems.ENDER_SHARD) - .addCatalyst(5, EndItems.ENDER_SHARD) - .addCatalyst(7, EndItems.ENDER_SHARD) - .setTime(250) - .build(); - + .setInput(Items.END_CRYSTAL) + .setOutput(EndItems.ETERNAL_CRYSTAL) + .addCatalyst(0, EndItems.CRYSTAL_SHARDS) + .addCatalyst(2, EndItems.CRYSTAL_SHARDS) + .addCatalyst(4, EndItems.CRYSTAL_SHARDS) + .addCatalyst(6, EndItems.CRYSTAL_SHARDS) + .addCatalyst(1, EndItems.ENDER_SHARD) + .addCatalyst(3, EndItems.ENDER_SHARD) + .addCatalyst(5, EndItems.ENDER_SHARD) + .addCatalyst(7, EndItems.ENDER_SHARD) + .setTime(250) + .build(); + InfusionRecipe.Builder.create("crystalite_helmet") - .setInput(EndBlocks.TERMINITE.helmet) - .setOutput(EndItems.CRYSTALITE_HELMET) - .addCatalyst(0, EndItems.AMBER_GEM) - .addCatalyst(2, EndItems.CRYSTAL_SHARDS) - .addCatalyst(6, EndItems.CRYSTAL_SHARDS) - .setTime(150) - .build(); + .setInput(EndBlocks.TERMINITE.helmet) + .setOutput(EndItems.CRYSTALITE_HELMET) + .addCatalyst(0, EndItems.AMBER_GEM) + .addCatalyst(2, EndItems.CRYSTAL_SHARDS) + .addCatalyst(6, EndItems.CRYSTAL_SHARDS) + .setTime(150) + .build(); InfusionRecipe.Builder.create("crystalite_chestplate") - .setInput(EndBlocks.TERMINITE.chestplate) - .setOutput(EndItems.CRYSTALITE_CHESTPLATE) - .addCatalyst(0, EndItems.AMBER_GEM) - .addCatalyst(1, EndItems.CRYSTAL_SHARDS) - .addCatalyst(3, EndItems.CRYSTAL_SHARDS) - .addCatalyst(5, EndItems.CRYSTAL_SHARDS) - .addCatalyst(7, EndItems.CRYSTAL_SHARDS) - .setTime(300) - .build(); + .setInput(EndBlocks.TERMINITE.chestplate) + .setOutput(EndItems.CRYSTALITE_CHESTPLATE) + .addCatalyst(0, EndItems.AMBER_GEM) + .addCatalyst(1, EndItems.CRYSTAL_SHARDS) + .addCatalyst(3, EndItems.CRYSTAL_SHARDS) + .addCatalyst(5, EndItems.CRYSTAL_SHARDS) + .addCatalyst(7, EndItems.CRYSTAL_SHARDS) + .setTime(300) + .build(); InfusionRecipe.Builder.create("crystalite_leggings") - .setInput(EndBlocks.TERMINITE.leggings) - .setOutput(EndItems.CRYSTALITE_LEGGINGS) - .addCatalyst(0, EndItems.AMBER_GEM) - .addCatalyst(2, EndItems.CRYSTAL_SHARDS) - .addCatalyst(4, EndItems.CRYSTAL_SHARDS) - .addCatalyst(6, EndItems.CRYSTAL_SHARDS) - .setTime(225) - .build(); + .setInput(EndBlocks.TERMINITE.leggings) + .setOutput(EndItems.CRYSTALITE_LEGGINGS) + .addCatalyst(0, EndItems.AMBER_GEM) + .addCatalyst(2, EndItems.CRYSTAL_SHARDS) + .addCatalyst(4, EndItems.CRYSTAL_SHARDS) + .addCatalyst(6, EndItems.CRYSTAL_SHARDS) + .setTime(225) + .build(); InfusionRecipe.Builder.create("crystalite_boots") - .setInput(EndBlocks.TERMINITE.boots) - .setOutput(EndItems.CRYSTALITE_BOOTS) - .addCatalyst(0, EndItems.AMBER_GEM) - .addCatalyst(2, EndItems.CRYSTAL_SHARDS) - .addCatalyst(6, EndItems.CRYSTAL_SHARDS) - .setTime(150) - .build(); + .setInput(EndBlocks.TERMINITE.boots) + .setOutput(EndItems.CRYSTALITE_BOOTS) + .addCatalyst(0, EndItems.AMBER_GEM) + .addCatalyst(2, EndItems.CRYSTAL_SHARDS) + .addCatalyst(6, EndItems.CRYSTAL_SHARDS) + .setTime(150) + .build(); InfusionRecipe.Builder.create("crystalite_elytra") - .setInput(Items.ELYTRA) - .setOutput(EndItems.CRYSTALITE_ELYTRA) - .addCatalyst(0, EndItems.AMBER_GEM) - .addCatalyst(1, EndItems.CRYSTAL_SHARDS) - .addCatalyst(2, EndItems.ENCHANTED_MEMBRANE) - .addCatalyst(3, EndItems.CRYSTAL_SHARDS) - .addCatalyst(4, EndItems.ENCHANTED_MEMBRANE) - .addCatalyst(5, EndItems.CRYSTAL_SHARDS) - .addCatalyst(6, EndItems.ENCHANTED_MEMBRANE) - .addCatalyst(7, EndItems.CRYSTAL_SHARDS) - .setTime(500) - .build(); - + .setInput(Items.ELYTRA) + .setOutput(EndItems.CRYSTALITE_ELYTRA) + .addCatalyst(0, EndItems.AMBER_GEM) + .addCatalyst(1, EndItems.CRYSTAL_SHARDS) + .addCatalyst(2, EndItems.ENCHANTED_MEMBRANE) + .addCatalyst(3, EndItems.CRYSTAL_SHARDS) + .addCatalyst(4, EndItems.ENCHANTED_MEMBRANE) + .addCatalyst(5, EndItems.CRYSTAL_SHARDS) + .addCatalyst(6, EndItems.ENCHANTED_MEMBRANE) + .addCatalyst(7, EndItems.CRYSTAL_SHARDS) + .setTime(500) + .build(); + InfusionRecipe.Builder.create("enchanted_petal") - .setInput(EndItems.HYDRALUX_PETAL) - .setOutput(EndItems.ENCHANTED_PETAL) - .addCatalyst(0, EndItems.CRYSTAL_SHARDS) - .addCatalyst(2, EndItems.CRYSTAL_SHARDS) - .addCatalyst(4, EndItems.CRYSTAL_SHARDS) - .addCatalyst(6, EndItems.CRYSTAL_SHARDS) - .setTime(75) - .build(); + .setInput(EndItems.HYDRALUX_PETAL) + .setOutput(EndItems.ENCHANTED_PETAL) + .addCatalyst(0, EndItems.CRYSTAL_SHARDS) + .addCatalyst(2, EndItems.CRYSTAL_SHARDS) + .addCatalyst(4, EndItems.CRYSTAL_SHARDS) + .addCatalyst(6, EndItems.CRYSTAL_SHARDS) + .setTime(75) + .build(); InfusionRecipe.Builder.create("enchanted_membrane") - .setInput(Items.PHANTOM_MEMBRANE) - .setOutput(EndItems.ENCHANTED_MEMBRANE) - .addCatalyst(0, EndItems.CRYSTAL_SHARDS) - .addCatalyst(2, EndItems.CRYSTAL_SHARDS) - .addCatalyst(4, EndItems.CRYSTAL_SHARDS) - .addCatalyst(6, EndItems.CRYSTAL_SHARDS) - .setTime(75) - .build(); + .setInput(Items.PHANTOM_MEMBRANE) + .setOutput(EndItems.ENCHANTED_MEMBRANE) + .addCatalyst(0, EndItems.CRYSTAL_SHARDS) + .addCatalyst(2, EndItems.CRYSTAL_SHARDS) + .addCatalyst(4, EndItems.CRYSTAL_SHARDS) + .addCatalyst(6, EndItems.CRYSTAL_SHARDS) + .setTime(75) + .build(); InfusionRecipe.Builder.create("protection_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.ALL_DAMAGE_PROTECTION, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(4, Items.TURTLE_HELMET) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(300) - .build(); + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.ALL_DAMAGE_PROTECTION, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(4, Items.TURTLE_HELMET) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); InfusionRecipe.Builder.create("fire_protection_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.FIRE_PROTECTION, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.BLAZE_ROD) - .addCatalyst(4, Items.BLAZE_ROD) - .addCatalyst(6, Items.BLAZE_ROD) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(300) - .build(); + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.FIRE_PROTECTION, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.BLAZE_ROD) + .addCatalyst(4, Items.BLAZE_ROD) + .addCatalyst(6, Items.BLAZE_ROD) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); InfusionRecipe.Builder.create("feather_falling_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.FALL_PROTECTION, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.FEATHER) - .addCatalyst(4, Items.FEATHER) - .addCatalyst(6, Items.FEATHER) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(300) - .build(); + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.FALL_PROTECTION, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.FEATHER) + .addCatalyst(4, Items.FEATHER) + .addCatalyst(6, Items.FEATHER) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); InfusionRecipe.Builder.create("blast_protection_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.BLAST_PROTECTION, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Blocks.OBSIDIAN) - .addCatalyst(4, Blocks.OBSIDIAN) - .addCatalyst(6, Blocks.OBSIDIAN) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(300) - .build(); + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.BLAST_PROTECTION, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Blocks.OBSIDIAN) + .addCatalyst(4, Blocks.OBSIDIAN) + .addCatalyst(6, Blocks.OBSIDIAN) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); InfusionRecipe.Builder.create("projectile_protection_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.PROJECTILE_PROTECTION, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.SCUTE) - .addCatalyst(4, Items.SHIELD) - .addCatalyst(6, Items.SCUTE) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(300) - .build(); + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.PROJECTILE_PROTECTION, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.SCUTE) + .addCatalyst(4, Items.SHIELD) + .addCatalyst(6, Items.SCUTE) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); InfusionRecipe.Builder.create("respiration_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.RESPIRATION, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.NAUTILUS_SHELL) - .addCatalyst(4, Items.NAUTILUS_SHELL) - .addCatalyst(6, Items.NAUTILUS_SHELL) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(300) - .build(); + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.RESPIRATION, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.NAUTILUS_SHELL) + .addCatalyst(4, Items.NAUTILUS_SHELL) + .addCatalyst(6, Items.NAUTILUS_SHELL) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); InfusionRecipe.Builder.create("aqua_affinity_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.AQUA_AFFINITY, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.PRISMARINE_CRYSTALS) - .addCatalyst(4, Items.PRISMARINE_CRYSTALS) - .addCatalyst(6, Items.PRISMARINE_CRYSTALS) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(300) - .build(); + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.AQUA_AFFINITY, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.PRISMARINE_CRYSTALS) + .addCatalyst(4, Items.PRISMARINE_CRYSTALS) + .addCatalyst(6, Items.PRISMARINE_CRYSTALS) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); InfusionRecipe.Builder.create("thorns_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.THORNS, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Blocks.CACTUS) - .addCatalyst(4, Blocks.CACTUS) - .addCatalyst(6, Blocks.CACTUS) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(300) - .build(); + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.THORNS, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Blocks.CACTUS) + .addCatalyst(4, Blocks.CACTUS) + .addCatalyst(6, Blocks.CACTUS) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); InfusionRecipe.Builder.create("depth_strider_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.DEPTH_STRIDER, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Blocks.LILY_PAD) - .addCatalyst(4, EndBlocks.END_LILY_SEED) - .addCatalyst(6, Blocks.LILY_PAD) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(300) - .build(); + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.DEPTH_STRIDER, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Blocks.LILY_PAD) + .addCatalyst(4, EndBlocks.END_LILY_SEED) + .addCatalyst(6, Blocks.LILY_PAD) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); InfusionRecipe.Builder.create("frost_walker_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.FROST_WALKER, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(4, EndBlocks.ANCIENT_EMERALD_ICE) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(300) - .build(); + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.FROST_WALKER, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(4, EndBlocks.ANCIENT_EMERALD_ICE) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); InfusionRecipe.Builder.create("soul_speed_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.SOUL_SPEED, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Blocks.SOUL_SAND, Blocks.SOUL_SOIL) - .addCatalyst(4, Blocks.SOUL_SAND, Blocks.SOUL_SOIL) - .addCatalyst(6, Blocks.SOUL_SAND, Blocks.SOUL_SOIL) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(300) - .build(); + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.SOUL_SPEED, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Blocks.SOUL_SAND, Blocks.SOUL_SOIL) + .addCatalyst(4, Blocks.SOUL_SAND, Blocks.SOUL_SOIL) + .addCatalyst(6, Blocks.SOUL_SAND, Blocks.SOUL_SOIL) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); InfusionRecipe.Builder.create("sharpness_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.SHARPNESS, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(4, Items.NETHERITE_SCRAP) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(300) - .build(); + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.SHARPNESS, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(4, Items.NETHERITE_SCRAP) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); InfusionRecipe.Builder.create("smite_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.SMITE, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Blocks.SUNFLOWER) - .addCatalyst(4, Items.GOLD_INGOT) - .addCatalyst(6, Blocks.SUNFLOWER) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(300) - .build(); + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.SMITE, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Blocks.SUNFLOWER) + .addCatalyst(4, Items.GOLD_INGOT) + .addCatalyst(6, Blocks.SUNFLOWER) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); InfusionRecipe.Builder.create("bane_of_arthropods_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.BANE_OF_ARTHROPODS, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.FERMENTED_SPIDER_EYE) - .addCatalyst(4, Items.IRON_INGOT) - .addCatalyst(6, Items.FERMENTED_SPIDER_EYE) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(300) - .build(); + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.BANE_OF_ARTHROPODS, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.FERMENTED_SPIDER_EYE) + .addCatalyst(4, Items.IRON_INGOT) + .addCatalyst(6, Items.FERMENTED_SPIDER_EYE) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); InfusionRecipe.Builder.create("knockback_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.KNOCKBACK, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.REDSTONE) - .addCatalyst(4, Blocks.PISTON) - .addCatalyst(6, Items.REDSTONE) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(300) - .build(); + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.KNOCKBACK, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.REDSTONE) + .addCatalyst(4, Blocks.PISTON) + .addCatalyst(6, Items.REDSTONE) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); InfusionRecipe.Builder.create("fire_aspect_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.FIRE_ASPECT, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.BLAZE_POWDER) - .addCatalyst(4, Items.MAGMA_CREAM) - .addCatalyst(6, Items.BLAZE_POWDER) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(300) - .build(); + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.FIRE_ASPECT, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.BLAZE_POWDER) + .addCatalyst(4, Items.MAGMA_CREAM) + .addCatalyst(6, Items.BLAZE_POWDER) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); InfusionRecipe.Builder.create("looting_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.MOB_LOOTING, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.EMERALD) - .addCatalyst(4, Items.GOLD_INGOT) - .addCatalyst(6, Items.EMERALD) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(300) - .build(); + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.MOB_LOOTING, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.EMERALD) + .addCatalyst(4, Items.GOLD_INGOT) + .addCatalyst(6, Items.EMERALD) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); InfusionRecipe.Builder.create("sweeping_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.SWEEPING_EDGE, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.GOLDEN_SWORD) - .addCatalyst(4, Items.IRON_SWORD) - .addCatalyst(6, Items.GOLDEN_SWORD) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(300) - .build(); + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.SWEEPING_EDGE, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.GOLDEN_SWORD) + .addCatalyst(4, Items.IRON_SWORD) + .addCatalyst(6, Items.GOLDEN_SWORD) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); InfusionRecipe.Builder.create("efficiency_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.BLOCK_EFFICIENCY, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, EndItems.AMBER_GEM) - .addCatalyst(4, EndItems.AMBER_GEM) - .addCatalyst(6, EndItems.AMBER_GEM) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(300) - .build(); + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.BLOCK_EFFICIENCY, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, EndItems.AMBER_GEM) + .addCatalyst(4, EndItems.AMBER_GEM) + .addCatalyst(6, EndItems.AMBER_GEM) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); InfusionRecipe.Builder.create("silk_touch_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.SILK_TOUCH, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Blocks.COBWEB) - .addCatalyst(4, EndItems.ETERNAL_CRYSTAL) - .addCatalyst(6, Blocks.COBWEB) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(375) - .build(); + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.SILK_TOUCH, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Blocks.COBWEB) + .addCatalyst(4, EndItems.ETERNAL_CRYSTAL) + .addCatalyst(6, Blocks.COBWEB) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(375) + .build(); InfusionRecipe.Builder.create("unbreaking_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.UNBREAKING, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.DIAMOND) - .addCatalyst(4, Items.DIAMOND) - .addCatalyst(6, Items.DIAMOND) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(300) - .build(); + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.UNBREAKING, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.DIAMOND) + .addCatalyst(4, Items.DIAMOND) + .addCatalyst(6, Items.DIAMOND) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); InfusionRecipe.Builder.create("fortune_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.BLOCK_FORTUNE, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.EMERALD) - .addCatalyst(4, Items.RABBIT_FOOT) - .addCatalyst(6, Items.EMERALD) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(300) - .build(); + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.BLOCK_FORTUNE, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.EMERALD) + .addCatalyst(4, Items.RABBIT_FOOT) + .addCatalyst(6, Items.EMERALD) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); InfusionRecipe.Builder.create("power_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.POWER_ARROWS, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, EndItems.AMBER_GEM) - .addCatalyst(4, Items.DIAMOND_SWORD) - .addCatalyst(6, EndItems.AMBER_GEM) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(300) - .build(); + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.POWER_ARROWS, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, EndItems.AMBER_GEM) + .addCatalyst(4, Items.DIAMOND_SWORD) + .addCatalyst(6, EndItems.AMBER_GEM) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); InfusionRecipe.Builder.create("punch_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.PUNCH_ARROWS, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.POPPED_CHORUS_FRUIT) - .addCatalyst(4, Items.SPECTRAL_ARROW) - .addCatalyst(6, Items.POPPED_CHORUS_FRUIT) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(300) - .build(); + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.PUNCH_ARROWS, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.POPPED_CHORUS_FRUIT) + .addCatalyst(4, Items.SPECTRAL_ARROW) + .addCatalyst(6, Items.POPPED_CHORUS_FRUIT) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); InfusionRecipe.Builder.create("flame_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.FLAMING_ARROWS, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.BLAZE_POWDER) - .addCatalyst(4, Items.SPECTRAL_ARROW) - .addCatalyst(6, Items.BLAZE_POWDER) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(300) - .build(); + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.FLAMING_ARROWS, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.BLAZE_POWDER) + .addCatalyst(4, Items.SPECTRAL_ARROW) + .addCatalyst(6, Items.BLAZE_POWDER) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); InfusionRecipe.Builder.create("infinity_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.INFINITY_ARROWS, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.SPECTRAL_ARROW) - .addCatalyst(4, EndItems.ETERNAL_CRYSTAL) - .addCatalyst(6, Items.SPECTRAL_ARROW) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(375) - .build(); + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.INFINITY_ARROWS, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.SPECTRAL_ARROW) + .addCatalyst(4, EndItems.ETERNAL_CRYSTAL) + .addCatalyst(6, Items.SPECTRAL_ARROW) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(375) + .build(); InfusionRecipe.Builder.create("luck_of_sea_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.FISHING_LUCK, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.EMERALD) - .addCatalyst(4, Items.FISHING_ROD) - .addCatalyst(6, Items.EMERALD) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(300) - .build(); + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.FISHING_LUCK, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.EMERALD) + .addCatalyst(4, Items.FISHING_ROD) + .addCatalyst(6, Items.EMERALD) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); InfusionRecipe.Builder.create("lure_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.FISHING_SPEED, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.GOLD_NUGGET) - .addCatalyst(4, Items.FISHING_ROD) - .addCatalyst(6, Items.GOLD_NUGGET) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(300) - .build(); + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.FISHING_SPEED, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.GOLD_NUGGET) + .addCatalyst(4, Items.FISHING_ROD) + .addCatalyst(6, Items.GOLD_NUGGET) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); InfusionRecipe.Builder.create("loyalty_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.LOYALTY, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.ENDER_EYE) - .addCatalyst(4, Items.HEART_OF_THE_SEA) - .addCatalyst(6, Items.ENDER_EYE) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(375) - .build(); + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.LOYALTY, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.ENDER_EYE) + .addCatalyst(4, Items.HEART_OF_THE_SEA) + .addCatalyst(6, Items.ENDER_EYE) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(375) + .build(); InfusionRecipe.Builder.create("impaling_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.IMPALING, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.PRISMARINE_SHARD) - .addCatalyst(4, Items.IRON_SWORD) - .addCatalyst(6, Items.PRISMARINE_SHARD) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(300) - .build(); + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.IMPALING, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.PRISMARINE_SHARD) + .addCatalyst(4, Items.IRON_SWORD) + .addCatalyst(6, Items.PRISMARINE_SHARD) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); InfusionRecipe.Builder.create("riptide_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.RIPTIDE, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.LEAD) - .addCatalyst(4, Items.HEART_OF_THE_SEA) - .addCatalyst(6, Items.LEAD) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(375) - .build(); + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.RIPTIDE, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.LEAD) + .addCatalyst(4, Items.HEART_OF_THE_SEA) + .addCatalyst(6, Items.LEAD) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(375) + .build(); InfusionRecipe.Builder.create("channeling_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.CHANNELING, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.CHAIN) - .addCatalyst(4, Items.HEART_OF_THE_SEA) - .addCatalyst(6, Items.CHAIN) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(375) - .build(); + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.CHANNELING, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.CHAIN) + .addCatalyst(4, Items.HEART_OF_THE_SEA) + .addCatalyst(6, Items.CHAIN) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(375) + .build(); InfusionRecipe.Builder.create("multishot_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.MULTISHOT, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.ARROW) - .addCatalyst(4, Items.SPECTRAL_ARROW) - .addCatalyst(6, Items.ARROW) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(300) - .build(); + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.MULTISHOT, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.ARROW) + .addCatalyst(4, Items.SPECTRAL_ARROW) + .addCatalyst(6, Items.ARROW) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); InfusionRecipe.Builder.create("quick_charge_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.QUICK_CHARGE, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.QUARTZ) - .addCatalyst(4, Items.GLOWSTONE_DUST) - .addCatalyst(6, Items.QUARTZ) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(300) - .build(); + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.QUICK_CHARGE, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.QUARTZ) + .addCatalyst(4, Items.GLOWSTONE_DUST) + .addCatalyst(6, Items.QUARTZ) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); InfusionRecipe.Builder.create("piercing_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.PIERCING, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.GLOWSTONE_DUST) - .addCatalyst(4, Items.SPECTRAL_ARROW) - .addCatalyst(6, Items.GLOWSTONE_DUST) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(300) - .build(); + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.PIERCING, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.GLOWSTONE_DUST) + .addCatalyst(4, Items.SPECTRAL_ARROW) + .addCatalyst(6, Items.GLOWSTONE_DUST) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(300) + .build(); InfusionRecipe.Builder.create("mending_book") - .setInput(Items.BOOK) - .setOutput(createEnchantedBook(Enchantments.MENDING, 1)) - .addCatalyst(0, EndItems.ENCHANTED_PETAL) - .addCatalyst(2, Items.EXPERIENCE_BOTTLE) - .addCatalyst(4, Blocks.ANVIL) - .addCatalyst(6, Items.EXPERIENCE_BOTTLE) - .addCatalyst(1, Items.LAPIS_LAZULI) - .addCatalyst(3, Items.LAPIS_LAZULI) - .addCatalyst(5, Items.LAPIS_LAZULI) - .addCatalyst(7, Items.LAPIS_LAZULI) - .setGroup("enchantment") - .setTime(375) - .build(); + .setInput(Items.BOOK) + .setOutput(createEnchantedBook(Enchantments.MENDING, 1)) + .addCatalyst(0, EndItems.ENCHANTED_PETAL) + .addCatalyst(2, Items.EXPERIENCE_BOTTLE) + .addCatalyst(4, Blocks.ANVIL) + .addCatalyst(6, Items.EXPERIENCE_BOTTLE) + .addCatalyst(1, Items.LAPIS_LAZULI) + .addCatalyst(3, Items.LAPIS_LAZULI) + .addCatalyst(5, Items.LAPIS_LAZULI) + .addCatalyst(7, Items.LAPIS_LAZULI) + .setGroup("enchantment") + .setTime(375) + .build(); } - + private static ItemStack createEnchantedBook(Enchantment enchantment, int level) { ItemStack book = new ItemStack(Items.ENCHANTED_BOOK); EnchantedBookItem.addEnchantment(book, new EnchantmentInstance(enchantment, level)); diff --git a/src/main/java/ru/betterend/recipe/SmithingRecipes.java b/src/main/java/ru/betterend/recipe/SmithingRecipes.java index 5c8e82b6..4a4cc075 100644 --- a/src/main/java/ru/betterend/recipe/SmithingRecipes.java +++ b/src/main/java/ru/betterend/recipe/SmithingRecipes.java @@ -8,102 +8,102 @@ import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndItems; public class SmithingRecipes { - + public static void register() { SmithingTableRecipe.create(BetterEnd.MOD_ID, "aeternium_sword_handle") - .checkConfig(Configs.RECIPE_CONFIG) - .setResult(EndItems.AETERNIUM_SWORD_HANDLE) - .setBase(EndBlocks.TERMINITE.ingot) - .setAddition(EndItems.LEATHER_WRAPPED_STICK) - .build(); - + .checkConfig(Configs.RECIPE_CONFIG) + .setResult(EndItems.AETERNIUM_SWORD_HANDLE) + .setBase(EndBlocks.TERMINITE.ingot) + .setAddition(EndItems.LEATHER_WRAPPED_STICK) + .build(); + SmithingTableRecipe.create(BetterEnd.MOD_ID, "aeternium_sword") - .checkConfig(Configs.RECIPE_CONFIG) - .setResult(EndItems.AETERNIUM_SWORD) - .setBase(EndItems.AETERNIUM_SWORD_BLADE) - .setAddition(EndItems.AETERNIUM_SWORD_HANDLE) - .build(); + .checkConfig(Configs.RECIPE_CONFIG) + .setResult(EndItems.AETERNIUM_SWORD) + .setBase(EndItems.AETERNIUM_SWORD_BLADE) + .setAddition(EndItems.AETERNIUM_SWORD_HANDLE) + .build(); SmithingTableRecipe.create(BetterEnd.MOD_ID, "aeternium_pickaxe") - .checkConfig(Configs.RECIPE_CONFIG) - .setResult(EndItems.AETERNIUM_PICKAXE) - .setBase(EndItems.AETERNIUM_PICKAXE_HEAD) - .setAddition(EndItems.LEATHER_WRAPPED_STICK) - .build(); + .checkConfig(Configs.RECIPE_CONFIG) + .setResult(EndItems.AETERNIUM_PICKAXE) + .setBase(EndItems.AETERNIUM_PICKAXE_HEAD) + .setAddition(EndItems.LEATHER_WRAPPED_STICK) + .build(); SmithingTableRecipe.create(BetterEnd.MOD_ID, "aeternium_axe") - .checkConfig(Configs.RECIPE_CONFIG) - .setResult(EndItems.AETERNIUM_AXE) - .setBase(EndItems.AETERNIUM_AXE_HEAD) - .setAddition(EndItems.LEATHER_WRAPPED_STICK) - .build(); + .checkConfig(Configs.RECIPE_CONFIG) + .setResult(EndItems.AETERNIUM_AXE) + .setBase(EndItems.AETERNIUM_AXE_HEAD) + .setAddition(EndItems.LEATHER_WRAPPED_STICK) + .build(); SmithingTableRecipe.create(BetterEnd.MOD_ID, "aeternium_shovel") - .checkConfig(Configs.RECIPE_CONFIG) - .setResult(EndItems.AETERNIUM_SHOVEL) - .setBase(EndItems.AETERNIUM_SHOVEL_HEAD) - .setAddition(EndItems.LEATHER_WRAPPED_STICK) - .build(); + .checkConfig(Configs.RECIPE_CONFIG) + .setResult(EndItems.AETERNIUM_SHOVEL) + .setBase(EndItems.AETERNIUM_SHOVEL_HEAD) + .setAddition(EndItems.LEATHER_WRAPPED_STICK) + .build(); SmithingTableRecipe.create(BetterEnd.MOD_ID, "aeternium_hoe") - .checkConfig(Configs.RECIPE_CONFIG) - .setResult(EndItems.AETERNIUM_HOE) - .setBase(EndItems.AETERNIUM_HOE_HEAD) - .setAddition(EndItems.LEATHER_WRAPPED_STICK) - .build(); + .checkConfig(Configs.RECIPE_CONFIG) + .setResult(EndItems.AETERNIUM_HOE) + .setBase(EndItems.AETERNIUM_HOE_HEAD) + .setAddition(EndItems.LEATHER_WRAPPED_STICK) + .build(); SmithingTableRecipe.create(BetterEnd.MOD_ID, "aeternium_hammer") - .checkConfig(Configs.RECIPE_CONFIG) - .setResult(EndItems.AETERNIUM_HAMMER) - .setBase(EndItems.AETERNIUM_HAMMER_HEAD) - .setAddition(EndItems.LEATHER_WRAPPED_STICK) - .build(); + .checkConfig(Configs.RECIPE_CONFIG) + .setResult(EndItems.AETERNIUM_HAMMER) + .setBase(EndItems.AETERNIUM_HAMMER_HEAD) + .setAddition(EndItems.LEATHER_WRAPPED_STICK) + .build(); SmithingTableRecipe.create(BetterEnd.MOD_ID, "netherite_hammer") - .checkConfig(Configs.RECIPE_CONFIG) - .setResult(EndItems.NETHERITE_HAMMER) - .setBase(EndItems.DIAMOND_HAMMER) - .setAddition(Items.NETHERITE_INGOT) - .build(); - + .checkConfig(Configs.RECIPE_CONFIG) + .setResult(EndItems.NETHERITE_HAMMER) + .setBase(EndItems.DIAMOND_HAMMER) + .setAddition(Items.NETHERITE_INGOT) + .build(); + SmithingTableRecipe.create(BetterEnd.MOD_ID, "aeternium_helmet") - .checkConfig(Configs.RECIPE_CONFIG) - .setResult(EndItems.AETERNIUM_HELMET) - .setBase(EndBlocks.TERMINITE.helmet) - .setAddition(EndItems.AETERNIUM_FORGED_PLATE) - .build(); + .checkConfig(Configs.RECIPE_CONFIG) + .setResult(EndItems.AETERNIUM_HELMET) + .setBase(EndBlocks.TERMINITE.helmet) + .setAddition(EndItems.AETERNIUM_FORGED_PLATE) + .build(); SmithingTableRecipe.create(BetterEnd.MOD_ID, "aeternium_chestplate") - .checkConfig(Configs.RECIPE_CONFIG) - .setResult(EndItems.AETERNIUM_CHESTPLATE) - .setBase(EndBlocks.TERMINITE.chestplate) - .setAddition(EndItems.AETERNIUM_FORGED_PLATE) - .build(); + .checkConfig(Configs.RECIPE_CONFIG) + .setResult(EndItems.AETERNIUM_CHESTPLATE) + .setBase(EndBlocks.TERMINITE.chestplate) + .setAddition(EndItems.AETERNIUM_FORGED_PLATE) + .build(); SmithingTableRecipe.create(BetterEnd.MOD_ID, "aeternium_leggings") - .checkConfig(Configs.RECIPE_CONFIG) - .setResult(EndItems.AETERNIUM_LEGGINGS) - .setBase(EndBlocks.TERMINITE.leggings) - .setAddition(EndItems.AETERNIUM_FORGED_PLATE) - .build(); + .checkConfig(Configs.RECIPE_CONFIG) + .setResult(EndItems.AETERNIUM_LEGGINGS) + .setBase(EndBlocks.TERMINITE.leggings) + .setAddition(EndItems.AETERNIUM_FORGED_PLATE) + .build(); SmithingTableRecipe.create(BetterEnd.MOD_ID, "aeternium_boots") - .checkConfig(Configs.RECIPE_CONFIG) - .setResult(EndItems.AETERNIUM_BOOTS) - .setBase(EndBlocks.TERMINITE.boots) - .setAddition(EndItems.AETERNIUM_FORGED_PLATE) - .build(); - + .checkConfig(Configs.RECIPE_CONFIG) + .setResult(EndItems.AETERNIUM_BOOTS) + .setBase(EndBlocks.TERMINITE.boots) + .setAddition(EndItems.AETERNIUM_FORGED_PLATE) + .build(); + SmithingTableRecipe.create(BetterEnd.MOD_ID, "thallasium_anvil_updrade") - .checkConfig(Configs.RECIPE_CONFIG) - .setResult(EndBlocks.TERMINITE.anvilBlock) - .setBase(EndBlocks.THALLASIUM.anvilBlock) - .setAddition(EndBlocks.TERMINITE.block) - .build(); + .checkConfig(Configs.RECIPE_CONFIG) + .setResult(EndBlocks.TERMINITE.anvilBlock) + .setBase(EndBlocks.THALLASIUM.anvilBlock) + .setAddition(EndBlocks.TERMINITE.block) + .build(); SmithingTableRecipe.create(BetterEnd.MOD_ID, "terminite_anvil_updrade") - .checkConfig(Configs.RECIPE_CONFIG) - .setResult(EndBlocks.AETERNIUM_ANVIL) - .setBase(EndBlocks.TERMINITE.anvilBlock) - .setAddition(EndItems.AETERNIUM_INGOT) - .build(); + .checkConfig(Configs.RECIPE_CONFIG) + .setResult(EndBlocks.AETERNIUM_ANVIL) + .setBase(EndBlocks.TERMINITE.anvilBlock) + .setAddition(EndItems.AETERNIUM_INGOT) + .build(); SmithingTableRecipe.create(BetterEnd.MOD_ID, "armored_elytra") - .checkConfig(Configs.RECIPE_CONFIG) - .setResult(EndItems.ARMORED_ELYTRA) - .setBase(Items.ELYTRA) - .setAddition(EndItems.AETERNIUM_INGOT) - .build(); + .checkConfig(Configs.RECIPE_CONFIG) + .setResult(EndItems.ARMORED_ELYTRA) + .setBase(Items.ELYTRA) + .setAddition(EndItems.AETERNIUM_INGOT) + .build(); } } diff --git a/src/main/java/ru/betterend/recipe/builders/AlloyingRecipe.java b/src/main/java/ru/betterend/recipe/builders/AlloyingRecipe.java index 0f962887..13c325d9 100644 --- a/src/main/java/ru/betterend/recipe/builders/AlloyingRecipe.java +++ b/src/main/java/ru/betterend/recipe/builders/AlloyingRecipe.java @@ -2,7 +2,6 @@ package ru.betterend.recipe.builders; import com.google.gson.JsonArray; import com.google.gson.JsonObject; - import me.shedaniel.rei.api.common.category.CategoryIdentifier; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; @@ -29,12 +28,12 @@ import ru.betterend.util.ItemUtil; import ru.betterend.util.RecipeHelper; public class AlloyingRecipe implements Recipe, BetterEndRecipe { - + public final static String GROUP = "alloying"; public final static RecipeType TYPE = BCLRecipeManager.registerType(BetterEnd.MOD_ID, GROUP); public final static Serializer SERIALIZER = BCLRecipeManager.registerSerializer(BetterEnd.MOD_ID, GROUP, new Serializer()); public final static CategoryIdentifier ID = CategoryIdentifier.of(BetterEnd.MOD_ID, GROUP); - + protected final RecipeType type; protected final ResourceLocation id; protected final Ingredient primaryInput; @@ -43,7 +42,7 @@ public class AlloyingRecipe implements Recipe, BetterEndRecipe { protected final String group; protected final float experience; protected final int smeltTime; - + public AlloyingRecipe(ResourceLocation id, String group, Ingredient primaryInput, Ingredient secondaryInput, ItemStack output, float experience, int smeltTime) { this.group = group; this.id = id; @@ -54,11 +53,11 @@ public class AlloyingRecipe implements Recipe, BetterEndRecipe { this.smeltTime = smeltTime; this.type = TYPE; } - + public float getExperience() { return this.experience; } - + public int getSmeltTime() { return this.smeltTime; } @@ -68,14 +67,14 @@ public class AlloyingRecipe implements Recipe, BetterEndRecipe { NonNullList defaultedList = NonNullList.create(); defaultedList.add(primaryInput); defaultedList.add(secondaryInput); - + return defaultedList; } @Override public boolean matches(Container inv, Level world) { return this.primaryInput.test(inv.getItem(0)) && this.secondaryInput.test(inv.getItem(1)) || - this.primaryInput.test(inv.getItem(1)) && this.secondaryInput.test(inv.getItem(0)); + this.primaryInput.test(inv.getItem(1)) && this.secondaryInput.test(inv.getItem(0)); } @Override @@ -107,22 +106,22 @@ public class AlloyingRecipe implements Recipe, BetterEndRecipe { public RecipeType getType() { return this.type; } - + @Override @Environment(EnvType.CLIENT) public String getGroup() { return this.group; } - + @Environment(EnvType.CLIENT) public ItemStack getToastSymbol() { return new ItemStack(EndBlocks.END_STONE_SMELTER); } - + public static class Builder { private final static Builder INSTANCE = new Builder(); private static boolean exist; - + public static Builder create(ResourceLocation id) { INSTANCE.id = id; INSTANCE.group = String.format("%s_%s", GROUP, id); @@ -132,14 +131,14 @@ public class AlloyingRecipe implements Recipe, BetterEndRecipe { INSTANCE.experience = 0.0F; INSTANCE.smeltTime = 350; exist = Configs.RECIPE_CONFIG.getBoolean("alloying", id.getPath(), true); - + return INSTANCE; } - + public static Builder create(String id) { return create(BetterEnd.makeID(id)); } - + private ResourceLocation id; private Ingredient primaryInput; private Ingredient secondaryInput; @@ -148,14 +147,15 @@ public class AlloyingRecipe implements Recipe, BetterEndRecipe { private float experience; private int smeltTime; private boolean alright = true; - - private Builder() {} - + + private Builder() { + } + public Builder setGroup(String group) { this.group = group; return this; } - + public Builder setPrimaryInput(ItemLike... inputs) { for (ItemLike item : inputs) { this.alright &= RecipeHelper.exists(item); @@ -163,7 +163,7 @@ public class AlloyingRecipe implements Recipe, BetterEndRecipe { this.primaryInput = Ingredient.of(inputs); return this; } - + public Builder setSecondaryInput(ItemLike... inputs) { for (ItemLike item : inputs) { this.alright &= RecipeHelper.exists(item); @@ -171,56 +171,56 @@ public class AlloyingRecipe implements Recipe, BetterEndRecipe { this.secondaryInput = Ingredient.of(inputs); return this; } - + public Builder setPrimaryInput(Tag input) { this.primaryInput = Ingredient.of(input); return this; } - + public Builder setSecondaryInput(Tag input) { this.secondaryInput = Ingredient.of(input); return this; } - + public Builder setInput(ItemLike primaryInput, ItemLike secondaryInput) { this.setPrimaryInput(primaryInput); this.setSecondaryInput(secondaryInput); return this; } - + public Builder setInput(Tag primaryInput, Tag secondaryInput) { this.setPrimaryInput(primaryInput); this.setSecondaryInput(secondaryInput); return this; } - + public Builder setOutput(ItemLike output, int amount) { this.alright &= RecipeHelper.exists(output); this.output = new ItemStack(output, amount); return this; } - + public Builder setExpiriense(float amount) { this.experience = amount; return this; } - + public Builder setSmeltTime(int time) { this.smeltTime = time; return this; } - + public void build() { if (exist) { if (primaryInput == null) { BetterEnd.LOGGER.warning("Primary input for Alloying recipe can't be 'null', recipe {} will be ignored!", id); return; } - if(secondaryInput == null) { + if (secondaryInput == null) { BetterEnd.LOGGER.warning("Secondary input for Alloying can't be 'null', recipe {} will be ignored!", id); return; } - if(output == null) { + if (output == null) { BetterEnd.LOGGER.warning("Output for Alloying can't be 'null', recipe {} will be ignored!", id); return; } @@ -236,7 +236,7 @@ public class AlloyingRecipe implements Recipe, BetterEndRecipe { } } } - + public static class Serializer implements RecipeSerializer { @Override public AlloyingRecipe fromJson(ResourceLocation id, JsonObject json) { @@ -251,7 +251,7 @@ public class AlloyingRecipe implements Recipe, BetterEndRecipe { } float experience = GsonHelper.getAsFloat(json, "experience", 0.0F); int smeltTime = GsonHelper.getAsInt(json, "smelttime", 350); - + return new AlloyingRecipe(id, group, primaryInput, secondaryInput, output, experience, smeltTime); } @@ -263,7 +263,7 @@ public class AlloyingRecipe implements Recipe, BetterEndRecipe { ItemStack output = packetBuffer.readItem(); float experience = packetBuffer.readFloat(); int smeltTime = packetBuffer.readVarInt(); - + return new AlloyingRecipe(id, group, primary, secondary, output, experience, smeltTime); } diff --git a/src/main/java/ru/betterend/recipe/builders/AnvilRecipe.java b/src/main/java/ru/betterend/recipe/builders/AnvilRecipe.java index 887e5d6a..a401408b 100644 --- a/src/main/java/ru/betterend/recipe/builders/AnvilRecipe.java +++ b/src/main/java/ru/betterend/recipe/builders/AnvilRecipe.java @@ -1,9 +1,6 @@ package ru.betterend.recipe.builders; -import java.util.Objects; - import com.google.gson.JsonObject; - import com.mojang.brigadier.exceptions.CommandSyntaxException; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; @@ -31,17 +28,18 @@ import ru.bclib.recipes.BCLRecipeManager; import ru.betterend.BetterEnd; import ru.betterend.config.Configs; import ru.betterend.interfaces.BetterEndRecipe; -import ru.betterend.registry.EndTags; import ru.betterend.util.ItemUtil; import ru.betterend.util.RecipeHelper; +import java.util.Objects; + public class AnvilRecipe implements Recipe, BetterEndRecipe { - + public final static String GROUP = "smithing"; public final static RecipeType TYPE = BCLRecipeManager.registerType(BetterEnd.MOD_ID, GROUP); public final static Serializer SERIALIZER = BCLRecipeManager.registerSerializer(BetterEnd.MOD_ID, GROUP, new Serializer()); public final static ResourceLocation ID = BetterEnd.makeID(GROUP); - + private final ResourceLocation id; private final Ingredient input; private final ItemStack output; @@ -49,7 +47,7 @@ public class AnvilRecipe implements Recipe, BetterEndRecipe { private final int toolLevel; private final int anvilLevel; private final int inputCount; - + public AnvilRecipe(ResourceLocation identifier, Ingredient input, ItemStack output, int inputCount, int toolLevel, int anvilLevel, int damage) { this.id = identifier; this.input = input; @@ -69,17 +67,17 @@ public class AnvilRecipe implements Recipe, BetterEndRecipe { public ItemStack getResultItem() { return this.output; } - + @Override public boolean matches(Container craftingInventory, Level world) { return this.matches(craftingInventory); } - + @Override public ItemStack assemble(Container craftingInventory) { return this.output.copy(); } - + public ItemStack craft(Container craftingInventory, Player player) { if (!player.isCreative()) { if (!checkHammerDurability(craftingInventory, player)) return ItemStack.EMPTY; @@ -96,7 +94,7 @@ public class AnvilRecipe implements Recipe, BetterEndRecipe { int damage = hammer.getDamageValue() + this.damage; return damage < hammer.getMaxDamage(); } - + public boolean matches(Container craftingInventory) { ItemStack hammer = craftingInventory.getItem(1); if (hammer.isEmpty() || !TagAPI.HAMMERS.contains(hammer.getItem())) { @@ -106,10 +104,10 @@ public class AnvilRecipe implements Recipe, BetterEndRecipe { int materialCount = material.getCount(); int level = ((TieredItem) hammer.getItem()).getTier().getLevel(); return this.input.test(craftingInventory.getItem(0)) && - materialCount >= this.inputCount && - level >= this.toolLevel; + materialCount >= this.inputCount && + level >= this.toolLevel; } - + public int getDamage() { return this.damage; } @@ -128,7 +126,7 @@ public class AnvilRecipe implements Recipe, BetterEndRecipe { defaultedList.add(Ingredient.of(TagAPI.HAMMERS.getValues().stream().filter(hammer -> ((TieredItem) hammer).getTier().getLevel() >= toolLevel).map(ItemStack::new))); defaultedList.add(input); - + return defaultedList; } @@ -147,7 +145,7 @@ public class AnvilRecipe implements Recipe, BetterEndRecipe { public RecipeType getType() { return TYPE; } - + @Override public boolean isSpecial() { return true; @@ -173,11 +171,11 @@ public class AnvilRecipe implements Recipe, BetterEndRecipe { public static class Builder { private final static Builder INSTANCE = new Builder(); - + public static Builder create(String id) { return create(BetterEnd.makeID(id)); } - + public static Builder create(ResourceLocation id) { INSTANCE.id = id; INSTANCE.input = null; @@ -187,10 +185,10 @@ public class AnvilRecipe implements Recipe, BetterEndRecipe { INSTANCE.anvilLevel = 1; INSTANCE.damage = 1; INSTANCE.alright = true; - + return INSTANCE; } - + private ResourceLocation id; private Ingredient input; private ItemStack output; @@ -199,20 +197,21 @@ public class AnvilRecipe implements Recipe, BetterEndRecipe { private int anvilLevel = 1; private int damage = 1; private boolean alright; - - private Builder() {} - + + private Builder() { + } + public Builder setInput(ItemLike... inputItems) { this.alright &= RecipeHelper.exists(inputItems); this.setInput(Ingredient.of(inputItems)); return this; } - + public Builder setInput(Tag inputTag) { this.setInput(Ingredient.of(inputTag)); return this; } - + public Builder setInput(Ingredient ingredient) { this.input = ingredient; return this; @@ -222,17 +221,17 @@ public class AnvilRecipe implements Recipe, BetterEndRecipe { this.inputCount = count; return this; } - + public Builder setOutput(ItemLike output) { return this.setOutput(output, 1); } - + public Builder setOutput(ItemLike output, int amount) { this.alright &= RecipeHelper.exists(output); this.output = new ItemStack(output, amount); return this; } - + public Builder setToolLevel(int level) { this.toolLevel = level; return this; @@ -242,19 +241,19 @@ public class AnvilRecipe implements Recipe, BetterEndRecipe { this.anvilLevel = level; return this; } - + public Builder setDamage(int damage) { this.damage = damage; return this; } - + public void build() { if (Configs.RECIPE_CONFIG.getBoolean("anvil", id.getPath(), true)) { if (input == null) { BetterEnd.LOGGER.warning("Input for Anvil recipe can't be 'null', recipe {} will be ignored!", id); return; } - if(output == null) { + if (output == null) { BetterEnd.LOGGER.warning("Output for Anvil recipe can't be 'null', recipe {} will be ignored!", id); return; } @@ -285,7 +284,8 @@ public class AnvilRecipe implements Recipe, BetterEndRecipe { String nbtData = GsonHelper.getAsString(result, "nbt"); CompoundTag nbt = TagParser.parseTag(nbtData); output.setTag(nbt); - } catch (CommandSyntaxException ex) { + } + catch (CommandSyntaxException ex) { BetterEnd.LOGGER.warning("Error parse nbt data for output.", ex); } } @@ -293,7 +293,7 @@ public class AnvilRecipe implements Recipe, BetterEndRecipe { int toolLevel = GsonHelper.getAsInt(json, "toolLevel", 1); int anvilLevel = GsonHelper.getAsInt(json, "anvilLevel", 1); int damage = GsonHelper.getAsInt(json, "damage", 1); - + return new AnvilRecipe(id, input, output, inputCount, toolLevel, anvilLevel, damage); } @@ -305,7 +305,7 @@ public class AnvilRecipe implements Recipe, BetterEndRecipe { int toolLevel = packetBuffer.readVarInt(); int anvilLevel = packetBuffer.readVarInt(); int damage = packetBuffer.readVarInt(); - + return new AnvilRecipe(id, input, output, inputCount, toolLevel, anvilLevel, damage); } diff --git a/src/main/java/ru/betterend/recipe/builders/InfusionRecipe.java b/src/main/java/ru/betterend/recipe/builders/InfusionRecipe.java index fb798265..dfb58867 100644 --- a/src/main/java/ru/betterend/recipe/builders/InfusionRecipe.java +++ b/src/main/java/ru/betterend/recipe/builders/InfusionRecipe.java @@ -1,9 +1,6 @@ package ru.betterend.recipe.builders; -import java.util.Arrays; - import com.google.gson.JsonObject; - import com.mojang.brigadier.exceptions.CommandSyntaxException; import me.shedaniel.rei.api.common.category.CategoryIdentifier; import net.fabricmc.api.EnvType; @@ -28,24 +25,26 @@ import ru.betterend.interfaces.BetterEndRecipe; import ru.betterend.rituals.InfusionRitual; import ru.betterend.util.ItemUtil; +import java.util.Arrays; + public class InfusionRecipe implements Recipe, BetterEndRecipe { - + public final static String GROUP = "infusion"; public final static RecipeType TYPE = BCLRecipeManager.registerType(BetterEnd.MOD_ID, GROUP); public final static Serializer SERIALIZER = BCLRecipeManager.registerSerializer(BetterEnd.MOD_ID, GROUP, new Serializer()); public final static CategoryIdentifier ID = CategoryIdentifier.of(BetterEnd.MOD_ID, GROUP); - + private final ResourceLocation id; private final Ingredient[] catalysts; private Ingredient input; private ItemStack output; private int time = 1; private String group; - + private InfusionRecipe(ResourceLocation id) { this(id, null, null); } - + private InfusionRecipe(ResourceLocation id, Ingredient input, ItemStack output) { this.id = id; this.input = input; @@ -53,7 +52,7 @@ public class InfusionRecipe implements Recipe, BetterEndRecipe { this.catalysts = new Ingredient[8]; Arrays.fill(catalysts, Ingredient.EMPTY); } - + public int getInfusionTime() { return this.time; } @@ -77,7 +76,7 @@ public class InfusionRecipe implements Recipe, BetterEndRecipe { public boolean canCraftInDimensions(int width, int height) { return true; } - + @Override public NonNullList getIngredients() { NonNullList defaultedList = NonNullList.create(); @@ -95,7 +94,7 @@ public class InfusionRecipe implements Recipe, BetterEndRecipe { public ResourceLocation getId() { return this.id; } - + @Override @Environment(EnvType.CLIENT) public String getGroup() { @@ -111,24 +110,24 @@ public class InfusionRecipe implements Recipe, BetterEndRecipe { public RecipeType getType() { return TYPE; } - + public static class Builder { private final static Builder INSTANCE = new Builder(); private static boolean exist; - + public static Builder create(String id) { return create(BetterEnd.makeID(id)); } - + public static Builder create(ResourceLocation id) { INSTANCE.id = id; INSTANCE.input = null; INSTANCE.output = null; INSTANCE.time = 1; exist = Configs.RECIPE_CONFIG.getBoolean("infusion", id.getPath(), true); - + Arrays.fill(INSTANCE.catalysts, Ingredient.EMPTY); - + return INSTANCE; } @@ -138,44 +137,44 @@ public class InfusionRecipe implements Recipe, BetterEndRecipe { private ItemStack output; private String group; private int time = 1; - + private Builder() { Arrays.fill(catalysts, Ingredient.EMPTY); } - + public Builder setGroup(String group) { this.group = group; return this; } - + public Builder setInput(ItemLike input) { this.input = Ingredient.of(input); return this; } - + public Builder setOutput(ItemLike output) { this.output = new ItemStack(output); this.output.setCount(1); return this; } - + public Builder setOutput(ItemStack output) { this.output = output; this.output.setCount(1); return this; } - + public Builder setTime(int time) { this.time = time; return this; } - + public Builder addCatalyst(int slot, ItemLike... items) { if (slot > 7) return this; this.catalysts[slot] = Ingredient.of(items); return this; } - + public void build() { if (exist) { if (input == null) { @@ -202,7 +201,7 @@ public class InfusionRecipe implements Recipe, BetterEndRecipe { } } } - + public static class Serializer implements RecipeSerializer { @Override public InfusionRecipe fromJson(ResourceLocation id, JsonObject json) { @@ -218,13 +217,14 @@ public class InfusionRecipe implements Recipe, BetterEndRecipe { String nbtData = GsonHelper.getAsString(result, "nbt"); CompoundTag nbt = TagParser.parseTag(nbtData); recipe.output.setTag(nbt); - } catch (CommandSyntaxException ex) { + } + catch (CommandSyntaxException ex) { BetterEnd.LOGGER.warning("Error parse nbt data for output.", ex); } } recipe.group = GsonHelper.getAsString(json, "group", GROUP); recipe.time = GsonHelper.getAsInt(json, "time", 1); - + JsonObject catalysts = GsonHelper.getAsJsonObject(json, "catalysts"); ItemStack catalyst = ItemUtil.fromStackString(GsonHelper.getAsString(catalysts, "north", "")); recipe.catalysts[0] = (catalyst != null && !catalyst.isEmpty()) ? Ingredient.of(catalyst.getItem()) : Ingredient.EMPTY; @@ -242,7 +242,7 @@ public class InfusionRecipe implements Recipe, BetterEndRecipe { recipe.catalysts[6] = (catalyst != null && !catalyst.isEmpty()) ? Ingredient.of(catalyst.getItem()) : Ingredient.EMPTY; catalyst = ItemUtil.fromStackString(GsonHelper.getAsString(catalysts, "north_west", "")); recipe.catalysts[7] = (catalyst != null && !catalyst.isEmpty()) ? Ingredient.of(catalyst.getItem()) : Ingredient.EMPTY; - + return recipe; } diff --git a/src/main/java/ru/betterend/registry/EndBiomes.java b/src/main/java/ru/betterend/registry/EndBiomes.java index 7dd8ee5f..69c9abae 100644 --- a/src/main/java/ru/betterend/registry/EndBiomes.java +++ b/src/main/java/ru/betterend/registry/EndBiomes.java @@ -1,17 +1,10 @@ package ru.betterend.registry; -import java.io.InputStream; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.Set; - import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Sets; import com.google.gson.JsonElement; import com.google.gson.JsonObject; - import net.fabricmc.fabric.impl.biome.InternalBiomeData; import net.fabricmc.fabric.impl.biome.WeightedBiomePicker; import net.minecraft.core.Registry; @@ -60,26 +53,32 @@ import ru.betterend.world.biome.land.UmbrellaJungleBiome; import ru.betterend.world.generator.BiomeType; import ru.betterend.world.generator.GeneratorOptions; +import java.io.InputStream; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Set; + public class EndBiomes { public static final Set FABRIC_VOID = Sets.newHashSet(); private static final Set SUBBIOMES_UNMUTABLES = Sets.newHashSet(); - + public static final BiomePicker LAND_BIOMES = new BiomePicker(); public static final BiomePicker VOID_BIOMES = new BiomePicker(); public static final BiomePicker CAVE_BIOMES = new BiomePicker(); public static final List SUBBIOMES = Lists.newArrayList(); private static final JsonObject EMPTY_JSON = new JsonObject(); private static BiomeMap caveBiomeMap; - + // Vanilla Land public static final EndBiome END = registerBiome(Biomes.THE_END, BiomeType.LAND, 1F); public static final EndBiome END_MIDLANDS = registerSubBiome(Biomes.END_MIDLANDS, END, 0.5F); public static final EndBiome END_HIGHLANDS = registerSubBiome(Biomes.END_HIGHLANDS, END, 0.5F); - + // Vanilla Void public static final EndBiome END_BARRENS = registerBiome(Biomes.END_BARRENS, BiomeType.VOID, 1F); public static final EndBiome SMALL_END_ISLANDS = registerBiome(Biomes.SMALL_END_ISLANDS, BiomeType.VOID, 1); - + // Better End Land public static final EndBiome FOGGY_MUSHROOMLAND = registerBiome(new FoggyMushroomlandBiome(), BiomeType.LAND); public static final EndBiome CHORUS_FOREST = registerBiome(new ChorusForestBiome(), BiomeType.LAND); @@ -98,10 +97,10 @@ public class EndBiomes { public static final EndBiome DRY_SHRUBLAND = registerBiome(new DryShrublandBiome(), BiomeType.LAND); public static final EndBiome LANTERN_WOODS = registerBiome(new LanternWoodsBiome(), BiomeType.LAND); public static final EndBiome NEON_OASIS = registerSubBiome(new NeonOasisBiome(), DUST_WASTELANDS); - + // Better End Void public static final EndBiome ICE_STARFIELD = registerBiome(new BiomeIceStarfield(), BiomeType.VOID); - + // Better End Caves public static final EndCaveBiome EMPTY_END_CAVE = registerCaveBiome(new EmptyEndCaveBiome()); public static final EndCaveBiome EMPTY_SMARAGDANT_CAVE = registerCaveBiome(new EmptySmaragdantCaveBiome()); @@ -109,28 +108,28 @@ public class EndBiomes { public static final EndCaveBiome EMPTY_AURORA_CAVE = registerCaveBiome(new EmptyAuroraCaveBiome()); public static final EndCaveBiome LUSH_AURORA_CAVE = registerCaveBiome(new LushAuroraCaveBiome()); public static final EndCaveBiome JADE_CAVE = registerCaveBiome(new JadeCaveBiome()); - + public static void register() { CAVE_BIOMES.rebuild(); } - + public static void onWorldLoad(long seed) { if (caveBiomeMap == null || caveBiomeMap.getSeed() != seed) { caveBiomeMap = new BiomeMap(seed, GeneratorOptions.getBiomeSizeCaves(), CAVE_BIOMES); } } - + public static void mutateRegistry(Registry biomeRegistry) { LAND_BIOMES.clearMutables(); VOID_BIOMES.clearMutables(); CAVE_BIOMES.clearMutables(); - + if (FABRIC_VOID.isEmpty()) { loadFabricAPIBiomes(); } - + Map configs = Maps.newHashMap(); - + biomeRegistry.forEach((biome) -> { if (biome.getBiomeCategory() == BiomeCategory.THEEND) { ResourceLocation id = biomeRegistry.getKey(biome); @@ -171,30 +170,30 @@ public class EndBiomes { } }); Configs.BIOME_CONFIG.saveChanges(); - + rebuildPicker(LAND_BIOMES, biomeRegistry); rebuildPicker(VOID_BIOMES, biomeRegistry); rebuildPicker(CAVE_BIOMES, biomeRegistry); - + SUBBIOMES.forEach((endBiome) -> { endBiome.updateActualBiomes(biomeRegistry); }); } - + private static void rebuildPicker(BiomePicker picker, Registry biomeRegistry) { picker.rebuild(); picker.getBiomes().forEach((endBiome) -> { endBiome.updateActualBiomes(biomeRegistry); }); } - + private static void loadFabricAPIBiomes() { List> biomes = Lists.newArrayList(); biomes.addAll(getBiomes(InternalBiomeData.getEndBiomesMap().get(Biomes.SMALL_END_ISLANDS))); biomes.addAll(getBiomes(InternalBiomeData.getEndBarrensMap().get(Biomes.END_BARRENS))); biomes.forEach((key) -> FABRIC_VOID.add(key.location())); FABRIC_VOID.removeIf(id -> id.getNamespace().equals("endplus")); - + if (BCLib.isDevEnvironment()) { System.out.println("=================================="); System.out.println("Added void biomes from Fabric API:"); @@ -204,12 +203,12 @@ public class EndBiomes { System.out.println("=================================="); } } - + private static List> getBiomes(WeightedBiomePicker picker) { IBiomeList biomeList = (IBiomeList) (Object) picker; return biomeList == null ? Collections.emptyList() : biomeList.getBiomes(); } - + private static JsonObject loadJsonConfig(String namespace) { InputStream inputstream = EndBiomes.class.getResourceAsStream("/data/" + namespace + "/end_biome_properties.json"); if (inputstream != null) { @@ -219,24 +218,26 @@ public class EndBiomes { return EMPTY_JSON; } } - + /** * Registers new {@link EndBiome} and adds it to picker, can be used to add existing mod biomes into the End. - * @param biome - {@link Biome} instance - * @param type - {@link BiomeType} + * + * @param biome - {@link Biome} instance + * @param type - {@link BiomeType} * @param genChance - generation chance [0.0F - Infinity] * @return registered {@link EndBiome} */ public static EndBiome registerBiome(Biome biome, BiomeType type, float genChance) { return registerBiome(biome, type, 1, genChance); } - + /** * Registers new {@link EndBiome} and adds it to picker, can be used to add existing mod biomes into the End. - * @param biome - {@link Biome} instance - * @param type - {@link BiomeType} + * + * @param biome - {@link Biome} instance + * @param type - {@link BiomeType} * @param fogDensity - density of fog (def: 1F) [0.0F - Infinity] - * @param genChance - generation chance [0.0F - Infinity] + * @param genChance - generation chance [0.0F - Infinity] * @return registered {@link EndBiome} */ public static EndBiome registerBiome(Biome biome, BiomeType type, float fogDensity, float genChance) { @@ -246,24 +247,26 @@ public class EndBiomes { } return endBiome; } - + /** * Registers new {@link EndBiome} from existed {@link Biome} and put as a sub-biome into selected parent. - * @param biome - {@link Biome} instance - * @param parent - {@link EndBiome} to be linked with + * + * @param biome - {@link Biome} instance + * @param parent - {@link EndBiome} to be linked with * @param genChance - generation chance [0.0F - Infinity] * @return registered {@link EndBiome} */ public static EndBiome registerSubBiome(Biome biome, EndBiome parent, float genChance, boolean hasCaves) { return registerSubBiome(biome, parent, 1, genChance, hasCaves); } - + /** * Registers new {@link EndBiome} from existed {@link Biome} and put as a sub-biome into selected parent. - * @param biome - {@link Biome} instance - * @param parent - {@link EndBiome} to be linked with + * + * @param biome - {@link Biome} instance + * @param parent - {@link EndBiome} to be linked with * @param fogDensity - density of fog (def: 1F) [0.0F - Infinity] - * @param genChance - generation chance [0.0F - Infinity] + * @param genChance - generation chance [0.0F - Infinity] * @return registered {@link EndBiome} */ public static EndBiome registerSubBiome(Biome biome, EndBiome parent, float fogDensity, float genChance, boolean hasCaves) { @@ -277,10 +280,11 @@ public class EndBiomes { } return endBiome; } - + /** * Put existing {@link EndBiome} as a sub-biome into selected parent. - * @param biome - {@link EndBiome} instance + * + * @param biome - {@link EndBiome} instance * @param parent - {@link EndBiome} to be linked with * @return registered {@link EndBiome} */ @@ -294,11 +298,12 @@ public class EndBiomes { } return biome; } - + /** * Registers {@link EndBiome} and adds it into worldgen. + * * @param biome - {@link EndBiome} instance - * @param type - {@link BiomeType} + * @param type - {@link BiomeType} * @return registered {@link EndBiome} */ public static EndBiome registerBiome(EndBiome biome, BiomeType type) { @@ -314,9 +319,10 @@ public class EndBiomes { } return biome; } - + /** * Put integration sub-biome {@link EndBiome} into subbiomes list and registers it. + * * @param biome - {@link EndBiome} instance * @return registered {@link EndBiome} */ @@ -329,10 +335,11 @@ public class EndBiomes { } return biome; } - + /** * Link integration sub-biome with parent. - * @param biome - {@link EndBiome} instance + * + * @param biome - {@link EndBiome} instance * @param parent - {@link ResourceLocation} parent id */ public static void addSubBiomeIntegration(EndBiome biome, ResourceLocation parent) { @@ -343,15 +350,15 @@ public class EndBiomes { } } } - + public static EndBiome registerBiome(ResourceKey key, BiomeType type, float genChance) { return registerBiome(BuiltinRegistries.BIOME.get(key), type, genChance); } - + public static EndBiome registerSubBiome(ResourceKey key, EndBiome parent, float genChance) { return registerSubBiome(BuiltinRegistries.BIOME.get(key), parent, genChance, true); } - + private static void addToPicker(EndBiome biome, BiomeType type) { if (type == BiomeType.LAND) { LAND_BIOMES.addBiome(biome); @@ -360,7 +367,7 @@ public class EndBiomes { VOID_BIOMES.addBiome(biome); } } - + public static EndCaveBiome registerCaveBiome(EndCaveBiome biome) { if (Configs.BIOME_CONFIG.getBoolean(biome.getID(), "enabled", true)) { BiomeAPI.registerBiome(biome); @@ -368,7 +375,7 @@ public class EndBiomes { } return biome; } - + public static EndCaveBiome getCaveBiome(int x, int z) { return (EndCaveBiome) caveBiomeMap.getBiome(x, z); } diff --git a/src/main/java/ru/betterend/registry/EndBlockEntities.java b/src/main/java/ru/betterend/registry/EndBlockEntities.java index 7157ebc0..13e90bdf 100644 --- a/src/main/java/ru/betterend/registry/EndBlockEntities.java +++ b/src/main/java/ru/betterend/registry/EndBlockEntities.java @@ -31,9 +31,10 @@ public class EndBlockEntities { //return Registry.register(Registry.BLOCK_ENTITY_TYPE, BetterEnd.makeID(id), builder.build(null)); } - - public static void register() {} - + + public static void register() { + } + static Block[] getPedestals() { return EndBlocks.getModBlocks().stream() .filter(block -> block instanceof PedestalBlock && !((PedestalBlock) block).hasUniqueEntity()) diff --git a/src/main/java/ru/betterend/registry/EndBlocks.java b/src/main/java/ru/betterend/registry/EndBlocks.java index 246e9ba9..fa034b22 100644 --- a/src/main/java/ru/betterend/registry/EndBlocks.java +++ b/src/main/java/ru/betterend/registry/EndBlocks.java @@ -1,10 +1,5 @@ package ru.betterend.registry; -import java.util.List; -import java.util.stream.Collectors; - -import org.jetbrains.annotations.NotNull; - import net.fabricmc.fabric.api.item.v1.FabricItemSettings; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.BlockItem; @@ -12,6 +7,7 @@ import net.minecraft.world.item.CreativeModeTab; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.material.MaterialColor; +import org.jetbrains.annotations.NotNull; import ru.bclib.blocks.BaseBarrelBlock; import ru.bclib.blocks.BaseChestBlock; import ru.bclib.blocks.BaseCropBlock; @@ -29,7 +25,107 @@ import ru.bclib.blocks.StalactiteBlock; import ru.bclib.registry.BaseBlockEntities; import ru.bclib.registry.BlocksRegistry; import ru.betterend.BetterEnd; -import ru.betterend.blocks.*; +import ru.betterend.blocks.AeterniumAnvil; +import ru.betterend.blocks.AeterniumBlock; +import ru.betterend.blocks.AmaranitaCapBlock; +import ru.betterend.blocks.AmaranitaHymenophoreBlock; +import ru.betterend.blocks.AmaranitaStemBlock; +import ru.betterend.blocks.AmberBlock; +import ru.betterend.blocks.AncientEmeraldIceBlock; +import ru.betterend.blocks.AuroraCrystalBlock; +import ru.betterend.blocks.BlueVineBlock; +import ru.betterend.blocks.BlueVineLanternBlock; +import ru.betterend.blocks.BlueVineSeedBlock; +import ru.betterend.blocks.BoluxMushroomBlock; +import ru.betterend.blocks.BrimstoneBlock; +import ru.betterend.blocks.BubbleCoralBlock; +import ru.betterend.blocks.BulbVineBlock; +import ru.betterend.blocks.BulbVineLanternBlock; +import ru.betterend.blocks.BulbVineLanternColoredBlock; +import ru.betterend.blocks.BulbVineSeedBlock; +import ru.betterend.blocks.CavePumpkinBlock; +import ru.betterend.blocks.CavePumpkinVineBlock; +import ru.betterend.blocks.ChandelierBlock; +import ru.betterend.blocks.CharcoalBlock; +import ru.betterend.blocks.CharniaBlock; +import ru.betterend.blocks.ChorusGrassBlock; +import ru.betterend.blocks.DenseEmeraldIceBlock; +import ru.betterend.blocks.DenseSnowBlock; +import ru.betterend.blocks.DragonTreeSaplingBlock; +import ru.betterend.blocks.EmeraldIceBlock; +import ru.betterend.blocks.EndLilyBlock; +import ru.betterend.blocks.EndLilySeedBlock; +import ru.betterend.blocks.EndLotusFlowerBlock; +import ru.betterend.blocks.EndLotusLeafBlock; +import ru.betterend.blocks.EndLotusSeedBlock; +import ru.betterend.blocks.EndLotusStemBlock; +import ru.betterend.blocks.EndPortalBlock; +import ru.betterend.blocks.EndStoneSmelter; +import ru.betterend.blocks.EnderBlock; +import ru.betterend.blocks.EndstoneDustBlock; +import ru.betterend.blocks.EternalPedestal; +import ru.betterend.blocks.FilaluxBlock; +import ru.betterend.blocks.FilaluxLanternBlock; +import ru.betterend.blocks.FilaluxWingsBlock; +import ru.betterend.blocks.FlamaeaBlock; +import ru.betterend.blocks.GlowingHymenophoreBlock; +import ru.betterend.blocks.GlowingMossBlock; +import ru.betterend.blocks.GlowingPillarLuminophorBlock; +import ru.betterend.blocks.GlowingPillarRootsBlock; +import ru.betterend.blocks.GlowingPillarSeedBlock; +import ru.betterend.blocks.HelixTreeLeavesBlock; +import ru.betterend.blocks.HelixTreeSaplingBlock; +import ru.betterend.blocks.HydraluxBlock; +import ru.betterend.blocks.HydraluxPetalBlock; +import ru.betterend.blocks.HydraluxPetalColoredBlock; +import ru.betterend.blocks.HydraluxSaplingBlock; +import ru.betterend.blocks.HydrothermalVentBlock; +import ru.betterend.blocks.InfusionPedestal; +import ru.betterend.blocks.JellyshroomCapBlock; +import ru.betterend.blocks.LacugroveSaplingBlock; +import ru.betterend.blocks.LanceleafBlock; +import ru.betterend.blocks.LanceleafSeedBlock; +import ru.betterend.blocks.LargeAmaranitaBlock; +import ru.betterend.blocks.LucerniaSaplingBlock; +import ru.betterend.blocks.LumecornBlock; +import ru.betterend.blocks.LumecornSeedBlock; +import ru.betterend.blocks.MengerSpongeBlock; +import ru.betterend.blocks.MengerSpongeWetBlock; +import ru.betterend.blocks.MissingTileBlock; +import ru.betterend.blocks.MossyDragonBoneBlock; +import ru.betterend.blocks.MossyGlowshroomCapBlock; +import ru.betterend.blocks.MossyGlowshroomSaplingBlock; +import ru.betterend.blocks.MossyObsidian; +import ru.betterend.blocks.MurkweedBlock; +import ru.betterend.blocks.NeedlegrassBlock; +import ru.betterend.blocks.NeonCactusBlock; +import ru.betterend.blocks.NeonCactusPlantBlock; +import ru.betterend.blocks.PedestalVanilla; +import ru.betterend.blocks.PondAnemoneBlock; +import ru.betterend.blocks.PythadendronSaplingBlock; +import ru.betterend.blocks.RespawnObeliskBlock; +import ru.betterend.blocks.RunedFlavolite; +import ru.betterend.blocks.ShadowBerryBlock; +import ru.betterend.blocks.ShadowGrassBlock; +import ru.betterend.blocks.SilkMothHiveBlock; +import ru.betterend.blocks.SilkMothNestBlock; +import ru.betterend.blocks.SmallAmaranitaBlock; +import ru.betterend.blocks.SmallJellyshroomBlock; +import ru.betterend.blocks.SmaragdantCrystalBlock; +import ru.betterend.blocks.SmaragdantCrystalShardBlock; +import ru.betterend.blocks.SulphurCrystalBlock; +import ru.betterend.blocks.TenaneaFlowersBlock; +import ru.betterend.blocks.TenaneaSaplingBlock; +import ru.betterend.blocks.TerrainPlantBlock; +import ru.betterend.blocks.TwistedUmbrellaMossBlock; +import ru.betterend.blocks.TwistedUmbrellaMossTallBlock; +import ru.betterend.blocks.UmbrellaMossBlock; +import ru.betterend.blocks.UmbrellaMossTallBlock; +import ru.betterend.blocks.UmbrellaTreeClusterBlock; +import ru.betterend.blocks.UmbrellaTreeClusterEmptyBlock; +import ru.betterend.blocks.UmbrellaTreeMembraneBlock; +import ru.betterend.blocks.UmbrellaTreeSaplingBlock; +import ru.betterend.blocks.VentBubbleColumnBlock; import ru.betterend.blocks.basis.EndTerrainBlock; import ru.betterend.blocks.basis.EndTripleTerrain; import ru.betterend.blocks.basis.EndUnderwaterWallPlantBlock; @@ -47,6 +143,9 @@ import ru.betterend.item.material.EndArmorMaterial; import ru.betterend.item.material.EndToolMaterial; import ru.betterend.tab.CreativeTabs; +import java.util.List; +import java.util.stream.Collectors; + public class EndBlocks extends BlocksRegistry { // Terrain // public static final Block ENDSTONE_DUST = registerBlock("endstone_dust", new EndstoneDustBlock()); @@ -74,13 +173,13 @@ public class EndBlocks extends BlocksRegistry { public static final Block JUNGLE_MOSS_PATH = registerBlock("jungle_moss_path", new BasePathBlock(JUNGLE_MOSS)); public static final Block SANGNUM_PATH = registerBlock("sangnum_path", new BasePathBlock(SANGNUM)); public static final Block RUTISCUS_PATH = registerBlock("rutiscus_path", new BasePathBlock(RUTISCUS)); - + public static final Block MOSSY_OBSIDIAN = registerBlock("mossy_obsidian", new MossyObsidian()); public static final Block DRAGON_BONE_BLOCK = registerBlock("dragon_bone_block", new BaseRotatedPillarBlock(Blocks.BONE_BLOCK)); public static final Block DRAGON_BONE_STAIRS = registerBlock("dragon_bone_stairs", new BaseStairsBlock(DRAGON_BONE_BLOCK)); public static final Block DRAGON_BONE_SLAB = registerBlock("dragon_bone_slab", new BaseSlabBlock(DRAGON_BONE_BLOCK)); public static final Block MOSSY_DRAGON_BONE = registerBlock("mossy_dragon_bone", new MossyDragonBoneBlock()); - + // Rocks // public static final StoneMaterial FLAVOLITE = new StoneMaterial("flavolite", MaterialColor.SAND); public static final StoneMaterial VIOLECITE = new StoneMaterial("violecite", MaterialColor.COLOR_PURPLE); @@ -91,76 +190,76 @@ public class EndBlocks extends BlocksRegistry { public static final Block BRIMSTONE = registerBlock("brimstone", new BrimstoneBlock()); public static final Block SULPHUR_CRYSTAL = registerBlock("sulphur_crystal", new SulphurCrystalBlock()); public static final Block MISSING_TILE = registerBlock("missing_tile", new MissingTileBlock()); - + public static final Block FLAVOLITE_RUNED = registerBlock("flavolite_runed", new RunedFlavolite(false)); public static final Block FLAVOLITE_RUNED_ETERNAL = registerBlock("flavolite_runed_eternal", new RunedFlavolite(true)); - + public static final Block ANDESITE_PEDESTAL = registerBlock("andesite_pedestal", new PedestalVanilla(Blocks.ANDESITE)); public static final Block DIORITE_PEDESTAL = registerBlock("diorite_pedestal", new PedestalVanilla(Blocks.DIORITE)); public static final Block GRANITE_PEDESTAL = registerBlock("granite_pedestal", new PedestalVanilla(Blocks.GRANITE)); public static final Block QUARTZ_PEDESTAL = registerBlock("quartz_pedestal", new PedestalVanilla(Blocks.QUARTZ_BLOCK)); public static final Block PURPUR_PEDESTAL = registerBlock("purpur_pedestal", new PedestalVanilla(Blocks.PURPUR_BLOCK)); - + public static final Block HYDROTHERMAL_VENT = registerBlock("hydrothermal_vent", new HydrothermalVentBlock()); public static final Block VENT_BUBBLE_COLUMN = registerEndBlockOnly("vent_bubble_column", new VentBubbleColumnBlock()); - + public static final Block DENSE_SNOW = registerBlock("dense_snow", new DenseSnowBlock()); public static final Block EMERALD_ICE = registerBlock("emerald_ice", new EmeraldIceBlock()); public static final Block DENSE_EMERALD_ICE = registerBlock("dense_emerald_ice", new DenseEmeraldIceBlock()); public static final Block ANCIENT_EMERALD_ICE = registerBlock("ancient_emerald_ice", new AncientEmeraldIceBlock()); - + public static final Block END_STONE_STALACTITE = registerBlock("end_stone_stalactite", new StalactiteBlock(Blocks.END_STONE)); public static final Block END_STONE_STALACTITE_CAVEMOSS = registerBlock("end_stone_stalactite_cavemoss", new StalactiteBlock(CAVE_MOSS)); - + // Wooden Materials And Trees // public static final Block MOSSY_GLOWSHROOM_SAPLING = registerBlock("mossy_glowshroom_sapling", new MossyGlowshroomSaplingBlock()); public static final Block MOSSY_GLOWSHROOM_CAP = registerBlock("mossy_glowshroom_cap", new MossyGlowshroomCapBlock()); public static final Block MOSSY_GLOWSHROOM_HYMENOPHORE = registerBlock("mossy_glowshroom_hymenophore", new GlowingHymenophoreBlock()); public static final Block MOSSY_GLOWSHROOM_FUR = registerBlock("mossy_glowshroom_fur", new FurBlock(MOSSY_GLOWSHROOM_SAPLING, 15, 16, true)); public static final WoodenMaterial MOSSY_GLOWSHROOM = new WoodenMaterial("mossy_glowshroom", MaterialColor.COLOR_GRAY, MaterialColor.WOOD); - + public static final Block PYTHADENDRON_SAPLING = registerBlock("pythadendron_sapling", new PythadendronSaplingBlock()); public static final Block PYTHADENDRON_LEAVES = registerBlock("pythadendron_leaves", new BaseLeavesBlock(PYTHADENDRON_SAPLING, MaterialColor.COLOR_MAGENTA)); public static final WoodenMaterial PYTHADENDRON = new WoodenMaterial("pythadendron", MaterialColor.COLOR_MAGENTA, MaterialColor.COLOR_PURPLE); - + public static final Block END_LOTUS_SEED = registerBlock("end_lotus_seed", new EndLotusSeedBlock()); public static final Block END_LOTUS_STEM = registerBlock("end_lotus_stem", new EndLotusStemBlock()); public static final Block END_LOTUS_LEAF = registerEndBlockOnly("end_lotus_leaf", new EndLotusLeafBlock()); public static final Block END_LOTUS_FLOWER = registerEndBlockOnly("end_lotus_flower", new EndLotusFlowerBlock()); public static final WoodenMaterial END_LOTUS = new WoodenMaterial("end_lotus", MaterialColor.COLOR_LIGHT_BLUE, MaterialColor.COLOR_CYAN); - + public static final Block LACUGROVE_SAPLING = registerBlock("lacugrove_sapling", new LacugroveSaplingBlock()); public static final Block LACUGROVE_LEAVES = registerBlock("lacugrove_leaves", new BaseLeavesBlock(LACUGROVE_SAPLING, MaterialColor.COLOR_CYAN)); public static final WoodenMaterial LACUGROVE = new WoodenMaterial("lacugrove", MaterialColor.COLOR_BROWN, MaterialColor.COLOR_YELLOW); - + public static final Block DRAGON_TREE_SAPLING = registerBlock("dragon_tree_sapling", new DragonTreeSaplingBlock()); public static final Block DRAGON_TREE_LEAVES = registerBlock("dragon_tree_leaves", new BaseLeavesBlock(DRAGON_TREE_SAPLING, MaterialColor.COLOR_MAGENTA)); public static final WoodenMaterial DRAGON_TREE = new WoodenMaterial("dragon_tree", MaterialColor.COLOR_BLACK, MaterialColor.COLOR_MAGENTA); - + public static final Block TENANEA_SAPLING = registerBlock("tenanea_sapling", new TenaneaSaplingBlock()); public static final Block TENANEA_LEAVES = registerBlock("tenanea_leaves", new BaseLeavesBlock(TENANEA_SAPLING, MaterialColor.COLOR_PINK)); public static final Block TENANEA_FLOWERS = registerBlock("tenanea_flowers", new TenaneaFlowersBlock()); public static final Block TENANEA_OUTER_LEAVES = registerBlock("tenanea_outer_leaves", new FurBlock(TENANEA_SAPLING, 32)); public static final WoodenMaterial TENANEA = new WoodenMaterial("tenanea", MaterialColor.COLOR_BROWN, MaterialColor.COLOR_PINK); - + public static final Block HELIX_TREE_SAPLING = registerBlock("helix_tree_sapling", new HelixTreeSaplingBlock()); public static final Block HELIX_TREE_LEAVES = registerBlock("helix_tree_leaves", new HelixTreeLeavesBlock()); public static final WoodenMaterial HELIX_TREE = new WoodenMaterial("helix_tree", MaterialColor.COLOR_GRAY, MaterialColor.COLOR_ORANGE); - + public static final Block UMBRELLA_TREE_SAPLING = registerBlock("umbrella_tree_sapling", new UmbrellaTreeSaplingBlock()); public static final Block UMBRELLA_TREE_MEMBRANE = registerBlock("umbrella_tree_membrane", new UmbrellaTreeMembraneBlock()); public static final Block UMBRELLA_TREE_CLUSTER = registerBlock("umbrella_tree_cluster", new UmbrellaTreeClusterBlock()); public static final Block UMBRELLA_TREE_CLUSTER_EMPTY = registerBlock("umbrella_tree_cluster_empty", new UmbrellaTreeClusterEmptyBlock()); public static final WoodenMaterial UMBRELLA_TREE = new WoodenMaterial("umbrella_tree", MaterialColor.COLOR_BLUE, MaterialColor.COLOR_GREEN); - + public static final Block JELLYSHROOM_CAP_PURPLE = registerBlock("jellyshroom_cap_purple", new JellyshroomCapBlock(217, 142, 255, 164, 0, 255)); public static final WoodenMaterial JELLYSHROOM = new WoodenMaterial("jellyshroom", MaterialColor.COLOR_PURPLE, MaterialColor.COLOR_LIGHT_BLUE); - + public static final Block LUCERNIA_SAPLING = registerBlock("lucernia_sapling", new LucerniaSaplingBlock()); public static final Block LUCERNIA_LEAVES = registerBlock("lucernia_leaves", new BaseLeavesBlock(LUCERNIA_SAPLING, MaterialColor.COLOR_ORANGE)); public static final Block LUCERNIA_OUTER_LEAVES = registerBlock("lucernia_outer_leaves", new FurBlock(LUCERNIA_SAPLING, 32)); public static final WoodenMaterial LUCERNIA = new WoodenMaterial("lucernia", MaterialColor.COLOR_ORANGE, MaterialColor.COLOR_ORANGE); - + // Small Plants // public static final Block UMBRELLA_MOSS = registerBlock("umbrella_moss", new UmbrellaMossBlock()); public static final Block UMBRELLA_MOSS_TALL = registerBlock("umbrella_moss_tall", new UmbrellaMossTallBlock()); @@ -184,26 +283,26 @@ public class EndBlocks extends BlocksRegistry { public static final Block AERIDIUM = registerBlock("aeridium", new TerrainPlantBlock(RUTISCUS)); public static final Block LUTEBUS = registerBlock("lutebus", new TerrainPlantBlock(RUTISCUS)); public static final Block LAMELLARIUM = registerBlock("lamellarium", new TerrainPlantBlock(RUTISCUS)); - + public static final Block BLUE_VINE_SEED = registerBlock("blue_vine_seed", new BlueVineSeedBlock()); public static final Block BLUE_VINE = registerEndBlockOnly("blue_vine", new BlueVineBlock()); public static final Block BLUE_VINE_LANTERN = registerBlock("blue_vine_lantern", new BlueVineLanternBlock()); public static final Block BLUE_VINE_FUR = registerBlock("blue_vine_fur", new FurBlock(BLUE_VINE_SEED, 15, 3, false)); - + public static final Block LANCELEAF_SEED = registerBlock("lanceleaf_seed", new LanceleafSeedBlock()); public static final Block LANCELEAF = registerEndBlockOnly("lanceleaf", new LanceleafBlock()); - + public static final Block GLOWING_PILLAR_SEED = registerBlock("glowing_pillar_seed", new GlowingPillarSeedBlock()); public static final Block GLOWING_PILLAR_ROOTS = registerEndBlockOnly("glowing_pillar_roots", new GlowingPillarRootsBlock()); public static final Block GLOWING_PILLAR_LUMINOPHOR = registerBlock("glowing_pillar_luminophor", new GlowingPillarLuminophorBlock()); public static final Block GLOWING_PILLAR_LEAVES = registerBlock("glowing_pillar_leaves", new FurBlock(GLOWING_PILLAR_SEED, 15, 3, false)); - + public static final Block SMALL_JELLYSHROOM = registerBlock("small_jellyshroom", new SmallJellyshroomBlock()); public static final Block BOLUX_MUSHROOM = registerBlock("bolux_mushroom", new BoluxMushroomBlock()); - + public static final Block LUMECORN_SEED = registerBlock("lumecorn_seed", new LumecornSeedBlock()); public static final Block LUMECORN = registerEndBlockOnly("lumecorn", new LumecornBlock()); - + public static final Block SMALL_AMARANITA_MUSHROOM = registerBlock("small_amaranita_mushroom", new SmallAmaranitaBlock()); public static final Block LARGE_AMARANITA_MUSHROOM = registerEndBlockOnly("large_amaranita_mushroom", new LargeAmaranitaBlock()); public static final Block AMARANITA_STEM = registerBlock("amaranita_stem", new AmaranitaStemBlock()); @@ -212,12 +311,12 @@ public class EndBlocks extends BlocksRegistry { public static final Block AMARANITA_LANTERN = registerBlock("amaranita_lantern", new GlowingHymenophoreBlock()); public static final Block AMARANITA_FUR = registerBlock("amaranita_fur", new FurBlock(SMALL_AMARANITA_MUSHROOM, 15, 4, true)); public static final Block AMARANITA_CAP = registerBlock("amaranita_cap", new AmaranitaCapBlock()); - + public static final Block NEON_CACTUS = registerBlock("neon_cactus", new NeonCactusPlantBlock()); public static final Block NEON_CACTUS_BLOCK = registerBlock("neon_cactus_block", new NeonCactusBlock()); public static final Block NEON_CACTUS_BLOCK_STAIRS = registerBlock("neon_cactus_stairs", new BaseStairsBlock(NEON_CACTUS_BLOCK)); public static final Block NEON_CACTUS_BLOCK_SLAB = registerBlock("neon_cactus_slab", new BaseSlabBlock(NEON_CACTUS_BLOCK)); - + // Crops public static final Block SHADOW_BERRY = registerBlock("shadow_berry", new ShadowBerryBlock()); public static final Block BLOSSOM_BERRY = registerBlock("blossom_berry_seed", new BaseCropBlock(EndItems.BLOSSOM_BERRY, PINK_MOSS)); @@ -226,7 +325,7 @@ public class EndBlocks extends BlocksRegistry { //public static final Block PEARLBERRY = registerBlock("pearlberry_seed", new EndCropBlock(EndItems.BLOSSOM_BERRY, END_MOSS, END_MYCELIUM)); public static final Block CAVE_PUMPKIN_SEED = registerBlock("cave_pumpkin_seed", new CavePumpkinVineBlock()); public static final Block CAVE_PUMPKIN = registerBlock("cave_pumpkin", new CavePumpkinBlock()); - + // Water plants public static final Block BUBBLE_CORAL = registerBlock("bubble_coral", new BubbleCoralBlock()); public static final Block MENGER_SPONGE = registerBlock("menger_sponge", new MengerSpongeBlock()); @@ -237,24 +336,24 @@ public class EndBlocks extends BlocksRegistry { public static final Block CHARNIA_LIGHT_BLUE = registerBlock("charnia_light_blue", new CharniaBlock()); public static final Block CHARNIA_CYAN = registerBlock("charnia_cyan", new CharniaBlock()); public static final Block CHARNIA_GREEN = registerBlock("charnia_green", new CharniaBlock()); - + public static final Block END_LILY = registerEndBlockOnly("end_lily", new EndLilyBlock()); public static final Block END_LILY_SEED = registerBlock("end_lily_seed", new EndLilySeedBlock()); - - public static final Block HYDRALUX_SAPLING = registerBlock("hydralux_sapling", new HydraluxSaplingBlock()); + + public static final Block HYDRALUX_SAPLING = registerBlock("hydralux_sapling", new HydraluxSaplingBlock()); public static final Block HYDRALUX = registerEndBlockOnly("hydralux", new HydraluxBlock()); public static final Block HYDRALUX_PETAL_BLOCK = registerBlock("hydralux_petal_block", new HydraluxPetalBlock()); public static final ColoredMaterial HYDRALUX_PETAL_BLOCK_COLORED = new ColoredMaterial(HydraluxPetalColoredBlock::new, HYDRALUX_PETAL_BLOCK, true); - + public static final Block POND_ANEMONE = registerBlock("pond_anemone", new PondAnemoneBlock()); - + public static final Block FLAMAEA = registerBlock("flamaea", new FlamaeaBlock()); - + public static final Block CAVE_BUSH = registerBlock("cave_bush", new SimpleLeavesBlock(MaterialColor.COLOR_MAGENTA)); - + public static final Block MURKWEED = registerBlock("murkweed", new MurkweedBlock()); public static final Block NEEDLEGRASS = registerBlock("needlegrass", new NeedlegrassBlock()); - + // Wall Plants // public static final Block PURPLE_POLYPORE = registerBlock("purple_polypore", new EndWallMushroom(13)); public static final Block AURANT_POLYPORE = registerBlock("aurant_polypore", new EndWallMushroom(13)); @@ -265,7 +364,7 @@ public class EndBlocks extends BlocksRegistry { public static final Block BULB_MOSS = registerBlock("bulb_moss", new EndWallPlantBlock(12)); public static final Block JUNGLE_FERN = registerBlock("jungle_fern", new EndWallPlantBlock()); public static final Block RUSCUS = registerBlock("ruscus", new EndWallPlantBlock()); - + // Vines // public static final Block DENSE_VINE = registerBlock("dense_vine", new BaseVineBlock(15, true)); public static final Block TWISTED_VINE = registerBlock("twisted_vine", new BaseVineBlock()); @@ -277,30 +376,30 @@ public class EndBlocks extends BlocksRegistry { public static final Block FILALUX = registerBlock("filalux", new FilaluxBlock()); public static final Block FILALUX_WINGS = registerBlock("filalux_wings", new FilaluxWingsBlock()); public static final Block FILALUX_LANTERN = registerBlock("filalux_lantern", new FilaluxLanternBlock()); - + // Mob-Related public static final Block SILK_MOTH_NEST = registerBlock("silk_moth_nest", new SilkMothNestBlock()); public static final Block SILK_MOTH_HIVE = registerBlock("silk_moth_hive", new SilkMothHiveBlock()); - + // Ores // public static final Block ENDER_ORE = registerBlock("ender_ore", new BaseOreBlock(EndItems.ENDER_SHARD, 1, 3, 5)); public static final Block AMBER_ORE = registerBlock("amber_ore", new BaseOreBlock(EndItems.RAW_AMBER, 1, 2, 4)); - + // Materials // public static final MetalMaterial THALLASIUM = MetalMaterial.makeNormal("thallasium", MaterialColor.COLOR_BLUE, EndToolMaterial.THALLASIUM, EndArmorMaterial.THALLASIUM); public static final MetalMaterial TERMINITE = MetalMaterial.makeOreless("terminite", MaterialColor.WARPED_WART_BLOCK, 7F, 9F, EndToolMaterial.TERMINITE, EndArmorMaterial.TERMINITE); public static final Block AETERNIUM_BLOCK = registerBlock("aeternium_block", new AeterniumBlock()); public static final Block CHARCOAL_BLOCK = registerBlock("charcoal_block", new CharcoalBlock()); - + public static final Block ENDER_BLOCK = registerBlock("ender_block", new EnderBlock()); public static final Block AURORA_CRYSTAL = registerBlock("aurora_crystal", new AuroraCrystalBlock()); public static final Block AMBER_BLOCK = registerBlock("amber_block", new AmberBlock()); public static final Block SMARAGDANT_CRYSTAL = registerBlock("smaragdant_crystal", new SmaragdantCrystalBlock()); public static final CrystalSubblocksMaterial SMARAGDANT_SUBBLOCKS = new CrystalSubblocksMaterial("smaragdant_crystal", SMARAGDANT_CRYSTAL); public static final Block SMARAGDANT_CRYSTAL_SHARD = registerBlock("smaragdant_crystal_shard", new SmaragdantCrystalShardBlock()); - + public static final Block RESPAWN_OBELISK = registerBlock("respawn_obelisk", new RespawnObeliskBlock()); - + // Lanterns public static final Block ANDESITE_LANTERN = registerBlock("andesite_lantern", new StoneLanternBlock(Blocks.ANDESITE)); public static final Block DIORITE_LANTERN = registerBlock("diorite_lantern", new StoneLanternBlock(Blocks.DIORITE)); @@ -309,20 +408,20 @@ public class EndBlocks extends BlocksRegistry { public static final Block PURPUR_LANTERN = registerBlock("purpur_lantern", new StoneLanternBlock(Blocks.PURPUR_BLOCK)); public static final Block END_STONE_LANTERN = registerBlock("end_stone_lantern", new StoneLanternBlock(Blocks.END_STONE)); public static final Block BLACKSTONE_LANTERN = registerBlock("blackstone_lantern", new StoneLanternBlock(Blocks.BLACKSTONE)); - + public static final Block IRON_BULB_LANTERN = registerBlock("iron_bulb_lantern", new BulbVineLanternBlock()); public static final ColoredMaterial IRON_BULB_LANTERN_COLORED = new ColoredMaterial(BulbVineLanternColoredBlock::new, IRON_BULB_LANTERN, false); - + public static final Block IRON_CHANDELIER = EndBlocks.registerBlock("iron_chandelier", new ChandelierBlock(Blocks.GOLD_BLOCK)); public static final Block GOLD_CHANDELIER = EndBlocks.registerBlock("gold_chandelier", new ChandelierBlock(Blocks.GOLD_BLOCK)); - + // Blocks With Entity // public static final Block END_STONE_FURNACE = registerBlock("end_stone_furnace", new BaseFurnaceBlock(Blocks.END_STONE)); public static final Block END_STONE_SMELTER = registerBlock("end_stone_smelter", new EndStoneSmelter()); public static final Block ETERNAL_PEDESTAL = registerBlock("eternal_pedestal", new EternalPedestal()); public static final Block INFUSION_PEDESTAL = registerBlock("infusion_pedestal", new InfusionPedestal()); public static final Block AETERNIUM_ANVIL = registerBlock("aeternium_anvil", new AeterniumAnvil()); - + // Technical public static final Block END_PORTAL_BLOCK = registerEndBlockOnly("end_portal_block", new EndPortalBlock()); @@ -356,11 +455,11 @@ public class EndBlocks extends BlocksRegistry { getBlockRegistry().register(id, block); return block; } - + public static Block registerBlock(String name, Block block) { return registerBlock(BetterEnd.makeID(name), block); } - + public static Block registerEndBlockOnly(String name, Block block) { return getBlockRegistry().registerBlockOnly(name, block); } diff --git a/src/main/java/ru/betterend/registry/EndEntities.java b/src/main/java/ru/betterend/registry/EndEntities.java index 35138b6c..6cb84eaf 100644 --- a/src/main/java/ru/betterend/registry/EndEntities.java +++ b/src/main/java/ru/betterend/registry/EndEntities.java @@ -8,7 +8,6 @@ import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityDimensions; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.EntityType.EntityFactory; -import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.Mob; import net.minecraft.world.entity.MobCategory; import net.minecraft.world.entity.ai.attributes.AttributeSupplier.Builder; @@ -30,7 +29,7 @@ public class EndEntities { public static final EntityType SHADOW_WALKER = register("shadow_walker", MobCategory.MONSTER, 0.6F, 1.95F, ShadowWalkerEntity::new, ShadowWalkerEntity.createMobAttributes(), true, ColorUtil.color(30, 30, 30), ColorUtil.color(5, 5, 5)); public static final EntityType CUBOZOA = register("cubozoa", MobCategory.WATER_AMBIENT, 0.6F, 1F, CubozoaEntity::new, CubozoaEntity.createMobAttributes(), true, ColorUtil.color(151, 77, 181), ColorUtil.color(93, 176, 238)); public static final EntityType SILK_MOTH = register("silk_moth", MobCategory.AMBIENT, 0.6F, 0.6F, SilkMothEntity::new, SilkMothEntity.createMobAttributes(), true, ColorUtil.color(198, 138, 204), ColorUtil.color(242, 220, 236)); - + public static void register() { SpawnHelper.restrictionAir(DRAGONFLY, DragonflyEntity::canSpawn); SpawnHelper.restrictionLand(END_SLIME, EndSlimeEntity::canSpawn); @@ -39,7 +38,7 @@ public class EndEntities { SpawnHelper.restrictionWater(CUBOZOA, CubozoaEntity::canSpawn); SpawnHelper.restrictionAir(SILK_MOTH, SilkMothEntity::canSpawn); } - + protected static EntityType register(String name, MobCategory group, float width, float height, EntityFactory entity) { ResourceLocation id = BetterEnd.makeID(name); EntityType type = FabricEntityTypeBuilder.create(group, entity).dimensions(EntityDimensions.fixed(width, height)).build(); diff --git a/src/main/java/ru/betterend/registry/EndEntitiesRenders.java b/src/main/java/ru/betterend/registry/EndEntitiesRenders.java index c91df925..f3fa3bb3 100644 --- a/src/main/java/ru/betterend/registry/EndEntitiesRenders.java +++ b/src/main/java/ru/betterend/registry/EndEntitiesRenders.java @@ -7,9 +7,22 @@ import net.minecraft.client.renderer.entity.MobRenderer; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.EntityType; import ru.betterend.BetterEnd; -import ru.betterend.entity.model.*; -import ru.betterend.entity.render.*; -import ru.betterend.item.model.*; +import ru.betterend.entity.model.CubozoaEntityModel; +import ru.betterend.entity.model.DragonflyEntityModel; +import ru.betterend.entity.model.EndFishEntityModel; +import ru.betterend.entity.model.EndSlimeEntityModel; +import ru.betterend.entity.model.SilkMothEntityModel; +import ru.betterend.entity.render.RendererEntityCubozoa; +import ru.betterend.entity.render.RendererEntityDragonfly; +import ru.betterend.entity.render.RendererEntityEndFish; +import ru.betterend.entity.render.RendererEntityEndSlime; +import ru.betterend.entity.render.RendererEntityShadowWalker; +import ru.betterend.entity.render.SilkMothEntityRenderer; +import ru.betterend.item.model.ArmoredElytraModel; +import ru.betterend.item.model.CrystaliteBootsModel; +import ru.betterend.item.model.CrystaliteChestplateModel; +import ru.betterend.item.model.CrystaliteHelmetModel; +import ru.betterend.item.model.CrystaliteLeggingsModel; public class EndEntitiesRenders { @@ -64,7 +77,7 @@ public class EndEntitiesRenders { }); } - private static ModelLayerLocation registerMain(String id){ + private static ModelLayerLocation registerMain(String id) { return new ModelLayerLocation(new ResourceLocation(BetterEnd.MOD_ID, id), "main"); } } diff --git a/src/main/java/ru/betterend/registry/EndFeatures.java b/src/main/java/ru/betterend/registry/EndFeatures.java index 214efdde..295f4059 100644 --- a/src/main/java/ru/betterend/registry/EndFeatures.java +++ b/src/main/java/ru/betterend/registry/EndFeatures.java @@ -1,10 +1,6 @@ package ru.betterend.registry; -import java.util.List; -import java.util.function.Supplier; - import com.google.common.collect.Lists; - import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.block.Block; @@ -19,7 +15,6 @@ import net.minecraft.world.level.levelgen.placement.FeatureDecorator; import ru.bclib.api.BiomeAPI; import ru.bclib.world.biomes.BCLBiome; import ru.bclib.world.biomes.BCLBiomeDef; -import ru.bclib.world.features.BCLDecorators; import ru.bclib.world.features.BCLFeature; import ru.bclib.world.features.DefaultFeature; import ru.betterend.BetterEnd; @@ -83,6 +78,9 @@ import ru.betterend.world.features.trees.TenaneaFeature; import ru.betterend.world.features.trees.UmbrellaTreeFeature; import ru.betterend.world.generator.GeneratorOptions; +import java.util.List; +import java.util.function.Supplier; + public class EndFeatures { // Trees // public static final BCLFeature MOSSY_GLOWSHROOM = redisterVegetation("mossy_glowshroom", new MossyGlowshroomFeature(), 3); @@ -95,7 +93,7 @@ public class EndFeatures { public static final BCLFeature JELLYSHROOM = redisterVegetation("jellyshroom", new JellyshroomFeature(), 3); public static final BCLFeature GIGANTIC_AMARANITA = redisterVegetation("gigantic_amaranita", new GiganticAmaranitaFeature(), 1); public static final BCLFeature LUCERNIA = redisterVegetation("lucernia", new LucerniaFeature(), 3); - + // Bushes // public static final BCLFeature PYTHADENDRON_BUSH = redisterVegetation("pythadendron_bush", new BushFeature(EndBlocks.PYTHADENDRON_LEAVES, EndBlocks.PYTHADENDRON.bark), 4); public static final BCLFeature DRAGON_TREE_BUSH = redisterVegetation("dragon_tree_bush", new BushFeature(EndBlocks.DRAGON_TREE_LEAVES, EndBlocks.DRAGON_TREE.bark), 15); @@ -105,7 +103,7 @@ public class EndFeatures { public static final BCLFeature LUCERNIA_BUSH = redisterVegetation("lucernia_bush", new BushWithOuterFeature(EndBlocks.LUCERNIA_LEAVES, EndBlocks.LUCERNIA_OUTER_LEAVES, EndBlocks.LUCERNIA.bark), 10); public static final BCLFeature LUCERNIA_BUSH_RARE = redisterVegetation("lucernia_bush_rare", new BushWithOuterFeature(EndBlocks.LUCERNIA_LEAVES, EndBlocks.LUCERNIA_OUTER_LEAVES, EndBlocks.LUCERNIA.bark), 1); public static final BCLFeature NEON_CACTUS = redisterVegetation("neon_cactus", new NeonCactusFeature(), 2); - + // Plants // public static final BCLFeature UMBRELLA_MOSS = redisterVegetation("umbrella_moss", new DoublePlantFeature(EndBlocks.UMBRELLA_MOSS, EndBlocks.UMBRELLA_MOSS_TALL, 5), 5); public static final BCLFeature CREEPING_MOSS = redisterVegetation("creeping_moss", new SinglePlantFeature(EndBlocks.CREEPING_MOSS, 5), 5); @@ -143,16 +141,16 @@ public class EndFeatures { public static final BCLFeature CHORUS_MUSHROOM = redisterVegetation("chorus_mushroom", new SinglePlantFeature(EndBlocks.CHORUS_MUSHROOM, 5, 5), 1); public static final BCLFeature AMBER_ROOT = redisterVegetation("amber_root", new SinglePlantFeature(EndBlocks.AMBER_ROOT, 5, 5), 1); //public static final BCLFeature PEARLBERRY = redisterVegetation("pearlberry", new SinglePlantFeature(EndBlocks.PEARLBERRY, 5, 5), 1); - + // Vines // public static final BCLFeature DENSE_VINE = redisterVegetation("dense_vine", new VineFeature(EndBlocks.DENSE_VINE, 24), 3); public static final BCLFeature TWISTED_VINE = redisterVegetation("twisted_vine", new VineFeature(EndBlocks.TWISTED_VINE, 24), 3); public static final BCLFeature BULB_VINE = redisterVegetation("bulb_vine", new VineFeature(EndBlocks.BULB_VINE, 24), 5); public static final BCLFeature JUNGLE_VINE = redisterVegetation("jungle_vine", new VineFeature(EndBlocks.JUNGLE_VINE, 24), 5); - + // Ceil plants public static final BCLFeature SMALL_JELLYSHROOM_CEIL = redisterVegetation("small_jellyshroom_ceil", new SingleInvertedScatterFeature(EndBlocks.SMALL_JELLYSHROOM, 8), 8); - + // Wall Plants // public static final BCLFeature PURPLE_POLYPORE = redisterVegetation("purple_polypore", new WallPlantOnLogFeature(EndBlocks.PURPLE_POLYPORE, 3), 5); public static final BCLFeature AURANT_POLYPORE = redisterVegetation("aurant_polypore", new WallPlantOnLogFeature(EndBlocks.AURANT_POLYPORE, 3), 5); @@ -169,10 +167,10 @@ public class EndFeatures { public static final BCLFeature JUNGLE_FERN_WOOD = redisterVegetation("jungle_fern_wood", new WallPlantOnLogFeature(EndBlocks.JUNGLE_FERN, 3), 12); public static final BCLFeature RUSCUS = redisterVegetation("ruscus", new WallPlantFeature(EndBlocks.RUSCUS, 6), 10); public static final BCLFeature RUSCUS_WOOD = redisterVegetation("ruscus_wood", new WallPlantOnLogFeature(EndBlocks.RUSCUS, 6), 10); - + // Sky plants public static final BCLFeature FILALUX = redisterVegetation("filalux", new FilaluxFeature(), 1); - + // Water // public static final BCLFeature BUBBLE_CORAL = redisterVegetation("bubble_coral", new UnderwaterPlantFeature(EndBlocks.BUBBLE_CORAL, 6), 10); public static final BCLFeature BUBBLE_CORAL_RARE = redisterVegetation("bubble_coral_rare", new UnderwaterPlantFeature(EndBlocks.BUBBLE_CORAL, 3), 4); @@ -182,7 +180,7 @@ public class EndFeatures { public static final BCLFeature END_LOTUS_LEAF = redisterVegetation("end_lotus_leaf", new EndLotusLeafFeature(20), 25); public static final BCLFeature HYDRALUX = redisterVegetation("hydralux", new HydraluxFeature(5), 5); public static final BCLFeature POND_ANEMONE = redisterVegetation("pond_anemone", new UnderwaterPlantFeature(EndBlocks.POND_ANEMONE, 6), 10); - + public static final BCLFeature CHARNIA_RED = redisterVegetation("charnia_red", new CharniaFeature(EndBlocks.CHARNIA_RED), 10); public static final BCLFeature CHARNIA_PURPLE = redisterVegetation("charnia_purple", new CharniaFeature(EndBlocks.CHARNIA_PURPLE), 10); public static final BCLFeature CHARNIA_CYAN = redisterVegetation("charnia_cyan", new CharniaFeature(EndBlocks.CHARNIA_CYAN), 10); @@ -193,17 +191,17 @@ public class EndFeatures { public static final BCLFeature CHARNIA_RED_RARE = redisterVegetation("charnia_red_rare", new CharniaFeature(EndBlocks.CHARNIA_RED), 2); public static final BCLFeature BIOME_ISLAND = BCLFeature.makeFeatureConfigured(BetterEnd.makeID("overworld_island"), new BiomeIslandFeature()); public static final BCLFeature FLAMAEA = redisterVegetation("flamaea", new SinglePlantFeature(EndBlocks.FLAMAEA, 12, false, 5), 20); - + // Terrain // - public static final BCLFeature END_LAKE= registerLake("end_lake", new EndLakeFeature(), 4); - public static final BCLFeature END_LAKE_NORMAL= registerLake("end_lake_normal", new EndLakeFeature(), 20); - public static final BCLFeature END_LAKE_RARE= registerLake("end_lake_rare", new EndLakeFeature(), 40); - public static final BCLFeature DESERT_LAKE= registerLake("desert_lake", new DesertLakeFeature(), 8); + public static final BCLFeature END_LAKE = registerLake("end_lake", new EndLakeFeature(), 4); + public static final BCLFeature END_LAKE_NORMAL = registerLake("end_lake_normal", new EndLakeFeature(), 20); + public static final BCLFeature END_LAKE_RARE = registerLake("end_lake_rare", new EndLakeFeature(), 40); + public static final BCLFeature DESERT_LAKE = registerLake("desert_lake", new DesertLakeFeature(), 8); public static final BCLFeature ROUND_CAVE = registerRawGen("round_cave", new RoundCaveFeature(), 2); public static final BCLFeature SPIRE = registerRawGen("spire", new SpireFeature(), 2); public static final BCLFeature FLOATING_SPIRE = registerRawGen("floating_spire", new FloatingSpireFeature(), 8); public static final BCLFeature GEYSER = registerRawGen("geyser", new GeyserFeature(), 8); - public static final BCLFeature SULPHURIC_LAKE= registerLake("sulphuric_lake", new SulphuricLakeFeature(), 8); + public static final BCLFeature SULPHURIC_LAKE = registerLake("sulphuric_lake", new SulphuricLakeFeature(), 8); public static final BCLFeature SULPHURIC_CAVE = BCLFeature.makeCountRawFeature(BetterEnd.makeID("sulphuric_cave"), new SulphuricCaveFeature(), 2); public static final BCLFeature ICE_STAR = registerRawGen("ice_star", new IceStarFeature(5, 15, 10, 25), 15); public static final BCLFeature ICE_STAR_SMALL = registerRawGen("ice_star_small", new IceStarFeature(3, 5, 7, 12), 8); @@ -213,20 +211,20 @@ public class EndFeatures { public static final BCLFeature OBSIDIAN_BOULDER = registerChanced("obsidian_boulder", new ObsidianBoulderFeature(), 10); public static final BCLFeature FALLEN_PILLAR = registerChanced("fallen_pillar", new FallenPillarFeature(), 20); public static final BCLFeature TUNEL_CAVE = BCLFeature.makeChunkFeature(BetterEnd.makeID("tunel_cave"), new TunelCaveFeature()); - + // Ores // public static final BCLFeature THALLASIUM_ORE = registerOre("thallasium_ore", EndBlocks.THALLASIUM.ore, 24, 8, 0, 5, 128); public static final BCLFeature ENDER_ORE = registerOre("ender_ore", EndBlocks.ENDER_ORE, 12, 4, 0, 5, 128); public static final BCLFeature AMBER_ORE = registerOre("amber_ore", EndBlocks.AMBER_ORE, 24, 6, 0, 5, 128); public static final BCLFeature VIOLECITE_LAYER = registerLayer("violecite_layer", EndBlocks.VIOLECITE, 15, 16, 128, 8); public static final BCLFeature FLAVOLITE_LAYER = registerLayer("flavolite_layer", EndBlocks.FLAVOLITE, 12, 16, 128, 6); - + // Buildings public static final BCLFeature CRASHED_SHIP = registerChanced("crashed_ship", new CrashedShipFeature(), 500); - + // Mobs public static final BCLFeature SILK_MOTH_NEST = registerChanced("silk_moth_nest", new SilkMothNestFeature(), 2); - + // Caves public static final DefaultFeature SMARAGDANT_CRYSTAL = new SmaragdantCrystalFeature(); public static final DefaultFeature SMARAGDANT_CRYSTAL_SHARD = new SingleBlockFeature(EndBlocks.SMARAGDANT_CRYSTAL_SHARD); @@ -244,39 +242,39 @@ public class EndFeatures { private static BCLFeature redisterVegetation(String name, Feature feature, int density) { return BCLFeature.makeVegetationFeature(BetterEnd.makeID(name), feature, density); } - + private static BCLFeature registerRawGen(String name, Feature feature, int chance) { return BCLFeature.makeRawGenFeature(BetterEnd.makeID(name), feature, chance); } - + private static BCLFeature registerLake(String name, Feature feature, int chance) { //return BCLFeature.makeLakeFeature(BetterEnd.makeID(name), feature, chance); return BCLFeature.makeRawGenFeature(BetterEnd.makeID(name), feature, chance); } - + private static BCLFeature registerChanced(String name, Feature feature, int chance) { return BCLFeature.makeChansedFeature(BetterEnd.makeID(name), feature, chance); } - + private static BCLFeature registerOre(String name, Block blockOre, int veins, int veinSize, int offset, int minY, int maxY) { return BCLFeature.makeOreFeature(BetterEnd.makeID(name), blockOre, veins, veinSize, offset, minY, maxY); } - + private static BCLFeature registerLayer(String name, Block block, float radius, int minY, int maxY, int count) { OreLayerFeature layer = new OreLayerFeature(block.defaultBlockState(), radius, minY, maxY); ConfiguredFeature configured = layer.configured(FeatureConfiguration.NONE).decorated(FeatureDecorator.COUNT.configured(new CountConfiguration(count))); return new BCLFeature(BetterEnd.makeID(name), layer, GenerationStep.Decoration.UNDERGROUND_ORES, configured); } - + private static BCLFeature registerLayer(String name, StoneMaterial material, float radius, int minY, int maxY, int count) { return registerLayer(name, material.stone, radius, minY, maxY, count); } - + public static void registerBiomeFeatures(ResourceLocation id, Biome biome, List>>> features) { if (id.getNamespace().equals(BetterEnd.MOD_ID)) { return; } - + if (GeneratorOptions.removeChorusFromVanillaBiomes()) { if (id.getNamespace().equals("minecraft")) { String path = id.getPath(); @@ -292,38 +290,38 @@ public class EndFeatures { } } } - + addFeature(FLAVOLITE_LAYER, features); addFeature(THALLASIUM_ORE, features); addFeature(ENDER_ORE, features); addFeature(CRASHED_SHIP, features); - + BCLBiome bclbiome = BiomeAPI.getBiome(id); boolean hasCaves = bclbiome.getCustomData("has_caves", true); if (hasCaves && !EndBiomes.VOID_BIOMES.containsImmutable(id)) { addFeature(ROUND_CAVE, features); addFeature(TUNEL_CAVE, features); } - + BCLFeature feature = BiomeAPI.getBiome(id).getStructuresFeature(); if (feature != null) { addFeature(feature, features); } } - + public static void addDefaultFeatures(BCLBiomeDef def) { def.addFeature(FLAVOLITE_LAYER); def.addFeature(THALLASIUM_ORE); def.addFeature(ENDER_ORE); def.addFeature(CRASHED_SHIP); - + boolean hasCaves = def.getCustomData("has_caves", true); if (hasCaves) { def.addFeature(ROUND_CAVE); def.addFeature(TUNEL_CAVE); } } - + private static void addFeature(BCLFeature feature, List>>> features) { int index = feature.getFeatureStep().ordinal(); if (features.size() > index) { @@ -339,6 +337,7 @@ public class EndFeatures { features.add(newFeature); } } - - public static void register() {} + + public static void register() { + } } diff --git a/src/main/java/ru/betterend/registry/EndItems.java b/src/main/java/ru/betterend/registry/EndItems.java index c3696b29..cbfd428a 100644 --- a/src/main/java/ru/betterend/registry/EndItems.java +++ b/src/main/java/ru/betterend/registry/EndItems.java @@ -1,10 +1,5 @@ package ru.betterend.registry; -import java.util.List; - -import net.minecraft.world.entity.Mob; -import org.jetbrains.annotations.NotNull; - import net.fabricmc.fabric.api.item.v1.FabricItemSettings; import net.minecraft.resources.ResourceLocation; import net.minecraft.sounds.SoundEvent; @@ -12,6 +7,7 @@ import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.effect.MobEffects; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.Mob; import net.minecraft.world.food.FoodProperties; import net.minecraft.world.food.Foods; import net.minecraft.world.item.ArmorItem; @@ -20,10 +16,10 @@ import net.minecraft.world.item.Item; import net.minecraft.world.item.Items; import net.minecraft.world.item.TieredItem; import net.minecraft.world.item.Tiers; +import org.jetbrains.annotations.NotNull; import ru.bclib.items.BaseArmorItem; import ru.bclib.items.tool.BaseAxeItem; import ru.bclib.items.tool.BaseHoeItem; -import ru.bclib.items.tool.BasePickaxeItem; import ru.bclib.items.tool.BaseShovelItem; import ru.bclib.items.tool.BaseSwordItem; import ru.bclib.registry.ItemsRegistry; @@ -44,6 +40,8 @@ import ru.betterend.item.tool.EndHammerItem; import ru.betterend.item.tool.EndPickaxe; import ru.betterend.tab.CreativeTabs; +import java.util.List; + public class EndItems extends ItemsRegistry { // Materials // public final static Item ENDER_DUST = registerEndItem("ender_dust"); @@ -73,7 +71,7 @@ public class EndItems extends ItemsRegistry { public final static Item MUSIC_DISC_GRASPING_AT_STARS = registerEndDisc("music_disc_grasping_at_stars", 0, EndSounds.RECORD_GRASPING_AT_STARS); public final static Item MUSIC_DISC_ENDSEEKER = registerEndDisc("music_disc_endseeker", 0, EndSounds.RECORD_ENDSEEKER); public final static Item MUSIC_DISC_EO_DRACONA = registerEndDisc("music_disc_eo_dracona", 0, EndSounds.RECORD_EO_DRACONA); - + // Armor // public static final Item AETERNIUM_HELMET = registerEndItem("aeternium_helmet", new BaseArmorItem(EndArmorMaterial.AETERNIUM, EquipmentSlot.HEAD, makeEndItemSettings().fireResistant())); public static final Item AETERNIUM_CHESTPLATE = registerEndItem("aeternium_chestplate", new BaseArmorItem(EndArmorMaterial.AETERNIUM, EquipmentSlot.CHEST, makeEndItemSettings().fireResistant())); @@ -93,7 +91,7 @@ public class EndItems extends ItemsRegistry { public static final TieredItem AETERNIUM_AXE = registerEndTool("aeternium_axe", new BaseAxeItem(EndToolMaterial.AETERNIUM, 5.0F, -3.0F, makeEndItemSettings().fireResistant())); public static final TieredItem AETERNIUM_HOE = registerEndTool("aeternium_hoe", new BaseHoeItem(EndToolMaterial.AETERNIUM, -3, 0.0F, makeEndItemSettings().fireResistant())); public static final TieredItem AETERNIUM_HAMMER = registerEndTool("aeternium_hammer", new EndHammerItem(EndToolMaterial.AETERNIUM, 6.0F, -3.0F, 0.3D, makeEndItemSettings().fireResistant())); - + // Toolparts // public final static Item AETERNIUM_SHOVEL_HEAD = registerEndItem("aeternium_shovel_head"); public final static Item AETERNIUM_PICKAXE_HEAD = registerEndItem("aeternium_pickaxe_head"); @@ -108,14 +106,14 @@ public class EndItems extends ItemsRegistry { public static final TieredItem GOLDEN_HAMMER = registerEndTool("golden_hammer", new EndHammerItem(Tiers.GOLD, 4.5F, -3.4F, 0.3D, makeEndItemSettings())); public static final TieredItem DIAMOND_HAMMER = registerEndTool("diamond_hammer", new EndHammerItem(Tiers.DIAMOND, 5.5F, -3.1F, 0.2D, makeEndItemSettings())); public static final TieredItem NETHERITE_HAMMER = registerEndTool("netherite_hammer", new EndHammerItem(Tiers.NETHERITE, 5.0F, -3.0F, 0.2D, makeEndItemSettings().fireResistant())); - + // Food // public final static Item SHADOW_BERRY_RAW = registerEndFood("shadow_berry_raw", 4, 0.5F); public final static Item SHADOW_BERRY_COOKED = registerEndFood("shadow_berry_cooked", 6, 0.7F); public final static Item END_FISH_RAW = registerEndFood("end_fish_raw", Foods.SALMON); public final static Item END_FISH_COOKED = registerEndFood("end_fish_cooked", Foods.COOKED_SALMON); public final static Item BUCKET_END_FISH = registerEndItem("bucket_end_fish", new EndBucketItem(EndEntities.END_FISH)); - public final static Item BUCKET_CUBOZOA = registerEndItem("bucket_cubozoa", new EndBucketItem(EndEntities.CUBOZOA)); + public final static Item BUCKET_CUBOZOA = registerEndItem("bucket_cubozoa", new EndBucketItem(EndEntities.CUBOZOA)); public final static Item SWEET_BERRY_JELLY = registerEndFood("sweet_berry_jelly", 8, 0.7F); public final static Item SHADOW_BERRY_JELLY = registerEndFood("shadow_berry_jelly", 6, 0.8F, new MobEffectInstance(MobEffects.NIGHT_VISION, 400)); public final static Item BLOSSOM_BERRY_JELLY = registerEndFood("blossom_berry_jelly", 8, 0.7F); @@ -142,15 +140,15 @@ public class EndItems extends ItemsRegistry { public static Item registerEndDisc(String name, int power, SoundEvent sound) { return getItemRegistry().registerDisc(name, power, sound); } - + public static Item registerEndItem(String name) { return getItemRegistry().registerItem(name); } - + public static Item registerEndItem(String name, Item item) { return getItemRegistry().register(BetterEnd.makeID(name), item); } - + public static Item registerEndItem(ResourceLocation id, Item item) { if (item instanceof ArmorItem) { return registerEndArmor(id, item); @@ -161,7 +159,7 @@ public class EndItems extends ItemsRegistry { getItemRegistry().register(id, item); return item; } - + private static Item registerEndArmor(ResourceLocation itemId, Item item) { if (!Configs.ITEM_CONFIG.getBoolean("armor", itemId.getPath(), true)) { return item; @@ -169,34 +167,34 @@ public class EndItems extends ItemsRegistry { getItemRegistry().register(itemId, item); return item; } - + public static TieredItem registerEndTool(String name, TieredItem item) { if (!Configs.ITEM_CONFIG.getBoolean("tools", name, true)) { return item; } return getItemRegistry().registerTool(name, item); } - + public static Item registerEndEgg(String name, EntityType type, int background, int dots) { return getItemRegistry().registerEgg(name, type, background, dots); } - + public static Item registerEndFood(String name, int hunger, float saturation, MobEffectInstance... effects) { return getItemRegistry().registerFood(name, hunger, saturation, effects); } - + public static Item registerEndFood(String name, FoodProperties foodComponent) { return getItemRegistry().registerFood(name, foodComponent); } - + public static Item registerEndDrink(String name) { return getItemRegistry().registerDrink(name); } - + public static Item registerEndDrink(String name, FoodProperties foodComponent) { return getItemRegistry().registerDrink(name, foodComponent); } - + public static Item registerEndDrink(String name, int hunger, float saturation) { return getItemRegistry().registerDrink(name, hunger, saturation); } diff --git a/src/main/java/ru/betterend/registry/EndModelProviders.java b/src/main/java/ru/betterend/registry/EndModelProviders.java index 0bcb41ce..3c7d2dd3 100644 --- a/src/main/java/ru/betterend/registry/EndModelProviders.java +++ b/src/main/java/ru/betterend/registry/EndModelProviders.java @@ -9,7 +9,7 @@ import shadow.fabric.api.client.rendering.v1.ArmorRenderingRegistry; public class EndModelProviders { public final static CrystaliteArmorProvider CRYSTALITE_PROVIDER = new CrystaliteArmorProvider(); - + public final static void register() { ArmorRenderingRegistry.registerModel(CRYSTALITE_PROVIDER, CRYSTALITE_PROVIDER.getRenderedItems()); ArmorRenderingRegistry.registerTexture(CRYSTALITE_PROVIDER, CRYSTALITE_PROVIDER.getRenderedItems()); diff --git a/src/main/java/ru/betterend/registry/EndParticles.java b/src/main/java/ru/betterend/registry/EndParticles.java index 2fb673a6..0b8e1d49 100644 --- a/src/main/java/ru/betterend/registry/EndParticles.java +++ b/src/main/java/ru/betterend/registry/EndParticles.java @@ -33,7 +33,7 @@ public class EndParticles { public static final SimpleParticleType JUNGLE_SPORE = register("jungle_spore"); public static final SimpleParticleType FIREFLY = register("firefly"); public static final SimpleParticleType SMARAGDANT = register("smaragdant_particle"); - + public static void register() { ParticleFactoryRegistry.getInstance().register(GLOWING_SPHERE, ParticleGlowingSphere.FactoryGlowingSphere::new); ParticleFactoryRegistry.getInstance().register(PORTAL_SPHERE, PaticlePortalSphere.FactoryPortalSphere::new); @@ -48,15 +48,15 @@ public class EndParticles { ParticleFactoryRegistry.getInstance().register(FIREFLY, FireflyParticle.FireflyParticleFactory::new); ParticleFactoryRegistry.getInstance().register(SMARAGDANT, SmaragdantParticle.SmaragdantParticleFactory::new); } - + private static SimpleParticleType register(String name) { return Registry.register(Registry.PARTICLE_TYPE, BetterEnd.makeID(name), FabricParticleTypes.simple()); } - + private static SimpleParticleType registerFar(String name) { return Registry.register(Registry.PARTICLE_TYPE, BetterEnd.makeID(name), FabricParticleTypes.simple(true)); } - + private static ParticleType register(String name, ParticleType type) { return Registry.register(Registry.PARTICLE_TYPE, BetterEnd.makeID(name), type); } diff --git a/src/main/java/ru/betterend/registry/EndPortals.java b/src/main/java/ru/betterend/registry/EndPortals.java index e09d0ac2..221a7c63 100644 --- a/src/main/java/ru/betterend/registry/EndPortals.java +++ b/src/main/java/ru/betterend/registry/EndPortals.java @@ -1,10 +1,7 @@ package ru.betterend.registry; -import java.io.File; - import com.google.gson.JsonArray; import com.google.gson.JsonObject; - import net.fabricmc.loader.api.FabricLoader; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.MinecraftServer; @@ -15,19 +12,22 @@ import ru.bclib.util.JsonFactory; import ru.bclib.util.MHelper; import ru.betterend.BetterEnd; +import java.io.File; + public class EndPortals { public final static ResourceLocation OVERWORLD_ID = Level.OVERWORLD.location(); private static PortalInfo[] portals; - + public static void loadPortals() { File file = new File(FabricLoader.getInstance().getConfigDir().toString(), "betterend/portals.json"); JsonObject json; if (!file.exists()) { file.getParentFile().mkdirs(); json = makeDefault(file); - } else { + } + else { json = JsonFactory.getJsonObject(file); } if (!json.has("portals") || !json.get("portals").isJsonArray()) { @@ -43,11 +43,11 @@ public class EndPortals { portals[i] = new PortalInfo(array.get(i).getAsJsonObject()); } } - + public static int getCount() { return MHelper.max(portals.length - 1, 1); } - + public static ServerLevel getWorld(MinecraftServer server, int portalId) { if (portalId < 0 || portalId >= portals.length) { return server.overworld(); @@ -61,7 +61,7 @@ public class EndPortals { } return portals[portalId].dimension; } - + public static int getPortalIdByItem(ResourceLocation item) { for (int i = 0; i < portals.length; i++) { if (portals[i].item.equals(item)) { @@ -70,6 +70,7 @@ public class EndPortals { } return 0; } + public static int getPortalIdByWorld(ResourceLocation world) { for (int i = 0; i < portals.length; i++) { if (portals[i].dimension.equals(world)) { @@ -78,11 +79,11 @@ public class EndPortals { } return 0; } - + public static int getColor(int state) { return portals[state].color; } - + public static boolean isAvailableItem(ResourceLocation item) { for (PortalInfo portal : portals) { if (portal.item.equals(item)) { @@ -91,7 +92,7 @@ public class EndPortals { } return false; } - + private static JsonObject makeDefault(File file) { JsonObject jsonObject = new JsonObject(); JsonFactory.storeJson(file, jsonObject); @@ -101,33 +102,33 @@ public class EndPortals { JsonFactory.storeJson(file, jsonObject); return jsonObject; } - + private static PortalInfo makeDefault() { return new PortalInfo(new ResourceLocation("minecraft:overworld"), BetterEnd.makeID("eternal_crystal"), 255, 255, 255); } - + private static class PortalInfo { private final ResourceLocation dimension; private final ResourceLocation item; private final int color; private ServerLevel world; - + PortalInfo(JsonObject obj) { this( - new ResourceLocation(JsonFactory.getString(obj, "dimension", "minecraft:overworld")), - new ResourceLocation(JsonFactory.getString(obj, "item", "betterend:eternal_crystal")), - JsonFactory.getInt(obj, "colorRed", 255), - JsonFactory.getInt(obj, "colorGreen", 255), - JsonFactory.getInt(obj, "colorBlue", 255) + new ResourceLocation(JsonFactory.getString(obj, "dimension", "minecraft:overworld")), + new ResourceLocation(JsonFactory.getString(obj, "item", "betterend:eternal_crystal")), + JsonFactory.getInt(obj, "colorRed", 255), + JsonFactory.getInt(obj, "colorGreen", 255), + JsonFactory.getInt(obj, "colorBlue", 255) ); } - + PortalInfo(ResourceLocation dimension, ResourceLocation item, int r, int g, int b) { this.dimension = dimension; this.item = item; this.color = ColorUtil.color(r, g, b); } - + ServerLevel getWorld(MinecraftServer server) { if (world != null) { return world; @@ -140,7 +141,7 @@ public class EndPortals { } return server.overworld(); } - + JsonObject toJson() { JsonObject obj = new JsonObject(); obj.addProperty("dimension", dimension.toString()); diff --git a/src/main/java/ru/betterend/registry/EndSounds.java b/src/main/java/ru/betterend/registry/EndSounds.java index c0ecf7eb..7e1c962e 100644 --- a/src/main/java/ru/betterend/registry/EndSounds.java +++ b/src/main/java/ru/betterend/registry/EndSounds.java @@ -11,7 +11,7 @@ public class EndSounds { public static final SoundEvent MUSIC_DARK = register("music", "dark"); public static final SoundEvent MUSIC_OPENSPACE = register("music", "openspace"); public static final SoundEvent MUSIC_CAVES = register("music", "caves"); - + // Ambient public static final SoundEvent AMBIENT_FOGGY_MUSHROOMLAND = register("ambient", "foggy_mushroomland"); public static final SoundEvent AMBIENT_CHORUS_FOREST = register("ambient", "chorus_forest"); @@ -23,21 +23,22 @@ public class EndSounds { public static final SoundEvent AMBIENT_UMBRELLA_JUNGLE = register("ambient", "umbrella_jungle"); public static final SoundEvent AMBIENT_GLOWING_GRASSLANDS = register("ambient", "glowing_grasslands"); public static final SoundEvent AMBIENT_CAVES = register("ambient", "caves"); - + // Entity public static final SoundEvent ENTITY_DRAGONFLY = register("entity", "dragonfly"); public static final SoundEvent ENTITY_SHADOW_WALKER = register("entity", "shadow_walker"); public static final SoundEvent ENTITY_SHADOW_WALKER_DAMAGE = register("entity", "shadow_walker_damage"); public static final SoundEvent ENTITY_SHADOW_WALKER_DEATH = register("entity", "shadow_walker_death"); - + // Records public static final SoundEvent RECORD_STRANGE_AND_ALIEN = register("record", "strange_and_alien"); public static final SoundEvent RECORD_GRASPING_AT_STARS = register("record", "grasping_at_stars"); public static final SoundEvent RECORD_ENDSEEKER = register("record", "endseeker"); public static final SoundEvent RECORD_EO_DRACONA = register("record", "eo_dracona"); - - public static void register() {} - + + public static void register() { + } + private static SoundEvent register(String type, String id) { id = "betterend." + type + "." + id; return Registry.register(Registry.SOUND_EVENT, id, new SoundEvent(BetterEnd.makeID(id))); diff --git a/src/main/java/ru/betterend/registry/EndStructures.java b/src/main/java/ru/betterend/registry/EndStructures.java index c3ed2370..fbea7076 100644 --- a/src/main/java/ru/betterend/registry/EndStructures.java +++ b/src/main/java/ru/betterend/registry/EndStructures.java @@ -1,8 +1,5 @@ package ru.betterend.registry; -import java.util.Collection; -import java.util.function.Supplier; - import net.minecraft.core.Registry; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.biome.Biome; @@ -25,6 +22,9 @@ import ru.betterend.world.structures.piece.NBTPiece; import ru.betterend.world.structures.piece.PaintedMountainPiece; import ru.betterend.world.structures.piece.VoxelPiece; +import java.util.Collection; +import java.util.function.Supplier; + public class EndStructures { public static final StructurePieceType VOXEL_PIECE = register("voxel", VoxelPiece::new); public static final StructurePieceType MOUNTAIN_PIECE = register("mountain_piece", CrystalMountainPiece::new); @@ -32,7 +32,7 @@ public class EndStructures { public static final StructurePieceType LAKE_PIECE = register("lake_piece", LakePiece::new); public static final StructurePieceType PAINTED_MOUNTAIN_PIECE = register("painted_mountain_piece", PaintedMountainPiece::new); public static final StructurePieceType NBT_PIECE = register("nbt_piece", NBTPiece::new); - + public static final EndStructureFeature GIANT_MOSSY_GLOWSHROOM = new EndStructureFeature("giant_mossy_glowshroom", new GiantMossyGlowshroomStructure(), Decoration.SURFACE_STRUCTURES, 16, 8); public static final EndStructureFeature MEGALAKE = new EndStructureFeature("megalake", new MegaLakeStructure(), Decoration.RAW_GENERATION, 4, 1); public static final EndStructureFeature MEGALAKE_SMALL = new EndStructureFeature("megalake_small", new MegaLakeSmallStructure(), Decoration.RAW_GENERATION, 4, 1); @@ -40,20 +40,23 @@ public class EndStructures { public static final EndStructureFeature PAINTED_MOUNTAIN = new EndStructureFeature("painted_mountain", new PaintedMountainStructure(), Decoration.RAW_GENERATION, 3, 2); public static final EndStructureFeature ETERNAL_PORTAL = new EndStructureFeature("eternal_portal", new EternalPortalStructure(), Decoration.SURFACE_STRUCTURES, 16, 6); public static final EndStructureFeature GIANT_ICE_STAR = new EndStructureFeature("giant_ice_star", new GiantIceStarStructure(), Decoration.SURFACE_STRUCTURES, 16, 8); - - public static void register() {} - + + public static void register() { + } + private static StructurePieceType register(String id, StructurePieceType pieceType) { return Registry.register(Registry.STRUCTURE_PIECE, BetterEnd.makeID(id), pieceType); } - + public static void registerBiomeStructures(ResourceLocation id, Biome biome, Collection>> structures) { if (!id.getPath().contains("mountain") && !id.getPath().contains("lake")) { addStructure(ETERNAL_PORTAL, structures); } } - + private static void addStructure(EndStructureFeature feature, Collection>> structures) { - structures.add(() -> { return feature.getFeatureConfigured(); }); + structures.add(() -> { + return feature.getFeatureConfigured(); + }); } } diff --git a/src/main/java/ru/betterend/registry/EndTags.java b/src/main/java/ru/betterend/registry/EndTags.java index d3a9a6dc..93bb51dc 100644 --- a/src/main/java/ru/betterend/registry/EndTags.java +++ b/src/main/java/ru/betterend/registry/EndTags.java @@ -1,8 +1,6 @@ package ru.betterend.registry; -import java.util.List; import com.google.common.collect.Lists; - import net.fabricmc.fabric.impl.tool.attribute.ToolManagerImpl; import net.fabricmc.fabric.impl.tool.attribute.handlers.ModdedToolsVanillaBlocksToolHandler; import net.minecraft.core.Registry; @@ -29,10 +27,12 @@ import ru.betterend.blocks.basis.PedestalBlock; import ru.betterend.item.tool.EndHammerItem; import ru.betterend.mixin.common.ComposterBlockAccessor; +import java.util.List; + public class EndTags { // Table with common (c) tags: // https://fabricmc.net/wiki/tutorial:tags - + // Block Tags public static final Tag.Named PEDESTALS = TagAPI.makeBlockTag(BetterEnd.MOD_ID, "pedestal"); public static final Tag.Named END_STONES = TagAPI.makeCommonBlockTag("end_stones"); @@ -40,7 +40,7 @@ public class EndTags { public static final Tag.Named ALLOYING_IRON = TagAPI.makeItemTag(BetterEnd.MOD_ID, "alloying_iron"); public static final Tag.Named ALLOYING_GOLD = TagAPI.makeItemTag(BetterEnd.MOD_ID, "alloying_gold"); public static final Tag.Named ALLOYING_COPPER = TagAPI.makeItemTag(BetterEnd.MOD_ID, "alloying_copper"); - + public static void register() { TagAPI.addEndGround(EndBlocks.THALLASIUM.ore); TagAPI.addEndGround(EndBlocks.ENDSTONE_DUST); @@ -62,7 +62,7 @@ public class EndTags { else if (block instanceof PedestalBlock) { TagHelper.addTag(PEDESTALS, block); } - + Material mat = block.defaultBlockState().getMaterial(); if (mat.equals(Material.PLANT) || mat.equals(Material.REPLACEABLE_PLANT)) { ComposterBlockAccessor.callAdd(0.1F, block); @@ -71,7 +71,7 @@ public class EndTags { TagAPI.addEndGround(EndBlocks.CAVE_MOSS); TagHelper.addTag(BlockTags.NYLIUM, EndBlocks.CAVE_MOSS); BonemealAPI.addSpreadableBlock(EndBlocks.CAVE_MOSS); - + List hammers = Lists.newArrayList(); EndItems.getModItems(BetterEnd.MOD_ID).forEach(item -> { if (item.isEdible()) { @@ -86,27 +86,27 @@ public class EndTags { } }); ToolManagerImpl.tag(TagAPI.HAMMERS).register(new ModdedToolsVanillaBlocksToolHandler(hammers)); - + TagHelper.addTag( - TagAPI.GEN_TERRAIN, - EndBlocks.ENDER_ORE, - EndBlocks.FLAVOLITE.stone, - EndBlocks.VIOLECITE.stone, - EndBlocks.SULPHURIC_ROCK.stone, - EndBlocks.BRIMSTONE, - EndBlocks.VIRID_JADESTONE.stone, - EndBlocks.AZURE_JADESTONE.stone, - EndBlocks.SANDY_JADESTONE.stone + TagAPI.GEN_TERRAIN, + EndBlocks.ENDER_ORE, + EndBlocks.FLAVOLITE.stone, + EndBlocks.VIOLECITE.stone, + EndBlocks.SULPHURIC_ROCK.stone, + EndBlocks.BRIMSTONE, + EndBlocks.VIRID_JADESTONE.stone, + EndBlocks.AZURE_JADESTONE.stone, + EndBlocks.SANDY_JADESTONE.stone ); TagHelper.addTag(TagAPI.END_GROUND, EndBlocks.SULPHURIC_ROCK.stone, EndBlocks.BRIMSTONE); TagHelper.addTag(BlockTags.ANVIL, EndBlocks.AETERNIUM_ANVIL); TagHelper.addTag(BlockTags.BEACON_BASE_BLOCKS, EndBlocks.AETERNIUM_BLOCK); TagHelper.addTag(ItemTags.BEACON_PAYMENT_ITEMS, EndItems.AETERNIUM_INGOT); TagHelper.addTag(TagAPI.DRAGON_IMMUNE, - EndBlocks.ENDER_ORE, - EndBlocks.ETERNAL_PEDESTAL, - EndBlocks.FLAVOLITE_RUNED_ETERNAL, - EndBlocks.FLAVOLITE_RUNED + EndBlocks.ENDER_ORE, + EndBlocks.ETERNAL_PEDESTAL, + EndBlocks.FLAVOLITE_RUNED_ETERNAL, + EndBlocks.FLAVOLITE_RUNED ); TagHelper.addTag(TagAPI.IRON_INGOTS, EndBlocks.THALLASIUM.ingot); @@ -114,7 +114,7 @@ public class EndTags { TagHelper.addTag(ALLOYING_GOLD, Items.GOLD_ORE, Items.DEEPSLATE_GOLD_ORE, Items.RAW_GOLD); TagHelper.addTag(ALLOYING_COPPER, Items.COPPER_ORE, Items.DEEPSLATE_COPPER_ORE, Items.RAW_COPPER); } - + public static void addTerrainTags(Registry biomeRegistry) { biomeRegistry.forEach((biome) -> { if (biome.getBiomeCategory() == BiomeCategory.THEEND) { diff --git a/src/main/java/ru/betterend/rituals/EternalRitual.java b/src/main/java/ru/betterend/rituals/EternalRitual.java index 60e126c4..78586e7a 100644 --- a/src/main/java/ru/betterend/rituals/EternalRitual.java +++ b/src/main/java/ru/betterend/rituals/EternalRitual.java @@ -1,17 +1,7 @@ package ru.betterend.rituals; -import java.awt.Point; -import java.util.List; -import java.util.Objects; -import java.util.Random; -import java.util.Set; -import java.util.function.Predicate; - -import org.jetbrains.annotations.Nullable; - import com.google.common.collect.Lists; import com.google.common.collect.Sets; - import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Registry; @@ -37,6 +27,7 @@ import net.minecraft.world.level.chunk.LevelChunkSection; import net.minecraft.world.level.dimension.DimensionType; import net.minecraft.world.level.levelgen.Heightmap; import net.minecraft.world.level.material.Material; +import org.jetbrains.annotations.Nullable; import ru.bclib.blocks.BlockProperties; import ru.betterend.BetterEnd; import ru.betterend.blocks.EndPortalBlock; @@ -46,6 +37,13 @@ import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndPortals; +import java.awt.Point; +import java.util.List; +import java.util.Objects; +import java.util.Random; +import java.util.Set; +import java.util.function.Predicate; + public class EternalRitual { private final static Set STRUCTURE_MAP = Sets.newHashSet( new Point(-4, -5), new Point(-4, 5), new Point(-6, 0), @@ -125,7 +123,8 @@ public class EternalRitual { Item pItem = pedestal.getItem(0).getItem(); if (item == null) { item = pItem; - } else if (!item.equals(pItem)) { + } + else if (!item.equals(pItem)) { valid = false; } } @@ -163,10 +162,12 @@ public class EternalRitual { try { if (exit == null) { initPortal(worldId, portalId); - } else { + } + else { if (!worldId.equals(targetWorldId)) { initPortal(worldId, portalId); - } else if (!checkFrame(targetWorld, exit.below())) { + } + else if (!checkFrame(targetWorld, exit.below())) { Direction.Axis portalAxis = (Direction.Axis.X == axis) ? Direction.Axis.Z : Direction.Axis.X; generatePortal(targetWorld, exit, portalAxis, portalId); } @@ -175,7 +176,8 @@ public class EternalRitual { activatePortal(world, center, portalId); doEffects((ServerLevel) world, center); active = true; - } catch (Exception ex) { + } + catch (Exception ex) { BetterEnd.LOGGER.error("Create End portals error.", ex); removePortal(targetWorld, exit); removePortal(world, center); @@ -282,7 +284,7 @@ public class EternalRitual { private BlockPos findFrame(Level world, BlockPos.MutableBlockPos startPos) { List foundPos = findAllBlockPos(world, startPos, (SEARCH_RADIUS >> 4) + 1, FRAME, blockState -> blockState.is(FRAME) && !blockState.getValue(ACTIVE)); - for(BlockPos.MutableBlockPos testPos : foundPos) { + for (BlockPos.MutableBlockPos testPos : foundPos) { if (checkFrame(world, testPos)) { return testPos; } @@ -305,7 +307,8 @@ public class EternalRitual { if (checkIsAreaValid(targetWorld, basePos, portalAxis)) { generatePortal(targetWorld, basePos, portalAxis, portalId); return basePos.immutable(); - } else { + } + else { Direction direction = Direction.EAST; BlockPos.MutableBlockPos checkPos = basePos.mutable(); int radius = (int) ((SEARCH_RADIUS / multiplier) + 1); @@ -319,7 +322,7 @@ public class EternalRitual { if (ceil < 5) continue; checkPos.setY(ceil); while (checkPos.getY() >= 5) { - if(checkIsAreaValid(targetWorld, checkPos, portalAxis)) { + if (checkIsAreaValid(targetWorld, checkPos, portalAxis)) { generatePortal(targetWorld, checkPos, portalAxis, portalId); return checkPos.immutable(); } @@ -333,7 +336,8 @@ public class EternalRitual { } if (targetWorld.dimension() == Level.END) { Features.END_ISLAND.place(targetWorld, targetWorld.getChunkSource().getGenerator(), new Random(basePos.asLong()), basePos.below()); - } else if (targetWorld.dimension() == Level.OVERWORLD) { + } + else if (targetWorld.dimension() == Level.OVERWORLD) { basePos.setY(targetWorld.getChunk(basePos).getHeight(Heightmap.Types.WORLD_SURFACE, basePos.getX(), basePos.getZ()) + 1); } EndFeatures.BIOME_ISLAND.getFeatureConfigured().place(targetWorld, targetWorld.getChunkSource().getGenerator(), new Random(basePos.asLong()), basePos.below()); @@ -410,7 +414,8 @@ public class EternalRitual { checkPos = checkPos.east(8); if (this.hasPedestal(checkPos)) { this.center = initial.north(5).east(4); - } else { + } + else { this.center = initial.north(5).west(4); } return; @@ -421,7 +426,8 @@ public class EternalRitual { checkPos = checkPos.east(8); if (this.hasPedestal(checkPos)) { this.center = initial.south(5).east(4); - } else { + } + else { this.center = initial.south(5).west(4); } return; @@ -432,7 +438,8 @@ public class EternalRitual { checkPos = checkPos.south(8); if (this.hasPedestal(checkPos)) { this.center = initial.east(5).south(4); - } else { + } + else { this.center = initial.east(5).north(4); } return; @@ -443,7 +450,8 @@ public class EternalRitual { checkPos = checkPos.south(8); if (this.hasPedestal(checkPos)) { this.center = initial.west(5).south(4); - } else { + } + else { this.center = initial.west(5).north(4); } } @@ -460,7 +468,8 @@ public class EternalRitual { if (pedestal != null) { if (!pedestal.hasRitual()) { pedestal.linkRitual(this); - } else { + } + else { EternalRitual ritual = pedestal.getRitual(); if (!ritual.equals(this)) { pedestal.linkRitual(this); @@ -564,12 +573,11 @@ public class EternalRitual { } /** - * @param world World for search - * @param checkPos Start search position - * @param radius Search radius + * @param world World for search + * @param checkPos Start search position + * @param radius Search radius * @param searchBlock Target block - * @param condition Predicate for test block states in the chunk section - * + * @param condition Predicate for test block states in the chunk section * @return Position of the first found block or null. */ @Nullable @@ -583,7 +591,7 @@ public class EternalRitual { if (section == null || !section.getStates().maybeHas(condition)) continue; for (int x = 0; x < 16; x++) { for (int y = 0; y < 16; y++) { - for(int z = 0; z < 16; z++) { + for (int z = 0; z < 16; z++) { BlockState checkState = section.getBlockState(x, y, z); if (checkState.is(searchBlock)) { int worldX = (chunk.getPos().x << 4) + x; @@ -604,12 +612,11 @@ public class EternalRitual { } /** - * @param world World for search - * @param checkPos Start search position - * @param radius Search radius + * @param world World for search + * @param checkPos Start search position + * @param radius Search radius * @param searchBlock Target block - * @param condition Predicate for test block states in the chunk section - * + * @param condition Predicate for test block states in the chunk section * @return List of positions of the all found blocks or empty list. */ public static List findAllBlockPos(Level world, BlockPos.MutableBlockPos checkPos, int radius, Block searchBlock, Predicate condition) { @@ -623,7 +630,7 @@ public class EternalRitual { if (section == null || !section.getStates().maybeHas(condition)) continue; for (int x = 0; x < 16; x++) { for (int y = 0; y < 16; y++) { - for(int z = 0; z < 16; z++) { + for (int z = 0; z < 16; z++) { BlockState checkState = section.getBlockState(x, y, z); if (checkState.is(searchBlock)) { int worldX = (chunk.getPos().x << 4) + x; diff --git a/src/main/java/ru/betterend/rituals/InfusionRitual.java b/src/main/java/ru/betterend/rituals/InfusionRitual.java index 005e6b38..45acdb5d 100644 --- a/src/main/java/ru/betterend/rituals/InfusionRitual.java +++ b/src/main/java/ru/betterend/rituals/InfusionRitual.java @@ -1,9 +1,5 @@ package ru.betterend.rituals; -import java.awt.Point; -import java.util.Arrays; -import java.util.Objects; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; @@ -19,8 +15,12 @@ import ru.betterend.blocks.entities.PedestalBlockEntity; import ru.betterend.particle.InfusionParticleType; import ru.betterend.recipe.builders.InfusionRecipe; +import java.awt.Point; +import java.util.Arrays; +import java.util.Objects; + public class InfusionRitual implements Container { - private static final Point[] PEDESTALS_MAP = new Point[] { + private static final Point[] PEDESTALS_MAP = new Point[]{ new Point(0, 3), new Point(2, 2), new Point(3, 0), @@ -41,14 +41,14 @@ public class InfusionRitual implements Container { private final PedestalBlockEntity[] catalysts = new PedestalBlockEntity[8]; private final InfusionPedestalEntity input; - + public InfusionRitual(InfusionPedestalEntity pedestal, Level world, BlockPos pos) { this.input = pedestal; this.world = world; this.worldPos = pos; configure(); } - + public void configure() { if (world == null || worldPos == null || world.isClientSide) return; for (int i = 0; i < catalysts.length; i++) { @@ -57,12 +57,13 @@ public class InfusionRitual implements Container { BlockEntity catalystEntity = world.getBlockEntity(checkPos); if (catalystEntity instanceof PedestalBlockEntity) { catalysts[i] = (PedestalBlockEntity) catalystEntity; - } else { + } + else { catalysts[i] = null; } } } - + public boolean checkRecipe() { if (!isValid()) return false; InfusionRecipe recipe = world.getRecipeManager().getRecipeFor(InfusionRecipe.TYPE, this, world).orElse(null); @@ -70,7 +71,8 @@ public class InfusionRitual implements Container { if (recipe == null) { reset(); return false; - } else if (activeRecipe == null || recipe.getInfusionTime() != time) { + } + else if (activeRecipe == null || recipe.getInfusionTime() != time) { updateRecipe(recipe); } return true; @@ -93,14 +95,14 @@ public class InfusionRitual implements Container { time = activeRecipe != null ? activeRecipe.getInfusionTime() : 0; progress = 0; } - + public void reset() { activeRecipe = null; hasRecipe = false; resetTimer(); setChanged(); } - + public void tick() { if (isDirty) { configure(); @@ -112,7 +114,8 @@ public class InfusionRitual implements Container { clearContent(); input.setItem(0, activeRecipe.assemble(this)); reset(); - } else { + } + else { ServerLevel serverLevel = (ServerLevel) world; BlockPos target = worldPos.above(); double tx = target.getX() + 0.5; @@ -131,17 +134,17 @@ public class InfusionRitual implements Container { } } - + @Override public boolean canPlaceItem(int slot, ItemStack stack) { return isValid(); } - + public boolean isValid() { if (world == null || world.isClientSide || worldPos == null || input == null) return false; return Arrays.stream(catalysts).noneMatch(Objects::isNull); } - + public boolean hasRecipe() { return hasRecipe; } @@ -174,7 +177,8 @@ public class InfusionRitual implements Container { if (slot > 8) return ItemStack.EMPTY; if (slot == 0) { return input.getItem(0); - } else { + } + else { return catalysts[slot - 1].getItem(0); } } @@ -189,7 +193,8 @@ public class InfusionRitual implements Container { if (slot > 8) return ItemStack.EMPTY; if (slot == 0) { return input.removeItemNoUpdate(0); - } else { + } + else { return catalysts[slot - 1].removeItemNoUpdate(0); } } @@ -199,7 +204,8 @@ public class InfusionRitual implements Container { if (slot > 8) return; if (slot == 0) { input.setItem(0, stack); - } else { + } + else { catalysts[slot - 1].setItem(0, stack); } } @@ -220,7 +226,7 @@ public class InfusionRitual implements Container { public boolean stillValid(Player player) { return true; } - + public void fromTag(CompoundTag tag) { if (tag.contains("recipe")) { hasRecipe = tag.getBoolean("recipe"); diff --git a/src/main/java/ru/betterend/tab/CreativeTabs.java b/src/main/java/ru/betterend/tab/CreativeTabs.java index fab36d20..a42bc34c 100644 --- a/src/main/java/ru/betterend/tab/CreativeTabs.java +++ b/src/main/java/ru/betterend/tab/CreativeTabs.java @@ -1,7 +1,5 @@ package ru.betterend.tab; -import java.util.stream.Collectors; - import net.fabricmc.fabric.api.client.itemgroup.FabricItemGroupBuilder; import net.minecraft.world.item.CreativeModeTab; import net.minecraft.world.item.ItemStack; @@ -9,6 +7,8 @@ import ru.betterend.BetterEnd; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndItems; +import java.util.stream.Collectors; + public class CreativeTabs { public static final CreativeModeTab TAB_BLOCKS; public static final CreativeModeTab TAB_ITEMS; diff --git a/src/main/java/ru/betterend/util/BlockFixer.java b/src/main/java/ru/betterend/util/BlockFixer.java index f0cdbc91..53bded10 100644 --- a/src/main/java/ru/betterend/util/BlockFixer.java +++ b/src/main/java/ru/betterend/util/BlockFixer.java @@ -1,10 +1,6 @@ package ru.betterend.util; -import java.util.Set; -import java.util.stream.IntStream; - import com.google.common.collect.Sets; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; @@ -20,6 +16,9 @@ import ru.betterend.blocks.BlueVineBlock; import ru.betterend.blocks.basis.FurBlock; import ru.betterend.registry.EndBlocks; +import java.util.Set; +import java.util.stream.IntStream; + public class BlockFixer { private static final BlockState AIR = Blocks.AIR.defaultBlockState(); private static final BlockState WATER = Blocks.WATER.defaultBlockState(); diff --git a/src/main/java/ru/betterend/util/BonemealPlants.java b/src/main/java/ru/betterend/util/BonemealPlants.java index b2a5cdf6..e0a9befb 100644 --- a/src/main/java/ru/betterend/util/BonemealPlants.java +++ b/src/main/java/ru/betterend/util/BonemealPlants.java @@ -10,46 +10,46 @@ public class BonemealPlants { BonemealAPI.addLandGrass(EndBlocks.UMBRELLA_MOSS, EndBlocks.END_MOSS); BonemealAPI.addLandGrass(EndBlocks.CREEPING_MOSS, EndBlocks.END_MYCELIUM); BonemealAPI.addLandGrass(EndBlocks.UMBRELLA_MOSS, EndBlocks.END_MYCELIUM); - + BonemealAPI.addLandGrass(EndBlocks.CAVE_GRASS, EndBlocks.CAVE_MOSS); BonemealAPI.addLandGrass(EndBlocks.CHORUS_GRASS, EndBlocks.CHORUS_NYLIUM); BonemealAPI.addLandGrass(EndBlocks.CRYSTAL_GRASS, EndBlocks.CRYSTAL_MOSS); BonemealAPI.addLandGrass(EndBlocks.SHADOW_PLANT, EndBlocks.SHADOW_GRASS); BonemealAPI.addLandGrass(EndBlocks.BUSHY_GRASS, EndBlocks.PINK_MOSS); BonemealAPI.addLandGrass(EndBlocks.AMBER_GRASS, EndBlocks.AMBER_MOSS); - + BonemealAPI.addLandGrass(EndBlocks.JUNGLE_GRASS, EndBlocks.JUNGLE_MOSS); BonemealAPI.addLandGrass(EndBlocks.TWISTED_UMBRELLA_MOSS, EndBlocks.JUNGLE_MOSS); BonemealAPI.addLandGrass(EndBlocks.JUNGLE_MOSS, EndBlocks.SMALL_JELLYSHROOM, 0.1F); - + BonemealAPI.addLandGrass(EndBiomes.GLOWING_GRASSLANDS.getID(), EndBlocks.BLOOMING_COOKSONIA, EndBlocks.END_MOSS); BonemealAPI.addLandGrass(EndBiomes.GLOWING_GRASSLANDS.getID(), EndBlocks.VAIOLUSH_FERN, EndBlocks.END_MOSS); BonemealAPI.addLandGrass(EndBiomes.GLOWING_GRASSLANDS.getID(), EndBlocks.FRACTURN, EndBlocks.END_MOSS); BonemealAPI.addLandGrass(EndBiomes.GLOWING_GRASSLANDS.getID(), EndBlocks.SALTEAGO, EndBlocks.END_MOSS); - + BonemealAPI.addLandGrass(EndBiomes.GLOWING_GRASSLANDS.getID(), EndBlocks.END_MOSS, EndBlocks.CREEPING_MOSS, 0.1F); BonemealAPI.addLandGrass(EndBiomes.GLOWING_GRASSLANDS.getID(), EndBlocks.END_MOSS, EndBlocks.UMBRELLA_MOSS, 0.1F); BonemealAPI.addLandGrass(EndBiomes.GLOWING_GRASSLANDS.getID(), EndBlocks.END_MOSS, EndBlocks.TWISTED_UMBRELLA_MOSS, 0.1F); - + BonemealAPI.addLandGrass(EndBlocks.ORANGO, EndBlocks.RUTISCUS); BonemealAPI.addLandGrass(EndBlocks.RUTISCUS, EndBlocks.AERIDIUM, 0.2F); BonemealAPI.addLandGrass(EndBlocks.RUTISCUS, EndBlocks.LUTEBUS, 0.2F); BonemealAPI.addLandGrass(EndBlocks.RUTISCUS, EndBlocks.LAMELLARIUM); - + BonemealAPI.addLandGrass(EndBiomes.LANTERN_WOODS.getID(), EndBlocks.RUTISCUS, EndBlocks.AERIDIUM, 0.2F); BonemealAPI.addLandGrass(EndBiomes.LANTERN_WOODS.getID(), EndBlocks.LAMELLARIUM, EndBlocks.RUTISCUS); BonemealAPI.addLandGrass(EndBiomes.LANTERN_WOODS.getID(), EndBlocks.RUTISCUS, EndBlocks.BOLUX_MUSHROOM, 0.05F); - + BonemealAPI.addLandGrass(EndBlocks.GLOBULAGUS, EndBlocks.SANGNUM, EndBlocks.MOSSY_OBSIDIAN, EndBlocks.MOSSY_DRAGON_BONE); BonemealAPI.addLandGrass(EndBlocks.CLAWFERN, EndBlocks.SANGNUM, EndBlocks.MOSSY_OBSIDIAN, EndBlocks.MOSSY_DRAGON_BONE); BonemealAPI.addLandGrass(EndBlocks.SANGNUM, EndBlocks.SMALL_AMARANITA_MUSHROOM, 0.1F); BonemealAPI.addLandGrass(EndBlocks.MOSSY_OBSIDIAN, EndBlocks.SMALL_AMARANITA_MUSHROOM, 0.1F); BonemealAPI.addLandGrass(EndBlocks.MOSSY_DRAGON_BONE, EndBlocks.SMALL_AMARANITA_MUSHROOM, 0.1F); - + BonemealAPI.addLandGrass(EndBlocks.GLOBULAGUS, EndBlocks.MOSSY_DRAGON_BONE); BonemealAPI.addLandGrass(EndBlocks.CLAWFERN, EndBlocks.MOSSY_DRAGON_BONE); BonemealAPI.addLandGrass(EndBlocks.MOSSY_DRAGON_BONE, EndBlocks.SMALL_AMARANITA_MUSHROOM, 0.1F); - + BonemealAPI.addLandGrass(EndBlocks.GLOBULAGUS, EndBlocks.MOSSY_OBSIDIAN); BonemealAPI.addLandGrass(EndBlocks.CLAWFERN, EndBlocks.MOSSY_OBSIDIAN); BonemealAPI.addLandGrass(EndBlocks.MOSSY_OBSIDIAN, EndBlocks.SMALL_AMARANITA_MUSHROOM, 0.1F); diff --git a/src/main/java/ru/betterend/util/FeaturesHelper.java b/src/main/java/ru/betterend/util/FeaturesHelper.java index d2b9658c..c14bdce8 100644 --- a/src/main/java/ru/betterend/util/FeaturesHelper.java +++ b/src/main/java/ru/betterend/util/FeaturesHelper.java @@ -1,13 +1,7 @@ package ru.betterend.util; -import java.util.ArrayList; -import java.util.List; -import java.util.Set; -import java.util.function.Supplier; - import com.google.common.collect.Lists; import com.google.common.collect.Sets; - import net.minecraft.core.Registry; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; @@ -16,6 +10,11 @@ import ru.betterend.mixin.common.BiomeGenerationSettingsAccessor; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndStructures; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; +import java.util.function.Supplier; + public class FeaturesHelper { private static final Set INJECTED = Sets.newHashSet(); @@ -37,6 +36,6 @@ public class FeaturesHelper { accessor.be_setStructures(structures); INJECTED.add(biome); } - }); + }); } } \ No newline at end of file diff --git a/src/main/java/ru/betterend/util/ItemUtil.java b/src/main/java/ru/betterend/util/ItemUtil.java index 20f57987..c6c9bba1 100644 --- a/src/main/java/ru/betterend/util/ItemUtil.java +++ b/src/main/java/ru/betterend/util/ItemUtil.java @@ -1,19 +1,17 @@ package ru.betterend.util; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - import com.google.gson.JsonObject; - import net.minecraft.core.Registry; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.GsonHelper; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import ru.betterend.BetterEnd; public class ItemUtil { - + public static String toStackString(@NotNull ItemStack stack) { try { if (stack == null) { @@ -21,12 +19,13 @@ public class ItemUtil { } Item item = stack.getItem(); return Registry.ITEM.getKey(item) + ":" + stack.getCount(); - } catch (Exception ex) { + } + catch (Exception ex) { BetterEnd.LOGGER.error("ItemStack serialization error!", ex); } return ""; } - + @Nullable public static ItemStack fromStackString(String stackString) { if (stackString == null || stackString.equals("")) { @@ -47,12 +46,13 @@ public class ItemUtil { return new IllegalStateException("Output item " + itemId + " does not exists!"); }); return new ItemStack(item, Integer.valueOf(parts[2])); - } catch (Exception ex) { + } + catch (Exception ex) { BetterEnd.LOGGER.error("ItemStack deserialization error!", ex); } return null; } - + @Nullable public static ItemStack fromJsonRecipe(JsonObject recipe) { try { @@ -65,7 +65,8 @@ public class ItemUtil { }); int count = GsonHelper.getAsInt(recipe, "count", 1); return new ItemStack(item, count); - } catch (Exception ex) { + } + catch (Exception ex) { BetterEnd.LOGGER.error("ItemStack deserialization error!", ex); } return null; diff --git a/src/main/java/ru/betterend/util/LangUtil.java b/src/main/java/ru/betterend/util/LangUtil.java index bc051bf8..534022c0 100644 --- a/src/main/java/ru/betterend/util/LangUtil.java +++ b/src/main/java/ru/betterend/util/LangUtil.java @@ -5,33 +5,33 @@ import net.minecraft.network.chat.TranslatableComponent; public class LangUtil { public final static String CONFIG_ELEMENT = "configuration"; - + private String element; - + public LangUtil(String element) { this.element = element; } - + public void setElement(String key) { this.element = key; } - + public String getString(String key) { return getString(element, key); } - + public TranslatableComponent getText(String key) { return getText(element, key); } - + public static String translate(String key) { return I18n.get(key); } - + public static String getString(String element, String key) { return translate(String.format("%s.%s", element, key)); } - + public static TranslatableComponent getText(String element, String key) { return new TranslatableComponent(getString(element, key)); } diff --git a/src/main/java/ru/betterend/util/LootTableUtil.java b/src/main/java/ru/betterend/util/LootTableUtil.java index f7439249..dab4cac4 100644 --- a/src/main/java/ru/betterend/util/LootTableUtil.java +++ b/src/main/java/ru/betterend/util/LootTableUtil.java @@ -20,7 +20,7 @@ public class LootTableUtil { builder.withCondition(LootItemRandomChanceCondition.randomChance(0.5f).build()); builder.withEntry(LootItem.lootTableItem(Items.GHAST_TEAR).build()); supplier.withPool(builder); - + builder = FabricLootPoolBuilder.builder(); builder.setRolls(UniformGenerator.between(0, 5)); builder.withCondition(LootItemRandomChanceCondition.randomChance(0.1f).build()); diff --git a/src/main/java/ru/betterend/util/RecipeHelper.java b/src/main/java/ru/betterend/util/RecipeHelper.java index 7b0f879e..78c393e0 100644 --- a/src/main/java/ru/betterend/util/RecipeHelper.java +++ b/src/main/java/ru/betterend/util/RecipeHelper.java @@ -8,11 +8,12 @@ public class RecipeHelper { public static boolean exists(ItemLike item) { if (item instanceof Block) { return Registry.BLOCK.getKey((Block) item) != Registry.BLOCK.getDefaultKey(); - } else { + } + else { return Registry.ITEM.getKey(item.asItem()) != Registry.ITEM.getDefaultKey(); } } - + public static boolean exists(ItemLike... items) { for (ItemLike item : items) { if (!exists(item)) { diff --git a/src/main/java/ru/betterend/util/ShuffelingListExtended.java b/src/main/java/ru/betterend/util/ShuffelingListExtended.java index 2e265ff3..a86ee5bf 100644 --- a/src/main/java/ru/betterend/util/ShuffelingListExtended.java +++ b/src/main/java/ru/betterend/util/ShuffelingListExtended.java @@ -1,11 +1,7 @@ package ru.betterend.util; -import net.minecraft.world.entity.ai.behavior.ShufflingList; -import org.spongepowered.asm.mixin.Shadow; - -import java.util.Random; - public interface ShuffelingListExtended { - public boolean isEmpty(); - public U getOne(); + public boolean isEmpty(); + + public U getOne(); } diff --git a/src/main/java/ru/betterend/util/SpawnHelper.java b/src/main/java/ru/betterend/util/SpawnHelper.java index e42a688a..4aefd2eb 100644 --- a/src/main/java/ru/betterend/util/SpawnHelper.java +++ b/src/main/java/ru/betterend/util/SpawnHelper.java @@ -11,11 +11,11 @@ public class SpawnHelper { public static void restrictionAir(EntityType entity, SpawnPredicate predicate) { SpawnRestrictionAccessor.callRegister(entity, Type.NO_RESTRICTIONS, Types.MOTION_BLOCKING, predicate); } - + public static void restrictionLand(EntityType entity, SpawnPredicate predicate) { SpawnRestrictionAccessor.callRegister(entity, Type.ON_GROUND, Types.MOTION_BLOCKING, predicate); } - + public static void restrictionWater(EntityType entity, SpawnPredicate predicate) { SpawnRestrictionAccessor.callRegister(entity, Type.IN_WATER, Types.MOTION_BLOCKING, predicate); } diff --git a/src/main/java/ru/betterend/world/biome/EndBiome.java b/src/main/java/ru/betterend/world/biome/EndBiome.java index b0e33d89..8dd4a44d 100644 --- a/src/main/java/ru/betterend/world/biome/EndBiome.java +++ b/src/main/java/ru/betterend/world/biome/EndBiome.java @@ -10,14 +10,14 @@ import ru.betterend.registry.EndFeatures; public class EndBiome extends BCLBiome { public EndBiome(BCLBiomeDef def) { super(updateDef(def)); - + } public EndBiome(ResourceLocation id, Biome biome, float fogDensity, float genChance, boolean hasCaves) { super(id, biome, fogDensity, genChance); this.addCustomData("has_caves", hasCaves); } - + private static BCLBiomeDef updateDef(BCLBiomeDef def) { def.loadConfigValues(Configs.BIOME_CONFIG); EndFeatures.addDefaultFeatures(def); diff --git a/src/main/java/ru/betterend/world/biome/cave/EmptyAuroraCaveBiome.java b/src/main/java/ru/betterend/world/biome/cave/EmptyAuroraCaveBiome.java index 7ab06f41..fcec0818 100644 --- a/src/main/java/ru/betterend/world/biome/cave/EmptyAuroraCaveBiome.java +++ b/src/main/java/ru/betterend/world/biome/cave/EmptyAuroraCaveBiome.java @@ -13,17 +13,17 @@ public class EmptyAuroraCaveBiome extends EndCaveBiome { .setPlantsColor(108, 25, 46) .setWaterAndFogColor(186, 77, 237) .setParticles(EndParticles.GLOWING_SPHERE, 0.001F)); - + this.addFloorFeature(EndFeatures.BIG_AURORA_CRYSTAL, 1); - + this.addCeilFeature(EndFeatures.END_STONE_STALACTITE, 1); } - + @Override public float getFloorDensity() { return 0.01F; } - + @Override public float getCeilDensity() { return 0.1F; diff --git a/src/main/java/ru/betterend/world/biome/cave/EmptyEndCaveBiome.java b/src/main/java/ru/betterend/world/biome/cave/EmptyEndCaveBiome.java index 151e7475..c88e10e3 100644 --- a/src/main/java/ru/betterend/world/biome/cave/EmptyEndCaveBiome.java +++ b/src/main/java/ru/betterend/world/biome/cave/EmptyEndCaveBiome.java @@ -10,12 +10,12 @@ public class EmptyEndCaveBiome extends EndCaveBiome { this.addFloorFeature(EndFeatures.END_STONE_STALAGMITE, 1); this.addCeilFeature(EndFeatures.END_STONE_STALACTITE, 1); } - + @Override public float getFloorDensity() { return 0.1F; } - + @Override public float getCeilDensity() { return 0.1F; diff --git a/src/main/java/ru/betterend/world/biome/cave/EmptySmaragdantCaveBiome.java b/src/main/java/ru/betterend/world/biome/cave/EmptySmaragdantCaveBiome.java index 8fe0f4a8..4924dacc 100644 --- a/src/main/java/ru/betterend/world/biome/cave/EmptySmaragdantCaveBiome.java +++ b/src/main/java/ru/betterend/world/biome/cave/EmptySmaragdantCaveBiome.java @@ -13,18 +13,18 @@ public class EmptySmaragdantCaveBiome extends EndCaveBiome { .setPlantsColor(0, 131, 145) .setWaterAndFogColor(31, 167, 212) .setParticles(EndParticles.SMARAGDANT, 0.001F)); - + this.addFloorFeature(EndFeatures.SMARAGDANT_CRYSTAL, 1); this.addFloorFeature(EndFeatures.SMARAGDANT_CRYSTAL_SHARD, 20); - + this.addCeilFeature(EndFeatures.END_STONE_STALACTITE, 1); } - + @Override public float getFloorDensity() { return 0.1F; } - + @Override public float getCeilDensity() { return 0.1F; diff --git a/src/main/java/ru/betterend/world/biome/cave/EndCaveBiome.java b/src/main/java/ru/betterend/world/biome/cave/EndCaveBiome.java index 9f19ed15..27464e46 100644 --- a/src/main/java/ru/betterend/world/biome/cave/EndCaveBiome.java +++ b/src/main/java/ru/betterend/world/biome/cave/EndCaveBiome.java @@ -14,55 +14,53 @@ import ru.betterend.util.ShuffelingListExtended; import ru.betterend.world.biome.EndBiome; import ru.betterend.world.features.terrain.caves.CaveChunkPopulatorFeature; -import java.util.Random; - public class EndCaveBiome extends EndBiome { final private ShufflingList> floorFeatures = new ShufflingList<>(); final private ShufflingList> ceilFeatures = new ShufflingList<>(); - + public EndCaveBiome(BCLBiomeDef definition) { super(makeDef(definition)); } - + private static BCLBiomeDef makeDef(BCLBiomeDef definition) { BCLFeature feature = BCLFeature.makeChunkFeature( - BetterEnd.makeID(definition.getID().getPath() + "_cave_populator"), - new CaveChunkPopulatorFeature(() -> (EndCaveBiome) BiomeAPI.getBiome(definition.getID())) + BetterEnd.makeID(definition.getID().getPath() + "_cave_populator"), + new CaveChunkPopulatorFeature(() -> (EndCaveBiome) BiomeAPI.getBiome(definition.getID())) ); definition.setCategory(BiomeCategory.NONE).addFeature(feature); definition.setMusic(EndSounds.MUSIC_CAVES); definition.setLoop(EndSounds.AMBIENT_CAVES); return definition; } - + public void addFloorFeature(Feature feature, int weight) { floorFeatures.add(feature, weight); } - + public void addCeilFeature(Feature feature, int weight) { ceilFeatures.add(feature, weight); } - + public Feature getFloorFeature() { - return ((ShuffelingListExtended>)floorFeatures).isEmpty() ? null : ((ShuffelingListExtended>)floorFeatures).getOne(); + return ((ShuffelingListExtended>) floorFeatures).isEmpty() ? null : ((ShuffelingListExtended>) floorFeatures).getOne(); } - + public Feature getCeilFeature() { - return ((ShuffelingListExtended>)ceilFeatures).isEmpty() ? null : ((ShuffelingListExtended>)ceilFeatures).getOne(); + return ((ShuffelingListExtended>) ceilFeatures).isEmpty() ? null : ((ShuffelingListExtended>) ceilFeatures).getOne(); } - + public float getFloorDensity() { return 0; } - + public float getCeilDensity() { return 0; } - + public BlockState getCeil(BlockPos pos) { return null; } - + public BlockState getWall(BlockPos pos) { return null; } diff --git a/src/main/java/ru/betterend/world/biome/cave/JadeCaveBiome.java b/src/main/java/ru/betterend/world/biome/cave/JadeCaveBiome.java index 17c9b05e..19252607 100644 --- a/src/main/java/ru/betterend/world/biome/cave/JadeCaveBiome.java +++ b/src/main/java/ru/betterend/world/biome/cave/JadeCaveBiome.java @@ -12,18 +12,18 @@ public class JadeCaveBiome extends EndCaveBiome { private static final OpenSimplexNoise WALL_NOISE = new OpenSimplexNoise("jade_cave".hashCode()); private static final OpenSimplexNoise DEPTH_NOISE = new OpenSimplexNoise("depth_noise".hashCode()); private static final BlockState[] JADE = new BlockState[3]; - + public JadeCaveBiome() { super(new BCLBiomeDef(BetterEnd.makeID("jade_cave")) - .setFogColor(118, 150, 112) - .setFogDensity(2.0F) - .setWaterAndFogColor(95, 223, 255) + .setFogColor(118, 150, 112) + .setFogDensity(2.0F) + .setWaterAndFogColor(95, 223, 255) ); JADE[0] = EndBlocks.VIRID_JADESTONE.stone.defaultBlockState(); JADE[1] = EndBlocks.AZURE_JADESTONE.stone.defaultBlockState(); JADE[2] = EndBlocks.SANDY_JADESTONE.stone.defaultBlockState(); } - + @Override public BlockState getWall(BlockPos pos) { double depth = DEPTH_NOISE.eval(pos.getX() * 0.02, pos.getZ() * 0.02) * 0.2 + 0.5; diff --git a/src/main/java/ru/betterend/world/biome/cave/LushAuroraCaveBiome.java b/src/main/java/ru/betterend/world/biome/cave/LushAuroraCaveBiome.java index 0ac0206e..547d9ee2 100644 --- a/src/main/java/ru/betterend/world/biome/cave/LushAuroraCaveBiome.java +++ b/src/main/java/ru/betterend/world/biome/cave/LushAuroraCaveBiome.java @@ -18,29 +18,29 @@ public class LushAuroraCaveBiome extends EndCaveBiome { .setWaterAndFogColor(186, 77, 237) .setParticles(EndParticles.GLOWING_SPHERE, 0.001F) .setSurface(EndBlocks.CAVE_MOSS)); - + this.addFloorFeature(EndFeatures.BIG_AURORA_CRYSTAL, 1); this.addFloorFeature(EndFeatures.CAVE_BUSH, 5); this.addFloorFeature(EndFeatures.CAVE_GRASS, 40); this.addFloorFeature(EndFeatures.END_STONE_STALAGMITE_CAVEMOSS, 5); - + this.addCeilFeature(EndFeatures.CAVE_BUSH, 1); this.addCeilFeature(EndFeatures.CAVE_PUMPKIN, 1); this.addCeilFeature(EndFeatures.RUBINEA, 3); this.addCeilFeature(EndFeatures.MAGNULA, 1); this.addCeilFeature(EndFeatures.END_STONE_STALACTITE_CAVEMOSS, 10); } - + @Override public float getFloorDensity() { return 0.2F; } - + @Override public float getCeilDensity() { return 0.1F; } - + @Override public BlockState getCeil(BlockPos pos) { return EndBlocks.CAVE_MOSS.defaultBlockState().setValue(BlockProperties.TRIPLE_SHAPE, BlockProperties.TripleShape.TOP); diff --git a/src/main/java/ru/betterend/world/biome/cave/LushSmaragdantCaveBiome.java b/src/main/java/ru/betterend/world/biome/cave/LushSmaragdantCaveBiome.java index 814ad4a6..e91b4861 100644 --- a/src/main/java/ru/betterend/world/biome/cave/LushSmaragdantCaveBiome.java +++ b/src/main/java/ru/betterend/world/biome/cave/LushSmaragdantCaveBiome.java @@ -15,18 +15,18 @@ public class LushSmaragdantCaveBiome extends EndCaveBiome { .setWaterAndFogColor(31, 167, 212) .setParticles(EndParticles.SMARAGDANT, 0.001F) .setSurface(EndBlocks.CAVE_MOSS)); - + this.addFloorFeature(EndFeatures.SMARAGDANT_CRYSTAL, 1); this.addFloorFeature(EndFeatures.SMARAGDANT_CRYSTAL_SHARD, 20); - + this.addCeilFeature(EndFeatures.END_STONE_STALACTITE, 1); } - + @Override public float getFloorDensity() { return 0.1F; } - + @Override public float getCeilDensity() { return 0.1F; diff --git a/src/main/java/ru/betterend/world/features/BiomeIslandFeature.java b/src/main/java/ru/betterend/world/features/BiomeIslandFeature.java index d8e9f498..8c57392e 100644 --- a/src/main/java/ru/betterend/world/features/BiomeIslandFeature.java +++ b/src/main/java/ru/betterend/world/features/BiomeIslandFeature.java @@ -1,14 +1,11 @@ package ru.betterend.world.features; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.levelgen.surfacebuilders.SurfaceBuilderBaseConfiguration; @@ -38,7 +35,8 @@ public class BiomeIslandFeature extends DefaultFeature { BlockState topMaterial = surfaceConfig.getTopMaterial(); if (BlocksHelper.isFluid(topMaterial)) { topBlock = ((SurfaceBuilderBaseConfiguration) surfaceConfig).getUnderwaterMaterial(); - } else { + } + else { topBlock = topMaterial; } underBlock = surfaceConfig.getUnderMaterial(); diff --git a/src/main/java/ru/betterend/world/features/BlueVineFeature.java b/src/main/java/ru/betterend/world/features/BlueVineFeature.java index 568424a5..a5916fdd 100644 --- a/src/main/java/ru/betterend/world/features/BlueVineFeature.java +++ b/src/main/java/ru/betterend/world/features/BlueVineFeature.java @@ -1,7 +1,5 @@ package ru.betterend.world.features; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; import ru.bclib.util.BlocksHelper; @@ -9,9 +7,11 @@ import ru.bclib.util.MHelper; import ru.betterend.blocks.basis.EndPlantWithAgeBlock; import ru.betterend.registry.EndBlocks; +import java.util.Random; + public class BlueVineFeature extends ScatterFeature { private boolean small; - + public BlueVineFeature() { super(5); } diff --git a/src/main/java/ru/betterend/world/features/CavePumpkinFeature.java b/src/main/java/ru/betterend/world/features/CavePumpkinFeature.java index 945f427d..df2435d0 100644 --- a/src/main/java/ru/betterend/world/features/CavePumpkinFeature.java +++ b/src/main/java/ru/betterend/world/features/CavePumpkinFeature.java @@ -1,10 +1,7 @@ package ru.betterend.world.features; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; -import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.bclib.api.TagAPI; @@ -13,6 +10,8 @@ import ru.bclib.world.features.DefaultFeature; import ru.betterend.blocks.EndBlockProperties; import ru.betterend.registry.EndBlocks; +import java.util.Random; + public class CavePumpkinFeature extends DefaultFeature { @Override public boolean place(FeaturePlaceContext featureConfig) { diff --git a/src/main/java/ru/betterend/world/features/CharniaFeature.java b/src/main/java/ru/betterend/world/features/CharniaFeature.java index c8022a39..57636909 100644 --- a/src/main/java/ru/betterend/world/features/CharniaFeature.java +++ b/src/main/java/ru/betterend/world/features/CharniaFeature.java @@ -6,7 +6,7 @@ public class CharniaFeature extends UnderwaterPlantFeature { public CharniaFeature(Block plant) { super(plant, 6); } - + @Override protected int getChance() { return 3; diff --git a/src/main/java/ru/betterend/world/features/CrashedShipFeature.java b/src/main/java/ru/betterend/world/features/CrashedShipFeature.java index 097db624..248bbb9f 100644 --- a/src/main/java/ru/betterend/world/features/CrashedShipFeature.java +++ b/src/main/java/ru/betterend/world/features/CrashedShipFeature.java @@ -1,7 +1,5 @@ package ru.betterend.world.features; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.LevelReader; @@ -10,7 +8,6 @@ import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.Mirror; import net.minecraft.world.level.block.Rotation; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.levelgen.structure.BoundingBox; @@ -27,6 +24,8 @@ import ru.bclib.util.StructureHelper; import ru.bclib.world.features.NBTStructureFeature; import ru.betterend.util.BlockFixer; +import java.util.Random; + public class CrashedShipFeature extends NBTStructureFeature { private static final StructureProcessor REPLACER; private static final String STRUCTURE_PATH = "/data/minecraft/structures/end_city/ship.nbt"; @@ -117,8 +116,8 @@ public class CrashedShipFeature extends NBTStructureFeature { REPLACER = new StructureProcessor() { @Override public StructureBlockInfo processBlock(LevelReader worldView, BlockPos pos, BlockPos blockPos, - StructureBlockInfo structureBlockInfo, StructureBlockInfo structureBlockInfo2, - StructurePlaceSettings structurePlacementData) { + StructureBlockInfo structureBlockInfo, StructureBlockInfo structureBlockInfo2, + StructurePlaceSettings structurePlacementData) { BlockState state = structureBlockInfo2.state; if (state.is(Blocks.SPAWNER) || state.getMaterial().equals(Material.WOOL)) { return new StructureBlockInfo(structureBlockInfo2.pos, AIR, null); diff --git a/src/main/java/ru/betterend/world/features/DoublePlantFeature.java b/src/main/java/ru/betterend/world/features/DoublePlantFeature.java index f98b1beb..1a811cc9 100644 --- a/src/main/java/ru/betterend/world/features/DoublePlantFeature.java +++ b/src/main/java/ru/betterend/world/features/DoublePlantFeature.java @@ -1,7 +1,5 @@ package ru.betterend.world.features; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.Block; @@ -10,17 +8,19 @@ import ru.bclib.blocks.BaseDoublePlantBlock; import ru.bclib.util.BlocksHelper; import ru.bclib.util.MHelper; +import java.util.Random; + public class DoublePlantFeature extends ScatterFeature { private final Block smallPlant; private final Block largePlant; private Block plant; - + public DoublePlantFeature(Block smallPlant, Block largePlant, int radius) { super(radius); this.smallPlant = smallPlant; this.largePlant = largePlant; } - + @Override public boolean canGenerate(WorldGenLevel world, Random random, BlockPos center, BlockPos blockPos, float radius) { float d = MHelper.length(center.getX() - blockPos.getX(), center.getZ() - blockPos.getZ()) / radius * 0.6F + random.nextFloat() * 0.4F; diff --git a/src/main/java/ru/betterend/world/features/EndLilyFeature.java b/src/main/java/ru/betterend/world/features/EndLilyFeature.java index 4ecbd3cf..d505742a 100644 --- a/src/main/java/ru/betterend/world/features/EndLilyFeature.java +++ b/src/main/java/ru/betterend/world/features/EndLilyFeature.java @@ -1,12 +1,12 @@ package ru.betterend.world.features; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; import ru.betterend.blocks.EndLilySeedBlock; import ru.betterend.registry.EndBlocks; +import java.util.Random; + public class EndLilyFeature extends UnderwaterPlantScatter { public EndLilyFeature(int radius) { super(radius); @@ -17,7 +17,7 @@ public class EndLilyFeature extends UnderwaterPlantScatter { EndLilySeedBlock seed = (EndLilySeedBlock) EndBlocks.END_LILY_SEED; seed.grow(world, random, blockPos); } - + @Override protected int getChance() { return 15; diff --git a/src/main/java/ru/betterend/world/features/EndLotusFeature.java b/src/main/java/ru/betterend/world/features/EndLotusFeature.java index dc65d14a..b0d65d6a 100644 --- a/src/main/java/ru/betterend/world/features/EndLotusFeature.java +++ b/src/main/java/ru/betterend/world/features/EndLotusFeature.java @@ -1,12 +1,12 @@ package ru.betterend.world.features; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; import ru.betterend.blocks.EndLotusSeedBlock; import ru.betterend.registry.EndBlocks; +import java.util.Random; + public class EndLotusFeature extends UnderwaterPlantScatter { public EndLotusFeature(int radius) { super(radius); @@ -17,7 +17,7 @@ public class EndLotusFeature extends UnderwaterPlantScatter { EndLotusSeedBlock seed = (EndLotusSeedBlock) EndBlocks.END_LOTUS_SEED; seed.grow(world, random, blockPos); } - + @Override protected int getChance() { return 15; diff --git a/src/main/java/ru/betterend/world/features/EndLotusLeafFeature.java b/src/main/java/ru/betterend/world/features/EndLotusLeafFeature.java index e166e2b2..239d0648 100644 --- a/src/main/java/ru/betterend/world/features/EndLotusLeafFeature.java +++ b/src/main/java/ru/betterend/world/features/EndLotusLeafFeature.java @@ -1,7 +1,5 @@ package ru.betterend.world.features; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; @@ -13,6 +11,8 @@ import ru.bclib.util.BlocksHelper; import ru.betterend.blocks.EndLotusLeafBlock; import ru.betterend.registry.EndBlocks; +import java.util.Random; + public class EndLotusLeafFeature extends ScatterFeature { public EndLotusLeafFeature(int radius) { super(radius); @@ -24,41 +24,41 @@ public class EndLotusLeafFeature extends ScatterFeature { generateLeaf(world, blockPos); } } - + @Override protected int getChance() { return 15; } - + @Override protected BlockPos getCenterGround(WorldGenLevel world, BlockPos pos) { return getPosOnSurface(world, pos); } - + private void generateLeaf(WorldGenLevel world, BlockPos pos) { MutableBlockPos p = new MutableBlockPos(); BlockState leaf = EndBlocks.END_LOTUS_LEAF.defaultBlockState(); BlocksHelper.setWithoutUpdate(world, pos, leaf.setValue(EndLotusLeafBlock.SHAPE, TripleShape.BOTTOM)); - for (Direction move: BlocksHelper.HORIZONTAL) { + for (Direction move : BlocksHelper.HORIZONTAL) { BlocksHelper.setWithoutUpdate(world, p.set(pos).move(move), leaf.setValue(EndLotusLeafBlock.HORIZONTAL_FACING, move).setValue(EndLotusLeafBlock.SHAPE, TripleShape.MIDDLE)); } - for (int i = 0; i < 4; i ++) { + for (int i = 0; i < 4; i++) { Direction d1 = BlocksHelper.HORIZONTAL[i]; Direction d2 = BlocksHelper.HORIZONTAL[(i + 1) & 3]; BlocksHelper.setWithoutUpdate(world, p.set(pos).move(d1).move(d2), leaf.setValue(EndLotusLeafBlock.HORIZONTAL_FACING, d1).setValue(EndLotusLeafBlock.SHAPE, TripleShape.TOP)); } } - + private boolean canGenerate(WorldGenLevel world, BlockPos pos) { MutableBlockPos p = new MutableBlockPos(); p.setY(pos.getY()); int count = 0; - for (int x = -1; x < 2; x ++) { + for (int x = -1; x < 2; x++) { p.setX(pos.getX() + x); - for (int z = -1; z < 2; z ++) { + for (int z = -1; z < 2; z++) { p.setZ(pos.getZ() + z); if (world.isEmptyBlock(p) && world.getBlockState(p.below()).is(Blocks.WATER)) - count ++; + count++; } } return count == 9; diff --git a/src/main/java/ru/betterend/world/features/FilaluxFeature.java b/src/main/java/ru/betterend/world/features/FilaluxFeature.java index 32eee7fe..e3ac1ad8 100644 --- a/src/main/java/ru/betterend/world/features/FilaluxFeature.java +++ b/src/main/java/ru/betterend/world/features/FilaluxFeature.java @@ -1,7 +1,5 @@ package ru.betterend.world.features; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.WorldGenLevel; @@ -13,6 +11,8 @@ import ru.bclib.util.BlocksHelper; import ru.bclib.util.MHelper; import ru.betterend.registry.EndBlocks; +import java.util.Random; + public class FilaluxFeature extends SkyScatterFeature { public FilaluxFeature() { super(10); @@ -24,7 +24,7 @@ public class FilaluxFeature extends SkyScatterFeature { BlockState wings = EndBlocks.FILALUX_WINGS.defaultBlockState(); BlocksHelper.setWithoutUpdate(world, blockPos, EndBlocks.FILALUX_LANTERN); BlocksHelper.setWithoutUpdate(world, blockPos.above(), wings.setValue(BlockStateProperties.FACING, Direction.UP)); - for (Direction dir: BlocksHelper.HORIZONTAL) { + for (Direction dir : BlocksHelper.HORIZONTAL) { BlocksHelper.setWithoutUpdate(world, blockPos.relative(dir), wings.setValue(BlockStateProperties.FACING, dir)); } int length = MHelper.randRange(1, 3, random); diff --git a/src/main/java/ru/betterend/world/features/FullHeightScatterFeature.java b/src/main/java/ru/betterend/world/features/FullHeightScatterFeature.java index 9f506a10..02b4735f 100644 --- a/src/main/java/ru/betterend/world/features/FullHeightScatterFeature.java +++ b/src/main/java/ru/betterend/world/features/FullHeightScatterFeature.java @@ -1,11 +1,8 @@ package ru.betterend.world.features; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.world.level.WorldGenLevel; -import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.Heightmap; import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; @@ -13,6 +10,8 @@ import ru.bclib.util.BlocksHelper; import ru.bclib.util.MHelper; import ru.bclib.world.features.DefaultFeature; +import java.util.Random; + public abstract class FullHeightScatterFeature extends DefaultFeature { private static final MutableBlockPos POS = new MutableBlockPos(); private final int radius; @@ -22,7 +21,7 @@ public abstract class FullHeightScatterFeature extends DefaultFeature { } public abstract boolean canGenerate(WorldGenLevel world, Random random, BlockPos center, BlockPos blockPos, - float radius); + float radius); public abstract void generate(WorldGenLevel world, Random random, BlockPos blockPos); diff --git a/src/main/java/ru/betterend/world/features/GlowPillarFeature.java b/src/main/java/ru/betterend/world/features/GlowPillarFeature.java index b8a1d6f2..851ce83e 100644 --- a/src/main/java/ru/betterend/world/features/GlowPillarFeature.java +++ b/src/main/java/ru/betterend/world/features/GlowPillarFeature.java @@ -1,12 +1,12 @@ package ru.betterend.world.features; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; import ru.betterend.blocks.basis.EndPlantWithAgeBlock; import ru.betterend.registry.EndBlocks; +import java.util.Random; + public class GlowPillarFeature extends ScatterFeature { public GlowPillarFeature() { super(9); @@ -22,7 +22,7 @@ public class GlowPillarFeature extends ScatterFeature { EndPlantWithAgeBlock seed = ((EndPlantWithAgeBlock) EndBlocks.GLOWING_PILLAR_SEED); seed.growAdult(world, random, blockPos); } - + @Override protected int getChance() { return 10; diff --git a/src/main/java/ru/betterend/world/features/HydraluxFeature.java b/src/main/java/ru/betterend/world/features/HydraluxFeature.java index 73d6b4ec..fc92fc56 100644 --- a/src/main/java/ru/betterend/world/features/HydraluxFeature.java +++ b/src/main/java/ru/betterend/world/features/HydraluxFeature.java @@ -1,12 +1,12 @@ package ru.betterend.world.features; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; import ru.betterend.blocks.HydraluxSaplingBlock; import ru.betterend.registry.EndBlocks; +import java.util.Random; + public class HydraluxFeature extends UnderwaterPlantScatter { public HydraluxFeature(int radius) { super(radius); @@ -17,7 +17,7 @@ public class HydraluxFeature extends UnderwaterPlantScatter { HydraluxSaplingBlock seed = (HydraluxSaplingBlock) EndBlocks.HYDRALUX_SAPLING; seed.grow(world, random, blockPos); } - + @Override protected int getChance() { return 15; diff --git a/src/main/java/ru/betterend/world/features/InvertedScatterFeature.java b/src/main/java/ru/betterend/world/features/InvertedScatterFeature.java index 93362b72..cd847402 100644 --- a/src/main/java/ru/betterend/world/features/InvertedScatterFeature.java +++ b/src/main/java/ru/betterend/world/features/InvertedScatterFeature.java @@ -1,11 +1,8 @@ package ru.betterend.world.features; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.world.level.WorldGenLevel; -import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.Heightmap; import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; @@ -13,6 +10,8 @@ import ru.bclib.util.BlocksHelper; import ru.bclib.util.MHelper; import ru.bclib.world.features.DefaultFeature; +import java.util.Random; + public abstract class InvertedScatterFeature extends DefaultFeature { private static final MutableBlockPos POS = new MutableBlockPos(); private final int radius; @@ -22,7 +21,7 @@ public abstract class InvertedScatterFeature extends DefaultFeature { } public abstract boolean canGenerate(WorldGenLevel world, Random random, BlockPos center, BlockPos blockPos, - float radius); + float radius); public abstract void generate(WorldGenLevel world, Random random, BlockPos blockPos); diff --git a/src/main/java/ru/betterend/world/features/LanceleafFeature.java b/src/main/java/ru/betterend/world/features/LanceleafFeature.java index 5800a71f..d35a27c9 100644 --- a/src/main/java/ru/betterend/world/features/LanceleafFeature.java +++ b/src/main/java/ru/betterend/world/features/LanceleafFeature.java @@ -1,12 +1,12 @@ package ru.betterend.world.features; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; import ru.betterend.blocks.basis.EndPlantWithAgeBlock; import ru.betterend.registry.EndBlocks; +import java.util.Random; + public class LanceleafFeature extends ScatterFeature { public LanceleafFeature() { super(7); @@ -22,7 +22,7 @@ public class LanceleafFeature extends ScatterFeature { EndPlantWithAgeBlock seed = ((EndPlantWithAgeBlock) EndBlocks.LANCELEAF_SEED); seed.growAdult(world, random, blockPos); } - + @Override protected int getChance() { return 5; diff --git a/src/main/java/ru/betterend/world/features/MengerSpongeFeature.java b/src/main/java/ru/betterend/world/features/MengerSpongeFeature.java index d5f9c5fd..f79076b6 100644 --- a/src/main/java/ru/betterend/world/features/MengerSpongeFeature.java +++ b/src/main/java/ru/betterend/world/features/MengerSpongeFeature.java @@ -1,8 +1,5 @@ package ru.betterend.world.features; -import java.util.Random; -import java.util.function.Function; - import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.WorldGenLevel; @@ -10,9 +7,12 @@ import net.minecraft.world.level.block.state.BlockState; import ru.bclib.util.BlocksHelper; import ru.betterend.registry.EndBlocks; +import java.util.Random; +import java.util.function.Function; + public class MengerSpongeFeature extends UnderwaterPlantScatter { private static final Function REPLACE; - + public MengerSpongeFeature(int radius) { super(radius); } @@ -21,7 +21,7 @@ public class MengerSpongeFeature extends UnderwaterPlantScatter { public void generate(WorldGenLevel world, Random random, BlockPos blockPos) { BlocksHelper.setWithoutUpdate(world, blockPos, EndBlocks.MENGER_SPONGE_WET); if (random.nextBoolean()) { - for (Direction dir: BlocksHelper.DIRECTIONS) { + for (Direction dir : BlocksHelper.DIRECTIONS) { BlockPos pos = blockPos.relative(dir); if (REPLACE.apply(world.getBlockState(pos))) { BlocksHelper.setWithoutUpdate(world, pos, EndBlocks.MENGER_SPONGE_WET); @@ -29,7 +29,7 @@ public class MengerSpongeFeature extends UnderwaterPlantScatter { } } } - + static { REPLACE = (state) -> { if (state.is(EndBlocks.END_LOTUS_STEM)) { diff --git a/src/main/java/ru/betterend/world/features/NeonCactusFeature.java b/src/main/java/ru/betterend/world/features/NeonCactusFeature.java index ef31a912..02701406 100644 --- a/src/main/java/ru/betterend/world/features/NeonCactusFeature.java +++ b/src/main/java/ru/betterend/world/features/NeonCactusFeature.java @@ -1,17 +1,16 @@ package ru.betterend.world.features; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.bclib.world.features.DefaultFeature; import ru.betterend.blocks.NeonCactusPlantBlock; import ru.betterend.registry.EndBlocks; +import java.util.Random; + public class NeonCactusFeature extends DefaultFeature { @Override public boolean place(FeaturePlaceContext featureConfig) { @@ -22,7 +21,7 @@ public class NeonCactusFeature extends DefaultFeature { if (!ground.is(EndBlocks.ENDSTONE_DUST) && !ground.is(EndBlocks.END_MOSS)) { return false; } - + NeonCactusPlantBlock cactus = ((NeonCactusPlantBlock) EndBlocks.NEON_CACTUS); cactus.growPlant(world, pos, random); diff --git a/src/main/java/ru/betterend/world/features/ScatterFeature.java b/src/main/java/ru/betterend/world/features/ScatterFeature.java index 4ff0a207..fa0d7b3c 100644 --- a/src/main/java/ru/betterend/world/features/ScatterFeature.java +++ b/src/main/java/ru/betterend/world/features/ScatterFeature.java @@ -1,11 +1,8 @@ package ru.betterend.world.features; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.world.level.WorldGenLevel; -import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.bclib.api.TagAPI; @@ -13,6 +10,8 @@ import ru.bclib.util.BlocksHelper; import ru.bclib.util.MHelper; import ru.bclib.world.features.DefaultFeature; +import java.util.Random; + public abstract class ScatterFeature extends DefaultFeature { private static final MutableBlockPos POS = new MutableBlockPos(); private final int radius; @@ -22,7 +21,7 @@ public abstract class ScatterFeature extends DefaultFeature { } public abstract boolean canGenerate(WorldGenLevel world, Random random, BlockPos center, BlockPos blockPos, - float radius); + float radius); public abstract void generate(WorldGenLevel world, Random random, BlockPos blockPos); @@ -33,7 +32,8 @@ public abstract class ScatterFeature extends DefaultFeature { protected boolean canSpawn(WorldGenLevel world, BlockPos pos) { if (pos.getY() < 5) { return false; - } else if (!world.getBlockState(pos.below()).is(TagAPI.END_GROUND)) { + } + else if (!world.getBlockState(pos.below()).is(TagAPI.END_GROUND)) { return false; } return true; diff --git a/src/main/java/ru/betterend/world/features/SilkMothNestFeature.java b/src/main/java/ru/betterend/world/features/SilkMothNestFeature.java index a0e551c2..60a5ce6d 100644 --- a/src/main/java/ru/betterend/world/features/SilkMothNestFeature.java +++ b/src/main/java/ru/betterend/world/features/SilkMothNestFeature.java @@ -1,7 +1,5 @@ package ru.betterend.world.features; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; @@ -9,7 +7,6 @@ import net.minecraft.tags.BlockTags; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.BlockStateProperties; -import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.Heightmap; import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; @@ -18,6 +15,8 @@ import ru.bclib.util.BlocksHelper; import ru.bclib.world.features.DefaultFeature; import ru.betterend.registry.EndBlocks; +import java.util.Random; + public class SilkMothNestFeature extends DefaultFeature { private static final MutableBlockPos POS = new MutableBlockPos(); diff --git a/src/main/java/ru/betterend/world/features/SingleInvertedScatterFeature.java b/src/main/java/ru/betterend/world/features/SingleInvertedScatterFeature.java index 053f33c3..8b354840 100644 --- a/src/main/java/ru/betterend/world/features/SingleInvertedScatterFeature.java +++ b/src/main/java/ru/betterend/world/features/SingleInvertedScatterFeature.java @@ -1,7 +1,5 @@ package ru.betterend.world.features; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.WorldGenLevel; @@ -11,9 +9,11 @@ import net.minecraft.world.level.block.state.properties.BlockStateProperties; import ru.bclib.blocks.BaseAttachedBlock; import ru.bclib.util.BlocksHelper; +import java.util.Random; + public class SingleInvertedScatterFeature extends InvertedScatterFeature { private final Block block; - + public SingleInvertedScatterFeature(Block block, int radius) { super(radius); this.block = block; diff --git a/src/main/java/ru/betterend/world/features/SinglePlantFeature.java b/src/main/java/ru/betterend/world/features/SinglePlantFeature.java index b663c2dc..87106c37 100644 --- a/src/main/java/ru/betterend/world/features/SinglePlantFeature.java +++ b/src/main/java/ru/betterend/world/features/SinglePlantFeature.java @@ -1,7 +1,5 @@ package ru.betterend.world.features; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.Block; @@ -11,39 +9,41 @@ import ru.bclib.blocks.BaseDoublePlantBlock; import ru.bclib.util.BlocksHelper; import ru.betterend.blocks.basis.EndPlantWithAgeBlock; +import java.util.Random; + public class SinglePlantFeature extends ScatterFeature { private final Block plant; private final boolean rawHeightmap; private final int chance; - + public SinglePlantFeature(Block plant, int radius) { this(plant, radius, true, 1); } - + public SinglePlantFeature(Block plant, int radius, int chance) { this(plant, radius, true, chance); } - + public SinglePlantFeature(Block plant, int radius, boolean rawHeightmap) { this(plant, radius, rawHeightmap, 1); } - + public SinglePlantFeature(Block plant, int radius, boolean rawHeightmap, int chance) { super(radius); this.plant = plant; this.rawHeightmap = rawHeightmap; this.chance = chance; } - + protected int getChance() { return chance; } - + @Override protected BlockPos getCenterGround(WorldGenLevel world, BlockPos pos) { return rawHeightmap ? getPosOnSurfaceWG(world, pos) : getPosOnSurface(world, pos); } - + @Override public boolean canGenerate(WorldGenLevel world, Random random, BlockPos center, BlockPos blockPos, float radius) { return plant.canSurvive(plant.defaultBlockState(), world, blockPos); diff --git a/src/main/java/ru/betterend/world/features/SkyScatterFeature.java b/src/main/java/ru/betterend/world/features/SkyScatterFeature.java index d14dbd3a..60da3899 100644 --- a/src/main/java/ru/betterend/world/features/SkyScatterFeature.java +++ b/src/main/java/ru/betterend/world/features/SkyScatterFeature.java @@ -1,7 +1,5 @@ package ru.betterend.world.features; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; @@ -9,11 +7,13 @@ import net.minecraft.world.level.WorldGenLevel; import ru.bclib.util.BlocksHelper; import ru.bclib.util.MHelper; +import java.util.Random; + public abstract class SkyScatterFeature extends ScatterFeature { public SkyScatterFeature(int radius) { super(radius); } - + @Override protected int getChance() { return 10; @@ -24,29 +24,29 @@ public abstract class SkyScatterFeature extends ScatterFeature { if (!world.isEmptyBlock(blockPos)) { return false; } - - for (Direction dir: BlocksHelper.HORIZONTAL) { + + for (Direction dir : BlocksHelper.HORIZONTAL) { if (!world.isEmptyBlock(blockPos.relative(dir))) { return false; } } - + int maxD = getYOffset() + 2; int maxV = getYOffset() - 2; - + return BlocksHelper.upRay(world, blockPos, maxD) > maxV && BlocksHelper.downRay(world, blockPos, maxD) > maxV; } - + @Override protected boolean canSpawn(WorldGenLevel world, BlockPos pos) { return true; } - + @Override protected BlockPos getCenterGround(WorldGenLevel world, BlockPos pos) { return new BlockPos(pos.getX(), MHelper.randRange(32, 192, world.getRandom()), pos.getZ()); } - + protected boolean getGroundPlant(WorldGenLevel world, MutableBlockPos pos) { pos.setY(pos.getY() + MHelper.randRange(-getYOffset(), getYOffset(), world.getRandom())); return true; diff --git a/src/main/java/ru/betterend/world/features/UnderwaterPlantFeature.java b/src/main/java/ru/betterend/world/features/UnderwaterPlantFeature.java index a31a36dd..1da85b42 100644 --- a/src/main/java/ru/betterend/world/features/UnderwaterPlantFeature.java +++ b/src/main/java/ru/betterend/world/features/UnderwaterPlantFeature.java @@ -1,7 +1,5 @@ package ru.betterend.world.features; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.Block; @@ -9,14 +7,16 @@ import net.minecraft.world.level.block.state.BlockState; import ru.bclib.blocks.BaseDoublePlantBlock; import ru.bclib.util.BlocksHelper; +import java.util.Random; + public class UnderwaterPlantFeature extends UnderwaterPlantScatter { private final Block plant; - + public UnderwaterPlantFeature(Block plant, int radius) { super(radius); this.plant = plant; } - + @Override public boolean canGenerate(WorldGenLevel world, Random random, BlockPos center, BlockPos blockPos, float radius) { return super.canSpawn(world, blockPos) && plant.canSurvive(plant.defaultBlockState(), world, blockPos); diff --git a/src/main/java/ru/betterend/world/features/UnderwaterPlantScatter.java b/src/main/java/ru/betterend/world/features/UnderwaterPlantScatter.java index c97f15df..6fac8d50 100644 --- a/src/main/java/ru/betterend/world/features/UnderwaterPlantScatter.java +++ b/src/main/java/ru/betterend/world/features/UnderwaterPlantScatter.java @@ -1,19 +1,19 @@ package ru.betterend.world.features; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.Blocks; +import java.util.Random; + public abstract class UnderwaterPlantScatter extends ScatterFeature { private static final MutableBlockPos POS = new MutableBlockPos(); - + public UnderwaterPlantScatter(int radius) { super(radius); } - + @Override protected BlockPos getCenterGround(WorldGenLevel world, BlockPos pos) { POS.setX(pos.getX()); @@ -21,32 +21,32 @@ public abstract class UnderwaterPlantScatter extends ScatterFeature { POS.setY(0); return getGround(world, POS).immutable(); } - + @Override public boolean canGenerate(WorldGenLevel world, Random random, BlockPos center, BlockPos blockPos, float radius) { return world.getBlockState(blockPos).is(Blocks.WATER); } - + @Override protected boolean canSpawn(WorldGenLevel world, BlockPos pos) { return world.getBlockState(pos).is(Blocks.WATER); } - + @Override protected boolean getGroundPlant(WorldGenLevel world, MutableBlockPos pos) { return getGround(world, pos).getY() < 128; } - + @Override protected int getYOffset() { return -5; } - + @Override protected int getChance() { return 5; } - + private BlockPos getGround(WorldGenLevel world, MutableBlockPos pos) { while (pos.getY() < 128 && world.getFluidState(pos).isEmpty()) { pos.setY(pos.getY() + 1); diff --git a/src/main/java/ru/betterend/world/features/VineFeature.java b/src/main/java/ru/betterend/world/features/VineFeature.java index 1d2d083f..7e5beb3d 100644 --- a/src/main/java/ru/betterend/world/features/VineFeature.java +++ b/src/main/java/ru/betterend/world/features/VineFeature.java @@ -1,7 +1,5 @@ package ru.betterend.world.features; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.Block; @@ -11,11 +9,13 @@ import ru.bclib.blocks.BlockProperties; import ru.bclib.blocks.BlockProperties.TripleShape; import ru.bclib.util.BlocksHelper; +import java.util.Random; + public class VineFeature extends InvertedScatterFeature { private final Block vineBlock; private final int maxLength; private final boolean vine; - + public VineFeature(Block vineBlock, int maxLength) { super(6); this.vineBlock = vineBlock; @@ -43,7 +43,7 @@ public class VineFeature extends InvertedScatterFeature { BlocksHelper.setWithoutUpdate(world, blockPos.below(h), bottom); } } - + private boolean canPlaceBlock(BlockState state, WorldGenLevel world, BlockPos blockPos) { if (vine) { return ((BaseVineBlock) vineBlock).canGenerate(state, world, blockPos); @@ -52,17 +52,17 @@ public class VineFeature extends InvertedScatterFeature { return vineBlock.canSurvive(state, world, blockPos); } } - + private BlockState getTopState() { BlockState state = vineBlock.defaultBlockState(); return vine ? state.setValue(BlockProperties.TRIPLE_SHAPE, TripleShape.TOP) : state; } - + private BlockState getMiggleState() { BlockState state = vineBlock.defaultBlockState(); return vine ? state.setValue(BlockProperties.TRIPLE_SHAPE, TripleShape.MIDDLE) : state; } - + private BlockState getBottomState() { BlockState state = vineBlock.defaultBlockState(); return vine ? state.setValue(BlockProperties.TRIPLE_SHAPE, TripleShape.BOTTOM) : state; diff --git a/src/main/java/ru/betterend/world/features/WallPlantFeature.java b/src/main/java/ru/betterend/world/features/WallPlantFeature.java index b218a663..0e219ee1 100644 --- a/src/main/java/ru/betterend/world/features/WallPlantFeature.java +++ b/src/main/java/ru/betterend/world/features/WallPlantFeature.java @@ -1,7 +1,5 @@ package ru.betterend.world.features; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.WorldGenLevel; @@ -12,9 +10,11 @@ import ru.bclib.blocks.BaseAttachedBlock; import ru.bclib.blocks.BaseWallPlantBlock; import ru.bclib.util.BlocksHelper; +import java.util.Random; + public class WallPlantFeature extends WallScatterFeature { private final Block block; - + public WallPlantFeature(Block block, int radius) { super(radius); this.block = block; diff --git a/src/main/java/ru/betterend/world/features/WallPlantOnLogFeature.java b/src/main/java/ru/betterend/world/features/WallPlantOnLogFeature.java index 7ca5cb1e..a8b4f6e0 100644 --- a/src/main/java/ru/betterend/world/features/WallPlantOnLogFeature.java +++ b/src/main/java/ru/betterend/world/features/WallPlantOnLogFeature.java @@ -1,7 +1,5 @@ package ru.betterend.world.features; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.tags.BlockTags; @@ -9,6 +7,8 @@ import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; +import java.util.Random; + public class WallPlantOnLogFeature extends WallPlantFeature { public WallPlantOnLogFeature(Block block, int radius) { super(block, radius); diff --git a/src/main/java/ru/betterend/world/features/WallScatterFeature.java b/src/main/java/ru/betterend/world/features/WallScatterFeature.java index c73fb652..951af5ba 100644 --- a/src/main/java/ru/betterend/world/features/WallScatterFeature.java +++ b/src/main/java/ru/betterend/world/features/WallScatterFeature.java @@ -1,12 +1,9 @@ package ru.betterend.world.features; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.WorldGenLevel; -import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.Heightmap; import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; @@ -14,6 +11,8 @@ import ru.bclib.util.BlocksHelper; import ru.bclib.util.MHelper; import ru.bclib.world.features.DefaultFeature; +import java.util.Random; + public abstract class WallScatterFeature extends DefaultFeature { private static final Direction[] DIR = BlocksHelper.makeHorizontal(); private final int radius; diff --git a/src/main/java/ru/betterend/world/features/bushes/BushFeature.java b/src/main/java/ru/betterend/world/features/bushes/BushFeature.java index 92611c31..a97c5d2f 100644 --- a/src/main/java/ru/betterend/world/features/bushes/BushFeature.java +++ b/src/main/java/ru/betterend/world/features/bushes/BushFeature.java @@ -1,15 +1,11 @@ package ru.betterend.world.features.bushes; -import java.util.Random; -import java.util.function.Function; - import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.LeavesBlock; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; @@ -25,6 +21,9 @@ import ru.bclib.util.MHelper; import ru.bclib.world.features.DefaultFeature; import ru.betterend.noise.OpenSimplexNoise; +import java.util.Random; +import java.util.function.Function; + public class BushFeature extends DefaultFeature { private static final Function REPLACE; private final Block leaves; @@ -62,7 +61,8 @@ public class BushFeature extends DefaultFeature { int distance = info.getPos().distManhattan(pos); if (distance < 7) { return info.getState().setValue(LeavesBlock.DISTANCE, distance); - } else { + } + else { return AIR; } } @@ -76,7 +76,8 @@ public class BushFeature extends DefaultFeature { if (leaves instanceof LeavesBlock) { BlocksHelper.setWithoutUpdate(world, p, leaves.defaultBlockState().setValue(LeavesBlock.DISTANCE, 1)); - } else { + } + else { BlocksHelper.setWithoutUpdate(world, p, leaves.defaultBlockState()); } } diff --git a/src/main/java/ru/betterend/world/features/bushes/BushWithOuterFeature.java b/src/main/java/ru/betterend/world/features/bushes/BushWithOuterFeature.java index e50fdee5..2c840d9b 100644 --- a/src/main/java/ru/betterend/world/features/bushes/BushWithOuterFeature.java +++ b/src/main/java/ru/betterend/world/features/bushes/BushWithOuterFeature.java @@ -1,8 +1,5 @@ package ru.betterend.world.features.bushes; -import java.util.Random; -import java.util.function.Function; - import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.WorldGenLevel; @@ -10,7 +7,6 @@ import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.LeavesBlock; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.BlockStateProperties; -import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; @@ -26,6 +22,9 @@ import ru.bclib.util.MHelper; import ru.bclib.world.features.DefaultFeature; import ru.betterend.noise.OpenSimplexNoise; +import java.util.Random; +import java.util.function.Function; + public class BushWithOuterFeature extends DefaultFeature { private static final Direction[] DIRECTIONS = Direction.values(); private static final Function REPLACE; @@ -66,7 +65,8 @@ public class BushWithOuterFeature extends DefaultFeature { int distance = info.getPos().distManhattan(pos); if (distance < 7) { return info.getState().setValue(LeavesBlock.DISTANCE, distance); - } else { + } + else { return AIR; } } @@ -91,7 +91,8 @@ public class BushWithOuterFeature extends DefaultFeature { if (leaves instanceof LeavesBlock) { BlocksHelper.setWithoutUpdate(world, p, leaves.defaultBlockState().setValue(LeavesBlock.DISTANCE, 1)); - } else { + } + else { BlocksHelper.setWithoutUpdate(world, p, leaves.defaultBlockState()); } } diff --git a/src/main/java/ru/betterend/world/features/bushes/LargeAmaranitaFeature.java b/src/main/java/ru/betterend/world/features/bushes/LargeAmaranitaFeature.java index 1d75c1d8..cef4abcf 100644 --- a/src/main/java/ru/betterend/world/features/bushes/LargeAmaranitaFeature.java +++ b/src/main/java/ru/betterend/world/features/bushes/LargeAmaranitaFeature.java @@ -1,13 +1,10 @@ package ru.betterend.world.features.bushes; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.bclib.api.TagAPI; @@ -18,6 +15,8 @@ import ru.bclib.util.MHelper; import ru.bclib.world.features.DefaultFeature; import ru.betterend.registry.EndBlocks; +import java.util.Random; + public class LargeAmaranitaFeature extends DefaultFeature { @Override public boolean place(FeaturePlaceContext featureConfig) { diff --git a/src/main/java/ru/betterend/world/features/bushes/Lumecorn.java b/src/main/java/ru/betterend/world/features/bushes/Lumecorn.java index e513327f..2f4aab60 100644 --- a/src/main/java/ru/betterend/world/features/bushes/Lumecorn.java +++ b/src/main/java/ru/betterend/world/features/bushes/Lumecorn.java @@ -1,13 +1,10 @@ package ru.betterend.world.features.bushes; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.bclib.api.TagAPI; @@ -18,6 +15,8 @@ import ru.betterend.blocks.EndBlockProperties.LumecornShape; import ru.betterend.blocks.LumecornBlock; import ru.betterend.registry.EndBlocks; +import java.util.Random; + public class Lumecorn extends DefaultFeature { @Override public boolean place(FeaturePlaceContext featureConfig) { @@ -54,7 +53,8 @@ public class Lumecorn extends DefaultFeature { if (random.nextBoolean()) { BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.LUMECORN.defaultBlockState().setValue(LumecornBlock.SHAPE, LumecornShape.BOTTOM_SMALL)); - } else { + } + else { BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.LUMECORN.defaultBlockState().setValue(LumecornBlock.SHAPE, LumecornShape.BOTTOM_BIG)); BlocksHelper.setWithoutUpdate(world, mut.move(Direction.UP), diff --git a/src/main/java/ru/betterend/world/features/bushes/TenaneaBushFeature.java b/src/main/java/ru/betterend/world/features/bushes/TenaneaBushFeature.java index 5487d04e..9b1bb218 100644 --- a/src/main/java/ru/betterend/world/features/bushes/TenaneaBushFeature.java +++ b/src/main/java/ru/betterend/world/features/bushes/TenaneaBushFeature.java @@ -1,18 +1,12 @@ package ru.betterend.world.features.bushes; -import java.util.List; -import java.util.Random; -import java.util.function.Function; - import com.google.common.collect.Lists; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.LeavesBlock; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; @@ -32,6 +26,10 @@ import ru.betterend.blocks.basis.FurBlock; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; +import java.util.List; +import java.util.Random; +import java.util.function.Function; + public class TenaneaBushFeature extends DefaultFeature { private static final Function REPLACE; private static final Direction[] DIRECTIONS = Direction.values(); @@ -78,7 +76,8 @@ public class TenaneaBushFeature extends DefaultFeature { } return info.getState().setValue(LeavesBlock.DISTANCE, distance); - } else { + } + else { return AIR; } } @@ -112,7 +111,8 @@ public class TenaneaBushFeature extends DefaultFeature { mut.setY(mut.getY() - 1); if (world.isEmptyBlock(mut.below())) { BlocksHelper.setWithoutUpdate(world, mut, middle); - } else { + } + else { break; } } diff --git a/src/main/java/ru/betterend/world/features/terrain/BigAuroraCrystalFeature.java b/src/main/java/ru/betterend/world/features/terrain/BigAuroraCrystalFeature.java index 8e9ed62a..87385f7a 100644 --- a/src/main/java/ru/betterend/world/features/terrain/BigAuroraCrystalFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/BigAuroraCrystalFeature.java @@ -1,12 +1,8 @@ package ru.betterend.world.features.terrain; -import java.util.Random; - import com.mojang.math.Vector3f; - import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; -import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; @@ -19,6 +15,8 @@ import ru.bclib.util.MHelper; import ru.bclib.world.features.DefaultFeature; import ru.betterend.registry.EndBlocks; +import java.util.Random; + public class BigAuroraCrystalFeature extends DefaultFeature { @Override public boolean place(FeaturePlaceContext featureConfig) { diff --git a/src/main/java/ru/betterend/world/features/terrain/DesertLakeFeature.java b/src/main/java/ru/betterend/world/features/terrain/DesertLakeFeature.java index b843d16d..c4e889a7 100644 --- a/src/main/java/ru/betterend/world/features/terrain/DesertLakeFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/DesertLakeFeature.java @@ -1,13 +1,10 @@ package ru.betterend.world.features.terrain; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.FluidState; @@ -20,6 +17,8 @@ import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; import ru.betterend.util.BlockFixer; +import java.util.Random; + public class DesertLakeFeature extends DefaultFeature { private static final BlockState END_STONE = Blocks.END_STONE.defaultBlockState(); private static final OpenSimplexNoise NOISE = new OpenSimplexNoise(15152); diff --git a/src/main/java/ru/betterend/world/features/terrain/FallenPillarFeature.java b/src/main/java/ru/betterend/world/features/terrain/FallenPillarFeature.java index 8e387bfe..532a158f 100644 --- a/src/main/java/ru/betterend/world/features/terrain/FallenPillarFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/FallenPillarFeature.java @@ -1,14 +1,10 @@ package ru.betterend.world.features.terrain; -import java.util.Random; - import com.mojang.math.Vector3f; - import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; @@ -23,6 +19,8 @@ import ru.bclib.world.features.DefaultFeature; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; +import java.util.Random; + public class FallenPillarFeature extends DefaultFeature { @Override public boolean place(FeaturePlaceContext featureConfig) { diff --git a/src/main/java/ru/betterend/world/features/terrain/FloatingSpireFeature.java b/src/main/java/ru/betterend/world/features/terrain/FloatingSpireFeature.java index 00bae11b..c0734595 100644 --- a/src/main/java/ru/betterend/world/features/terrain/FloatingSpireFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/FloatingSpireFeature.java @@ -1,10 +1,6 @@ package ru.betterend.world.features.terrain; -import java.util.List; -import java.util.Random; - import com.google.common.collect.Lists; - import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.WorldGenLevel; @@ -21,6 +17,9 @@ import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBiomes; import ru.betterend.registry.EndFeatures; +import java.util.List; +import java.util.Random; + public class FloatingSpireFeature extends SpireFeature { @Override public boolean place(FeaturePlaceContext featureConfig) { @@ -58,7 +57,8 @@ public class FloatingSpireFeature extends SpireFeature { support.add(info.getPos().above()); } return world.getBiome(info.getPos()).getGenerationSettings().getSurfaceBuilderConfig().getTopMaterial(); - } else if (info.getState(Direction.UP, 3).isAir()) { + } + else if (info.getState(Direction.UP, 3).isAir()) { return world.getBiome(info.getPos()).getGenerationSettings().getSurfaceBuilderConfig() .getUnderMaterial(); } diff --git a/src/main/java/ru/betterend/world/features/terrain/GeyserFeature.java b/src/main/java/ru/betterend/world/features/terrain/GeyserFeature.java index ad7fbb3e..596b71b1 100644 --- a/src/main/java/ru/betterend/world/features/terrain/GeyserFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/GeyserFeature.java @@ -1,10 +1,6 @@ package ru.betterend.world.features.terrain; -import java.util.Random; -import java.util.function.Function; - import com.mojang.math.Vector3f; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; @@ -41,6 +37,9 @@ import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; import ru.betterend.util.BlockFixer; +import java.util.Random; +import java.util.function.Function; + public class GeyserFeature extends DefaultFeature { protected static final Function REPLACE1; protected static final Function REPLACE2; diff --git a/src/main/java/ru/betterend/world/features/terrain/IceStarFeature.java b/src/main/java/ru/betterend/world/features/terrain/IceStarFeature.java index 565b862e..c7f5e69c 100644 --- a/src/main/java/ru/betterend/world/features/terrain/IceStarFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/IceStarFeature.java @@ -1,15 +1,9 @@ package ru.betterend.world.features.terrain; -import java.util.ArrayList; -import java.util.List; -import java.util.Random; - import com.mojang.math.Vector3f; - import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.bclib.sdf.SDF; @@ -21,6 +15,10 @@ import ru.bclib.util.MHelper; import ru.bclib.world.features.DefaultFeature; import ru.betterend.registry.EndBlocks; +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + public class IceStarFeature extends DefaultFeature { private final float minSize; private final float maxSize; @@ -53,7 +51,8 @@ public class IceStarFeature extends DefaultFeature { if (angle > 0.01F && angle < 3.14F) { Vector3f axis = MHelper.normalize(MHelper.cross(Vector3f.YP, point)); rotated = new SDFRotation().setRotation(axis, angle).setSource(spike); - } else if (angle > 1) { + } + else if (angle > 1) { rotated = new SDFRotation().setRotation(Vector3f.YP, (float) Math.PI).setSource(spike); } sdf = (sdf == null) ? rotated : new SDFUnion().setSourceA(sdf).setSourceB(rotated); @@ -83,9 +82,11 @@ public class IceStarFeature extends DefaultFeature { + random.nextFloat() * randScale; if (distance < ancientRadius) { return ancient; - } else if (distance < denseRadius) { + } + else if (distance < denseRadius) { return dense; - } else if (distance < iceRadius) { + } + else if (distance < iceRadius) { return ice; } return info.getState(); diff --git a/src/main/java/ru/betterend/world/features/terrain/ObsidianBoulderFeature.java b/src/main/java/ru/betterend/world/features/terrain/ObsidianBoulderFeature.java index 0616e35e..1b5e85bd 100644 --- a/src/main/java/ru/betterend/world/features/terrain/ObsidianBoulderFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/ObsidianBoulderFeature.java @@ -1,12 +1,9 @@ package ru.betterend.world.features.terrain; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; @@ -20,6 +17,8 @@ import ru.bclib.world.features.DefaultFeature; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; +import java.util.Random; + public class ObsidianBoulderFeature extends DefaultFeature { @Override public boolean place(FeaturePlaceContext featureConfig) { diff --git a/src/main/java/ru/betterend/world/features/terrain/OreLayerFeature.java b/src/main/java/ru/betterend/world/features/terrain/OreLayerFeature.java index b045ce0e..d47fbc44 100644 --- a/src/main/java/ru/betterend/world/features/terrain/OreLayerFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/OreLayerFeature.java @@ -1,12 +1,9 @@ package ru.betterend.world.features.terrain; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.bclib.sdf.SDF; @@ -17,6 +14,8 @@ import ru.bclib.util.MHelper; import ru.bclib.world.features.DefaultFeature; import ru.betterend.noise.OpenSimplexNoise; +import java.util.Random; + public class OreLayerFeature extends DefaultFeature { private static final SDFSphere SPHERE; private static final SDFCoordModify NOISE; diff --git a/src/main/java/ru/betterend/world/features/terrain/SingleBlockFeature.java b/src/main/java/ru/betterend/world/features/terrain/SingleBlockFeature.java index b652985d..e7bcd5b0 100644 --- a/src/main/java/ru/betterend/world/features/terrain/SingleBlockFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/SingleBlockFeature.java @@ -1,19 +1,18 @@ package ru.betterend.world.features.terrain; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.BlockStateProperties; -import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.bclib.api.TagAPI; import ru.bclib.util.BlocksHelper; import ru.bclib.world.features.DefaultFeature; +import java.util.Random; + public class SingleBlockFeature extends DefaultFeature { private final Block block; diff --git a/src/main/java/ru/betterend/world/features/terrain/SmaragdantCrystalFeature.java b/src/main/java/ru/betterend/world/features/terrain/SmaragdantCrystalFeature.java index f63d9c19..1dcf48bd 100644 --- a/src/main/java/ru/betterend/world/features/terrain/SmaragdantCrystalFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/SmaragdantCrystalFeature.java @@ -1,13 +1,10 @@ package ru.betterend.world.features.terrain; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.BlockStateProperties; -import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.bclib.api.TagAPI; @@ -16,6 +13,8 @@ import ru.bclib.util.MHelper; import ru.bclib.world.features.DefaultFeature; import ru.betterend.registry.EndBlocks; +import java.util.Random; + public class SmaragdantCrystalFeature extends DefaultFeature { @Override public boolean place(FeaturePlaceContext featureConfig) { diff --git a/src/main/java/ru/betterend/world/features/terrain/SpireFeature.java b/src/main/java/ru/betterend/world/features/terrain/SpireFeature.java index 4b92b35d..e96165eb 100644 --- a/src/main/java/ru/betterend/world/features/terrain/SpireFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/SpireFeature.java @@ -1,11 +1,6 @@ package ru.betterend.world.features.terrain; -import java.util.List; -import java.util.Random; -import java.util.function.Function; - import com.google.common.collect.Lists; - import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.WorldGenLevel; @@ -29,6 +24,10 @@ import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBiomes; import ru.betterend.registry.EndFeatures; +import java.util.List; +import java.util.Random; +import java.util.function.Function; + public class SpireFeature extends DefaultFeature { protected static final Function REPLACE; @@ -63,7 +62,8 @@ public class SpireFeature extends DefaultFeature { support.add(info.getPos().above()); } return world.getBiome(info.getPos()).getGenerationSettings().getSurfaceBuilderConfig().getTopMaterial(); - } else if (info.getState(Direction.UP, 3).isAir()) { + } + else if (info.getState(Direction.UP, 3).isAir()) { return world.getBiome(info.getPos()).getGenerationSettings().getSurfaceBuilderConfig() .getUnderMaterial(); } diff --git a/src/main/java/ru/betterend/world/features/terrain/StalactiteFeature.java b/src/main/java/ru/betterend/world/features/terrain/StalactiteFeature.java index bf018b8b..19979332 100644 --- a/src/main/java/ru/betterend/world/features/terrain/StalactiteFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/StalactiteFeature.java @@ -1,7 +1,5 @@ package ru.betterend.world.features.terrain; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.util.Mth; @@ -9,7 +7,6 @@ import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.BlockStateProperties; -import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.bclib.api.TagAPI; @@ -17,6 +14,8 @@ import ru.bclib.blocks.StalactiteBlock; import ru.bclib.util.BlocksHelper; import ru.bclib.world.features.DefaultFeature; +import java.util.Random; + public class StalactiteFeature extends DefaultFeature { private final boolean ceiling; private final Block[] ground; diff --git a/src/main/java/ru/betterend/world/features/terrain/SulphurHillFeature.java b/src/main/java/ru/betterend/world/features/terrain/SulphurHillFeature.java index d81440eb..53266cbc 100644 --- a/src/main/java/ru/betterend/world/features/terrain/SulphurHillFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/SulphurHillFeature.java @@ -1,14 +1,11 @@ package ru.betterend.world.features.terrain; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.bclib.blocks.BlockProperties; @@ -18,6 +15,8 @@ import ru.bclib.world.features.DefaultFeature; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; +import java.util.Random; + public class SulphurHillFeature extends DefaultFeature { @Override public boolean place(FeaturePlaceContext featureConfig) { @@ -80,7 +79,8 @@ public class SulphurHillFeature extends DefaultFeature { BlocksHelper.setWithoutUpdate(world, mut, rock); mut.move(Direction.DOWN); } - } else if (d < r1 * r1) { + } + else if (d < r1 * r1) { BlocksHelper.setWithoutUpdate(world, mut, brimstone); mut.move(Direction.DOWN); state = world.getBlockState(mut); diff --git a/src/main/java/ru/betterend/world/features/terrain/SulphuricCaveFeature.java b/src/main/java/ru/betterend/world/features/terrain/SulphuricCaveFeature.java index 365c89c8..214441cc 100644 --- a/src/main/java/ru/betterend/world/features/terrain/SulphuricCaveFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/SulphuricCaveFeature.java @@ -1,10 +1,6 @@ package ru.betterend.world.features.terrain; -import java.util.Random; -import java.util.Set; - import com.google.common.collect.Sets; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; @@ -12,7 +8,6 @@ import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.HorizontalDirectionalBlock; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.Heightmap; import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; @@ -27,6 +22,9 @@ import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; import ru.betterend.util.BlockFixer; +import java.util.Random; +import java.util.Set; + public class SulphuricCaveFeature extends DefaultFeature { private static final BlockState CAVE_AIR = Blocks.CAVE_AIR.defaultBlockState(); private static final BlockState WATER = Blocks.WATER.defaultBlockState(); @@ -104,14 +102,16 @@ public class SulphuricCaveFeature extends DefaultFeature { if (isReplaceable(state)) { BlocksHelper.setWithoutUpdate(world, mut, y < waterLevel ? WATER : CAVE_AIR); } - } else if (dist < r2 * r2) { + } + else if (dist < r2 * r2) { state = world.getBlockState(mut); if (state.is(TagAPI.GEN_TERRAIN) || state.is(Blocks.AIR)) { double v = noise.eval(x * 0.1, y * 0.1, z * 0.1) + noise.eval(x * 0.03, y * 0.03, z * 0.03) * 0.5; if (v > 0.4) { brimstone.add(mut.immutable()); - } else { + } + else { BlocksHelper.setWithoutUpdate(world, mut, rock); } } diff --git a/src/main/java/ru/betterend/world/features/terrain/SulphuricLakeFeature.java b/src/main/java/ru/betterend/world/features/terrain/SulphuricLakeFeature.java index 7e3ba1b0..2e81d139 100644 --- a/src/main/java/ru/betterend/world/features/terrain/SulphuricLakeFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/SulphuricLakeFeature.java @@ -71,7 +71,8 @@ public class SulphuricLakeFeature extends DefaultFeature { brimstone.add(POS.below(2)); } } - } else { + } + else { if (!isAbsoluteBorder(world, POS)) { BlocksHelper.setWithoutUpdate(world, POS, Blocks.WATER); world.getLiquidTicks().scheduleTick(POS, Fluids.WATER, 0); @@ -82,14 +83,16 @@ public class SulphuricLakeFeature extends DefaultFeature { brimstone.add(POS.below(3)); } } - } else { + } + else { brimstone.add(POS.immutable()); if (random.nextBoolean()) { brimstone.add(POS.below()); } } } - } else { + } + else { BlocksHelper.setWithoutUpdate(world, POS, Blocks.WATER); brimstone.remove(POS); for (Direction dir : BlocksHelper.HORIZONTAL) { @@ -117,7 +120,8 @@ public class SulphuricLakeFeature extends DefaultFeature { } } } - } else if (dist < r2) { + } + else if (dist < r2) { POS.setY(getYOnSurface(world, x, z) - 1); if (world.getBlockState(POS).is(TagAPI.GEN_TERRAIN)) { brimstone.add(POS.immutable()); diff --git a/src/main/java/ru/betterend/world/features/terrain/caves/CaveChunkPopulatorFeature.java b/src/main/java/ru/betterend/world/features/terrain/caves/CaveChunkPopulatorFeature.java index da5274a6..a1ed2856 100644 --- a/src/main/java/ru/betterend/world/features/terrain/caves/CaveChunkPopulatorFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/caves/CaveChunkPopulatorFeature.java @@ -1,18 +1,12 @@ package ru.betterend.world.features.terrain.caves; -import java.util.Random; -import java.util.Set; -import java.util.function.Supplier; - import com.google.common.collect.Sets; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkAccess; -import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.feature.Feature; import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; @@ -22,6 +16,10 @@ import ru.bclib.world.features.DefaultFeature; import ru.betterend.util.BlockFixer; import ru.betterend.world.biome.cave.EndCaveBiome; +import java.util.Random; +import java.util.Set; +import java.util.function.Supplier; + public class CaveChunkPopulatorFeature extends DefaultFeature { private Supplier supplier; @@ -50,7 +48,7 @@ public class CaveChunkPopulatorFeature extends DefaultFeature { } protected void fillSets(int sx, int sz, ChunkAccess chunk, Set floorPositions, - Set ceilPositions, MutableBlockPos min, MutableBlockPos max) { + Set ceilPositions, MutableBlockPos min, MutableBlockPos max) { MutableBlockPos mut = new MutableBlockPos(); MutableBlockPos mut2 = new MutableBlockPos(); MutableBlockPos mut3 = new MutableBlockPos(); @@ -108,7 +106,7 @@ public class CaveChunkPopulatorFeature extends DefaultFeature { } protected void placeFloor(WorldGenLevel world, EndCaveBiome biome, Set floorPositions, Random random, - BlockState surfaceBlock) { + BlockState surfaceBlock) { float density = biome.getFloorDensity(); floorPositions.forEach((pos) -> { BlocksHelper.setWithoutUpdate(world, pos, surfaceBlock); diff --git a/src/main/java/ru/betterend/world/features/terrain/caves/EndCaveFeature.java b/src/main/java/ru/betterend/world/features/terrain/caves/EndCaveFeature.java index 6c6509e1..db692501 100644 --- a/src/main/java/ru/betterend/world/features/terrain/caves/EndCaveFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/caves/EndCaveFeature.java @@ -117,14 +117,14 @@ public abstract class EndCaveFeature extends DefaultFeature { } }); } - + protected void placeWalls(WorldGenLevel world, EndCaveBiome biome, Set positions, Random random) { Set placed = Sets.newHashSet(); positions.forEach(pos -> { if (random.nextInt(4) == 0 && hasOpenSide(pos, positions)) { BlockState wallBlock = biome.getWall(pos); if (wallBlock != null) { - for (Vec3i offset: SPHERE) { + for (Vec3i offset : SPHERE) { BlockPos wallPos = pos.offset(offset); if (!positions.contains(wallPos) && !placed.contains(wallPos) && world.getBlockState(wallPos).is(TagAPI.GEN_TERRAIN)) { wallBlock = biome.getWall(wallPos); @@ -136,9 +136,9 @@ public abstract class EndCaveFeature extends DefaultFeature { } }); } - + private boolean hasOpenSide(BlockPos pos, Set positions) { - for (Direction dir: BlocksHelper.DIRECTIONS) { + for (Direction dir : BlocksHelper.DIRECTIONS) { if (!positions.contains(pos.relative(dir))) { return true; } @@ -225,7 +225,7 @@ public abstract class EndCaveFeature extends DefaultFeature { } return false; } - + protected boolean biomeMissingCaves(WorldGenLevel world, BlockPos pos) { for (int x = -2; x < 3; x++) { for (int z = -2; z < 3; z++) { @@ -239,7 +239,7 @@ public abstract class EndCaveFeature extends DefaultFeature { } return false; } - + static { List prePos = Lists.newArrayList(); int radius = 5; @@ -256,6 +256,6 @@ public abstract class EndCaveFeature extends DefaultFeature { } } } - SPHERE = prePos.toArray(new Vec3i[] {}); + SPHERE = prePos.toArray(new Vec3i[]{}); } } diff --git a/src/main/java/ru/betterend/world/features/terrain/caves/RoundCaveFeature.java b/src/main/java/ru/betterend/world/features/terrain/caves/RoundCaveFeature.java index 05d2179f..e3a582bb 100644 --- a/src/main/java/ru/betterend/world/features/terrain/caves/RoundCaveFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/caves/RoundCaveFeature.java @@ -1,11 +1,6 @@ package ru.betterend.world.features.terrain.caves; -import java.util.Random; -import java.util.Set; -import java.util.stream.IntStream; - import com.google.common.collect.Sets; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.world.level.WorldGenLevel; @@ -16,21 +11,25 @@ import ru.bclib.util.BlocksHelper; import ru.bclib.util.MHelper; import ru.betterend.noise.OpenSimplexNoise; +import java.util.Random; +import java.util.Set; +import java.util.stream.IntStream; + public class RoundCaveFeature extends EndCaveFeature { @Override protected Set generate(WorldGenLevel world, BlockPos center, int radius, Random random) { OpenSimplexNoise noise = new OpenSimplexNoise(MHelper.getSeed(534, center.getX(), center.getZ())); - + int x1 = center.getX() - radius - 5; int z1 = center.getZ() - radius - 5; int x2 = center.getX() + radius + 5; int z2 = center.getZ() + radius + 5; int y1 = MHelper.floor(center.getY() - (radius + 5) / 1.6); int y2 = MHelper.floor(center.getY() + (radius + 5) / 1.6); - + double hr = radius * 0.75; double nr = radius * 0.25; - + int dx = x2 - x1 + 1; int dz = z2 - z1 + 1; int count = dx * dz; @@ -54,12 +53,12 @@ public class RoundCaveFeature extends EndCaveFeature { state = world.getBlockState(bpos); if (isReplaceable(state) && !isWaterNear(world, bpos)) { blocks.add(bpos.immutable()); - + while (state.getMaterial().equals(Material.LEAVES)) { bpos.setY(bpos.getY() + 1); state = world.getBlockState(bpos); } - + bpos.setY(y - 1); while (state.getMaterial().equals(Material.LEAVES)) { bpos.setY(bpos.getY() - 1); @@ -70,10 +69,10 @@ public class RoundCaveFeature extends EndCaveFeature { } }); blocks.forEach(bpos -> BlocksHelper.setWithoutUpdate(world, bpos, CAVE_AIR)); - + return blocks; } - + private boolean isReplaceable(BlockState state) { return state.is(TagAPI.GEN_TERRAIN) || state.getMaterial().isReplaceable() diff --git a/src/main/java/ru/betterend/world/features/terrain/caves/TunelCaveFeature.java b/src/main/java/ru/betterend/world/features/terrain/caves/TunelCaveFeature.java index c5acfec3..b5c1d6e8 100644 --- a/src/main/java/ru/betterend/world/features/terrain/caves/TunelCaveFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/caves/TunelCaveFeature.java @@ -35,24 +35,24 @@ public class TunelCaveFeature extends EndCaveFeature { if ((long) cx * (long) cx + (long) cz + (long) cz < 256) { return Sets.newHashSet(); } - + int x1 = cx << 4; int z1 = cz << 4; int x2 = x1 + 16; int z2 = z1 + 16; - + Random rand = new Random(world.getSeed()); OpenSimplexNoise noiseH = new OpenSimplexNoise(rand.nextInt()); OpenSimplexNoise noiseV = new OpenSimplexNoise(rand.nextInt()); OpenSimplexNoise noiseD = new OpenSimplexNoise(rand.nextInt()); - + Set positions = Sets.newConcurrentHashSet(); - + float a = hasCaves(world, new BlockPos(x1, 0, z1)) ? 1F : 0F; float b = hasCaves(world, new BlockPos(x2, 0, z1)) ? 1F : 0F; float c = hasCaves(world, new BlockPos(x1, 0, z2)) ? 1F : 0F; float d = hasCaves(world, new BlockPos(x2, 0, z2)) ? 1F : 0F; - + ChunkAccess chunk = world.getChunk(cx, cz); IntStream.range(0, 256).parallel().forEach(index -> { MutableBlockPos pos = new MutableBlockPos(); @@ -84,17 +84,17 @@ public class TunelCaveFeature extends EndCaveFeature { } }); positions.forEach(bpos -> BlocksHelper.setWithoutUpdate(world, bpos, CAVE_AIR)); - + return positions; } - + private boolean noWaterNear(WorldGenLevel world, BlockPos pos) { BlockPos above1 = pos.above(); BlockPos above2 = pos.above(2); if (!world.getFluidState(above1).isEmpty() || !world.getFluidState(above2).isEmpty()) { return false; } - for (Direction dir: BlocksHelper.HORIZONTAL) { + for (Direction dir : BlocksHelper.HORIZONTAL) { if (!world.getFluidState(above1.relative(dir)).isEmpty()) { return false; } @@ -104,7 +104,7 @@ public class TunelCaveFeature extends EndCaveFeature { } return true; } - + @Override public boolean place(FeaturePlaceContext featureConfig) { final Random random = featureConfig.random(); @@ -117,12 +117,12 @@ public class TunelCaveFeature extends EndCaveFeature { if (biomeMissingCaves(world, pos)) { return false; } - + Set caveBlocks = generate(world, pos, random); if (caveBlocks.isEmpty()) { return false; } - + Map> floorSets = Maps.newHashMap(); Map> ceilSets = Maps.newHashMap(); MutableBlockPos mut = new MutableBlockPos(); @@ -157,11 +157,11 @@ public class TunelCaveFeature extends EndCaveFeature { } }); caveBlocks.removeAll(remove); - + if (caveBlocks.isEmpty()) { return true; } - + floorSets.forEach((biome, floorPositions) -> { BlockState surfaceBlock = biome.getBiome().getGenerationSettings().getSurfaceBuilderConfig().getTopMaterial(); placeFloor(world, biome, floorPositions, random, surfaceBlock); @@ -180,7 +180,7 @@ public class TunelCaveFeature extends EndCaveFeature { protected Set generate(WorldGenLevel world, BlockPos center, int radius, Random random) { return null; } - + @Override protected void placeFloor(WorldGenLevel world, EndCaveBiome biome, Set floorPositions, Random random, BlockState surfaceBlock) { float density = biome.getFloorDensity() * 0.2F; @@ -213,14 +213,14 @@ public class TunelCaveFeature extends EndCaveFeature { } }); } - + protected boolean hasCaves(WorldGenLevel world, BlockPos pos) { return hasCavesInBiome(world, pos.offset(-8, 0, -8)) && hasCavesInBiome(world, pos.offset(8, 0, -8)) && hasCavesInBiome(world, pos.offset(-8, 0, 8)) && hasCavesInBiome(world, pos.offset(8, 0, 8)); } - + protected boolean hasCavesInBiome(WorldGenLevel world, BlockPos pos) { Biome biome = world.getBiome(pos); BCLBiome endBiome = BiomeAPI.getFromBiome(biome); diff --git a/src/main/java/ru/betterend/world/features/trees/DragonTreeFeature.java b/src/main/java/ru/betterend/world/features/trees/DragonTreeFeature.java index d41dab55..c3abb2ee 100644 --- a/src/main/java/ru/betterend/world/features/trees/DragonTreeFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/DragonTreeFeature.java @@ -1,19 +1,13 @@ package ru.betterend.world.features.trees; -import java.util.List; -import java.util.Random; -import java.util.function.Function; - import com.google.common.collect.Lists; import com.mojang.math.Vector3f; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.LeavesBlock; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; @@ -33,6 +27,10 @@ import ru.bclib.world.features.DefaultFeature; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; +import java.util.List; +import java.util.Random; +import java.util.function.Function; + public class DragonTreeFeature extends DefaultFeature { private static final Function REPLACE; private static final Function IGNORE; diff --git a/src/main/java/ru/betterend/world/features/trees/GiganticAmaranitaFeature.java b/src/main/java/ru/betterend/world/features/trees/GiganticAmaranitaFeature.java index 33853a15..2e3c7937 100644 --- a/src/main/java/ru/betterend/world/features/trees/GiganticAmaranitaFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/GiganticAmaranitaFeature.java @@ -1,11 +1,6 @@ package ru.betterend.world.features.trees; -import java.util.List; -import java.util.Random; -import java.util.function.Function; - import com.mojang.math.Vector3f; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; @@ -14,7 +9,6 @@ import net.minecraft.core.Direction.AxisDirection; import net.minecraft.util.Mth; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; @@ -28,6 +22,10 @@ import ru.bclib.util.SplineHelper; import ru.bclib.world.features.DefaultFeature; import ru.betterend.registry.EndBlocks; +import java.util.List; +import java.util.Random; +import java.util.function.Function; + public class GiganticAmaranitaFeature extends DefaultFeature { private static final Function REPLACE; private static final Function IGNORE; @@ -130,7 +128,8 @@ public class GiganticAmaranitaFeature extends DefaultFeature { } } } - } else if (radius < 4) { + } + else if (radius < 4) { pos = pos.offset(-1, 0, -1); for (int i = -2; i < 2; i++) { mut.set(pos).move(Direction.NORTH, 2).move(Direction.WEST, i); @@ -201,7 +200,8 @@ public class GiganticAmaranitaFeature extends DefaultFeature { } } } - } else { + } + else { for (int i = -2; i < 3; i++) { mut.set(pos).move(Direction.NORTH, 3).move(Direction.EAST, i); if (world.getBlockState(mut).getMaterial().isReplaceable()) { @@ -316,7 +316,8 @@ public class GiganticAmaranitaFeature extends DefaultFeature { && world.getBlockState(mut).getMaterial().isReplaceable()) { BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_CAP); } - } else { + } + else { if ((x == 0 || z == 0) && (Math.abs(x) < 2 && Math.abs(z) < 2) && world.getBlockState(mut).getMaterial().isReplaceable()) { BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.AMARANITA_CAP); diff --git a/src/main/java/ru/betterend/world/features/trees/HelixTreeFeature.java b/src/main/java/ru/betterend/world/features/trees/HelixTreeFeature.java index 90b07868..b7bb9d23 100644 --- a/src/main/java/ru/betterend/world/features/trees/HelixTreeFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/HelixTreeFeature.java @@ -1,18 +1,11 @@ package ru.betterend.world.features.trees; -import java.util.ArrayList; -import java.util.List; -import java.util.Random; -import java.util.function.Function; - import com.mojang.math.Vector3f; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.util.Mth; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.phys.AABB; @@ -31,6 +24,11 @@ import ru.bclib.world.features.DefaultFeature; import ru.betterend.blocks.HelixTreeLeavesBlock; import ru.betterend.registry.EndBlocks; +import java.util.ArrayList; +import java.util.List; +import java.util.Random; +import java.util.function.Function; + public class HelixTreeFeature extends DefaultFeature { private static final Function POST; @@ -126,7 +124,8 @@ public class HelixTreeFeature extends DefaultFeature { if (ax > az) { start.set(start.x(), start.y(), start.z() + az > 0 ? 1 : -1); end.set(end.x(), end.y(), end.z() + az > 0 ? 1 : -1); - } else { + } + else { start.set(start.x() + ax > 0 ? 1 : -1, start.y(), start.z()); end.set(end.x() + ax > 0 ? 1 : -1, end.y(), end.z()); } @@ -153,7 +152,7 @@ public class HelixTreeFeature extends DefaultFeature { } private void fillLine(Vector3f start, Vector3f end, WorldGenLevel world, BlockState state, BlockPos pos, - int offset) { + int offset) { float dx = end.x() - start.x(); float dy = end.y() - start.y(); float dz = end.z() - start.z(); diff --git a/src/main/java/ru/betterend/world/features/trees/JellyshroomFeature.java b/src/main/java/ru/betterend/world/features/trees/JellyshroomFeature.java index 8bcd9e6e..0c5f55c5 100644 --- a/src/main/java/ru/betterend/world/features/trees/JellyshroomFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/JellyshroomFeature.java @@ -1,17 +1,11 @@ package ru.betterend.world.features.trees; -import java.util.List; -import java.util.Random; -import java.util.function.Function; - import com.google.common.collect.Lists; import com.mojang.math.Vector3f; - import net.minecraft.core.BlockPos; import net.minecraft.util.Mth; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; @@ -29,6 +23,10 @@ import ru.bclib.world.features.DefaultFeature; import ru.betterend.blocks.JellyshroomCapBlock; import ru.betterend.registry.EndBlocks; +import java.util.List; +import java.util.Random; +import java.util.function.Function; + public class JellyshroomFeature extends DefaultFeature { private static final Function REPLACE; private static final List ROOT; @@ -67,7 +65,8 @@ public class JellyshroomFeature extends DefaultFeature { && EndBlocks.JELLYSHROOM.isTreeLog(info.getStateDown())) { return EndBlocks.JELLYSHROOM.log.defaultBlockState(); } - } else if (info.getState().is(EndBlocks.JELLYSHROOM_CAP_PURPLE)) { + } + else if (info.getState().is(EndBlocks.JELLYSHROOM_CAP_PURPLE)) { float dx = info.getPos().getX() - pos.getX() - last.x(); float dz = info.getPos().getZ() - pos.getZ() - last.z(); float distance = MHelper.length(dx, dz) / membraneRadius * 7F; diff --git a/src/main/java/ru/betterend/world/features/trees/LacugroveFeature.java b/src/main/java/ru/betterend/world/features/trees/LacugroveFeature.java index 4f916282..39655815 100644 --- a/src/main/java/ru/betterend/world/features/trees/LacugroveFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/LacugroveFeature.java @@ -1,18 +1,12 @@ package ru.betterend.world.features.trees; -import java.util.List; -import java.util.Random; -import java.util.function.Function; - import com.mojang.math.Vector3f; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.LeavesBlock; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; @@ -30,6 +24,10 @@ import ru.bclib.world.features.DefaultFeature; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; +import java.util.List; +import java.util.Random; +import java.util.function.Function; + public class LacugroveFeature extends DefaultFeature { private static final Function REPLACE; private static final Function IGNORE; @@ -99,7 +97,8 @@ public class LacugroveFeature extends DefaultFeature { || state.is(TagAPI.END_GROUND)) { BlocksHelper.setWithoutUpdate(world, mut, y == top ? EndBlocks.LACUGROVE.bark : EndBlocks.LACUGROVE.log); - } else { + } + else { break; } } diff --git a/src/main/java/ru/betterend/world/features/trees/LucerniaFeature.java b/src/main/java/ru/betterend/world/features/trees/LucerniaFeature.java index b01e66ee..3982a8ca 100644 --- a/src/main/java/ru/betterend/world/features/trees/LucerniaFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/LucerniaFeature.java @@ -15,7 +15,11 @@ import ru.bclib.api.TagAPI; import ru.bclib.blocks.BlockProperties; import ru.bclib.blocks.BlockProperties.TripleShape; import ru.bclib.sdf.SDF; -import ru.bclib.sdf.operator.*; +import ru.bclib.sdf.operator.SDFDisplacement; +import ru.bclib.sdf.operator.SDFScale; +import ru.bclib.sdf.operator.SDFScale3D; +import ru.bclib.sdf.operator.SDFSubtraction; +import ru.bclib.sdf.operator.SDFTranslate; import ru.bclib.sdf.primitive.SDFSphere; import ru.bclib.util.BlocksHelper; import ru.bclib.util.MHelper; @@ -68,7 +72,7 @@ public class LucerniaFeature extends DefaultFeature { } private void leavesBall(WorldGenLevel world, BlockPos pos, float radius, Random random, OpenSimplexNoise noise, - boolean natural) { + boolean natural) { SDF sphere = new SDFSphere().setRadius(radius) .setBlock(EndBlocks.LUCERNIA_LEAVES.defaultBlockState().setValue(LeavesBlock.DISTANCE, 6)); SDF sub = new SDFScale().setScale(5).setSource(sphere); @@ -160,7 +164,8 @@ public class LucerniaFeature extends DefaultFeature { mut.setY(mut.getY() - 1); if (world.isEmptyBlock(mut.below())) { BlocksHelper.setWithoutUpdate(world, mut, middle); - } else { + } + else { break; } } diff --git a/src/main/java/ru/betterend/world/features/trees/MossyGlowshroomFeature.java b/src/main/java/ru/betterend/world/features/trees/MossyGlowshroomFeature.java index abea454d..c6eafe0c 100644 --- a/src/main/java/ru/betterend/world/features/trees/MossyGlowshroomFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/MossyGlowshroomFeature.java @@ -10,7 +10,15 @@ import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConf import net.minecraft.world.level.material.Material; import ru.bclib.api.TagAPI; import ru.bclib.sdf.SDF; -import ru.bclib.sdf.operator.*; +import ru.bclib.sdf.operator.SDFBinary; +import ru.bclib.sdf.operator.SDFCoordModify; +import ru.bclib.sdf.operator.SDFFlatWave; +import ru.bclib.sdf.operator.SDFScale; +import ru.bclib.sdf.operator.SDFScale3D; +import ru.bclib.sdf.operator.SDFSmoothUnion; +import ru.bclib.sdf.operator.SDFSubtraction; +import ru.bclib.sdf.operator.SDFTranslate; +import ru.bclib.sdf.operator.SDFUnion; import ru.bclib.sdf.primitive.SDFCappedCone; import ru.bclib.sdf.primitive.SDFPrimitive; import ru.bclib.sdf.primitive.SDFSphere; diff --git a/src/main/java/ru/betterend/world/features/trees/PythadendronTreeFeature.java b/src/main/java/ru/betterend/world/features/trees/PythadendronTreeFeature.java index a3b24fda..a31da107 100644 --- a/src/main/java/ru/betterend/world/features/trees/PythadendronTreeFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/PythadendronTreeFeature.java @@ -65,7 +65,7 @@ public class PythadendronTreeFeature extends DefaultFeature { } private void branch(float x, float y, float z, float size, float angle, Random random, int depth, - WorldGenLevel world, BlockPos pos) { + WorldGenLevel world, BlockPos pos) { if (depth == 0) return; diff --git a/src/main/java/ru/betterend/world/features/trees/TenaneaFeature.java b/src/main/java/ru/betterend/world/features/trees/TenaneaFeature.java index 9a1016a0..05c3a0f1 100644 --- a/src/main/java/ru/betterend/world/features/trees/TenaneaFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/TenaneaFeature.java @@ -15,7 +15,11 @@ import ru.bclib.api.TagAPI; import ru.bclib.blocks.BlockProperties; import ru.bclib.blocks.BlockProperties.TripleShape; import ru.bclib.sdf.SDF; -import ru.bclib.sdf.operator.*; +import ru.bclib.sdf.operator.SDFDisplacement; +import ru.bclib.sdf.operator.SDFScale; +import ru.bclib.sdf.operator.SDFScale3D; +import ru.bclib.sdf.operator.SDFSubtraction; +import ru.bclib.sdf.operator.SDFTranslate; import ru.bclib.sdf.primitive.SDFSphere; import ru.bclib.util.BlocksHelper; import ru.bclib.util.MHelper; @@ -156,7 +160,8 @@ public class TenaneaFeature extends DefaultFeature { mut.setY(mut.getY() - 1); if (world.isEmptyBlock(mut.below())) { BlocksHelper.setWithoutUpdate(world, mut, middle); - } else { + } + else { break; } } diff --git a/src/main/java/ru/betterend/world/features/trees/UmbrellaTreeFeature.java b/src/main/java/ru/betterend/world/features/trees/UmbrellaTreeFeature.java index db947168..34df39c0 100644 --- a/src/main/java/ru/betterend/world/features/trees/UmbrellaTreeFeature.java +++ b/src/main/java/ru/betterend/world/features/trees/UmbrellaTreeFeature.java @@ -13,7 +13,13 @@ import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConf import net.minecraft.world.level.material.Material; import ru.bclib.api.TagAPI; import ru.bclib.sdf.SDF; -import ru.bclib.sdf.operator.*; +import ru.bclib.sdf.operator.SDFFlatWave; +import ru.bclib.sdf.operator.SDFScale; +import ru.bclib.sdf.operator.SDFScale3D; +import ru.bclib.sdf.operator.SDFSmoothUnion; +import ru.bclib.sdf.operator.SDFSubtraction; +import ru.bclib.sdf.operator.SDFTranslate; +import ru.bclib.sdf.operator.SDFUnion; import ru.bclib.sdf.primitive.SDFSphere; import ru.bclib.util.BlocksHelper; import ru.bclib.util.MHelper; @@ -106,7 +112,8 @@ public class UmbrellaTreeFeature extends DefaultFeature { if (EndBlocks.UMBRELLA_TREE.isTreeLog(info.getStateUp()) && EndBlocks.UMBRELLA_TREE.isTreeLog(info.getStateDown())) { return EndBlocks.UMBRELLA_TREE.log.defaultBlockState(); - } else if (info.getState().equals(membrane)) { + } + else if (info.getState().equals(membrane)) { Center min = centers.get(0); double d = Double.MAX_VALUE; BlockPos bpos = info.getPos(); diff --git a/src/main/java/ru/betterend/world/generator/BetterEndBiomeSource.java b/src/main/java/ru/betterend/world/generator/BetterEndBiomeSource.java index c5f81571..1c20fc72 100644 --- a/src/main/java/ru/betterend/world/generator/BetterEndBiomeSource.java +++ b/src/main/java/ru/betterend/world/generator/BetterEndBiomeSource.java @@ -1,11 +1,8 @@ package ru.betterend.world.generator; -import java.util.List; - import com.google.common.collect.Lists; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; - import net.minecraft.core.Registry; import net.minecraft.resources.RegistryLookupCodec; import net.minecraft.world.level.biome.Biome; @@ -24,6 +21,8 @@ import ru.betterend.registry.EndTags; import ru.betterend.util.FeaturesHelper; import ru.betterend.world.biome.EndBiome; +import java.util.List; + public class BetterEndBiomeSource extends BiomeSource { public static final Codec CODEC = RecordCodecBuilder.create((instance) -> { return instance.group(RegistryLookupCodec.create(Registry.BIOME_REGISTRY).forGetter((theEndBiomeSource) -> { @@ -43,14 +42,14 @@ public class BetterEndBiomeSource extends BiomeSource { public BetterEndBiomeSource(Registry biomeRegistry, long seed) { super(getBiomes(biomeRegistry)); - + this.mapLand = new BiomeMap(seed, GeneratorOptions.getBiomeSizeLand(), EndBiomes.LAND_BIOMES); this.mapVoid = new BiomeMap(seed, GeneratorOptions.getBiomeSizeVoid(), EndBiomes.VOID_BIOMES); this.centerBiome = biomeRegistry.getOrThrow(Biomes.THE_END); this.barrens = biomeRegistry.getOrThrow(Biomes.END_BARRENS); this.biomeRegistry = biomeRegistry; this.seed = seed; - + WorldgenRandom chunkRandom = new WorldgenRandom(seed); chunkRandom.consumeCount(17292); this.noise = new SimplexNoise(chunkRandom); @@ -59,7 +58,7 @@ public class BetterEndBiomeSource extends BiomeSource { EndTags.addTerrainTags(biomeRegistry); FeaturesHelper.addFeatures(biomeRegistry); } - + private static List getBiomes(Registry biomeRegistry) { List list = Lists.newArrayList(); biomeRegistry.forEach((biome) -> { @@ -76,7 +75,7 @@ public class BetterEndBiomeSource extends BiomeSource { boolean hasVoid = !GeneratorOptions.useNewGenerator() || !GeneratorOptions.noRingVoid(); long i = (long) biomeX * (long) biomeX; long j = (long) biomeZ * (long) biomeZ; - + long dist = i + j; if (hasVoid) { if (dist <= 65536L) return this.centerBiome; @@ -87,12 +86,12 @@ public class BetterEndBiomeSource extends BiomeSource { return this.centerBiome; } } - + if (biomeX == 0 && biomeZ == 0) { mapLand.clearCache(); mapVoid.clearCache(); } - + BCLBiome endBiome = null; if (GeneratorOptions.useNewGenerator()) { if (TerrainGenerator.isLand(biomeX, biomeZ)) { @@ -107,22 +106,22 @@ public class BetterEndBiomeSource extends BiomeSource { } else { float height = TheEndBiomeSource.getHeightValue(noise, (biomeX >> 1) + 1, (biomeZ >> 1) + 1) + (float) SMALL_NOISE.eval(biomeX, biomeZ) * 5; - + if (height > -20F && height < -5F) { return barrens; } - + endBiome = height < -10F ? mapVoid.getBiome(biomeX << 2, biomeZ << 2) : mapLand.getBiome(biomeX << 2, biomeZ << 2); } - + return BiomeAPI.getActualBiome(endBiome); } - + public Biome getLandBiome(int biomeX, int biomeY, int biomeZ) { boolean hasVoid = !GeneratorOptions.useNewGenerator() || !GeneratorOptions.noRingVoid(); long i = (long) biomeX * (long) biomeX; long j = (long) biomeZ * (long) biomeZ; - + long dist = i + j; if (hasVoid) { if (dist <= 65536L) return this.centerBiome; diff --git a/src/main/java/ru/betterend/world/generator/GeneratorOptions.java b/src/main/java/ru/betterend/world/generator/GeneratorOptions.java index 346dd2a7..521c5407 100644 --- a/src/main/java/ru/betterend/world/generator/GeneratorOptions.java +++ b/src/main/java/ru/betterend/world/generator/GeneratorOptions.java @@ -30,7 +30,7 @@ public class GeneratorOptions { private static long islandDistBlock; private static int islandDistChunk; private static boolean directSpikeHeight; - + public static void init() { biomeSizeLand = Configs.GENERATOR_CONFIG.getInt("biomeMap", "biomeSizeLand", 256); biomeSizeVoid = Configs.GENERATOR_CONFIG.getInt("biomeMap", "biomeSizeVoid", 256); @@ -51,9 +51,9 @@ public class GeneratorOptions { smallOptions = new LayerOptions("customGenerator.layers.smallIslands", Configs.GENERATOR_CONFIG, 60, 50, 70, 30, false); changeSpawn = Configs.GENERATOR_CONFIG.getBoolean("spawn", "changeSpawn", false); spawn = new BlockPos( - Configs.GENERATOR_CONFIG.getInt("spawn.point", "x", 20), - Configs.GENERATOR_CONFIG.getInt("spawn.point", "y", 65), - Configs.GENERATOR_CONFIG.getInt("spawn.point", "z", 0) + Configs.GENERATOR_CONFIG.getInt("spawn.point", "x", 20), + Configs.GENERATOR_CONFIG.getInt("spawn.point", "y", 65), + Configs.GENERATOR_CONFIG.getInt("spawn.point", "z", 0) ); replacePortal = Configs.GENERATOR_CONFIG.getBoolean("portal", "customEndPortal", true); replacePillars = Configs.GENERATOR_CONFIG.getBoolean("spikes", "customObsidianSpikes", true); @@ -65,11 +65,11 @@ public class GeneratorOptions { public static int getBiomeSizeLand() { return Mth.clamp(biomeSizeLand, 1, 8192); } - + public static int getBiomeSizeVoid() { return Mth.clamp(biomeSizeVoid, 1, 8192); } - + public static int getBiomeSizeCaves() { return Mth.clamp(biomeSizeCaves, 1, 8192); } @@ -77,15 +77,15 @@ public class GeneratorOptions { public static boolean hasPortal() { return hasPortal; } - + public static boolean hasPillars() { return hasPillars; } - + public static boolean hasDragonFights() { return hasDragonFights; } - + public static boolean swapOverworldToEnd() { return swapOverworldToEnd; } @@ -97,23 +97,23 @@ public class GeneratorOptions { public static boolean removeChorusFromVanillaBiomes() { return removeChorusFromVanillaBiomes; } - + public static boolean noRingVoid() { return noRingVoid; } - + public static boolean useNewGenerator() { return newGenerator; } - + public static boolean hasCentralIsland() { return generateCentralIsland; } - + public static boolean generateObsidianPlatform() { return generateObsidianPlatform; } - + public static int getEndCityFailChance() { return endCityFailChance; } @@ -133,11 +133,11 @@ public class GeneratorOptions { public static void setPortalPos(BlockPos portal) { GeneratorOptions.portal = portal; } - + public static boolean replacePortal() { return replacePortal; } - + public static boolean replacePillars() { return replacePillars; } @@ -149,11 +149,11 @@ public class GeneratorOptions { public static int getIslandDistChunk() { return islandDistChunk; } - + public static void setDirectSpikeHeight() { directSpikeHeight = true; } - + public static boolean isDirectSpikeHeight() { boolean height = directSpikeHeight; directSpikeHeight = false; diff --git a/src/main/java/ru/betterend/world/generator/IslandLayer.java b/src/main/java/ru/betterend/world/generator/IslandLayer.java index d7858317..178fd625 100644 --- a/src/main/java/ru/betterend/world/generator/IslandLayer.java +++ b/src/main/java/ru/betterend/world/generator/IslandLayer.java @@ -1,12 +1,6 @@ package ru.betterend.world.generator; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Random; - import com.google.common.collect.Maps; - import net.minecraft.core.BlockPos; import ru.bclib.sdf.SDF; import ru.bclib.sdf.operator.SDFRadialNoiseMap; @@ -17,11 +11,16 @@ import ru.bclib.sdf.primitive.SDFCappedCone; import ru.bclib.util.MHelper; import ru.betterend.noise.OpenSimplexNoise; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Random; + public class IslandLayer { private static final Random RANDOM = new Random(); private final SDFRadialNoiseMap noise; private final SDF island; - + private final List positions = new ArrayList(9); private final Map islands = Maps.newHashMap(); private final OpenSimplexNoise density; @@ -29,33 +28,33 @@ public class IslandLayer { private int lastX = Integer.MIN_VALUE; private int lastZ = Integer.MIN_VALUE; private final LayerOptions options; - + public IslandLayer(int seed, LayerOptions options) { this.density = new OpenSimplexNoise(seed); this.options = options; this.seed = seed; - + SDF cone1 = makeCone(0, 0.4F, 0.2F, -0.3F); SDF cone2 = makeCone(0.4F, 0.5F, 0.1F, -0.1F); SDF cone3 = makeCone(0.5F, 0.45F, 0.03F, 0.0F); SDF cone4 = makeCone(0.45F, 0, 0.02F, 0.03F); - + SDF coneBottom = new SDFSmoothUnion().setRadius(0.02F).setSourceA(cone1).setSourceB(cone2); SDF coneTop = new SDFSmoothUnion().setRadius(0.02F).setSourceA(cone3).setSourceB(cone4); noise = (SDFRadialNoiseMap) new SDFRadialNoiseMap().setSeed(seed).setRadius(0.5F).setIntensity(0.2F).setSource(coneTop); island = new SDFSmoothUnion().setRadius(0.01F).setSourceA(noise).setSourceB(coneBottom); } - + private int getSeed(int x, int z) { int h = seed + x * 374761393 + z * 668265263; h = (h ^ (h >> 13)) * 1274126177; return h ^ (h >> 16); } - + public void updatePositions(double x, double z) { int ix = MHelper.floor(x / options.distance); int iz = MHelper.floor(z / options.distance); - + if (lastX != ix || lastZ != iz) { lastX = ix; lastZ = iz; @@ -78,7 +77,7 @@ public class IslandLayer { } } } - + if (GeneratorOptions.hasCentralIsland() && Math.abs(ix) < GeneratorOptions.getIslandDistChunk() && Math.abs(iz) < GeneratorOptions.getIslandDistChunk()) { int count = positions.size(); for (int n = 0; n < count; n++) { @@ -95,7 +94,7 @@ public class IslandLayer { } } } - + private SDF getIsland(BlockPos pos) { SDF island = islands.get(pos); if (island == null) { @@ -111,40 +110,40 @@ public class IslandLayer { noise.setOffset(pos.getX(), pos.getZ()); return island; } - + private float getRelativeDistance(SDF sdf, BlockPos center, double px, double py, double pz) { float x = (float) (px - center.getX()) / options.scale; float y = (float) (py - center.getY()) / options.scale; float z = (float) (pz - center.getZ()) / options.scale; return sdf.getDistance(x, y, z); } - + private float calculateSDF(double x, double y, double z) { float distance = 10; - for (BlockPos pos: positions) { + for (BlockPos pos : positions) { SDF island = getIsland(pos); float dist = getRelativeDistance(island, pos, x, y, z); distance = MHelper.min(distance, dist); } return distance; } - + public float getDensity(double x, double y, double z) { return -calculateSDF(x, y, z); } - + public float getDensity(double x, double y, double z, float height) { noise.setIntensity(height); noise.setRadius(0.5F / (1 + height)); return -calculateSDF(x, y, z); } - + public void clearCache() { if (islands.size() > 128) { islands.clear(); } } - + private static SDF makeCone(float radiusBottom, float radiusTop, float height, float minY) { float hh = height * 0.5F; SDF sdf = new SDFCappedCone().setHeight(hh).setRadius1(radiusBottom).setRadius2(radiusTop); diff --git a/src/main/java/ru/betterend/world/generator/LayerOptions.java b/src/main/java/ru/betterend/world/generator/LayerOptions.java index 03c6ecab..58241d87 100644 --- a/src/main/java/ru/betterend/world/generator/LayerOptions.java +++ b/src/main/java/ru/betterend/world/generator/LayerOptions.java @@ -13,7 +13,7 @@ public class LayerOptions { public final int maxY; public final long centerDist; public final boolean hasCentralIsland; - + public LayerOptions(String name, PathConfig config, float distance, float scale, int center, int heightVariation, boolean hasCentral) { this.distance = clampDistance(config.getFloat(name, "distance[1-8192]", distance)); this.scale = clampScale(config.getFloat(name, "scale[0.1-1024]", scale)); @@ -25,23 +25,23 @@ public class LayerOptions { this.centerDist = Mth.floor(1000 / this.distance); this.hasCentralIsland = config.getBoolean(name, "hasCentralIsland", hasCentral); } - + private float clampDistance(float value) { return Mth.clamp(value, 1, 8192); } - + private float clampScale(float value) { return Mth.clamp(value, 0.1F, 1024); } - + private float clampCoverage(float value) { return 0.9999F - Mth.clamp(value, 0, 1) * 2; } - + private int clampCenter(int value) { return Mth.clamp(value, 0, 255); } - + private int clampVariation(int value) { return Mth.clamp(value, 0, 255); } diff --git a/src/main/java/ru/betterend/world/generator/TerrainGenerator.java b/src/main/java/ru/betterend/world/generator/TerrainGenerator.java index 1214b56b..4e062f51 100644 --- a/src/main/java/ru/betterend/world/generator/TerrainGenerator.java +++ b/src/main/java/ru/betterend/world/generator/TerrainGenerator.java @@ -1,25 +1,24 @@ package ru.betterend.world.generator; -import java.awt.Point; -import java.util.List; -import java.util.Random; -import java.util.concurrent.locks.ReentrantLock; - import com.google.common.collect.Lists; - import net.minecraft.util.Mth; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.biome.BiomeSource; import ru.bclib.util.MHelper; import ru.betterend.noise.OpenSimplexNoise; +import java.awt.Point; +import java.util.List; +import java.util.Random; +import java.util.concurrent.locks.ReentrantLock; + public class TerrainGenerator { private static final ReentrantLock LOCKER = new ReentrantLock(); private static final double SCALE_XZ = 8.0; private static final double SCALE_Y = 4.0; private static final float[] COEF; private static final Point[] OFFS; - + private static IslandLayer largeIslands; private static IslandLayer mediumIslands; private static IslandLayer smallIslands; @@ -29,7 +28,7 @@ public class TerrainGenerator { /*public static boolean canGenerate(int x, int z) { return GeneratorOptions.noRingVoid() || (long) x + (long) z > CENTER; }*/ - + public static void initNoise(long seed) { Random random = new Random(seed); largeIslands = new IslandLayer(random.nextInt(), GeneratorOptions.bigOptions); @@ -38,25 +37,25 @@ public class TerrainGenerator { noise1 = new OpenSimplexNoise(random.nextInt()); noise2 = new OpenSimplexNoise(random.nextInt()); } - + public static void fillTerrainDensity(double[] buffer, int x, int z, BiomeSource biomeSource) { LOCKER.lock(); - + largeIslands.clearCache(); mediumIslands.clearCache(); smallIslands.clearCache(); - + double distortion1 = noise1.eval(x * 0.1, z * 0.1) * 20 + noise2.eval(x * 0.2, z * 0.2) * 10 + noise1.eval(x * 0.4, z * 0.4) * 5; double distortion2 = noise2.eval(x * 0.1, z * 0.1) * 20 + noise1.eval(x * 0.2, z * 0.2) * 10 + noise2.eval(x * 0.4, z * 0.4) * 5; double px = (double) x * SCALE_XZ + distortion1; double pz = (double) z * SCALE_XZ + distortion2; - + largeIslands.updatePositions(px, pz); mediumIslands.updatePositions(px, pz); smallIslands.updatePositions(px, pz); - + float height = getAverageDepth(biomeSource, x << 1, z << 1) * 0.5F; - + for (int y = 0; y < buffer.length; y++) { double py = (double) y * SCALE_Y; float dist = largeIslands.getDensity(px, py, pz, height); @@ -69,10 +68,10 @@ public class TerrainGenerator { } buffer[y] = dist; } - + LOCKER.unlock(); } - + private static float getAverageDepth(BiomeSource biomeSource, int x, int z) { if (getBiome(biomeSource, x, z).getDepth() < 0.1F) { return 0F; @@ -85,34 +84,35 @@ public class TerrainGenerator { } return depth; } - + private static Biome getBiome(BiomeSource biomeSource, int x, int z) { if (biomeSource instanceof BetterEndBiomeSource) { return ((BetterEndBiomeSource) biomeSource).getLandBiome(x, 0, z); } return biomeSource.getNoiseBiome(x, 0, z); } - + /** * Check if this is land + * * @param x - biome pos x * @param z - biome pos z */ public static boolean isLand(int x, int z) { LOCKER.lock(); - + double px = (x >> 1) + 0.5; double pz = (z >> 1) + 0.5; - + double distortion1 = noise1.eval(px * 0.1, pz * 0.1) * 20 + noise2.eval(px * 0.2, pz * 0.2) * 10 + noise1.eval(px * 0.4, pz * 0.4) * 5; double distortion2 = noise2.eval(px * 0.1, pz * 0.1) * 20 + noise1.eval(px * 0.2, pz * 0.2) * 10 + noise2.eval(px * 0.4, pz * 0.4) * 5; px = px * SCALE_XZ + distortion1; pz = pz * SCALE_XZ + distortion2; - + largeIslands.updatePositions(px, pz); mediumIslands.updatePositions(px, pz); smallIslands.updatePositions(px, pz); - + for (int y = 0; y < 32; y++) { double py = (double) y * SCALE_Y; float dist = largeIslands.getDensity(px, py, pz); @@ -128,31 +128,32 @@ public class TerrainGenerator { return true; } } - + LOCKER.unlock(); return false; } - + /** * Get something like height + * * @param x - block pos x * @param z - block pos z */ public static int getHeight(int x, int z) { LOCKER.lock(); - + double px = (double) x / 8.0; double pz = (double) z / 8.0; - + double distortion1 = noise1.eval(px * 0.1, pz * 0.1) * 20 + noise2.eval(px * 0.2, pz * 0.2) * 10 + noise1.eval(px * 0.4, pz * 0.4) * 5; double distortion2 = noise2.eval(px * 0.1, pz * 0.1) * 20 + noise1.eval(px * 0.2, pz * 0.2) * 10 + noise2.eval(px * 0.4, pz * 0.4) * 5; px = (double) x * SCALE_XZ + distortion1; pz = (double) z * SCALE_XZ + distortion2; - + largeIslands.updatePositions(px, pz); mediumIslands.updatePositions(px, pz); smallIslands.updatePositions(px, pz); - + for (int y = 32; y >= 0; y--) { double py = (double) y * SCALE_Y; float dist = largeIslands.getDensity(px, py, pz); @@ -168,11 +169,11 @@ public class TerrainGenerator { return Mth.floor(Mth.clamp(y + dist, y, y + 1) * SCALE_Y); } } - + LOCKER.unlock(); return 0; } - + static { float sum = 0; List coef = Lists.newArrayList(); @@ -187,7 +188,7 @@ public class TerrainGenerator { } } } - OFFS = pos.toArray(new Point[] {}); + OFFS = pos.toArray(new Point[]{}); COEF = new float[coef.size()]; for (int i = 0; i < COEF.length; i++) { COEF[i] = coef.get(i) / sum; diff --git a/src/main/java/ru/betterend/world/structures/EndStructureFeature.java b/src/main/java/ru/betterend/world/structures/EndStructureFeature.java index 396fc2a1..3881eccd 100644 --- a/src/main/java/ru/betterend/world/structures/EndStructureFeature.java +++ b/src/main/java/ru/betterend/world/structures/EndStructureFeature.java @@ -1,7 +1,5 @@ package ru.betterend.world.structures; -import java.util.Random; - import net.fabricmc.fabric.api.structure.v1.FabricStructureBuilder; import net.minecraft.data.BuiltinRegistries; import net.minecraft.resources.ResourceLocation; @@ -11,23 +9,25 @@ import net.minecraft.world.level.levelgen.feature.StructureFeature; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.betterend.BetterEnd; +import java.util.Random; + public class EndStructureFeature { private static final Random RANDOM = new Random(354); private final StructureFeature structure; private final ConfiguredStructureFeature featureConfigured; private final GenerationStep.Decoration featureStep; - + public EndStructureFeature(String name, StructureFeature structure, GenerationStep.Decoration step, int spacing, int separation) { ResourceLocation id = BetterEnd.makeID(name); - + this.featureStep = step; this.structure = FabricStructureBuilder.create(id, structure) - .step(step) - .defaultConfig(spacing, separation, RANDOM.nextInt(8192)) - .register(); + .step(step) + .defaultConfig(spacing, separation, RANDOM.nextInt(8192)) + .register(); this.featureConfigured = this.structure.configured(NoneFeatureConfiguration.NONE); - + BuiltinRegistries.register(BuiltinRegistries.CONFIGURED_STRUCTURE_FEATURE, id, this.featureConfigured); } diff --git a/src/main/java/ru/betterend/world/structures/features/EternalPortalStructure.java b/src/main/java/ru/betterend/world/structures/features/EternalPortalStructure.java index d137ea66..0706e607 100644 --- a/src/main/java/ru/betterend/world/structures/features/EternalPortalStructure.java +++ b/src/main/java/ru/betterend/world/structures/features/EternalPortalStructure.java @@ -13,7 +13,6 @@ import net.minecraft.world.level.levelgen.Heightmap.Types; import net.minecraft.world.level.levelgen.WorldgenRandom; import net.minecraft.world.level.levelgen.feature.StructureFeature; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; -import net.minecraft.world.level.levelgen.structure.BoundingBox; import net.minecraft.world.level.levelgen.structure.StructureStart; import net.minecraft.world.level.levelgen.structure.templatesystem.StructureManager; import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate; @@ -25,7 +24,7 @@ import ru.betterend.world.structures.piece.NBTPiece; public class EternalPortalStructure extends FeatureBaseStructure { private static final ResourceLocation STRUCTURE_ID = BetterEnd.makeID("portal/eternal_portal"); private static final StructureTemplate STRUCTURE = StructureHelper.readStructure(STRUCTURE_ID); - + @Override protected boolean isFeatureChunk(ChunkGenerator chunkGenerator, BiomeSource biomeSource, long worldSeed, WorldgenRandom chunkRandom, ChunkPos pos, Biome biome, ChunkPos chunkPos, NoneFeatureConfiguration featureConfig, LevelHeightAccessor levelHeightAccessor) { long x = (long) chunkPos.x * (long) chunkPos.x; @@ -38,12 +37,12 @@ public class EternalPortalStructure extends FeatureBaseStructure { } return super.isFeatureChunk(chunkGenerator, biomeSource, worldSeed, chunkRandom, pos, biome, chunkPos, featureConfig, levelHeightAccessor); } - + @Override public StructureFeature.StructureStartFactory getStartFactory() { return PortalStructureStart::new; } - + public static class PortalStructureStart extends StructureStart { public PortalStructureStart(StructureFeature feature, ChunkPos pos, int references, long seed) { super(feature, pos, references, seed); @@ -52,8 +51,8 @@ public class EternalPortalStructure extends FeatureBaseStructure { @Override public void generatePieces(RegistryAccess registryManager, ChunkGenerator chunkGenerator, StructureManager structureManager, ChunkPos chunkPos, Biome biome, NoneFeatureConfiguration featureConfiguration, LevelHeightAccessor levelHeightAccessor) { - int x = chunkPos.getBlockX( MHelper.randRange(4, 12, random)); - int z =chunkPos.getBlockZ( MHelper.randRange(4, 12, random)); + int x = chunkPos.getBlockX(MHelper.randRange(4, 12, random)); + int z = chunkPos.getBlockZ(MHelper.randRange(4, 12, random)); int y = chunkGenerator.getBaseHeight(x, z, Types.WORLD_SURFACE_WG, levelHeightAccessor); if (y > 4) { this.pieces.add(new NBTPiece(STRUCTURE_ID, STRUCTURE, new BlockPos(x, y - 4, z), random.nextInt(5), true, random)); diff --git a/src/main/java/ru/betterend/world/structures/features/FeatureBaseStructure.java b/src/main/java/ru/betterend/world/structures/features/FeatureBaseStructure.java index 64690626..10f78d2c 100644 --- a/src/main/java/ru/betterend/world/structures/features/FeatureBaseStructure.java +++ b/src/main/java/ru/betterend/world/structures/features/FeatureBaseStructure.java @@ -1,7 +1,5 @@ package ru.betterend.world.structures.features; -import java.util.Random; - import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.LevelHeightAccessor; import net.minecraft.world.level.biome.Biome; @@ -15,13 +13,15 @@ import net.minecraft.world.level.levelgen.WorldgenRandom; import net.minecraft.world.level.levelgen.feature.StructureFeature; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import java.util.Random; + public abstract class FeatureBaseStructure extends StructureFeature { protected static final BlockState AIR = Blocks.AIR.defaultBlockState(); - + public FeatureBaseStructure() { super(NoneFeatureConfiguration.CODEC); } - + @Override protected boolean isFeatureChunk(ChunkGenerator chunkGenerator, BiomeSource biomeSource, long worldSeed, WorldgenRandom chunkRandom, ChunkPos pos, Biome biome, ChunkPos chunkPos, NoneFeatureConfiguration featureConfig, LevelHeightAccessor levelHeightAccessor) { return getGenerationHeight(pos, chunkGenerator, levelHeightAccessor) >= 20; @@ -34,10 +34,12 @@ public abstract class FeatureBaseStructure extends StructureFeature { BlockPos bpos = info.getPos(); float px = bpos.getX() - center.getX(); @@ -84,7 +82,7 @@ public class GiantIceStarStructure extends SDFStructureFeature { return info.getState(); }); } - + private List getFibonacciPoints(int count) { float max = count - 1; List result = new ArrayList(count); @@ -98,12 +96,12 @@ public class GiantIceStarStructure extends SDFStructureFeature { } return result; } - + @Override public StructureFeature.StructureStartFactory getStartFactory() { return StarStructureStart::new; } - + public static class StarStructureStart extends StructureStart { public StarStructureStart(StructureFeature feature, ChunkPos pos, int references, long seed) { super(feature, pos, references, seed); @@ -112,9 +110,11 @@ public class GiantIceStarStructure extends SDFStructureFeature { @Override public void generatePieces(RegistryAccess registryManager, ChunkGenerator chunkGenerator, StructureManager structureManager, ChunkPos chunkPos, Biome biome, NoneFeatureConfiguration featureConfiguration, LevelHeightAccessor levelHeightAccessor) { int x = chunkPos.getBlockX(MHelper.randRange(4, 12, random)); - int z = chunkPos.getBlockZ( MHelper.randRange(4, 12, random)); + int z = chunkPos.getBlockZ(MHelper.randRange(4, 12, random)); BlockPos start = new BlockPos(x, MHelper.randRange(32, 128, random), z); - VoxelPiece piece = new VoxelPiece((world) -> { ((SDFStructureFeature) this.getFeature()).getSDF(start, this.random).fillRecursive(world, start); }, random.nextInt()); + VoxelPiece piece = new VoxelPiece((world) -> { + ((SDFStructureFeature) this.getFeature()).getSDF(start, this.random).fillRecursive(world, start); + }, random.nextInt()); this.pieces.add(piece); //this.calculateBoundingBox(); diff --git a/src/main/java/ru/betterend/world/structures/features/GiantMossyGlowshroomStructure.java b/src/main/java/ru/betterend/world/structures/features/GiantMossyGlowshroomStructure.java index e24626db..abb29c87 100644 --- a/src/main/java/ru/betterend/world/structures/features/GiantMossyGlowshroomStructure.java +++ b/src/main/java/ru/betterend/world/structures/features/GiantMossyGlowshroomStructure.java @@ -1,10 +1,6 @@ package ru.betterend.world.structures.features; -import java.util.List; -import java.util.Random; - import com.mojang.math.Vector3f; - import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import ru.bclib.sdf.SDF; @@ -29,6 +25,9 @@ import ru.betterend.blocks.basis.FurBlock; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; +import java.util.List; +import java.util.Random; + public class GiantMossyGlowshroomStructure extends SDFStructureFeature { @Override protected SDF getSDF(BlockPos center, Random random) { @@ -39,39 +38,39 @@ public class GiantMossyGlowshroomStructure extends SDFStructureFeature { SDF upCone = new SDFSubtraction().setSourceA(posedCone2).setSourceB(posedCone3); SDF wave = new SDFFlatWave().setRaysCount(12).setIntensity(1.3F).setSource(upCone); SDF cones = new SDFSmoothUnion().setRadius(3).setSourceA(cone1).setSourceB(wave); - + SDF innerCone = new SDFTranslate().setTranslate(0, 1.25F, 0).setSource(upCone); innerCone = new SDFScale3D().setScale(1.2F, 1F, 1.2F).setSource(innerCone); cones = new SDFUnion().setSourceA(cones).setSourceB(innerCone); - + SDF glowCone = new SDFCappedCone().setHeight(3F).setRadius1(2F).setRadius2(12.5F); SDFPrimitive priGlowCone = (SDFPrimitive) glowCone; glowCone = new SDFTranslate().setTranslate(0, 4.25F, 0).setSource(glowCone); glowCone = new SDFSubtraction().setSourceA(glowCone).setSourceB(posedCone3); - + cones = new SDFUnion().setSourceA(cones).setSourceB(glowCone); - + OpenSimplexNoise noise = new OpenSimplexNoise(1234); cones = new SDFCoordModify().setFunction((pos) -> { float dist = MHelper.length(pos.x(), pos.z()); float y = pos.y() + (float) noise.eval(pos.x() * 0.1 + center.getX(), pos.z() * 0.1 + center.getZ()) * dist * 0.3F - dist * 0.15F; pos.set(pos.x(), y, pos.z()); }).setSource(cones); - + SDFTranslate HEAD_POS = (SDFTranslate) new SDFTranslate().setSource(new SDFTranslate().setTranslate(0, 2.5F, 0).setSource(cones)); - + SDF roots = new SDFSphere().setRadius(4F); SDFPrimitive primRoots = (SDFPrimitive) roots; roots = new SDFScale3D().setScale(1, 0.7F, 1).setSource(roots); SDFFlatWave rotRoots = (SDFFlatWave) new SDFFlatWave().setRaysCount(5).setIntensity(1.5F).setSource(roots); - + SDFBinary function = new SDFSmoothUnion().setRadius(4).setSourceB(new SDFUnion().setSourceA(HEAD_POS).setSourceB(rotRoots)); - + cone1.setBlock(EndBlocks.MOSSY_GLOWSHROOM_CAP); cone2.setBlock(EndBlocks.MOSSY_GLOWSHROOM_CAP); priGlowCone.setBlock(EndBlocks.MOSSY_GLOWSHROOM_HYMENOPHORE); primRoots.setBlock(EndBlocks.MOSSY_GLOWSHROOM.bark); - + float height = MHelper.randRange(10F, 25F, random); int count = MHelper.floor(height / 4); List spline = SplineHelper.makeSpline(0, 0, 0, 0, height, 0, count); @@ -81,11 +80,11 @@ public class GiantMossyGlowshroomStructure extends SDFStructureFeature { }); Vector3f pos = spline.get(spline.size() - 1); float scale = MHelper.randRange(2F, 3.5F, random); - + HEAD_POS.setTranslate(pos.x(), pos.y(), pos.z()); rotRoots.setAngle(random.nextFloat() * MHelper.PI2); function.setSourceA(sdf); - + return new SDFRound().setRadius(1.5F).setSource(new SDFScale() .setScale(scale) .setSource(function)) @@ -105,17 +104,17 @@ public class GiantMossyGlowshroomStructure extends SDFStructureFeature { info.setState(EndBlocks.MOSSY_GLOWSHROOM_CAP.defaultBlockState().setValue(MossyGlowshroomCapBlock.TRANSITION, true)); return info.getState(); } - + info.setState(EndBlocks.MOSSY_GLOWSHROOM_CAP.defaultBlockState()); return info.getState(); } else if (info.getState().getBlock() == EndBlocks.MOSSY_GLOWSHROOM_HYMENOPHORE) { - for (Direction dir: BlocksHelper.HORIZONTAL) { + for (Direction dir : BlocksHelper.HORIZONTAL) { if (info.getState(dir) == AIR) { info.setBlockPos(info.getPos().relative(dir), EndBlocks.MOSSY_GLOWSHROOM_FUR.defaultBlockState().setValue(FurBlock.FACING, dir)); } } - + if (info.getStateDown().getBlock() != EndBlocks.MOSSY_GLOWSHROOM_HYMENOPHORE) { info.setBlockPos(info.getPos().below(), EndBlocks.MOSSY_GLOWSHROOM_FUR.defaultBlockState().setValue(FurBlock.FACING, Direction.DOWN)); } diff --git a/src/main/java/ru/betterend/world/structures/features/MegaLakeSmallStructure.java b/src/main/java/ru/betterend/world/structures/features/MegaLakeSmallStructure.java index c9e96d74..1f2c525d 100644 --- a/src/main/java/ru/betterend/world/structures/features/MegaLakeSmallStructure.java +++ b/src/main/java/ru/betterend/world/structures/features/MegaLakeSmallStructure.java @@ -9,7 +9,6 @@ import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.Heightmap.Types; import net.minecraft.world.level.levelgen.feature.StructureFeature; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; -import net.minecraft.world.level.levelgen.structure.BoundingBox; import net.minecraft.world.level.levelgen.structure.StructureStart; import net.minecraft.world.level.levelgen.structure.templatesystem.StructureManager; import ru.bclib.util.MHelper; @@ -20,7 +19,7 @@ public class MegaLakeSmallStructure extends FeatureBaseStructure { public StructureFeature.StructureStartFactory getStartFactory() { return SDFStructureStart::new; } - + public static class SDFStructureStart extends StructureStart { public SDFStructureStart(StructureFeature feature, ChunkPos chunkPos, int references, long seed) { super(feature, chunkPos, references, seed); @@ -28,7 +27,7 @@ public class MegaLakeSmallStructure extends FeatureBaseStructure { @Override public void generatePieces(RegistryAccess registryManager, ChunkGenerator chunkGenerator, StructureManager structureManager, ChunkPos chunkPos, Biome biome, NoneFeatureConfiguration featureConfiguration, LevelHeightAccessor levelHeightAccessor) { - int x = chunkPos.getBlockX( MHelper.randRange(4, 12, random)); + int x = chunkPos.getBlockX(MHelper.randRange(4, 12, random)); int z = chunkPos.getBlockZ(MHelper.randRange(4, 12, random)); int y = chunkGenerator.getBaseHeight(x, z, Types.WORLD_SURFACE_WG, levelHeightAccessor); if (y > 5) { diff --git a/src/main/java/ru/betterend/world/structures/features/MegaLakeStructure.java b/src/main/java/ru/betterend/world/structures/features/MegaLakeStructure.java index d536fe46..6c557318 100644 --- a/src/main/java/ru/betterend/world/structures/features/MegaLakeStructure.java +++ b/src/main/java/ru/betterend/world/structures/features/MegaLakeStructure.java @@ -9,7 +9,6 @@ import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.Heightmap.Types; import net.minecraft.world.level.levelgen.feature.StructureFeature; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; -import net.minecraft.world.level.levelgen.structure.BoundingBox; import net.minecraft.world.level.levelgen.structure.StructureStart; import net.minecraft.world.level.levelgen.structure.templatesystem.StructureManager; import ru.bclib.util.MHelper; @@ -20,7 +19,7 @@ public class MegaLakeStructure extends FeatureBaseStructure { public StructureFeature.StructureStartFactory getStartFactory() { return SDFStructureStart::new; } - + public static class SDFStructureStart extends StructureStart { public SDFStructureStart(StructureFeature feature, ChunkPos chunkPos, int references, long seed) { super(feature, chunkPos, references, seed); diff --git a/src/main/java/ru/betterend/world/structures/features/MountainStructure.java b/src/main/java/ru/betterend/world/structures/features/MountainStructure.java index 5be93f26..cfec9fb6 100644 --- a/src/main/java/ru/betterend/world/structures/features/MountainStructure.java +++ b/src/main/java/ru/betterend/world/structures/features/MountainStructure.java @@ -9,7 +9,6 @@ import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.Heightmap.Types; import net.minecraft.world.level.levelgen.feature.StructureFeature; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; -import net.minecraft.world.level.levelgen.structure.BoundingBox; import net.minecraft.world.level.levelgen.structure.StructureStart; import net.minecraft.world.level.levelgen.structure.templatesystem.StructureManager; import ru.bclib.util.MHelper; @@ -20,7 +19,7 @@ public class MountainStructure extends FeatureBaseStructure { public StructureFeature.StructureStartFactory getStartFactory() { return SDFStructureStart::new; } - + public static class SDFStructureStart extends StructureStart { public SDFStructureStart(StructureFeature feature, ChunkPos chunkPos, int references, long seed) { super(feature, chunkPos, references, seed); @@ -29,7 +28,7 @@ public class MountainStructure extends FeatureBaseStructure { @Override public void generatePieces(RegistryAccess registryManager, ChunkGenerator chunkGenerator, StructureManager structureManager, ChunkPos chunkPos, Biome biome, NoneFeatureConfiguration featureConfiguration, LevelHeightAccessor levelHeightAccessor) { int x = chunkPos.getBlockX(MHelper.randRange(4, 12, random)); - int z =chunkPos.getBlockZ(MHelper.randRange(4, 12, random)); + int z = chunkPos.getBlockZ(MHelper.randRange(4, 12, random)); int y = chunkGenerator.getBaseHeight(x, z, Types.WORLD_SURFACE_WG, levelHeightAccessor); if (y > 5) { float radius = MHelper.randRange(50, 100, random); diff --git a/src/main/java/ru/betterend/world/structures/features/PaintedMountainStructure.java b/src/main/java/ru/betterend/world/structures/features/PaintedMountainStructure.java index d78bd5ca..83af1b97 100644 --- a/src/main/java/ru/betterend/world/structures/features/PaintedMountainStructure.java +++ b/src/main/java/ru/betterend/world/structures/features/PaintedMountainStructure.java @@ -11,7 +11,6 @@ import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.Heightmap.Types; import net.minecraft.world.level.levelgen.feature.StructureFeature; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; -import net.minecraft.world.level.levelgen.structure.BoundingBox; import net.minecraft.world.level.levelgen.structure.StructureStart; import net.minecraft.world.level.levelgen.structure.templatesystem.StructureManager; import ru.bclib.util.MHelper; @@ -20,12 +19,12 @@ import ru.betterend.world.structures.piece.PaintedMountainPiece; public class PaintedMountainStructure extends FeatureBaseStructure { private static final BlockState[] VARIANTS; - + @Override public StructureFeature.StructureStartFactory getStartFactory() { return SDFStructureStart::new; } - + public static class SDFStructureStart extends StructureStart { public SDFStructureStart(StructureFeature feature, ChunkPos chunkPos, int references, long seed) { super(feature, chunkPos, references, seed); @@ -44,15 +43,15 @@ public class PaintedMountainStructure extends FeatureBaseStructure { for (int i = 0; i < count; i++) { slises[i] = VARIANTS[random.nextInt(VARIANTS.length)]; } - this.pieces.add(new PaintedMountainPiece(new BlockPos(x, y, z), radius, height, random, biome, slises )); + this.pieces.add(new PaintedMountainPiece(new BlockPos(x, y, z), radius, height, random, biome, slises)); } //this.calculateBoundingBox(); } } - + static { - VARIANTS = new BlockState[] { + VARIANTS = new BlockState[]{ Blocks.END_STONE.defaultBlockState(), EndBlocks.FLAVOLITE.stone.defaultBlockState(), EndBlocks.VIOLECITE.stone.defaultBlockState(), diff --git a/src/main/java/ru/betterend/world/structures/features/SDFStructureFeature.java b/src/main/java/ru/betterend/world/structures/features/SDFStructureFeature.java index cc33b475..9932ea06 100644 --- a/src/main/java/ru/betterend/world/structures/features/SDFStructureFeature.java +++ b/src/main/java/ru/betterend/world/structures/features/SDFStructureFeature.java @@ -1,7 +1,5 @@ package ru.betterend.world.structures.features; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.core.RegistryAccess; import net.minecraft.world.level.ChunkPos; @@ -11,22 +9,23 @@ import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.Heightmap.Types; import net.minecraft.world.level.levelgen.feature.StructureFeature; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; -import net.minecraft.world.level.levelgen.structure.BoundingBox; import net.minecraft.world.level.levelgen.structure.StructureStart; import net.minecraft.world.level.levelgen.structure.templatesystem.StructureManager; import ru.bclib.sdf.SDF; import ru.bclib.util.MHelper; import ru.betterend.world.structures.piece.VoxelPiece; +import java.util.Random; + public abstract class SDFStructureFeature extends FeatureBaseStructure { - + protected abstract SDF getSDF(BlockPos pos, Random random); - + @Override public StructureFeature.StructureStartFactory getStartFactory() { return SDFStructureStart::new; } - + public static class SDFStructureStart extends StructureStart { public SDFStructureStart(StructureFeature feature, ChunkPos chunkPos, int references, long seed) { super(feature, chunkPos, references, seed); @@ -39,7 +38,9 @@ public abstract class SDFStructureFeature extends FeatureBaseStructure { int y = chunkGenerator.getBaseHeight(x, z, Types.WORLD_SURFACE_WG, levelHeightAccessor); if (y > 5) { BlockPos start = new BlockPos(x, y, z); - VoxelPiece piece = new VoxelPiece((world) -> { ((SDFStructureFeature) this.getFeature()).getSDF(start, this.random).fillRecursive(world, start); }, random.nextInt()); + VoxelPiece piece = new VoxelPiece((world) -> { + ((SDFStructureFeature) this.getFeature()).getSDF(start, this.random).fillRecursive(world, start); + }, random.nextInt()); this.pieces.add(piece); } diff --git a/src/main/java/ru/betterend/world/structures/piece/BasePiece.java b/src/main/java/ru/betterend/world/structures/piece/BasePiece.java index 957de957..bc594164 100644 --- a/src/main/java/ru/betterend/world/structures/piece/BasePiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/BasePiece.java @@ -14,6 +14,6 @@ public abstract class BasePiece extends StructurePiece { super(type, tag); fromNbt(tag); } - + protected abstract void fromNbt(CompoundTag tag); } \ No newline at end of file diff --git a/src/main/java/ru/betterend/world/structures/piece/CavePiece.java b/src/main/java/ru/betterend/world/structures/piece/CavePiece.java index 86b9220b..39cde6db 100644 --- a/src/main/java/ru/betterend/world/structures/piece/CavePiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/CavePiece.java @@ -1,7 +1,5 @@ package ru.betterend.world.structures.piece; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.nbt.CompoundTag; @@ -13,18 +11,19 @@ import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.structure.BoundingBox; -import net.minecraft.world.level.levelgen.structure.templatesystem.StructureManager; import ru.bclib.api.TagAPI; import ru.bclib.util.BlocksHelper; import ru.bclib.util.MHelper; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndStructures; +import java.util.Random; + public class CavePiece extends BasePiece { private OpenSimplexNoise noise; private BlockPos center; private float radius; - + public CavePiece(BlockPos center, float radius, int id) { super(EndStructures.CAVE_PIECE, id, null); this.center = center; @@ -37,7 +36,7 @@ public class CavePiece extends BasePiece { super(EndStructures.CAVE_PIECE, tag); makeBoundingBox(); } - + @Override public boolean postProcess(WorldGenLevel world, StructureFeatureManager arg, ChunkGenerator chunkGenerator, Random random, BoundingBox blockBox, ChunkPos chunkPos, BlockPos blockPos) { int x1 = MHelper.max(this.boundingBox.minX(), blockBox.minX()); @@ -46,7 +45,7 @@ public class CavePiece extends BasePiece { int z2 = MHelper.min(this.boundingBox.maxZ(), blockBox.maxZ()); int y1 = this.boundingBox.minY(); int y2 = this.boundingBox.maxY(); - + double hr = radius * 0.75; double nr = radius * 0.25; MutableBlockPos pos = new MutableBlockPos(); @@ -79,7 +78,7 @@ public class CavePiece extends BasePiece { } } } - + return true; } @@ -95,7 +94,7 @@ public class CavePiece extends BasePiece { radius = tag.getFloat("radius"); noise = new OpenSimplexNoise(MHelper.getSeed(534, center.getX(), center.getZ())); } - + private void makeBoundingBox() { int minX = MHelper.floor(center.getX() - radius); int minY = MHelper.floor(center.getY() - radius); diff --git a/src/main/java/ru/betterend/world/structures/piece/CrystalMountainPiece.java b/src/main/java/ru/betterend/world/structures/piece/CrystalMountainPiece.java index 9fb60aab..63d859e5 100644 --- a/src/main/java/ru/betterend/world/structures/piece/CrystalMountainPiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/CrystalMountainPiece.java @@ -1,7 +1,5 @@ package ru.betterend.world.structures.piece; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.nbt.CompoundTag; @@ -18,16 +16,17 @@ import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.Heightmap; import net.minecraft.world.level.levelgen.Heightmap.Types; import net.minecraft.world.level.levelgen.structure.BoundingBox; -import net.minecraft.world.level.levelgen.structure.templatesystem.StructureManager; import ru.bclib.api.BiomeAPI; import ru.bclib.api.TagAPI; import ru.bclib.util.MHelper; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndStructures; +import java.util.Random; + public class CrystalMountainPiece extends MountainPiece { private BlockState top; - + public CrystalMountainPiece(BlockPos center, float radius, float height, Random random, Biome biome) { super(EndStructures.MOUNTAIN_PIECE, center, radius, height, random, biome); top = biome.getGenerationSettings().getSurfaceBuilderConfig().getTopMaterial(); @@ -92,9 +91,9 @@ public class CrystalMountainPiece extends MountainPiece { } } } - + map = chunk.getOrCreateHeightmapUnprimed(Types.WORLD_SURFACE); - + // Big crystals int count = (map.getFirstAvailable(8, 8) - (center.getY() + 24)) / 7; count = Mth.clamp(count, 0, 8); @@ -112,7 +111,7 @@ public class CrystalMountainPiece extends MountainPiece { } } } - + // Small crystals count = (map.getFirstAvailable(8, 8) - (center.getY() + 24)) / 2; count = Mth.clamp(count, 4, 8); @@ -130,10 +129,10 @@ public class CrystalMountainPiece extends MountainPiece { } } } - + return true; } - + private void crystal(ChunkAccess chunk, BlockPos pos, int radius, int height, float fill, Random random) { MutableBlockPos mut = new MutableBlockPos(); int max = MHelper.floor(fill * radius + radius + 0.5F); diff --git a/src/main/java/ru/betterend/world/structures/piece/LakePiece.java b/src/main/java/ru/betterend/world/structures/piece/LakePiece.java index e4a17575..2955ea83 100644 --- a/src/main/java/ru/betterend/world/structures/piece/LakePiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/LakePiece.java @@ -1,10 +1,6 @@ package ru.betterend.world.structures.piece; -import java.util.Map; -import java.util.Random; - import com.google.common.collect.Maps; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; @@ -24,7 +20,6 @@ import net.minecraft.world.level.chunk.ChunkAccess; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.Heightmap.Types; import net.minecraft.world.level.levelgen.structure.BoundingBox; -import net.minecraft.world.level.levelgen.structure.templatesystem.StructureManager; import net.minecraft.world.level.material.FluidState; import ru.bclib.api.BiomeAPI; import ru.bclib.api.TagAPI; @@ -34,6 +29,9 @@ import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndStructures; +import java.util.Map; +import java.util.Random; + public class LakePiece extends BasePiece { private static final BlockState ENDSTONE = Blocks.END_STONE.defaultBlockState(); private static final BlockState WATER = Blocks.WATER.defaultBlockState(); @@ -44,9 +42,9 @@ public class LakePiece extends BasePiece { private float aspect; private float depth; private int seed; - + private ResourceLocation biomeID; - + public LakePiece(BlockPos center, float radius, float depth, Random random, Biome biome) { super(EndStructures.LAKE_PIECE, random.nextInt(), null); this.center = center; @@ -104,11 +102,11 @@ public class LakePiece extends BasePiece { int z2 = wz - center.getZ(); float clamp = getHeightClamp(world, 8, wx, wz); if (clamp < 0.01) continue; - + double n = noise.eval(nx, nz) * 1.5 + 1.5; double x3 = MHelper.sqr(x2 + noise.eval(nx, nz, 100) * 10); double z3 = MHelper.sqr(z2 + noise.eval(nx, nz, -100) * 10); - + for (int y = minY; y <= maxY; y++) { mut.setY((int) (y + n)); double y2 = MHelper.sqr((y - center.getY()) * aspect); @@ -144,7 +142,7 @@ public class LakePiece extends BasePiece { fixWater(world, chunk, mut, random, sx, sz); return true; } - + private void fixWater(WorldGenLevel world, ChunkAccess chunk, MutableBlockPos mut, Random random, int sx, int sz) { int minY = this.boundingBox.minY(); int maxY = this.boundingBox.maxY(); @@ -159,7 +157,7 @@ public class LakePiece extends BasePiece { mut.setY(y - 1); if (chunk.getBlockState(mut).isAir()) { mut.setY(y + 1); - + BlockState bState = chunk.getBlockState(mut); if (bState.isAir()) { bState = random.nextBoolean() ? ENDSTONE : world.getBiome(mut.offset(sx, 0, sz)).getGenerationSettings().getSurfaceBuilderConfig().getTopMaterial(); @@ -167,14 +165,14 @@ public class LakePiece extends BasePiece { else { bState = bState.getFluidState().isEmpty() ? ENDSTONE : EndBlocks.ENDSTONE_DUST.defaultBlockState(); } - + mut.setY(y); - + makeEndstonePillar(chunk, mut, bState); } else if (x > 1 && x < 15 && z > 1 && z < 15) { mut.setY(y); - for (Direction dir: BlocksHelper.HORIZONTAL) { + for (Direction dir : BlocksHelper.HORIZONTAL) { BlockPos wPos = mut.offset(dir.getStepX(), 0, dir.getStepZ()); if (chunk.getBlockState(wPos).isAir()) { mut.setY(y + 1); @@ -199,7 +197,7 @@ public class LakePiece extends BasePiece { } } } - + private void makeEndstonePillar(ChunkAccess chunk, MutableBlockPos mut, BlockState terrain) { chunk.setBlockState(mut, terrain, false); mut.setY(mut.getY() - 1); @@ -208,27 +206,27 @@ public class LakePiece extends BasePiece { mut.setY(mut.getY() - 1); } } - + private int getHeight(WorldGenLevel world, BlockPos pos) { int p = ((pos.getX() & 2047) << 11) | (pos.getZ() & 2047); int h = heightmap.getOrDefault(p, Byte.MIN_VALUE); if (h > Byte.MIN_VALUE) { return h; } - + if (!BiomeAPI.getBiomeID(world.getBiome(pos)).equals(biomeID)) { heightmap.put(p, (byte) 0); return 0; } - + h = world.getHeight(Types.WORLD_SURFACE_WG, pos.getX(), pos.getZ()); h = Mth.abs(h - center.getY()); h = h < 8 ? 1 : 0; - + heightmap.put(p, (byte) h); return h; } - + private float getHeightClamp(WorldGenLevel world, int radius, int posX, int posZ) { MutableBlockPos mut = new MutableBlockPos(); int r2 = radius * radius; @@ -250,7 +248,7 @@ public class LakePiece extends BasePiece { height /= max; return Mth.clamp(height, 0, 1); } - + private void makeBoundingBox() { int minX = MHelper.floor(center.getX() - radius - 8); int minY = MHelper.floor(center.getY() - depth - 8); diff --git a/src/main/java/ru/betterend/world/structures/piece/MountainPiece.java b/src/main/java/ru/betterend/world/structures/piece/MountainPiece.java index 791d9ff3..6c9fccf8 100644 --- a/src/main/java/ru/betterend/world/structures/piece/MountainPiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/MountainPiece.java @@ -1,10 +1,6 @@ package ru.betterend.world.structures.piece; -import java.util.Map; -import java.util.Random; - import com.google.common.collect.Maps; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.nbt.CompoundTag; @@ -17,11 +13,13 @@ import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.levelgen.Heightmap.Types; import net.minecraft.world.level.levelgen.feature.StructurePieceType; import net.minecraft.world.level.levelgen.structure.BoundingBox; -import net.minecraft.world.level.levelgen.structure.templatesystem.StructureManager; import ru.bclib.api.BiomeAPI; import ru.bclib.util.MHelper; import ru.betterend.noise.OpenSimplexNoise; +import java.util.Map; +import java.util.Random; + public abstract class MountainPiece extends BasePiece { protected Map heightmap = Maps.newHashMap(); protected OpenSimplexNoise noise1; @@ -33,7 +31,7 @@ public abstract class MountainPiece extends BasePiece { protected ResourceLocation biomeID; protected int seed1; protected int seed2; - + public MountainPiece(StructurePieceType type, BlockPos center, float radius, float height, Random random, Biome biome) { super(type, random.nextInt(), null); this.center = center; @@ -75,14 +73,14 @@ public abstract class MountainPiece extends BasePiece { noise1 = new OpenSimplexNoise(seed1); noise2 = new OpenSimplexNoise(seed2); } - + private int getHeight(WorldGenLevel world, BlockPos pos) { int p = ((pos.getX() & 2047) << 11) | (pos.getZ() & 2047); int h = heightmap.getOrDefault(p, Integer.MIN_VALUE); if (h > Integer.MIN_VALUE) { return h; } - + if (!BiomeAPI.getBiomeID(world.getBiome(pos)).equals(biomeID)) { heightmap.put(p, -10); return -10; @@ -94,19 +92,19 @@ public abstract class MountainPiece extends BasePiece { heightmap.put(p, h); return h; } - + h = MHelper.floor(noise2.eval(pos.getX() * 0.01, pos.getZ() * 0.01) * noise2.eval(pos.getX() * 0.002, pos.getZ() * 0.002) * 8 + 8); - + if (h < 0) { heightmap.put(p, 0); return 0; } - + heightmap.put(p, h); - + return h; } - + protected float getHeightClamp(WorldGenLevel world, int radius, int posX, int posZ) { MutableBlockPos mut = new MutableBlockPos(); float height = 0; @@ -127,7 +125,7 @@ public abstract class MountainPiece extends BasePiece { height /= max; return Mth.clamp(height / radius, 0, 1); } - + private void makeBoundingBox() { int minX = MHelper.floor(center.getX() - radius); int minY = MHelper.floor(center.getY() - radius); diff --git a/src/main/java/ru/betterend/world/structures/piece/NBTPiece.java b/src/main/java/ru/betterend/world/structures/piece/NBTPiece.java index 31710bfa..c0c731d4 100644 --- a/src/main/java/ru/betterend/world/structures/piece/NBTPiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/NBTPiece.java @@ -1,7 +1,5 @@ package ru.betterend.world.structures.piece; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.core.Vec3i; import net.minecraft.nbt.CompoundTag; @@ -15,13 +13,14 @@ import net.minecraft.world.level.block.Mirror; import net.minecraft.world.level.block.Rotation; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.structure.BoundingBox; -import net.minecraft.world.level.levelgen.structure.templatesystem.StructureManager; import net.minecraft.world.level.levelgen.structure.templatesystem.StructurePlaceSettings; import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate; import ru.bclib.util.MHelper; import ru.bclib.util.StructureHelper; import ru.betterend.registry.EndStructures; +import java.util.Random; + public class NBTPiece extends BasePiece { private ResourceLocation structureID; private Rotation rotation; @@ -30,7 +29,7 @@ public class NBTPiece extends BasePiece { private BlockPos pos; private int erosion; private boolean cover; - + public NBTPiece(ResourceLocation structureID, StructureTemplate structure, BlockPos pos, int erosion, boolean cover, Random random) { super(EndStructures.NBT_PIECE, random.nextInt(), null); this.structureID = structureID; @@ -72,8 +71,8 @@ public class NBTPiece extends BasePiece { @Override public boolean postProcess(WorldGenLevel world, StructureFeatureManager arg, ChunkGenerator chunkGenerator, Random random, BoundingBox blockBox, ChunkPos chunkPos, BlockPos blockPos) { BoundingBox bounds = BoundingBox.fromCorners( - new Vec3i(blockBox.minX(), this.boundingBox.minY(), blockBox.minZ()), - new Vec3i(blockBox.maxX(), this.boundingBox.maxX(), blockBox.maxZ()) + new Vec3i(blockBox.minX(), this.boundingBox.minY(), blockBox.minZ()), + new Vec3i(blockBox.maxX(), this.boundingBox.maxX(), blockBox.maxZ()) ); StructurePlaceSettings placementData = new StructurePlaceSettings().setRotation(rotation).setMirror(mirror).setBoundingBox(bounds); structure.placeInWorld(world, pos, pos, placementData, random, 2); @@ -90,7 +89,7 @@ public class NBTPiece extends BasePiece { } return true; } - + private void makeBoundingBox() { this.boundingBox = StructureHelper.getStructureBounds(pos, structure, rotation, mirror); } diff --git a/src/main/java/ru/betterend/world/structures/piece/PaintedMountainPiece.java b/src/main/java/ru/betterend/world/structures/piece/PaintedMountainPiece.java index c10e9740..a17512f8 100644 --- a/src/main/java/ru/betterend/world/structures/piece/PaintedMountainPiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/PaintedMountainPiece.java @@ -1,7 +1,5 @@ package ru.betterend.world.structures.piece; -import java.util.Random; - import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.nbt.CompoundTag; @@ -18,12 +16,14 @@ import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.Heightmap; import net.minecraft.world.level.levelgen.Heightmap.Types; import net.minecraft.world.level.levelgen.structure.BoundingBox; -import net.minecraft.world.level.levelgen.structure.templatesystem.StructureManager; import ru.bclib.util.MHelper; import ru.betterend.registry.EndStructures; +import java.util.Random; + public class PaintedMountainPiece extends MountainPiece { private BlockState[] slises; + public PaintedMountainPiece(BlockPos center, float radius, float height, Random random, Biome biome, BlockState[] slises) { super(EndStructures.PAINTED_MOUNTAIN_PIECE, center, radius, height, random, biome); this.slises = slises; @@ -37,7 +37,7 @@ public class PaintedMountainPiece extends MountainPiece { protected void addAdditionalSaveData(ServerLevel serverLevel, CompoundTag tag) { super.addAdditionalSaveData(serverLevel, tag); ListTag slise = new ListTag(); - for (BlockState state: slises) { + for (BlockState state : slises) { slise.add(NbtUtils.writeBlockState(state)); } tag.put("slises", slise); @@ -77,7 +77,7 @@ public class PaintedMountainPiece extends MountainPiece { int minY = map.getFirstAvailable(x, z); pos.setY(minY - 1); while (chunk.getBlockState(pos).isAir() && pos.getY() > 50) { - pos.setY(minY --); + pos.setY(minY--); } minY = pos.getY(); minY = Math.max(minY, map2.getFirstAvailable(x, z)); @@ -98,7 +98,7 @@ public class PaintedMountainPiece extends MountainPiece { } } } - + return true; } } diff --git a/src/main/java/ru/betterend/world/structures/piece/VoxelPiece.java b/src/main/java/ru/betterend/world/structures/piece/VoxelPiece.java index 5209c40e..40e4a46e 100644 --- a/src/main/java/ru/betterend/world/structures/piece/VoxelPiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/VoxelPiece.java @@ -1,8 +1,5 @@ package ru.betterend.world.structures.piece; -import java.util.Random; -import java.util.function.Consumer; - import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.server.level.ServerLevel; @@ -11,13 +8,15 @@ import net.minecraft.world.level.StructureFeatureManager; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.structure.BoundingBox; -import net.minecraft.world.level.levelgen.structure.templatesystem.StructureManager; import ru.bclib.world.structures.StructureWorld; import ru.betterend.registry.EndStructures; +import java.util.Random; +import java.util.function.Consumer; + public class VoxelPiece extends BasePiece { private StructureWorld world; - + public VoxelPiece(Consumer function, int id) { super(EndStructures.VOXEL_PIECE, id, null); world = new StructureWorld(); diff --git a/src/main/java/ru/betterend/world/surface/SulphuricSurfaceBuilder.java b/src/main/java/ru/betterend/world/surface/SulphuricSurfaceBuilder.java index 59c2742e..88eaab88 100644 --- a/src/main/java/ru/betterend/world/surface/SulphuricSurfaceBuilder.java +++ b/src/main/java/ru/betterend/world/surface/SulphuricSurfaceBuilder.java @@ -1,7 +1,5 @@ package ru.betterend.world.surface; -import java.util.Random; - import net.minecraft.core.Registry; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.block.state.BlockState; @@ -11,15 +9,17 @@ import net.minecraft.world.level.levelgen.surfacebuilders.SurfaceBuilderBaseConf import ru.bclib.util.MHelper; import ru.betterend.noise.OpenSimplexNoise; +import java.util.Random; + public class SulphuricSurfaceBuilder extends SurfaceBuilder { private static final OpenSimplexNoise NOISE = new OpenSimplexNoise(5123); - + public SulphuricSurfaceBuilder() { super(SurfaceBuilderBaseConfiguration.CODEC); } @Override - public void apply(Random random, ChunkAccess chunk, Biome biome, int x, int z, int height, double noise, BlockState defaultBlock, BlockState defaultFluid, int seaLevel, int seed, long n, SurfaceBuilderBaseConfiguration surfaceBlocks){ + public void apply(Random random, ChunkAccess chunk, Biome biome, int x, int z, int height, double noise, BlockState defaultBlock, BlockState defaultFluid, int seaLevel, int seed, long n, SurfaceBuilderBaseConfiguration surfaceBlocks) { double value = NOISE.eval(x * 0.03, z * 0.03) + NOISE.eval(x * 0.1, z * 0.1) * 0.3 + MHelper.randRange(-0.1, 0.1, MHelper.RANDOM); if (value < -0.6) { SurfaceBuilder.DEFAULT.apply(random, chunk, biome, x, z, height, noise, defaultBlock, defaultFluid, seaLevel, seed, n, SurfaceBuilders.DEFAULT_END_CONFIG); @@ -34,7 +34,7 @@ public class SulphuricSurfaceBuilder extends SurfaceBuilder SULPHURIC_SURFACE = register("sulphuric_surface", new SulphuricSurfaceBuilder()); - + private static SurfaceBuilder register(String name, SurfaceBuilder builder) { return Registry.register(Registry.SURFACE_BUILDER, name, builder); } - + private static SurfaceBuilderBaseConfiguration makeSimpleConfig(Block block) { BlockState state = block.defaultBlockState(); return new SurfaceBuilderBaseConfiguration(state, state, state); } - - public static void register() {} + + public static void register() { + } } diff --git a/src/main/java/shadow/fabric/api/client/rendering/v1/ArmorRenderingRegistry.java b/src/main/java/shadow/fabric/api/client/rendering/v1/ArmorRenderingRegistry.java index 068baebc..1c86ce0c 100644 --- a/src/main/java/shadow/fabric/api/client/rendering/v1/ArmorRenderingRegistry.java +++ b/src/main/java/shadow/fabric/api/client/rendering/v1/ArmorRenderingRegistry.java @@ -21,11 +21,6 @@ package shadow.fabric.api.client.rendering.v1; -import java.util.Arrays; - -import shadow.fabric.impl.client.rendering.ArmorRenderingRegistryImpl; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.model.HumanoidModel; @@ -34,6 +29,11 @@ import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import shadow.fabric.impl.client.rendering.ArmorRenderingRegistryImpl; + +import java.util.Arrays; /** * A class for registering custom armor models and textures for {@link Item}, to be provided by a {@link ModelProvider} or {@link TextureProvider}. @@ -49,120 +49,120 @@ import net.minecraft.world.item.ItemStack; */ @Environment(EnvType.CLIENT) public final class ArmorRenderingRegistry { - private ArmorRenderingRegistry() { - } + private ArmorRenderingRegistry() { + } - /** - * Registers a provider for custom armor models for an item. - * - * @param provider the provider for the model - * @param items the items to be registered for - */ - public static void registerModel(@Nullable ModelProvider provider, Item... items) { - registerModel(provider, Arrays.asList(items)); - } + /** + * Registers a provider for custom armor models for an item. + * + * @param provider the provider for the model + * @param items the items to be registered for + */ + public static void registerModel(@Nullable ModelProvider provider, Item... items) { + registerModel(provider, Arrays.asList(items)); + } - /** - * Registers a provider for custom armor models for an item. - * - * @param provider the provider for the model - * @param items the items to be registered for - */ - public static void registerModel(@Nullable ModelProvider provider, Iterable items) { - ArmorRenderingRegistryImpl.registerModel(provider, items); - } + /** + * Registers a provider for custom armor models for an item. + * + * @param provider the provider for the model + * @param items the items to be registered for + */ + public static void registerModel(@Nullable ModelProvider provider, Iterable items) { + ArmorRenderingRegistryImpl.registerModel(provider, items); + } - /** - * Registers a provider for custom texture models for an item. - * - * @param provider the provider for the texture - * @param items the items to be registered for - */ - public static void registerTexture(@Nullable TextureProvider provider, Item... items) { - registerTexture(provider, Arrays.asList(items)); - } + /** + * Registers a provider for custom texture models for an item. + * + * @param provider the provider for the texture + * @param items the items to be registered for + */ + public static void registerTexture(@Nullable TextureProvider provider, Item... items) { + registerTexture(provider, Arrays.asList(items)); + } - /** - * Registers a provider for custom texture models for an item. - * - * @param provider the provider for the texture - * @param items the items to be registered for - */ - public static void registerTexture(@Nullable TextureProvider provider, Iterable items) { - ArmorRenderingRegistryImpl.registerTexture(provider, items); - } + /** + * Registers a provider for custom texture models for an item. + * + * @param provider the provider for the texture + * @param items the items to be registered for + */ + public static void registerTexture(@Nullable TextureProvider provider, Iterable items) { + ArmorRenderingRegistryImpl.registerTexture(provider, items); + } - /** - * Register simple armor items to use the vanilla armor file name under the mods namespace. - * - * @param identifier The namespace + path to use for the armor texture location. - * @param items the items to be registered - */ - public static void registerSimpleTexture(ResourceLocation identifier, Item... items) { - registerTexture((entity, stack, slot, secondLayer, suffix, defaultTexture) -> { - return new ResourceLocation(identifier.getNamespace(), "textures/models/armor/" + identifier.getPath() + "_layer_" + (secondLayer ? 2 : 1) + (suffix == null ? "" : "_" + suffix) + ".png"); - }, items); - } + /** + * Register simple armor items to use the vanilla armor file name under the mods namespace. + * + * @param identifier The namespace + path to use for the armor texture location. + * @param items the items to be registered + */ + public static void registerSimpleTexture(ResourceLocation identifier, Item... items) { + registerTexture((entity, stack, slot, secondLayer, suffix, defaultTexture) -> { + return new ResourceLocation(identifier.getNamespace(), "textures/models/armor/" + identifier.getPath() + "_layer_" + (secondLayer ? 2 : 1) + (suffix == null ? "" : "_" + suffix) + ".png"); + }, items); + } - /** - * Gets the model of the armor piece. - * - * @param entity The entity equipping the armor - * @param stack The item stack of the armor - * @param slot The slot which the armor is in - * @param defaultModel The default model that vanilla provides - * @return The model of the armor piece. - */ - @NotNull - public static HumanoidModel getArmorModel(LivingEntity entity, ItemStack stack, EquipmentSlot slot, HumanoidModel defaultModel) { - return ArmorRenderingRegistryImpl.getArmorModel(entity, stack, slot, defaultModel); - } + /** + * Gets the model of the armor piece. + * + * @param entity The entity equipping the armor + * @param stack The item stack of the armor + * @param slot The slot which the armor is in + * @param defaultModel The default model that vanilla provides + * @return The model of the armor piece. + */ + @NotNull + public static HumanoidModel getArmorModel(LivingEntity entity, ItemStack stack, EquipmentSlot slot, HumanoidModel defaultModel) { + return ArmorRenderingRegistryImpl.getArmorModel(entity, stack, slot, defaultModel); + } - /** - * Gets the armor texture {@link net.minecraft.resources.ResourceLocation}. - * - * @param entity The entity equipping the armor - * @param stack The item stack of the armor - * @param slot The slot which the armor is in - * @param secondLayer True if using the second texture layer - * @param suffix The texture suffix, used in vanilla by {@link net.minecraft.world.item.DyeableArmorItem} - * @param defaultTexture The default vanilla texture identifier - * @return the custom armor texture identifier, return null to use the vanilla ones. Defaulted to the item's registry id. - */ - @NotNull - public static ResourceLocation getArmorTexture(LivingEntity entity, ItemStack stack, EquipmentSlot slot, boolean secondLayer, @Nullable String suffix, ResourceLocation defaultTexture) { - return ArmorRenderingRegistryImpl.getArmorTexture(entity, stack, slot, secondLayer, suffix, defaultTexture); - } + /** + * Gets the armor texture {@link net.minecraft.resources.ResourceLocation}. + * + * @param entity The entity equipping the armor + * @param stack The item stack of the armor + * @param slot The slot which the armor is in + * @param secondLayer True if using the second texture layer + * @param suffix The texture suffix, used in vanilla by {@link net.minecraft.world.item.DyeableArmorItem} + * @param defaultTexture The default vanilla texture identifier + * @return the custom armor texture identifier, return null to use the vanilla ones. Defaulted to the item's registry id. + */ + @NotNull + public static ResourceLocation getArmorTexture(LivingEntity entity, ItemStack stack, EquipmentSlot slot, boolean secondLayer, @Nullable String suffix, ResourceLocation defaultTexture) { + return ArmorRenderingRegistryImpl.getArmorTexture(entity, stack, slot, secondLayer, suffix, defaultTexture); + } - @FunctionalInterface - @Environment(EnvType.CLIENT) - public interface ModelProvider { - /** - * Gets the model of the armor piece. - * - * @param entity The entity equipping the armor - * @param stack The item stack of the armor - * @param slot The slot which the armor is in - * @param defaultModel The default vanilla armor model - * @return The model of the armor piece. Should never be null. - */ - @NotNull - HumanoidModel getArmorModel(LivingEntity entity, ItemStack stack, EquipmentSlot slot, HumanoidModel defaultModel); - } + @FunctionalInterface + @Environment(EnvType.CLIENT) + public interface ModelProvider { + /** + * Gets the model of the armor piece. + * + * @param entity The entity equipping the armor + * @param stack The item stack of the armor + * @param slot The slot which the armor is in + * @param defaultModel The default vanilla armor model + * @return The model of the armor piece. Should never be null. + */ + @NotNull + HumanoidModel getArmorModel(LivingEntity entity, ItemStack stack, EquipmentSlot slot, HumanoidModel defaultModel); + } - @FunctionalInterface - @Environment(EnvType.CLIENT) - public interface TextureProvider { - /** - * Gets the armor texture {@link net.minecraft.resources.ResourceLocation}. - * - * @param entity The entity equipping the armor - * @param stack The item stack of the armor - * @param slot The slot which the armor is in - * @param defaultTexture The default vanilla texture identifier - * @return the custom armor texture identifier. Should never be null. - */ - @NotNull - ResourceLocation getArmorTexture(LivingEntity entity, ItemStack stack, EquipmentSlot slot, boolean secondLayer, @Nullable String suffix, ResourceLocation defaultTexture); - } + @FunctionalInterface + @Environment(EnvType.CLIENT) + public interface TextureProvider { + /** + * Gets the armor texture {@link net.minecraft.resources.ResourceLocation}. + * + * @param entity The entity equipping the armor + * @param stack The item stack of the armor + * @param slot The slot which the armor is in + * @param defaultTexture The default vanilla texture identifier + * @return the custom armor texture identifier. Should never be null. + */ + @NotNull + ResourceLocation getArmorTexture(LivingEntity entity, ItemStack stack, EquipmentSlot slot, boolean secondLayer, @Nullable String suffix, ResourceLocation defaultTexture); + } } diff --git a/src/main/java/shadow/fabric/impl/client/rendering/ArmorProviderExtensions.java b/src/main/java/shadow/fabric/impl/client/rendering/ArmorProviderExtensions.java index 2f076f8a..c0917653 100644 --- a/src/main/java/shadow/fabric/impl/client/rendering/ArmorProviderExtensions.java +++ b/src/main/java/shadow/fabric/impl/client/rendering/ArmorProviderExtensions.java @@ -21,17 +21,17 @@ package shadow.fabric.impl.client.rendering; -import shadow.fabric.api.client.rendering.v1.ArmorRenderingRegistry; import org.jetbrains.annotations.Nullable; +import shadow.fabric.api.client.rendering.v1.ArmorRenderingRegistry; public interface ArmorProviderExtensions { - @Nullable - ArmorRenderingRegistry.ModelProvider fabric_getArmorModelProvider(); + @Nullable + ArmorRenderingRegistry.ModelProvider fabric_getArmorModelProvider(); - @Nullable - ArmorRenderingRegistry.TextureProvider fabric_getArmorTextureProvider(); + @Nullable + ArmorRenderingRegistry.TextureProvider fabric_getArmorTextureProvider(); - void fabric_setArmorModelProvider(@Nullable ArmorRenderingRegistry.ModelProvider provider); + void fabric_setArmorModelProvider(@Nullable ArmorRenderingRegistry.ModelProvider provider); - void fabric_setArmorTextureProvider(@Nullable ArmorRenderingRegistry.TextureProvider provider); + void fabric_setArmorTextureProvider(@Nullable ArmorRenderingRegistry.TextureProvider provider); } diff --git a/src/main/java/shadow/fabric/impl/client/rendering/ArmorRenderingRegistryImpl.java b/src/main/java/shadow/fabric/impl/client/rendering/ArmorRenderingRegistryImpl.java index 35ae8c14..35815179 100644 --- a/src/main/java/shadow/fabric/impl/client/rendering/ArmorRenderingRegistryImpl.java +++ b/src/main/java/shadow/fabric/impl/client/rendering/ArmorRenderingRegistryImpl.java @@ -21,62 +21,62 @@ package shadow.fabric.impl.client.rendering; -import java.util.Objects; - -import shadow.fabric.api.client.rendering.v1.ArmorRenderingRegistry; -import org.jetbrains.annotations.Nullable; import net.minecraft.client.model.HumanoidModel; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; +import org.jetbrains.annotations.Nullable; +import shadow.fabric.api.client.rendering.v1.ArmorRenderingRegistry; + +import java.util.Objects; public final class ArmorRenderingRegistryImpl { - private ArmorRenderingRegistryImpl() { - } + private ArmorRenderingRegistryImpl() { + } - public static void registerModel(ArmorRenderingRegistry.ModelProvider provider, Iterable items) { - Objects.requireNonNull(items); + public static void registerModel(ArmorRenderingRegistry.ModelProvider provider, Iterable items) { + Objects.requireNonNull(items); - for (Item item : items) { - Objects.requireNonNull(item); + for (Item item : items) { + Objects.requireNonNull(item); - ((ArmorProviderExtensions) item).fabric_setArmorModelProvider(provider); - } - } + ((ArmorProviderExtensions) item).fabric_setArmorModelProvider(provider); + } + } - public static void registerTexture(ArmorRenderingRegistry.TextureProvider provider, Iterable items) { - Objects.requireNonNull(items); + public static void registerTexture(ArmorRenderingRegistry.TextureProvider provider, Iterable items) { + Objects.requireNonNull(items); - for (Item item : items) { - Objects.requireNonNull(item); + for (Item item : items) { + Objects.requireNonNull(item); - ((ArmorProviderExtensions) item).fabric_setArmorTextureProvider(provider); - } - } + ((ArmorProviderExtensions) item).fabric_setArmorTextureProvider(provider); + } + } - public static HumanoidModel getArmorModel(LivingEntity entity, ItemStack stack, EquipmentSlot slot, HumanoidModel defaultModel) { - if (!stack.isEmpty()) { - ArmorRenderingRegistry.ModelProvider provider = ((ArmorProviderExtensions) stack.getItem()).fabric_getArmorModelProvider(); + public static HumanoidModel getArmorModel(LivingEntity entity, ItemStack stack, EquipmentSlot slot, HumanoidModel defaultModel) { + if (!stack.isEmpty()) { + ArmorRenderingRegistry.ModelProvider provider = ((ArmorProviderExtensions) stack.getItem()).fabric_getArmorModelProvider(); - if (provider != null) { - return provider.getArmorModel(entity, stack, slot, defaultModel); - } - } + if (provider != null) { + return provider.getArmorModel(entity, stack, slot, defaultModel); + } + } - return defaultModel; - } + return defaultModel; + } - public static ResourceLocation getArmorTexture(LivingEntity entity, ItemStack stack, EquipmentSlot slot, boolean secondLayer, @Nullable String suffix, ResourceLocation defaultTexture) { - if (!stack.isEmpty()) { - ArmorRenderingRegistry.TextureProvider provider = ((ArmorProviderExtensions) stack.getItem()).fabric_getArmorTextureProvider(); + public static ResourceLocation getArmorTexture(LivingEntity entity, ItemStack stack, EquipmentSlot slot, boolean secondLayer, @Nullable String suffix, ResourceLocation defaultTexture) { + if (!stack.isEmpty()) { + ArmorRenderingRegistry.TextureProvider provider = ((ArmorProviderExtensions) stack.getItem()).fabric_getArmorTextureProvider(); - if (provider != null) { - return provider.getArmorTexture(entity, stack, slot, secondLayer, suffix, defaultTexture); - } - } + if (provider != null) { + return provider.getArmorTexture(entity, stack, slot, secondLayer, suffix, defaultTexture); + } + } - return defaultTexture; - } + return defaultTexture; + } } diff --git a/src/main/java/shadow/fabric/mixin/client/rendering/MixinArmorFeatureRenderer.java b/src/main/java/shadow/fabric/mixin/client/rendering/MixinArmorFeatureRenderer.java index 5b678eee..88b00048 100644 --- a/src/main/java/shadow/fabric/mixin/client/rendering/MixinArmorFeatureRenderer.java +++ b/src/main/java/shadow/fabric/mixin/client/rendering/MixinArmorFeatureRenderer.java @@ -22,21 +22,8 @@ package shadow.fabric.mixin.client.rendering; import com.mojang.blaze3d.vertex.PoseStack; -import java.util.Map; -import java.util.Objects; - -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.Unique; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import org.spongepowered.asm.mixin.injection.callback.LocalCapture; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import shadow.fabric.api.client.rendering.v1.ArmorRenderingRegistry; import net.minecraft.client.model.HumanoidModel; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.entity.RenderLayerParent; @@ -47,61 +34,74 @@ import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.item.ArmorItem; import net.minecraft.world.item.ItemStack; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import org.spongepowered.asm.mixin.injection.callback.LocalCapture; +import shadow.fabric.api.client.rendering.v1.ArmorRenderingRegistry; + +import java.util.Map; +import java.util.Objects; @Mixin(HumanoidArmorLayer.class) @Environment(EnvType.CLIENT) public abstract class MixinArmorFeatureRenderer extends RenderLayer { - @Shadow - @Final - private static Map ARMOR_LOCATION_CACHE; + @Shadow + @Final + private static Map ARMOR_LOCATION_CACHE; - public MixinArmorFeatureRenderer(RenderLayerParent context) { - super(context); + public MixinArmorFeatureRenderer(RenderLayerParent context) { + super(context); - } + } - @Unique - private LivingEntity storedEntity; - @Unique - private EquipmentSlot storedSlot; + @Unique + private LivingEntity storedEntity; + @Unique + private EquipmentSlot storedSlot; - @Inject(method = "render", at = @At("HEAD")) - private void storeEntity(PoseStack matrixStack, MultiBufferSource vertexConsumerProvider, int i, LivingEntity livingEntity, float f, float g, float h, float j, float k, float l, CallbackInfo ci) { - // We store the living entity wearing the armor before we render - this.storedEntity = livingEntity; - } + @Inject(method = "render", at = @At("HEAD")) + private void storeEntity(PoseStack matrixStack, MultiBufferSource vertexConsumerProvider, int i, LivingEntity livingEntity, float f, float g, float h, float j, float k, float l, CallbackInfo ci) { + // We store the living entity wearing the armor before we render + this.storedEntity = livingEntity; + } - @Inject(method = "renderArmorPiece", at = @At("HEAD")) - private void storeSlot(PoseStack matrices, MultiBufferSource vertexConsumers, LivingEntity livingEntity, EquipmentSlot slot, int i, HumanoidModel bipedEntityModel, CallbackInfo ci) { - // We store the current armor slot that is rendering before we render each armor piece - this.storedSlot = slot; - } + @Inject(method = "renderArmorPiece", at = @At("HEAD")) + private void storeSlot(PoseStack matrices, MultiBufferSource vertexConsumers, LivingEntity livingEntity, EquipmentSlot slot, int i, HumanoidModel bipedEntityModel, CallbackInfo ci) { + // We store the current armor slot that is rendering before we render each armor piece + this.storedSlot = slot; + } - @Inject(method = "render", at = @At("RETURN")) - private void removeStored(PoseStack matrixStack, MultiBufferSource vertexConsumerProvider, int i, LivingEntity livingEntity, float f, float g, float h, float j, float k, float l, CallbackInfo ci) { - // We remove the stored data after we render - this.storedEntity = null; - this.storedSlot = null; - } + @Inject(method = "render", at = @At("RETURN")) + private void removeStored(PoseStack matrixStack, MultiBufferSource vertexConsumerProvider, int i, LivingEntity livingEntity, float f, float g, float h, float j, float k, float l, CallbackInfo ci) { + // We remove the stored data after we render + this.storedEntity = null; + this.storedSlot = null; + } - @Inject(method = "getArmorModel", at = @At("RETURN"), cancellable = true) - private void selectArmorModel(EquipmentSlot slot, CallbackInfoReturnable> cir) { - ItemStack stack = storedEntity.getItemBySlot(slot); + @Inject(method = "getArmorModel", at = @At("RETURN"), cancellable = true) + private void selectArmorModel(EquipmentSlot slot, CallbackInfoReturnable> cir) { + ItemStack stack = storedEntity.getItemBySlot(slot); - HumanoidModel defaultModel = cir.getReturnValue(); - HumanoidModel model = ArmorRenderingRegistry.getArmorModel(storedEntity, stack, slot, defaultModel); + HumanoidModel defaultModel = cir.getReturnValue(); + HumanoidModel model = ArmorRenderingRegistry.getArmorModel(storedEntity, stack, slot, defaultModel); - if (model != defaultModel) { - cir.setReturnValue(model); - } - } + if (model != defaultModel) { + cir.setReturnValue(model); + } + } - @Inject(method = "getArmorLocation", at = @At(value = "INVOKE", target = "Ljava/util/Map;computeIfAbsent(Ljava/lang/Object;Ljava/util/function/Function;)Ljava/lang/Object;"), cancellable = true, locals = LocalCapture.CAPTURE_FAILHARD) - private void getArmorTexture(ArmorItem armorItem, boolean secondLayer, /* @Nullable */ String suffix, CallbackInfoReturnable cir, String vanillaIdentifier) { - String texture = ArmorRenderingRegistry.getArmorTexture(storedEntity, storedEntity.getItemBySlot(storedSlot), storedSlot, secondLayer, suffix, new ResourceLocation(vanillaIdentifier)).toString(); + @Inject(method = "getArmorLocation", at = @At(value = "INVOKE", target = "Ljava/util/Map;computeIfAbsent(Ljava/lang/Object;Ljava/util/function/Function;)Ljava/lang/Object;"), cancellable = true, locals = LocalCapture.CAPTURE_FAILHARD) + private void getArmorTexture(ArmorItem armorItem, boolean secondLayer, /* @Nullable */ String suffix, CallbackInfoReturnable cir, String vanillaIdentifier) { + String texture = ArmorRenderingRegistry.getArmorTexture(storedEntity, storedEntity.getItemBySlot(storedSlot), storedSlot, secondLayer, suffix, new ResourceLocation(vanillaIdentifier)).toString(); - if (!Objects.equals(texture, vanillaIdentifier)) { - cir.setReturnValue(ARMOR_LOCATION_CACHE.computeIfAbsent(texture, ResourceLocation::new)); - } - } + if (!Objects.equals(texture, vanillaIdentifier)) { + cir.setReturnValue(ARMOR_LOCATION_CACHE.computeIfAbsent(texture, ResourceLocation::new)); + } + } } diff --git a/src/main/java/shadow/fabric/mixin/client/rendering/MixinItem.java b/src/main/java/shadow/fabric/mixin/client/rendering/MixinItem.java index aa5c6bab..b08dc5a5 100644 --- a/src/main/java/shadow/fabric/mixin/client/rendering/MixinItem.java +++ b/src/main/java/shadow/fabric/mixin/client/rendering/MixinItem.java @@ -30,28 +30,28 @@ import shadow.fabric.impl.client.rendering.ArmorProviderExtensions; @Mixin(Item.class) public class MixinItem implements ArmorProviderExtensions { - @Unique - private ArmorRenderingRegistry.ModelProvider armorModelProvider; - @Unique - private ArmorRenderingRegistry.TextureProvider armorTextureProvider; + @Unique + private ArmorRenderingRegistry.ModelProvider armorModelProvider; + @Unique + private ArmorRenderingRegistry.TextureProvider armorTextureProvider; - @Override - public ArmorRenderingRegistry.ModelProvider fabric_getArmorModelProvider() { - return armorModelProvider; - } + @Override + public ArmorRenderingRegistry.ModelProvider fabric_getArmorModelProvider() { + return armorModelProvider; + } - @Override - public ArmorRenderingRegistry.TextureProvider fabric_getArmorTextureProvider() { - return armorTextureProvider; - } + @Override + public ArmorRenderingRegistry.TextureProvider fabric_getArmorTextureProvider() { + return armorTextureProvider; + } - @Override - public void fabric_setArmorModelProvider(ArmorRenderingRegistry.ModelProvider provider) { - armorModelProvider = provider; - } + @Override + public void fabric_setArmorModelProvider(ArmorRenderingRegistry.ModelProvider provider) { + armorModelProvider = provider; + } - @Override - public void fabric_setArmorTextureProvider(ArmorRenderingRegistry.TextureProvider provider) { - armorTextureProvider = provider; - } + @Override + public void fabric_setArmorTextureProvider(ArmorRenderingRegistry.TextureProvider provider) { + armorTextureProvider = provider; + } } \ No newline at end of file From 80918ea7e4f201f3dc190f928353b38f11fc4b99 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Thu, 8 Jul 2021 00:31:18 +0300 Subject: [PATCH 081/595] Vent smoke fixes --- .../java/ru/betterend/blocks/HydrothermalVentBlock.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/HydrothermalVentBlock.java b/src/main/java/ru/betterend/blocks/HydrothermalVentBlock.java index 0eb88aea..583579f0 100644 --- a/src/main/java/ru/betterend/blocks/HydrothermalVentBlock.java +++ b/src/main/java/ru/betterend/blocks/HydrothermalVentBlock.java @@ -129,16 +129,16 @@ public class HydrothermalVentBlock extends BaseBlockNotFull implements EntityBlo @Environment(EnvType.CLIENT) public void animateTick(BlockState state, Level world, BlockPos pos, Random random) { - if (!state.getValue(ACTIVATED) && random.nextBoolean()) { - super.animateTick(state, world, pos, random); + super.animateTick(state, world, pos, random); + if (random.nextBoolean()) { double x = pos.getX() + random.nextDouble(); double y = pos.getY() + 0.9 + random.nextDouble() * 0.3; double z = pos.getZ() + random.nextDouble(); - if (state.getValue(WATERLOGGED)) { + if (state.getValue(ACTIVATED)) { world.addParticle(EndParticles.GEYSER_PARTICLE, x, y, z, 0, 0, 0); } else { - world.addParticle(ParticleTypes.SMOKE, x, y, z, 0, 0, 0); + world.addParticle(ParticleTypes.LARGE_SMOKE, x, y, z, 0, 0, 0); } } } From c623da26ed44199e06547795146c5e5c2b1ed827 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Thu, 8 Jul 2021 01:22:57 +0300 Subject: [PATCH 082/595] Fixed REI integration --- .../ru/betterend/blocks/entities/PedestalBlockEntity.java | 1 + .../ru/betterend/client/render/EternalCrystalRenderer.java | 3 +-- src/main/java/ru/betterend/integration/rei/REIPlugin.java | 4 ++-- .../java/ru/betterend/recipe/builders/AlloyingRecipe.java | 2 -- src/main/java/ru/betterend/recipe/builders/AnvilRecipe.java | 1 - .../java/ru/betterend/recipe/builders/InfusionRecipe.java | 3 --- 6 files changed, 4 insertions(+), 10 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/entities/PedestalBlockEntity.java b/src/main/java/ru/betterend/blocks/entities/PedestalBlockEntity.java index dab530c0..d62077f2 100644 --- a/src/main/java/ru/betterend/blocks/entities/PedestalBlockEntity.java +++ b/src/main/java/ru/betterend/blocks/entities/PedestalBlockEntity.java @@ -139,6 +139,7 @@ public class PedestalBlockEntity extends BlockEntity implements Container, Block if (blockEntity.age > blockEntity.maxAge) { blockEntity.age = 0; } + System.out.println(blockEntity.age); } } } diff --git a/src/main/java/ru/betterend/client/render/EternalCrystalRenderer.java b/src/main/java/ru/betterend/client/render/EternalCrystalRenderer.java index a6ecb0ed..324c9584 100644 --- a/src/main/java/ru/betterend/client/render/EternalCrystalRenderer.java +++ b/src/main/java/ru/betterend/client/render/EternalCrystalRenderer.java @@ -44,8 +44,7 @@ public class EternalCrystalRenderer { matrices.popPose(); } - public static float[] colors(int age) { - double delta = age * 0.01; + public static float[] colors(float delta) { int index = MHelper.floor(delta); int index2 = (index + 1) & 3; delta -= index; diff --git a/src/main/java/ru/betterend/integration/rei/REIPlugin.java b/src/main/java/ru/betterend/integration/rei/REIPlugin.java index c3330b46..507b9308 100644 --- a/src/main/java/ru/betterend/integration/rei/REIPlugin.java +++ b/src/main/java/ru/betterend/integration/rei/REIPlugin.java @@ -31,9 +31,9 @@ import java.util.stream.Collectors; public class REIPlugin implements REIClientPlugin { public final static ResourceLocation PLUGIN_ID = BetterEnd.makeID("rei_plugin"); public final static CategoryIdentifier ALLOYING_FUEL = CategoryIdentifier.of(BetterEnd.MOD_ID, "alloying_fuel"); - public final static CategoryIdentifier ALLOYING = AlloyingRecipe.ID; + public final static CategoryIdentifier ALLOYING = CategoryIdentifier.of(BetterEnd.MOD_ID, AlloyingRecipe.GROUP); public final static CategoryIdentifier SMITHING = CategoryIdentifier.of(BetterEnd.MOD_ID, AnvilRecipe.ID.getPath()); - public final static CategoryIdentifier INFUSION = InfusionRecipe.ID; + public final static CategoryIdentifier INFUSION = CategoryIdentifier.of(BetterEnd.MOD_ID, InfusionRecipe.GROUP); private EntryStack END_STONE_SMELTER; private EntryStack INFUSION_RITUAL; diff --git a/src/main/java/ru/betterend/recipe/builders/AlloyingRecipe.java b/src/main/java/ru/betterend/recipe/builders/AlloyingRecipe.java index 13c325d9..db042ffb 100644 --- a/src/main/java/ru/betterend/recipe/builders/AlloyingRecipe.java +++ b/src/main/java/ru/betterend/recipe/builders/AlloyingRecipe.java @@ -28,11 +28,9 @@ import ru.betterend.util.ItemUtil; import ru.betterend.util.RecipeHelper; public class AlloyingRecipe implements Recipe, BetterEndRecipe { - public final static String GROUP = "alloying"; public final static RecipeType TYPE = BCLRecipeManager.registerType(BetterEnd.MOD_ID, GROUP); public final static Serializer SERIALIZER = BCLRecipeManager.registerSerializer(BetterEnd.MOD_ID, GROUP, new Serializer()); - public final static CategoryIdentifier ID = CategoryIdentifier.of(BetterEnd.MOD_ID, GROUP); protected final RecipeType type; protected final ResourceLocation id; diff --git a/src/main/java/ru/betterend/recipe/builders/AnvilRecipe.java b/src/main/java/ru/betterend/recipe/builders/AnvilRecipe.java index a401408b..7082a566 100644 --- a/src/main/java/ru/betterend/recipe/builders/AnvilRecipe.java +++ b/src/main/java/ru/betterend/recipe/builders/AnvilRecipe.java @@ -34,7 +34,6 @@ import ru.betterend.util.RecipeHelper; import java.util.Objects; public class AnvilRecipe implements Recipe, BetterEndRecipe { - public final static String GROUP = "smithing"; public final static RecipeType TYPE = BCLRecipeManager.registerType(BetterEnd.MOD_ID, GROUP); public final static Serializer SERIALIZER = BCLRecipeManager.registerSerializer(BetterEnd.MOD_ID, GROUP, new Serializer()); diff --git a/src/main/java/ru/betterend/recipe/builders/InfusionRecipe.java b/src/main/java/ru/betterend/recipe/builders/InfusionRecipe.java index dfb58867..4ebdfb40 100644 --- a/src/main/java/ru/betterend/recipe/builders/InfusionRecipe.java +++ b/src/main/java/ru/betterend/recipe/builders/InfusionRecipe.java @@ -2,7 +2,6 @@ package ru.betterend.recipe.builders; import com.google.gson.JsonObject; import com.mojang.brigadier.exceptions.CommandSyntaxException; -import me.shedaniel.rei.api.common.category.CategoryIdentifier; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.core.NonNullList; @@ -28,11 +27,9 @@ import ru.betterend.util.ItemUtil; import java.util.Arrays; public class InfusionRecipe implements Recipe, BetterEndRecipe { - public final static String GROUP = "infusion"; public final static RecipeType TYPE = BCLRecipeManager.registerType(BetterEnd.MOD_ID, GROUP); public final static Serializer SERIALIZER = BCLRecipeManager.registerSerializer(BetterEnd.MOD_ID, GROUP, new Serializer()); - public final static CategoryIdentifier ID = CategoryIdentifier.of(BetterEnd.MOD_ID, GROUP); private final ResourceLocation id; private final Ingredient[] catalysts; From 93ca944472ac27589ae01836648645604603cd92 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Thu, 8 Jul 2021 11:12:00 +0300 Subject: [PATCH 083/595] Fixed sky rendering --- ...ererMixin.java => LevelRendererMixin.java} | 879 +++++++++--------- .../resources/betterend.mixins.client.json | 2 +- 2 files changed, 440 insertions(+), 441 deletions(-) rename src/main/java/ru/betterend/mixin/client/{WorldRendererMixin.java => LevelRendererMixin.java} (95%) diff --git a/src/main/java/ru/betterend/mixin/client/WorldRendererMixin.java b/src/main/java/ru/betterend/mixin/client/LevelRendererMixin.java similarity index 95% rename from src/main/java/ru/betterend/mixin/client/WorldRendererMixin.java rename to src/main/java/ru/betterend/mixin/client/LevelRendererMixin.java index b0049bca..a49d25da 100644 --- a/src/main/java/ru/betterend/mixin/client/WorldRendererMixin.java +++ b/src/main/java/ru/betterend/mixin/client/LevelRendererMixin.java @@ -1,440 +1,439 @@ -package ru.betterend.mixin.client; - -import com.mojang.blaze3d.platform.GlStateManager; -import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.BufferBuilder; -import com.mojang.blaze3d.vertex.DefaultVertexFormat; -import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.blaze3d.vertex.Tesselator; -import com.mojang.blaze3d.vertex.VertexBuffer; -import com.mojang.blaze3d.vertex.VertexFormat; -import com.mojang.math.Matrix4f; -import com.mojang.math.Quaternion; -import com.mojang.math.Vector3f; -import net.fabricmc.loader.api.FabricLoader; -import net.minecraft.client.Minecraft; -import net.minecraft.client.multiplayer.ClientLevel; -import net.minecraft.client.renderer.DimensionSpecialEffects; -import net.minecraft.client.renderer.FogRenderer; -import net.minecraft.client.renderer.GameRenderer; -import net.minecraft.client.renderer.LevelRenderer; -import net.minecraft.client.renderer.RenderBuffers; -import net.minecraft.client.renderer.texture.TextureManager; -import net.minecraft.resources.ResourceLocation; -import org.lwjgl.opengl.GL11; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import ru.bclib.util.BackgroundInfo; -import ru.bclib.util.MHelper; -import ru.betterend.BetterEnd; -import ru.betterend.client.ClientOptions; - -import java.util.Random; - -@Mixin(LevelRenderer.class) -public class WorldRendererMixin { - private static final ResourceLocation NEBULA_1 = BetterEnd.makeID("textures/sky/nebula_2.png"); - private static final ResourceLocation NEBULA_2 = BetterEnd.makeID("textures/sky/nebula_3.png"); - private static final ResourceLocation HORIZON = BetterEnd.makeID("textures/sky/nebula_1.png"); - private static final ResourceLocation STARS = BetterEnd.makeID("textures/sky/stars.png"); - private static final ResourceLocation FOG = BetterEnd.makeID("textures/sky/fog.png"); - - private static VertexBuffer stars1; - private static VertexBuffer stars2; - private static VertexBuffer stars3; - private static VertexBuffer stars4; - private static VertexBuffer nebulas1; - private static VertexBuffer nebulas2; - private static VertexBuffer horizon; - private static VertexBuffer fog; - private static Vector3f axis1; - private static Vector3f axis2; - private static Vector3f axis3; - private static Vector3f axis4; - private static float time; - private static float time2; - private static float time3; - private static float blind02; - private static float blind06; - private static boolean directOpenGL = false; - - @Shadow - @Final - private Minecraft minecraft; - - @Shadow - @Final - private TextureManager textureManager; - - @Shadow - private ClientLevel level; - - @Shadow - private int ticks; - - @Inject(method = "*", at = @At("TAIL")) - private void be_onInit(Minecraft client, RenderBuffers bufferBuilders, CallbackInfo info) { - be_initStars(); - Random random = new Random(131); - axis1 = new Vector3f(random.nextFloat(), random.nextFloat(), random.nextFloat()); - axis2 = new Vector3f(random.nextFloat(), random.nextFloat(), random.nextFloat()); - axis3 = new Vector3f(random.nextFloat(), random.nextFloat(), random.nextFloat()); - axis4 = new Vector3f(random.nextFloat(), random.nextFloat(), random.nextFloat()); - axis1.normalize(); - axis2.normalize(); - axis3.normalize(); - axis4.normalize(); - - directOpenGL = FabricLoader.getInstance().isModLoaded("optifabric") || FabricLoader.getInstance().isModLoaded("immersive_portals"); - } - - @Inject(method = "renderSky", at = @At("HEAD"), cancellable = true) - private void be_renderBetterEndSky(PoseStack matrices, Matrix4f matrix4f, float tickDelta, Runnable runnable, CallbackInfo info) { - if (ClientOptions.isCustomSky() && minecraft.level.effects().skyType() == DimensionSpecialEffects.SkyType.END) { - time = (ticks % 360000) * 0.000017453292F; - time2 = time * 2; - time3 = time * 3; - - FogRenderer.levelFogColor(); - RenderSystem.enableTexture(); - - if (directOpenGL) { - GL11.glEnable(GL11.GL_ALPHA_TEST); - GL11.glAlphaFunc(516, 0.0F); - GL11.glEnable(GL11.GL_BLEND); - RenderSystem.depthMask(false); - } - else { - //TODO: Removed in 1.17 - //RenderSystem.enableAlphaTest(); - //RenderSystem.alphaFunc(516, 0.0F); - RenderSystem.enableBlend(); - RenderSystem.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA); - } - - float blindA = 1F - BackgroundInfo.blindness; - blind02 = blindA * 0.2F; - blind06 = blindA * 0.6F; - - if (blindA > 0) { - matrices.pushPose(); - matrices.mulPose(new Quaternion(0, time, 0, false)); - RenderSystem.setShaderTexture(0, HORIZON); - be_renderBuffer(matrices, matrix4f, horizon, DefaultVertexFormat.POSITION_TEX, 0.77F, 0.31F, 0.73F, 0.7F * blindA); - matrices.popPose(); - - matrices.pushPose(); - matrices.mulPose(new Quaternion(0, -time, 0, false)); - RenderSystem.setShaderTexture(0, NEBULA_1); - be_renderBuffer(matrices, matrix4f, nebulas1, DefaultVertexFormat.POSITION_TEX, 0.77F, 0.31F, 0.73F, blind02); - matrices.popPose(); - - matrices.pushPose(); - matrices.mulPose(new Quaternion(0, time2, 0, false)); - RenderSystem.setShaderTexture(0, NEBULA_2); - be_renderBuffer(matrices, matrix4f, nebulas2, DefaultVertexFormat.POSITION_TEX, 0.77F, 0.31F, 0.73F, blind02); - matrices.popPose(); - - RenderSystem.setShaderTexture(0, STARS); - - matrices.pushPose(); - matrices.mulPose(axis3.rotation(time)); - be_renderBuffer(matrices, matrix4f, stars3, DefaultVertexFormat.POSITION_TEX, 0.77F, 0.31F, 0.73F, blind06); - matrices.popPose(); - - matrices.pushPose(); - matrices.mulPose(axis4.rotation(time2)); - be_renderBuffer(matrices, matrix4f, stars4, DefaultVertexFormat.POSITION_TEX, 1F, 1F, 1F, blind06); - matrices.popPose(); - } - - float a = (BackgroundInfo.fogDensity - 1F); - if (a > 0) { - if (a > 1) a = 1; - RenderSystem.setShaderTexture(0, FOG); - be_renderBuffer(matrices, matrix4f, fog, DefaultVertexFormat.POSITION_TEX, BackgroundInfo.fogColorRed, BackgroundInfo.fogColorGreen, BackgroundInfo.fogColorBlue, a); - } - - RenderSystem.disableTexture(); - - if (blindA > 0) { - matrices.pushPose(); - matrices.mulPose(axis1.rotation(time3)); - be_renderBuffer(matrices, matrix4f, stars1, DefaultVertexFormat.POSITION, 1, 1, 1, blind06); - matrices.popPose(); - - matrices.pushPose(); - matrices.mulPose(axis2.rotation(time2)); - be_renderBuffer(matrices, matrix4f, stars2, DefaultVertexFormat.POSITION, 0.95F, 0.64F, 0.93F, blind06); - matrices.popPose(); - } - - RenderSystem.enableTexture(); - RenderSystem.depthMask(true); - RenderSystem.defaultBlendFunc(); - RenderSystem.disableBlend(); - - info.cancel(); - } - } - - private void be_renderBuffer(PoseStack matrices, Matrix4f matrix4f, VertexBuffer buffer, VertexFormat format, float r, float g, float b, float a) { - RenderSystem.setShaderColor(r, g, b, a); - buffer.bind(); - format.setupBufferState(); - buffer.drawWithShader(matrices.last().pose(), matrix4f, GameRenderer.getPositionTexShader()); - - VertexBuffer.unbind(); - format.clearBufferState(); - } - - private void be_initStars() { - BufferBuilder buffer = Tesselator.getInstance().getBuilder(); - stars1 = be_buildBufferStars(buffer, stars1, 0.1, 0.30, 3500, 41315); - stars2 = be_buildBufferStars(buffer, stars2, 0.1, 0.35, 2000, 35151); - stars3 = be_buildBufferUVStars(buffer, stars3, 0.4, 1.2, 1000, 61354); - stars4 = be_buildBufferUVStars(buffer, stars4, 0.4, 1.2, 1000, 61355); - nebulas1 = be_buildBufferFarFog(buffer, nebulas1, 40, 60, 30, 11515); - nebulas2 = be_buildBufferFarFog(buffer, nebulas2, 40, 60, 10, 14151); - horizon = be_buildBufferHorizon(buffer, horizon); - fog = be_buildBufferFog(buffer, fog); - } - - private VertexBuffer be_buildBufferStars(BufferBuilder bufferBuilder, VertexBuffer buffer, double minSize, double maxSize, int count, long seed) { - if (buffer != null) { - buffer.close(); - } - - //TODO: Test if this is working correct - //Format is set in the DrawState - //buffer = new VertexBuffer(DefaultVertexFormat.POSITION); - buffer = new VertexBuffer(); - be_makeStars(bufferBuilder, minSize, maxSize, count, seed); - bufferBuilder.end(); - buffer.upload(bufferBuilder); - - return buffer; - } - - private VertexBuffer be_buildBufferUVStars(BufferBuilder bufferBuilder, VertexBuffer buffer, double minSize, double maxSize, int count, long seed) { - if (buffer != null) { - buffer.close(); - } - - // buffer = new VertexBuffer(DefaultVertexFormat.POSITION_TEX); - buffer = new VertexBuffer(); - be_makeUVStars(bufferBuilder, minSize, maxSize, count, seed); - bufferBuilder.end(); - buffer.upload(bufferBuilder); - - return buffer; - } - - private VertexBuffer be_buildBufferFarFog(BufferBuilder bufferBuilder, VertexBuffer buffer, double minSize, double maxSize, int count, long seed) { - if (buffer != null) { - buffer.close(); - } - - // buffer = new VertexBuffer(DefaultVertexFormat.POSITION_TEX); - buffer = new VertexBuffer(); - be_makeFarFog(bufferBuilder, minSize, maxSize, count, seed); - bufferBuilder.end(); - buffer.upload(bufferBuilder); - - return buffer; - } - - private VertexBuffer be_buildBufferHorizon(BufferBuilder bufferBuilder, VertexBuffer buffer) { - if (buffer != null) { - buffer.close(); - } - - // buffer = new VertexBuffer(DefaultVertexFormat.POSITION_TEX); - buffer = new VertexBuffer(); - be_makeCylinder(bufferBuilder, 16, 50, 100); - bufferBuilder.end(); - buffer.upload(bufferBuilder); - - return buffer; - } - - private VertexBuffer be_buildBufferFog(BufferBuilder bufferBuilder, VertexBuffer buffer) { - if (buffer != null) { - buffer.close(); - } - - // buffer = new VertexBuffer(DefaultVertexFormat.POSITION_TEX); - buffer = new VertexBuffer(); - be_makeCylinder(bufferBuilder, 16, 50, 70); - bufferBuilder.end(); - buffer.upload(bufferBuilder); - - return buffer; - } - - private void be_makeStars(BufferBuilder buffer, double minSize, double maxSize, int count, long seed) { - Random random = new Random(seed); - buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION); - - for (int i = 0; i < count; ++i) { - double posX = random.nextDouble() * 2.0 - 1.0; - double posY = random.nextDouble() * 2.0 - 1.0; - double posZ = random.nextDouble() * 2.0 - 1.0; - double size = MHelper.randRange(minSize, maxSize, random); - double length = posX * posX + posY * posY + posZ * posZ; - if (length < 1.0 && length > 0.001) { - length = 1.0 / Math.sqrt(length); - posX *= length; - posY *= length; - posZ *= length; - double j = posX * 100.0; - double k = posY * 100.0; - double l = posZ * 100.0; - double m = Math.atan2(posX, posZ); - double n = Math.sin(m); - double o = Math.cos(m); - double p = Math.atan2(Math.sqrt(posX * posX + posZ * posZ), posY); - double q = Math.sin(p); - double r = Math.cos(p); - double s = random.nextDouble() * Math.PI * 2.0; - double t = Math.sin(s); - double u = Math.cos(s); - - for (int v = 0; v < 4; ++v) { - double x = (double) ((v & 2) - 1) * size; - double y = (double) ((v + 1 & 2) - 1) * size; - double aa = x * u - y * t; - double ab = y * u + x * t; - double ad = aa * q + 0.0 * r; - double ae = 0.0 * q - aa * r; - double af = ae * n - ab * o; - double ah = ab * n + ae * o; - buffer.vertex(j + af, k + ad, l + ah).endVertex(); - } - } - } - } - - private void be_makeUVStars(BufferBuilder buffer, double minSize, double maxSize, int count, long seed) { - Random random = new Random(seed); - buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX); - - for (int i = 0; i < count; ++i) { - double posX = random.nextDouble() * 2.0 - 1.0; - double posY = random.nextDouble() * 2.0 - 1.0; - double posZ = random.nextDouble() * 2.0 - 1.0; - double size = MHelper.randRange(minSize, maxSize, random); - double length = posX * posX + posY * posY + posZ * posZ; - if (length < 1.0 && length > 0.001) { - length = 1.0 / Math.sqrt(length); - posX *= length; - posY *= length; - posZ *= length; - double j = posX * 100.0; - double k = posY * 100.0; - double l = posZ * 100.0; - double m = Math.atan2(posX, posZ); - double n = Math.sin(m); - double o = Math.cos(m); - double p = Math.atan2(Math.sqrt(posX * posX + posZ * posZ), posY); - double q = Math.sin(p); - double r = Math.cos(p); - double s = random.nextDouble() * Math.PI * 2.0; - double t = Math.sin(s); - double u = Math.cos(s); - - int pos = 0; - float minV = random.nextInt(4) / 4F; - for (int v = 0; v < 4; ++v) { - double x = (double) ((v & 2) - 1) * size; - double y = (double) ((v + 1 & 2) - 1) * size; - double aa = x * u - y * t; - double ab = y * u + x * t; - double ad = aa * q + 0.0 * r; - double ae = 0.0 * q - aa * r; - double af = ae * n - ab * o; - double ah = ab * n + ae * o; - float texU = (pos >> 1) & 1; - float texV = (((pos + 1) >> 1) & 1) / 4F + minV; - pos++; - buffer.vertex(j + af, k + ad, l + ah).uv(texU, texV).endVertex(); - } - } - } - } - - private void be_makeFarFog(BufferBuilder buffer, double minSize, double maxSize, int count, long seed) { - Random random = new Random(seed); - buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX); - - for (int i = 0; i < count; ++i) { - double posX = random.nextDouble() * 2.0 - 1.0; - double posY = random.nextDouble() - 0.5; - double posZ = random.nextDouble() * 2.0 - 1.0; - double size = MHelper.randRange(minSize, maxSize, random); - double length = posX * posX + posY * posY + posZ * posZ; - double distance = 2.0; - double delta = 1.0 / count; - if (length < 1.0 && length > 0.001) { - length = distance / Math.sqrt(length); - size *= distance; - distance -= delta; - posX *= length; - posY *= length; - posZ *= length; - double j = posX * 100.0; - double k = posY * 100.0; - double l = posZ * 100.0; - double m = Math.atan2(posX, posZ); - double n = Math.sin(m); - double o = Math.cos(m); - double p = Math.atan2(Math.sqrt(posX * posX + posZ * posZ), posY); - double q = Math.sin(p); - double r = Math.cos(p); - double s = random.nextDouble() * Math.PI * 2.0; - double t = Math.sin(s); - double u = Math.cos(s); - - int pos = 0; - for (int v = 0; v < 4; ++v) { - double x = (double) ((v & 2) - 1) * size; - double y = (double) ((v + 1 & 2) - 1) * size; - double aa = x * u - y * t; - double ab = y * u + x * t; - double ad = aa * q + 0.0 * r; - double ae = 0.0 * q - aa * r; - double af = ae * n - ab * o; - double ah = ab * n + ae * o; - float texU = (pos >> 1) & 1; - float texV = ((pos + 1) >> 1) & 1; - pos++; - buffer.vertex(j + af, k + ad, l + ah).uv(texU, texV).endVertex(); - } - } - } - } - - private void be_makeCylinder(BufferBuilder buffer, int segments, double height, double radius) { - buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX); - for (int i = 0; i < segments; i++) { - double a1 = (double) i * Math.PI * 2.0 / (double) segments; - double a2 = (double) (i + 1) * Math.PI * 2.0 / (double) segments; - double px1 = Math.sin(a1) * radius; - double pz1 = Math.cos(a1) * radius; - double px2 = Math.sin(a2) * radius; - double pz2 = Math.cos(a2) * radius; - - float u0 = (float) i / (float) segments; - float u1 = (float) (i + 1) / (float) segments; - - buffer.vertex(px1, -height, pz1).uv(u0, 0).endVertex(); - buffer.vertex(px1, height, pz1).uv(u0, 1).endVertex(); - buffer.vertex(px2, height, pz2).uv(u1, 1).endVertex(); - buffer.vertex(px2, -height, pz2).uv(u1, 0).endVertex(); - } - } -} +package ru.betterend.mixin.client; + +import com.mojang.blaze3d.platform.GlStateManager; +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.BufferBuilder; +import com.mojang.blaze3d.vertex.DefaultVertexFormat; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.Tesselator; +import com.mojang.blaze3d.vertex.VertexBuffer; +import com.mojang.blaze3d.vertex.VertexFormat; +import com.mojang.math.Matrix4f; +import com.mojang.math.Quaternion; +import com.mojang.math.Vector3f; +import net.fabricmc.loader.api.FabricLoader; +import net.minecraft.client.Minecraft; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.renderer.DimensionSpecialEffects; +import net.minecraft.client.renderer.FogRenderer; +import net.minecraft.client.renderer.GameRenderer; +import net.minecraft.client.renderer.LevelRenderer; +import net.minecraft.client.renderer.RenderBuffers; +import net.minecraft.client.renderer.texture.TextureManager; +import net.minecraft.resources.ResourceLocation; +import org.lwjgl.opengl.GL11; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import ru.bclib.util.BackgroundInfo; +import ru.bclib.util.MHelper; +import ru.betterend.BetterEnd; +import ru.betterend.client.ClientOptions; + +import java.util.Random; + +@Mixin(LevelRenderer.class) +public class LevelRendererMixin { + private static final ResourceLocation NEBULA_1 = BetterEnd.makeID("textures/sky/nebula_2.png"); + private static final ResourceLocation NEBULA_2 = BetterEnd.makeID("textures/sky/nebula_3.png"); + private static final ResourceLocation HORIZON = BetterEnd.makeID("textures/sky/nebula_1.png"); + private static final ResourceLocation STARS = BetterEnd.makeID("textures/sky/stars.png"); + private static final ResourceLocation FOG = BetterEnd.makeID("textures/sky/fog.png"); + + private static VertexBuffer stars1; + private static VertexBuffer stars2; + private static VertexBuffer stars3; + private static VertexBuffer stars4; + private static VertexBuffer nebulas1; + private static VertexBuffer nebulas2; + private static VertexBuffer horizon; + private static VertexBuffer fog; + private static Vector3f axis1; + private static Vector3f axis2; + private static Vector3f axis3; + private static Vector3f axis4; + private static float time; + private static float time2; + private static float time3; + private static float blind02; + private static float blind06; + private static boolean directOpenGL = false; + + @Shadow + @Final + private Minecraft minecraft; + + @Shadow + @Final + private TextureManager textureManager; + + @Shadow + private ClientLevel level; + + @Shadow + private int ticks; + + @Inject(method = "*", at = @At("TAIL")) + private void be_onInit(Minecraft client, RenderBuffers bufferBuilders, CallbackInfo info) { + be_initStars(); + Random random = new Random(131); + axis1 = new Vector3f(random.nextFloat(), random.nextFloat(), random.nextFloat()); + axis2 = new Vector3f(random.nextFloat(), random.nextFloat(), random.nextFloat()); + axis3 = new Vector3f(random.nextFloat(), random.nextFloat(), random.nextFloat()); + axis4 = new Vector3f(random.nextFloat(), random.nextFloat(), random.nextFloat()); + axis1.normalize(); + axis2.normalize(); + axis3.normalize(); + axis4.normalize(); + + directOpenGL = FabricLoader.getInstance().isModLoaded("optifabric") || FabricLoader.getInstance().isModLoaded("immersive_portals"); + } + + @Inject(method = "renderSky", at = @At("HEAD"), cancellable = true) + private void be_renderBetterEndSky(PoseStack matrices, Matrix4f matrix4f, float tickDelta, Runnable runnable, CallbackInfo info) { + if (ClientOptions.isCustomSky() && minecraft.level.effects().skyType() == DimensionSpecialEffects.SkyType.END) { + runnable.run(); + + time = (ticks % 360000) * 0.000017453292F; + time2 = time * 2; + time3 = time * 3; + + FogRenderer.levelFogColor(); + RenderSystem.enableTexture(); + + if (directOpenGL) { + GL11.glEnable(GL11.GL_ALPHA_TEST); + GL11.glAlphaFunc(516, 0.0F); + GL11.glEnable(GL11.GL_BLEND); + RenderSystem.depthMask(false); + } + else { + RenderSystem.enableBlend(); + RenderSystem.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA); + } + + float blindA = 1F - BackgroundInfo.blindness; + blind02 = blindA * 0.2F; + blind06 = blindA * 0.6F; + + if (blindA > 0) { + matrices.pushPose(); + matrices.mulPose(new Quaternion(0, time, 0, false)); + RenderSystem.setShaderTexture(0, HORIZON); + be_renderBuffer(matrices, matrix4f, horizon, DefaultVertexFormat.POSITION_TEX, 0.77F, 0.31F, 0.73F, 0.7F * blindA); + matrices.popPose(); + + matrices.pushPose(); + matrices.mulPose(new Quaternion(0, -time, 0, false)); + RenderSystem.setShaderTexture(0, NEBULA_1); + be_renderBuffer(matrices, matrix4f, nebulas1, DefaultVertexFormat.POSITION_TEX, 0.77F, 0.31F, 0.73F, blind02); + matrices.popPose(); + + matrices.pushPose(); + matrices.mulPose(new Quaternion(0, time2, 0, false)); + RenderSystem.setShaderTexture(0, NEBULA_2); + be_renderBuffer(matrices, matrix4f, nebulas2, DefaultVertexFormat.POSITION_TEX, 0.77F, 0.31F, 0.73F, blind02); + matrices.popPose(); + + RenderSystem.setShaderTexture(0, STARS); + + matrices.pushPose(); + matrices.mulPose(axis3.rotation(time)); + be_renderBuffer(matrices, matrix4f, stars3, DefaultVertexFormat.POSITION_TEX, 0.77F, 0.31F, 0.73F, blind06); + matrices.popPose(); + + matrices.pushPose(); + matrices.mulPose(axis4.rotation(time2)); + be_renderBuffer(matrices, matrix4f, stars4, DefaultVertexFormat.POSITION_TEX, 1F, 1F, 1F, blind06); + matrices.popPose(); + } + + float a = (BackgroundInfo.fogDensity - 1F); + if (a > 0) { + if (a > 1) a = 1; + RenderSystem.setShaderTexture(0, FOG); + be_renderBuffer(matrices, matrix4f, fog, DefaultVertexFormat.POSITION_TEX, BackgroundInfo.fogColorRed, BackgroundInfo.fogColorGreen, BackgroundInfo.fogColorBlue, a); + } + + RenderSystem.disableTexture(); + + if (blindA > 0) { + matrices.pushPose(); + matrices.mulPose(axis1.rotation(time3)); + be_renderBuffer(matrices, matrix4f, stars1, DefaultVertexFormat.POSITION, 1, 1, 1, blind06); + matrices.popPose(); + + matrices.pushPose(); + matrices.mulPose(axis2.rotation(time2)); + be_renderBuffer(matrices, matrix4f, stars2, DefaultVertexFormat.POSITION, 0.95F, 0.64F, 0.93F, blind06); + matrices.popPose(); + } + + RenderSystem.enableTexture(); + RenderSystem.depthMask(true); + RenderSystem.defaultBlendFunc(); + RenderSystem.disableBlend(); + + info.cancel(); + } + } + + private void be_renderBuffer(PoseStack matrices, Matrix4f matrix4f, VertexBuffer buffer, VertexFormat format, float r, float g, float b, float a) { + RenderSystem.setShaderColor(r, g, b, a); + if (format == DefaultVertexFormat.POSITION) { + buffer.drawWithShader(matrices.last().pose(), matrix4f, GameRenderer.getPositionShader()); + } + else { + buffer.drawWithShader(matrices.last().pose(), matrix4f, GameRenderer.getPositionTexShader()); + } + } + + private void be_initStars() { + BufferBuilder buffer = Tesselator.getInstance().getBuilder(); + stars1 = be_buildBufferStars(buffer, stars1, 0.1, 0.30, 3500, 41315); + stars2 = be_buildBufferStars(buffer, stars2, 0.1, 0.35, 2000, 35151); + stars3 = be_buildBufferUVStars(buffer, stars3, 0.4, 1.2, 1000, 61354); + stars4 = be_buildBufferUVStars(buffer, stars4, 0.4, 1.2, 1000, 61355); + nebulas1 = be_buildBufferFarFog(buffer, nebulas1, 40, 60, 30, 11515); + nebulas2 = be_buildBufferFarFog(buffer, nebulas2, 40, 60, 10, 14151); + horizon = be_buildBufferHorizon(buffer, horizon); + fog = be_buildBufferFog(buffer, fog); + } + + private VertexBuffer be_buildBufferStars(BufferBuilder bufferBuilder, VertexBuffer buffer, double minSize, double maxSize, int count, long seed) { + if (buffer != null) { + buffer.close(); + } + + //TODO: Test if this is working correct + //Format is set in the DrawState + //buffer = new VertexBuffer(DefaultVertexFormat.POSITION); + buffer = new VertexBuffer(); + be_makeStars(bufferBuilder, minSize, maxSize, count, seed); + bufferBuilder.end(); + buffer.upload(bufferBuilder); + + return buffer; + } + + private VertexBuffer be_buildBufferUVStars(BufferBuilder bufferBuilder, VertexBuffer buffer, double minSize, double maxSize, int count, long seed) { + if (buffer != null) { + buffer.close(); + } + + // buffer = new VertexBuffer(DefaultVertexFormat.POSITION_TEX); + buffer = new VertexBuffer(); + be_makeUVStars(bufferBuilder, minSize, maxSize, count, seed); + bufferBuilder.end(); + buffer.upload(bufferBuilder); + + return buffer; + } + + private VertexBuffer be_buildBufferFarFog(BufferBuilder bufferBuilder, VertexBuffer buffer, double minSize, double maxSize, int count, long seed) { + if (buffer != null) { + buffer.close(); + } + + // buffer = new VertexBuffer(DefaultVertexFormat.POSITION_TEX); + buffer = new VertexBuffer(); + be_makeFarFog(bufferBuilder, minSize, maxSize, count, seed); + bufferBuilder.end(); + buffer.upload(bufferBuilder); + + return buffer; + } + + private VertexBuffer be_buildBufferHorizon(BufferBuilder bufferBuilder, VertexBuffer buffer) { + if (buffer != null) { + buffer.close(); + } + + // buffer = new VertexBuffer(DefaultVertexFormat.POSITION_TEX); + buffer = new VertexBuffer(); + be_makeCylinder(bufferBuilder, 16, 50, 100); + bufferBuilder.end(); + buffer.upload(bufferBuilder); + + return buffer; + } + + private VertexBuffer be_buildBufferFog(BufferBuilder bufferBuilder, VertexBuffer buffer) { + if (buffer != null) { + buffer.close(); + } + + // buffer = new VertexBuffer(DefaultVertexFormat.POSITION_TEX); + buffer = new VertexBuffer(); + be_makeCylinder(bufferBuilder, 16, 50, 70); + bufferBuilder.end(); + buffer.upload(bufferBuilder); + + return buffer; + } + + private void be_makeStars(BufferBuilder buffer, double minSize, double maxSize, int count, long seed) { + Random random = new Random(seed); + buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION); + + for (int i = 0; i < count; ++i) { + double posX = random.nextDouble() * 2.0 - 1.0; + double posY = random.nextDouble() * 2.0 - 1.0; + double posZ = random.nextDouble() * 2.0 - 1.0; + double size = MHelper.randRange(minSize, maxSize, random); + double length = posX * posX + posY * posY + posZ * posZ; + if (length < 1.0 && length > 0.001) { + length = 1.0 / Math.sqrt(length); + posX *= length; + posY *= length; + posZ *= length; + double j = posX * 100.0; + double k = posY * 100.0; + double l = posZ * 100.0; + double m = Math.atan2(posX, posZ); + double n = Math.sin(m); + double o = Math.cos(m); + double p = Math.atan2(Math.sqrt(posX * posX + posZ * posZ), posY); + double q = Math.sin(p); + double r = Math.cos(p); + double s = random.nextDouble() * Math.PI * 2.0; + double t = Math.sin(s); + double u = Math.cos(s); + + for (int v = 0; v < 4; ++v) { + double x = (double) ((v & 2) - 1) * size; + double y = (double) ((v + 1 & 2) - 1) * size; + double aa = x * u - y * t; + double ab = y * u + x * t; + double ad = aa * q + 0.0 * r; + double ae = 0.0 * q - aa * r; + double af = ae * n - ab * o; + double ah = ab * n + ae * o; + buffer.vertex(j + af, k + ad, l + ah).endVertex(); + } + } + } + } + + private void be_makeUVStars(BufferBuilder buffer, double minSize, double maxSize, int count, long seed) { + Random random = new Random(seed); + buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX); + + for (int i = 0; i < count; ++i) { + double posX = random.nextDouble() * 2.0 - 1.0; + double posY = random.nextDouble() * 2.0 - 1.0; + double posZ = random.nextDouble() * 2.0 - 1.0; + double size = MHelper.randRange(minSize, maxSize, random); + double length = posX * posX + posY * posY + posZ * posZ; + if (length < 1.0 && length > 0.001) { + length = 1.0 / Math.sqrt(length); + posX *= length; + posY *= length; + posZ *= length; + double j = posX * 100.0; + double k = posY * 100.0; + double l = posZ * 100.0; + double m = Math.atan2(posX, posZ); + double n = Math.sin(m); + double o = Math.cos(m); + double p = Math.atan2(Math.sqrt(posX * posX + posZ * posZ), posY); + double q = Math.sin(p); + double r = Math.cos(p); + double s = random.nextDouble() * Math.PI * 2.0; + double t = Math.sin(s); + double u = Math.cos(s); + + int pos = 0; + float minV = random.nextInt(4) / 4F; + for (int v = 0; v < 4; ++v) { + double x = (double) ((v & 2) - 1) * size; + double y = (double) ((v + 1 & 2) - 1) * size; + double aa = x * u - y * t; + double ab = y * u + x * t; + double ad = aa * q + 0.0 * r; + double ae = 0.0 * q - aa * r; + double af = ae * n - ab * o; + double ah = ab * n + ae * o; + float texU = (pos >> 1) & 1; + float texV = (((pos + 1) >> 1) & 1) / 4F + minV; + pos++; + buffer.vertex(j + af, k + ad, l + ah).uv(texU, texV).endVertex(); + } + } + } + } + + private void be_makeFarFog(BufferBuilder buffer, double minSize, double maxSize, int count, long seed) { + Random random = new Random(seed); + buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX); + + for (int i = 0; i < count; ++i) { + double posX = random.nextDouble() * 2.0 - 1.0; + double posY = random.nextDouble() - 0.5; + double posZ = random.nextDouble() * 2.0 - 1.0; + double size = MHelper.randRange(minSize, maxSize, random); + double length = posX * posX + posY * posY + posZ * posZ; + double distance = 2.0; + double delta = 1.0 / count; + if (length < 1.0 && length > 0.001) { + length = distance / Math.sqrt(length); + size *= distance; + distance -= delta; + posX *= length; + posY *= length; + posZ *= length; + double j = posX * 100.0; + double k = posY * 100.0; + double l = posZ * 100.0; + double m = Math.atan2(posX, posZ); + double n = Math.sin(m); + double o = Math.cos(m); + double p = Math.atan2(Math.sqrt(posX * posX + posZ * posZ), posY); + double q = Math.sin(p); + double r = Math.cos(p); + double s = random.nextDouble() * Math.PI * 2.0; + double t = Math.sin(s); + double u = Math.cos(s); + + int pos = 0; + for (int v = 0; v < 4; ++v) { + double x = (double) ((v & 2) - 1) * size; + double y = (double) ((v + 1 & 2) - 1) * size; + double aa = x * u - y * t; + double ab = y * u + x * t; + double ad = aa * q + 0.0 * r; + double ae = 0.0 * q - aa * r; + double af = ae * n - ab * o; + double ah = ab * n + ae * o; + float texU = (pos >> 1) & 1; + float texV = ((pos + 1) >> 1) & 1; + pos++; + buffer.vertex(j + af, k + ad, l + ah).uv(texU, texV).endVertex(); + } + } + } + } + + private void be_makeCylinder(BufferBuilder buffer, int segments, double height, double radius) { + buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX); + for (int i = 0; i < segments; i++) { + double a1 = (double) i * Math.PI * 2.0 / (double) segments; + double a2 = (double) (i + 1) * Math.PI * 2.0 / (double) segments; + double px1 = Math.sin(a1) * radius; + double pz1 = Math.cos(a1) * radius; + double px2 = Math.sin(a2) * radius; + double pz2 = Math.cos(a2) * radius; + + float u0 = (float) i / (float) segments; + float u1 = (float) (i + 1) / (float) segments; + + buffer.vertex(px1, -height, pz1).uv(u0, 0).endVertex(); + buffer.vertex(px1, height, pz1).uv(u0, 1).endVertex(); + buffer.vertex(px2, height, pz2).uv(u1, 1).endVertex(); + buffer.vertex(px2, -height, pz2).uv(u1, 0).endVertex(); + } + } +} diff --git a/src/main/resources/betterend.mixins.client.json b/src/main/resources/betterend.mixins.client.json index 6fd0fc05..bb8bed5f 100644 --- a/src/main/resources/betterend.mixins.client.json +++ b/src/main/resources/betterend.mixins.client.json @@ -11,7 +11,7 @@ "ClientRecipeBookMixin", "MinecraftClientMixin", "PlayerRendererMixin", - "WorldRendererMixin", + "LevelRendererMixin", "MusicTrackerMixin", "AnvilScreenMixin", "BiomeColorsMixin", From e9e39f715253b54d276e42657602140e29b8eac7 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Thu, 8 Jul 2021 12:01:38 +0300 Subject: [PATCH 084/595] Hydrotermal vent ticks fix --- .../blocks/HydrothermalVentBlock.java | 17 +++-- .../entities/BlockEntityHydrothermalVent.java | 71 ++++++++++--------- 2 files changed, 48 insertions(+), 40 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/HydrothermalVentBlock.java b/src/main/java/ru/betterend/blocks/HydrothermalVentBlock.java index 583579f0..6b5eba5e 100644 --- a/src/main/java/ru/betterend/blocks/HydrothermalVentBlock.java +++ b/src/main/java/ru/betterend/blocks/HydrothermalVentBlock.java @@ -22,6 +22,8 @@ import net.minecraft.world.level.block.LiquidBlockContainer; import net.minecraft.world.level.block.SimpleWaterloggedBlock; import net.minecraft.world.level.block.SoundType; import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityTicker; +import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.block.state.properties.BlockStateProperties; @@ -130,16 +132,17 @@ public class HydrothermalVentBlock extends BaseBlockNotFull implements EntityBlo @Environment(EnvType.CLIENT) public void animateTick(BlockState state, Level world, BlockPos pos, Random random) { super.animateTick(state, world, pos, random); - if (random.nextBoolean()) { + if (!state.getValue(ACTIVATED) && random.nextBoolean()) { double x = pos.getX() + random.nextDouble(); double y = pos.getY() + 0.9 + random.nextDouble() * 0.3; double z = pos.getZ() + random.nextDouble(); - if (state.getValue(ACTIVATED)) { - world.addParticle(EndParticles.GEYSER_PARTICLE, x, y, z, 0, 0, 0); - } - else { - world.addParticle(ParticleTypes.LARGE_SMOKE, x, y, z, 0, 0, 0); - } + world.addParticle(ParticleTypes.LARGE_SMOKE, x, y, z, 0, 0, 0); } } + + @Nullable + @Override + public BlockEntityTicker getTicker(Level level, BlockState blockState, BlockEntityType blockEntityType) { + return BlockEntityHydrothermalVent::tick; + } } diff --git a/src/main/java/ru/betterend/blocks/entities/BlockEntityHydrothermalVent.java b/src/main/java/ru/betterend/blocks/entities/BlockEntityHydrothermalVent.java index 710bac7c..1e44f1b5 100644 --- a/src/main/java/ru/betterend/blocks/entities/BlockEntityHydrothermalVent.java +++ b/src/main/java/ru/betterend/blocks/entities/BlockEntityHydrothermalVent.java @@ -22,46 +22,51 @@ import ru.betterend.registry.EndParticles; import java.util.List; public class BlockEntityHydrothermalVent extends BlockEntity { - private final static Vec3 POSITIVE_Y = new Vec3(0.0f, 1.0f, 0.0f); + private static final MutableBlockPos POS = new MutableBlockPos(); public BlockEntityHydrothermalVent(BlockPos blockPos, BlockState blockState) { super(EndBlockEntities.HYDROTHERMAL_VENT, blockPos, blockState); } - public static void tick(Level level, BlockPos worldPosition, BlockState state, BlockEntityHydrothermalVent blockEntity) { - if (level != null) { - if (state.is(EndBlocks.HYDROTHERMAL_VENT)) { - boolean active = state.getValue(HydrothermalVentBlock.ACTIVATED); - if (active && level.random.nextInt(20) == 0) { - double x = worldPosition.getX() + level.random.nextDouble(); - double y = worldPosition.getY() + 0.9 + level.random.nextDouble() * 0.3; - double z = worldPosition.getZ() + level.random.nextDouble(); - if (state.getValue(HydrothermalVentBlock.WATERLOGGED)) { - level.addParticle(EndParticles.GEYSER_PARTICLE, x, y, z, 0, 0, 0); - } - else { - level.addParticle(ParticleTypes.BUBBLE, x, y, z, 0, 0, 0); - } - } - MutableBlockPos mutable = worldPosition.mutable().move(Direction.UP); - int height = active ? 85 : 25; - AABB box = new AABB(mutable.offset(-1, 0, -1), mutable.offset(1, height, 1)); - List entities = level.getEntitiesOfClass(LivingEntity.class, box); - if (entities.size() > 0) { - while (mutable.getY() < box.maxY) { - BlockState blockState = level.getBlockState(mutable); - if (blockState.isSolidRender(level, mutable)) break; - if (blockState.isAir()) { - double mult = active ? 3.0 : 5.0; - float force = (float) ((1.0 - (mutable.getY() / box.maxY)) / mult); - entities.stream().filter(entity -> (int) entity.getY() == mutable.getY() && - blockEntity.hasElytra(entity) && entity.isFallFlying()) - .forEach(entity -> entity.moveRelative(force, POSITIVE_Y)); - } - mutable.move(Direction.UP); - } + public static void tick(Level level, BlockPos worldPosition, BlockState state, T uncastedEntity) { + if (level != null && uncastedEntity instanceof BlockEntityHydrothermalVent && state.is(EndBlocks.HYDROTHERMAL_VENT)) { + BlockEntityHydrothermalVent blockEntity = (BlockEntityHydrothermalVent) uncastedEntity; + if (level.isClientSide()) { + clientTick(level, worldPosition, state, blockEntity); + } + else { + serverTick(level, worldPosition, state, blockEntity); + } + } + } + + private static void clientTick(Level level, BlockPos worldPosition, BlockState state, BlockEntityHydrothermalVent blockEntity) { + boolean active = state.getValue(HydrothermalVentBlock.ACTIVATED); + if (active && level.random.nextInt(20) == 0 && state.getValue(HydrothermalVentBlock.WATERLOGGED)) { + double x = worldPosition.getX() + level.random.nextDouble(); + double y = worldPosition.getY() + 0.9 + level.random.nextDouble() * 0.3; + double z = worldPosition.getZ() + level.random.nextDouble(); + level.addParticle(EndParticles.GEYSER_PARTICLE, x, y, z, 0, 0, 0); + } + } + + private static void serverTick(Level level, BlockPos worldPosition, BlockState state, BlockEntityHydrothermalVent blockEntity) { + boolean active = state.getValue(HydrothermalVentBlock.ACTIVATED); + POS.set(worldPosition).move(Direction.UP); + int height = active ? 85 : 25; + AABB box = new AABB(POS.offset(-1, 0, -1), POS.offset(1, height, 1)); + List entities = level.getEntitiesOfClass(LivingEntity.class, box); + if (entities.size() > 0) { + while (POS.getY() < box.maxY) { + BlockState blockState = level.getBlockState(POS); + if (blockState.isSolidRender(level, POS)) break; + if (blockState.isAir()) { + double mult = active ? 3.0 : 5.0; + float force = (float) ((1.0 - (POS.getY() / box.maxY)) / mult); + entities.stream().filter(entity -> (int) entity.getY() == POS.getY() && blockEntity.hasElytra(entity) && entity.isFallFlying()).forEach(entity -> entity.moveRelative(force, POSITIVE_Y)); } + POS.move(Direction.UP); } } } From dbfaa09b5b1ef3707d29eea4f0e2365b5541f3c6 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Thu, 8 Jul 2021 13:27:47 +0300 Subject: [PATCH 085/595] Test fix for "Detected setBlock in a far chunk" --- build.gradle | 2 +- .../blocks/entities/PedestalBlockEntity.java | 1 - .../mixin/common/WorldGenRegionMixin.java | 30 +++++++++++++++++++ .../resources/betterend.mixins.common.json | 7 +++-- 4 files changed, 35 insertions(+), 5 deletions(-) create mode 100644 src/main/java/ru/betterend/mixin/common/WorldGenRegionMixin.java diff --git a/build.gradle b/build.gradle index f78c835e..b2fff8e6 100644 --- a/build.gradle +++ b/build.gradle @@ -72,7 +72,7 @@ def useApi(String dep) { processResources { inputs.property "version", project.version - duplicatesStrategy = 'EXCLUDE' + duplicatesStrategy = 'WARN' from(sourceSets.main.resources.srcDirs) { include "fabric.mod.json" diff --git a/src/main/java/ru/betterend/blocks/entities/PedestalBlockEntity.java b/src/main/java/ru/betterend/blocks/entities/PedestalBlockEntity.java index d62077f2..dab530c0 100644 --- a/src/main/java/ru/betterend/blocks/entities/PedestalBlockEntity.java +++ b/src/main/java/ru/betterend/blocks/entities/PedestalBlockEntity.java @@ -139,7 +139,6 @@ public class PedestalBlockEntity extends BlockEntity implements Container, Block if (blockEntity.age > blockEntity.maxAge) { blockEntity.age = 0; } - System.out.println(blockEntity.age); } } } diff --git a/src/main/java/ru/betterend/mixin/common/WorldGenRegionMixin.java b/src/main/java/ru/betterend/mixin/common/WorldGenRegionMixin.java new file mode 100644 index 00000000..c275b531 --- /dev/null +++ b/src/main/java/ru/betterend/mixin/common/WorldGenRegionMixin.java @@ -0,0 +1,30 @@ +package ru.betterend.mixin.common; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.SectionPos; +import net.minecraft.server.level.WorldGenRegion; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.levelgen.feature.SpikeFeature; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import ru.bclib.util.MHelper; + +@Mixin(WorldGenRegion.class) +public class WorldGenRegionMixin { + @Final + @Shadow + private ChunkPos center; + + @Inject(method = "ensureCanWrite", at = @At("HEAD"), cancellable = true) + private void be_alterBlockCheck(BlockPos blockPos, CallbackInfoReturnable info) { + int x = blockPos.getX() >> 4; + int z = blockPos.getZ() >> 4; + WorldGenRegion region = (WorldGenRegion) (Object) this; + info.setReturnValue(Math.abs(x - center.x) < 2 && Math.abs(z - center.z) < 2); + } +} diff --git a/src/main/resources/betterend.mixins.common.json b/src/main/resources/betterend.mixins.common.json index 901e1855..d53b4518 100644 --- a/src/main/resources/betterend.mixins.common.json +++ b/src/main/resources/betterend.mixins.common.json @@ -17,12 +17,14 @@ "PotionBrewingAccessor", "MinecraftServerMixin", "EndDragonFightMixin", + "ShuffelingListMixin", + "WorldGenRegionMixin", "BlockBehaviourMixin", "DimensionTypeMixin", "CraftingMenuMixin", "LivingEntityMixin", "ServerPlayerMixin", - "SpikeFeatureMixin", + "SpikeFeatureMixin", "ServerLevelMixin", "PlayerListMixin", "AnvilMenuMixin", @@ -31,8 +33,7 @@ "MonsterMixin", "EntityMixin", "PlayerMixin", - "SlimeMixin", - "ShuffelingListMixin" + "SlimeMixin" ], "injectors": { "defaultRequire": 1 From ef3b28610324e46c3b332d3e10a848ecf1a1304a Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Thu, 8 Jul 2021 15:27:16 +0300 Subject: [PATCH 086/595] Fixed items on pedestals --- .../betterend/blocks/basis/PedestalBlock.java | 23 ++++++------------- .../blocks/entities/PedestalBlockEntity.java | 6 ++++- 2 files changed, 12 insertions(+), 17 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java b/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java index 117c82d5..fa6f4963 100644 --- a/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java @@ -42,6 +42,7 @@ import ru.bclib.client.models.ModelsHelper; import ru.betterend.blocks.EndBlockProperties; import ru.betterend.blocks.EndBlockProperties.PedestalState; import ru.betterend.blocks.InfusionPedestal; +import ru.betterend.blocks.entities.EndStoneSmelterBlockEntity; import ru.betterend.blocks.entities.InfusionPedestalEntity; import ru.betterend.blocks.entities.PedestalBlockEntity; import ru.betterend.client.models.Patterns; @@ -447,22 +448,6 @@ public class PedestalBlock extends BaseBlockNotFull implements EntityBlock { }; } - @Override - @Nullable - public BlockEntityTicker getTicker(Level level, BlockState blockState, BlockEntityType blockEntityType) { - if (level.isClientSide) return null; - - BlockEntityTicker ticker = createTickerHelper(blockEntityType, EndBlockEntities.PEDESTAL, PedestalBlockEntity::tick); - if (ticker != null) return ticker; - - return createTickerHelper(blockEntityType, EndBlockEntities.INFUSION_PEDESTAL, InfusionPedestalEntity::tick); - } - - @Nullable - protected static BlockEntityTicker createTickerHelper(BlockEntityType blockEntityType, BlockEntityType blockEntityType2, BlockEntityTicker blockEntityTicker) { - return blockEntityType2 == blockEntityType ? (BlockEntityTicker) blockEntityTicker : null; - } - static { VoxelShape basinUp = Block.box(2, 3, 2, 14, 4, 14); VoxelShape basinDown = Block.box(0, 0, 0, 16, 3, 16); @@ -481,4 +466,10 @@ public class PedestalBlock extends BaseBlockNotFull implements EntityBlock { SHAPE_COLUMN = Shapes.or(basin, SHAPE_PILLAR, columnTop); SHAPE_BOTTOM = Shapes.or(basin, SHAPE_PILLAR); } + + @Override + @Nullable + public BlockEntityTicker getTicker(Level level, BlockState blockState, BlockEntityType blockEntityType) { + return level.isClientSide() ? PedestalBlockEntity::tick : null; + } } diff --git a/src/main/java/ru/betterend/blocks/entities/PedestalBlockEntity.java b/src/main/java/ru/betterend/blocks/entities/PedestalBlockEntity.java index dab530c0..0e61d526 100644 --- a/src/main/java/ru/betterend/blocks/entities/PedestalBlockEntity.java +++ b/src/main/java/ru/betterend/blocks/entities/PedestalBlockEntity.java @@ -133,7 +133,11 @@ public class PedestalBlockEntity extends BlockEntity implements Container, Block } } - public static void tick(Level tickLevel, BlockPos tickPos, BlockState tickState, PedestalBlockEntity blockEntity) { + public static void tick(Level level, BlockPos blockPos, BlockState blockState, T uncastedEntity) { + clientTick(level, blockPos, blockState, (PedestalBlockEntity) uncastedEntity); + } + + private static void clientTick(Level tickLevel, BlockPos tickPos, BlockState tickState, PedestalBlockEntity blockEntity) { if (!blockEntity.isEmpty()) { blockEntity.age++; if (blockEntity.age > blockEntity.maxAge) { From fc3b6ea5b28fc0b03bdf07c6921998d7def9494e Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Thu, 8 Jul 2021 16:50:41 +0300 Subject: [PATCH 087/595] Crystal colors fix --- .../betterend/client/render/EternalCrystalRenderer.java | 3 ++- .../ru/betterend/client/render/PedestalItemRenderer.java | 9 ++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/ru/betterend/client/render/EternalCrystalRenderer.java b/src/main/java/ru/betterend/client/render/EternalCrystalRenderer.java index 324c9584..a6ecb0ed 100644 --- a/src/main/java/ru/betterend/client/render/EternalCrystalRenderer.java +++ b/src/main/java/ru/betterend/client/render/EternalCrystalRenderer.java @@ -44,7 +44,8 @@ public class EternalCrystalRenderer { matrices.popPose(); } - public static float[] colors(float delta) { + public static float[] colors(int age) { + double delta = age * 0.01; int index = MHelper.floor(delta); int index2 = (index + 1) & 3; delta -= index; diff --git a/src/main/java/ru/betterend/client/render/PedestalItemRenderer.java b/src/main/java/ru/betterend/client/render/PedestalItemRenderer.java index c80a5ba5..e0aa34ee 100644 --- a/src/main/java/ru/betterend/client/render/PedestalItemRenderer.java +++ b/src/main/java/ru/betterend/client/render/PedestalItemRenderer.java @@ -30,15 +30,15 @@ public class PedestalItemRenderer implements Bloc } @Override - public void render(T blockEntity, float tickDelta, PoseStack matrices, - MultiBufferSource vertexConsumers, int light, int overlay) { - + public void render(T blockEntity, float tickDelta, PoseStack matrices, MultiBufferSource vertexConsumers, int light, int overlay) { Level world = blockEntity.getLevel(); if (world == null || blockEntity.isEmpty()) return; BlockState state = world.getBlockState(blockEntity.getBlockPos()); if (!(state.getBlock() instanceof PedestalBlock)) return; + System.out.println(state.getBlock()); + ItemStack activeItem = blockEntity.getItem(0); matrices.pushPose(); @@ -47,8 +47,7 @@ public class PedestalItemRenderer implements Bloc BakedModel model = minecraft.getItemRenderer().getModel(activeItem, world, null, 0); Vector3f translate = model.getTransforms().ground.translation; PedestalBlock pedestal = (PedestalBlock) state.getBlock(); - matrices.translate(translate.x(), translate.y(), translate.z()); - matrices.translate(0.5, pedestal.getHeight(state), 0.5); + matrices.translate(translate.x() + 0.5, translate.y() + pedestal.getHeight(state), translate.z() + 0.5); if (activeItem.getItem() instanceof BlockItem) { matrices.scale(1.5F, 1.5F, 1.5F); } From 3086f6181b3f4b6886aa8fd0992bb7e95d56406c Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Fri, 9 Jul 2021 01:50:08 +0300 Subject: [PATCH 088/595] Terrain generator enhancements --- .../world/generator/TerrainBoolCache.java | 21 ++++++++++ .../world/generator/TerrainGenerator.java | 38 +++++++++++++++---- 2 files changed, 52 insertions(+), 7 deletions(-) create mode 100644 src/main/java/ru/betterend/world/generator/TerrainBoolCache.java diff --git a/src/main/java/ru/betterend/world/generator/TerrainBoolCache.java b/src/main/java/ru/betterend/world/generator/TerrainBoolCache.java new file mode 100644 index 00000000..3afe6529 --- /dev/null +++ b/src/main/java/ru/betterend/world/generator/TerrainBoolCache.java @@ -0,0 +1,21 @@ +package ru.betterend.world.generator; + +public class TerrainBoolCache { + private byte[] data = new byte[16384]; + + public static int scaleCoordinate(int value) { + return value >> 7; + } + + private int getIndex(int x, int z) { + return x << 7 | z; + } + + public void setData(int x, int z, byte value) { + data[getIndex(x & 127, z & 127)] = value; + } + + public byte getData(int x, int z) { + return data[getIndex(x & 127, z & 127)]; + } +} diff --git a/src/main/java/ru/betterend/world/generator/TerrainGenerator.java b/src/main/java/ru/betterend/world/generator/TerrainGenerator.java index 4e062f51..1a60633a 100644 --- a/src/main/java/ru/betterend/world/generator/TerrainGenerator.java +++ b/src/main/java/ru/betterend/world/generator/TerrainGenerator.java @@ -1,6 +1,9 @@ package ru.betterend.world.generator; import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.util.Mth; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.biome.BiomeSource; @@ -9,11 +12,15 @@ import ru.betterend.noise.OpenSimplexNoise; import java.awt.Point; import java.util.List; +import java.util.Map; import java.util.Random; import java.util.concurrent.locks.ReentrantLock; +import java.util.stream.IntStream; public class TerrainGenerator { + private static final Map TERRAIN_BOOL_CACHE_MAP = Maps.newHashMap(); private static final ReentrantLock LOCKER = new ReentrantLock(); + private static final Point POS = new Point(); private static final double SCALE_XZ = 8.0; private static final double SCALE_Y = 4.0; private static final float[] COEF; @@ -24,10 +31,6 @@ public class TerrainGenerator { private static IslandLayer smallIslands; private static OpenSimplexNoise noise1; private static OpenSimplexNoise noise2; - - /*public static boolean canGenerate(int x, int z) { - return GeneratorOptions.noRingVoid() || (long) x + (long) z > CENTER; - }*/ public static void initNoise(long seed) { Random random = new Random(seed); @@ -99,7 +102,25 @@ public class TerrainGenerator { * @param z - biome pos z */ public static boolean isLand(int x, int z) { + int sectionX = TerrainBoolCache.scaleCoordinate(x); + int sectionZ = TerrainBoolCache.scaleCoordinate(z); + LOCKER.lock(); + POS.setLocation(sectionX, sectionZ); + + TerrainBoolCache section = TERRAIN_BOOL_CACHE_MAP.get(POS); + if (section == null) { + if (TERRAIN_BOOL_CACHE_MAP.size() > 64) { + TERRAIN_BOOL_CACHE_MAP.clear(); + } + section = new TerrainBoolCache(); + TERRAIN_BOOL_CACHE_MAP.put(new Point(POS.x, POS.y), section); + } + byte value = section.getData(x, z); + if (value > 0) { + LOCKER.unlock(); + return value > 1; + } double px = (x >> 1) + 0.5; double pz = (z >> 1) + 0.5; @@ -113,6 +134,7 @@ public class TerrainGenerator { mediumIslands.updatePositions(px, pz); smallIslands.updatePositions(px, pz); + boolean result = false; for (int y = 0; y < 32; y++) { double py = (double) y * SCALE_Y; float dist = largeIslands.getDensity(px, py, pz); @@ -124,13 +146,15 @@ public class TerrainGenerator { dist += noise1.eval(px * 0.1, py * 0.1, pz * 0.1) * 0.005 + 0.005; } if (dist > -0.01) { - LOCKER.unlock(); - return true; + result = true; + break; } } + section.setData(x, z, (byte) (result ? 2 : 1)); LOCKER.unlock(); - return false; + + return result; } /** From 86a37e577013b0c3910a8eabe142e26bbdb52837 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Fri, 9 Jul 2021 01:51:26 +0300 Subject: [PATCH 089/595] Cache clearing --- src/main/java/ru/betterend/world/generator/TerrainGenerator.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/ru/betterend/world/generator/TerrainGenerator.java b/src/main/java/ru/betterend/world/generator/TerrainGenerator.java index 1a60633a..0e0cd530 100644 --- a/src/main/java/ru/betterend/world/generator/TerrainGenerator.java +++ b/src/main/java/ru/betterend/world/generator/TerrainGenerator.java @@ -39,6 +39,7 @@ public class TerrainGenerator { smallIslands = new IslandLayer(random.nextInt(), GeneratorOptions.smallOptions); noise1 = new OpenSimplexNoise(random.nextInt()); noise2 = new OpenSimplexNoise(random.nextInt()); + TERRAIN_BOOL_CACHE_MAP.clear(); } public static void fillTerrainDensity(double[] buffer, int x, int z, BiomeSource biomeSource) { From cca7d9d3b271ddab8edd89992b8bb851d8163482 Mon Sep 17 00:00:00 2001 From: Frank Bauer Date: Fri, 9 Jul 2021 00:53:24 +0200 Subject: [PATCH 090/595] Fixed item rendering bug --- .../java/ru/betterend/blocks/entities/EternalPedestalEntity.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/ru/betterend/blocks/entities/EternalPedestalEntity.java b/src/main/java/ru/betterend/blocks/entities/EternalPedestalEntity.java index 0490da3a..1151bcd9 100644 --- a/src/main/java/ru/betterend/blocks/entities/EternalPedestalEntity.java +++ b/src/main/java/ru/betterend/blocks/entities/EternalPedestalEntity.java @@ -28,6 +28,7 @@ public class EternalPedestalEntity extends PedestalBlockEntity { @Override public void setLevel(Level world) { + super.setLevel(world); if (hasRitual()) { linkedRitual.setWorld(world); } From 7e7dad084e1895791c7cb6063a51c424510f098a Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Fri, 9 Jul 2021 01:57:38 +0300 Subject: [PATCH 091/595] Eternal pedestals fix --- .../ru/betterend/blocks/entities/EternalPedestalEntity.java | 5 +++-- .../ru/betterend/client/render/PedestalItemRenderer.java | 2 -- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/entities/EternalPedestalEntity.java b/src/main/java/ru/betterend/blocks/entities/EternalPedestalEntity.java index 7697033f..dc516e51 100644 --- a/src/main/java/ru/betterend/blocks/entities/EternalPedestalEntity.java +++ b/src/main/java/ru/betterend/blocks/entities/EternalPedestalEntity.java @@ -27,9 +27,10 @@ public class EternalPedestalEntity extends PedestalBlockEntity { } @Override - public void setLevel(Level world) { + public void setLevel(Level level) { + super.setLevel(level); if (hasRitual()) { - linkedRitual.setWorld(world); + linkedRitual.setWorld(level); } } diff --git a/src/main/java/ru/betterend/client/render/PedestalItemRenderer.java b/src/main/java/ru/betterend/client/render/PedestalItemRenderer.java index e0aa34ee..2568db8c 100644 --- a/src/main/java/ru/betterend/client/render/PedestalItemRenderer.java +++ b/src/main/java/ru/betterend/client/render/PedestalItemRenderer.java @@ -37,8 +37,6 @@ public class PedestalItemRenderer implements Bloc BlockState state = world.getBlockState(blockEntity.getBlockPos()); if (!(state.getBlock() instanceof PedestalBlock)) return; - System.out.println(state.getBlock()); - ItemStack activeItem = blockEntity.getItem(0); matrices.pushPose(); From 2f88ac535805dac00994b495d7e2fb8eb5d2f21a Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Fri, 9 Jul 2021 02:03:11 +0300 Subject: [PATCH 092/595] Guidebook fix --- .../guidebook/en_us/entries/rituals/eternal_ritual.json | 2 +- .../guidebook/en_us/entries/rituals/infusion_ritual.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/data/betterend/patchouli_books/guidebook/en_us/entries/rituals/eternal_ritual.json b/src/main/resources/data/betterend/patchouli_books/guidebook/en_us/entries/rituals/eternal_ritual.json index dc587602..596563f9 100644 --- a/src/main/resources/data/betterend/patchouli_books/guidebook/en_us/entries/rituals/eternal_ritual.json +++ b/src/main/resources/data/betterend/patchouli_books/guidebook/en_us/entries/rituals/eternal_ritual.json @@ -2,7 +2,7 @@ "name": "Eternal Ritual", "icon": "betterend:eternal_pedestal", "read_by_default": true, - "category": "rituals", + "category": "betterend:rituals", "pages": [ { "type": "text", diff --git a/src/main/resources/data/betterend/patchouli_books/guidebook/en_us/entries/rituals/infusion_ritual.json b/src/main/resources/data/betterend/patchouli_books/guidebook/en_us/entries/rituals/infusion_ritual.json index a588ebf8..da553170 100644 --- a/src/main/resources/data/betterend/patchouli_books/guidebook/en_us/entries/rituals/infusion_ritual.json +++ b/src/main/resources/data/betterend/patchouli_books/guidebook/en_us/entries/rituals/infusion_ritual.json @@ -2,7 +2,7 @@ "name": "Infusion Ritual", "icon": "betterend:infusion_pedestal", "read_by_default": true, - "category": "rituals", + "category": "betterend:rituals", "pages": [ { "type": "text", From a8ace0005b370be85b63843c8cbb2b9b0a493120 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Fri, 9 Jul 2021 02:03:32 +0300 Subject: [PATCH 093/595] Removed old method --- .../ru/betterend/blocks/entities/EternalPedestalEntity.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/entities/EternalPedestalEntity.java b/src/main/java/ru/betterend/blocks/entities/EternalPedestalEntity.java index dc516e51..7796d528 100644 --- a/src/main/java/ru/betterend/blocks/entities/EternalPedestalEntity.java +++ b/src/main/java/ru/betterend/blocks/entities/EternalPedestalEntity.java @@ -34,12 +34,6 @@ public class EternalPedestalEntity extends PedestalBlockEntity { } } - public void setLevelAndPosition(Level world, BlockPos pos) { - if (hasRitual()) { - linkedRitual.setWorld(world); - } - } - @Override public CompoundTag save(CompoundTag tag) { if (hasRitual()) { From ea9b3c72a4284c8aee55e9314001cff6a7c4b8bc Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Fri, 9 Jul 2021 02:14:54 +0300 Subject: [PATCH 094/595] Fixed elytra boost --- .../blocks/entities/BlockEntityHydrothermalVent.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/entities/BlockEntityHydrothermalVent.java b/src/main/java/ru/betterend/blocks/entities/BlockEntityHydrothermalVent.java index 1e44f1b5..b0d16ec7 100644 --- a/src/main/java/ru/betterend/blocks/entities/BlockEntityHydrothermalVent.java +++ b/src/main/java/ru/betterend/blocks/entities/BlockEntityHydrothermalVent.java @@ -35,9 +35,9 @@ public class BlockEntityHydrothermalVent extends BlockEntity { if (level.isClientSide()) { clientTick(level, worldPosition, state, blockEntity); } - else { + //else { serverTick(level, worldPosition, state, blockEntity); - } + //} } } From 9ad0c3c4177ea468871f31d7fa779b5ddc313542 Mon Sep 17 00:00:00 2001 From: Frank Bauer Date: Fri, 9 Jul 2021 01:47:36 +0200 Subject: [PATCH 095/595] german tarnslation for guidebook --- .../assets/betterend/lang/de_de.json | 4 +- .../guidebook/de_de/categories/biomes.json | 5 ++ .../guidebook/de_de/categories/crafting.json | 6 ++ .../guidebook/de_de/categories/end_veil.json | 6 ++ .../guidebook/de_de/categories/rituals.json | 6 ++ .../de_de/entries/rituals/eternal_ritual.json | 44 +++++++++++++ .../entries/rituals/infusion_ritual.json | 64 +++++++++++++++++++ 7 files changed, 133 insertions(+), 2 deletions(-) create mode 100644 src/main/resources/data/betterend/patchouli_books/guidebook/de_de/categories/biomes.json create mode 100644 src/main/resources/data/betterend/patchouli_books/guidebook/de_de/categories/crafting.json create mode 100644 src/main/resources/data/betterend/patchouli_books/guidebook/de_de/categories/end_veil.json create mode 100644 src/main/resources/data/betterend/patchouli_books/guidebook/de_de/categories/rituals.json create mode 100644 src/main/resources/data/betterend/patchouli_books/guidebook/de_de/entries/rituals/eternal_ritual.json create mode 100644 src/main/resources/data/betterend/patchouli_books/guidebook/de_de/entries/rituals/infusion_ritual.json diff --git a/src/main/resources/assets/betterend/lang/de_de.json b/src/main/resources/assets/betterend/lang/de_de.json index 7341d5c0..b3392c2c 100644 --- a/src/main/resources/assets/betterend/lang/de_de.json +++ b/src/main/resources/assets/betterend/lang/de_de.json @@ -188,7 +188,7 @@ "block.betterend.granite_pedestal": "Granitsockel", "block.betterend.purpur_pedestal": "Purpursockel", "block.betterend.quartz_pedestal": "Quarzsockel", - "block.betterend.infusion_pedestal": "Infusionssockel", + "block.betterend.infusion_pedestal": "Elementarsockel", "block.betterend.end_lotus_seed": "Endlotussamen", "block.betterend.end_lotus_stem": "Endlotusstamm", @@ -227,7 +227,7 @@ "block.betterend.flavolite_runed": "Flavolitrune", "block.betterend.end_portal_block": "Endportal", - "block.betterend.eternal_pedestal": "Ewiges Sockel", + "block.betterend.eternal_pedestal": "Ewiger Sockel", "block.betterend.flavolite_runed_eternal": "Ewige Flavolitrune", "item.betterend.eternal_crystal": "Ewiger Kristall", diff --git a/src/main/resources/data/betterend/patchouli_books/guidebook/de_de/categories/biomes.json b/src/main/resources/data/betterend/patchouli_books/guidebook/de_de/categories/biomes.json new file mode 100644 index 00000000..26fc50b9 --- /dev/null +++ b/src/main/resources/data/betterend/patchouli_books/guidebook/de_de/categories/biomes.json @@ -0,0 +1,5 @@ +{ + "name": "Biome", + "description": "Bald verfügabr...", + "icon": "betterend:end_mycelium" +} \ No newline at end of file diff --git a/src/main/resources/data/betterend/patchouli_books/guidebook/de_de/categories/crafting.json b/src/main/resources/data/betterend/patchouli_books/guidebook/de_de/categories/crafting.json new file mode 100644 index 00000000..1b0b44fb --- /dev/null +++ b/src/main/resources/data/betterend/patchouli_books/guidebook/de_de/categories/crafting.json @@ -0,0 +1,6 @@ +{ + "name": "Crafting", + "description": "Bald verfügabr...", + "icon": "betterend:iron_hammer", + "sortnum": 2 +} \ No newline at end of file diff --git a/src/main/resources/data/betterend/patchouli_books/guidebook/de_de/categories/end_veil.json b/src/main/resources/data/betterend/patchouli_books/guidebook/de_de/categories/end_veil.json new file mode 100644 index 00000000..fc2d51d3 --- /dev/null +++ b/src/main/resources/data/betterend/patchouli_books/guidebook/de_de/categories/end_veil.json @@ -0,0 +1,6 @@ +{ + "name": "Endschleier", + "description": "Schaue den Enderman ohne Furcht tief in die Augen.", + "icon": "betterend:textures/mob_effect/end_veil.png", + "sortnum": 3 +} \ No newline at end of file diff --git a/src/main/resources/data/betterend/patchouli_books/guidebook/de_de/categories/rituals.json b/src/main/resources/data/betterend/patchouli_books/guidebook/de_de/categories/rituals.json new file mode 100644 index 00000000..308b16fc --- /dev/null +++ b/src/main/resources/data/betterend/patchouli_books/guidebook/de_de/categories/rituals.json @@ -0,0 +1,6 @@ +{ + "name": "Rituale", + "description": "Mystische Künste aus dem End. Diese in der Oberwelt lang vergessenen Rituale eröffnen Dir neue Wege und Möglichkeiten.", + "icon": "betterend:infusion_pedestal", + "sortnum": 1 +} \ No newline at end of file diff --git a/src/main/resources/data/betterend/patchouli_books/guidebook/de_de/entries/rituals/eternal_ritual.json b/src/main/resources/data/betterend/patchouli_books/guidebook/de_de/entries/rituals/eternal_ritual.json new file mode 100644 index 00000000..c093f043 --- /dev/null +++ b/src/main/resources/data/betterend/patchouli_books/guidebook/de_de/entries/rituals/eternal_ritual.json @@ -0,0 +1,44 @@ +{ + "name": "Rituale der Ewigkeit", + "icon": "betterend:eternal_pedestal", + "read_by_default": true, + "category": "betterend:rituals", + "pages": [ + { + "type": "text", + "text": "\"Ein steiniger Weg zurück in die Oberwelt.\"$(br2)Auf Deinen Reisen durch das End wirst du gelegentlich alte Ruinen finden.$(br2)Alte Mythen erzählen von einem (vielleicht schon) zerstörten Rahme aus $(bold)Flavolitrune$(), der von sechs Sockeln umringt ist." + }, + { + "type": "image", + "text": "", + "border": false, + "images": [ + "betterend:textures/images/eternal_ritual/portal_structure.png" + ] + }, + { + "type": "text", + "text": "Es sind die letzte überbleibsel eines majestätischen Protals, dass einst eine Pforte zwischen der Oberwelt und dem End bildete.$(br2)Um das Protal wieder zum leben zu erwecken, musst Du zuerst die Teile des Rahmens finden und vervollständigen." + }, + { + "type": "image", + "text": "Platziere dann 6 $(bold)Ewige Kristalle$() auf den Sockeln.", + "border": false, + "images": [ + "betterend:textures/images/eternal_ritual/portal_frame_full.png" + ] + }, + { + "type": "image", + "text": "Sobald der letzte Kirstall paltziert wurde,", + "border": false, + "images": [ + "betterend:textures/images/eternal_ritual/ritual_finished.png" + ] + }, + { + "type": "text", + "text": "wird das Portal aus seinem Schlummer erwachen und die Welten verbinden. Die $(bold)Flavolitrune$() (um den Rahmen zu reparieren) und die $(bold)Ewige Kristalle$() können durch ein $(l:rituals/infusion_ritual)Infusionsritual$(/l) erschaffen werden." + } + ] +} diff --git a/src/main/resources/data/betterend/patchouli_books/guidebook/de_de/entries/rituals/infusion_ritual.json b/src/main/resources/data/betterend/patchouli_books/guidebook/de_de/entries/rituals/infusion_ritual.json new file mode 100644 index 00000000..df3583ed --- /dev/null +++ b/src/main/resources/data/betterend/patchouli_books/guidebook/de_de/entries/rituals/infusion_ritual.json @@ -0,0 +1,64 @@ +{ + "name": "Elementarritual", + "icon": "betterend:infusion_pedestal", + "read_by_default": true, + "category": "betterend:rituals", + "pages": [ + { + "type": "text", + "text": "Hauche deinen Gegenständen die Macht der Elemente ein." + }, + { + "type": "crafting", + "title": "Der Ritualplatz", + "text": "Zuerst musst Du einen $(bold)Elementarsockel$() sowie 8 weitere Sockel eines $(bold)beliebigen$() Typs herstellen.", + "recipe": "betterend:infusion_pedestal" + }, + { + "type": "image", + "text": "Stelle den Elementarsockel umringt von den restlichen Sockeln (Abb. 2) auf.", + "border": true, + "images": [ + "betterend:textures/images/infusion_ritual/infusion_ritual_start.png", + "betterend:textures/images/infusion_ritual/infusion_ritual_full.png" + ] + }, + { + "type": "image", + "title": "Verschmelzen", + "text": "Damit ist der Ritualplatz fertig, und kann verwendet werden.", + "border": false, + "images": [ + "betterend:textures/images/infusion_ritual/ritual_structure.png" + ] + }, + { + "type": "image", + "text": "Setzte den Hauptwirkstoff umringt von den Katalysatoren", + "border": false, + "images": [ + "betterend:textures/images/infusion_ritual/ritual_ready.png" + ] + }, + { + "type": "text", + "text": "auf den $(bold)Elementarsockel$().$(br2)Alle möglichen Rezepte findest du zum Beispiel mit $(l:https://www.curseforge.com/minecraft/mc-mods/roughly-enough-items)REI$(/l).$(br2)Um den Prozess zu starten, plaziere den Hauptwirkstoff zuletzt oder klicke den $(bold)Elementarsockel$() mit der rechten Moustaste an." + }, + { + "type": "image", + "text": "Die Sockel verschmelzen nun die Zutaten. ", + "border": false, + "images": [ + "betterend:textures/images/infusion_ritual/ritual_started.png" + ] + }, + { + "type": "image", + "text": "Nach einer kurzen Zeit sind die Katalysatoren verbraucht und das Ritual ist beendet.", + "border": false, + "images": [ + "betterend:textures/images/infusion_ritual/ritual_finished.png" + ] + } + ] +} \ No newline at end of file From df64b5e3ce327a242bffdf6475cfe65cbd39b2ca Mon Sep 17 00:00:00 2001 From: Frank Bauer Date: Fri, 9 Jul 2021 02:11:23 +0200 Subject: [PATCH 096/595] Fixed duplicate of `additional_gold` --- src/main/java/ru/betterend/recipe/AlloyingRecipes.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/ru/betterend/recipe/AlloyingRecipes.java b/src/main/java/ru/betterend/recipe/AlloyingRecipes.java index f6585a15..b4f5aefe 100644 --- a/src/main/java/ru/betterend/recipe/AlloyingRecipes.java +++ b/src/main/java/ru/betterend/recipe/AlloyingRecipes.java @@ -19,7 +19,7 @@ public class AlloyingRecipes { .setOutput(Items.GOLD_INGOT, 3) .setExpiriense(3F) .build(); - AlloyingRecipe.Builder.create("additional_gold") + AlloyingRecipe.Builder.create("additional_copper") .setInput(EndTags.ALLOYING_COPPER, EndTags.ALLOYING_COPPER) .setOutput(Items.COPPER_INGOT, 3) .setExpiriense(3F) From b05f2fcf574d98ce9865c6c43d6648800e04edcf Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Fri, 9 Jul 2021 03:16:49 +0300 Subject: [PATCH 097/595] Fixed water rendering, duplicate ID and missing hammer tag --- .../blocks/complex/MetalMaterial.java | 1 + .../mixin/client/BiomeColorsMixin.java | 28 ++++++++----------- .../ru/betterend/recipe/AlloyingRecipes.java | 2 +- 3 files changed, 14 insertions(+), 17 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java b/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java index cb057d54..b0dbd619 100644 --- a/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java +++ b/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java @@ -225,5 +225,6 @@ public class MetalMaterial { TagHelper.addTag(BlockTags.BEACON_BASE_BLOCKS, block); TagHelper.addTag(ItemTags.BEACON_PAYMENT_ITEMS, ingot); TagHelper.addTag(TagAPI.DRAGON_IMMUNE, ore, bars); + TagHelper.addTag(TagAPI.HAMMERS, hammer); } } \ No newline at end of file diff --git a/src/main/java/ru/betterend/mixin/client/BiomeColorsMixin.java b/src/main/java/ru/betterend/mixin/client/BiomeColorsMixin.java index 5b4b9af3..cce33d52 100644 --- a/src/main/java/ru/betterend/mixin/client/BiomeColorsMixin.java +++ b/src/main/java/ru/betterend/mixin/client/BiomeColorsMixin.java @@ -13,10 +13,13 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import ru.bclib.util.BlocksHelper; import ru.bclib.util.ColorUtil; +import ru.bclib.util.MHelper; import ru.betterend.client.ClientOptions; import ru.betterend.registry.EndBlocks; import java.awt.Point; +import java.util.Arrays; +import java.util.Comparator; @Mixin(BiomeColors.class) public class BiomeColorsMixin { @@ -35,8 +38,7 @@ public class BiomeColorsMixin { mut.setX(pos.getX() + OFFSETS[i].x); mut.setZ(pos.getZ() + OFFSETS[i].y); if ((view.getBlockState(mut).is(EndBlocks.BRIMSTONE))) { - info.setReturnValue(i < 16 ? STREAM_COLOR : POISON_COLOR); - info.cancel(); + info.setReturnValue(i < 4 ? POISON_COLOR : STREAM_COLOR); return; } } @@ -46,21 +48,15 @@ public class BiomeColorsMixin { static { HAS_SODIUM = FabricLoader.getInstance().isModLoaded("sodium"); + int index = 0; OFFSETS = new Point[20]; - for (int i = 0; i < 3; i++) { - int p = i - 1; - OFFSETS[i] = new Point(p, -2); - OFFSETS[i + 3] = new Point(p, 2); - OFFSETS[i + 6] = new Point(-2, p); - OFFSETS[i + 9] = new Point(2, p); - } - - for (int i = 0; i < 4; i++) { - int inner = i + 16; - Direction dir = BlocksHelper.HORIZONTAL[i]; - OFFSETS[inner] = new Point(dir.getStepX(), dir.getStepZ()); - dir = BlocksHelper.HORIZONTAL[(i + 1) & 3]; - OFFSETS[i + 12] = new Point(OFFSETS[inner].x + dir.getStepX(), OFFSETS[inner].y + dir.getStepZ()); + for (int x = -2; x < 3; x++) { + for (int z = -2; z < 3; z++) { + if ((x != 0 || z != 0) && (Math.abs(x) != 2 || Math.abs(z) != 2)) { + OFFSETS[index++] = new Point(x, z); + } + } } + Arrays.sort(OFFSETS, Comparator.comparingInt(pos -> MHelper.sqr(pos.x) + MHelper.sqr(pos.y))); } } diff --git a/src/main/java/ru/betterend/recipe/AlloyingRecipes.java b/src/main/java/ru/betterend/recipe/AlloyingRecipes.java index f6585a15..b4f5aefe 100644 --- a/src/main/java/ru/betterend/recipe/AlloyingRecipes.java +++ b/src/main/java/ru/betterend/recipe/AlloyingRecipes.java @@ -19,7 +19,7 @@ public class AlloyingRecipes { .setOutput(Items.GOLD_INGOT, 3) .setExpiriense(3F) .build(); - AlloyingRecipe.Builder.create("additional_gold") + AlloyingRecipe.Builder.create("additional_copper") .setInput(EndTags.ALLOYING_COPPER, EndTags.ALLOYING_COPPER) .setOutput(Items.COPPER_INGOT, 3) .setExpiriense(3F) From 9bd38a962993fbfb7cc068e9b5b0df8982ae9725 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Fri, 9 Jul 2021 03:24:35 +0300 Subject: [PATCH 098/595] Small addition --- src/main/resources/fabric.mod.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index d19705e1..ff7e882c 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -11,7 +11,8 @@ "Edos (building)", "Yuki (art)", "Seaward (art)", - "Firel (music)" + "Firel (music)", + "Frank (code porting & bugfixes)" ], "contact": { "homepage": "https://www.curseforge.com/minecraft/mc-mods/betterend", From 5fe4439096850e7ebf8dfddb1f72712867c76d80 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Fri, 9 Jul 2021 03:33:03 +0300 Subject: [PATCH 099/595] Updated readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a3ff811f..b55c4f42 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ [![](https://jitpack.io/v/paulevsGitch/BetterEnd.svg)](https://jitpack.io/#paulevsGitch/BetterEnd) # Better End -Better End Mod for Fabric, MC 1.16.4 +Better End Mod for Fabric, MC 1.17.1 Importing: * Clone repo From 92f6f47058559bf106c4e24474cccf9ef6f7d9e6 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Fri, 9 Jul 2021 11:12:13 +0300 Subject: [PATCH 100/595] Infusion REI recipe fix --- gradle.properties | 2 +- .../integration/rei/REIInfusionCategory.java | 25 ++++++++++++++----- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/gradle.properties b/gradle.properties index 9e25e84c..a5a63da9 100644 --- a/gradle.properties +++ b/gradle.properties @@ -8,7 +8,7 @@ yarn_mappings= 6 loader_version= 0.11.6 # Mod Properties -mod_version = 0.10.0-pre +mod_version = 0.10.1-pre maven_group = ru.betterend archives_base_name = better-end diff --git a/src/main/java/ru/betterend/integration/rei/REIInfusionCategory.java b/src/main/java/ru/betterend/integration/rei/REIInfusionCategory.java index f974e304..a390f2c3 100644 --- a/src/main/java/ru/betterend/integration/rei/REIInfusionCategory.java +++ b/src/main/java/ru/betterend/integration/rei/REIInfusionCategory.java @@ -18,6 +18,7 @@ import org.jetbrains.annotations.NotNull; import ru.betterend.BetterEnd; import ru.betterend.registry.EndBlocks; +import java.util.ArrayList; import java.util.List; public class REIInfusionCategory implements TransferDisplayCategory { @@ -44,7 +45,6 @@ public class REIInfusionCategory implements TransferDisplayCategory setupDisplay(REIInfusionDisplay display, Rectangle bounds) { Point centerPoint = new Point(bounds.getCenterX() - 34, bounds.getCenterY() - 2); @@ -52,6 +52,14 @@ public class REIInfusionCategory implements TransferDisplayCategory inputEntries = display.getInputEntries(); List outputEntries = display.getOutputEntries(); + if (inputEntries.size() < 9) { + List newList = new ArrayList(9); + newList.addAll(inputEntries); + for (int i = inputEntries.size(); i < 9; i++) { + newList.add(EntryIngredient.empty()); + } + inputEntries = newList; + } widgets.add(Widgets.createTexturedWidget(BACKGROUND, bounds.x, bounds.y, 0, 0, 150, 104, 150, 104)); widgets.add(Widgets.createSlot(centerPoint).entries(inputEntries.get(0)).disableBackground().markInput()); widgets.add(Widgets.createSlot(new Point(centerPoint.x, centerPoint.y - 28)).entries(inputEntries.get(1)).disableBackground().markInput()); @@ -63,8 +71,15 @@ public class REIInfusionCategory implements TransferDisplayCategory widgets, Rectangle bounds, REIInfusionDisplay display, IntList redSlots) { - - } + public void renderRedSlots(PoseStack matrices, List widgets, Rectangle bounds, REIInfusionDisplay display, IntList redSlots) {} } From 2ea71cf8d6f390948d6cc15dd7923f9b55095ac9 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Fri, 9 Jul 2021 11:32:35 +0300 Subject: [PATCH 101/595] Infusion ritual fix --- .../ru/betterend/blocks/CavePumpkinBlock.java | 2 +- .../ru/betterend/blocks/InfusionPedestal.java | 10 +++++++ .../entities/InfusionPedestalEntity.java | 27 ++++++++----------- 3 files changed, 22 insertions(+), 17 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/CavePumpkinBlock.java b/src/main/java/ru/betterend/blocks/CavePumpkinBlock.java index 6b1feb7e..166c13e8 100644 --- a/src/main/java/ru/betterend/blocks/CavePumpkinBlock.java +++ b/src/main/java/ru/betterend/blocks/CavePumpkinBlock.java @@ -58,7 +58,7 @@ public class CavePumpkinBlock extends BaseBlockNotFull implements IRenderTyped { VoxelShape top = Block.box(5, 15, 5, 11, 16, 11); SHAPE_BIG = Shapes.or(lantern, cap, top); - lantern = Block.box(1, 7, 1, 15, 13, 15); + lantern = Block.box(5, 7, 5, 11, 13, 11); cap = Block.box(4, 12, 4, 12, 15, 12); top = Block.box(6, 15, 6, 10, 16, 10); SHAPE_SMALL = Shapes.or(lantern, cap, top); diff --git a/src/main/java/ru/betterend/blocks/InfusionPedestal.java b/src/main/java/ru/betterend/blocks/InfusionPedestal.java index d1401a17..45c2e56e 100644 --- a/src/main/java/ru/betterend/blocks/InfusionPedestal.java +++ b/src/main/java/ru/betterend/blocks/InfusionPedestal.java @@ -6,12 +6,16 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityTicker; +import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.Shapes; import net.minecraft.world.phys.shapes.VoxelShape; +import org.jetbrains.annotations.Nullable; import ru.betterend.blocks.basis.PedestalBlock; import ru.betterend.blocks.entities.InfusionPedestalEntity; +import ru.betterend.blocks.entities.PedestalBlockEntity; import ru.betterend.rituals.InfusionRitual; @SuppressWarnings("deprecation") @@ -73,6 +77,12 @@ public class InfusionPedestal extends PedestalBlock { return super.getShape(state, world, pos, context); } + @Override + @Nullable + public BlockEntityTicker getTicker(Level level, BlockState blockState, BlockEntityType blockEntityType) { + return InfusionPedestalEntity::tickEnity; + } + static { VoxelShape basinUp = Block.box(2, 3, 2, 14, 4, 14); VoxelShape basinDown = Block.box(0, 0, 0, 16, 3, 16); diff --git a/src/main/java/ru/betterend/blocks/entities/InfusionPedestalEntity.java b/src/main/java/ru/betterend/blocks/entities/InfusionPedestalEntity.java index 1136d154..b4f67dce 100644 --- a/src/main/java/ru/betterend/blocks/entities/InfusionPedestalEntity.java +++ b/src/main/java/ru/betterend/blocks/entities/InfusionPedestalEntity.java @@ -3,6 +3,7 @@ package ru.betterend.blocks.entities; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; import ru.betterend.registry.EndBlockEntities; import ru.betterend.rituals.InfusionRitual; @@ -26,15 +27,6 @@ public class InfusionPedestalEntity extends PedestalBlockEntity { } } - public void setLevelAndPosition(Level world, BlockPos pos) { - if (hasRitual()) { - linkedRitual.setLocation(world, pos); - } - else { - linkRitual(new InfusionRitual(this, world, pos)); - } - } - public void linkRitual(InfusionRitual ritual) { linkedRitual = ritual; } @@ -47,13 +39,6 @@ public class InfusionPedestalEntity extends PedestalBlockEntity { return linkedRitual != null; } - public static void tick(Level tickLevel, BlockPos tickPos, BlockState tickState, InfusionPedestalEntity blockEntity) { - if (blockEntity.hasRitual()) { - blockEntity.linkedRitual.tick(); - } - PedestalBlockEntity.tick(tickLevel, tickPos, tickState, blockEntity); - } - @Override public CompoundTag save(CompoundTag tag) { if (hasRitual()) { @@ -70,4 +55,14 @@ public class InfusionPedestalEntity extends PedestalBlockEntity { linkedRitual.fromTag(tag.getCompound("ritual")); } } + + public static void tickEnity(Level level, BlockPos blockPos, BlockState blockState, T uncastedEntity) { + if (uncastedEntity instanceof InfusionPedestalEntity) { + InfusionPedestalEntity blockEntity = (InfusionPedestalEntity) uncastedEntity; + if (blockEntity.hasRitual()) { + blockEntity.linkedRitual.tick(); + } + PedestalBlockEntity.tick(level, blockPos, blockState, blockEntity); + } + } } From b5f3a4f51105223e885015b521db14c0e28775ee Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Fri, 9 Jul 2021 11:39:46 +0300 Subject: [PATCH 102/595] Dragon respawn changes --- .../java/ru/betterend/mixin/common/EndDragonFightMixin.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/ru/betterend/mixin/common/EndDragonFightMixin.java b/src/main/java/ru/betterend/mixin/common/EndDragonFightMixin.java index 64b9d598..0ac42423 100644 --- a/src/main/java/ru/betterend/mixin/common/EndDragonFightMixin.java +++ b/src/main/java/ru/betterend/mixin/common/EndDragonFightMixin.java @@ -72,7 +72,7 @@ public class EndDragonFightMixin { BlockPos center = GeneratorOptions.getPortalPos().above(5); for (Direction dir : BlocksHelper.HORIZONTAL) { BlockPos central = center.relative(dir, 4); - List crystalList = level.getEntitiesOfClass(EndCrystal.class, new AABB(central.below(10).south().west(), central.above(10).north().east())); + List crystalList = level.getEntitiesOfClass(EndCrystal.class, new AABB(central.below(255).south().west(), central.above(255).north().east())); int count = crystalList.size(); for (int n = 0; n < count; n++) { From ccfc3adce01ef6ac2240807ceae93a9661f45415 Mon Sep 17 00:00:00 2001 From: Frank Bauer Date: Fri, 9 Jul 2021 11:16:20 +0200 Subject: [PATCH 103/595] Latest REI --- Convert.java | 34 +++++++--------------------------- gradle.properties | 2 +- 2 files changed, 8 insertions(+), 28 deletions(-) diff --git a/Convert.java b/Convert.java index 3de64d73..e06ec11c 100644 --- a/Convert.java +++ b/Convert.java @@ -149,32 +149,12 @@ public class Convert { } public void c (){ float scale = 1; - ModelPart partC = new ModelPart(64, 64, 0, 19, "partC"); - partC.addBox(1.0F, 0.0F, 1.0F, 14.0F, 9.0F, 14.0F, 0.0F); - ModelPart partA = new ModelPart(64, 64, 0, 0,"partA"); - partA.addBox(1.0F, 0.0F, 0.0F, 14.0F, 5.0F, 14.0F, 0.0F); - partA.y = 9.0F; - partA.z = 1.0F; - ModelPart partB = new ModelPart(64, 64, 0, 0, "partB"); - partB.addBox(7.0F, -1.0F, 15.0F, 2.0F, 4.0F, 1.0F, 0.0F); - partB.y = 8.0F; - ModelPart partRightC = new ModelPart(64, 64, 0, 19, "partRightC"); - partRightC.addBox(1.0F, 0.0F, 1.0F, 15.0F, 9.0F, 14.0F, 0.0F); - ModelPart partRightA = new ModelPart(64, 64, 0, 0, "partRightA"); - partRightA.addBox(1.0F, 0.0F, 0.0F, 15.0F, 5.0F, 14.0F, 0.0F); - partRightA.y = 9.0F; - partRightA.z = 1.0F; - ModelPart partRightB = new ModelPart(64, 64, 0, 0, "partRightB"); - partRightB.addBox(15.0F, -1.0F, 15.0F, 1.0F, 4.0F, 1.0F, 0.0F); - partRightB.y = 8.0F; - ModelPart partLeftC = new ModelPart(64, 64, 0, 19, "partLeftC"); - partLeftC.addBox(0.0F, 0.0F, 1.0F, 15.0F, 9.0F, 14.0F, 0.0F); - ModelPart partLeftA = new ModelPart(64, 64, 0, 0, "partLeftA"); - partLeftA.addBox(0.0F, 0.0F, 0.0F, 15.0F, 5.0F, 14.0F, 0.0F); - partLeftA.y = 9.0F; - partLeftA.z = 1.0F; - ModelPart partLeftB = new ModelPart(64, 64, 0, 0, "partLeftB"); - partLeftB.addBox(0.0F, -1.0F, 15.0F, 1.0F, 4.0F, 1.0F, 0.0F); - partLeftB.y = 8.0F; + ModelPart[] SHARDS = new ModelPart[4]; + SHARDS[0] = new ModelPart(16, 16, 2, 4, "SHARDS[0]").addBox(-5.0F, 1.0F, -3.0F, 2.0F, 8.0F, 2.0F); + SHARDS[1] = new ModelPart(16, 16, 2, 4, "SHARDS[1]").addBox(3.0F, -1.0F, -1.0F, 2.0F, 8.0F, 2.0F); + SHARDS[2] = new ModelPart(16, 16, 2, 4, "SHARDS[2]").addBox(-1.0F, 0.0F, -5.0F, 2.0F, 4.0F, 2.0F); + SHARDS[3] = new ModelPart(16, 16, 2, 4, "SHARDS[3]").addBox(0.0F, 3.0F, 4.0F, 2.0F, 6.0F, 2.0F); + ModelPart CORE = new ModelPart(16, 16, 0, 0, "CORE"); + CORE.addBox(-2.0F, -2.0F, -2.0F, 4.0F, 12.0F, 4.0F); } } diff --git a/gradle.properties b/gradle.properties index 9e25e84c..83215295 100644 --- a/gradle.properties +++ b/gradle.properties @@ -17,5 +17,5 @@ archives_base_name = better-end patchouli_version = 55-FABRIC-SNAPSHOT fabric_version = 0.36.1+1.17 bclib_version = 0.2.0 -rei_version = 6.0.262-alpha +rei_version = 6.0.264-alpha canvas_version = 1.0.+ From ba7ea67f0cd5d88da38356531973ec3306050770 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Fri, 9 Jul 2021 15:50:06 +0300 Subject: [PATCH 104/595] Anvil crafting fix --- gradle.properties | 2 +- src/main/java/ru/betterend/mixin/common/AnvilMenuMixin.java | 3 +-- src/main/java/ru/betterend/recipe/builders/AnvilRecipe.java | 3 +-- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/gradle.properties b/gradle.properties index a5a63da9..37767deb 100644 --- a/gradle.properties +++ b/gradle.properties @@ -8,7 +8,7 @@ yarn_mappings= 6 loader_version= 0.11.6 # Mod Properties -mod_version = 0.10.1-pre +mod_version = 0.10.2-pre maven_group = ru.betterend archives_base_name = better-end diff --git a/src/main/java/ru/betterend/mixin/common/AnvilMenuMixin.java b/src/main/java/ru/betterend/mixin/common/AnvilMenuMixin.java index 0023d35d..f4f8eb75 100644 --- a/src/main/java/ru/betterend/mixin/common/AnvilMenuMixin.java +++ b/src/main/java/ru/betterend/mixin/common/AnvilMenuMixin.java @@ -87,8 +87,7 @@ public abstract class AnvilMenuMixin extends ItemCombinerMenu implements AnvilSc world.levelEvent(1030, blockPos, 0); } }); - //TODO: no more return, does this still work? - //info.setReturnValue(stack); + info.cancel(); } } diff --git a/src/main/java/ru/betterend/recipe/builders/AnvilRecipe.java b/src/main/java/ru/betterend/recipe/builders/AnvilRecipe.java index 7082a566..431c8f06 100644 --- a/src/main/java/ru/betterend/recipe/builders/AnvilRecipe.java +++ b/src/main/java/ru/betterend/recipe/builders/AnvilRecipe.java @@ -81,8 +81,7 @@ public class AnvilRecipe implements Recipe, BetterEndRecipe { if (!player.isCreative()) { if (!checkHammerDurability(craftingInventory, player)) return ItemStack.EMPTY; ItemStack hammer = craftingInventory.getItem(1); - hammer.hurtAndBreak(this.damage, player, entity -> - entity.broadcastBreakEvent((InteractionHand) null)); + hammer.hurtAndBreak(this.damage, player, entity -> entity.broadcastBreakEvent((InteractionHand) null)); } return this.assemble(craftingInventory); } From 461333650a78339e6133e8e73eba88fa127709b3 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Fri, 9 Jul 2021 21:16:23 +0300 Subject: [PATCH 105/595] Smaragdant enhancements --- .../blocks/SmaragdantCrystalBlock.java | 6 +- .../blocks/SmaragdantCrystalShardBlock.java | 2 +- .../betterend/blocks/basis/LitBaseBlock.java | 24 +++++ .../blocks/basis/LitPillarBlock.java | 23 +++++ .../betterend/blocks/basis/PedestalBlock.java | 13 ++- .../complex/CrystalSubblocksMaterial.java | 12 +-- .../java/ru/betterend/registry/EndBlocks.java | 2 +- .../blockstates/smaragdant_crystal.json | 7 -- .../smaragdant_crystal_bricks_stairs.json | 44 +++++++++ .../smaragdant_crystal_bricks_wall.json | 90 ++++++++++++++++++ .../smaragdant_crystal_pedestal.json | 22 +++++ .../blockstates/smaragdant_crystal_slab.json | 15 +++ .../smaragdant_crystal_stairs.json | 44 +++++++++ .../blockstates/smaragdant_crystal_wall.json | 90 ++++++++++++++++++ .../block/smaragdant_crystal_shard.json | 3 + .../models/block/lit_pedestal_bottom.json | 47 +++++++++ .../models/block/lit_pedestal_column.json | 74 ++++++++++++++ .../models/block/lit_pedestal_column_top.json | 47 +++++++++ .../models/block/lit_pedestal_default.json | 61 ++++++++++++ .../models/block/lit_pedestal_pillar.json | 20 ++++ .../models/block/lit_pedestal_top.json | 34 +++++++ .../betterend/models/block/lit_stairs.json | 50 ++++++++++ .../models/block/lit_stairs_inner.json | 44 +++++++++ .../models/block/lit_stairs_outer.json | 33 +++++++ .../betterend/models/block/lit_wall_post.json | 21 ++++ .../betterend/models/block/lit_wall_side.json | 20 ++++ .../models/block/lit_wall_side_tall.json | 19 ++++ .../models/block/pillar_noshade.json | 21 ++++ .../betterend/models/block/slab_noshade.json | 20 ++++ .../block/smaragdant_bricks_stairs.json | 8 ++ .../block/smaragdant_bricks_stairs_inner.json | 8 ++ .../block/smaragdant_bricks_stairs_outer.json | 8 ++ .../smaragdant_crystal_bricks_wall_post.json | 6 ++ .../smaragdant_crystal_bricks_wall_side.json | 6 ++ ...ragdant_crystal_bricks_wall_side_tall.json | 6 ++ .../block/smaragdant_crystal_wall_post.json | 23 +++++ .../block/smaragdant_crystal_wall_side.json | 21 ++++ .../smaragdant_crystal_wall_side_tall.json | 21 ++++ .../block/smaragdant_pedestal_bottom.json | 8 ++ .../block/smaragdant_pedestal_column.json | 8 ++ .../block/smaragdant_pedestal_column_top.json | 7 ++ .../block/smaragdant_pedestal_default.json | 9 ++ .../block/smaragdant_pedestal_pillar.json | 6 ++ .../models/block/smaragdant_pedestal_top.json | 8 ++ .../models/block/smaragdant_slab.json | 8 ++ .../models/block/smaragdant_stairs.json | 8 ++ .../models/block/smaragdant_stairs_inner.json | 8 ++ .../models/block/smaragdant_stairs_outer.json | 8 ++ .../smaragdant_crystal_bricks_stairs.json | 3 + .../item/smaragdant_crystal_bricks_wall.json | 6 ++ .../item/smaragdant_crystal_pedestal.json | 3 + .../models/item/smaragdant_crystal_slab.json | 3 + .../item/smaragdant_crystal_stairs.json | 3 + .../models/item/smaragdant_crystal_wall.json | 6 ++ .../textures/block/smaragdant_crystal.png | Bin 217 -> 0 bytes .../block/smaragdant_crystal_bricks.png | Bin 253 -> 249 bytes .../block/smaragdant_crystal_pillar_side.png | Bin 244 -> 255 bytes .../block/smaragdant_crystal_pillar_top.png | Bin 256 -> 269 bytes .../block/smaragdant_crystal_polished.png | Bin 264 -> 252 bytes .../block/smaragdant_crystal_shard.png | Bin 258 -> 229 bytes .../block/smaragdant_crystal_tiles.png | Bin 243 -> 233 bytes 61 files changed, 1096 insertions(+), 21 deletions(-) create mode 100644 src/main/java/ru/betterend/blocks/basis/LitBaseBlock.java create mode 100644 src/main/java/ru/betterend/blocks/basis/LitPillarBlock.java delete mode 100644 src/main/resources/assets/betterend/blockstates/smaragdant_crystal.json create mode 100644 src/main/resources/assets/betterend/blockstates/smaragdant_crystal_bricks_stairs.json create mode 100644 src/main/resources/assets/betterend/blockstates/smaragdant_crystal_bricks_wall.json create mode 100644 src/main/resources/assets/betterend/blockstates/smaragdant_crystal_pedestal.json create mode 100644 src/main/resources/assets/betterend/blockstates/smaragdant_crystal_slab.json create mode 100644 src/main/resources/assets/betterend/blockstates/smaragdant_crystal_stairs.json create mode 100644 src/main/resources/assets/betterend/blockstates/smaragdant_crystal_wall.json create mode 100644 src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal_shard.json create mode 100644 src/main/resources/assets/betterend/models/block/lit_pedestal_bottom.json create mode 100644 src/main/resources/assets/betterend/models/block/lit_pedestal_column.json create mode 100644 src/main/resources/assets/betterend/models/block/lit_pedestal_column_top.json create mode 100644 src/main/resources/assets/betterend/models/block/lit_pedestal_default.json create mode 100644 src/main/resources/assets/betterend/models/block/lit_pedestal_pillar.json create mode 100644 src/main/resources/assets/betterend/models/block/lit_pedestal_top.json create mode 100644 src/main/resources/assets/betterend/models/block/lit_stairs.json create mode 100644 src/main/resources/assets/betterend/models/block/lit_stairs_inner.json create mode 100644 src/main/resources/assets/betterend/models/block/lit_stairs_outer.json create mode 100644 src/main/resources/assets/betterend/models/block/lit_wall_post.json create mode 100644 src/main/resources/assets/betterend/models/block/lit_wall_side.json create mode 100644 src/main/resources/assets/betterend/models/block/lit_wall_side_tall.json create mode 100644 src/main/resources/assets/betterend/models/block/pillar_noshade.json create mode 100644 src/main/resources/assets/betterend/models/block/slab_noshade.json create mode 100644 src/main/resources/assets/betterend/models/block/smaragdant_bricks_stairs.json create mode 100644 src/main/resources/assets/betterend/models/block/smaragdant_bricks_stairs_inner.json create mode 100644 src/main/resources/assets/betterend/models/block/smaragdant_bricks_stairs_outer.json create mode 100644 src/main/resources/assets/betterend/models/block/smaragdant_crystal_bricks_wall_post.json create mode 100644 src/main/resources/assets/betterend/models/block/smaragdant_crystal_bricks_wall_side.json create mode 100644 src/main/resources/assets/betterend/models/block/smaragdant_crystal_bricks_wall_side_tall.json create mode 100644 src/main/resources/assets/betterend/models/block/smaragdant_crystal_wall_post.json create mode 100644 src/main/resources/assets/betterend/models/block/smaragdant_crystal_wall_side.json create mode 100644 src/main/resources/assets/betterend/models/block/smaragdant_crystal_wall_side_tall.json create mode 100644 src/main/resources/assets/betterend/models/block/smaragdant_pedestal_bottom.json create mode 100644 src/main/resources/assets/betterend/models/block/smaragdant_pedestal_column.json create mode 100644 src/main/resources/assets/betterend/models/block/smaragdant_pedestal_column_top.json create mode 100644 src/main/resources/assets/betterend/models/block/smaragdant_pedestal_default.json create mode 100644 src/main/resources/assets/betterend/models/block/smaragdant_pedestal_pillar.json create mode 100644 src/main/resources/assets/betterend/models/block/smaragdant_pedestal_top.json create mode 100644 src/main/resources/assets/betterend/models/block/smaragdant_slab.json create mode 100644 src/main/resources/assets/betterend/models/block/smaragdant_stairs.json create mode 100644 src/main/resources/assets/betterend/models/block/smaragdant_stairs_inner.json create mode 100644 src/main/resources/assets/betterend/models/block/smaragdant_stairs_outer.json create mode 100644 src/main/resources/assets/betterend/models/item/smaragdant_crystal_bricks_stairs.json create mode 100644 src/main/resources/assets/betterend/models/item/smaragdant_crystal_bricks_wall.json create mode 100644 src/main/resources/assets/betterend/models/item/smaragdant_crystal_pedestal.json create mode 100644 src/main/resources/assets/betterend/models/item/smaragdant_crystal_slab.json create mode 100644 src/main/resources/assets/betterend/models/item/smaragdant_crystal_stairs.json create mode 100644 src/main/resources/assets/betterend/models/item/smaragdant_crystal_wall.json delete mode 100644 src/main/resources/assets/betterend/textures/block/smaragdant_crystal.png diff --git a/src/main/java/ru/betterend/blocks/SmaragdantCrystalBlock.java b/src/main/java/ru/betterend/blocks/SmaragdantCrystalBlock.java index c99d5e79..af2a1808 100644 --- a/src/main/java/ru/betterend/blocks/SmaragdantCrystalBlock.java +++ b/src/main/java/ru/betterend/blocks/SmaragdantCrystalBlock.java @@ -4,9 +4,9 @@ import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; import net.minecraft.world.level.block.SoundType; import net.minecraft.world.level.material.Material; -import ru.bclib.blocks.BaseRotatedPillarBlock; +import ru.betterend.blocks.basis.LitPillarBlock; -public class SmaragdantCrystalBlock extends BaseRotatedPillarBlock { +public class SmaragdantCrystalBlock extends LitPillarBlock { public SmaragdantCrystalBlock() { super(FabricBlockSettings.of(Material.GLASS) .breakByTool(FabricToolTags.PICKAXES) @@ -14,6 +14,6 @@ public class SmaragdantCrystalBlock extends BaseRotatedPillarBlock { .hardness(1F) .resistance(1F) .noOcclusion() - .sound(SoundType.GLASS)); + .sound(SoundType.AMETHYST)); } } diff --git a/src/main/java/ru/betterend/blocks/SmaragdantCrystalShardBlock.java b/src/main/java/ru/betterend/blocks/SmaragdantCrystalShardBlock.java index 2831a2b4..e80fe955 100644 --- a/src/main/java/ru/betterend/blocks/SmaragdantCrystalShardBlock.java +++ b/src/main/java/ru/betterend/blocks/SmaragdantCrystalShardBlock.java @@ -41,7 +41,7 @@ public class SmaragdantCrystalShardBlock extends BaseAttachedBlock implements IR .materialColor(MaterialColor.COLOR_GREEN) .breakByTool(FabricToolTags.PICKAXES) .luminance(15) - .sound(SoundType.GLASS) + .sound(SoundType.AMETHYST_CLUSTER) .requiresCorrectToolForDrops() .noCollission()); } diff --git a/src/main/java/ru/betterend/blocks/basis/LitBaseBlock.java b/src/main/java/ru/betterend/blocks/basis/LitBaseBlock.java new file mode 100644 index 00000000..19e906d9 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/basis/LitBaseBlock.java @@ -0,0 +1,24 @@ +package ru.betterend.blocks.basis; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.client.renderer.block.model.BlockModel; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.block.state.BlockState; +import org.jetbrains.annotations.Nullable; +import ru.bclib.blocks.BaseBlock; + +public class LitBaseBlock extends BaseBlock { + private static final String PATTERN = "{\"parent\":\"betterend:block/cube_noshade\",\"textures\":{\"texture\":\"betterend:block/name\"}}"; + + public LitBaseBlock(Properties settings) { + super(settings); + } + + @Nullable + @Override + @Environment(EnvType.CLIENT) + public BlockModel getBlockModel(ResourceLocation resourceLocation, BlockState blockState) { + return BlockModel.fromString(PATTERN.replace("name", resourceLocation.getPath())); + } +} diff --git a/src/main/java/ru/betterend/blocks/basis/LitPillarBlock.java b/src/main/java/ru/betterend/blocks/basis/LitPillarBlock.java new file mode 100644 index 00000000..214d01cc --- /dev/null +++ b/src/main/java/ru/betterend/blocks/basis/LitPillarBlock.java @@ -0,0 +1,23 @@ +package ru.betterend.blocks.basis; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.resources.ResourceLocation; +import ru.bclib.blocks.BaseRotatedPillarBlock; + +import java.util.Optional; + +public class LitPillarBlock extends BaseRotatedPillarBlock { + private static final String PATTERN = "{\"parent\":\"betterend:block/pillar_noshade\",\"textures\":{\"end\":\"betterend:block/name_top\",\"side\":\"betterend:block/name_side\"}}"; + + public LitPillarBlock(Properties settings) { + super(settings); + } + + @Override + @Environment(EnvType.CLIENT) + protected Optional createBlockPattern(ResourceLocation blockId) { + String name = blockId.getPath(); + return Optional.of(PATTERN.replace("name", name)); + } +} diff --git a/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java b/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java index fa6f4963..fe4990cc 100644 --- a/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java @@ -42,11 +42,9 @@ import ru.bclib.client.models.ModelsHelper; import ru.betterend.blocks.EndBlockProperties; import ru.betterend.blocks.EndBlockProperties.PedestalState; import ru.betterend.blocks.InfusionPedestal; -import ru.betterend.blocks.entities.EndStoneSmelterBlockEntity; import ru.betterend.blocks.entities.InfusionPedestalEntity; import ru.betterend.blocks.entities.PedestalBlockEntity; import ru.betterend.client.models.Patterns; -import ru.betterend.registry.EndBlockEntities; import ru.betterend.registry.EndBlocks; import ru.betterend.rituals.InfusionRitual; @@ -55,6 +53,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.function.ToIntFunction; @SuppressWarnings({"deprecation"}) public class PedestalBlock extends BaseBlockNotFull implements EntityBlock { @@ -95,11 +94,19 @@ public class PedestalBlock extends BaseBlockNotFull implements EntityBlock { protected float height = 1.0F; public PedestalBlock(Block parent) { - super(FabricBlockSettings.copyOf(parent).luminance(state -> state.getValue(HAS_LIGHT) ? 12 : 0)); + super(FabricBlockSettings.copyOf(parent).luminance(getLuminance(parent.defaultBlockState()))); this.registerDefaultState(stateDefinition.any().setValue(STATE, PedestalState.DEFAULT).setValue(HAS_ITEM, false).setValue(HAS_LIGHT, false)); this.parent = parent; } + private static ToIntFunction getLuminance(BlockState parent) { + final int light = parent.getLightEmission(); + if (light > 0) { + return state -> light; + } + return state -> state.getValue(HAS_LIGHT) ? 12 : 0; + } + public float getHeight(BlockState state) { if (state.getBlock() instanceof PedestalBlock && state.getValue(STATE) == PedestalState.PEDESTAL_TOP) { return this.height - 0.2F; diff --git a/src/main/java/ru/betterend/blocks/complex/CrystalSubblocksMaterial.java b/src/main/java/ru/betterend/blocks/complex/CrystalSubblocksMaterial.java index c5d240b1..e3bd82b3 100644 --- a/src/main/java/ru/betterend/blocks/complex/CrystalSubblocksMaterial.java +++ b/src/main/java/ru/betterend/blocks/complex/CrystalSubblocksMaterial.java @@ -4,8 +4,6 @@ import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.tags.BlockTags; import net.minecraft.tags.ItemTags; import net.minecraft.world.level.block.Block; -import ru.bclib.blocks.BaseBlock; -import ru.bclib.blocks.BaseRotatedPillarBlock; import ru.bclib.blocks.BaseSlabBlock; import ru.bclib.blocks.BaseStairsBlock; import ru.bclib.blocks.BaseWallBlock; @@ -13,6 +11,8 @@ import ru.bclib.recipes.GridRecipe; import ru.bclib.util.TagHelper; import ru.betterend.BetterEnd; import ru.betterend.blocks.EndPedestal; +import ru.betterend.blocks.basis.LitBaseBlock; +import ru.betterend.blocks.basis.LitPillarBlock; import ru.betterend.config.Configs; import ru.betterend.recipe.CraftingRecipes; import ru.betterend.registry.EndBlocks; @@ -32,14 +32,14 @@ public class CrystalSubblocksMaterial { public CrystalSubblocksMaterial(String name, Block source) { FabricBlockSettings material = FabricBlockSettings.copyOf(source); - polished = EndBlocks.registerBlock(name + "_polished", new BaseBlock(material)); - tiles = EndBlocks.registerBlock(name + "_tiles", new BaseBlock(material)); - pillar = EndBlocks.registerBlock(name + "_pillar", new BaseRotatedPillarBlock(material)); + polished = EndBlocks.registerBlock(name + "_polished", new LitBaseBlock(material)); + tiles = EndBlocks.registerBlock(name + "_tiles", new LitBaseBlock(material)); + pillar = EndBlocks.registerBlock(name + "_pillar", new LitPillarBlock(material)); stairs = EndBlocks.registerBlock(name + "_stairs", new BaseStairsBlock(source)); slab = EndBlocks.registerBlock(name + "_slab", new BaseSlabBlock(source)); wall = EndBlocks.registerBlock(name + "_wall", new BaseWallBlock(source)); pedestal = EndBlocks.registerBlock(name + "_pedestal", new EndPedestal(source)); - bricks = EndBlocks.registerBlock(name + "_bricks", new BaseBlock(material)); + bricks = EndBlocks.registerBlock(name + "_bricks", new LitBaseBlock(material)); brick_stairs = EndBlocks.registerBlock(name + "_bricks_stairs", new BaseStairsBlock(bricks)); brick_slab = EndBlocks.registerBlock(name + "_bricks_slab", new BaseSlabBlock(bricks)); brick_wall = EndBlocks.registerBlock(name + "_bricks_wall", new BaseWallBlock(bricks)); diff --git a/src/main/java/ru/betterend/registry/EndBlocks.java b/src/main/java/ru/betterend/registry/EndBlocks.java index fa034b22..3ca054ca 100644 --- a/src/main/java/ru/betterend/registry/EndBlocks.java +++ b/src/main/java/ru/betterend/registry/EndBlocks.java @@ -394,9 +394,9 @@ public class EndBlocks extends BlocksRegistry { public static final Block ENDER_BLOCK = registerBlock("ender_block", new EnderBlock()); public static final Block AURORA_CRYSTAL = registerBlock("aurora_crystal", new AuroraCrystalBlock()); public static final Block AMBER_BLOCK = registerBlock("amber_block", new AmberBlock()); + public static final Block SMARAGDANT_CRYSTAL_SHARD = registerBlock("smaragdant_crystal_shard", new SmaragdantCrystalShardBlock()); public static final Block SMARAGDANT_CRYSTAL = registerBlock("smaragdant_crystal", new SmaragdantCrystalBlock()); public static final CrystalSubblocksMaterial SMARAGDANT_SUBBLOCKS = new CrystalSubblocksMaterial("smaragdant_crystal", SMARAGDANT_CRYSTAL); - public static final Block SMARAGDANT_CRYSTAL_SHARD = registerBlock("smaragdant_crystal_shard", new SmaragdantCrystalShardBlock()); public static final Block RESPAWN_OBELISK = registerBlock("respawn_obelisk", new RespawnObeliskBlock()); diff --git a/src/main/resources/assets/betterend/blockstates/smaragdant_crystal.json b/src/main/resources/assets/betterend/blockstates/smaragdant_crystal.json deleted file mode 100644 index 2d3e15ba..00000000 --- a/src/main/resources/assets/betterend/blockstates/smaragdant_crystal.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "axis=x": { "model": "betterend:block/smaragdant_crystal", "x": 90, "y": 90 }, - "axis=y": { "model": "betterend:block/smaragdant_crystal" }, - "axis=z": { "model": "betterend:block/smaragdant_crystal", "x": 90 } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/blockstates/smaragdant_crystal_bricks_stairs.json b/src/main/resources/assets/betterend/blockstates/smaragdant_crystal_bricks_stairs.json new file mode 100644 index 00000000..61ea29d6 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/smaragdant_crystal_bricks_stairs.json @@ -0,0 +1,44 @@ +{ + "variants": { + "facing=east,half=bottom,shape=straight": { "model": "betterend:block/smaragdant_bricks_stairs" }, + "facing=west,half=bottom,shape=straight": { "model": "betterend:block/smaragdant_bricks_stairs", "y": 180 }, + "facing=south,half=bottom,shape=straight": { "model": "betterend:block/smaragdant_bricks_stairs", "y": 90 }, + "facing=north,half=bottom,shape=straight": { "model": "betterend:block/smaragdant_bricks_stairs", "y": 270 }, + "facing=east,half=bottom,shape=outer_right": { "model": "betterend:block/smaragdant_bricks_stairs_outer" }, + "facing=west,half=bottom,shape=outer_right": { "model": "betterend:block/smaragdant_bricks_stairs_outer", "y": 180 }, + "facing=south,half=bottom,shape=outer_right": { "model": "betterend:block/smaragdant_bricks_stairs_outer", "y": 90 }, + "facing=north,half=bottom,shape=outer_right": { "model": "betterend:block/smaragdant_bricks_stairs_outer", "y": 270 }, + "facing=east,half=bottom,shape=outer_left": { "model": "betterend:block/smaragdant_bricks_stairs_outer", "y": 270 }, + "facing=west,half=bottom,shape=outer_left": { "model": "betterend:block/smaragdant_bricks_stairs_outer", "y": 90 }, + "facing=south,half=bottom,shape=outer_left": { "model": "betterend:block/smaragdant_bricks_stairs_outer" }, + "facing=north,half=bottom,shape=outer_left": { "model": "betterend:block/smaragdant_bricks_stairs_outer", "y": 180 }, + "facing=east,half=bottom,shape=inner_right": { "model": "betterend:block/smaragdant_bricks_stairs_inner" }, + "facing=west,half=bottom,shape=inner_right": { "model": "betterend:block/smaragdant_bricks_stairs_inner", "y": 180 }, + "facing=south,half=bottom,shape=inner_right": { "model": "betterend:block/smaragdant_bricks_stairs_inner", "y": 90 }, + "facing=north,half=bottom,shape=inner_right": { "model": "betterend:block/smaragdant_bricks_stairs_inner", "y": 270 }, + "facing=east,half=bottom,shape=inner_left": { "model": "betterend:block/smaragdant_bricks_stairs_inner", "y": 270 }, + "facing=west,half=bottom,shape=inner_left": { "model": "betterend:block/smaragdant_bricks_stairs_inner", "y": 90 }, + "facing=south,half=bottom,shape=inner_left": { "model": "betterend:block/smaragdant_bricks_stairs_inner" }, + "facing=north,half=bottom,shape=inner_left": { "model": "betterend:block/smaragdant_bricks_stairs_inner", "y": 180 }, + "facing=east,half=top,shape=straight": { "model": "betterend:block/smaragdant_bricks_stairs", "x": 180 }, + "facing=west,half=top,shape=straight": { "model": "betterend:block/smaragdant_bricks_stairs", "x": 180, "y": 180 }, + "facing=south,half=top,shape=straight": { "model": "betterend:block/smaragdant_bricks_stairs", "x": 180, "y": 90 }, + "facing=north,half=top,shape=straight": { "model": "betterend:block/smaragdant_bricks_stairs", "x": 180, "y": 270 }, + "facing=east,half=top,shape=outer_right": { "model": "betterend:block/smaragdant_bricks_stairs_outer", "x": 180, "y": 90 }, + "facing=west,half=top,shape=outer_right": { "model": "betterend:block/smaragdant_bricks_stairs_outer", "x": 180, "y": 270 }, + "facing=south,half=top,shape=outer_right": { "model": "betterend:block/smaragdant_bricks_stairs_outer", "x": 180, "y": 180 }, + "facing=north,half=top,shape=outer_right": { "model": "betterend:block/smaragdant_bricks_stairs_outer", "x": 180 }, + "facing=east,half=top,shape=outer_left": { "model": "betterend:block/smaragdant_bricks_stairs_outer", "x": 180 }, + "facing=west,half=top,shape=outer_left": { "model": "betterend:block/smaragdant_bricks_stairs_outer", "x": 180, "y": 180 }, + "facing=south,half=top,shape=outer_left": { "model": "betterend:block/smaragdant_bricks_stairs_outer", "x": 180, "y": 90 }, + "facing=north,half=top,shape=outer_left": { "model": "betterend:block/smaragdant_bricks_stairs_outer", "x": 180, "y": 270 }, + "facing=east,half=top,shape=inner_right": { "model": "betterend:block/smaragdant_bricks_stairs_inner", "x": 180, "y": 90 }, + "facing=west,half=top,shape=inner_right": { "model": "betterend:block/smaragdant_bricks_stairs_inner", "x": 180, "y": 270 }, + "facing=south,half=top,shape=inner_right": { "model": "betterend:block/smaragdant_bricks_stairs_inner", "x": 180, "y": 180 }, + "facing=north,half=top,shape=inner_right": { "model": "betterend:block/smaragdant_bricks_stairs_inner", "x": 180 }, + "facing=east,half=top,shape=inner_left": { "model": "betterend:block/smaragdant_bricks_stairs_inner", "x": 180 }, + "facing=west,half=top,shape=inner_left": { "model": "betterend:block/smaragdant_bricks_stairs_inner", "x": 180, "y": 180 }, + "facing=south,half=top,shape=inner_left": { "model": "betterend:block/smaragdant_bricks_stairs_inner", "x": 180, "y": 90 }, + "facing=north,half=top,shape=inner_left": { "model": "betterend:block/smaragdant_bricks_stairs_inner", "x": 180, "y": 270 } + } +} diff --git a/src/main/resources/assets/betterend/blockstates/smaragdant_crystal_bricks_wall.json b/src/main/resources/assets/betterend/blockstates/smaragdant_crystal_bricks_wall.json new file mode 100644 index 00000000..b68ce3e7 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/smaragdant_crystal_bricks_wall.json @@ -0,0 +1,90 @@ +{ + "multipart": [ + { + "when": { + "up": "true" + }, + "apply": { + "model": "betterend:block/smaragdant_crystal_bricks_wall_post" + } + }, + { + "when": { + "north": "low" + }, + "apply": { + "model": "betterend:block/smaragdant_crystal_bricks_wall_side", + "uvlock": true + } + }, + { + "when": { + "east": "low" + }, + "apply": { + "model": "betterend:block/smaragdant_crystal_bricks_wall_side", + "y": 90, + "uvlock": true + } + }, + { + "when": { + "south": "low" + }, + "apply": { + "model": "betterend:block/smaragdant_crystal_bricks_wall_side", + "y": 180, + "uvlock": true + } + }, + { + "when": { + "west": "low" + }, + "apply": { + "model": "betterend:block/smaragdant_crystal_bricks_wall_side", + "y": 270, + "uvlock": true + } + }, + { + "when": { + "north": "tall" + }, + "apply": { + "model": "betterend:block/smaragdant_crystal_bricks_wall_side_tall", + "uvlock": true + } + }, + { + "when": { + "east": "tall" + }, + "apply": { + "model": "betterend:block/smaragdant_crystal_bricks_wall_side_tall", + "y": 90, + "uvlock": true + } + }, + { + "when": { + "south": "tall" + }, + "apply": { + "model": "betterend:block/smaragdant_crystal_bricks_wall_side_tall", + "y": 180, + "uvlock": true + } + }, + { + "when": { + "west": "tall" + }, + "apply": { + "model": "betterend:block/smaragdant_crystal_bricks_wall_side_tall", + "y": 270, + "uvlock": true + } + } + ] +} diff --git a/src/main/resources/assets/betterend/blockstates/smaragdant_crystal_pedestal.json b/src/main/resources/assets/betterend/blockstates/smaragdant_crystal_pedestal.json new file mode 100644 index 00000000..f199dcf1 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/smaragdant_crystal_pedestal.json @@ -0,0 +1,22 @@ +{ + "variants": { + "state=default": { + "model": "betterend:block/smaragdant_pedestal_default" + }, + "state=column": { + "model": "betterend:block/smaragdant_pedestal_column" + }, + "state=column_top": { + "model": "betterend:block/smaragdant_pedestal_column_top" + }, + "state=pedestal_top": { + "model": "betterend:block/smaragdant_pedestal_top" + }, + "state=bottom": { + "model": "betterend:block/smaragdant_pedestal_bottom" + }, + "state=pillar": { + "model": "betterend:block/smaragdant_pedestal_pillar" + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/blockstates/smaragdant_crystal_slab.json b/src/main/resources/assets/betterend/blockstates/smaragdant_crystal_slab.json new file mode 100644 index 00000000..e944b672 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/smaragdant_crystal_slab.json @@ -0,0 +1,15 @@ +{ + "variants": { + "type=bottom": { + "model": "betterend:block/smaragdant_slab" + }, + "type=top": { + "model": "betterend:block/smaragdant_slab", + "x": 180, + "uvlock": true + }, + "type=double": { + "model": "betterend:block/smaragdant_crystal" + } + } +} diff --git a/src/main/resources/assets/betterend/blockstates/smaragdant_crystal_stairs.json b/src/main/resources/assets/betterend/blockstates/smaragdant_crystal_stairs.json new file mode 100644 index 00000000..2d3fc25c --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/smaragdant_crystal_stairs.json @@ -0,0 +1,44 @@ +{ + "variants": { + "facing=east,half=bottom,shape=straight": { "model": "betterend:block/smaragdant_stairs" }, + "facing=west,half=bottom,shape=straight": { "model": "betterend:block/smaragdant_stairs", "y": 180 }, + "facing=south,half=bottom,shape=straight": { "model": "betterend:block/smaragdant_stairs", "y": 90 }, + "facing=north,half=bottom,shape=straight": { "model": "betterend:block/smaragdant_stairs", "y": 270 }, + "facing=east,half=bottom,shape=outer_right": { "model": "betterend:block/smaragdant_stairs_outer" }, + "facing=west,half=bottom,shape=outer_right": { "model": "betterend:block/smaragdant_stairs_outer", "y": 180 }, + "facing=south,half=bottom,shape=outer_right": { "model": "betterend:block/smaragdant_stairs_outer", "y": 90 }, + "facing=north,half=bottom,shape=outer_right": { "model": "betterend:block/smaragdant_stairs_outer", "y": 270 }, + "facing=east,half=bottom,shape=outer_left": { "model": "betterend:block/smaragdant_stairs_outer", "y": 270 }, + "facing=west,half=bottom,shape=outer_left": { "model": "betterend:block/smaragdant_stairs_outer", "y": 90 }, + "facing=south,half=bottom,shape=outer_left": { "model": "betterend:block/smaragdant_stairs_outer" }, + "facing=north,half=bottom,shape=outer_left": { "model": "betterend:block/smaragdant_stairs_outer", "y": 180 }, + "facing=east,half=bottom,shape=inner_right": { "model": "betterend:block/smaragdant_stairs_inner" }, + "facing=west,half=bottom,shape=inner_right": { "model": "betterend:block/smaragdant_stairs_inner", "y": 180 }, + "facing=south,half=bottom,shape=inner_right": { "model": "betterend:block/smaragdant_stairs_inner", "y": 90 }, + "facing=north,half=bottom,shape=inner_right": { "model": "betterend:block/smaragdant_stairs_inner", "y": 270 }, + "facing=east,half=bottom,shape=inner_left": { "model": "betterend:block/smaragdant_stairs_inner", "y": 270 }, + "facing=west,half=bottom,shape=inner_left": { "model": "betterend:block/smaragdant_stairs_inner", "y": 90 }, + "facing=south,half=bottom,shape=inner_left": { "model": "betterend:block/smaragdant_stairs_inner" }, + "facing=north,half=bottom,shape=inner_left": { "model": "betterend:block/smaragdant_stairs_inner", "y": 180 }, + "facing=east,half=top,shape=straight": { "model": "betterend:block/smaragdant_stairs", "x": 180 }, + "facing=west,half=top,shape=straight": { "model": "betterend:block/smaragdant_stairs", "x": 180, "y": 180 }, + "facing=south,half=top,shape=straight": { "model": "betterend:block/smaragdant_stairs", "x": 180, "y": 90 }, + "facing=north,half=top,shape=straight": { "model": "betterend:block/smaragdant_stairs", "x": 180, "y": 270 }, + "facing=east,half=top,shape=outer_right": { "model": "betterend:block/smaragdant_stairs_outer", "x": 180, "y": 90 }, + "facing=west,half=top,shape=outer_right": { "model": "betterend:block/smaragdant_stairs_outer", "x": 180, "y": 270 }, + "facing=south,half=top,shape=outer_right": { "model": "betterend:block/smaragdant_stairs_outer", "x": 180, "y": 180 }, + "facing=north,half=top,shape=outer_right": { "model": "betterend:block/smaragdant_stairs_outer", "x": 180 }, + "facing=east,half=top,shape=outer_left": { "model": "betterend:block/smaragdant_stairs_outer", "x": 180 }, + "facing=west,half=top,shape=outer_left": { "model": "betterend:block/smaragdant_stairs_outer", "x": 180, "y": 180 }, + "facing=south,half=top,shape=outer_left": { "model": "betterend:block/smaragdant_stairs_outer", "x": 180, "y": 90 }, + "facing=north,half=top,shape=outer_left": { "model": "betterend:block/smaragdant_stairs_outer", "x": 180, "y": 270 }, + "facing=east,half=top,shape=inner_right": { "model": "betterend:block/smaragdant_stairs_inner", "x": 180, "y": 90 }, + "facing=west,half=top,shape=inner_right": { "model": "betterend:block/smaragdant_stairs_inner", "x": 180, "y": 270 }, + "facing=south,half=top,shape=inner_right": { "model": "betterend:block/smaragdant_stairs_inner", "x": 180, "y": 180 }, + "facing=north,half=top,shape=inner_right": { "model": "betterend:block/smaragdant_stairs_inner", "x": 180 }, + "facing=east,half=top,shape=inner_left": { "model": "betterend:block/smaragdant_stairs_inner", "x": 180 }, + "facing=west,half=top,shape=inner_left": { "model": "betterend:block/smaragdant_stairs_inner", "x": 180, "y": 180 }, + "facing=south,half=top,shape=inner_left": { "model": "betterend:block/smaragdant_stairs_inner", "x": 180, "y": 90 }, + "facing=north,half=top,shape=inner_left": { "model": "betterend:block/smaragdant_stairs_inner", "x": 180, "y": 270 } + } +} diff --git a/src/main/resources/assets/betterend/blockstates/smaragdant_crystal_wall.json b/src/main/resources/assets/betterend/blockstates/smaragdant_crystal_wall.json new file mode 100644 index 00000000..3232369d --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/smaragdant_crystal_wall.json @@ -0,0 +1,90 @@ +{ + "multipart": [ + { + "when": { + "up": "true" + }, + "apply": { + "model": "betterend:block/smaragdant_crystal_wall_post" + } + }, + { + "when": { + "north": "low" + }, + "apply": { + "model": "betterend:block/smaragdant_crystal_wall_side", + "uvlock": true + } + }, + { + "when": { + "east": "low" + }, + "apply": { + "model": "betterend:block/smaragdant_crystal_wall_side", + "y": 90, + "uvlock": true + } + }, + { + "when": { + "south": "low" + }, + "apply": { + "model": "betterend:block/smaragdant_crystal_wall_side", + "y": 180, + "uvlock": true + } + }, + { + "when": { + "west": "low" + }, + "apply": { + "model": "betterend:block/smaragdant_crystal_wall_side", + "y": 270, + "uvlock": true + } + }, + { + "when": { + "north": "tall" + }, + "apply": { + "model": "betterend:block/smaragdant_crystal_wall_side_tall", + "uvlock": true + } + }, + { + "when": { + "east": "tall" + }, + "apply": { + "model": "betterend:block/smaragdant_crystal_wall_side_tall", + "y": 90, + "uvlock": true + } + }, + { + "when": { + "south": "tall" + }, + "apply": { + "model": "betterend:block/smaragdant_crystal_wall_side_tall", + "y": 180, + "uvlock": true + } + }, + { + "when": { + "west": "tall" + }, + "apply": { + "model": "betterend:block/smaragdant_crystal_wall_side_tall", + "y": 270, + "uvlock": true + } + } + ] +} diff --git a/src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal_shard.json b/src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal_shard.json new file mode 100644 index 00000000..c2b812b6 --- /dev/null +++ b/src/main/resources/assets/betterend/materialmaps/block/smaragdant_crystal_shard.json @@ -0,0 +1,3 @@ +{ + "defaultMaterial": "betterend:glow_all" +} diff --git a/src/main/resources/assets/betterend/models/block/lit_pedestal_bottom.json b/src/main/resources/assets/betterend/models/block/lit_pedestal_bottom.json new file mode 100644 index 00000000..747e639b --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lit_pedestal_bottom.json @@ -0,0 +1,47 @@ +{ + "parent": "minecraft:block/block", + "textures": { + "particle": "#base" + }, + "elements": [ + { + "__comment": "basin_1", + "from": [ 0, 0, 0 ], + "to": [ 16, 3, 16 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#bottom", "cullface": "down" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#bottom" }, + "north": { "uv": [ 0, 0, 16, 3 ], "texture": "#bottom" }, + "south": { "uv": [ 0, 0, 16, 3 ], "texture": "#bottom" }, + "west": { "uv": [ 0, 0, 16, 3 ], "texture": "#bottom" }, + "east": { "uv": [ 0, 0, 16, 3 ], "texture": "#bottom" } + } + }, + { + "__comment": "basin_2", + "from": [ 2, 3, 2 ], + "to": [ 14, 4, 14 ], + "shade": false, + "faces": { + "up": { "uv": [ 2, 2, 14, 14 ], "texture": "#bottom" }, + "north": { "uv": [ 3, 3, 14, 4 ], "texture": "#bottom" }, + "south": { "uv": [ 3, 3, 14, 4 ], "texture": "#bottom" }, + "west": { "uv": [ 3, 3, 14, 4 ], "texture": "#bottom" }, + "east": { "uv": [ 3, 3, 14, 4 ], "texture": "#bottom" } + } + }, + { + "__comment": "pillar", + "from": [ 3, 4, 3 ], + "to": [ 13, 16, 13 ], + "shade": false, + "faces": { + "north": { "uv": [ 3, 4, 13, 16 ], "texture": "#pillar" }, + "south": { "uv": [ 3, 4, 13, 16 ], "texture": "#pillar" }, + "west": { "uv": [ 3, 4, 13, 16 ], "texture": "#pillar" }, + "east": { "uv": [ 3, 4, 13, 16 ], "texture": "#pillar" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/lit_pedestal_column.json b/src/main/resources/assets/betterend/models/block/lit_pedestal_column.json new file mode 100644 index 00000000..651265cd --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lit_pedestal_column.json @@ -0,0 +1,74 @@ +{ + "parent": "minecraft:block/block", + "textures": { + "particle": "#base" + }, + "elements": [ + { + "__comment": "basin_1", + "from": [ 0, 0, 0 ], + "to": [ 16, 3, 16 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#bottom", "cullface": "down" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#bottom" }, + "north": { "uv": [ 0, 0, 16, 3 ], "texture": "#bottom" }, + "south": { "uv": [ 0, 0, 16, 3 ], "texture": "#bottom" }, + "west": { "uv": [ 0, 0, 16, 3 ], "texture": "#bottom" }, + "east": { "uv": [ 0, 0, 16, 3 ], "texture": "#bottom" } + } + }, + { + "__comment": "basin_2", + "from": [ 2, 3, 2 ], + "to": [ 14, 4, 14 ], + "shade": false, + "faces": { + "up": { "uv": [ 2, 2, 14, 14 ], "texture": "#bottom" }, + "north": { "uv": [ 3, 3, 14, 4 ], "texture": "#bottom" }, + "south": { "uv": [ 3, 3, 14, 4 ], "texture": "#bottom" }, + "west": { "uv": [ 3, 3, 14, 4 ], "texture": "#bottom" }, + "east": { "uv": [ 3, 3, 14, 4 ], "texture": "#bottom" } + } + }, + { + "__comment": "pillar", + "from": [ 3, 4, 3 ], + "to": [ 13, 13, 13 ], + "shade": false, + "faces": { + "north": { "uv": [ 3, 4, 13, 14 ], "texture": "#pillar" }, + "south": { "uv": [ 3, 4, 13, 14 ], "texture": "#pillar" }, + "west": { "uv": [ 3, 4, 13, 14 ], "texture": "#pillar" }, + "east": { "uv": [ 3, 4, 13, 14 ], "texture": "#pillar" } + } + }, + { + "__comment": "top", + "from": [ 2, 13, 2 ], + "to": [ 14, 14, 14 ], + "shade": false, + "faces": { + "down": { "uv": [ 2, 2, 14, 14 ], "texture": "#base" }, + "north": { "uv": [ 2, 13, 14, 14 ], "texture": "#base" }, + "south": { "uv": [ 2, 13, 14, 14 ], "texture": "#base" }, + "west": { "uv": [ 2, 13, 14, 14 ], "texture": "#base" }, + "east": { "uv": [ 2, 13, 14, 14 ], "texture": "#base" } + } + }, + { + "__comment": "top", + "from": [ 1, 14, 1 ], + "to": [ 15, 16, 15 ], + "shade": false, + "faces": { + "down": { "uv": [ 1, 1, 15, 15 ], "texture": "#base" }, + "up": { "uv": [ 1, 1, 15, 15 ], "texture": "#base", "cullface": "up" }, + "north": { "uv": [ 1, 14, 15, 16 ], "texture": "#base" }, + "south": { "uv": [ 1, 14, 15, 16 ], "texture": "#base" }, + "west": { "uv": [ 1, 14, 15, 16 ], "texture": "#base" }, + "east": { "uv": [ 1, 14, 15, 16 ], "texture": "#base" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/lit_pedestal_column_top.json b/src/main/resources/assets/betterend/models/block/lit_pedestal_column_top.json new file mode 100644 index 00000000..3a88e975 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lit_pedestal_column_top.json @@ -0,0 +1,47 @@ +{ + "parent": "minecraft:block/block", + "textures": { + "particle": "#base" + }, + "elements": [ + { + "__comment": "pillar", + "from": [ 3, 0, 3 ], + "to": [ 13, 13, 13 ], + "shade": false, + "faces": { + "north": { "uv": [ 3, 0, 13, 14 ], "texture": "#pillar" }, + "south": { "uv": [ 3, 0, 13, 14 ], "texture": "#pillar" }, + "west": { "uv": [ 3, 0, 13, 14 ], "texture": "#pillar" }, + "east": { "uv": [ 3, 0, 13, 14 ], "texture": "#pillar" } + } + }, + { + "__comment": "top", + "from": [ 2, 13, 2 ], + "to": [ 14, 14, 14 ], + "shade": false, + "faces": { + "down": { "uv": [ 2, 2, 14, 14 ], "texture": "#base" }, + "north": { "uv": [ 2, 13, 14, 14 ], "texture": "#base" }, + "south": { "uv": [ 2, 13, 14, 14 ], "texture": "#base" }, + "west": { "uv": [ 2, 13, 14, 14 ], "texture": "#base" }, + "east": { "uv": [ 2, 13, 14, 14 ], "texture": "#base" } + } + }, + { + "__comment": "top", + "from": [ 1, 14, 1 ], + "to": [ 15, 16, 15 ], + "shade": false, + "faces": { + "down": { "uv": [ 1, 1, 15, 15 ], "texture": "#base" }, + "up": { "uv": [ 1, 1, 15, 15 ], "texture": "#base", "cullface": "up" }, + "north": { "uv": [ 1, 14, 15, 16 ], "texture": "#base" }, + "south": { "uv": [ 1, 14, 15, 16 ], "texture": "#base" }, + "west": { "uv": [ 1, 14, 15, 16 ], "texture": "#base" }, + "east": { "uv": [ 1, 14, 15, 16 ], "texture": "#base" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/lit_pedestal_default.json b/src/main/resources/assets/betterend/models/block/lit_pedestal_default.json new file mode 100644 index 00000000..b4dfd5e7 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lit_pedestal_default.json @@ -0,0 +1,61 @@ +{ + "parent": "minecraft:block/block", + "textures": { + "particle": "#base" + }, + "elements": [ + { + "__comment": "basin_1", + "from": [ 0, 0, 0 ], + "to": [ 16, 3, 16 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#bottom", "cullface": "down" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#bottom" }, + "north": { "uv": [ 0, 0, 16, 3 ], "texture": "#bottom" }, + "south": { "uv": [ 0, 0, 16, 3 ], "texture": "#bottom" }, + "west": { "uv": [ 0, 0, 16, 3 ], "texture": "#bottom" }, + "east": { "uv": [ 0, 0, 16, 3 ], "texture": "#bottom" } + } + }, + { + "__comment": "basin_2", + "from": [ 2, 3, 2 ], + "to": [ 14, 4, 14 ], + "shade": false, + "faces": { + "up": { "uv": [ 2, 2, 14, 14 ], "texture": "#bottom" }, + "north": { "uv": [ 3, 3, 14, 4 ], "texture": "#bottom" }, + "south": { "uv": [ 3, 3, 14, 4 ], "texture": "#bottom" }, + "west": { "uv": [ 3, 3, 14, 4 ], "texture": "#bottom" }, + "east": { "uv": [ 3, 3, 14, 4 ], "texture": "#bottom" } + } + }, + { + "__comment": "pillar", + "from": [ 3, 4, 3 ], + "to": [ 13, 12, 13 ], + "shade": false, + "faces": { + "north": { "uv": [ 3, 4, 13, 12 ], "texture": "#pillar" }, + "south": { "uv": [ 3, 4, 13, 12 ], "texture": "#pillar" }, + "west": { "uv": [ 3, 4, 13, 12 ], "texture": "#pillar" }, + "east": { "uv": [ 3, 4, 13, 12 ], "texture": "#pillar" } + } + }, + { + "__comment": "top", + "from": [ 1, 12, 1 ], + "to": [ 15, 14, 15 ], + "shade": false, + "faces": { + "down": { "uv": [ 1, 1, 15, 15 ], "texture": "#base" }, + "up": { "uv": [ 1, 1, 15, 15 ], "texture": "#top" }, + "north": { "uv": [ 1, 12, 15, 14 ], "texture": "#base" }, + "south": { "uv": [ 1, 12, 15, 14 ], "texture": "#base" }, + "west": { "uv": [ 1, 12, 15, 14 ], "texture": "#base" }, + "east": { "uv": [ 1, 12, 15, 14 ], "texture": "#base" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/lit_pedestal_pillar.json b/src/main/resources/assets/betterend/models/block/lit_pedestal_pillar.json new file mode 100644 index 00000000..797d66ce --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lit_pedestal_pillar.json @@ -0,0 +1,20 @@ +{ + "parent": "minecraft:block/block", + "textures": { + "particle": "#pillar" + }, + "elements": [ + { + "__comment": "pillar", + "from": [ 3, 0, 3 ], + "to": [ 13, 16, 13 ], + "shade": false, + "faces": { + "north": { "uv": [ 3, 0, 13, 16 ], "texture": "#pillar" }, + "south": { "uv": [ 3, 0, 13, 16 ], "texture": "#pillar" }, + "west": { "uv": [ 3, 0, 13, 16 ], "texture": "#pillar" }, + "east": { "uv": [ 3, 0, 13, 16 ], "texture": "#pillar" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/lit_pedestal_top.json b/src/main/resources/assets/betterend/models/block/lit_pedestal_top.json new file mode 100644 index 00000000..5886f233 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lit_pedestal_top.json @@ -0,0 +1,34 @@ +{ + "parent": "minecraft:block/block", + "textures": { + "particle": "#base" + }, + "elements": [ + { + "__comment": "pillar", + "from": [ 3, 0, 3 ], + "to": [ 13, 8, 13 ], + "shade": false, + "faces": { + "north": { "uv": [ 3, 0, 13, 8 ], "texture": "#pillar" }, + "south": { "uv": [ 3, 0, 13, 8 ], "texture": "#pillar" }, + "west": { "uv": [ 3, 0, 13, 8 ], "texture": "#pillar" }, + "east": { "uv": [ 3, 0, 13, 8 ], "texture": "#pillar" } + } + }, + { + "__comment": "top", + "from": [ 1, 8, 1 ], + "to": [ 15, 10, 15 ], + "shade": false, + "faces": { + "down": { "uv": [ 1, 1, 15, 15 ], "texture": "#base" }, + "up": { "uv": [ 1, 1, 15, 15 ], "texture": "#top" }, + "north": { "uv": [ 1, 8, 15, 10 ], "texture": "#base" }, + "south": { "uv": [ 1, 8, 15, 10 ], "texture": "#base" }, + "west": { "uv": [ 1, 8, 15, 10 ], "texture": "#base" }, + "east": { "uv": [ 1, 8, 15, 10 ], "texture": "#base" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/lit_stairs.json b/src/main/resources/assets/betterend/models/block/lit_stairs.json new file mode 100644 index 00000000..45326109 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lit_stairs.json @@ -0,0 +1,50 @@ +{ + "parent": "block/block", + "textures": { + "particle": "#side" + }, + "display": { + "gui": { + "rotation": [ 30, 135, 0 ], + "translation": [ 0, 0, 0], + "scale":[ 0.625, 0.625, 0.625 ] + }, + "head": { + "rotation": [ 0, -90, 0 ], + "translation": [ 0, 0, 0 ], + "scale": [ 1, 1, 1 ] + }, + "thirdperson_lefthand": { + "rotation": [ 75, -135, 0 ], + "translation": [ 0, 2.5, 0], + "scale": [ 0.375, 0.375, 0.375 ] + } + }, + "elements": [ + { + "from": [ 0, 0, 0 ], + "to": [ 16, 8, 16 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#bottom", "cullface": "down" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#top" }, + "north": { "uv": [ 0, 8, 16, 16 ], "texture": "#side", "cullface": "north" }, + "south": { "uv": [ 0, 8, 16, 16 ], "texture": "#side", "cullface": "south" }, + "west": { "uv": [ 0, 8, 16, 16 ], "texture": "#side", "cullface": "west" }, + "east": { "uv": [ 0, 8, 16, 16 ], "texture": "#side", "cullface": "east" } + } + }, + { + "from": [ 8, 8, 0 ], + "to": [ 16, 16, 16 ], + "shade": false, + "faces": { + "up": { "uv": [ 8, 0, 16, 16 ], "texture": "#top", "cullface": "up" }, + "north": { "uv": [ 0, 0, 8, 8 ], "texture": "#side", "cullface": "north" }, + "south": { "uv": [ 8, 0, 16, 8 ], "texture": "#side", "cullface": "south" }, + "west": { "uv": [ 0, 0, 16, 8 ], "texture": "#side" }, + "east": { "uv": [ 0, 0, 16, 8 ], "texture": "#side", "cullface": "east" } + } + } + ] +} diff --git a/src/main/resources/assets/betterend/models/block/lit_stairs_inner.json b/src/main/resources/assets/betterend/models/block/lit_stairs_inner.json new file mode 100644 index 00000000..d9ee9b90 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lit_stairs_inner.json @@ -0,0 +1,44 @@ +{ + "parent": "block/block", + "textures": { + "particle": "#side" + }, + "elements": [ + { + "from": [ 0, 0, 0 ], + "to": [ 16, 8, 16 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#bottom", "cullface": "down" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#top" }, + "north": { "uv": [ 0, 8, 16, 16 ], "texture": "#side", "cullface": "north" }, + "south": { "uv": [ 0, 8, 16, 16 ], "texture": "#side", "cullface": "south" }, + "west": { "uv": [ 0, 8, 16, 16 ], "texture": "#side", "cullface": "west" }, + "east": { "uv": [ 0, 8, 16, 16 ], "texture": "#side", "cullface": "east" } + } + }, + { + "from": [ 8, 8, 0 ], + "to": [ 16, 16, 16 ], + "shade": false, + "faces": { + "up": { "uv": [ 8, 0, 16, 16 ], "texture": "#top", "cullface": "up" }, + "north": { "uv": [ 0, 0, 8, 8 ], "texture": "#side", "cullface": "north" }, + "south": { "uv": [ 8, 0, 16, 8 ], "texture": "#side", "cullface": "south" }, + "west": { "uv": [ 0, 0, 16, 8 ], "texture": "#side" }, + "east": { "uv": [ 0, 0, 16, 8 ], "texture": "#side", "cullface": "east" } + } + }, + { + "from": [ 0, 8, 8 ], + "to": [ 8, 16, 16 ], + "shade": false, + "faces": { + "up": { "uv": [ 0, 8, 8, 16 ], "texture": "#top", "cullface": "up" }, + "north": { "uv": [ 8, 0, 16, 8 ], "texture": "#side" }, + "south": { "uv": [ 0, 0, 8, 8 ], "texture": "#side", "cullface": "south" }, + "west": { "uv": [ 8, 0, 16, 8 ], "texture": "#side", "cullface": "west" } + } + } + ] +} diff --git a/src/main/resources/assets/betterend/models/block/lit_stairs_outer.json b/src/main/resources/assets/betterend/models/block/lit_stairs_outer.json new file mode 100644 index 00000000..13725a18 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lit_stairs_outer.json @@ -0,0 +1,33 @@ +{ + "parent": "block/block", + "textures": { + "particle": "#side" + }, + "elements": [ + { + "from": [ 0, 0, 0 ], + "to": [ 16, 8, 16 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#bottom", "cullface": "down" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#top" }, + "north": { "uv": [ 0, 8, 16, 16 ], "texture": "#side", "cullface": "north" }, + "south": { "uv": [ 0, 8, 16, 16 ], "texture": "#side", "cullface": "south" }, + "west": { "uv": [ 0, 8, 16, 16 ], "texture": "#side", "cullface": "west" }, + "east": { "uv": [ 0, 8, 16, 16 ], "texture": "#side", "cullface": "east" } + } + }, + { + "from": [ 8, 8, 8 ], + "to": [ 16, 16, 16 ], + "shade": false, + "faces": { + "up": { "uv": [ 8, 8, 16, 16 ], "texture": "#top", "cullface": "up" }, + "north": { "uv": [ 0, 0, 8, 8 ], "texture": "#side" }, + "south": { "uv": [ 8, 0, 16, 8 ], "texture": "#side", "cullface": "south" }, + "west": { "uv": [ 8, 0, 16, 8 ], "texture": "#side" }, + "east": { "uv": [ 0, 0, 8, 8 ], "texture": "#side", "cullface": "east" } + } + } + ] +} diff --git a/src/main/resources/assets/betterend/models/block/lit_wall_post.json b/src/main/resources/assets/betterend/models/block/lit_wall_post.json new file mode 100644 index 00000000..48859b0c --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lit_wall_post.json @@ -0,0 +1,21 @@ +{ + "parent": "block/block", + "textures": { + "particle": "#wall" + }, + "elements": [ + { "from": [ 4, 0, 4 ], + "to": [ 12, 16, 12 ], + "shade": false, + "faces": { + "down": { "texture": "#wall", "cullface": "down" }, + "up": { "texture": "#wall", "cullface": "up" }, + "north": { "texture": "#wall" }, + "south": { "texture": "#wall" }, + "west": { "texture": "#wall" }, + "east": { "texture": "#wall" } + }, + "__comment": "Center post" + } + ] +} diff --git a/src/main/resources/assets/betterend/models/block/lit_wall_side.json b/src/main/resources/assets/betterend/models/block/lit_wall_side.json new file mode 100644 index 00000000..27d8698c --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lit_wall_side.json @@ -0,0 +1,20 @@ +{ + "parent": "block/block", + "textures": { + "particle": "#wall" + }, + "elements": [ + { "from": [ 5, 0, 0 ], + "to": [ 11, 14, 8 ], + "shade": false, + "faces": { + "down": { "texture": "#wall", "cullface": "down" }, + "up": { "texture": "#wall" }, + "north": { "texture": "#wall", "cullface": "north" }, + "west": { "texture": "#wall" }, + "east": { "texture": "#wall" } + }, + "__comment": "wall" + } + ] +} diff --git a/src/main/resources/assets/betterend/models/block/lit_wall_side_tall.json b/src/main/resources/assets/betterend/models/block/lit_wall_side_tall.json new file mode 100644 index 00000000..ee0dfab1 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/lit_wall_side_tall.json @@ -0,0 +1,19 @@ +{ + "parent": "block/block", + "textures": { + "particle": "#wall" + }, + "elements": [ + { "from": [ 5, 0, 0 ], + "to": [ 11, 16, 8 ], + "shade": false, + "faces": { + "down": { "texture": "#wall", "cullface": "down" }, + "up": { "texture": "#wall", "cullface": "up"}, + "north": { "texture": "#wall", "cullface": "north" }, + "west": { "texture": "#wall" }, + "east": { "texture": "#wall" } + } + } + ] +} diff --git a/src/main/resources/assets/betterend/models/block/pillar_noshade.json b/src/main/resources/assets/betterend/models/block/pillar_noshade.json new file mode 100644 index 00000000..cf1bd8de --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/pillar_noshade.json @@ -0,0 +1,21 @@ +{ + "parent": "block/block", + "textures": { + "particle": "#side" + }, + "elements": [ + { + "from": [ 0, 0, 0 ], + "to": [ 16, 16, 16 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#end", "cullface": "down" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#end", "cullface": "up" }, + "north": { "uv": [ 0, 0, 16, 16 ], "texture": "#side", "cullface": "north" }, + "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#side", "cullface": "south" }, + "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#side", "cullface": "west" }, + "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#side", "cullface": "east" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/slab_noshade.json b/src/main/resources/assets/betterend/models/block/slab_noshade.json new file mode 100644 index 00000000..e629ba9e --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/slab_noshade.json @@ -0,0 +1,20 @@ +{ + "parent": "block/block", + "textures": { + "particle": "#side" + }, + "elements": [ + { "from": [ 0, 0, 0 ], + "to": [ 16, 8, 16 ], + "shade": false, + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#bottom", "cullface": "down" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#top" }, + "north": { "uv": [ 0, 8, 16, 16 ], "texture": "#side", "cullface": "north" }, + "south": { "uv": [ 0, 8, 16, 16 ], "texture": "#side", "cullface": "south" }, + "west": { "uv": [ 0, 8, 16, 16 ], "texture": "#side", "cullface": "west" }, + "east": { "uv": [ 0, 8, 16, 16 ], "texture": "#side", "cullface": "east" } + } + } + ] +} diff --git a/src/main/resources/assets/betterend/models/block/smaragdant_bricks_stairs.json b/src/main/resources/assets/betterend/models/block/smaragdant_bricks_stairs.json new file mode 100644 index 00000000..6200b8c2 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/smaragdant_bricks_stairs.json @@ -0,0 +1,8 @@ +{ + "parent": "betterend:block/lit_stairs", + "textures": { + "bottom": "betterend:block/smaragdant_crystal_bricks", + "top": "betterend:block/smaragdant_crystal_bricks", + "side": "betterend:block/smaragdant_crystal_bricks" + } +} diff --git a/src/main/resources/assets/betterend/models/block/smaragdant_bricks_stairs_inner.json b/src/main/resources/assets/betterend/models/block/smaragdant_bricks_stairs_inner.json new file mode 100644 index 00000000..f0ac1df0 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/smaragdant_bricks_stairs_inner.json @@ -0,0 +1,8 @@ +{ + "parent": "betterend:block/lit_stairs_inner", + "textures": { + "bottom": "betterend:block/smaragdant_crystal_bricks", + "top": "betterend:block/smaragdant_crystal_bricks", + "side": "betterend:block/smaragdant_crystal_bricks" + } +} diff --git a/src/main/resources/assets/betterend/models/block/smaragdant_bricks_stairs_outer.json b/src/main/resources/assets/betterend/models/block/smaragdant_bricks_stairs_outer.json new file mode 100644 index 00000000..ed02dfcd --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/smaragdant_bricks_stairs_outer.json @@ -0,0 +1,8 @@ +{ + "parent": "betterend:block/lit_stairs_outer", + "textures": { + "bottom": "betterend:block/smaragdant_crystal_bricks", + "top": "betterend:block/smaragdant_crystal_bricks", + "side": "betterend:block/smaragdant_crystal_bricks" + } +} diff --git a/src/main/resources/assets/betterend/models/block/smaragdant_crystal_bricks_wall_post.json b/src/main/resources/assets/betterend/models/block/smaragdant_crystal_bricks_wall_post.json new file mode 100644 index 00000000..e74131d0 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/smaragdant_crystal_bricks_wall_post.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/lit_wall_post", + "textures": { + "wall": "betterend:block/smaragdant_crystal_bricks" + } +} diff --git a/src/main/resources/assets/betterend/models/block/smaragdant_crystal_bricks_wall_side.json b/src/main/resources/assets/betterend/models/block/smaragdant_crystal_bricks_wall_side.json new file mode 100644 index 00000000..ad9b2c94 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/smaragdant_crystal_bricks_wall_side.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/lit_wall_side", + "textures": { + "wall": "betterend:block/smaragdant_crystal_bricks" + } +} diff --git a/src/main/resources/assets/betterend/models/block/smaragdant_crystal_bricks_wall_side_tall.json b/src/main/resources/assets/betterend/models/block/smaragdant_crystal_bricks_wall_side_tall.json new file mode 100644 index 00000000..c49dacb0 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/smaragdant_crystal_bricks_wall_side_tall.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/lit_wall_side_tall", + "textures": { + "wall": "betterend:block/smaragdant_crystal_bricks" + } +} diff --git a/src/main/resources/assets/betterend/models/block/smaragdant_crystal_wall_post.json b/src/main/resources/assets/betterend/models/block/smaragdant_crystal_wall_post.json new file mode 100644 index 00000000..c5e167df --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/smaragdant_crystal_wall_post.json @@ -0,0 +1,23 @@ +{ + "parent": "block/block", + "textures": { + "side": "betterend:block/smaragdant_crystal_side", + "top": "betterend:block/smaragdant_crystal_top", + "particle": "#side" + }, + "elements": [ + { + "from": [ 4, -0.01, 4 ], + "to": [ 12, 16, 12 ], + "shade": false, + "faces": { + "down": { "uv": [ 4, 4, 12, 12 ], "texture": "#top", "cullface": "down" }, + "up": { "uv": [ 4, 4, 12, 12 ], "texture": "#top", "cullface": "up" }, + "north": { "uv": [ 4, 0, 12, 16 ], "texture": "#side" }, + "south": { "uv": [ 4, 0, 12, 16 ], "texture": "#side" }, + "west": { "uv": [ 4, 0, 12, 16 ], "texture": "#side" }, + "east": { "uv": [ 4, 0, 12, 16 ], "texture": "#side" } + } + } + ] +} diff --git a/src/main/resources/assets/betterend/models/block/smaragdant_crystal_wall_side.json b/src/main/resources/assets/betterend/models/block/smaragdant_crystal_wall_side.json new file mode 100644 index 00000000..4bba9abf --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/smaragdant_crystal_wall_side.json @@ -0,0 +1,21 @@ +{ + "textures": { + "wall": "betterend:block/smaragdant_crystal_side", + "top": "betterend:block/smaragdant_crystal_top", + "particle": "#wall" + }, + "elements": [ + { + "from": [ 5, 0, 0 ], + "to": [ 11, 14, 8 ], + "shade": false, + "faces": { + "down": { "texture": "#top", "cullface": "down" }, + "up": { "texture": "#top" }, + "north": { "texture": "#wall", "cullface": "north" }, + "west": { "texture": "#wall" }, + "east": { "texture": "#wall" } + } + } + ] +} diff --git a/src/main/resources/assets/betterend/models/block/smaragdant_crystal_wall_side_tall.json b/src/main/resources/assets/betterend/models/block/smaragdant_crystal_wall_side_tall.json new file mode 100644 index 00000000..dac2fa44 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/smaragdant_crystal_wall_side_tall.json @@ -0,0 +1,21 @@ +{ + "textures": { + "wall": "betterend:block/smaragdant_crystal_side", + "top": "betterend:block/smaragdant_crystal_top", + "particle": "#wall" + }, + "elements": [ + { + "from": [ 5, 0, 0 ], + "to": [ 11, 16, 8 ], + "shade": false, + "faces": { + "down": { "texture": "#top", "cullface": "down" }, + "up": { "texture": "#top", "cullface": "up"}, + "north": { "texture": "#wall", "cullface": "north" }, + "west": { "texture": "#wall" }, + "east": { "texture": "#wall" } + } + } + ] +} diff --git a/src/main/resources/assets/betterend/models/block/smaragdant_pedestal_bottom.json b/src/main/resources/assets/betterend/models/block/smaragdant_pedestal_bottom.json new file mode 100644 index 00000000..d4f4423b --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/smaragdant_pedestal_bottom.json @@ -0,0 +1,8 @@ +{ + "parent": "betterend:block/lit_pedestal_bottom", + "textures": { + "base": "betterend:block/smaragdant_crystal_side", + "pillar": "betterend:block/smaragdant_crystal_pillar_side", + "bottom": "betterend:block/smaragdant_crystal_polished" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/smaragdant_pedestal_column.json b/src/main/resources/assets/betterend/models/block/smaragdant_pedestal_column.json new file mode 100644 index 00000000..aba32bf3 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/smaragdant_pedestal_column.json @@ -0,0 +1,8 @@ +{ + "parent": "betterend:block/lit_pedestal_column", + "textures": { + "base": "betterend:block/smaragdant_crystal_side", + "pillar": "betterend:block/smaragdant_crystal_pillar_side", + "bottom": "betterend:block/smaragdant_crystal_polished" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/smaragdant_pedestal_column_top.json b/src/main/resources/assets/betterend/models/block/smaragdant_pedestal_column_top.json new file mode 100644 index 00000000..2f8a7add --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/smaragdant_pedestal_column_top.json @@ -0,0 +1,7 @@ +{ + "parent": "betterend:block/lit_pedestal_column_top", + "textures": { + "base": "betterend:block/smaragdant_crystal_side", + "pillar": "betterend:block/smaragdant_crystal_pillar_side" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/smaragdant_pedestal_default.json b/src/main/resources/assets/betterend/models/block/smaragdant_pedestal_default.json new file mode 100644 index 00000000..07e36ccc --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/smaragdant_pedestal_default.json @@ -0,0 +1,9 @@ +{ + "parent": "betterend:block/lit_pedestal_default", + "textures": { + "top": "betterend:block/smaragdant_crystal_polished", + "base": "betterend:block/smaragdant_crystal_side", + "pillar": "betterend:block/smaragdant_crystal_pillar_side", + "bottom": "betterend:block/smaragdant_crystal_polished" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/smaragdant_pedestal_pillar.json b/src/main/resources/assets/betterend/models/block/smaragdant_pedestal_pillar.json new file mode 100644 index 00000000..2041fe88 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/smaragdant_pedestal_pillar.json @@ -0,0 +1,6 @@ +{ + "parent": "betterend:block/lit_pedestal_pillar", + "textures": { + "pillar": "betterend:block/smaragdant_crystal_pillar_side" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/smaragdant_pedestal_top.json b/src/main/resources/assets/betterend/models/block/smaragdant_pedestal_top.json new file mode 100644 index 00000000..7f586614 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/smaragdant_pedestal_top.json @@ -0,0 +1,8 @@ +{ + "parent": "betterend:block/lit_pedestal_top", + "textures": { + "top": "betterend:block/smaragdant_crystal_polished", + "base": "betterend:block/smaragdant_crystal_side", + "pillar": "betterend:block/smaragdant_crystal_pillar_side" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/smaragdant_slab.json b/src/main/resources/assets/betterend/models/block/smaragdant_slab.json new file mode 100644 index 00000000..19f5cca8 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/smaragdant_slab.json @@ -0,0 +1,8 @@ +{ + "parent": "betterend:block/slab_noshade", + "textures": { + "bottom": "betterend:block/smaragdant_crystal_top", + "top": "betterend:block/smaragdant_crystal_top", + "side": "betterend:block/smaragdant_crystal_side" + } +} diff --git a/src/main/resources/assets/betterend/models/block/smaragdant_stairs.json b/src/main/resources/assets/betterend/models/block/smaragdant_stairs.json new file mode 100644 index 00000000..288366da --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/smaragdant_stairs.json @@ -0,0 +1,8 @@ +{ + "parent": "betterend:block/lit_stairs", + "textures": { + "bottom": "betterend:block/smaragdant_crystal_top", + "top": "betterend:block/smaragdant_crystal_top", + "side": "betterend:block/smaragdant_crystal_side" + } +} diff --git a/src/main/resources/assets/betterend/models/block/smaragdant_stairs_inner.json b/src/main/resources/assets/betterend/models/block/smaragdant_stairs_inner.json new file mode 100644 index 00000000..2339f001 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/smaragdant_stairs_inner.json @@ -0,0 +1,8 @@ +{ + "parent": "betterend:block/lit_stairs_inner", + "textures": { + "bottom": "betterend:block/smaragdant_crystal_top", + "top": "betterend:block/smaragdant_crystal_top", + "side": "betterend:block/smaragdant_crystal_side" + } +} diff --git a/src/main/resources/assets/betterend/models/block/smaragdant_stairs_outer.json b/src/main/resources/assets/betterend/models/block/smaragdant_stairs_outer.json new file mode 100644 index 00000000..380d63db --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/smaragdant_stairs_outer.json @@ -0,0 +1,8 @@ +{ + "parent": "betterend:block/lit_stairs_outer", + "textures": { + "bottom": "betterend:block/smaragdant_crystal_top", + "top": "betterend:block/smaragdant_crystal_top", + "side": "betterend:block/smaragdant_crystal_side" + } +} diff --git a/src/main/resources/assets/betterend/models/item/smaragdant_crystal_bricks_stairs.json b/src/main/resources/assets/betterend/models/item/smaragdant_crystal_bricks_stairs.json new file mode 100644 index 00000000..92b2603b --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/smaragdant_crystal_bricks_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "betterend:block/smaragdant_bricks_stairs" +} diff --git a/src/main/resources/assets/betterend/models/item/smaragdant_crystal_bricks_wall.json b/src/main/resources/assets/betterend/models/item/smaragdant_crystal_bricks_wall.json new file mode 100644 index 00000000..b89dc3ef --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/smaragdant_crystal_bricks_wall.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/wall_inventory", + "textures": { + "wall": "betterend:block/smaragdant_crystal_bricks" + } +} diff --git a/src/main/resources/assets/betterend/models/item/smaragdant_crystal_pedestal.json b/src/main/resources/assets/betterend/models/item/smaragdant_crystal_pedestal.json new file mode 100644 index 00000000..ca50eb45 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/smaragdant_crystal_pedestal.json @@ -0,0 +1,3 @@ +{ + "parent": "betterend:block/smaragdant_pedestal_default" +} diff --git a/src/main/resources/assets/betterend/models/item/smaragdant_crystal_slab.json b/src/main/resources/assets/betterend/models/item/smaragdant_crystal_slab.json new file mode 100644 index 00000000..1099667b --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/smaragdant_crystal_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "betterend:block/smaragdant_slab" +} diff --git a/src/main/resources/assets/betterend/models/item/smaragdant_crystal_stairs.json b/src/main/resources/assets/betterend/models/item/smaragdant_crystal_stairs.json new file mode 100644 index 00000000..7af759c0 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/smaragdant_crystal_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "betterend:block/smaragdant_stairs" +} diff --git a/src/main/resources/assets/betterend/models/item/smaragdant_crystal_wall.json b/src/main/resources/assets/betterend/models/item/smaragdant_crystal_wall.json new file mode 100644 index 00000000..4391b325 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/smaragdant_crystal_wall.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/wall_inventory", + "textures": { + "wall": "betterend:block/smaragdant_crystal_side" + } +} diff --git a/src/main/resources/assets/betterend/textures/block/smaragdant_crystal.png b/src/main/resources/assets/betterend/textures/block/smaragdant_crystal.png deleted file mode 100644 index e2981961edd094ff01eceda716d87fc41b656d2b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 217 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!M1W6-E0AXJNn?o3Whkm*=&WW~ z(8_RT8N>V8x{@*5fl?eLL4Lsu{~_S&sSqQeSca#IV@L%f>%qoE7DEnZgP9xtAA0+6 zdfBqO_LWoaT@tZeB6f0@-yQMpOyAi*H)JeZD)jB@)4RTvZ*OydZQV8VHXHk@pYij= zRz+yaHB5au@zSzusd2x38<(1YcU?HG%gTe~ HDWM4f6O&T? diff --git a/src/main/resources/assets/betterend/textures/block/smaragdant_crystal_bricks.png b/src/main/resources/assets/betterend/textures/block/smaragdant_crystal_bricks.png index b6b4336b178b48f5f11132d25239207c7b195c5d..b14f97d9b6a2eb52cd2ccc27134a74fd0a84ae3b 100644 GIT binary patch delta 208 zcmey%_>*yhVZB6vPlzi65cs4q#O5*-RWWo{Gc0IjIJ1o5{cK&ynC(C*j*=k1V21w? zaP?G(5m2n!)5S4FVybN)x0s6}hf^TW_x+C@t9_UEXPjcaT7Gu5(vpr79eXzmU0Y*y z&+eoHdw=T^Wp=+M-P&t4)o09^_cCF7x=8=8C{NFs34deN6vPhP|FQAG&+o^ZQ#aJ> z`^!o!JXT+E?DmWFzf*(lo21uR%k#f`bLOd`z`XyDe=?e6vT#^vv{i%L?dj_0vd$@? F2>>=tS{(oY delta 212 zcmey#_?K~lVZC&KPlzi65cs4q#O5*-RWWo{Gc0IjIJ1o5&O*lbv%7E4s|3n&mIV0) zGyI1FbEer>fP&SYE{-7*Q%(Iig%}h$oId{g-z}bdO_SGzan8$E_7@GGa%m|^XdW_l zp4gQjcvh7!Ymtdy<%fuEizok9F5}GR`4xEAH+F03p$A`V)5^~pTwnUX?q16^-`jSw z`PFW>FCTx@@yK|F(mJ!$4^I50sjGzZGU}9L_t&-l|_$94#YqV0=^>HsQ^kwL09-}syS3ZRQTC!5HG`LbCoUE!=NduvgLtecy?}uVze0;_SEtp z=%B@TpgghH!wf@VXsRbMJtuY^IFDETRz3#J=u>~be=7=pRTB;bWV_LVLI3~&07*qo IM6N<$g5wrK#Q*>R delta 143 zcmV;A0C4~R0rUZoZGUn}L_t&-l~s>X7Q`S31C=Dg{ZG6>*S_`(9AS)ug}H*F(hW3Z zkN}C@&_Gc=f#S^IU}{!CJlfULjTkjgzCL3*LPuDC7Z_ xz8zla>a*IBe}@CUbKslfI@FH)mlORsenjX5K};pbQvd(}00>D%PDHLkV1i{0Kz{%L diff --git a/src/main/resources/assets/betterend/textures/block/smaragdant_crystal_pillar_top.png b/src/main/resources/assets/betterend/textures/block/smaragdant_crystal_pillar_top.png index 04973162d62efd84a482f9279c17a650dd15c2b7..b4092bca24552f0d54f3b4a9e1ad2cd3d3cca9ac 100644 GIT binary patch delta 168 zcmV;Z09XHj0*wNYZGVeNL_t&-l^u_P4gettLPde`|6hD`ZDmX1$t2!@*0nl2IUVqpZLScvn_g}5Rw8N_)x~I#ait1I{e#OqQrWH|ML!4e}c6|@B*2rauq+0hW zn3bj1=zuph#;K=oLzhziBfZT>@yn7oLHKe_2|pk0ySe7gUm>%mEB;=V#d@zG|5-j* Wd<07+af%550000JB diff --git a/src/main/resources/assets/betterend/textures/block/smaragdant_crystal_polished.png b/src/main/resources/assets/betterend/textures/block/smaragdant_crystal_polished.png index 9b0a4fab32fdbdb9a580951183f08cd690130abe..785096b2968bbc108fef93b2aa3673ce0c2a979d 100644 GIT binary patch delta 151 zcmV;I0BHY+0{j7xZGU=6L_t&-l{HTZ4g@g>s(_^bfAON7HK~n+Lr>dx>gzgop|((f zaBdYTrX<1@fQoFOChr1v5GxE01ME1umv-?aGbf_?JSevo{XEp&Vh0_-r6nZlpQ7yA zGiwB7;R7 z#83Z0EHY28CI@I&yEq)NnK03(h)OV@lI%7@t%1GgJ2dA`^&DGyC$FkdeLrIT1W?bZ R3V{Fs002ovPDHLkV1k$`M!5h0 diff --git a/src/main/resources/assets/betterend/textures/block/smaragdant_crystal_shard.png b/src/main/resources/assets/betterend/textures/block/smaragdant_crystal_shard.png index aa1a21fee788717c54062b0ea0194c7039e00294..cdcfa2377d7f44623a5b32085898a011eb1462dc 100644 GIT binary patch delta 212 zcmZo-ddfIKvYwfNfk8u;KNv`{q&xaLGB9lHtN9%`8OWCi@Ck7R(hNRn46(TkMO6%) z)eH+-8O|(Yct2ZLGG;qailZdRFPPy!1YA88VgwXR@pN$vk(fHS*O8CefrBZQ@$dis z?yKJG@8BMQc3r7h0gime95vr;VUy4EhIX`xYF@|3h{tgIj z7pboShw(iny+#*w4_KFEh5%}w8c;tfr3?V$HYWjQ0Wzm+?rMi*Mvb!tsGQ=b0-!T$ zWBve`Q$R9+(_I6Y^Xzm1*d1qn7m@SFVpiLoW0X??u$Z?5Kuq42fD2LrNV9nle{9@5 r3A+Ov1+G*AIA$Lp*A`-a0?a<_>=I-`;&fLq00000NkvXXu0mjfBoAEG diff --git a/src/main/resources/assets/betterend/textures/block/smaragdant_crystal_tiles.png b/src/main/resources/assets/betterend/textures/block/smaragdant_crystal_tiles.png index ad66fdd424ba2e4b19257b65d89d4ad203b4cba0..7e5ab1f1334c7f128b4cf48b72cc68cc9104df1b 100644 GIT binary patch delta 136 zcmV;30C)fM0qFsdX@6@;L_t&-m3_`p4g(+z0#I6Px&MtvUCsXX<4ZIMV5?P3c58&x zRbAoRkx(C=YO3-IolH{kgmZpT_6p~mRXo9x|7AQ8Ze(QG9P!)n6+X}O?;h9I?$|wd qM^b#^=H36C9o!xKzayD3egI?^1W~dDf-?XB002ovPDHLkU;%;@T|SWj delta 146 zcmV;D0B!&20rLTnX@7M|L_t&-m35Ch0t6upLL-pO{cpSkr`Tp}MDpQT>H$ef-4?1| z!!H+lMa}S_ZBIuOaLz$aL`g1;SBN|u71fw$cC7_iduyN=?y5}_{$k$(H~1O>3&`bI zux-~X0>%#62UrsZ^GFDvxnRhLBNE%>C3VgZ?2`kNC8&rj01E&B07*qoM6N<$f~vPW A;s5{u From c473068e2db77b36a38cfc29c293900b728b7c6a Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Fri, 9 Jul 2021 21:59:12 +0300 Subject: [PATCH 106/595] Color lights integration --- .../assets/colored_lights/light_colors.json | 91 +++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 src/main/resources/assets/colored_lights/light_colors.json diff --git a/src/main/resources/assets/colored_lights/light_colors.json b/src/main/resources/assets/colored_lights/light_colors.json new file mode 100644 index 00000000..27a890de --- /dev/null +++ b/src/main/resources/assets/colored_lights/light_colors.json @@ -0,0 +1,91 @@ +{ + "replace": false, + "colors": { + "betterend:smaragdant_crystal": "#17cfbd", + "betterend:smaragdant_crystal_shard": "#17cfbd", + "betterend:smaragdant_crystal_shard": "#17cfbd", + "betterend:smaragdant_crystal_bricks": "#17cfbd", + "betterend:smaragdant_crystal_bricks_slab": "#17cfbd", + "betterend:smaragdant_crystal_bricks_stairs": "#17cfbd", + "betterend:smaragdant_crystal_bricks_wall": "#17cfbd", + "betterend:smaragdant_crystal_pedestal": "#17cfbd", + "betterend:smaragdant_crystal_pillar": "#17cfbd", + "betterend:smaragdant_crystal_polished": "#17cfbd", + "betterend:smaragdant_crystal_slab": "#17cfbd", + "betterend:smaragdant_crystal_stairs": "#17cfbd", + "betterend:smaragdant_crystal_tiles": "#17cfbd", + "betterend:smaragdant_crystal_wall": "#17cfbd", + "betterend:aurora_crystal": "#f74da1", + "betterend:mossy_glowshroom_fur": "#8be6ff", + "betterend:mossy_glowshroom_hymenophore": "#8be6ff", + "betterend:umbrella_tree_cluster": "#c054f9", + "betterend:umbrella_tree_cluster": "#c054f9", + "betterend:umbrella_moss": "#ff943e", + "betterend:umbrella_moss_tall": "#ff943e", + "betterend:creeping_moss": "#0de4fc", + "betterend:twisted_umbrella_moss": "#e045d0", + "betterend:twisted_umbrella_moss_tall": "#e045d0", + "betterend:glowing_pillar_luminophor": "#ffd96c", + "betterend:glowing_pillar_leaves": "#ffd96c", + "betterend:bulb_moss": "#ffd96c", + "betterend:blue_vine_lantern": "#a6effb", + "betterend:blue_vine_fur": "#a6effb", + "betterend:purple_polypore": "#c53aec", + "betterend:aurant_polypore": "#a2d9ff", + "betterend:end_lily": "#c27dff", + "betterend:dense_vine": "#f47ffc", + "betterend:pond_anemone": "#f1f0da", + "betterend:amaranita_lantern": "#baecd9", + "betterend:amaranita_fur": "#baecd9", + + "betterend:neon_cactus": "#86f0e7", + "betterend:neon_cactus_block": "#86f0e7", + "betterend:neon_cactus_stairs": "#86f0e7", + "betterend:neon_cactus_slab": "#86f0e7", + + "betterend:iron_bulb_lantern_orange": "#ff963c", + "betterend:iron_bulb_lantern_magenta": "#d25aff", + "betterend:iron_bulb_lantern_light_blue": "#78b5ff", + "betterend:iron_bulb_lantern_yellow": "#ffff39", + "betterend:iron_bulb_lantern_lime": "#9fff1f", + "betterend:iron_bulb_lantern_pink": "#ff86ae", + "betterend:iron_bulb_lantern_cyan": "#7fd4ff", + "betterend:iron_bulb_lantern_purple": "#b65aff", + "betterend:iron_bulb_lantern_blue": "#496dff", + "betterend:iron_bulb_lantern_brown": "#ffbe80", + "betterend:iron_bulb_lantern_green": "#cdff66", + "betterend:iron_bulb_lantern_red": "#ff5555", + + "betterend:thallasium_bulb_lantern_orange": "#ff963c", + "betterend:thallasium_bulb_lantern_magenta": "#d25aff", + "betterend:thallasium_bulb_lantern_light_blue": "#78b5ff", + "betterend:thallasium_bulb_lantern_yellow": "#ffff39", + "betterend:thallasium_bulb_lantern_lime": "#9fff1f", + "betterend:thallasium_bulb_lantern_pink": "#ff86ae", + "betterend:thallasium_bulb_lantern_cyan": "#7fd4ff", + "betterend:thallasium_bulb_lantern_purple": "#b65aff", + "betterend:thallasium_bulb_lantern_blue": "#496dff", + "betterend:thallasium_bulb_lantern_brown": "#ffbe80", + "betterend:thallasium_bulb_lantern_green": "#cdff66", + "betterend:thallasium_bulb_lantern_red": "#ff5555", + + "betterend:terminite_bulb_lantern_orange": "#ff963c", + "betterend:terminite_bulb_lantern_magenta": "#d25aff", + "betterend:terminite_bulb_lantern_light_blue": "#78b5ff", + "betterend:terminite_bulb_lantern_yellow": "#ffff39", + "betterend:terminite_bulb_lantern_lime": "#9fff1f", + "betterend:terminite_bulb_lantern_pink": "#ff86ae", + "betterend:terminite_bulb_lantern_cyan": "#7fd4ff", + "betterend:terminite_bulb_lantern_purple": "#b65aff", + "betterend:terminite_bulb_lantern_blue": "#496dff", + "betterend:terminite_bulb_lantern_brown": "#ffbe80", + "betterend:terminite_bulb_lantern_green": "#cdff66", + "betterend:terminite_bulb_lantern_red": "#ff5555", + + "betterend:thallasium_chandelier": "#e0fceb", + "betterend:terminite_chandelier": "#e0fceb", + "betterend:iron_chandelier": "#e0fceb", + "betterend:gold_chandelier": "#e0fceb", + "betterend:lumecorn": "#e0fceb" + } +} From cc7b992f1186b36a7a973b6a21478e7ef5147eaf Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Fri, 9 Jul 2021 22:07:47 +0300 Subject: [PATCH 107/595] Neon cactus blocks fixes --- src/main/java/ru/betterend/blocks/NeonCactusBlock.java | 4 ++-- .../assets/betterend/models/block/neon_cactus_slab.json | 2 +- .../assets/betterend/models/block/neon_cactus_stairs.json | 2 +- .../betterend/models/block/neon_cactus_stairs_inner.json | 2 +- .../betterend/models/block/neon_cactus_stairs_outer.json | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/NeonCactusBlock.java b/src/main/java/ru/betterend/blocks/NeonCactusBlock.java index 2d1d9acd..db9468c8 100644 --- a/src/main/java/ru/betterend/blocks/NeonCactusBlock.java +++ b/src/main/java/ru/betterend/blocks/NeonCactusBlock.java @@ -2,9 +2,9 @@ package ru.betterend.blocks; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.world.level.block.Blocks; -import ru.bclib.blocks.BaseRotatedPillarBlock; +import ru.betterend.blocks.basis.LitPillarBlock; -public class NeonCactusBlock extends BaseRotatedPillarBlock { +public class NeonCactusBlock extends LitPillarBlock { public NeonCactusBlock() { super(FabricBlockSettings.copyOf(Blocks.CACTUS).luminance(15)); } diff --git a/src/main/resources/assets/betterend/models/block/neon_cactus_slab.json b/src/main/resources/assets/betterend/models/block/neon_cactus_slab.json index 22fb196b..ccd83a76 100644 --- a/src/main/resources/assets/betterend/models/block/neon_cactus_slab.json +++ b/src/main/resources/assets/betterend/models/block/neon_cactus_slab.json @@ -1,5 +1,5 @@ { - "parent": "block/slab", + "parent": "betterend:block/slab_noshade", "textures": { "bottom": "betterend:block/neon_cactus_block_top", "top": "betterend:block/neon_cactus_block_top", diff --git a/src/main/resources/assets/betterend/models/block/neon_cactus_stairs.json b/src/main/resources/assets/betterend/models/block/neon_cactus_stairs.json index 0a0df2b2..bae5dffd 100644 --- a/src/main/resources/assets/betterend/models/block/neon_cactus_stairs.json +++ b/src/main/resources/assets/betterend/models/block/neon_cactus_stairs.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:block/stairs", + "parent": "betterend:block/lit_stairs", "textures": { "bottom": "betterend:block/neon_cactus_block_top", "top": "betterend:block/neon_cactus_block_top", diff --git a/src/main/resources/assets/betterend/models/block/neon_cactus_stairs_inner.json b/src/main/resources/assets/betterend/models/block/neon_cactus_stairs_inner.json index 78d80cc5..2eecc8e2 100644 --- a/src/main/resources/assets/betterend/models/block/neon_cactus_stairs_inner.json +++ b/src/main/resources/assets/betterend/models/block/neon_cactus_stairs_inner.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:block/inner_stairs", + "parent": "betterend:block/lit_stairs_inner", "textures": { "bottom": "betterend:block/neon_cactus_block_top", "top": "betterend:block/neon_cactus_block_top", diff --git a/src/main/resources/assets/betterend/models/block/neon_cactus_stairs_outer.json b/src/main/resources/assets/betterend/models/block/neon_cactus_stairs_outer.json index 01f12961..ead881f0 100644 --- a/src/main/resources/assets/betterend/models/block/neon_cactus_stairs_outer.json +++ b/src/main/resources/assets/betterend/models/block/neon_cactus_stairs_outer.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:block/outer_stairs", + "parent": "betterend:block/lit_stairs_outer", "textures": { "bottom": "betterend:block/neon_cactus_block_top", "top": "betterend:block/neon_cactus_block_top", From 607d46f2f4775a9be5e657564fa3e78438fd3e2f Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Fri, 9 Jul 2021 22:49:54 +0300 Subject: [PATCH 108/595] Amber land ambience --- .../java/ru/betterend/registry/EndSounds.java | 1 + .../world/biome/land/AmberLandBiome.java | 1 + .../resources/assets/betterend/sounds.json | 9 +++++++++ .../betterend/sounds/ambient/amber_land.ogg | Bin 0 -> 3403140 bytes 4 files changed, 11 insertions(+) create mode 100644 src/main/resources/assets/betterend/sounds/ambient/amber_land.ogg diff --git a/src/main/java/ru/betterend/registry/EndSounds.java b/src/main/java/ru/betterend/registry/EndSounds.java index 7e1c962e..825168a1 100644 --- a/src/main/java/ru/betterend/registry/EndSounds.java +++ b/src/main/java/ru/betterend/registry/EndSounds.java @@ -23,6 +23,7 @@ public class EndSounds { public static final SoundEvent AMBIENT_UMBRELLA_JUNGLE = register("ambient", "umbrella_jungle"); public static final SoundEvent AMBIENT_GLOWING_GRASSLANDS = register("ambient", "glowing_grasslands"); public static final SoundEvent AMBIENT_CAVES = register("ambient", "caves"); + public static final SoundEvent AMBIENT_AMBER_LAND = register("ambient", "amber_land"); // Entity public static final SoundEvent ENTITY_DRAGONFLY = register("entity", "dragonfly"); diff --git a/src/main/java/ru/betterend/world/biome/land/AmberLandBiome.java b/src/main/java/ru/betterend/world/biome/land/AmberLandBiome.java index 63032057..c172f5dc 100644 --- a/src/main/java/ru/betterend/world/biome/land/AmberLandBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/AmberLandBiome.java @@ -19,6 +19,7 @@ public class AmberLandBiome extends EndBiome { .setPlantsColor(219, 115, 38) .setWaterAndFogColor(145, 108, 72) .setMusic(EndSounds.MUSIC_FOREST) + .setLoop(EndSounds.AMBIENT_AMBER_LAND) .setParticles(EndParticles.AMBER_SPHERE, 0.001F) .setSurface(EndBlocks.AMBER_MOSS) .addFeature(EndFeatures.AMBER_ORE) diff --git a/src/main/resources/assets/betterend/sounds.json b/src/main/resources/assets/betterend/sounds.json index f0abe0dd..d202610d 100644 --- a/src/main/resources/assets/betterend/sounds.json +++ b/src/main/resources/assets/betterend/sounds.json @@ -219,6 +219,15 @@ } ] }, + "betterend.ambient.amber_land": { + "category": "ambient", + "sounds": [ + { + "name": "betterend:ambient/amber_land", + "stream": true + } + ] + }, "betterend.entity.dragonfly": { "category": "entity", diff --git a/src/main/resources/assets/betterend/sounds/ambient/amber_land.ogg b/src/main/resources/assets/betterend/sounds/ambient/amber_land.ogg new file mode 100644 index 0000000000000000000000000000000000000000..6b830cdb78ed7f858aac3f3a4ec66e9ba0e49494 GIT binary patch literal 3403140 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%0DbSxvWE_DhRemhb7`m0-bPa18>Lh6l+1svNl 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ℑ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%0Am<U{BCRM_Z?yiTsEGb!t8bt56(ceEHzDy_sM(QQ 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

Xs!yLQ=pf*unU9c+uV~E` zl|Z=%q{LG4#4a49Sg}S1zY^`gxKp_0Jw+}FA1o@PL_d}tfmnvsD z)75Khg&XJ3Kg-uzv+)j2$9a;+t(x3Dt7o-=PPd*EPPSNo5L#tl(LZLPGo@s8W?>Oe zj+j!;DP8}g@UX+Ao}oNx&;GW7)?*hwMht!$H!?z zg0|;nMib5-Eh%u3uvuSSrrJ+;fhzs7)UYc{+iv%jqXNMq7#WK@NoWJ*=BW3_Z1^)5 zjQO&k-EHA0UhD4AHapHsn#upoi46W9`pCti4^RbX0q6gCNrm^WT%M-x!3Q_}MN!M*?KGxr(Pda8@>kAz(y%Begj@$k!55zd+07II+%Kl=(I zY1+)frp|9#7mY&!hJIF*6kE1i{+D<)~ix`mq8ZC3wtVCNQqq~Bi(;neg2R%ZX zgnhwert+xsKP8EpIYux$ceXsqAD&Nm71E-hu`qEk|KTc!iXi42MO`uQ32m4lGq2grGmOCSQ2(~4vNm`5@9vQxo=8h);>ckR4cIh2QaY{$Be7aJW~2$h&rR_?-J?t5e0O-op0GEz<@dU7~!-0LVZA*>PGmxI8I zgrv*)mdq)y^8xPS3>R&_oGhF38HPfyV0zs zynv+}*S7nx&bIx1Wax$mJE#?=hNGe{gKqM}uneub5ryLZidE=9U7E@`;5|;I+B^xL zDZ(v|s^1xazcHZu8BX$z^1FMg>y`CH{+V{~p}uR*zp$UjcW6?RaQOqhE-+VViOc}Qh{^j@8<0G#FbdZ5y2AP8w95y7 zgzu_7i}1611N2v^cNc(SBRgGq5^g#$a8g>sfL!BFdm@#vKlnTICZ{ae<(7>+;sGx{ zLu-bVHC(;wi`&wm8QJn*$%5Z`c<}hS4BtyeQUaTWJY#$j2_@8FRBNr+;No=`1J^O> z_cqikaQ0}!vCxY>y_WTQe5GQU=*R8tGn?5^_aJ(4f1|czjq!1SuGDvHa%4Km5qG#| zykhPRCG)|>>Vzze&)bq=tnJwL!jCU6G|+pr3J7*!6Ay6Nu>kgXbSejc8hQNXVdeW@IEKrm4C)*;+b`vaSFNb>KB$}Q;9Un>{!kPka0cDxP)U@KL4gd-HF6HUP;#I|9V zhXu(-#2k25GvQ?hT)6;~$p?4@L6$fs{Mu^mp9qrMY;|vw8`R?$On-m!eo)M~7C32z z)sy@n^|WWUPOt{Hlz=2%+tx!bdoSukPcL3I( zahO_|R)3g*%_&#waI$O%YBX+Qvz)=3n}xg3DdckM376Hdcrc*~V3p8v$Of26$pQX1 z57&6KvjoaxgLy5eNvA)%uq7ZOBu|mqlm{@8A*LPs1}(Wg_0d%QU;HdlFv=baeSg4fFlz-~E1t+&Z7%#q#OBcb6H_6~Jh?Mc2Y@wJ#o zks0Uk=8FdQV`OgpPTx|H_`}ax;j?4@Lo*C;$qr|;F)LT!=J&0wrUXk1@5~2q>lwxx zB5#=>=%AdbUjP|dlbS*@hg9i6Sn(Jy2D8H$Pf7yfL>UOv}aFWf(hiF=63)zf2U~QZ6viC7YV{G-Oc3jW@c5%iCCR?I zgWYltY1Z3YH1kj*9i=uK(R<3s&HQ>K5HZP08g_MNP{730{#!=*gFfO$$M31ZFmST3 z(M#axlCRyW)$uhFybh*$-M-6LZeXdh*LZuYg52E;^1YMmQf7w@KL=>kLNeXqVG+RF zhRz&s3jCtSA8D2g7{SGtmh{?|Fhval)P@eo>tTID^#oy3WcL2&`L`KAz~%RQYu8Yn zi>#@cs9*TGq@dIV+^q(oa7{Dm7d#$zKi=G*&uxZx-ZJM0Uc9}M8u2Q@vY^|GedP66yRu+gfP>xD)rg;TsT*7L z#Jf;Kr@&6}2*d@iA(A%O4VT4w-LdU=tohZ;nu$31+K&3x2qUD%{1tgq& zL4mi6BS!5q)1Jaaz@{0&kR(OSHT^97(_kpUzH2DZ%IU4@o8!DaL?Zo)W@>WixA2ju z`^*HZT|ViEZf|yd-fkH>W6@vTD?2LCSPbuMkGr@!7Ua@as@-p2sM<(nB zao{oc&D72Oc!=$}NB`}4fLJca&B@*X7;@USKFp^$GQaIV?)fBR^NlL&KnrM`-qH@e zOgxogIRrVT*{AnA3B;gf(cuCb-K(w1MWpzEj1zY{uswL1 z6n=yWQ6$IKw7tO%OwqzNCDUnyumXGN09lK29VJ_^O~MB+=6)QH5s1H9&2^dOwVtd# zsRi5E6f8~E9yk`3y!XE2-8&M0!M1*D646=POAh=~!o>8AQo@sh80T>-9u|m>TZga! zVu4}gol9T8SH0f|r;Vch{y6;4CdIa+v-uP8DHiTAjO{qb^@8>7Xm&=S9O`C6lyw8u zYAVl;LLH76>pM?6eQ>uew{foMn1D5}$*{=;!8vTCo$9-{;_XiB*UpXPzc$PGBPPBD z*X!_B;s41=vVw-%-ycJ8d`_;{6b+7v0RVqY-L;MRpCQOY%3}|<+P|c<0ONYrv~W5o z#FHJnrx62~Ez6x8gc2WwWF`Fi%PhZxpz44gIT%aUggYv&8|jS)6*rhBXWN~xZvSz1 zwrsxPGYAZRAE^Io5!_~EjqGNNI3T2L>26Z~^%p+^$-_5_ui^7t#gqWM1SV7Li+G8( zcMOLNVlia)Fl zAjo_7c`UyDqYVwxJghYwdd%;7n}++66Ay%8`tZ4WE?PQ^fpD(W^L@DSO8xBD!ou>E zID7}BenUQfw{KNV%&m*M%?D6h(gKNgRfV8{*F4nh-{r$!za%D#`{;dUCZDCeqChh$ zM>1?sYW!`uhA8T7P0!00&Xa&t_yX9YWZ&pCWmvx?pr(EFyubzJUjgIJCA>Wb(LQP* z2nwKi1@;Tl39c~luFjsdq>S8!BPJh)KU^&LH+UR>G4C!4tunUDEI>w7cyK@-OH1m_ zh0dSwIjWH=8W=bYP z@a5m!PUzsp#Vb5(K7(Wb+0`_J@Vx|eL9k`gZ{-3Az4faLy7Uf&G1Qz_jEPY1C>m_S zT(hrSYJ1B#R5peAb_;_r>TSoZ0A&|OT_3vZCcM^EUx&uU1B$-g!QZbIVR~4a!sRBLE9+({*9N|`@6YC z;N90GbCZUI>-~AzZpfTqC(&tl`ysN?rtMY}=n&XZ5p3Z7Czs;LZz|&sc``s*e?0P( z=6lToI<#OkVxKDL#Nh&{CAJ9po*lVb2lI;zRiZ!Y#q_8${$d5Z>AY#RK9;9Hi7y#k zJKyG$@vKz@Q2!MzjM(kHQ(nd=_0bU`(@>D#DB;n*Ef6j$5)sLrm_K_hKJkm_L;oeY z0p$wJd33_6rabY8s-TMi{H%=JM0aaV@?LFCWA)4 zd5-v0K#OuO<`ZQ<$$&~5oy}nBYAk*tGBLM!+ z#ZLCB>C~c32Tm}+n;`vVwFNnwZj}psI9w;u&|}}Cr)(mO=e_(lYdJ3!pNIsVZA@sE zWKe>d-?L_%!?X-uxSs`rJ%1rqVEBr2ZbhKvzs?BlB6mnOMy(JDBSQI)}Xw^R<3Ob9*-x+mUNUj4_2Jb`!|MtIyBYM)v78SuTX4_n< zKsJF$zmxgc?Gydz_u(zF7w^`U6qjHT?LTjk?9pP0r(>kpwicnxA#bZL>xhx<_9fZ- zZmS@F0H74*!D?pJO0T@9O4vaCCh^^HI44(0!Nl^#C?3u%N~w3OsB+0|!HZz_JTUB>I1t1qp_N9jau! zJ6|&}dxiTXChxoVm}lxS+zl`C@^zbBiAKxw^qVH^vriQd3L-g~HUu^0}BSfXe<3pH*Abztd1O^3DN? zvWdb60Bl4ScaIS0o^ETix8!QNhywkxCIGqb)h`FSS#i#+ogYQn5N8aTFG^6+KvJI^m3bY4oS znA6)^@4KSRIto3XQ(OQ%S#SSc+&N13v!*iTMwq(-riFa*zAG8nV|MR0Co2PKZdbNh z3zYyuFj2nM3s=1n*)Zg(xGA)yDhmz@RBk_OSH*v9?zQ2v5iu=qBm+xk-z*G$SHrpC z;kxl%kbgaS2}MB`d z#=Jed4bZ^6hfRdwEgOFtG;-m{y8g)o3tUece8exBGeU2L4uB)l z7Eyt^yt-B={w&`2dif5|n^UT-=OQErb!FBeFE@EomY2H4jaa))D07Jk2VbuyClNA7 zOBSa1Q@ILo@k3SCinj`ee~50J*r1$V_;)zOS?ZH^${Rnb?N;_a30QvhsHUqet#vOX zMpd_{eT`k3FNUf-PjdS;8MZnlWa`xPbLJvkyDa{Azo_m_ zpVPh*E0(xz_fDayM+8+@j-OYxdeckBGV)<55GJcfka)#)AqQ4Vf^vk2rdDrUA;}(jX z{q}GYA$6A)KZd)&yQb<&iV0(sC|r&0+|b#ePNd}VUrLKqF8$}>8`9rgQe`shNTlRA zsPHRCC*5(pEY)X5g7$&=GNrlQsSEK}PDuuy+!BE{(6YPAq^-`Czpp49SKKBp>ZNmY zilrCrR21vU6iSP25@zY~fkfQ{++A#172yZinyyO~4C|!@d9n@r^kQZiJTt9_=HG*i zQQbz9G(-8MdvBRl8cpAIPr;4sf`V58?w1L+o5Ifn{*}x27$9uAZ(ZBhm*h(t-%d?U zgufYkyir`$ zDsWl?pX5{7=d**45^7F2wLLQuTmvU<<^Jr;Vdqs){U630Zw%{f8D7D>DQ|t^f~`+< z?$>7_Ph`m-jhVs^u3uMBerhb@PQkY{iy1vw!cY^rB95P%gvwiJRrp5;P2}c>t_LoQ z2DK`!pJXf+2CuJm3qgkp+@|OJ*lchj<-ywSr_IHLkL)+0Mkk!4~LQtlHJFn1$Q?xmi@v{ zuDbQhT-WBx-|`DmKP-$CjeUJg7Sa~Tdm&cSqS*TRLoNverBRKy9Q2>ZKY3ZlI(>sb z4bHCB%la@%u2b9zY8>jj>j>#zWSj->aQ=HWdxBy(dju3ZipO;iSX3^YC$lAj(*Ogm z=0almb$(>v4QZyt3x2`G&M-l?=E|4s&Ed!|mXZKHAR~rjdyM@QW`_N^azi_57 z^+c~Ck&kn}d%Xilcuj|J9mW0cMN?|)RE`Zskm*K$9-9IyD(J{H+LiN)J6&tV*43qr zum|g6JYK#O%+XAN3R>*PeD+fl2D3<3Oi;G=z{^8{5(svt{8a3@{AI4Ep$1QHaCf<^w&4xu zN-T-5&E7G2B;B+>!wgX>M&`eLRLfh_Uiol#7iF5E@4UaZb|cVI1yO?T1AQDj*XNe^ zdWC*qLmPag)5&2PUspVXyG5=lnT6l7`rW-bZ(29jQM0)iiXs8P7wv^t$-}os2}Zrc z&p?8mA_VFy8KF#66JQCiyO|fkNPj6I01mK(-Jg56V^!hXBm%6pyE>ZdGpZ9 zyO)!f7=EOseQi5%wbX#m{6yk!hq5}!s_-vWf0tZrp+#Oyp8gKU?+y`uUKdQo zRI4pV_bL^XVnD)UUUbX|LNAcgh+(a7&!O_)nQ|{eiAEqR}ktnJ1{N|XIx~o&e=?|)yqTQqm-tQ zA2*M_`689auG3!bFSS1=0iOMa|GYmI8Mkw;(1P!6uEMVU38tUb@ZlSO*%xgYDZ3U5 zDulx9Y;5;azrvAtp^`I?yJ71$=soz#{LZWWFUzcmg0(YNZe7f5G+u8b>n-J~J9s6- z(3o7Z$~XnqnOBsVwF$dUI1TYu^$AoAwoxDh0|Ugw8dw!A+vDw}Zo>@M1s5?Zplm`@ zfjrk<8M7*orOTv;yF5P5#VtY(LVp#X{!6AC=^HJK0t8)1Mw3l*gq+vK#gP2_i z`U|7I@4O#G!vZDDt}=+{0MplXo%G%K+AHY+uU1c`uiJ0_!T914)!>gmCGvQN_M!GH zL_vj=q!GklNJh^U9~opDvUpE40UMn(J@01^K0eTbd?loDDH6k(Y7=#qSuMzD zLx^jSdmxC~tp1Xfv-9?B+H8Iy@NrZ>N&A>EuF>$P3tdA%pw{C;WWJ~Uf}12@_(+AO zi0*><;3zPI$qjF+H{hd{JB?BK$7XBZ!ret@QE)~9x_j_uzGZP>cmG%V-+aQbUfkc+_cZScq6ztB$=rUaCT6+a8mUJ>Tp?XIl%iS2I^323NPx6FTnj6$o19<&oJshm( zRiXTws3*lSE$8EU3C}0Iu>V^Wu;=0xFRZfy*_-rX0=LP?^49e5*f>&f#)l}JsOGsDkcBKkWyEcejo@G z=1KT3t(Y8}pBNY4*3)aSL~Cl2|K7%Z*KT!&?EdLfRznlvPEd5yPc1@r_$|hky$u%1 z`*_wv+VS6ga2MFKOm;%n-ZJa{GrspH&iUG7sEudT4=ip0GSjf0mltyfJEp|BKS+E~ z3=3r2Q4iICwy+Gc#bbKjU9K?b$?SJhkhW_{F|5Q0S88(JIRX=TmDMd0|C(GYV2H_n zNMjBe>Etq(Y6+A1A(Epbo%RD|LZe+nB-)7lp{DAQA_#OZ4>!Gccr+5@FDK4RECpmD zSH`YEWYC02o%F3i^Bp-x>Lq^Q%AztyJ}HQ-T7_7Uz`knEPH^orhvBl$IH$aZ)#<+% zasCn<(r(QL&N(Hw>B&9Q%yLh;o_3!8YhQ|zzP`U%UiA7`Qiu*68TdFBA-J79xBJ$h z(A6~A_O6{ayYIPP;Q`zR$h6GXKQDdB#gljncHVfLNMW_%1?j-GVgwkj8q^gi+5pjF zQfq|s4rmwZ<=+jsUqH(4p>}fYL{4y(zh`HehZ4`2#WC)GGI6N2Q`bB>Xa`FHxY>Y0 zN9rpk)f(Bk#q!DrS&*Fe6WOTnU40dVam4&(53+Chx=<7mH}1SSY8Qe0t(;CG_FC*q zB)K762Y@ED4s#e0EDrd3DtpXX7Rh=!+kHm({T&UqSMX)Cra=hcSqbs18V^aY_$_9P zu9Fyjy}`9*d3QXN+43;*df;GJt&+Fly8?H`n&>EBK`!Lpa;|S{Z(2N~(-dUWX7Kg2 zrS$-L<~xbLpyd0;E^T`-a7o+k3ck`2H9fQvWmHBi=f)<=)`3Ao81zZ7$kyShq_XIKJuCgIF+nh0}}PF()3#BNC}=h%HYF5Qt}tSa|L{Onvk=f zl9s%utUABZ+(FQq|NswT#DgP%xL4v);$Nol+ z!N+nf{d6u-3aM)9AEXL~huF8X5#mg|#{R^cUgPf;TxZ|Kmf!JZqnc1=A0r*yE-wtf z%45#2FBUNbPztZlV_K4F>&L%muEq*N4=)b(BeK`Jl9XB0Lkb}6UQ=Djn&tZN#TO@f zcjEg5`|q?0(_cH6UD7?i5KU1m_ZZk;xQAHhfkVMUDlPnD1$2PF{sKI`iCG8Z+j=B$ zWg@;W--Lq3#DuPPa_pk#Laa@xc@xz zRtI7hocK{lvj_HqbD%}S@^69ezdHyZ+7+{r>S`>upFlB}x@xLVg6XIzo0fkP8fqEb zV9&yo?CqcyanE*eU)~6$wtPmq7~PO?;sO5w^MeRJpMC0jCQ|<7rQP4fb4>pD@XX3p zUvRpHBx3G?ugiEH%bnGVQus}L%VOcesr=52`l51oh^)nj^=1~MnjJ3TkOM7M=Ic}H4kUX8knYbdAn*rBht@mlQsrPkk4sC-3k zr+GRRw5{B)4bHR0e*z`jhyaQpru;O6nd=uPxji%fUweMdFz&cD{c-=$QtbOL5^Q3q z&n&sp!vy#jQ|a3@eePLRxY7L9nhn*nonRq}u4pOTlv7CWS_^Fr8PKq5sW;Gz_y_Ha zyL+gfsluJ)o%iBQpHgD-yh)P@>(;~06xDg3yO`?nng%%@W+jW0*ph|3H93i@=rs+~ z{K=8^#FF75MRBjk;20CojtqgfI#!2C-!A_- z_$R^cyT`+^zMjjTCUSjjtULWx3X|9SHWXb0rs0TwEQ zkIkgkEGtss3)hn#)~|^G;|2w0lhEKkNl@i}{Xg6@T+|)I0R>om+*x>kWR5lL0cRn} zx0hel^wsv?hmE0Ae$Pp|-rmxQv5ghBsTyfG9tMcTLPj^e&$P%AZca!Y$~i<6QnY&_ zEXT9Y!dT4C6iK>e(NAdA+3cDb0OGtVidb!$Rp(B6rlpm|{W^j6KtfsIxcgi$)h~)y zTv5hSe@kVywHsa*(_phn0`18>n82#;YBfuazV{=Z!!44vI|2K-qI^iQsWm7SX8AgH zrnQ#i^Jc^qk;PW8^81AEJ~`eTYZ|{JtMQ+YOg^{t3%P!NM|$hHefR3eybA|oprugj z^?JZLFQjk^ib?bo5a{T|g)_F6Kt<5*>vmoxw?;U)pA6^5(OZF`OA6fgUOp z$q^rBWIlc?)EC?hZoA|igs7P?NMNnMGy}CB0@5gEu?79`cHL(d<}=7AnbDv z6#(C=gwnbuZ1R<*_TVGi=xMFy15CKy3)jKDxH39D;_sqSA+nfHr@G#|*$bHidN%9f z-%xXJW++S<>8czHxlwoZ!mT9PGyqX;V#fileQk(cS%_&<`(?3%S z?ACKX__g*^4W@2TD+K4V_i)|7J(6DHh}ZSYPqcSbxyw*|RCSF9ZsN&lOez&6db-h4b#kl7i4LeTdCDQ1b-_|0e35eFN5cJJPO;?)DGLu&7 z(rL}cpF|sU7ZnCtw{s2Kcz6o6Sed{tQrq8Cn0U=X^(bf))_EbSheQ3h7v<_LnYwA) zBV^7=f3mYevnqI2mf{4?cGn@1dvU8p$Dv~Eq|+-AoAjt7aXD3KjG)!pJU{k_tTRi+ ztEdrjQzTf7Y#DK<^LVP%Qcd(_2iW(Tx6+$sy8o69IO1GOq5sR~TGhM|!e0a&5r8M`?8L;Kt8;9}Ow=z1N#vlmO?__$hU^pHA2HL9O4x=_=YCBUEJktVUKV`Sj~a4n$wbLZ=P46wC3Df zg`-4Y_GDPj-yhl^!MyHkhLVP#sYma7ooI*ZxZT3e-GP=$)dk*|NO{>~m@?KA{3Gi? zQ8<6AN0w=k$lF)$r{BA`fAx%AZh5%1WzTx?gV z=9F+C$s0yXJT{oMc%(p+!;Je4=wk&1lp}mZHB;GIT3ugzyjX}Cpaf8J%t=|d zISsC_{)w`qAtL$UfAa{Q`P%hMK!`T!kX>q_DmvJZGa)Ov78E}ME2ZT&UO06%|6ogr z1pD9>sg+G#*-*Ust*=&=on-qXw^6yM?m@qeRc_ZGA5+sqZEn%V068%sDq=pujRh;K zifeJnyUorn!|>*BnW&AtR*RSyIJ5_QSQ9DGB<{RXNJdoaN6S}#jJ*HE;S5=2TPQN= zeJA8@$sRpdp!#WZiYmMZ6waT&sdJIa>n!p?r=y`ZV1Cd(B0Tt5Vlx<9ig+(@X{#Dd%A3przgnFo3C$-s_FJtz^!iB0?N#r zYqx?8-cwp^ssq>j&C#lt74%>A>Yx#*s z(*({c0jLxxCPO%muX)+Ss&dtRxj9>FatyN#P0PzRdD+G|&Xh|lCk2p4t7dj{2E4?L z14I1-Cj+s?PpbrImzj@B2J|*75Y<#eZ|1$Z-V8kt(R9z26q?(3lY@#ZeJknk=p=0T zLoe1jO0@oBn{koM>dJBR%#7!#sIE5#j2Ad8>fRxiOg17L)@$5AU|`I{N$Eh3fMU8IZ__`9)Jx`;bTG?wEDEJA!zmk+%JwYFPI{$YyN3!g-FnXScpP&6_0@u@ z)5$zq{f}dm@hVX^2_A_q-c~7y=L$slPmk@!KEv^zQ0K6@)*CH#W_{YV6MKEF^}fui zm6Ig3iCcdx5o4rYUJJ>p=DBb!jm&c|b7u?9U7uYRH%m$J?@m1-F@ zy1+OKl|H`Bv1r2{!p zWuEGP4C880cqrcM3VF+LNapNF50n2_CepRNk~GkP-uI|s-Sy=5_0{5xp;jYH8kE0; zg(+mdKyFa;)fv-mKJ8Ryj~iAjX%IT`;Ng%i&zxIa%`LA;uU{`M4mC^%A?Wbg+nWMM zE;TF2vavB&?p zz?15AhaB{M%7AaCa>1vvMDrv6%Ol(~_9cI^!UK@om;3;m@KaV8z z@OOi;LfOmuSg`#gR(tz!yyQiq@;z%r1TPN3((vElCeyKAVT-@-`%Yt+q;bE7U0mkghCLw0FjL{D}JcgFgL_%Ld@WQa#8 zxJTjmdi8xi*<2UQu>;+Dk~Ve#3;9#}qG4nUb-RpyfjNODd!ka6>tWX-xyDY}k27Yk zpNDOT8SIJ@`EWaK79_Zr9zOm@;84kR8d7UC=Y(7+`yVNEmA@23M z^#b8*)nsRiOPO0PET~BOAK;rT$)t)xwgJB;eJZymiY((r(fiPVx@$M_O?2SWaleT& zURS+?l5C0PpgG3ZIHW=28Ee}xm=-HS>TZf%PPk5gu1|K{*jBlq3)}|n89O<6`}22o zuIolvp`nXnq<%lo^ZXI7oddd#`&f@@y6amMQKwW-#3ge3Rp(z`5kH{co#7t=@Ynyu%|q z!@iW5eSNq4fLk@Y?l>{N5Jlpk6BH z7Pg|vir%Cw;CxN2%~N)9#9*D5zw?cdrAYqM@e``C)t&9a)gK%x5p^e#cDm{~S@1ve z%&Ra=RL8YP`1wy)uOX}F`~VrPLlgvf7te0%-O7h#bE@5P38E9DF=Yt{x4q+h_od04 z_OE1)_(?0}ChyKtoEk1MCpbqUvo;YsY@nbMN!g zr+*V&0m32K0CJJxXTJ~tmtSUmwDdMa>#z7wcxSwz0Gp-Buc@`Cp(hqMfkiW7b8h(pOvo39Y;B5^J>Ran>?UrSUGK)ajO*KsNMW7UA zhc=c@B_FQ;Kcdb%n$17_`>|K;qPAK^jjFwZwkWE!Y7^Anvo=w?cBxTYt=8U~Xw}}7 zSc$#2*pcMP_xC)%^PHTMoRdHAlau?pU!V8&dPACbJltMxw6k9)Em<>1x-_g9WHxe7 zk2T7iJG1X2UgAD{^KZ?sMTWt^H#^BL7%T^=>H?P54{3|+F92v#Fp5E_*85tXhYd5Z zAY?5rAXFEn557DT{_gK1s@+2~5>s>epv~7Fh-xY+*ZVnxRDD_Cb}Z|XQ}{KEEq;0_ z=IB1+P&S;J)n`6`kLZZfO8+bRS6?o@XfszmItc&G=t!A!qb4pfyWP$JkRVfmY8N@Dn410Us%1EZmky_4oamzrg&vR7i?jmGrPxYlk!{@9QTVfjoYQ~)3@KI z7x}MJt7(RfZH6DxvdzmQRYbj5cw3~v7t7IGci+d79)S|ZA0@(9PFm|%6eZ)J<*qNg z@qR|n_l+fLwT-?x;c40;x!N`^^pQ%cns7rI*+4{g;lG-Enc9wGnn}F2e*qDjW^a8j z?lnGjEVkqzq&aZI{cqz+GM2sNr8IaVae5wI5IZBBIs(*;&-gyvSFX_kl0F}Qx`8>8 z8NP5(GJ7uThX}sWq#+$+t#RT?7daMbpk@^!-P%ix${QiN*hlGAcztiyO1jjKeH?Th zKwkT-y6~3Pn8`fGpUT1<+4Lwn%>tF7dn1C;gsf1OFG#FbBLTpHAw5Pc_N;fbE zYiDUyPp$>m56r8t3&w(5;-usuk5++7kcvZE%QeR~POsr-rv z!-7zBb_I-Ago0gk1qXnee-tp*g3M16d(O(f@`CO2YiTr(rWk%iOzdPIG@mThMEv1` zuUqfP{DHh7b-f8RQ+P1|@9BjeA@9{nfr#yMoYb1Rl_BrS4+u-+(?3yoqs@JHrtJ^U zXBLS|zipkqyT$8!g7@aX6V}WAH74vm>L#4j%5~*O3!f3HU3B`%rSES7yLWau)ISXc z>Q?oh3iAkAo$s+j??&sZQ;jG#)-aCREaRTLBk<9!90u(!MI*%}W-CY_3U#&keA=?Z zPWI~XkTGfM$p9$3Vt&8xI@ty2rXUGr+fA)$gnqsC{+7}%oqMoEW){(EjQ|OM)uFr( z_R$8{IBPRIa{yxcmcRp*qrR?)TlxGJNH+>5sZ9z{3TNk(Ilih~7%40=2@MSwdZ>up zKOvqh)?io6S0gZb(NLp-2&Gc#V0+fP5JP{@@W(t~Gie8t1^>#cvZ=uL%TczSH95Mu z5Y8sYoXjFRtYqaTU5IqHBj}bmPbRk*)ZegsZ13=&@B4O;7D|3wWZ?FJyHxntzY27t z5t>ums4q_U^^aR||6>+BVi0lKlZc_D5ln*q!NpNyu*ch_A^Ukvset@4GuuGRKdC;; zUsN|`zKOyRDPmC&vmhyN*Sx8F3rqzMj$_xj12#lzYY#+j2ddMYEvU3?$34YrYzuni zpms?l7L<3iXmSzLmjt07F=xo-bN7&L-~d#diq%M;;PQuESHuV;(T|M7FNZM~ysE@tLj7GFDHA(P@WzK5Qc+9Y>{_9%6} z$8^_!$Ire}!+h)7tp2jUV2x7WMcggJNYz^Jf=Oeto>LUx)*9P`7`ndk-s3*AJX$RJ zRQL^BS~Tml#;inWKWL%ziauXdIj)2hH2W>`o1Ma)QeEY6ina6`VW#radBLOp{Je`F zV(bI1`Hxsp@Xtp5o|)QFd-E1s@Ty&yu)gH+@kQ5oTTGfSGA;67WKeyez1>g$Ykr59 z3bb6UE9K)V#i6j?dkrAE77-5Q0QA5X7>4YGJv&T(nO&VIU`twEgy9U`!!doSr?b4q zee`de+Yzj;o->MT`T(_q%Dk3@zQs4FP>0=e9vW6vo+ zYP`NXbk1Xod97o@^Fq`8$R~&&7)3#CYvR5dQ`*YTn%%R)zLJoZf7L zmq$}jBa#YZ=enl3XG@+pN-2uKCRn_o4;S0(8Z$*QTQ}wHDwqlN&WipU*Bw22e(Mmv z2M*mCBT_M-8_o`r(9GivPjKaoC9syCMr%ufc_L)-B4A@mnT5zw`u#InKtwzIJ3HL( z)HnoKRy&kLi~Bb6chIyIi4sp=w#NGcR)5Su!di7`8S^W(g*?e1VzRIGQD}X5q3#-h6CIBg^#KvWp7WGq?a_d*{^&zof>&D|=JKuC(E#H~#}sn( zu#_a><#_w)+1&`4v9q;*eRlxz%tN)iNP*R+QgN7Q*TUVkT*+4a&JNtcX+ zI68=>*zmt5cNo<0@;=HG1Bz9Z^5M;Eofo-27ghZJne~Hda1G4l-;GqT4E5NxjHSyCE;=0BE@kyGP&GfvV zT43ppa|R+@RikLKIyY5U-X~nhY#5f*{ItLJ_+>eR6O_7~YNDJH+nb|F7#426H%Tqg$Joe7weeCS| z8%3Gjd;_bsj2>EXK<W1`>2i^1V5CoS01If9e;F3|75nNG?`w08#FOJR=_}1YewsNc z*`=d(~^3hL^uJVYVT}M%IjJk4XWR4x_8G(b%zzz2sCv312^GSc9Cu zqB8E!DK10FYGmVZ!+{qEJ*tB9x%1pu-pq*?Gz$T})SFSr=SOD+YhR;xHXIs2r6OR= z;Q^8zEElv7Vy^1>7~8>km{x2*nlBkVbNyUyU)3;1*k}JobmPuf_{QXpXS9OJHTgp& zV9;|gCL6kBbzK_B_p;ndIcU^i;ds1(c}Bc#9-c%Q)cj&2-paIl!pdal!|Cq_1Y7*Z z6PNV<%(@aWG14eufgiZU0|fQMF@=g+AMkRH3fc(zC<{HM?!}F&m+iJ)4{W!|zab<*<&Ru_@Q3rmcmjIj?$1U!>KVEzir>{*_HCT?AJ{-SKFf`E2h{^Wov!cdN#NLC>_L@+Y^7-bpl>G%R1XG_Cj#Gy7Z} z^x^NASqYo>xexi-zq%?c zu!@y3;_SrLCR&+1cz;ggv*rPPY55fIUAm5Y!YBzjo$!B;{Vf8^tgkJaHdkJb8Ogd= zE=ui6GOm$Wq~0VCm-)QbsZyn4NPS&P{(|QNX@4$SqPektW0VrxRJtPNqfykWfZV>V z+|!%W9syAC@6qyTmQ7Ag3k}eA1O-?tp(UFpVrDaN&5v#TR5oes3j@_F+jLda4*|a6v zz6$=R=@^0N&|CR6rY+%#IW!c0@0#(MX`Y3C(#!NHd%WzxY*)}T*LmP2p={Z}hH z2%iIGK0}op@2X&5yp7c5Wlt&Y5pilwe;WNEq$gc-{7OCUvOPoKMzS`^9#Y7yG>C7 zbLO&4=Q_C_lYt-q7=$i=q5Kt;{H=V3STL1)ewvWTeFB#+{1K1|{mfS&%9W9+ydKlI zfd2r{BU{CP^j*{_z$n-v|7^i$%kNHO*{NPyoaJDf4Qgh~9D?eCsqZ7~6*Gs}whu0x zyXrHqE~|=bC+MyN+d|6t55>(XKU0Pb&nZ0dZ0HTY^yA;q$Oe*2dQP-d=X zg2#;WBP8tfcYRX9L4^Ie!<>B&qTVt6q)>5$({$uHK*%^XSP5ty`)_0%u5ic({ z9T6MR>)vgFArr&%c?s~+y23dBD3$*Hs~W|O0ZNVqkilOoDTxM6u)}+PL^SKSOw_E? zFLG@~=CQ<9ORp%{&d5*L1En%25y5p*>0Rs4siGK}P?LaY%LBYOEQO}z* zRU-BR+Hg#J)dcVYvw12>rX)?D5i6Ajx}k+on&IgH-fWu;Ysb$|{`o+x;Jw&$DksF< zCmM4HrCuI5p8l9*swZgjn}+%Gi84I{-#mv%(x*8hH=lIIK=tlqlryluO z>T#H+#mwP0s(I6gp;7*9rq0W_RYg@AEO&^EL3B zIRfq8iI4t4Jw5h3GLePMcQx#ea&kTnT$JzvS3$=DfV~Xg`oC1XH7%Z4`6EDvUMa}f zoJVVYNGtCoXRpDnrWO|d{|z5=qJ zyrb9ZTCyS7`BJS;Ca|;K!)YVgCgRZnJLJ|{>F}p?mmV!cRgEH!7qFUAxO%L)KM_S)*9nKRe zQj6zZCG#72FI{NOdC8O~kzN3VtW!g~<%GhB_~s1daMQr(FqE7}Rfl^hB#i zTW-*%&zuIFaio9^*eoU2krnX_+)-C5fEbt0YgOz6#cgi5G7lhdinwXNoNpN()`Wt_LCwJ{MZRkXppFy>=tpL=}xeOcBF5ZnWziQ zS?sQB~MaHeF&9LUZ8W#EwJ<|V-Ax9Ln}Ex)6~5(g)bCXw$@Gb zLo)^(!89Y^1IiYjPa|5iBXp)FzD9+;!E-T2U&CDlr&3pyboNx9fbOTb-_PC$2gkJ= zph+CK6DEmz6?y$K(RRxBvtL`@5tDP=KURp-5OPDtP?;v#=F~a^oQNCUwf>9ACFYrd z3{2Y(41QKBcMt^&Cvw%u1^D|%1T1cG>8X!=B>P?QH)1~tji{aC=;oeU+t$2qz0EnD zbjYkj9v{KH7+3=54MIKIb|fP4wYHi_<#-fSggKwoz+LcweH6@Z0;9 z5W3oQ_dBkQw!kIx{LhMJrpf!{g8t;2Q87NZdWU&YxLI5~a`0_BBW(wFeA!>WS7qPH zdNmeiYAwbMP$|A*$@)1%j2Y;9ws_#GRZS~Pd=o2WMnKXPFZ0SMR<1;uu#f^vH|Qs- z45;)=FvNOW$tfW)#G*oeC$B@-v|0I6E>j*MO}ZDE5g8*EuKfdt@oIjUk0P65P&glQ zMb)b1b_gpQV~?@hBY65jZE)P-3q-ra)sxT(A~%s z1a7F)^6k*s_AM}+yv7GWWVz9?-k;gT$)}FcqfrkXCB6CkSiPPx`ym0#^4O!Nqo@#M zemGxP>HGT0iGem7pQ3kA!qH>Zm%t605ydd~TXD6GA3>OkTQRzf`Gf}QL%dJoVR&Rf zXeSSUC(q=o0K<-q6bI4U^-Q(YKTkq=JB!`hO08_m#&HBnlc}r-Nj5E=FWSQQ1-cI1 zS8Yd^ODR?DAsTguGwS9ombTfsB3~rX-=rIYEQg(+{iN^{2_e(F9 z9FelvsXX3qdF-Bv_9gK9BZ2s&ZHKIRYVT?zo~_ipi?Uu}ipH0HLbr?=rX*o<&u>C? z-4nzp@&=X@zwk8U(I;IR?9wumr}|X;f9p4c67{}>1hsDuT&1tJU+D0jZGI&E!(B)X z>hDj~^{B8PLtn}z+b_;dh>66(%7#H6vblG;Atrg?wz>dRUt#L5LQ=nDVAoAv{*wm8 z>ucww!eIi-E6z_h6yO)IgWluG{pJw0rM*XNQ!%m_oGLv@9xq3}7 zvbD|d=``+`0OVvOqi#NEP0WQ1zcn@MQQ>pd%0Nl@Lh5pk;{W;Et_gPn&fZ8`^4@@fA&dwzg9`X}Ol#@MtrUxR{ zG8tFs!w@F8&!0i|4r*5zjCi)oT3BTp?N*#q5B-NQ`!JHgw@^2B>0C*!D`(eZ`rZZ% z<$yMOFW4(fbK|}l2BMedM*%coPpX!%pnZ7R;ap))p@Lum^u@XMX0m2KPZ| z7$|U1Wj-X}^==3fIzU@)VM4`!euSB`p399g^L{j`&k4H~*nZ5bz_j>!MW5ONkk|>z z$(Q^2f<|=jq0RA2U+KCRjTl|>w#Y4QYGb-$H8pBJa-$ZnQgz`gXRJ-vs9J!terWt$@BI)>c?j_B8i&h4yJ01OK{9I($kF=CQP2w@{@#Rqf zMP+#V!#5_XB-nXI44yKZ1G&pot*lz*y6=8z1eo&1R$kTvK*R=9TTJkF|qf9t?D+{hI94I?GF0-h`K@I|5e;VxNhS-~Mp?XcrC%o4Ex>$sH7 z5-D%M?ClAYW49?LM=0M<*w^;^M56lUwb(;R?f(b2i=a;TaVa@gv@5Q!O8#>rXMZGUJZ!BzE-yCjn1ccA0r#mn0d zBOjP4gU8)jzvpCrFtLnN2SoXZY?;MJeIBSh=;GVr&wW#buGKH0ag+G4U@M_EhoYGR z*q2Rf|Nc&kZyxp8^Cz}=*fe_s8b@ATi=OckyJMS`*_KpaqwSH5<>Ba*@4ad$9+IG! zKYMnCLtL2h=1+vi=VZBII&l4W8?=W>mMDlq5R~VvA!Gs%>~(3dEGH+URU1mR8h_c5 z5#Zb6d%1@Q6!G_3(QJsjooaHht@^?2m9=v9WP~!mm!iwhWug%;!=FD%Z-U{#yyer4 zn}G>awh|=khev5OG2_rS@<-QrL7 zn+M%nE@#e+PTyb5@M>YoZf`Z;H&W+Cc(-t~gD2L=8U=-lh(Im!aT^FHu81lKR{qL9 z?NDt6ilYx9@b1|+2=Z?myAMwtulIco(0lYOtz;edg^hTyG5WGU`V!+lvv4rkY~R}T z2`XoveX^y5W3kfAlH9G+cmLNZ2U+D@zHuOkLU!wm@!#r1{_Z?HxFV$&Ig(* zm^1XuG&U^>1NXKZD^6_S&3`5PBo}Q7W+k#!nLb@!TxASc{$2iOL#iS&+M~>>2sTMG z@)x8u$XKd#uw@1p8c+d-X{A5U`2hES^cx+Nz8;GQxLY^tR6r#ylqx8H^}pL@FlK=? zzy^PV`Gb=lTpw`2Ad@TH6aBi3?p-ZJH#`>jGwP*nD`th-L0S+AzT&sgF+k!*Xp}Y% z9BU(6`)luU+ZiH*ZjOHAkR1++U7LN11MHxzXufvXgFi2cRGt2I;FYw^)-S|7aPHNG1!*cg;tfb z%MYO+Nys^gL9dC_mSd6=9pXr*;NP574ze|bsf2RrlSSD4A0dA3q=$2sheBGiN-bZ3 zk$)vT{6Qnkbf+bl+?QWv@d2W!#vM6KUERf!CR%`z{T%XQIcE4YzO#N*B|& z+Knu(-mPu%tw(O!pLqYcdibzK3I&@9ukwZfX?5R}jr1vCK!$@@dT@=kgy&WG$(Jg& z(s$>_EAo)Pcu{k{HjrJ>+uL9kd>6M!C ziQwioG5ai2DL0W_!O-)G*R$Cu$$T;NIT$>Dd*0k2BH=`WV?kKxd(Td7l-D7sbFqqe zEZR@o%QIaJ!3dJ1IMqp1-dFFvM1_ZLShV$~GXMh(0Iv$+fPgHVxbgI`za<#zJie|>H6>WF`5jAcYR)&#V z%ckp*gY((>9fg*_6HNC_NRZ{M)WnFW`T6Mh(X_FkLG_r7NBda1+fk35{^uctKVJTl(3%d2JQke++th<EXdUL;o;<2wF;`^;`|qY zj{|(Za-|T`p##i5q~U3$azG0KQ%PfnG5Pk!I_4xaL1_hD8TL0p{Q%ydHgjpQOU@`a zx+>?n_1iT2f9eM-{)FqXrTSopO(%6fIaj*1a_!tb^0#P?&{blR;=|>5R+caS_56L} z3c|O*O}cyfuPT9-yGwdk;{DpwP+#}R=!Glc%6+5KRlSsQQ_>$+eAf%Dw>N8TVu9OQ zeQjT)LYi(a;0Sc9bguu&Hf$|FBT()JFO>n?FfAlGAuZ3gHVnLq0*h>HDVVvQ$yFg9 z%9JhEASHv}+!T&wXPE^xC(le1DiAI3E zNCW22g7Zfx0f51$UMo`l5IOnro;_lUWeR~8y_363+i2U@VR+m*CoKN@s`$9L1$?NY zqCgRdB>j7Hy6&e&WM7{1exh#s+bZDu1(~f+?(xAh%tG zagoK1k!`2*;Y0=WxghEiP#LaBaTgErBU{Ba01L%b0TdW2A*AxD{I3N}c;5VsM=eKZ zcEN9}S&u;EK4p2icOjXw2gOIi*Azhbmtz^U3kK|i7}T&{XuS^UxM#EWGe)zCw~QuC zh#nf7-Mz1olKmI#ck5u+SVmxaH8v{}2MU&|Ft2XeLF5zzmS7W?j(Mb1KRDrL3zS|- z=I42R*VVz@W7@(eY=C5Rm;1$1>2HzF4n~5q6oSfwjjA{%{Kbr7b-5@ii#GwSF&{uo zgZsv876ywBKBuy_STIl(Q+*`{LZEq z_8P=#x(`-klqfz-|K~bN%rgOPx89w-C^2mJm}rn;^LX523^p=}60ly#m*9Av^^A(P zoQuIm1%l~7n2GPv$HC`ASsBYYAMa+u z4?=u3(xH1plIx`kHN4yIg+PQ$c2~B0#kwn%k5qxfwM2%Z`S!)#JgWPBk0emMiV>f~ z@G-U@tu(PoEUC)r{I@s!>`Xo?2Hm8y_8c1GR)*Jh z-vAceQp%5OKtfhIv(OLTuRdZLblpTpLf$JE`iV`;6jbOrxJj4JE@}A>5*dUSfCNqk z3yaAoiHpVlwfHI^xJbL9oxT$r1~MK;PLZ`QdJV7vjp3&?IA(#hf2|vAeuX_@B&IFj zcyqjRCZ3&pw(_7%&A>O>+yx`Jqee?1e{@lppl}tBx~Zx;4!#RhJoz&-Cpx_a+u58w znsQ}&3E^R;o*EgeS~6iOw%rzT!}cq^gFsOM>P)h!hCMS5j?LE_?cj_7)8CMmvLMw< z+q0|oK0?6ZxQ#!H`M&|SB-O4FMO4te>4Lo-{x31jbJ3Ij9h*$ZBKN+Xl06)(yD3hi z&S-Wu;Ft0(^g`z_ctrOue>=_r>4cMb!Xo%JTEbzOM|tLb$xv!+(n{?{>s-^G{^?t5 z&1|P`br@vDDtOy*>+fv9xb$Z+^xTVTC;F{FQ}W@(OQ;Ai#r2D_!Mvivv&0PqKpgUH+5CEsK2YUGij#ZM83uZ`8cE0dWzeNMRN zeXl%OO=kuVxzo7q(cT0vz;<}V!A|D9MM+Jm8bQV3OrPQ>O!Nh+rN~aM+pVQ%BrV5J zUmQZKR^IdSgax+8PcuW_pjZE#-|i z)j2y|W5D?pTmL4Fd+kl$Q+AZpO(}4_?12if%ftuSJmu-V;Yw-7Cf(_O^2m)Dv)dUB zx)TqfqhS5s<^hxUt(g#O>2h%fCo0yTw!zu<*K_;O!FeE*fRIQ%S=W>NiC~6~@}O;# zHv}EGlBXtlweKje$e=y=H@>$ff>ty3+K0!(a~`)*0pj91O5cG?*N?~JKs~8%aZ38E z^Qz58NngRQro3-Hq&={14-y!n8=@>Nopt}MATyVDrz%CbFslzQ%^tEWYd8+^x0JyA<Sqa7R9i_AMUq;NHv|=IhQk z#(si)1jpJxQ-o8v66=l|pW-+alBT}mV{F5i%&m_$*s-=8CSE}*2EOfF_+r-1yIO}! zb4OX4hl`9Rl>H8U3cB)(jeDEJ$@UgE-8+KMZj$475{~lB`u2jEL~gt)s!W?NM7o>i zxlH=H4W|*8UUe6zjLiF~junb+panAk0NR#$Jhn8pBI#0}yXNQAui&=*8h){m5*FhB zHbG7KJ#_hD*mY9}Oeg{{R`W+pP~q{t~h0#ucR=v#iKp9Rz-+wO_dLvd69xL%Ej;bi(1D zDEjiAUkOgG74#vvKM6F^;ta7`_Zmn_9g@`ftks|2F1E}ESlnOjt&}9XOG~2m4IrRE z)PWEfg&LhxXfKh82lnzMK_S;LCVnGET%FgWt1C>G0o0x#V5up~5p`rxz$}rnozNabuj!NDsY}i~M7tKJtOU z#F&3`CXxl|vF^KK*p%Cs7Z34-$u_uAP^_3kJ1MwZq|A}?qs-SBtB+6!wtFZ?l-bk| zOB1GG8CR$g-RtOJ2x2Qp-dFf*bnpbD^Y`n4E~BimcS?eqCo&VQpZqbxpZZ_f+DDpD zWL&-UO*+8~@&7ng0H!bcd4Q;yJ-S-IG-AeWc!J{t*uPs)y=9rrUz>mGMhR&lpeL9g zh#Kv2JavvwAWo(c*|(ky`bj1Io+qJ$lwsCKY41u)mDJNIMP9(6NM(r>L)Sfj5ujYTHo_r!+V-JPMLqKF#?Q=4Iv<`R-xvnQR|l zOWkI%$R$v$$e@Pp#%f})dt__^>2Fmt!2cb zNK1~>5VSKAvO@`|U7mNP4tf76++P;*JSTaYduU+q<{wA8jIryg;oM8H)$3 zYV1a3IsR^(2`H8xPCiKQgnUr0AV2c3HCa-^=Wdf-2psS?+Wg2%BEB&0Ynx|l66nU_ zxJDSbAeL@(c5}OQAs1BcE4e)8%V1?ChwjPCS`n{qVY>q#@3>)V-Aa#*J6*Gm?CQ5t z(NtH0QLZ#s(JsqRO}9TBDus}p1{wMt_4FaLseqfMJb(980>?a%Cb=6|k%Y-RIrDcE z3yW?=H9O~tm-C=(AvAomt{lzB2v2=CSu7 zagAoo#TI(|pWc9dbktkAg6a;`)2k<~DGE=_tgCzPWkoftyP|9$uXHL* z`N<$HBxxe{Y1=Zh(&}`6jQ;jk@z+vNkrp*qPpR-xIYl3}9GAUPma2qwB$U z>X_}@CYC>>Rfy}>XMX?8ITu8SN`bdoW*5i3uteMjX)+UI4!^5l z1pQ3oJ*YhOpk?-hh)#clizbH(P}2loN##}NtR(KML3QiFwEJEqBaRJsKbVsKSpMW| z1eey+*;kK?4MdHHneD|Cr{^1W*j{U=Jp6mt#Z%q#X(mM1=lQE_`ZqqAk&PsPuj1~6 z|10_U|1_i!OG82;b)-44)PodDLrAeHk^gccbXYDzi%pNvVkrp?_MHYhum0m+X3hM) z*!1FONAAfl45(dCpb4T?vv7`0{{eFE`^^oonNY=Gf7|bVv;MiElnvtVeVNpO$Ol>lEk8R{skC~<19n9s>O0|MT((93DUer}-Jq1eRjs^buaA(8kf_5iAzMkrCO#STL4^8H}Wg zuNNPypvn&3pWc~5j}FIc+8x|%7(tL0Hbv0)W0c;~7Bb_^;xZ`k*u`yzXv8Eq;BhdQ zurtCsuwE0fRJ!5!?|oihL#w5?=e|VOeOyXE+wa8OSb_MmjQz*9(+tApNm z_;c;mO_0y0VMM+7gmTF@3}i}1 z`Yfko#q2;@B{tFOPHD!>F@N*iG1Dtwf!S?7`RGnezgn|CUjn_I4c;~vfwSl%`%GG3 zA2C}Qrsfy62GM!uvM$JmG)r5)d# zr{Z0vnTp$NAPgiv7<%5M4Olv#3Uu33UYfp+aAyFFRldN0o&eY9DRBtyavNPZiD{L1 z67LxWRCpx!p2&lAh8XY8k1JV)jD~|wokyJWyAm=yYF{oc8!Qo?7pv1mYKu&`L>CQQ ztSI%2ydIwft@&QrxU&%{yx*vU`syfxAK$JQwA7JY;|G0SM%n%p=Dro`5Dw*dlVV#D zQQ&=Cw*v8+>F)`P#*$&R@ohhI1U|IC?wOR@JNblK{r`3skyjyCuA^9oJ-+Pkffldg+ zd`Waojk}^Y=-$lg4m5zn2ZSgJO~ab+zwwT4XwccOzl*!b4jiezw*!3WK=<>lE+f96 z@7`M4F7Jrp2(0pEl4tIn_X#VeS)VE(wvm$cb1%Ry4Ng4)MuFtTF)1M*ot_3HndaU^ zIU`K%_#CZ0WuR5geunW!>pLg!0&>rRvU8qOf)TmYlbH`9?1Ulz*W z=1~ck)nP{A==!dqv)kJ~Z3Wr+!>zh9H$-#YL5P-Xj4ROn(`AQRVqhGSsY+o$Ass4a z_6ie!&=>jp-en)GGVYtysC|?Ix|V|)QwH$LWzM!OMHxVl2FNv5 z{XxcyN|_sLcNpfY_?84_xU4&@Jbuqkd#>qPm|`=Zxx-R)4YqdgyQ2^su{Tbiv`CS0 zCeFSm;(L9&4?W0$)=Aapn64xNckZT+j!nARo0tBjC?t^p7%siOv$3hxBbsZ70m2VZ z8N5j3+IcMNu=5w+jcA{!8A3JZpGkY=KZ1uXQy;-iADYug80O(hi#+5jRzL!qrwa@d zF97i`6kbFqASvkz+wt+=HA@@VxEy7iEMSqCq^Gag`|*sF*PR_{52n!HKY{Gb7eCB> zP+0%7k8FLaw`9HXV!GZ-0l`ve8^ilrH^@~(~cg_T4n({-Xt z_6F-}-{^4`OXP8pZJe&>la@(1)A9$Vx?9-!>4)6uh@a(;%gZkw8KHU%Xjhus;!T=o z6(sYBOqSvXVC#pb&@-r(4}ziHVxnRhf$#JY?4Tq0Xf*2Rl5U;*JL*7oiVScA@D6NA zQyzs>)@}?{S4x|;{!+X9TvcWz{K6E#QCn5*yuy|O`Kl}IsI&jLV_1K=%)T3P zvfB~Zt95xwtH%A;e)m_Ul+>Egq^VcYaq_>njp;QM=&R-6DcI-de%_P~M&BQ<=e2+$ zTJTXth!~LpX|pVB(YWmhy*4rF4*I0gbT%QWDu$#@ceHRy_g z?sVPpiZ^K)NKTMZ&3lTwMI%DSAL^5;_Ml*g{;G)IXHjPzM_pU03;6i*9%IMnrDKY* z6@5!}n&En?hO(pxM%9ZN`7Z$F<9+&P2~&C%;!o9acUOb0$c3+oUx7m4wpxz_ah1%nf#uTyx!$|E38F`c@|F>1jq*Zf>`37vFk_gEy^`_9Xs`nWdK} z;c@y^CY{>7oWa_Pv3vF$A^|m>kLKTS?qTbd76{}1Dz_=#tsh_X+{0b1uFwMhU$iAI z^YgQTPaP=dOjmM3Q;2DQ!K3l0lE5P%?Y?f?SnIpDKn<;;?ZI*@V zFSU|7Dw#VUH&8$PiK{dItQ|~-U7k}AGPC~^W;YxM*yp=gv5948TdiQ0v7zcGOYG?e zmi??^-?0AetCQCRXoM6VVCoWZd=T=Fl3I=Wr&4x{L!1&XrtrZr7}l2l4VowL*uH?M zs2Ji_lpB=y=Fw}xvz=}myRBipVC{g-<2JHaOY;*ZvpqGoIs)C7*E%(xl@{}qQL#?? z2;g%a?BC}buIP%WRV)7p*(H;xzgTK|C2;?s_D5aogW@w<#l=$a9OGQn||gvDXR?j$^+f$v4i>?g{i^9 z!03`|RVZtFtLydb4CI<6MvcCGvZG_tYiEg4W^jjKL4dVON#u(elSsVtw(s$1P43j5 zy=;kRR(vbV)q%oG+!83{A|tNtf?>6O)(iAK^G0BG;J7ousXMhl|D#)DC}9bhr1HlS zu9m=8VLF2wfz2oBci{kP&VUOO=iNVx*eXlrWGdQDiyv>`gRBBInnLQSRsjBG6T1C> zWK|f>p3g@;B-Z8Ho{>Xb3zDJs?h+z4UNH8Lqbh`Wkw*Kw`ai{3yZhk zJuai&t{28P;CP~znW#7o1;T~Wi{-R7qh6WaO(@YhD8FP--hMy|-e4H|!J~5NGcunw zX{Uwt@SiUEL*mH0kcG|z)9uuJUk|Rtqws$V5AM zAS^RTjXMvR0+!PA!J0IU7 z(*h2~R$!7HE@93iJCFK4$_Qht>fiZV1xCJlM;Co<-NenHbvc}+AcJW}N0QvVD6<_; zwQw@Q$s{%dC7ra{F~&h!x1V3E_a&*AZSIgK$68j|6MS(1lQ9&vH4q{kjSDaMQ2A$h zPE9=n@R-m^KQR*l^Su_#i8%kw>#L{Io&irLNyQR`>&_!SXSx2DXWK1`j;K2Xvilqw;l1c$g5T;h6U{CuMQG5wpz87GSq-t`hJZ{<*-P!t0)5c`AgPZ0N4g_;SL9YWy zwleqNr(bgYTL>!pH!JFvOQIOMQ;U{|Dc{-D!?Yn^(pfv{` zjIKdiA=foBNQRZ5CZBuP1J&M4^pQ7e`$wRGO&e@1NPhEj&c5;Vlbp0_(l1@}xZyY% z%2BA|#q+jux==3>-R-^ns%$qo?LEkrhFOh4^*^s$%k$LHJCd+a{x%>|%3$Ub@IDY- zPR9gk=)HuK0SrwsD>3<~>1;^dq)K-?;2zL}=UB32%@2T`cSIPw9ad1AQ5H~?@`@W@ zu1<8>dqWi;jLleC`Pk z7!4(j`*5%@sQE7|1J}h}sLuEFl&*oGny(6GF3DXXNFl+ZwNH;M96PCKK30EQp4rk| zZ20>2tL(~m3iiNHHy!2*wKu1G(a$$Nt7Vu~BS&Q2Vvr3%RyOx%UYDqUZ0)j8SYM&J zYf_b3mr>AslpBM505!t(yU116r4UueGLQmDPEWodcD*akx)k`EXls~NdmU~Y6NJy3 zZRF;kwLR+HnffxYJIU{PtTGP%)qG3UP@jfou;PU8shLTr=@64?2tsM*VynZYLYn*~ z?7jHqtHvMyhp6+8hU1O<_9A)^B18$ICTjGkt4E1Q^u9v$-rKUGgb*b}533WscUE-K ziMmSkUYAwY+IN3%d(NCW^Y@%HGxyxr_fw+(<_wn~jYS0Xl&++g&R;_2$=y)=f4gOn zOkUp>sa8*4n9amklj$KkJ;Jo~w4VgUXAX%!eoKm*k{|KqvmLz)PN#1>=KupO?Z2~I z8C{iV)mC5d#UOuW<ymn$^s4nPQggtc$w4j%Ie?h4*^! zK$F#qbl_Rs0q9k>Q?L6E8(!oB_GTO5wlq~f8a|Dy#Sp}-L~#1;*Bv1>L68`#1N8S3 z*W*E#6M>;pp9%h>Yw>~UV}|jqlg_X-uEJbR;%3bbu&Kw{0EoG*6LxH7u*y^fkOTU_ zBho3LJi(~iLJj38s>j#`Ao$MSU?@Q#ot@sJHC7x0B;Lx28Ihx3Y9l3PI%HS{aqO0b z_dfm*n-YKvJQmem0u4hb5e))r@%ofVBiAY)y&nS*2evnXaKwmAz03xAZ(I6kgST z{d7T?lZ&|(_xqT-*dx?GHfHO7HAbzQzPh;>>%o|1h9HkM7AKhWJ17(ZI=}IBjTz&+ zTYSCm*=o{a;_hM1kGYd**8bySay1M>LWoUI9m{sDs<=Pk{4G8~D0)mnTi`V+G?C< zl5s&d*)v){Ep69>D_&1eBGrGlOlN*cj#D`iXdaU>cV0PNGTd(LX}+K72?)Axd0KsN zdF~(lGM#f+B>j?2Qp>Yd7MS|iJN=j)I8!@Z1?1cSbHX4z8V(1n|+^59)r>x;ac_t2E1L>R(l` z*0xL!rDcyzOGv;B$FCjCFEICr9Jc&iFY|7L#Z;O@q?!Y64`KwSJ18JrsfgbO0*t-} z8KBik%ae)imeJvhhD^>OCi11)@?QtvHeK-?!+E-Pj)62We)`@*ePTxl+xd{R?#`gA z_?wrT4uF3ea{@5}9hb~8@$huVV49(yxH(n$XvmrZpPTuol8Ir5jW@c}y1<~qQ7%?z zY@}^aRg^CE;uaKLA86y-*zw|5xQHFcbd5~b(P2kio$a-4scoI)?G{N&%al;E|0VRL z`_}str_CRtdcVYm0A$>MJ!la9#{XKk;eMDjF zJN~94#j5A~J`!Ryf>*NWZ#O~>k;;}hEbZ&P38?++jUX zw)IR0_TmCoxbcUD6dR%y6K63G9--wfAgYOb-gfvVv}Tbw3n{MmE3JzQ2dhWIY>agx3dHxMNJh@5~x^81<*lr>A_p%DqGsB4Apb8=0=otf? zX9b+R@xMp42TDRQ+HolGuf$dZPqQ8b(ZOAu1&du(@VuP`s@!s=d`N?eTY&yyO<#BbEw`u z)K#(}!pH85G8Y0oT5fyOPnhiL3*BFH&ut=zv~t}(E!iMUEy~Y&PlIrZA*wKNw_4=q zI`7DI8Z|Yru<|{CD-Ns@ND`WQU0JtC9hx(DD!t6|ZERU4T8!`*ll#l>><|MglLCg49Z95HRUbMMJf|G;)zf6>)=U%&+AeWe1X-nbDZjkDWc zZs;!(v@zdh606et*3-CljUSxaXWH9U4L0;KjUX15tcjgr!-|W?bK?0L#BaZkmnZOj zhkZ-LlW|f7xB+B$Ob5m`xog@N`CeEtKw;9mR&TqPKNEGA#S`V)Ocz<&8ig7VXQs)W z_ffcf=dE2~=vxzJ20AsPw18JDe@o6&&oUWXcid-t!Ig)2g{c>TVf+b_YKC z@a+q{W5jmYvRd+r-(k#DuW~12#H7(WAF<q7h3xl5CU~d{rj~A-;mkvE8U0` z-#A|~nB=>cG_t%hb6afJxSV)zSF$Jz=@6Q&IN5|9&HeUs-Ss{n1ZH`tWMr) zn0WxTESVdZnZrHNu;+Ju+Gv ze>>YLyTO@teaCh^Z-HFClTpMAgDckIs|41P1rSjt1ZoW7Yc^jrpv-eNU%dQu;Q#8N zo9goyXW!Ax6NGhKQ(&2Lqs@>CiQp59Fs3D`_N>aRo^NJu5fpG!49`8?r{E4f>kY^^GnE?4C7S=e#H(Q;qQ56%p#^u*LA z@pNj}z4c8Pz0{;!g@5FnR$Z*N{iN4(K;o(=%ly|Omp z#X*^|%)5h)rcUlr{o#}(hA&arY zZHi_%7A8P=F$S@tQM9kO6o^XwK@nn~p|HAKHhpCvoGF}E7M`f$Vy+yV&3 zeNm#9Sr4wD_#qa=0jP(*iaJnFSz!DU`qXga-BN$+Re^JfNFqd^OSH&~e#GgX;(W)b z{aEA^1nK&j+!5$GeSGY}N$*f0KhD9=k`Nxo*B8da_+L^+5%&`5V6M5x9T7Br1M7~^ z#s&^u;ET3Dd`Lm;V8m`IKgIHW{~Gh0sgo0v7`WaYe;DYESZ4Umb>$VGeHLX^CXk&x zY!tJlclaf2OTBZTxns%G5BZv4gy)B>{qnH~Loz7@Uzy`+3SnjNy%j>p*$UkNZu1f6A zNM$z%5T&jtiaGx{YsryJk-v3SX?`B1m-vP4t@>^ZG3Dg1u^89 zszU+811Z(dP1|&w;rKqavZDe;F!!JHlc9VG=FCNEVq(x)Y4mtRje2elM-`K+xV^kU z$kBN><^;aJGwf*Y#FGUy>Bf~~@}L`c!g`b3fI9ebPNl9&Pfd$h{IuJQFF zT0>$%crKWc79{ysefKHbCnm_lm)^3{O%D`u6a@ZjV!j?b=!q=|1c!6KUY6Odh?j09 z(;Ysi+t-yXoPC;O^WD#$74Q4MO$>8Ar{0uAa%QdHD?VB=8r$W*yA?0j*LNpjP5nK$ znZw6fC$W=jSy`Gl5$3>Q+h-!CCl({NWinDr68`yVIHy~`7r7!HILWxnt{!sR3B`3h z>Dj42=rTTkS9v^I#hJyxB)b*aBlz@yGZ0Xz_oU}A=P7{GjG5ox(t+m*eWIWJtyp1_ z9mBx$qnIc`&Uxp5P3M(sSu^ZBZ*w+E-$cH^6+E+wTu<$UuFM3RN|Q6V zlqLgezW@84^(jDSqtsqJWF3H4`7D|;GYF7P+tJr+KbJxYnhl7sHonC!3wpvwdUy>O zBIw7N=~`X$N9my@aZ6CyjHA=R<$q5hKK=od4X!rQsdq5jz)Ixt0%M>M^2kc-iZR3M zQcm*zyx(fiY0^;TZ7@Ozck-5rrb>z$s_$T!-4t3los41eb zo%wk_$-x&q4>!2A)>{G9u{34by+k)Nv7P;#qf7 zK=a(${z4defWY^7jp}`7=)3+;rP?VRe!s=kl)UdSOdAJQKeuZHr5vHe0wBM~_Jwts z5dZyALf{`E8|cf zR4=vQh5uOOOCuLzN9QjSl%jOHBX&aE^Q|=UCKj zT4li!4SX!nV8hyB9%3aRME~0yLyBR<%0d{i)Po57NzvIsYV_p=-m&sGdQX_dN}G!N zmCU(5Jv8lF3kk#Kg(SYjjt4M_Dm@qa_P@o0|D>mXIo)+IhbPXbUKIifFdwHPb`Uo$ zRe?WcC8QfAq`^%e8nw**j);>>FM3uKM*YmnP@Z%Pws}tmuU{V?f6pYDFE%gUI}ad5 z<#)WTECMxBdE*k@-SZ;91@Xe*e1|sQIa52nm8(9eWLcYz`V>U%+PUks`e2VbAyr+? zRquqaQ!|2nNJ~3fZnu~!k%--OATEm7k%K%GXR`j|v!pgq;lyR$D6}j-PQ1)OXm+*V z0C`NW!16j##zEjk4IKLVS2JL7m}f`SqU?2H-&OU048Ew}e6H|2Gx(0_-Vcne$BMTJ z7Y^B0xwq?J`I~~MmHWCvbjO=)NTf3;;T3mzBJP1Ke}=>r7*Bo1XiWFa$#ZRg%kadL z0(9jXC{7+5H=P>TBqIj74F!j0sSr>%T%Z~6|+xLY|oyv{dh>GT9ZdAwS%h5nN_w3gOwyHD*$={LsL(M_qP@p= ziivNe@HETHQ>Y^S(?<8clEd%$LxpWi0pPP=ZZyJyV_i<(x4y!W)5gv4MiqDW*;UNh z>-)CUqq@v{=W6#eRGA}uS-p);VeY3O{K47BqxHw8`=vE!@uHQ5tQoR3rRo?#uZ|WymZ+&h(|_oh#=yu*|kCZ5foEGH~j9^DgzOSlOOMZ2HC=Xr6~k zJ)GXY6OaY9?9u?D0`zaopkWiLxGJ3*ePd~7jtWQm4mSH8kRO3Q=U;n-BW+Y_ufA_l&Hnuxzi}{$} zX4MD{>bSSWoUSuBFEYmX?;i_bc63&5?NEoO5o(Mpk9)i%F}&HsH#{wAD=opQruG0G;=&2!NO4!ZKuRQn zRAxDEW+$E<_s?D2i|e4_k|`52;Y%%LrLn0G-W>=~siMY3X6Tnm&0dO-Kzl)go7iPvpuEJ-JeZD*U>SW8p{I0gwtUYL5v0Yi1j>wEdPw=VFrpLP5 zI4^zEaFL)f|1t39T73tcH!mOs^6y!q-r~E6Px5$R_^fJx!k{Z+?@yJ8CAsxL-*z4U zyyr_?081)tJPUMD1v^YIF_4H(;ZenjI=;V;3u@{jqetV0#C!7W^2A@KmZEzqyJpOy z&iWp14>w%E7PLQiB#*0S=#-mEAg?~?ofSLZM!%&aKKu2EFW7uz0{_Jx=RWgRfIioZ zCV3o>(LhxlLe9)M;Mto8gdcL$gaIqtrVdY1aGsWw(&Jlu!P9J$yNM_GQlkG|gunf2 zBjF%-svzo*oh071)M=(rM)({aJ@jF%r7ZKnppAHah9rS4vNtXR?|S+W=((oErm?nw zn?8hpk}|44mGtD9j%C5Mc_lcl2}(C)n+NP@u&%qr-%bD6nB^5`diYiy2ncnGM{fK< z+&S_)5d#tqSgWrF#KZli-gdUQJ;4W%>@>i}uWsLK%^#U}GQ9un;~1LQJN@xeCssd~ zKkngnUE`IWeST*qCsVCA8vu{F@3&&@4)igPKzr|?&d{QIl9q49)Ed}kwz->&@@A(e zz2j-cPEgEGbseDmhvuIR$+Zp~a-RKP#7>De|Esvrq!J?>Ap`)fq$ccSzf!P)tXb+2UE^Yi)F%W&Hc3g+^6&IOUQsaAoFJ+7GDz5y8l z+w$!C-H!$XaSsXi)<(%9&8~pJ`wfDl^MYTb3-;==G`3tF!DB5Q%EjFF{xw+_=iSBr zG(J+PFYa>y>B}94yzfBZp;VV01U29v*KptdO}lK{#JIYy%DMqfeEs4| z45jF+Pd>~7XW5rBB}%~nw`WzK&(tg|Y;|-o0Bb;JtUVve`^W_!KIeo49PH!qmNFY) zSz~wOTgW~|yCa?WI2b_q<2)1R>#8B3pPH)CiGwd!lpl^0Q6OBJ=$Hia9=*PQ{(sEzzn)W`UVg9R) zWXy7J+6bG*3k#jp4^g88u$-Zdr7dZs;0_HRy^6zW~S5=8`}tt_tTfPXLRNg9|46^ze8@ z=S*#JgF#^EllZV6=5i;9rBx(atV!D%C$4&E?0H4$+y1X=(6wIw{7Y^hY+pY|4DNac>>{n}xkn5&zP2@p05od~tH%ZI$t}#uPJ$Vnu=HI=O^fhsg zwqMkY91L!2wHZIKH@Q&8u_cce$j%>0MtkVwNKq4w*X^I(uaSXN-sGq@I`*-_XiZ<- zrzlSToKXpp^IN@%oS(Oo(!qIAfEd?Lruj1+^EdLb^T~N0U|L9iooiBQ2dZHCaC94U z9{T%wt{U&tf4kWqoM2qTT;cPR+&`@Ko)gYx-6jB@S9dC`lXSmpK9x$VMOLQ_3*PqF zQgL-Qn#qeY;q>;*r}>rLNs z^6VgSzFYq3^*5gZBzW6!=8pT?r;U-Dr0)kS#9t-9GQ7R^|5apGNERY*Fuy^MN);Iz zCE zch($_Adfl|$Hm6|HU6oYWB7}!OSS1k9-yJ;hgY98fq6%jD;jFs_W@6#T2F^6>Ady6 z>}#Fsm+9Yd^kz@si7tGiCD@9`hYf#(_NXqxI(Q0n*KpAMAuc5c%`B76 z47b~zXc}J=0lM(D9DUHi!RUE=7+eGAJpfkxj3%Q#y*xjwiD(JK0iu+J-^qFa>CyBy5t88t0EBdz5RQW{AbZt1x6vwM!hwW@w zx`EMexgHn+Cb)1T_#IYD@>0e({G8I6)AvBG zOt|9ZoEzv+o8DPc*g$D9>Wa4gMiR@+C=Q>cpDfrM#**H&_vs3=&h<~Gkt6PlEV9{0 zJ#OY5@L)oki%aRwIXgIhu*DnW*D$_Eq85x(+M_lmDY7R`Wharia_J6}S1Ul@*J);> zq|^F$p_UurdIg7*8>4uiYTN9uOvF7*WW8RG$m8=jPbTOLa`~LoKUnx{ zq&)*{-&wiPPdGaD;9(W({n*8&I*DfO_94u6gE|);)>%e*jQf|}`nT=1c$PcOg-Hs_ zYyp}2qx`L1STnMp6ynA(v|<eAAKT+b~ zvwfOkV}EYM1XPiGt1L7j$rrf&i0)U_|3k`fZ12f(5H&wuJ(1V4#^VYIgV&XDGkdiPYoCUx-wC(< z0|wsbetH}aS)V51TD}?9nprx8rKJr#rf6((F1k8|1_VuqU7nf4^3<-oW1-Ra~!ENa-`l4_1zilj&n{q$fN2YN`U$vDJQMU21CZ+7TnVn zd>H~}dEXqgc_wri9NZS1KPW79qWQxkJ)Gahz+7Mq)9L?uNJY+FWu0|6qu792u&^H zHS=CB-71G>hAvl3W0U%D)4Ro8@cnRk(FmP!^bBYvouvu7`hkiF*%w(Vax~`&5MWt; z*3B`ZlMhn3TkHnpZ7o;{q;HF_vDyyS1&2wsc&=AHKDd;)h?O9g<`%olO7u zb|v`qDHB#bE-UbE%(Q>5In>j-bh+sGbp`|d^RH!eAt<{2ykY>ALE78R^`{=sljNdq zCw_(|iJ{_%M(Vp3?ym%!5V9P%BUxJPka7vhy7c%xaqFe8bVtXICttVyXA^osOtf3` zV7PH)NL(Cuh`M2(PI8E0Z_ov0&q9~T?WM~`*gjkAd(5X?fyqkmlnJ!`IN~`rpRZlu+TLW7XX5Hv(Y*0RACw=)Sen4SCeR#!;<$Oee4C z$$B#w+Nv>Zxn%NkFrrC*Za zw!UTTu^bo6z-1Dq>%3nrq2N9C!1V2Q9jhF*MKW^$R)N>Ry7bKNOT^aI`&g_4;zOC6 z0L#}#yUSFM-#Es@)a{(QDf>8&5_qhD;`7lDnI8Sze29}{|I_{2%T;Q3#v5L2E0v0x z?|jT}i{yWYxttEP^u3H_hGt%059e=ehxO3DIk^{VPpj&m-mZq}RwL8a*`3zD+Wiza z2@I2&deH18kC&5}95W~WW&Fsc^XQ6fe)QDnW?n%Y@DEOY1Vz>z>5z*@+WTNRAaq;E zGa=M~qljt??p>fEQYcrXFLf4iE@>|yiu^7k&xZLe7H-b0);n;LD;CcC z*|)MKR`dEr0$Et?oeMW>cO7ps`*S+>1c>`_q@O<&2KH`}wz@~dH8ESi^$Qn9-Z|2i z9T!zWGJpr6*aAA&-u3b=_3aXd81l+X^#BVVPxo|Nw$YCe2Zm1!#X~>+7jI+zgU$Np z{#fGdd5q1@15Vqg|Dt?HVU+o?r!!ANKuUOWe!+;(z)`I>mV%~(y;^8$3m}BG5vxkP z@xnwfFyM#KsOK>iQ4*n~I*bqP${pzU?O92A5Y62eW@FD-r~?IYH2>Krk}RH*?OnZ# z)QEvhl&1GyY{^fW42ooc0h5!#A18d){{$)(qhpVQ^%d7BoH_e=20z^qa{H0pZ<}gZ zdjzrb{W)ilzv+9~G)m-3{Hf=#;X1c5G{M8d>bd#@jYkOfF!re(ChXH;nX=b5(cp6= zCft)*BbvrV3qwm$a1Hc9LE`Ggem9_{7l^(2qxHSqo*pp?*`}ILHx}^&aSOVWY>oWwId;#R@-r{rz2UdwE<|FO`vFUqqPgVbW8(P~rMIvb!=;jM)jk)VOS`a`tKS$r zvGwis+2Lonih}U!WpC|I#8*l*_t<2nLoC*(58hFj2l5}Ak+1*l>tE*3WO{bF9njew zJBpBTX}ZyG;zl;c#+zE^@srBkg88qQW5j6y-Nn$0lN(S?KsE+~xk@R;1B?g*$2ZW! z^UGCL<|me&{^GB(8i=wiCnzydLCGEBx&g{HcSHd&w%8uf9g`T>d!Kx_%+2=>=d9v3 z*QnnS*Mpl3$g60kQ7C3V@{PPIgKj=vzxYl0{%NhBTC2kyr7Fw?W1w&;8q)ZWe=(Yx znC!&)UXPH-=#zuO1#2Frf{n?iv-U#6mFdsLa$%e$$C3ax|!Ge}lE3IkGRQDSgiT%>bU4i5Zt^H3f;=EM3VxD^!Ue*DuRFb`!~32cZFmw>_=7h z*C^-j4F{GEs$$cEn1iHR(w&J~RD_>Zwe31MyJJ{lb6xuVv`Wp^t4N{=K8^eoPYOMS za#&%&?cZ_~*x#{yWglAXkKbFQc#_f-UHM1#vGHpXyBD32(t(?9?qr(-u4_E0hLwuu zDg$hlpf^=Wm@c<+myllefG%;`x1~2jEoD4fFf{Dhc-1H5{>6>Jy#&Hs<-Rp-9eErg zjJfg*_NqS~2)dJnuu67{U!l8CW)3#S#{-$-6B`8(hHeRxEedSx3!|P;Qf;H^fDUt; zLV$<+%@)EJf(Ds`)7zTAXAxBp0+d{)4I&gv!!tz(sAyAn`KngCZ3T1r z{f{CBOwA&F1ad4{cr{Mxzsuu(yjjAso^djUxe6s{IbEjZ)#)2^QE9KWW6NOV?KapW z9|pF#t^XM?e%rI5LICgEJ)g+^9YmYTyc~;s80jV03=Jl!+IICAoe|~=<}PZ7>k{$8 zcZSnpE>)xeIJXf?UA+#*u-gn1S&& z%ujDIA^?2{hX)d$B}rG73h>_i<~DG7a#Q9GZP>Aw9JZ)Sf&Lmwgib#!c#F3fy1G=> z`P~~)F~VoWWSnNm4f3Mt_60Acl`DvFV9N9us8BF5x*hraC6el22@HhTw*;x0lxlL} zEngD&M9$*GAH+T2La2L#xOz`vs{B=Un5vgvEtwaC8A%K3Kwq#NHtwx|^GtFbs6_o8 zj{O!7s+9GWcDuUFc0Dp%R&M0lac@^W@8LfWJ3{T)96x+WtA2|P;<0@EJurIN)@s$k zNABqDah66aPa%Ej27K6bgt-lLcjd@8QsYPeUf2_5FCL?3)_xQ0;C+K=XKlm>(Uw52jZ_SHA z`V+sof-h!RhZQ9nc_PPNXH`PjM(?V}?aVqbUh6aS?&%#N0mr?#LUKM zcVFZ74H*tVH4%btyBj?3-upf(ktqjcEDnASP!c6r~sI)%QR+1JqTXIc^6+3!Ad%vJv2-L&<=z7X8uYb80e_=kWo%^WX` z{r)X>46`(=AZ{`|$W*neXf5*g)^psMk2es%*&O!m8+A*=+hp1_dA#A>X$VH0F`IcM zdMk-1@fRrD^5lFnk`w65;wb_fotL>)^>x2yh@?15mRRzhTk%{CXff?4)IQ~@7Z z3wZ9VA3NlWG_tjf8&$J$)7+6gY|l0+N)s2ph1VrNN3DKebU;+mhiFuq+Jc&3vXnK= zQ09l00w?IJOa{OpzXP_CplucUbD?EtdY3;W&I#pd1rW2lE@9~-geB(-`RfTkM!?D! z>bD7k2`(qA`W4VGDVX5NBY%E;s}mbm_uVsKpf6MI{5PE0!lomrTR?)lV3=8??(qGi z3GssKM<&^Di3Aq^34rXJbROj~!9?DED(H_`f9l0{HvC0+`~%AR{jHCU9mQ2*gkQ0a zT+u}S6jO`JhuU7Z^m?P~>yIz$p|<^Vs|`X82yqz?wjLsY7HIrR#HzCy(#g1dTWx#p z7QK<{Qu(vxe&qwbd;6etCTzSFIdRC8TrQf7FIB6!f3#D}3Y~kD*qSE5>}e*tiYN(| z4tWOVT0YWE@{cZ74w*U_f6HH)6^v>ZRLmdID#e!e?Vg-akSC;zLxaLvc}nwt-P?c0 zBYXciaAT&_ea_1c_g_>ti)wtdck_#_zBKZI>6LN)?wsj{ll<%?750q9ZT&0!Pq^zQ zPsmAE z3P|;WPj9Z>-grZo@Bt4P`s$+kT7LJrwfdGxQHKVc?Xp<6$?I9iWyrRGx z$DEyW7Pq*^d*L1O4mYziY(yk8%T!I0pqxn+_H%9B>)I}KwR%$mefaXM6Pwo~0;Wp; zR}+u^nNzrF!?@bhYGYG>`YOj=@0a64+#<~zbnznnoHfS@Otzi*B^$K4g z{PRxrUNNW$nd8l^`-}f6vFbaUy=0B_ycO3!BT-R9YE#4+B6QYi%&@PH4^eqVKG7i**nrfRyWGz=u7)t{zj8f*OQyS8D^%mQNd=+Yg&y1OWd|UALJ5S z>Xr0{zdFv(#~4XUvL~na4i#j0Z!~}B<7fP`kSpxzyPE+|AH8!6+P;%8<~KkIH~60{ z%MzY1t*#FH2LX{<=Jg$8#PFFb>dG>a@yUQT2@vm3!ep-|xa{%0R-M*Zvg`I@a|)Bh zdr4)S7oWaoqXSyZo|P( z7*7QkE?)T`RwXK=$&r6adN;=0>4liF!Gt!|kqu;c6L9njq|G`^_s@c#XsR2$Xtvj+ z?1=&6h{T4zeH2A+YLbfc!ukKuju83(p&f--+7WxvUdI0aV?ao;tb+`z0wKVVh)KSd zl$RFOev83FU>-{Wv6j06g*nZ*1{lQhI_5i97nHDLMx}|C1$B2VbJ(Y-LKl$o>x@8w zn>lszNj}ttpBZ`hy58IFDWN!eyLh^M8dUL2YNM-$uGqIKvpIdTGB7|;ci0-_x(Y?~ zta~dubIBBx-5^5^p8Hr+LT(#l&@BPiSs%ncOP7=T+nxdVd(UV z6Nf+@t;WIHQc_weD3x$*h(-L%eg!n$S7~RQ_?loY$qv@%b;Wc728E0`qub6~EL1S} zLWz-U%BqSDgxmDuzbO`g$AAPUE|vi8{aNFdhseBA5PN)#%+X2@Z+qa?+sX8()9{cH zFTIFGKce)(FdIKwLwYpxq0tlLrnFWw$jotXxs1N-{5fGZM*Xp$_zk6z(9Et?7y7~Lu~ujocd+8$)c>klLF*=op$Z+I7~Y4Y&+gLVpmhoreBTFLj>{_*Tc>O^(4 z{+A-iE?dEJ{rP@}I-;w%gpQmJFNqk;vQtZc;3o5zeG0HbU}i`C4rk)M*|5MLY$mSr zM40{B4;K28HK9*!A1ky|I8_x+6D1Dg&BX_*#>{0Nqi7{4u=$s!z(F+h-p6};)V_bS z&0NOGYPPC!940WcKT;O?^)>k1!>rS2u+vQVZSvYwcby$Wsz#DlBOf86fw~@|rvIJv z5cTue|30`Q7MHbXsm*so&6X%3?J5R|O4_>>chyQ6@3dWoTp9eTegOzErx}j)Z?_s? zj^x5m5UwD-GL@Zr@~Z$7S);~+C-U-1G7_$vN%oSS)&f4YH&yt%5M^44CeyTAyLlA6@|eU;#Z1aQZDj7XE@Tn;^>&zfw~d8V`Cm z=)-xB%%RwcXu?_lXAD%-lWqM|_cq(`lpvO;7~^~G41KC47WVSuaD4R-dZ+<93ki@8 zRCwsx8MIS2SG-y{&L>n!w(`_Tf4@}#LlJ+;#Z0^5#A7sp4D(NEUJrnqx0!++M|@vA zs+Ij=&gV_&B}MMvhQ4oB%FwKC3D){V{+k%!widtTabIshx7u_}_wD|uxjqm8aB1{` z37q>&)WLSzcKvAqAOMMu_{)L@(-L+%pmuI2wUR{_>pknsXK6!?IMZ@y%!VMpXmdbi z^!7hVg;Co)NxcqCp`ldeXjS3~7@6MxXw1?#OYqAIR0IF_9LZp=T9M@(Id+bF!zxYw zsJY!7x<&z4Upkgy9wO2rAmVE?uR4u%{#s=m*}FueRqjxv%^y=`32l@>WjQSY4?i&o z-S4b|f%fWi&Wz$rGh48#>5CY2S!e6*bvSR9fY`S$TB&vI2Lo+qAFa38p+2QvQbep& z$Uj<=Y5NM(*W%Kf{a}M!(&3hY4Ir69PFj3G^YBj=B0xI>EgM74+1kn$BSQzWwQ!#V zkkChi5swGCLbssgBVjZX5I|ng;?c%aL3Z^ds33REea{QN99d)M!g3K&iY+l>#`M3@ zS^A)}$CijLBaTTb1*DO551)TL703649QU8sI1jcWz6A95QL&EhG;edSO+Ao&s=H>) zMArFV#pPSJ&B9Pnl~&Ss>{xrG>{~Zy$o8OY$|@P%OSjOvx1UK@>Sy!wqa}`K%I18= z!R5nIA8ldio1_EVo5*7KB5$%t@w-0nnB>XK4ITktle@cLe||bo*u@;_T6jA$ ztN5t(sgyu-Ez0w4MnEYGUgb1sW8a6odv-jigK3LzB(&r}qZS<2Z7P?m1)_AnJVrL> zGG?E6W}K{wkpSNRYii*-fcU|-d@4z#Etbzz*5?WGp3{Sn`qcBAe>sA$CBKVZvvQa) z?aG%_c#@_Qw#AWn3uoHAI1jj$;;tzEA~Ve5I$&rDNJ zj8&jbYg$13M}yg*Wf%zT<~O@$)t<2w7CU|t#8gfP=L+23ntqeo`EdO0pOvPncabnJ zfwt6{jKqmyjw=r*3x#Sp5H_AY)4~>Y*lyZNg!9OxVonH}wyl7} zVl<8VG7-RpY>*n?vO2DK4Cq?rZ3*tY_CO-x%5{T%68Mzf#keg$!S9bssz_eNesOt? zfphs%<11m5D8lXP1D{mdUno6JNpWM%)ufuD-hw=Dy3gacuhVMK!>yNK<+C#@8NLrIy5pF+IP55WkNSSQWq-GSZkC zTA`!r7@p%v$%O&I5&QsMOtjvR7i-zz&WaM& zC_M89|FmtUxC`$eP5a0UNFmJ9=!sm)X{lW8iQ`s&7vMUwPWrHiAip8wgL}8y!L+Hw zVYepVGSIoKZ1D8+YG}sv6e)G4+ooe zK5(j8dVP8!tL>cy2IlnIlYg&d0&Q%_QPa1E=>qsQdKu;81R^y5H1GJ%4un(b0S=i% z<8Yq=0s9B;pKX;iL)d^V(k-`y0BTtu#3i}~vdkEuUq^>KF?i7U_mAxTt$+rxoFNX$ z)?4-;N^FMAWg@pL*9pI$LA*Wli84eqJFSTI>he3EfdQ<54|zAvZX1VxCH4O~N4y9u ziklnL$Q=Z}2W-A$cV;VEb8~a>(!(oI4Vdl{;?X`-?WqW|Q%vAz6hfqZ`%o=AWn4IV zdG-99v6J>eh7cK=fq81@Hf&?Q5omDX@mG~VSFE>JRVkpEkcBdY)`j=?V+jw=Vw>3W zcf9tAP1j72;NX{6EYk^yZ=0tl>-I|rMRaiR^bBBAh3Hl7Qbn(wRa%43G4eBDNj%fD zMXal<+ky0J)F~~n;iDff-5%8a?#-ldVie?CXD97cVi(}A3T|5OUv&%m8j3F52RT7J z52!^1(k$MUbcrXnAPtFR7qjl2t$bVdMxd$aF1;%y5@T+SEr5HWL}S>qH}%wI`vZ&BAT7NO)a zb5R!uC8}Zyc!#QTB3~BLLry&?GquJlN;y*UA zPdQ0R9NWV9JB8nfi?Iy}UM}}&sdsO2E-DUaZILH!xO!Csh za`k@!(?Bf0PRNR>3TZYm1SG%_aOl`SqyNRmhzw)DuK(Fxcw#$pkFOn{&6qJ+-&KQ7 z7iJicF+DwfT`w5r{#zOI-R-Nx{pW}2mt;NPZIh%9wO2VQXKEc(Ak8_=2vj=Rb9=i` zG?;I*il1Hh>S7KyP%c6%Aa6C3eMgX4o+z=HB4X(PIOAUWorDEzleStxs~baeklmyJ z@Wj0AnO~hL&ew~7^=!vou2+gYmcq>qVHD-ZcjD|GgB(Jb2;$U$HY5sz$QdfFASK)Y z0+t8u)5;p81lQ~Lu!|8&H+6H+F-`0?2P}`@F@k3Id?rO6vRcF-$7eqtzB%Oe^*-tC zAy>J#DTGjkbZu_&|8?dzc)z6fcXqt~DjrMd<6z1#)2EL6S7%;4?996h-#D~O7V~!E z?Q?m4K}MaE;fR$COxk5}B-JW|P;GX|lz6kuX4+5AXPz;iXGqLzf!5yFcKhc^yP`CZ z5XkS+cpCu{NYGjmn$>(yk#I!W-CE~r#7*mV2OtLU;xnGQua`S3 zgg+T&|J5O6dHiS@pkO=FyP^5rbfo>G9{>QR z0001Lp`b7yJvdE8{{IB_{{j8~1pf#B2LBBI4*v-M3jYfK6aNs*MorMpY($vA&RzK8 zZ7BzWfB3_uid;b*AH)OK6w8UD0 zE!x&t9{kz!E1!LgY@;QP3m^cG);cQB{zWS zyv7L|o}Cssr8IN7wTIMPL?Gh!hQmNty9=$tu0M?`{B@Bt8t`w6>sVU%t%qSU8RD!+ z8PMvpNaFh!-TU`X{=>g_{R@AHv82)RKHSC$4u!dKf=A@~Bm;;+{i-#lNPX67t2(__ zw4JIMweyQ6C zwc&Szn&q7G)Hc!J1h>6EFEao!bmZd%ebir$*T}wb z)%HObKZ3b75iRkP%75_hw1Ac=*s97la8MYNL5%*B5e-FVmKb$O@Zk?6lX6_Rxe|Mg zMr*G<9j<-r<{mqp@xZVyoHT4#Jq)hxcB*QqbJe!AS~B+(xfhT%dKwamSO+t?JN)7Q zA%;L8+URb|qW_w>kOYOGv%K58yL!|1FPFbtjHYsr0fr0{d4Q7#e(udFCjn2h8KpDwy$^;OlJetvT z@4~h3usM40+H+%GtsECRI_Nqj&Y+)V)A=Rk0mZV@Q?H6qx>N$NY(~b)+7y7KA}t|G z=1@)5ffWHA|5tpSc5mNRC<(x;GS9WcKff}wsE7s%R4m$Jmp9ofokSBTT0hA$Z~rv_ zlz6x?4T#Xd6fq{>0WU zohcg5LVJgSH5@5cE4`JNOe(j8rk)4Y@d`3?)LtDp@GX9Idr;H2VDmyy{c>=%&{yXy zz~o6P#_I{GT<+)I=gfKwH{wEK$=3Js!QEhYaIc@6`dXZs&vN(GL-Bkp$4~p*UUkod zm%VU%a53)sX6(@VnY#m9nMHt}X3e~3Ty~dgTy47EBcnpM1;oXho&R=7vkv1i2H@(G z6a_rLX+NepfeJ(q7hBu9tN636&HUW_)IdWlUXvh|uA&9B%_;fNBnU{W($7FapoNu# zP%IN!7HtRyxQ+q-@*Hchv!Up^U}|PL#ttv7ZAM1yuUoGBW3OR(^8bPhY1@JFRc6HB zWHP;c3Z|j1;FGxqTpa>U0Nw{}eg!s#>ZAMJWc|I{gO;=-^Pw47>u*NZzG`UB0JkZ4 zwjfp^*H{?j{(FX&RV5t77Tufp7Ed>`JU5+O8%>d!e8+m|hm6%Ry#K?sS@ex;gP--v zVGAeg>noa`tXnS=>@2Y*!*4JB_}i``B#Jx_t;yxRY8ixPNj?(?TY7yt?zOTWIln_>wO!pyckk$A0{6FN7d8bN)xr}(M1pcF&;ZA198aR1kP zW11X(*xM{T$Wt_FbXxMtOQ4&b_5ao^uf@z7g_O&qrEWC(!=QD$$gMk;T_asvjDZlE z;!s+1nZTW7NCCbFjqw8H4SgRAILOvsZ64H>D<u4}udaUm*M5hM>;1#$JQ%n4U)z{WXQl!b`GMWy>&HWJYU?`-=mOarFYnI#9f%Oy4Ig+iQF{S}>E}5z zZx#vooH6Izer+#5{yHyhb`&90`K)XKj89@LQs2MdjEw-~$0qYb?^P}K-uYKOYw7OR z@=<8j-sa6s<$-U}xW0IPA2ZFK$t#$;x+(NB?eeNzQs-q(kHMms*%>Ez!yo^j&1#C}xauj4} zTb5hEO_d85)Ll@12aWLrnKxwJ$M4z)6}|lLL6bj$p+L8O7^~>f*0Ok92*GpM!Px(4 zJqL@-WHdX)C~Q9X?u+m4zB!7oJ-V3P`~J)e*ZcPQy$+V!m%oqHEC1f(QWyCeJh1OJ z2GPV{w0B)eDC_ZbeSd4aZL2t*tJ^SLcFR@(>#Xl9nF-?O(qLaOH?{T5A<7BhS`$~v zI)Ti&g5$}L{ki;ZsUK^!Kq3~Hul}bErr+unN^6)>*Gi6dNP|ci9T__eD{cE`M1Dpt ziq>QDHkS&u{KWk#w`h7~P1a$f61kH|G_g?xqb)@+FhFl{Sd@PCBt`V*j&8?D_sX>J>1;<75 zNAw@~|Kr8`M~>}cw0-sqZ=7|o<#^`!DZlrv)K_oo%ZFbyyt;VC$0VCp-#&Lp9*gcW znlm_ryO3HU6N99Q1gYEWWCwv2>}* z0*fcH*}ULTBu8lMw>(Y7Ps8MK_>_PD@;5rX{?xG;?9;0{{ciD&d;Z|*X)?HtPha@? z`1DWtyZJ|P%+EvY(v{)#D3PSa8ilfaz8>B@-@Mr#xaq`t{?7gE{~2M0&CzW1Eyw+x zwbzHYbY2S#zG?iDV-%7NnROeuc%^cSY<~V-ueArVm7f`V1Mqv9&B~RAwHhqlTvvC$ z7yrD_L`ahhB35Fa%JMD{Xs9_fM0y!F=xNx%S50PKW!iF=v#UeD=kVo0n|dE0c8YFo z$yrSRXs-SqrgUi6mcMl#U76B-Sj`VWp2r;4f)8^6uxQao(rC0IMYVk| zDSy(d%MXM$Tl*Q5D-2PM3YxfBnv+f%*tLOjxqE`%y^kvA>M$`~T(Gp``4;h!Zo%CTglHALYkvKZNP&XvfQCT!C(H2Qh3wU4F-c`&Z|5 z?u3*^B)VT%=>8kI3BM`9g{%rfx!m-ze^-BzouAIiRegrG*Tu=3Q*kl&j<$0C zXMb8|3|F7&y2W;#M*Y4;$C4di~%g)^41~ho4^XJxYf$Sttu0O5h(re@M-oYinyr(Tn-&D{g zSgp72Qc7B+OF}!o{i`T|Bl2BNr}{#Y<_RQWmJnr0Wi666manhxcYoTP(o^gvwk`Mw zZgY+>RZCG~>HqcX+DF*a^$&iR^G|BHK~Qp2f!3xu!fHO|#J4nF6MdZjR1(7%2+ zWa0aZb0)ol<`-Bj*Kam?~r7Ng*0#M{)u;IBpW(soZ)-IDPzlM2WBEM@R&2whW){B1Oc8Im&X>|o4j5wq z>ZNr)$8>U{iR^;5%JDa+!T3tdZAmRgu)_tj7xSlTW5h`53k6fclVp`AR33c1_;qJz z_BZZ&K7UQFC#PRuH@^8L2CZjKVyM@^P3kT)5wacfQJk`|Rlq>yNr zfrK!8d=7W&(18N$j}1>}XHx(Gz`ZK~00000OCJCLrvLx|)`!r=8UF_V4*vfF{{;T_ z{{a64`~L|2{|fd04EkONHE6-*uvOY34 zXR)m4f^A1|y~2czxVA+)pXV;m`cH@hNN*S-1N7OiBV~2=x0Qdw=_z3%83luCPBB zx=q)muS8n!@6NNQ%G@OWUl%(fV1m;3f39NEZtP|Inc!&~^RNBj_u!EBwFv=o_;8!{ z^`_;kZ4#Gruze6ZY4?*VuYSkQjkqX9Dbh-gs%mCQn);y9z`6HWXd5?C>6xI&(|wWN zu3>ThL|aKxiS(s4T&Hvkd@fM{{%G0&KBtUqrpfIEG*&b)M&_DP%ye_H1;er{PVMiNBF&y zWCs9#I_zfooo4)6ib;e~=4+qdofGF^=fp<;UgXMMK!NqWg!3C|22|y)w5+g{;ndu| z`OOmCSs8YHd2uS&YZQnY<$KRORdMXa{HPG?f{nC2J74zj< zq=>fO^*!~fS11nzYRx3qRt^5PbYKF;Em-33SVY!0rw0eH9YBn~8?yjf*DydNER~pT zP^tv0|EIrPuWgpC`szFx9hUR0`HF03yOWWfyE_~vlnt{UJ}ZA5ZH_XAhujU*<8G9X zWF7;_z=PU*Ymj-bB8hkwl3!1|IX;CRd=~HDZ#xLc$|q{W%tnEL-F7zLI5!YS&6mOj zVEGgh57^Du5YYH~xr=~e`+E*^N2dhc%DzRjdqS|$p%&33;5t@`NWXlPv;`nojli=t zu^C$j+Bn@Felr#A!ZN9w*g%wxxnI#0<2xJPD@A{j)$M(t7;^A(GQ_g?c~&7G#-vu9k$)ML*lLOxg-P%S+BL4mK;mxjFa#*EXTF&5oO!>vFrx-w%~@ zHzacaUEE%#gG--6rrvvSZtN-N^TqZ%#r&%9N!97~1tx)_oUBS>K0P}~i~9LU6JTiY zoZqB3YEJ^fw9w4E8aI<=dfQwqQ5_KEJ2&W|hmXKHjU9SMjpb+7mFAh*w~of!Da-%y zgp;-umq{)mQIQ52A}HSXoa74jG9h&73`?=ygHB=wb4^gHHT_a#mGms7;Mpo$uyHBJ zW9i>IXpoy_B8{v~R%JYt9BkF?;&QEvQ|wusnJv9;*8cb5(_eok(@CVu?w!?Hr(|Gp z%>)rXq^S!{)tmL{JLhwSnYW-pcJcqMX+W!+t5qT>7EW(2Dqp_FzbkVK08H7NPVW3( zw0)Jrd#8%$Qu9`91BlOYY%oOte*sANa=SL?Er2Fm``!wzCVxt(kNloVP1WxkdoC+K z1?mEkwMha~+Yn0qZztb=bG_L>18<|!N)ptW>1W#RD&hc*@_NHa6bW=f=Fv%z1m`}p z4dLNh2h>ml-Un^;Knz+PpxAFY}m8=sEXq2q2pV=!G=I!rs6F>yF7&m5^iyH`mN zYdcNZFY*X&tv94Czg-jnywBX21`UPiO2TR(Tl2q*-LDIY0`OG0{QLNK&vt$BLBWAo1;WV>Z29hJjDVjA@3$4T_^yy*=niE6B^8yQt|UL2=SD{FWtf&LH^ExE%f0oa;>_Stn)6SU-Iz|LTl% zvj#89c>xnA?cbX``rX&-k4bJ$cZ*YgX!x^OJ!x}xpC`A+IBf>Cck6e`E!^9dUcVi@ zK|PL#9-nW90=TpG^LMqE%VadeH4P8mVfGjbz>n$jJb#Y+NlB@oB)D~!_W|=osa@xn z5MK-pS;4i9*9##)M7jEipcZ=paDX6abD1V-sUAlF;O>AY2U@R}*%1|g$5%Qwooq-K z*gMbIaj~7#pT%8|^uoHKQ?JkJiKQf^F4cw`_|9MV(rS|j5u(C z`)uTxu)Im23bcP9FokG_*7*{;K<`$|VE z*)(<#NUC$>;Hlx7hrQp1RKmm9HD-Td@0McFV)kyA`?|H`#TrsG5JY zD)V1|DMl)6rTBvUDv&@V@*bs?{Ex%20U+b&;{4@#T?0n6FEace>-Rbvz zsb2S$gz$8>=(6HCNi3gQ=+3$&vo(1UZr1MrHHx@kvFe?}Pcv{1-Usbqg)B|*SU#x4 zOJ?zV&^~*ApwP z{Hdf$=$5qUN)`3DPGI!VG(sk9$tnNS!GarZ_#Fp62c1BJbbT>c%P%T`>92z}P=L)1 za(fuE5J~WsC5TOFRpsil@c+?)(|V`#aojwYL)J6ad%3*Ly7A@W>T_pp-+phOyXE$6 zzq`v^IkY@pw;3DPCHYH-Z@!C_?QZn_a?f#m+hwzT%)_d}OeXg4HQ_@sL#)*N^_MOw z0@b{@I`r%1tLOA@P`1F_f?mAf?FF(Ll`@=gK|!E5_|3jiJmEno%m3Htb(K_y-Bi-T6M z0z(5!{V=ld)f&0H8kR~jRT7&}`SkynW+Jl(-F4sTUFxbA*6=!`n>wC(#`>#w$GyiS zZt8(fk0uU(?`_M@#L()WvR(MCjF9lLXwhty^#e0~tkevyuTm2d!WRh6(!a)5uDg=-QwWPGC|2@r9MK z$~r*2mP)LtLU8p*|1EQ;-ugY^)PdVx%ahK;@!3W?%WBonJ~{QvaZ?XPV(o74q4BGG z_c&hLygRh}?5)kCpWW~6-6C&?1>^g;n<*j#g7ZOb%0y{~;$kY2Sq2lCbG>@-^+8>%e;$pfJ)=^pge zBDK#?MMU)L$0?#Z0LyPNEK2?&4lql|&~z}imL4JrIVP;de>bqEZHc`5QbV8WR&M)o z=7yI92vfJ)+3vILszm;#6qV;X1jc4X!A~&K6hk!t-Us#Y1Uq(6@`v*L_dz3AA&m}F zdQos_m1mhGoR80Iy~&iOd+s#0>hOUk8L{jc zV;zkmiRorP>r78w-eY=yV>#Q53?Iv|cO#F4o=gX{i0<^3d+)p@ho* z?+2V;vO_b2Ve%*Vamx|8Cgw%#ldH(KQQWBCKboo8BEt zOfH$*wn;ZF!2low3wsDLsuYUk+7+fY~+!Xnj0UijQ=mcWZXhH5ioFJD~^$$AI26C%RQhcerYG+v_!5i3u zP!9X27xO7)t{$HaPdQ{Ae{ee-jpZ*q=)vnAc6jW(=?}xqA1-F;UH|>%ZWni(o7eJ( z=JRWBz3Rr^=P%>_va=^Ev%jo&FKcuDCc)OFX?UfoxtliyrHawt)*RdY|IOc;1q8UH z@%l{6z93SF+4t)HNnqnC@;CqNF(t*w`(b9em`(Qo>Bhcf+t=@%-zxW+rGNyDOLqib zMCs5hQAGeQ6D4WCZ5s7i8^BT^#hK_*rT88CyLM)4KfkJC;);#D*u{j@Kl`gKA==iQ z!HSB55Gf64(Lf-8nYFLZfgj&NW`{@>o(LWBfe#mor1^AlF{)}Jbb>p+$t^7z-7m+d zT;&-t3yoZ8vXF4l=@=Tlr%IVdzMdObo}>oslWWdt`(#d76>Vf0lP0Uo=*%1|ht8Nx z$7NT;Fx>>DIz7>8hpk!0GifCnP1+?Dm5vf%0te^$jO`ciF8W>et+Yv-$WI%;3K_H= zcgYHULM1<2E=b?K0Ac$%^T6>V%iDY~5Y_Y-0OT}yb1QWbPoHiB@XJ`e`5a`)&iGdA z(r&rN0pgSm(StjKMdenZKBy0N3eo(ukv0nH6e5(6pHjSv`bHDOpTqRwoB><)*EsA7 z0b13M5vT@{DF=fwj{{FvW&n)m^i@*Rjlu*{6DI(glX;16j6N{&uw6tn^oqvTOV?nE*`&=1QZX`&kOwA^JG$e7is*8J27qKWT_U?Pk#3u=p)NK z7J`TRm&9jj-41c5>?2)l41q$#25|T$zNZV-4rN#&z~3hUFC$uZ&w=P3J;--#!_r(D z0{RqPW{Oq<2sloO{_Nl|5Z&;F0BaWoeh4k_2KiuUsn0Grgi{JtZV}qx1-Fq{|=w)DSn^m(#B-g@Y2-9gRB++ zuuaI#`Sr%a?ajAY_APx^Vajg*%fh*;y!qLFer|tao;ozPz0?Upf+Y^05Py*tf?&N1 zz<#GWr$pMe-_U15PO9pj0T_zSGtYctLebUkOBVpjNk(KCed{CX8ic?MLluCupMdIg4rBf z%i=LrT9bq(zeuOSgXzQBvgAG$wlSLCHXnZ7fvbLS&^lqWoEMv z)5V@eWXV^Wj&EMZ;c+}>e{H5|FZnWA4Ot|5gzvpA*gy`&p@4U ztqsFB*F-mL1~ciX5y<(QpnTvgvo(<+xfF#tWel z6G7$U;$zFY#>NzxgR^crByp&+PVV?=bpAfr^#{QvH;IjubZEz}n809>I><`dC-&p!(agoftj{wNA=$&h)8 z`4?SQrApT{z0%w=6>3LSLV?6xAgxNHPcz=2Z5uChCY#{4p+cQ?cv?#$&g%%!UMaK1 zd%{^jsDOp$TZ9%6431-!P!Ap$P3VLyS%iiTlyi#z-cynX#{#ff6GY zB!dLR_1GAOVqZgY?*_fuM#7eq!~VNrT4$y={kMB-oj+sau<0?)+%WUnp}Ey!a8_f! zxgE)p6~%oQF`S1@#Kv$hQ}tq#)jT@S{`1W#0Q21zK3%nbZJ9Mm!MO|q_gcI)0}>$$S&Oy-AyK4>`{^Su!pSMMj#4h9VBf&-Gs0Mk#&kP!-@TNA$+u261*J zF}t-BaL(oD+;d5Hn1v9&gqXqJ7&qrDS$6D|mMRhPhXI}!P3fsywQ`j9SkBI38#bl( zfOqiRy7&oOE}#M42Q}yh*$9c!|3+fj-9aUJ!jK0@^^-)R3K^kgSwg5)2_eRGocted zC}JKDJ*SuZq;6-g2NM@LvmDsmzdze{{cC#;j1H_U=h6If?qkj4#e96jDOl>==Fr!@ zNI!o(@AD$l?>m**Ji|1lY0ir|v)9vZ-sjriF7_md7^{IK02I_)sY4M{d_s84VhBurVO$51J+$84Hn~yM+dxXVAdnM_IPyf2!$MefSkg+=3 zU#_Ir=f8Vb_rLTn=Z5Ec9Li5tpPWPaltT|O=jAZ0u2~VK=^9VE)cF!Y^rN58FFvy1 z(bSxaW^S4@O|u*B(_z$^bY69AxwsR{*W;{&>Qrdr1X`3d!b4Hp zT1lIw(Xv!hiB6k=@xe*1%e!lade;_xX)=3h?7-gNf4l#Q?frGdSFgycyb=JHeMql| zSD!Q#+PJyt;3;XN3pr+YwW~2dM2)Xk`27x-SMB?yuS7%hk<{zbNUu$DmnN<9(1cQ6 zY~AK9E367y#hY#XNehwM9uk&VoGFN`QrrM8_yLpEuZAE1z6Uj63)Tb({cq+18CR)1 zs3s1O`2i<>P$1yeh;~AWlQhggm=F{$kJ10od=~c)qzyX<*}L`qXdieeHZrCjoBZ(y zqBj~2-wiHbJ9C`f+xc<*opJBlZy&n%x zgkY?{WaBx(Cqg~G!X_(qT+I)j3Y~G`63A*Xy({{k(hFYCcqx<%+}5Wyp-k$K~JcMPK>W{x^=80kY=( zoW*^5cfXsYf;5RA%#mc}LZz1kP1^K{CR#oJZ8h9+pxje0slq%H1}3|ZRZKiIGu91?NV{|r2>8zHRuXCg;p$GFgVv@dDQfdu(;vxlBvzn{|yyVG;8}sLB}4{eO_%^ynGRvhTfJtex`RF3XvR ze)st71MBbYq}W)9o>pg!Mx)dC-VP>@o?PZ5Sa!2lD-s#*ZLXwSY*V4sBT@Sa%mqFeS)8)4m_P2$2*xEgx zw&VYNpS>PUyx#5H{5X?`=0LDQ=%pF|s#TIq!P_<{J+{2p{`)_oRTZVPIXk@#WGms> z>};kYl{})v^5XN)=-7E*bcM=GO%(jD_lY62_(|ifd+fybQg>=O=M%EFQ-=Z`ZVl%b zt`A-a^~3|DbVlfWfQ(zAON1u+gp{0?dR{0inOY+TERqnMDj~vN{14<+B+t0p>}WDf z_PWK9#@Un4$XtKV6dlc1POCqU?p9VkkZ~IBlW*Q~R`W&Xq(+bJ^xie4b2K43H`V5<{k6HrGKcOcH1eW8+g(V z1e%Cyzch_3@ALo1Lmr;j^(TgFJSGk=P>K25t-H_fRdD+zF;Z3A2C1}jL;(c388sq? zM*-dkE#QDOD1);6?nH$mZug*-m?0mWMCv~&BnQd}?Hi{Ko>-Q;??p7q~W9kp}hdj2~ncSV&StaDW9fsBO54q4d$n3BA z5CEj~&z3%(ZRU5$&y^+JE>y}OQn`m+gEZRSKw6FX(nv%^#5n*NBE76i=~P32N^tvY zhshVo;Xm>hcZ;X!e(*V~u8w}fv|N&U$w+)P5z>{`Rd?Wod-F5qJoA@Qt{UCjN87KAU(V(Zf zNdNO(HU$87Q#Ze#tK+rT!;eSUjG6pwp0_0s$dsb)0U{dFIBVrOQNM5(I6w9DTh-%~ z0i5B%Q6{n!JI7OhI|Vdri^>xzEiIjTCGc7sNRRvggI?LV!ebkew`~Q-jaZLtpN@fH z2LcWpIF=v)PiJRS002NZEC2ui002uL005}~00400ci$lY6#ohT6aN(d5dSDVI6F&A z{|x^P{|x^R{|^5Q{|NYA=k&x1DKm(yzd3f{C|=$(qLs>wrO=iSS+PaXxeihI1~_hk zut>Zh83=Rr&pkG{&HJDB_U>EznXRvUI2jBbd(I~J%bR}xwv*J_zuo=g*yGLnqdz`- zGP~bi#`gGI=EcWzUo1a7a2J)6;}uH3^BjGr{kzSvp?g!m>0Lg_yH*4C<<-mM!bh5t z?DO{dOUHe?!IV#d3G#H}G{19YbKWnP@82KE%mRRuU2ksx``y@syG>?9$v;4#a7Jur zn3Y5IeZ;@KOC`Eh(p=cOkdh_!%%f}HK+lXXwN2IEpZ)1IDB3SFkTs@0z_du_d{NuZ zW^3~2Q*=7fnQf~Fgw@xKF#vLlL@^E6W>7GzrU1U@EU-h$4I!EJB`YZoIPL$OBd#!P zErIDlVZq7g8dP9A!Xilo+aOs-`hQxZJedl+k=oyg{eN3XVYRorbL?!1cz=o)9={s( za`5++wgbIe_QT_hM=yt)|Gv?FqEPMsVoRPHpl8vJx)pJZo zjC6Z3(y|>MGOkjrNo}khPdy5jPz6bo5W)<9uJ~N1H0OWU_v)_G`Toh)i}bt;&-_&5 zpWZlLOwXLY|7Gtt@5MYGy;|N4Y~1ZW``4##hrNFl{RrZqDirCyFMlrgHDK<%`uKJY z_%~m0<-@KVP+E5`^V8X&ln)1t(gNQYW$gdZQK{HQZZ6ZqZo2n*h(hB7+{|{_0peGr!j{{mW9=A-~ z2-#+XAS}ORMd7&4Exoc+43|t=|BFHqZP%}OHm52@>&O(U5UMi9{TCOyxZq;HA+*am zSDo9;-r_C%cYpoac(ndoMSpVWQu_JyccaBC%{{>%~TElQd@v0GIl|Ph|1s z&+_sR+@3D>OaKZrY-9V6XOH*3etrpexCgjLOke?MM?V2V!fzS`geF#`p_)fvkn^7H6x{7?lDq3CY*V%|{tgE`l5#F>4`H{5IkXTnkVviMuRo!gT0z=?&Er9V(gM5${0Zi6Px zZ&FK23TpD>YR8pSs-hjelXDR6FGVLDw2xrUaW)O`(&M(V&ihEcjV7h(Z-jO4yA_p6 zOGBF`?eFk5CK6(sN?JH40&oYkmCM!!Wq3=^(iWlL9%RJ@A|&;mGUpP_?` zCeVEBH^2Y(?c>v*{Q2UMPd{EgX7r05e>wE)$=K=Cc!C!~sFE0$8#_5UeOo)s!Q5nP zi0)~eeU7(XuAQ!9|2CN28?)LzIe%5+6fau$k{^HC=YbEsa@*l?)CYT*s#I7F&vgMD z52|lSGZJq)Y z06sQ0eLc2&tpLCZgP(Pqq5#_dD52>mHL8dMcSlCtZ^I*LDn+#~%#QwGybxPDs^*dC z&*TTd5ri}g1AmShe+l}x(7}$zmh=h@V&rqXq1q@(Wv%7k&KYf*6z!v-M?>HovO*v` z2Zosy0MtsNO2f;Uyss#h@3?s~^T5~xgngjDtl0EUYjT>B&Le!k-1ok-`-=-mi@bew z?|q!v^y?&@II)f40NhSNwJ==lqzrl4!_CjvJ$g?8fPHQ@R~hgBZ~H6r=N8fT^6ZXm zK$}X_kJ>%2dhhoRwGr?L9K=o~Lf-O4Er4TYW8Oew}as|Migxv_sy942S=;@+u<9=m(D;j%d#OP7h0k zCEGi#tc#B9an@V}ku4yGE2!w+o4w`so!=R`&RUjiW0qzync^@u{ro)f5AL@XY@cTM z)R^}VK3o4wWPamg&(dglivT*;#M~B=yhQPizmzNt$y(>c=mw*`#PpMYsST935A8`Y ziLBigMG@1>rO0TW9#%$3lf;vF1Bp-${eQ_X1RdJ_-|{1gt!d2fzN67`trx4;tQ>0e z@V@EAbXbSm-wx|Ym-i1J4&f?>A)7Xi(?lWTQ5=@NQ^JmSqsuPm zavoT7(om`Z!1`yP29jvp-HEI1O zO&LS>uRCLHuL8X&-f9er-vL5)=1DY-UBnLq3qvK&dzN-}b;pcm=l%M;vE|GDP;=L2 z_`p41jqx)06ypRWGBopqL_Zkieow1eaKEDr0oc1`k;KM zY(#J@DtRGoj!27QKzDhj(N1o!?=QeEj|k=^1b3xcK0?zhy}N`qwkE z@)tcbS^4tZY1GbdC9z1KR*c;^Or|&i_8|x)y zYnpcd{0mWt0sy;n**@_8;-5AKD<@kTr>GBqTVR1^;gU4Z9=Jy--LpoX9T0JC@RZ)9XF>b&dgXN;y?e|N7KC+v%Un+c%PTm zBwvcB-~hc+%_KUvhJ3=H=HJjy4T~w zn_ph{x8FFu%^JVU=F@#@NAh%4EE%mn-TpD|4+s6QIN1;jAqgdQ-H*SY&c|OAZWRC9 zH_Gnf!|oz)oWsMZ_arE$rrG!2IXmk;Ij#p}767C|a&LF1lV1HI|9UQ?{qxKOfLsT2 z#n08_xom=8p-ZBL%dyW}YXc^;FD1#kU%qa1YoLYZs`j|5DmhrC^M(Hl4OG#;v?rxYN1XQGz6oy7= zq;pWDq`SLg7;=VziOc`Sx?j#->wG)!I%n^*fBSi#$HR;#JBgld1@En;DEt{w9H>8Q zpuQwW}iFk~gBlXor&w9$QbkatGLwus(mgPr%?Y;1O}@QZB) z_6*?;w(4MP5cljyw5@iXPN%gNZ4J>51sU?SxvZz~5g)4eWRJ7$G*V6GN_lpKEUA6% z&E$P~=Dz`Q3E29z=Szw!n2kJ5rAZ>R&t|I8Rp_-;f3EP4|E5aikW$R2OpNzHf5eszN$Lr5FQWBc6EDIigkgfJ})I5TM&hjfQ;qUkZ zi+9IxMcGuc0>dA~TRW!(Jk#9fMfr}Vw1pZH<0M^sU){(Ud=xGcp+lv<_YJpM4SHx) z{7p}*pmuZIT>IujRFh?2wWxt=Q7<^&fxp<=VW#KZ`dLD7Alt7LuBsSeL!Z1A%Dcv< zJ+(3I6w&&++`QzJ4?5yjY#!Q(p`ne;d0KDbq2&FACgr6ob4|B&wcU82E!@=IOrP38 zTJpI>s(?u%^T3go1+ja9vgK~0=+K=$t_~7*!UE9X?VlRE2xN;F5|8U5J|S{m(6mZPh6pk=(8eO(*lLR4fk>)O3Dw-fjmNJIsRx=~n0AwL zmDuxQs8<+-j3O;G0Zg@oz!zz!HyJpaI_>@pyLAKm$M(j*l}^IfOTR3qj>q1h2p+Sj zF?e<)FOxg@1ntZX+|&}6B0uk_1N_0)JiTX2M+mi2Kk(R?JSP~*pC$Z3d+^{ zpNRl&8Txm;kXvE_^ZvnChzehbJx5H05)%l#=o|R?F|Bk>JtI7Y3T!yy5Z4IdG3c!okxIM$_g3T3nc~9~{05 zkpydp`n`*;p6B>*I>>R~@00Yq|CKi=1pPleD8GXT=_C#TZ2uE@fxb(?pufWf40l(` z|MrIbPc8->?lG1)*ZH0_U)lkK;?Hs-B~`Jg*8K+vG%eH6r`30wE7qizBxwwTYPMxy zZlL9`2>3)#I31DOv~1eNXlCq?NTHipcz zT-{8slt4R?B4VM#s>fNk3#M{ywV4C}zWDYvlRVFn9lmwE*O|Y0H8fx;2jUC@9MOh+ zE$wN&Yqq_=hyjvMBGfrh!a3zlLJrObfrngOH`k2{#qxSod0H>Gu6#E=(!D2s4X;Q| zpCmi%)3~@CevaDODvciZYNqF8CBE{C38Pfg!0vpE@||OFcZk~XvB}gNzjKcq+yNNm5v==xp*%s!_wc=SYK6>|&>xxQ) zi!abnC_<6v>gV~KnDcYaKwA8N5flpFS;0e{#;b{3TlL|x6&)PT2{+~b1sLChUY?|_ z^pOj+--gO+4se8chcTlW<(e*CoY`8br}ah2pz%EH{#T^dso?(+Jgzbxb+aH=^DaybRT zX1?`op67FNpr8r*`Jk(fQ(Xni4y~yS%{t~1xZr*do?#CxvJ?$Yp#Pq&#=lIe})86Z4 z#WI<++Xsypy0)TL!%U$vC%G4z+;OIqKPWSp>Jb@udBpD4czu9FIN{&oHF|&RIGYDr zKX0d5TYmVk>Qwy4ID}<^G1QE!KvT4!4t#9Zvauhs;D$j`jn2hYwZ?a)6YpWlpm$DY z?H)C&+E%$BVJNd*N8;SvNQMP4VxdXxMHKTyjz*KF`=Wx@TrO~xS2`*sTpye7!{6=TPEdBs-L>t zRf+q=M3wt^%uC1H-3sL9GTTow>F&OWzxM;SzHrT~v6$#!+MVoa?97O{K|fyGHwqW3 zOmLn_#XS2o@KhebR!t+I1Gy!Ehc(NkCViTMVj!Uvx{NeGEJ=sA(^IQ6e_hLCa5bR`u zHo;;*pvm#vsE*_DXYm3Jxrx7!m-ncyY%NCj1$tVB!_SxD;2t~*zI7C%nj z+Ke}RL-55YvQI{${Ug!o%371p4BpFb?q}f8h}%6EWYW>kw8RSunQ$|ypzz%_+y)La z!)uE8Hl#w1s>!aMVnlfdHXk4_f12q1d+_@~~hF}QmP1{~Yf zfe6OBUta_SC+Uz?jlOC zi)j+g8h%b>>O6*o>|5Zy&!=X>m-ww{l2iB{LJU%lDb+ zPGb~Wll}&c$*h5|WYtc#9-X-yKI^+NvXV2N7z;Q5nXL)5pxRk&|M_Sg8$L%Er&PT8 z;Tc^C)!je(_qXrujiZzfK{0E>Z{Mq7n;ia7{W^L)zagF~>R&A>bHP^|_lJ`-y41xy z_{H<*m@H^`d$s2s88niUfc?d>Y!0L1klGF^-enq_{kLpwW}iaiAS@wa&3oC3I9OTF zoFy#yX0QI%Do~&HK0;}P2bIT!)^Y;z)qxRY#*msoEQbK)p_tg#==KU*h8$C9;ET7Q zYWuf!-_iN~(zAXi9 z!YO||S8)uHdK>oY9HP7{jXQ1H=yQhb9HCcW{bFl*H^-yWWhvcEvIxsIwq+7rm0Z5uBml`pB`{+<@CvQVuwD~BbA445V1eJ2W3s~|)D z379W%^DE3-G{-CxP%t`OKedP2OMD&(k*`UrL9PXwReO;?>g@(}wNd=FH}`6cc8xyP znd%me>05;&AVRO5r$srZtUnwd`?0#ms3R4G3|nT|NXvI{g$hh(l7(CY8C~2&H*BU- zp!~I?mXf%|lHbg4!9R7xGl%CPk(x8i%&%ai^etWuMd5l0KcullSAHMt1Wfhgstago zl{d|zL+07XRGbC@pVqEcBjJQIRPkJX_qDy;|0F%(&&}(2e1Mh};bN#%X@Q2cAMQ1; zP2~okVjGv2oB=(RK;|0u<3({n+=ddFvMzp{o3-=A6^vJD6jIDF^_H?56$2H@c2WH*m86e`>+HukaTpZ}>8E$T#30VaT zrdCh^v>2_!feY4PT(9BaH{#rIYAH6Q!@(%c4E(8w^8&DnHQZ^dmfS1bG%^v=6u~OH zg>$hejs6(Kf|=v+N0BqJfNjpakbB=5U4?~Tla#a^vAx01oO|CK#BTc_@yR-pz!LfW zU6jpmerpsrI}b+O;WgcGOUXB$9|Eb(WDgBf%8S<(sJLvbnbh#pl758UczJh<*3VuU>)ok(vB*(D~wCB z+1#e4(aU2!6*uty ziu1>V_7*I*BNqJNOZ+E|zE6%=geeV|v^qOul$?|=#4OJ%c+PCsd)w>oR#^9_26Gd9 z4Zq)6tO;kiza<;M$Z!m9e9a)W>Bsa@uABN?MTAuP79-0^%<0QZM7ulzA*c20RuwUc z>FI@1r6g~FCDN@WvhJ~|D@FBt=BI1zyIeHyhs6gH9)BbF6Cl9dUlDZq*nVQ4h!8lk zfbYWj+k3C2s4N@0VW1djL^az~p__{%TSIpS5QVmjVUR}gRxfPJ=mmj@*oLP%>J3F` z`(l?-U}$t18nys-0PTkPF}j&cMryNim^FakMlM`Nfl0XF?ZCN!_M)clurn=L$Wh0- zQY54C0lZe1%sbt#Ypvz_<&{FZUd~Wi?wwuVu{`t) zGIY(#4A&!g!j_6#?exkur}G+Gsxj}u$2<=<`Be0HnW-IMy)}QmU*;)tdwq9GAajrF zx=w4V28urW*`OpN2g(a}p-tm7%{^MM2*<*l{h@NZMuQK$VOSCmF9=f_-JH`yBu==h z+#%b2SD^ALP^7fug@8+hC%4Tqt5p#tQYy|W-{AGfE{eByj8g_`Pn{Uod?dza;w!ME z0=l1{KP%?m{X0KRxwidKO+ivacnr^y81_pM#7$LvBEF!u=o-!QuG^e+yv<6mD>*>+ zE-1#ipq#mn;|BMr3kyAhpD}EWg|9Bj#}6&xfER-Yk#KZy67HBZhvEV7rm6Shm9hNa zMicSStDEK?7i1qy%KP0|^Co$(hpN_ymqqD)nRb@>!T_pZkAbnw=-xzwjCP=B0C?== z73HhH`TzwWP7p1V(Qei3iG?Z2jy2|3uB8I*%WNrG23Wa4hwK)cwr_A?Qo#j)X{P_Y zGwmd=f+?iq?eDRTYhP+s3ue8p@(AJrywm}w%w_z>_dNc(c_Z>+8G3YcU2izPJrX|+ z%t(Lz-959a1ibeg1aw55eP4S72z<;AXZ}QZeix_fUaOQY9d$BScKjp1(w)Wc>ytb| z!q4YtLxx--)voyngBIF%9dBaRC6AvWJz30b-J=9_Rac~H>cz6L*A&xb3q7?Mn&!5H zJzY;3=%w4v&Pba$zu6uEpGE?Dln^v3;c7Dh^RqiWi#)4OwIMkEX;vNjb_qPupFSOjrv<|rBDRH}S= z3_;0HWq=J`_*&cqx!*#jdav}(5V4L%mVaf!s9uUjIY|wD|M;js-;!{f@2Mq`zf)A0 zpNQNYN++}1Z&ZAKY~7!4zq6G=V~{+}I9d?=lKxZeKQV6RQ4AOsKwPt$jxh$(NTqEf zzwockgPs0?JH*n1RpgOL4E-m$Od02%a8}(6)XL6j!WY!$SsI#&tt}KJ7muxGHk&HS zlQ&z|Y+G5Ows{he(k#zLCtMOywzqRc$MEbR<)mb7{h5MwOLtwS+~xV{=1%v|oST`0 zISg{ij};KX4nF8}d)N7;qGrS$aqhBUZid&b=r6)mlCUhAJnJ|uGOc)|U-cl-)X+a> zro5!v`=yQTp?iOPuBl~%&nqnMTMZ^1R)aCtV>ukF-(0S28g;sCMExsKcaH0~Gl}{_FDeG`$35BW(>d`AtAdH zSg_nFFYeP`&YEN$V*H)wEk`SIwKFhfMd}U(#@fs zo&0X*&B4;k+o(%6|4U^p#kAFRpM$t|{hL(>KAJ;`u<ej8s8 zR^!TUsY&-F_s(lpnvNmLsUHdx%B@^*m%6|l184kUmDwlh>RNVk-Ulr%I7hQkUJ{b% z3S6Z0?Ir14xK=ajYGd=q)%Et+^hk&58tkR>k?algUzI-Ys20Yb0{HcJHpw5R+wGk> z8rC-!vkP@K)q7~#Q=vmBK4vyupM@e_Ol})@g)!l@8tsIan4UMm%Oze}lA+#%J(;A1 zMQ)(D(RuK)!GU;|Kv%R2VQgv5{!tPqW6w(FawE0~uUHM#Q}32Aoxb@_%Ax;q)&BUA zThpWGGBcfF!@|(1YB%|MOjl6Z=kHJZFQo*9n|3Ly#B2eC>d@?ULRCnrS`)}cAnK-d zf-)~Z82zyCfvmRcqnBS#tWV)wv2Lk{(8yzxzNHD#$_Z3Vf)_X zEgp(iU}$_Sd-=AQY5xm;Wve-~%sX`W-|Y8SVV@W%6-Ec8Dx(Tt-{XQOgJ?NKNC6K< zTk}UOV9EGlRf+^JyvP0sLj_TPOdMv;kPa`I-j{wG>2Tv%ZsQ>Sjc(s zGcR7Tr9<4C1=I&D)0u_VAYrMb+Pb;^V-+-mDH=8&1b@-(Q|)!6!@jMfXZ0UP%AB0> z@X=a_x+h}imKGLbI8m1HNdX(qduku|G8``uvevh5=1-ppZ($KeA>L^ZrtfL!LWGyb z@w@E@lDU2kao~-QYL`oTi{H>-n94B&wZH)UV0EWIr5wf71PASLUk!(KtmUtI3ntwe z>Vn^B)^vrc#bxAIaNk z5q^w`oM$JQc}4pjEAT!c?R<)ocjKe>KU8Fr>C`4?Qr(~vHpKpOua7XSulH(htyw&) z7UjB@@~X~zAC!YaCF{g=x<|=C7C?R+G9UeFewBR?cD$ddXdXXDh8i0J4?(W*ZrO9& z7$Y^B82qcD7TcasH@TGwO4azp;eHUe7CyNUO)xLXI1#Ws3eYq9(<4e)@H07R z%gc=`o`Jsfe&NmXzPu1=a{^+_5VNXoTSH+hn{gEO$N6d(`?0#s=d*+P$@W%fTwYEs z(xy9TME&$-g8-AV?r}T#cS|=wTnWLh4Qd*o=*f?kTkKM7F+TU0y0O`Gx2$X|~FPFxS7$ zgs&iGPH4vjjlVC2;iivpi{iV|g`v59&yG-jgWt06wO&#_j!U5S0EN3fbQZST9O08PQfyi?1~n6DSfHv_*Ct zRv(hhG)bCLx@s9YyE5#xhZD^l5$-ek^${bM9Hj%@+^UuHRQNd0J_Wm_`^&MN3$cDJ zYwbQTW0cc}$BbYZ-+Hr?dx^ZxiXZ~qJ^uTcWvP#IK>pW@l1?$t2M9~%uGp&U_+Pm` zPz@XUi6;a6t)*yy!v!ve4^7KoxXNoL{^AX^yfJ-#;T^gl6Pn}U-PiccKDZHKr=-^R zJuwbC3>RA&#fr&>^*slB+^PT>@pCd-Q`|=a7Y}dF@4HF!!PzqEBpQ6L z!TtFFlT1aysW%r}ePWiLkP{=7Az36SsB;Z{LJa_XZ@D%Xid0>%w$mA#q15Pt)KdhEjYUz)YVT~8m(ux$_xv_9tcukF==xk(~G1z z-5@zuI-xS4qp)a8*j5`_2+_ehw1(M~HIAp$7sjoi=*{O)?%9t^pU+q=+fP{xP6k<{ z)B&U+!Sdb{hHUZ|@vcMeJ0-t9IDa2Z7+JB|)aAqk+15@Y9-fvoUwBeF)b*m8GLGY? zXNmgbicTq-K0V*m-#Yul&A`QH_!r(jGVvl3Ku?ks#eFSgxyNr!l*ONxG*{Li@}oAV!GGlfhNR4$##VVy9pQarNOyhbmxxnUIP8COPo+^$9Qh zP^Qs$&?nSvH0b61kRkVnUFOG}14CRygmo-aYh}F{w3x`+i`%ee38crZWiG%v-NACl zaZFP8z2(D8pR;;m99_4bFL0rbs1APw{7Rpcwovw*{*0rh^MTL+-V3kpgKRW?PQWPo z{3kW(gSeOhRa~=Gz}0H|N;8t@6eXgbrzSj*XHxGo=3)`?AYx157o+8#){m({VUc{bKfm87AKcJj-QMs!-0@Ys6+Ya0LQBB{D-1c4q46q$)7^!XR=I_I0DAeCl3_Q^^GFyc7 zT`SzMNKvUWWpxqzdXQV~?KvK7HJIF(B=>9M=)*|2x!ofVmWY*p)RSgZBDvx+aqeUd zg@_nQ&V1O5OcQy0Y^g{k!QH!zno5gJMO8~~5FYrjSIKSmIA*WC_5R)?!81z5t|p_- z>Uhe4^|2-5Zfp)lm;rk#4_zlJm?J3JeIy_JkUZDvAr|p zwN)VA5w{P%s!cCCbok#7|R8LZcrSp{qKiW)Y@&jxtRIUii$_^o-(+~jLO zgYtBv6?i36@H~|C-bN5}Q9zwn$i?vF1$8%3W;Klox(hU0ex25pw_X~*|F}U!)H0D> zeTjkO*3%jwszMLhsFMr0#;etH&(cP#&@u5 z%~iqIW#jhvec$XuHmlD?ikAR2dr`;(d^ra97RAx-0lXt1#O;zx{c6NygHSSKz4<7^ zuxKM-gL#yYJKnJ(lZV76Ri2@Ja}K8ecACWvXw?wAbGQm_a9;BC)wB}6*2ji{Pu!vC zly>Dd+UBGHcppKHe9lZ@qO2@!l!|xUp~rLMwO5}CMLI#tVuHRTmK|fZxLr(`JQv`g zx6>WWWKZ{Ng7hn?Zon8OQ{H1JujUwoL7W}!fu7Cdz1aqNRc4UYlY&8hJamjIc3pNP z*@d_Q&WZHtGs!4+TEbssRa9lk4#|B#-KQg5K5x7Twx(1G!yowpoGsBzHGeF@iE^U( z$y+wkZ`n@1!tH+EMre}%NL)6boZW=#9#Qrme9+!;r6LcIRJ8VXMAhc2v(T7;G{1H4 zJ%O8Wl>N;9Qx#eY+Rr8W1%Tg1F{znvVEqz&d1Amb;TPv~I2Fq(!O@PEoP&3J+nTdF zQVu#0^jv~|+j-3zf&oPZmH>xr>`K&jy86H`R^MJw5W2m#UI33d6N|pQZP%iWi`lS| zg4QO~d*+R7!TR58BHedK3B-Id6#+IrS&Nz-1ba8bMg7VD zW7WKv{$26$Q}w71nR8~k5bAIHTXP1VaTyqDyza)nv)#dRc5`x$ho6s#ulnm&Y7>h5 zJ8pL-5@(L zLlPL;xq#L~UaWzT&OYF0j z*$ATW|Kk>?|IaNd@3;loYL3u<+$$*mn@~Kw8=3CZ9Za~pQ^`AJ$A7v;IJ(Ndzf&GK z`^UWC2@?MGjni{D>oVEOV*IB2)TYimy}m92{_Q&x`v-M58zwAntnYLsV0pGbzWr;J z0krH2#$4HO^6GiwyU_VAv|4D~nWu^8*0}YI@mXvVq}68YDkhG#zgon}Yfk{N|=2fkOX_ARM@d2w8d=r|}hU*XvfEfoa(yUWLm$Bv3L4 zy}nLHF1zk4y}(?2so*}tOMfERYA0{hBQ z_XgG!w1|JpBTh6Q3_89gJ2}Td#0E_ETwoL@q;HO%c)Gk81EN z=f21A{;CjA&R=8JiS4%=u|4@ycRZu^!*WOX7>1YS@$9FClyu=cZ#Jkc)fSHfJJ06j z0ZzN7XU9Gy2nCibulnu*lmdGmcXaK4IF!b0dV2SPD{C1WtM+vGtHM8*A_GC~9guk(R=267@M`;UUlu;qxJ+^xrfpfpa_+lSK+~bg5 zXH5d6h&nZOl{0+Dgc*R!^YvZmH)CBfV=njAX`3zJ6Q$SO$n!l5DO#uICrx=FH!_2C z5=#A#$pszNobK}KWPZ>zQCV9D;=zz_7T%Q>=lY(!BT-j)5NUOwA6<*eof_R>I@#SZ z*Nxz9dJ&!aCR{23lWdN*FdRAfiM+Ee`F;BH2KSV&5qkd@3th@Z7dmnd1$L5IS+ctB z?`MKqxILwm^k|Mg0;&cc zl;!?&@NVS3kM9G+`eSrDk5_|)Z$!o()c2Q3nzQv5<2C-^!`7S@{FXU?Bi@D%6qt$b zljF|0|A6o?lOH5cW&hzp;+rp7S)KnV3C-_)I4j=uXmN*bfgbapRdt>N38}RF4-&^x z;x9>+rUWK5wjjYTf?3K5CMHA8Bx5n542ArPr2eXmjCO!L1b=?ih_7Gd9K8Cam=NtJ z5Au+8q61TvwwoogFAE+@(og(+X6Tc0{@%r2QtXc7AUfjSaXmdrEG1wNYGy4b@0?d< zOiZTrE?g|sKl}Q2t>fvHGBxQbYg z80JPa;;Xl|CjU0nTB-*}WMLiYmt_mvyDJFwxTMT-L9JSgMkT43V9|4|tqu{RW$zeA z>8xIyPvzBq+O}iO2?Y@CywkdNk%&7zL@6G3wQa8knJ)=`u?iFFIGjsjSlUxSnQIKK zJR!3zEv>acEwxzDH{KZx2Dw(48V#SVJH zoqmxWptxhXh$0<>ds8oN#UymPsaDLl%Fis-ww4xxW zr9~2ZJcDb(sx}xXgz;!LeW1-ATC$jMNAn66zdtt1vVc_smU^iTmJ7nn;f;7Ny|A!tb;4Bp-ZT$?+?uJLY-m3$BWV3B0Kv;;W;(*F()k=0e5u=jxe6 zY^i?6(i*mBcGS;jOfcbuXh zYkYI;R8fa^Ude@H^jQBAfFwdtjx?$Qh;&%r`+SS9LtsGlb27*sAdk}=hcFgK{#lW{ ziaRMrk#jJc^<2J?j4S?qA-wKr`>OC&!Ho9jaWU;N;Zo5gyve2oXJ^_RhL^|y?R7kM z1&vONxq&b(g$FDRg%tPi%3*RZH0!O)eW|H~-(rb{IcB2`FJQa)H?A+W9K#a*J8aJ0 z5DY2|Z=CC&)O=XFnAoqanGW@DV`}wkN6c+#GDF7BKq!m}1seOxk-HjusW5+y)|YN` zkXX7+uyp@>S{52G(Hg^uXsxM~obsc`M7FwwXOsA>eX7ne?~+teW%j{?feP zarJYPo6Tq^a+c_Ilj_m+P5LI+q9)-F6VRr&JEy*+apr#70MJlbqtlqrE+L>W`@7A>|UA$!yzXTJNa{sp{*MH8u8M7f1CV%R$(L+|8Z#%h9PWu^#! zn@gC4)9ba@0Lbq%r0G$LRnBm%h?M-15YaAo-siLCH$?W@@b4yR&TAejs;{qb z=M%~+0q`d#*9=A$<`W^8d(U}Qmxgz4j((;V!P(lZfvgPC-y}qqEKl5;$8f8Sw@awB z=@Vzro3`6!A<A#F7-JbZ--!@NPTM-ZRJh8=?&aV0VuvU$tos$o=t*eJIcEVR_-DCqbP5gxd@P zjbRl=FN@OOUkwh)?4`-c)Zo;+Cl>3CD;kD$%`KheyN8*B#=y|f>&Q6@FbIp9SzSR_ zy2dMdUJtSL)b>9=Gkc90y^OC(&$$?zYfB1#+L8Ge8!ocDhr%JGbjMn$DTk77V}ZBP z0-uGPR3F3!LvKNRSEYlTf`r}XQ=$H?0d1Co=1w6g7v7M)A)n^(QPR&Aj%A2nxBT;j z1xnt}`K~N1bbU_S-)Jm~sGGS@=_)s>ip-!JY459zaxls}PfjnzM>CM)DKEKa;E$B) z&4h)pB|y{$@?SkceR_&tY?sVgSCQ4~^l`=V*P z4++X`MY@-~6SqVlSMs{*ZhR%{dOmmQx3}HYOJ^}T=8?Nwp|Goh(6h=R`6@_j@M1^c z?)(&sW5`Xb#aX&Rr)!umx47&c2hriJa+&zZdva;vDd2rTNV(X(-ZfQ1cD=Kq@n9_7*Tujvg~o$6>8vTE`UUxSi0li)Wddt)-Q6IbA1?{Im%isz2%)cp!kgpk|YfuRax( zn@V(2GIt$EFwvlU){RyUc#orE2Jg3zURdMH5wF}CYMJ4&t^ng|2Mu;g6r~fa#Um;} zj6%5u3p+uDJw-#e27JE^%%3>_WfqhRM7wxQSIJi4C_vs4CUwK7jbf~p@N{YEs`!NV z&{AWIAozh1b5}w_l1sqt!OouDOi7v1EEN2>#vb_93U4 zc9kG~#vbN97F|EtMmKz0E5k+WRnxP&;StpN!z^_F@O^Oe$i;6-fU)yATv72VjJN_I zoR$~sH&e!Ub*A}Tdj={@>Rj9a0swvo1dbh#u8vZbDE0_{HvyU?HnbyqakKJWKmM|* zZD|c!G1=0Zn29HVCM)TAL=6w%H?vAU3_i7Y)JGB3^SHiEpnh-$}D^Q?)z zJ-AIx(W7VII-BPOh~ zGNg!lTljNVDeOe>+1?kT6YSpgV8!;~;W&-I-xcPJtzRcYcQ1Mb7Zk=tzmYni9QYm1 z#<~*T)h_10f$!(}@~|j=Owg0u7cV7=+(VTfk~j*w){-M}V2qA9X>cic8ELioey(l5 zH@Nc~6x}(6I${8j#fQZ`IE`7Zxh^-vX)JQ@J>*?y*!WTNQ?i z`5a!lPE3&FiGf^hFF$54;jA`$cJ8OB=o6@)FIjPp8StRH z+0g*4%4pjlS|2`UZW(#!iz@41aPF#nXkMfHuYY_;v1YP%va$Dv+-%aDc(v4h7CcM>Ms(WZAne~%6}g^(YH!^lIat-io!$$)QHqG?c;Pi=VmNA)Yvw*taw)8 z$JHmL#GU)de#q@vk9}IF?)#S>3S2KyRiIzVmiy=@qgO@&#v96~JLroY+mu=w{(#+h z_am~T8D2J>2$t!B2Oy}gS zdaApl`z_t&H6_)ciOPh61jc)g&7~prbs7ONrQBe|@htLJ^EPtws+9+8s%Ox3cJKwh zCHY5-FY5Mf^VfA-E6kY=-|GU^71ELUE9yU_F9hz6IV|+|=Dj)EXRQk2-5hmr%$Jl; zRxAZg5og!hMt1Ex*V10BqXbM5uZ7f0Q+uxVA7RW^r7A|Rk;+!A?=)*NlHSg({9H8n z^0`+7?)d!q*1f)$5ajOKjht(r*b?I(v{r9razPoIBLtVrj_H(xUhp zA~|HNS&A98e|y_V!m=;G6o<_lTXUZIQ{4#rGe+@@lB7;nzQ3zYs{%tCK*>1ZL(|$aucie#i_xO%I(A+hhP~LT%(A?c)$1&qr zanJIIa_b_`Zbk;GgPtwXzb{;iw(O)lkxZsAKe!J$h@Hyyme5-_2mB^Wt$GsSd$--Z zfq)7F=DhQa(iOqwmYl7KZGmx2vw(2(Rev2yeS~Y7kN7d&4BU_cDO4bT$Y(B&dPWXz}GSmP(k;qobRtc%;?;~Q?2M8Hx4botYFDUM%Ai_*v;VL}+ zbbwz*T`HgOn?8LN8nzOh_pC7}>v4wDj?{J2=9H^s^roC0Ilft$D+hrbv4wv>%;Bw1 z_e~CBF<|$)Ofm5L2QGGsstYQR4O}a;*W60+Ud$h(L`KRE4WVF8^MAIu50>{5RYs_0 zT4cQ0V1b{7+AW6X#KCST^ja93e- z*WLtjf-m;AngQx|B_w6_x5qJF=?aGYHm)bg+YYC%A_pY1F<#v+zE z7I=P4D}Hk&%-Pylo)B5{JK|@WaFcVI*0v#V8|!R_9%&jqU0y=8MOl~`x7B3jADO5^ zMCJh{Cf}akRmIOyNKE5lCDf01Lj0V{7yhvAn|g~`x3U?2n1&<#YN{rh{!X=h3dbsd1-~HJHcY9E?8;_Q0Z?)b6SF#C?}5d(u0o?N|qfOEHr?7 zR91x?5ndHxDm^(S9n3C&q;`K~HZk<|Z-I#l7r9nHGOL>yG7*hDpiYo7viiEcJHT_m zonG$Q@i&tKtjX5X5XO|~RF+bwM@2+lHV3dIUeU()HvF2@eSHvn(1@Yc7bli&q~XMq zwmo~^VK*0xG#n_ox9)wHVbAfQFP1rDD)R<-lQV{lZ5SI0dPMF>eyQh#Jh}{LNf;9p zBJa$S%p;fST-)&Bhn-+MudMo6#5}@0<2@e7m!Gt;c&{PLI$hFL{ zo_Rj|K7Or_4_plZdR$<=^LJt&4>znmw4ReOi?ibUKUkMD{@GBcl3MIO*(C2=7-*(V zW53&fxDvMIN_f%Aq|&@j5DV1NuRpYFw7-_G?f&1Q=*bVz5o9QxO?2T+h1#mrQI zAEhk=>*?U_%7B8Z2GTnWUz8MVwJk_*2h4EZu-TT}8~e%_gmrl8P5pDe=3GHuv)LM- zW1RAhnoP0nT(8Jwahox?U2+_)9Px&O5F-4#-AGm|6jl5J8x=MAPqor~{}DT3#CpMF zs)4U~UC55ozk}70+<&(2lEz_Q&LPpPZTjXJ8m5?4%;f0eYCoDOvV6arhAUNLl7!}u za|0T@81BTT?Tp*cS3U`r4_9+V{0rz0eq^`jAvc)zkVBt}%uc z*LOT?X9*ibm`psX3&%hfoJ5AWmg7z9m+Jm){Gg-B6Ys@^J(JUWi0Lui-GG@WQVA%0 zIkyLvCJF0p#z8VXJI)yJ`P4jaGyP4h!UahTmA~agl;(0AA8p-gzfl+txRmZw;Q1F^ zZ&+{l=D3%I&`U=ulFEN=6(Zu?VX!0?``gk_?PC%B;N^xPHEZgR6T#DB!Dy5AP-o}% z4Wrm9*1B=0O3_oidvZvb54H|-Z|Mu5JcR{8&FGM%!#Yd?6M>cML%Lfnblqu70l1PN&+ap8J_llT^#~m?P-*+ynB$(%@X`YdAq>qvc@+x5 zgh(Rf541py;a*tJw%(T29aIkaP9+1jrD@!-7f9jF$*`hH(IDzL1f5NDE9SoqV))m*rU1z$(o| zPuFAfTf4Lq1LoXp>(K~CGKrbt^=KlwGV>3mXw%VF{Pc{f4b}JIu7WD}>moh{puVvs z+Fz%Hsd%8ZQs1cajs0XM!L12rbvTs<>bUZz%iUoJAtD}HG1cE2)0;qDOIyz)o#ITQxq8v-N&ZsGQ@jful4^R zc!}wq0csc$_OB2~y0sd>J<(<9ka6G^y1KXLE)gNsDCZIQIwb7J93r(wIm01ixvb}x zUHxrFy=@Qn&vBYXx_RNt?Q3&G-HboH*3~hw8~LqO_q`s<#hK@p&AZiJ!_L|V2iQNK zf6ZXbLLsOpYId5(jXxc;M$VKJ<97*vZw8RqunRqsFvl%3s{$RmT-V~&1CeJxuHMxj zW5(WzvBD_EEfKo2@^TJ{w)w-rHKDqcf3NzX@^Lh{u-~^!Peb2)82c}x&N{5gufje6Z$5I2RkA9)eQ1C_p#LIN9y|^A4z;p^YH}n=GfGsT0N=K9W zY&a^27&@9;ph@S>^6_UG=CK^)R61BaZR^H|x_|05JpkP{ke;Z9^(}YB3(+QN^%JPS zw6o5qTUCCJ)iQT9wBEOb4&)Hqi+NNBt$^PbM(M3=<~$9W207DZs)J;5P0cMw;!tz& z8f-dNbojfBYWuzXf$KdHWf}t~t#E-jHO`9>D|Z1UGR^~OdX21n?a%S-T5b<=7O8J% z=q*(v4)?E|uA6FdR5CO(d*tqY`6O|2hq|UKV!E#s;bSfCT>so30B;!2r}&0N7xq>Y z*HB`fYE&Yvbuzy^0Noi&b89)+(m0%PhgFT#o-|z84Uiye$qt@5zz3>k;Bpq!Zgn$# zz0#0o8X`wW8KHA=blLkP>`pu*FhkV(*&?+=z6GuNxp?cc(=l#nK8{AZzf#w1yb@DTY(gO*3L%3ZQT%5r*hmQKFf@c!ky+>&8Ym$#NN~iD_+9( z8FxjPA{BrosOz+2nLcqKciNBex*ARA@4`YpIb1anJ(*G^|s3V)^kK37$nuI%jT0<(|p>?r- z(e>e*_dj&>{m^Bew4+zWeF^<$BO9~q$p>?(elyTm88oej8~0munm^A=y`-4X(doUG zX;Ak#z3++Nh5TyEoRQf*Y-4-padh;$=MJ>?t+Z&6-P->|MUp@OC zEUy}b$e_%a3_mA0Uu8>vRUDcZdyz1U){S5{wo@!utCFE8 z@KfuFP9VcyftB996}e~jN}4^z(F#1ef;;f5l&13P$`a9cdR7jt@uArUyPi)wk)&#c zqxXBb~0uDD%~L-ZYc?P`bx{cXV%5%OqM`6T`d*Q;%eUxot@dI zo@@uaDou1e55L{+QsLp5&>37>TZi?^BFyhI0ki;gLn|b#F8nrgC(kR4*xqQTD2FEn zptvs7pOk&k9s4TV_SUb#x;Ln*57vbDa4+GAv7|UXDXdcPAXYS>QZQy~fpJJ7Bq!0m zc2n#ZXC-y`OPHC;@P++M$nra*8?F}IRey3fEMFLw>d?%V!}L}YowX7{zaN<=JMJ{K z5&llRWm}{n?>710O1HCKcWjkvKGK%IiOz^i?WvBiV&PMrF7>yiH(dDkEkgVHOB7wi zd=<4G4}}rcV=;^^|E^>4LzSX%!YbCa*ks=24PHuFlNRti9A1E0=8~<8)?*FV`h*>C zqomkJoc=oCC{WtA6Q5XeN?AjX`?iP7(=)e=la3eAx_RxP#}ylb8{*^=-P;r=7r|^z zKXDIp_>rvxaU8*6Xkh=fcxG$7L91AW@GPZMH7n{0VWX;Ro!vZs)rF8`C@~!7C zCr^KaDmAX2EKAK6&MKzwZB-poO~1RL*{%gFJKyFA;?ZakUTgMg}>5SG6+k@jYmhs8JtR+h$H;NKLjaj zBdpSVoM_hW)6w+S*ACcDNd?ehom}o_dHQhYo_gV^q*w9NHQE7vgv-p4P-Ux+cXVu+JEBC=y;!mAI|^K`MzHENpfymO@Ew z5}-OqhV406^%Wc{JZJQJco5w35l_hHRCYdy^*4yacP*lr=wFM+Og7ijVsk`Z0LZZz zutr_+s8LT#8AJZ1Bk4Q2MukN-AM)1t5Y^zRyBh$NhnVQ+yhvO6Oj%6up*P0xC0ls+vR?t>(+l zi;fi4s-?IK|6)uG6IZG(HD7!2;zsk=CIH(CuE6JJ4cnb)m;OM+ijnF|Z8qTI_rhNf z=LVmR`Pch=F7FP!*lS#V88Bzl60L^xSDbPwi?39p(Cs`@Sy%)EwYy!;cEKOdJ6g70 zdct$Vekym0Z81)%^{9)fKcL8^0(9Y)>>TFkBPSZeV}ezbR0TQ}Hu~jPYSr2DAs3VN zcQVVrIHbnJ=0x?bFF`}T$W~vr6=2L!?J%XaIC`gpnavh-7|(L&#;;E$ui^VMU=)!^ z1=k7r3A5w{_J0luuxjDlosI@he9Lb4`F1>pel+6%_esrDGx^-9;bh!#lwcT@6RHZC zkegl`P`fxHB&yx+%D17tOKBQ`bxBfNkVksW|2e{S+?#kv2cYf_2wvjLy4b}DIF~>| z3Mu7tUGx9Ad7hrVNr6cmd^T^I?6^2eBYnzAsAGt{YRp+|KiKDPL*O8Rjy&pIY)#z#=YAKflWwJwLyOcSGBNu4)+(Qh)l*CsX<^B zuak5|7`F9(DLy8G(Q!KHa@)mc4`(eJhh)i~$rmKhbi*w9fNo%zN^@%ne{=M#R@%Of zy1HN<{Mu|3wp4@F)xi9Zb;X%OCrB(Zs$`1iihJ804qQx0M=Wo{eM*u*e`HNCDe+x*?UWRB13Rr@$bf$?Tl zlU>I_&YbZ9SFV1F&` zl`cT8w)Ge3ni51#Y?lDK5sTbM4LtcCP|fIs9GSx_HUDzKK1NUgeqP&LHRbbc_Vln% zl7YW{oE_%pg1_!`LGW9XkmqGCYWjoOn{%mK%s+Tm+UZUFed0Gk(3J_Y$3nF$fH+JXZxkb5hTyib ztLg3^lv{~-Z~s9gYDh|Fuf@T(& zE3X@wc3wvT@KEAQe8GcrV@O)C=<9zvN2LG zy=hn}Me9&b?>e}G9`J&F;T(snOt8L9_1M1TnXg*I=feKo1MrNFKY~l^fM%KYc4H}i_Fm=rg?FdA)sIEl z4UZo+N`Ey2Uyt?Z8~AY_m>&xA%g8?c7O#u&Te>y(hQqn)DyNdw=-JXA?iQ z&Q2a723X~RE1L7+yx=h5k3nvRm+F8?vGeW0)zLgTSx=YCHjn znP`_cuA4Z;T*ByU{S6YmXR0EY{(;kjsWh-U{Gf4y{F{e2LchhgxBXO_@SxgoATJ!1 z4vt-#$!p9qp)pWkp79HJpGm2pm5OeEThC!W#bDW`aQ?`*sd~B3-`}%>5Fuxp+(t?V z3A6GeK#|Oly-TrEa!?Fka$dEVH3Z4H92kD$Lx1!_t~oE-2`A^&ZgKk@UJ)JoLZ5|;iCTcl6jhA?)?Xu&DNn`08kBC_RJT%~ z^UJ=W=i#U0%cN9CNn=#-A74ftGo?fUOb6@38W+i`Y077^p;sNXO}wtPUgJ{>xOV)Q zjy#t_=4w^ENS@rRwzly!&c2;wy3Bk0hQGb#b) z{fx!ndQW=8xfx{615)vaw9U~`iTrSU!DTqJ?WF+XYlf#cjmo*Xg)S>)L7#=IIyyMv zc8+c~;qBV3c9L->%nM-bt3?YpNMe89)ref{80%(aXZYFKh}vQV=kxGQz@s({e#l$G zx@8E6R)QcAivw`r6ABG02;o!Wk(HIBQP5a@r(V1Lk21aU`VY=Dcg_h{PU9P12i6Aa7K?mrPi{Z=&OVz}i|7DF3W<^<6U zE!19f&MKCCOeyX0nb8?21aNj)ZT108}YfOM)Y6U7`{sWAB zz=EKak&)e}mvM;K3N2xL2T3>iknKp$uB~wu;8KfMQ%<+ui@CqKm+-Jop3{nohTK3z zx`q1DpU=UB!w0?QrLIRxKkR5^iiDqDO$8CfI3zk=??E>EK@&Rqd%!nfa{wSKb_ujF z?^MM4>k*N4>?booHQUl5;rs{f^-!WikU`CZzlzBduQIYev-bhnW1iz)PK^KbXupj` zzI098adz&R#3r;k$4oU|{z9rgCyky>v!6S0-;mcfVVc~z%IKV3rar|cPL{fM1dA)v z-f1JgL>P7IlUe<=Uy&^KejlAh5wed}(Y%B5%A;Abk1y;1ay zj~-HzIOQB$c(m{w5GDyrl7sK?D|1;_BT=3cON5Yksjj3|0WsK@*08V+tNT(~nCITH z994ClS4)4Zg>hZ8HUmI{phx&WRijE)^#_`u_r6OkT6LeVW`H`5(^>*20uq5ODs!wW zx&W_`i^4pyVuv1c^T1hPbt; zyK&ED8fIg=_p0QDL+e&Ppq%>5Wg6JIa+=2(Y!%Uho%u;gL7D_8Bu8zI-8YYi`Fxt~cctG461^SHKm7@DZ5ZWgS}ysjwOd0KaoNm=tqMQ4 zIofT&c^8GTt9J1rPL%py+*ex!joh zbk7gveKv-jdWEUZzkUOTt9wINsYQ2O4O-#(+SYDm z^(<&vn45LilSeh)5~@s=;s6G))gmxelv=eFe_N$k(d{D-WK%EJL}YLy43A8fiHOAC zRa!nb3#!liJ`hROW7YgOcscu6@%p&I`(RHUjRz=?&gFH#dz>bR#g6m#yA|NwWwlQq zVB}=V>)K_d&g0qYP43)lv}Jd`k!8<6tD;+O4Fk8YAO9>53mSFB^|%0V&3(ABXCxr(R zw@yskXYv9d9B@&&s!n`74Z`)2Yo-PwN3PmEAyho%8Fn_|9kJl{Bh>+ne--_bL&&AR zI9UEuHgm+UvAw@nN2ni|L(mFctO05P^P;P0{catnZYD1qf=Xch1{Bc#57I-%i2S7hu>z$Y+yW(6|=V||!D}4Vyu24b@W z@;v;~YJR+Yu;|4u^7D7W=nAp8ygnQFVvNvJSk>6F@965O_$&`(yKuPo3RRZJlvNAO zQLLA+F0jxz2m-NeP(}RUoI)peIs=TLQk4JXC;(Nn<}gFHlAUi#CZK8Jv($#qp)W;1 zxr*OIUz+k>HvX!Bv?Q_aQVaR%?iXuCqnh&b-XseI6uaC{lP*6HHwZ3* zi}@R7AH5&P^Is{P<15T9b#bcM;Fiw4qJSm5p2!~f)&_dRxyqFKkPy{_h=JJ~br^;G>ntMFkSQi#T~U-}6ff%JjsYy9GVb7SYmDz;Nm z8Lw7)e)~;E+E8+REIHZpu2O_vo_ha*X z%mv`dj3o+Kd2Ev!7@Zr%!Bp9lfWu2J^!K@EI0)Pty+ohwNn!HQJ)PcoZnK7gyKr1o zm^)c5hkG;#+z(irJ<)?*d)`A&1yt@D0ye5$*soPlP2LMhRr><2hQ-!6mnVb}!zbP@ zhw12)oM5k`&OQGQao@F&^Ha2(UhU<*pYU(BNd5K>vzSMHu@xZvkK1%~r|R?Lt*I_7 zIS^CAQ~PkMk$z;lvG;j%Nu0E0=3DNMuL>qf^V~m)^YcM*j8&HZIG%~2UlR^A#Xa3X zA>gA!|H~8JQYh14H8fFfRl2R^c1=iKt5uQ{lQ?OlH2ued*+j+f2RG;c^;JUip%&I9 z?eg^bL9un5Ry-tZWIEDnPlWIrdkeXpU-dclS9JPcc?qO=QqYa9rPFVlO;p*n>$O1f z_1VI zN_YCR&JF>&UbT?Pk5oXvX!N28d@>_b*tqh(ox$rnCM1*PK|JOfqsnc)htu zyS}Gmj%AJno)>@bb*7(f+y^j-fGUxWVcxC3j+{spL)yQ}ozkwzI*kR)3|~Iv2v9~J z;V(fK{N38wb_0^eq0s&HQ=fueX7-A~Z_P9HvDQ;+x68|Rx!_DO&Vr!5mhQvMc=Z!Q z?iaN)N5zie&3=Ft8*(izU*bjfXONYz0j}A4MTSEF65*s4uS&cBj(KOGRwF05MJxq-Rr; z+{)}wP>0B8clvjFO>{KfK3m76@5u(%mrr-;nW0s38@FFbqRYnCJ>V4tER|Af1sw1e%T6#(@0^eFP% zZr<{}pix7q9*0P4me*T*HaNyT$GB&YO`9mv_ha_Y=0`nEF>b_qVV^IR61KP~W-I8) z%KMY3v*~28=L@o_S?2!d@_(gVpvPJ+3}cG|b_1wc+TzRdsoCjCt0MQ$ zi&7@3?`IHa;lebK|73>=#t6}t>Dl{)RE+d-9LN^%cC3pK%7Jk41O;p`90W=P%1ksK zdzvHq2X>LJasg{^GQ@T&%WA03w@du5Er=49rPgUFoSKC^qUl^M)n(nF`0H88iTFz5 zTf4QzRl;&RN#q#-P{Q$Wo$R$ypeB3;MA6`(J(^<0wH|3-`R|l1)BI<>8I8O1xzl->w z5BV3hl14`CvFwvzt1EyON=q?2inoUHph@$qpHD5Pcun{ z=H{CC+Ijg#?CIIHQi#a4byFoJaohHjvQ~x52-sFvi zT(`YIOQ{NVGH{$*ZqE93h-G*7{Y!yV%*TAbCwQ+Hp@)3(`cn%}%7(WXwP8Tv&HMOk z+Q9q9o{jl82r2^|8Cr`2*9Cv6u|(F;`SwwSegv?PjTc{R?OnoS#r~cnN9P?!R+Z63 zw-na|))P+8MR(jXSm)mVqTh`Yh|!j$8QhfjPwM@&7LFQUxNTgS^zw85`x7fC!nvKx zm4GYaw2n->=3-sv?p&m^o|-INk#KWz|6BQ;M#LC~qZ#c6-Ld`ryoK0dDKis$=BMpe z&377h#Gfzt=^4NeD<1wPJ?J1F>sch%q)EXhI@#tSHRqLIus$_W(%x^2Qv{#8;H0h` zW>T_kZTA0DsVehWT)620;I^_d22A@V-(k6xJfO62i7Da@4C@ z^eirY58bbh?0&48#bdbM(ph*MZW$i%x$0*3*q6hkPr7bZsb|>pb&IKwwSp2Nznb*Q zb^10*YkUp)MY!RX#{9-z?_Rkb?_NbrXP>Wb`$rYXGJIW=cu4G2{4_E2R;hDpT=RAx z)Otw`MvWtX$%t@Q$X&PJGjI z0cyeTK(#i1j!{F{g(@-EXAk39Cw`*}bX{F$;lo7;VKp>wQgn3WaM`))A+oXcm5gtE zpA=POaBjGdXN+R;`ZCUa>^m29EZE8?ZF*-kA+8_)?^iYp?dLZaNpROsnQu#Wc6wH3 zIkbt&e+aEh`a)9hjUIz#y*K;IX20E<(=2(UpG>U(aRzi{DI5Gd9i_j;hd2MhI6KWU zOFpXUDyo1f)}T?(ss))x&7%>3|12jt7W5V=EABS#hZNAq(lu0i@RHd3V2Fm9GS(rEE}wpP#ASOd&xJgqdw&|a2=C4hYk5C6=E&eJXtz= zbSr4A8W^VMo^){wwZW`*x9%~kj+2N~X6C;U93|F7p8vDN@=@sJ?oH)ms5CWs%X_Ps zq$FRbML`}SR{Z<8eXY~Hqo=A!0*lUe&FDcy3eZUaO9E3vGX?b69n-GH&KUbZHhI(I zXXZ-aHDS&0OR%_=Rk{rR?4UV2IO>Gg=n7I6=t0PQu~VCfKL}j%PzGCvavEOLF7=N0(G`q<%Ifq#bcTsKx<`CTiQlC^Mqbyxyx)INnuOyvW@0~-hN8F;I zSsr?G1o!{b3ynu24oH0-vOe4dDTrm5HOcq36V?5t9qXmMrs>ywdb$3$UwM9G?V?Ic zW`qlV%(>IxLxz<3BSYoF@e_-kJs?f)hZP>o!4vu|JRj{E(Yo`d>5_QS^lbZX>AR#Q za#eR?NN-u!;{t^iucNWN!4kd^Cm>Jwh1=rJUnCMVun@dWIp!^01`3!!J5_Yd&r( z#EmP@!Tpz2AvYVZ0$4&zC+bSx-yWq!0e*Zzc)wj5FkloJGh-_@lWJI~^EAajvEc)z z%}k9TA4*<=l<9?5)WhnCL6&-g&C5xN%Kc8Sj=s+j>TJPpYFAf5<F$5FKg{ zndwNDy6`&y14<%o{!<&g-xY{oqbNti*78@o<1az(sp3E&u-;Ov<#ktTHBVN5dPd8L z&xy+pSoFOTRW%TIxcq6Ey*IVOehX3wYmjA%LxU|H{o%W7!c832^1t1QO}11R%&u7058TU63HjA#M2l>{}=2Ch{*XB(AeqE81pq*d`kU9pY65a z;`FefO|+pL)7$50ekoPpE4{_?3Na^m=c4o7#SYdkCqx)A#UM3fAvg1PK~(0r@!P11 zkPlmyGxz?!xw7_j8ZgX6ruU^n9RljTt5cOW=4%?y#l@A5Y0p(?KPU+>L&;Eo&i zE^S`!%ylPTn9x z1?vBz1#t>vZ9(i-^miI64i_@1_kbV6AlYhu9T@jGHIRvzQW^f zwkI)yT4Z6D6o_UDRjNC%9*>|lgbJn@46m9L|9icq;{!#taGAGkQ1r&t0Di!_a)pM0 zkP8HjNJc_|U^7R0cTxoQZ34#pQP>@crDW3+=@iKLrt?$aXotTcb^A z)CZD;iot1WsGG!_hem_0zoK63eAxW1D@Rh!c4;d?{l!#Z5!PZ%eyMB;q&uvu zZytJfc>5(v+TK%13L7`SQr+Y}+5%1rxGsIaZ0x}$jX^29yFX3>?o<&b};T;byIE3PDV zCgODih~rNUQ8@qzD`gyNOwSMvaIZ z9jV3-z&eK4E`B63h<>I|@>6s?ziikOPjS>q)By1n6wWh14=Y8K!?@kECCYmXC zaROAYsMxadUJJahyc#!PFBTRuiM5Yurp&q1tUKS|Z94nyiiqhVyL`pngT9y%=N<5i zp^%`Zbr<0;QEt<+6zm@0{GO1*d#xV7xtDWm{FOoC%?hU$1-QxfitxL3N1NlD=Bv^p zh}}%~xKsO)^GlrqO<+w(37?8F`eXjjq96>1*EcI`tYZ7tEOcwuiFD-TV_FN4w3Z}w z(rk9AobgF^4HMUPF#+eH%5Mo7(xkAZliy(YP$(w!VbkGPy;nob@UX^0VK$-OgY)7k z>WB=M7r``riWCfQrN5tJSC;i2Q8s3{P>gx`t77?X-`Y|xjsE*Af7IRd)p+`rhzAMv+Cch9bUVYM{)Fe zU8LUH!U>e{R=8+tf$(!jVO%%P*j14?y)vkam)MP9%2#sEBcTZ5LHJT$IivREUn?_$ zYYx#iJ7`|izG+$4IZ{5DiuVK+13m2 zo!2{;S#!unhqbp5hjLc}X@O9lntXgq-I7Uymqe%=T5Zc{1?yiYAqweUDYC(8~DkeL*?E2V_$Mb>j_ue(2(94`m63HPdzIe zsM=abhqlhgnIaM6wi5X2#v>YYwKKI`txum|bO@c7vMJS+3R>mpwcP-zX?~>7-__X_ zsXw7>Yv#-`yFeUWz;0XPfgc7tUZrMsdGZy3J{qVO-Wz8D7|8g~G|!ynsG&6= z3w-JnV^)nH(<1M68Ni{cM(I~+jCgN^D&5_EG7Xx3FeFfYCA+5AT1m~n)X&>MX-yJ= zEW=v)?TH)De6nG-`fk{ih8d%;q?0uBb@ICR%H?^;_&zKddb~OYMF0pD$x7;rFi2@dpqJXbPq$>BSd=e>pY_VCR z-=DIr&iC^I6?MBg)Cg9U7M1y~IX_G-WGexclubj=WAL_HPE(;RL%p(j@UZONw!=bj zBkXg6Wo(1^&gaFdfuq^QVbP4GQqxl5l5ai6laC$h-*{8MYq>$*HA2_>9(?4Bgu+I3 zN~9WnCS65%e1Owc5!-S!B~pG&^chjF1vaIx-NmaZvT7^ky>hLp#cqFZvKVlzhK4DJ z*e~q8hoEtV{{*-6wAX(zgwk z)D^o}`%f#trVC4`(qWAeCU*uX=djK)Dwo8m=X6*Nm6$SgbeFH|nax+C(F-D5?w3mX z8Z3vc_&ZcJne%wPmHvC$(yFuYhM&NGH>=QAO((rZ6tQ)5yQy$@4`vQd*6uwWJlGI{ zw!%OqU{w^}UG8YKTVF{-i-lH}@YW-IimNtRQ&Ly|w3J{rER$(y5f;2Fh8lt7wn6{+ ziwJVJ2W93V>fl}qVzL<%vfWiqa;@W_-8#mxn(cizz3|hCUxOlB6cp__&~0*Jh58TQ zHqu0Or+E7kS^-DQ-V^tT)6`4aGxl^P^#>S!Mf%XNT8;uXt9NHzjC}UQ6fd! zLu2MX!%M9P#-Evwe7SjB&=C}8C3~EW~3TO zA`z$HuF&cu++cWT2h@%4UET=EL!asv@A$hM6Y;qp|LTA8VG!GV8T21TZn2LxeY*DM z<`8n3QXMqy+_4GOn&Ig)iDVw?W)-@TXq(<3r0;EJzMJ@T++4w=;&nX(+9U2qZcNi% z&EU-Hy}2vDX4}VP3iM;?Y3tdPwDW2djzSBW)RzD703+KP{=r{uOxXt~f*b#5DXA9YUzQ1y9Wz`Nma z02ZCW#k0_+^2q%qjqN!a*XP@JZa|G3>3{77I29havp9j>e+OJz`u*lhkuIa7UQ67X zJ`$3pq)K$8v{-d{arO9*!rQtwX>w^fr@$`&S+Z^NJ>HdS<#U1xXU=keKBlAb-WN(| zo%5vUVCIlqH#M3ACF;kfJsO;3dl}yD#Xy!p?zbYzosU`#bFK-QQWn$5l;smG7&^CZp9&eV4Nt16d)IZyQA0Yp@1Ih2)gc`2D zoxr93ILv<=!j=MZr05Pn6d)G-Yc9=ItpbuN7F@iT#l`2MB9yn!>OzFx#wq9-Pz(3( zHoGEpb2~<)Tr%EVkGU{nlU@zjE>4!Ji?wab6kceQ$PV@mR&&e%g%bty>NECp1#@tPR;iYlgqUDSXj!SXB@@Y46x&N_K9y%1Uxu zagTTyP?ju6amKmq9ce6y+dJb_%X$R(d+78=$5giW31I)|K+Mbi?^X|Hs&!nvx1T#c zvH2rKOz0k;q0cZKV(<)XA4So59W~?qV9N14NKeINE7$)U81OX#1ZVN*d2llDN4E&r z*;Exa9jAx*js->v>VG2sM*AObHby-Wzf$^;VbE!lTDYLWIa>8<-Z&Yok;XV)hYoThB?7kE`$iLQV z)lza8*~7?Bj}{9p?jZ^eVDi5sqZf{h=avY6)QBzfPUpw{&T<#tc!ged{#(#S*48_1 zOwWN?r&R)A*S^zDM`j^afP&qNuZjNk0SB5(RL}aMEOb*cfHRL!QL6!TAz#4F>f2e+ zOl|oqBGrB?UJ}Ren=hhbON5!@yd_7?eL%diKejwg*i^u5Z?t2cR3VT>yKC^#X@6x! zZ~q-5@v>apnAy8vLxj#h0oBp-V8@3t&f>!9h*EFg`>NNjikLigGL_D(lL?D{RT1oy zF)q|{XW>avZ7u_~nGAEm+>-0}x!DhAdi^xLsxBdV9k|>qP;5I@XCJ=^k#}oBrgIcg z_i9;vo{gt?K8l<4MXaT>o14*g&m%P~e|==;qQ7=fxYzi2e@|_Hc()*FFD%USu)e;^ zD8$z5@GiM)`|DFr-w-^}h~wWn+VFY%iiUQ_%`=$Qw`?iGY~TIO)# zO_bzzE+_;=0ij|K(M97GNN~ZO%tg$@>+)B8scIGS59h(8KYW=(`#aVdAspd;*>rBRH1g#g6z}4$U*{U{Zyhw!-mF)%Hv-CZo_|hO zwhVc9%8c-SQy1-NWVE~LkRv6bqmi{{%npX#?F=HUN)4L9&K4{!oTR3$#4Ia_v7*B9zm%plpm6_mpfMQSrBeM$x^yni=5{G*{t{Y%hT!|UXf)= zz~mzsd-K-O5K_dqHakOXU zFeE0c4fLSUMeydL4(fS9CMaS+R_%tR30FxJ=6hxNSPHoDn*u>F{~X+q_Hw!bFp)CL zZ|~C(IbGxa|GPZyh>=0c|0Ge=lHW`z9oD?$3`{aO`ETw73mK%`BtJLExfBd!2gr32 z2WapMd57NS`0;3`JH1KH3DC$AC_T{hYeI2264)tQ8TxDxuTdYd11o%?p^?WR~WoI~!ghMF#)w3N zx|6LhI%5a>%^2HvCuNH0TE@xvQY)4*&81H|VF3-s$04b&0Y@X&4h@B3t*WG|Rle-@ z9jI-pTH;mg{;v~Hu$#f6`Nbf%+M*D#@ttMs2c3w8Gak`>MY{9 z6F=Wqd67(k!2J6HHcVh9C0yNzloOyl&nRz}*B{-=S$esw$Js{hk_Jex<_NbgF>$W=FAPVe#cP zF#TU0MBKkjDLX|7?~o@VP4F2$t85UDc5?L2GlS5!eztH<0DKy~4p?sbVnrdF_1XkW zC91Ow7_uwyu}Q$nWM-kNQJSa8p@4z9MCGWIA2AHqnex{L_z&J-U8d*d3F-!^S^18A zB_iU%WzBhl`Pel(V)uxu+%44*F@=y60g0t+>tm*I`RGSlLcVwV^Sa_`oERvPZgc zo+KN-@M}5N-B(chu;{BO%XfkHib@LGy>d05aqa4SjE=6a%j`pr5>bv=<7k~9A%9qN zWnIk6yR1(h4NR&T1y6W3FL-@}TosqD7Ajn<0i7jD=PW2ckiIw8=$!XKbrn35c~wZa z725swgH7RppdX7aprBMa!EVzlR`|n7b4`T~JW*jCL?6O1_o(_+Xyn7><*Vd-BbDW_ zPwRZ^YlCJ^KGprJ6;+JYqnvR0-+6PO$5r9n`AkcQ?DJ&nmY}@#%|{4R@1R@gfV>b$ zoDp;AYOs5?50p8q{*8#4iP4}aTdp4m7RH_s?%2@j&)dyCN)nU}klhyJ0*19B15!Y; z$0AB{^FA|THwRh*OJK5|`Guo$p?>Dvo!0?(P`1nNd+!NLaP2Y~Y9aN<2$$F6P2%E4 zdcq3Jc6wS7)~#sNthOJ9cGHBy1yFc)Wokrhj&_Z|QsQr-*lBTjDqXlxlK#C%O-g~i zcQ*>n*xyj6OBQ`28MeJpD&02qD~7R9L)TrUq#3UEyhs0ME|gg08Xn1sJ->O*rL(;I z=n>{ob$wAH_U1`yg7Am%52?)e$C&6v?)uV2-+2X20I8;~JOAD=a8LW`K+yGEW17w* zg?ok~^@)TlOkfNAyRq1~Wz`^(!`Q?ZpvQ81(`ekfjxqA=fPqzoOuCEOKKIDnLZFqq z*2||2-SI3hP_O^^-cYhFIvSrDI1OkrA6}oy8I<9eqPJ&{+&aBRU>}1ncdCsOZR~na z4!=Mu=>Xn{a9?7QE4Zpz3MuXOH7d#cfs}u*gs{4~?K3Syh7TP^?)h(4k#Wh5Wz=71 zJG&y-32L2nGCWcgLoZtCeo5Yfoz)v4OdS*prZT&4cxuhPsG~awb2l_`S22AcoF?V& zARld#Th>ThFxYW_@HmmN>guSc4Ob999xdUCtZ5046pOvtTc^^O@+0%nN8jspQ?&r; zPo|_LHH`S~w#x#`O=;axXJ*vJ#;dqb61M_8&k99gOJ}>Ali8)UgR#sG%A62#;o%8V zN8z+*Mf7-o^k_TGWAtm)=3hR14Qr(H&M$NAU5WJveJKtT&Om0 zLh}P9+P~+^URh7P93(-_OPz1ePk0Q~FOl{k9QKO&mY{nqvJswBH0QVZKYq1W z3Z*W&^G9EDKPH8jVSsZ(F7EII-J~pi(~|exHwAq5P?jl{n+NsADFhuiiZPpx20<0t zT5u`togqfnoV*^8qd2Hsi?b@`@ZYpn*hzyp?t8o-7Dcv|&vh_Hr3B>OUR+{YeF1am zds3E|0JC`Ui1L1kKr4}SAme#mZvH5Tg zf8tzU>p1~_rSTZ@m!|M$6E9>UHp#!zH~UT2Y%iG&u1F51(PhQ*F7OsUT~fw4`1gDU zh_Mnv;%qpM2o0hpEN1b61uSCBs|p?pOWywIAgE+nyWYgoQpf@E4Ci_j7C;&d5Z-PJ zK@57R{(uSEk@muTHyZ35nuSP7m!aEjyW1fFnMg@+?l{}Qi}9}3n)QLMH|sJHp-bcj zil9$|<*H}-vo^vTR84-U(Gj?W#SZ_TD>)*4|Xj zAV!J3cO-f9d!Of==Qv36XO74x*Z01!+o3&hxPM@7W16__y`OQ3)09dU8&)dqvtg7} z4jJwGs_c(c8_wm#01Hi}b$6FseZoIK~eaz}%84&o=;SD>Fa&Y_KpCc6R zo!4M+{bkX@E>y)AhO4fE0yzMHTn;d4cev)Gc?R7Q3qHLN%VG}yDN_~h*k*?qyN3l9 zWAnY4eVuX_R`+C|B^2}1@}R^)Z%d0@GQYg4i=3gDpz~Tbu*lrsDw}_hDPJI9{U=G; z`eijQ`&$Y#weGNCsaKo|P4eu3<;}fPf>gOP!*~XSa519Etc;o=#Iyo@2r-m^(;`+0 zi(XeG6`UlfSP$bW6$R=+$+VApg`Ya50L1@sf>eGI!Im25sTikPx!&AR zT+Vj71BeB%#(u*G)le!oxB|!!KGu(E%>#5zD~z^M#-snhKuyFw#61LdmMe}u@yFIu z?@Jlq^(&)i%ruS!xf9cZI$392-{rCTOFIF%UWTvQjDW8?gmB$B8X0+~jlU0f9c3XY z0e?&vWUR;eOZKT3M{?R;e~Pd+@K7-d{-#WK;ET^_pxV!R*4k8&NWm{{5B*9C%}aGgh_2u>ZSIV+F?Fis`G=xn_Xa=? z%50|xA4=%8#|3UR?sFFVPz98$wvfJwj7Huve9Uh|b0_3<6TW-EBKA(1GPn`E&zM5$kUIx%k8H zx0%%2M0T^wPIe7~moCu5SgYj#zbHDIqZjCTe zX^I7f@56;gb4AzplfDF1EfuuF>=(fC3FP>|Ml|Dh0M*q-cT!V-WRen9n~Toeog=o% ze!pLgNiwfXX}k`m;^7MA^%U<+5P{&iZ@$*UeLE)jo0fhG{6hZ>X`-uqiIWV6;xmTLOyuCEA z_3T@{KzWI2+4DhFK1KTH#ZtNwOs}t6gf{EyIzUN9T6V<3fh4S*q>48KV~s>rSAu^B z2gLA~O%Ze9@*x!MJBL53T(bVyrwi0Ra%7I|x5CLEbY$NS)>pOO957vzO2o(ep>3=W z)XH(FUozj}@Y7N3-dZ=~?6yp`e0zfH zPr}rAPhRg|r-HBw1+b1MW}UMe9&F0QNI2i)FXJIrVXM!AA=>5(!7V5L6Y;B+(ajXm zd;qdPs9|7relNqLm*}8UixHI97CgS6ji5lNi~9Njzs6c{<|{;fgZ|f?_PhG8lNLjp zlxi=)ool!HrLmj=@=$$67rfggu4p&+)+EmhTK&r>%{=7X zL6+h1zrexl|A0ds9yri`EP=A)g%Y&*@Ba~A{&$<^|3AWnhYk;L_+Ialb?@n}d;q)+ zDSpDU9T;|COXoxG_s0BMCMi*70GdcMmrnI4vM~JdquCG6F=*YxQ!Me)&ka)iu!Kr_ zBj-KPOkC??E9<;Rs8^~5jtyc7)a(-|~WeQyS6v&&-iAeV!Hn@O`Ju^XE zf+>}e6cCN9?%U`fw_cxP#ZQgqx2tUipQBPuIm64r!@W=4+Q9eF#un(#r|@udK*%6U zLM~u2&w#yy|lgE@VOX0lJuPzc`;fx?rf^$ zQutj;PB4*UfoDjdwCVRZshS~+X5Im4qS5s2eE5C^R!Q`Dx7j{eEX-;Brl;4t(HPk5 zgStN$%)1=f0*21<+l@KDkq@VV-`dsG(A%;7bFnvtn=8(LxSKE&WMISSu}gqfP=$XS zbHXQ{Z_N()a6zN@@KDPZZk8Rak|@JDKmY8f=wC#p?APx>Czlo9c?kLjk*CJ~>h7|j zk1qxKWW=cdh)4iu$FVC;tvjNQoOh6*fnUttH@IFM*=dZ8Wl)Jgj8VFv-qj78Ew}KK z)lXk`G|X~|32&ycDOvc*#g4w;qb>MnimaGcY!@*f6;c zK5=%j7XIOvJosl>ulQC;q>hYreU;L5a;`mN3zcR+2xOto%!l`N1cath zpVFvE@wIp#(LKO3299Gxhp)|LO{5(@qKmvALJYBrd(Ky-L-ktvTRh~+f;HB-H7}9o zsp5{>k^WiVh~=Au>5e^wiY^rR;!_Po*8D#DM1>IqoU7Mtzo}cjh|%YuKvOYNQY;U3 zxQQBFW%cfRF4ad1)=R#t@-LTXByc?*7$NybdZP?c+Kn<_@w(aG(FluDxWs8Pm-s?` zIu6<)P>?P}M3M$=u%e*^jmRH4PxfE3+qT`sI#szonbd?c0@1vBXMumf8e~_007Em` zOAUV@j+&JxZ)dqya+&^!^9Sc);OnI23z{0Q5Yn1o_0G_B^c^Y3n&=I?_{Qp#9W2^M zjlrHxHV_c|xLEjDH1y)}uNI0=q`ouu{FZ4=m}0)|Ve zT=OEdm?O-l=GXWli&3u~U!K0i`pU_V=Y6ENw+D2+(Sg;UEZ%aZAR6rpNLgZ=rdTqM z>mj#iy2frOTC3krJaaIr<4VrA+)bcy=s2B3EgPyX7eyn2AA+x&bMY20ewSXoEixWM zo-Q8zj23XzF!IqeYS{{|RdN}tVk^+U6cH@_?8)7gjl+!A*XicVByORe{u54_(s~Pq zvxbL)FK_Vz3V!`N85d1UcD=T`7JYH1U+hSDy|gr(75k7(Jd;ND+t@2|N9>ktl}18YK`e((*aSc$`b3{d!Jd;M7D@N)OE#wmXl zI@>-P#a}H^f$8YS-(Ra2;&lFuQZ-WGyp_A<2qAoQlc9jaP8v~OV&X`{|JH`p@`E2P z?ruyx-(5zXxG!$n+g}||#Ij$U@AmFj$A%pZ8p@BUMv3f?>RE1EOqI7r$20C;oPyy^00^SN(z zo{`Nd-@S}_?4DfrF{j2&A_>D943C$uI!Tu|A5YO4_b<#W2z!B~f|_HcUatH0?Hb2t z2mH;Jeyg#+gk$91jdR-XmYqNzVT--GRP2ix{ZA_cdUIg;taN}EvV?3VW7-73epaW# z0naUKf{H}>S%m=Gp<#kx2yDViLW$cnw@Xi>sVgTW{qqC%SW9c%&kL*W>l<&=rOth= z9;7(Y0MnqXEGwqh-8xM;bv0+>j~WA0F#Pc`@*nWHm!jLHTK?ZBvTI%rX++^@P&&?U z(C_$(iHNf+d~X~LB~nmF_?aenZO4f*odUGN2oIz#{1Z!PP}ecjyu8u z0Mp)$`RZ|x*__ydl2>^EUi)v}di>T?=@YZbL1spheN zH7z>-G(`<%&x~vq1f({7|D(mL<@WDfm6-M}XiG5<82chf;5B>3Vi-z~gu;iJW}Wy? zk8-qKhSEdg&e?W`{(M7jNAePQcw6j7bH75M?d7nr-v;uMPcxi!*|HMY82+cUnwc4M%?DKG|yRJUZPU#Xs8YVGFHZGLL@m_DG z*yRELBELNh`Tpvm1K9_?*WD97tevw8CYFq;re`x(fhC@wj8G}+;=h*wOP?EqGqieL zDz*D9%cS6PJBAs)BC;Ft&tqzZlS0iWgsk76zaJ3Pj1Tjm8@Ah5? zAn$WzKgTfcGM+}3Aot3@h>1bgf!_F3 z!_hQKD{JXOz2aD*F8*Ty1~6I8qIDrSO4HosLUY~hblyjIBRYGyzZ>(l<{(B)ci8al z?6+H|-2L2dwz&)(!o3#fEeHFrOrr0^J-J`pHI=dcQyIU=!E!dz%*6 zn?hAd5Due7D4p#>cq4u$1=TL+$#|Je$s9wKs#HZFoY8dMls9_A!;pJH01Rcr^-GLz znX+Fan%`-_z3onnqo7M1X4}^nbyFb3E72;Syme9A3u~W;ZJ=b8oM$>xxkYkaFGB~3 zJBt;{QR1^z&pD`ngVrS6hDsSM>y@j1I)S=oY`Vyv?lFjwl|qO=koW+leJgGTX~U+L z6w9L%CcOhv0*eqo1@#f8jn-oegTvE8nvX~Uk{K;0gGf{R8k$VqQ**5j#j_Q!hgy8m z_6HR0{$#%rH`AgtHH5vF%&rLx5ly^*{3IdtU0lZ-sZcaCnbs)l?HERI)uac)+~a;a z*fH!lf*fyxg8>c%NWo^r&!C0}aiP<+8XCB#dKl4#gZehr=--49RVRI>4#AO9-;MV5 zOJZHAW*0PPeJOg({Zd3nYteDXh99a`#Z?s+Km80ptoMHoRGIiv?WG~JOP#|b;c)$C zP`7|k7aE zaS>_}<1iP*bn(DuF~jD2t8v#HicFB9<@dG&8_GJ924p|suMbkps&M#@ZyboErq+wt zgc%U9&2ji;)mL#zmd)CF&ov;&12fMjUqX1a4*Wh|;$L&gbSInVWFIjk!h_( z8^=DP)RH42>F0@k@({=AaT-$zp{w8d^^26MQ-!Y!@BUaUn7hl%p%*H zRBZ79e&Fv6b{(AnY0u<6RF5qmoj&gV)a;Ob0yr9*F}1d)+~Uj~2(Q?v{8*S5H{B!w z&x1o))Mgf0y;o7y3^4b6l}n?y?>|=pLnaD%G+$*l_}ncXKPhXE*0&lnrBsb}G5SPz znjS3g@XK|yc)clUdRT2CZFOQqFNx(5$Hogy$xzAv1qo^Y2NLS>Ai?o9VFx?jNlA(K zNHF2?0X06iK#fNUEcn#Ie>)oZO62*>R&9}2#DL} z8NT>MG5c?6i7oN~=W%buN#^Y<>qLr)Y~Qv;&`%_>&l1#C`6cvoow>XcQrqI1T&$kJ zTl4`kBN?|HH=@A6#tfG-B;5bq*f^1_`g@sss!~`R zq(ig#{e{luKsR`RwI^oKr_x~FoTN7E;Fd1VoT2~xenf1}#x+L_N%I*CS|y;oXb+@) zWc#Ji#T=d(>v47Vnx`^%Fi_trUj2SLY_RJW5!rH4R!~7pO9AdxBdElA?PaEiubM1x z7Xybl_98QMU;H6=1SP#GK}pYJjdeNvl;`lzXWQ^3oa8*%ZsAKwSxSC+dpcciThr8% zYj*syoc|*W-pesz(Y$BAe+>#U75cu-5w$8#)^w_eBdci6mWjHoeWy*oZJkU`9YkXZ znB^mcuNp!=1Y+$N85!YNbUnuV(lZCK+O`<1G~dX8QVw~8WQC4Wy>nwfT}nA^AN2eM z?l1#z4ze7O6a8_oxj`<;5(@XB@6&S(l1FZp(y(cazF7yZlO%r+g)MBSp{|p`bn}KC9L?{%{7# ztsscVufS_`_uu%jC~ICa?H_k72b$r_tWvL2UQ0yn-Bs=K+<@#MDfb{iVIZu|vhw+U zV-h21IFzm^6f-w=d}9<%ugL3oabyD&A2NMU^b2M zm2MUCiMs8?;L(jScE&T}zjNJYA?rTeaB5Dj3ou81@9a7&4?{3)mca{c2-@f8PdwIGseYD!j=Ma)=$ zQU}u9lG6v+Wbbl?P5+G2t6TlNb)s#@U?W)7j5C+;a8~L2a+0#(oR)d%JS9TE|9P}a8Vvzz0-mAj+ahO zNNdeqM>|dIh__B`-_gnM>yu%I{NFSB&26k==zsJn8#eL9a$e(Wy>k>V5*QytOSU#J z*TdtND6Xaf2}Y{(o86Q7tQ|s5vVwntPZbV7;$DM+!9<1`YHP2@^z)bJGeT-cH!5W5#C_OlNWkaR^z5j_5C z3&eaE1$4iI#gl!2g+3Fw(!r{M<<6JOYZp%)hP)p=q8in^)BTy65KkpLe*AWoeje20 zhq((qpF4QYQF&4@{55_Ke9P`5;XZc778lxh2q0PHN$1InkAgfa&d&d8JX8ka8(n}Z zvMk@ae0=Sf^=Ud$u?6b@J)eRFuZ5GM)*e5L1x#SNaxoLQ0x3G87e7m`{E&^SK`(n6)N0W)~>|x%t zoFMpLog);HZ;^la*Ry_1!b-2vf@}r5^u5gE?|p;T!@>t9K2(Uk|0nTpinUAW;3;!( zl0l&TKy$C#6y5i`@zOnGU-*1kg}q*DU8EEb=iW#a-!pKO`8zfH+NWFWd6AMFc>>W8 zDKU^Vd#z`=P6tb$IeVC6tB4JpaM@kV5k67>cy(VzSWIAWP3YYN(=@da#kCe(uX_u6 ztT8afpxOr3%)$oq4`^$FU`IC&Vpe0Vsms4IQeh{jGMg29j#Ui%#<)BDloUBkqQErc z5(MFzsL?sA8y)2x1y&z*x-VqI!!eAYcARkWS8cm|xtByAGPN`3M#lM~Q3t)Aovn&F zD8{Mi_ze%-p)Lv`JW*4;%WZJ_T@G8iJ4nwExL&<6mWQ1v-o03yO{LdQN?LZNzKCvd zUfb_k7z1b$=m<32b;(zPGpehRxo`!sobxc9a`o*g8clyonF;?Wj` zrE1;5xm7c%C^tyIoX$?)i3rqVKbhV{p- z4pMRUx3}o9&+Hfdch0^!XYXVS`Pst%WQ3bMZNk;hv!%Gv*9fCBm8?6(JHeYG_W`DW zCoNjb=^f(&>=<{sZ%S7u9@x+2xd5GqI?$!txe)WiN=AL7pCWqv+MVJ{c0Tv+$99%J zURW6YopW(9^)ZR3^UtDIE4_TDd&?^dJLAU6s_}~1>&s!X^Fo|Omck^n{KJxWPulpOvSqW`ED&oNw~j|EWhKE;qvKzC!AYg_e!;v z1I_k*5at@%Ar4%SWL1(Hiheev3uPhM6h}Z=>nzA&k(dD0e`l&mt#v;~7(GpAf%cok zAw1FWcH@iFp#7X*ZveTZfR3AgO9407h}5KE&7~z;n64XQ_Z@)`o%CmPCb7Vlg_4k# z*Q}VT{idt$EDIP>WWTT~qI;)_FvPGr0{Yo3hl!bN6aae|$&*q__3aOcMcklYX#tM< z?OOs*TLFq04uqvQj;_p#sIgmreA{@`;A_aO9|~uV%g&-gOdL38 zFJ^}*0g`$PG_14Gl#a~+Lr|4tdY!aEip zUC5Hte(UG;pGHZP{`L3w1mcc|mkz6aE)Us42W057Y8iIEJBe0Z#_u2e&WlEYj{iX2 z%}%{?cI8$IS3bA2594=!249Ns0Ry?%S0I*DAZdSN^u69X{-xI0a*4jsSI%bPhYyJ({_0?TqmuyhW34cM2aC%Ka zT9{qV;93WmIt0l|)N2OIfI=YE~uc5gOv#-G86ERI4wzi#HH3k%D$;7=%;mQjML9IL02du98a2Z2swm32M( zI=5tg_>i|eEsiof^gl7nE7`q#seo^<$FnajUzUx8W$))uj`>=y$N1I@^PP7eErcoI zmK~?VE=8Ke+u;6nyWs&2t84K}nfyESP)FF;j>@^_AKwwEi6>RhEInuAG3Pld9{^U| zJ>y`dJ-e5oqm%TNO1bhq*i%a#R27CU-_I-Gqt$G3oDjeY>H7Ms&ulK{_AG*60$-q! zxagAH6))txv7vJtoqhJ}9L5qCOM)|5J2|u%@x7ef0dJ#sf(4|IYg<;O0e_j@4zSLo ze_rUnN^d4o^LnW#w@qsAQ$qD17h{oE^nh8k0bvpm_Twn|*$W#v8XyX<&x>^WZhJrQ z)(+{l390tyNctobLbUY#E)^NX<;QBXR`MK|G_QK?ocO(^IZ5n_H!jdlh~v=p5Qi#X zVq%Kcg`jTY0|)9s>H$M1v-P_Ezx!^b7VfLB_g^P3RiTGdMbQFBwg3#37y6@chkFA`Ux}dj_45^D`e` z769N$bngnbhF}!(H&lAUv%o;agDQ+kScv6?XtJR^h!)(r#XR7rh*dn_H2d*NV@sQc zZGMI-3}bc4z(upLtU+gp{>Jo{WxN*c^`buG-49dvM?%1&z8<#@?k!;9pDLLNJ>Wan za>a(xXf9qnui&)qVi={q&=p0i>j2zn1VoWzjy)Z zH~EV9UN=CME6T?4Bw+3`qRg0#TWI_&;9>&wy70%QDpaX}m+@X^1w&kbgKY2n$vkE@ zz2|Izm2$D?&8+}4zOnF?yxn^_{R(=P+xlO5i95oVGF-Pa1KE3zdhn&@t?F-IW4=Y< zYk0L95>e!q9gs@BLj(<4i>e^$Z`f@OFUA8RvKMyg#qC6u+* zhHYs|3XI)aN&zB+W?pl1=e!>lAZloM4JZWAj8;VvIGB%7{V!km`+t0)0nZmqOJdpC z@tp{AJWF84QwCx@Yv97)qQgfNsPJEpaJ0*Pi)^&g1U&h;v%o91DJEK9$^ggrErLe` z<)BmFdrF$mxC6Vz70eAU1IIvq$}dfB+4K@$M;5_p+CX~C_KCOxLfJKRJl?fjKg<#9wAQGvfc;6Ht( z0Y84PxaJm-SrXXsqI_g zze1Px8ct$S%aHY6MkR3HvW@IRAWV#5eb_hP>Yc5e1v{#Hbd)maYMIG!J`h$TU-1K7 zYxMeVHn!~i=}fy%-(QQ+C>S*u`$v?Au_HTh6tRz;Sv{ueGI(0~s<{8W{`@XkZ1~ye z#@a?TnkGk3ob=9$*v?t&z+OEBaChr017z|kl6Zk7C8di-@NU@k^;GAG1|4xHTFa-^ zHC^E{pYBnmG48Tg9YlMZzf0ZyIhL*aA9+{fO#_h>%CQ23eQLMR@CXAN7{W?wN)q7w}^vm=GH}y>`t__{9 zvU{^P!gRqV!fG$G)B2IexV8Fs^#1suDknp;8(iaH_}@vn^Cd@s$HB0l<@B^XKLYvl&gn zmkB^OH+DDCU=TLz03B2la!UN>lS`bLo7>~TpPr)LcJAihe@cIux$Q;6QyQKpkJJ0G z->0{31K-@F8vJcc0K&&vql`NTawDHB7;_~)s_mfmw-nRTiT8T@O)&hyV$VeJ+N+9Z zuBK(xR7ry^x;)>gdSnd=bYj!Q0G<5`(Wq(XM;4_m$|WEN#RI$_i?x}G+oJTRj4m^q z#c)+x+#COB{Bdtjd~gx8SLw?TT{wzct`9L%Ko=)NIEJGmau8$S0B*!tN0hO|SUXw* z9JmYtOLd5C%G`7WmaZnbFI)Uz^lW-7^*g>b=ajIuet*f-r?%w#@a}T}YxhRdQ%L(& za&P5EsdCSUk92_8adeH82l!wOA)P6@e%iq6=F>o!VDn-OH3M(jr9?0Uz=Y0q{kI$s zyd9l`Ok5Ds{z=oH6-2rEo$&4?c4!T$n>ayAYBJOMNK*;Vq*TVv5>K*0#>~p> z_wD@v_t6eDSNX>~-1JHlW!`6!%qrbH$0S_5QQgpU$PiNIYSxYEZB*!cRqIX^n~ai= zIR}T|!g2E-#JUHzv%Js~QHhg=hy z%w)QtXbR<12JgIGzSs+x4Q<;4qK;1=7ynqahL`<($d$P1rZ49uuPMk=&f{ouUjXPH z7a4fHd)5&gU(rK$2-l($lK;Y-ofS9hcJjA_0NQ`YvP5UV%9}LoJ*HFs%8G8&W*8 zE{SU7YJTMnk#gAREbe?QQ*_UFwi-(^5W*m4e(UNPiRiGr?EN|Czjcfp$5=1|K6v?W zmqBE+rHY*Z{PXS^Le1F{@7OR8t3q1=H7LK z&{wZ}OI1eOt5e&{O>s(C(;14&fXOe1KtJChK1Q8v1ssHm3g&`x@$}E4ocjC<)YT?w zty+d8mk!Lei+$5}Ih>v;91^KL%t#5xA`l|rsDK~}fJ5skCP!LY5u?4>j$MU~uI{G` zp?=)~w1hNH?Kaa0ZgY?f%rucqTAb#g7vHsOg?Gnp*0$%~-Gd&9#84{k+&f%ZY) zNb6ylDyE9R%}-v+-+m_%bqYo`sTz1EdkN19h6QMuH9wH=(1Vx0=4j<_3MA|!T}(-# z(&;ArFK1~=w|xK2ApCX)clSI4TlfO@Y^(9^Dn+E)rQn39OXBsYVru?Be}$QWyg&sK zKvaTJ+UpTZcULTEb@KV7SXGrlF)4>+Yx^zyc2taIgGnu5B^W=DzLyzqa`x-Kp}eKH z4Vl<|zBfdNFMVj|;^O^NDe4OycjuA7U?#pztgk1zERGB^*@!zZeQ$3K(dBa zNOE07FAv9Mlpw8F8~d5fTL%iqE@$efD1eBOA3Xe=fBe#7*FT!<9SHE?1x_aFYtePV z-~?=p4EYqWf0`k!|sZn}TlNg0g3i%cj3HbWUHUeEI0zHzrPxM80_U zX7TFvh3{7*vBbuw!oj13@5oNX>0^o?rcjPHIP9*rZ2p&NPZ#lQtR-%i%-jGWXJXk6YdcUkU{XAMlIQ#8!TTMAsi?cIsCSRLNJ&O{d>)7|z}w z^x?Y)h~RMF-(j8lx;~|y8n48^o-|xf%4ArLikNvSesVoFFDW7a=~$ZC4|{F@+=zuDcd%}5%5+ItaNHkcG%NN-9jQ>|wyb0p2-q}z!s-%y zKcVRHjQs1K&)MH$FI4a7S_I8f45yI_`j>@ri({JzsEK^jJlPYGbTxGWQrRRNn87$gfp3^e4nbaDMj_s0}1^gNiskUHTfJ*tk z&ja%vkARINX&H?Sp#F5hV79a|uWwmpfy=wR?V|>f(Pzts4N?-~TLX{UDn!zOmfgR= ziz7$^E)G38T{-!qDYR6G-47BVDI2EenBr%`XLbb_2_Lr!UY~=OyKDJy?+-3gCFHU1 zx5V|MzSL-Ny%06R;oe32A@B2b55(k1Yxs}a$YI;nmt(FmDCr!SG|cV7=6D?%;kTrD z3M=kDh_;lhx;VLcrFVghN3fh8_?%K$6oqswnWvajc&54hdwXhV%+daXGz5t)zXTOW zFFDI(lJ-z(6Do&65Ip~QaockAV`+rIjJ@jSqm6&#DcQjyY|wpTG9OjzF$awaN2ef~ow33oL3hGplk_N8t2RQ+H9Vz6Sl2%ZwSIUr<0 zQ{P=HfGFk(JgL2|2`VrQL>12y#Z@0(@J(H+x)*;5zO=Wts@xmh+*uEp2Yn$ST+8gf zUUnr^#?5wAV|Rt@z7j>QxW6GID29TyMR_3pDTkH8K#MB4Uk@dKP~05CUQ*WlM2(Co zNc=wayFDCyf6>ePFAkzDB|I?~{HzG|sI9qn&>IYQrO&qVc-%a7kz>{FSeu%op_iXg$0}Rw(HlWOu~9-GY7d-u9nNbGOhIN> zJstyPdd5YKJq;TxN52tgf{H8ma%u3S4bsvq;&5J4haY@9U89dN!;Ikmj3FXu%>0#m zvvv-1=Q={^e9b;Rx<*~TrcN=#qE&u>%|+?Hh_4NXudW$;l(qDmiX&X+$;im*k3cxf zB0K3dp_#n_G81=O+@CKZMdinSzlLZENy>5xdl(b!cu&`m<+!b8CXEgm$P)0OQID9{BCOD4zNZr^!2|=f?T5=V+x+jri#{@pY5Y8BA zs7k;IM)Re*B!ncu{>51P zUVXcmX?5@y3oTX}x2jfkPKCRRPuSZ$EZOmn%sX!1fApA9CjIJ{y}2!$@8;NEdOqFP z&UhKr;dAvOWokeFnC&7yr>Yg7_fc^J9!2{!M~n0|WpgNsFvz;my4Ofhm`3H=Y*r0ZrXOF+<21y`EIctEgw zspFuVt2&IHLDIOjCy{stQI~J_MRT(KOE}~CJ*~_5F4lj3aE!6~B`o4svj$-o!4Lr+ z8}qm%eY-Fsj`Vpr6fCC_=k>8v6>76?@0Q;hcz;sI)k(k|%EoZgw$G{0lOYu1aK^G; z42_(x`~6mcK8%XGl{P7`A3vxI=qxsSy&hFgO%;D&SkjLS>hq6lEgBH4ifu8&6!%W} zlnirg(Nrf2m1t#H0@m5qg)LFgX3_ZRR~aPY$S2|<`m z{k;dO;J}0w0^iUIZ7eylvPq@abW<9*E*O!vDAy8u7nL^jf3o9q3J>v{82|Yfm~l)%6zkMW+HM9a4vc6thP?)n7VRwM?!Mu7 z6?|Q2JRb}wrOe+5*>>7LGi-C*}3eO|Qs4|2zw)gHnueB2t8L!^C=WZws%bLGu2}B?9@=uUg z#g$(-9_F*j5)(OZvxZ!0i6Ez{)J~2MJW}ARdG(#rZXbZdL;(HEk%G9ub*`6#pLQm`8w(VB6WHBy;n+d#^1nS_@tu zU(tOQ$V20<&EraTYM}CTH`Q^BfR=Y16m<10KKr-UY}Zp~|98(Znv|`-VIv~}QZc3E%F4s%lHvl7P zZS5tJ`MdjM1i)t2cll9X;Sop(dK4UFSJm1#Wa)Xo8q$r-su*l%=6CRy>m>Y)in`as z%8s$kGTqU_2LEtUFWGbZo~;Y#*EYBp5mVOAwogQ{8_*WNBw-%cZ(QvrbC})Z@z5RP z$HtZ*=|Vp->}^6jI>|27Ww@@w#@}|(LTU9&pm>Q51@pG;1VUTa)80zD{rlhBgLaFW`WNJ%t$IjTZ{*Vb?T41gyp%FWcZ%Hz>u{CW*f~{G42A#)3DNygU5l zqwK=LlcJn0B8%^*(#`lEdt3oV?`nm;r?efJDPYh)4`AkVU)#8?y zi5TPoVwuhhL7Dy zqRfZBHzi1GK1tcWOpfxN>;>v+bh>01oILSukxIw-8l+8R2xyM2g{csLi?n{LuvAZC z4ld89F1sCa$N1x|WCJkIfZSEk9O)CqS7sKTYk}hLhh}2wY_g{{F8mpUq;MiYdtat#s2bOF1(+(Tw6rr)3N=vz^rEi}!FgvIvMH89FPK(!!_{X2fERiA3|F!d+g^DVn`*Z-x*nQkmktYC< zknP>PS}rWGK<-UTSU?lg*mBnGsT)_w+`k}uH=NTWsm=K1im~a6bpe5g+jMdEd)w;w z-YKlIIfjZFPp0XMsxa{=C`QS_-|O#V0WE)J}7yky@&_Nnw3kpd{VJKVS!4E{o zS>8r;FSq&n4r%>3u45W**X(pxa%7GG$vGYID^+Efo7gM|X>W!Nqc)qpk2l0R7RJYg zxIAs-M3V$mQP~{}*E@$+?o%}0M zn(FSY84z8>)=3$1y`8&K`gZz}Hm_#IPJheS46mMI+`>`&c7si%_k5V2-}j=)5TPtY z=$US^06+M<+S8p5)g<3i#jS>JqRte89$Q}0&eSZY^<;!584OHy-YVH{uj`-L{zR{xjutACn=4 z1$IjSxqO~e5IZC@RUy`YWvhxt+6OGonGaK?Hs>jg9Gn`OwilZ6r_x2_nDf1A0{aNz zwf6#@^J;XFQpZh{1&5%hwI0x`uG*^elw@hidPEq4Wlvp;o03hZXW0!q^w;C$L#6NL z#JmAl5l!#%)hl==CPpXJ%K9~to2Ci1Nk%~Q)=LwODTtE3d-By}6>WyVC?|og8tgx; z-P9vxXj%z*X$lSpf89@+%CSBuszsm2ZYKYx-$TfATMX;XKOVGL5#f|2k6^<<7>Vsh z7L8+m2TCun1xz&G2N~r^P%UkBuTCy#!xjIQ%XDT6V^jOdI?j`8<#3ddyI>h~k@rM=P zlLs}p>{Rr=^y(*7GUd#h)%E~KA4$mbGrg!~t$l376Hx(2bUhWL0RU5gf5GitUejE| zA|AheiNYPCPZ4debZgf)Ar@3tKDuu_NqBOKGInBX5%6rjwFO`D&H29nN7P$}HT?$c z-=hR+RHREONoi>i1t~#Nq#LBW8Hxgmbmv4$>24T}NOz3UFnYj%G1%CDzx#Ra<9@Yc z?|1Bbeb4JWKcB4xelHVmPQl{hX=n+PfSfE0T$AyA%?EJ77mf%z4jk?|$+u0X-*SQ5l@DV zkLPLx(2a%Woa|1FRD-t98_gCc#eA&lo>|QcUOBoV1-4GYQc2u^vLu!vbFMOW;3{Xt z82D5@tFHokE(TS*J8C|;@t=xn-e{M5trN|UQ|>|+DcIh9=2c6@r@+%rFiEeVORm-> zk9Jd1Q+=dlf_iDnc=(JIHwln4-AP{%{fI*^M9C~+qON!IL!5hu07~-{#2?ooW`JFN0?x)iITUS74g3hLD}Q+oK)lr;mT5LY)m87sJp{szr&N?&CSsn z4z;m%lBT1A&i&L5Q^)oyGb?w@j!%wPtk}$fbS_O~e#!K7a?8~)EtO;-MoWZnykOov)XjmCCte9Zrgh!kvz^USE zoeRmGqx0W8T4oNWT0~TgUsWX`HT$b>`9bBjzxViGW)S1J3$dlB#_hrCL*!)rzPUzM z$8Mw8#)IzElXDjo`EAj$w)dvgJ*W5CH9xt(^;!QAn)r!TY#*ZKNO*&wdH*SJFyx3V9my+ZrK$RE8A<4sfH+U>(!yOB9LqA~MEvOcFzTmWV zC!&)B>tL43#5?vCRy( z0oI0`ARYr+Ejg=M#Fo5!Zhi8aElG$Jru{RLbbhF(7=g=WlmMSN)z96e?5GIL2pB7E zDLl$E>d#%v=SqsY5N_&zijZuuAGRg-*h~YUM1&VI`-7PAluBi!Gj#cjIHhNc7M18V zOC)|*^NPQ)93VdMVuAS8-_yiJzp=)U4dIBF7V`6Jxi=IZ-^TY$JPl~Idz>@NyhD#x z7C{wXs026V$4&FD30NmQqLKQ$W8rrYJHMM| zOU_YbasAp-f00h#xa@w~VS*KpIo106uC215;k<+xU>eoY-K%Ueoal7t=N=riYPXdxXKD|?J)jw|L-LA6E+=8QG#ho$YU(PZOzTx2FY%&sb8)8Qd>mXF57i#Hmw8DFWk^+db@4;M`6Ti>*Bb>d9HQF&tm$Q49IlBpSkz%w*q z{l17FC12VvuA;P8C8{LRKKi~#b%ooo1C;mEb0qHg=V8$B?h!Gt1rxIeX%F|IcbdDZxu3y0}{qu!U z0ks&DqiCQeaqY9;?Vsf6vwFQO1csf*LpX<{W>ghr5aq&hHP18f+4ILH!cWTQD8^<^ zewl(%gyIdwi^VecmI3u>@Hdx%ONhK#%ErajdGmx*yKI>P{ zv0L#Jvu^`I2f;0!uZrtdel1^Sg9SseH?W1nLwF>m%01zu_cMe5&ohWoS3OW@yYue+ z@)SNw#0~(gc?5HnXFD|WufzemKW2R=r_sJ?%Da@V?4!4nK0p-<&ioqtx96yPe98Z< zF`|jhykaall~Y|Wji%{Jl!nil&sN5K-AsOSaQYV{n6tRH3O69-`Vt!jUGJh0&U`>t zb-!IH@?GMJXPo^13Ocp^FPLb;1ry3uG(D_Xvi~VIP~u7sOt_K*1umAL#03)!xLF0x zu+g<(X1ep7a_{Dl=B53Ij*#)8z0C7zTv}{NfAz9|Q_p1yX$C0ZQ!mkoL5rLKXQiZf z<34c|*VGC39`>B$E7H5en553^rDYrx4dXMgok#jXq>O2M<196 zjB@WC+*htrGXiWIK0=&e(b56e7a3iOZX8OZuHwx2R+3?`tRBq$=BNbKFgXDaWT%Mm zF*5)V9)2F;R&}24!W%)#t-t)%Wcx|LIl2jzvS>#3$yF?!)b?>;v(TF=tiA|GBkG^= z`Qe;q@uvFnb)|vCiuk#cM@P}*O<-B2k6!C!x~Y$MpNhBNl;wE*`*^E-Lgt6zGXD-l z$B4RXd9!h^-DaUSO`+^}t80o{hWckG@)OHJ3%q~8mkW$9DGxk~Av`KGO?3dKpL1V7*75c%!ZnZV$)>7ek9oxl+P zC%Uju#k?iV|CYe`*9m|taoEj@+p{*L}N zQoaMT9u+%yc)o%U;O#utj|U$PZ9xDO2Hx^%HyzI6)2e=dzC0NuxEBceood@uF8%R! z^j4rm5!sKD!Er3t<*ukYKYLiV>dY%s?fs+}Bt%ksLs0voh)|)Y_3W$j@Ur6b--@%z z8lg@lr6e&U>k(3pR3y0>6Sym<749Jxx~P*3%S)s#zpBS#mojowI$Zl~1df68HATOX zC+1pY(F45vRp;hM|2(!8=s9Z(3}}mOVAernn2RLPgD=Xz+5Q``NC5?h{NWgMa;}7A zEQbshtwC1ayRLxU=e`~yXDs7yUsq>`dc9!!9Pqo7demz_TpCtlmZI669MFbOA4*7a z6}%|FhV{RONP+gDM+>|U-D#Dks7$h?9@XH*=%F@{<>0|k?EH!9BXKUI&V6T!I0?71 zV-NjG$+ktW#K~MO4o1!bM>sFL34ZHq--E>oCqJxJf5Ha`FQj{JsJYU?s7K)c^7kvAM6|Cmw)=~l6S}jdhP6p%VsD4>#Tt; zM=M@XZqh>?5A^GX?h2`3mMvA>2_ua)A8yI5O~nIro{Z=y)VFCu&4ut<%z<=Gqi*(= zke%&KtZ;fJ)qQHhhLUGkP<7A*0*UCfaOh@(-nI{&@v)Br5`*qSfpiNyZ88Az^$ZS~ zsHVzkaS%_f@%OxGErNBGW%A?ZxTyKy3tl2(W=22mUx z0>NbYY2?2K0BSD7?+$lfvytgUywyEz{0dJeRE(1}e0pP68ZRpwFortePp>6|V&|u5 zE-D(XKVoDpq19ODkm~X#d!9eVhH*`4Up@lMxgEK=fA#z4D!)4tR`}YO2mg&Z1`xT+_ zbbcbh%^zYfpL;7+?%8n+j>{rtcgjT2_Ee|k6e;-AR)t+`H-g>t8s+iKqKguEW{T1HbobOLOI_c|5EYv1=)FYvlg{;}q z{cI0Ts{&;Vdb%kC{?xE`kL142qQQLr_j9$;AenWbDAPOJMKr=P^n83<=7Vnic|=h9 zFVvw0MRmxYB%11%KgS81qw&j*!C)<`fQ8~Fx$L7ElF&S5&{DsZ023WN~ z1N)0Qk;@C)VvrzhCeH6lY3@lFkztSBk7wXp@Sxfh64D&)e%w3I-YUcj!d`_a3*+d% zd+9WQuKaw^pBXq@mA&IrDd0`Voxle=~Xstd-3vyNF8WS|1qV>>!+K^=bFS!T}o5d9h(bijOzmS zB-rtF)4<98x#W;TQ^pLudL9f3KwHzXh41amL`rGh?M)&MkxLgF+UZp9UAK`(j=@Q& z6KBMxy>%vp(05!+TX9B4t}JI$)p17$@3ZHLVbkcNh+bclCVVC>#T|kOcR=^LPXF%i z+%c@&4bD1*k#{7#;R0ASIUrDyi`~bthwIM(o(O1|&+-?8p>~fO%3@6Ua1q~>QA)fb z`^X5POpFHADMQ0nq(*ku>&qTPKF<7M2KPf|%=MR4p8KCnj!OHVx8$NCiSX8)52~mu z9CH3eDC7|7BJg6Sr_7`x$#HK=!97e1Y89VGJT|J`;175ZtLLKcHYiTX%q%vLH7TgP zhvoK3BxE*mnJKomF?WTw=BRPS{359aNA!&6i%}Gx7GdcUCex27JC@DcB+>0Zx0RANlFYP>srZL3c+2lk;J1P2Z*A0GZo8P635{rF`q7yFeO`Gx zY8(-(Pp9}hI(PcM>*jT3jls)=-W;bXPu%kJK#CO?$ju_h8 zJ=!(RS*WVpOf_!yJcD#Hn!F0_ZH==QWXzOG2!+{h?UTnOp>(ItDWhedM4AsbUuTsL z^n&?Iyx$F{o6;7(qWitOBGZ0O4*PtxS~Ytz;m0TpN8jWC-d_d{$Nk?Y#2yz`23P7%GhhUIkUxexITM4UP~*q?SW5BOsxAE8rJ z|LGFW_mwa5h4g(rg=-+%&~4E`8iPP4u^`@7UYAAji9-55WooUqSq4B?a|dmoP_@wM zn*r87(2r2|O!=Kgjgyv+cr{B}75fkQf~Ew&AEX%vy*$qtQXJ@Z;NLuv3V5qGolmT0auI>BxsMDu6rO{}v4SK1Xa7t1A}Li^U~7^%5!xvw=!1~Cf~F*J29 zG;-lbM{a#sV0&FI7?+maE|7;2*1a^n4ERF_+Ih$7qg@E$=$`X3F#39`RjSld2- zh@r{qS!v+k(B9or4IYJn7pSXYlQ{S0p%tFH7MRe!4)zIRb90D*-wWYK2^$+gpx@Xp+41jsuEY#)ZHt>(={u7h3ziqO46fCWm$>>%?Qu0O zn)KuRmA1jC+*EG5|@vkUm{QvLABuZwGy1;)+~^z|F-ivL-p1Uj(y}< zer!HSU%0;LEoRv3TA-nHXG>$Tn=csd$PWzg-*PIO$>NLcV#qL|>YQE7OxvfoXbz~o z!-bJgybvjcX)X&aj8Gxg>ehZ61>s?zLc^v^#a*q~2*}P;8#T4rV*JN_18a%`uj#%# zSztL<1t~a$?hs{?Jvli+9AEx|Hu*sm!?E72mT_S?;+&wl=vXHbutRT>&8^1yPTeWB zy&+MtkyV#1Rs0gAaVHM6?0=)4ytk>faATvE)qj4K&sL~Mu?(KK*H2**w3QuXfEJ9; zheqm-xqQ~Usx#aX;-W_=y6KlduSzh5uRfVyB$jZpGgPMFbq$%7{u@4bA;HyR`W)@p zGfn5c?CuA#k!RsW03Cx;aQS8cO%UNqX$#EcTYj8>KddoDA-hg*_C`@NS8>3YVH(u9H3?9zchqW?!9MO4a^LYJvzUJCK$C*8ceC%c} zOf)%FT#kxw4-3bGsx>t0>*<$$O^9k6LDIE8JO`t~g3E&0fj z5)|K)kw_)^|0@qa{x4Z*#w80|xs50`T-AXRmnV?nk_BR%RN^s~8iQL^JjC@K=y3f9 zimuXJ(+zHLk$msX+DnXE&gui7e;@b~;uq9ACvHZBA(CJkoD!H1qGXmILaw<6Jv+VF ziiW=pX_7k1Zx6beEUg|#53ZLBm1c7I|Yz*+-Gf>im59QU0^eS)rB(Ty+L@?K*07rtH@pB^~dk(La)qiW@docg&`)1 z957lYROWD7vh@j|WF~a2@75GX#9lM)98b&_p6~Ii1n84-#+Gf0tcn$Ut*irCQTatZ z@~=K?UFq@f8P!&;x}5gsTqly?tjrXZ0=H#O!7*sW{6Lo-uh z2hb)c&~g>q%j~v!b&xCg=-ru@H^{#^G@J97wfh73kNrABn2;h0<@^aSk)}q<{>Br9 z#Jt@Nx?5c9dPL#V?+6AMM?@SCj4*u~xd!L;9hX184kA?&+E3I{z)Eq;d^ghk%dS>s zH;+|wPmvs|C0#TLCV!zT|5QSU2ISkr<2%+|a1|Wb4KesBVvmM>H}+%rVQ8tk`Pfvj zivG``w7KwEimNIlF{v$+Ts4ARt}DRI)c#v6*+;r#M03q8cl@YeLh=_i{8sh~>uO6Q z3b1@i&^;cFYMfJUMHW3Ia&OWUrYwSnv2SHR%i8cXvP z{*Ckf-oa4%z8!^fR>?vpD~HV2b8mfh9MG(xA_)-j7SjyEMKi<#A@#kkTds^BUy}?U zvu0aVftvSANcY%g`Y&N8BNYi!?UuPb0EGh^$P&hz5_$*9kTxQ0$o%lT%x%zcfYIYK z_3E;Ck_^PaJ|Mqma@Xze*qT4>^V#U1^&Ac=_j%Mq_UACMLeLo`E4Y66SWwf}p~2(+ zYUV<1EsgHk2+7O$%~QzVCQO$HA4w{S2nLuYaYXYUZJ&12>!QNKgO~fI_m?w$%EUz| z_iU~&_lH|9%pU(Fn23G$B~B@wQ{U6Ba0+NJ*gxVVobT{UD!_z4HfHPwj14&~?6e;x zv3ta|F%^6q2#Iqu^91=A8^cpZ>3@jEgOMff7Ww6e^wDJXpKMCHU4m1km)+^7rQuc8pdjm7=0jIRwA<>nkL+49KHwi7N$tLQx`?d;{gNC_7v`%d>PU}m8^)hgX_(QxbX<<15l&`xh6>-X9`b0@TfJ?NY(wP2P}XmOQz)rlz%$qKXC{%qIAD3 zxK!L(>PzVv;F(bnrc$TeseT+X+J?H$-|O)=sG}3=NLwat3>lSNexnOGNY|7j7`)Y-!lWp&hq` zM>O>2RVx|ef3Cq!_q?Pu9%&xbkI;0{BU5H0bn?_PoUvM8JX&3~BwnN>7d@PslIpHG zt~Aa0^`e{5hw*8u7xs zU5*PBKa5b`ZTe1!hk4jqEh#H*M`tOr1wb@8VZ@Jl-0lvtc>Sjdtd$_QO=i`>eG9Dj~bjuOWnFn_f%=Mq2efhi5^tNeGYEL@AY_ETf4K|elN_KnIOt&`1AB4JWK z`<#XEEqH^KjFejWP)5!pqC`xfH1c<-W?A~Wyf&>}0%oLoR+9i-V^JH%gg{e->b3(H z1A`$On~84)5X|FM>B5ktG!vojG{NFP$73Xw>GO*Nz_W|ibaDYwHo~7u`D?K`PbiO9 zLuEb;`|P+r$YsOBiy3Hw3@9%DT<8Vmx=hKdL&B@#gYIy)6$^b1X9*RLG3g@1CtMSf zF^1n>9JbeWs%o!C4ZJ6pThcD8ZcPhV$_ zk*3w7Nfz6`D;jUz3aZ#i@z>WsD=~!ayB3V8(4`!MuU~JaNb1ZSB0W8TAy*&mUAKgQ z$7k-S%YGA}vkwa;I5f73ioqSPOt1CxoERpwRFM=aC0t9Cx%OCb(ZRwLY#e@u6w`dh z+uacT@jWl$smCl&y&KGu#m&lVUdJG244)^rmka~_{>A@6X8)y;?vjWa32rJg4er9* zS03F`iTF!`7GSx26f86~;_CqeVl!GGb z!k_{->RFAs(A}oRNGBPau$PZbx0#o6IgY$p=4XF%0u&aGTvBNaFk?DJ8EQ@f#VHv~mD_`^f{-aRt-v&zl8X(za0!){q{*1g(J4EN1pjrY(_ zgxxg>jI3kdfQ|LENX?OK$!Hd6f^p9hhu1^id?9#o@5SGD_du-LAIgd3h%At~+7DF$ zb|0Ew9RZsqI&NV<%lUDt+&w2*lu*^Km=wGaP znLCsFGb2();*ix08GW{Pl(*Z7z6ZP(@>|HJzFw<=(xcf`_}auTD4eq3J>%=rNSFIq z|H%h+T1qnabSF7=xA6dSSluMW{N-^qdGr?QPKd54!4eN}coeRoQ^)?a=}>m$Ukq`|=~SK9s#`FA@WocGqi zM)vNnG5az-O|Xc(;UBz|ik%`pGPxr9&H2zfjzk~Ctr(1rJA2Em{V<6;@8PeUy3iYM zXrIn#(?VtNRovmp@ehX8YZe!@b?nlv?QT=mc{m)eDEga)cr5`V*|?p1a6!B_^;V)) zlc`W7NlW_+?1ZqQG}f66AQ5SX*UT_}fk3%?VPMqJ16@H~K|Uw9V{T*-xCOz@XGPLW zC=bc?OKRGIfN9QXyG2E*C8iqwP^G z)se(h*L{jYTgzFU=?a*?UpC+&F1-QKI*&&J!u!$nm|2A$ztCAzX0bQhWsh#2LE&pz zrUihQYHmwX0F#eTTkFzJ5%lZGPS!Z+P(l~~Wm{yj8hl^?bO*BR2s#Ouz#xKs=ZJ{_ zrv}dD z0y|y6W<0K1lE4bzXr#h(UtjxolM+PGn|ke{ge=-K$+r%~C0}%OAc6k*0$7MWSoZZ` z8W>|}TV3?v@!^7@7|)T}5%sQO#RC&+yn{;Or_PdMf9j%R%^qNjEZz#mD*yv#tw?|8BOxFJFiY=)Y zS$Xx1L2P))X?89x6&{$7q*8hBeovub2CjgtUC=ldwIkMOGG%O{5S0g8x%umyG4ER} zL>Glg98teuBF1&%0Qkl)?bh#$Y?Pn>t2P;zk(|339aNe4H|=k1F}ob=S)?CyF5y2i zb08)pq#B}PCU+`>?Zuhh2T?FN`^K^twrpsOQZ4!2RH# zyw`2{@=NZ3d5H|l?+LurG3gVpxE!e8ipFMxe&}!@G?;eNyG?lkq=?b7xBV0AFG4LKThr( zLQ@8^RO%d&*Q3&MU(fPgc4v!s$6YVZu^ApOwyU-3*V|s)`YftPtgC=sEzPf8?g8pB zX!Iy>ZB=kWF&RI@6FM<6HMcxeO5g2}ub9Hc(e&j0{o`zdqU^~#oy#5xt2qMk0!8g# zaT;&$1BxOdHPC{D3@6LgoK8h!DqzWCZ{BOVKdR*qtVs9s4{*9t=+=c6MUm%=cO2pf zS^ONLT#4lgQ`jo)9F@B%hFIHq!vzm+$IFT>zgsXRLqFwpZmL#eg`+`tXFaCob-h!0R`Wq0>bgzuR#DE+Ji#l<_7iD&##)l2&2arR7U z7byJdmm*x+Qe5Ul_mLK9c?{cap2Rag=j4&tZQsr=4D|3ik+XAanv*U(I@`k=IkB-(&>KF z9_H zK0@0XINs4E8{p-d#GJB`!n45Ia_Uh^1c;ClhO7#?lHomJ@8aarmf2=bX>jI@jQJ(( zwmX<}V4!nf_Pf@a$;K~K(3hvL6v)TaNmnN-vzxTDKgMX>6je;d%D%=I96V%wQI@7N z`5`KeVSh7UrtanWHjVYp@+bC!RrdBDlBu6EJ23B!+l@aX}+O-=&Fg`1@UMxeGA7hM=^CUR%s!>k)4ZK{zCpBBt>H60cR6=E<8gMLnH6C@KlUT) z+A*@>_#v6?*Rt;rmh&df(A)X11y+oQeVMLKCoPeRcr!3F08ZIzUKo;IGw6wNZ}b-L zkcQ>U3`r5B8-zy8otuQGhmpmze|aEAJ&s)g9ym(g93Jq4YkmR8!pG8wyTCc;<1&TN z?37(M@T&Rx+@&Rju?Ns1c?H56aAk9(i%=W2^~u`BOn>jR)|&{yw479qnlhaO_E7gR zmtpCAK1cZ@&3A2Wza3Yroo#@NS_OTLBY@QueB*t*_i*_5$jr*SM}kI@^de!w2ehtlT^`S zxY)%m9%tY;Fes^$k=9Zio#nbvuk}8@!0%$WTrwOT{^60Ir5nQl-hR|{fvc75*`UXF7w?tNl)bEkUITxs(3Z@n`&hA-1_N~4=?a; zF~se(DeZVQEFT&hYwKchGgaSIr5)x4^2n(+GsS*C>qH>m8nXyYZ@5E>BHto0lwp;6 zx;27X$BJHg*zCnBz+awwkHPM~&4x98oqHz*!is_J<0(+ypZJnWVaSV-9nZ6HTrTX@ z9IDvPaw+cK(Hir)R{_yJ9)xC^fH(NW`giRt^m^xAcY>cC=H9P=VXo`^d`iMj?q2agi7=Otg_7 z2$izY88QN~JDqaCJ&m@n`fJ}#+^m2Q9$k>1&-9z65OCO%$x<x#}?D{+MQQNvWF|$$nLqp*ziMFnM3H&uxhw}a}ug*IDEVi3oDd{tQ_aI zzwg@7KB`Yr-7L*-LeQ3qawH!4i?Myb*X~=DkcR=8AlBT0cOIQVD8m|00H6mu0f*mR z>gWhb!B1NJ_Ql0xWbvp6)~G-}i~6gh_0*Tnc-@-QA5qDZXeTyIs|p9;jgmCq;Bz0h z7B`o@XS|W(Tcw_Hyd{ENZnlKzH%!aOl0QauTuV!y>S@mMY*EYyjp$EG&S-q=+LxvY z?5is|yRMmhLJ?j!gQhr!cH$BH{aT9N}7C+xHFcp2|7Hw`o- zF?;Q-@IkO#I5ImgJlvJw9TlK{zj@6v7^KwH*^6iv=&K#;VghtCmer4i1o?fGN`TYu zg7qIMMQQvwn24X;Kb>Y^`~FUO2F}iL7oDif zQtucry^q*bd>#C6I=vUG1ax6~JmKxZ3r&Cr>*icOeei32d;AlNH+6ogoW{22F}@2h zJ zY!!c7?ym0PKfELF3;-Yu_iTVog7&F^N9mxxxFw`1kWy4`Z}kr z7fKF;+~2kD(t0jVn!y9zS^k^c+WDcRkY0;E#Fs8|>w0xVw&Qw|tnZ`~b>0IyYsMVR zU>vbRT>%?DSe)ULuNd~{#bm;D$F61s2y1g07{XUnlx{h)lVaJ`avgN6;909g&`rR* z&a_qV7PTbm(f&zC-k-TmB7u$2rz%2`dOT&R`w%&f<6o_y?lhmY+ z?RU)j7VY=K=hpg8ATQqh(0!woX1B@5jqqs|wqS!dhlrmeqk0$9hTo~h|5@!^gaP!q+Pe4VUN;vWeEKFfV}*zN=rrAd59@RR%_)4gb9sk@BZQ*E#yr zYwP-f{E=JK#R+CCXE!*+2k-YQ5;py?6)k-w<#H)D=jS5!`-+fIv@~}%XIVbMbH=c{ zp;tSNMOG93+?iJ{j$>-ui2Juqd+fw0y3KdZX~(ifl4 zl>HcW$lJWU5E?o9sl0MJ%tN)k1QCm^d|MAj#5k)j-kA|1LSZxDaTcsY)wtVZg~p>=)`C{-n zsv2O!L(0n`tV=`Y%Cks#C6;91-693R3u1R|JlbXvf0ti*7i(_y(1H_^N)tfcdI#Tm zL;LJo7o}o&g@NkRgEtfC8^D}#;T#FooF6p6rJc9Y>=1fa@4F&syxzw!+FeK^F7@9O zYsJ)hc_X_{NFihGr7>S&P`>HOFj)d#3#9_OPI66@lH$2x0gY(T%YUsaItrDG?jJ_m zd7y5>eL~oTkv`;FOR)E4MyX3X$UW4Jt1qDAE@gOZ#5hCsF!kx)?C%rx*f1u*z{*li+e5aHW?vu>CnDqmYyIS-LYLKoq%4+9O_kN`1CUk z4q6UP&K698C{Onc46M;rNm0GejsB7|9uUZilC#|DBeEZ75?=|={qp5^IGNX_qxgqk z)|mTB>_Sq)C`O$e2lbzRJ@IY|YD>XQzf9N-kG<0}3=!6wtZb|2i^~)0N8#^A`l||o z`gE_f^4{yH33F%n$6W^GktjzLQ@<0HQ3w2GAi67I&g-Aq;i^lxBbZT1MkFr~eud(< zE5YhRzvQ_|DVOyD)Cim&a9QhnYSEX%#`Dhp9wh8%C$Z!E3BwW~EwO`?EU#yOG%S$E zm$FWb-oX-ZcR;5yGyE=aVMo5Ic;8P|R1h_`RKY4p{?HZvog+WV070*VZpbSCn~7sN zhVv`zv8up5rVRLa&k8@lN^T^0WK)h8LDAGsw=}lECge~Y z2sPDj&X5yZP8 ziUCPmqjO%t-hO@U?Wp?d6PQBUSuM(5MzQgDXT5xwekbP6OVd$dDVs?h#qo3Wj(h;hJ6Q57l(0rZF~dda<>D9|n0D*VCcB%r zw=1f9w_36@VJPF_h^{G>!!gS;@uV_GWer~O1AS2Y;0U8bKY+L3sp-teoL#A&+~3V% zw4?XfR`4rpkdcVJuqTn%lV)v&>rOUabA_UlrT3IWi$ho-wlx}DJ8y*QWko69IGag+ z=TZ9xd-aZBGVk;J|ISDVpW_0H|Br9ciu;6fsPVGm1|u9;9$eMqKXxV?j*|HwFOvjI z`agCKCfs1Dq`!`i=>r_OgPc47S%U?KW|x+JtoxvFLh+8c-+kr{9tHTH`%?@aY(HV_ zv!LAV>=>J6VtbntxVy<8_LBpZBTz2?!OG9u33U%XJ$70?ipHp+DYGSyEcDK-`*rbqkJe=BOG&6sH;##itV>tYv`Ih)JBeC zBtwh-5*C@P{#h9=6p62~CH2GG%GFeUfgAs6IwtdM*W54!yCC18Vfi6$6%C&_tT52! z)d#3J(qVI-RYu*f8g0W?d~0ggO2;l9XK8J2zYC z{HQYzox8cU$UnP8MB8624sL9DPn~$L3u!i^S_$beCmIcLt<{=JD+NI(?d<|OUZ9-K6e1A7+6_NzMUHx2N|$DR%zXO zm)h?0-=rHcwSBTsFupM%XD*!sfw`cwdSCZX}s;bikL|-p?g^cY@n|Hmo=XBi?4uu za6dmtI)pTFZzEc1n)%!nE9%_AYJxx06`A?>--pI)W97?LxZxIb91-&t&V zHV-REz@oF+Me&adY#=*~YQoq?G64;>7zkvYHO*CkIkgHFJX5$A61h0ee;|WZO9wJHN=~F5p{^9vtH`oR&~gC z#t%=k25Pt#t^~bHO=dqd&kW10F+lMJD=Fevh9A5D;A#=Jwm0)u-*B;y3lgv_wx&#{orMBSGfqHtY(rTD&~ESLqL)vf$(wOFYCSYB67;MrX3rC9V^k?--H za%a7M+QCKY*5o}4qglglHlm0nC5?nAQij?G=t7QyI~4O(y;J|ruV|1R zg#-%jT&G%OkBzQA$>83#&Eu#HRuU)50pN=%t_a%hnJ8ezv*`+}S96<$nqa2lqdoE0 zpUp&NWq|Hb_<&ug@W5YX zP?cT-pWBRY7}cfBOFrzI8%5jcYa79DaR_dZI%6ti&)%PyP47KT&x0Wz;Ab~sQ*(l7 z8s;~XAs;!FaX%wDy}}&+nv$O{_lobn`36lMi%%ch>w3ROn*L7sGntg3rwT6h4 zHi`QMekwboBbp#W;%VRswr(hY@E6p|AxbOLh!SK3AGB?Lz_j3IPk|Zhmv6h5f|Hybntvsx9@4vQ$M!~4zI!z4@qRw}<`%^9N zt30uQK==sQ^hlxQ;J%B=XS)tk!0gHMh*xh!<3zA&O~8A<0R%D6Z!a0^^&?)pw#(T9 zb8Zirq#a7GvbwNTlpYRd;W7$&BO7GG3Yq=J@;*m}?TyYK1NV5@%BzG-2Ca^c4%2-t z>|o}fPj+MivK6j7SA^a*pQraA-W=UmBJV{}y`;#yL)V&MOTKeHPh#D=n?-Q-kjA}_+1PB-jgmfR%?g}!j5H2K$B$aRu@mnj(wN& zIX9Q;olcn-497c9f%m~-?K}+J zg%kgesI!i0GH(C>XcS3<6p$2@l9bpGMF|lp>Fyle3{+A|KZA5%Fu+7aE)xr02|nHCSLN54 zmw+G6+L1Vq~*(SNyq$^iGzdk<*-JLDf6hXHSo zH3wY|G%+IK9rk|xhldCwtRE{$80F5wP(p5y-KNi6aLldZ;aKE>W^NnHma@DQ6C4xp zt@@7}&_8_N>lkymXS0>j)o5B}lr`l21}W|JmbV&Vx^w$?v@j#c?*oYhClZdLqDu5z z&P8@**^dSt9++ePB;7oC3}{F5l}HCvvF}6h5V$=h{nziT;qgTmH#mtIay!x=zZjJ) zW6lcH!jDe9)KnkD!G2nvD;J2x*LP$Udfs)sJ5XJEiV8O9t6G_hTr%4Rn^!AoEOKYL zM$O-!vOjM}N98`gf3KCq?Ct84d&n=okN-m!EWn`OLC)40!|PK@Tu?vY&uV*o_|ME> z5Gpvd@}9Q6;j6As2HYOWOhOxYy}@6%5V9jy7FpOWt*AZzsiuU2JYlw__LZGs7bND) zCwDo^R0h`QKx>{RaQec5&BfNuqB-{S_3l)tn9opkNUrS)^33z|K1cl1_wL#K`$HWjdo;~_1#t+;X`v2=JRxQ-~urffcl2cu=70)Sz<4ftt84M>s_#w6bu|K>0pJGLPtHXMl zvW*^?ow-m&IVU7Sft=G*rH>0oEyH-jYnHe;E7r2_vtmN)CFF7?4vxE`_O$ zJ(!U?4FLqcJTj&|VE5j8y=of9#11rvMZo6Y=6l@&?67H2#@cWWzW|+^r>3=KWmJ|3 zHe2UQman`{P2I_=OzvQP`_4~1H|r(Tph}@*>EX4@rYvU4m4fRk&bF#lJL73-o2!Y# zBiYrCM=|mq4NY~NT{9l;S6T4&9g$Evz|Rnw`&7Q;!S77^ZZ4N>KQGVteJi@jqHpyaO)U3I(JZP8EVFw#0#Sg78GOWX;nkrvVrtI8?63KK$b(X3VHFpz3 zDV8?}h9sre@BhXMGd&i$`lz_EFVXLF{IA59TWB-%xfWDyzTmI{j zCRN*#)b%>T)rO0gk}uwC^OP%={d%Ll&abMI%u`7tROs_?M?figqwRi!$t_E?Z;=l( zT41(6XKYTWVFP^I^7rDgNIVD^>ROsnYdZjzyFPztzL(~|UFSP(QvJG(kM9o6U?Go? zM4X({f7+XBmRrXC_C0$|Uwa>?NF4?=_b}+!TKq!~MYt5i#jKnL_b)vc0+cz`erGEB zR+FdBp^I{oApNM4$$r6{Tg3Lv`lf=)y6eJMSbsEUG_K}s%{*rKP&3FyKg-#dW#GVt zky0_SbecbgEMPsvQJtQ50pGVPLKoPOMV)IB8iX681FTl7y*HWg)l57bU3e#whHA7s z&);klV`BTr>~S{cbxU(tq(d$DC{EK+Qh5qrS|)O!%Ay+d<@F6yzTnQA%ul7#RR-w# zc)Y3&=Ym7AhOy8OspwIcTS6k-y%_V52lfZlWY=xBSGd<>xO%sy>f@J^s=(MWX}$9Z zT8P+hp#3HXC&M3^#eVw&uWi{&(UzI{%~3#|WLJL`H!U z17_YflMMem-4PGJq6ZJ*&WRlJd0gmT$=|`&gq|+3)z$p8U@A#5a5COtgioAB!0@Jdu#LXaUN~hV7oN9Xe+8A zV17%s$hQb8k(aY3MepmNnp{%kS&Wm$y0x8^1pz+Gy^1~r7ShM8RP#O3q3CL$t9;ye zeM%9GhEb0Umg&bd!ID=7`{%GtP_^24l~VT4EYG=e8%_0GqeAk$ss7Bjq`U_Z8IcD1 z`?(PPcN0bNf8hk7oedzFxg)|(0B=4Z05@p~A;mpHmx7r9;AAAc?h_&kYCHq5-$bKu zXipVo?6f~&pSiL&YJDhB(~ll*hR~ip*S(ZuAvt#f(EeU2F0sito zb=x{zbD2>u8KKy>#jC#)k099Wm9OZ9+=hbXl|6kE|Jlwdo>tN5fl$TH8}BWYWdddI zgVhS`8rKWqCOJ#}A5P3#yv&-9kVu6yWc<@G;H@gjWX;(inyTOB5gVwZvznFttW*kd zz}i99X79!Pm&(*9W5hr*t3xLIG8$$c=uVfMCx!V#6rLE7rY3IZ03lvq>Y4d&9ol{I zs%P4Ec12kCxb9kTVu{t}c~C+<8*Dekyi#Ttw${M_9)0b+fPnTC4(3lfk)mtv*w7sR zvnFsZ`m=5G_r9)+H_m}`Ezf$==9a82ol==k#MiEkx2p-B6Je4p`O$Mt0_2W?uax3aM9IlA*Yl-4h@bK~iLAs0vGmA$<2`zgJ! z-M5m19t+BMw@)!m2fs{A6nbHO7ObD6M!lu&jwap;1MV`G(S(_v4`0QAU>BtatSdm! zUg;PdSRxdA!3b&5mmZ*Lqh$KS$h*tcro9tQEd4 z*SzRO{6T#L1R?+Z1y78-jHgr6&25Ih@ma*y2W`X$+RYB11mQOy>~=$*v|UA&FU_-} znB##Y58uSy7?@59k^kK z;d}4;1r9~}U;gV{W+#1{AZ$?%onrHqo=-8`8VtA|v`Gk&M__^`_Aa+P(jDWDdY5J} z!9&h4|@EUiycc&>m8q(laX>4)I-+)vMYvC=31gv4hO!`@q=EW~JM= z$ZNCdhGj%6+E3^#ejr0{Pv|cC>WO=ci= ztA=%}ATJKkaoz()@XF2qnIe{GuC-;43|gTBY&ox+8&k_8f)| ziw(XB!EeoYNnb^#E<-HKNaegEuRH!CtlZYS2Xp`YwZoy?sQ}HK^tk!x0-<&Ri@zae z#9@yebYE!|9E4@mt;$fmgHb%Xm5D24DO{9ZT-1}5bo9Mm?}M_7B>Dj-%ND8xIY32S zOGyKozm)5>ZDmDL9A?y8Gp?g^v_I5fuqKQogW*F~OGG3L)Sd9_9wK1zewFs5S;q4B z*NXi!fof)`58O`>W)tSB;s230;MQhpMHG!nJ~4*>zO2zwt$GN9Jopn|`PC?C)bK5^ z-PGG(+U2R;*dYvv+3YUhw|a`}?VUiEe~`^!dm=oF+{?XtaMd}MJSjt6+&sK54ju~f z%ks+L6;EE6{a0w*23Kf9nBzS|mQ9W9^2ox#i2~uNlwTl=W*5Z*Nrqck`LVHG45I%w z;Y<0D>3-D!!nP1l{*2Jc6}?Y!9K}KaX!%ClS!wF#ndIM?l(XAZimNu z6tTxIztd5Ee(U{Hmx--FvEI%mPM#sdw43ieUv4*AW^E7D>E2;jlsf^^5eo_bd+SCl z5C)8Wo2mZeqMyRGf+bXnCDeiwKq6Is#0S3jR^kit19*qH*h%%D)4w8;WzF#WKO)Vb&S-I@7Wepb1Bhm5))&8@bx z7P-)K-1>?96c}hZ8C-Ty%B40vj&YuAb3DF1${>Zl1Q@ufHDvl0Pirr#3i1ktz$J zUL2C&+?wzP1R5?|wRzW4^iv%`{I38OlCFmuG)T2zbvI^v(e+~0;P7!@h|ABxwj zt|gf0OD5{d>lUjD!hB+c{B!I${^E|PZu9e(%Hh$`4#6^!?>#n--UmauXk$Tx>I@o2 zeueu9c1n5N=0*bkTl*6IE`vXMvrbZ)+ViRE53lydy+Yx`-wml%msv_oeh$8`;LFv0 z|0|UK<77G66!r7p%bgB(hUUconH5-GohPHk$v7Sa8Vg&Vro+DxxG^mWZ$gFWcA@dy zU6gEp4}*yxy^V>eJISyOqzQW6VC*!xVA$x}B+a2W?K@O`;acwf_9b^i+#!lGgVAg* zD*5Iw$+Ers<*?fmggLF3WmPsa3*h^HjxVFSUsh275=Zy_Nv9Sgr@WWH_`{GJ+9f<( zgu?4D7k$1bnS2;v5#-9|fy7V@k6)@~cP&)_gg1KoZ>*4P&4jZ|C@Wwtpo+f|^l<8n zZv_t`UQ5)wQI7xOgm#2lIrDbQ6UzGs?Nj1IXM^I0ujotPMU`@L>0@#B*0Xz}bsA$D z&2H=Rp`rcFI|{_AO5ZqUsvLPcdbM1=oF$U^J}0_ZDtf&b_`U`C0V2tbTC%o@8FKDP z#NizCn@(a{HrJ?{+I=;4*s*AUX4YS(kKhF#a@`fKMirh~{5)cGdUgw}Pdf@cb!vPxa-JSUPMcD-_xN*h^+)p#`GRclLAQtE)H4Hfym zko41*>i%p+qlGv~WC&Azh+nFXeNs18r!lOkQVx*V-@oy6GTcyLPfNTJy;{#)b%gxt zHwBFI`m_mlO1hKzVzP>=IX@?jR%?BX=EGx*6j&Aa()P?h=vB7;K1IzK9@BD6FYb9B zJ$VL_^XUsI4a}Zq?9CF;N$O{`eUEEbaqgM>mH$Ss2A9N`a>jM%BE;zg>x!zs?)GS>Hb-au+z`z@k6az~)x{O&?HR4&2LR zm{aMw^zwqe9&Gf@EKrHXnwdV2qk){sbwsY1g~#^f$g@IG8+X?Q&xb=hF74zVW70xR z4?fkSkZyu0zqQU^DF82F1}@8ut?rgo?xv<}wnWdOkRs~lrY#+Dc*ES5=Okf|0X^0I z=Fyjm$e z1e1L2iZX9|9lN96^6Pjw|tFwJT2I)7k&i8VaXd}Qsux_k^h-}nTRf7iueT`>x zR4yc^;GWa;{mmGnN8jG_#u#80@p5unlasrKf(s6XppY(X>8J`9au1Ug3=qsVB57mFj8D$jdM>|Fh2E@0udj0tcz1f4v zr3(dzp6q-K&3pua0K!Cel9%hoM1a%h2ZvYj>8>m155it!X?E)03Hwz^5H89ZU2V7f z)CDY#JTBI9dJlVOFS2*UG7U0co}V|$r`)JVg&M`+04f0IyMjg5CaV53vo;OT9=0IJw@HH;{#$Y-Ga%z*E98T%DTf z3=D;*1@>M9xg)!EjqRcwe(jhGwo`uwQ_**u_c}hkX&|i3w#SC;F%b*#0>^I=f;sJc z_|Vet%bOd8edrn7I+yphd6-#pH8hYa=!V*iJAJhU8(`Jc`Sk%qwC?@nr`BH47}~yW zuF}X-Eg+_=4pCnYSLKE}TkvZt!1t<%3hG(n=k6?( z?u2DYHrt;U9=f}4KoIeMNtOMU?OuluutrxSF*1>QhdkR`j~-PBKAIh>$vB0XvJQfv z8x|Ifnt`&^9L>R&XXm5%)$uLgHM~uH{Iae&xGj5gz5DT+FdK_W zs6*_i4b3v_KNI}6J(w`SBKkF_Hr2lRiv>gX1Sx7Om7ifojJd>7>CUIBf z4W7C)#6Xxf{GmoBkFNfX8rWM7_L)3WIOw$#`MZ_t2V{= zyPJaD>QZB#<#mX->!)8_kLme@!f!_?e9z0ha?@$iOEkyQK2{R6vTesLm>Ue|TKE5wP>j90?xtzGObkT!KG{;JkCLW0P$-FKp0#1aBIXYK8%W zo#}fe%q4GqyqV5eXaQ5{KZM_JGrFJNXBb=d`;%U&9be@c`_-2sWBMqI%HoW;F`{yH zznNm~opevLU-#6Vq{(Ko z=QhHPc%)%^$*)kZbpr`kf{P|^F)3fAT6S++%!=n?{9_kVAI>NG`UbmXOLaA@2E7M< zD{=kg4@?2VGKzf`p;xU>kyyWGH}fhaev}aa@aKadO$e*GnH%Myj!`#pgU#g3!3l9_e!_p1U9u(Fg`Qa4qT>fmfEue3EZ}YO_ zWmD{nbC^Bb=>VmB_{N=1_6<`@ z926S_-TXu=XeDCTnHqlO|G*#S&mi5;`7X9?$JS*(Kw63l01|-%+g~RM8mDgt+ukgw zM22VIy8uky)&@||9ccOHn2gfArF_WL*$Re*^=Rb0y0NmY9vOK!3`efNVV)sV zG9$}Bt#jQ$dMMh(lCba#apZ<|yVrMRJ5xZB?XUW3)3j01mwVjP3uj*$LRL_-zuj3B zi}BIFaku3%WIm{JCp0x}Up}B?xK&eGz)knEWOoXWDKa*ca|Rvr%Xy2q6)X(iRQ-Cb zNAWb+ch*u4)zOY+KT3>u{J@>-09bRB`!%!jNm_OU+XOdaJFLdI2e@jTKMx!O2` ztQFn=tE{)3)?q(z)H-lnE=d$>+&lBn+ob*a*gh>_dWr~etMwAK=her+0*E^gUdyh1 zyhGfMDw$x5#GwW0Z}UvfsuRK4Ax&Bj09_G_sRPd=$f;yrvu1K#Loa5TbL>JmGN_00 zXQKGqd$V8uRX8W_1}Cxv^>c(&EYM~OQ*dahhyT4YEz;Z0hx6GaF%SbUmU8Z~Q|Jc2 z!k`^({MFBb#tYO}sV(xUDyrWnE*=}qFmoiJqj)J%JTE?};4blhobk!QY_7|VyZUvG z!%gK?nmClcJ=>c+;BszDoAkA&bfBe6)4a^+ShH+J6UReo`h$y5J7zKItxcuJt3jKK zv#s`dwFZK3ydUt8@Ku||ym(6yVX-LX^CI}_<;!4z){qZw3yHzwav&l(uZ}M&%(G|# zKaR2bJ*n&MM;X)%c1EhQlMtk2=%GeR*EwqO_AhRj3&3FvG1O+CMNTd8BfBP6xCw{8 zYI?52L92>;^YPyUCDq}&vmo+W^_UNRrnMTkcXhI>3*W{++-}(am%{C^zAN*rg6<^= zkV44ur*jO1#}V0 zflrw>cSX?R0;qC!+9!_#PdFl~JJNi+x`W5EYHH5u8y7@qkRlbRL->v7Ws}^Txn~f@ z&K_jn&D}#>=wo6@GnHJb-!vkuSist4aS&W^j%#Ko3VUvT_#;*}oPS)Gzj?z;x|WU2 z4+v?nwDvPm@Ctqm;F%+M0{Yf7?8q2dbpeaAa3@%tqqyO@;U7-B!EgrVb+RkAhG{}uyVSZucT(jrLGfpJ>XMICl$PCENk7hiM4u~oj1kzN@ZIM zJbaHT?D7UH(bc)L7&Y_^n%%sA_0JOw2zxiYGOG!>_tgsHvW`Tgsql6Lc{#%XCPw~h zqZGP@&5OPXjd@G4JuMGS|7C`w3Tx)yF*t6?FHc)l=kp!6z`3;H=11yD?{b*>dHw{0> zs_lZw#ej(Lr^gAoy{X=A72K{=z38TD*V1V3mm^$dHvJo&)^ITFDYvEhErFc#7RfZv zi^5R!RGmV)@QTQ}4n1{c+0=!%ckx3Ob~lY*aGuHdy1v7s=QP#EEp34q^D0o50nPGr zc8*2UIEIv@7q>KQr8)M$w5;u3&`?$d*P>a3PCx(7J_=Yx|JxiG!;a8fk=GIlmK>s- z!^xwZe*62J&Wyc*BFnGNg#h6-b(m9|C-(*n4O3wGs<2&eKQSD7FSps~o2;UUnoOaf zA9BH=J+49)v2@5^L~UF!_WJEN&`jY0Tr%~0pYaR54nfVmxaxAbCvduKtdC=5 zT9VDCyzktvL^iiiDmpSrmG=s3>a_e#$Rm&d2)V|1vANhLx4U8G;sdSJ+|R-jJ8oew zj*|j0jT9g2(kD9gQw1fKcwSUQiM8AyDvzZ6_r6uUt&tOjfX`i>A4qF9clh7;Xv;}l z3OY-HV=znYbZ!0?P>nZmnVffz0?;~ztRv;?y=x&glqROMcgw_h{r1LOfVba@mcxYL z4LJo~&zrC7pl0n?vL|QY#HHJh0bfxfp;sJI_;cIt{N6S84vsOAqr|=|GQc(FFT?oxc7xfsU$TAA5vhZ!;?6 z8*3B#>C&U*afY01k@{YKxEIMNnqdZEtz?oS9emTap4Kf~E`r7I%FF>?iNH`7j78L} z1=e|Kn8zMaNjv}`6FF`IM;jTvCqE5%iBFB+DJ%#v3qiM9&8^ZlX#;?YMBUA5EP0^; zm=z~H*nIhwK90Q=7`#`M@1`*oq_u&tPS)G&?Mm}-RX;j8`NAYCZ16~Up5awY4USY} zL^<`@6Q<6-42jIO%;T>yCF0cV7cNEdQi{JIuWqoLcU_ylA?3HtUcYl?ywabqesU)6 zvU$eJSfcTr$6v!jQ2rX$07XeivN;6MoPB#GZUqLWn}q&05JqMB(L5~P^nysFp3M47 zC-jS_ik;U@c>vALK+=hSa#ve|Oaa?ct`i|H!ew7x#tGmHsRlYskH%6RyA=)*4^ci| zS6Co0o2j745)xXtyteV+*|Cj@#;nsM%43f}%&;ePGP}m^}YNX|WgpTBe zD9E>uosRVD(?Y)?V9P1FldJABxU0zvWn@G4(yvEBr>(8LVfU>3PRxwMT=FOYjD}6V zIgPtkziO8sj)~)+a=5Us0D4vEc{_cg0x)YgO1ZE_;Kj;PM~G$Ca)bh)P~;oNx5c=5 z;4M)!Pc;Zpc^w>j4Y|s9PF$(n;6!Qq@icO^mif}Wj+DU$XFbXJqp$(JpP*`H2*J2 zXeT5IGqS5H?Eg&=?h;Z2Ho`K+6GCf&laM5k5Lyfj_&bD0b>L6h}xAvcMtjh%d~fMZ2LNArokNS%BX zHTjQ4$f8t!lrU;B?H(`mMIo_6{Sl$K^zS2GrD03m;&Q#`vLCp`FJEcKiSxrwWBf?= zf~+<1JFB0hN}69APd{t#9PjvaJpOcO?E2JfS#~7dvkG_ZJsY7|G{Z>}S@PnL2smdF z{B!TCd+%lwEn@!g(Tc*B8Q;o)XN4FJ_hjE|QJe$*jM9>G(qHM>#Snf6*AX%{bh)ss zmke9kIWZIw8Ew6=aDjMU1jS~jn4Ma*iN6K8=V)@QsI0Fv9E`L)emk)HjxGSnRmToFHK17s9U!4}xM$74#b3&qH>m0tHpsX0@ z?0HxR0iIf(7Z!^NAq$3QjZ+r%g&yB#_4#$&fyrSXTX=~%iZ{mWe9nV-x1OLo;4h=r z-&?y#bpU(RH;#t_=O&TrBEs`kFT>usbgVo!Yf~4}2;lhZQ@8xfO@A*Gx<5OYfeg($ z+R7b5J@+k(ZvHu8)+BArml<0u&o;n`|I6|C9BX1=V4+-Q= z{Oz9F;&?ujDj@WB_#T~cP3YlaUPep0#JO#CV!O;mZ(6xmd6S5VD8}1~pkxnc1l@G2 z2N&!GwZiMtHE0Q&Sqd053YaMW!BmyO_1%*i8~y40;D`{^lu0$<9!`=pnu*02_&oa{ z^z>@&a4@6!VhSH&gntR7nj;$JO3-*4$)+B zZkjTuUvTuh{R=jM6I1WcZyO$$6z0$BhS^sAxb`GBig4k37JrA}#8k6fjHNm&JrDbh zIZq91-njQf-K4FH01VVnpJ9LV$rdpS_+H7g6(h#n2a&%hK3mxPtkq%o@iv29ceTFe z$wpgUdY)Tzn$6MC(a23;9-Os^AL^A&)4S$`ww{qQ$$R4Pn<;^^%!i}e_48Xl;UhFzNA7gKcLst=n_&WdD;*R z_`%LHDBMrDI&Eh+f>!}Cq}frsWT=tsV9pYeC-O2jkz;RLiP~ZUM`Hd?I7c&2n=(x#GpM!aUlQ<06Z~}4-^je(1n>V$wSK`Y}-qkC} zmd`+sR=;3EWG(D#&P2s`E^N@h>N6fje9`s4C9p@~I8qH}G{hu-4gR>Lvy-?|zOri^ z`O_#MQR;C?8w0QFceS;I+&=;~;lF+pmy`A05J*?qI-6fjqwYbJw(Y-d)o%%;&9Wl^ zM6e53R7fh8BK@JTMX6GZYKl9_a3}D(mLD;Ue6wuj(sa8R=r-4PGl9*pMlQE+MUE}h z(H33KCW_!2hvivZc&e7O5JIgT?PvRS6uI!}oAW(X8cb-7&Jv!>*mBr0Z0q;k4<#yO zV!LAcD9zXKXKQb{E_7uX#S245WKG37-T}NK9#_)AZpEVZs=+In5NL-@pMmHE^Lr!v z0BkCZ5-=+R=23-L{kq8NQO8T{>_L|}ZzKVaM~kd^H+y_EI%%Z?xxdq`0ipA12TKgf zQTFCPpLWYC981NrY{WBo_A2BZ%xyDqL~ExXo(3b_p0-SFr4|_4>kN$-+q)kV`6-SP z=%Z=-l?MxwiW+%cQ2~p?F&&#ysl}!wqNV~SPp3oRLa*2uMi&Z*!bQb&6rXj@d)34t z+x}cGV3rejgDj)=u78Gjd4~E!=s-e|Ctrl}hJsOEZ@?X{)&=%%=1y~03;mBudy!)u z18&><+t&e$zBJLnL8Zl8d~>j?dqLw*(^z8`ii@g$e4bdYs9DCQ;s@5(FvZ~X&k&;= zfP2t|CIxqVZ1`WjY-0`Vd{?u8kJHj*T9!+iSHRf?)XK0T{+oRNGL3MMXs!>C< zMu?^N0sW4A20)(GE@d`_FF@^r@I|bWZYg zf%V<_(ul+!`hfqjg-hHQJGeQ8#_8%%dCihPh4xpEs>hC&=6o2NRhK-e?;BSu{JS8& zD@{+-s4GbQE=PQX>rE{|^k<^Hv31H)a0I5kV;E=ibwjdglroVtFlH2db@98rF^W^v zs+lQVG`}d!0CuBw9V-wYd;TX()W%Bt1u%QOx@}Do{Ejn6>UVu8c3U zMJFoHirE+3*|F7H@vy zrwMm^_N-}%>_HXz+9%Jew|R|Q(hPg##_%J)%Fle^$u?gV3!`d~RxtYREz=h6BMGZb z!_%!bKUVg?_N=3tj3OK@?OWARDW->ZmmvS_>ho9=d1=sGNNW7hxh%2;^@vgD#}z5Y zt7-Q@*JX}E1&z&tJJK+>U*%Sx15L<41Ub^Ycm4aKP1&~D&8!x4Nc=*_pZtDu55J%r ztk#7|GYNqB1HmryVg#V=RO+?uOqXO6gHBNZ#~#r(&D;x1odyBQTF8rPYL@(+1Ajk%q^BCXDPFI`Q(cG>}@`D z7loqE(|T`XZxcFHhJ}0RC$8RDlNYpxTV3Cp+FAHb$meHO)NcpgF>LUlgi~5(xXj$+ zqe;4H2`z6}Z0I=@{e}Q9^=@9GC~}Uj3~LXp@-C#=Wa}29_RJO7UBVYlt1{*tt^C`+ zIm_!IsZ_mmAL!Q=vwC8iwq2>dEpFt>J>s(R&2G64?k~+a*Swcr&J{+%Nr$H;X4Opo zn0}J1;J@sO4JD!5wsnQZDgdg!3-_rMVs_v+o0@pExiU97dZLu%$IRYt|Ix*D<{Dg| zbR=uDMtjPf;94A4X$aslwQNwgduK(9;dHf=7jG%~%vGDb!Za&PKUvhnKk}B|W8C77 z!;s8fQ4B$NvZTDRZl!Ll<8E0}?rY!K(ZAH%B~(ot{)DU}0_J4=Zp@S6$8FY+$wrwU$$_0DPg_uuy6a7M}Hb9!~UHf z_>x~(&&G4QUG(p^-bl}S(E#d;V%q5eq}vNmyMM&{bC3Esaj`t!-hreGQulmiL$6d%FvrSeD_q1!y>XbHb z<|R*APku9;vx^EEI}s^PUOuDZN8+aXQ~3*`{)9&NzpIzDcPN`_SWde2y2a1B=y9gl zSJr_}?C=CP@VNBua4Y7h4eRXcjJK-h>NcW-mh|+^xcVY9=S5%{aP=<8h)ww+(!h61 z*d24RHEj6_au83<`E)aWc^wQB0(#(Z!P&sZ@~a5M`#F*KcCF1T##%%GUT4|QDpA9M zEpPLb9Z1ZzM)_SI(K5DcD$VT?`Ei64c-w*WQY!B>JkcoE01r+z3b0^>b~)JP{!DcB z7wC%yOngl9HZT-p(q!$L`T6wL3)$O62Fdn(USBE4cnPAQYz?a&zynwnLdi(GBjzS( zyj$N)n5`Pu$~mo5t{{H?bZol7nW$M;Z@m~0EfLL`YS?^^7cw>mWg*@h&c!;zKSdbx zbyBiYKu%JuoyShQ^JC!RQnvBSA7A1FgE`lRS|-jvK5Z&>H>jGps=7Z~JJt?%KdxRA|Ut7gM#%mBu%T-Vc! z`ecy+*JKtQMe&b3v0_OwgQ_;K%qk7k+~HbA=sITnzN9X_>Jft=hX$OD!Mw?y{5kW2 zvaqL*D>X?5I|dc(w_RaUZ7=Qf=#anR8L6;*m+GGFuq-z<#S+c`=Q>>eFNo+M1Q8*X zEOeX%iN`I%s>B@v$$^RRPD7|T+$VgxN4Wc+D1sSBo?}Q_b8A-w27^qo%xKBB%5GOY z(Gkhq>h4Fk)m1%^<35aRpm5jqsSPe6=aiz0d_Q|KKT#b~?jL9X`Q}LP~6fkbQ>#tF0YlmRbP`??zs8OHX+sP|+ZwC~^I~dN2iPh~; z3)|w+i;}RoEM5PzpGWB&|310xV6IAs4`3QRvArE>9Hwa@IawI!U$3d`cU1>F`)6A7 zqkuoNRBG33320Re)?D%R3yGaKV_f%ibN`qv)9kPxU$v^szjd@N>N&i;E}}uyR3#Z? z@d);%#pr4ys&6DE3(-RV+U?;|FZmoZ`wPB+O62@3CSIg<5UJ5H-5&r_xc(INsVlr0 zzu@??`}nKx;X?4n_w|IC0$_!@?dauG49}0-*7Cmvi0$^O0HmA(vVZaX>?J0P2T~HI zN>?&%OJm+5o`5j%54-k8HjKs>8~4)D`4dx^hoIalz9X1>3w)l*e{Us#@uok1>bh=z zIcWK)WG_*0m|DCx-sG1>dF5(uQdj@kmXfq?({<}>YjIiU5em%@QDpGrjR6bDLE zi|18T70bI{N>rHDPWoTG5s0AZ{7ma}R^V;#8-aQA|Y1a}}jUArqx>#QEY8N7^oRvQr0{NKa{;1kM_^0sf|U$oa7S-4K@Hh)>-i@xc?17 zPaQ!0SfX=P*8Z>GSg@Prm4Oa$~A zDfSs7*Y{OYUF1L5>KB%|H_RSh6&#wSa5;vO`ifRsbTp~1oo`lt*~0(*%i)J#bydRF zd8y6XTBDEtm`g-`a6hJ}9M#VuH={U!6up`)ff1I+y?ysaF2`Olii@Ks*YrEl#y%X* zSaI*v1O8jL%U%&DMXXA_7{QF2m-)tIa?FUDTChw`ALzxm9v0c#$^rbxym)}e<#d=!fc*1qYAVO&6^Eu0B z{A?;i1av@kq~EK5LK?!6kEW^P(7;ba8Z(VaU2QM)oN6pTjk_hM{+;_==Q`V;JJ;E+y|3r{`FcEDMBgjUWu8c} zFtZ*=sBa48J$+{pE4_w;HYvr_JZJf?Iwv37;F;#tDL)~bGOJ{x(#7^OcJLY)2JKxt zA6KRODIhTjT-{7Wkx(ol>rAJ3mmKj+GY~9#toyL_<3ZpbajW*CuIJ@EaV*V8Jx$8D zX*LWh%P2QGdcS=nFv}%0PW@xI8)yjazh`?JI|2tf3as z!5AGTW&^6M58QC4w90#_w`Lz0@zx1a<6UwDYhR73Ad;y0Q`+N;rLE z!K$S3I1eiNu)4wGI|lXToc;a_=O3EyIQ8-#stpjz^L-;f7ZgulxwKuN08)L6QuyoG z`QS%6m$#d3>pE8#2cJ9ruB6IWYi3<=jl49>K!-(&LkzOT+TH#RoX1F3j9x5Ch}-46 zPCZkG0?QUU^X!ut|BuXvnivc- zfQc!vKq_@6BV;-fh{uuL@?y4^_xwN{ONnB{Y{;!&2Jg4$#V>PwB?VIXj3ypjj)}aA zmZ1EK{m39>ckj!O9HDtjt>V{jlUkXTuHPS%1b}5wn{4FURT|FH3jo5taYRkGF%BS4Neaje3Tg$}A6e({Y`1rqc(;d6)Mt;h_DqDq zUWwC~xYuyb8(Rb#TpiM3w~c&(4J-Z>d-igyUlV@Wx#FIDt!}Bm61ugTZzS;L-JF+X4G4x95^~?C5&`8Q97)l9|fT0Z7*t z%RKh%WVokR4b`yPeqt+J@3!nLQ^_146Bt?1t$(O_dtL*zAA*&uA7+LzDm1Zr8Mear z#k9^A08TYR1?^eyvLDy#rkiYkMfX!l(osDSOYv70XffmZ4qgcetctW?R~0EvaVYT0 zX&E$*y}Z}dEtfJ34LtnZcyrCdLqB;`26O;_{9>Kt{tL}iO3fTVqB9w|d#ZpAm($d_ zZnk(>>?~aDrpEp7Ws{@0ixq1yqp){R*GZ+ycEIbo?e?YGm^0@#8CJ;!TGGaX6uE?c zaz>swpWO<-*Uu_Llio$%F4^6K-pobedTc)ID#JlWpFXJDGa_`k@%t3byK3OdyB6XQ z>?j0!ZbC$5*ai7bMj%lfj^4p~J#^~KWv#bU4F?Jje3lyDa(_YeXRLMpgH#bUt=-?Z z>VG=EF`M`c=v|C^ii>9NPS?loO1@akD^PCi$BG!(53`+{2#%BPOP_L6y0epVjXtG! z`V}9h_hwfKLO~dlu3)UAl4npeDbt+Y9^SYaXbZY_KTO8YG(8qz$rTIrDlDQgVLOt)=MI9g2^Z0LuGN6p8?M z%*6mq>M&5TU6GuhoqEL5@pbnBY-kJB624eX%mFrE9KTxxP)|&>*3k;!O0L>{l1ix_ zjmFpd6lSetE1eCL9;Bb^_M(p8Z*`2HrVK~pE`7SYp%b@X-^QXvY$GfGex$4R-RHf( zcpZAnryRLS$ER;R$z<=16~4tXC&|ujm_ee-TKvXkur+lxo0{&-Ih_88`|P+Ny+(BB z=+QyjVM_Chw{h6FRBS;7@5TPSQMr7_X+U?nA7o||Y+CX_-jg;8sUZHqESV!{o!e5S zYeGDH;>XB&*`HY~4!aT|>5FZJax5J$E(euMGK9BC4*dJ+s97xU6QhwoVD|FC?-1xA z4tY}(AL|eiT4IO5U57L;2>>1t#Yw!D^J#yKm>W$%chEQ;&d$++6?iFsh)bxf5S@&l zW0Iw(+0wT;ml&r3v>$?Q5T5HK0qrY=yNS%}pos|Il-BJJHE)}~ zY0{Me+uVdB(>n|^hpZRA8fYYy)#bq6$dLCwB6HK1W^j1@HxQ4X;J1ZM-VOe7)i?h`cWN)T~T z6ia5pDCkPr+@Q>TzLaDWi5T=a-_QrxlkAWHWTRz>wo?DNMK5EvFo%}{;Q%K4`~$IL zcVlv6{*RlvIw_~8r&AZ*ke(u(%pHK<@|h4lW#_%7=SjT+)sf=d1nLU*D3Hcuo^al2LAyaI5SRnLph2jPKzhf3M5k-L=^JP9WH8iAI%3A*Y5{ zTYs0Zf_H6|u>%5JRdS(`l_ql7ySYiJnlEKhh{(wHVrUFn%9*GCdiUXX*TO)V_?jV! zHk@TwEN~>fN%9FKr^cPsHFzTa31}N>v%Emq^e><#DpR1eKfHO~uPhG4E_WqYe0+lm zkL#yB^as1V8S?YW_ys#2 zy^x0_Mjjp&FZU;&&fl3dF4!@8PcNHRzi2Sc@umi=okGv&aTs&2s*UPai3`Vjs?TpJ`Ckv6 z;ZfYnJ~7w5_5Fo%*2=W5qA%4-0#w%uG~9;$1M?eUpczC44=wwEFs^8Sah~IspUqq&B(tNwFZ7Z z=9cbXuYf5OT}wHpbkZ1)XMk_cv%LE)q(7_%f9To z-_ZG#QsL?vbU0C&zO;1O50}0m5h}S2p2$lQGL!$0irGVW zEs@pJ<0X_g=m<&4ZNf=~2N3ET|LIWK2nos^LW07Drze=m9-e*>rBTHg8Rg{e0^`L^ zsny8l^KV|Msz6b;Z;Ja$N(o??lUMgoO7B+|8|uVL$knZzj%m>G?)Fn%KQQ;%u2P5WHZZW;0t8MTAl zTP~>S=fxv_uzqf-)y+C(F29IPi)auN`9?m5*!r0nWqIlMutw&BsA`S>^%o)wx;e|oWcQWchylMeR_5>NHb zqGNFi!Q9T|0^cT=zZ*Ez>Qz0EWXb9iEpK$gpI6Vo!W06d9EZU?~;kAZk7c7qzX69%VpwY63sh!%K-AY~?TMwVJ)Vf{vJ)>V{li9Hna$UW64kk&^$B^Qa8{Oqc+tF<&K>;Kv6B4A)dP@DG6(|J*0CkcsA zMq$dtCuc4>L?z^@4H{6P92}0y74xa3FmSBtQSg_PI!L{{b8K8Klz69)>3u3KfcTl? zGuPG4SZqiW1#-NB{WAlVT;`k7f5(IFbpuUpB{4CP3vXzD!l>TG7V@^7Io*6B*TG}gFlam}>1vjai zc5pCjBw{uSyHq`$L=LEfq9u(00NOuBFv%wczvZ_Gkmz}77@&^0lsysGzw-D&wUJ#v zFYwco4>qlLunQr7B}^3fX*tl`Gs{!Jjf_Tq$lh{?{nK@DLDn6}@XgN-y+;;x&OTJm zz1ji2n(Q1akBMt;;kJI3jtfX-3Nf4Osd{0a)%npyxO~)2VXHF@v$#4ak8jg?IH?NA zZeZZ2Nz#Me#T<$C&3@v%jMRA<89N{9h5VTic(|KqdmiZp)Wv{DO2Q+9V5xNwyW4;H z10!V4{V(ra@7#3JNaZt5t}aCX%b_x*pm^;2+dOH}GB*!_VqMNk5ZO$`KoH3gR zx;{ue<=kw_O_zviwcu)BMflad0>t&>7Z{0%UiaBO)^n7+%fEKy^InJ4@z zdvp68C7gcjBMD&-i$kzujH8_Csg?fxHzW90nBDN6QATa#>x7e}H2JTM9pKF?)(Lnr z|3A%6VcWYmBbsegdCw%;-lE51$Oxl(MfT2rCp>f9(-DTjUv?t{L+0cIzO=t=C$DOY z=GFCj&EY^rY9aV62ZjYMsYC_sF#53t=c^&>gvUf=&U#N)@uMyFE1>X>sgKY_sOi<6l!hDNwg^XO){lafYh&ThQd#-)Tv`ri#Q>S4#P+bgAp>r#4CtFM4R&kfzF&VP*O zJ`k`ey$Q+r`Z+}N}?oAmEv;bT2)VZ%J8lvzQjq_X0*xi4m z?FDxndZKdn+elZ|K8f$0oX(w&VwLEsD4sII%od3&XUWKdl|vl?kBEFmp9fC&CRrY?$nK7c}?8Xd*ffwNPAv zuGs<-ypzFl$u9;K=MeB^2s;)+z$MakOS=gZOAjzFV?go>;nHX-_EkTM-2rD zYzGRWqqp9iV1^8`>m;NTqLjUfcp-BR%X)URXw_Cx02q$em|3h!ir1KHMKGAg%>21l z0+e>aaEO7MD3CQ|zo{N^gh8Z3+h3;`*R>DsdJpf7E!ez20KCOsrjsHOh3~~TC+WXs z<2YZE{QT8ED?)&%`_IFr_*h>b!oOSLQwsAET0qg^F%@6CIom-A_5v4Dk~q`)Y)rss z<^ap_fP~?p0_a!L2MW{Uo8&L*6#Yd!*4bixVp_I3!_|%le|&DviIXoz2If z|DvzQhwrD(tyvKwhtoT+<@M>daf{|p=Ri_(b8IPP$a9(EXG6|xn%1|URnfsdphul( z%-M6{w$dRtF~f|J$&@EuAO}AyrDqK87bMDRk4OONAiJVv`DkBO=ko3>(XhzwFjOvn zb(9N$8a?8Ry|xN~*QDdQqLtgxLn&qV7L)-LX!8a@%0M-M;o9@t<*PJ$iErJ>I_wNH zL!o#+@MB`>$De5&yb9%Fb0uSRJ}SRmLDurh?5v$ z7NhdOFv=!3oc?|rHHjl_-&ubP~%odM)0`I8o(}4Y$r#wb-SG{Ctk@!lw ztXh9vEoT(|s>j50T4KqQD``N)@Wp6&amj9!#`Mv(!~?3|0+6PK=;_vz@c93piRWK4%QBmi3+i*vzj_ErJw6-9ud4uM%ycX?xguU`X%DEU9)qN-a|f^;xD z*Y#?*5FaQrI04L!}0=r)h?qh*qt7S}zEV!so;@=I5h%H`Kz2<8mXa}MdH#x)&N z_X$5n-@Sb{TFFQ;=9Kvd~NUIEl)Wcg@+dwdcyF^)JT}Sf0 zs9WO(59z^nB`u-kkM}DL`MY+<=RoA&5(t-s7ruX$9)0;P$SBaP_8R7d5*BjE`l)Eo z02wUvT6m5P3hX%DIlM{orA0ZyfMiO}=e4u?s9;O52(X4Li@hw)=x`viLk%AJ_eLL@ zk2#&LKHptcd#`iP+o2{rMpiC{Ux{Aw)$@>q2nc4w? zQ3}in?@EIXmJG~rEIDX5*lBEMfw?rJu2d<;EHG-J1;3@U-}QpS?Ua_d)vP69TGM%g zK+?b3AGNeG(3YBbF`vcZnb|UqnkgzWiOB_%-$c6~O_WLOD`rPZ_OHk_%52BIK2vNzh$_Ngn= z;^77KFtX5jYfj3~d~L}zS}|P8Z!3ukP(nLvmX`xQTM0w|s_(8v4yX`D&+O{pLkq+r zL9>S!g)EXp^5DbCmiWrU+qKGPH)dHnB+ABG_+WQv($KB1X6S1Hecd(7!%gz7*nj(; z^-n{3xVZm#QXQ5tYJOnq0`mpV~&Gy31348ve|On?v`6 zFvWeVWJ-sT!Pe7@N@B~AQk<+#a=l}eCIM}!NjAm4YSZ^JO;Q*h9~Lh%oGnlGQ78BP z#e01wwF+rOciQU3)9h5X<1Wvl>wIS?FUH!cav#ha!rOqZm26yhj0<&DKMW1kU#3a0 zCS^{5;cm-54?sj8Hp!m3^RSXmJBKkEo?dt*f=8jbJxm1@M5o&YYWgx8Ipqra)6uy> zFOf66s!AVG-4DMV95K>vI9l8iGM$NXcUt2GYJN`s@Eh4ybK7r$zc~u4=bxX7ygVuw zdohkbnEWRs=}t*5YEHcKkkH6-cBoG_=;E*Yugll%VxOk)>3Say$TRweE+xq0E)fwTL3eHn9n1F`ld99j_wMq1Pwc!R=+OavE`48PF1qS66 z4#4-N4M>gLLECj1#3F`W%qbpfNCMc9LfIJ;wI5)ia3r79=+o3#o-EQ^fb56(+uD8X zukY6Mj@;zmK)X$k*$ZMr%C*Kb3r!!`B&zdXh8$>-^t@|BZ?NY+@lJU)U!tBRclRm} zv;IU@BcnMmE2Pb!oveqnc*qU zR&$bC8}F7$HoDu6JY-3aPoVIUaJ&3aNSwcRy1z~4y;-o`8A{WBUVzUu3dm8@Gm*h!=_Rc3IH%Wyb!hMnRXp{ zJa-IM04uhBzzzE=3VJZA$w`dm>Clu+`*YU?X^x2-_7REKH*3)mOb!*>ANJvmI^dXu z<@w<9E*Uz9_aLH};-)D%FuR+xAZ|}b_X91O;HY2KDt*t892JX0+UoFY`p*x<( zyxR%!AU#&X*{J1J%*)X&#CXRB8#oK>29weqkOCe6p$l|))LzKR&-m~>yJzJy$YFAI zlZVb7YEN8=d5MNY3{$aD9JdWmcdK;kp8(wBP@`0=oX({RDC>G{RL#fELc|J3{Pp+r zz~UE$t%{#U4DOpUWH5XGFgj&V#i43SUoIJx{04fS85)?~tkYy83m=B!yofn07VcHz zHM2-Axh%`*xd?8nRNnsSSHoWYhjN&$q3^Ly;5BnVH{-rghv>g%DI0N=gYDk9QG z{l|BlBJP*oOvF0%eje`j=&VFx)5UIY*$e0^e#%hChqWoYaMteIEM+;XTugNP*>0!L z4;@wLq34zrt+Yp2N28KDcyucFrC)yU0{BOl`Jwb>`E+h@+UdG5t(Ilqt?kb7R}Y@N zFK$y)>p`r$+2KM$Syx&qD-Vxa`G4KN(8k?BSc?3Z$5)zLEhkz&>o{GXuPE&?IsA}VQ&d)x#|$Q{CQn~;S3hvsA> zv`ZNOClg^MbV}F=o%9x`3oomv#9ClkPd_SAqo8UrgwLAf7mH2*H9bnSO{KKxZ%#Ca zziD`?;3I1ZC;X1La_H7jFAb;mqiwax#^I%~Kv$QD{jOBjWtGqozjGuHrmw#4?sdcI zf_Dyb?M>KWr#kDm1)gB5<|Pfy;QjckpsmFPcg@n#!f9AsI03MOzqpQgv*U|9QnI!V z3%q^S$#Ab5cyv@kCuRNe$BA$x?pbc^;qlTOTMyZVST3(IMabmV44>LCXSZQFknQ51 zPTVR7Q6^5b?AOGt56gyDzdk|lrwvX^-<4V#TfDKtmn6KM-W@Wg88@32XZLh8h&D z*0R^3iCZP#5XZ^2*o{#eBv~0+M`h33#%n%zXSZB8R(xTettQ3Q>wAGE@_ch6`nGbF zqhEof_Lfr5-y2V*LfoN-no2VKF*lDN3&-5RTiHB0o{9bKuW?I>2Y3{d(qophaDrMW zcFVLTzIU*ohLE!P)y@t~>j2(Q1r0~7+}yMu!p?f}N9)&^6O~vAIPng7kN8=6OwUR@ zf1jjut^Ajw$!(w!CSX3U?eSLPJ7TX##VVHcXt|2+H|C~=gTk@j?t;Su-A@dvY?rfY zT`~iSE>ENh(_bd;}a&3{D)hA1>8PrRJ@HFPwFzewJYI$dU(!!z9Je>$T6 zeqSxgA~w~vvMBw)t;MPsbSP*$J7ut7S;1#9yZ$kf#w+%uDnfNiBnz6oG`{yH<_`{e zVD6~Vd^1LLFA(DZ(Ex7O3yg|26|0R!+i7$NDP5iWc4T16Hhnrts5t=Ru*;^7{ejS< z9CNpWj@YZ8SD5Tb$e5ZS(<4j!>$9nZ_i+tym)l9P)zjS}Z#uRUH;xC$sb$}HzPEn%_q9^Z zzH>i&l;OQcMI=mji_e?GcF5Y<`4f`d;K5J(R@~dVK-m3|&UU>G(S*D5c(??2Exii~ z#*9Q$N-~=gPE>xzrU}uwUg*S6l~uo=P(?O1E2sLzD6~~-xh0sbW9p$ou9s=>I@?W( zP)H12=FmZ|zLV}NKkHBZw0xY;{|M2~iM5?E{jRIQ(LDH`ScCLG86DUg8Ni+3u6-%! zDZ_P*w+AP=K;-u?sQX~-tms<}m=@3@yGL&fTFZ3XL=98)Dub#>H6 z#9Zz#jbD(o_Gs0)sLjMZ_##Nc2`5rJ172@4^(cE)a|&52w)T}bzeu+<3mn~1|E25 zg^q1+S;0^IKy$FKNs|Z_6>boql#~+HoeR9Ag>EUevwgcQw*QgC(6~2oYv$8-1}T~N zq>aRpZO^xE?o23K>?LbwXz&8>qrjo3{xSO2yOvc~sco3m$-%{+;4LuxM&m9>Xjux}G|4K|B>dc*bm?yOoZ(QnZ=$&{J5@52rGiLqDZW~|XC|x6tP@M!);Q*wKnlu@ z_(f@dEdkZ#!6Io!$2jjl^>N4G4vWFy`VL*;D6S9voAjzrRJzF-A@mO{-kCd+Yh=2l zq^0BR3aalmPHp%)M}$8{4KC?y*`ZoP?z~0?0sM-}xJ!gH19xG>esLZm+Fn#cn zqRoR&w?hAu_dr38R3D>IxfuTe7uMgw+r6P)Z+hbH+~CmA!x}th<}YgRbe5O|z}bPj zIfrf0g>n|2_1v^<07r81r&KaAHbg=zg0{`OjxV*SJGFKv+eW|Nz?zoSlzyn&s1Fxr zuNoB)3T>X_s``_OCKQXmS8u5YZYW#;PuyG6(c@)2uWG+MeY$SsWy5{^)mv*)G?&V# zG-di|l*fjh>H^T4iO~&F%dB@g{O+U&0}z&XMdiD#v^lsRu4>{(%3Hgw$9gLt``vED z4(5$}-L&4ynq)OZ5#3=orTnhOf?eu?R4ZYA$Dz<&NBE%29ur?y2_L~bvX$$-XGU{j z?GaHYiuvg+@;B$6vwe%oKpQ#2rj9&fOR^IaoZmjYX~fc$$NFzUw9R@nwn!@agKxgH zdxL0CfXo?5;OcIW*ukzeMNh2CkJPXW0S(;w?j-_o19ByyW_@JW;dN6<^!Ul|hACwU z4uv7J=Tz@SR!w~Wv3W*E_P@zExXRTgUzQ?z_a$?oP>XS1b;9x#oO{KpW_Umzt?{c^ zz$%(Vg}gaOjS)7n3(kNWE=-&gKQdmKvYw+y715}IiYm%>TR*p>1m1OM3LbWC?NLWs z!%|vMQtGq1eV_Pla)wzLzU%i-^I$_`i}%SF`YMru^KPSCG<{z6e%qHY8-G0iYt>$f zpU#}vlBBv+S>f=^IlhJIQK_0pH?vzq51Q z(2a%dJb1Iod(^$Pnt6O1V9 zvQFElAN%5B*YruDJ zE2XQVO_$Tt2}tjOzS-RDo*d^qxy0b4V}dW_bwoHR!KDBu|4ttc>%*MgN$*js=&r9ich2lwya`(xe^P)h#_xV`w1_I+o|3 z;nA{7E~v6w`@oYe0D;kInl&6MS#n~`^>cmLd3m}Fj`a_@hpk; ze=mf%+KvVLRxj{aL$aP<>xr~wJ&1V0zp*|aKb4f&Y~uCc0JA!@5du0^(qJM5&;b4v z;sSm-KF4X4Ox}3XqomyA&iw3t|gM^WOPo-6j6qn$Z7mA(?W(!nPF|sP2lW*_w z(>;O02N9KU<_jMFgU z=$q5$E)J|eIK^-XW%TxT?gg6no^5yJ#C>4}6e7IJP{iklJ&5b@HWZExlEe~ccw;=+ zczW+a*!kGJ4YHn;ng|*x(e}H~CfgxRbL&ksVydQ@DN8c%BH%~UgUj_g#DP|S)RKLy zVfwMlv)D$a;D}NlwUnp-a%GMeXCRNVc0Y!HaX~yrdS>ZFLy|Y$M&QT(KCiEn#HKDI zz~edTG5XNfR57NCXf2AaQ^>=hTkQ8N8w6?e1TFdM9gVO=%auPLO-A(a;d4Ci%Kt#& z+kFWQzO=1EgHutNpcREwrZZV$rOFkV%wfhK_|qwD#VKv5G*`jsxO*+ajHfLWF)=aO zjWuFrOg|cgf(LYBLP24jU8n^Ncp0@h5gCJhciyC!cIOU%w43CB47`=0&8BjGl#H9T z92)f|R7EXRT|EQ?|4ei7tE2oAvL^0&~eQgGkT+p$LtkjZazxF-2S)9 zq0KnaY5w=o^C6!ye)>Siq@!)DGhz*BZH|3F-TED37@oKXrfs!SEOFZ3Rc$r`&UdR- z7NXz&kj8&+6ARpg}H!4=DDl#(lZzB)_&(2 z<*oyZ(N4?DLKAhJc~QgRuXp+$7F5q2?I)DW&P8B91QodUmgtQ!zVeI2O_%%)Mht8! z+S1v47-k^W1fl9fJYUa{vh-$+7s-hfIV7ReGa_ra&PhCz8bTbAV7_v*IY)cM0B?`@ZZWATB-x{xUm;DdR)sD?V2B(qT1b!KH>C3xa2E#kHaxH=g_{S^%ROuW!oj5TF8oC z3+J}*S4lhBfFHkJ*(Dv#$pMG6BBK8egEF=%D>mA%D^8A#LTSfTPwr314RMdZpDo_L z$vs04@IcaydLW}i5A$g5+9R+;fX5W!%XmfcI;Z>g6wgclwp=hp>)dLYy!I%3>E1Hj zt35b-h9%h^Ca!^{`?gxIvu&xB}l%h##`ucQBxeVq&TEQ-O<%5n2$DmlnA zv^`s9JnY{eD9zx6VD{hVOq0Yd0CT|NV?vFXz*tXCrv0YbIu7#yyL_H~GdjVR<6Hm1 zoVq4FMBs@uJ9;A3hK$nTmvpaI2OhYyFt$v$<)K(!T#e{+t+jO#98P;t{L!BSw0pGl z?@S~<3i9Tt!U&qYvv;Ecs-NL5Df9)ZtT(b+6@k0`w#N+4#KN?n)_)ECGKTpICYVi; zt@UvS#Ke;>^C^IX344BgPv8l!BZxEFxk(Az&6DT{s!DaEDN9ZieTHxaTJ~Z|yiq9tB4P#{FSLtz?(7t7mYqb%T?{ z;*Y|73w#s^bUD0w%>%73dW9^udye3dE%0psUj;>?x7>}s|Fo7`Ajm2A=S787(OVjM zA;kkxGRzR`uS6epbYDX*qSmj|0uRV4LwQhG=(rvQ~{%m(G{DM~w#|!P&7y8RO=$3k1tbiq4j^Ebf*hdrSYh>oiK5>D&@!ed1qBh;B{RQbowH`rUnjQ8^4l>1x1|sRo9$N z)i?J~WQl1WNEOJiw(Iar_M9!zP-$0Df#ry4pHHlxEkyctVaIAe$B9Z*hy(#DvLox! zT~S$fp`dP@5^ie$c{vf_v&ZS>*>>Jn7$acro#H4@hbb( zld9WxabQE!5RKYO6RAsnEuZB~x@;9~!QiPsJRV`yCGY=rT6!OFM-foSZd*7-)FPxa zq)uQx$;TUFGaI|Lyd4mF+*#3=IrfWN(>pvWbNa#;ylW;h^`52-gU4VEfOl?X|>C{EA-0|>4KVB94Zf9AZ_N; zPO#5AdfZ?xXl-azM#$oCB1~TzB4PaQg=Z(t=fLyXKJhk4TQ|Js z#ya2UamSc-RpLPBAWiCI>zOJjYIU$i zPhS6TOnXv};Lm6J>pBpGt$Gh#ooaB42`eVa1 zxEkt6wTPwo1ya*puF1K_E$X2Tz9BUbbBl)nM+`dcp16$tU4sw8O{^Z-#RkGUj=jm3LOb z$M-V$yI!JxHNbq+1w2v(xv|n_ZH?sWk3T9{4@tho4q-NJzk6=p%RQ4{iA8qf(-bR6 zc@+z2n?}s5Bn#-qQX$G0rCyhFfv$FbG1;R!ljtbW^5LsNZ@0@+V^hT(#;>)x{W6WC z*f;r+#m&X{t?SqmKg)-(2P(=>Palf+umDEdCSaTq({rsSz{H0sw;}kKw*$HXac~tR z41XHblOWC2-emau+3;Flw-68Z`zO*n{A*TzHs@N^dZA#0#f%2ij-o>DO^M?#o&~~& zta2?{?}3wgqCa$o+&F)JZ2L-Wa@PUwCti%ul)L#$n8O@83(H7nRGLKGQbt*VemndJ z@YHs`*r$aI`D3Yry?~Sf9}r}dO@3CxAdcZa)a{+;*Vlj#eL)ZrHqA;Y=p zGgFqH9m*VP8>-=0wd2j*fkwK%<0aPa=yu$K++|Tm=wJA4WH-odH|**1-b)@oJXAx) zCJ-&X-edbDuJa2%pc~ooELSww&~QWx6*`vir(Dqj$7IK?5_GnOT)?02(}h-Ek`l&) zvCYX5qDgR=Zw&JA_&UbAr@KARPMJtLog$ovOM~8iIm9lQm^MKFB9EEK=jQzI2}Wx_ zZoC?UVy={P5UPV2IVm%TolJO@XH}C;<>TFu?&}6JR0j3UdR*piW>2iHvZ5H^;VxpS zQl07rJK@HB63&Y>{BmSfBASGDXtBpP%;to$qlGOBIrY|u>pa7@oi!ur#wumMstU=u zBK0yO@qySE<17)43m8_z#SciBSr9P>P44+Q>%JL$1ntvIff}gd&rgzNEjra3lMNM>Vw$9C~rR^>CjrK^~Nls$bRKg*bHelo6{sC zuFb!1_e2BSZCD61M%zD#Z1o1H0Q#F$tJiqD;6!k;g1MH~WzuiPqiA=`p-;d?h_ru` z8K|xj{~I@zl`UgTNgTmUU?H_%ue2RvYEkCc zTd82((*lVFwQx|UqEhOUC_Vh!6S1+LTVBrz89G^v8=vu44mGwe#cs#pyc9S5m4AU+ z3-s2t3L;pUu$BAnJT?R$i#z`XczSzIi*FBxigl7F{Ah}`9cQ%fEioJO@C`wF^Kf0; z15B$7>Vn)v7Xs%qs=R11Fd3=-N6~z(_Ai0kU+cGvT|B9(x#&K+iL^nJwok`tUnH?Y zl#bR=i`;Zw8Ow*y_tUo{&JNn69*X2gLNCoyU%C2@>(4gzn=2r~>c#D!!jxOSciH<>Wxk?>spf#4E-|Ml1glu*Y+8xZIV-ez z?ASerwKf(%ujFjVGv6MLSqbb*IXggK9h`)K{qbSfnd_M_5h!-(+B!n{KQ%ecs81}y zl3-GNdOJ_zzSZ=H=$?g&*THi2m#g()k-A2k&6=NnqySpu5$$@s{J>R54qJUaY(XQ` z56E|q=$S9N@D|N|z;jm@Ri91EisegNoTa`MZw3nMF}a}5j`##knNvmHt-9m-L-uL4 zg?a3Et9F`Th`f7Pf%QLY+kHHL>bD)_KViTvim!(4^>dy0?tbusSeyytF*P+D@Wdab zL97a2tfP3OcwquVYd_%oc{^7zV>sP<>3JxLFjYK%g(kR&gZMsb9@M^r*zP%=?fjO zj=pbK#VRJ~W4bi_{ng;S`rTh7KOS0er;rgA`%lXP8@0DD_odEzv>Oh^Kow1x3(=o3 zFi0Z~Z-`^!Co^Yn~0q`n7aP(;E~EoxN!{Nq}$ z)k~Yymv)Y z|4kwe{x6C6O-LdVxPg=un}OL-2Y8?5Z*K5ISD7>D5)y4CfuYMqPhsR z8PJ^!xU!+c^Z>KR#R9>q8BF%M!LqW&*zu`Ge+FIvJ)8F$HgNxyF3bXN+X?c6fS_2S z&w)2hSz8DMW(bJcTRdEQEbyjlZwFUy)EpiJvH5wrg-Jj@*zm{TPP_VF+4TE&y1nUG zUdB#~!ta_|?AOzNhIv}y)zY^@8;h}Mh_4@!eH`&=!;(I90n?_cq}&tYrxbPBLIePK z@9#Jk_zrXblff_+eJlc*5Zit|H|;Zup=(e zd@9NHG2zkM#?do|N|gta5S=4w_|#`ipDDt-zJZir)Tebh2% z;K8(Y@(Hgpzxps?_^=>)&}E@K)fr@Ci7=5)|4n7iy=>`LeCk?R!497zZjl6f@ zRaLp@D(Gc%ZufZVTQTZ;{Vw}2UhdEqZ@$c4j>S|kpsyjGKOU&JzWX4NK75dq{(!g3|ql$93mJvQTe z`-lHcz_}6ZcbBQ!*`s(7TYS4w_fucB#yUx-$cHe9Twp}d#UPf(Lhvc8bzvNfyVxz^o6tf_T<9Bqr_V3U3qFvtvT_ixWO;9|Yke$m6pPtdQH_%5aV zC@)3hs~VkV{G`pNoJW*}uZn7iOFqtQz<>-|-#iqnEA!3Sv=pf)+9>{eplq#b?7oeq zw66}V9MQ;SQ#f5yysE|dwn|q`I}kfj|DGhXXZdJ+H&-q8^hdr;&t{I~L5`=J@#G_p z$}0~?wv_Hx+yD~zf!F^ZQD+_1WZb|1 z(FhVMoq~XZgfs{Y1*8!a=~B8!BRQ0o5)hCaAR*m3N>aKc#~9sX^r*4lp7Z-Y=lSD4 zJNNzP=j{I6=Y4&y>vfIaVV1WmTY}dUm(w6r4$g{J%*7Um8aFr-tmBY$ zjE0XwXL391aK5eG*!AKl6Me!Adm6bud=bPfEUM_x4-Y;JbWm?3Yyaz%`KK}}xdkJX z%r3^smKy&?X~&cQzRR48#g)rL9S_6J4@AauQ2i&yCqgNmNkRJS?ce+7oP>WGimD!w zekvAufwX$D4>Sp}opD5MG=0cBYfTbhaXDdfzWOd7f;)CHjqTXO2Q2)$rSoyYeu+Y7 zsl;aa_^~DgE0Katien9nsMVABqV}+2(!N#wYsl@<1YBnucu#URU=p7`-PyZn->Xped~#so@dD#&m|0#cyBjGhe=#h_*5&2 zldeog-&ndHUnGV?nn(^K^#t#l0k-Pm0Mq=U&Q37NcA4Zh#2no?w>{ixK^6QV+r|}O z4ZEU;cvUPm4lT{=Bn!0)`pGV)hZC)1#=G3~RQl)8u~_og|Spx0GgdJcNQ;f~)- zq$|g`+(@)Zi92xQPRqfV{f}y$k*y8dstZ~`crwM~UI!)dxy|pS7q)87&)x!4J z0}dSEE$Dku&bTRb#Ze2`;`4XFjxyRsUch!1v^RGYT zgdanD15FpD&EtShM|jh2obJrx-Eo5$^a8!DP+Bq-MB`hy$WV}&6W?bs7* z*d3A{?5`0cMNtC2aezrQ<#y<%m4AJvn0M#_f`6vQaaiWEOgH`_3ze(F^3c!8(%U!m zG*hmtD_jD0~VuM-hHd zhYPCF9K3^RHwHHCBRA91gmNSV+dLwFvl8NWMcmQAFOF=nNdMC-XDQsb&rmKLz;Bjd z`uKK4Fo2-%-?N4{z{a4F(+?=N1_SN`fQt~8Dp@8jUdYSxw(3=V#)kmWLeqaP7REo~ zF;1WA4d2{HPEUxvpS$e+WSi~YjA}koBT*=vt%7uhU<`_OnCjr?7BNY4wU0QQ=h*U- zhyEUW5;=T1;&_VvNn1F?nD{0{?5xObWB6p2O7e?B5%T zyT89p>Uow>?`}^(StVQLSaj=O`KAdNud^3M?^7gVf2Vd!kWht!XZI8X#W2MU`rT=p zMtyZ4eP{11GJO>Nie&OW&SjVX$-^7ZOf<~=;FaO&PZg1FbAa^mq)P9^{)Cr+1~+dW zT{Lx(yw3rMN_z|>HVkKEZ9X1--nrZ{*@NhOaSeKF0Ya?Cp`m))!1k^0L6rX_;sTfr zOa?`EnL}@C5Z$%Ku;s(Z@v<(TF*=c}#1iQf3G5=+VXh40NglB~|CQz+Jn-gvGWfg- zU4>v+A^;G4c*Vaw?%vvZGahN%1K<65JOh&lg#{iEhY$q^rJ~mq17Blns{LS9gwyvh z99l{=N?bK4_reEsZ(n2}HwFzd87E*DL8O%p_9ExeLcj{nM5SX;v0qisQw%)dbQEMr zoheqA%JvMTp7Pk*DxrAPwGvbx>pK}gC9C;wvE`YJsN!3 z=mnQQ4~?dysorRsnnON$*P>IULY18@1YFpng7 z6UKV%!1_C4Cwlm9N7ZVR{o!MmQ@)q2i-<`^>n~J67 zw=#{hpbw-$7XyW1vS?E?8n%04ksUA3ti^odQ;2m_j+&EtKV4fbG4zeaAJz%IeW+Is z*K3$S#K8qBvAD2Ej3flke)A*J4C(RNXUFSrBl5&idjJBoJRI$_khc`U?3=EoCS2ur zPB~Q~N>)qg;g@~P^vI?RyCf|zy;Y=J0HmDOk7XEmY4zQeMQ4HC=xVT#L zK0meBPG)|)vd9Y1U+$lwYS)B3>;_d6yl7ky>{XvCD3cJVH=ZO|{W%+-mLfMz;1jzb zDs9R|R*&kwADA7bEXHSaqQyat8rbOxzLj|Yv^Rmb|I^zFp%N}eG6w`PhY~4S>GB7B z7pjo=nxuHMYb@z{>%T)Na4Qp2Jcy(V8lofhix6M(8?BRCb^XG16mTcEF=&4oTORTR zp!ap1_;uK%Rrxx$@{AS*?zwG2hSH`BHL<$1g2H>utwG@W+P*!}s{JhrX#3xfQ(#Ef#{O|aPe z$jB}SI+OHnUicggS*{-)YzqC-WY-h~=;&{Z(9B^(Etxcah;;hM8BefT}W`O!U6sVed z_3e(Es-v)nDCGu6CE70;59*By3um#wr)I98wgola+B-018H&4B^g^J6?!5DDQ;L7f zX7&MnNAN>vM=<#=2BgdwVHIWD={4% z;8ImJoGI<1ZM!S_fP>Oxwkd1-l=^Y&*Zpmj)0^li>I1gsySv*Wd+?~cpR?xmH<>^8 z*IFMba?zvNr+SOHRfagA!m0zz6o1XQ@JJt^^^x-441}I7kCNdij?0zYP9|#w0^EAY%Tv0m8M~KX3&X2o8$ehMIxx6_f=MEEnMLYBsuCVIyX?d zeP;a0`G>Uj)zH8dm-hI`_Rkcg{gL#->t${Myo2g}h$5f)^2;h@+8pdxr|e-1%VA5F z34WJ_Pv@Pc$vry>NGW-Jtg?ORwX?%-N2RTv$~Q_helWSisGt6+4^tfiPU=uMSQG4d zTzQ#q=gfr{F&^=`R57R{lIsUl9;@LqBHbu+SRV8|@tfz~Qbp3M#Xr0upy# zrCI7Hf}P#C*C`;zW22^F@-w_fI5T%k-iIKpWn1=FMGSYQ zMISpuyt4UcFVyNi&)v{kT=m3sz_^@c$LPp8PK-HP+2W6!MaWhba5m!Fo*H{Y%#^Cb zjZULjFLZ4LS(e{)1UB-UoQ`FBjfyhG^r)a9Y}>HUfiK;$hsQTjvfpXl@ciWrprosV zo=|g1e~(*S;sGJCf)I6N1?0ayPETuB3 zFy|9%c7`$8xg<2^#-I277ul2b7#gb%Y5Hl`cGaTQBn*r<-|YN1ll;Rq-4aJ-<%~Px zkXOr;=#USQuG%PO1DB!1xnf#Xf$5 ztpD;|LXFsxQxm&{z1F?!B40GSa`cprgsHNW-()@yhFdB=f1a8dfL^}2P7WP3YHCkq zL8H74;gxgG{e|HiKFNgzuYdj2r%dTOy-fN(?Pqz52d9uQxH~>Y(Ixcfc}k-Px6zUz zc7uSB;RG>x#H|N1mZZb)dW*oF#g=J` zn=k&_1-hPte>-OW?kpB1ejEPfmX?YvAAaBk*kGWF?D@#@0m}1<)ddGcG7YlwNOXH+ z3dE@~l061&Fi^bKYnCI+MaoA&Wt6s3B)i=9Af2 z{nP;csddK80QOHqzhdS%VJ`ltt%32o_b1A+tW-$M#yN%JqpjKwk0=-BRm`YiCA}-Z zgz$Wj)A;S%Nx%`11}bKD?tf`mNR>3>jwU6ddG@h51;LuBSocXuyU8NH4h)|TqkAMJ zY+Hk4uAx-`I-dfbDV=?{;Hzz4Y_e8O;*k%Zy7qmNQW|amGOOup2$#H?Cy9*`bfhLi zb5E}LJx!rbNF|*>vOjoqrqMXa+Ie+^|8AR-@GBP;VX>Y)A7Sq5{tQ4x!X>1Hz! z_i-`}w4Bv@doA!7OJ*i+*6K1Wcz?J`@R-yv__RRqoq+D9xFvUIyo%K>>)4A`gsbD` znul=q@mZ_IxNK8U&~aSNs)jKu80HzUT%ZyacX`rn&(+c%a1|Gmur1d_Zek;(l{TIu z5hDOtgPDVqo$4jr!1zBEEfR$S#L8m!-t3`k=@RksWifO-@PCD z>Hfic*L3m5$wKj%mSRk4>cri~Ue-vzMkoanSfJXkr{`h!;S;*iD;|yfM`zsOj2QS7 zIJNh!h_iX#cAXv1xx=L@vAbk*A{4hy1EvLZK154v=npX;N7{bUocyGJg5w|WU#e2@ zdpW|aO>ut^qCqZA(rNj%YOs6rFW8c)kAJ-(P=@k}QI`A8AJ6Guyxv#+{rwGnz4RiI zRCmfkj1Llw1uM6(kvWJco1%rP z3zk>YbKL9&&>cetDM@tr)41stM_tZ4TE-QpM4C(@`V50`bfjwfvw6N)5P0AzKNFey z2$EfMwU$6-dCg4E9`vN;D$nAK^yci#ABRTi+n;Qdqm@wQxGI5YTMr_Ai>;BeX)BF} z*RK%%%gkhA4tM>Kn5Jzgs`;~cnm=4R@$rUI!f<8`(n@gd6z$~N9olLh?(rslS4r}8oMg0Ain#jQ` zzf@CLS=}_8h`FX&K84=Xg1?`t^Y`%z&Hf0uEl?r`wsZ1j6Y5|gM>FVR7^EZ~AH>ar zaRQBe=^IbRU!p^IRO*IYX6L~9z^K4n(~&0W+xjyCyly0`U-6%ir zGzAbb`}_HQ7NrZJ9k#%BvDU<~qG0Zdq>JZbV?t)k6z^ti)@x1v9(Qp!;~oCCKV-<6 zGtIN2Pct|W^e$nz7Mn>+l-|K-tXeP?QFLBM363%`_RmBS;kHsv@~7Pe6T>xF8TE4W z3xJ&nmmqj;FR#wE&OC6PX82a+`L7$NIxUOl_U!X!Y0;p|2@28ucltGw2v=Y6@pTib zxy~Z$dZ@#5^OtzO<^Z|z{{8zesi;9ROXf&{Yte@jtv^C5=~AC>5yNUy_Jh-pUlq$& zl_oHmDCFQ5)xgKwmv{Qwpl?dhM`Ujc&QFb|c;Y0koOJC)oEGT_V{Sjx1->1SZ`bY} z`{o%4z>i&0tmk6aO5QR!p0c(2dK@q>o-Cu&9nyW!V?UVl>#QMA#s+Hl$p4cuAdunn zCu+BUq>u1%BXP-gYMQ~0u2okx&fPNv^NdiC!fWe&qHsN0%J#(n<2`eHaW$o%@$#v` z{=XdGtjRq6!S~gFt5o_H&5UreMQKS1+R?kEvQ-5IT78jPHkScKG0mu!#204+Z>~bJ zKU7!STu~M10yfh2#~UK_nrL(95hFd&*QT=j$M*o%uO3Job~OKBZ(vS`UCkaRzygC3 zrL=QhACt@9ZP$+1777a5`xRwdEgv4XP>RBE zOyLk3!3r?;*L1vTUyd%24+dr$w)Adr7uk&##Vm4o=;RHq$}L8_giINUAb``fEw7I3 zNJZ{%zl$tZzYpAY?tkYI@Fu8tMbhMkzGj_|9#IOg#U+v%|-K*3vzMs`P@1 zK1p@4e)XqIndaUg%9lFMv%lWy7UM{Crua}$%_C|88=xbu!wf|6!c_<%)d@{ z6&W28LV$K%Fs-xH#T#~VW;D7VrRGx8E{Kmu3~|*(BYFtW2tj0&cc`WE0E}ly<4Yb3NX;cUTrhl8+-rLmf!mqQA2?Z zKHx>mr8|iP#l*dYq;V9-Af|veh4fDggg9uZ;4x)ra4bHMM5}ex!!zzKk&N+{GIevr z)XO@BajxoU2i3K?xT)J8#Vjic+cd;8&Q@oun|JQ*-sa?QN-<*_ep~M;lh3kzyw43S z&mO0r#EwF&HBhc1Z2cmF9nx~Q9u{c;KFgEn@ANB=8{8`~>jd(?Ua^15LL2>TUVM%th5&qYScc@8tM2{owpinm zDH7bFU{Q(t0W1BhJ@t?MlaSC)`3v;`Ox4TA-Kcv$*kU7ad%JgK^XtDnz3nm7j}uf+ z2eyy)qMS|N%uX$ds|HHchkwwxrnquCqSGzulSHZLeAntbbtQY@+ExGJ70z|bU;EzO zUCS6;`1tEgZPuVuWl{CO`ToE0J7UGRS~lNn4uV4XxVXrld`e*N3GUbMmOgmi$fvPt z?fC}lqw)nEBm1+T;rV>%Z{?WDol_@&j`cEw_2p|p zZgnOl^JnJQ#GbrGTk`9D5u?&!FBuf|k(q?=yxkSVr%w9fZW}B_JkEiT(Knty%$j5W z=wFilS0SHoPla109bIp48QX~jPRs~+zh!`+xO{Bm#Qkgq!91F zBVP)5HptSO{>XeeZj@aDBekWCxVmZ|PB?rknUP5H(B(Y9HQ2Y=Hr*3{N7vhOkryTAzX z(~o)0ZFVA|^}qKyr34G?i6pJWj+fPqQ?jgd)xI%JEJjMWb*4riJk3K}1QrWajLk~C zL8*%$I@(Y97>hyJ+H+VvD&NSl4#2v4!x8)obXBr)hK_-w_!JHuYV>Uv`eeFx9{oQ4 zwAC{r6vKGSjb7D%7R}e5RNoz*HKk9<4rIB}0x8|T7}Ve5;?cuLu{yPlHWa_x!i~88 zYVcZOxt-=8r%1y?1P)eCx8MA$FwIfVJ$OagU9wm5r|X|E@*EPluaZK!2DRM2uZ z>fa^~iFpyl^Wj^Yy@SZ)8I#fSP`R;bMaQ4T3Hxa-o2au%`|Se_0ZuxG@o{e7n9%1- z-64Hi%9qIpJ2BtE{)?o~zcgTH;^EYhqA&5O*Xj+lvH`E|wsL<}1_pCf z7j+Zm#P`qQ@#UaUvm7BILmF<$O1;C|&Df-;u;+p#%D&l`bqCjZ_ccZy59zuRJQ4z4 z?M%*0YuB3euAZw*gBQso?~lvz-dz1X)e#(j@Y7yK1vnIBON;yw_sYY(%G0Omo9)Dg zQRT7M-NtxFpj6;iEx;bY$!<~VZn?S-H7Z8)PiuGJf?sU_|Jv}S$>%&tN!)MjFuXQn z%;Dec1Az_~6r6~wTR+3iGzZT2L~e#=*MY>Mg?X8e^Hfy1;|G><;|hKwFC&%M>!*~{ z(!Zg;mF#?=iYR(e;>yr*axKJjQ-&=nYDibMVtn+15W%=4n75!5|6R*o!+g8E^?eSr zi;}*KbagzmlE-5)H_V{kqEmt0+ifpa=g*y1NNEOjdM}G0`wij+-1>?w=$fmn za+X%Vh7QT%C+U*#| zSSf>w6r8tfAc|^RkALxkVT>-XctGAP{K^gl_G8f=AH@euMQftm=jVY?Xh0|5Ze0&E zmFb=KJ(wpT zFk(Op$AcX7K~deF!WxcXCwDMdrPw7;^|EDb@^wu_MQ3>XzZ!y)1&=ZDkotO}#4o)K z_vFXqd@chH>4$L-pT&bdwJC~X1c3-`Jx5R&?p`GY@sfAXX0k4(&!{acjgs!%pbLW_s4ge zrR#>B*hZ&F7A6>8$iB4|y7FwXTsx;dqgXgipNy<09DF}v`245cX`_~{?$Wet z#V>&|Zd&jo(dGkQ4loROufK)Cy?^<^xojyc1)@5B@BVi6V) z=xB%BX$hGpNr$UyWQvir$`3bp@n@yG5JzLsuMZyk31;!WcA8%aC)@$P;{G8LE?@q+ zFB8Y**D9Is+%^U->T{{V*}O`!2TVQRZ#Nwp{MK-PoBivVR4oGFpr;@beQ$;xd>|fZ z!JD5QTI)Bym$2>TYa8@W-on3j9YfjB9-~+jaMRN$O<737nt8JUHZ_-J_pNHWnxc;* z%Di)K@^KMXDNGEq+4o}xkEBKOb?JfQH%RO&4PX}WbI>iHnwrF8?GzF>qF%~vrl$C% zo1cHm{>%(#8nk4`or>Y*o%Jq|hU@D_h= zoou)<-pv!SF4y}0Q1%=WR&UGNbi>=BstFarXPd56FRv2KRNhb=1c!q+hF+1uifzP*FRm_#KYj?ZD?G>_s zSFT?}Ts?(iR9I2$^eBtA?O>MKiah8xiXYJOI(+=tn}|n$R=BacqrA{7#!Ymng;UAn zauZCUVM@uX`CT*KyP1%~<-Mq?dP!?};$-n&Q5-c*aSz*;a|K*nf{wJ!pn%ISJ=1@B z_e#&pwP(EX?7o18vdb@02j0Kbxp=slsM^k5Ji5%{e3OA_`(@rqF7#Qq34oLzxTmu7 zge^;E_=mng)O{%q4lK5r#T5N6e)aO00o0j+?v5LLD{T7K&|vFoz_)I7xid-Aq6@RJ z_=>PG29hq!klb|euNyW_|8y5QD6w(5{{mA*BL*9>Gozvaq>P=@JjmZW-Gb*m^%gFcnq%xCwFU`Dv6dURt zdaWZL;XGha^$^7%Uo4C4cJk}1wMLcJ2d_@i0i(QC0DA6%hUwpkvmEMl(? z98Ov+F(y64BTHs~d~~w=Qx9-rmtI=`&^MRR;c9#kG3XHgY}-jN{N%5cprCpCP9oO9 zsv13!Bj4_a^p30xU>x}455Cqs-;bySHAd zaJrI%l&Hu(V6vHePD352B4kxT5*~fE9>*Gl=wLIy+tovxvv&B*JaXHR2KbDD$J&d% ztjNXmF0D?csQ_UU`7u_egZtH2od=7Z39RA{I(Vs1TN#;;T}Q_@YbRGFR{s7(eJH4I zz2K^4+i;%cI8+ZVRB0bZWaM*;sj|7j9^Rl|y=JyXh*^&XA{|EH#%j#WFL-~%#<>-n z6N|eMc6vr34l~;S!P7!^3_Xr?L0o#t_^--9=t zU8n-a$A+_dkHx|7*+T})c-j()W)z>2-+P7mmf4$f6kz@Y$d6qgx`-U51zZw%iXJM< zv|%1jNFgok+%JdH2msVe_+FL2RUim3jA2@PT1M?XV0|wga^2tg@LFq{+VYpIgeA)c zcKW^U?SnhM+6$AEiIPcn6v&Fp)~Ua!sl(CY+r#TGQ+iPeRxe0z^bXx+L3S$LHtLxg zYDH^K6%YP$G3KDNf^4q6Ut^9;Fto;Ecb+3NVxL4`H5%TS5Rv3y-hCDX0SY*82=EkA zUTHmiAVhVS@Muv+U1MT?iM}q7FeHcAfjBwaKVu7x^jTOGvLJT1x+ zdA{j&`IOl>IPAw)si*y_uds}?+RfiAB1Ha@s`TGe5>cdieIH)TX0sOmI9Y@2sJ z%2F)4%J@U#u;8xBvVc{KJWGMr+O0o$$UVAFl+QOS&2Er0u4&VO5~& zOImR82^S`nH!Q3=TCvh&Uj7X%&ZYCb!WkmsfSx|v)@2#L?4RimTti`+c0&gOaBe)= zW>6|N5HGW7AypKbb0`Q8%7HYVqE%8O+sThx(7|rRO18j*E*m~a`GgJew@`pzt3}k? zn~@mscC}HOb_bBf1@G@Peh3>PGY_`S*|@p}3P^=D-5`?Q;N_ZSAv#ZQYbi(-UO_y5 zS~1u2`KP@~x?uiJX;)fLi_dc)b`O-VI-^Hrin(~Q8a*eFV(=uE$^S{VL*YzNr&dbC zwVBBWSd7t&;|tJpGxjjMhAJSftAHAFS!Dt(J%U26<`uShkRTz}1ozkQFL{xLkFd#8;>eWpoEW1^EiH$=x&wtsi@qV=pxC zbN+q)Ds`tP>u^MYR3fkHs}~BdLEWVDThv4Mt&PvDM8vp)FX+W{WRieDx+5K#wD07u zqb}w=YG~`J&yNSLJV}r-1`O%~w#wWWFG)=^sIqouv-ykS^8NB_!yqOxSpfc+o*{)t ziTXA!J%1o50()VJ1kv`SBC%hhy+AGXf7R&ee`CrS@@juH*?=LNU%%@oX|i}|CTzJK zwx~=ep6|A!&#djJZsG)5ua6lSJAKPL%sT=n?%2VgpW|}r*?z|pmd@i-O{uWLlucy7 zu`J@AhUYLXU6z>gN2z;FG&&OeUE`XBnz9iP|WCUXdQfaFA}Qty^9uq z3v=C;7T3QeyLAeQs96gB?9q>ij3H1P!+YU(ytHw8r4ho{!>1=k47Mj?%D8mYd!A8% z*}jQe0W7wBv-%oE-qRQ1>PxfeZ{yEtH1V}$2AqY~r96I}tZ&cE8`Q9t2GdHzj;Tw# zJt+0MVtq-bJ&JXJ45Z<8>E?5i0lz=_vT|BT11#oOn0^Dy-$%*myi<*Kh-b91)^DZ$ z*TJX5@prDasR=+R^ks>YWg0Agf&JE+ju`7GZ)wyui7_-liljk2>RAwGm<%5YhGn3U z(&0_AsA~?W!wngXE}N+=2GS1=$&z}Jr&&9889#ZI^vqW^7ly<{a!PKc5DPZ;%r72n zZ;05dI83odb;`e?#- zOG>{*#roc-%`MNTIis?(Q2T-TsP`uhN95B;tmsS*S5M}epCP|4=6a_0mCFUo6j;~@ zmLeB20dQ7md-$9exWAK(prv3e4e!)_&)MA?)bhP0?h_!mDON}Hxy!_j9+=$xo33hs zr&iu0-32nQ5___-=$WW{_IyI~Z6Pev@^7^*yhlI0b>a$K%7Mu&7UiYCUb_Y2xN95w#$um~HfJJ)zd0 zUd*yt7!oe|L(CfbdZGDIG4Sc2gCWaFRjb0yv< z2=t6<-t~_O`!gDghKkGMCZ`K??ra`G-wQMNfw@_`&x_0eX2r{*QsI*s<|ri(U-H+( z#%iWxh`~9@Dqxbz(N}|3GUbN$znCnf@W;ndgX6E(O-=HDemv&z!ZRPx9I4@icBRyk z=|5ML-V}&&Kgcl)1&V~x;tZa<0L{3cz3Ea9HYc#!R8JyNYCV>9yn|!jtscK4t8j1( zuW{hO&3Y5;m^m0c&R4#3qal?{P5eVZo!oU$%1d zRlV`7aqX(_0%@77^6y*(&ECZ~E9P~1CKl*6020x5E#wd98qCA7mIH1c;2yR~ud9EL=M^5P%?|NPV+S@d2{z6G~F8c6>=ZWv!7)4d{U`Wutu={yD+j#lOYZOpPlKz;*G3-j!-rmWh?Q^wsS2w!@4ed|^6j+-HMU^N@zCo-Hpu zQkq>8UKGT)Uu3@*YaGlpGLSq_Ck5ML(_NG_iFjmpAk*zW;v>v_u_ty=(Jm(gXR@++ zkb=imE}l0J>6hiJw(x?bp%xHV>O$&GnWn7o)I>|HN^}3&MewPbsL=z12ZNIakymfo zJ@1fsAHheb^d+p}!#d4*tO9Dr(QNeSvlC3AP6cVe`n@N|at2ewMJV)vME_;R{-wsw z@CM7zTE)|1pO7zAh!5Oq8Y6b&4XW>lBcI8Cr5>Z5d;b?9H2A37xW{;E(F}jlsb$Bg z(zZ)Xfv<<`={|AJoY$DUQU_7zEuBANWofo|L^sFfPmhr2OKGU=qa@zG=?~Jc-}@cxxNU@k7-$btrw0qt(QQ7+WN9EdBmo$G+&k z&ho$Cl)Pn*wTH{+Y(bgw1P@Z*<(tbKjZ$hOK>To+#Ov=2$ARQ!mpYVN0X!X7i;f6B zrMnr%3nOia1R!ZZexJPSUt9D2^p6siJDc1BTw)}^CK_XrLE@v`>11P(ZDEI47H3L2 z$fu@737!rcEshU)$LTxIE+8E2c2Ck0Jk82G`^jazz?23P;PPpf1yT%`(@(lRWdw4lbV()Zq|Nhw&y-jR|{ZtKj z8A_B*_0L7xgg_QXcl(`CObmk^jwys@AN0XK&tI)OQqYQgXsgf0gVDOLV)}Z)tt$@N z<|FZTo7ef7pk-!lNav7GhS>G|;Q}@|$)4$yVZkWc=&jF{HT?XfJY!7CH@HxS?rVvd z+z08kqy_=4t&&mo$sXxQ`+^^T5urB2jA?KI`6>w$5ygp}{ z$%n<~)#e06wH|zuJ?_#9W76y&zE5*+?i+}pqey84V8nTHGS$2{E6Z~cZD!1HwoB_% zhEZloj!d8G?lKBf(>cS6hOX=B6Wi)1?>gobQx*GOD+nD3E@%b1uI>12eg&_b!oAT} zH_o6U6*IH8LbP|_p+58=QnH}q5N%#rhC~BPfLiX0QuFuaV7w(a+|yiIB~k>!ZBBPN ziUvaQqjOf~dJpwqo&O?qY?y55a^GHmfF7OdY5!DsO1bs#p4r8Z--31)mX&WBUT&2p z;@O!*7rgAp1j9V(1FqZsIe#FOc)sgY4~VuSdI}A?wYB&%A*2-Sxt!=9u>Be0bJ?Nt z;9$#HGc$MkM?nMU?+3?xY*Gsi!d}?+a4GeD6Kng!L8vVL;!Y)D_N2C-8whMFP!>@O zp%QWuDCrl!2idWvv~1yD1odK{-N>-x@tJU^f29`uHH|IdwO1~KMZ}c)x}VRZ)uxv| z`E+!QOnoXauxk^RUH*(95j;G#U7r~U{+w{-K56KD8ZjkVHnXnk12t{dS4+&B-r^Hx zTr@^lZ`%K&?(oA>E_UdH8FdChj(K1gN+1Z&T{(HrBJG&4ibow78> zI8@Hs`5MW!W{g*v<)eH1!ei=G@~q5bq#fS&<>;^Vr2G=62e};K_JD z__q>$OVtYCsX*jL__MHGkMQcLT;jWau6lxkuS{%>g}huymLJ~}1xNBfo?Waf*!8Z7 z6T!OD84{K5u)Z>zXU0?a7#B|Y-ZxF}3z@GLp+*JGS-;glC#UIwt<81;Lhze&k$C8O zxG()|2a=L5#R*y+)N#{d;TtnQ6f~;7wONnH!@dA!hLrhFPi{H*kjdp#HliSeoc( zj9fe1aRH(hOjg&jYR?o-B3CR;Wtv|8!*@_3o{0H4i$kjnc)hJ2$^FrnQCXcY-QuUi zLQVp6*k}t|9?G^Ub&hjMjLN;{00OK2+6JvgpvZ%14_0Vru-J+T3vQ=^Kc)!$a++;XZRAPl$lrsz~O1 zDdaG>#veO5%F(mmGyZ5OuBgNrL zZKU47nQpV`QFoH&y~8s0v%1qQiMfFrWd7W-R75NMLI2R_2jTtEgL|&7vg}%W*UhY0 zq2gg4cXxC0uV1E3D&^;Xc?t!TG+U!H1e`10H0g?7c+H8?a%N!1?QWUO)??KKycwzU zZFPG!AYE7vELNf8cVJ zj~O%b4andVqjA*=r~3MTn2fH~|0ySZIOT-;WoQ9APA#Fu=_PbZNfbAPYGh|Wd?EP$IP^M};6-6L?}yi6b$3?sy4;F(RkJL_bgNf1 zeY;iW@bmSS*zL3%DVwnz8LNY(-b@Nk#(4o*s4qjUiI4k^INQl;jRikSg!o2r_XH`V zv$HA2Y@NvwNteqZbYJpq9h;=2F9d9S>)Zrd9;Q%uDlJZEWAd(X@P4nAAMoTT;A#eo zAoSFwAfn{ccuCc{A^4D^V@b?f51l34nke zyW$rlxwOdk8zPnCY#q}W*ydS}7!uwZ3 zrdH5&zOHoG+U|V3G0n3|nE5BUHQgNhc#r=}i@DOUioR@tZnbZ8>vz>SF)kDE=_Gf$ zLzT1teooQ{x%UW#UAm1&r!6+4#u*<#AAf@z?Iuk@x!~ua?EG{q`%ZeXK-Rj_rbM=T z-{c|t4_XMczL?C)7)yPUh@{>5Hf&GqZGB0QvrV%+QBkw9H>*SME;26t<$~WDUk^0u zm|i-eT1u?~z6u@aX{z$S5jr`GAg7XfTV<3ZXc~NCbsQica0flndYwnLQ-_iqZpS@-8q+iKP z%q0KaeB*EJjj|o$?0721hLO}EosJ#Ay?OLu^tC}0&-u&S55>k#aCt?VI4HQFnXmiy z@cj2E`B^a#=U!amfKR0;T zjH&zYxSDuGiCcTqg&jHgI;}A0UHOFLqxjtb>Oq!!<&3_*)g75IIJ-buSNw7H9bi}p zWJjt_x@>Uzt&b00A;=yZ6}=mz;z~;*BEF!x4AX#MQ*O{8?VZ#Nl%0&t>+ z7y|wUG-pjkiC$A)sH)EiB%IsVQQHXK@KCb)&-GdDrqxqf6F8pe-|D(^GQTO9GlsN> zo*@>}SM{b&kmTDL>sPoDysx@m5v^P|5p;f~c``pgr-6H8JEBA^CI>jg)B${3K+D+~ z@z|5yX#Sgb8lk@jo{XJuf_?8A40TrZoiV=fLdx~aYm5@l zifSPkZxOrpxe)Z=eu1NGR8{#Po5{lILRPDKoQJTJ8TazSRh7RCFw`#WENJlIz!7Oc zXtI=b#;p0p)7qC)Etf*^r0s?!uh`&ALl_6k#!CKAMTuF4O1$muwomoyL;ZcI;tl-l zO|MuFr<@yp>*le3|yt$n*I#;^uDOils^>J;bgeFD~qb<5| zEhEIaE=*M~AOy3Ikupl*8{mV%zPvhueRG1;i>jj6)Bf>2d(S_kdjC}ujc?T*nkNW^ zm=Bm>T5TmBuTc?Pp~lgWLiRoB`+hCshubCX>Bs)JB22PJ&QHm?v+2Hv+l?_m36h1F zoY3>@NPa>=W6K!{_!e-aS01keet z9gjG?B_aX|@N@ns&+uQ1;M!FY*Jw9OTgK#QL{(rM-B>Jx)3_~{m|0{NJhhJg<6N;A zm|3_jOqmUE?}7!W^Ta%xw^}+;KSW&gN6BOQEp3rxKEaE-!hGf5PrB4C_0Qe?YLJBk zE#7B@d_ypnxjW~$=N&dCYPE(Tt9(=goYZlBnz4Rmq7ey;%-T?g1E;`=ddN-KC-G_Q zl=lyhGBW}y*xX@KEdJUxNjLiliK8lVk&R|NpZDiX#rttlapIoqksXVuQ-^BE4IBgt zHd4#e$%-G%fi<4L0`z$&#%H@UJxB-4TjiOoW~arn}#W{4)yxs)ZC#PCBq8tJm-B zR^|t8r>^m`OwtgU`1M4Si)0y(EEBEOVm^&t27I(pGj~0F{i<>zA@1?(`nHGaC-beo z8%Z)&_L~!E7R~cv@FHMgsUxgpbq`pQEF8+s1qfsPYl3 zuDg%!cn7wgwTAk2Lx!+n-9vxdaCR8fyA&tU#nER0dz7|$iI8IWCgX@USJ31iLb;F3 z1JZ^aY|OmqmQb#=^-yi_-e5JF(gp@G!}_rJoZRT2$_LR7Zyf%%P=mRO<|3tI(;9O% zB)+?)1-3dw7*Q<}o{$0@EU|!jH~riaBc9KF4Z#8Of#KPue(c_~73!|9f8RFuc-o>p zM_y{_)b0gc(IJm~{qykaZ+K?mLW={5!ku&av4#28RYv7biGY_sm6R_7^hCRg{#>;* ztoAY0Q4>>Sc;RzpKnMs>R?e&((PDpM&Ny~<`%6ZrO18z{0H9%MP2nuxOij?HdH47T z0ta-+aSP#ptDywwJUcy>NdhqGxs^y%G%-Wg)tu+<7FI1Kig1^Ym|dv`1G_Iv?C{L#*Ec zSUuI2U!-^Ob_iw~FlV~bC;yrez_pQ7Qlj$HGVNC;I(Al8$&IE!L6TNFPnok&?=&cZiR@Oy{%4=P{nRrWerl2xJ>-L841c@+dtR zk>`IJLZ*UH#R02$GTLNO%s$^S;54!i=_e1R79zWeL4Kqltbvqgv;e+}?G2k_NOfV` z_M8R+)^*%mGB4Jmv(W4%Y}OkfIY|vu6m_cvTC^A3k~xOU=XvjU=l9KEyxwr2{mYG< zvpFMbMbI%FjicfJNFNIR-E3T2`j>W1f4`-UA{$gGDY|s$#;~SOZe?HD3&m{rl(_=i zB89XYFYE)#XbZXGW*;)Bz3*q|9?pl~{jc0fPfK7&Kk3H#f5!JxykDm3yk+#HI|Jd* zvFo+!MnqKkauruhL40tq8c&<@dhRG((}C-a_Ki47s_#m_5gcm8&7z&GG)Xz zkdb`M;=TW6iE&IWJ@z4~rSdd{8K1@{n)$grH^1e*UD#{-T-8UZ?4=oLxC>R;;-uT8 zp$}uMLI(u#A#O5O*}g0U=X`G#FInY#c}w22=%PBjp7efc{q?g%QB%XxPEn)OjFB4! z+;tO|{3~rTAB3jf7t}jUp~Oe$6e<+>y&xRfZ0hk~sNNf!VCp6)3T*=QQzk^Aj%N#% za9G%CyN1h>y{%o=L-&*vAaEg?dPFI;o|?r!>t-<6c1#SW()9-u+gg8~$4M0FoQ>_h zLL1`p6R(px?8zkmP)*8P0ztyM_5FO(&A4lzXV|zQpCfGlWyq%jsB;LwWW(;B$W zFI)e-&S1@xA)khDJ!foiXxfGyL9s0EZueZvh0XRkmtqK{u}e>FF?DzRXmMvzUJvS) zt|?OTZDA{`IbF6>xa$>1WCpT2!E0?3d>jZ3iA!@IbO}bDIprzcsCm0U+?AY8rsXK% z6+kP|0Lq`*Ogv&L>Al|6De76MQpVh{B{Cya^kau+)8lVSacClAtxf!CLM8@kn%ce{QX11Ue@6G2_8MxCaIAB z(HZ2OweKet`#>$KLGE!t#AeR!*|`{gFfKHTBoL3u>LnCy!>0ql_>e)9fIQukZ~=#- zyNXOtV+Z4>lPCWjp3d6dj2;4GH*5Q~>^DMu2646VRiqP~9_-ch>k%wO}CzTEEM{|f`YA9C2s1cs%Ez^QYhe`l!kp=*U_lXirS zdtYew~OV3OQ#;y04Hj;kA77)kDdnuI-Ue+q=mHVo&qxVHahbTm|!H zAv<=AyGscR{%f#DB?dqikB^0=A>_k}s>qa2L9ZwfWjD++xhrSz&}~kMXN3T>o~Wlj-)x^t;LRg}KMelr~w$r&q<2)yF*=;&}VQO3HZgneBq&$#L=GEJXi6 zHGWkYioTxVYlh0}dAU$=V+Lz=+F0&!{_WS@Cr%OyA1(Z|+IUam1A@;+>Truu15xu` z=oV}N?svIQ?b_)fjGBjuUXGDSDT`8H?A(VBcAPdMubX56ITgW_?VCV#SGGBeBw6QnRA=(mqx=ATy9RXN0RfX!^R!|ZmX7iz=yWUo{ z?o6HPf9jw?IVX36SrICt&hPEstHUIs7WOl3LG2=&I6TKYp`?4L?2Yb45YcKe)N5Li zhU4Q;R&b@Fk>G+TDL1FxG3dU$|C!c!Q=Hp_Cto$+I`I&`U10;sA7p9kI@;~)CB7G- z$L8}W#0gFSrj7*3!MsNvshYIwmz(61k;i<6gj@F?PXD5<0v72N_swvM1{I0OXmM$d zJ$^{bbG`jA@N{Y_^v_)S_8@5A#NL@eZAL}4cY`iEsajd2{5EtyI%0-QqWV&gmP$hG z$tzqfb(T_V`*-3mmdNNZ?1Eb)EYeph)6dnd?LU{`awM^MJgbU$B633Nx}IBu>1$ej zFzPv(qzTdPOS{ip8Eg=isGZ42UJ$TPAw8x0kb1csi8F;9`Cj)2I|^3p^l!k;Aj+&)3AzF3v+T zN|F%~u5G@pr|s`?-=pKEj&rEU8EJ3&91c8#b;h~g0Q5E%?2T||;chdJ^%lpwC5)6_ zfbM6d8xZmz`|I{Ur~0FA!iQKcClIZ+9zXtY6QRSHOvCbhCV|e@f}MS93mRT6piCN*%RD(|J%lj!y;Js?3tuQJ{huH&hDWf^~Gwh84a5=trMC%}{3K zLQc~~WiJD|Jz)W%%{+?4Bi|yKaDGpXy@sd|QUrr#cx>B0WyaQm9kFLITSEFD*A3dM zq37>bu7aQj(?w4guap{qu4D>k*^jKOdHHx)Ae2uTu zfg6`v8fsW1mwPJj92nl^iDPmQPR6J6RMVp7u2esHWIG`P&3Q7QQ1{uORD|9X@3J*~ zo4x8?#S;#C#uqH4JD?WvVO14G|Gy8Q*2p)lgnWndmKW-Pwbxv%_Vdd?>dh|eM%?l| zuLgCtFsdEB>fbtv7*s^XkGO5@t<0`YO+3!hZUZTeMReIIsYi&7E`-y8-KKz;m2XvT zHWMnaEHWYNJfhvph2;;2*elxiCr`@5ov)U|LI%g_^9D~1LDM16X=!eak&i8sqS&6| zKR&xocVfL-+GfEgP;hGZ5^Z(1IC_{0n`=Yl^y|Ac=MKvI9D{bV5?Z zdQ}Ee-Xgmg)WL(5+w;it7u<}$gQ&aoBMVE9R^dwie+FySwA<#oOma3o z(n3<6EgK_VN?mOnsO4X&B5uCczV*7n1vM_yeK1?J*ZGeFk?-m}uBmAqE4byU1HlP@lNv#si;wlJ9)G8$xnRpm(YJJL|Jx$YxAcd8AmR5pgf; zI(+JP1EBGH%}0nE8By036S3E>243WvI13E-qJy2Wy}5D!A$|2%V5`=Zp@qk{5ODo_ z+%Y~Edwsg-AGRtVn@MBr>A?=>O#{!gpUjXra!&&m{(k#w-bGh7U?3Y~ru8mxcll^$ z!)Hl4??kqqS`)fsWE_(D0o;i1*yi%eZbi!@)FY{ZNGQJm`4}zk4Rwg}s_(!O z+O1oyDTEjpY)@Dc5L>Bn{l_DP7FFm%kaTChU7#f05HByp=nFqTlVFq9NkX7pW5abY z1b#B=GJ?>^94BHB%X@9K*4A73OC;wP0{y|+u*CUGKjMaMWwWHcB)B0z**Ux%gZBt2S4F+m6${I}nvHUlAYXW-hp#Dv zUQK^9M0)^Freg)km9nxd5cL4I^U&h;>p}9`mnfVZi!oyiM}R}zt!qLR_`>#3=fXQL zS?f$0;zXYxW!igbU1hxB|7WBG%pc*wNfX`vptaZUoVt&?TJ1ac4u5ym_v_kqgEgr2 z7%H}N*Q5?%*9ZdzpT>DqMLT!x^$f|ZINtCdrl!mzc5_jhcmqL!VR8O6`IEMfC#(1Y zmo5LAgeUIK{EBFJkJ9Goi>LAQb3d=c>tW+~9qAKIO$02fExB=uXbadVL^DI&#j(!pA{L+ zeYe=gfSJtG^+mi)T5I>K=XR2RvMpIbIGKf$ZHtYkePd+>uUu{8EIk%1L-Es4=6(!l zXL|jvJI^cqo^%t>d$XhOMb7Q2(rC7Pa6NAvzu}*%?7!MywzmUr5FA34d8n)`6uZEZ z1>)k0)mabDUb)4E4Ch*!uIACK8CQ&SB>1bgFENkv*4jl=@bFZMB2JwU5-_$7Pw$Ey z)qJa%*LgE?z?B%v)zP4}tXn9c4g=b-`9;icoZ2Z${$60bQH^yNdT<>&&o>Sea5<6# zRhd8JqWR_xX3^|G+muSWa;DsKHpa8#g3J?Ux^BH#nXh9PN}tCt7u9Ng1kVfHUoxFg zLSMvzV3?d^+1sW=$K=S*)R(hvFId@j9GVwv&DQf7h|g^jPHDe9u=x+$);!#;=qf3s zq{h?GW=N}$(!opvAjFoL4zMIdZvaosH=>=)aDRTpqN+eb;kvhbZhaJYJ3lL#r;=NS zNAv@fHCvgO@{~@bY8zNSo zf2^%KWq=cjbB++03d!_v(ctzGL1%CzaTa6e&7}doG`8RLR;Y{JbaFyh{qSI0YF%Vu zbRvywnx&W)*dxOCk=CCZZ8yHOQL}i++L9xs74wocKTr47+={Kh8hdTzjqAkHaJofx9|@++ zFUKbYy%?qSBPmmu+NKvSt`W)g+&wiq8XpPR+9Bm2u=ih+j)-8B^$o$}a0x$J9@hjI za8Z}8M1}osFOs{YL<~I~cKmnlY89{7H%E1*7T}0^78bGe^VsOwk7&8+bsd5CVm*lx zHSYWuDQv)O)au{v<4TcN;;)ti_%GHy{zqb3QWrGb^!7*fjI-!tiCs&=;de2MvgR)+ zCo)I(rEd`ze%A+|vwq!==O;UzPSUA|fFRa)91O-giRl zyUGKH`YCj`g$9bKst1O2q4%?teC#hqAN2wZzj6bTH7ySmkDCYA$1^=48s8o`qi5dk znR{}-iDyKgt*McAv)g;V5{p6~M7ND;N>gD)*4}Fh6!KXPjEnV37AqSTL*Dq+A#&-~ z^i^1x|1Ev$5qF_~c_AoEBVDW`kPHfvUMYftAIXaLK`t!j+Wqkbwoi%uS$I%14i*DKRvme9{BRhya zbb`HSc$2Qx5SCEL<$#KCQ=K*(SO)>VveFqJ@nR|8xzC{|p)4lKAGp!cy zM$Z)crrrIpd??XVzBZMGzE$6lN@sU`4f)gQFo0GwwYFy}R-jlQgXm*mP_ifr+8#xGT`)y2#CFW_;^tD;qxE8B;)t5gp z*r11XVG0?Fn_d*h@ixE7^XNmx0-SaxHGq_P{jVe(G+iZ&!IH0lV~=5YV!)hZ)^Ncy8b^2^ykex={|BSvodA$|kezpU{<^EhxFUh}-J^04PM zvh7Xlgr%~QtDf@|)0M*b8Q}(b(ZFb&<`es7`gPGb3Em_+E5g+d8~IDRoEKY0df}K@ zZQeDf3xRFCUJQttjy|j6q%b+8Ty9Qn*;+uUZ`d7n!ba$y4-;H>F0;HNt_W(JLT zh-PiL;G1T2@NOtQV3me0!QBi%_i5gLjyQb~?v<-fM+c3aU<)@X1(nH^j#Pg4shpCp zw2S-4_BF9~@@X|CaEixl6PFoU05zJ>}QY{vy72AYBx)`_)nhg4lt$f z{%5t7*7tGOM)a3du+$&RXO*d@|55s@_J=#vYHjlumHC%-%GW0U!?%XZsy%-mIKTK7 zH=u{yn_b(Q*xvL2wCCbD3FCB%tnU)unR3AtA7?U?+)6Q#+cQnJooz;X_Y<&Ob^)BH z?=ISM=mY21g?qXjX43XGMLEA>BbFP`aJzii!Nw}JKPxH(ZXjv6V5;?|mLk&~q!cQ& z%%YX>DB?-P7DoXK56CGPQy|1S`08dbYL`8ZLlO>HGhYwC-D$slMdnKY=(mfJ=@C)(0ft+lb&?kx5kS{-8RK#3Dko2< zLdvYt!n-B@#lWS74wb#J$GhVmK~!La4YbBa(%ODJ3z{8ocPqZwAI7qr*xyxrti+gkF()(0_H&~9G8BA$*(bBW1u~L{ckJ+&qUE@E!J_Bo zCYK5d&|1&Qfl(D-crduRREW{16|YUPZs~|n)6cfV7we$ZcU_8yyOq^zxJMV6*-s6| z925P*)dm-XNItG-b*LR+s*Sb!lq%BH)lp#CyWr{6gpCHzi$)z=BrAZ)_gd|+-em`d zcMWEb1cudj;`M}zg)$Dm4_IaL>H2QKetnFoMtrqjzTy<*UeVJhU&tm+y=~kE&-WDN z1k?x}Y|0r&)Pe}FRZ}#ST=+u8gF`q&;$^t(?1DRWHT$+tDE_nFIwpkn{nhO2ok*WX zxk(edMJd}&0f`S4NP8uzRj1_^kLONsdTAC|2bmnXqhex`m^iA&#zhmpfL-QC^TYek zPO?O6+ikB4U3$;g#X>nrge2QPMZbJ*p!L?dv4zJ(uT5L~$bdBzW7^bxm5S32rV8u~49IUDJ4^r-7!c2k?n5gfkp_(dl~;(nrcGH{oAb}|cb z)Gm4P?srYv%+~SoZi&c18}DD9Z1J?i$80n-rx>6o;+C*u@zw)#RTIPOfuD-q?)s!| zc2pgXb6lS89olEB8*~augt+HTx@T<)d&yZ&C{TR6VY1oGt90=*clS48_3p>-Qxf`7oaw2M6R^Lsa zPZ;iHt+}gQ^gR*6_a8nvrf#Hw75;@}?MF@@@4i}AoL|C+krO*ERJC;-XUNJwyZZ+> z4#BP24_B0x&%Feo!{>+CP{M9`0n&J^kGSKjBuQ5(-RNC`u_tW6Q9p;A5+50hjPoQX z)L2;|)$dSzi3?)Hs*Vpi30oM?$(#TEJ|4?U^sR42V%|gI2~mg@IvS=u>`4E~QNy2& z=kT~wkBm|Omdd6+O-BvAcoWT7`pHAI|2ljC>fm5I?9cWy#|mPMwh2pi244Lm3gqp~ z#LfS0(iG9NO0+IH&s;E8D43W%B;M&~mV7MiMtK>6K4P^x2mfZ@q3JxK9is&h0)=0! zE(WdkN{}DrC9dltOU!IEyKMPm)=C6(pc(>b=B)Pp`7a95AMzEjy^gacSiI3~} zBb>N$Y(tgHCa+B__LQG_1Tdo~AH9T1*9>zMcL<$gP+5{@z032h1`n#0LyRjBlmqFu`4tv&Ue2)`pEp*P%_aK2{Ys3L3&F6*|C}z<*eUT(3zO$c6PiA z&`?}W7dYzwR^$?uH5sWh$*Xb10>SXg0FY@{$-hDllS949njI1TcLp0d8<(O<#5|M3 z?(@@-11bT~!J8=)kOHTi1rJC?yy~kN+Thwyf1L*@TVk1J3+ac0k(JwXaqvZybP8Ao z*y4KCaU&A>-SnWXEB*xAFSFFWm?RD%X|83V>yq(dLYJuojS!BBZ6n(^ba$VX7K6N^ zOT9#gD~!zCp0CgTbFjNq;HQrblCL{7n*-Wvtn_cE2j;3u5ST&`IN`C8EDQPQ%aY76FK?Wcb&eFa8x$6(a&K$ zjVp4=yPwLCQQO$qb}5R)vBR6?cjvv{gc5U))=-a=K*X247arf7=VXElG*!|@UJ&_0 zNc5@Xa$7kg*%`tlzi5$otP{h0ZEyaLI5qZ@)48?JzS~ra_Ex&%hp|PE8Of@ zb6afF&Sneoa<=BClpwvhv?dey{MW(RF*0f|M}O@V@{)e{4!v{1e(`ionsgoO-cXqu zP4>voat58(cYgc~C07*bO|y7pP=b~|^voO{?Uh8x98$uY9i{g`AR5ov_YYw$>)lb9 zG@s_8ik2w)lX47}zB{F0t?k{b=Sy{&Y8~j|${&Kl73GVRS}rFEsNlqR_FCOs24D3t z8V82i;;E<6MehLZ%aYIJ!eFk#@duaGBV!$U?te)Bt-gNjvNOEJxM04KaX0OXikKz= zs7k2NPW>6ujR{B5w-3(zm^x?t)6|_7Uz==FZZhyCMB}19hLWp8GG|%xb=yaCG&-p+ zW4UAyGF7t^8-E^hB34~06_zQV%tm)N$=ep*aZU~%56h9)d|+M3t|VBp2#()_=3b=g zFX8u>{FsKPxqO#em7*n=Q^D$5rp_dFs1@#ncBt7f!V|lTeX@NBUuT%5dBiJ&=-b!V zv6{8aFS!~1h2+`&+eO6jyrmWcx;=d_)Mj?$k(nv_8%Mj6=z@;HVs-nw>;mBU4_kGo z9f!a1W}55O#`lSIlyp*y(3+ub*H>v*jmaw z!}acE)-WP9#iyLFkuqrEX%}*Ujqm5t^aPB}fyo;yi5*2?%5oSw;sm(7bq};RRvv>` zBrO#RaG}0XYf~Zzj^{>HQd)QVE0OS-a6&}#)vV-7t6ze@caO%*_1=f3@kuXZYfcJq z(Jd9an;v1j@1?GhOej?!3>1Cp>K3X?5Y|E2!4@|zwYl@xb@cbkT>Cy1Xz}#zC%K!5 z>?MN-90Y#cVkSA01Tw_r)N>k&{hjemA}2Zg9NTk!Vb+}FvqH29FZzU?SF3wwkr|k^ zDP~*8sd#~*jO%U-DW4MbaYD!2+>kZ6T%%UkL9^E6dO?MqdGsQiw_y1Uc(TXki+q>dH9a*UvQY$z!}qDZ04Dy#}JAI?jQ9$zE!xU&gW_ymCo?Au~$v z-@<Ach>4#L#&|QLuU9)y0DXPQh(`m}`^5XEjy}V0!wL z_J?{K{?F@I#iprpht-FA5MDOnwZso+zY|_XY}@6&B7(FkEy}!SVbPf?m`x_r45ofj z6E=X(FUPKM&1Z0vpVmdGhtRluwg$Yr>ES^LG3QcjpK{D)F9Ycq=L=x)tw$e6C3Aqs zSwSoL-bk~&r%Gbt4S@pOx12h4Ti!e{xGz5>WjEl}lj1~md!%A-AF`NXlw1dqdPDEL zsUnxNJqkfBmco!T*g*VFO4PFXdYOw9XN=3p+JG=_A&&E6uad6m7O^d@>;oUpH1Re`uI!m-=I6b#sNV4CVMmGkXsx0FaO8iV{x%1ZRDn9|*GCEF6x^%u}rPm67+|d3q zGEXh9ArHpOm?ctPxU2sPe-#oyNv^pMT5WRCKAYS_#to~+FHWxPk>3XI#gAPFAetr$^Hpb3(ycksrQ>Wj{lNH`81o4t^gMJ;R5g;}`nVld`C1qdL`_kLPXA z@70B|R;Nd~0B~7x2V@+vEgZi|hRJXauZ*1Vs-+K4u15qOBn(PT3jZE{JDz z+h(*!PB3+-L@H0t;PQYIPYu*N@*pFMR<`H6aH|+ zM<`C!+H16*PjBI|$sKjk_M`Yx$ljPJ)Wu~pO=vsaI2Yq(05JgyERLYMrc>I#COgyy z!DH|@^wF(X0pF@Qa#K^-8ZiSVN^E=A77Hxc}-*% zm6B~e<25PoY?ITXc&nEbIp69+Y(t zUXjuGvl2j4NJwh;Pqh2ax&?e=m3(Urj6RBXd?dEN6&>dwm9^^fl8X!K#`d7z%y)xI zwXhGaHD3I1qcA~LKnngS#pgnPoJep!ghm`lQ$|24f$c4@*{;MjIoxvg82?DH`m%cC zSwl_#O3AnhnQ9r$>=tbq8Gm^nv>`T{#H)Y9u1h$=>&RL?=YH98%K6Wf#uG=3BM zHo9I#0E7gL%BbcwqF07E8oT;A*uF-*4O0jOsTH2FBM|0GEqk%c%=hd#>`PC+_CEqO zTW9CFz`@48ba#hn91K{zdaBCYo*oS*xXORrYHcZh8(PC!6u7ZxVpR z?fM#v;!Q}7dJr6m(U0F^3$D;P3NW_QZ>ZI5ViWlh83HHdrwz;h zC0+c^_-2 z$V_?I7GS)lD$y}-7P=0!WY#Ddia~9tbH9FV`#(r;^e?CCqrl)48@a*{6QLXHYl=1y zGtHme&ql)(mP%gfvTE!GgP&D-d7?>g0qqJGKuuQ85SVmx>{hUoKCBf$zqsf1bxaIP zY~IuFklXF5gC(Q{I+q*{9(424Dd&+fphw9oC9 zSd;*0#POJ2c)h6g$HbJJ#AqAWrTe-n-|%%=2Rk--t{7Bb-jA?HVns%bmIKV4FosIe zt*Xg4QpZrk5mlCh;*i_-+p>3OF| zuT;{BZz5WaQQ|to;-`wo{6;qPsFt_#v`+MZHJ_7Sl~?%uNsBM7tv~9|q;}nv9Y);P zCt_pYrV64}0*?f;H6jVSy74tDUZETRjxaURa*f~}$e;d z;W!MMd@$G>Vq!b07cAY#bnq>r`cOaII#NCL9mjAJZWhwz?<4(<`CQ>--5K#*Re(?q zCjBe=BiK_bJJjfTkH)tTnwYSnSUC9aFsa=|dKCPg#^@ z8(uJGi2QV8x8bn0p96|Gun46qx^s`RF}Fyg{SfdJD)FvAgX!>T>=)1rt=o1MMPZ2O1wCTS<8po2Ss_-P7w` z5hWde`%7XrGzX{m5vK+e``4U^|BfPk*N-*G8?dYLU~N7zt% zZu(o{{_0(IRCO z9wq*m?ND2xN=EuNKD2!+qwR$H!5GCB^VdKLGs6V`Is@H6RhMh5 zoro6YM?PD`(3WnFF2jpXX@*hSF=am3>ejtSgmFiC6eBdZbsm2JbdKul-%=z1R@XOP zy(j>-4B9hq`ccB{x`U%L`W-*daDqpSNDqPj_fLn=6}j4P^lx?Y7eeUlLS+30$e=?;Edwj4zaI{xByek+ZK6 znk;3thYDlFUL?L6@wXP|FF6u?=}QxR^7i|sEUpRQq`FAvT&MHF_S@?;_Kk54%;;Gn zU+Qb_ST>fIg5Q44>wkwziOo)~HH!Ra3DsFt+c54EcCVO({3_Z%H^5m+_3bDutNiCt zg{(o=3`a#PW4+a^n{68SI#_(Vqj#y1ovnPEaA{KiCpRm<1^PZjiCRizZH9_}B3ay` z@#-qlut#2UM9dp07@bn+V_vP03^t*_bhRwcWG7n zi%iL#4sW-=LW(N>wo^fc$4kyltA+`*ljYwqb$b$wGJ+Hy>trq6D<)CQQ_l-u+IW?W z8MUjS_44c`+D9vNG}h=VKrHg%2HYtyAlXGTL7!Xt!H67N*y&5&@pbW|b7lY`Npf

=l$UqiixYqZ{NiFAMMlw0rKbT&3UW^&h^gV*06|} zV`roBdE-dMV^v}Y91l!kfOLB5m3J&0kMHy=_hSg8{tg7>IBI1hUZjaSj(Dxvv$9xdd1T#S4Bt4-zf z7wp7)THSM$Mkt=Q><+iIDI;sq4@x@%6Ez#7{pH#{6L*E4)vbTBB?jBEuuqz^iL4Dx zhhBjy4Uwz5SoymgW+2g~b#afI03{E7sV^a8GtXsO+u>_m|^=_+)NIN9;N-lZ&ZSg=yT*wQ;KJy6jc5s1!Njb`OROD$g z_K@@gJdGB?_p0V92fB74(r*O!r$>8!s|jo8=vq$sq`Llb&*wwCFkRFAZ#*t+smr{xbGP~S$1QePKGoE`Z-jV^v;A(%&<_CUAYv`#W~Vs>Mrw@L}IXMW_yLsM~Rk=%1jU-92&1)On5PU zcvIQKo*62gN)74p&>0vsUjEnGkXF*1jE(AY-@Cl5k~%IAbw6c|_)-;5oZg;Tb?j(8 z^?Vl^)x5Yt7Argp&WalTa~#j3(bB(Av3Y^jd4#WU7aggoHp!-O|4jt3 zX@4==NOf4ciH@-S+VbS-mE~5`5S8N=e6PzAM<~|trcvIPF1w(XNW1U2I)0-Mhjw#;zhhEF z=Ar{#>t)+A?@QI(z5g)D4%GLVx(ghb?gH3tCaovCN0NcjX5;QhG9t`e3X|Y#8&K_;e{w5I%BHID$YtcWma0+h7e_VYpHmO)%=OaO{+qZ3*kJA5!gPp-Ua~i)jGoEt)IDU__}uTaEw(EC4M; zEdyjCIcc|K{zF6|yYDr>SkQ8MjyCPZ19N|kmIilt_*1ChCZT4X`+;ilVX)EmxZEPB!>xEy)^H* zerRY^86oyO_QdoWFs4W);r*ZAcZzSV%vGga1~5o9O{m*{$DpqpS_)(G8XJ156Z4x+ ztXMbm4;u|F6pCpREFAOGChwndsSc8wFPy4xv{-rp)<4a3~Q^ZzIzYOF8C5x|_kFn>3V6Z0aXzY}Uh&w?ptERFS zjC6_?`dCahEd7~qwFCq@zh-Iz1|3s2@X{Kc#Amf9+LU8_h@GhB`&2k~1nYe|ze#_I z?b6Q{>fKp+Bl$h=|;cO1x0micNZ|1&YeG-&`K;cUZ92F-! zliyRn$f6$_>;|^+6-C9rfzS=MN|`STa>#s@2V|s>Lw5TJr<&uY%rxV?k%&aV-yv3! z;CLAzj(QG)Mt)ZC@vaVk)PJ#t@q;=S#DyN(NEj2E3HTbaL9dck>zEa?J z3_)hx(Qx7`G;2R2o8ivXv7R5wE2LZIqz;a6q^AkaCy+?Q8i6cQc;vVu15C!p zj@)sH=ATI%EadR_60eXiyQN6a59FfV)w6FV(ONOq4AoiW>wXqaHLnL+gVUt_x*~1o zrr0vVCz@RE5(5I3ua#^KRvtf{BR_LLiZt+A(^h0Iajee~lb5+J;rijZ@49Er<2Z22 z<%?@a@Z*BrWP7yqpL_m=i`g&4hid7!GRD~N0bDMt8_m8vEPHRaHl9p5aWQ$;+#tR9 z`Ixuk4BN3l3R9%)j^XmdTMs}o*n(3q>#!XQt3Xy*yds1shh&bi5E&`Otb9q>IF?D= zFc;EfNzbO|cAQv&zn~ktG+I~3!v+IEB1b0|xTb{MP&C8KUau{Bh(T0cuyj?UAc*8#XLop*So513Em(UJCjRq~3aB z7UCr$Q~B)LgH=P zH)Pw>p`6Q7(eW*AuSh7Zpr3- zEe+T)baN$f7T zI1wxRS=JJ3jRik62cVGAP2Yn%)==>#tg&iOa`JWcjM3V|Lk@;c>_ubZk zGhd>4Z*sWVGKM>h2d(rM4euWwW$}79tAS%`VxwLbM1KL385bUhU(0ytCgOH;*yPh@ zWLbUn-oi^p#+gG)ALCyOM8*D>hgtNa3GhV=YfXXt9~t*Ls$_9;xZrRP?j}Jduer%t z2S`?=w~)Pol)WjXN~o_|_517YVRmfeu$y`hpylcwNTDR>j9M%l~Q3l z&et)baeSZDy)ryUUdBBzWIDVRbtC{KuNrtqpO?>*&MRPh^`Uo3ynjPOJXK(X0U+qS z&4h@kBL#Sg@6y*wrJ|h=3NSNYFCk^TE?REw){+nG>{l*R_PFMkVd2IKbZlOLu=evw zo~PaaA5mu+71bMdeH0KB6+uE;LQqn=89|U1q&uZcT5^yOmF@-!>24Tc1f*l=8it0U zV~AlGX6EJpKF?aumvf(WKAdm&x!2j(-oNdoDgs=!UVaNXL4VT3!&6%k{qU{z^hR2m zzTv&725BBQ=MLn)rk)w}60Q2#_P#BK#v^?PY4s}|vD>_AqwD}2_Yj-})2_Ir4IxLB~|N zHmmcxF2}|mF)(;r)t7^RO|4fQiyJoHEul0N8~{mO=Qd&+{mdyo0~%B>_E| z(oW78#y39wi9{}KxT-W>6fMII?LtZ#(!-MUbsWG6eWFk0*8H*0{-*MY+;Z)4;0%(# zYw7DUUB24Z;Dpm;Z;0f5i#sv+u%LFtiEf6%>)EW3Z0!1H7dD2xdN=&weV4dq*EIx-@(n_#KJZfVIRdQ8m#ygU zORH*|JWiUacqCPQU2gzlc8(euS3dIZst<6!JGLWn=XBV=&k+L(JIM1dErgY449y42 zLdv2O%9|`W%doMd+{Gwt*0ZJrh!5W=i$77I0a+E$FJq69@!9BwBiIEq4*E5DK^HV69m~p(L5H#2(p@tvufAnrKqaU=CwL054_r|>g9$PHxia>VoP}J zDwN3s?45KyLe}<;Xumrh_6#cu(w7mJ#1awaQk!~Fe8g}4Q)vlvvuv5OfD7wWM~vWs zdS)R%EL-v)>c74(c4c2)`&RYUKZOxR&+|(PTkqPR42`fRPWue}5hH+a`6j%KTcaN< zVV!q}>q2~x0=EZb1n>C+2YagnJlq+fM`F0}Q8;8DJwL~>vyxF}*Sp}mG|wAxKj-S@ zzy58FfVh$xNQbxhO+8e>aS<=m=ONx2T!aNd#RR&I*yRUjnFf5VbI4x@2m--^8_R*H^2d_sG7PJH>^3F~1;WV0YHKZp0|`>E4mN(pYbe<^NCshz$UVrmTXl@z-U5=pHXk8YI?lv@3kvT(%yM8h&8 z<1uv<$jmj!+^fz&fkzweI4m;oXRY3LgtYARXJ$z)2F4zMcbz3N`<*ei3nY1qIK_P# zG#kK^>OM~Hp)_zFi->|ZnMu zT~h#TZ8 zs@`8&&~}Ju*RRE|pw1U~bf_)R_{4ALI36F@kvVt3UC#dICe3gH?;QXT#j!%AU=Z}= zk(V>uS(?t?1n^11AubpV`>y02`|LK#qdwbk!+-0-d3M!iR^0Fcz8CntF!j%iPriAS zIDr|#4L-g@WgROta!@8#`CjH~0Y%p!N8t0x#{9aR>o;9WwTPb(;je;gG<{++^W3jp zcgTqgZ=|udO(wCU3Xu5OyfT^iypX}}K^bvWqC~Y}RZDqXuh)_!6l4-l;2I|)`l+H!H+PK; zPkHOXzO%Mjc#1M_vYU=6>*;5iJEQXCHFZ)#GlY#-Pq3Fz+7CA?s-^2aDIc|st$k>| z$Fp+9Tx2)lp&34(HMh70@8?$(RYrGnR_S+SdRHw#b_@Zr`kqZj<^>-eF0@8*P@J>*V{Y;OMmj#7->C&up)puw z`_p=S!L?CD2eR$jfb zx+1hQyYE0^I4t3fg*xf`2KH3I$tOXGUE0RmZk&2=C5=Nxi# z?6TB`_Mbq*9;ZdJFgp(w8fMf0o?e9F|2{#&sCLW$J=ifmC)JO_wMlEZSSpSQ8()mR zB)_QrTV+1JXyc7rKkoJ&BYcTxI(dQueb}MUe7Bx?L}6@aYCb%u6{JeHJK_67<*(Bn z=m^ImB8N?O22{3mzn^aj$`8>U5q`3^+-NBL;^`{@qySywrd_{Z^~niK` zjVuiP{q)^JN@|Hi&n*#ce7Gh9*XUrN9V_X60K+moy2LjYy#kX8h>YoMY2o`g6*m4t zbk~DwgaaP^m@f_8XBRLM!C+5rPrne(qUfmTv6$Nv%R`Mv=hWgi@u2s)r!)*5Sb7qK zb~paymA`C3vLFsfbBW8h>s6%7IY6&F2Q2N>eIYA2#N*{X4F&~*ez<5J#eVVwiP>~b z%ru)*p-E?h3$><}*%>I~pSZ`~jxE)3t5+6`wWhqRl*70Z@NWG!)Us>+HR$HF zQ4MM0NgmNZ`)ZE3W|gO|!>Cw@@7o~TLp59;mP|3pht$S(TcvtiyS&tQ#4F1Mm|K2IAPbZtxo z`Jptv5+#M>1xjm{-sd^Q9`Scm4vv zRy>cNiChS3!87gBP^9Q)sgW_6K?jJOhwK@XY~uR$6q|F>tjuD`nHeulQ_tA^Ufj6P z2`2gT%&}S%@nt?+r+(6@pe<#~vx)Y%ZMdd#-Xvb*Nu)@=AVSN`ZtgM!kl!BpSIX-A z9<7XTbnVo?tNTvTapt*X>05e7laS8kgeC@zk{)A zc+}82sKS6T_!bRe@FfD@_*h$dK?nIM?|!`wthP@(BN#=DfZL}XN7K+i_x9|OV4@ds zT%q8o8cymSHv`|dL>C=(eIg;1<&8DRkh=~T?Cii(Hw{9(^3`+t$GL$kGN%9F#z)hB z{i`*7XUD&q@ph+UAnrVrHYz2i`FBTHpV@9TOXzoB+{%?zQ+aZVuoe0F(%)H z|MD=ewkhu3~ueB zxhwmzJ8Re$L0ey5UDNORtsoa&fka}Oj$zGa#<1_uU;#=!C#*D^E6+2 zzV9+?IAMmD+Q0nVo$X>D`ug7gL?`eb3Ek-h|HE$>zFWgp-b%f?i%tAzPq@o&-fv^9Hejn3YeFbQhh2M{<`HJz#qMH|MOiQ zBzSc|D~*XlQac%hgK0bPA8&Qa35Acn#6{7hm3nhC*TTkY_Qj=))R(r@uKj4xXN*a$ z%&Te(!GF!8_v~83^A)oExDr~5dsCWaRku}$?MY4_(ny>>j3>G?Y0Ov@9nQWBE|PQW zV)`R~EMym<{DYAFVcr}3xhv8&UxQXP-BUIq&e-sWZ|+o}EKxDc{K*pbz2V7)E!fB2 z(O5O&wQMwyH{1Vgv#B%fEOsyDz{h=!Yz`9CNz>5nb2t-K=rpwJ_I}UQj`UCV95Hn& z9PcT6gIHiGjBw+@0uq?Ur2o^}I;v&Ke`eLP+mpFBmP3a}sEge0a3SREjL!?T9sTwPUyKMz`Wzws>?58` zB)1Uxp5t$`GJYZrI=|l0<%R|pXR2pCnf1=O&6FMoryQ}xYks8<$+qT5lCZtaK8;uH zw6x6hE(}Gsyc|qpSFqdWly!>aKHJhLyAE(M}@X(PuGU+-ByWZ1}PN$e{zd^jza8 z_2}<$zn$-+gJ&=!%6PmNFk}tEjUJ#{ohv`#42uHk@f1K{Ahx=RT z%yTgH+EL8Hfgqx>twCtg5&HPm(pnH-vz!e|Sx{&u?(Ja9;KpP*{xaSeb)+zbd4l38 zaFk;$DSCoylkHc2MU#98iE8HDoqgqSaB}N%vbNYL@`{Vd4=!xC6QPYqD|Hj_Zvx%i zcT3ZK=tTPHH$r7lT~rDqJ?A}|vm8k^R$GNB8jX0;_#jupno*kb)4SP&BoYe9|AM z3!^~gM=!Cj@bC>-QGXSlS18BdW2R71^c<&(5DRLquw%L(z#JF&7N zpy2cl)WOB2HtcKX#XjO<7I8CM^LgxQ7e8zZkxp-PG34=rtY>;0G7PzO&g8juR!I0f zkDAL*i>&G?^+wm5ruuS4?dT5$lPumWt0#dExG!~kb74C?3*^dpgops(xe%ZqRsh0V zLYn8akmB7|4O={5qLt5N2L!p!%;%91=8=Tl8?YFc5Gn7lDw5H4ZSvhSPT|8CX#K~+#Q<;e4-*}sP)k+F0(|oK(`tbWT)-94Gob;2xkCSLJ zm&;f0PQ_RH)xz)bdP-^4g|e1XAjYjf_DuHmg~U(o^Gga9A%z!x>U-Rr2;I?Y`3Yd5z};pYd+N zM0vw`NU>I_Qr|G=mS0V#^wT)4goL0d)g_#Z%jMGa;PQO`9H;7Qy^0?;zWC582lw>& zhiA_iS;pOdzhaTMoK@QYgr7Tb$X*9^iIoxlOmgV}imW})Ed01^)zF>zh~#_jQQDfY zR=$Zg@e@I1cNFabE-3P@dSrF%+p_4o6$1I)9V5X7gh%wc3;o8 z{8ofCq7M9{!XJm|CrP{d(cQ)Mfx&dW(sT~DM~#PwUkrG2>f7dB2R2VBEPLj?TK~{i zEH|CdzROex-Y0m}&nuFqaht7=pEK4;UguNa@Sb0Wji*Xyi4;>&994n!C=tJz=-m^ zhcgG*`#f_tj4oH^cJansD(6IURmxRk)4j<6cTjR6!CQZODhfz-`SvksOUH`5nOaCA zX)){mD78Sl2}3obZGqhtLt9#w!$43l=kq^G?=sW^O@niemoJ0r>%}t}k5hrdf^qPY zrK9`#A%WwnS214+)Cfyn&w->NUt7-4_&R?*XsjB(o-+_4P@tiob`^sxftdZ}n}*+x zSZ9R>} zC$--ILAOrC`ac#^Z^VrAjpt)P z&E`qSugVNZ{?)^@?uOpFrofgKzzR@=No+inYQi@20F|uu(oRoT+IL{$)C^}Xf(5fF z{H=NV{6%Ek(X^#=sX}RJ&E7Kyo(6K?!^Th{EyJZ|9^J_zQG2M23)zdgW`*lH#u~-R zxHrVHIx~$Sf(!Kk;=AUvP>5SIc$|!x`HSVzy89i!!)s;Ig?5t23!KFhA)n*P?y}Ig zBT%C{Xs=}6($!3^smy|>C>m}UUCkSox`6ge6ct3Tu~n>F4o7g4!lo1vFsxac~BR7UvkYJf1HyW z2GK`lqKUuaQ+hzp)Rv1{&2=cJEyCo62?fNO* z_j{@HUMucdjS45on}A(iRptzML62gvq**8z#g4&NqMgEN=+G%Z_AU^c%Zrx!+Rpdm3G~jeDcjpS zhw%NE_rxdQQY>&8eh|@x33R&uA_NWFIZ9PcdU8Kjr4#%w{7lH~z0jW}jpvg>Gip%! zOG81=LM^cFc%jexwa3xlhyOwUkl=WXnHu`u30%{PB!I(5qQI0FLD_}PO_nn?-P zV#!99{X~Q1JTLi zcyYVu>Y-*EQf1=o0XSk>dQE4}dyIYsZ%O|B+sGFs=n6iE10}nJQe>Xvb!h26dgE91 z>jSq^16H$7zI9O*p7CTEJot6muj0*mHM#3X8l9(?v~{oJV_D?Tm`;91I1;b1$D;e&NwzUS zms^F@r2cTr1AC5g89iV3VFkZ2dO`F(dMaRJyHnjfX^x4Benyl2?II;-mP6a7!ldV+ zE|+c9oO+W-CTYq35k_){oNiV6XUy@&@5_sfI)Fr(FK~nfe@jb8sX0YO`u$?l)0~f7 zPc1}c#Ccu(7o}gQn(Q3R^PN-riF|EAWlX+b+r?t@o_;^8!L&Q{Es}J6{7d^i<4@0O z5&A1COux{S<(l;6Xfe3(B1g!gSm~dPKsBUd)v`X(%1jprEa{yDC-Upw+tRXNU{95M z^vd(DSLm)5PV!#QS@YDO_s;o1jAdbUuJQ)3;leNXu?noqDN}>b6R5(<%g!~bV;SMB znj#kZmhT<-9fq@oDwpBY^}z5-ceiY#wPIetPGm7H;MQl|RcvGxtMrLhV|V=mw!n4N z*4w$zJ5>ab=dc!h>Ml8|^@gYz$ z%%)l@Siyw%4(Y4`-~E!#S%69uM+vh1QINv*u!}Yr&D$VRl z&?l>jt5q{@HE%<_xfo)LWjxscxmAUAjl5Ztt`b1?SPB8$lSi*^%?a4B2dd_~`UdlSBiQg(hVMz05JwA4LbqO=VbzVP+CZwD(Zee@#+3Gpo z==gnW$8?LV`^@qhimNiv3L2G}GCf7V6)?YaJut5lIo=_z4lx1puUAfAWI_AX`_p;{ zF&>zsF!9WTt?{?Zo=IsP)rWRIqHTKhq6TyY`7y2srcASj@eA`brZR~!X7ocmmIP-K z_Ae72bYqvBdV{;J4viS^C?BWDdCQEPT|*uTLKfZ-^*FDRa!lb3!}CIK@qY+m<|HS5 zSQm$U3RMx!uZnFs8197V$?vdbE_(x~D+<~Hz75KXl5}$^u-zQHsdRzAjKDc`Gb`~Z zC5u;?+FHZE>kTcv@fX>3zw{p658?!G@0qpe5EL=vQIZ_cYulth2>J2zs8+!w_1D9E z1(LJl{J)kUq`jsDGh&WXz99Chp&ejZWvT z=C0-m&32wN-1r9vbVwhP_VRiRZ{#-)Hai!?gKZ3Te#yrr+Bd!*P&a;PuNw9^ar=6P zsw&xm{HJmhn~)u?Y>H&F^vIVVo9R=2^wXK|ZPc~P*UZf3%GPotus=kl>-;B6>T?1{ z5>}5~N-+OiCN8V_zuq)BRB^++^pDBbo=_{ia57?3lvpl1SIFxY3(e_bCtFeKON@aPhh^;1R`%%!B5{w3^ zx}<|}CVM7hrp|P@ipw4uaz@qk-RH~3Uxx2zP;%JkZ0>E8f3a(4q%$Ja=FTQCXCn6$ zWA)>A6`v+!-Rw5)f=;yPs+!_u9(Miwm$}k9K4R2VmKAGzF7&>F2#=9SH|E~wkjfTf ze?N_#w}Nz%j1sB_1>+0Wv|=Qh5ic`Bd$G9a1|bQ_KzZX9%A9(TzJ&J^Y`YhSaJJ*Z z(aGpaN7e~$u}C=Jsd#UpC{5s{zzCc3a_rNbQ2NZY-W-?}e6dmYt#oD_X?5|?Hxn;M z5HnP7vj&|Wr>q|M?{nrT%H8W@XqPR4y|4lw;LtuWxh^N|A0RGj;C5YISYBFtm)^y@ z!7bG1C>OlSSX5auzBJv0F?|Jd==vej!@2k-GQm1(mWjm2UBZ)c8gmYmuMMCpK4cY} zmo1O?N^#><15Q*f9(uD@EWDl*5q37c=~J<{yt%EiGOePdj{i2+eM59_8PzK+eB5wf z2C35+l6-%n7rFB|JUn~+Hy-#CJ*7TGCt_IdrlxsKQxm7sW=;ve zvH&YBeFd2kt0#>J#|=dUq{g#H+PU< zuTWPVLDFle9MXRP?G|XQYireL`q7|+5;XwE+8kCLfR@2ICyj=6 zhgYGMdHtE`4;BOtB`pUowA=y-!wan2KSnv0xMBi4P7k9dR8%2>cKOav@ylk%`Oo_i zFF;69^XB7apQ=`~v-;mY;+73zUBz2zd z?thDGL>~PyPen(mworqPup1&*ClFC{8MlGZkxAWWOEK}T;-Jn6U6GdshK$&21>PNW zr#;fSWUy%Ya769QXNjU9(9cB7c?wV%*~MrE{V`n?6Y|6P0G5F+*pUc!OAI{BXdg3e zlz-P(9xL09BM)eLlaJFaSbQlsE#=#PhvO-6TVr#gKRUH zx5G7=OIu>0BwblIcjiNx4?}M^YlbF;KC~<*Q+j%*T7;Codqwc9jX*{H^_`E4Ey5!7 zUZ?P(UUsqHN3FM16oc)WpIlOHEGnGUYd0=%e0jkujgSU0ij!xnH~T%fopz!iY+5fh zZ)Um;A`%L!3GPH)zCQ!OuMU;Jhiye1Qw4dnqpVsY^PINT=8wB*>AbvNTlNa2 zfg7uzgADHTo>!kn!;CwoAuk61DBf+>GnspG!w=3?Ln;|-*u3iE{Hx0fKV(V7#e4;y(^ z@;HB9X<6XyzeCb}V=n!`s1Ly?{xFT>N=ZYgac5DD90I9D#=<@A$DU!9`lg`XhlL&f zjI%U^Sta-Wve&%`4tz$@?a~L8gque~E_VdOUYP51 zKEt}%Y#o+DwqCjonU!J#XyRmr9sh~Oy|8PE_r=)GY2%d0mC37LWHwjTC`V+4>zFj2 zx%*gfy;*K|7=Oa@`X2TR`GXfPB}lOkw(Ib%J@0o82t>_EahxW)D!0Dm&OIRZd-Wi7 zm@7h-GVqX}9=8oV`|W!rp})uydaH#Pu3-{ zo-3aVW3$K20}IkEy-4iNQ3ND_2{nCx5$@u!;a`%TxVy4)ED7zt9Z4C7?HDfbU^iBF z;C)DExX5GSq@AS;hllrutsQG6_dU{A?e~pGPCg=w?8AJ0lmHbehjUIXtfJ|f?DHFK zEBfxU&41pXRLAHjpHJx(mf1RMDeDJQLifRKd3_Xi(^HLYr3WO6OG1~5PrN;219C(VVrO)OXVivGm@K;a-H-s5*fm z8ET)?##XlK(~&NDlgLea=#CD_B=g%P?@o`K|)iV8*w70f~5B?ca*W+z8kt?3*eITOkFZH_o@*VSF`JQ zwA4q;5C93mC+7dG6$*8Xy>EuxYGN%K72-0Buk=$JXJZ-4zVCGIYwN8XEGjm47`b^$ ze-7=kH_LU4D&uF^ z+%e;-g|>>#W7tu2EsFc*jmHr|!`PN8eE%?arvqjB`lvE1RIIU2mvoZf%u@)JO&t1N zCJ0*iFXk}7{EBqAYgA)9#kl{`rXi0=ptyj+)v%=HOzWCT2S@37)F1zYPu?0x?&NZ# ze8Z%7SqS#~5+L`7x=SxqbldW~7nZ*fvPn`*x)^DuK3TcaktI09V`S8u)#-8~U;4Cg z?_$ovk<+kP^NDlP*iIDA9NT>qsB*&F8y49js!WPQTut^R*%2Kv1l=M@F^4cS$u2rO zSTTPWv;lc4=pFzw=b%GDdyX4mo^5=qxOu(c{?3+n?PD+|y3s-(+}Cuzaq28h;=tyC zCCj>nouF2P$>#9*1IwCv9;eCH7^)N-gvjvZM(ES~}oVp^rhGKS7Qq5DA zCp7+O+U)V%r#vKRMf{LRMwK%_PbfUfIshv^+t=J~h01Nkj6XiwAU=+?)pAZov@Ch@e&p zjyBSU+-SHC(X!N#5$s-`^r}KWAd2>U}WszXrr>?$5(&v z^Cv+*b4x^k(K|jyPo6q52iKf%Tn0I^z2#K2_jd?&Ja;Dqw<{sO{wo+;SUQAc)QC$hR@jbucC4 z=;|bhQBb?_%(F~a3iP<7|Lrx%%JSC;kM21~%AkM!xw%Gx$^LU6r$U_p(tQW;wQ)Fc z!xt@-@t=04_sN9HOllfE}T%)fH-z77npZI2yMFXBf7d+K4*ll$J0fO$l}N_30{FWIQq@+&Av%Ca3EVOeN!YT`zVb>;pmNt_Vw_6L(E=e5n*jql7y2 z@$(*pC&Y}YTMfDg-@=!9S|EtKk0NX~huL>Rk^giij#~8OgZtS=E?r|A+q_Ng*<=|+ zZJ%7sY^B3nR<)uN5>!1Cs;;2;O^;k7sg*qE=f7mww0^rbY`#mksoi0U09LMpvJ%bk zM?LJ`ewJTv_aepx-a@UMns2mJ1=Azqk9hBKGM_iSR2%M}B@GsF0avjp7Xd;o)bs8g z{@uI6tGc&DYo@rZPSA@dkw(}QJKU!-GMf5;@2}F&yCz=7=l2WgZ{TgJB)}l77`>TZ z_8C%-7ya==*3dcM^4n%)`vLW;%Dj~C^&$yG+Fvs8#!jzUBF8JDQ$LP(r2`fVHOG#b zx1S)+qP9aTpEy2YUP8WJzIwfvpUg4Ud^rwn{Jc_~I+C{QSWXtBx&QJ0uMfOkX+F2-PovPb9FI0u5jP?Veq`fyZOEyS|QsALEvdzZN5@*-se-`uHe9tKV z;APkc&w;E}2eO1_Oj3vlZFs3oP)KBI*o-^&gRcGkLn<#u+r%Dd@^eCGAK5T!i=ub= zgLh1G!%*TkSn;_NwU`>Fo|A87L#xOT@UeS_`7Ww?KF03Q5AnCnB~u2q=(9PC12Dm- z3ImXVm#wWY*v)0cOZ+Uw1wJ3xRUg$1K;hZ70ZfO~%7wDFqD;vW!0pn`KaA1}O?Tw06AD7Q1@EwxrN9Yb;=1lA~@u)&fnZn<(|TTF#$A z&3g|b4nD@H{28_HI)(k3N{AFLa2pCtu}P#tUmRFWpo;+bjcPnu$2x-m9jx2=zMZG` zG(Sr1RSL}i>mksabp;%pMwUQ2#W`HYto^4-XjA`b7?iaH>^O!J#pS>o+dx&Rw$GGFxRhKpzFl0KA-^L%TZE zmPlArPv8Sl4NnH-M)qZav>s>u{5 zEDXjeXRuX>xa;8H^z2Xs8vpCxTvalX?|r^Q=BIPv&K2%kTGTMW5COUkfDn z3i2WTZiJ+{NR^SE{dbePwECU*@xm|oIT?Mx1$gz^T5lC)O6Vvzos#DU&%Cc*x0$AYcT!s_b2}x zO8o%5y=!RW9jX?4`vl>%Pd?$(^Wn7t*d8f~E4TI_HpjE=Y)@@A>m~55SWN_56C$<3 zx;!?>k?zvRM|@!c*AoBqxF|kRCgvE3-cOj>$nf^>{HzH)&nJpQ>N;FfW);>N{f+UaLI(jZrr|T(Fe}=`#iFVTNZPiRXC-3WTi6wLV}(vK0|! zJ-9D!`Ze=BcTk_o?`Z)S_u1jn`}EC(kzN#!uF_lWS3Rvb$a`PRp1CVoe1e>eAywn4&6~MoIG1!WH%viD|Pmo0Vdn8Sq-mrMN220d2Lzg;A1`kx|R`BgHb%vu+H&d9p@O+r&c_aY*m(h|k5= zDOH5_^WTK>J2+1k>bzAP!a56jTY_=N{Ti{px8TjIS7ultA%iU2Blx1u{8UapEd0l9 zwZEm%WekN-yqPgtv@=G#(&cfYjh7eZ;0wd1fv8fh4M%6Yv&ueS(1_B_^cEHu1G#eZ zL`Y^{X(=3=Jt_Eya=FfQ2e^BBly}HjTZJKc15K3#h9mLub6ftceA;^8RbBhfDfjuX zQj&7WK3Qt3x6}g_27!q31U0K@mr%qmM1Op5Ic)8NZX0HTtBdCPV~V{S1) zN2t|cOShogz0KZvp47BnR3~yXE$;|9}^aZFyW58KwH zT`2mjiUX@TM{cUYe*dmEvwhOElD`Gxt-bNHMPi-Zuq$s|Wj5P)VN*Sw^Y7e$$z4EC zfFL`Mv*cH6{^AWm4%6}W;msTSF9hrx69WeppQp=K=>k)V(FcB#vBma z_HhmL(7SE48jPrbAIrE1Av6x+V7xwgtx<#PQrYTbD+-L7qNjv@37mhIkzUdD@UY#nah}&TI$E{rB zd0g9E()*`wfqT2;@7VS>RavY0(tw#TzOD|xJ(N8&q;F^JqfPhyNQ0|$G{pF>#k3>H zF(5$hmq)=cWz3&?%=nZN_?IK`6t>%wj&RMk$Py587XQ?H=`iAd}KN~TjPoyA0zCc($5<+Wh9sfdA_u>0-RRh#T9@e$XsrPUb*6j8x=W5Cy zhEnup0$Qm*S(TPK-IX9^XF|`#O*0{C^x!pBOiWmh-i^=Q*Sx&r;1#J7G#co?cUya) z>K#wNv$IGcx8u`hZ1%cZ`Ns%Hh2hQ%^!!*vh5ksMKR2P;qMgHflNd4d?A$-N4%m0p z6I^04`pjVqURfiVTPJFnK{|P)ckhd}=i_RT$=pe-LgJR9ChZ*!B!{9Yv~;4P5L0A} zFSWV7b<6Cam&VrkR>Ax0+UoP94)usP=luW1;V6YkJsXkdPIJyPQx!(p!Fy`xD(>0Q z>s1Uv+m5#G^z=||u`E2|0rrYu0Usq_(;k0)@;khe!j@=^>vLk|Pj2*sm*L@6oXSf$ zz$})*AG(Q6_jr-FLpt7`neP7eWI;e6Qgk@bJ@wGe3kjbFwQ01Wu8?|?7!L>Z^`GXv z8L9fi7D#4H7fi6*_x$IpB9Y_S+cQ+u%Yc8!`;fb7mU_Vq7`ym0uARR{cI`wE|6Pip z&ArQh?Y*1>6c}>ib#cS!yeJ$3yWChZJwa_90S1I&T8BT_Z(cIaIP?E5N_ z(<(>Z{0+CLh}r{=ulO=fGitF(bC0VB6!E%{6x{Vf<`fb&wc!mN;;)MnY!Er}aC}FB z$TulNI(}y9w9Gsh;AU<)_}eh11F0x!c8r{r;mzCfX!H4H<8l1ElG>!GA&NBnLqprq zlUPuL`7*FWMy7^->m={B2iM zj2lMf=MxTMtiDyWez!$5@@S{05N!mw3h`mqxP7XBT3R;Jpse#of3*0@6Xu;FNa91s z8SE45|6(R}z1-Hf`LT6>*Y66OMkPaU?wb-vcHmw5$UwZCpPL{*-(pEC;9uf zKl^SV6)yIP#hASP*hW(`(VUTDL~i~t(-HH*CzSe^UFFS*=9TEsjqEteab94YY4Jh7f0uAM+H>-CkjMgyP>x~&Vd9K81&?{E#)yxNV+X`|!BXXXr0`Xg={&&HP0 zlCPer19mNRF>bKrX-Z z%@o?FGca8){gs!(mzH}^q-Rak6F}?Z4aFdt*|S~}&R8c+VGkMs7?A=V_XIkD%{!{A zTg~$K_5`AU$OWoCKM02!&O!1rg@nyEm_#`J|LUt9_$~(Gs;sNKTb}G5C#-+*Pn)CF z-#zf=bEA!aI`}=;ewmS(Jo`1=Ui^oT%}>wu&v^dJ+v^*vy70zF>)0m!#5!x+@U+2E zmo3-fj+@;~fr(=es}Z1-pMKa2<{t3cKCxY`!0Ur9Dwl)z7jNU)p);q)wy)+PH9Z?p zP%s~a%Wpm3^v8v^r7m#Ii7T~w7U^1e5$+O|XicU*G`MhK`jpo%i)v%43oC|^i(|)Q zDy*M$0Pl;9{~&!9UOv+#Ex%%8D%z*<{MR_Q_E{>anpjNHKbx=8=2xzF>jJGH;jbByTt9gexHR|H?4G z?Z)##=keY9S4S@9_7VgFVfTa6C=O6Pe9$ zGptsf7=sVx!?!!o2m)TGWGqp>u~@z82jxTDZA~m4*li9vFG53d-EjomWgC{t3zABh z2+MsGrKd73sLj^r`QpJzqIEt0=sP1i^^|<|J3~&av-}}V9(sM<#vttGKMe=@`8UF1 z^V*}k-iEktdwDy#_QT=!7MZ5?y7Y4N?iA;e=~^W?s3LfBaele;@wpV}-QC>ldQF>c zBg^3ZMt@rcupfGR+uXc=`Fv4%o_)PVem~{{*rn?I7k-Ud0q}6u6~UY$3#&>$)gh6R zBo&9}chR7vQf>Iu-`8v5<7$yHyOOF`ZanobA202EtM0YAdM$Q#*{hOm`0lD@O;3Cw z5P|8V|gc{jgI z-(mUO#~%E?|FAu@deM#i{OZ6qR?Fx3a+qHi_KodhV0m54t`IL*Ngq?Z>4z-WTN<(V|w~rVZLlnfOXNC9AYW0}{<0?Y;(#qfxo;%$Y6M06xcL zqR@0RV)Yq+H(uExt?!%xQ4%8t=G@$dhypCFF7_}2xxx&&iul-x4A1|$D5TacwPTC z1rtcgiQW9mi}*}`0f6UU$NPt1SJeLMou;+8alMz_$?R{FHb|nt7!9rTS4`aMg)yU$ zUr`xQxU^{kgum7np!Fz3TT7L;D&)UnSuRGTIVGa%UCaj1B?s|Tv0#M2vX#%1SoypF)#zP$3=OV*MM@|Iw#IgKGblN}B@U zQUhQ1E)q9#-zu=wr(ZrOxJxgARA3TmRyTN+tq+*Mre zm0|$Z6i?EEI|;zTMUBLpW~Ddc%>Dtw~sc!An0 zpmk_YtdU)cQW$zabg%jxlN4;-}b zwW*l6eSi2ShdE{)|WFTwGl9)~l~sEat>ET_KNa_$6~NWoJ5=a+&7R zpX-jvrWtctY#_^6tlcxmIYr=f0w|_`PeOOGvHkJ>AXzSlw{QNsuX(Ks03a^DcYXb` zeM1{6DCr`E_ERk-ZcQ3qsif%Y6#&i-A=&RUd*wlTXwx~f;WohGrp_)NeVz>VONUE` zBgsF!h*tZXmZ>{g#uB1~6)%6%9L1`QP?xiTF{WPCva*2s>S={2070W!O$7j+N7ZJe zi(!Ml9~nch7S8GBQN1g4GhU(ZN5oL)(jc~FsXUKcJcn_Ji>0&5PuzQ-j=yc&+hRcez%LeMrRW*96o+^e1BYCEjmQStgENbi}>}j zlwMsn>Q?%f!uDif-!5c~{D3HHA6EVb`Ez?!H*LPsmPAArq^FOb-jl22D@h@DEBnj@VuE)HY$ z60KBbzq%TOl?jrG^F8@ zvid#$j_1kfg0eAHo);Pq0i1kHrvL28_}`ptCvCSioSZu3&m64k$N1|v zeEj$S;ojo7_#!<`m^j;e`Tl%1w?hvWt6o@eyyjV~+V1c%PZh3BJ#@b2H@MpU}D*5h6XRe;vL-=(UVK zbAwfJ7-_}KL)CEhef%E@$YArv>hVso`Q}J;oP=xfyLGc_O=M*9V+YQ$K zzJMondu}PEXUc4gC7}P!+G3b3Q(Dz9Q$mQz0y_4;{MKlR zd0V~~an%|Cx)e(R&(jw%UiZ^9ZGLiVq=sZYheSi=lebhSR}}M+C(v;dkaw-kw#|e6 zA$c1av-ORXBqB+AR_NMX)zj{yNvAL!)8D<+{AGTd=Tby+ex-XwTkj z+v6s?Iacv>hz#7cP1hM(2BL#n zlAX(#znYIs2+&))10*nx<{AHuq93;cUbi%?K)ZHfSppppb;@thWoMgRNlnvKSEVXU$oxazE9YBRHtIT&PCPz0HXiQ{ zZ^(T4ur|{&D}O)emq@2*-a_=NTv5tQQ6wdX#d^`Q&|3g=5v&i zCtNpsc73D60RR!0$9BG9VE6IkAPKkP!f&JqJAf&a@BDtbdfP1YsS1}50YJzrRQnHY z{^^kC&+V5VrINiN;K=^;hPCuX!|$0&f7W7Go1fs~`;bL(Qc;m_B)@+B(=>hW)9m(` zjuD<62G7s_;V-ueE0@;&h-ipP#OZJfXdntcskMp*K7`=r_Bs|G=ajTSY%lOgL64q{ z=K1UiKm#@d^s}O^%^+Hb#g-OZ7>G2U5cFgJyLML=jdYBda_jkzJi2k_VA%&I_}Oxw z^!ll%|M|^deE(3EWEf8KSATYI(T(Bg=s4PVvT2vPKGtdOS^GOBRlJ#s@eU=|KlXlH zxXzbLD6(DVPumP&F&jvXf9yERf0q1;zwMHmQpF|f@(bbnd0H<1x{NpdoI^jKFRm}= zZd(8VcKSQ*>*IQ@==|4(N<~`WGq8u!Rc%DXx5nClrZ$37+qyDXbBBNW(>c)FOSzhB zyA@-)AOHSt*lvHJ=9V^TB)cb-pI!O(o{Z1spXMfFO**#4#0>sWf*JH!8Q=+O zgSb;@TU-G72Tx~bQvd)!_%r|j0000>9{>Q(0002B0<7B}{|)~e{~P}m{}cZo{~7-y z{}=xp{~P}!{~!Mv|0Dk9lqkX6ToPXW)thx_p7NMp7N%}T=;w-ImvG+348Sr7o@5{q zG3Af`SIkw7B5q=2v$k@dF+X(S#j`i^FN%x1z4tQuPfy;-^u6b|A$HF;?|l8_%kiiRN}v5( zN+bXsP69-Rtw=VqVt7dt+fQ%K(|#}4BU`Vw@e-Ri?LA38jqxP&Yr8*F;isx9bStaS zwc93@Q`3BIQ)!=Rgv~=J`~aTz6gYvrxWX$HYVdUBNtn-`7>vNh2>sOs>+%^t z=ca&lq6VaSmB{1?QJR+JAI!L0AIR=kd)eLbXmqkZSZ!X(Y8EaRz2S;GxqWcW@ax?T z_p)B_(B10yUmf~%=K~vi28$N-lTTmP!ysKH;)lD77UC}-n~&}KxlKPiDQrpTi$l#X zc#?acb26{%Y!6v~FQP(|6q52bp5gZ8o!@- z>Q24w&6^K>^5^Y8@7U$tnb)m)^bxma2pH@aZ|8o)v$bKrK+xq{-S7iin@HPJS0AGc6iiTOo5| zI}5oQwI|)+*vtFxRlHsgv`Nu55_y?^9tnlE>0L`m ztk+S`b#BVFYpI4=?i3`XG+aZ13c-iN>+vWAJ`O$yO(KE3wnd)`i#fc8)0>NGGgEe( zLw~JkU+r0@DlC#IAtYX*{>R>%*W^Coh4n`lPuI3<-Fl{O(EmaD5U80uYY?;Q3V5<+UYubA9vO!>2{c_6E!W@HFOr*c==?pycHd$YO#m zN&0C@+Q?feffWB7t2Ahu%~`&xW)_mm&rc*({5+;j+vn3XZAtD#)KpHU2129XjipJW zZHr7}jP!Dm{MHlyX>0rS%2phQL$yPaCHl%efF54{K?5qsP<(9>)}{feu@? z{=S;6g<;N9deb>#v!&_Bg<)5N(rR=Z<~XJ)lx$US+_S3x4~&024c+4UzL`Qn!#(u&nAL`xNBi#v`*Sac$LrY7jkgDvdCR-oykkG)_a2ws zE?;ktbO)r7w%zw$p8^P5UXkmCs(GHD7q7?p{N>r1BfeZbRp=mp6A*z)&Ff_mzu$(- zUzX>&c(cf5_1S*+LIQwYKRK_@Pw`9vt%DXO6rN8LX`6Di^?qbf@@CbWW7FqvG zOo%j1KsKE z*l6$a(8SZhm{{H{}cs=}ktpC4R{9J#1UjP6Kcv*SY@ozQ(Jke-Z39nM5 zQTA_p*9fmvK=|mJf>g3IEcCX~HB&A1J9@sTm!I4V(RKZaAM&TkhdQ)P8cm>S-0@SM zueo4Kc)c~9&LK0R*ne(a>eNyEQo)Kj@W{OnP&^>h1EGOOU;=&zb*|E6zQO9(^_!z_ z1-NreFAL?v1umc0?Bmq@U9PK?8)-4 ze|G56hdy@qegES7v;N!Ra#e=U_F2BV_|>~tx^=OfJ&ws$+N<5g&#enNUu>1x)4g+D zpSZ-Uzq56p{jZn^)f1v(c5&Ar2D{_8uHBHuxHNj0E7o8Eq#hrQ2(P}_+%6g~AHJPk zef)tfS^xlU{mG)gWdq_304S49BGQbB#BbB4TE2KzfButfJv9&*Xws{E0Up&>0|;n*U|gzf3s91gxQE@Tt`y~ z2}GtKBA1W;d#9m_`#hX;G4hW7`*o7;ru4X{{DkF);UYOJ%e_Cad3Ej3%4qZW?sI!K z4?p|23&V54Li3b%NeAz!c$k0b=v07`}^7cWqMj3 zPgY*)t1SSfNxe2~JNjvt-&h$xG&bHd`u@c(Ed@YyR^8X1dz$VWfCnHdw{wTPw?`_| zrq#c((EdF`BW(d-ir|~m%Wn=V>oR$tnm(zYJlyZMG%aLymHvtQhr|s94=NF_GJw7G z>)3%;uQl1t_0B-uCIL)LXW8qo4PJnhdror;N+TN(i~$}8HLQUSSJ2N7ur4yiX>M9& zAxw6O?6+UPOjdx^GF2fV8HfnuI)3i&J3iXe)wNmoY!2S~SdvR_4lgfmEDqlveR6NF zKXb1a&Nyp0F^cel?jcdLC`sEYs#0I}cPJ{z6fy7+iH9=+}_UOxZ( zW!-F0*fQHU68;3B-4GEszj?0>rT-UVMdafK(75<@TLE}NufF*=YWGwM?ZnLSA1pjS z!^@_N$MZ8jSY^{{@AYb<6;cBq1$7pZg=R}lOZH-M-)-qc#=DB)+Uzo(HUL^4aH0WP z5635W8XhP0tb)j|&;|VVn^6Qg&qbrIlt@?T{(#@H1Y+6C5g>#`vM`8oJ@ygGeKyd4 zm+Qzp4=su=9M8z_Kjr+(*>3-6>~DMiZTRqO>5T`EBR#bGT9)IzKdqXa?>@=$ab5JW zv^{XysvYCH>@h`5XYA?SsMH0nhhLbp`iDLF3-wXi$CiS=h<8^fTH$X)JX_%uHHf~}BKnRp{*5cj!jj3hbc*>s9+KXpo#MqOA8}04vHrZ$Rug^C3dG*Wj zhca#tZSRK5(cs+Un>ebPR6`?>s^H`yyXC#JlQbIOd3iTxJ@2Kl$`pqqdj zeeiF0J^aq!&hoSTzh&+o-zj}G2$V>y{Sc#JeBL-4m%!9e(Kb<$8(d6scYYd|RSf+CfxOTbGsZBt)Ik?^lgNGo52CN06v7sVXc z1l$CG0bVz4IDu}jqYL=;JB4CkZ5lz1ZUM3M^Aoj;i%bb;fHhSKPcmQ-pl1P%o#XWK z!|(2T)taZ*yeh}j$s!$H^tOA)RpTSOLs=fZ`B^S~`S#wAU5<{gcXt=Q>d)=}e3|+6 zu_e!LePr+Rb-P-*&1Keq>erNy_u>qh%!L^oo$qKPqL5-|zB|3$zfPZ5zu4=3KKFS$ zuUY{B8$Zv_atXIxncdFQ%T?X%yAyHFDF8wwJ9WlRC*+0ChdJuWTW`hZYpKwn!GSz& z6u@oU9A=V5{jLnWd6pmjbXwiLt~B$tvo^FOr3eRnkIBN>Y4hiLy`R@qVW*Vd^l{m@4{Jye zZF`oks(UmyW1+Q{R3#j=-DfoIOjRU};Z5ZnU!Y6P@3xH;{q5|s;Vs> zUPmpWMP2}c*KfZY1q9}*Mb=HP0ML6~zZok|63bMHd6Gqfq^H=&v683n@Zjn`zV1`z z+cDGodgF}ol|zqDxqo={kurL9{ThQ8CJgs%S1*r?d#`%KZaXqOddmH8Z`^hV;`8^- z#clg^o|rxowtMCGvdg@U1TpzI4m^m3Jr^N3efobw;^p&CWv)U11jygL%xvD?9$#;` z^*H}k+#9|he)@**$pZjC$qSjJ5SxvVMjY;EkK@|Cv=jdRQ6Foop?4{KBm#iRbmAV` z_DHEVo3_3zT_ooHjg`3HFDjegtI#Dj+L323h7rD2pK;@G2I6#38YvXAh1U^SaZY5-4XXHx(GKr}S~00000OCJCL&j0`b zv$pwM9{(o)8~+#oCjS=y9{(Nx4F4McApaTvAO9Wy8UGtzXRWl;#P&LBfBkMoImx-M zT4ZDCNG1l=NA%nUePemd82^8tlI10D-blY(f9~0#G2=gPbH&ZqKr$;GbwJbOR(POrI}FkSXMv+Wmpq(anpLhSv0rulOCNo4!X_pK{v0RVn37n?jA{Kvm`_p!sDzic@3Z(Z2S z1poo=pBXD)pFKcfb^e!d80+zS88feL=9T{^ z?}|nuLu2c!RcwEqp6ko2X>QUFO3{?4j?((lB_mmB%KrSV97DHYuE?>Z)i#afsUhFC zv=Q}n^w2ebDb7F&6bl0Z{wDRH0NYDsACKRRDg=VJr`HX*b`5%6Xtl7wI3)b0%JU=} zxd92+N8FhFukKdJ>~yTv?Q`+ECuoN_y9SFS5`9?C+&&%s`Q_cy7wvud>6_D!U)Zj5 zm+jn>c%hwHoQA!)e{=t&TMq{#=6AQwxwy;q!_#?fo-IL^?7ItQ@reKyJl3w=2h-GT zo-6O2{pX^gp6m0cK6fsDP6cED6}tWGdDp|#6TsK$AM90)1TwJSeMEdtu6Gfcd(w`^ z@BR1NL-8s&z)1iQ{8H618KOB05s*gr^xwAPo%5q%*sIsMV%=P;t%W+IjRXYn-qm1n zO8-dmi*y40)1CX6N!fPXHjI~N*XviV+9x;5_m)g60l|@*4gen4OgMqPyg+`1-wYL* z5O2;z8^py0xITV2C?d!0{1z%x5DQ^JgzGt9UR3G0pyQk z0{}Q*u8V_q>F?h|->web&uIV3^XbbXLc`x6L-}SJifZ_$f+XSzp?khG`+$ ztT`uT-)Dn`XSpCPYp#sX#TQMk`?I|!nksb9vu-y2&EM>Xl20S#cdza~#!$(U(Sr&e z2JgcHK9?ME1aozPwV%I(;Yx%+9&&VvlGjG?c>ErADkudkQzh0g6T|e=xtF=meEaxM zo;EWHr!&9v%y+YGep$Z5*!9=0-ra5g!Nk7(`rljer`>3?x9%NYKG)~d?)B}s$sB5bXDByem>TxLyIn7Sg@GP(-{;Ut&TFhc3s1l?nIK5E8HceCaVFNa&nP8 z3kROoWZVeZ#;|!kK8y;=;_Is8|KX$b(PB@F<~bz&(Z*xyX>;XCIEd@Jp9?4VXoCHF!K$mi`(17`*XgM?Yu&Z zas$A2@yu~`deY6U`}x^ceEj|G>)Xx8zi)+F_9&hFG?s&kxV<~H=)E-J>wCRSyMkd< z02*DluI;?V{g0Y$=U3P+8pWlln;z?Ja-T@dEie5#b~~uGO{?vcd$AtB{nNihemo9yE7O37H)sG}_iSXM=UeAgzyJPAbp>Pk_M9Cy9=Q?R z{PyuH)MMLc3ZG>MtRT#jED}i%V{*po;6x#7+ENm=5$ ztI>q<9&Y3xA=j~Gj1AwKT){kDN_)IA`P_E)l5S$E{rge8zMsKX1ZHu$*;p*TeYcel z6dRAL_=xMjFPe+b=h^;5NCprDnV)z}d_J9QH%7C~+b_Sn__0^FPmgl|P=)Kq<_cyM zV?oQ7wt3s$c|fvw|FIXXe)+N?8qz66zQ8P`S54nUh*y*c^!06h1Gy^Pay5t|qN`FN z(S(N555;wMBtn|VS@LVqYE@OputZ(qGfhVyU_|iazhw}O8dn$sV+G^jK%yzc;fp#x z=S;9t*(KoP_fK=dF?@5)N(&_}Gh9ACepAjlJj+xGlL(nueKh{Rzqjvl?5t%w*j@F; zXC@8}j;oVLeuvvtqXTEG9G-mbzkHps{-!}}SlK%qznflnH^;ZV92c6y;l8iJcCqF2 z0l_tk&y2&~%IJ;g1l!(U&dDk%d0zN*TikM!i5i#7?%b<47bO7`K`;6ep_0Sp3H z1q~3(IRGB#^q>=5815@E{N1TFk-Txu$U0=3k=gav@8IlK5QJ@naY$OKL=y&;q@Np; z|9QzIblFgMl5u$SQ9tvy^3j3Y(Wf8W=%F*tI`aZQbn3}t-P{m|Z9~TLQ}2EA{ya9u zXN6^$_wIlO+|H-nrMzu1<^Ejz@_-A-d!3($`F1%e*?7F{0{|tuy`9UexR`#HYx3+8 z007@^RLtY$+n(~;kGA>zle4n|fW`BB#}iW#w*U_i`+So09h0u{I-}3_T=-c8RkL83 z=@kOB)uK4kGrn^A6={&fI@Wxz*4|+=&ixJP|DE`Fs#!~#k{}ws)T=hB;pBZ8@_+j! zBG@=gfR5qPWS1Htngw9kpBs>YKA=%rcmDxCw=5u0W;;^WXutn%Tbk26*X*Lu#_c6# zP1*0}v?~l@bx`89e>sB7z^lR}L8Omy=NL!1Y-hjP%O5r}neR1i_qp>`=i4&7qgIjI zFuyErvNuP@y^cT0oR9C0ee~sheCJrZ3($veJA+LFW#$&UU!An}Ct7gX8=_yfUw$DM za^FlJyUz;+2wE=p<(cLx`)_A|pgVvvm8|l!WVqbCOy0OX9mlh64=-Oj$Q*!WOI?qI za0%45NpcLIPcrUaj=LrYeI83ceJvtF#D_Ql<1-N&p&dx_(vVct(^YiLcv%qb1ot5b zKGXlV)GDg&*w-yuZvZQ1@yMY~DriKEAz~6V>#%`A)HST08(4%ogyXOUz~D$64R9hr zv;p1*ty}_geIz_m!*5` zYdy=`v`DI9YwEpwmkkHUQLPG$wn~1o&iM2?Z>~Qa=C_Yt?j4OkI!v>ZE$0h3^<26Z z9@B2VD>?eF*eQ#|Jh$rD`UIVt(C724&A<3^Du8lxk!(%p+y8Uh1la&0MzB@p`--nO5Y@}CbgJoV@^$$@WY^NBXRNKya&pQ94|tRs6~d(2Q5JEL6n<;&+v zM0Xea@kjsQ=ZHueE9WE71n_NV)iimNaH#0?FH+dUwcmar`0m%I6sSJpdRe~-Nt2}M z(7H$VNRpKPYe}kaK>?)6ts(AQW?)Vm`2QMk`|hhupaGqY)rg3}Va{Fx+9DwXJ_l{U zQ*v`b|0^~A7HkV-vF1T%tWUoJp!+R_tA*VbO?b8J0Z@f1BqT`sIJeAk|GtYw!fsi` z%FR>DeBki4G&%lXu9hn=-LKzx*5knC>?JeLSUoy5*?#x#(cb!)1B9z<`=ch6>AJb72Zq(l^X=mN;mz(#&3YAQ|3bO$tN>Af-no1V`|tN%Eoa93 z-!{J9?A0QL0GMS}4l@bB>~^<2Ikr81j&!IO-*$@RQ~%m)pFSL+D}Wv}LbUxVzpAwT zPMVOYpC%}&k50RC2-$S&fiImas(OFhkTx&9SZa+zV3vO)lGGifU~Tw+tOI>-!vby> z|BL!J?t2Ba4LZB=Ab6QgIHe{5UiYlnq4x5M?v=6+)50$(i{Vb%v7_m5o%rhSFVjG^ zfUcIk575arkSq)$o1kVif9!kd9cwzBp(_#5sO5gsSN5ewM@n-r(}N$|vpjq4)%4gd zo{pXQw&Q$EbmCuJyYB6E#ylRKdB}NK^aCP!up#7k8gov%xRd>j=fK%muVzo@(n`uv z;dW2#dG_1v#|!QmZ4-LkNI%VAU&Ts5@tCLIEA>i5DvjIe-*(&h=%>f?2mqi~?~ex+ zzSaXT1w3aUKe$=&_#Bk^{*6u z25;)92*5+0v^d9-!!@p}zb_VYR4agZHlhsJTfkElsxSpa`q-J=e{mYO+=tobUer`| zw07V+QnDmFiBu%r*X7Fg(3Bp}yS@vT*E#d)`Iq4EY2r)=c`{~HF_UU?d!glEh1Jr_m` zFj5slm>5(aqjB^f&1u&!F4BM*j+34rq%U7M9kG8H@z>i4dlqN@_~`SuE2qud{G*oD zA3G`%>;3l%Xlt%_=5&L2H>=KBDdU`MG)go7}}g3p7|+~e_u1Z9b|bO ztFPN#jb+=r*8}JH$UbX3!RC`5w%MY=bxXxMr3sYnJeQ-RmNTskkHx_#es+5G=WSY5 zqU+Y_ryu-%XbEE0>Y6)Ok_Kf++EP=>JJY37~wgy+DCs_NLGe8w=Vc>E7(9=jemN|6<6_nAV=Lt7%CsUt#0Ju}cFwaknKJ1qkR@Ha zZ*_S~emv>;%yY`8{i!SOW2x!-+lZnPfXxqAI6e6Zgjji=ZqZ41P$WS6@9OpwTLD;T zpzM>z>*xPTqtQN{_*KlH0bU1{ zSkuL@!4kOsvQCccT$2e&mt&6ANB$&foGshW6Hs{}3^=a;=l&<>yPdRLVTF}jbTu<$ z{Lljv1|N@zbzXRL;=6~N&cFTL#X--86E?PXXIJN@M>AWpHoY|Xg6&q7CfT+vjoV&b ze_kM4^8s+Ug9sgBKPuDkMFr~e=5Osc2uvh`7TeMdwcY+t#BjC|mrd6#Ty#_RYV8T~ ze7D^0%%N#PA$Cp1G5^}MNi6$9FRmsSHzL=UX3YR2pPm)G zmOta9t0pta(i!8QmmHVf6@&XW2gmsJuy%CNIj}W@vd~A&)>b^ShmyaQ`UPo&ODr7M1B-Q7P-rQpQY5NSYLiQA8(&8CR%E`OkId< zYgcKH$#%2|3SHB7x5KP#h|4a1xAgNYy09pk@o-zDIMo#Gd~p%WPkXUaHr~}UQrDY) z5e?hd$)_JA6q^s%`hWE)$$ETk28K@aVNzR@a?hNc#4s4I#BL)dX=YjW=cI6rz$)IX z0z6G)#e^vSuhx8l^A-gEEk6EyQl;)|yIN%RSGt{QwPnJPc>{A`=eU3#tO7NcSvvs! z=2V~owF5e@<A?&}}D_brhY z7VBrF*(uP;X{=nlkO4|ZnLYsRE1zw3i2pH|{UW+_jjhRNY*&{RH_bg$lx8g>h;!tajEPSufreE#d1kx#yPrxh7PigQU99Q0gnBI|q*j zFWsRuXLHCI0T_e~KKHbx1k{4+G6|A7P8muGr~!a&nJUi5%5Y{(Nz(@pmT5^RaSBwfyC z`>Vvw8CnIG`iRf0!c;c!$27QHPh0@QZE;Rt8b0S#nFOQ(tJPXd>ba#V1dbF6vZX|N zEqkW`RG|qr&&l-vH#ThDt+PdiI`NM6&RD;z()2hVtr`xqz36xEu5-is7t?z3<%~0C zTW5}5?y~*d?b79T@FpvX@m#Mj9I_Y@+rB&+nX-3s%zG2_w72$cD|2kSXPYeiJnl$D zc;n+j@?=G9aoOf+x7gpGxK7DT8lUW%=eo_EZIYTd)q@7; zgj*cH`P3}`3}1aGl8hs|q`b~Bz7~ARwVXd`XBE2zjIOOG#OCc$r+SKNs^$+PqPpKA z-{G3NNBL7T>)eYOX)DFDYcoe%T9VC(m!vC)IpO1_BU^QjH(H}9?IJlBKDXo<1DSyp zE8IAz%``xPY%$BNWp4sps;1(C1Xa_I{c}fd9CNxXCvme#bvmih-C*^D%k0VWc*gZ_ zo%zf3$#nW?#u>vW+o|X4e=IH@KbD`E>T1#MjIqqewZy9SmQ`W*rP11op4#)}b=NkT zH}HA;qh7n@<$w0te&@+hgK2BiGE-HURArqCt7~ElAeY^*K@R~;33@KJ;rH|Vfn79p zSyvV28uj3zwED(F0_+u z^-9iziQc?vNtJ`g1!dEx5r*YV!U!o+tt*oK5UJ#+kt-4T46SD7>6^y#2G%v zRE40BfF29qoKs5pe%+)!V}IcOZg1jTy7sN%`#an9usJ@zY(Dn(3NR2Smy?$u2+ zvH+X(dA3Wx9;o-u%Du<((dA3b&*!VhGW7}<3WaeIa|{H1S^{GA<~yW$^SHp~*&;5o z$3I-^(j(7S-5n6K#L_B6A~$WSKW&EeZp_QIA^CEX?n%n&1qP16=f`qJ3~I+Xq~#(6 z3hJNyv?sTNi89s6P$yJETcsP@&InUp&G^=-vi*PTx>SAfXPKOiZb(R_vdVpN{m6v4 zoKb>bf%^cS_avF1g8*w4nsm)`sz$JqOF#&X#CCY$X{x+Nq)H3**fA=L+sH?+_P)1` zt?N%7FW;DwcMrX2`|d|)?9N&qnr|L||Kn39PriBo@YE}r>pyq+!tGXH9=r6S7x(%6 zJb&(f4tdG2M7t>IDG0jD$7KHW-p#akRk5wIczb=C?{b+#7IxCyc77g3kgChH(H$Jl z45f$vsqQqt?tDC)D}C%wTs|JsX4fIvDvzGV#n8HF72wwSBt6cbCe8a&$2M(C+xA}z zA^Mzuu|EZ*t12VfXZV-0E54g{Kabyvqy+3lqD^Ji}K%kg*|O~qaMXBWP9-R=9+ zFd2)L^t9-%^W?O$+g=SKnF{$XOy9-m3b#%M$35VPC#rH%U1SOb;V5t%)M%#LZ- z&^B1<{>uEqRj5z`N*sn3Jf?m=zavvGx_*O*G@3?bD?}`AD>J``)p=iiWvGNuwaP03 z0b$!K)MeOmYE~6A0R9HGsRnEUF)$0}vuOrMKuC~5-Oe5_3{z$0NlG@!FnXN-_Wu9l z`ShXI)!pbVINY0fy6)A=&BqVR2Zs+n|741n|8Mp;?k$Ip{=A1a?-q6Q;No`pcj43D z*{)W04?b?!TXwnD?tH)7S#4ICr7~y#pie$BZHb^U@ie%6{OtO~5c%?dYp#oV+WBSX zMa(^u8wrwZO_jsS@OeL;t}ASQ+0+2$%#XQq%$XK@b!n36Dm4X|`2P18bsAF(C5uWKT%-W0fzJUThI}Fz-bS^t0c#SVhjiLD4Os#h zfr2dabryInRj7hz6RXJ|!$tATtCX7@Rt%$ytkqs62WWP?P_G9_K zArJK@*X@P3htEkb`f_bQ``JrFQ*Lc!FJ}tUc0M)@MfT~Qr@w9E?^^8d1R(hL!>rZD zD@hg@DQ2d;$@$CEnB3RTZIa8}UB{{hZSwOM8d`Rg$c}h!86r^Ij2a?KYBPLgJG_r6 zC)eBmM4fe5Q(?pZ0TooF43H3zQgR~QAqYq*sie}4bTbeY0SQ66loaV^3>cCkF+ySt znB<6!!GMhc+kShV-}_$gb^h47_TSk#JNJEm?r$tjkDdrAL|Cob;L2J2($x8kcW%6@ z66$t8y;m#i?N-zo^i@`!?q0C>A;GOA;p~}pQ`YTqmo~R|*B(8;I@Mdq`#)Zen*YNH zQxuHw3R7$SpE^!H3N+xQKm%^dAxQCd-21Pi<1Qr)lSlP|wi%7k@aAl-SgTx>xbip7 z$>E|h$y{;$ADRbVcK65`YEjl(i_1an&Es9EDyMF9nNmJjY^AR)7jV0=V+uQ-RLR3_ zLtfc=b+Iqyr_e(PBu}<=vVYmaGoF=>ZlA($fNO$x97acHEZZ8>?s%E`4=OH zzBrJ?40$debUUT%|4DzP@bhM#KA-`rCh3WI5&{;?X5IMMpyJyf80NCH7!oc2=o0th z+#nq5hCWww4}4zCSh>pnedF50n@!7cZ3NI4Z%65Jh>5Yzlj9~~JrWy1c-s{Q=5{38I1^1lNfUehn2X=H(G$t|&$OA!wZ((Z5n z8=!cb&8z4FFMHZ}(ZloPtibj^~Hif+KQtB~rD`TH7MVsZ6Cb#oOZM&J?&`SG&H`)_>?md2gCem@gzW7kI!d2A>lst@5DC01JS zt?clvO^m(Wnb^?=c2rhthh=dhzjk@qFgOowvl+3swrP#DpHMRfJnH@yeuB0^{iByv z@7S_wPqt}tKW(|vBN>)aiCRjC!=e0VVV zvmyMEdkRtBw6XyB*@OplD!d*vstHjM-TB^AuBUY#865rvKZCz>hv8@KlRY_RG`c|j z!J}}z(-lfaXhFPzk484YR8zC4^rw(X!ZezPP{MSIq~kC;{0C zPIFbu4|{rg+6d#5H#^E-$h&hgwJ&}6yC`vQh_9MdtY&9B%4O}mDWT-$EQ*P(0AevI zKEnvXqaJzh==7PWoNk=sKvmq=oz9=b>&UX<_iVn zP6PE6N0zQEYs~yB^LNkIB+XxYBo3N*p@E|-D=;g+KM&cJ3vJU?)0k4%cfErIl1h)& zE?Qm+?)g1hvgM3$LoeVe`@@=dl6I6|`jo3O`b{jMBk%lt&!2IEeqe}Ivt9w)>uwfW z?Hk=dFPCR}smO%w%QZB!qKjt|Fm!DyO(!5=VUkz;ky^2Bo4wM??#1hmc`Y}1|CT0> z(G{p9?<{O=1`Ius^1LX1Z-zB9Nqa+g*~%q7tnPi_#m9Txd>wGjiRk-E^++3iOZOKE z&mMhk+v2}{f2ZBi!+MIDz+l46ZcOF~GEEFL@SPPAMu(VsXQ(BciR$tJmLZDn&yR1E z>79RLr~EY9CUKdU6g_*c7PNGU+-G3OxRlkPD>$l3Wqyzo`>8B-8}#Fh$hqw0Ji9;m zC|_~A;7ep-&&C-dRKhPD{rN=o;Pls>()s`>S8aj&$)K^(?m<9kI5_Gt{xDc3d)Vg` zxy(2HX8(OQx)XK&6p*uFljy`FJr!!m)~%~a%#A0kC-sMwlO$N(@jKL4;1^ZlYam-+ zx%C_CJZi^W<9GziYu4=3o++AFLqT6E`{zV{&bF~6kE-5-kb{^k9iQVw?FLRR;jqAN zSor(avS|&;LHA~(3{raL9?A=VZEGt^v?s99=~0JJij;#VrCpStik$=wSz6wV^xzNf z?5fo%ftW2Ke6>re`Z7MJwjZ0wji7(Tl%_q`p^9b`EW4DS{0%C4O(4v;FT%=4_S;^4 z13ybv)%A?u0$(=BIR+Te>^g{3A=zH;cV~CkYCVz?J~SGEzri?gdTQOCstP0|BttM! ztNVu!joQHko$7k!h>YwPWWb#UW09oBO@`V{PFBy3YuV zt*UhN_8?xOfT3QH>3kRxR#2mM7}QnVMIIfLBK1B5hLHznN}l*j_5iyIELoet9iiuk zJ)L8xFoaLH5JKEta3@n=RcOof^NWjIqRkgr_C=`lI)di~)O$1B=dX8DQL#qiL&ffr zjd&ic-=cD15qNoF1C0Z<4~Wf|-N})Tm+wU3V`5tKwP_^u=8U&`-tQEC@`tScYbW*4F>f<@mPwvXPFAmIk@F*gz7DhSMorH8&@4ZBO0#QRc@3~(yX!ANAKF5d8O4Udf&(9 zZ6XF5Vr0n_LWB=Ad6N_qYeXp!m{*Nu1MPG+og}aV=1pZarEZ;7AO9nBF{2I{@ zD02&FasOMR{)jeIPNb#M^5kD*=<+jaRnGP-v;8(_p~=)%g^$xcfOD)tzR=ESbVtF3 z;dCHS+;D#mbu7L8)2V+D;5wbW=qO3GUh(>B;U8lk8$2vyzEoTQJr2Q#v%p#tTA!Il z@@d>k&+`TNKsCxrr$fGIHrYUD50{XBCx0#a)Q-eb)f?1r^Vnr?@$WT?FaT9awSLovB3ib*kB}&nd;0m=YtlVhJknF*IadQC95b5%hz){5rrwd#j?or1VDUB0nuQ ztiKZ?k^sw0?n6TH9%s!XcoiUo-#zp9xK? z!`z*oa=(o+DecPcn4roBW;xZIgw|%YCP7X4JFiZYo-rM)^Gmq|GDu%@zpgp>nyRS1 z%u33cqoMOmXQArb-7ST3!CMTu)XP`kkIn7WCo&!#6`vFC+UMS@yl{-)c?G#hK`b3j z7%>gjdjOs&jtcoy8hC_bTySTFT}RXNSnKdlZ) zH85wb9hqR;&-+rqU-kXIFEf(iLt%Y+Q?8iJwW?F**00xV%iPt*iRFX-CE?DkD@1@h zJ;!V3C%Rp$jIFvy#@09P(vaF(-qN`1G}!R49@bf77bnwbwU{nV1v8Jiie<9(ncO!c zA){LYRt&G4J$Qrf+9N}}0u!CR_K%oyiDqG*O-2i6`>OB{E2nMEPH(&Rr@-+>GpziT z`bk@}WV>c~bI+%C748Fxt{Qd*piv%azkqm9O@y<`JN5z0-qJOp{DhK2pbnbw0AtzGvF@XVP>9 z_lqM%@kSVudA$1Pce@`;NzS_&C->PG7$AylA5gn7ekoMkm6ZRG6YcJq`{-Glnfqle zM(mkpi@5165~;r*5$#PLT1!UYws=yPx2NWz z-QxO>KdnAUsmB;~UkIy2zVaws;Rb?&A(SHVmab@3%P5M-D5}(ri2gC;b7zI$ykYgPhB$5uvWg(G80u4%+7H z>W*vwyzjfbc+U4l;wM`DQ#AX!m|Ovq^#QM;b!3M{9ngWbF5>i7%^v6Z{rD<#unqmB z=GE(Elc}RmAJmwpK#l#UvhTSmT8LW|9Ry{GM1dIG6u`kpW~O*PZc$(dJDEAU z^70t<s_^_4<$!k@@N!qTq0M_a+yNw?P&B8KuH~kdwWIaMr6j!(Hgcxdf_0Jxf z-?if)_QLNAgi~Br$d%KuaML00eECBHeX>g`<4*fbbo7Cc7h9N5rNrwK1ti-Y&!Z7z zMSDdhP2||h_RV0-LgSsg7pfu4uH5DgLB{Rnm=8`PLUNT{7J)6x&c4dZPI77&HkJRd zxlFkSH_s8}%VT~Di;+8*VlE}_3lQD;!h}FNQqevo5mKG#MqdkF4Zbo_f>!%nAB+bu zT>finm%c!%$M~^-@GkTcI5oR(ym({2={jg8peb}pEWcal>Fl4BE5% z15y21MJ~q0it`d*7nF9ItE+HoaK%fmW!YUb?@C^`Lw5Eq3cRFr+$%*_tgSROZqqd` zyZR-=Uc&(`*fx~hq?Ex`&cc&r35k9$wpk^nC$SQ}Twf}(<06ZqXI0@5llvE zqD+3OJ5lNLx&{3CZ7vw>lj<;iiunww|8=_^HdlOX&`S42wK;+HfeCCtEw7I|&FLw7 z-V?YFg{XBcR1G=4h1*my6m#&-tS;$HCi_y^4QmZiWSiUeObY?eC$z3B#cVsPo3t7j z-sQEFagZY3NLlX*{pT0`XT~x)!Lk{Clpa-FcrpoRLiQU9joBTOVmCVQAAub$wuIAD zhqKQ5_J}!h7c8ni;7|7aunQ<+2BN$|L<|)!|G~dZs=fFM$3>3XG(a8;xR+P|XfXZd z2Rl1_ZqKvwc1dixSI7XjDWKT`Iv(0@B+3x)r&g0-AKqX4W8MV{80LpwfD6gO`sysq ztl;A&EZ3qID*W(+Y@PPy#pCnrcD|~LkREirwIcH`kDwDT=O}#vj#`GW$sWEJBV#F_ zRdt3?Ih>~VG(|&F$V(#Ex=lJwP z9#_^O1Jw$xwtC#X$8S%H1+II-XKu2*rgtD}m*nJ#S8}Rv-Vi8y;65ekb=-O$PijpP z;jr_;gdET1hI&(M%s?sr&JGBfY$vA{N$#5UjfjR0eIM^Ww9KMgc9SaR7}|6JMsl!a zuSMvpshzw{QjSQD-ZJi29(`8fh6Zc}KZSMh`6@M^pP3uzgc?>Gz@v7~SkQSh*I)Ag zkw)_fpiYR((LKIG#WmT1+~1diKc$?55XgDcC%)I7e=ALUmM-f%?Z#ahxwLum!Yp5H z{2 zDckkFCyH^o`vgajI2wJ_#0^*phK%kWP0R(oY%))}Xo^%rh^NnKgUf9re?W0tzi}|d zVhxf9YTPYgza(ax1DfQ1t#i;}8Z_`R4t%)(wbiyxo=*{ne z-#j`UH-*N_7O`F7qajeu?PqH%w(6N%#9rL|d8w>=b9;@YM#QX5yKi%6V@ZuGdh7L6 zS2$%aEIxbikH?wr-mt^?Q6n9@BPHasi#H$*)eUT*<6gR8WE(0PPSR^sj$E{B9oLaL zms|3Gx%B~;u^f=#laXpL_a1usp3 zpeshksRvEM982rB>X@Z4d*fIi0%^6*mU{ReirX-wxU8ovj68{}G9=G?P#RDnQXg{< zRL{ceaGCL3hk?g95p(imkE=15JiCc&)5V_OV>#gOKkv%vvgen9-J~pUink{=9)v1C zTWsUjtcM?Wb z2s%LAsx$-`)Gg=IU4v8sN?0ECyp&Ubwwh4VEe2&^oqGo;%?A@E!hRN#-9bs_!`&Dz zLRe%WrX;IZ)%!eND=wLshuIphVo?Jxj?2mu56=1{E8920c1wu_&Bykqyb<6b%tenl z?^U->?Q*nnhT>o6)KOx{$K*A`n0Ey?xmMFV80s(obgZHEvNo?CB(JRXhWr^3Ij)qP z#FiJ@%SXv8{_2_rMxN~z^REiX_*=p}cb zi!vsP!6%;d$Kh@G8+@}fDV5mii}U7zaP0jYbQw6quZ$gy1fV$STWz{tt~~z85IARq z546noygY6(0q?@SQIdPsIOW~F19+eho%P!S_`f+zXRDxr( zUB`I58-t)Hz8cTT0oD+M*CtL@=ao$vWW;Y>mMU?d`FVEteAJ~&u3x}W<2yCB+v^si zm2+V5U;2C5Wpz!>-B!QV1B#6mrgL%U&QIVm_jIH4j2}yP5}$~Tilo|fd}C*ArRiy_ zTf{eq-+Xy&=6{ZW_CbrEc1^lnocn1L0-x;{A##zfmnhxAt5}n5~rbEQRmy|aMk^@EbXmF(g@fI+Y>Eca8sG$&c%e6ll!SChFcaT z>(-!Xf1|&iXa}hG&DqHH?r9G+Jrw5PpgLnZf}<}8xv(X7zbMpXPgtTX#?4C-6q!zs z->DRQ|1j8Ze6L+#QQ~~w7)u1`Ib>U1{+dcemhI>;B_AhiK6i73tFk|H_BXsRjHXdRwVb;@N_5W3yfEzHiVm4&I>es7x~I~S^f|dE_h{dy0MfzNwvu&y zc6_-ekgnDiSdlayvApZ=?rIof{inXWskF@~Vr>?+vIhhnY|Y*1)Z;~qC#ffV?4|o# zY!8K?P~uCmi1E-z4l21jQhEfzGnE#3x2in?<#c|1=wcG%8T?OJIm}2E&E9au(BB_Xl_bT18GkbB~Gb`oe7JNC9%0<|%VP9KsucDJ7^!E#K zD*I`6mJ;6W{Sf3kmG=DRoIPKB9wIDCHQV?4*Iu?R+|Cz#CEE`-KN?h-qvAz=P{Ae< zLl(XMM~9kF3-h?bH6CQ1X$3fBwKMYg{7PFexk>VuYvl6Y`*L5~ZdkVmOO)P|P2mJN zI9L$s-zDnKgdYAzwb{2_#!~J|xO}-jKWVW@N^__3d9i;*8W@ z&%L4i87M;ADQEvH(X=Y!L*z85P8a_0r`BF-#uKe4>wSKreQYi1;&4x+-ZUCjo~9zfS_e&rMSnKf(|=2 zrSuuiAKA-;T%$g(dVSgr>yiNX>1X$l9p~6Eg5TW=^2I1uz+t<~r(3y5>^OekAsVb= zS8p65fhc}->0!W&sD+h?lnI)vG2UfS#4q=&Kjp8VDCvaPyHnk};*!ZxTNn2&JyAjn z7oIt7@mZpOYS9&?o$~DE@Vf?I*7Fm5vk%0QpRMGC1yz_0T#fJ8g@rdY`d3IS@Ddyw zf>(Fqs3X@Sy?fP-;x2I`wX~=O`$rv#ff{Xml06`yU)N)AU++A5!&neKS`A8fpz4sL zh<)fCr0_N5mV6r%s`tWKGjev3K6tOlU~%r{kdvh1y>1x;>AlBvcEv zu4rrg#8j}hN^+R+u^6+YPu2OOB*?XuK4qKpuJ8QzvgF7GuI_a`l5xLnOEdG_9`dd>IekWb0pvG3s}koUhVH@31}`-l%`eX%f#x2}XQ}kRV_=$< z&2Gu_Qt>&fV-yG>NAy5F2-lLB$00D4&c3cTzwlFg{@R*2!fl<#BAT{|ZT6 zK>+$|ekaX5GHOT|*Avh>^=&rB?T_@*Us*Hj^rH;yTKEftR_EREmuBzcp1n+jNnYO@ z=P52s!~`NS*(41Qbkr zK=J?MC}t?1=Z5KEZVIH}{4b_prkvfSAPNo&u((Y*=qUM`94kW`F_j>ngK0pqk(0K; zvj8IjdP9yRBg{+!A=yl)q5Yx8Red)R=*V^@(CIt=1b_#!`i)|@8o~{d`C!Wk>>C~Q z#K=gks~>(VFT^Ht*2!^g08RvFcMmE~fSpGrYkmd!xEt_94ICQmaN}NkOgt0fe%Eht zF0o}jwXl>ojOwpQezA9WxJ|U|WfQqc6SJiR6WdBUx*#YVx6PgdiNwJ>N1%{8G1epT z-LS*xZj~mSLp|-}(k=CIi989;DM;uHppg;!20dAJXX)pP>pf`0vx}&=`*!`>mskc6 zNoNNs?wJ*yD&unkDL~bYPbi1*6dvtA*!}BKm?cBUDQBg8K14}j1wM91?SV%^!ooJ% zy7a0Ta|r&mS z-#-|E>8Cc}+}VS*^Hf9o6K0efWHHC?8+3~mSQSEJ=-AK#RPm*8JUGZpR1uXj??_x&Kb{m@#9`tGI5iUK2-pd3M8CJP;jq{_UWDJh$42-xe{9Fs=ljzd|(& zX2Y-HxuXGuj^oM2I=wZYNEYy5@ac=9yZb0YV074F96TsYLQDpPlAQpwp^@l!Uy-6B zTbKloxJA|WqvaDr->nIIubCZU1c4yV)2(Wg8FN$XXN7T`9AsrPQpP33@6A#;sUJM9 zDB6)%xs-oOprU$~pEAFm4Ipbl{&Zmzy7fx0^R2Dq%F(qdFWlYDeD=Pea;i%eLgwFCLL)mlCv=XiHTOA`B~`(J9|qw?IqIP)GUy} z@YE;D;(V}0(=S0gn&{)L#y93`EFhZWm86eWHAjAR9hFjp9LdkIz_-PQEj~Oo5o8|4 zHcE>UU+)CL>-$yU)ysd4vqi0k7b?JXB-P;3?qT_%owMccsiKI(o-o%)V7_vGx&&rHhzPsCPTt|2wl(68%Lpf)wQhRViLX% zVb&cT-KhAxz2^YHJm0=Sx z2zR3+TjOPhsY(j(HcP9{Y+Tc$zZUmTR?OaZf^li1sde8lr360sd}^hHk0Z#-?`sF) zqgz~b0mCgX zJ|OID9j<(mE&-f^lBuULJ|B~3(9Y4FN@@^_lz3U5d{0f*$yBhUMeLZUI;%DF2#3;! z4()3{%%PeR!YBLc9*H#61f~QHJBy`2JQ=aP(=Rvw%0fwJj6Tm{JOdZz{*O>lo{gmX zFiR|3@;+C&H|M|P+0rK2{#3V1w-l)_2545Tc&WL#>72zhIqD}*<}ZzZFmaLi6Iikl z`u(N&p6{o(az4FG#z<=Ma&6{n0l{nYdyN65JjCwQvUqZlwnsBbFp2u*kl8V;_X?1xWlIP5VMuxzAH7 zD!$H))VOSDE!aADm?U>7#=($Atzk?&uFLi=yQjNg^{H=$InYz!5;HVsco{5Tk3e$i-zzI!{qP!-6VLQj1YmaQnuAI_ z5$HV|Bq8q>5)6dpz5*+sE&wDT5+SvB(GLz$Z}Ddmb--W@n5oX)%O*$dI5c7`HlW?9 z$lB7r4o;NZ$_2Z5q$2b7BlEpGU5kwlx9W3dO!^Lk%vz*oSF-n7Z;{fjsadA71!&)n z*&kEOG_2GI25*kqCBq{g6p$v~<)vM8o$G_B1P$*kS}5U8-X=3HD?O5AbpOSvUY^I} zZcRNT#x31fNmG_|sa(isu%O;G&b82!n)M z6dB5Wv)Iukp3$g7vVZYc7B<|CICSoQ){z)p3bebw9xunQa3Mgz{sWG0f)N))WV}7P zQ;99Qo{n?*o7=0LkVKKtbBx?0n&w< z(5mbDAtdtPav9k1y63`!-^D`WJ+>ZJw`9a5-D+PoXhzLXJ|wv~cc}Mtmu(Nz%-sCC z)j^R4H;sDUXtIAgmhyb9`ksIYfFf_GWZCL?lxFzKN;)LhQ=<%EA6@@~rf#M3w zW*dOO5ia(Kyd!rj_N4n;*e6<9HL;c4EW=-nKX`Hg_4XtyxkCbFp?@XYk2=wRnSB$A zzIdk{z)%D_P{+>ZlUwxj1Aln9=f4SnU7k)aQ`6(L5buj90ETAH+*C4`2wD441?snw zv%|g)Js6cbW>iwV`Z+nitUj}_W^`GpsxY01kkw0&@R{3Ey_E!%w$>COzrpr48Giia zBriqFOHB&C(h&#hC~F9YSkvb;KZdzs7X^Pu>%=$%nZL2no4Yq2BDp0&ap$VSi>AeA zSc}RTyW?c3CLXVY5lZe73lf|KMI3LB#*YoIj9v3pYFS!1ntb)@1{o>aF1G`>o`4SE zM*pC_#o1sU)AocUPinTGG-V;0NT@-u1N*Q>EUAJn3^U*;QN++BiVZ-t}72&9CR=wYY~w)yb` z6)d}H0CY=tTL=Cz*q!Q1O>$k=0mJUw8_$tc+#${_Pojw&+iRH5VPG2Ncc4z1LWH=3 z*tr}P2h_z=XydL53B<$5l#6;Hm1B=l8}_LSV0(;-2(b>sUp)T#ozXLIZv+<3Yljr zLSr=NLR41t0)(lC*?KO_eNpqHJz<1UR^q!4;%4A5!DZzrm4f`JN!(UnTMUz>Ls3Yz zoX?%b2*a|(tLFlYjAx1A@C$;-n+m56>;=j4iN8>Xn6K^rblUaBJl{vIU0&HEvm9f= zs5dGBh_kkt=y2uCLvyS7uPGCG??|4~*P0)CiH3cj9`L$j#6-`}zJ7T{meQb{@A>Z! zBtJlN>_zUjbVL|~IS+7tsP83hCYx8>*)f1yZmFEoF7KtN))U?75@FFb1E&j6>3Mt7 zCNsfB>U%VPdS4|fDu1c#vn7o2US6{OSm%ZJ5N9+Zl(eJ32A$Z#D7eQXha(Zli zl$P5+KGGqP&*bE+1Vf)=7dbe0yvD{_MZAZ7EnQ->?e4g4WM%!h>gcdS`bGo%^2_7V zyj>_Jdpgs*o7C+%^zSa?vhu2uqCQ=ih?yr6{YU00zSFdX!O&l)jLyV?389&FR^+a) zyZ(<5C&+DC{*9(zuwxg1iYY*rn92TOWP7~>Y(EibK&h$Uq5X9KN&s?Bl1A{BF^Ru~0-?upA+A*F@-EP+h2|@J1A@Iz>o*X(27<$4IT z7~(@sHQjRDtqeSy^%vFfygE+s5+)6Z847Ld)vQKa?5QajiolN78-)!kI@I*A3h&h^!B{f;`d@qSA!F~FK;m+v_3r}?pe~wy5f#hfJld$CR zYVEU6zv`_2+6QOG^z_e;)_Gh-t>itq`sT8V1Ymu+egxcoN7h`o*z}x#Lj$w5gm*V*z(OoMtNksG>>?jz$1^dQH9E7AktjZE}-sOF|2nf@5YIY zgV8TfnyIcQYT1DjB_qs@LgY!E5xvLjskE)%vDX{bCF)eUt-IVKVe+;zS--w0&z|hu z7S3h8r~6fB>L$_u{NID=o<&Z8EOWSaFsV!Dd+LmF7A^71i>JcuC&>iQ#$b>Q+duZl zaC9UKRdHA1=x_)q-MO2zTxI554FuL~Pb|1TV{-8i_XIN*p8vbyKdq$ozq$#h|AP^K zDKH{cQ=owNzu@6E#R77Zf*<}MWJ$SsK)BzJu?#XlrwVXRnX?cuCuUvQ;D5vx%ws z@%pYycUpegg7 z$rb&eFC4fXFj$U>f&Mx(sNkX9arj|wd@996Fl;0-HzuRU{rbBoTMg^^5fadkSw(yD z+;FHfd!Ef3+OZ|uwAseo^v(_6H9HG2$dDc@o=j)%w>T4fl-=ARq;T`_Tt?McRc<&n zyS%^|&}G&6I@4spb+)LxR{FPZ+lqu%u_}?UG`?`+)_`}xu z>CIL8`5u|DKRo6FhqJFSGxUhDvoqJEeq#w`1X`n=$tzkROqDU>+z)toduQ0lNbAPd zQ^6)-o+LshJ+`~})FE!0pZ*r4KUqiTsG6B9ea@$LQoUInM zx+NQS{)@{JCpMvcKK^&lG15OUa>N>JuNwY@{I4iGFLgPr>380yx*Y9jNViux>nof5 z;qTSW0NUTHKT@X_ z<;^*~fq=Hc3)e+QO&^~+N6FAp#e~4-DmO88ya6$U&i4s@LGZutnwkAEu^uzPiea0& zk^q@)TE`M>`w<~dZ z`Jd~KFze`;C99vjgXiJ*M&T^?>7zccdfQdlXvoRF#NlqVAujJu@qOPq*NuSD;$-&Q z$NJdQ^Yc-pIh89-TX=ty()zO7CzqwCn6{6j5T=0-RR8#**N#Y|IDopebp7bM08%*K zJ0r@bR`9v7>(MwJ#Itrn-=pHMhnYZy#oH5Zy+vFMbP%KODC2Q&x+(5%SnC!9LVL#0NzAj>E zrb7g!zJKDmQ$&z2EMi1Fm=oZ-YLW`Vf+| ztXl13*Rv@kT8*E;0fSEa;*=1%5&htL9nn|DUwA-ytsa)SYV8SoxU+!fCD}1HHbr9} z&}^=II4I9nqCzrf=Yq?o1(7umhcZzi7n71~PW_0HNaPwrOwq#J`Q~|z98!tl>TA>c zKwE+UxH|o+Q02G3O>-(eGp{@%=rUyiK=O~P6KSAWt@du>X+-*0b`SP;|JqSOcBE4# zoa?m4z~|DVo8jY@_O>KuJMDg>KT%`+1>Z&VObEzXm5{d-q{@s3hd$JRefVuQWJ2;#I1^rosSX6f+&Xq_xYn_s%Wzqd0H6~57^ zf_NKRIMXUc_Ue#R;MV0iZ4xm=sF5~WRZuFvvvCZP#ITS|?l=cc0 z@1K2rXevgV`k&7ppRLaxgY;J$k`I+e8Ete#uee|J0?T?*vDtyC2`JB{JIKy^-y*uw zJ^iB_+xcIXaZpfXllB;^`)maowWk69acrzVtY2#^)nXoPZ0`VRLTJ3s9Sp$DQU-IN zjKju5Ps`D3dx#Ytk`I|-XB_wscAQ^)*M_(hQXhe%OybX`9@K|y?L`a^zIATt-om$W z61H9NTb{Dh%k~(TAjS=i-@Ci%KH#YRAzb4vwv4OtJ{YaM;UHBYHML~wuhuZfXf@(z zr-vm3zeNEWs&lq%1svYdrtAuD&I%&nr<|OcUT=XZdIC2ZqAuXo6KDZ6nRSm&MrK=r zvkF-SKXXXZH@a>0P#m#`jE1WeuJm*s6c15U`8a>cInrY` z4f#kLuyW0=Aq+GZ#8Q_PveGW8TDO#Z`BPl&n1;OPXvAj8FLc)tVcj_>h05ou)V4ht zmvrQ9hspwX!GI&LzI>zVy+igv>`|&PG`@MQX7Gws0e>dung|e#;IfU8oG;$FqqDVH zRwhLq0^RUnD1#ycN6T#f9)8Z{K!+X#QfuD}k0$@Km!5c);#TvfLx~ArXEC}`dXnM9 zF~uCh4B=v>mVCdyqg29ELS=^x>{0Ke@w~BI`CxsGXZW_uGHo^m_wXL7=Y^c4J&Bl~br&Qdbq?7J0ndfn{=x zut#9_pchAe$goe#OK69H6qm~bc4-O-eSNUmKeaM^_&K0nwGhTc1cS zhf!40NP0f?NJjJ2ibr#VUDYnWs}BFvdC1w&xoe%q5lVA)V*C4I-W&X;?R2(Yo2k>;+T8~cdhTlaV0_$%v%{7s|` zh|(FE8ek?0tzmyE>}`I7xQlwKEZTPze0n#L3{t3Wr{v$HZo9gOn+a(u=OCvm0fubV z=LpcZzSdC%Vu?oOw|57XASqWq zZARF@xwaY3EE!resJXyURvtopzGcoQavMa6x!0=IB_Arbe72l(=eNj57P^Zhjiqfs zDd0*^Vj=6ttCu;s$Qh(g_pG2!<#9`h_~O6~)kiNWx|iYO$0hz!-=2b_@t>b*2yJ!z z_;O{eBevlr1o}yT{_5BQ7|mezJ>5+3`&qFAWxIW({$M)#Q2%0wjM~<|^N^={9@bZ) zvz$=Kh$DpBpp-aw*I<0F(3VQHNvU#4$ZQ-me{+c&ptk*dLb8jKTqHbP~ezZK& zIFHEf*SN9ZIBpx&I#2wNp?ewsd5qMSWSc98-sF^sc3+wBdpO@H?$cyt zY{|5Y*ihn8ZF|Z?b$w;|@(>JD>07tE9n2y!{jURRlv1f!j4F*kcZ1pQFfbigNYyw1%t~i$er) zUwq=vlsrU%A&9qGRCn+S`o^os#9)_Q0xQ^Cn@c4;x0 zu5N{i4_8-Ydoj~5WZ!}F#z^_3Z1@O57L@#wbsnn$gQqI-P}?O&O!%FEfu)^r&qqm! zPB*@1D0-T3yfr^mxg2xzepDObh%+Jr;8U6SZh76zYTg%+y@ybnw=X_hw!>pEzUcx~ z>XyL#Vgh-oJDo}WW%{+e{Z|r4RS!xuTE?RT=Gy*Tm-i#p_c+Vih_?0x%75aJ&#O?? z{C2Ontd`YJXJdx|1Of&V8y!hrY$tcM`akH0i7Qx1d)az*A;x*%SO#ZZZ+sp8``h>2 zDcWe{=b?Tfh?bEz+W`s}5?>|3(OL?>;CQ3A>VQi|UH^~!;=^wpgkIfoH`uAM0X zmNKrwVZ$A$IftEb^x5i>EFrGc<~%#AukQg=LtMmXgwambRWx6XkB;>8s}mE_NtGMH zEq25AU-J?58N9~R9!ArNk4+A=($`cOGFT*YmAM=JEdQP~F0+m4&8Wb7<%;MHqHh1B zk=86A3A6Q=ykRFXK)*7&H;?8OM$iw;1PeN7- z|LXh+J-_&zg6N8n;W+MuZ>;$|mT2nQ{+W*aNne=CljOt=fC9h}vpXf*^M6 zAS8k$U$5Wqea`2P$9ddN{?2)v+x>FC-7eRP;e5x3l-%nGaRL+b`X~N=#9%Y-l%Jqw zcWaZWrQyDA%ijXduXo+0v*GtBJs0P`E@+*(8ik47Qdj@=nT)gKb`{mfrHpHxL-N&# zZoWyf*7?_7#l|E+zNG1hW!rbU3-*>SR(B_SOiQH3Y^_zO!owcMkT>5nsG4_rI7O6u zQZ52eXFXdGuV7QWI(+TptVnP`|8H zea+0E2EUAoQiG^X69goSshsLiiGQ-qjk&NIq(DHG%Iigsso$2#-*k)1#x3&(WU^qB z=U6wo1+9zrP$M)qmVEA{=s!*PH2> z#KD5Q`}(Xaw%Q&36SMOhVBOf^2$|yVA8@n#=5%6m10=tm=OQeWupf>anC-u-SZz;6*F{1~C3Zy8 z$hW=O4*J#sHfnQ^@haOX$d6qK4v~Ynxr3Bx?>TWO$&FP=>ywqxcGH*x7r*cL-+Dme ze+>!@F+cabieeBas^;*WebejX!EX?<1OjiTQdn)YY!gRu-8Fpcm?;lI(nZKM?;ZA z4>k5FNr5tlIwWQ=FSQYkz@L}XU)4hbZ$0s8a z*cpILXKV#B6TZ;D6Dme{!#+Mm5+0qLuv?=auFI-ABJ5r6psIRVey0jRY|p1Wcg;rUBCpf!vv9SQ&Ls%4 z1GBIt(`rU+O#$Nj#7y0WX&1|_)Apxq)0Yp4zyR5Hxq%Z)88DkefEYo@L7V*9Bi&AD z=t|p=Ci`c}PiykLBK0gOs_SEejtB;-?)s5@f^QA3((Dxl3$@=rngwERSA`^h`u-{S z-BOS=5p}NrZ|nlQf!&#H?zGk!8IOv8$RA{Eqz4gtGzn~MERFGdDEmH_9TqJcHE?#D z9dLegjP9i24^@S0l@-xg`O-&|df$`1y-=Amp6JLNNhiS@c`TOBZiJwJ^6@*y`swSL^c-^O49Cxio=cfN=_kR zfu-#7XPC1LTqg+$ea?9U{++LmhBSmMy^y@?)pf#IjOk2^``JInb-G;tk*p~23z!)y zdGs-?aeuPW@X&omUMbS~F7TG2D%UEeM_Fc`6oxqPnk6_f95K9m2 z9|2u$&N%7LH!CxnGh~4YhI-!j#P~k^2fy=xg54}>G6K^6HK%7pDC700brbckF%r`5 zZ!V9Y=RY1{m-<0P?Tx&%>Xt+}IZfCMU1DwMuJ9G@t-Sr8++p*~uDL{)Un^@^?>ThMG1GU(*_-(er9tFP>l zc}D*7EEIvSmz0?r~s~LUg`~hjST-e;ikLG7=SUegR zl54N-^E<=|KtEd-{Jdu}Sd9h5Rocm5qVK}{wmyE+;LR!fKzeK^amDjaiP4?SzJWjQ zI0|A8|E*fvES{JN2${>mGYWrHFMempB=^=u9}5zk;l)GjeLC^}QaK(k>03Or z+QDX}swS~_kwqH@=cBp7N)#PdiXTxWhmWDFC2kTo{++?30E=J{ z>pdPVX}ar|<&dgRImkBmR{urS3kMMiI2$$kz$};58-KRFnL*?x+xhQB)N=@AS^eNh z`l*;aTgzxlhAJt^b0{&|U8p@|MkYO;_I5hMXktRM^vma=g4|kFIhKtNNN8XfWvIlW zk`9DntyH;gPLk4-=xXFoXkD_xPsqOsa|1;F#GaD#u3fJJL0zyMv&we>}*&bMN}YNq|Qos)j4r)z$E9`rh>(^o@bx^fuIzVk^KZ6X%)C;lZ5SeH+TT)^3{nBY3a1;T)lseVP# z1HP+?RCoV(I{Bp^Y2i=7b@-5384TNJ_m&(`c9AMbL@lHX4q+R|)d!zkpa2R&W*rLM zN71Ag_k7uz7#&e7jJYPZD6pvS_lDcgEMJ^TxZL<^NLg5{UU1Dy{uab zS>Fs~8yBnhc5v?V$G1YpKm8{{m1kes=D0Crs?HcKK26Gc)X<{~*PQbh*cj1Wd zThP&hEZ+eM*)+WUU8Bh`$8BDgGCIrvCg9pO@w9?F%V> zcc#px%g93%B4kR*Gb!OiS{$Uax;yMkBziY$&R(h|EigMxA35^Y)rv}f<^AXvk^F_# zbuYyN(FsK8f?@$W`FCE7Pg5(&yNl*-nuuev|(gw)o0@+VPqD=OnD6YnDgFw-zu4zQ3&+?EZWwK3a3v#fnAYn_xw%C}g6M zjWa0fBBmY0)bFTvcmbA_q@A>OP_k1I3`m7<9e5zkV28lal5)Ja zJ4s_gzZhCQi5RjRP~9)xZgA7!H#3|~7diaM(I=-*1|Q($sGhxCIa0qfc4lclK)A)R z&a1nqik{NCv<=X`S4BB>@vH~A?@m8C;UuNxWRAuiUZwQ*bC<7UaJ!80+W4X(z#uzT->b^X{&q);U?~V_$?*;BDZw2ir4{x^%a3 z)G)t^iUH1;Fp+c*Bc3u*=5Jh(cQUsaAx?|OMP{5~T+qAT^8F32xaH}!Aq9E1p!z1L zt{F3r*8yui&X40qJPmk4;V>(x{h9>w38=^z-x|toMCqk))I7NCfjpZ-fY!B5`l`3D zeLYFSu_tqC0nG`}Ydmfmsmu}0JpcST#b`p*@;LU2FytsF`u+7?*t++D`CSpoX;;LJ z=sl&l&g}|j()992R3n_>y%Z;R^?{2TTUtY{ZnsQH$+SsK*+ZvzLB` zyQfOm-5hfcIKbY!<)=Y*cs=SR;Eu;iogatm9MUO z66@slu64x+5A&`vG<{qno8B`=4rJ4*w1yr%1`n49C|AK-cG5!juLCF+y2c#|`)A8; zJc@^H+g0Z<1gaD@4F-wM^wMmGD#200_ii_i+UI7WPS1{(6_n*YZroyotU)p=lJMOf z5JI*gA<4-3b=|q#$j_-;aZd-5o-NCqyaNHT}1S62+KmV?$0b9NTP3&N@TaXc)r=twR!o5FcL-TV_ssl)*W$L25 zzQDB^ZIOx3r^kN3qUi(%Of}+Tk0%sa&Q*j+cF2@~Sd#Yhl)|P16Zvof$!0Ab@(f}O zqS6LbYj2u)=te9*To$I)sZZsF`tIzJW{>A}dWD`+x~jv3kG8-!zGSmHsayy^qQ%DT zK~C>#K!g0v_uNH8Mx0b6+JZWiKqRpTY51Q6+KSRtY^(sGL#!*SkG?;d+%)eJg3d$y zWGW#}1D`KK(uGMv+%AWa?EblKU@Jcn*D*V}mztBM4wrSU^9(=Tr;G5oyT;*E<@k;! zq>uSkwOOQJ)-ATqO#MD#JvzUxp?2KcvI1&GBc?`M>1qjjeIc*144;~%?+PW0yh;l% z|_%+d@-L%W_-Uh{}?sHxhw7G)Ds1=SZC>k;H*E|8eEYRS+m#3v6%hqb(poFRnShC zCndQ+K4BeqliHhwK!Tc+`%$8p4tQ3w4C(z-w{egVAlZ)jZTyG6K8H^){iF(@nIB&s zmJG}*la=Y58Hrd(77<;sf#-6P?&8mX!pET?{{6Cr86VB4`~Tbp5mFnU>X+G!>b+(E z8hG{Y9@m#0l{X0aMA!;{qWzrVZ1J4w27o6%Gd!i*iy6G!HU7Y(LV)MRB|d^>9FNp& zWtA03gsFF%tCaTq;3>K$ifVScYDAnV&@Z@bhXF&>g-X_6EWTKT|2ai`ZCHRTbH|Pb z0F4}ce=;})v30%P)*{s>13L_w$R0iZT0~g@EJjKsNT-&@AG!~M0d@m6%1C@$*PwTgtWR@QD`8J6GG=LhGCl3y5%0@6LcH}=9)$x#yX#XXp z@?#nmYku8t68Xhn?58+M>4o1B5>@q&#ejnVMT8@z%T@AsK9#po@{+^Az{lbyavMfI zE@kMDw6^^V7aS=5RaF)D4psB&n>+Xan++H_deG!v1$@s_r`+nLDpDJm?uiS zl85dI=a*LvCoEmrBYwLp6_DJBP6`MjV<*2p&$n0)W0`_Km5dwC=Km9keX^FLbPg$C zn4kt@fhC7T4p2}rrKfF?$SOCbuli|rKr=foAD-`l5LvlSaOt<+EyMlL z&9F46<$^mUog|;QWP-ne;%u;?&Loil3cnKFkI^YKI7aigm!o#Vd1qA(AzB}Lg$Tnx z%NSknOUM+R%9RkWikB=i4oxjDmzPW$G9g!-^*Sa}Hr_CaSdH{=&pG?NIa>q&k47y0 zKN>N2LnGAZI)vGX4{jI)?e$GY$i17?5Q-b&C*#e+3H?p|oX7@*`F20Ys~9MU{mU}y z*vzxFHLCB66Fi>o*Vv(!=HCQtnm4$5k{WXr`JKAy789Yx{n&lCTKX0fA5*IuACE}W zB7Rn9b;&>jp@vatdx-bVMK;)7gaWR3WW!TKceg`yBUj>OTWPz0mR5+hOZGU0HsIR_ ze=WJ!%3Ome<1X!}-VHhZtji6R*v_yhHh-DgYlC3NiCRCL9R4_kBofS#Md)w`*_wdd z4X^o0SO3-9mQxpsE>v1 zTRQWaK^W(9R`l>444eHWK`4Lj4AVF6!*$zf-h~e}e=%wNdn!t=A^bN`5G3_Ov;B2pT+0|1r@uRF&u zf-s3*`}Epp_AQ={f(bB)brVx3?m7zo=Tb~&2}vjn8RJf(?!e`c{&u?aM_g{UANG_% zb|_G9r0#otnUJc9-BSETm{%&>Awvuh#NiJl9Ki7Nev1t);Kw8vBrD1-9qX8`n7@u| zMt32Fhfy9m*2&8)U*%&Ms8nJXsJd~Z>N*n8%Pcq{t%zCeGWz57zd`vX;3f||)htUB zi}2RTcS?%4B4BTSx(-vxqS}ozswi6T17EAMI94|mxW@mPJI|C8 zEjmLDeLv>9e>c*0(U7EI@ZW!QPLC{!^}dR?)d=h9%X1!(n{PHZgG-}{%5J6 zCOQaR(V}YA%|bt|86gY;+(Y;KEA$??hi+UDFfaU3H{r|psV0gU>U*}1yZi6a&s?}V z&i&QtbcaKYRx}a)q&yBq#Zh5jCC7L@`|aIC%sL_g%5Gsw2nZhNRDEBNJBNXkIT}m1 zsgG(o6!{za+!HnNABpkOSt0t`V$16zfQ>c${+x8$?}u+ZTPrm0^E%n|bY1O9WzNcd zf9)<>SXkrS>GIpiInB%BqSc4g%Mj)My9#UixPhGq;r`@0E_M`m+A}0_;}s0l@r^|D zj%f(!#{Xtq$(f-@5?xy?D85i{;$Kvu{huJj{0l$}I~ilr!_b}NKxcl7`(Bcr}tEjs(8CSYbz;H|-2%)|wo(u#2ONDDx`O!s@Mi;rZ# zw}TS&1G(47iI#=6AaJVh!yAzx)lg)F_B~e-cy7fNx_w);y6M%>{OXyP zA`IbKy;z4F!82jEW*#+?_sxQ@G=k>xV8@K%pB94S**SU=Sv^AR^H(#TPQU%-PFR+-i&|I;@>k!u z8D>hl6?$EeWB+Y=h3f6Sn*~|bZX67cW%qmBq-jQ+LuMYyhh zV4&!>szH$4;b-^x3C4~?g$Ij2O#$iU_rUzcwcC{?`0UnAq;T>6)$qhmZ?z|u-OpiZ z8^3KO=9fYtt(Ptb7mTu@)(- zalB=zRomFQMP?U^7E6vdqW|LDo?#Pns@yrcb-+m8#f)uhTkuL zE~WBh;0zk1B;V07-kNW&0G@M7DUgb%pw${xcX;R>FTwE_ge<&*p9LgnJCw|vITIFp zpO4cnuqd&|bbgtHp!3>xVlwvU4p#z3wW?N%cRbgxLz|(?S>Sw|acE$O;u3qu?wpf- z51Y{T{Z8kXhV1J;#&7#uy@v0{!WC2&4>4hZd7P&i6b*_&N9}lR{sIBJ z`?dnE*VCDG`Nl$~f{%qZRaKRk%AWu!9yGkV^CfBK(MmB-_?-lC z$5=vK9of7}L)c%O?G)m=bKO>G5gAekgf4b%PWtVLH^sS@t>Aw`& zk4aY?3UjaFcwD3SFK@plcA3ULW~m-gVYhF6xeH>bsOnu9>=9%pG1xj?IrT^HEQeBr z^S$DYf02a2*zW1vX6_TI)Tt}JsQ#{%&Z9Uz1Tu3nv1y{H?6mj>re=a1msKz=4_S#D zrxokddGDqN?;-sAG6J7q0ZU&$D-jN7HEeFzG;MPnQH9CPzy9O6T3$$I+rkq`;qWkU zc4U$JL-m{Iw>DWmMaB3@@-#TsP<=HosCtln4LYKQV~09MdXI`8XYF-~+A5rv7kR;& zN6>)IkkZ|jWNae1zFO&cyDw2WnJW}>peB9<4Fx&23YREg8kOx`HEn4#y%KQMMThy2 z7Ty9fdf-4OZ}R<-&c@D=JVx*@Ss2~yztUu7|CN#K@89RHKY;iEXY%uwi8Wt2e(s0-wEm~PiNl*XIR^e1Xv zq&(%1P`8V%(`xet2qd}P8|aps50yh)Um?QE{e%*l_1};`R4s?;tCN!vW%kCTqBBCi z3-(6)P5xN{|M!;M&dBGT`8s@^ILJQU(-!|bqhWDLs8rky?HoRIP}Vm-n&~W=wM@D7wct2k%OIUKx){2ZAgX*r zZv}fL{~#|(C1&aD$@Zia-rnL6p^;B+754)wA*k+$w|%(U3JZ}Zj^>bv>p5S(eM?`) zPSn@KQq?HQ`6*>ocjhPMGHAC*7?lMzdy&7UZ}~P$f4}b)?>$SU^x}J#o%|A2HYq?8 z_@u;uD!BGE-4G7aFtK6|b0P%o2XK%IuEg2BXigX8GPQCkeoR78=Y2(fKzXAE>W@$P z>uLNo_`ZKaWinLoQOdV(j&@&v+%W3V2Uo5E?|;xQq)K8jw<8-AfJxJ z&+M+>5)DGPb!-hJdH4=on73ahu`F}A6Ir|d?FDzW!jA^+_(1zWXqvP*g1A|?A1a0r zIus5N@;5m&7HNI}<6v2CvffH4b;Y7Rqz- zMVYqJ_ttXN9WtIxLq#SN$v0ObRncT%2C=X?!b)ky_u@DC=;|hhqX} z{biG~Zxj2+bbC=B1zDY(fVwGmT_u;1a<1+^f-2BT!$w`Hzuq#v{ZUlWsV`XF8X>03 z{NvAQ<~g@|#osk>H7GP<+pSx|a0B6aKpi1#`S?d)rq5B8s!1N`LvhdcycRgVLd{D5 zCpHJj;jR$LHj)!U(|CNYCT^cB{~}=B?TVS;#QT||UbywTKJaEq-t3F|U+>`}f9PWi zI;SUq+0{oRDjx;(Sv8W`!or|F%>|gckT+n*IfnD|@hZEypf=$nuuG>&g6QCk9Pv}{ zyts%R!WQ0oa!{DDv1^hAFUg(mYQN^YI`E|Nkny$?jp>!-gjLoL1N3cHXxeN^J}n%5 zdkW9#z)A~gTxq24<_cUU9lXjYr*AY{6L;4h|L_-sCpvoZY?BBygOu=>6?q{o^!$06 znf)V$6aIJfOeUEh5Ea)X-s&Wh3%sAO>up)SyuQ0?X&SD-QPD`@lcUKEWs4KOm-TDw z0KZsGuRm#pqo&=jArlPrib;~bx4^} z9LbxeaVo!`3%++5pb_2m*jcsv({#$aJ`8ush!t$q~yV%3KwwgTYg<$Gj|>xx1L&cu5REXs(ItZf~?37ygajcR}d ztIITQW|+lM9nXGO3$b~`bs{!{eKmtSyjXG>9?(Ken^1qKx;@gNrHj6MRZ7Yuo_+oj zi^TUC`|EOm!rDU*s}KMfO50**nysLutejTgD)lqXNF6D#qlNoB@s|bHtQ)K}BgQ3b zCPWly8lIxZ9oSfMjhAhm|8#dIOP*K*6>*kn37ve9f$u9z2a0#}0>mweE z<3U`6xQcSsEHT&7zyD>Kz}pS@bIR3Or*LABIUUGg$Wq*TW&1^^77bR zIZ2_`Y3n8FD6ct8A06JiYR~uie$IX7p+Zm|@woi(kOLAuV)#KGxOcxDX00fK?iVjy z5=}^}(3t3ip6p`?$NNGocxbYO=NYmoCIKGh!RSfw_6tk>4MvU~eax`iR%SHw-k)Vv z6sg>k&@YsbXK$UHxJuAKVLXuA@SW>fy-5jiUH>8*W3b#lWq748c39efzHJfvy)PFFJ>WODIgwz-Mt&#Q8?^N8fd zG=fQ%u!ltN z*f*2#*-)m+^o<*WVneT_ElCct;IZP9lXi8~4Y&IWx|-MS`vvozSj(`g$@FCQ+>ir! zEkc8)BWP+ioes{wT4drhSWq?(C9WR61&>rtA4tx~igRF3vWe*4TompqqIZVMUrT|9 zRAcMf_;1URJh%Y{L|liC)Av(Qb7cgzsloh$SbJme?txW zNQYfv4F0{v{Nl9|4EATvFa~05a_m6wh-RF--0HYQh=iELkq0p?J7FzGqM~ROk z5x+9C_Uq0{ml|B`v!F1X>cI~cyq+W-F1|32oo>L2(niyDy* z@4+A0-*Rg0-ZQj&I`LxW>~lU@!EF;td!q;i{NN_CDL3F~#?D^LVEMw{oMlON&#t}1 z!bkqrjf?{_#-u2JVK{@N1uSr^n1fA+6`a{@K?gu+q}uvC%H4(jJkr)FrQ)Dq$=+lA zmXDIl)7-?%j;bs~=o2^}`nMfQWGrjoHSGuOcPoQ?A(^5jB_%79@3KODV|=I#hT2@W zPn8kytchi(ik#bgAH4F5`A3ViVGYhLCc(T1ngNZcBT{z52V+fE>lq!*)4p$}O;end zl|t3Z!N3`yCq}MDa_lEotW7OK)XLJLrhvoD+Nx^guJc<~svJrFl?LaYit6TfRd}Ol zV~eHV=FHT!B;kjCGY8T_c%b5)!r-T^(CMc{UFDWeEUjC8yTWggFZ zb8{|=1X@39U%697vi(ivqZt$8Ta%37dPH?&+LTiPihW@P0Y>v4-hKVsoyGQ`Z_0pauY%Doz$M?SCMW_&pEdplIJ!BrcORyW{cM8 z<@P`>Vox#8@fOx|bH)Cy1VT0T3A!ceHOuVdn^ray(}snkJ3A-c5`?9_G73rA-_-~? zS(Vq=n?B7v+G_TM>~?~o(|Whq2*V{)NWw zA}Ajp>c;~BzwDzY2AJ;JC*m~2t4@mw$Ga@Hh3aTlp58P<(pH>A@!Rn;Y!AhgbH{#! z>yy!q1F-Mj>2L*(cE28vJ$9%gE-fN16j>_oHDt;EfKWGBk6|rG*>9Fr#~7E;K4zk_ z_?;Tf*g3t;Yi*j>oGzo^J->q)kpbeP3G!M!Bfd{zd77};i<)pbo$QLZ?`q> z_I$IW6_F$PnSLxXX3V2*x$cL@K%fA5E8hrjM*yH?x#`79!byMVj`S-M&hJ?PsR^O` zT3_;St_pKy_e?DEkM^mJ$mlZR7|_3SCEnkdcoF#eIcYg+Dm-B*m4&}y?3@KwJY4Wp zG^iiQGX;HGUYF=DDSTx&4*$qowWGo1FLCEC-dX1e8|m&t{(^dF+Pf5}dS=MZc$@da?=ozC!se^nXfE|e=8m4v2kvzx))Lmyy|{iA5PoD1 z*Xwuvc1@W?#U|^JNVrljSU5aR_-^`idrx2{Sh5mfs&NeI>pIFGo1P9kyE8&XS9$hL^WkfP)KIJQ+Yfcc8_#RGL+^b2 zk*)5O@M`A{y9}=dS+4X@=4HoBx`ftWcP$!b&0flKeFa^Sceu~|^9q|!#kd~eW3M1L zdE1F^aXc6G9l6A%P5|VWyWRGupf$TVr_8CYuv9cs5jt&npw}>%%r}6k*grxOT=uVz zh*7uYo!)U^r$oh+$UyCXIi@VtHI$pPee<>~x&+-Ds{34(n%gWh&_CEZeF^e=NSU)8@Q1 zN&V1>^Dh)TIvV2t^!4AW_e&e2yEiVA+mdgk5#bdCkGnKz)`v#A3y1H1VB-R%$N=I| zt8qF?vU2{a#GQ}RH#ZX4#Rxf3Wko9s>sIf8x$U%88ybL-f+YSYQvETCaIuy&`QJwG zpMJ1R35}%(d~6L#?6fWMf?6*v;1t*jcEuHu>4)+8aYZX(0!7p9pMjTi-ZqUkXD#p~ z>ksoSS8DU81NDqquib+5nP1>r929RdaD`AwEXX2811gWK8h@FMg$|KeLGqqNYo7ko zp-EFo1l`z$@`$Kbu5$3;enL$$3UTCJvpy$g@qYi!->X`gH`+PZrCNxliVW=%lX3n1 zPKHC?eCZ?oa$SK^gC24#W>rnr^#=ku!inFxSN|LMz`Mt4ahXF#*jDYnwM%EcFY2@U z0wG)GpT7Lz$E9PRXJ2G=K2@p8lj-zG^CphMKXnx7ykzM)DzmBfTTOwLCNZwR8bsE=U_PM??LCxzD z%UL<0?S5aLm77M@(Ztf)!XihF)IB62$y+iN4^A()c~m2pENd~~%4_{ zx~jBsSIm^Z{9c#Y-hK9`vuuB|th~!6*w0dTxgbsG9_GD79bhqs^t0$BRY>KcYAh`$=r%g4GNZ+LdZiJpV>XqVVH=B<^#0tgEbi3#{Tz;O$9ku_oK zi&h$hf-J<7-O&Xl2Rlb~LDrl1rt7U~niQvk+`03V*O9~JAaJY>*n(^`&_4Vr`U_T?yhF1^-bM%O2iG#x<8AhOs>B~PrQC6--S(|4j;aKlM!CqOy=uuU@NT|@#Ub` zv{ipZq@bJgKevc)x&*NNjz`4!;7gqGRqzYzd)OYv(a?+Y{R0WF&YUA#=*iyUKA54n zby#e7DuB>=C5i$kLweQXlWmO?Pdok$xP@GdDW3hEeY==l_Cne9V5Y`mv%OwRKbBytGwh?Ch z8*fon1?fwod`DxWDy$imfzl5Hqs~W4f*VmT76O|_T%Yj6iz_ZBdEG> zkgQ;MUXnIbWnR7q{R@eps}Fxn<$Lm8y8*39h?9((G#(>snkNp{fK){<6HN_6tUE=e zxgiP;V-=OTAmz}t)Qu7yWEXDx*eYNH&0n0)4Y|6y41DirB?TAd*+(|$#`sNtI>>Na z+P4c09m)*1u!9i}ATQ&2kZYn^Vadu;^oodnt!2K{rnv9$nfP zjM7Iw$+A9b-Y`M{;itAY{`nH^aBHZGWKQF7jM+zi`^F0LPO5cyoiVRcm8n2g%1?$Y zLuOq-+>WK3I*MM{rl736nl5Z&t0~ByJKt~a1&(*bI{0m~S=0o}&%wVR{L&gpw1*Gq zlS!>BjsJ4p0#eXVM~qP~40>lj*QgouNF=}*n#O^;ct&B$@@ej)=!V*?9O?p zaJQxXnx{HrMIl#e&ObO+3v4QHathqA`_KufKGB1=^By$?PkyZ|s~Iz5Hg4nLirMGi zl>eAJR{m)Tu%=7RxW4kgyj5Ac2eiyAgaRC%WRM8AXwK#y@lA{eW9n2!Hk446{zPtA z6PnxdZtY@w`QKOFOz1m}-R+88Aq(;@>jkd=#~h6RA9I+$VGc9Y$HnY7Qw)!8wkK$B zNW=f~N!f3z8%yR*#d5j< zykQ^1PlU1^b$OOJP)IN&jPDT_0EZS6-q1kz>8;IPhZ??*16ye)*6M9`_fU2L%O}J` zl)m(fnw#LS#g2+ed1OU@Zq6iK1|=Yb~|`-1-b zXwg>TwOzD_6#6;}rxYZwH=|dP@u+eBY#~ek@`CuCBPThaYYd4tiyV-O!?auOl@$*^ zrldZpo^4SuF*PF=-4FF>(RYtWEO;2wObYOhZNRhoB@3RnNO;7r$Q3byR7whJnSsr4 zfLa!65*Ere*n~SFDRju6*|uYpt&Y zkBsLv%dpo%zm~RTe0Nq6=w@D^MOa=1z9H8{kkN-^@~t8esJL`}b~Tlbxm&_OCah|u z@`Sq+>iW=+M@{}2_xnrlrZK_=;X7C+XRL!E-(O?CQ4@7Xo4-u8DPXZUE>qbNIXi@( zvvn@7m@yM^*MYr&?Rg~5z4`pO1anu6Nt^2D3njoixlF2nY#wx(-_3BY)X${njIg4e@j26=J8d>_UL>FHa07vJXK;M&Y8IojxW? zx|*c9oaSbqJBn5d=G(Q`)1QEMZL9-+Ln_Uo8&8lrOZz>~UiMmU$N)_Xd|r~}KT=|x z<)qRk3zw?x8ts1o^3oe(F4~t3{6`BvyI>x?^Zg6bH%Ci_DF6peB4jgbR>W;K2f(a` zF?9I_1;C(3;Fu$XZs*1J#}l`cv2!Rq!Nx22bjSW`mYd&m23NE2fK`DbPR788FUyU> zT2Ad>#q+^0yYD)e2LOysAj>a0pH5~bVm(T)8MP$!uodaZL+RkAPUMxevgkPj$*X?U zc|)BQzz@}cF^B(sM(UwxO#Lfl_9JNV(KoE-BOa0JCgW2X@t=tEBVD^HIZLBlSJaeV zk*?~rw{qujLh>L*b@;!9GIoAwb*auL_9AJ+Z32gJpTb7vj ze(CcW+H2m0_2s4#BWe4L*za{|i$u0RJ!Y#Pp|0(V!T&TIA1Bkv0PGuUQ6}Myj)srL ztr-=B1zXCFP;T39vtxt$PqVJ7(Z_y{N&!n3%Gt2`G0@5(cB2C_k(|GRl8yme4c!2r znM=>$qY6}ePQ$_a=hukMQ-|sOEjqOHZkfW4Arz%DtE!()iWXz$Y>oGuesB%r2x<>LIzKB9vmo`i>h@tMs#5$&z1DN^~R zh<|PJ=3y{Tj`^cy+Y~vZPs6>gmfJuv2)tPp(Xt4v4Zsy8);D`7@?Nj z&!19-MtVio`0LVvC6lzdArX9() z-=DrALSlVw_qS7j40oF}9PS^v?04Fk$kD}_61>6yO+uRH zlhquN8e9?==y`jJeX5RhQe*Q_{~<$?OzOANbDb$)QS-mQR1}%J|K0iI_vUZ7=REU^ zB0RyRjIQgwbo)&oA74)gJ#Z0Ow#ot3HT82K0ETHP5f-&CNx5bkpOX~u(aZJJKIZ%Z z3~u)h|Ltkq%{*Tr9JpmyAW1*-uYQEIT$MN5GJ{}vIg9J8_Ok(%7Y&Qs=bshU?SHE{ zPjea$4C_6L_7hRBZ#{~#4UrDR5th7tz$gE#Xunx4UoUn-Jmf)FshhHP-?KheQZziK zr4KQA_<(eI$Bdi9>Kk(XRBmwHtA%iVNRl$x?sFm1uu#`4eKo7=Rd*6Yk=byRBm*k* zm@)lazs$XUVl<8<4rbVNbjuEjY|W6rno(xHiH?_)8r13j%?!7TL)~PRU4~f5q1!{G zdy1w*LF6HA!B(R3Qc&cepP&JH;g>N(y4~xJLiVuR0bjo#28>x=$|tWWem$Gsw#5dY ziAO%|rilA_vl1XPTmNvO|M#nxM5`?e`a7>|P1;rF$1)-(E=Rfy-;@hqX@uWrev=`j zJihg9YvnK@$ZVhIs5U@Lvb_~L#o{3+(|eQ;Zabetp|ZC?IQ+UOAS5KmPQKMs3DjK8 zPTe5n-_h@o?dk%=E{V8{-VqxcgRr4(e>*`i>)Dnwzl5`X-E-_Z?;MxA!$_Tm46~!^ zF1YT^Alm`ku(z-3^+~ukQn5S>u|BL1+s5vLEfyXsGcKuROL6vkoK=a+4IZRPr^1lp zoL`*bfX9DqmqzH$k(z!cv{G;#kUvL{wC@nsncm%pvEPWiJY%JM_&ALj_$nup-I!<0 zxQf8g(p4pb;Yuu;!_#q5lD<+ld33(<%f=@bM;gFneMd~uv5Bdw;;TvRJRXoxkXJXjHtnKdEMc2G@_{F+haM%hS9mKr2B%;oW zZB2V;`!^AGZSn#5(Si?MAhB3&I0DPowP<;U8I18iZD^ufANVu-(C6Y)VMoBjtM*=R(5bO$HJqA>$1?>oXTG@WS}nkRQR-e=;X?bn zm~Rs`VJ;f|>XL}~?_a1Qwe#Yi`nBGpAAY+e8{G<3yLOidT0E0Q8N&q&u9b zfDmB7sbH{19RI|gYPmSY(}r*U zO&|yG8{$Q()I$ew*m|nn<=%ppuM+@6sltqG7>IT1s)q)Lw&7FZ>xT;Tf}xoTvn+XJ zbood5o-@YHWX0>2G7}_Gzqx2kt2fIV0pG^1aSI5LdalA;{ff%&oomvNr#Tf}O7&}H#^VoLBIb~#r;DWB{|l)5_=A-Vj~c9i z?xt0r9i(kdnCCyq)@=vrV3mT-IukWGTBrEzjiC5Hj=(2}S7lerhxS1ohwY1vP^5I7 z-C~B4=?1!djD2n(&Ld73W83-yJTW4m%;;^^-LrPtf)keaT-gjBhtJ5Qg`d8046MGT zJqmUXK5r*nISw}>tp44r9?{$NuU0_$k4!+n?&8kuJCaEl+vzObt!f|(CkC_bAj@jR zQH7@`*=bro)Y~h^?7gzgUHR-;IrlpkI<^@1c%lW=An{UKT0q-Ry}~^EqsCLBzfWBa zZl7o^I(M{^pghl)i>b^ly88SC6bHKA+X@O6FP?w zVz6mt{qJ3^PP4&+%9FP<`h)D9h*|)Q$p2*N+a9=hF-fB;ZlOiHbWk331+!T?m~Hxf z)3D5Jaa~E^PhVh9XNSK*w5FTls^Fq8&b~q&%D3>LPGACM-IP{|n-ODz?+Hd4=;<2J zW!E=DjAYY{$0IeZjCTT-AYVeQQ`1#iK&fe?Jw#ck3>WDfVAO0(T;)SB@JRcAw3)2PRj zi*M!^r|ga=i!!w?)}h*4J5U>4?yYTjact)MdsAVon)&}9QD+_1zwdj$^PcCAooD}TXK|kEx$oC$^FJm%##z@N|G7)X}gpi9DY!>O}XfLJ#qmnLI3CvOCB$t4-LKNHXH1B z99v{|^yvF;x&xspU(Ge##h!2EZJ3WRr18@4V1z!ZmGkc-t+wyz z=C4hYJ=TWhn#xiduaV1`{Y)9-?OS+U|Mr0T+<+}j=7!VYV~>B|wb3chA@13Ok?eHK zbiRCF3M3j2Gioan<9mEM?8Fn&GQ)YBd~925r~OoAJ!KYk4}ZnZ4*C3h#|67msyBy& z4&`=Q_l5lm7%DYwS8dxA*pL-1{<{;`KBRKZm_OWi{X1);H?Df1>=S0|M{oY+)RtdD z_YfpSku17vypcO_h2izMHW$ZpdnKqVMQ(4iq=szvqS9uCim=*LOU?cnSmZ6GtSlLV zWpxQUF579-m-wnGv{jLd-oZubvwb<$abeNIhPc++p{71wm*T8YzU>07=fe5u(rfMW z93A#}A>e~bin`vYwWNEfs{27=dfJB{E6O}*wW9#BJat97+us4``@cwOz`!R$2du!4 zUGOEf!2Z**$Y-JnduQwaroo0HG@yz76tkJ{zsDRx$f+}4%&s;!1%8g+&D*GO)IO@K zZnt{B@UrK}^!tShnXx<~V=&B2mN1ow9d!4YEzzr|>cP*~MH#G<@;AVhrUdK-&B7g_ zRasup*SPF8dg1)?wov5ppQb&}k^e8j zO#ENQu=v0jl*Q<>7#?yA|8WKS2eLr%U~9mC$TpB;I398h><{NSIXfu>d11@>3c;v) zo!eg>;&rDM)6|{j2Yj6Eea_al(zZQjrGx}|^};d?(pNRfxO94cr_SQRbk~^~{XvP& zksMA%I#na1D1KPSTF0@QN#v1_MRdjN-M3MJ}>j z=*_#G>?B~^f|YSvncntzo*LRqI?9s&gM-ZOfq7aC=BjULRUgfF?VZf2Z*5by`Rv)= zs2=tBV0eByR|0?+d^K8X4dl~R{5{yI_u0Li9Ehq`#3A?^iCl6T@Ga#G0tC<|cOKqZgBYSXy`u?qLN z(@RUw&>^mVM}<>hYtE$<+18MShLr}y9iSvnLy7AMsxQ!N)I9DL_C{;T?j^dp^y7T9 zw#tT|gx8*E#pM%;yGU6#dB#y?r{eJvVO6^r?9f4L9jt&KGPUUZ^ACRqHuJF4*-p;| zbcr_}kb_Rr2*uhi=Hvz!Id3+~_T$$7xA_E6e>h|1Z#Ymwx^czpcu&;ruKCDoJ^{Zy zwqzPf!Z%QS=e;20xiq(PkTsZ9X8%%6AUf2*QJpH{8Oz_Vl-4H#td?(Ix&qFf36i>Y4Je*j@oc*uLe3E=t_15Dt>ACD zibeY=rBAEgE1MiYP1}>Tf^?lF1PpN9tR2k<*?kTkR>r4yv#la?{lu!7Y zdHSd@30E9H_Jjz_Y`##7JRqqww2D#ZlSQ^u(%9c2yj{fOwfh$<#j5;MQ~uu^^s>+x zTj94?5{;FhZTp(EF*ppwg7lCo2f$0EuQol#v#hw74%x()(GPVZ8{>s_< z0gW2SA}jj)z&9*uE>n9cuqPe5Ek0wuLd(sN`gv4CdE$u2z{JMW*U8O0eQbO5D~wex z)tt1^gc!wOC17#e<2S#1th(pqaUGpvZ?t-`(Q~Zda0PJ9ZoCvoWX&v^ zi9~D8#q|a16%x`n9N{s7Fm^ZJ_r6C*fgn@cL7da4)#KNZKb7(f;qNB`zg+V5VgTaMuq~8z|2syw?;Vf#2JjkH zf9RtrmXrGON0slW2B`yM+5O-_B)s3`|MOzz=TBv7+xJ{Gf4^19cSa}Y6SM|-e_0M~ z*5=~~i()TIjbq`X^Kjd?Q?N0q=&P%~I@Fn=>5GeTiPFH8!|P2hwW58JGjBbmd83ev zygRQK0i9=hkxNX~%lFJmSB|g4m9Y7eX?_&rdEOUb#+v?MkXCkiViqeqm9DpLUm9@5 z%?u7rF$&k^B8`96<@x3PH^RA)UtOdsc5QV^h&DCmm`?sfTYS6p3{# zfy}%3maA7AQ36bdZ4SRz8E$(bd|0xX8}g7dy&jU;gTovy8{Q)&2^s*$iM4U@2&j!# z(eCcS8l%)klGDe3x%9Pq-|1+VAjO2t4w+>?o4tZt7rYHZR6mc>n@aZk#&ri&m3L9TB+_Q-uW;mYUFL37HXuA@5r88m@w=V zHT=wMr*9^&SD{A{VgyvZ4)S7g?6!WW0ru*M%Ry|)-`P}bGvv*^cq!x$_d34xTHSXHl zLVDoys@!Ggg&&F~ReCgtna41z0uumz1&}$QV=|29d~^9G=@4P_G@EZ#wCUj3g&3kS z>Wz(scLT|cGY$3WaMklNqPcf`Cv67EFv%X@pyBqQm5mCiY_R}id zmtcyqGfynz`%-<*Cv(tju z!}Rbbe0Yl;@Kw>zuN06@umgBeB0y&TAmggM^ z;mE1yNIWo4A_*Z4^idq)bGEIfQAwm(4qg1+2^YiMZ=>$vuo{x0h2#O8(44!QmncNg z*#ckj{6w45+WpJFeeev-Dp#cbLM*A*qbzsQZX_wZ!AFS{7d~}51ifzIU+C_Tganpk z0!jq(f@lnrnW>nYTkkXo$(CJwa=tlzC9`qU3D?8C7lzD*73WB0GMK$yS%EhMing?` z+;s#__uudtJSbYIuWF`J{f3^1de1FJdwJ``@j}Nl|=`@j`M84pRqkSN;BXY^cbgsoin9HcoK8z}v3kIwUwMKkmmo zw#`uqeS^l=ims+vsphfR9hbp*2j-R4=&|3tG>8=uiBvGXcEcD}gwwEq- zG|`gzMnRYL^RL%A50Z-Rxm^aosR>dLFbG{zVdd;lsu#S^7?PpcW)TSV(fBRZ#sApb zC-3{`U}(R?=PNZ(kWOtX7@aNCFzbb!}M{hyGUp z#XkCu0}+{UvlYEEPaTJ6 ze!G402C*2ydXN+C6gfCLx&eepi&wW1+D1CevGSu0Y?Z z^FWEq$khOuDzLd@eJ$ZX_Gq0Dl#cGy)TTDoEzogm&B@I}-(jCmn$GG7RSHQ`v!z=G zSy8nlB#dc&b;eqKJZtpIv!T1dJhoD)hk|zVOImXB!4OMY^CXK7F{FUFdzg2t4iR4+eGH!ypqlZnfy^ zG!-K7^FCV}zGq@vymC^#?K0m#Wz=6X*;r(NMv;-&l&l(YSDdseIQbn+Zp|aa1IGXU z5TdCzzF}*35gLU<80ryTv}Wf;MDM?{9JB1ifbM-3wtTy&@JHkxI3B5fw(GqQJ-Lvz z`KKSVxvOm(zNL<32X!s}LFzcS_9LJO|J_jJG(KY@M;dQ)O54$pJsZ`c0?!}}%F?K7 zDRJvPFPQz>tea-#D*4yTq9Jjk&L`#cW2e}m$P|O`pPm8X<`ph%Sgx?#C#P5x)>P3G zhU8hI*t(}#^20yaG2Vx$%M+MoaD7?^X==MYaC9e==7p;iAood?H{U~>D7dFx&=*q= zi}SK$sDVfd0jz>vPA-}?Ff17j7bD11ZEU7NFF~KbkCb-$ zkx8?-_>A=HSX20S7l*Nb(=zcF8%L#+KV0$j+jUR>u)kCxCoQkocX)v>Fs|r?WCYQ* zM3o)s@&%3TY#=JqS?SHGQs=jd>M~GidLxo*jYkaCH>&kFbjzQP*$CyB%{Nn`Mc&VH zZ1ya3a)PK{$k4DkgpYk)Z!)_Ygu}G@iIrZI{*KVM!!9P}G*;5p#9@{~rDS#4Ny1;C zFRUguTn}Xa?Hx;dD_-sCPCw1 z5lBm|PQ@^%`BVnE1&=@uJeREKck& z(s#mvoY*h3*RLU<^F-QD<(#feslNtV+y+eRPvX;vnl$uV(#$aB*+oW5-Dj4qdvxOC z-k45xvE!GFLhg(T&+1^)JvotWunsZ7rLBZh%4TnHA>9hfCCKoAU~>0ixxDHi@3a0z zIohwWaelx#J0kU3lc!%H@gP5xoVsp_&kBe1d3Q%9W3Hg}yU^A44f9z@pr9MIR>Hsb zvKM}JacnhTI2A&!Vgq!#EC`ATJ;FvP8Ks%Xf0mB61UB_F-DuC6ee~bHQw#~)HZL;q zsgcNt|4{F6@Tyn-h5L{VMK}rm{{$Jv{ueSVJwS$xcNIVWoA_jYh%C@N1R9thq>wZZ zc!B2OIl2ezz>Fd3nh!U6Uyo~W3-pOE+!Frgtt9?bL?VVqjA&h?^qq}U((`qhn+1;X zB{jjKXSASeh0#D@tNRd-L`GRl-w#Wm7hzTn@dm= z=sr@Btjvbp+&||ne(2jPw2s9g^XXax+CS5w-4EmkLO53)`%>#kXW8%Z@EF+@{metR zMn+0%KXc{XmOM!8GUmL9v6vZDUKxW`=t@Fq*h=5qq)8ftEGWh#C;j<0rdVshQ&=}j zx!6u{CO*xSQePWY`GF&`*qS`x$YM`%TmJ?)W0U2BFIxZpKzV25$q(U*9(+xN{?nugQ7W1F7!?nme^?CNad9;ZrskHEio`0MGsgAQd;54IgA*!OL z!{cY|8<6Om`ONrjbLErhi%%c5hnH1CAfv`7d}-&^-du{8K*sK{ALP0l9W0D~Uq=3GQ=tpnsMW4!Ox*8>F{l}Oj|`!2_yr^i<4i&yT1 zzNns$^s4ofI)pfz@9#?ecDfoXn&({INGI>y9y|M62t@BQPiUJ=%)5$ykITJ2C*~64 zV|R~}l;1EF>8cT~Q^p4JZ-@G`WJNBsFb(Ji%)m7{MXlozW{Ta6Y~jsK99lKbee-$z9^ zM2y$xDC-<&SikfZO-CLRR@0VSyEGKNhrV#1wsmo-YfxNZ zc|Vchrv7Pvfm3BT{~2MG%jb-F7vYyQ3P@*AiQoGmJiIRU%?srUidj~+|pE%#$HAfd^EG7IX$B*hySZhaa?d>?r zrDZYm^?TmFe>m2Vp>Y5 zK#Yu}d3#iXB90q;D+}{F0WsDzK)%#1!!K768}nxtq0Jt&#>C^kf{0F7K<9-@Iw1}|@JX_oe z0ik?};6%H=MC*UxU2yM&Q0Lr6|MaGz3}l4ZQ5n>pHkHm{e8R=EELG@@B4I{t>4y>t zGtud-0~BO+Q#zlV~50W@P*;I@0VZ z{rv7JYEZU}i|CFw#u7E8TySh1qip-Dt}>!Aj>_u9{^GCUJ9Sp*2_|&A-_5k$BTA5V z<1VYcd0#Rsb0S^VyVWWHuvK}1o;8L(t>Bw-;UV5b*ofuuO__%V8c0)Tx&)j3HFl}- z-F@g|dmENVIXigr#6rii%rGXh6G-VssjFIyen)rzOWcbSh-fe=_KH$QP z6J}26mvQbRsswkDD4*xX^{~WIJ;Hm1!Zh1j4Pp1-83!KRP``-EZ!fC5wEzv=Kg75d z>7vHjUWW<>bQ4^w>7JIqiOyrZ6U@H)@P;ghxM~(U2O2bkyR;pjO0;?JNGVxdO;eH&_bmc8nQd$R^NkvCD# zKo&d}5vZ$;^4Sxw*}16(k=$&JGtPtsw_?BkCyHZrieT`{fOTN#i9O}9ot>R?U`G+) z0vdBysakneEY2$EhX7*{V&xB7aTpaqhNedOCmT|kY;U+5=T^S?9ZsVAE5r2E^fG9( z=)2&<=M{Rr3$uJ4_x`MI?{Ug5=NrmH<|A3hp-bM5bARmvPTNN|r6xvYaefowWt6xu zVRiZS*RyDK&Ekb%%5**ZmJPp^SqyTKw!_uL&kx^<)iY9PE>4xpD-)<`cumggTdOY` zR`jd*oc3P1iFl(eOC(#?uJny6>ye2t2$X9%7v`5Ot{!5C3+!0ek4*e; z#kK>bH1BAzm}C%c7qhc@f}mg!gT}UqN}wEt%=8F`uLZofafi&hHx*V$^VJ-sp+?^0 z*it1oNAlZGG)sI}yV-Ek8EIOhGAAedz8FG>ewgr1%#-1yC-4bQPQCgFtegD&106Kk zFv6Yw_HFOP=jD%LZ~N0>-m4r`6U?6N*iM+tZ&Xp<@lSqZi<>=E)jn%(S~nf)`25w=3PqL|y&q2}iLLP}21y*05{9;)dGTSO zm#yvSBV{lxuzn;UEv;hQ2auOkw!Sds_{h?$mTgsO@vmurvQ-aiZ3njaSIDSM7&oCk z(e4c2bdqF7T^NwoxN#HwLY8LU0T;{S?%K8C2nI$a9Bs&vG0GjZCJlfZqYG3d4<~p^ zyzdCL$a>mK;xgb(DVFk&iR+UEDZ6GZc5KEJL;>osk<8{IT{o2jfLv7Ub_C~(pV3~f zq~Uo|Vt=WXuGg!P5y3Hyx=>!tjvI)Ap#1mxFha2}O4y-_{VZhZE8ic?mRf`a(^*vf z8XAj_@?|hnwq9TRtkdzE1D0CEW+9#=@XG1G*w6>L>_O5E?m|}A^t>Le|Euek5 zb@rsowvQjzwhnRAm=~Zf5b*lz0f*xP7Z)CPx2>_bo9vv~GcafneLSzJkA<~$vl=QS zg4&*)wavxGSF$S$t>8#ETo2vuu(wQ4GLjxE!(y{Ma*7~N!dBySVwqx6d;YKlK|M~- zQ>N5-Qg_O=!t1biVX|RORRxr?e;rEQXEH8Z_ZK-Ef_Ux+vwHjUcVz+|XT8(y!)|bd z5cwMyvWtTge7)~waVl1ie{(%7!;XD>$09;~I@WU7iKmlCrbQS=7D%gs@oKYA$W6Q1 z-gp)4|Gw(xnj*U3FkpF8iW$-4#;|H8z2XP0myvZ3ZrOnD1UK%W{8y_HM~+(}AiK+j zaan*BJfL|z1oa8gU&Y9pS+yvz0{$6%`ufdJt{pfEHh%y-aRDx72b>T`^}4{)Wgm$e z3jcUQFEe#;iG+P*{>rlgzl(E|NngF6`tqWiBL?0A1ZCZV=bgTx>nQna&Mwsj^lRNd zl(gdS4ljMYD)4qJl&C{(J8i%hP@xU{-;MRw5ArJ5v+XOu3Q9%fH+z0r_9nY14akSU z!KZeH<)c@O&!sAZ^B%LqG6_TNBDmLTu}3d6i^vJtu9hhYNq!S)qSS}7zVdK*S%m*p zQpqA6kSl4$Y)UtPp6Od7I*-{L(jVsa*2e6_S9`9mzOB6hZMg+KhJmUxTLRX=jQ1q~ zB>0U6Jj7`WJ>tCO-w~Vs!mnB!9G|(}pwOm@E>`tEJBKPPsODv5u9SSDYz<92^|_n% z4hpEtMpbNi%~R=z3uQ8Q2c;6B?nP+s))ssH(CC})}r>2(896J)^Wi&eH@=NZNa^HPq7SJbWL^#b=8PfVqe}rjy%ivs)UB^zhgr=(gASSC45Pb^JG>LJk8Z%u|pstoEE5Kt?qx9o~rF zwZX#FX)ycSY&RPg#QHoc++IdNGIfa+LKA}(-wkQTPxPz(jRMSRfkEe4`4r#U71kF_ zUVK^-I*fUR7vlsJBiP0^dmIs7Ac-q6y3v~(K1LXf#N+;)_@;D}@8?td_9q;OXx6Ca zVIm?yrTpEj+xZdPhK3X6gVZoL*zA|-9=CbQr`BV$(siSDP7SfnV>FYWxL~6zN2%U> zDBt?jZ&lSRr99lmhix!3vxcMM&ov2Di9rouoo5QRE;_GnVQc}&6ZkWl0 z)uvr#0OYuI@ZkrB9GSN*O(!o%9RO! z9MBt~<2|Cc5KLkx6h{=O-EW=j12e{Smv}UOSkhcR_?oh#m_mZ3oUw3B9%L^hbDgm^ zc_yzfBo$t$wbZQ?y39Nd6%Z4osHVcpp#2{p@l@;qL;OFR1MK0E@#Lui(*t^ViXp@h zJP0EH%RLZ2WFG!Ir~1DK4Tgqco>dOdnYj9LTI<6<=|R@tB}3f1!Avc@oZXtMSI{|{ zO3su-F18N~ikRedU^}ehh__jbHE;Y!;XT8NjI|IYLUB(6G4bg{c%#YJy~ML>MEep< zBi>1Tchm}gNDU)nd|m36lKQU$nN5c~TXt_2tkN5wk+$_8Ui46jo9iM~{WFo9;{69= zR|vVcnw yFdF~dm8ir^E<&!*Z!mmuob=MSei%;1oU{AF)F5@VyjwV znO~qf!P4r%(RLqneM3#CH|?4gJsih`)1$M^~g4Jj8E3-3ms}kU2e)6FKjVD`RSrf-tQrL=v?G{)@eBACE585XpmNodP%+80xNK)#Ugaezh zw-GcutR8r=So+BN=BL?Yud+pTnVI#@1XO620mZS6oPMFTZuOzp9%1=Dj)ES z8|y{w7cDIpBOk-Ig<+u&>C|KM0cGZZkYPz7iSOyRcWv5l-f`A>y*AmH&3T9TksCt! zM(vx38sJey!%Ms3PWCylM4EScS^d)hKEHj#JFamCsOzh*^mLyah?d^VhJJex)b=rb z-q8CFMT^1&EF9U%zFh1BQ)Q2`f&_sYP% z>nm`>9iMcUZA}BChyMz%KoV?pR+JX>mif!O^U9T`WKI$Az15q-u|rxCpoqyEEBs;TV&i9S#4plmNe*to`BW&le~h>KI3!?<|#Pi}zbye*a&#nOMk ze2DqS=g+9FuBYF%YmNy&vn;fPcLk9VWp7h| z3_cIIencT?_>q9y%4_fZPZQU}+QBWDI)WOP!1s2q?w&CTb-BP*N2+P7h zK+q8aGs+iGpUgGT6rR)9ROrGfAyc$XaRt^r*BO}_LzPFO`Ujh_?|IX8&M{5=ijP!& zJ{omNQy8y3$<$Xh06K|}7qD|TDn?ImAG>P1pd$X}fS~NDV{(T4RFWiNK@I_)kN252 z@ns%UW#z$KJ~M_Mn9b?s-4Oru$RGBwIx8hPXwji~L1v(R%K3|}5O9p))ipZFV|KLu zw`A1YN5rSEadsE9s=|0LtI!@qqy7t$Y5H3RjAjza_+;7Y6Jr_h`~5`L3unAXULi)Q zD=MZU@vZmkgDs|bUambr(4XK{up2ysu_R`7T9V&?-QMB1S}%2#TPn zg!d&E3?&FkiJRR^+nuOcfW^8y@{L9@iH3dX!NZlIU_O`v8GoD}dUh&%6*|n9%)m&i z57U^Jl@eY0sZ~W5v(-er;^|P*iT6=z62HY2_z8o?+1?xX+|8WMygl11q3|WZG8lQ- z-ZE_yk3Eo)ufaU>AI+g? zdf)())JpShwDp5XlMtGHhk-Xny$gGfbF6qAzoWP9k#I2YloEs9OFxY9_j-6$WDo>R zyc4*gziBY&mVVr_Eia_RApO1KdEVjX%+PK7;g$-Q+aGTm<(^RWX}>3bcdIAR;PzDs z)0Pax7LPJ1Ken6*0I`uZsc^qml5Hpz2VAsod2KM9)<19}ZVFpr!LNJqK`z{n#uVKj zIXWA)Mv=6nZl;uz!`(6Slg>{{Az7|E1Pnf})5U;Iac7wJnlEi3;yj5d0btg?PTJJ z$fZ??U*HY)_fGh`t_`h!@D8i0ev;Wj13I)vwaVYOKd+K$G;`}ZTJL!bS(*SojklWIci0%)@~N*HVHVf?s0QK3{-~pKzb50i*SQUS*~WI|$HK{K=v)+nZVw4< zXW6}XP1GF}^cnX-H{eiG%B?<3Wj1I#Gh$K+8t$Zn$^U)Ek`pm+fE^qF?=w=k-wJ*K9EOMuIKWXSZgx({r8xVdq+QW&VSGNke` zO=Abxmhh%_)zzo^6uz(T3T13}J96(8SSzJyUeoHC6vkE3YsCwoJz+Tv4AiUSnbbNBF&zQT|I!=<$jB>Q*hNk{Ciu`WBGDb2n`^G!9nl>u%3m5+ z2Ub$QZyTVv#&0SgsaJIB_RZRMndi@&mO|> zk7v8drgF+j*UtXty9J}XG`Xet3nNC|F4u;iF#DvTUhQVc+p{LW-F$v~0m&5U;iY-S zbbEz1b+v<5H6XA3H3XQwT!z}9G0>%}(}lgN4TFIK`sGuEOuK4(@?Y-&i6ELM@5+i` z3{xN;*rAmhyf1JWv@_g6_Riz>j>qkX4h@gi!~gYF|IV&x$wxUlZPQ?9aT$@jUJkzw z5UMkh?<5+>{=T0@oSp=b!ia}0eZH9RyiE(JBpkbuo%`d~I*w1WH1Kvq$1g3r5%7M@ zuSgu~#6V`G?{;=wp`$*jE=kN>w>|;e6{rv;)NJgVM{D5#YW!|;j+D`bh|EQv!g50;N z)wGGhONKzE#YSbyspa*D$fDwarC<@DLm-UhSZK@7$1g{AhVrZC`3#RJ=wUaC-_=!+ z+HM2k-bglzg-yI27I*!35l0f|b$Jb>E6cO@gm{$N*m)`x5Xui?yj z-RJjD3yV^2XB4EIUOlsGtFSuu03DN=$sQF{b=3xzI}+}dDPx;8a^$_gjV6Y~j&;e) z|Q-0{;mF$e00d1GW-b~;F7-xX@U!|cT$1y;COeav%^#m4OxnB)yZ*0)8oG*wl{wUuAlKzH7xWZsOVVYVggt#gR z(MsR3te3sA09#tJbS-7A<1J2-EjE1Od_n!ubPZFnRhS&F_P|GHzm(L3)m2;)XfVLD zDNLeB>9ExjPYRj$B_*mfUomTIW)Ef#Nq%8f%0=K^b6M#TlH3CdtG!a($+;qc{ zP;*B0IV%%-*U}?9934w02lD($n&(JGKd!|xI@bmkw>c`tyA`XVnAFX~p)%X!;)$8x z_dARl@df?@VsOfaqVpH;5PPwTF`P7ql77EPyw_ia&xQPXntaM`@kNM^)z!^A{lu`R zv*g6vtmKJiG$o$-Btn;QK47)fX@Z-t<7UPD2&*=kkmUAnm|6c8RoHZ_ysAo@oSQ~y zlYHCrP@V>lm3>ghtBn2X=RASUaZR_=0cWM9xFH*%W9|=ttC&K|XfqKQ(wtbFx?5u8 zP=2FFd9=fonDZrux?H7Tyu=4#`o&}ZuL0n$Qk530p04X-AVK>yrJ%ZtW>$=>kmnNo zHNkvhKwGOkOkmDE*<4H3gppDGf#-_=Nn zGJcF<#IA0>Jc_TRKtR0=WID6*Xl~KLL`ircIqBnwqT}7?K!n}k(Mm;t8{iOZymNGp zO`v|}XK*A8g;}B_g5?RR7}%c9?O_(F^sWB*ci3*yY$SfvBP`Q7dClGxG=?T;}PG_w*)zGym{|cFu_c5TP7dll;`LOO~_t&Z`^ExW!%C+e;eitsbGhz2L ztjEt7Rj=^6>{8wPY`S!%I?N!cd~T2XLPV(=DMU=8C2Hmsiz0YQC0~#oI^E$u&0s1c zf9EAT;@<$+b9-3hI(qu%@^)?rDZXmep~4FG?W~sAsL{VA*6s+W8tx3PKZkq0wCfMT z4mlpBi5vRDv~0QGE(-i~8E)e=-#@zkCtoFZg690)m*c=PUf_;2z>F6WD!yg;bA*KL zs~lpf{|MoF1H6Il=vBH7%;90#2lJi?^0!@gx4+llE;;Vj%F_6)m_Iqu%SF=8njX29 zt&<=^{%kg=%U&OvMafJ(+-nl#*{7!GKd@+4FjMg)x*C=fTS*5vf&anWlJL2Obhg(a zJm;^qdJS7LfkV@(#uP(vYOff2vCW&(~S-o4E`sWGzCXZFX ztCQ;V)YkC}3iakoLD|I85~H@&oH)Fs?_MPP=U<@%G{=6~zM1>DiFDQEtF~In*C>y$ zwx)TPrie}zKl|Gyrk2@l9TE7KJg!D%Np{;4j`b0lMjyxDnoo)iU2{QC{|A{U{Vy_E zen2L&t&yq!4SW(m9RJBDUOW^<{u}lreZVFE=_yDtFJ$ayOEqKly&*XBaF@7W9p#j9 zHb1yJ?#m$&UAay|mWz^jZwcb6l%o{9_??GqWX<2NR1|+So!;!PJ=-XdRqF)Y3wito z+@%*dM^+P^+z+(t4{D>?=KBK7gHe`?GhsTiKi85Ylti(c`x;}UZXL9%>s+)863m}W z+syDF+6-+b0j3?nh8@@9atD7hQIGtc$HJAr6^Q5#_m3gKmyLIq-oJSE;^eyVk|8{x zMK5oFb~~Bl<+&z+zdy^1=#FH@uuQIRl+AVx9v^HLUT)37ripO2aUB#v^K)m@cSO8z=@^0E6_oAMK(Kv70Rar9V;K7{Yz!s<-iCxsfpoxtpq#jg7x)@0PW zJCudU7z^tKmrv^Kc6zN6Nf%K|!Vf)|HUg?Xj+ zEhFo2r_SbL$}-+8W(xe!TSM9{mt}=FyZ!tZXlRJ+CAWo0l#6 zF%4b9?_K(O7jF1)Co#3NYw7HeMkn@ha=6=9TVRV zs`G;VGa5g~JpVL}B_A~GRVA}^&HCBTf_Oc<5tksywKc@-6H8eP%<1zxkO3{J5I{E5 zdFc}aYB4!wQ2JiKB>mA(a`<>02l99@K{5WRW+H2iuZ8C;_;Z^=l8|zpeizZgc8S}d z^7IjrDX#1{FX&{%n>3AYS->axe0v!wYDYy*tUlIBvhEo))~H1|L1Tts(XTY;Sh@{*31^jICC;PUIct{se$1QqT z1h2S3KD;@(=TgJOH2y>VUW`Gfj#oa;dM3rdw=TzvFGKVqf)270#)-JjUJs^?TZbCq zM^xRfMpOs@mQErVey&|6xEXW_j|y@Y(N#~+`V#pWQ@RgZhx#&jWQp5=w(m)qhy0}u zfe1FNySc6N*6WL{yZu}3QgE=U61MwrkYCio5ABx#cqGZj6Q z8SHOs3N>!NJeg>ihXkIP;1mUUF{sfoy%|1knvwZNwY{uT;5s5qi5B^o8~F_D0xayW z_bWZRLTkC3ue#xWP9MLjJOXQU75BM6VI6%0IW6-=>#M`CIPWVv@fuHXZ?G+RW%&h8 z!pb6|Ha&W)0xW%g;McbAPA>4}c9LcX5+LOR^-|nffgn2obtbC}y%B@QM315KsFR$B znWFU8trsNAlF_s>1)aZjyvlS$9bLeW#LRCz16+}l)bjMxIl@vC@zLGtFWFyXO#vV$ z(+M#pIk;F6{s}JuS0Gbsj@^pBB%2QJf~dIP1#NX^zqC*HD*AwjgZu00=FDd#8dR(* zx?DAL`_KcRxyHMX(Lu}jU*Tfa@6?7aOoIc=El5`ey%7OZ9cRj$c~ z&%?m;7qh%bpcoG>>|l~!*cUW|UyeDs<=`i@ohA<-tu<7)`$@i;&Ut*i0^8m20DJY! zQbQQwAO>OqeJt5;2NPqr%7?(4tg)jGAHnIQ6Obz+z-*^2_jCIiQkny~McM5&jA!x$ zivZNKQh;%|zjAG8--|99r~Fp~^|lu+ZD*Kq@ix;bPgi~4Zbp^G{L)b5-gDpTnByft}BuWmlXXyhWs zz{nVHb2!yR_n5tJoqkawZ}BFJ-vXQt|NXuY<;@wgU9WY_y=um4h;^BLpmy@}CMxYX zC&2bB^w;~ZZ1%a7q)fM#+TtO|!9o6vn35XDzA}3?{i>%}m#R{h5#| z&`fb!nW=ltjq6XJfKF3W1uZIdyFsw=n-%I=J#H~H;?^Jdx`d7K3MOw)%{M0MH`>-+ zZO~ZLBLS$s)=|L=e;08Fi6)uVBa#<%#`S`jU044o@~`5y5RZNz*|ZLzb2bbbJUw61 zI2N4=)j%H6Jb08Pc1~_^F78cl1NztVC3BG!O4%YrvBQY=g>g6 z>CiWIJfs2xW<@KvowPZOVVny$c^)dKf36!p+vp-?njCCfQY-)bDqp$q*t`T8FY#j( z&3}k~F$*k|2&FJfw{%mTT4zbUGScE>n55*(2JJVOR6TjW#}tIhY4gQ??Abi(jVq%+ z%k<5xy<3r!+rCMYQn~eb-ACtFjWjY$3|7A`YTd;j;>uT za(zNnp(Fe+zN4{6UGoy>xAW6uibp$jt;t4jZa#**A|0~(5y{7+&a`u|a^!%1yU}(R ztX+Y`!YVyFS*17QmH}YCMg5ZEIm{6GQ9*a1L`o{$(Mb8B@2!C%*j!`VCI1QkcF?~3 z^WW<-8h>SoNbgFF{Gbc*3HC{US(#TAdZ=Q`yQ@Cx6M(X_UThcWF_Gh@CPwPGK*-ZT zwD>~vq&Fx{LlwPUZuy%2|VktaFQyGDoU?w zwaZ>?G2of=qjHVRI`UH|shsc}smrW=ZUXIl9xU5m18Om8rQY}zfaz^AmDRw6x*IP< zx*`DyAjB(O^^q7ZE~A`itT(ki5_v%KwaSL>pPf}qwGEuS zS{Z0P2fXz&5Vo2&}b4u*#>dn0Q4z$@R;|Im$LEqrNxs!%yl ze~6|y?mU60yOH|EYhJCz>sV55cb)e_=hboZsf^8gt;$fm^Z@$0(lTPu0FM0M?&H}!Xum|17zqflzgJRQi1rx-*DrRNy~ z;sIjYetmo~|Bqsqj+)qXbaTHLkq3Joq)@k!cUzi&GMidlUJ>BgcS) zS1onQAljILTCG6K2-MyU)*(?ABUIV_^!)YfL>Om>MZ?&xzB&X`FZl7Xv%0QCX zE{kJfnzhN*`kAD;0~d*uR&#FV^Jhf}bT81#?>WOaiAJrqz$1s$EO)fjqwz*D>gHQN zl~*3z@l(F;oG_L8KlT+#4a_WL{fz{IxeUt(%hr+2m^khwp6g6jLj z9NJ9n;7bkiIW}=UtsBRV5-}pw&)0m5=W>T0o;cKZNd;^x3^nKRk4K(Z+4C(;sX8Or ziJ1Pa7DE4h?w+IxXL*H_a}~qGw&qrLVaVGtF-_BDGB|tdBZ2v9!C)yJ_Z+o`-28&i~s~!Vl$3gA$q_keF&}K%& zBhwZ^iN!y|j##&Jwj35AR+LrQ@A{R{G&s#~*}(QpS%J1LE8`E;o0SK|!%*A3$+gtx zGHQL6dBM~`sDy46s*$XUd12+=pX3ez>>Q3-nyiR^T+|1d;0Z;-rRG)>Q6?OjY@GBk zB&dMAtqzWBcxtDC{n;`pvV;sOcRO?s5obWLajhhE_Q|75`E* zNr|-Vf9pjHC1EGH77Krczyd|f65O7UmiKDdlQ9-JW8Z9s7bzvBgOt2;fPP##&EK>a zh<8Ls4G5?Grc#@N=F`^{q$T#+y*jwa;a&qZ@FKxeXk+9^%=a`*hF@GCPJCw_P>b7sV@TaCg&C+>C>P*|Xa0dxfNULR zZgu>JY~3VdPDR!(O_MC}doez=W`M;4mb;1<)C8A3WwD^0OVgBi5`Z=fX4~($Z`|c# zkE`)T#`tf=Hh^xjQ^Rf{&kuzs_DX> znJ7$;RUe3It;OXySCRRV+gH`fUDE% zk1vP;Klm;$_HP#u^Te`GZnh7CJDkz4b2w1+ zjrE@jP>k(G$nt+<2B@iAW=1#4mW9EAGb9jP(UKs!~WjQ4VlG-8P5cLgqPqJ0D9 z`&@ogybi*{&gqfRHOj+vUAI0xvGG^WTs&kXXFKB&2ZlLOHtcl+)?Zb<7Xhv8;sN?#Lwk%57Ww*hRME#Pyy)lZ?NtB%@Nvb zmY$!j?qu1fYSt@Y)L)p>^(7Wx`-o}W#Qc4&0`Opzytty{jl%Gzh-MT?CVSS_bHH>P z^HvQp43vCPo*Gcw0WG{gVHO_V-*&)7 zYi9gS@8Acbrkqs+(VRB^)L)J}MzvY}Bz51hTt;C&$Rp_DEy1ldIH~bI$aKMN zh#;&%>&RMGo*l8?(Awid=cP7)AYo#(5EKr*oju&U=|(<(@(3qaV4&U}Z0351+J?5~ z#w5{B^Efp8%+UpLHPa{f#2wJtu(^GQ z0%t)WNP=kPbh)4k1h)5hKTlq4H?8&opiu;*Otp!ZSUD@Tzhz_pQ-}N@5E$2Vy$qbB zH089xR@Bg2#@>ybwO6MlUbs?U%osw5nrUP35VM!4wAYqi*>64<&Ddo7gIwvQzu^(C z5LSq>)%;Aqc~}+RoF{g*l1s@+ks4|^zdl{MO!w1vp_N#19bYX;5m2PEjfuBOEZwk_ z87Z^(j2gTNRIqb9yKRgun@+dXy7jwibiG>Zcku(w+yH_9W{hEfe?#{mhOCWHKRKFi zxP|)lSf%L*pOTzTZ$JZ%ADLEQjefHY6;cZtbKGj0lCefGH%jp2tpDO>zx(#qjj0v* z7JCW2^KWjg6nFvv?9Fz;vD+2f4Yd`hN5m7)Bc}r^X1R%2@?w=41OCflqH; zy8|`G;%`@7Zi9UM(KWJStrpvp-!o|hPYicb8-EV^j#7694wX+X#-Kj5VcOa>YUK@UK#)Hho{H5CE{dwbjCsgA)CK2DP&96sdVR@ft zw`w^R$+j*96JPf)(tc)1q4?A*d{>KUT~T&x9MTOyHIgWco6X+%7WkaXEIJ0LIR3O9 zFuZEbF<86QGqG9lUQ#cA^skzsO+q1R-ue8OdQ`kDt(E{1p>wIrj5~+~$qTxvJKGma z6!!FcZ|6~lDyL&3X+8^HU;JuBl`ZeI`aN5Q@(ake;(wD3;$NwBxZZqO95{yz4Lxum zRs7g>r=EB3&4W2dP|z|2f{m;ubVq=Qh~@4-9qB1?R)8Dv-OTQY)s!Dfdy^@jBx7zZ zqK38`Zp~TvTZ+9qn%<)U6u^d!p3;J&3k6?ze15RwwR|U?NHH$tN`r^E8o*$Ja~Ez2 zPdPKWdLcyo2G?bX8Rt$=MSywQq3*MD6@j*Itku6ag|ZSf>p5QMPn#V?V)*?;pu275 zex|<)zm~p?tGk;4gST=nfGS&G#d3zhE(aD84YaHR*v$raGHRlI#N`70?o06Q$kI@c znCg$kPv|&j!|n@f7w-5)$o9=`#sQ+cjW*~O@X#Gw`79$d&}WU7sl9CS#rxq#FASc3 z5cs%0`qTn}%*qjvZ;T zvin(jm%-c)c%fD{6gPae>XFVwIdb&5jz6G6$FD9jhaykDo&(Hhz+eiCRjlWf$4{`M zN%$f^9~5H)fLxsm;mk>ltQ;?c2$Baha@@P$?$Gp7uNr>F6gm}9JZ4+()OCibce415 zm?;r;hX_62ZkjwE9cw_y$lzzEOJGHs0%bhwtUzo}7ZN)r3`d+oef5QErjUbzSz#c^ zK>%c_U6+<`ef<(Xyoad`m_M~s5Pv#G{EHpoVbsW9+{eJ#8{^FIVX!4O1@i7k>%!IG zUaHlVEhf2Oz zz!7p^_tVV-2TA}Q#V;t92U26}VfvB7FRbYFHid2;kl>=?chg@BiaE>t=_^hF(6bQL zP2@y9K5xXX_h*bYoW{g(!F3urKat(=hA0kwvdB5f&qh>Q?8VKnT@m>=<`ENp;=6-t z_Zc5ts1JR|HF%TU)4Ry==DS|i1?AT_Pn|k{;O0pomT^`j_}N~ywCE)U4cs5Kza3fj z=rvQt^@=@2Y>K_f0(5rWN(8=?eqEWV;6=Fa=z?2Rhw4Sd>C(d8*SMn z3Mxz(%!XNDpq(C_ABl<8b@DFuW>}qJ>-{SMO`*SAfBrsAl;pi<`^88}+B^K^{;~cP zk$l;q-<@oS$c~=84R#Arg++ew&6>}HCx9$*jBD!LXgm|J=q=s1(4KF*7v6v%+2))a zTf{*?+<@;eGchUcFWiuq4FNaD%%L=e<$e^AYSjO9PH(dQnvv6Z>VlSPrr;^REBRwn z%j|e*$j5)(zGVEG#W2zvpkZrz=NKA4C8krGbfkEv5=zb=8pXC!%Hn)tE8D;d_$A}* zaKBTnV9Bd)FWOM4n**7}QRj+0pVQ|P*dwAyxQY65cf_HrYZMzKtZzo`<)SG01OLEs zscPVTn5DGj*qXf%)0B>isIA~*yhZK?Zl(T4*m=RL0>5~}eWs3`wM9RIOys16?{V5{ z{+FGf3mP*|D$Dc{L9pM$aGY>Lb$Ub~|A z$Ap3E3U8xfeZq}XzuA{>nuue4F}mJ(O*#t2r*|gX#|cK{Ld1?0$ch!5&Qz z(~_#c*Cg3Z-5eGRw*XeL#6n6o=&(7Z8OFkdICQ(>w^vE~jPI;O>-di`Iq8P&m6Ma@ zqj2Qbx8n8IctIM$F%w3ZJd)DKG7w>ye~Pho4rts2rK$jS^C!NoOysPT|u{G+zYgEUzfZ&J!h*iCyer4?3S}WUzHb;kN=~rY+?h6rQ06=cw z71H*RdN$~%Kqm45B8WvU5Z=0;!C|*W9i%vOrfWSuEB}1rZPIGHo*DDhJNTD~m&p-- znrp2B_|>EIej@m%2o6&GnaXI+s6Vjh2XdVMdVNxK5qg7-3wBDhn_k)z(f?%m#G^!W zbU;}92^jSNW9yu&_-O8TkvJ^fR{trd?;KHo1RtQA?`214gT-S)??-?v>p&b{c(+E1 zLQv0uyWoEFz_^ls{x&>JLL)e}$(JR(0n*C>udtWVOV`hzgk;h41n+@pX z=HZDJ#R1@;uq&pQ;oMipwr$Lh;sXMW?yA2?{>BGTq;-%`QQ(eqgW|sr-(6g9Uzy&+ zIsv%tmFNov8}oGpSmEvM_pqYHf;<7b{ZzZx?5B1X>qxq|Oy`0(I*EU->o4iLM~H6a z_)An$y#sJl3t#a@nkN`=#LkA>@{sPA+oMwyGlRxGB3?$-dS} zOjO5X?^z}I1V3Q*hpA18kj;`O4lSSLOT~wHHV!|}tMBa%Wcm4%+pRj@^)kujC$^2) z_N2>&oo#T1=qG#q><+K=*f=Cxy~NLUiKi|jqTCTau=Fr>wO&__2wWsz_EzJk{5^@x zG9=?hIGeDg?;?BTuCx53J|7;d8LGWfcBE=)QUJ0I8GkzsK|5Gr1 z(HQ(4q}1^f%ViP9u0_J8IdENV;_+VfYsWRj;gQ2+Z`Ug4ca{udq&utJ48-{G*nxG? z?k8S!-EJP`7yA+M#+3hce0Kg{GO==>Oz;*h$bjjj1gS7k~1G0?k#kC5_80>B7$JjT;Aw|HlrC4U74 zhW3aLJc*n}N>t3kxrXunrpnEK>97HgZ_E14dI~$_zpj^;g+~X#NXI4MmY3ZQf#$;w z&Sd5dw4t{E4@rE9P={uiYVd1kyJQ?H1ZYZaiOzXU>Td90wePN|Y%gcYfAzEK_X zhi(uL{Xb5rF+no}4ivn&W}Q|5`S6!KU$+c>l>F~mn5=Ab(!4#P0teLB0jSaGWb@vd zIe>l|NA&ogpC1lxY?lh<=9{vL{ZC>`>b8G^%9pppUe>O9GA{>uF3H^dn87>VSPRV; zy4~`=RtV&TUp}v`$@UBo$d^Sn{TM-j42XD|Jr`v-#R$Xj+^G1^{~6(N5*W8S63XR# z0VOD!WCd=ouj+yycS9`G$7%!egEq$K+*?p(3e;@&pD7Wr2`|y zA9}q6riujyl2MR;BF6)IuQg`qA;ky2WMWKWbI0HG9N=-%qmkhl`N`++FB9#g(=kLd z@=xxR;5>|BvEr(RR|Yom$)*%2J1xrY@CddT%_S%9y^%+~ojN;~N!zWnL^{Fygf*WyLezO9t0-%hO6AAzNeW4WVhKlA#2FOROdxCkp@iVvnd zB(Y2-cG^7+SF^ERRJBhHVl5#1+6pR(e;jKu?FiiR!gou$hOkt|D%2gw4+CnG^;uRJ zXdLW)@W5whpmO~VD(DBpG{d8-0Hi0-^P>iKpop4+#HcAmli0H%d(%q>J^ZQ6XfU}w z{$;N9)l=c!6C0HcdG{{Pj_kYjtRD%sT34i2--kH7LKqs3#@}qbp|B%n>&jq34WPd{%hTE8xK-fiM z?Nv2^DGIY{L={RM)YqMm@7%xW_C@rxbpbz?kikrOdYt;u3PL#$Jo>y}duC8zy?Hzq5T+>iMI! zU5U)ucgyk{3+K$loy=jA_WQJ=w5$;S((7TrL*Uq}%l$xnfTF-rps@&RGb(1a?AT=+ zt}U6MVN0PEsbq462RL_P!vDaQ&GdcRjHH@@C>Uu0zlo+XdXVpIjO^oB&j-~_jhEoF zuHJKB$uUOPa6C{jwbk?z)^vUi)_@KZbmI^`X@$Amk}##xM!RDUy%rpw^8*sp zB;xu8jy3Pd0y6qbcsLbV7sxsgyM739Ktx@JmJVi{%gL}Lt|JXSLz9P@EwQbsV(K{6 zuPFYfgOOt<)n3D`s?R)MTfH$kp>}kKFJelsFQkCVY`OKNT0$$P26WV`1`oawg|Er~ z#*L!I&*4rk;Bb=XF^~P-!T2kbeZ*HIij!6CBYKZ1u0=bg%$nYcgzDXEpYv_ZiTl+G z=Jz>Q^`%IxY0B`eceoip*F7HTl}pM#)brF_;&Q0ZErCgXbAWubb=>a8BX!#0qG{7> zK6b}s*GWjuUiGt1)UqSf%<|>$Dk*8ut9Nz65iSnrcUpp&)Up-X?B;24@ohF3(ZkN> z7Q416RL7FH-2jD?Ie}{R$=0Oj)_OY-B8T)r*uO#k%TNYXyc>p{-5w@{C^|iEosE@< zQl29z3;EmBP;TP!k~Nq8tXwfsw#3YVtm7wROJlHgyQ7FC)wKH$y~8-Vzt$9*9~2bt zCyr_U$_Rc(adHy4;v{3wXNs@IhnzTOjlBtv8Qz*unvtu=Nj~4^5AD7F%*h0)AfIL{ z;aC5ioL2Yu9ZoMc2GLM`TejK$QMJ?Ua_c9<>}_rBR69z!Z3X5v?!`V#ZYU^=E+^cc z9?B$N(nMh)e@JajvvSv`NW|-gc76I?pMNn3$*plpt>#bOq&MGR*qB$`dLg0m%)S3p zOx8dH$eRfi;BSOw0`ISpd_n^AtApJsSg*{$a&YHt+tuOBp)dQk`R$4UH9*(k=H_Sw z=nWnd@{~^69zh;B5u{pR!75LLD1kOrLunBQbAi0Gj9>$y-@j&Fqu;Jge~jWg4Rl6y z^i0Y}i`ZRlUgPD7@Mn4yUKUEGTOE5AQ4Ty-=Ew|V--r}y#yjT%FcovC;mmTC;|y;O zeZ?CEX_7nz;Iu%h1$cgryTt+SRfVA(Oohy>hRA+;E5YL(NoQoXq(o)f(ty>py#_ z81&ph=@w0l?UCtt;4Wqc=mmUo!>vfdCX;`JHL1xq!?ganmA%C@o8mmcnQ0%!1`ofu zT3c>uQGnv@xKn%O8SXirt#Cx_7$}I22@63dgKHJ+U3m|S=9fx)kRCpU377$#)Mu4uG!p% z8i5Y}skNzO*gF8&`#saUP8x$}53wnC=727>`O*h&vTIP*ReRjtkc{$;;*sWUQtcjgycis>Jt=Jp;$+8pU_YZQ3 zbNFApo`~7OHs{w8XHGxwNiLzQ-KMOSr-S=zShb1`SsWktW?Y2RAy?1ohTe=Xe{pq} zZg`^>Ki{{gn@q8FX=vrKm9p2bODeaz@z)MezWwmsMTI?i$C5mz(D&WzdNN*Q07&Ub zx=t62A3waZ#=^k$P<$=rc3?T0n>j-s?Q;#`62|+=_x@~UW#>9fd}aDqLu~aZLgZ(m zXv_``+a;5ef&jJL9KMG_%n$C$Mk8+XTbfA^rRq1E>!t{cQBE1!aqj>ZCdlZAp&JeV zFr6tYO~Dj+u1hW(h%~AFi4_su%637-W4V3)XFeY~d{j=W9M2R1d%3`mMTl&CBcfTl z&yVi0x^J1OgWl+ZH85Fm_svD^%fEf{8LJD$19zB1Hj#<0u`q8(p!@MKcr`6aN&QbO zSK#m^1~2Q;^Ps*mWyG`CO4`io*b50@iyu3z5btZoz^({?7WmHTd$ZEyxnxzCm|aP@ z$zQmvDClgCD7vdtB>tilF2dOD9zDs zaBtc?#pOk7-^z%ev8e{iwHcWW68LCx071D6A7_kSdCMb6xL$ys;D0BI)q1c9)k|;9 zpry@*ol5Wkz6{x|&naAN!Wl2le3-B}?S2bB1b-b${ibEkN4bYR0xW@dk##k}I2y)735&s3k@i^uX(8ZAu>}Y9-hayTbRh zN==uasMdlVJL}lWRxQae16FBlBe@yjgpa@6rlpDKZK$10eLHD5Akp^C;g3OmB2wa! zeq9=a^;oCVJ^Y|n)y`8A?@KPxayl#{(oJyQWiHs(`P@Tzs;>_&YH$%2>g^tr;@$JI z7<9L=J@5>;q?jTV7yj6tgT&l#Zp&+~zjtM$79}ZdofA*uhF@`%YGO-dm~(oJR6acr z4RB{2#Rjl@fk~gRXQXMyM<2|oV>&NU!Om>Ny*aTcw6?4RbAbeu09+O@{q;D7#g&*5iD3viN_9}K*ML{kN@gCs5t?9JiAv7!2lfrwIcZ*+Ivn54z z5d34c@K}H!P_~Ies{y3les$~Vle}pjun8#JrnfO9zgpR?_mo>0lysb0Y|VI@Nee!U z{j2gxK~C6Yh>~dSeLV*@f*Vzv{lt6f6loJ{h}TV9G^Wq zUmtJBET45vI*Z7phyU}y9W43T67_sJdsA*o_Le=#t|hQg$!M_D*-&;JvQgsxE zXj6Sk2`+?uq)pcr*_Kn=J&}zKqE2*P=mFpvciTT69Nuw19bXaFHmj=VSd5YWsf*c4 zZ&hvpjf7D#`H1b8eCvspV;++gD7uDJ!?{!DVEplOG}Y4*EAKC+A2!%1DYqI3@LIvH zN2uVAWBnwSYp!+}jtkQuGGBCIYL8hRDK=2(R*A1z|!S^ zd@c_i2X+V_pHZ zm)*Z~jVMBx?w%T|xNegayw~%Zen3raL(!?x=Yzcd+aZS+m0gnLxO!&4Uy>wGO2v(l znsw>#bgmSSMiC`V}ix!TcdtQRVewxBhR-fAGT(a#*6(un!E3| zoRdBwX)jt@2a*1+K5mDi0Y>Bgu?@%+bcVu17`zffVild~>=H|P6dzN7b2Dm?IO^fz#>jRM^hG!!F$f56KL)yj#i`o#T$>`_HRZ+Zw{B?%IG-gf= zmUO(5=tF6u!zJGUZyx%>wUBIAh09jkpW5cUV9bu2WG zo@elm(=2XmNBg7%h>W9^o7*ulmNj2aPv(cwSMAaG$kr~PAi35GEv?~cGg0EGZOh0h*vuus74y<0=y2q>Sue6s4RZ%qpf5m3$^N|l%@=L9THSjkPROb`c8;GZO zcd2mXG75MFCkdS`*C~P*-znBR`&P4C8fl6ZUm4d|er!H@7G~XWtLr}8-on+v;~A5o zsMTfNE#AzY!KOcRd99Ji(N#ulb@nJ+Mk{8dH^j}Z;#I@mIbo&M?fqHW$g4?jtkmX@ z(j3=??MM)5js$fGP6NZx=B7jvOY-qAfUlm5fSAXwcP)>w%p=BZK|oj1d`cn(7u0P} z42|}4^jyFGa1^p!S8aQ;oo+K3rGXy&ZB>PGLv0oma|_m2*6kjgg@vc&>$YT#&c}SH zOOm2Qp6d&EI#w0VN!@n5v?;FjXdEt`Sjo;dWqV*tyZlLkhR0Jg3T87F60f}B-2M3^ zlCIj^6|+par6obEeb68U4Fp01TTRiJr9RThc_$pxqB~j9NoCHOC-jRGswzW<_I&zN zQkvLSZD`&;tRX5SxD+Sy)7rhE+gTO+L`SpqU=C)Hi78>hNf66<`@-q3#=whDmPn#d z3<>3w7Zx}~I@{32GTL@u*vpsFFOCz=QBhV>)@*onagw?Y^LwvwsOFJs ztGw7eHr}7Gmzw!o)RMs9G|%-UWYU;8c5SU125xH$q&!)$`X+$Q5)Fjy^}A4rZavi2 z*>)@t{e69)MOK<<;Hh=@GC9Eiy8WQ&_G&Ke@A>RSCP6sOH*t8|)H@PVQbE?pl=FCF zwLicAo*R^$HoW)$9_rd!9AedIvM@92&fLaEADJ>FmM18ELivlr?ZowaWc@ZClLY7B zLlK0P>(~HBWwK{d z>u{NIu09NcOTlT=>uPh&0zHiWy-$XH34~2c99hpU-C(h9u)R!yE9OrxI(E=cQyLF- zFn0hY#v|t7Bih?$D)QI=gx1e%pg;k!#ehO==;R-)*p z&vK)yBlS0Svl{6BhI2uI#kU?aK2M)YgyUV`BistDh>Za+Ajc4M;SpcG7~-z2sa(g`#?chRySUoET@7!D*j~?b z2Oc=jwd&6Ku8A=RD|L;(J9QK|-rk8jx1$XC;4#{N zj4Sa~FypZJ4~;@2|0N7!SRg4MZxygpf=#E^^O0bbpz^K%To?9Mr*AxKN_uPIAds1k zZUtS=xki#-8~n(>KqZ{%ls)2~P+XJ_mf?GwlQW2dee=S%uxbIA@aHc)t1(sOqIP#h zqKY5mUzV##>jv6`E3baxr@t?w(XDt>=LHQlWN`k5EYj<)m2=p2`VcY6^V1}CajKJQ zpGlKDcTe6=kDn+_GH;rlFIS^>`Xkp2)vb}`%ke4SzF)e$F_mSE-|~|Y6@OW)gZZlN z$&B@qR25%2wi#ZZ%DIilieOibVkd%QwU>Gd=h8Oktsur|^Wg&8x#p4{M$) z{5vWIc^qBa^YE<~P1)iqB=HKq!;A{wnC|NU2VWyWM$=(R*)l?5y5X5{`kL9fC;=c8m;UNI7-@Kk?TGdak$exMu3>-W9VF{5# zB(M4_mBm^7;~`BhdLE0-c>AMGq7g}RR5?VkimUxu?;AMBaArQ3PS7=!A8Hf*t7$Ci zGrN^n=&*iZdMwdfmH{(P7N5ikF?+HAffP3_G2P<$aCry#ShA-?_P)q@LAtEzg280m zpBc&Z$@<}P3AxjwHM-W-lj$miYzMN>8M`!vor}jJ()oW#O86b8%T4>YmKy5@#GkNR zy?Rjlw!Ch73c(XS zfdG=%wC}PVsrV!RWE{kN7+0n-5J|<00Fvrhni=jo&e3Xyf3|4 zCpP^d@2?t+-3)IR$DoPMWzo};P`<&(_R8M7ciRJXJC3~_n$^2w?xDf&+(WL2jP^6* z*9(4p_GiT$ST&{rt4}uHq5o)g5xz3QSx@g4I?fz=toa5{EjHw)=&LFg-nOwLHwS;X{CpAUTRcQZTNV7_yGtv{kNof2L?pAKjw&=)Ub-{XN(yCO zW$Z;)hZ`Em8DI;$>1P(=vf77$d&X?tzqc-~C}-5BQ@v0!qMVUed!6(2=ata6@2GgO z6ka{nM$dD)I&V}gRlOk!RiC6KaG+n?u)=Ye0i{BnM%tb$SYofXkc7oXCu zhouXPJq=4Tln%%{8v^HNewYl^Ywlm($;n0+792m)szQiRFnFU(FGi5IAc1>?4%^*O zwpFcvl4_Y=t%EYAk-{vXF36+>eEVps)+>8uVSjP4yoxJVqJm&T!Kl(qA1zxQl=M%6B^o@z|0N4VH7{0pkVZaVK~c>EzyI@S04=p~9J~Ha=6UmepvS3#<`9gW7(n^91yTbcV=I`IwTbGjkWYub zt8wz*1;1?cz7-@gvIx4l%Q?A6j3qKcPj-5FqvYI|)|->~w#BD#I_ zU4O0NpOgk=(BF{HY#k2@HV{Wat27LS`t~rA>Mj1>w?(RM%AR7|_7a;QwvxJCpz%zB z{og{n`RzA5AGPye0%Kzu^zSvpoUial9?IWp-O_wGDxlzI8*U(Gy0ET!_{A(*CTki% zV3xt}^ZIohD*7ciDb5$N}&9x#4zED%tn?O$EG zlwJ#4UfrYrkX|zdRNIRhy`T@bcGFCi7N3AUzj)7EWS{9|TI)ErUFsCCZ=6WK2U;Y^ z;Lv*K=U}HcXl?vh3|syP`)CbWx0`av$Xdg5$ih}L$f7>j6IVbbUOZ<~fh+))2U=N% zNxb=+qMSKWEl<$oXvDz!I?5OIX2nR%~wDayN=ap6I(dPjaXKl^>%j{W^o zKEjyy1+K*d!>iw*n2(oNB%lA`XG-*LU}5F0tx-RYC!a}Z@SI}Y_OdUqd;OPni+fkY zHogn%t9Z7~|%bhri^Y-vD8fv9L$R`)y_nPig_S<{~2h~7$xf)077etTAMhl5H+bH&L& z*t*LY6{o7_(q2vxVBDT5rOigU7Rh+wLO)-4y;bk zaF+)vERW6+F-^a%61ljagVv;rH++Np9!{5o9$}qb$O=b9&329&g8@3s=GNz!ilNEJA_b4R!)#^c0pfoo{Jeef%6AR_Y%z1CIe8}4{q0A@!$88=P)Ago> zmtRha*kYZnBlIAAwC-yjb>I!|-o@k`m%9u7YnGXX?aGDvx~d%Anfl=7Y{U#Kg+GsZ z?H#BPM|{G0olx{adEfu;G$f_&Lx}$}GXLG*ad=>oO!t6?|1=<|?j;>h?n#+^_b~+3 z{U_G@I}MiZ9)8#f_!P%?0G>B0@~a%Ge%Sx?WTCyBA2=tX|0<^BtG4NQ>?G`z`6Ft+ zWxVYY{L9-rl}hkg4*Fc&9gTbSz8z9?d@h4I=(>x?@H55kGs$>>TCSkCT;ZG1n78sN z$ARg-gd}tNgOJhqG2J_>Mrz;8=*F$GACC{yd(!x4d`Dp)%3+w7?^>f3#pfRsV<4b0 z!9nPVwI2g5p>9sVSER%QmiY^-#_1JzP~|rbYk8rgc*;8rp^`Fu!_rT_EU1UIH#ha2 z@Nr}{*UMc=fbdz?Z02)O86M)c*pW-{&nLPMT5CiEG@g}cwOx(g5M9~$p04^YCb%iM2%nFAtgl-tPupfu!iX}#$4ydbc?HI;iEKZw}N#0$}ZC7+?+^B&ip`>y5Dr;Ar zu^p^IuI83F_yQ0nWd$$U`*fr3>8KJ~JF>Cyi8pyXl6YWF!Gw|^<_Se}$%BY{SrYe4 zB|OSgR3+R%VH$O1;mdZmnX(0@mYE1Pa$Hbf(uVrJWV4YHg&NiE8cn1+Ylzt|NiR7B zy-UN; zETU@r=u$!cii!yEkq%%WTCdTw z>xA(T%lkdbax~+}BP;dZa@0oIUrL5tDIBsise!FV+5m|&A;hy~elvjlQZRb3+-XIb z5rW`;M}1rM$(&j`dOiN>U4k)NrESW?Z_obnOj|G@O*K7qBzT8qg(4QhkF~HioF(Rm zg1XJ>^zlYI6AmfHEfF4fSl|4Is{#&YW)A1wdjAM|B_Apcvg8op9%TWT270x>(mlR; zc(M5#lwR(v73V9|thn8HUh|Uv@0YiD<9W~L-)T@Q#hhey47QeQt%3aWOl|0P z2v){y|DQz7lCl4Ki>J#|>@}?Er1=e0x|Yv0%iu_Ezlv{6rrC@foV@N93`g5jU&u`( z0-Ro@r$18|;UBWyIjd#JFdiBm$AVi)GKFOVA~ZKcVsKfCoEKmU`+uB~TdU*Sl3a$4 zAEL;c&7PU0pWW_|(TdjJIBjl8T*!i)6+1Sw6hjX6%=pi?=t&wEquDdN#_1g{#~Ce1 z2IYF)YD=^udxa*Zw)@&BUOuiXj_Xw@bf75xcZK-!^ojm$o$Bew%SJq>)US3ALjaW( zc0t;2IPoCc1tUR&EI`WJ)PORT+bs_J2U56@zHnQ*XC5iYdYng2q@wu6O4wc7_m#f} zVGY&;n(FTlBroH&R#eI83u#F$NBi9g`$Yq+`snt! z(@ED)XJK<^>}RP_Z3uhb={{r95|gb~T_-r4w$97c$xy;d;mGw{ZAXdkphE@xU>aV|e%26s%;P%hRYX%L9n00)hRC@9n zoDpptx)^}vU3)igGGA3bx4X6%NOmP>M<1hQO>J$-KMJTMyo`vB~%F3+sz! z(rrrI8$Bxh-mJJ3Vv%||_I#2T*&@ZRO{kNL1Hf!;1QRBH1zxPG?N^o3Unxy|+rlkF ztoMk?w^B~>Ni9O`r@J|Fna>|^P<$9K?hxu4TQPD`$3?_$ZVN2uFisNY}$ zX_8vUpyV%4z&mQ>7nnJqY20yG^%r!)AiF`JI};($p(B2IXfBg`cyYInv37-Hha{s+ zABh^4$^>s-)}>={6j}3DALOQLjJujoZ+%dh9Yve?YtZP+1uNvyet@D`DZNaC+9>Qc zk~XPkbexk?WhGiUjLzX6jWaH9m&a<^H=Au7m0e1IP-@}!!92Rq@XCgnXlv^HZ z?76-XfbbfdIiJx$RO%wRuBUUNdC#0VoQ;gjA2U=nL8U8$Ki^0WQhesSKdKw~WmISEi)WaXA^LafI_zvSwJGpnBO%yp};74xC_Ni9m- zJ^cQz3-t2vfbzQ_-4x_eEWlMwl=Hli;#u;+Rhz-&kg*<>Xwpf4%MRhoo=4q{<89Q> z(wSa-&nm!c1c~p)Q-G~1#Pk#CJRe6E+~j+l!AQLy9lc@6+9l#MA_@B?`IWrm%8HHk zX$YMm>;l@5Eb~Rb!qTnf1J~x~U3sU9e7NtjcHMpN?jwhc-o!(-CM-yhTzZ&ccJ6G) zi~|$!jB5$9(`jI|xltg^H-HEea(db*#Cbj)U4_UN?+X-dacLM|K(q@n-^lwzl0>1c zi^o{E=B6~`eMa-(kxyw{=>qcMp2H1rLupN%gQhU*5y4Y(VhFMbb8E1|NxwY?Lu^f{p)_jgDTvAC}%iMt-yS2$mS=>O{BOxB1a& zO#_q`PgU!GI5a5xrLLeeE6Dw~90C%hFQr~{tW7V9Y^9&_2o&bKR{l~_$t4+{S>&%( za4L&cN4+EfYIOmyd+zD=13u+HIXqZ-M4 zjQL$2Z8dtscZ)@x4Ie@c7Um(6wXr*Q7q|P4+rzeoG?izlz1AKIzN@gX4~mdV*K`mZ zLs@1DB%d&Hj{0{7XHIt6oP(gymtVZAPlqpWY+d2D5>>v|c=(bD*9#Ev3LpsBg?w=? zju=sR`g#z!IeJ13u-Dlc$r`?tyO{z&-KZmebkJhdR1c_*t+%XTrx9`|56xM5s>Ld* zdUAKRA5gw?xRTi=-hZ-qow6XOkhgfhKl8&5lw*dQ91H>b?qc(Qm#QpC2<_*x0FcHX z+IaAg;p64vyR%Om&ZfGmgib2{*Y#~e(n~3vKAb~8D8Bv)JP;J=kVaK0n_2>&X^o+ zVZqP0ILCws|3lPSM>YAze}A-qfFO#9fFdESQqn01N~d%q(m8SiDG?B9X{5V528eVF z35hWpM%Sn@wmthk&+|LKbDy*L_d2_G?(2QMKd+Y|6Xxb#E$ZC$d$-&d<;V}{&wj#~ zPexC_6pm}F=7ptEbN-|OFHSusRh3Zxk!m6Fex=8?^>0zeWQ+-o30k0Lote#_GiFFqu%1h~xi3_2o&6*bhbg2v*ttgAfv>jG9CHU#59-oLH!kaEHiI&U; z&mz3nW)-NE&mLD(ocq;~LFArrMm!*o&;yg8x>=&6xA#Gb?(!;=Im9*l$3K>AMwT*x zn|HyJpE8cb+=@}2(+*F0QYKc^6$Q;8)_8bN$xNf11$x((wrrW`tr~5k3yO~fzg@~B zv?tERxaCwI3^`>c5|h7VShYdH+jZy+5v<%V^?!vg(TC^ZY-nV!&Rjrlv#D#n-?>-> zq4(}juw(Lm`8eF=&gNH=I$LXrl?P68%9L&_^i-Xw2ZK1 z!_cm_BmdfYv*OW-ZK9a@FIo=n9vh1R_Of8pClfgn?P@KW)zyplm7v2j76b(%W8416 zSau~T8T4MAG|tnN`X_MJOVQ;Lx^0+r9AsW*p{%p+d!_hk@(=+1)=Qe~yM5O!lXs(nFvS+ptSH)f5 zIWU#Yx8a0;t^*znavtz}-PKl%dOn3`A=u7rOxZ{7d135kUoUrX+NS)bULEOG4zzCT-fvM>iU6Y2k+6Rr41*sL}G zW!88+({~0Ox<_nz%z?Nznw37gkRyDt+r6pH-;3{i=HOu(8OS)xb>(;)aDxd(@Xk4n z*;zh$jh($*r#~zZ#2uT7l-=2Uz-(Fb+jZMNdX2}_VYOY2OnZ7u6KWO>UHrWNO~MZ~ zPg%?;q-#RjV0=mDq_+7(G(qme9%4Um3tMuFGS8wkTS#!^RU{3NU;?o0#Pa3aKZ^ZR zfwSYzn*MI1kkDhxq-S_FYKpiEdmS_ zmrw?qw>P2tAY;(&!r9*oS13R`-iQnI495ME579YKC(k+m=5B9!^ zUSaLfteMNKc!#35^|9*cID@nd@naxxgZMOV`a$6kbHOaXzP8Z^(7A3f_VyB3LuvP{ zhxnF^0VPS7^H27#VDks5*tZ4KJ2}VLD8i>|NdhLc4Q?mza^V}Zsj@qP$Ds1}3@hyj%XhSgQpNZDgPwm79bX}BF=351L+ z&?{1Lqj)!{CRI#Y^ulxANlc>FA-Be@M)V4ESpnaAk$wnQ&(%m9FGB741%Y%Y7)HDK zkanm3kidpc>4_GZo!Kg@njk9sp0TLU8~yeI>Whrje|yVVKl)v4?&}_t*i)XHcG~NF z{S)#2$^)}p)x6)Zg2)-g)VqPYX<&FTpa%c+)dyr?@7c@Edt4D8cH(0roH9Be;=!Gr zxTNKXLz>Dq)2x;6i!DE*?mroxy(!P#;yG^`;bG%%V6vTv77D8kszS)%T{8=%DTBaC z`Ga=vk7c)BO^2@+xttqUpF7-X?R(n^= zBXB9pVXZ4(q)gX#WLR@VDrU+!B#339~Lm59BX`uAFHCAX)}Ir~fT z$VEWSjibxFb9kYhMM$WNg6k;lNqF887}esKo>0cOkp2;vG1ugN`!Ve=$6@`Las%&u z3Xy0g4d6U)1ZE z2e(YVG3h~1-8W3seA({^%e$R3e?L#$m)cm6LBMV|a|eH+H80r>9c-z?-)6z3TPTkr z-?oO-&)emgqW|)ydS}w1YcNe6H3#?T5aAPKqMt<{y;=D~g_4dsq;XfAGa?Q>4PtR{p-~;AY1}~ zL-tWD%|=M1=PSlkbpnt>O6hu9A4gT;YG{sV`a;3y#nYg`?B4y;Owt;wBw8X)lb`Hi z18aC`{mRP(*yN(s?|K`Q-ECDD)Yok*=(Kp|XgiR)OR_m2?vy_+qO0x0S2$b6K_H)1 zI!*a|LKa!Z5jP9NtkD6;$3}PvMBgP#Vn~I_)z1sL*Dc>|^sTV)!yEy{PE+oLMu$T| zuFE%9=S>S~DzwN)Q3)Xr>g$g#+Ax?1!YX&r0`XDL)O?aKOu~o#f)*;fsCJ+Fj_SBd1?J6^NE$6Z8~=N9jT6XB@*gc($$4=969%K8`OrapR-eOpW_wS< z-a^`FojsMiP$W@x{RH|f=w^35bNTvqkP^9>>3zJIKprSNBC{n8PxA2+hn!I!*D}RX zMfrabDn1`N%t!yxyGE)#-y`Gh8399I;41DueZL2NUqRCBW1q?-9 zd$b0p96#%Qa*qb!XDUm>dpy$ArDD%;=-WpEq;&kX(C2dtoh)_DRxjS?1T*xLriADy zEgxmn-|9TV#=lMx<~f;nJ%bwV*BtUMZ@-nb`ehz^Q3-lD_Q^%v1Q0}Mg_b7o`SwSX zjOeW7mwI_Ua}MF_w#HAJTk%|cAuwxO#;e{TCC|1{i(r1D_)wF!>;92 zMrvc7b1u08Tmx=9b%KM}n2kpiI{?7+an3TWp`m8=)!yFn))aKN%C(i~ZX_1dUP~F^ z>ck~*--wGlMMt z+Wg3>R^Ku5wg`MYRd(TdyYy_u_n5!_#`tJJ{y;|!N#)1{J1ktEiX~ML8zr6^R|L!&TU3+Kc zUZ@%o)$9^e!hL6x&Nohv=oUCL%udGNUCMgHCzIwe*S~L)rXZbrp}UBQ#cF3MhB}?x z!;|88Vz?MvEZYxaRo&MnssYB4xl;tJ_*Tk^ZX`iSKN znE_Ng0atHd#b>8iP~H3S@T}quOQ2%ouWw(eP=_m=7H3y2s!eB-Wv%zQdwSd9$JRC8 zALepz*!GGd-Pb(7htU@-$IQeB1tdrf(zsooHeBHliR~TwPs}@%8Y0HbvRa3T`Gd99V z5FxZLFIn76d6MsmzkNdeh%ETL?*8oJ*5UB5yJU>b+~7Z|l2U6r=b^8eM>X7kd_Aa3+_5!Ll`;x ztA>9pq=uDawWB#4mzNN$a_rJURSJ{?lzBU$z4o&U5R%$ah3gx0X`aTaAa_c@B z3`g18AtfX-E|L_*BvpM2rfUj^)ymmmp(kH-!YZ$Ns9L=MAO{iK{smKm2(0YuOuU@U?>@zmLUTB{%h!h^{!jr-LRTVftJ(|moKEfeJ=c> zqv@Oe?X|hJ+7i3?IE7;=NwZ{@N%xX~XvYGqCM9l*Xdjv{N)MnP6Euf3Wp9Wo1LdB2 z1i@uRV!Vb^1rVf`e#Tk!P-)H4~O#T zRX_XsDpc+;b}h>ZLUy5~fE*Vo0+V=mcVroBX)LKqCrkzfj+Yv;GQZjH@%MdX2_urI zOmdM|r%M>X;AWf~?n``5C^##`UARmrGY)@Ji_Df8Tk0H{9e=f3qD#|nG8c)izJq3x z2hvD4z8In`33`(S!MSrJa=CN?Tzz$dVCGS+s`kFpjk4ch zFZ-_|!3&dIP3dLP*$k$4)yjmJ(f%@X2frrzj?>!8M`&uDrjp)|vkw_%$S%IA9JB+}!xUv`;A-)DqZzXyK}LE79=9~{@2%`x zSi#!*G^wv#t@`Y`Obt_yuSEP_%CSsd>BP*}t;TWUo34{E(0L=sf+T-V`gV!#PIC5AJ6LcwSrE1*G+NnT5yxN<@{K%AQi!!3 z@u=XAVc?QCTd%cm|S3~+tiNV zJ{8J(|M~U<@8YhL8*%o68abuJ6L8IB|58$u9iUDNyg4BY4KRF@l(iXt7rz(kx&P6Z zyNZ?Dbev<3g3TXN5MU`c@8r$Oy)(vTc>bn^qEwGM6Xk`=EWjqZY32iYj9aa#_*BE>WX&*yQ|u_a0F>PadCF(jgR~!y za!DD!<>K?#?y_2fB8nU^l3Xs?=}4^5i$c7rXl`H*;;^>yl_1F#6Wl z-ix8dE9~osf?lEACt|r~i^2Up=>CK2*(k)3h3n2XK(4`jzxuq*u5IZ@25>Dy@hgZj zys&Rdv#~?lFDZA0{pn|!Ipd|h6+iHZi?_9fM&lnL^9UiqviZ$H9&AiGXNpYMw6Nyr z{*L=P`|)_Cr1M-odx-Nldz(u>vHAGt+Al*V462O-*cmB_#Ej-u+-y7?yZ| zH=}RDjJzQ)@xk)+X=~t7(*2chiVk<9>M&au*s=_~QN@`E5&5ZR6ipLx_~xGP6J<=| z&{FoT^=C5{y-hLF4%W-)(F$iUn9$fZ7qlm;5fe`p7+}fK)$-YG`*ivutxd4`p`34W z*3^&+JBK7dOuLL-ziC~sl`66(yec87Ve+HIQS(m7%I zbojc$u3{XLR)RkwY-n-OAA-DlF#MXK6S>8*?qHT@>R%D&!D6yjuj-NaGnCxEKA8wK zDE#>kqrd}0u*D?P1BUd?+wGZeVa`j|yKWE6c$l(U>~Qw1S_=<1AA0ByOxzroZMTPN z7-wcxX4Jqc!r&(RS6TA|+f;qQ2C~B0ZTnqu3-c0@6~#t#=H1e!&+DbXw#+8Z-UQ9D zEhL7!nfhA{Vcjj71;D0ms!!SH0y5%rWLHLGD7}urFwKo91b?QNT-cYZ6zPm?0a;Kb zmkL?+(ao>lhkT+W_vATp;z7$JR~PpjPo8NdHYO{-#bpFcH95X6HqIYcF_EYI5vb~j ze-2{nSeE$tNm|^8RVJE&Tyy!!UBl@;SRoxSD!3TKcv0eg&cFIva#UK@I822T)@|_V z4er=Dcv>{{vzm2EbGVMt5tP~JkV{PD)k_!IGQFO3nAtRVUw}5w2 zE*g6!P>PMFi?V97K-8_1!1s){%%-rkT;>4drS#7jz|p?8Dk*Id z%}mo8hRD@u6+lCmQLF|Vu!q2O|1cucwxm3fhNA62TWC&J%OlM6L-3W(7N z4(a2MIc)+BjGFb$)ethgFNmJ8yjcVi3WFO6WJ-iPdk^1?!24=0()4-PbG#nE{#&n3 z8hmc)^wydAp~fbPU4x*Gy!_=u|9emCX&=b;8hGMX8j{`|o|^}x#C}GGW35aC^Hr~t zd~Wvr%P?j8+&Bs#=K(>iXXljFi>m`WbVQW@{=&O}rwcw_z8Dux)D+fdS34>PS%)$A z$Xs!S6_LX_ALM_^G@P3OId z@_yGob(M~Bd2Y?j?Wpn!E*I4*|Gxj9B}JpUi|>t&u6PHRKsDp=`K|vOU2myb^yItQ zmz>188=_SBV+U_rg-siU<2vlN+CR1VW%>Ibe!m2e=9Miqn8RT*@XE+cfZXXR2Z&kn@V4wtKM7r z6n|XcqEtZADiFpei-uLRVj)5OD|vZuh15~Z_IrG>r{iXg-}IiW`KeljCmC=gM6Ov5 zO)Pr}xM@<_F6*0q_#`FTc&9CYGqhX$UZac99Wy`+g?(v?aoIuF!Z>I_k zDg=AAVPa%&((W+O5$3C&crJ)r6i&bquf7OUlnO$e)fUVtljh1wnHs;`<8`^?4y72-%D0At5{oKMu4AJ=si^5m>m# zjER#)2CvrH#%+HNHetJjg4_DwvL-Nh-mqMH_Bp@r;#w-Vh4A|0{=|uN#AP1Ts_A)@ zJQ6!bY5EdMnD*iRYiX1Cu{2HV_zLdL_>g`^goy~B+`)xzwP@dPywF^8E|7^fgbZMM zi}v2$_pi>W@Otss^=s6^Br~XaC%{lM(}$UVa6GPgMJ7XyYMgoaHJ~T>F;t=-^=@RI zb#raQBmUYf7Din(2UXy(QJDJEUVaTTRsg<^$Th#zPbBFNU)q0m*}lH=@@A^KVfREX z*1cCG%*oU~&Wk&XVEK~%^OqoAkBF*V4M=}sMVROWc`(4+^zWXVQM~l%t}$WCs^t&4 z`lnofCRsOF(J2iK)eiJId@1jge#rs0Hj!3}nSs0gbECOeCxhcE|CkPgZ}!=cm0R1( zMuw@}-v`$|i3X^2*!1W12Bkdf4zAI=&o%>f=zil5qNnkk{@S3mdKN@_`9!7W`S`81 zPyjh#_8Lw$S8a_fK;Ujygr{LSw`rMT_6HB^h$i0$HlX^cvbnU=$u7#fKijJmL+4+B zn@U_7wbfqzI22^HuX%Z+&pqiE^F%AsbJlY5o}D_!UryC89G-^i&)>eEBT7U$W}kjI z`dPGYUGJV0{T^0W{-c{Fh)|8^P8@x$$0PetHE0?E%aHR6x?P^>%D?MwIr`j%P1JkC z%Fyai4uz{sF7@IZNqRuymm;;~@I#U;YPMb#(?U;NXZ7dQg>V_k|z~%=PLKPg&8i)iP(xzMB<0>|4Or|YYGU2r|LR8j1uk+mpps3 znEE(tl3@8NcIf%k+wUC4n3Gw?IP#0{AM;eA_QmmyzBCv2#Z&}lkCOZ8r!u-{uT-Dt z$#BXB_`Fxg(wIm7<5QOLAlQhyd?R6hd%0AxADnGY?K+geiahhQgZz92(y&Rpyfsa& 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

vxQuUPGKfYwWN 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


$^Hdy@oO|Of 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

${^bHz34O#q1Bp8={ZY0i-H+z*TV9h@^ay_b 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

    nGgGSxH%)Z^|HUX$oq8LIZc0$cjs^Q zxg|KS9}I9tcmjIPb_Qx9fGWyC!F@VbU>h1*CbDhe_C&i6IbYWxxxK&cg+eZVo4X`Z z26xU_p7Hr&s`%u=EPA`rzMjPIc9_GrPI|`d>P$(cBRK@(WoN;r7!vf-!He=F3n88N z8eq_Cvu5`#a9G5EcAKqz=t>*jS}$}XKH(ty5_EIN&gq!V23SAV^FIT_PVwRwSgeHX zOld@BV$>uBL(z42l;M|cXJcIModpD$dgWGyP=};&SM--Qua4L5jOZb^_jsCSp(>>Q zv&PW3xj31-&HV~Li%fjW`}e#)$X2SV??vBk5c?2>Kvd;E2Ejt>KS_YMi_`Ki9Go`I zxDd}f%mG_oLUk{TxQUto&!$E}hP%+5ezUdrbXxJF9-z*@if?W}y|*NFvSp6x3a*7> zL2l-l!kB92n_azcyPp;^%7FK$E3X5)Rk@0(vI-E;+l z=9W_-Q3dwJC&MYk=SKgRJvfd13OA z0{i=(svp7Ta%KOJstA;c^Y51hCPt^u?VP-hSxv14=uo5V<6AakhgS*}GgfKLq@W$6 zlY-+JjaBE}a~_m1=>(V>?si z<={WKpn@T_gRPDcgNQCI1nJmFQX?pd>5+axpXFTRLZBYfe9B3z|7f`IR_NlGGcB|u zmBM)W`&Lz!w|`0NZ1o$$`0uM1p~>f#$;azHauMGummFXE12#)bz#@Zp4q9J@@b4Pq zP>`^)-S3632qwr&2@jws7GrTOq#R`CL5HL>4$M`asH=CvpEwb^>}|{e-myT(s%hm`hFflrG)zM zZ9QLFy55(fd-J@MI%4QNnsrlQt>P%88;(^)t34`#DzaWCrwbIa0Y$-i2~*z);Uq-r z?{or#F8q(onK|Ebhq62Y!Uo4zr$N-or5Yemrhm_?(y!d>vNg@Dr*BLcQ8~Z z;&|bw;S`B1D>1GO-Q|t+^IU2EIUq02|6#Z~9=cDN?FI7i?3kK4`3!IzW$2jSeN{RJ zzriS@S#yiJ`Ojk3cEW*c0&8=mcL$$n9YB$XHfw9nelz%HxLLG?vlTYY`=}xge|Qe^ z2ra1f=zX;btGnxmt+}D?PI{Vq7~kHA76@sP}j*9a2iX0-_?2cwM@@I)2SlpN7>lBs}f7I!Q9-8K^*Q?fU5 z>tf@RqAd>b>LT44Srx5r0O+~M?6WWgG=%hdEji?k?5owC#Mgyx@iO#UofGy1`QP;T zZ_XSZEX8%2ZRB`9!l2i*#VhPtyVtq36KrD5F+6Nv;@))74&0dTU!Actw+YO@(!u;H*Z@;r+!AYo)0K8NbJDo=_E$+x6UDrM8Xa9>(!%`wo$>0rmd zN;VO^4(A3%-+qK`7ynqpYI0`!9C`Ae1rYR?78ZhB@x~Rt?nd>9SshdQvV1Lm53PA! zfo4Gr>r1b6`C@v9iQH5vlV-l~=VKu(cD+|GM{NG%ul=N0U858+tsmNBl22Tb!|-Fe zrg5|9*SyD$4S%rv^ZFFwG@-%cM8F}i^L_7{olUHXZ-BcC>ihlLtPHuyHfbgACgx3W zAf-W2R0p8#;=t5p!!`AyJtET8NjS!>j(gyvPtznY^!{w|X4|~$Ew4cT?9EO4NqYN^ zhonOqRTau7H^DwzA)vhUd|XcIo8o|hVon;gxvjl*t``(vg^~WA`$j8; zyuVYIClq(~AAy8=8RMuaY)S{-8njF4DCi|BSG+~)M1Te9_H+E|^ zpcI{QIPlPT@!CI}XD`u7_l}DH@0R8j10cO4CC;vTRN%IDTI0s5F9*@JH{3R@yKKaR zbC``4!&NQO+?XG#-1z~&}Uudk#`YG<}#R?NdJ#j zBq!c1AyW3<@!A=~;~g&if%^@Egj9|9TtdkuURcIk_!&~B<@||6orJS-PES^VHrDZ| zfApE};+uMGfW-2jp`*#I#=U%R#AAfo(4M5tWrMyWbnsw-E^1kQtV*u~HvjK=1{{%j z-=$QMCr^uoN-=1%C{)8w^-Kz?PYcDoaWU-Qy~6}zhGlA&S|I9piUP?m$BL_OA`=go zZw{HE+l1ZbMk2BP&S8(mibgS{3(56zsUSCdh}1$c&L>i)kat5CtyJ-kD~K67lA`2# zf}kn0K=hTW?Dn^Ep%p@r_IjoZeHG;6yu&$X+k~%mKZfOPgGsxW3fNh1xvaA?iXER% zh>s7gvRP&FM7kRl$^cF z4nF7!@fqo_j1Ae~Nv%CKh{Db8@Z$^+ML1;KdB!|G532vhrc**?oO%C@S4Ji1lM8PS z0CFxxFdK%AwkM7&_Vwx+2AjjvzA^Ow$C=i2>b&&fMf`BOfM=4D$_^pj;J)8Xe8T2AF$24Nm!EEkk)52Hme+~sRHZM?3{s;$9t}N2 z?Fnn2iR&=DSdL&-hhFbAcBpe$9;7@Evd7cogeqlO9KT_M|6wI^z8o+RAev(hIQ!z_ zOrVfc->UJKsC%WPh-)7={|JjrbvE_=>zD4(NvT~C1Bkcp4bQ~}XgP-aanaZmLp7hv z*gR)!TYMLNuxpHTI&hfUxWnicG87c@A#htVfV1G)#jP<`N5=W)v8U_xiho&Wz|F5W zTo=pCGI#m475QI3bw25#6X(SyFx*X53;n?C@0CFZRglhj&-C=wgKJ;80UJbWZUvrO zm4&e6{kHH6zOltSO|}H7`jr@bD>W>8&oyLP?^2TIeh_Ie+{)olj{Vzu3%geaEYflI zQzQ%v&ElY@1vdvXz4Uyj8rGW#QUP)Bor*PoI_9G85544o+)c=b)lp9ovs4sRqABNFKVdSx<$9S2K_g(Obd= zp>fZb;<(z8ssbw7#sE!(v^+5^+x;Q!uxG~r6n(hNr>_0%Uu zL!>BV=mfJFK{Ctpn1Z?TuPY&z;UTqr{=O|GDT3mNn1(gEdPJh)r1L+FgUNKq^|XcK ziaVEHbE2Uw7BvCnL#0gpS4>XY{{#DXdGk+L^mxi`rT*Hn$$oT;rllc^t)7w|-ukr( zj=oO)OSLDR=uJw>&}WJS_ruVT76k15lMnAw0&F+YKlQFITPk2kf9xC(Vm~u<_t^XD zJ5BdYwa)PMSocUPpyB$2i#d4z9nk@tHo_#F_>3bngp2imJm+dy!>|Pl_er zNQoNfA^9p$q)6sppiHp4x0j;q+5HNOlgS8=&s{uEYPmk}JSQ3+%+m^E$KLRd<~r2f zl7}4GUsMKEy3k;dAp?$)Rg*in-^p`+aqNv^??CX2?_2uBC+pf|7leev6WL~QJL}yH zpy@sho_z3Xe&1762GYD&{a<_s6MgISrn`G9qS>=11Jy3eb4n4mQhLOjdf-H02Kf}y z>$wt}_h@Fq(Q5|O4MIfc-GJ&A!8w+aVG%;5VojAOZ|$H znWzqA5bItE0Nj+Gw$xQ?d{P3E_D~Ie?MdmewXIp*0;7B}CVPL>&9VE%{mEPq9(lPp) z3!!HnN#TKyFt9qQ4LE^%ri_xb6RD#&{+sH(xUuV+@Nwy&kZ`p~~{E3_hl|6G=+A?DAF=(Rqx$Iq8p^jRg(*mVMfI&;&NpNfE+xWUn z;>*C2YJCJ4Pr7w`!gjKK)X|ump}+$+3IpF(eFu_{eyN^abSzr%z$i==#6}^O3x zCH2W>-I*vP5`IT)61~wUX0KCu+BHJGy)rav^AP`@tlg7ZTRW2Ove`c#CJo&*Zufri zdPwSWS$yYg|0~Bf(VO5xv;4;L)R`$6UC~;h?ZS!xNnN~q)Uxk*hSU>CHv~&gTQ)0; zljWo#T1f)4TldUNTwucf*;Ay}Q8V@$0ZSde<*rP#ycvZ$l+DRe)a>4Jzep=?LguwIEb6*8s3A zl5fPfF*s==J(Nge8w7P)bi?JM_n2<1@KRT(x9 zlAMxfTcd9xRc1(u2j+dBi;X*@E-T*8zbbgc7YqgFaSxoKFV@Z6*RBXM6b{<_CG)j| z<@o29_CwqI4`w;^sk51rDvM*8C0BcQ|21f7k_AtH2~Np_a~ra*zo^NgnxgfFvO01G z=_#wO(9F68{C?l@v-M#Fx-7_sUqo7`UBu>=@Wb|L_09@b`<|kLNW6kyzk;5VS{)Xu3^xmp%VwVx^_^#6Bcmi<2JPOjTFj8o^%F|@4BU*5zs+ZsMm0rbevWY^%<|eBT99Dv= z4~_lO`fxL)w>4Tewe~Zm8B6WQG|J^AHTM`NAd2wOepqMb#(RaI8fLTF7ixJxh_A>v+fBou!64 zaP_|DD0rhzx?AL`W)t1Qk`Sie)43FHPhUMESzMPZM0Pi$J6|pMt~=*;Ys=nR4P-*C z@A<_g8iaz0agJaD6r zA~^9_`E@jYsmDTzAolIKT{}I(pTE<2V#Rj(>DRO)Yv_mLi~|0IahYoKwjp>Lh5Pnm zuwYS4(YcJa#^envLqXgnVhK56ocV-7=)EmVg!O3pzZH|Y|Cf}|Ba@N}u0=C?WTAu( znUN48n2@Cs8f3+U26-eyzGnQN>}0D=T_AkTW&SZ3zL`WGBLouboK4O^qKdj8ax-t! zcSNvw{a&Ja#<~{l9CRy5rVB~Fz6c(NR!KFgUHsbJyn9he#wsFcJclIs10R9G=U;iX zcy0ZIB^iTvcCVBZc)jwKeB|!frSgrRT+(ew2`cw;&nV6*{GFOKZcIo7RAsXJJI<8G z%(+Bo`yT#&5yK@%!SH)A2YlX*jMp7TQY58>Ot=>FHO~nHtFw4HdiEz6BDd=I zeC5)-O2y9C6l^DAohw7?3yfq8r*7O9MpKg3zH6ruIZLWoAv(L$?swhnL_s})tGk_# zo4;FC&fV77#atyrkk!G?cxwb4OyI^#i-6VBU$9g5gVvtfLGRy|D-OK5^S7s!r)0JU zfMi{qoEF7S#eCb55Wdv}!_fQ5EJ_|EX@6s%M5gi|{N}EqrAB(@ym2aHZ}0(@Rpr|OTOSWf6<}*W6l<@Ejk6qTo-fcc$3YTBq;$QQ970xSgQXvx#~qn0+1!baqR5s z$H`p?d50Ug>;~i^hwvN03?6koIt~flBWALbSMPPwZ6}FSo)7mZ&5+c=T{5Rw7 zkG!56-Bg5&j+8UGRkXqbTB*(_8}Cm_z;aYavsvB1^WeYJi_j74I!iHgK+a433a@h_ zeCJ;5M$(5jU!lUHLoeh2cW(JkYD)a%b82tK<&l@^pOm!Jvasjtd(UniKlsMtnc}GN zeHF%AzvtTwo}CuxzfF98=|*dR44wklh@XRu7Do?(JhHslV?MPzp;F$X7kl7o1n-G< z-1?~{V%<(zwumMpFxfT#hn@T8=3kh1N>P;LFOn|C-lo5Ti+jb!M5D6`=_kZ2P6b~> zv$2hP)+*C~UK1^()&Kb825y-c=cIF_tL$QJIkm!sE4odRn4GP%hG zeb0bOpyCaTia9o77zTBS=}==P&{hSbI*wPzD4Sc1v|7iP$|oioO07<-y@76E?%Id| zl3NPik&#Cc)I38{JxL6ZPvS>neFgfxG`W3Wqk9_3<^p);SsT zkFn81c2}NJeaE2k5OM3y)7x36WkSd%TD2!U`0Sq@iTL=;=&f~34WP4N%Lj%%(7xBo0Li=_ClDS zN?rEj)0`R*o0yy#wQc90fc@*Bciw=5nl5eT?(eLh3l5V`%~Cq;VF+bntn-bvC++SCrVRJfN*R#u8<8}pK^>l-8gi19#SFqEE zT)Epp_m?7L34&)m01JuZFkOb&%_#-#aWk+g5XSGV#K%35JpKkqiYdR}3-#_fi;}+l zZbcbUkj97~*7?u?0gUGq@K)To*29~itkUBJ!zY_HnB96Z<&U|hwjm*(M_Ct5+H*T( zN#$va;}t_}Y1eZ@RY*_~N}fLrdW9H!ufjoIp|_5<3xBJf)z4fpq1 zm0ztmXdn7Dd_v^#IYdg2OFm^uK%c4g=sy%aR@%{kZ1;0RXNh=_z(zX{id_qPuk{jD z#V&e&&tg>Y^8tzD%Rp)zJ7I7V$mxcT<=}Y4qdB;@NmA9qtH)Hn-%`8X>SfQmz3F*v zrvK+S!GyiIZ{jK03VV2un8yOu8SS`;R4zQ&UD|1S?D{tN?&S>jVn~ok`)0*1M6P(Q zyIDj4(obxCu<)wrkM_U;i4ees2PZk5p=tr5O0ymf?empl30W9nd^+y_Em0bHWhO6- zfw3d=_x6TODiLaNiaECcU^Q3{|4{XOD?cf=3As;k<`wX`0I`Z7Kd;cO5sl3MfKuXg zq>P0cWgfLCTg!2AvZ?6H17j7P%-B=@Q)MXW6G~ph%ba=?bEPi+^p>_>Iji4@DCDcY zRsZEdz*>)g`6^2xxaUPF6A>N-gp|3w>_JiSTsbhwcB2H#hZ(K&bbGFR?tm`;ot(Y9 zUHjWT{^PsGF8XnA39A_H)0wY>H-jG=GYVq@44sRM!=hiEoe!HO#Do^KNFcZFWIo;C ze9@8%!cAl&rAHdM(G6tTO++)&Ty3NU?d5i^jS%jKcUTZ#8>85@;w8jR*Nbj`ze{+7 z^IB_5vp1Fk|HE!mJd50~kyj>lwPno2^@}SE7#fv=B_R>tDh$`prZ9Ph+o|SH%{Ckk zcK$UH-HX7w9rEW>rvYr2nPvZZrXIJY(g50B6cnYe(t8Ly?O6A-6(&; z%Skc#sr57~jDss0uP2W4@DKqCww<^Q7MO;ex&y)$Mn_jm+xz-2mL@QF=Lb%mqG-gTvKBK?J(U~g?+6xp7yn}UkXQG?%$BLIo#}uixJI~)}EaiNU0m>gmoJS zt!YXdCJC&_33tirS@L>yc7!-PpPl}%TZ z)ChdoF2Y!H?+@cH*qrBmMIOJKbx$c}U1{g>htIvOaV5huPHpf1LcercV>P0@jH-V} zeJ6M44Ck|B&Hm#*$&&1qYHu{uWw@G0o*>kAN-0B5FM{ouWOw;A-3 z27s@SWY5R99p!$n=#Z$g64X(S7YDlt|usVdE!nS+&trT<8LFn(H)%RNH>t?0Fd3Du@26Ix)i z%i^cqI^jVdMgb;Ga^%=WosY#>ufSqoRZ{kPKa-o;CyO15dR1h@uhRAzfx+mf62Un5 ziRZsW4a@fVb50lM*kU@R9ZeA*I*kXoR@RfaTTXo_f->>KI1h-RdW>*gq0IM@I;MN$~X!NwdN_u@j-HU^STH z>n>>}$_QLE_W;FG(wzl3J2nkjXv{hVktIHM&8+#hK!K(dn)Eg$2VQNZLQ#72<$#5h z@}kVODSeeWsODhd#|O=ViKScD-LuY&TQMe@ zo+!6-^Q5*1hAGb5n)2R#TI~p#lt1(M<1plcE?2TlB{c~i68v4rN!^WWJP=hFGp&t+V7i%-cN&Y%h#3 zB_=)Yq^>LpEXlT4=g|JU8dV8?(zaOPnspzv>j*;5!#-f@ zREQ^b&W2^h(?~wwJ&*_JzI)$ja<|imR@K1g7(s8np-dY~k3HQF36|fouTC}pr_Q|} zAq2DZ^gOrk6BqS$eV*`EyI&6dhHft@o~iZFjN9B-DheMjmTPmnpXqU>fT$f3tj)Ci zle-U6KjmOuucOikP;wI?lV#}H{F!KYEftjPM%%TCsr?FL6?O%CJQL_HgLi73Q-FqY z^fHC3a+xc13?#N`L1(zJlXqr>Nlc+M>&O@P;VVxr=mn+1@k+rP5ed8&G1 z=BzqO6tq;*wr#R0t+h)jMfuG_WqUh5yuZ_yRo$wAT+_1Bj{=6$`JIeYz`Ik9l3 zwWzt@^9fT<5*7=KGG3qIPfooL@!Zi`;a

    phjh-VEq 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

    =+vs?C3T#Q@$h^V?l43ZadV8az zaHli4kzuUY=d6-mfY&|#jwGI-lb!TYp6nktmpczX)i^y(SiHkGtqrTy{G}a@e{Cfum@v8E z+=6-4JHKk;I^0ps^1?#P+Nw50DJ7C*myF%>AYw8pMRZg9My)dgpsS-)qopYw7;P)P zm-I-LBDx<*bb3W=DgH=*2LXDr-mWD@X*yBVR-*O=c<14d+JoR7X*-CT^6Kp6$x8m} zPZ`sKXzT1dLcr7c8FLJL-p09$M-{Za!rkdF!Rsv#>@p`8lq?^?J2?#7fHp+pi7^gQ z7T7;C2m&JPtViz3a0CQ$gq?S^waxbSwwO0!KL?E#`xaL|D;+%QXd9>9J^ijgm1v_1 zMyRBFVDf)66!~{GU)*skYsUH|qP^6JrMMhXkaQ2vg7)Eg7w!=Fi;7|(_EY~^E^~G1 zgV`jkI2}t|A#xhuF84u9)Wfsha!#u+C~4vI=)4h$sNlfHX2QA(cA*W?hDZ&-_=h-R zHGxk&Q23D^-*CH+lruhgMCucyzpX*PsimpyA(>2r&V~#XM~*X~FVvdSbU>gjx9{zd zVRZw~3D{+PbS0e%ni$Pf{e3RJPdo_U9Qbwfd%P zG;>ou_W)BYRx+zqE%k}dK3S*;mZ4i7DC-=hi0Z!lS2<`*MC88yfP$1b*di2j_liwt z=)7m0Fd}WQH?R5*;h{^1te$T^U)s=&Ffv$2L1{fFV?D?VVIXa?6w743BE3(>#(G|d z*jy*ianDn4l=S|vMKY&ziQT`IGA1f2ncgAdY2m(WQC#>V4#eM-020zc@MKRu@^N=r zKZtZOimy^xt5tmWJ~X(#ITQrX+C%k8RkiG~24rPR9f-4En4%sPzNz&_@uC*Ab-+wzdB4xlYR< zmY8@EIMkHgiixgO_I;8tz1j7gGXOEy# zpJXK7QO$zZyg2_uFRW0hJ-zu6skyRyk8-S0YPFW5fA-kbjcu+fQjP83k2tyMUM+*! zIj6cCOwqTV-IMxUQm7~RYoU53-4&7~kXRrS9ca?J=56)y{pV5T1B&uAaVjzgm@#8__lXzLT>S2FpOp zG~0`V%BtVAgx^(Wq{8b3lC#`TFo$@!JK%|<&elOP6ssBn$n8@FgnP4-F>EWmK{=iJJdK&%pSqQf$17RZ9noVfO2vz z>852(&7}mU7|#wED1S%~*)=!6zM^e&?(>arsZ8YFCEoQ`(>V3bu;y8LWwRSAkDoOg z3f5>p%+-8ZKnwaCYvVXs6Vyzk_kSY1IHA$HHnC>rJ?M{tH16N~IwxP((ZZobeGT!+ z)eKLPm?^5!N&O>NxxzgOoHoZaC?=JlrPIM!l%&6+>pLD1 zK-r2#G^X+KtjSs+-*MFu`#6a7iN zBd^cG4|B^i>1TPxXK6M6TEP(xcdk8O)=87m6&Bmip-RhYXHy}8buQ4o*I^q`?tOTQ z77s5L!Twivq+76#uYc-1 zsgUdm&J{`j#{ILKLQ_6k^}KdH1AD&wFi>Vuw{Uc#)uj4-<&V+(h#N)mw22cJ#*%vC zp5Iq{=bbqklQFiN-skp!fG*PBj#j~5eEd}r&16-^u=CMl&cit{%a})fPmC=|r2r2I|5q>X&y*joWXwUuL}5kzBvO=5 z6Fz-j>p}NG*GF4}E6};sGt>#%aNeb?r1bR4;}89Vrg;;5ZLZb#5((>d$YsH^-x|P~ z%&)%y+U{mfT@fxB9WR%o+kLM`J-^blnQ}}i)6X?6|Gz0Bw*NmxB#;b6CfUMF`N_Hw z*8f2v%w!u49r^eViLj8N2-#3WdPMrKQRmOt%X>#Lh8QW1^p}PmAHaCA8cZHXq8Ex>uGR4tgFy+8JXLfY!q z-yX;95&P4wYW}_|HpBmD_gE zQfw6X_4b4%axQs*b#x1Trjk?;Jy2^6qsD?!xyGg|w5Np1y)Iw-dD5jtd}2ok`GZ|9 z^fj&&m3>^eQP*nu4tb~plh!Qu59#ObW=IN#+ymT>(Af*6P?w^v@%T?%vO7@y>R+58 zsbbvhaop~AKtb4sS)Pk|0wkKlzSqL(n4E+uRK^^2C!PoA^*A%gX}ipr74n#HBTKqbJ=X^u=JJsA&^=h1g1;)DCCnzl}6nEiak0pj`M zl3~Pi994a(Zy*xIcoZBmp1_$ExP7q7$>^!N=ADBj7L#nGvm`$)Jj2nhNF46qOjW%$ zAh;4%itSb+POWKeQ=dxxpGY&;Ws^-bb#WI1)k;SvKEU<$4A)XLVj9z4W0}hO?CqrK z!&V1}eR@F_I*$UExTVKkZ+yQ+?2-Jox}0{`X{Y1;+*0~4@J{I&wNBkkOeX^0S8DXtu&r;x`yjPG@llJ|F<-FRwD3OZQa9$nE#<0LbUp)qej z^@R7{&EVeQJU8(W>&+;34p2u&NO~Qvkwba!;Ff<2fl6iNAjq<@6vMB4X#qHZ})*VQ(2ouxB{hR97 zuA2mF%5!kz)abr8hH+5C13aoWjI6@%F>D3Qx=6~rTiqEwyZ$9__ZYElZ!R%+U_+qA z31mgT_5-|J#074lbJPk|7a`#iiFD}}X|;Xu=Gl#R*N;u9-%Q}a1M za(-olWPQfpkHX*N^ge&7oGsNL_bAIH$GS>Xo#yG~nfdjM+jw*shrDCbCDN4h!JWvT zvTwUtqJXT*QiJ!O5m7v=GLe9Vv1e!E+^ppFzzp3pTwx;@*Y$PF(@)5w_KKVfgLALr z^=!nC9_eeEk~_8DFde@b@r6!-RVT6MgjO>%yn7z;Bi!(2+3>_g_UneN-{VNq>9Dx+ z&>Js&(L|x*+G_MEid;SChHFvcsBF&Lw;AIY`hW^C;#;IcBRp`aW`AWtDKXhKa#u?8 z!`A#&;9WkKekadv560vRQ=t4$o;oS%0}q|L@OMxcWnb%`)Sv&rkw*2Qf%VGF6bpk~ zIWc{JoU~023cH);gL};R(C^63l!~oQoZ0Z#6o^UBv%NE@@e}5Z)8Rt*_rPzDBk{zl zV7HXORIfe?o5-L&YpDGpI<(aO8(o)$o9MNxL7WrcX#Tr9N{6giRoAM9YhT!n-Fa}f zR@C}8X!#TLZwswNz>gcI;|o+FG#Lw@N7Qd86lCCPd4i2(jUN4VNSL@tPWc^nx))Z~ z);b09_MS}xr4IU?&qPj-<2cTjFusJ)xr!kvj?+C0@l9V2NjbybHBh%V$?5E%&}Dv@ zio;g)Qy2cN-{x0RyLinW?L@H*zlxWks)5U3D=z-3r{04@nUM;R&76^H-R&Px0+aovc3PB18tN(TN?=tFP+tg%BqMI}4;t{h1L_)$% zDJHF!p(9_|HY4?zbN(z4T6eqhTfG~LfvJ6p4DWy{2yZUz>;MkGtO4g*!LYTVsooTg_8#5BF=&AC3E7xAy)?TIXXF8e!W5)Ru!lcyEh zPvxHqIzCXrQG1L36j)+OJ?j|vA{BmWqS`LN%B*yaj?Qi!Y@@^xn zX`uS#TR8c>Nq_d)>Rv>TIjzd&gn7#fn*%vvB_nbrFoynyNUg?Cy_m;(4B@Ao879W@ z+~PV`ifITuA`g?rXLzh>T`F-o=(X(9hafwOhf%Z0%=vR%2A_EnBDa0c`!KEPZ!`96 zKiFzpIS`WSS#d9WOSDc85|6t=Thn7p8&)HiG0iu^JU);ZVTcQLLe-s`_ zEQ8~Ijz;G$c&OK4JjL?Ec!KYFy_TUOW_zxFz5ml5Wd=*8nrwx9`hn2-Lh4@9{HkN? z-y;plG;g~;RR(Z+#9d>&DV@U!k8GjXsF;-1BdH6I4K47;F(xP5sr5+j&Zzs_q=*~E z@zWq^5;xv=1oIb#2OY58cY$g^j^7R=Mr_Xly;ck_ENSSV4qenIA(wm}ikZio&}0kZ z&Jt{RzJTP~DF?BLE)YCS>bh7>gGuvwqstDHk=xOz2Sc8Ip`MD~3U&^)Go9ef(1`_A zN$YjYtG5nLZJnJLS17dHLpyH@<~;jg@vr^-#kV%zqqmB7%)KEB#0*K zr|RB(&NCj&u#6%Be$U;vOrC+^0MhY$%*8Y7Hwrvqn;+&>6UEEzfnK7JY*cxV`rbF@ zm+?=oXqz`#t~X{jLMgj3%6ns0JN@^fF6nXKW7n-Q%EKAvXg&o?!g!t)g>9W)<7Q_%G#!hB5h8~$#ocZg;~qv0jh{Q7aKeMr^2@XL6pF?XJ)-2BEk0ZHMq3+?^pDrka13VwRP=f9PbRu zKRo+Y`jcIRTf<4D$s;xEokHk0HV?%49e5Ylubq;O=NpT@EMvOK-h|t1r;_J|2u+*@ z9YjVaD8|%Y^EQU0@^PtgD-gQ1aIk2j@3o-f-e&#exO-iz24#P?;;(j8jByQDx^Nf( z!KMbE^4e^yZrF=6*08-3PqhN5(#ul~o*NKuU5!(flPNv`HeZ7&2OTsYH$jn+v#4?0 zssj`1(YJ2_cy&cK6lKF(vJ)o=Q*sk^ddtS`AM=kHF<=*P(5$c{*b9slnKQgV-& zZO(h8uGvyi=6=04Ln4h}#&*tTV&9FQ_y1YrRzU!c&oRELip$QD+^R5iRoSs1RO5UO?Lt(BQGK)^BzIup^ z+l%eE^$C2R^#rE*z#S3@YD{et`1D2V+0wJGrg!`WnVlP?>B&pcaxT7e!N#o__9|9! zr#g|8(bO>bsXVgokwyc*dIfU=Dfnx7|Je{?s+P}YA29}S_FRVgxTF^bwIgN@%hy_g z*g6bYel;H~DLW21oPlASADQuj`8*sRCnvUVzcv0)7=OV7t>SqdBIm3MeCdr^?>d4+ z>V-R97jXK~8Flga8qZDAB;(>l8#d-s{w`noF!X36OgjyIi%u{lo|O+JbN z!<++^UWQ+!ZQbg$bdgRG=?ca#2p3(nKk&uW&!6qZj%5r620+EeyyU4)uFyoKxd-amYvTTn}iI0V;9XI`BGiebXjyUp363_2U)(_%nY7y;tUJ zcdx0b!t&pk6ly)=exOgyrZUdtLh!jX{ZlafL{sldE_(TFB)MvD9|JY%24+Np9ElD0 z`hy!pB%iwe`W7_XdO2&ex;G{sbT+$)5W7Jo(AGlxuUw;_;ydO429f+9GYKLylVH_8 zK7O+QhW>vdNSMitgpSNgZjfooe_k9`azF_?iG^2K1<(%raTHTEU?nm3DK@RZBi#Jp zB7xa1hhF}gT$zZ>$dinx)(Sjpyk)be33keXDdj>y6+$UId@V874N<-q3WIMXsu_=* z5dINCoe5jK?oLAl)mB*d$|_NAzEtA=D|Eq!2=0&@Of$)`ZLQ-*4D)RZ_l`d9`V9!E z(D273ZEYqWSCOh(IjAU{|Di#RHKW+P)-9gPlmb}Xda%p>wG;E>l9`Nr=vJZs%vCcH@D^-O!bMj&lJA_osO{xZwulYJ#Igo_$*5QZ?m=5>Qc_c zIzwF%41zvgE97ZP&#m+^n1wB=(P=p>z8j=4l+o++?gCh9Ql38%g}xzp0{>2j{7ti* zFD{MEd8J4V3n?vg(?)g_+l=NTu!JBzVUgd z%n2sT?YJ?v-)vExhpvhWj`4viAzp_Yv(4?1FmS6e1huC7NHled^@sDd&BREu#-%ha z*kkMka<2_UBQB*ts}7pMwCPFII6>r+DJY0<>yGQmA{}@4_LxpyyEJ7(D#v50xzoit zS2`xD$-?yFRcSs0s zt0tz%jtlIB<~6sDr931R7zz~1U|B@YsJmbL^f*4g)Yoo~yJzEz=ZN?;wP1?3JEe<&|6=gsU&4d6sXW zWcj(?72;??F-9`5%`G*HMI6!LgJdeBYnkP;#%Cm!JHlQae4 zMne=G#Tgl;Sfo|021XHFJLfH3aMQ&%iZD5DU^)c6Bg6H#rub_ zWpMFqNo5E0{LMk~!>BxtXxIh<;TwpZ0_Q-gZoYe&!WZz8JKziasq7}J{c~j;z#k6I z4`gtmGY~g+N0sCe*gx42UEPxoku8sZ?R#BUr(6a2PsBjL``*t`1M{Uf*_p=TL05}> z4i3I*GWu&>$vJCC{RfO&mZ4*LuAAqEggM$LoXc87*@EicZ}NTok=2~{Y~CUh;c<}E zowZV3{0x)DFb@-~LI2TP7z zRW@+0JzbNo+3g2lor=9f00=$%Q9QYG>)59vbS5Qrl-#g2@LHDnImso6=RWr$viD25 zFIL(X5muSFf`G%yDod7paVLLBU_-MS4vSjSDFXgb`&NPWehX^zh^c6J*?JMQEK)`X z^Hb<{aC#gFgb2x z^55Ha&kiU&63lZ`_P7<-*siE_H!<$Kb~YYlcMBF0v=pv?tGuxO%c|H0yC1T2Wbb3e z-i7f4&M2?lGt+Pg?FK#@@>{9GIrYBz{)29@H%W#qWx7e>p@bKEHP1L>WV3Ek)8rTZ zSEf8PQL%p)IA9uj;mHO1H>cs%jE-|Jw~_n`F?T;@fZqNk?)u^?BeU`9V{CF3-+t@G z6R(cwg_-yY)HDHmIw;{KgZ&$QB6r{OVi|Bu$9ubgo!e`l2bpJ$EP=ZH-mmqoUMXfR zU#HX!bI-9c_{rT82KdV+WRkQOiv1ciZ*#*csnv@kwjF&)*x5jpQLM;xrmD6Y%`2rT zOT?p9Rk2M0GO--vNg+xM z@Pb-}qPs=r|Dmz-A)A2V!ztxHQj|91$!^hB16hALH9V;j+LiF?#Dd23NK=-nul)i5B-bfeMO82ku{zii*?J)hhP zAp<}Pbrop93cjaN?oes%oMP2nGMUM~Jb2Nko<3E@=!a+yF@5e4%a7OFt;~tWEDyV^ zuw^yQHXE58y$4*@Z#nKgV5>4!cXd&1%YWOUaW+^l?!)i0qknyBfRaBVZs%9evSSN- zsSuY7j~wN{P>XR|kRtiMDC>JE6h1hq(qxl}D6AlxSkogruXPF3NbpIN3?FkdTN{`@ zAUCMK8rp{Nxz+-@bsCQIeZd!nTmeiDhw`1E;3?^YQpv$5LIvK9IJvE8PRxM{!BvLj zdg{l2^UcQq$KB$GtCix4UZEk9IXDF_&5jofm*d)Md*?z8xUP^cFsT7k(Anf|a~ZPs zp{YH)grZ0}`yvNmjLQ%v%^??(Xu=sLff3d@4;z4<>Ug8jky}cW`SkW(XTMchJ_R%d z4S$oC|F^3(k81xY>cwwu|1@yyS&2X7f)ED$A!Ywf0Q8-=IKmGH`2tSr0R14a*W+@#6|iMb*?{M~{H zR^?#K&PD*lc6|89g7PLEMcHbjTkA7MV;SPGg~wYv#_eFioNl#{MQhu?s#cT_R!j>l zB`lhM`9_KcHX{x1mwI$BCEXp*0lie?04qBv@&A+4D=W>Uae-*O|9f^1~3v%kx0|TWMyj*QZ`iZk;qrTUr&XHIrKx35MbA1M^=M&bEqL zRlU<9k{1FbvLrHMehD=iT&e#WGjL0U&jvqveK<`OzLjX6){V->a*!H>PR}HW8+ZBO zAJM|)S%q7*ysF*KN+BzY7?8mnSfvSY2jgI#yzaqR1y9m&Sj>g1O;VEM;%z^0hb2yl zFTZdU(Acn0RQKsG*A?`DUVeDZXw>qf5~etYG&a{}_? z9b51rgrg9IU zajy$Ps`&*D(tJuGaeDnQbsq=WB>Smu9VQp%Fa(5Hw5h_`dVUgP!26qvjA#xo7z*Xv z8rFr~3p@#$!5djWLh3UdIBKg4iadI5PSn)Cp_mW@oC0>GtAB~v*>;}6@od!wte7%_ z4>8q`sH{1*MB4tTK4dkVSNc-L6G7r}1+K+BNV;K{ol{f!=U9T7m1P_|4nztir%Hlc zoa(5qP+`CRm&DRKQFHGi2CDiLE)wbi_26{%5GCXFl~UuXNd9Qw{hr&@?*!`y)c;(P zcJ3E$-#yQjJQxZikcjF|HyFg(otN{Edlo$R5$)17d^NbHJKXxu6Otp}S<@Lb3K}SNR9+n{ zXEgqSB!3~6vEd@Zl@$B1N{-ySGgb%;e=c)L@ls7Q zEYCPTX+7@?qHMxLs%~fxe-x#8{i)ct)PgXs!jQ(a@999*!ZKe8?IV_*wl8GkcXECe zcBaePc9zi=0iZ#69h!-6Vfeb$IBnk|mv3rkp$jt^Il?3kGs7&UG8r-t7?~l)4_d0A zf;e7f%ZHY4*J$?K-S0W^=$O{0tzuH_XY{>i~gffN6{#2kxyXAYm)}~@)*x*({1gU1PKC&N#dI8bVNo@SdH7peY==XH8<)~dv?PA z*H!cL|6oWk8HU`nyXM48Mjy;%^ub7mAFN~;a+6#=bBlaMki{Q%tP7JmG8ZhX_r^-I`!a2vWazG?ya)Cq=x8qH+eS@wClp7iw@r8%| zoQV&y4n7Z>7G^*y0Uoamc4p|tA8%xdn;8yoCswI3B+n`ZU^ke<$^ajh<=Hl*pGu)~ zTFwGzED|XHjqjb$?73hXSR!R4fg~cI6yX$;O8@|<)Q?B|62-T$-E?H98N0mQ$745( zAT)^z&sH5wvCur6>0YEfCUx^Nb^2%NOPEydR(T35z*HfcP}n^0Ftxz*^dXO)7BeS_ zS7N#HL#TUuM{Jaa0t?5_TG1Ppp(7e?@PB>0uN(bJRch}P^Y&ILvV|5spfJ{#`|nX} z9WrTHk?s!U`_Zj}W49wa`5JyJ3(;9uKzV}V1FyU6y*-+G9n5Ru?;~BH1j-etlfA?0 zXpi0fS7mbfCgEK5G4@u8Z^@%Y-ar43sI%~D@{RjHA%dcSq=bY4N+TsX6cD9DM7q1X z1_KcRDFvlN8l*e7iFA&xF&akKfB|FMv+wUb=l7hQvp?WI_kG>h{k~qG_v?zb{4GZ? z8aD!;%)?A(w}5uMbLKi6>of}4yyPQLdsNR;%>kmSH}1(M_uhl zX(~3u*B`lGFwI6u2C|aXaH#~AddDui3kKEqC--4@1Zx<8b40PO4^1Mi4#hdexF)4s z?cTu9Soc<{Y1&guL-#uMT1*nXikyPLSib58@n<)Y+n<&O8^5`v84%JG{m@)VkvUZ- z|Bm}q-*X8Hx0x4fWaL_Owa@FW*Jj$h?h*YHd`c=!4I!69rkkcEh?~utuY!aHdI?n& zZnKfIPiqRzY|kW?`PGAZiO@`X&&rA-&?=v)D{nF$cg_-AytEbMeYxj;BP!x$WXi%z zbcow(GiizG8eM%jf$*s{szx55LoRZqKt#XuOhch~CJj8l?W!fX&i|>!?VB4?44a?4 zINiRm1}DX}gw~Nl{!`TZ@qzFO39w$#xOrwJe(=|tY1F22^6Bs{%NeV|kK1k(lcoo^ z%?oZY*t4f?zOA?GzK2y_R_aH8re`DLbYgXjT>q9IF-3GVU@rwGwWjqNI(a})ha#-4 zdFj-EqtK23BLzLYKwC*91LIj)Dg~s@@ZlfnA=++LtB9};Tz$^c>a0jlX7Ee$>b6$d zGoPC^mrBs(RM$>bAI^c7=%NcZe!-7snO&NU|4v%s4^$+g=Q=vjL|>k}K@pl~hp^bC^Aqrm z@95EO<8T}SS;Yo_e{t6YLmjG%bV<1P>*wUEB84k7;d6gx6^x1N0`KDVK<@b!?veo* zG|8S@2Ck^ENsJr?psj~0iJr-Hb39n{Z1#|17`p%5%V)^zDc^yFgI|Yho}e5*t*f2orOQ;*(8g8CT^G-s0}kv8 z1h3T>8HvTO&pIhl+*mfS{1V1OdHk!P@(7NN8|bl^O}sO>CMsuy?%n0F z9o|lVAxGz){UWZaZS79QMhBbO@dIumy`eOIcTb|w+u62}qgfz4iTJCmC#(#tsm-|OGg}!+U^7VO+q?Ry)XL& z*d>6LHv>7riMiNPneswdY|uftDi%s;6~nV9et!bRFV5Hb)+JM}-o-vMM$uz=LNe1HNWV?wJRD(|%kbnd%`*9$`7}x0jK9d{{<$qCd}{ zD{VFGoHVm7i|(2i`np!mDo;=JKO35|-Y&x2OJ@uci`+AJ*UKPpDygv2Z4fK7x|()a z=mDNk26Mj0_ShEV>;tEbJW4c|()7FND|HGLqx4b(xe4!D%_nNu-X~S52HW+1txB$JR( z6XQVS&_n+*){hfQIkix<@}zxW)kiUZuMQP_1@;&BrOtA2l*_fJ63;k4Sw_jpk(;;8 zLPx4`6J=G@^m*XPK=pMP%uhO5mMw)8UgQ?5>u3NV~;21_=3uT0iF(sYgpzE}h4-W`=eANt`>Y?3 zoXNO}jouR8(5KUEz9=r+DIGrjk> zIU+MI{WeQ^rL&lpM&pCCQUzu5;s?LFp+HfZjOG#>B!4l{yY)a~E=hT`ta0lXE?}?0 zBbb{ARq({D7}(aTW33JJC4`QWQjdR9!NqEVWC(ldzL~~73$nhU7h1Lpq1C$J2)LRD zq+>Td?jBJeh1hW9V769HPd3OUqyy)zlLFfU+}hxqCiirNcT!$Q3}y}cHFWvRqc~Og z_8c7|S}!37w;qbwMJ?gB|4{rQbA!(33Mmr(t@zI1I0C?fl5>Iq&p+I{gleT7F&xy= z-y*7-YgW&mNKlBppZdk`RPrW8%z|^me)jawCu)RWb&^r)M2sQg?C7iWX46<|HFO^) z1dgoUB`omPeNnBQy~ClBzrHrbK=&EXoec2z7=3Q&I8IA`#=D~K6510CVj5zK9?EM` zx3Lipq!5~uk0fQ+>iF{@0rqzWv(6^A+Esg=RH1fVWd+ndN>?R(PZ{6a#xCLwUU|y< z*(ZOT7!Ps(0JTIKpM+lkd4OvMs4ezCo zvJWf~rVC-NX3pM3g(hj&2!K@qQq6BVf%Ub(>)q;+mTYC?kklKGC5JoxR*an0sLI$( z=PfxrPFC*QSKRcy06b?A5rUwHJ*6EiCNh=0#~Uk9G`^?E+&2~0QneR6SgsC9O2 z+cqGEu@O1(X!ZM%CA8ErzaQkEQ+-(F4)Zi?3Y+Uk1=)`sv4Cc@dV;{v3~8@YG~{zx zHN~y6P&W!~LG?st(W%zgevq>Q4CwrTVXwbWT=6=oi6z5WnjR{0J^TWC2F^%sa6Gb$ zOA&W1e4tUzXod>`2le`QdC8y_mUG48om6o-huY#Bw?`iT{K@&IiRDZBJvJg7x9Lp) zQ|tP-2ks{{R$4)ikj)K)^wtk95R;^~{F9tN10}}iDF1XXy*)C=Cz7|nGT8;|RKzhZ z2X%)4Lu1k)aJ!0b(xK*yt2q~+`kuVk3x}w`Io zI}PdIfj7#QzG5+uR0e-0rdSy#T%7~oWwNjG!<${t)U$okN2}E$qd&qPJ>)Z=wEEL= zyHzQY4VxRBJpVy_3=M(HeaiIAXf#DdIqd@AZq({*=l>8K)ghO=+FM&aL$6G$(&f(< za`k6ZQ{NjTni<5Vv~K#LXW`bU8sP%FdL+g>@1i+VY5!jbrH`jb7GCj_~uo(feb);4xD_Sfr~&RKR-MK`R?Z zt4B-Tb3vZRSBa{t|A&zGUSZu3-l}Tvz&d9s=!C$08Z4B|mGu>_SS=*;VOG_L6b0+Q z`Ma`ETMq|doO=zmo}Ly$eH7B$`)@v3r`D=QM<^{Ju3p&&^#)%Yp^OX?_LBq-W1nA zr{R1iHIH{smkj7@+uK}jSj?@^Gkxw5`8q7g@6M-rQQZVIgK(O@T9Um7ECF#B$_x2T z$Hu}DZlPs-#TdITtv^3gsS~c`>fy1@b}ZK@vgIbPkL9X-2+M^p$(@JoVlF|ufog1> zvzd?xp$g!+3l1%yRQ;sD#a?k|5AwK~sVhhXf=$VRPcMDzMdzj+KV3PLc=+L-5X95; zFHrk`v5JlVOA>+zNy0*7jxr}9HK4<@5iBnh1fYU}@ViIwx-b(^i~9t%EhC;`>B3~_ z9o=akOXjR?gpVLnuuCV`}o;LNY&vQ>?H{AwP}A;rKw`Px3qY^ zTN_LMxzlgu@OQavzx#Mv^|bO^C#TJ}J7L~P=#40zqy~F(IM4Anf^w*;-+QE#e_%~U z&_W`SiHOs4_3AV8+WfQ3+ucZ#TfZ+=bIoJ_wY|V18j1$eTipeOqDIz43c8u>2KHR+ zHJBAq!^F5s<`1V!PW5c#VwG!dvG?@BEXV7-a$W+uYX#im2xO0TmGcXR65S!rXv~4#z`Lz=<3Jn$ z-2jyu9uk}a`Y#5QHjxRBygD@5y6b+YHRYc_4i127xqRoCa+4ea-sB^>g=A=^?(L>W zx+O;eKWC#G8_CLwonNFsMJ;`YG&ip8?uZrWV=hmHlN`t)Sp}LYLlM=^k z6LIfwNQl`RVS9MbVU$1xm*K1C;ENy2&k4R8fEZJPxnQU)=5oOLs^fA&s@)HCK*tZQ z|4l#g7y?^V<}vN0z^*12hig55!Cd8h`=z+2{?_RN+sZ4&>(b=2R@2^D(Tfrc(8tHiC zW-2)iEB14@37Q~gORNz}Y1zKn;=6jT6a4(U*4 zX84|L`1H1wR0p5UlB1aLFkb*1ARpoojPg4l^n-oX=Q#BQNjCkEbrW(OZLhCihO|TE zfbyu{-!0%<)Mw%G@0IM&CeMT1&_U{RM8zB>naqe-)RMgOOv7=Yw(s=!M$=pr+MF_M z`v;9;cW*D!ujCB7+cPz7@zb}*YrM(8i0h5XUKo0q`8N$ zOpIR)Xgvc%pvq{c_65PGCpw^TgxZ6F?3?%LaFCfm`}d5{;=_!jl)?hbSC~{W9wUdr zLPvA`7tsXR9NaMa^GYpNWGk@-*?9HF8G#bfH>(GqJYeDwt_v3KtaiZP0KzO z?E)qM{c`rtg+E{VdxQ|(&5v~l0QK`ZHJU=D_6OZkyD~w2mT$*}m)>p$U3Rd`#R%kf zKjW;^H}^U)7aE0(9L%-EV1_t8I@0w3+aD`&(~K{#T~R8j9)A9|>ZM{|(D?Ak>|atA z@{L3JQ-Jo1Q@5aQdy`awYuZPPu8I&B)^hQk=~$ZVVo1->(}Bj`EC&;T1?QYQf{5_2 zoP~Q59xE+lUbp|7;_9c{Axv@k2Zot+VF_V3yk9_q(%>EV?6Gd zeiX23T4bMV30QhqV*BqrXn!I{{-xy|B4(aGy;dHt*RG>Ar;A=VcDKZN%o8G_?_?Uu ziA~*CndVxW9UWl@b}nBxD>3GFu_1_JfC%12-Gxk-4>E1G;k(n!uNSysbIa@jSw*fZw(CcDrt~m-ETsKkPP)_?G3kl4dzd8nrXM9Exw1yf6zmb_);(0D-GoQP$X_ zoU82(?_@V>#Kk|jIaTTkK4@h^Ohnm(p^jj}v(}i5-!nRO{%Qt^BxY86O`zCWS zr()TCYHeFVfx(A_L-&%*zi_~j%$ubt{t8YyfM%jlwFO$<1m5<*z|@K0|8>2xJ6UtI zv_F1T=MdNT4+U8anI9Drq<%Aj;O%0Td^gU+uOz)tr~8WQi(#jDo`F@4U4&$GlVQp7 zW1rlX_D^p|6j0~Aa1d;rJmYnDN4SkcaMeZG>)V8&_WIx5$$7QzYYIGT2KCL+>!Znk z2Z|Q)E22~0%VCwIpY&)@E)j1(;7Sr7`Kl)Ui$-{SJq_-vzyN}@UEMCR?XX&W8@Z-? zr7Y{Kc=iB~eZvlOe-6aXsB$x$s`ByGJf&Q3Pep~sC~t!t;?M0*;Cb`zowbj8pr=9U z*J3c#7WTldR@A(0&J+Y7{`>C*>B$LGkfqYg{@ft_0eZPVjQu8((8Vpq6r^0o*|-UE zKJ>Td~NcxWgo51r4aiJ25#^0P}oEb9wsw$Dd8%MvC z>G1C2w9D%A#0K=>V&sQQc2UXue<*538d{o84_vN4h4uQ9FlQv%DIw|-)Cd8CoU?sQ zMNRKa*Q5lkjSM+>l&*b%Ezu$Hyl{swU>q@M@qH`MkyNWRPX1bdqwEZQufeK3 zDsbou=!TimqtTEPgJK`cs-eW0-F1yUFnAcayYvg!-mZ0O87Zd)Ml9W&1n#v-7tbM4 z{rzrkdh(=I>&s11LB@K+$Ikk(9ajv{RqbZP9{|CS_s2g26yodpo2LYQO)5xF^ad*? zSPlaW27bELd+{9>2XALb+o_mFAun|^N>3Rc-My@AEBM&HGjH zm%kknEEguR)TtaG3oKty79!7MB;0qBlh&ic+y7>kQCI$*(-Au8{B%rU!!qwP|rZ#Ur8my-E#eQApOKjzG%b;RO|a7=dOhcclqms4JD4_{9c znfwK2SdrowO$Uc>_0Z!84MQh}A4*^mNjvm{g z7Bv&4oW<;5@V6z6^~;+$><~Ool>8CMVcA@_St$z%xLW97yb-~=&k!pc0u3sn(|l(hai{#BLl`a;J!nZmWBB<8Ew#7RNo zyRw$Ehs*0*E?9!Y%lC#0fuRm&d^Gug`MohqszW~NZbXJ)mP z9637gm2RloNc1)%g(>nEIYJ)fP;OXKrsrYrDUa_%H zx!|v-)7-t)Ej*?b7IydF1;Lz%XwU0tg3n@#)gKrJ$C;ovz8#omZ}Q0Ba|Kd6 zd|-*07ZEXDPE;=g_gJo&1G?;{yQMj3!d{MX5=0k^#`f?3@|m@zGDZFpK3~s)OLzv` z9rIP8HhYWbR*d0E1IqlU%JZAH z#m~b`<`AZ+X{&MNW=dl?!R8W;J0J?<{I1m@fv;xHa%Qj1;v(aGE}dyU3Y=c0c3~hR zJ}p)G((rG5ihF4>+ZN+)aQaV0J_dG{zqe!r&*^L_rWGPZHw6VsB78VMJS$iAAK|}4 zm!#@lxKLsM`&DZm9{At)Cuy0Aa*Al<_B{QPexDO+(g;Ty(es9$HbWvvZ=y!xCg ze`ET!dl9Ogq0peCDphio`2~SgDZ85-JrdE1=ZG84I7S``E1NJ)#C(lC8|w^3tee?= zOpW@g_oKF>rc2R%W8F{6`uKBoim`#)tNo_8rbkrSe33s!O#USB(HYM#U1WHXx#sGp z%s)RJ<_frC(#mDZb>D&?r(d1>gb*u`sa_26B-msfA>o44pdUe;Gy{uh_a&-SEL1>* zTr@94-?zlbe{|stl=1W5Q=EQCLC3XQV=#&btpBS_@rg^xcZ1GJVG{DT`#T!hZMV4* zYLU>#={P>2y!1-M)b-opS$Y_JIyKPTPqTB@SwcN*<-*}Ego)5}+fK2-SLMWkGX}nW z=c|VP4Y%E-VykZX)Fm(3V>D(NUUpZ5BKA2NKVpd~d4{8+ifH{+z3i5c`I_2JO& zKG<{h(9PxiIJ9>!G5(Q}I*i-^W}2V~?OPZ1$+K;a+jJgH{v5%4HfUb9ap$0rC?MAX z=phypt&J5TP~9qUh$86Zr-z_@6_A|7ETO z`4K=u4!XE&LHF<~vH#=8*5oNH^xv|&n3|s9*!RerogVas3jKo=deTqJL6uTo0)5rG zLO*?lW4|Wefu*%J8kg(yt5zqU`5)hCIiOSAbXf@s#fa7g2OF*?s{DGXNG}26n)D3< zfq_Vkd9Qv}yHj2K&p05Ke$w=j4~P8{4V{6@bt?72ujfl6N8h1` z*RE!TNV((L4%uJzE*!ZBa%RnE`P4^DshK%FU9)&g*g|!6j-4UZVSF+Sc>`axlan^Z zFrS`#n?>+6?fy*7mO0PtAOG`%WH{K-tdS?jBvcEY7z!3CDXz8@&UIh9rs7_A53(!bDJKHfv{Ih#XIln zXNgv1onWXyzezN}Gz%~OH#&K0{{LG%f(g+Hg8yiioiKyKK!`~0;V=X{3>^W+AjBnv ze_8^PL4~I#lqfkDart$uIho4(Kf9wE2x9M$$}LC>WRr>L zTdP0AGCWw`K%Ea%U7Yv2j8K()Q5B2xyJ!1?{;c_K|L>`ja~Y+W(yaphgM}nnYb)}d zW4ou!(e?+0_gL!8(M`Nk*Gi658gao*EVlL1@;M_^o9wYXM_;_^^3&tbUDa^uk?)q5 z^&rA6(Ul~kY!NIPGpYo!0YWqWk(r4|%Rdmgo=B_bxG`&MUO{3xE>+TWj&pURS)BmY z>eCKlO%6|*B&#roy&h8S{;rr_vO$rd5Zo1}lXM=6Yb`-pYRy&}iQ&ha%}S`BF=Fl= zUf(=1%&y*oEnM&(%&g(|NTjrje4QZ7Rc`>9U zNZ|=ymFGlU)QkyKOvC}IIHd+!mdkz-(vnWX(d392IZ9#!Ju=8>&UhiB_ZlX;W*mUNw5!$86aa#{jT@Y_cko0|V?GA#{(nBkjl z(ZUam+MjSG&av*Ky34nhzyn9rZ=5&p+_FggIgPqjwnZab-ZP+ziL%~(HcsAW<5ajYg zO*NKBhh^}$Zer!9>XV|;2fjQtH`)rT4qESTZrOx=)ZO0T3Eb`c1fEnusgRSzA;q ziB+D7pb#2Av54p6u+#DFeVrKnuEG0XxuDKDosI} zCFb$la0`zuw4#`HHQ(P|S-kurWXaw(DpJmXNQEfiow+7@)W9cnTryRm`RZ{9$<#-m z@ttxg(2!b?=$4JZt(EuF1@05hI3jJ++WR46yq0b~?#?U<<|I}NOqzGxZ{!9(Xy+?c z4qyMd*vCV;eupY)Jodz~7D@4zEk22ell-)z4W)h13 z6~Hxvx?{CswRdM<3xQF)&pmpc;p=#->ib_te(AFj(8Po6yS4$9d$CayRrp@!C|HNb zS?uyvDxCq&+Y5OWAlemyW)Iok4d*{fL`)wxm|VYXm7{~7sK1J;J*yij`)yE&@xOLB zRw7lPDX#Au616P!xlb~VTsg#F+oBpsh|qS`qmO z;?eKp(dEm>5x}!2zc&gmmA>Fhc6`nf3FXg0CZlh?x@{c7eadrMM20lBd|Gq+?)gvo z4++WRLtc~rI)1MtPhag-I@^`(e@EhT_>9vF^Zs6iPszr2m8sat<*Y2f9$Ye1pW5!V zA|jTyVq^pfn0e2#B9=2r8Oc&3#>=4h>)pH0$T6RNYGgMoko}`GS*!13+%;lUlh+4g z{HQlOw(rlnX0-n+YrpN1cu@Raj%-dSe${Q)V)o~&@0(>Z@%$G~@(2Ynp+)2rUOzDwAd9^nvPfB&CVVM{bAzW^h`9{~b)GaHL7QdY8?g zPF9_iZ$-_yYa8sS=~#GywQhT?CPMSwQjt>d)#aFk8ew4s!y--1d}Y__RZ2N{#ZRDe z)s0@>I{`g=$Buwnf(7Rp|L+OeDDRVK#WQ~w=n{T;zcsdJz;ihc1g{U2CbV_(;emkc z(2%Pg1Q-Q{cp=1p0IiQ$6DQB;TKhw1M~#`Eh?eYev)?pc-gI zl@^HuYwBjN;3zq$F_G(^JC2jk+r2K(#VoV1WS=Pi7uprB2BN@*1lq!ev)S8MV|k7r zecPYj$tM15{ork!uZc!-OHhaHq#yay^KwoZF+H@UV2gF%ddc6v2az9}ElK1FcLZ|V zuTQ0;rK5CcneEJo+f0Iv&fls5>O7Wjv}Gl*pmZOZDoN1t_u5HE zKE_N_DQkS=p}cv3?>4UUBX@V+=+djRnx4j9R~~Fr`bOO>#56mN$~c8Gj0ONmRkKeu zyMFV8n5oJ36NUKYBRPc$+ zb=~CUEP|V)TOqD64;|fhNB)z9)d_@5xJ{24PfSb!8H;gw5(1!He=-2lpgGeewtpn- z_9{Iw?j`kv8uT$xV&uIgF8C$HAbS>$St)uG(Kg7lHh0vpGC_erxGna_x8Gk!GnE^L8KvU~cAOzK1tg z3p985;XC4>@$5}-XWe@e`F5o2$f7qiljn8EJ{|0&2IRhS1@tBkz9178>RUYqVx+E( z%tx6{hJolz1TABlj-E>{)Eu8$F6s{JvLfF3z~rmz&!UJFKM8qGW5Z-_+OnBu6)bR~ z({?{uXae}I==+NLS9M`%erdC_P_9LLq%#8S&~T;hQ(vV)st^1Zsi`)^5;B0%yWaj; zBlOOqN<_K#cV;Ey=c)Ub|8e%yy%E@V)t3<2Hz9f7wptGZ%d$)20h5xsG z`Y!`6h0Qy!MV{tjq6|$iSo@OKDT=AV7yj9Z4{TQtdhVMqmF z@{Q;N%fA@LJL-jC^3=>yrzd$F8u5bBJz6re!;#djGtCQ*h2XyZ(I>P5Ia9MZ$L#MK za!*B&x16+SXC9#ABr$x*w-n?RF5ZdI?0demJnty)o1snM!*PUhzN)>=9#iQNxmgJ6 z3%0hm2!CAroULa?n7CL~_f4THMcy`kM0)99eBy+;d5>=1p!Vdr6C{16Yh4Q~<)~xN zX*r?lntvU|vET;r1*HTARhes|%%-y585onhpw|nHjY+nK1y zn5^6BB;=`MAb2Rk54jMm81(q~&&O5waBzjd(JU;UY$9Oe;>7%QmZ zdX0BH`*I|$5Ks5MXA@TrtA+q5O&ihCZ;A@z~aXjk-I?BX-32*PtisN;Q4fhno&^YG{;o6WAY^m(-vwXV1&&zkFm z`hmX3A>PenxTMh2^U~=LOsL zgJdr?1Eh!Vv03{l>T_OdYDsWJ9(71Cz8j;3M)>B_YJa*=i1-d_yl?6Tlvh^dt|8)T zH^243h$))FrTTz_2i7@`@uWL zJA$Uo=WzTh_w)o?z(o>0`(i?It=jl&*V+}HTjlV=&ob}+0Cvo!Gn8Z+ITaXrZ9~SX?mOL+|U&k#^tF4&;zpch8+*KO$wmd(*HG1TZedpe+%KrRw0+*G_u<$@I9ohF8^Sj^Byp_uUaXJHzX5;#* z@>Fli69riG8eWN3@k~`(z)y)bUb>)Rw!o?Abio1b_Nh0{FofwO?~F%G%6Rp&m+4OCmEBNT&SF%+1e9NTCX*YNz?d6%Imuz_G)q9tpruZyP8TTM?&2W}C zPB50QPwNgP=T-D0#`GwJ9netv#31%B6%j>Xb=4l){VZ5Rm{d3S&A0$*Fy9XzBI)Uw zZ63$FmAeVvOHZ=BF2W2$J}y*K!XH=FYB;#h*9Dg9 z$LS6PlDwO(Z0-lYXf`&<^bQnlOlKlusSQ!&1NBy6TkJ#a^@t8zV!tFF%`smjJ56ls zmOfu-sJ3vudPY(>B3ab1wfX3XbZVkpopQ$v3gUWQ`}D!J-hgkg?AljP>5XBuy=|&` z*@ppNy93wZl8r_y-r@BHG@r%(LgHG75Ij z9kZnuavr@ex9J&`GTuH%FG72I2}6ZfNr=UVksD{HTYtdGOeM{BC^1yat`Jp_7i2Sa z(+ed7P2WGv9&Y!SOJGm%p3R+ORZ0$yLPOG@Q6HOnbnN#i8Y`@BpC?QxShKeyx}d=* zmxZ-cq`cfC;yGfJEA)8)A}3X9sLOK6BsWy|zHHMx_r@CV*DU$@j34?X`5P0;Ql%ba zHv~R4srsXx2CdS>&%8@DV`Y3zTO%v{eY$OQGT^U)^4DFh4cgP6PYV^lUj2kxl$#k$ z%u%$~fE{e4WT@;iXTonOYRvumyeqf;&>;QQP#Q{kTs@DhxMH3#Ebn~2$;3Xx%^!)Z`H*wj88 zI$FLM*;zbduPT2#3t4K9^OsBv@q!N_E;k{WNB&VWB!j~iyV09=B!A{EWZ8^ud2eRb z8Ads-t*F`r_t+DPZB6pnp@*|vA zZinv!PKuX~Wn*?rGKNXy&j#Ra!Fy`rAw}_1@x{7i>90viMQE^YHX&w!qUjld=WliQ z8gFM~76gfq5}D&hNA?XyIOkg4s?MNwlec@KFIF|_N#JrbT9Fw8Zt0JD32QJSAzS6j zqsQ;+9_Eng2dXMUK4>$XDKWrT?uNNxqgFs~Q-H$48Q}M2NhkYAD1$2XM*{fr+MCL2 zZ5z1G>=fuY-IXt2plU2A6}r`^Z~e z;p6PxK`@tqOlhQf@lV|RJuB?`3r3>&f$C_=kme1`-Nw=PdhqB~6Eor*a#Q%QF1S`{ zAMggM7c>yF#C|3*vTq|<^>A0E)Sa3#;$WqN*!^m}E;AgTgD;weX^rN0SC%x`~CEz+__~JkBdsjJJEk>010f zm?E2~eG%Zy?S0ET+6;1SO%2+{>b%5n;sbr#?w%^_Gzp!lf2;x-E}gw;=chk*Hxi^s zl^T6!z7(2+5F$#;LiHbmQRVqBizlXF5ABS8a8efCg|o}Q_vhHSr;{};kHz_$NE*J| z?yUK;&z@tuH7VWm-G@zF09IsOAbl(DY9V^A_%mgw{&Dvm{&=1S1}egv_~&RycPFhi zAuDO7wF&ecbIuJA7ci+Uqt^P`pX*6a<{ClsmY(>rV~+M&9~89SfOqn-#|DiLuy^BQ z`Lm~&{`PIZAW;bJU0sFB@7c^&X_-YIsYn9XBQdPyf}lPMAsQB24WjNSRum{R!s#3G6u^Xug@Lfxyucv- zTo=Ec>fxsr)Ub5KK2me1UU)WAkbGJAZDkJ)>Iow)_`Uek!` zcv^bUI~T)rDiE7VkIby-G`1@RNLv}gw<(RrH^g5=FQMRqz6>Wn?jBB>B)xtlNW?Yv zk!p8Np4@b=U%)3Xu{JnBr&{StHC2$n6Oh^?sMWqu>Q!Qz*Q+5;floPPVefdfo})p> z`r1{rDfioNTa1e;r7-Qe(xTnO7G&n=%Dqiq6|J9SdiD-#>4&k2@cxKtcxo*R(R(5b*hl9J$g$(BkVIfk^K>i=N8^VtJ$AC&>f*b#3j4zzXwWgnIVRpLsVfWX#vLrHQ< zbN2ASx(Rx=m^Dc*=KnTpKYR7^R~foa@18SrdG9X2c6X&Eni)I(R=&CFy7l=b@{(|9 z^-O7kwqHaQq|~~1g6qQZ^Z}Wfobmoqa4`%((k62&}Q7kZO_=ae^#F1r|5Ecu-!SI4IF8B>cBTeP;+Xg4vPd0XS4AUswSw`(x_ zF`zMz$Y(u&`MHa{caAB?5Yl0yOOVJ11uHkEq8FzS*5>w6+hyf@y~{|8(cyc)z2q`o z;O4J^(ON!|8?nr2jQMOM$qtNRV#Q4xnDH*$IQu@bn%jCptzPKW72y?2tV8DTOQMr` z^0yStou0>qtE9XXj}?eMcrZZ7<%)l>3YmV8my=%kHPK(}2;z}uMj z&boxu_}1g>FV=u4>_x!JKI>?xL-6)B*6a~akC(UB>0(z3(^0km{uWc6>~3Xj$vShg zL~?U1xH?&GHu#`ntFm@VAe{qNU4GOv(xjaxjbCu5%MD&KvQgB(pAGPR;RK#Lz!iFa zqtx8&1gD?JKOj;tH5hhYm#cNOPi{|z8jRs6 zhw~ZvOQHB4lrlEloA~_fE@|`!c}6VMn$8Q7?~=iD`;*{k@D*KRf*sSvFd!Zr_;qr1 z89)`f3Ij-V+=C8rgpM!CUt62>j&zS)v^MP?;l6c96@T8vD4)KN;JI(=K@=al113V9D=oT)ak`BbLJ+)u7OLtiYi26JN<12 z^793uB7M`^GJ>LK^^uHl@k(HHp`kpn2vx|LDAc>ltI0XZXzSpOJefndq(Xt?k1=03{3C$ULqP`vHw`Tp+sWfydroHixswM@FEaN053h3c##HSR z4cn(nXsqg-lMzlgo9a}^CH7|K`^N#bwkN|wJr(JbB!0(V`qvgN6j5;{dd? ztne^dqacXphv2yu3){8W+rWEo9ffHMjvo_Fw`EnWC7A9FK(hRj1t=g%Kr<=B>ec}DZw$$Jj4=6CtiPJNM0Y5BswS$0(JWQJN2 z6KG(cr3SeQ@RjxoPmSs=wx^<2NlHXJch^NfAnpAK3r;S@)c)(%TM96fR|ZFOvY<%y z>rZm#J;)wwqUPe}i(AyL^Yyhes$H8mS4oaVOX}N+i1L5k+yn)<$-l>Ed+YZ*SUVXt z1+R0U8#F?UNG3o2kO1fe7BUFrsd-N~xxSOXFE%wMo;i$xW^t|YVVtmIjzR~zJrWIv ziMMkf71r)s0z0)Dvdo?#D1g69Ym|;z=2qD66H33)9aBF_43C+GX8ESD@3_vla_qBP z^?woP*gEDn}r-M!mC1OUdq@NR$Hr@~x^L zl|e5T>PTf%D7UFrQE~n)f%f>ZM)3~Ko{w7;Pdt?58aCGdc|4TN4J*4}iJ182e&iY1 zl)bTF`qWtH;0)q-3+=t~i&HQuD?BRy*#G@@_GdELy3wd}gATFuMsZ?ltB< zj)q~MOkrt62m^Y}A6wsti$nOSIhNjhoj86w%9F-x$*%Y8J06Bze|?oL@2%4uFjD@G zcDv`f6wur2!g7FT-*BrQgu2+@%qReU_nx~Lc^Bmi>QeUF zpF=dBQ|EA8yW5MhHHz=}{z)TIsybhr31@p#aK~!lUfT`tBa(dPY0@&PuQ5*m!~|dr z;k?Ocwf4;bv5Rn^{5e55ZanyJWHT|KQNH7q>bvh}aa*-y3m(x<3Nt2e!-hKFH#LZbm5o1LQavTZQ$tD&~bT~|8Trv!oft?2f%=Sg zSJwj=uEH(UQj1Iby)De6=X^q=PfU6~u@bopsZK0Qw|Jq z33mRuM4{M++={zN3z=*{9(cLm!kl*ofXF2?G4bZHPltP5>x(r%7cac|1FyXs-(XqP z2wvAUd>!$7j4FpV0BX>AWpjTluB1EIWcdWb+?$p@gU!sf$ms8#*J|8PDxg1K+RO#qHNbb29KmpKB?Yo>*S%U2liPBZXDpIfIgLE$*KhEEF5Yf{$TKCuOApBFNjVI zY23Ni7TckjJsS7Xoj%KugKxgHv7JSw$N(~5UirHp36Ku|D{i@_?X&(LqRuoN%0GPj zc1egV*-Ih&PO=jcQkGsRZp85Tc z=Xw6`zOV1&zVGjKeXjF7udd!ld5x%!>`9(4Q-~pzL>7logaM(k@~FI}(uV3r7p@S9 zf8%?u(#J^s3^Md^qoGUxSziC8I;r~4Aosb|jTD%k1B6S*AXF~f6YI#j)Ri*Kd(E!P zPv+-6^{t>=t~?f>Vg1{LXCkEI;|CQXa^A?`4e-xn)!#M;`cVj}xRSw^`1B`oRR0%q z6#Xyeh^Al;HqUboA&Sz2;*O!LYavnWF?5u}|ENDGr^{qPvLK1U$!QT0ccKN5Y1QTA zbskF8eu?P6v<5#}aB>FvKjWx2>&U(?mq}U!sYj2G^>+ohxEEqEw=}OTz5?TQPa@V`Cm378k{kt z3;p|-q`PIgqwh51?g1ajbt;vEIb+jLx^!UhebiA3aa?+8lAD`~YH4~Kk_)^Su|nrr zNe!(!skD!EH*%%FSGk*b2H8P_Lh?fj8(^FLTRVlp_e~#OC7eV()fs4f#A}k0IInGD z^UgBzG{411l0{TdA0k(2Db)HQ5`OR41JjW2C}m!|e^qJRM|*4`g^un&?tXIZVR%n@ z$o@|e4t8;L@qVF^gmA!Qn`U9rrDqIjYBzNs{Q6=*2E|M#fzIRg*7HE!{mZkzmq+o6 zwUxPJS=!*gzJ!%S3Fot}X=3;G`9L=6(qa`7H`^PWC@(C?9F&lhD?a$^4Wv|cN!ljt z(k3zzPUm9X;SNJ;Vo`G0r?nAFiFhfCRJOIT_-&89rQ23xx2a;s<9d-=xw{wyf>(E9 zNV*aK)Bjn0=8f^1RMnJEjfu+bf8VT2c@?Ie-eCSopp~RAc4cpn567=J{Drcn z!t0^|T9%gufucjFk%_#Kx%)m(-?Q?4po2J+bW6`qb8yhN6BdTCvh*uTfOM$|9%H6V zOJ~^#EHRnu;sfmBAf=4%#z%n`eTolS^Zsl3n|$ZwBw>_GoAaLBce^kWQStieNpf>l zyWaR#+jRJyn4x=9=!30e0z-DBc8ece#!0)EmsL9wo)G!|l*|4F4RbO0-q39iv6Rf_ zW&MN6KyWUzQ0Z>t;>rp>+Q8A%=_G{2SdBe!&3oh!c@#@{5JPgWoXen^kc2`=4($$4ISxe-)cQv4UY3_4+kofEJhQ>Rd*53vC(b>_8Sv zD3p_cRp91rtzC+I?C`(Fn`dj;%gln9H zFh=7>ihKuo(_YS(PgmHhrcl)=faTkc8fxV<@hhL7pVH{=lHn#b*L?`Qk9>3fq2#)F z9XR11*r|-tm7apcll|C;YU2Yn`(c_DEn#Y& zF1Bb#2lqvlaKlEi7qJ1NyTW-oJJET(cg0vm- zc|aOLL&vFIQ2e2It{AfpYB=W}TmCc448-?fZ-3tFcRY!L2iV z#4??pSmxh7mt9>G7Www)05C6FMn z%szc|S%s&gk2X9j60p)YUdNLkfQFo0Hcgh-h$`;3vU)FiwKS!K4Ex4d1-j-STH4^^ z08|mk(_Y&OaNB84_?=EBjh?z=)Ct>XBzRrW#g?^tZrSB;L{`EZl_( zrQah;GyC)Hi)v(xL6fwW)jp<34WN6ULP9**sV}#?WQj!YI%>)}Ju9O0IwAB_98q)j zvN0K2-Z3lpsgwuRMTCK5!1O06wlXa51xcjVK?whEO%1|-gY6-)*z1}0$#e%TPfkjSH+o07F0Y&@TH zed=r%L71NRB~zBZJc1!|sk51Qesr6NbZBBC9_gmhXj1=XxGrtRZgAUwfp(&z70|)z z!}cSlp%tv!Gu6!&lq;<5x}mp-i{4qJqM`$mGt3w4Dk=6D85WH3JR0~cZzeACNWVh6U?Se&RK_VO21>qGi3kc$r-8S55s%<(z$)YcH@+B-8-GEbm_3>7$*FddDm@2ZF{~2c< za4GA6Gj)BuC-`(+c2^=(7EiznQByVP8a8B0!;lcdmfPaS2CheZe67}sNu1bjvMZEyG(bJeOWMCajWs@ z(?*d^n6M4P!N#r|4tsv0+9e0@dJ6om>J#}~iL<}>vi^!rt1-mvx3$L%6VF59kq{v8UONW4 z{?S8A(*fa(hMd2_8yYqCsgC5SN9>N|6`uWRZQwD*bU(n(bM@7~k_%|R!}V>p$uJLQ zuK(L6WRCfJPJ+A2bN*imp`-y@YN{U(-eBDy=Uw@B3QeX9d`k5g%o>Ige1*79vyP*; z6fM2D|4wysHB98w>qhn%`x1~1?!+%U0dZU6z@+Tv0iE-f?a8aw%$G+Nu=g=KixMp9 zx=B8gPjC0a`_5c7#00J08%dD{5|Peg@-KI5L=zBt>b_H zLZO9*+#ngn-a+n*hwhDS7QauAGJIOUrI&&j?9t zgKv`@?wC>a11s6K+f~V!HrC*8@Z(B@><32As+Q3;&C!DC9fZ04DBB-5#`vD|JwO|m z%h*`+e--VjB{83ixs!^WvuH{0Cd@9^oPK$WdSYSVc}+p+@9W&-tjOz zAThDEx$MOoz3HdE4+r8-uZ{Q2{ah)@{xC8KN*G=QVtV$0A)Fd=15K2U{p(nB(^*lg zxhxwbFF;RG?nLiA(iXT!?LV+FzEYo;rdq^1XY4JaJElA|*7*6NE#s<}H$TT&v3Z$T z+1ElXxglmJ!0xh%KdAalM0fMxnr*MgRowfk_`EZTJG!IyUYXo2a9+9Za_Ls>uf%sE zYSw-I@uuVQJihqD#_u&q|((Wy)&V$s0Y!AN3?$s@CDBu?zo zQa;KYRrZIs8Mx!zX0P7*53n0>25uG}=gDmczcqkXD=2vXwlCb;MqZhMc-qM2J8m?i zvX2j_8kZZ(_etAMPF4L=zt##HfbWc-vA;}dbj|iCaVq*Yw7=pPML0OV7)nvA^dCK= ziY?1xUL4jDw{vuq4KsCWZ@vhD%*z&1J1*1zI5gPhimlDxezE-~AL5FP$c6BM@6Rt2 z-1S_};lNwzx8z&^nGzl>#YI8NSupzDj{`|mwGXn4MhPjbmKGpERjvcw`6+`eiyzAJ zX+pf$<8D2brwh1xS~M=HWpYWI=`-EYX%QoU(!RQFh3~yng=BJCf>}k~Zo5WJndrn&Q<_{Cv1V5Tct)I_{6A6B#hm@Lz8kwHS&jAtRTPFEs#j`(e%Cx7b4SA^R!C+BepT$nJK zHP6Ysg=czeXuJx72J~D+Xy*e3T2BY&iKOKU1Ym#aXfH4&;gsa(z*KP`70RY@kDWQI zc>8u7!=xNixI%7eBw$vG?)xGwRg4Y@mqDM$O9!0<=1)ue$1rd9kZePBq)Yo&g?%Pm zv{))FB?O0>++HrJ03lVDb=zBY#}7<|HCC*>7D8D2a;`Z4K$?Txy*ERH0An(vK>7>d zS=o9;f0<0E3^jLFiM4cAMJ*G{2{kexho+jd$&8xPY+06^7B8{;M%mkx)q+O`?kc!m z4ZnX08Sf+&YV`E8g3VVZo2%dQwF&h*qzkjNKdVEf#~K#6TO~Vcj$#PIp9?@TkY@eRqd*SJ^U;s5Uj~D_ty)c z?P3=eqmF|KXm6)wk!Y!AzpnOP0r|ldcft}{FU*r1G6LG(`H_b@)iUQa>>Nq&XDYw3 zs~wF@+F!~;FXbM3Xk@;!&gXBQf6b7}ejuf^|E@zWl^UtO zS&_VOk9+F+0jM~I?o7sNkNeNWyO>vG^_-A{l3o{F?tI@qc%@1h#xvN6I#_K{Vy%F* zJa5cDUVtcp4hb-FXmhxl`wBDSv?+W&=c1L^`uyJVYz*MjK5swGVzCaUp;o{Ttp(QB43Wd#^n4bQlI3bNdtuD= z4xcxUBa@wI1rImSJ=}M?E~Bm*T*=PXAul@)k{+MUpBzCpAPYIzb<#56e4M@!Z>Am;D7SH%Z~4@(`8{}zd&$-A7+GHN2MT`U)L)^x+nM&Q z@3kOXfnp8CV2z&d8(aFzWeaH3rv#Mk@`nE3wZjn4Pn;H_92Ok|H^pc}~u( z7dD8b1x*~G7s=r5qrKJA3+F`zJT@b_@sv5=DRF*nn+F$tG@n;fB})J$cvy$Q>x61* zVi-(u?>&By2G87CD=$(C%3}O-&sA0AfWK^^%y{+SgQJ)|jYN=#iCi1#1) zzWG4Pd`hS??!UkzP#%E`1z1mZF#dH7n6wEHqAzY7Vy$a@EPs!p77|F&fF3A zfdUTItJ&N<#6QTO1dGhYInuY(j@-yUGYEWk9aiU}i-aoA8$1U8z=aze?-|%Wl{s(h za>2LkPO|}X8(H~1-GyY&R2xO+-xTdPzi9sXI^-<&2pR?ws-pV!b#f8-yMQ3FvDO&9 z4l)o{r2^^bO8)H8Rf|vtbK&or?zhLY9rS6qQg03O#J-KG+c_eyBQ=+HrPxJViX#T;Y{JEtZiyR#t}t}!UosyiZjdNL@pBSx;`e0JoW^Xl{6n7o2aq+) zSDPA->o5-hQt-vaSH?W2kLTrb00&LN!d~QABmoo_l`j7)ursT?z*pi9N_2z8oBE>u zVsf3D{taL&m4cH(YH>EifU)``P)F0%&AXH+N;{WE6FEv!eHJ5|JDPbr+ zU!TN8CP(WSvetB8wFL#420VLS)@t#M3ou7K8rHQ*ZXC-obW~pQj7&+4avEb#iCg zz*6Pm_+Qwxx%NayfA?D9=}?jZKS2nwwDYgdo5PUtXUxUp?-wmuN^-UdW$EWURMWsk zqFw2@wy#WPxcF%VIkcg_tg#fIc)+CVxwV>{s5XEmm<{`c!8>+(|JV$Y=sca8jO_HB zjyi$o(H8}PLDzI-7-9JdjMej7y86m`%^NzZ$MTd)^5$$B$qBk_e=kK z_$=>zw7!W?ac$9yHi+OYm86UV)$_{9{AkRg9xjgb9%4*;go^Hqyz#92}w znUg0Rd-#5vHCPE9J)viGHt)cr9dxvy3h%PGSJnUH>y`^R#=W{=-jA;C^dIJ1{-L57 zwHe(J%zmL|a!ssPRA>Xy3yXS;1}|Gm>vl;T5Nb?d4LRBTJXMupv$CE69o)j7qKMH4 z$IE-T(H@Zp$aMyUQRr;j3vxY7iNiegTXVk;o>(*%v9D?=$-GvT>F3?}5bs}u9b1}= z@$LAsJnC43F;Y|)86PdRdE0)mFAh2l)i>u4+v8Km$vuQql$*9`6yNe9^5Fz zp|6}guf!2S(U=Z38S85<_pe>9)Su9T`z|LPIwzS%-@Rb`kUCJuww74Fr_7??rL5Oa zgcud45%N6>Lt%IM48`B@Os}MC2>Hz87ORN?2u&4kSe^H|t?G;7%qr+n%o4Z`od{kv zbj3~b0zZ10$P_Pi! zi|-_Irb6;|OOF53b+@1G#HhXv{(-*bGMz^2nEX6s%zz@#WG#Ls^rS*vf=5Gvi#+aY zPdLT8dE{ls;cbDwI_()>+`e+sKSR>#hn+eqZ4~h232E$)ZHKX;b$#afxu64b%_p<^ z!+M%R4@w_m8vm4}NGft-S?`NDd5x!;9M=m;yf16EF6F)3YrQ=jF(h`j{KIp3BIvT^ zu;{8s+Qd_mzjP&A^w}CzyzMFh@9W!L|AiW^d|stkSn-;6;}=XRDMznSRfrMo6)ZNcC6WA!lYFd|{Pd-|tvSZFx5e zbIY}B>~5v1R2@US^E00Dv@SW@-V$E)a8ycN({juz*<@oHG zHR#yr`svWDv;CWiv#E)11y9P?LGN4CEMVo9cpgb6nFwHb!)0Q&VCIic?0ug)Vmj~gYvzglhbaEcW}+GU5=y%;@2hy-T-=sQyP~(l=pH`IJ4+`F{FXc zuYv=PcX5BxbYKI5i78Hp**L61@eNjkeXd81?vnCy$;KZXyT3a3}CZdO!Z57%35P^C4 z;px8@iv~meLH&wpgQ45k$;n9>a-r_tTAhKLHj*CqPrkF*?}h)K^?y}=rJ5O>UH@L1 z(C6H+6J?wu`htrZeVw*8KAY~UBEt_I1};jvgZIWW-lpYR?bi3R_XGb8>7ld(Ov|6S z)&cTVyUHdNzsJ+j(4mOXXf|J5F@RX#dwrpDaV02K?h$zz*wsN!dk+%i!)o1fn3}n6 zF+Et)9vbv=xj{&1efulOq=~P=kC7OtRI*|GLv?)sLUK2ek8FNxalz`~^ykZf3VCig zHUp)>tXe$I<5pnnRpq=$F56lN6->W1n5OtD!B=wL1EKA=k)9tt5l*iJp`P7mp9=c7 zP~K%$2Tl&cZk2-^k4}tAR!Fusurq`0N#oXLtBt^)$49tgDKBJh-9@m`Td&~is=~+0|uYHw8?4U zCmFX!&p$`)Y$|w&w?s9Ljrt)okn?UG@zDd&ru%S*Ve?eBn?gTM5G$KzN7w0quawtA z2p6@3Dpi-C|N55Wl^zf?y%g@jMOC1Y+m6hCAwpcu?AF`|G;oSeK~Wa1>vzF+IU(QxSUH;}L_`L|xDCQ&f^v)pyVj3kslB0geb!-$mXC_Nov zlKSBKE_t_bgn{KtG4)<2EjBe8z}N;xm4G?lp-vA1-d;H}Arug5_8*j=e1x^WZ4nlk z;%V4ncx(1V zh(1LJHs5QvF+~b?a%RLx_cU6n(wcPQL{Vj9P+|CD)s{J633 zD^F1?BJPk=S3BwQpThg{M?HsuYq7ez5`X1mCs?#8yzHA4fPJOBHR2JoYxG$2Mx!;W z<>Q#1a?-(1-LH3Z6nHOtJ&tE+e%0+1b7+wy?%`J#Q5GTzU)n7b5d0vKf-TvQ8qjKc zG3Bv!IPY`cM^lnF5A5uUR`xMywn^DjifN=TyCQq(6)Z2@T0*O%b;Ahei|{=-Y{ zTUb(pz_Fy`|n~TJjgb3OE+%|s&t)1tP zbYw&@!vudWf6b2@g;JPq^|+_XTMEkW45Yrs+h+)@AhnP6bLgzS9}Y!6PN@2#P80fDu(6G=_dR6FW*}$rI`)N{#b+;`cY-c$f@IlV1 zlbot*Vd$^syREJ~8D)QODvFBmK$8t&EVSotFT@?eh3KaI=-ci`NeU!U)R4%wq1dvCqSU z;$+6h<`9P4E-KptXul(|L=QkJZEW}sCNs(Z)K4Jh{LlLS*1G9tk00~A%-@xVCnItS zB_+-J7BaT0IJ*7mhXt*+ez}jIn9r4|=C7b12mp;zayefV)%}UQV;!eIviX>6c<4j2 zshF;S-L)+K=ar7UALZ*OoTpezEgml^oOFM%V0iUu>WT&V?o~yagg1}9jamMm)Z@nU z{~zrEp)imW+!G5SN&+f7#m#d0zaS3^`{1DnJOn7(4}t%jEo5%Wm2=#ApCKl3x|!{K z$&3C@vJPY0(XcGT6aA>;1J>-$_lrw19R-(}=&rw;6;RhFFNqno!}7ycJcBUiGtnpA zN^(_^ir+ogdf3GT!HFGS6Eh1Y(Lu~KAvG>u|r_wS$gLpR+X3_hS3SSGy z$p&I8rDNmhGm%$se(f^01+1^~8>jpfs(gXLb-(A$?o~Q&K825N?zK%4{1%Pputryn zn1f!{4LM+JqSKOiMErw#=X5;H`!XFy-o`Z!Z0k(eTSx`sMd-rIlNamA7PrC(P zW|rNj`K)(UlH3d|kML&$7Gw7~Gqo=M#__lf9Wd5nS}{UB2Eq_oMaW#F{Vu+m3DHHF z=D0usNb5v|*3XaX70dmn>E^0d9L?+NghKE!IA$9=B_BIRc(?7aq(2dN7eF`~@A>NI z=hHMuYvx!?xHlB>l5p>|f4Y$$qM4t66a48Fnb zwMpiZZ{$ALS9yJqo;V90BwHk`r0O2a zpoZradGr&nHU?ml{$f*kJ3ZbXK;wb#hVRzKbUcpK>Kij>FwcU|! zoaSDlu*Lpn_aJ{I!Y|D8@b}lPdF|>wg=pC^VpPnz`2x6ZBWNH5B}aV-r~_G+v~+tL zFbhpVo3D=VMV+i*{XBy<^I6O1X9j_K=iinuTIb0`UI+kVk-zpji~5A~V8WDLWa8H6 z^N)Lpce2Fnq@JB(^nKM6o}oid!)!9H6|Nu&roBEdUxbL-pX`dIJj_latZ|jv%c6Cd zktl#{kcp33UM>SG+<)BrM_W)Rx;clZ@C)igss~8)*G*@I8M`oxG*8t~jYdltj_B9f!3AV;cQb@n3-a z;qonSE#LN7G&;bsJF@P{z_)Qy2-C+i;Q$0Un_R1%-|j>athAOtM4*Dg%@({N`n=GY z;QzL0Tz?DSd@^nN;5XO&5k-`!NHKP#6)7_bW}ib>{f;9fA&uas!X>|z!0(Y&=cGA$ z?M$}3!+%RWI>-Bq4n$p@7|$i6U2zypCnlu-)O8*|40d#sYwQe20-y>@i#x=*vJEFf zhn%gTEb`caCkQ9?#TZpeHuI|wTJswu;}}Sq34822oZI}_fKpydBqiai^}IGwlIkiy z3$=Fm{IksnxK&hwuG~$wK|*z6QSk++Y4qnmu*XO2Q~t%(yIuwng-loj=cpS4>18Fx zUUMl8UVMc{Vo1}ZGTqM~bgQN|yThKA`rhC=^{y-4e7$?9s_}0akTnRug3vV8W}N41 z=V?1SR<(R!>qvk;2JT#a)wUU(CG^;_1`GJA?dA5%`8i9Ozb?C3+SN01V&|M34|XtD z0ydk5qVl$Lu4m-sn5w(@>ai7p^OeK3?d`9{Qxb6YyN1f;oHT)L+VxR4NOvnxZlJoO z+D#Q-81?|P!K=hrolV}(n_F+1_YKR8@Wr526mOBM>Z0OMbt`v}OO*&28X9X?yj~X% z95uUtacHhnVkeQ#m`*=EPy@?lt3f0u70_sq=zO9R`ogZ_KB?C$-9nQ7t!CBu;4HI>`b3s zSJu?I0z7Y+r(vmL`pn<|Y9d?Qc4=>)+x-FHd7?(lWnHb6aemQw$zs=T#bR2D^%(}x zbOs~HMeUy$9nbHVpClODzJ0Uubw>K$Ll-lv01WtGZo6t)_VP|udaiOJ!@u0;PTLrr zZuF#^!Vh!Z>Y81Tl8zeofCguU`Ka;TmE{3v*t9lVe8fC#Ef3MA^9UIs;GDgqig%iE zOhZ+M{xKz5`pjP221&VG~^XxKM|lx zP+9`OKg?RHN?WpZ zv8c^LEH}J;H0Ly0=im*A`($PD8@keN290mJ`+m1Fd2M55M=5UjWoUqmUOkp4D;vj4 zxB?3H-8RVHt@L<)6M%b$<=gDtL=uNr{6zek3r zi|+BMb4C~IeY>qlfAfNz4__++rRRHwwwXa%L-^FfVvd19Q_oi!C@#@-cEDqMA3)&i-8-xw6(RKbFls|vw zVS+~E&7I{VZ3%|=qJrb?XCHt8l`prWG(NA|u%uYK8E<9){MZ+Pw^;U=es&oPIDxGw zOYsC(2K6+*$W|g?Y$)B+c0E{QT^~>S%sQ~$(xj{I%IoSI%QhmLWH|xU38*CI4anUt zCwl+HVpe#|kWqLA#WKAMPWfn|WH0t+hza6POnc9RASDPTOHInRj^cwtQ#I-Fvt}{R zk7uj+&uh`@m*lUnr&M-}Q61+I5v^#Wwa)#)S2Rr8lPb;o8MlLmEqJ&cGHAJJgj{vn zMh_2E-DRa=hb0V)nr8Z*n=ez-CUG#%x92Y~r{ZTCComM|}HTZ=x`& z>H7O0VR{z!_5~L`5N@*K4Z44F9%TiOE08Zobp4wCx z2CUZ$Nx7JwjkCSwTtol)f}kA%l?38D9$`Q&QwnP7#baS}FTgEDdj5xyGo{+w;iSf- zTa9fop3$i3kQ=ib(g%NuT*jV8A__J{mG&arI44n4mXTVR$FqxElwsFx1EC%!|8 z`wc{VLQ~d1n9;T~YCUvKi{5u=-PP`dY~|hsgGR=oKUL}W3E^nsx^Fw|hP8SEYpleO zlnI~0O~;sv{LrZwXj|vHmD>R#^qv+{yZQL|Zj^7{=N%%LxA#qw+<6540=g2A4-j;{ zz=pr;#f^zOwA41`ftwwQ3fNi*+@}Em#9d6eCe@Eb-^i_&B%fKKz?1Wk4cT5l>+E0e z7({hnIb_umb+RH48mo>%2OQEFxwRxEC4TR3{G+G@;LXn#DmO#{8}Yu@R;*tk=4Dju zN&DX)r_0!ZWdKjEbqLMbZ}GtT#}oU{1vv&{4k@@%{f%gy;WD5n?G60qUN!BTV52T$BI|7D^x} z7lkNrkgt>ZDSC>_WX=l;T%fee=;)=SdWuoteDA>YOH|~@wsKA4!alog4D*qj$2Z4o zN(bS|mlTs+gMu`(Gf>K$UZdu?_NnUN!7CA4@1UAJzCgd0PDgp1jmru zfiYa;Rl+Pmm;4(PkEW< zs9jK$C(dZB292XCT8+$Xy!pcC)$<`6huX=X9^?J z3cmc89-ko!Gy1d_AoXXHWos5n-4*QpTFKw2$j0%SI4_0gJC*3GQKGwl-&%Fz6&)uE z9GYDdPgzz9;p%XxmJ<10_Ag83S8S~!3kQoxs(9y%;4j%i%WpbRdEBn1%QtuGk8?gE zV1;NtLqZs(=#fza?#|01u^BtZjupr-L_E$p?33&(&zOu%>|@2-7E}OfKNS>;xYV@XAWoLLY!d2lsbm9P$hsBio`Jzaxspsqz>U@ar} ze6UB5PVfr1LX7#&3|DrDPJO)vpMG3H^eTe7D;^cea#dfDqxfn)n}4$u?B`$meS+F9 ze})3Ka>^v}p(*H#wW$a;^%8@+6^{C>AR~vBb`lY#X zl8`I~SWAHCC5ea;+cv*L7u>jn1JWq3N_It@bXlI;V=xO%xZb7nFT=#;5&!Tm6kjN> zASCd#CWIX-Jd~ADAJuB{`*7Y5T9Q!gAGzRbIQ1Y);=DZtGVdW8#IX%Wpa+QN_5l@t z(s0`47HY*>b8{}#XD74Th0Kn1+2XPh%|Nh@z_G>Hc?{2(WNysN!BN4Eak3v!{}Npd z&Mwi3ocCuX{&i@(s(JQ0pUC9caqBqeD8CX9{iwZ%{deo44+Y@$j}b3=>eW?T2R%6& za2O|z1n0kX{Gi95AOC4b#jUH3A-`#9SyJ^~8N@^}vCwSg(G8dcDgUv46H~83c{8*k zzw)b(_J&+sBBs?UinTRwh=wGy{#BA)3d0%J#a(wupeycoxLW%95@kVC1Y9X+E}iy+ zZ=TG(FI(f}NP~400*1*Z4QthXWUE6s>Ij2odS*PepE+uf%s0Xez>%@lf1}mF+s#}{ zorX=`*{Z(QI@#L-bbon-8*B!lt3AbG#`8AbIz;J+`CdV9DqXlof^Q=dl|L5U?$~Og zNJ#}dvZueneD_eKm+Fhw+8?$LFRktbcxK-ukKbllnC5Aa|GsXkl)T>PNqQ~WR((*r zk{sLk*TRY@nB63#dvL7+V5N*Q|ID*8J@u`F5Rz(e@fo_2XWUw8nMX$>ks{TT}Jv3_RlMsJ{A2;l%mbe2C7)9B>9`3!5`02 zPZJj}_f+5pHEwbX5?1B zgwrgX?|pJm3_9@q{@IrRpNCcLhK{Cq8@la#Cx$hu`#z>Qxk$7T{FG)a+R&Ek<6w{r-WZjK1t*NN;OKTHFYzP%mDG`i1k)zIlNi>+KKPc{vRu(LQYC zdJe8@ZcLKhsa$@(CcAp!7c!0iIT=k|OVKsmQ(XwVJ24?6rnuI=cw@)q0f#0BCLNgZ z(_-mFo_Lk-;JgQG>L1Ttks>vj9Su^jqrl(xU8kc+)!L5PG#)p+lukZ4Af_od14H(V z3a0dt9;l~_ZD`UghFhnLzhG(Oo(}TdaJ^$y)MkzSb8dWdQcwW(3j(orpdvRsif zP>H#qsA)IPl-B;-z7cl&?{Rq0_Aws6QLBzJ+dr3>$+_y&l+$(*7;!6BP-*px%oii^ zpY^wm8bJCg2iaog+7gBgQhp%KyP!L~YR=r(MupT34d?g*m6xW#JDfk~<|6X`8cfyS zsZcVP^LWC?LL_oGDzP{Rf%)djgH~_+07s4#1~6y@t+3=VqNjd$#B90-$G3Od2W)8J z@O{ds$;OVSm*&q*9S4*zF|G1hbW&p8O{<+sM;2(aaW&NvmjhZ22)zV-SC zpkOy|#iFCvtd>0{MDt7yANKcN$NKZkSq>RzE1SQu4wO}O0wz@f+*3dwhE)TT?nO^A z^}%~RwI;*Ml32OODkb#(#`SbnfJg#G}cKJ1u;p(A{BQs9o3+? zIOGw@n4fHuIWR~*V9PI&)BNqXgM;=i-h>b?&J##m&DeF#AcdtjLrVkZ!%ptKLVUg9 zfmrmwn!p4qxb@8AC$4AR%6x-67Sz=l&uA@6%q4i(Ye&XJ-$h>BC4xp@d}o$!#h+Zb ztNoa47y!`G>(1F~9Ag}nv|dF$E?@XtVv}c+!5UDjSLH?$JoQr-i$IH7_y%wwh>DmN zCQV{niGyPDv5~q>70l6#X^+3t%okZU|478gKvYl=4~=Lo$2f8dT4lla9n*Im|H2=C zp#Q#z06Ny1MN7SC+K8CW_*F-b^v1j6UCE!4^(C3%TPpNYXng@Crj)*O&F zCWywLq2;x=tPoxXssa25A#z@dZDHI3_ND-3!#>2`mEco_E$KhxtrjYypFr+3_JBI0 z?;%e<-Ni$R80d<|c~^8V+v$DMSa#29_GF~p{}=t6#5 zQ0t*^)T~Po;b`S+17>b39;U(8GLtK}q4C+16~8SXz#423EIAu3DV*wEKSQ(XMhJ*} z)(}arY@w~==;`od{@lwZVg?%p6%c78vnx#I^j}Y8X8){pRZx!{yk!IuW0K?iE ztR49L8~1G}fid}s3h#^f(w{nvICSO;2?h^-&uZfFu9y$E`e_hh`xKF;#@&yPH(Dzp z9f8-X6DP_iEasKro+_%ebE_KfuiBgA$y3E+YvjK4(e=7Q$dx}oy#n@m5%0$viUW$i(3 zyRgXI@be>OPzMc>s5S6g9Bci z$&__wF{Y|t;fa66&&4&}4Atlebu+PRH%`y3mxqGrKVfoZ195{ea=2fVbu7I@65cRy z8&5&1kZD5cbjwD<;pqcYZPBli z@SJQn`Ely}h>kguY4ZUZK0aejk|OXj`D z%Rdt*w+ss|R0?im7qO<(Om`|GnF_A|68W!l?(f5HbxCE3UO>a}H^T&ilbAt!%eQ{- z9xMSYIp*&aREtTOOa`qVKz6_4gW|`EU!s1T5WGyIR_1NnPDW|BA)TLLa?nC;or{CN z1~qMH#J={THz6OM=OpiYWBzoBIy&=mSDY$b@0@yq9XzUTKnIXO8e`78I_d*AQ-e7>HK z=bQANkhKNa=lww$(DK)nUqp2Mh#78n;*EW^sd9fC**MwjKcf2Jtfx#{=ob5}9p#_^ zkB+u?w^5v>@=+(p67{jx@ibQY3BLhXzFU zW1kiBocbd{npU09;gfQ+D}FtF-H006M8)Ch`79wR)uwMj`>d_#72H;D%>B%EnIITO zGz8)Gg22T(*eIDU&ffPOJ=p7fLd4p`h(6YqdjV!#d+?ZjSWS#hnK*e5{%^{h}Kx+INgFmqXS2KU_t z%rTIvkt(-G`JZPAXxV17F^LdS z7N+<0XGI8l0_Xejz3udC_*#;I_9JKOB3qjcr;s+tYp^C$$#$r%vbc3wIc`EYT`-+7_VG?Go5C^)|r#3-7u$QwUCTpgYmzBwRfjm>xFmWU63>WOcm&q-@cDp0tKd3cN_e@W^VxQQ zrkAb=&w=YWRO>Pq7mrJqP5N`@oBkzwVlZ;`b$TVO$$?1Xjoe%|*mFyemnrWqbgApsE&RQAc|`ZXl-ek&L>*8Sua9l$`(5RKiG_3Q@h%l#?`( zK}|}iu#nyl|EHt&zl6#I(v-$slDhJMH0koa$Gi34*Aj+yr^h>xa5q$D=C4T7W6`Ry zbn*$1yZke0|6^4A^E2ZZeo7w$C@~kcTM0Jh8=JfO)KdQpA0E>7y|3|uLPizD1qdXy zq!}rL1Ki~nn_xP;trj0BkCYUh?mH5Wls)~t>ezlrsYi58=!+`(ZZY$;%7tMe%Z28@ zyF%`pH^4d(Q{D{cL)JcccCu*1xp;{FDOjW*2ec7Uajcx*O&z`j-}$_zq?Ew?0l`-# zfeT3~dhXy5BKcnBg|^QR!3$)gZ}4Dc$^*8W>3wSVzs#KH)-FzBbgRNNgiBgHz6noc zqw6ZfXCq;E5 zOY5tH`=7Iq^6vWDh=XMEAh0bNVEsK`C9?kRxDCvj|1g_TfLVv&Ks?z=_=rr0nFW>5 zyO+2#R0!IRRe8y^#=BN=$Phw+EH*~&amhlaLjmSrG#744_dwxzC72WZ`C>Vn+}>Mb^ND1)rA?5p~Efq zp%ij?hnjnG_v>t|UYqwXP5XnnXyvC*jTUlbX=R-5j6Z(DLb~;qWImPbziV1kTi?}5 z-5$rRxk0Lx$lxl7|L*jB_|6x@p&9 zvRQk9k@VdQKJg^53l3x1QL_!h%eWv64KQkd3>KyJ(ECD9x-%Q^`8=c3=*)t|t-GCA zWRHW}T_;<-3LIYA7;w+6NeXX?CVLGxCcCp{`7AhS-fVU8R`#?;u!6~cG6EtOOln4r zdUtRNh@#&^EIwI_#MxXX!TV(_{iPWL^cTKmAMgbOzkAs#97aJ$p1!aF^U8R9Y;w^@?nTg=4hm+eU+?nQ<16jScRsCfk2WB>Pz9cWh4Hgq%3*yxPVVM@9P9 zP#H0B?Av6AY)5(@7k=t8UjpHq0(qR%-awI{o#i@?&i1V&!|6jQrLc!qx|YN=WuMH5 z_ROLF7u;l7oayvYNcgn1+uXJ*%p7u!ETBWS)79kq_lM1=PrU7~VEv$DyS;*9g~8c# zbV5QbENl3a2pKKnY>`NL*XOv^{(@Fa+Wv z3K%}gI_2e}X++vJb>5Brt-W^t6<`^XdSYiZ2lCDgOn3(t>1!@OLzRjLUB6>@Jyf`a zLiK-`ST^Z5+t#e>-j@$<<NaXE_Wbum9xmC~-oHr?y!;5&9E=c3{s}dhuVP3i1I`FDCm7IAg zDM;;b&W&&)Mwm7)b`{Ak{`pCJ)TDl+79oEP-d~G6%UeFoxEo5fZ}Dxt?7fbbDJzYa zsoc_ueTO1RhHW{hMg?1%v}1YlLPD0Yn@g!xQ~qP9<%is3mRpz)_krT==^`?UCn1xM zo~KBZ%{SNvwu|}l$**%YU81LWUaBiMK2EJk%`WaZ^HW8L=BBkncO_yeEo09ZT(dR- zC37?EDBSJGw~mJ!I#UWCTf~uF+e*u&;EW`{=GZ~qJ~NPHvwGLE%IE^f#yTQQFGH=g z)`KWc0jviEUEF&Tv35~y{%UY7AdAG2OG$H=^Hw9i#*KzZhs2{o)()zxAKZ0%m96Fhj$hY8IA~#<(t#H8tmUL6c1^Uw-D6o_9CY6NRNyDErtb$?NIz(ISb6I zpI%>@ZC4S8T})!8lrRvJfC;jEa_0-MZyWMsw!hi7J`1R$FFHuuHO9hR{$f=md6u2Z zVLM7qo2+k%H-Zr#@Fa`z)jyrK4PZatp;qTg(rT-$``}JL?fZAoU}V0<*UCgdlGG>X z62V;Qw`w*PH%hX%725srx9xA+ECo`aX?Q@D#p2jM=*uN< z!`q*WO562!@&>{$0>O=dE`YhJi;oFaYVDVz`#130QyhzSrbq5~o=UR@Ih+ZwT0R~I zxjWdn_$Su9fQj3pD$UM4%A3K%dW|#w_#{%UVS&he+Ie)x>s?It;6m- z!>CKzJqr9KT@X57>%RrEZL*`{BI^=GP_n4W4hHvcHMi%Af^Ly*(Rra$;K6{l&bfpf z*y!bPFJtqB&M*pGI&=AA%<0#T>$kWui{5>2ErBnT0+a7gMgr{hMa@%U&SJy)_b6KH z<5m>?Co3W(N|=`t4+&Dn1B1eLjQ8~r&RdZCWV9<3jAW5|{}~i}J&rqnpL9${1?zdv zKR9&|gxPU$9S?1W=l+FB{Yl|5(7iiIRF2^ulLu#8`PrQxPgoyTJxCus_f4?di1t1{ zjG6@pFBq_bcc)*{V2%#jgzJ3aR(SZhx8=4hbJJIO~R z|3^_ISeI%q&6;$0mecx}w))s=S^%f96*q1gyD+r4KDnBXIyG%OHTnrpepzi>eml>V z@xfO>+LcK4=q!HF)IJ_`d;(>L1q}ooEPRL$*hh}#;R??%OSsc<7p^&1WLsLDzG%x( zL@alLZ`5tk;h`>Y6!lYlly-EdXRaErn5Y$0vEB0Po3>r+80FeMv|n)DyyYn}PPFPS z+4%9>31U|mtfKmBvc$82zj_S@8pf^(I8nV(Aq28xw$TTqtiL@Jm-L7Dzv>!MKyc`OLXrq~oOR!EKCm)ybM)Y%4`#el-LhJz zFG8#D3rUEr$ybO`N#fqNGCNkQObQ1gB4huz^f8iIm zp5>;vK9OL>d0D@b(11DI4FJW6S{QE8(}dL5jlRO)pR__55U&?`(WOT64P4#02YXyGw^^3W27?{GBhH%iKBm{Ux9kf3*eIq>1 zr)IN@ogwrU=kbJ_XKosHVDkuW){!%O1dH9YDc<4{x-)=3RH*vMs-*EF`zYOl)L1J{ z+($J!I>TC&*i*5 zX1GhuR+B4}81?&H!HZ^sCw7tqMIf7Hd7ovWyI?sHTVFhJdSt^)=R`mZH_(@Ah^;06 zgbPUn<`BcYGc*yW8`$H$-@VSU!2B_Ld;`d!hqs~n=}6q=W}7&8vM4q50h&g z)>h667@K#4=^7O@>RKM3(xP9B818F@&&?}~2kL5%^#f|oB>Ef^{DPEJl>?b3In4>T z^fkhOS>op6bv}uCKeVha@$B`k@1`gy}^gF9Sm`2G! zTJgUYsMF$m+y7#5=9fhd{4c7hX96Q5vO#DhdAho32u=K}=3P5;vLAqo33`nJWxb`Hq zP(}Mm?H%`jtNt>u#Vc>mo>&zCQP%F@>E-Lb>pMr9z%VnO_uJ6J$92um&cw*{pqSo$I; z-;&^q84l9T;zy%Bk4`gvba>F_^3pvmVp|81=hY%QD#@cuNA@iprjiTMlm4+X zTAd8#VXiLDlIBaq*u62r*?Q22w!wo!YU`hmHo7eI=l7u|A|sjgXa&6a!`3Hc*8-Yr zxQ;*V{o9n0cA;qsus7D>ZWF;&9^`2RU;R}ecNZ_g;zPI z#7Nn7NJ+YJXl$g8R!8D zyls+;5$ost7j%g6g@h$z*A&u#9Tw<8uJbld@mTPkxOcCeI~0+YCD5z>SYmUxb~7V6 z=rR-2ENV%x{WnapGNQ!Xe|I%%`a{jAna4P-Kd|sxuFK`_pZyx1S?wB)y}i7PHD$xB zHUX_Qmb-87u!6}4x9p{ApiGN?Lrx%zBB`^?xL7U@uB4IWF*vAQ??AC^H(yJ?`8^M{t$vFhs-2X!w{GGr2yPQ#x)*hwD*UzT z7&GtptB?<}Zy(uNb1RbSwS;YEHYfg!u^$90EyKnjmKSHeG!O+F@LJd#*pBIug$0Zg zF4d4*QHp){b3X8WDB}UzA$gBG5vl84{<#LV5{UoAIU$#{=lmW%nNAe){}L(~sv$WC zRIWOiUJ6VxL=uem$CO!B9CrrJc;Y<{oPKCyo0dPkr@bZ%GvLTuW}8g@>J5&}|3^2e zvIMLslk0?@y5_aqfg)v zn>Q~{zWG1+dx^avOI^ko`k&|F+}_1&;gK3~=}rD=tH{}s^ASfvlaMIaKI_*$o`RPm zlqCY+)m-vkA9~aN01j^dZJHR{?84-=W&%?tynEH3Su8<^&Z62#(AVMEp!c1MSz=0U z>2(q~hZ*>Qx~!O`9ng2FYm6O%%Tiy|+Wl2(e1zf`vlLiwo)`O?P87zX4_mNT zt-}kOzmGku|Ej5OXsCxIO!T^C=Jg`)US3yi+HM8z5IfsB^uE?+x9V~)Z-@wtVT3Z{ zoT4mULmcwGo1q{t!`4ops$@ib>?aDdR-ET;<_D72nmuBEa;yLw@TxN+Mg$LA}=@2cJ^Nz71JMvk&OLP zeEWQ0^Wx#(-GZ2*{K!D+KL9v;g?V?5CUyoAA`!SpM?=~6>$K}y;D6B>a= zr!|IADn<>fKcD%ouXNv2zg5q8UwZsCl;6>!zr8*aZ!~UTcv^?HZ=-2`Oz|6AH9B!aGvAboO~DDqYZPYkNMt$TIlDZT9d54 znps@`xWJ}zBQ|m96mlsDYi!Su2lWtk}lG)AKC`SU)jK{A%Ni zCQ=%QCDtDAK=A*j{%zU=71qZcy96Hy;Rn)qlH(VH+iCWthItmg-;%)=&v7IclifT0 zGvAzbKhZMs&*%;m&{|$Nb+f5^)X5*IZY>TQrR*TP`LjvUR0N}#9+$@z_ME2QMwMW78Je`t&;fbouxoO`=+9L%eI5valnKR%3-3}|dYQfrrpe_P`8pmWg>v0> zeP+a&U1j_yOWOarYWe-1PXQ0q1bs;Ve@PlXdAg3dD7ScYF#Aro+-to4eV&-i<`aNu zdV=~yZQ+_3OGX!6$t#zS6}PL+2q9)o3tRS?d&6Ue&gyd}bg)0fSDC{p{o&!^DqDY} zR;|}&3J}zs%Y5eC*~&{WVy7jEo1JZTX1(%aaS(IJ@@BhjX!9d43`>LH&r29BW>F8$ zDF1^8G@QH#v`6iDF1=w2W&h0eM>S6wt;_5J%#xvecsnfkbnmnk(|_rLxB9R~G0EVfo32Yo!!`gm?CXXG~dg(3Q9jz=FjZYUmn^u76AAXn3FEXu|JB~Pf zmwPwv-DmdPG!v$9xsDrye2 z3e-xwJsybTuj!lJQ|dO%ouqNK)I@>RU9Kzr+`0imx9^w~#DDwzdC0yoD{;5)iZ4Md zcHPGuc^csxrM!qDbaQ1u93hx)$yrFhZ8Q3Kd-t#UI=DdHefX z4s?-{btKncGQ|D(qF%9NPaT)B&uA8qcJp&G?69M=k@86KnGqQo4%Z~oX(l0UDzrdG z=|sHgQ*FaqUWv$4`*Ne_c)sSb!4p&Q6z}Ki3dM$Cx*CI9!UHbe_6L*6V=pdVDkpu> zFTPvwMqzlrq;m4r0nXyhC#h_yD&Yd6Fl$SYkV9n@HRG=*t)KgDB5sj-7tQ-(%C`8I zHNWlI|Ag~1;zysCcDU#K)}+OkrdO-f4K+*ge@>*ON~UZc@{-$EHs7!>O*i7MSUq`$ z1ajz67qN$F93Z1PSp5R zXtpLKSAa>Vxrp12Zca5bo(_T}$o8$+^VTGE(^1m>W7(DqT$*xj_g`-{3!Jz^uCmc| z3cWb#-MiSPT(rDxmB&Ty-~*{tejWt|P#!>>l;w}VWIWe*M81<6oxx{o@%l3U%~IC% zX{#nQG$jY&*>}G%5;Mkq>&1%#60*Ze00$3*U&Jmrfu0?Or(cBHeNTN*GD+|B$EkqC zJzc(fDFgixdqARQ^%tsqI5~P=vpyhFX&rNLCOAFw*rp=Owwya9T6lGmxYR0PhKh`x z8#VZWps-i$^f$}9I(F=9Tq3#v6uoD|4)PWN>|-$Bbw39MxY&pU^alH!*E^rgSU*M9 zqhZT2!)L8Nd2J=WKuqaRL3tTXl)1N0F581qjnB)Ph*CEa{&8}q3C@yy%~p1`v~jdg zJA`eeUEo5G|06bhVyAsa_UQ<YO&g<^<*oIX-dl`IhZPG%XUWCQlMzMrL47HJKKvz^;-)&f{_$Gm?P9mEbFNxk zhU=kqRlx$4`j5XPlA)3rxz#P_wo1s@^k-&R;CTPM>|>H7JxOHQHF#YpFnVt~K0`G_ z?K9u^AE+jx3z(h57ZS^TaHubEblojJjv{5&zwWE>6|f1_h3rHzi#*8jZ}d6>0geMK zl=ds;qMY{A&Mthzv^{-%cUSGRO9Y;qt(W`*2j_0dd~f|D7RLc4bY#LYfkKv>xFGg? zhm_HUz6BRP1j_MKyj6JgO)~Ftv{`9EXL`4CtGxZ0w2l#ZwT9MYpV=8bWrx-eD+_}1 zBkhncr=|8-=eLWp49}aOQj4dqe@%&@D%ymjPQQ~l)oafJUvu1=8mup?!Wn$-sItaM zJ)0BsDYoKwF4u}-f3{%dpb{z;6TnQ9EO^vB#p0HIJ$+U{;J8hW z9C`Fa3sM#T>h2vgN)DC`mjZ5s)Gr3!sl!$bKk|!d7h}I{c%S~IGwvI6-(uKnk#%HT z8R&35_~iyhSDJUn09^jG$akygU(VC4ePO0&4gK}EKi@u)run#=Hki(S|Q^-G$M7y2Zv6X2WK7D~D8tZSJ&r zbMJ%Azh5`XQF-WltZs1Hv>V4pKdVOV@4qv=t2&rVVCeV67Ahk&mZ~q$mruv1=TPfa zf#OO*>-wGYl7us+m4N^PUzDbdC?^SA#25^=(bJ_l0@+p-^Reoyrd%POEhA8S3`Fq(jqiBNwoP?iy(fc@Z?m#~8>SE>{SBo+WOlcV$*!H>~9P|lY4NDc7|K%rCf2qf^LRGKi z`fzTBKwSg{E&%H_-Pz1s)m_1-e+$;@+5sTn8RvY;&339!2n#bxmn}CqDll$0fY{~p zf{|=UADZn_6!H-dl8IKN^vx_{yk(-{=U*yZA$@+{K0VC=LmR~uB)85K_0I3ni_iR7 z<^3^X;XLbj4=1=p8zi4*oFxK042l*g@|5}hID6IXX+c+tu9yvA-Rg}|;+*B%8yMr{ zUpIou(yes=lbweLzCQmL!&p;W5rajByOqY6ONI$rgTI6%wLFY*GI(ORXam3F64#@B z!-|*#b{A;aCu&z`J#G!YJUfj!y&yqQrqZV@%;OJoPaiq=$!Hk$KaI23Bfv89dZRY8 zhh+6ReabEaAxlOEy4uVH_i&2y%&V32EG|wa#Adds5J(k?`yUyzdQ=9Hy!Cf100RHg=+Ghox-=o0l~pwm=KyG3f_NB~Xv7ChQ1A`JI- zu8e&jWmY$pxK>s7xyYs~!BO^Dvpe6P0-AbcHfS2m*stfr&D0+=VjV zB8?Q!_jmVh(nT|VqxfI_QX zU;UR&5hh(*YduWOs#58tSWG^`aU+_0T(g2y3n3z8-k9dd$hPsB&q^5sfuCE*Tv5oh zFBT|dMnS5TKO9W4%V7oyt#QW(UiF_q z9ECli8|5NXaha1@ueCf6?t}r3?kJ?cvSqyPxH21?;QAV`%RY&+eTZl^sU}z+>GxkJ zy6_n8E7kQcXl_%IzrAu$?Xk~}9{-}@f$>*;I@*{0+|%iPebf&;OX-BI7AJlY{n!e0 zcP4;&?-yd0vMc8Eby7ax96xaApC3E1>nJyj3_qOuQhi{!*2K|64=KYuzMDLO zr^L^MD~wgpvrWh9X8C)_dd#}B#emP{@V?nr1cMM~LF~jC^Hw@*e=8==D4Z_=72<|I z^E}FG?gjzx3xU#Dn;Tx}&&u9C%4_z2l)3QRo@IsLe`9yxuID6jM)Mq^yfr7p38gf6 zu4}q;XvDZUzom1KAfv2MH2$9Eiwukq1ovT9o;f)&b_G=L=H|0Ln(*8&I-KWfjMD7b zZ)dv#>hz~BPZOm-G!&#I=Jxw#8%jd7j&u0VI^O2+**)ipsPG1x4u!XkitP6YX?J^0 z30TQ7L;roPy=Bz(S-;R@=KY5`ok*cbs-6NxItkM998gL#RoB;aYK38L{n;kB4b>Hz z?0EvkZ|2j{!#&NEU-KwxG4e`v5sq>WuRk&R*5_8$Zu0~7rnB3_Mf^cM{N#K+K_ubr zW$D}kk8?d3#g_nI+Z?^(g2FKIC!c@V3cW|8#s1Z03o_v%t6jW^Y@Us*fen)7%v_5m zg~ADb2UFfiw^k7+}HzI)0n(sS}R*FDy>uDM8e1d!oFM@IWm_BQE2IIrIbw29fPrfIhndKR^* zbkts7zw7yT{ut|O<8Dec@BrM%un#)8wcgI# zUR!P{(x(|OqT7-axOc{{PJ3KN39VA4(-_q1()vMm&;6c5Gzl%FG<3nw=nS?<8|SM2 zV1mlKlFhvx&0~RSPcZELeJ@=2wOFw~4YT5-{Z3qeeE|Gckp6OaD>KI4Nly6`>f6zY zvgq@WI#vmI6F+}Z>V@U|VaVX(qIV=m!2WBQMoF?32zpju9b|7}de6G5BFOKT=T66_S6dTLGHHYqo-u~8wU-Y z_w0j0010S0nvaHC6)aRdcG6#xOLir_`_#(8ayWAy9Kpz+r(-Ncm~|z-MJV}DEp=ow zVDzwtz9Eg`E$!_uKG*F>OtEL~=}K8|BOodcut$9m1sWe@ym#5e#|E9)3Q24Rp8~aP z9;R*9FZrHx+wPYjX8W-G5v7_k3kjx{iyZ%!$4}XeONQ!&K-3R!&xV-ckN6NHCZif; zWXCGO0Uaw!b*(T0xVcHm8{NRVw$F}S>gk3eT!D*pPoUqkJniGXKKKh!jv57(dI=+An3 zjjYPozI(!yDt!b^{_y#eM%%{hIPfCyer}&V-R(w@s+lX^+b$p*dfjySh2WD_3u1MEx zWa=}ynOw3*vlw+Kc`$EPi~3C=k5vDPcj}L8`P$>Acv1>t_xPt#m7jW=xK$GNv&&zr zhT7qqoBq;wzc^dk^dqrJemlyP`Q*wYm;b0MBvhPPJMBg8n0uo4BIZxjj+wnVqhNr)rT!zpDC1RS5CU`#{>4gZ)VRrQU!Rtg_1dwR3E?cQ%yP`#soGzf_mwr9v3(nX_J zBR(ZcA^)aX3Z`6+ho*YDC$iI#g!B?ni|~+Ob(+ZjQ>1$m?}1~?_xNXh173>`svlk% zIxyy&B-#+0t>(28u)WOZ8&AAs*r75t9)FMZfo+7H-vDYTEYNcIn$cW(=h7y;e>wX| z0X;lC{LNo>jLj>y{)CQ>W!(Qr+fJhKYkGgPPj*P)^6|ke6)vqZt*-W9?^)<}cI@5+ z8oafk^Kcr-F|Cg5Hm!igewPYeh|Ik8lc1Cabdz=4rE(X$-v{%$Nz{M$m~ZqUblb(v z?$`U(Ekeu;l_A1Xf{;Drs#fm1ti3G$A;QQDhSahcJ8d(8%CMG5=M)EMsnVVYn~hvk zZOZ0#%r%ZE4FVT@dau&O^4jk=NjYCm3s8U6w)VA_tCa3GuYSPODQ0Q@pl^oT2~%Hg z4!@&hc%>aZ9^&0p^Iq9+y<(|UrljAl9!5p45B>m5UJ!ymUKd zB6E~|H>J_|gF7jWT4S~ZkW9LI@UMl(YMvAOYnT&n5JoPZqCV|61@11B8VHYXotBrn zs!wv}7xZjf5H$`;f6{#Wr)c+yYwtinM^bj`EdkV=BzE^91S_$sIUZFM7lnpKvd* z0KoCoD$~W{CVAVJ@6XPcsJjox5%rxtD-o@$?taVdBkV0Fe|M}HiZ5^S<`7zJB+l37 z&l_^>7bFu9XS~DV(4ER=z0p7ySJjuWeU#IX#nqd#JJ-MqI7OhkcSnZ8;iJW0HW#}u z*d0Gh7*v~<@BOjwtV}1|Y;~P4bobe`brUHK!OK^>js>vaAosd|6;sG4S=_aTiwR2S zR#%&(3Sna5aD5Y0k6V{}rS`KgSyY(HtvhV~#k-fnrVZ;rVV4aqOnZ>mWcjS6z$X${ zyfquqyDm8!dKNv26KDk4)mBEa{ryqko=I^%m{+(&J-SPG*b}cwXD2SJxD!+G z;R03sJr1n6@o19k=1>BkmK4@-E2I?$mW$CKG$behv+ui3vI?GwfkZN7UJEb3= z7;7Nv125LL+yc!1P~kPmeiH)P_(OlS2>2}| zC|kxzW#`CIF&aQ6G&B5NWa?13Mj9sKHIQ6=-EcYQYC9XZMQ$nIhPl(1>u zoc-oLK)$fdS^NE6rgUDmhcWa{hT{KB_sAwv7=>V`Kc5~P|3Tu@0Q=V zy4nM#sFHLo8FewL(ss;jbfhJdPsv)j^xNm-8G%!6plYQSW?tX<4&-?9xbUZ%%DphT zECHZukKi9=e=O@TmfN5S6t^IDZg%=(VblX1~+5zg4&71vebi2CC%GJzyMCDZ4f4-!j_Yg7ROTHvT2jITQ9l5BNCNNZW9Oe6O?iDf>n zMNc}sgJmCN0NXEIU5(lQrBaYacc;immw`c05j9|~#*;;qd?qg?R zchtM#KO~Kop)>MJ^dAUPvk6QbV4SV|Brs|VM zr&QVQ&0!$RZIFEyG#opc2YpD`D2$c(i3pO0rX9qe;CRfkL8&cYNGkaB!kj z7SC+3lyKQ)d+RZ#zHY(|rfe(l>*(z3`JL#UqfDs{GFb`>KJ)$#0Ud(F zbO#4IG_N49*4G1T(lDSycwY7W{UG^Kw>k)F;scL*oFf`o4KO=VVcdrVg@E>4kjj^? z*VUGQ<(`{iTWi)&jxOFW%6co9ep95#FoZzAw*A5vV$Z5%mu!ROn1@&AmXtSx$fZWG z&7SkBpof3^>=H+&pCyk!;Xowu8r+}gsa{ERd?AmkuK9Gddu>X)Yi)KCOeezjfoAmO zoXZ`HH!bBtquC!Rkuu4j6OGCkXs-FHsuQWe=dIndEFrXk!mVw=kLgUf)oEz%cbFi+@O!PzzV;?Qt;{sJs4Hmsub#4!=hsDmTNW-^h_Y zYE;E(X3-Rg@D$_9J><-o+&qb#u$DdhaXjvc?;X-C-8A*Uxj*PVpn_rrVIrbOp0(h> zQ;@GXviD8qsQ)2k_^3D-fjj*jXANr&Y<i!=0Nw`IHnu|vb?JuCLp*%3_@<$?MVPsA`(65W~gPQB1^ z$}Bs9b1`J*<*Dz>3d%>FAJCaUR)ME&@SM#}gD#pFr}d`4J@3r8ZoaiLfE7J;ed@?t zz7xywp{jVcl_Dka8@h4%z5h5N$gRo*OdWQMh>IMF6s^R5p3>I8_P=__hyT+tp`VCzTTq- z*j~3jEBfb?@i^nNk!ol!%`*&9O#|D6ja-)!&OTChQO*<5?94vdL^2%BF32jx;0mr- zl|g~u-fpd8-70PDUy8#_IZl4|1ug~U`O|Z;mRw4^!nYN%4vt&e%+H680=e3a8U0N0 z{=vZ--mOX{dL1qRCWTp&Ke-~84MNwAn$}_V<8a$6n}g{o%Uk*5k&DXGr-z9u zSH;)xQ9l`#T^$;dN+!5NP8N$?e>}&3$9v4N>Ynj%*`(aoniGfd={2TqYsd4KSgG7< zTlGLD*1wSdRn_%UAOF-bq`3vNW7wJFgulBb*zeu3wPkoX^@@GjHjnD+_tuM!s|8&ztKl3)V`@!qLOpzMbvlV8{a!x zl5Zf^JAM;7gkT)bAsSj+E5n1v)JXu`t_beq6K(muya?mc(ufxaDVyQ4rwhGjcvpv9 z1;>`C0 z$YqD@9iE*X1jDZGGEkf1uCDg8-z}89=m;5}0-H6PO(H%%|MWe_v1qXgUD8_v z){s?n;(CXUcd0m%7g~^SV1t;TeMY?zmNdsxk=;kwxu7l@JP>qvyWx6xQ^HJmvZA`& zA&+kOIZa@*k8_6_HSez3{pzpV^xi7yNs<)VUetBFdlaW+0saE0I~@*RF}2y1b?jVQ z)SQ2&g(Q(nIIZ)d9>6E`J4d@&0sB{Fc}ZWj`!i}WHt3ssgym|PZzu4e`#87t;4PGL zCzODMwBq`<8$eP^BOC7Rlw1BEd%)?gZXTccBN|ec+bypks9*LJ4dt6~OitADI$I;k0O!5hM*Yh{?uJ63Iw#WQ9I>)^OQQ0x(f!%GB%whEeCbM z(Z(Lby*%yhf5_jE-`%Of;t!%eNNzwXj9Mc8sES(v_KsH>F3jKifnA^fr_w^ldPKl| zs6EMPSMukU9H+^=0FhfpZHLMSti3s#3L})Hiu#*LiSGBJ@O3h&3aBT`(Hh1Tu|}Nt zgfM3t44vzAnRC^;-{H_^ow2ryvp$L+He60#ynSni9IGx&_{?H_KVauwnTa-h{qcwUOCzkUY{#V7|q(U{M!53@_>jf&c1q_hmMx)d+{&1+g@Tw*$Oxf^0b=q5uv z{WV={`3D~znO8N_f?||peR+k7`o6o#$fMCfruEK;qipeGMNMh>|Gr!^s0^z>%oT@x4G zSR$VA-@R-(jk_oO;l6(>h6@UxztfFJ6b}2ETleEN?^f(t1hvHrhr`LeUjGiJmF zn=&s+tpJ+ShrQr80IOn!`cPLaezmrdh3v{iUbfueJOA)GC2@tz_53-}immrHIWyFB>B zl2bq2JD?6>_W)xSykH(E6U;7@Fz8uV@KRVRdvw*Rh2riP?M{FcWN(D}%1zY0fh1Gu?nF6@!~wG%NY;smj9^ zio|vwC58#^Ie6p&{ZFQ75jKXZR@VgtGV=;M)A`L+7;yYr_rU~K zvYB8*7^R86?GM8My z_nn@igDTgDdXx{a7KLo|()a1L8o z)leCK+}6(n+mHPc)Ju^>2T1=^&w`#miKTOd8G5{S@ev8YHP4Sh#@Ja{5%g$Ene{!( z#|nvYJ=0t1UFtzloqTuy27^)sDot$r1NpeD$zJ;_oGSDhRPfjY@ zAsrYLvIT_seJu4<8zL>o+kxHg+g~4Cmkk-&JFgw}YFuCHwKTedhxx+63js+|7H-Br zZ)8wh1q-lv)${B%ciZm$Io%}644faxc_(d>HmOoJJPRV`7j`YdQMuH>LNhVa$ZU1G zBcjdjDA?yRNaW?hk=|7&C1l{G3o#gWUo_&D>utKYB8$EOd%tJVx!|I-G+l*7adys& z{Pa%!8?bNw?R1$Mre#gfXh87&D}>1;)Js0jga@vIZ`!;7J#?UGP-gi~3ZL(iLenV-mp$j(*7+B<@% zWd>`4I`?p@<4T|ZPPef9&ySyL?28{1Z9WR5kRKw6f6ae-``fR zG>Z`Pu1eRL>RPuXPyxNlFPp#foZq}<%{oK?1sntxGqNQ^T{m>rMOO@^tTz-gpYG!f z+4WwQA%wLWzskt)$9(YK9nV;Tb=)bdv4sWt-}T3az7LAFZEsu3?rjX)iJLpGNRv|M zN-^=f^&{TdCHOWw_20P>`<*DZU@Bd=YXvmUW}>3-`wu!4w;Mq$3q7|*0o@(FssxT} z^UNO^S=7q^<`b2B8?MY2*9%=WuA~<+#<1J->l?O?&grg4hFeboGgp{a`s3>;YTUw-;4yl1@=Qm}_lZr{TXyW7GWDx(YKrDi3ZQ3aee7yI z)A(2iO*CWJbVrCe>(a z{;lo%e?+}?Sd)L)hYctqA|N0l-3B$0loUk}q@)`G>5|TE1_+V@(lJ3ox;uu{z|lxf zhUDlPFjnl{?|Gm1eUAIT{dwQtW4m`=pX>Z6k3W{|>kJt<+nt8Fs8NomtEIW#(h~i0 zG~Y%_+nD%9!j1b+*-DU2+nY~-4xt)ja~<2q8}O_o7>q}$d+Xry#z4d4v5>_T?`8!t zq&-5@6?@o>yjR$taSp$~Y~t zR=nG-sm) zf`3}fYp(Zvaw>mDl|0D8JV{#atnYjWK|3@^c7)5I2{<$Ivm8I3%|D%*KDy|5QX*9i zLT)H_69$_$_WTaE_XB{=CTa}rx83Z3mR8geTZCy`YTUkn<@RaW$dR%$+sUoFV<^(0 zN5$GqhV=GeZ06wy;{r4zB%(VL(Cl|00wRW1`;a4l{3k}vrvf+)p0fj(v&EacRL@Ay zte%4kKbR)_VdPxWF2piMWfBLv3kI&(mT@xsO1RHz{Jr{vKS+*5f<4Y2GJ2@&V-lAT zEE>%#3P1?lU93*Vv`sn<*p^g1WxpC12Y4)CKjEj>L6Oha1-p226LLJWdt>Qb?%H`_ zi$Ztbb(Pf}G}DgMv+H6;toN>N2{HAS^5R!NL<5OuzZeAt(U$wfTHlF+IlVc3V9w!S zpP6d=PHz*Nx3^PHX>>l%;_kuDqjALA_`8urY4gYi3uth3Yd!p%j!Fj>g>z0Utuq>t z!o3oenus}bNg}!IUl;N4(FW z5KL^HR*~zTbiwe&Yl=mMzNd}Nsg5wq&cIc$Lk=X{rcTFJ6vKbC5K`^1-FM;69n9>K zZ_%Vvrd#a9M$K#TvpH47#w5@LXcRzLZ2#I+ZLikA*3NETYZm#Qk(>;+T%!Ic(cJa5 z^h)$(?&*Uyr=rR9`Ra-cd3lGdYsknUJ_pr&{EzU8Rr?kIl4Z%|Tk^&SvSH4S?NlUD21|;j#6xQ!c@L0at z#_Vs2+tv}MgyW(&PeFg;k9RLOc&#ti+l5Sj41g#z7w%&TPdHkmlk_P42th$PA1L-c zZd^*#gFGiNynEYP-sEqt+)|veK+&_b!fAR_x@yje(|E^{qde@CNlU&0i3#~u&2 zybW&CVH*IHH63Tmda*7v#t9T{3Kb7$-C0N~vkZ1_Ms8I+QLGQ)H%?WrpQ{X^;gSFN zC&BIC_5URjng2&5qR2$zm(nB~A9**0ogBrWCtr+Y7IB@N()fR?NEpamf{nyUPTN~` zsb6*aQt@Jo(Tktif2xfuiLQ?sv3s(@ykg#C97RbbttO2j>A_VN7Us(l<%?Pa2PU8# zV#YRMWFWA{8Gr+jmJyd{RRJ3#!Kv}CO5JID$UHsNL)MxXZ##$~HR3-vFRI|p&k%Vj zrogAI!Y)E@dQ4*Qkjs4*l4_XSA@DpL{BJE3QNfKMD@2p%q8X8pP4o|SzVEkMes|s@#mvi+V_Fy>by|^Jfu#aAxHYYqZh=le{ z4LECm<=hSZ&9Bo?uuRtd9vtjMr5svnIv^g?>rS7s=J0JM)N6baqIy8qEGc_DiF&ED zT7Con_Pct{X^dCK10LV5iS|!|>A!kJ`3lFu}iZzh`~K(l{FUKI|)gA}-Dm&^81!<^Hg zIO{4vsxH#KXhcsBf|P(IS9xU@wM_@SJ=@h52%8qFG{uo#i9fV?P+DGD2RRK|5Rs_; zyJI0P@0RaR^MFR>{t|E@w@1)6u#;{7>be%dt3CdmnD2~TfnD#r{>M>|_?8-d@Gc1E6z@gwbqoZ-p=e%0G-c5E{ ztq9<2%XlHnv&=uWRql{+ah+2_Ewy#9s;>O8%zSw%8VE1Q$d(|R*emJLhr3UYs}j`^}NxzMDx*tv@fT-Xvp+> z-$`h(3UIo?4(4lH6p2iWt3wxG*$s@K3DdHxG4iN7IsPrys&BV}W*4i5{oYln!%m9KH-Btev$?)%P*(;xbnetfw{Bpx8m z!tY-meAuqBed*|r<>Fxg1lkz*PdSREihPjky_R=S`$2H#>O_~^!bl|I?%6j+_T0b#JpO}HJ-GJ4)vhfr8Ax6)0*xk~Q~kQpY9;fR5Q5W>Wmo^|4gUU4C15Bn z-rD6 z>TL-ilfl%aAU3Y9?&B@Tn&peF%Y1c!oSjXG^3O<7cNq!5c~ZL=GwPvL${R3PAc zh;Y3pTX_Th_Co<@1SwqZ@?i$sXTPhDc(tjkYget;)9;yepof{)5rlImD3Aj1)&ui) zQOYZ#XTZulrx?al#cUZ?j7#r?BzXLx+xpN9+%7u;W&4sv58W8 z{F2WkpNi$amdRMvy7*3eU{Qwb6|TgO?s1l|yRV`FNaH5HtebJ;6!#6HPuW$-0@YP% z{HmGtQA%|L>U(&eyogUkzd0K~;>S}+U)mdOy0UYw_Y|XVr?+6yD|>A>ck>YskJ{ha zP1enkkDom)MR%IeT;64)A0cG(SF{f&$uI0_vnK3NKWSMN#FXI(=y(pWgH(8pvpiVP z{k-oNPNH1UVPI2f>#N^jTrdzvRLuv0>Q4Og5xcAfHjtlmv2&;l0Q8dF*|xfWr=yB% zs(0keBTOI^WmV-zKNF+v#j7-l$QkxrwmDl0_UsS^8E*gbsdYsm=0=*%3MMJ!GZNXAtKA?JJV+q|O* z75Fd4qwT`sU0G+5@fDN)i2EUYU+vIwE!_{sngOE4pHDmx9)J8(NcigYUjvtw(52SN z14V0}W%>+EQrs~rTPg+m@=`2(%IAQ)AJ-8+x4I}W>gSJS2PzGlOt)zYI`@N;`%YGo z)u5E8l1y{Kant_d+#?hjjmv8ansISU^`P#|x#O+s7J&L#rJMaM+KWNi(gCOBKRrIZ zd-_kI;Opk|^g)n4i$u9#6Rj$gqIb9HveGfa7yPgV`u)4{#D!{u0VFlZuF80B($XGZ z^8R#IGUZ9j?bKe`Cu)W^RCjrny@&%7A+fG1+9Fj%7B$d1yx%hOWzAV=K@;m&$?I2t zxd~sn@?VB$vmk(pR4xQ#ZzCFucaFCQ+oqV)hk8vp7ZI0+oo<5Lm zf2vE9(njG(TYOjFddO=jS%J*;{Up%7Hx+IA(Ot&?D6$BSY^S#io)d7HV=$Wy#N zSX=zd=Hx9KOVQ^Xt_iqFm)SttWqYqm@n#^=)AEXHPY2exMQ%?C(M;WxmEfj)Lq(djsR!ryYCj^1Xz{xhyA|^tx1^gtiD*-wm&v7Iy8&H_UI*Bk0~G>2LtDbusuEN?&6`@s-p{OD{95?) z3%+l;{n0DOdOj;w^R`C)9sq(0ibK{}trN2L-x-MvQsWRAxfynss`!<6gDXRvR!UjO z;fz2YXg+M*&pF5F@O;>}V?GypV(tm3e*`<3^FL{Y=j@~Mpj>ylPWW2jRlC4Eux+MJ zzf23#EBQ1`)-a7~e5+n?(>vfOsUVroZ4MVM@~dhIt+{v4_x7ZZ+#`0XYUT62z@JY* z*ZV3kX@|pomV!u+?=qAz116R@M!ue(1@?d0IpnEnrNzip&7qi<3V2gu+^}+1+Et(K z&DHc6Q+?4tMPp?1rxjIpd3gzmTp(oXevkg{AiJ!!ssz%qp)OdPsiO{V8?I^;Ml)fi@d`T-AP7;mZe8az$G?MG#3>gLq9Wdk~#U@H4zDy*Dy%dh^v zly%8R`T@Xw1=rp_S{pug0QH@}Vgxr2p~S=_@{d*PyE>*;1-VgYGRL9fOZB>#upbNF z*utg#!aI!*%1U%$l8af}+}b&^XX0|X3&CZYMV4ZrFWeiZ3=^{#)HBbTcV$w4@3^SG z<~<9PLbz1ClwNT$Prb7SRsPx@9c_wT@XIb(){povmk=tOg=q`-6Svu(~+9rFDPyi>- za|yl}X5PGGC*JLyw3b7+wI!g$>5N+_dj5!*zjYtIA(=lOgrbsN^2$)QhK>aLQ0%o2 z^vjia!N={Uun2FkIfK3j3VyQ_KX9yv?g&=S%QK~S&v9P@J_udY2*+2zyI*9VZYx&Z z%BglYQW?7d+M&FRe9FH00HvVJZMK;-0%g@Xrc<~)1tu_ir4#16aQYel9LE2c=+eN>n<2*<5*1oV&KKHZFVo^M(eS71ezIrk`AY&wJx-b4CC`MGA|OH#uG1M zlh#j51G3b&f9ScaaI36Dbeg7~_Qp-y4Z4J>2<>!e$H`qL^Rm?FZz(>Hjw#QcVO8xO zee_%5Y9ICAD~#9gJdsoWk3-uOKS`94Jw9QMjxSTCQHJZV89IEa1BaSMPFP-ZYo<*W ziRtGZjVi5hnf?JJ?L;Jt!A>|UP~)@CwkmhABXM(`f4p(=(C&y=H68rk7+vK@9k>)d z(Zj>4xl^OI(X-6Qa!{K9QPwy|(k904L8XorU9_yX*{lG_FBp%N{hat}Zr3&g0!iIJ zz!XyCEW6~jwu�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�P>7pr_HWF{Z*9&_g;M|KJFjN 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

    hO!*I=+zWEb2@a!{=pGd{T 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

uy_dZH!K?!Z36jrRizXG_|VkVN1Y zs;mRbEYcN^!~V#$?zBGX;Lpxm$6X03fMly>u3#@d{&s{);@Nu`)xFo-9Duw=2-wnc z0UkHFHj2xuOQ(3VpbgF=$;CN$8bHmiy}VyPRWJ3_b1tj^{(61vrpw4t`9ADp#GV=0 zx+&PO_6EZy;He&UnZ77^zc7%ury9#{P4Z0fA) z+xqoSpJdRC3WZ7RfZ+gXN@;3aoMYZ?q2L-z2THhD9pGsxT(MWzgpPXTtKc)KgKsN2 z%Z#=97)Phf`kkPn&6g#0wqU^ ziqkQ>RcHiKncK})TwWL(B6wG)az(@&A#m@?8}iO*H(iYKFvo5^Uc6yW(E59u?Tzr(%MYXA zZaBj4RLDzVQvJ3yj$u)lB5!}i+Q5R_0s}Tbp8HJW6UP2ZPVc1oSA9KPsq`LCw8+c@ z<11|b4o>Xdc}FvRNk5+r)Rgt_&Iw7$@o3uryk{_R#jmXP;U<5%yr53t6X2}0sKEv) zdgPzz9oy1>)g4i<7He&%=v1C;2he4WL(5%nznRs46VW}X@hFOlyM}!CCxb>fx{eKw zLCSpvr}V21Tex?QK0DIzbGfLv62}jO$ zt8C5Azr-+nMomj|aR%R3v|^4wovg~Qb12R7((B83z4zik?Eeu*>U7DZv)&iTK3qX& zc1LJuU8T@l*Pmo%U!<)~D=m1&^{iX5wxN?J;zFT1C;T{2pu1Iyg9@(FP)0=_{)J{jUc(Ov|1Pu&00F4^Y2qoqWTdugGp=JS$;zi56-C~6Z|vTy z45&TO9s3n=x-Q}v{KJ_+cmA+lsTQ`~a_LZDqpH|Zo*Vw#(E7n~i5R{Fwe59rOdAx` zx&Oz3_5}rt$Sk~|mhgxhI&L>dL76D|MSZgSSxsWAB%qV}^nAm=gfk|+%OrhIIC z6~4}+IZF3Ek(KE#B5{n;>56UWA78jsr-b?8!b3xQ z1mM(3Mvg7o4A4*o$=_0!`I( zKk<>T0Ow9|0|P>@ODpZopN|A<(_EB=3wTFpRPYxtA)cTziJ>*|j{!|d>!!wG4i{@S zu?|lA@7S}7b@8tkKTtLqew~t_29+f$Q+cR&0P0!dS28{eu`CD`wM2ctQZ_sL>a`|a z2ANPyQ#T~e`>%UfUy3|~4?TY|zdO@iNqS#6m)YP#IubZq>Mv6WMwGNd5z3L=!JN<) zF0_kd=>GlW*0J09;y;Pp1b}yR`^7e2;;GVtl0w!c_RNk9gPg_JW+GWnOlxz>Bay_=g{4 zCd9^#+yaom+mCX!x)p9p($I#h7c=h`3+$(Os4$pghJ)^09b(eY!FY763fPQJc;CqQ zdfz~tI6QnN4K$F|b3t;U+rGIO)Ad=NCurMHkf)>?1nRBWGMGOKD{TpJ>_6}BdgP!K zCHg4-Uhh=zEm8h=G50g^l?5k=^^<0{BU4Y+K)K`o-N2yQPLa{*K}Jwl!^G_BzvUFL z=i0L0(ZIi8Tp)&!U8)Bxt6c7}Iy>Rw&4eNVT%{&oumtBP5^16BOX(3c5PgI3at5)x zw}P!z;dk~q_rh)Rjbex&suap0RsO#8_;drVmhL(Ps zf+!5$+i2(+ve*-E#S{4PQ2x@t+f#JBp^3huV#Iu8BJhIC>myAVKHneLd62^)YdPn) zF`oR_|MYvUpc7~HzccE{X)AaMR}=2LU}~386E0+_p~UZw-_^9g03JqS#z`+F^u}XJ z+2t?kN`Dq_2})l73t+zT`ihYWof(}F|J?RgD&&uWNidpOys_z8yP)0KJycjp*l&;f<;MOL}C)~RibQ+a=P&=7 zpER@z%vv= zt>UX6xRYk$H^B+t^SK{pRw%~P+t}V>(YQhuKbIEWb``K;w(e1K&b)eCD1MZo@qS#R zK7Y*f^o@8t>A}`uxQVjr-JQ25V{l2F-*u3obOwg^d@!xL>+o!kBlGw##LxyEX$AMR zzFhxzYTtU{$2L0H@cTGg#p2a8Kn{E6RP$TM{{UAC-OM&{n)e%{%@z}nWZIc^>Q=uu zQ^J;STyIaM8OmXk6t{&5-wIV)@#KKjG^#(Lcr5WRlvFOfAU~LqMbC%d9%~Vu7ET`> zD3wBX1Ez$iG2+rU*qRB&S0keq__Cjjj}N4zYC6G~^Rm)mtlC*L{O;VkD-;2%V8W zbxV-olRU?3W_4z1EI1Od?NO#h<3N7<;TZX$ktoM#3J`G6eY^eiA`^_l5Nnys&?zX0 zbmY;lS9UTWIP4b=YE9% zZwN;UO(8Sx4_J!bcz-+rsi9#Iy+xyJP;#n#ch42}f}sjwuA=cx;nZW}biC}@(zz^% zb+ULP-c2AggNb)P1r0UVZ@5r$4b_delZ9{w0#vTFg%Flx5_c0l za}P@6>}y2d2!`C^7m9h!9isV4kOU-eSK(HcqbUNB!TOixODAY81=8MIZ(bB6Y+1AT;~o0(m!225ORQiL93DG|G75CRC*+VA zR%4`d4Q3YJIL?8`=uMwLG;b-YUdnLjWxr(X`1D0I@-~2vHo=p?fAQ_WDWeHaR-eS zzr0}ofjD*pqBW{vD4&wwRa)W(f!9xH71%UB=>LR4QS1gE9~gPtsZjqmAdY-5h019E zFEKLle-ViZIU)&b7ZLogYw{l}a-YOWo|e5qesPc;9W>;R|20rJN{9Yw;B zy8%@<+9KZkdsN0z?tEp9J43rF)l`VzB@qvi1>|x?K=W2OC(crgFlyf6ahX{@F4G@> z1O-?x04DsNF{_=wSnBGO&@GdxiQJnyi7e*egh@U;e}P|dCd*HtztAGgSIDD(2`+P>BVJeDCZoc)7P+&8HqwLHsM5R8L4M(tU4Qz^(gDp#F~4 zhIeKRi?7)bC?&Y;_{-Y#`ZBRBaxSJBs)6X>WOK$0sJ+PMOrEp(JG$&k9O1cOr;nhZ z-TY~7P@hEqUolcTT1w?5LhpqrapkLlARp|9d-tPr?gy7V*_s0JrfDn^Wx%u3PEJmnoD>YpE?%avfLU|JB_&>_r77lk%=mm#y@`ZcjJe`bMuP=iL9ULC!EqE?M`wnwBb zFJbG^c%+vKrfp>Q&;H;!rV`?fU#eIrl*=seJ3Lw)d|(%BYlJl#G4<-)THO2-JB;ic zzSn4(lZgn+YoF-Z!T_YkO%8@G8%KkTY7TWQ5asC(+JK?Cli67oQ*m<%N5eiwpyVBX_(`_T<|GKm)?yDO|0gWv-9w`oNPTa8v)+2`EqG zyZY!!Snl*;#XAM&mFH@iT}^eOzugEJ)WSJz&R2GB*CbfecVUl3v(#O02uDG-+tkD) z%3iiq<;xcM)r6nD)Nlf(rnnDwHRWCJT@U>sFBJ3dLC^v3&!@Sn;a8`oA7FG_YFCIu zaQx#rU{qLr#fX2naMva7UVd8g(Dm%^cO{W-3aXp)F{mjpC`QV zojSO@mKr&1y2&0CRR1fXAiPaKGuVFUN?^0htbd_lw|VI!@QR4(dWp6(a_xwGsGy~V zb#wG8?F;?sPKn%r=MPG9SiHN{TL5ICI<>DlvC%BV<##Gly~Sn@5O*7g%Vg{##b#D! z!IpLg@(P9_5+WOu|*9QzAVU7}NGg?UVj%$Sk3{oaSzzAK@z>3V2pnoLTtmbR{ zA@ep;}v|(M|l;#=2vOKkVQ?X z(x7I(G<|_#dQ3%UnSGxt{EO-EZR`jfWRd6kqRFrQ;LMx9;ZqNp5_HwB>{617MEB&{ z1Wf8~#G2KzDW(K~Oc|~>G@RMJrN1H+H?vsA1fWe4h}Kv5xT2ij2#gV*bB-6ojB*tnXB1tst7(DcH2#x zk?cH2Rl*?!Mti4{zUTjfUtVJ6U_E=-5e%+oLyz~k8^_aQef*i>cYA)j`ET!zm6Oi_ z9bpi5N3|8nqfjPE*zsiM@XWVr!GC38s<@|=Z!|X{2)CC#T5O0-=aFz2XeJjCfk4?x zaquZF5kN|p( zC@Mq7wvoJ27pG1-AHLy~Kw}#{mU*8)8@N^S$H0hcab0?3h`w!j;Pg7xrc`rM01>qw zY~uOUzdg)`m43_Z>_C=^p$N}#*7p?7O&JR3bo7>+b?YqUVfU_4_)nSeurHuS zV%C}8^mcPy96zul(zQ8-as4cdLL?Sx@%3(Vyf8s9%bMns@v_GG%kidtw0volx3TK&G%{b;I}u0NzHL9~Iw(JV|LR2-qry4icQ;@(pg(g5HHkR)C9GB&F{xHr4+pjNXuSIPo3KUY(fJWoYY>vj2Dl5Obs-Jv^ zS#d`kQ1I?(g+SG5aUN(%d)*=ofmf^Md zfvG}4(tPjM@tT@<=ZPA;b}Nnp|LaKR7~aDX$3VCl1lLsXzfv3ISkOR6UfF?ijjx87 zee;Y6%>efN*?fL^>R8*>;7`5HV7e98MX<--k4tDRKu>K2%R}xndV6w6l_x4Uc_9rwR)IDK0cZZY)SWM#-O3t-m+QSf>1Mwf(IV zYt`vYMIqv>N}7t}-u98?b)kI6Yc0>Dalit@opE`ihH4;kNv>Prmn3|6b)%b%?sh0l z@4+tJ^C6e33Y%Wb$6@a6pKDrzFhtzprV_a4j)nh4P?<+IM|erzrAK$jT9_|P|8gvJ ztFLE&`N68hwaJyki!(w71Z)Foqu8`WB1Ec;q9+6ujA%&srLK3|>hV48*2Iq6E#edu z`f9f%%eE?SQ3#hMSTFY!lf)nXe91lrzb`{_GhVbD$Kem(7Qa1RNY-Nb!*ad@5lz1~ zo@DHKByl8vd*Z1j>funMeJh5laa5JFNG`> zfFkJl!!9ACRzw-DM0V|krIvf3>noXBa(bS7;M_}zGgaj<^lsbX5wBxj&)Env1tW16 zKdfrrSyokQZ3;;KQsCI}NlUH4|FdPQk_rGBODN2*8vxykVUI8JY;?n?wNCNXZG~sQroM9ENs!7T!q<=@>j|kS0D9h+4Obz*mdIJHvIfi0!j#(dldMA z{nGt~F-ZkEK5qrRt}@!H_QQd?`;0F}{gREsYaI2zNdglGIY0OxYlSKKbKmqE+W+x< z-XR+*7|EaoC%K72Ma~n*r4w?R@E?G|O1>=iP)=*K_UI4NFSa{NF|u5nLzD%IMS9V+ z@r2IXU2{#ZCQmt7A1pzJGQUqWzIF*_+8?ai(pVYam^c{@_f|P+U9C+{(*_Uj5P}ZT z`xln2_R!W5m#EH=D5c;Y?@f?HYn1xbqs6ujE~{k_fMcs+I~khDqhc24u`=OZDcOlW z8i&zRoB<@!gI|=M{v2KU1utZ-T%LXMsdeIH{y9ZfRgnkImRZmCY+avj@LF#+3+KN0 zjKz$4JixPp(eeHoY4n>{W0<3iu)P+9`VfcE*K?UNxq55gG~plwVq*hfd_@oi!F2M} zb&P&t_!akG4F>l492(EOx$}p%orPi-9?4_N=dJKOn1YO+NEgmOnv|5hCbG1tp=06u zIR_O|#XEPAe<!j5EjnSp72r=sK)R_$COMYDp`V zJpZ;lT2Mc~HjMZ|MRkMtm$SVuYWM=)GU?z6^j|-7s zEMvG`Gc4-8b8;*C)N8z>(3=xj;8-PwuQQPJJ8TH@>b)+kO6;`zwG~V{^)G+exsS{B zK^xvbAkzjxdQMwhclU!UQr&ENTj6`~_|&cNvvFeaGjlG7eN7+nW2M!($S8O1T~NVO z==SxpS`Cm_;P2X!1bPR284j$OfwAQBj11l9aLKB5;}ATi%>Ft>8AX%MM_C%}7-}mT z96Y)3_;uE6OTY(avx(7!?rnP(UwBE*S)~vnz7`~$`;d(!yR+rEoCG^O zRfhNALQW=kn};_NSa&LzjmTWr3<{XA^?U)=+_en|dSPAQy^Qtk*2g;n34j^4aMX-& zdAkbKe8AME$WwBuWh>>>Z|86n(B9$afh$HvgqPpK&$twEquLXLT8Zsy9C_jB%WR9U z{485r7Wu#Jz48DPD`E$mTU-8`BfAf7HWzLL=Nin&UlR2Mel)p4Pcc*TSeTJp7m?)r z$=C|UIQP-s$9n}G;4WsiY&Kn#-LfB0;m43&OIZi@vz1-$$ONF4ja-b2E1Gs5$EE~o zGCmj=v$+v8P2QSrT9^|HT5BjM!h8k1jCmO-qjdp1pr#_caLzjo#!7KFbt zEAs4#Va;XCRR`#PoRNshde7Fb=MFc*=5n65P5JWZ6uuIExJ->?Hpur%>&I&-DuN)q7Ep>_%1dqz5_aHfVS*ZS_6l!0`iIZi%O<{b_x-##!{pOEa=- zDlj$Xn$j%r0-Q@EAiBNrarRLAJr1XAEUhyS5!26WL@UALb!l4(P$O@Y|6N0Q5l|D^ zM%LV&5r!SgZ3Pk>$hh{|$INldPFV*7cWW%#5&;h_td4dRs!j`kybg_&oB;IzJ6IR1 zWDSn3Z|4jMAwVr?tOD{$4O_2$FiCI6^sCSPZS00ucrBteCJaLng zpuymeG}RMx3Z)js2y|3w==yZp%5SI3$pzPb zw5RjELV$@C&U{9#Tp!@``Hygk!jpk_+X^lR|E2!YtkV0hcO>-0W@G#(ovs-)UbQ0> zOAk~#9(klyyOCSxq|i$5vV&n#M96V|!mvmg@7Y3{VU#-|^HN#q#3A%g)P#|f4d~Tg zcO9+XLAS50ZxHH-6B6Buv$G=ibC_oEQ@pr;i?aul?bs)*HyUl5+pSA1yf+J4HUowl zXVw(JHfjt14nrT_t&cr;4!$f`3sZ5-MX81vjTEK~yZ8!HWbw293_Lr!K!aIF-QjE$ zkCXReX1m7$WnTp@2qOirf49wjJYLj!zp_#;-biwt;rv{8kZ=Y)JGqrzXH~bjnP2%k zgXobqJ}H{8a?|Xc#cXoy?`^Q7+t3fjcTzMrcjb(2A3QVnb*CY3x;Ig+(u^L}nbPsE zLEg!m^!~il1>$YFrDfof{kEFkY{QU9^6uP$l8D+K9v1Igu{8K-csE?nDGY`oKfn!}}Fu$OMpDPe(+f4WOWV+_Upn#AnQpR#gcw_I`B^)-T<) zXVa(^U4Yf~9X5Rvdt9=0x`!DZNnp?%uw(N7hGd|a4DoCB|ML~x5~zT|1*7z@251Fx zkMyBDNrSJtx67`?P}zKSnIl7xSbNKH+H={ka*3lkU zA?Qk&O8bV++lf&C!ZXBFA9e|0`H`+-r+9wRe||W+q<;hVddPu>|G3hiy=K`P_Bhg) zScOLWD?k?07sWSKYB2Z@Xg$c$F#ZFdY!-!Lj1Er z&)=76I6CV&H|52IY>UJyW}bbp!Bp#HnwXG-{L>;Tp1P{a&ri;`G(={$=jktoA6B_s z+UR^Lrzw36_28!?kjm1UvVU0JoESauX)>~ZX1`{~x?|-n{?h#*pVJ1n@UA|{OusX6 z;iA2}Ue(OP2KWW-OmcTPI7tJIZ^??Z-1R>edZ7FQ87DQbn#29|*c~-KgDXpcdw=9+ zkPej4dHH8knkM+o_ z;CoJRlDpIMMYaD&)O&}s`Nr-4Xq7IigQ^;(D2m#pMp0E1Ek&)ws8xFgL2A^fqH52y zX6>3m5Usse34++0SV@re&FA?&zvKBMx$pd$*B6O<+pRs*wm|Ao_x|fpZ6;gJb1$#5B|u!leqBW z8Wn{4IBZa%M$8~4vXaTnBK%vND&k~nDsf8k^WscRsLy`&95eDPd7ig*IFBPLjhPcF zZ+pniW>J~d=DWAN0tcP{O>kKFjr#3Z>)EJZj0r|Pb_I&d!n?5YO(OPN(xA9wFNr8~ z!hLXS6>xugWvR!dG;FIp;N~7be5aU-U!L$ybn6RiC^B7rsA?GRyf1`nIwlW@w>I_f zNyRIiMlms}=Yfy`)jJMfcKyB)#kgo4-H~X#KAf+Dz(2|O>sSf8rFYSEykW316=1{& zAQ`T`+yQ1eZaPEOB_{GVt>B_!`a+PN?S}>l(FGEeD7Nx8Ql>Wc`2$xRFgJR3>WTaH z`1;&X9$x820jkWlHy)lqpE{kfa>R{)+)S;P>TG#`Ejut(=oQry{7|?UvQIDp5K%M5 zJ9+9UhwVR=456Mb3Od{yA)Y5Yz=a8z{#-EPzFpIqJUlilvZo8XF;K-ef&nH}?Je$H)t5Z#Q4r}7SO$$0P755!?W|EhD=UxkkEW`9(=`J&?A{rgiK<^6y+f%J59%|%RU{5uX$ zLXH1^*mEnI8QNfG^cQcJ$@hc_*}m8-#ZIG)Jdsqpd%1a*WvDOKTh@?bRZa@f$&Qr-W3gKCnqBPB!n>g9ucJd;Dn6Lj;5LtP2nA)bhE14ErW=q4haZ*D!6;=sMT!7h+)Ave!+xeX7mRfkT zmIgeN*Qy;ZvaSX4CtpTXK!Do zuFQQI^LeTW#gM$_?yj*NZw+Hw5=Dxu*&xV`?SoN5(>}20 z|8(%1VIU~-y&RZ0A%wR>$6_Ki5HfXqusWc@${?YAW!Fpd0s2g@@0Hf|i8R=Tt$URb%kdz-tD zJ^sGq?GJ#cuaaZZanWk{rRcD5F>(2f&YNeK{*hVCp4w)p8O6NgUoD2NdU2>&oe|D2r=2=&~($)A)!&g~(yPe_zVjy>A5&^S#u40(kaJo7 z=2OvHJp&lz^=OzU}Lh%e&2B*_++R{ z<8D(58z?{Sblg15Rc$k%#X7{nHeeAXABYfh?%2CJfdhv!|K*=A zfIEslJ}2lx5mhs?V)I>XFl4@`P!Vr19fwKa*-21Hf~3@i;vII#iFn;-<4({!!ioD0 zbLQdeSTY6hKx?i zauPbzgw5TKg*C@u2Q)wdv%WjI-Owyr)o1KQWwMKK*Gyl|b=CjYvRvff@lOb0cQxr| z3GL)s(%R&v`bVsns-MV&#Ut2vSF1p>5}TndQml559!kP!4DCG4sAsebMYPB@202QY zxjcb(wP?QTk7T%0%^4|U^UMF?f^_MNNvLmc!s#T2gU67LBa=Rc5LTUhWKUysRD$YXIdf4Vq}y|9pa z!b4|&asFKO>459tqi2o{v`t_ZT~s>Ljz{~u&;3rFFYZQh{iL{`C7u!RDumllHB1t> zTvQYf7^}FKY~$i9%v#~(un{pZgt9+rGggMm0v~5!*f4SnIpPpB>xf(w>60tLA1K;X zjZuO1!6ux%=lKl-Q=QetMBX{sQoA;6yCqB8jH$h#xv8Mn6GhG6vQOdGHoxVTjnA*>3~eRmDV@cBt6IW#BEXtxsBdd5zTntm zf<c@jS!%2=*(T74MVJH`M;# zTI+>~kv@o?2DYk9i0E_qjE9^W-`~f+oQ$J)%01&}0489YLcH*!LDd^V;X}2`e%@I7 zwiFAWvpr`%`3ZSt_ZA+{rlQu99Xb2h=cAd&p@IQhqv^-qn2C48%&&`r*9>*V-z*k9 z|6s;S%1VXqdG)DqHw>&?I(|b(&%*0Y1uFuK6^)!s0`+ZS`5RMP_&yiPv(Z=aBTJ2hq6n$lGIj7XZkUX1ez`(xQYOeF*R#5q_p|DVoHv?QW{Z z$Qvi9%N0VT#(3hsMmeNFe^-~X*;=)7Y{U&O=n3IVEL`jFj+`HILDCx~TCJCHp@tT_ z%ayVJp0rK-2~@7PftbX)k`ckppHT(1E|bvH7FE&P^&+cFrv!g}#k7t{w~Y}ZSTq?N zv%M$S%DEthF;S{2WP_@#0~>A)4Cddap+S&rsX`@6cA_Z(j!`QUMSLEt; z7|gDBH5n$(>Ar34Deq|{siQCcc>|T;vIf0UfXLU+;SiDPN zFk&2XE}T^@KOyxc+#7RZ3->V{eqFo=frNRg#RN zt9RcLa7YbiKU@BOk=*q{v=Or=@4FExSbK&#YT=IHEfR{8!f|BnW`x$*} zzE2bU-rUiv%au|=jT@T%BO}V%Z*W;#8))BB0HiE_f8T+PM#v?v5;n5GumNAfc}`!v zK2!MGsReUS-gmw%(7ZXRu%s32I9vU>`!TCKXcc__VTEkp7kWZqQ?P@CvO-MarwA)R z&^RyR(b-3~w+$SV4?s*YTi8;R{9b`E?_CekO`fFivPG$j|Eym3{}DJ{&T*ptCDtvv z`HH@YU{~~UBUhKL`S<1Wc}()vr(5hL#StZ!jeaS@$rAB42#8jTl%=eHu`%zQIq9Hk zej^JkPSH6zC|GSCgReY`5@65$PR#d&L(+hi-9ywvgY}p=(FMC*ls)e%Z5=G&bB)BuqUHgIPpYLXYBm`C zpDc7;dauRrA$)&+Xj`W1EaG~%kiT)}mHkGbe{DJrh8^^$786BBv;gqN0`=Ulq158q8?0m(816M69}zxOdjnU&WpDDMUqpul4S6sK&8$52ME2AzT!7`)mJ<_a()uT?_8 z!I2Eg0j||#6IORrZ0u5CbddPMNO+f56U2Mvz*tOK3#UwV}TD zEIsxXNe<`wY$sVhm>`N*Hb@K#anD`C*0@Y1ng`TsDQW(l#mg=85%253`j_pmK@gc2 z9Z<=sqXH?#yz*;W+o-6(cNzf_3j55T_Z~iWHRF|AK+iWL%lLoUM}wGtk4;&m8qm^k zA$@p5?>)yZJ@VQf5-Kb4IlA6E;NCgrCoNo1a)tUBy=5X$l5>L%_S(>iHi>ODM+&w_ zBQF`qzE%2|<5gzMv+jPK+>HIN0^^($Jgl1zs8O0Q8AjlN)sA zA71-Nx*DY;UZPV|8wx^n%FDZqU>2G^_A!3^R5jwb!IEiRxK`v3+!D^h76>=r8tT%` z1gzpqdyUS%UF89zV~5aS>QV2kzKSm1&HZL~TLNbuYi5wPbNL-74vI>NzI3A|oK3TE zvfr%hOY0K!%Jyr8#?HX%LZ2BgWNjTAG6>DDf1Y=t;?Y8wLHtXK14=^EuKs&W$j3FUjMRstG@m;A1~T$1Q}gv_Lu|fiUyL{X=4GE1s*dAu(Zc;#gB|zj{D% zV+)V-Jv=!*&Rh!c(%EAo6{B`|jlteAn;-h6ibI(<`&K1HCr|m)R@%t?V!Hw(Cyfdy z`A5qyetQO-9u2JMF4?Ld)$X}UU7Ar1&ue>Q@u?Mg4Buew4`Rx`h4Hp<)0XZ;4umh} zwY4cO6evlOKgfwCcQ`zXkS!b6{y3sG){9%Z!h`f8!CpPA5OdwGI^b{3>J&*sa^w9q@yhvroHnXhK`}6EC|Ije8GXIg1 zR{yiqKEvhb_iKvaGYT^PUlk1d>g~E*k@mysx(2&b#K^LhOsK10 zqM6%v2PfL9BwowotNbm$RRJVg$=0+Gey3MFWH91JOf~4`T#ze&s)(woz=OE#y;k3# z$i7^T!ki5N#_EoYXl8?HQcd~jWX{u#^>qFDy4PIq?!_H@yFQMa+Wo}cPD_=l>z)@} zsF{3498t}3dp$^3$q+*{FS>EFLEr(IqB1QwGrkKgt=-K0W3_vD^>~XYfhR#NdIFq} z$|xuLNfYWEQQcAcQ{0vJLxKYl_~l=o-T1Yot!iMfcHi8x?MAb{Y|GNk<4HZ`k7D`H z1@oFQ!x03@;NtZLmFHa7ILM<)MZ%JP2_~#_Cry@Tj!L)&M9(@wctKf-ZtzEp&x|7w zggFR)Dl6>LWw3u7wGQN)tm{ThC@02$rR?Zr?wxl}tdyA8HWzud9daCE3OznnSNJOa z+FRNVu+RLGk>ik)V^Uw4w!EHU6Khx2l5jW)8DH_Nm3RJonBem7F59(8;rAW8o92AzP5APEYJxFUOgJ#DFyo=Ntuj#^7uTrS4r;$D^?HYj|GYv)UNHSnvj`V}IzgqI z;}H{~-9m?pRX#Clvuc_;xHC-nT3}HxG+jFSs$h!(73MC&#QiONTwCi+@>5u$+pnN> zk53Vgb`s+DIOm>;OEPo1BY}YpP9P$53-cQITdR`hn$* zmv^`f5Wc)q$BJAH+!h=gg!w^tADx;JS%#2gD@_U2-IbRVV7o?!;JrZ{XU(54On0x(zMvbwT7LDjx(XGC8h%5OW!!s{vbE&U)S_OHpOKrxpM%VZT4wJ2 zqf1k*w1H~K~M z6>qd3{lg)US*lx)eZ7@m67X#KqfKI(sX|M5$R@4yWX0t!tf8+(rCf8=QVdwfmO#76sR$wC{_)LRM4xzl`_V;Q|MJD?$DY;8l z87c$$IzfDaFcp9fAhA?ib7R_Q248*gwk5f!Ha@y-G2O5t}`U2-*$#cqL zA8b}s8HToxHmZ!PdWTxJ;SYewK;_8#gy`jE?Qs%h-LrD(JoOtO(Sr)J`w`LkV?b#; z8^7y0XB*D=UR{57cU$r>Lh#P(2iMeAV#pKR@-F&;Xzmo{zdzZl3k&~Zxs%My1mkb8 zpAD3pIC*V4!(umZxnJ${?rtszR@7Hov{%*U_~u!DsU00Q(JnKX zl^fCK4xQwDGgkZsxUlg}z4=`&>X^TkrO^211_=6{{EOXCazD$=L}I^HF!7E1R`yN{ zDcFPO>a`j4+K-1rm=8yWS5+Ir0wRc{7%?Bk`UR7%^HJeIK9cHILm+KO=l9d(gv$-T z*e?MXu+^$H%wg~4YZj?7RHe5PT;I;=w>BKx-z%bMlV1ohpGAY?vpM$fD`o+x4w&0t zMRNhPjx0{%x0+CtI#TWO$!I@>(15wG?}x~G(%N_8D<@vHKOT3oo+XIYT5wviJR94@ zO&)qG>)BNX9{J2xO&Et13PCpaMO$7!s}IU|+doX8G=te_8I^5vS1z1eH?T{LaAaM- zmdckiGZH2${IRD4i;oeHEZ#WCiDmuFy39LcYV0F(rWr4vc5~vE1}`?{QwLjO!?sDX zmzJm`fAP5_0ObMrOdvCa&J_e;j1docXH*2D0{gc7D#?oGn2W~8$5{%PdR zU%q9S(R?kF`OUG*JZ%?fxdDVv^HdqZwfWPNTQfC&FMkRRxQ83RZMO^EH+!V_rv4?H z#9C(Q?^mULVid=-NKyD;LyX|fr2Nj>8UAq+-p7~7eI1aucn zZ)}|tVD`0Bc*O-o<{_n?d!%&&y`merW9=VwzPtE5-HtV67_nywX#M%Rafx z`P6hq+0_j`k5jO$RAe5pC{E7CDSf_aI zo+SjFG@eVN>=#aD2mB^So?&df9@Vru!iK%p8b7kdqUKvCj>>23PuZ(%wt3zC%!rrt zTNO0YJJ+^i!ga(`NSR!9XA|jHtrj-j&+u8{OT=xN;{cEPq)~nTG#7!-aW^VMniVo- zQukvuXaPQvG$-Z+%+3zMX0ECC{+;H=-xp2~q8oa@!J~^_jJ2U&NYuEUj_9zv=jx)wf-gN}OEU6McE^ZGsKS21VDS~$S$-0c>WXi8eh^#b{D zF$kVfl2Ar5J9wre&dC343&Ai#YJ>Eg>*u=5WnVlnj2%6xaw06y^tL9V*5d*0qelxz zcn^09wz+-}2Oap=8TJ^VFey2XYT)oH=`F>bz1<@6RABGHg;Rz!rg)+iq@VCy!#wka&L7S zaT>L}0tv>h!@-vG_w)DGO%r}oK7+j0F_3K~lUin^QtOkIwG;AUi9weWG+1`Ym}@y(`qp8$7VbCzyn zMUEF=(GyEYFNwB=1BCkAoCsfjg9;Q;LPrF{e3Wu1-Iw3qRg`%xb4Nytv!o#O+Z%56 z7h{1Fo080LOn=Mn&YJawdq*UH3Rk$-D@>ydIuQ$#k#Cr79V~ejY%4H9E6=-G$=oBP zyTs0~W_#u5mAEGl9QP^cvK}x0zenyL8}2p0GcX8=>_!2SV{Mz~=Im8&CCbfP#mvC3 zhw4%Go-GTKLnmePuCOd_#OHUN0fBoBfd@o2w zqN2e7;sSS`Sx%{IO|&+?ufC@xy6@Mde1ly-!-!fP#DS6}dTHwV-%d7taPd#c1pvrJ zl5U2PYk;AURsvRTPq)iDbaeVdy3g4(>^F6+^WqVig4FGr?pUdC?wI+z0M5-3n6tuc zmt=bc9Us)ks^B5y_M;|o;KEW9rx2vzNMPsz4o2J9}6uj-*58wTzz3eVfmQn_15Z|W$+8zD*(m|OQ(Y>WyJ1LH)e(f z6=P$;VtvE;vM#=m9YYs43~p(y7(S<>5WFxLbc9;i(`4f!cklX(TKe~KHWP{GXF8wP zF{V}cIv@ueG>i*TPSin^p4BwpFp3>-Q-W9kf>a_kXt8>kXGdz@8N{Ip6YXkelnAZ; z%sez{ks1TEH5o8P`&KwIwzp6NQBnv`kc=l2y+u?>q<+0LJK<(Z>ihc=pQQp)-nrX$ zPqALgh#OMffqYs<-P{)`@ba*hdmW!Ln0fc;Yj}Zca{X$Yc}9 zFT-&h{UY{JUHFwm_lq_2;l*MM>ECYgOkMh4{iOf@^b-@Re!?dJ5a*$yLI1zx3KNxs zaf6y>xk zTiHD7EL`z6jdNd_a2z6herXp*%Haj)j`&txoc>egE+!Zp6vOf^z1n4-Wt!BI5I1gH zk0v~DXVYihP*z=)AHL*9OY?s9cukR;jr;zBMd-4=TU12;xu({Qidv@^&u_H~wq|{R z6dY}vnh$I|M)&y-=~u!McSli9&d`T9@! zLjDh4YboMZDEw|{rC#3zoKxP4prhAgUDW#hX5i{u{TJ^y9z zo1d=BJz`1bwkfNf!THzhNfu9jzrph(Xn7gc(qzDkCOaZL$|0NE--u@U3#1)TKMy|Sq!rNGMTad{wGy8<&E;1Pj~ri(C7NjQY(}_Q(gLu z+d~^(GjixR&i~x{`Ck7i`)j2!1|>uje3d4jl>&*RUAyv=_W@B?gC4A4i=r!{Dsuuv z7pQ=u#Wlh}KzAkg_*J0FhF#*}P|f6|Ml;of4gn(Xr-kjmK!e*igIZ z1*;9-7n2_;yCcT9Yg9zo&vlwWlVlPtLqFgcmj|+S;d@5+2YOH4t~x%aJwC_~grk_t z_GW5**)Kiq4W%|(!?byMu%+>ST`$DP1MdjT>xt?z=H8(^3oy-*`g5pqkdb*uXPW)m zaSL?48bOR-_ICr9P6SoQ*T*osz7yK`=_TTseqSqBX-VQaPtp}7o`Vw_GHXR$m_42R z;`wh`56tyhM+VrRMLf16Np`p~(xEO~JzdS1Ui^WyQV#jJk>b$uR^^s#z)QryL`hXq z`YAZE>DF1>N2#_C-BtM-0)0wsE&WgQ0uP(bYargeL0O#PE4)xnfu_Nf{mQHX{J`IM zb0!sUMfVQTs68CcyDge|23i(2Re0*WAzwY@OQxGaC|kjMqk3fF<7Pe~(rg!hwYNcz zV0sjjzf^NeWtY$(joIOBX3HAjtnk^{IYvcOc&Fd0$K=qY(g57*`uN$XmyUr1pw3C5 zlI5DBXIq{tZ=e3hgAVP!AW5Y5CE3Kc0n6oA-+gre>DQK-AKvTEDXUZcphIIy!)nR| zpawO5=B5-Kn+FF(E|oXSI$CqiJ(lJsxlgT0l0^-FT^fEU@OOg@1+-i3g^qd4AaeFQ z%hI@?+C9UsToBK&J#L0)739O=m*tp8?%NMNCAQsSi+Tx$5nu`Ub44yltJq2P8vyIe zaoOX?bF$iiszEz9Hm5+5X?Z*5OL0#XPHNY>`$_z~pWb_vTq4?JUIyz8Fb2rn69uI) zD~XHef`9P5RfKclKs!DDD@_-IM%(rxqqQDV;B>q*7RrZKgT%iEyj8PB>*R)45zdK1 zLekDH?75ee{?<-BlPc8CJ%fk^eb%{pGy0gdIWSmU)OR*@U}!qj`Ms;Yc`$QBu@1wF z%erySYQ5)o8UC}Jhkl7!gzeOPOie;CHK%J!`Mp(Z$A-q`pNdlPvWflbG|D7Mx#@B1 zByw*=a!zXZbZLX!Wl}qI!pt2=bODk2j=0fDd7N2i_It*j*4+a z?~PbhFxSQz0jT=?1+C(jj0qEzDzk*0VdW5Z4RKJ^HI=};37~E@jzxT~vW;?8uKXx( z6*oCifu4(*+5h_*EMR>J?ej}-vT8rWl=Uz@4&8u~VAdWDNY^l@krcUKwk z$?1A-tXT4WfcgOnE1A`S>Xj=UAHRrdmwm;!M43QNG2k$0ilpF>AXCwKraNR6K7V4j zK75eh)x8*cA#Gr7>9F?$wPm&pp-ld;LBwH&RT5%h%2fc%TBC9a6R?=MG<6rX*f7sJE7K z6BQdl%?|{7-TyNAOg73L9ME4pRPDw*52Va#>=geUFtkJ$p0 z`qo`GZ+chbkSrlT7sPnFq*N~y!ep{!>G2$TS=_|YohVj5=6;jP&onnmgy;cG8<>##jp zW)4%x_dx2?qY0h?`zym>&PZ)pqs%Q)V8M#w@u=HIVgZXqcy}LAipD0aI67g`nMRpS zl$UnB_+VS1Y>ihBaNlSA&T3I;i0LcAkCFpC)0Y}PhWZ~RkY>ahgTeOEOgJ35^FoIl z2#k@{)o9*m+9D)`kRGlKWCbrh4Q}y2#T}I~=s{bgZB>$2DSkMs+>;)k;UdSGg#q6% zlfAS*Q$pbOHo81vkf}-CH-Ue$OS`NY~&uTHKA$cVNrc4JVjlK&@ixfe2AvvJC=Ex;eFLt0rG!JIV5^kPhW4H z#`=ztqK?_XZPgamykLyW+FN1j&ae3Byy808;D<&3UclizL#T6I5Po}S-sR!NBZEg& z@LkSlS|yLH^b0hM{u}zlvk+VIp?IwL;%y72u|VgJT42b8^lDr}DWleGAjkgBP9r+N zeV)z9y?Z4vBs`5-YR+`xo9sD$Wx9)UWwWmPdiY=9H&k3~iTog$Z zqV+tt$jk>}qKbn;;xuOSZRTL!r-{o^?$|B{^2CpPusA^F98W|dly}$vO#TF$qN8^z z*o&4FpvT~*nyOs{TS6JP!4O7D5T|Q_CXDUXKV*2PK$}<_4GorBgAbxRm}nI3UVa{$ zt_V=&25e|nbL{foeT%=rNW`o*M!8!o*Uu-^Q1}v(f`7`r2VKBP>+S-N}sl+Fu zZU)EL4%w$%-pzwvNeLr`JOz`eD+uAuUlOr4fLnOnC8$OdyO)%*8f|n?>Az%tVz&`;@*?ob@PA-B1v)ASfE4RkJ|(~Y=+=_0Wc5Fw@sPUK24nk8wc^p_h$rlv zYhFM%P3`;qDMR8xu)Qegnp{yX|w1F|mSYMi#B< z>*k@B_BJtoM%6y(rjV9%3!Diki_l=nE09&k*81uLi6zTz^D8_$$1cd@SJfn<6G1+q z%cY~6o#(6ENC1woHGb_x(O;pl$_=781vVeX{h8c*O%qDz)v?wqVn=&122$~X z|I34lU!*v5Ez?;Qk?(-7pA$35v8bB9uNWT@^{Q+JuI4Qob3O9l*g63|AkO!bhv3~-czqT2kyN8^`=~= zN*zp8(c{|x;6ZQxk05e|+MdEk1$$hiPAw#9)&8ttRiBc*``-#O%7LO984umyWdY{bV8+R2(1f;oeI71z2Qn& z+Gv<`Tmho2kG{Z&SxtH^U!mdpvYmcVxU%)-`A7a4pIuAldiI;V&t=>JQd%Y6FjZv*3P;0G_Lm;&6>)Bxw!JW_qQq*bCoCZ@y_tr?L5kr?Y zh%aXO7HVjPj9!`pyP>)oL@3rG-#?Rht4zs55AC^o*YvQmY}f|+8SdSsB&A~zhh>}4 zc4b;7mhg~;DE~1-)k|3gQXeEk;YO4MeEBk{m;T8MupBHtqHylbvM7;ZWfMZ@UGk5i zdgdc(E>&n(;Q@g!%iZ^ccV0s37I3-Kt6t-_$F=vxIu)E8RV|D5sdMY=Pl4UBMB)hS zi&&XMj`w*tYe$isl4#sjVQ9s5n-2+9CXt#-jMRl?PcpPGEz|^NWek_!ynodi#?Utq z)#pJFO=25Yvpb`UemT+=GS1iR>Rri5Q?3L#?_0(8`^vl?=_mGRw)k)EH-sae!t@0z zymQ#5D$g}$R)Sw+n*2Jp4cC_dTt`#?h-8gQB+PZhq3SABuagu6$(k&cfFi2r)lRK4 zE1)9wb{ABnLZQ}8=fuYS_t0O-<^i{Uy3jz-LY1dPOxou&LblmEeHvQ7h#Kf8(U$Qi zE0=2r@q>XvYy9S5SPdMkU)B<7ziqXz35y7|3($F-DtEv@6R-o%mT zPsB`vm%HC68=PqV>a}$4PUCoMU@7A-N^4T%9cSt`+`e&-mI|iWDH_bH&4oWSdIv$d^}MCGYq9goJn=yC)p1 z_n({`wNLLJ?idj!x~$F*_6JLY*AvgG>c97}Srl3PmEcGV*{wH)>LCS!#Y2Mwp|e^% z2lIbyz{vR>=)G__6T7;jGmy@w?4zhr8boy;%9BKZ%TWpb;VI z!TUiEXq@o`w)vcS%^Jsh7Drn<^F_n1#3!pVmsr7mU2Z~`-&@%7;IrM0fm!X_sN*nHFy~9nWDs$L8M?icHZWA+Mk=7C55F`IdbeJ^4Ic z&!Nyb8<-j8J$Ov;#AAmDf~DGJ1NLgWcN)ZhIrZ#Y>{^`)DYT$Ay&xh_X=&alLV;X* zhxSqOR(B{3$&s5LK{5^EqQ8>;-rAe$xeoofLpfRm7Uc6s9&gEmeFcnmLFGvNvK&#-;la>7T!{PPk@=(mX`Xf zsQJ_vaj7%YHHG*z9VWPgtOC~6sZW)$ay1I#_`3-lllB1yMhurccz{`mnU}$5_e{!sJ8yKA zz31k#%X2IDIbiU(c*P3O?67}EM8KUdTZfQudu)oBP+=b~+-hR(ZHiTJJ>0jm4I0Kr z|BtBij!Nnc{J&ahre>yT@Avzj@8JOF-2b@ea_{rJp7-;5+o*%@ClVc^@>n?Dh?x#u`<;2xOxDq& zd{8)(-9Jzx&kj+F;o9vDY{uxn>dV0`*?O*z|3dyvn9g1Xr+phW(@e3CRSMjZAu;)~ zP06ZSk=RR}@`nUwc$WRk!R6|9I$qT<%cza| z36wC&yqzL?mp~yl&k?VuJZwAtle_L8yr8vYH3dj>DT zJ=&k;tL*q(A!VDN?>DvI5ZG>`)&WyFA;$d7x~{xwe=4bLT=q-Xr>+*-N=z*UK*&d( z#6T~v--=lfZ;|^FiRX&bM{Hz5m#j-LsG2o^o+iF^DF@t^Q(LQe;o`#J%{2X;U@iz% zm266?Q>)v!rmtButS4iPtd~+6XsULv;IU_3;7BYYti`%pDRF4Zmw6mHduPU5vFS}) zWhCq~+oz^PfOQ0%4Wg$8Ybv^?)N8Dbrz+XY=eaNCQ^PTJ(DN^dLFtxG+;!GV54WCg3DwmrPznB}#xn%n~i(qK$ifwFY<&pjwAN+i?+r z%gE;qsv+HKxP1K)K(&5r4ys|#Aa>Rf@3x+muB%#lF6%M%wGF8ghS$@`n%ILRst(Dq zZwb~HD){FBFbp-`=R!B^(S@g?+$=@)v#uVP1*$Pz{W;*mYOaSm%{#rD{g4CzyXB={ zC%bva-y4P`uwkeA%g#Z4;eKOm1kF$=`Zm#QJ|x|I=P`OcU82)yh$T?xWu0sBOAV>lCE^gg=%{`slTvEzjspm zmFXC+;bQG-f5rwpaY|yHm5zBRmG;p16KLNM?C(=3gGS8@$LIy&Nc`O+Z0CSS0h#g->1KQxFl(z~Q)_z6t6 zYPPde=%}*v*16JUEQVM_P%*6P-yNPpB!_whdyj>hSV$|=zlEZZ8ihnzlO<$Qnc>QMC5qmBEWu-!C&yZF8VKSp#B_7nTAh1?kk)<)hJxe4I z{?OGGxGmg?%{c0cn5Pib1i3}5+f?7zP8)1^=J=(<{|t?z^!{mazJ%6{o#et#Vp|e5 z{G&e;-#AMLer>1y?|jhuedvN!_ImOLNZZ+xQVqbE7JXRbFN|~f4R6tfk(|B!YGztzI@+(EA)`<7+&t+8Ge1A zxHNpUXWwibZcR1UE6+z{4x>Nq=y5jp0Ql9dC}dwyRz1=FZctrXK>D$D>-GkS6550a zI$YZciv+8`loEZ~b@v14ND9Nx4@^p33o4|$V3%cJC2QqR;F-cO{g}esPu-OcHBv$l z^4<2_I~!38@k~$KzRNv_9u`AN)7ISk>JM{cDjJ=>I&WO`gFY0U)R%>0eVGLAYBPnY zug%{u8{Zty`o|Ny=|ZK$p7k`%QDdLZlB1GJXk^DFR5hzoSQEN%nTJ;r;4PY^j!33WmK*grmuVoMk=XRFGT_*t8z#=fGs$b zjRAP72+B8+@mx7{mp1X;9n)vZi8vC>b^o>nRsn!ORzDoOkVdgYVNEs8OZ_V@SD37yj4|fL) zIi7kj{Yf_%g-Qy)=NIb z0aba}aYeufcs?ThN=io+gW~Or9GPD@P=z#PdVN_sy0MuAxTt1{3Vxf z@4U4ulD}nmx_LRXUkjpdse|LL1=F@zF9?0ZfDi zt}Hey*Bg3;>mS%%Y4XhRO2IhfY>?X{h}q7En}%F~Rlj=rM7c~i%`AGa zOtMfy%OH6-u|YYgQNDKYLJ;R; zn3>GX88tDaq~-Y*x6x#r>^^Km}qut3u0Rp0{;TB1N7O7T+(SS$yY~0^}5vm`UDN|(!rO4>K zNJw=8L|?hCgaC<^Y)oxljDmP*3i!v>j@z{fA^@X{kV(|4l z$w0kSBOUs?RMmRiUGmU*t)a7on7f$EW^C~0RIKgALwqSNZp+$cnV&_vLm8%`KplV7 z?x0e_S#i{wWq-G7?-NHG{@xjk)jU6r>^B&E;W|#S*Yr)%?S$5lu9QXIa}wXfta{tN zwM*PAb2l=EVTr@TxKbDTC;_BNkE@jFis>WZuS@n|noB^YhBLce{&2CUVhxEQ;Uu&9 zpycW^FQ*L0ZesEAfIjC6V z5*3PE`@e~hOH?qzK)FmUP_3ll{Ib{mr8l#^ZPQWI4j}O_CO52_&uFobh_4U%%{2PU zfKvGtKj?E1yYL`+JgRb{Wnz~1tj&9u+&~JprdXWbRIl0}%}uW7Q(AY5W8Gqi%k^Da zSXn!U!Ek!8I#jNBueUxl7D3$mJWNyUsG zU3rRApJgJyPv_+!y>;c3PNpKp^sm)A|ZFRRT~%1%bhG9QK6F~806PimLx{qopS@{eMi z%*%>5jCZ5oyFd=Nx@0mt)ThdI)%+1eFzYB{J_o-AS2yW)T6H`Hc6a$5_3a(-Pl9#i59u2@+e2-kBkYprjId4HRA1H~) zACn5#EfwL)ZP28FvW|*cBz>4tQIq7q5XHiI$DkJcn8Lo99F2EzOTr}D_*~GuTQbMF zUfEtRR5lh`n-A@5RnJK3HZX7$*>}0z+-UPavj{kUtSJT@&|UynVY>TN3DUAkLh){T zhA!YU#4O}dk;^^5>#wfARx#kXPYa_xV)~_eTgqm3e<4bib7E4x5y7d^J}sp^OdDT)b`{b9Ag%MtRyhQs8fd^ zrB`j5-rwE78F;Qd>mTQC+mg6qT|afqR)PK~-ry@#<{@UGUwYNtmnBL(PNs<49PbQlfJ>TlP8)-lv#Z`JRH=~- zvcr2Ju+O<^rxsn7>P3h{^T6LO!~BTB3d7iqWq&j8oR|?xvky9AqPIyBa=g4Ck1g3b zHNK!j>gbf%U~+7k0jY&OqGPlqAb* z|Hgsn*eg|+?zsLGr)CwLOU`^H{uDqu&?4S=-|X9xEzdjGpJab~l_UPN@crBaMw(P( zS0EjEQ|}I~&Icp20x8r&E|dP7X3hY-maMSqeGw`y(Rj}ObOL;=3RC_9;zp^Oxjq3G z#_eEg$HYtKWIi1}e|UO+NgL{E7}YYpuZ%4(Y*Tl-+)d z|GM`W^vfnX_gY49w^LB_*Meh*h`7)5N8e7_FfJ>eZ(iSc(^D_N3q9rgWEr2d7=K;3 zcDy3^WlX|Zcw4D(sG{;K9O@geeR%?*yZG*sdtZPW?CZd?(#!hre>n|rt9*6kWb_)W zGjl6wd3pX(eH@jtb?F^4Fngq)1Kry=0*Xqh^Gg*|{}^k5obR}Repw?(RaG|b z@C&Qcxf5yfGD(qT%*6$i#O0L;d`Hqr)&DALLPS{{edjJ}@Z zA2hs!210H%cl&jJe|CA>$|Um>y&6MR*ZWbWc+T~pt4dj#4#3AYQs(0DI%@aHwd^4> z1@RR(hxqwEWx91ron)W@qMRBd3@t1oUBixn9d#jhI&;W`_MFQ6Ht+Co<R^~nop zf5+BV!KbAed1^0wH{6UEijq5N`Qv=jn(2>5ja_Om%&fP)81ydE>aA(^XrTEQS7;1o z>Dq2vqU_0GO{>OmIwiea%^ME$lbhAg-s$0gWjWoPBzQRsFEjdr3hTGN%h1P zRZKq`1bLY{a{{dMba9D*Xj%liO7z*g5A>|m{UfN7?{iC!N15t!ds{TLU(Myi!Xp*+Rr=ewgSdP~I+>};x zxl|i%6f>?vpgZLk0?>Q*c7KUI~n{01lr>C6yj$$G)iYoZ3&&p|N_%r0`s1Wid zn3r{tPljO@Bfe$t|BL#oV&F%mvugXq-rsO?7H`q3o#xkAk5034F>Fy+ZunA(4<)lY z_4&}|?Kp$?^}+tcz4Z@+S92QIvlby`pWt3=0f%av`j`i{Nic&%R;{|#Z#5FfC~KL@u>hyEuA6;H5;)rKZ{XMt9hVQ zmV}#s?cpY7`%O?n!Mgp+w-VX@rp3R}mml#_S9Vc#G@F;|!tdy}D{rUX{;)E0t#e$B z+S9%kJxHeD*k&VZ%>}R5S5gL!ygd8NB{yY5DExCV11fS$ z!Le(80E^1Og4#Pu4s+F|F!^rSP*F!*1s5g|y~j9g`sM||YP4N7FzX4FDf9{kNleJ| z=45&vrd6NdwPa6l#RgV7!EGjwBKKr)D^S(B^WDj@>9>NA1xbaEcUzLZMi2MyPi%H! zZYA4@DJvDa6wgdK6+G{ROc0CWNV+XjHyWve`^6%iFyW)a*Wcb|q{+!Ns%!3Txc)-( zFKOEQk*a51rX1>y<80q<$xogKPw%n6GD!0l%8VF#r(gD*#fXogN}6_)_V*zrfB&Ct&Lcvp+#_NmdWBkZV`6feyYAT&wXO z3k&s2qYCzAyA*<9y>I1`)lTR6W;T2_w+fgTo7>T_MDO!Q0E|d~K>M@myr@V)J`e8X z3=kRHNXc$5G}PY^v<@o>e8n`KQyWmQ6P~3llSw{jPUeM9qXg{^lk?2riiBRSLqwn4 zIH@(LQ?d7zH?qwBR%aUoEMKO-1vpUaF} zUCo;DuBEaGw)$~l72&1bu}~C=%ke0px|!fFhWF}vT=Bj_%XxH?YGI{rVs58fe0O7^ zV+$>&yv9@xuWbl`w$lXA=rv#a^Nr4^c!~m>wXnX5){^Z0HkF|O{UP&ujORqrU>{{#hlhwEQ)>TD?Bixt6W!-4u6Vc+XGLz?}gjf(10|9QtwFY z+ptlIV&ZpNJRNYnOSOVq!;4>_yL%_T=Kk+&&7U7KggD9;DJYx5?il2~SkzgFO0Nav zxPeI>zvy?ostwsx(?x%r=s#WNuV(JfA3(Ov^d7c35D{KBp%{9^CH|6MQ_1Vuea*B- zXG2rg1E^wNmNI(!x&ASurODkl`+-QIdo zoREO3TYcZEW>Kp8*ZeF?VkTs%q6{-z^Y-@H7kY>Iv#W1&uBr!%eH0#lCK@DX|BsoZ z_|s;)ck9isReLqmM^CCiteKm6_Eqd+$lp&M3gB6W{6d*D_e72I*joFAdx6Y9QY|Lg z7rqZrsaeU(xl65|H65D9G_(~apRsw`Y;RP|5m6*{k)Ojbj7r=6i^sI9NTN&C2Eud*?9*0wN+>H-d>)8%uh zGv`U_a_VN*GnDbQNjY9T3wT)@b%j5b5z}0B{f2`{dLE}sO8&~wL1im`!^O1X*?RS@ zl^ly5XPN0BeHE^A!HHpw%JPulL09a?r$>DbK`y%5h=+S~%}x4l!X$I8O6RDvp$PiO zuHl>2p%?$%hBKgwZYNXc`c?Nn403O;M!A-|`NMS-+HZ1FNwIh={5iW{mWOGrzDD+; zEJ3VLl}aQWfGH9r%rLTrlApsz(QsV6s_LV7ly|EegKf#_hAqRE!?_^*NYr}725GfD z(k8=iMFkg$2w}Iy{!ZH7Zf={igMK*=jVgtxUTV)tCQ+K^Qgj^_7ITcc()WBt9<%nb z?HC8}NwQum-n%HS#vmSVV+2xKdlDQ28(GhM3i_%cTFDL$lY7<0pJ>fO6jv(4>)98j zo0+l|1TpkB1=e$kBHB5A+hRYLl>CHN>|8|JQkI*r8zlLAyXo=VD2I+z#|W$M`Fl&h zm^p024j7((X3?`R{6%NOfD)oD`DMv(9$OwBmE?6XCD;hc!1-s!Z=jD|mp<|i zL}}QDgv-T}ha^WHeKf4udzQuaRJC*Eea1+3@(IxpYRdW62Nu=+6B4#2gM(gITMq~}{;b#tgPo!b zCF3=H;=a?j@aF*JEBLE#JlJL``n^$FbDf3+9TI1n^3ReL(4t7US3=r}D2dZQSx1Pl z@2THqk^7QnM1(L{v{8JcQSRrh;9mKKVnf2;Z%M996+?-ReyVBqb)M^g&$D8)_Fmq; z$l})HG{wx%NJFwhcVBq);(w?|?Eg{^ODgqHVTn=aqtcEW)b5u5yrkDD+|>6qsy~E< zx+jK}dX$6u)G47WjM{$>>>iFn*G+AdyzjjcX6$}%c#JjLNax$oMlIx!XfCy;;h?ivSa&C+k%$qvQf!FqRfuKvWog0Z!^sxC`Q7ApmdBN2wJ*xlkn&qonQL|v$$xAE51(;G z#u-M0MH2O{!By2Ht3gDFw@vVP@WaE?qZ$vKw_1BrDLeRJmq>Ie9zNVqvsJT>XwL=@ zdQsdb`#TXO2Bq+`kIA)re$<}%Bv05bIdsdqU3o6w+k2UwilmCA_C4P4lTik6$^1gII&PBvO&Jxqa{ zc01U9RGgjgq;~2)$aUm$-=#^3)(*it)&y!Tccr9ppDafL*9W(psIfZfLEdA0_kP)! z{kOpe)3?RfM3l%A-Y_0z2M-9$`J0DxPUNx*7qOJz9E}H4Fc`5ZKw#un1qipAC;;A` zAIhjSe1>)A;cd>N3LbrV;v&7UUjpp5rWC+<8&ybLYwdbimrrq!-H;55v<5Tk?){Ay z&H;9gWzfB8uqZo^!(9|BO8B`DW_dP=Oc+n_#xp3`NaQ3xh~bh|o(00{NNjWQeF?xU zp|fwV>C00xO!wD1U-Zrx?y5cprT!azufHQULcDW?`tZOeBfDD5t_@}@eRBF@9`rpO z7~4F*vt3=)y-$ASS3dZ6PBO5gp)7Z5f70{k^i#V#bmVvBUuB91$_kIEu?Ww5Y;#vR zSsQ?!p5rCl0~$0t?5roBEWQbeHxD`|cjc~a-%aZN{0}tZs0~0T-)WlPXBhUF=F9?L7R#8|5^e+)lq*r_N?u6U#ylHR9h*RU zdGX;I5=zBO`GP9`B3?Kmpq+`%SxLXwDokA>SN%5HSN0;ocF1XBfW5h`|2S@s+PtM$ccCOyB?S6K=ytQE~Leu%@^V=eUIdAT92RJo=h)0K#Cp=Bu^7CCP#smLMicCD60)b4m724x;nXi9THU_(@2hHK z#ObFa8avtk*&xaIUoQu)QVmg)^wfBOBppXcXy*Dl*x#U@CW{sV`XK}wzOMOaGv>RW zlENu&5Z_b@cjCZlmj<5hr$*7Y!0Q(y!t(+$_`0%Rl6Q|}4_OztHx+n4?YNt{NFbHG zTA-3HaSQ1&3x8vT*%#*>8~nCvpe7x~OE3O-R$znk+`Zo)m%6N5t0A>%a_OIAE(fD* zzpB=)U{hQ`-yBHL+_puXKcSoL2%$afrrXT0f?D$e*6 z5)z?FS~)d+uRS$m$Ib{Z=}zMu?HV(@uIRrvMC*b(qd5zLv&)^F9Mh1Tmh%a$qn2b> zA0vQl3Nrdi(`Bg!L1@Jz?`wa4j1@~fzW>iZ<=wN9N7MifuXXg-8|8-l1Ex(?^Llg+ z%pz?Ox63{*OPl`DbiEBFH&M&N1BFpTM&yIlk!c0~_Jdt-Meu1VSe1`(T!TBRvBu35 zw!poT#Q=v_&A7a}YF3WEOi%wKoEyk(Juk|_bl4RChPJr^aTrt#wXf3U(%T5vn-Vno zNB%ZTp)MScaP!fM&}GZ-U}EF@_&W(Rc4+U=ooa0Fv}O7)gCJjD>&2zMmbKXyFI00r zf(fBlebAE5-%NR(8yjkY42Lb-Qd;Hd*kB5;jnh4^rQx}PTPZo=QK+B4MYg{-OPk$Y z&r-jXGJdLR^!8`ah0xj!K+`G6MGJ67p4jPx|?L1?buV2{-PW!sU(kD?o zNs&q+?hX&evR`!E_ytuGfBw6=PdkiFZ%dr3RCiSa`;nfJy#r2cR!+?bnkG0Iwb`Z! ze7TXDp6=8>DnBua_z{a zC}DCuy1YJJAn59kHcIsr31h$&WacTO{Ci;;0Y2qb0}<9uxB5G##p1?tNev*<@xdni zaIaf6c=j+w1y2qve)Jn5)_k7L?dkY zkKn|ztZeEcF?>w3no?!S3sua0!~Q4>eowCM!;t|%`%&Jv}+>2 z2LuesqwRmU9Ybf|oX_>IML|E>5+84Z zytsUPNGx1#u$Ar?kFUSKRiX=F_k7Z=p3b=oUTNr88crJo9FlH)QTb(y(3hxTqsfk> z{%0h*E}SyJsL%dKwsQ?1Zqi?bO*0(64QhV!PB8k#%hb7eaw)%D%@_btV_Jl>$@p}t z1nGd)>(7dVDQ(!^CSg8b!s3rn=+1D9S1WIk_0`Wd@yFv^I|yaNZ`5E!W{`03Kocp4 z8MeL`7HsQM?sn=jjL!a4P%nJ6V2$K^szy56SiDwu12`WED}L!QFRN4P@rUR9#Oy9u zjbaa9**J>q`2)lly=couSa;YyHgnwtnC+L`9=Yv6{b=FZWWo zIuG5pE2ewi@Pg~q27M{jO)fJRb-B?0elH5uQM^W%x@(nUZrY&+Ek)0JxnjO}5$bOd zxXOAq;`d*OV8)yz*K!Ev$4tPNAdl}9=iueD_oymNz3mhkAC4w&WbBk8pf^IJj3 z0n;MZ``=usv-$8&*nlX0K4>-$VUO#|br1D%NE=+7yXr<%Y4yy3P`elp(#fBcH-(&E zDX3VX$qzV%5(oJvs7+=U7hZ|Qg!((I`Bfkc@!uOB^)B5mkU~5f+x$g~z$*>B=?REo z5b>dizM2ryltU52b9BKsmCqi9lKWR}Z|ntTbF#E~dk0?dF|~d6qn>;_=MymLnaM{< z)AmU+D&X|&;oo{IqLZ*0U;E2G7ow-mvTSi!4zKmvfX+J)QuAf8oj3L})RBp2$%joq zy&)HYy1zY=p^ap$GUPPvgP;alKfU#s+*zcc$#X0ww(4FA(9_Wh@B%0cCE4*W|6}r- z@DSV)JOO;ZGrUx)d^Xzcbq#Ra6ZsH!2J(%BhKz-Zb3!2GoXAw&;J;t@v+57x(JB7f z_n}oyhwL;Pz?Q*KNnGSfBnH3ot+hZhTwF%Nv}68b0yG)1Wh)+J-F4skJPfKL3?&<| z5xX|7Nahi5DYA00n&47r6Dg|;m#gIWWFXxYHj8A+>UERILw*YEFyjYsQ|f3};vTQv zf)e1#ueaV81w_uGD{fa!tXMu|>e-Kf)onDel4@YuwhnpaRAn%oAo1gg_R7kW!WoIl zpT6id#s9$xegBIStf)AFeJca#n#SYu3pT*=ixqc{#g~eXeH` z4;34k4be{v=ya80IQw!>Kd0RwxPSR_h39mjSGRn(a$VW;DROk3a%6&wdZ)_UJsMB% z=CE&w3N&kVu1+WVEfe=iRi5=LHTS%85kTi$$5#(fgnvtVhLu}njrn!@P@&t|_j9z% zEzPBGH_lKmE|etQJgXYkegf991=RjF$R{vMxGd4>Mb#Z?xQd#QDRDURj}r*F7SmDq z`-o_oPsFWdtli3RpMfat?R2Ei!X8G1!$Hw2?IUKVxoj5vR9&gvboyGea@@*%5eywf z(&6(W^tfPzbBKA%jwu{+8SoQ!=QqSV%!Zr3jRg)`>7`s_vpH`_Jw^9inU*& znB+@0=)XUr;MWee&2vl59_e@LDuzSIydg~$>Gd0>@4P)U8cK8wGZ`1+bF+=_dWBeF zzl^HxI$@1HIO~A)7uJrG-RY-FC-YD8((SiDgpBWYZR6vYb>LiTj6l z(~9VFt>*q47ov@f15BAG(@<|ip7rla7=W)6z6Au1&nsv;CyQ9jFf26a{ce~qAL?7D zEb<3+EwcJ5E_$^paPtw?{oTh1qx~ogjNgn$a_g7 zhYHxPq&#FQ>wN#K+KY9Ck_wRqA;z||qZd8NC@Bx@M%TTB-J>;^6-N^q3|OXB!mUY; z9HzE>bb`PHFXO&6(Or4bvD675LP0>!_YNpiHL%)c)bJuo)BiwWl=oBYOG2K2M0j9B z7DfF84#;cRZ)v+JZ*j)8_{aKZqRazAoHB2m-2!PbczeBJKm1nXkH)P}MiwX3_#Pp8 z^T*vAghrQ%vJIfgciwTHFL{a_Hq_hBc&$Q+h4?OY=;G#ZkIQ^UP!`of^-X@*(#j%F zLGYnx1v00dYStc~V-cwG1WMy1tes%Ul@X_|zG|2(bc?m;Y-Tzi5tnGlYS!C#cEhY6 z6pF;XZ9UACgoUjn4=yWzYOUPo$~iSjcBDK}`Qw1xDEFLuWxKfwYJD$zXEw^imW%rm z@cfjnZn-(jYZ}s#osRGAf*Ts`Tcv+9oYI1DVbhtwX{bUjL4a65LrR#jsQ!j!gzz&N zV;iL+md9~b%^P`QO~2J*DMYs{>L|bW%C?B}$?A75Q+p{nKKd;8@UNSbZs8~Fl$p_A zZc;r8Bigmbo`)8nrB__SH|eqpnx>o?$@Em9=T9Rh(AnTx$TFbZO1NaLzuQ6A$Dt`W z^PE2S8HFEI8Mxa%^X)l4d~}@)?!7EI_UXy2I5c>2s7Kt_)yMVhiN`e7H>(YcnXZou z9jSp%Aiws_dm3NIy|fZWwam*DrtIfS__ekFgD)?e!E9ASui8eg9Dolg?IssXbW3(z zToI%WnYMq6>RbCB!~=JvBo3mQ1-^*vJjiu1)-rWm#;Y1~9ZrQ2H#OzJ^}p+Edq28= zUwK?8br`cAsVBg((;=KwWltF$0!#L>y#^yRtg1aiS2mp8HH%g&H6x7UO|P^^ymz!7 z^dzDHB#cf8kHv`IV~eLV`RSX(<4T@PcVeA-Xz%{wHKwk9b!qnXJYyYHXRwYaxXHaO zaq~r__Pe@5y8lW%divg?DPNUMi-MKLRMY(H8GirB{q5GabZcAvB(b150>ZC)wu2C# z!rV+-O5$%XeFBQ?1Ut#8blw0jQ4_TDo4U)bA8VmojY9lx<*TAu^5voU5qORQ6iK1> zFA=WKdt{FGHdKSzcJF_(?%g0p?w)lAIrt#T5f19eZvlv_^64McK$LrCj^8piHTUXb zUX9&Qiq+{bwao^S-L>Lx&MqZ*V}xD6e-|5ge>OT~$g|DseRv(1&A7u2JojsCFk>YD zYs0>69lmjxE-#G37RBjXeGO(XUN4?RZ#(!a@KqGuhjpu5FD9krB558mEB zag}?^6Cf8OBFQsx`!(}S(KCk!4=>-92zh&5mUMGZ-J;PONK}OZJ>s}+b>&(z)Kx-N z$s&|TxrFw^((r0%v#>u(8pn!MJ9S|NMszAk;uaxs_q#ds*9te8`j@RFr#Adf`Y_LS z2`g{eOa6Yk0=PRVk+3JHytFkM5{}%!*IpGyT63#?Onevx(g=YHPC4y<4#&CRhrM!m z{Ri*WUAT*1@djyseSrQ(0ah3!CwxqPT3dlWwK)|9y(%!aTcgy~n8XUkVTe_-tM-dO zuf}r9@Gi-pT+v*3X~fQn?4@H9>+b?ieHf^Du;8Yc{Yoo(zFqIy;PZ=seU83^)P@i5 zH1G3lOUvG+vBB+2()MXUxC%t@r@1Z(&!stlzJi<;({|Ls{++i1@&SaKN;eaE4dYLy zRm&g6xCp-f7&jJih-$GpKQMzMeFy~N#Bx6%`E}>{*#rri&I*@k=JSB4ZsD(Wa-bH1 ztM@vxwwEJe{wyDtPNXxKfI_qH#Silz>I$EplfY=ae;|r)w(2LpRJhnC$)l|G5)A=+ z*5QdC4vE8p@U8i7IUfBS??^n1-(`QnqmN&_T9C&%{&XYWz4x^7-)8cgmkaDOUE9p8 z)s+XktBjsMn+m69Rlw!pVn1%^oVRQYm{z!+P1Ggw^t4pHO5Lj|?6AJ|C0uB_KHREt z_^5a}qVs-coC&>J676kfzB8cig%qaow((++9ah@#SLS16O(u)t$X#7(71W1}%lpZ8 z{H2uz)O9`1)cJAB8?rQ3c7b%BEDy*4JCVF$EA7A6*4yx#0sP78j*1b@82Qe9t$c;J zm~MjS$x)lC3GT>MhKYh}{n&zVPL{uz0bI*c2=H$12(RyehXyAvjkL|74g?X;ddZhP zXy6zQUsAp!HCuO1-^Ic4=0$D;&I~%GG7@O;j^D8Ia&>py2ANZ2 zr;qYbvga{~)I@Aa04J;9yt$UFA)Q|g_@U$xAQ8WZ7Pfu7^=Bq;0nq<-c}a5V&z+(1 z9Y?-8(!SPyvqa6-Q3nyAbw%Sn{*Kz-Np3Hyn&Ilvx$14_e*MR^A2!{7;xye=WY2}(>`pe<)h`E zQxB5dHIwaX?lbwQLNwsJGjpAaLZ))p@-AxY@dakd?pr)fRG74_@{%t7&Mx-FBOzn~ zwn^Y&;U%+RJ5d1`SI@qqwMOh9(_L|m=wXVYH0RS&NF>Mfam1>~T7~wky5q)~OY$S< zvyjOkHQUgjLu56?#%nDxU1`5FX;yoegtnhQ#n=Ech-k0n{6bFbcvnIYE`bq>t$FX> zT5$aKdMR-gUxbE%6;cxws@?TjtXdlhKWQG4^4nGHaMK8<5$2r|;cezbXJA_#9Md^|w~78%dmUY)er zn;xWpGlP%ZQZ74mIEo$nmfayw-03Z*b#}XV#EX1hUJM@>7yX&rhJK^rf9Znr<6#=m znM&9Nj#|kI#oSczL8#{?5kHX^-@K|GCX~;tOkH?W-Xm(Y_VHi>5`NL)VQc8ycOpT2 zkJj3ji0*K|YK!UgX;xlv!VYT-AcSaN0Z8WLUIQOJ;`96d1yxWntbNobDc(LR_nHl2 z0}bbp9G5P*@keVCP=lpu(ME@Ljsh|xpjtRF<7KfIr+NQyA34CwYMVp_aGq`JZtt+c zP)&@z=3`<8pjTxUmoodJttpKsjSY=6jZMoloXDDQ0vUV2UJ{3xOG$M&Uu{En3naYdps zC+px>_v7o|8PzT?nb6kLfopK%gnOh0@B$1skuZ zQ0&DS?kREYT@4TRSjl=nK^>CXTsMn>5M1!5 z$3b|#&c_$|657?HvgQcCnG1*$e`8fe`}_-245^CMoYyZtwZZ6vB*r~tdS2D5e`4QH zbQ)E-Y-(w0;lp|ADEM2Eu`Gnp(r|57)XNh2uivjPXj51aWQi~gZ>3L>x0YR-E>10Q zC1(1ET!>@)J|UfdS+)Q2Lt52WE_aV#DjomTXuiWWjQgMr(WVnKIS}o`(ru|_fQ)P= zR>VFLbkVA3ILy9!m6AdK{YWgUvO8fz4fk;=dd=Q&(Z8wg(D%@tKkB%!!bQc}LO+3X zFqRjK(+rUFv^Wy;s2{p6&KJzj(*l^q1PCwfDH@BKk?3dn=wI9}>%)}ZM)i20k4~yo zJpALU0G+$^l3s8!ju>><;XnEa*S3wTGsLAuiXCAc#;hb5$qGSJ?Is#8>2yHK7tNF_ zYe=_UBP#UThJ?m}O+7}hw5+AOd3e7}#W%b#e=HKT+tkaECadqyPN(|D|3V)5so28D zlfh%8Y>AHY8wcjGiS4qLi{#6lV~mX2G`e!-4QvFUD1BR0|AHC7@+kB!C+3`Pyjlog ztkcogw|>0H|46a(AKl~vFD@-EUjhP_?fAR5Rij2CpAAD-P}AoY`-}Nfhr9iOkQN@! zj!Xs*qJfj$R4y(UZp|;D6rAU&HukLAJ7sn*H_)GOc$zUrTxDrB_mBYu_#G@3=V>ix z>%K*qTnCK|RnNW__cj}3ErR9&fw|e9{*ub?P;Mu?X3+h)L4c8@j5^V?q;hL@t))Qc z0%Osw@cHJFPrCGS&nky1dJ})SFzm3ylPWFZ#s)v#@*df@9=fS#e6i*FE+fUwb0q8x zc2H;EDA6HXsj|iP*LFcS^5OiwTA}?z;SR;-+T$sD8a~EIJ;sj~Z%};Gf9jL~5L*}8 zNd|(K#_;6wHKyYWZ_Xqx2?0Wyuifk2p5S*=a!`r=Fi_9`XM<2EIVr3|DO%}qaA0Mw z@v1pJ7w1Q0C;)?>3_Er;w=RIQ!d0@=2sUe}I~QhA+_sOz(VJTjbAIwlvQBzYy+H{6 z_A<=fdxK-18Q5f|>)26mHKT{BC^}wgjBDcFYjwl=;PVW*%iEf?z;>*6bM-q;y1%3J zmb{k$tWSJdTvJS+S8rHgZ@(2y_*x{TD4NoDq6iA=2h7MEM`~5Eh-H8f3giA_1oO6 z-1H7LS8<7oMVP5DgoSdE`np0zB)6$Rgq3>qB8AC@F*2X`3(GqC-lKqwakx`YbfiFU zA^6n|U3f9S&(kVLqfm|O*9ZLP)Rm+O3asL}ogc282qR~+ws?ixa?PN>LGGvvrCY%k z&yeH^QcZ@#VF>9Q)_zVzoLdqaFwJd%IITgx2pvf?gg&w9_mg(*Rg1u`$R~c}!ro3hU5K93x4oCUtEK+x%eCO zBQxW%N`Hqobt~nR=Q;9z@#QxR5lcH3FAb-j>K0N)c4vM5K0CKb3)F~9K26d8mm`1| zebc$$@ND>~LV-mz&a; za8Tsn%<4Id^nr^>k#o+CYUsk#Z_mWZ+WNEcu$tWii=riwcWk_ULg$g zi}Rrcm*KDPfD)aBf~htF#o)%%g4lV?ft2|==O1QWW)EFbH*lJnC zhohwD%MsCJ5AKKP?|oc{(kC6))<_V#Yv1}RG==RnDd24d+-*7z5I^fkB*nuA&_4%& zw;mk(-}eshnXR!gmpg*3p@|^Es-my0w?c9~y5BKD~10*uRlXsErimcnW+S8&%1QbaFds zTg!oPnTh!e)6fdLkrmxmvBb~1>ZI4gmeq6m_>u%v&m}Y=5||x*YPNTyWuqkg z8|BgXTvl1D4 zYZ`n&G`F>9d!*ZeUl_GMo)%zfI3ZI<&Md?lR zpQV9r6gI;o7dJ#YR>1>sAl9BB@dtMVk8a%5qbr#o?_Vn1`P8LyY$P(Je zpNwOS2fIzW_pBRxWv)&+yN6ic=mnV}t%1E5;@nkoSVOsQYd7{iFCw@c&zIiydxr08h;eN!F3yWUyv;-M zPO!i{_hD=nuG4{@E#drt=(21p$!uUfM8-{dHBe6=wWI~3>h{o83{s>yp2J1ecCbh1 z5YgiY-*dxWaJSB17KMl1dBg0GuITOEd^s$O6;qRq+}YQEtxS`%9LMzbNAf-VM&W0P z0m=Wntul)q`g3(Zbb@7TDco|xAadlQryyXh{+{Kd2x{8A42K_BHiyIV$gro}Tl?*G zEI?2?8rW2|blG9Jx(og*u(>o6zJPp1h3W+4rHVdm7ES1M?b@FBteI)mv^A0$CBs0g zv@DT5CmzoIAfMCwoPF2q+8mZ(xvMWLLHgQ2ViO^d*=-?*MEG==TK4`F`KGZ`b$K#& z>@m}xQ(P1Fyl6%Bqu1YqE8xoC#=5so%pmB@W}Hg$%a|3)JaJzdpw!(2A3?+U0R2?; z=9iZs3#unpmraUNO9i`YBhX3T&cL{enD>A7?^{9CL6y*WlN%hUBhNIrKRipsP;dteiWee>oQZv$t%{m3a7zdI|D1Pc849Y_;lVb%Eu~VD2YL*>JzS_OO3RCg2Aj z-hJ*74i2*%x*9l@eO4~eW|$P2Y(=Lux^z@yhtaQG1>Z)Q91m~Iq=;yo?R#$MkI3q} z$suYEGpP3(YMwuCoPhIuJZagnENeU3egZ?kR3|)`zZ%|^^`Itp+#2d2!k1$4#LB&@ zhGq{@eL|?KZ;u)?X{AT?#%z@U0u{aOi+6t0%Nje-(r$J%;tK3TF)Z)*M0;*V{JT{` z^13k>dE_aq6#U4u{b*1*$?TG$sQ+*zVDsj+opqjSO=lER@ML!%D2(P7hj&Z-bhuE7 z7a;)aR+#o6oA)=`F1g6er~`mX)t7g&DJU=qkr#mxJGkFGFLvf;gd-U93jrXOqbP#H z4jLmKL}zQ*sL3&)2|XUKRGN%acUXyfY*eU7tHLIX_3pLLKtl2hFGarUe6Ly+=KL3p z9xj9IOp3#WlB#&%fBDsQ>e_PQ^1Lm3oM(cr{_5;gelh{Y-w)q0-Y55=dCW}#cpN%G zq1+bEZ!wpG@>Ky^@ao5#Y1iz_3+o$M5E48Ht4$90AbXBGpUUSXpypdy7m6Z#|6a3K zGRs2pl!W0dmZ9my!q?sZQrgJ(;QR-CZ|Y^>hRE3Hnjc6CEzp|h)w*=J5U#YEEFW5$ zdsS;3N_usn1aqaVgQNr9Ac!0S>5{8GLnXq6r5yoHx2s(`b=&5XVMmCoDdL+MdQm(f zAutxc%HAL7o=>~}!K;%d^<(l_A&SZUo$*xTVUKzkBPxI7I`3@NlGneo14~~*)u~AI z2ye%CJgd)@q28awBt$yMm{+SHpr3=%J*fwh*Se?X1b9CP)iuz%{C;8->N z0KXENr2meJ4vK^S)$KSzBisN1C6COsLjNQfcZqKW_TxfuGMohe=|#Sc8BM@`82ACy z=6XwJ-wIQIXTF#~1*{VgyFT1M9f!I#TwT@G{L_;JngZ8y>lPqh$D5s-9#*wru#ckv z=tyH!Bt0?4$^{&0 zlT5lB!+pStC$L70YV_f|3mw1IygH*nclvA*u%>b^7IMqf4F zdxyY5){rBWOBeeHX=%8sNKSCwE8UIpFQnIcbm5zG6BHD*N^!!bf`tSe*J}ziv$#pf zO=?IyTHDy%4!QFZ|@4391pK5y(DDr6N3Ecb6%9PX>_M zi$dwj-j~IOWe4Y%ivAg2`)rRlw7JdtcVei7joQwYpw5w4RZGFV0?zJ0(gSDO^NxQW zjaCnJH1vJT%pnu2`s4^)CfkpQL!{fd`$rfwBKG_(@6<)U{Q49%-)smT*G`)yrs1Qt z;QmIFI-^-Vw``~A(7$^g;}+_UoEqhN6w+v}(BDF^d6Y=V%7l@ot>714I4{uJ{I?c? zUDkiVK$>uy86M`Hig-xyi~bLf@@d4V0JgBthKL}_TFN}7m_YuFM8He~(CBUoIy(nt zyuR#a>lO*U+B{CVXuSXkrLoDZ^xXm%hg}`9w)qy*hb?aD>Rz7m90{#k^|Oo3tJ(DX zZeKUg=M^@x?DH{LnArqphubUjaQStwee?38U?=hXL+@O3eMK&H!Pug>wkhN-7S|*b zfiqlrc|s;M>8Okxc=STs)hp1!1WfHD-Oa7`rXtr5_TXXoN8b90dCA-(+08iG8Kq?= zrC?^7^Ow8LZ$28D7-!#eeb3y`8dWq=8S594Kl9SEps&|LR5<)u_rns}HZoQ+Ot0{l zdug}Ng}Ja3d-cuXe;=CO`16qc3+(U128!ML^;C&RnVQb(ToL$fZe^fCa}{7#N>B!zZgyYL)Lg^pb;TQQ z2M{rYPeU;(PB=5+VLn z5g^TuA~nB}cThv+PFpO*tB*|gbWxQ$90&H>3NsNJrx+^Xwc&%07G-pELnZOGdHNL( z2tQUPAc(u#x;jBhUnis_u#aucjUuNon44+GO(TP7a%4go>{!_3dkQOB=wJj+8I)nbt^-yK~ zq$`ww&~}KJcg238k~}?x*-ct+rq!G(0e$tmtT{BFfQg%S>RgJkz+q~u1kQ)a>Tvy0z}U%>w7Uf(yz0t^GUd>yXM)>*!joWNr?LCpE@ z<2=?%L3brS$Pwz}a~%I0Z+PVCFa0*a;+@L#B{^`jEuj6;jZ_L~eXp5sXM7xw7(z*ZA0drE=eC)SeD)eV#x_w{+UVbiDg z|9_xE;s1aRGd$4o4)gQiDW31~AFM%(W5x47DDd#ce=HDcyv`^U{tqFJfRzVh#4`iu zvaD4N9gJ~*ap7FA)Eub&>a40%Rnq;XOpckvmlQ+%No2A^irHsN%vil8Frs^qi(AUm zYvGORu7`|eMBi-1jo-TXtnZ7&&LNXh7X;AI!Icn9r<=s~M4q{Xr`6EsLoXbF%-AlA zvzc#$T8D}_bM1T&hwZkdT+IpU^rDGCPSa!uI`+)OB{M$8EDigve$PAf}~MmTw(o368$ zdhHfA!y$LV8h(@o<=s6r7N4_L4f<>?s=Cyi|1mGuCqAoIM}U8w+fI-VKK^v;WjZf6 z0YDrRTK$6ba{<#V%p0L9R~E}Q!rSXKxOv1&@P+%X00)!EQ0TE7I_55c&vcDc-V2tn z_h*P+upkQ66I^ZH+a0RC?DHblQ4{PD_?PGk+4FiCczNpJ7M+tX6K(dGvN?9OM6z8S zvIbg`Uf?_U1bK$k56mBFh3cAiE=JLWn^0(dwAs-M-9JZZn*}4~6>#2v-IA2&16V-blD8_feJ`AG0z?Us6dH;&A51$HV^P!yKSAy0H9d{WX!C z_EWPzKZb{E4?)-Za(VZcd2dJ9&ffiLUt}vADnL5veGmaS!h&0o5Xv9VmD%SEin9=N z9Q$7Ec7e=HB@@9HW{~$2+d}H)T}z&)=NTTV4-KAb9QoqC@^~<S! zuqOiwkA3)ULx>5cBB*6|o|QMkULVN;I~)nWWL?e&Z%%xoroOfRgIS7z7PcO)bwill zao4?Uede)~LAIx=b}-GpOejFaALAfQS;f zNGW_Y`tZ$ITgve}+=2njd2cpFQk|}H^AKa)*V)=GVK(pA+Xq0b-%d|jj`PB#32wh$ zxFe)whhM$by^P~v4_Y;#Bg+c8Wr8p2YkNNH;BGP%K4*{W=zVFw_)t5y$-8NQP}&$1 z>X?-ImC~{Wby6$*qt1%-{=_w2W|}N-VqW*m`%yxuVcnVl!57n+H;4^xyK8yh*ZIe{ zsCPC{0l;BSy!2;J_wFBCDBryWs2O0VyAJZ%yuBLcyLQ$o%g@H@c9%( z14%Hy&OX03mivoa9rG}z7e&Io2`%_WeccCxIdpdCKzJx*QuD?!lBY4-me(O<5 zd*cO{gX8v8e~z9hvQM|>fGcDEZ3S72Pf2UtDZyjQM}V8#44aRWPs0N!L$ON?r)NYg zdu{ksQbz4kcs3>@!g8;il%ND#a2wro{Pw-*Bdx} zWuJAY1xlmH!1znx@y=u#un&%ekyo3-@Amqt()```e0Q@eM5dD? z7of_aoZSY}OYaGQ#R0l=aen5#{M?FNox_jLWZ4TcW!_<&PXmdtq!?*BTKx24E0H=R=!T;2)L z3u+eH_%tKhi;5$)zTv~*#c?JiLE5#9h|(Y3>$BUm5D&w(yu43Cs%ui|as%k<-@&_t zbsCIUIXNc^F4&#SuMfv9v}ewM*&HwhlW#-Li@CvAsxs_cvwE!PTeG$D(&1{<%GP zyF*bwwAOWl+yRT`H=<|ds2;>Oc9M4sftQ1U*^M;&Lq)k_^3C0zv0iJ^jD7KIht8d9 zXJnhQm)O9I=L+Xbw1;;X@()58R(6e})Q+kp6g4_IrQCbQIV#Ga zzUhE-tA+LxmQ`1#mIhHD(K@kKLp~GoczhZE;D*#HCj&pkI9)B`u8sRaW#oTUb@F1@ zCaPjlW08aZwsy^)m4gp`HrjazvDM1V?sZ$2=`=&W#xpD z-~r1!FMXY?7WCc4V{fZ@=3U;iQ4C1u1|rG^X!8AGAQQ|IoxprmFO|vc%ZiYeu?nHN z;m?)>T>6=xvv$>EZo8|smTg&;H~oyfVvnKm6t(S0jNnl>52N592GQthQ9JRP3fvc- zq^*QT`c;^dAw`Xd-lxv6Cl78__b9s%Mo6CehjvM{yC=$67&+wu0TQ(+o_(B+L9o1! zgc7{dayYh5bYp&YVimG>Fq$^Q{QCQION&=I)vNl?lQ?8s{eKtXdGBY!*BpG`8Con# zSh-Ryf8Q`pPE(WI3IFi7mk+;TT7x;3I2sPBiL_fQXK{5jw&H5@QxbOlZ{R(6d0$R2 zk)`7wm$r4~V&Ks)i_n)05ix>2fyhJR6B!fRoFc}ECgFRENdo*uXo)3}bI(T6(*xSCd9b?>F>xNbm&91q z_%7$a_%Qk0yhJP82t-ZwvJyO%ujfr+JYm@*r*sP0Zt0$O2d~~PQZO%Qb^)(N`WDAc zA0B24??o*INC+9bXrQkPH_q;oFuN$H1@fl5F>VfbBZAzTAx&fY{%f5#E6zUI4EFJ5 zcE43H+op|cs`|IJkW{GOKbdcj@^280S3+?lCtJyPs}fg-6DUD;3vS=;_`aC-;;>hX zn;$YeFa4%F$ZUnK@3R%n%o{4~9E*0>%I!NH9vyf6EByYVb^cXD3f3{P7OYtnI)tTr z^dl!Vg6_U!pSrAK@7u2-WcS{2I$#MsJ`w=PFy7n+M&;9;i8}SPC?Ul}o3CTCIW-b{ z_~8yH&%6sE@jX@Q>YV=PJ}6+p>QI}HH03kS0cad*ZlLcZ&Gkq)eS)MOz_OYreI5tj z-LXm!cAu9kw@pJ1g1e}j1653CCNH@>aO7LN3EH6?>_bQD{4<@siuxmhX8$&V+5SAi z3Qsw0;kulULDYi1{p)9po}SVY;yK^p9p&F1ezQ|w=^a;<&N z{13U3WRFxCPA_w)E-byQ_HoZQWRdq z8ynXt$*qJiK=1HS&j&XzM1zr;$-ChM-W=WnLAanvy>qx{z@Ms20jEHJTP}}J4yK{d zVCIBSj`1%U@q1rU8A?1GYvQ!J#w9q{2UrxV#pj5Oj)Uu)cFEsWhd<{z+_MUx*YDkg ziRLIa^x4_8Rg&LrG1HjY8YGbPlN|^AQdE(?QUu1}Gw{8Ll?Us8-|f)nkz!2A?`;Xz zxz(02#O0G>njbyrWJisw@|jp&DudRs7T_YYwke)SYS~n3jE#&7au8SET-E~nLvP>v z5Kq6UxoN_Vr2~zS>j5m3&ET$g{(HN#uYnH2v3(YEbxBByMq5!;(A;9$QL~z+Yl>=w z=Gw!pi+^d;miDr)dGA0YQHI*hQHqr;(+g3>ItScS^*#1a}Va2@~SK>QCBFEL+1=K zKP5mRm;F$cxtS!Ty#WBY8Oa;XAXqmv(RSiqY~@HNQJ;q}cM^gs8apO1!7R-FF3;U(z7#(ZSr$ERCuXJvF zei=+kbgz@vp27U;Q)4QFud7;yvgXbTI_Nv2r|KMP_dMb{{Y_L_#&LzF*?E%LNTJYt zYr>G%3n%>U^@nDACh#S5hr82^w9yXd+ z;!~?iKY3dfjnyox|{w%^S z(7)%(+AS0Z+sZ4Iqu63QC-;u!n#Jm`71KrB!sGB$5@Qo}ep%*g7g-Q3FU*nKU-stc zR6k=VY2B;ZeihvI(2n!EIe znz~6&A=HniFZ^>bvlP#b(Jv*4_wl>)QxX-C;$u9 ziu>|Gjh=(pF0WQvf0|B5wu*j!Tt8IOXAEmyk2T!H%g5nh^I{fbGtZZi|azEcc%}7h@OV>qVRoPKR{IeJh`* zQRrWkDo-B-vAXI+enS%W4Vs(UmUc$-bVPvgl9N7m^Dkw~Jv<`P{OK;B-Pr4;cF>!xe0@JIIF>)wct>?t6ZY11h^GF^E5FfKzt z6##~^XQ_&IEv(J6>?G=R#9kcKFQ6}hDN6gL?T3zu?<6i$pWAIpxX~)c{xFs@`+V=} zvHI9^8KL^W6bnXvR5EbQx~&(JcUqJFY6Dwz5;5OZ-_Cla!AJ<+#~7t>krpO5G$v@H@N$v_xk>{y zQ9d~_RrhB44G_3Rht&E%kkCkC>0^HX{nnesLZj=3;MAkpc39t$bbhaz*|hkM1+ooz zw+;|F9CDWQZA+H!> zUQaW@qdtBwMyHpsds}4ugxd>kiYnxw4^@V>yY2y(qZjhC!CN!tO3`f zt_2?{{yd_h`EEQu^N1deSb7QLc51pSx%^FcS>s?u%eSSVAqkN(z?pOM#EsziuFEl# zr6I*@X)WEdM zx%Vi+<*jDNjKCZ~RK#n`!(CS}}=h$hvEy^<^hPg&#xR;*vL8a^FlUAZ8n$o(g0(W z8njTWK&k_o;do_s>Dd|j<8j^4iEDW>b7I6c6t9b!c)n)G(Psy7dpmVqdn+vui4h`n zDYuWXidIyIOy7Gz2qfsmAHRxUVm8>NUoUG9NXzzBlQbnflQn%4l#H*(>)3{(^)O_+V}^0gRj9@;UAO#Bb)YSCJj0WN}NxeNZ<376>hIzknjP+F)fBa#<$y1lrNT?!*i$8vd*huo%vaP0uARn zZ^TI4V%f;F+^PvEG+nYC5n%)^+%r1`5pD3&a0+D zk;vB##KWb)iw_UxIOY&7!#-yLz{?0m;8B13z2SY|zMErYw|iXZR$Q<}lZJ(NXYwnd zaVbBX0m-59V)guG{gYmu%QHrkCh#W{@#g(qo#a~QFE@=>OgVO0eNv&h2_LjoTu@wz z0X;6znH{fM)9E%zbWaU)oDQsOxglZ^WDiW=krOtFVxWVF((C>0D=%?>>gXgtL3VZi z__4kjc?{CvR$!^(5yBwmWs7lO4MJ=yt=?vEeEweUlneHR|4c7@M9~1lme4|NBE4&C7 z?LiE<%Y+=nq)~YTm< zM*+(%2Cw+jhd;RVEKJS^bU+nSx)|Puhbde;zSJkjt zJt3QzGSBtrZF4=bGf7XR#B#|8k}BPld(x;|Uq_lS?b|$q*vqRz9h85q=i$0PuL77T zI$rzB2zkG_Mt$Xr(VDd(iiKPDEre@TP@9!w})n>NJQwU)(41;}RO<8!*C9~qZN z@16m`xa{5u@4rlWm8=z+XotfQZnk`O>HCz%p}+ha+>N$W^NqS01Qib?fILq6b%Sx`v6U8w&b93jj73R?`obFLw}4ikjSs>vYvr~Mhj&ki2&RY&1M6My6rf)~ zj_OVj3mwkn2sh$VS=~u~21J>#Yw!Ecq9pqu?)VI+Y}Ey|{U!=OQt#8uH=oXK`P?dO zG4`%pj5^M((-X|bZh$QX%(T35f4lbf2k}Yqg+w1+!PGaLS+VeT(NE8l5|5;E%|fcX z?0@~#PCFF(3vEYqJ^iImi4On}A0ZJN&AdhN2u!j5j6x_Zfub1pRaD{DD`a*-c-=_W zm6{{`=}6d6@2@{ZCr07*-g?#4+*ka!<#T=CE8FbPnlQI3C`do59*vatvphOJuY(Lr z-{v|#0i7h&hcx;7Pv-^nTwUfZzO$&w<(ha9;}Bu=E*^$Mp9Al`_?tJ0?Q(TxGhOO} zKi_L~Q8Mv_lhhDeT6m;g9}Ab(Dzx{P9c`^A^A^Bs2qpKWQ|HWEoNqsFZ#lp@ zRelaLkj>&ezq2*Fjsw2~ImeuMiv1qiTc(hK;G|l4K^KQTZ@N3?u#!Bke?--X6(GU` zIE&J^ABz*q<@PDP{%z$dEiq5jb0oo>p&hiGWy8Payj*;y<)jZ~ zmdibqeg(Wo*wz#6MB!*1YBTksEn0<8-Nr zvH36J%?Fc`kL{P&|3(&^87(g}mHEs*)-U^`Bduk@z^?c>dk-{P)uUjcsW~X{n5N%neX1xVLpq*?0hb zcymdr^=~Lv(LW!~wpagw1Yr*V{n*}-3T~I0D}LOL79TnYtPQ_eeSye(Xp;JM635Zl zTJ25Jm@VPI`aW;R?)=In^MjGs+|n6uMMqloSeMBKiAaSR*&Y4zwgoheHE1G!@~cYF zaQ1$^;MYMBI;8n_@6EORltS`RX|)Qbvg%2^0Fq1x#+tdV7XzVsvJL^^{HIMz8WXNrZQm_Q+&>}=G1qVPW`l%u2i+?isGI-H4nRq~ zdl7Vh$E+Olc%ZkR=%V_of1xBQXMjiIA0CJXbiN)PMur8Pq)y-Y8OG=m$8NPhyu0_F z4fpf-R*KPP#pBjNcC8HyU#$e9yb-1sg81IqbwH;H0EO7K-uI)qSv^RR5-O7cvEpDy z%i~uoperjs^i;zQb=hN|o!^n(C)^0f*=^7fL=w|QKVq|5XBw|~$DzAi=%L@3SFr>O%^(U(=i3 z1~kvO3-m%@JhR7>d$W9d5Vp5AIaAnm@)MIEB=+>-mxt-1g<9_?QwF787Ph;O@_A( zH?ZI;23|j!9>m2ejMvAC?lM3QaZ$azn9>IF_I5_MCA^=kv|BN~1HUw`?M3(R^_2|B zwh3eDhj@efmvkAj`wQ@ibH)?5?%1SJgNR`Ck)pKFA`2MuJohA$0Oi=i`vAeif z2*-($CTIInBS9d#&WZ$KtzviDJ^4B=)z$@iCZPUj$gS&;@Z+lB zv(7d~obx?=cA63Zk$830r zgBlNVJi_1!A^%y+_BH`{{X1PM@HMy&6e6>bLYIhff*TI=Zn=es87JsNyDo{&vUpfX*NZ zNICDDww1qXL(;cWM!Sqilc+YWALe_*g7WnRZ;mroB_1!K#$zM&SyIaMoJe1sN9)>I z7wkBOmCaHq50cOt%IC%?J>6SCv{J8=ghf#pfF19bsXzLr-~b@SEGs0pl1$qNSf-Z! zPf$HIush|w6|`+BuJT@z%f2W2N+(fQ1k9Q18}cA{-5KBs$R8D8kWh9up=Y~9OTP8j zOsNO;EnOeHSp6$0?T`3u_ijszB)DBH^cGW;iHoqHLOYpttU?pXW1*r>2LQXDOU3ry zXkA~dG2MHOJ|qI+L9^(Rxd^)f2?!+!R)*@}xakb`Kc6>C1tRS*k}_}|qo!rfDLeeQ zW=OKFYEknqOtBoVwl%xnmfM(v(uhG&YdBi}g>{13iT?Z63Jq$J<%8)&RK$=+zdx}w zu>9lq5_$`ri51xgnw38#U)nw`r*>$6B&YnL69+_JK6twNQ`@QFCD}H08-Y0)CbV|F zEZiU{vsR+2jSdye)-UvR+o|toEpYDii8zujZJqd8oO-gD&+$)*DXc9s6q^dWLJB5y z2i%_ZBfoZ=O}fW}HwOy!vYkoP0KR?E!`p1Ym@Tw~C-C#@j@a(%LdS(Qg)Y5;e|pmG zqUd|MX!E3G$JM~#{rNd~SV-U>1)pv=)GhiLp*IJ*K|qDay6Re$wga{|nKnkS0(}Pd zO|`PJ&GzJu2F!Vh>yqN;-n_i(9M8}4E~36j(<(d68nJ*%id7 z2+H*n?0B21{fk7n^^d5nFHh^2pOmY14P)@?Z-7rrUso3`Ny|RTrzoy_(FX~KJ#uM# z_jK%fUYG#D1ih^(XnS+5#%AZNc%Gmjx~5UUzMcfI@==80=|h$0JTzcC#l7uvsw@%$ zEmNxT>)bRE!-`*K7P$-6(7fAehg;|&upQ7Ny>)sdmdOKd(i(?|Mi{Ae#_T#HO@8rSk%@+lo!L6t!wy2P=PS@QX*N`iDzkj`H zRM8?`<1H7;}so*lQ_a|DL`e4RrkR{SH1A8a|cK$g>`ThZmzeR2dbxAvncVBc%CVcYI<99Qm zAd7rgyR{(A=W?RWV%TRvwF0Rx6gv#YoUz|4={x)DmiW5uT>oLTiwXtta^B#!Mmrb;dqq?z>FE`P>#DVBcs52F79GkiL7umHRD%CNW& z*`1!tj_m=ws;^&z!AM$LM^b}jB)*T&&e_S-9~vV(>GX*0h(fJiPc5c?&5#%c+YP%7 z7J_5b2a&PDuk(5R_LnAFXgual=2}Zzzrfe(WKJ;j-dgu>*>kVTU{}e6fabS8*-Ly2 zQdh6rwo+SijVF5(($5aHSpT(M0=>Inl448%3e7+$_vwAUf*2s+Es$-(1P5Df$qaI> zstcGK>DKxQimNbr>uvSvhBPP? zXDXnH7iVcCX>+twWIIDnnXfENu7xb=gT3Qist*Dyk8f?)%wmgm8GM5*;@0>EepDAPhE9=$tLYby&vX9%Jt+ql^9LLzWr!TLAk#o8X^R2aQt7^O^sA5+kK=pz$ znPSL%R;7dWtIa!G$xcfTWVhct+^jaic7#*g65rOk7-2uMzLzK_Bg?wil=DAnf+vFF zt^n_RgRxNI8v21aPgFvq^)`{ZSP$cmzCQ85Ubdr$I`^Lm(?-W(JHO`s#(k!05*ke* zqDwF@(lNgfMr}E6&6Wq&v*zYAtgaxJ+E&u?&1){kyf=EdQ~ubZgb|Bs&HGh(c?*E2 zp9)q}q4ROU#ocm!B^}EM$k3}IRiq8w+3}2gSv;7VtV{dwRqXrIMJ9p#8?4^v7 zWIyF?cVudul0PT(q3Bh@QW803q3x*&p(o^en!dL|?@-?EGB4hC`Zyn(`|mfxZvIeh zYd&$eO{a$(UYzhrA2q=d6gLwsW_2Nhv7IQ_c~7>(lp_B#n%FR^uLSSO2e=6`sYq5y zF=FJ2;sK?^#mU>?AJ|tck|#gb-|F*pe>xBDA8@zm!;O0p>zr0iExO#wq%luj>NJbJ z&e1;Ib_ zj(i&SQ<*UD_1aLlXmWVckCi6|a>o7K%7TX5Kpmvnns=9>POC&q9ts zHU4IO#>9lJ-5)r3F6K>ou{UpLIg(WY*2a&051FF+IBD*Fk9V(-;FqWs_!%OzQTwva z>5sj}QWZ{{Il*XI5WQATL}g%|y;{}?QrtSx(`t-~yKyH)1R^%i0gB8V>$M#XfY@c# z5*c-2;^q#|Hp>ViipK=_Vzkx&W#F%e60ayw3l>3b6A-^uRDAfKKP9R2XUHb21OTXlXOhH!!(($|VRMF(cSYl%NiGjJOd0~SCa zG*m=Hlq&?#DrvsfE6@$($m8sc>PdGW&(B6KO)yjB4?ID~5882hP6#&nnC7l=zE=Ue z!Z3@~nSX?V6>jkFO276)H^w$M5xAjS8~?Fm6%F*xGrr2mT8~b*B&OL&sPVqAucu6Y zMvv$i&q?#=Z$9uP_cFTiQp{`<(2Y5_`*X-?To&cggUE5q^Y)BH;r*y0C}m|AIx?n4 zc17n8vHQC^Y29Xf@JH!nE!S5qMI{+j#km20b8^2Tl2|@IA;edso%8o&UUuD4t;djJ zyf0cPo^^~`+XxE=$lYSUf>{aaYvjI{QHOE7lYNI;VY775sp=69*MhVGnT(Z_vVh;} z`|33{z-8@m7H+jJxE5GfETd-iz^z4_`%Yn>UvO*2za8T`1BiT+v`?2atn|4kR$9tM z*=`uheoRjW07)&GyU?Nj-ki*xaDUTU5%@)ayMhQ=VVR}u(kwuBO1l6prCL-xL^SWU zCS26-p7o97$Lm#U8Bxs82qPubD-nY+s)L;xqkS)bkeg>=MDN_#JSUprUWn9nlr!f@ zK3U#!XPt9>XP)o41$Q@D4Y6}(%STysFCa}tDe_iGh_BMRtsnn8GoHUo48Wr!=A1T4 zX*Jq!t0Sghy9-RO!WFIUZ(o(wnI#+!1-9lxw}G zBvFj z+v<)-ZbW3ZJ$k!d1B>~X1Iw8KU_aD_Z};)qc=`lQ$CWV;%(rnTK>P^KHT$9((i98j zHYo|>cpnk#O7s*X`|u`rU86jQBvMq0MrsD%=cTFmDXnh;_p|fqaAvo_kM@62f~%yP zXY^{Xz2BL^SqliDnqn0d{`4+SqG(BbQyrMIp75mp^Sjkk*V%TAEy)talMqXtRy%#& zsdK3@l{&5mC1NONJ|RK?6DF9K;@k6%JFlb`L$GF_La0xF<@x$-M}7vFuiVFz{7p_j zKEdf6MK|=V;ywjU>cGl{L~s{D0sO)7aJjW>I4^JcY@yJJd4;BCLZsAeEG7~P{R+Q< z5P5e@n!!Rv1lV2|uQ|HK(oTx4*X4_~mU3;P-C2%CImw+x&s#j}%Ox6@6hvw@22g$NjVqKCC4FVy2IMJB56t zZ;dE6nK)38iG_aW=ObVdd-*FP5&_R{D<3$7rQWd(nahr*aqb1SKUZv3&N|(0%v*z) z<%|b9#-88q1qYg3f6}o%@|kW)bbe!Z{hDN3mN3s4di#X^hw`3T>#MH&rP$y@y71=# zC3AVLnmruPA(&+1ou0p4~lNR#s&`7ScVrcNq@&gf>yGQ$FCB@X#C{Olj&bK7l1$ zWCllmQ}=fRAkE(pLG-sv;`mTQA@!wWdN%Dw55}IOL+@C6qt)*cPItvJYsoLjuR++< z9m2J0IjX}#uZ)g=J}O<+Pib>hE6E$~%hzo9so7v6^5a=HI!E>&%)dgt28jMwE`$k>kod_jwgkX;h*$))Z{<=Sw{Rj1O6L1{*4@8==UH=r#`AP&L0O~+^m%jdVjpwx3Y(Z zo`!82;PRwhYQphC=<8x4U<_~_d|}%#8QVFS*m!<)a50Q)ngj(WSh(j~G{ZW`jTp_A zN?DlwZ*Fh*25+DT0cPW_SEBrXolD8RwXvB#cE#g~|1Pg9pCAI4H8pv3|3zPkg`j@2 zj}H88eL1!R8RL{SR_o)5sO7wXt+V?pS_gjG_MRjq_}w3LIaJ!MmG53xK5;LVHt9rh z<|lz(48w)X$kXjXnLviJLKo9E31-fuDc(6zT<$^8Q!BEIYG*X|ncBHR?VYgVk5s zQhqy_<`13+aSB|gP$gVxihG=fuM8eDRN512`fHa0hKNeXL+6w7>OUJg>=azQ)YGRls4(=4CK3^hMi8WhJ}v1-*;PfY6MpC=tt+y11Ty`1+AB-q>E?LTog9PgJ+9o^XvZqd)Dd3&o+*xLvAb+)Ur?^B!< zc3j94oq}YV1F5_KzN+*SGdI0qLK=uh=xO!kt-aK{*CUN=dsLP5;#{?zK!t3H^kTjz z+NH{U;lVFjfvS~}??n{2+L+Z7dYE$j*&}ijNXHiG-G+=|2`@t&m|j2pPf1j?GCS5P z6|JRm{V08%4evy*{U02`pA;7Nen_OqXU5`2Ue0yWFAod)V2J+P_eQdNY&0L3)^C?^ zc;bhCrnojZ&tn%&S0uP_Jh;a8~D-`)+_Q-1W3&*3$Bio5Ej4l zhDGH4Mha^)z&`X_0{cRM7F!)Mxg*8C!e?RFmp@M^7EC%1(DYPn(e zRu0oyzM0);MhFI~c7f&SGewcP(_%G4Cb5X(o@xhZP2K0NwXqCqf^<4$8-B{dUbBKH z{psm8t2-qnb1}Od1TK$lVauIrGWX1u7B?;cX$NwBfGeLZO1r5&xtPvfoLG#L(Jzx{ zTJ$9Q0Qj-^Le8~7zh2~%JQU{BIEsi=Y{ajuzM3JrcOvwt5OV?*Ewpn>sAF zE&IPk;R$%OIyww?O;0DsyG#JqS7PV&IA|`Tg6SzB&E6Mk5`pXAt6(j$;ueURiqHV~ zj!zZziVH;ds!!u>ZxfW>OI8K466S)_cL4h#PR8Xmd{YHWEk@3dT= zZl}G-(q@|mG|`nbyoRfKZyDZ7Rn9i>N7y_;%Rm3Q3+VpG$GDIcwpGy|@m1FkBOJjU z!KWV#T@vC=e05`b>i4$G#Jn}|JM7oDDY|dIg2TLR3*p4LjSgbkWateEy_rth2(F=x z=ZK;Q6?9Q+2BphQnB!ijBef$2&I4@pMIf9R4_Ur=bBTse)AF9iX84M~v_mg4BWNKFSy_BqW+pmsyb$F#cH`GCz2fH$2kY_w zEx+|WR-q4Sj_dNPV}PcR@}KDHN)xAtw#!x?Ja_k#qkXEhQrFSAEKJ$57c$?e=9!#b z!HVLi5+KVB{XTv?B`y2)w!liT1GIYH@MzKovrF#Wwktegq+)DjO0BZ{PwS~Hpg^JK zkF>d+)|nX@Ey)w#D-z#&;+}(Y9dlEbtng1{LAETa%Hbg04xemoGnImRfu*ZkN>#sYgjkfpMLB2l|}Vm-JF}r+3bLR{Mp>HpJ(+G z*7NLdiG1@hA6*b_;a~03g!DU0stD=|;L+f6TZpr9*4#B#Agw!p{((>g(H1m$Ko^9V zk79WC713H?Sf#MD==)P&UCaX`FcJLm5mOwz?_Cb&e5_sJZef4lZlbIL*xZ)ZnH4|b z1}qAVKVU{FPF2+UFdJDfyT^%+HGeoG=Q8>@afIQ0Q9n57t5MKy)%MW70%lC%1k&;V zeW5DA$1TVa72nqhu50C)%Fqbhx_tkw9>Y}4oaCH%$dC5Busb=RXvaoqNAi8D3#{sh z`)5Y$Z3n3x_OYB&?B$DQyGyaKl-JY5jl@!zv#6TNL|EvZ z5^~)iGJW888l*$7aBaQ2B!PCi zJl(*Q7pSBr>!JH|^3RsvrQle#Ah~}V-5%$|I?enIybjW4(P?pUcM;vPbMKtvmk9TagXtr11)1@ z+&h;_BHSgJjsJc@bSc_Yc_Vinz_pmKEg8rZ=Nu7u)_;^66tIiY#uWJ7Z6Sc5xA1n&qANTkR3)vsV^b zJJnNG7|Zw1wceWF>;F>Eqb2w!HcuT{Nw)bU-vWDUdgeehue$r;Z6SNhpFp7`NVhP0RFTkSqRQ&DTKs`js1KsayS;|HOX$fC}W7^(d*G%e@QCH4vAG|sQ4Q( zf_fa&?ZM!{Q0<^+@))!wQ`hwdZ{Vl{MV0a5Zxr=MbVqZhpMccZrE zcWs85sJu1N=E0fH2zQWi&b*j8OCDbxv7^8n>4mfMF9!R+6QHHnSE+Y-*8qWR9&gP? zuU)%9Z?;xjh$Vbbb}QMVpn|fV{SMl?7Kd7KZQ0;{V-=ajqOAUl4SM}9jAy&ZXI6=) z7NcaDIQQ}v?_iM#%ETAqg^o(!v%@}0C)!%fvBi)kG3RK~mpA*Ukd1CG`0v(izRWE# z>}$OsT*75nKX zmT-Qsn(!Jvz>A_Ns7MM5VHgcpBmK$lMYi#~I-~g+7)B61InSv=ap`Kxn)dqM{~QX( zfZDrMviJ4l9x}?Ns7qLqu^l}%;^j-jG4=Kp`bobT` zNX`DCFHFvP%SkBO0v%M?<+3$CbG*|wSiiMREjqk4R&|HqP&yNCo+Y(?%`Q<4EJ~;l?H^rq3d>1(C{mA_go9I9u8jXp$rYuH^4HLwO$XpGQFzA%S z@_2)Ex@Zi*PB&zlvl(a-_MiaPCI7nU-DAESUFMRhPxd^aOBf(+Ka38Y!Kv`V0>NFM zbFH@tc1SO=%v0$OnTK_>Cvdy6LeG~%WtB9DJ0YmQkv>oAzZyt?Y^$dP8Y^gx)5PHu zXgwuJ{tzYFVdC`P!YZ(YJ2Oz@gb~1#n*Z#a{YQcWci~{i8Go5?{>$WHvMHDLy9)rG z@dMMZmosOsx{&WPaDg~60aU=|*?uxJ;_o25N(OR;(^RcrQ+_-D&E7au){~vz-x(W= zg8A^Fd$(<;YO~Pan*;YJv=4d5{Sn<)L+fT=t7W_TxaD@6{x0aQtR0OZ{Tp6!9A!#4 zxnv%o(!B^ql&@|)lu&|(^oGE$${r)%F5%I-e9QBT(4JdrQ9QL7Pu`j-^;I1pw}7rO zYmhIZTT_U<8EiY6>5|{|uvfmB)j>XW0yea>U1%|>Tes|gHK>?H`5+Pf$NQqv*>AQH z<_7)1+;}DL5&B)0%~V55m1e~^6g z)s^a#Hl$5!@hj6s1!*MuwYiaG-Xo_)f0Mrvd>;rxLH+-~(a8ToByVvLiQ4a3T@D;1 zLXP8)5dKe6?SF8|e`X^jxbKHJMGa0(gEOqDpvpEfr^zeqY%Wt?eRAd?tR2Oxt88pH zYYD9~-y0m8go^pFp$X;&e?Bc5G2txW?7>n}@}0j$$s|NfpkXcb^<}HBTUDuEjo%<6 zv%VZk4!%~F{t_P+_2|vq*r*tt7eApeZNx~_dds;@OYedgzOdITl9sM_JzS)vmnTVg z`=9R>$f<9MOea*nai za{mai6!RE*(wLAI1x@Wp zcrATp-2|B^_L?smL7fo}*A_HVC7gbkbV4V_zwQUVUjA(udpq&7{v&9R3g2}h^Ua(QzB2AT7T~B=I~z4C&!4;^xdZNU zz&~#Yrlp~?P^k!U^ zEvG8$w!VM%$L$6-6Zw81&1KSCMVHBT#g+sSawn8$=VD%l-i2ZHd zv2yd62rJOSPq7PqRWtkNCZRj;JTTZ3N%Zz#Z}H9f<0O*w6?cFSAml^PZGoHp;R0ua zbHfv{tbw6eb+xUMoJyPgafoPXdDF&Yw{4hHjw~=nSgu72c!-+hGBU-^4`{~nLYqzY zK7{Jsm|IGMtVe4XrofO{O~~E+h?$WuP^JK{MiUZu7pAgoqyzXY5DX&v?1GSD4mFnLj+C)_$T) zUgZaLh-5&zlVR$v)_w!|*>s;64-ZxMk0ZpinlKuRT_M7o#a!-fxW;u1^~_h|A4^uW z3))_gv(SpUzS&F8|L50oIW>RITwDg0O{;(hJH$!L6~mi=qndlkFiCH4J^Odh9Qg5x z@X52~s4IVIcqW=Fqf=uTiMfM~>-jBGQ>8nH;bQ9e^qutK2iaaK?}A|KeCj6jRw-7w z!_{&rt_ue=@71db-uid&N!ph1B8209w(XTXAH-bxt>C;WPmRxzAu$JF`*m_>32(QP z>R7w__Mr-S+Nj(G@ghn1p4()QV-T$}!LK0+h8lNrKx|C*n&$13<}m+`v-yc1p&Z}w zwekN$%&4OVoD{oFozF9G6Go~8J^)A@tFGK!&I%^C2<`5Wr^UGWcRR9=cU9%$V>M47 zrkT0vw`bEc|FHD)SH)-HorXS=@VbuM(N(W_3(e^CT_;KCjR<31S+nh9m&{XRo1%Ur zAi9F$hZUz;{FF>Wr$?=A5MiCWvx>{69Rds{u;AV}iQTXC4A*Hq6kP<`U4#b1UQeyR z6OH}|qY6yCO8%k!h#FpPwaIk5MM=+IU^L0s09aeE4JT4@u{sa(GM9;+aIxM;ntXeq zQf6g91NRaZ+ICtlvsAFzVb5L54oD@-as`EZr4N63%;M;<;BKZ~;ia_=n_bn|4OJ79 z^qy2yeoE*||L(ux23YZXUAe9T8Vt* z$p!L`xce}@Fok!;^8n3<^Ec^}^;3K{JOg?s*8;u#(1MJtvaho1M#LiXhIjdt+CwtS zT;~cH&l$gCP`jZuZ~BQ`FGQN%9h+9Z29^*0o@z=qEP4HvG(nc!?V7|*cXE&yx;><{ zX>Wm@;FEO^1BP}<(?bbl29S#ld-dr{odOZMlc8=S1nwDf5 zXP_uc{}d+%%^k+SHaF*bZ^3!j@M<+|FbPDWaCg4|acU^nhDm3nJ&2kq1c^EH0@brm zEwK-y6hr+bLWHRp^gBy8@NxGggZb}>+o&|Vg+gf{b@LT0y!C#s%hef8KAVzQ2xe$K z*yE2ymfA11UteRzumm1eUv;y-E-h(hT?K6DO_8-;UGBy*LKSS4111;64&?kZd=LDm z*|vq2(?(5W)I57O5=mykD+!AtpQ~ zxpG!p!xKNj0%6ljLF3f10mj@9h=Tjdr=BG8KZnXB!^>XSBV}#z>4)yP z^ytu+pk2F`3D<@6m|W`D7HXCEi&pS355Vyx0plGGcHLhj{&Od9pXaWpd*0E5Ig1!g zEIs`LXuU$z%hngY!qtV^OiwPGW4oJoUJS8PQ{1BKm@zT12T8NsgjoX0CLr3j=B9_) z6cih;XZLoHnOB&g<1u8{8xIy#WCLb_pCFwkypA750wBpRnDSinqKhHz1AVsm`> zb28_j>RD2Uoj+(zI0?j0l$#%rzVCSQEG4zf9AyT~1)5zl51If8tM^Ia%{xtOI zS|_>ea%`99`txp1u@>1cv9SP8$&)XinBm<`YkU zsD+0J;v-eo^RtWH6m}nn5yxnYT`}_{EUqPqB4(x1W1Jt>$!cYk%0EjI+=|?4@NMg! z7g!hDf4I={uB+R1#;mS7lh81PnXH{N&0R5axIBpa9`m-(5Qua7^w8G}y;bL9s++jVSd|K$(yGZfhg)2IDq{F7ddXdO%~R}q@A(68*!F>Gz^GkF zcEvP|eWd7Z9lv2Hf=n~ACJx3c14CwBA*)xyE=h_u82t?BMQ zR4jbi@Gsf^;ggfD1OC9iZMEukmNk_P_N0A$XhRj|esk{%%Z33_?$zyr#}ip@K|o!V zbHFoO<@TYe+PAMyne;^RZ9meVVarvPadT~lj5c-Q8TNxqzo}!)C)egZb>rKYvfY%? zJ@ks(xSX2X?!(q|u|fB>gw4SA`hTFBlMAxY?VfyVTle;_{w;j-w=K3@vwQvIh;0S$ z;c?p~N4C3Ml<;V<+xzgT+@*EZuo6aK`KK|<*7Hklh^H5Yfqa3QJai|O1vY2pTQ>@b zYSyvrMcA6ZvCpUbz=9nW>aOY zo8obEE;%W%iIUAR^roxO_ASBMED>+*x-jrBFGVtQWnK>44-AbY950NMukq?N*wk^a zZ^C~NG4w?pTyBKO93E*dd!e)zj><$-{Mn@G*DtfO*%Y5T2wC=XQp;>I?MkF6E5=Nh z(U?L?N4Yh|WyVelIHS%Clj>z@n7O&Nr1XtMtlakE+>@5hUS_Q>(-vDG7l#KlxIibr z3)Ek0n)$pb(0BZU8O8grM)WqiUxC;d$ThRa+vn%@Qe%HE7tQ(NWO?+hvR8LUjp0)q zAu`rZ{t|cMe%FusukzCf^l%z{b};DAB$>k%RJ_r>)vAffZom$cN72)B5qj;|;@-E( zD422jHy}$)?_X*dfPOk>S4Xg=?BKQI?!20j<-x;Xq2H_iPz)>ZIRJ$2P0_;FnQ-|K z25EcbUFOqZg<5;!CR_aKlxQ$XVA05uFX*1yWrTF|cM+4hgcEdEPvz@Y^-ArkST8;% zv!b_KXDLa*1o}=tU1BsV*ClJH|Bz>%?@}_8!XyIv4v-;KFX zxyn-I0ktn&85Am7HJ;!L`smSlX0X(9oBFqSIZv_(fV}s{1I0OZ;0h`)Yw8LdZs_&7 zczmy+W%-etS5nuRAhC6r|IVb>uKV`9lkL!eJnin%jz@lQdWAV-N#>i}`{U8!e)K{T zXxo$Gb3@19t!|Qm#F`Tz^}wI1{8rXrKQA7iwq}(i^~EsebH{^MOm3TAu~}viD1sg> zWU;NQsby0U(0=HR0U-}@GMfLJxqA=y>jPYE$?I-tQh^LI(loQjmgnhe^ttms#*H#} zkR4(t1}Ucm%cRr)dWo#r7`sMH8O`qSolyZI*d`7Q{gdXVVxz*w(xjM8@YmDuiIAb$5i~pOU3TiBtSTBzcRLo!QCnRlFsEJ4IeXyke<+ zfcV0%6pU3V7al=JRp-zS@Hd$z^69P@*-K87KcyUZPp&^q1qAqz=gemW+ixXMB1Tza zuPzCu^;;KhuxqP-53>^}S#ac$CrMu!vX!M=sTisVPUd9NX5osp1R5Awh6BwR^eM!*p37HpOv%KaBq?eHmBQ= zZSv=dl_n3?1bxGU>`=hRf%;&in*w1jpO`6gl-j)8DdpLUD zjqB%o@{NaNrvzKZ%~utg0RI;Wy+b=BA?ia=<;CayKaQC1i-r71j0Z=sz4pzz-Z-A)t`_-h;QRV*QLyjW&$tt0e!4`B|km$tk?eORlBl<@IY@mXtpfY)cIy5 zHl|Z~ds6UDu-6;=IDpJva7jL{qch@_30KMJUJ0M^4p3mP`iO4L-^+ris$NB_gg+^2 zi$&&UG==0;#!b8Yga7Qthpe9cfTe-w65g8&VrVMWzYTYTZ8GqJP+818LQ%u|fZyFHlwW$Ypb+(a@zNeS#frE@iS4D1yw{v8v z2gF5g6OZ(2kxWUgF}@;q6>4kk0lXhcAb5bQTdUH0Pu2Vu)8BTkA6KjP_JVF{H)fYhttb^=90{2 zc8eN3(%JWW=Sdm4b8Lam8~yXMh5qSqNvHm19u;PjyXU5~=49=GSOr57kgWmc`u1xY z`zpER&MkW-Xsz6{7glNtZ?72@6Bma)29(`sPe?Yh)2{&JX+F#@-XvJtToDT`h1{8Azc*4e1nl2+7xfEGhP4KzkT;zp_emuAJ_|M?9+cX zkltJ_Tx;RwU6^eFW4!TU4(Ku#hyygu1zF#r=(q9cKJ@ie>_`HI3LkuRLigO=4vH}2 z8GK8VcRq_TP{7&?l;oht%1R3Ms?r8czTBo>=RfkW{*kY<4Lav13hxj%BX&P_y`nTf`S^dCSg8dQ&Y_}jY63Qi$+KLYC7=bpVSMGOxSuYvRt9t{Z$S*KmISjMdk0@I8_mtHUAMF zg~gWB%)1+k9|>Dek!v_qHP{>>jwmcZk&iD!C)2aj((WY*M7$?W{dJ2~?SF@YB@aQD zJc{(lkyryo@X%g|anRj?P%o$nz4cw8p~ z>>2I&<+DN_4~pzIOJ_sBq%02WIl2vko076J&D@Z|HBh%4L9U6R=p-utv@inKZamyk z9I}?A+de&OsZz${O+(_mWT)P4ZfPgkwU{k3#?g_ZaLUZy(-(?5JSJP+Y(R@cdAyO` zoH*Ncw16^HH{`5C%jYt%>7sXcV6`;&&h+BE(#o3|eUj=6XHn4)$@EkR0yjdaLbo2- zhHV$?xh6MPU#Gbe*r(Uo76*7(pPt#zF0`3X4}W?#I#g6ssb6Qj{5TtW3g6BXW6M*? z9>yQL%;K{hH|4^|n|GK29+jTpZ^H?UlD^*aTxk{?kk!S!+^LEss-*ilT~{ZL=n9KmIvQR^hg^Nd z(+J4m3E_%aA>qO1Q{rd(Z@S!nb`ZDl0o@gAPlaMXX#W!OS811jae)QN$}%UqK4;IC z*}pmME+ZQRADBttNP$39s$S$BzMig-h@SFO=g>Sm*c@DO`SQjNw_7RhC6>1<%pz}8 zK;+rsQJ>A_l1hJ9&&RAqu)5hW|iG>rxVjqRQor+$)e8U2o!Ll2kO==RRBiYEdh|uY9=l zd6XLYKYOSjq<~NP30z@EjF0gk2yX0k(X^XviAP6J8%-pe`5KhRYY(97A~Hg&x#SMHRqIOne@u0pUx+) zh)5}nkd&Dh3+vl$5mC~g!mrR*l7#Q?cGYv%mEH9thQ)~&cVG~Mi-em~{s-Grj3AAn z3Xd&^u(l)^^TpUXvzwmUOSa=)et&F2nqpm=Pe$5^UN9F>U0@A7?cbt*=2v1)Sdu?N znAp)>vdCOsIwaLEyl{_wXjiqX@aO1^A?zN(GiI1bs`|<;?o8&&9uWqNpeDb5@aWLo z$p<%A&RTUm;Wm>Y^&+#aq^0;n@e1w(TAm~Pw-IIj9d&J{K4rP`U5np75AfBUbw zc$7Q%o}L{wZ8q?sCFts=r+wPKnJp{X4DbJ(4L(F(9fE=r3ny=w$28U>HV^1jHE{MF zoNE&DJy*8MH;IMc6(k95U>;tF z(*@J}Ht&DoS=Q$4M{lD?xOP*J@MS<)wXNc`kT!oUZ}_PKWt|3lc5;8ud&a%pUKHwp z_a0~lLg&(&zBOsqNO;0$C1j^0|B~&FK@U8aSN~l4^SafNGtG0;XU>GVB;cGUf2HxS zkDoqWz-aCCJpLg{JJ|z3W_mX%m(Xu)szB-Rk_&1GYby`F1Skjvx&%{VS*Q>PnRjyc?21n=*show>zq zKm*KZbijhD_e$88(NCC?ifp-c7Ttun(q^%Xqk}8Rwb-+PP<-CtO8+9O2Lx1v`Q`~? z&+gS!F>e?SoDBC4_Ic|UrA|j%7K_(@so!*2Gn{^J%#(qqt4aDFBx3XAGBO+kAkR!2 z$38i0@_6}>^Seq@m`lK`stGc$6l`|+Z;p_p2yX3u?2IauQB4Y2&QS|btN{i!1u-sv zLgj{bFl!tboUU)=``9(cqp~0p{$DWfzA+$o7kaZl&4LdDD=mMyC3%qWZ zvjzZYKkpi`@_4~E=Gd3&u5Sjr6bMm^TcA_#Qw%X7huBR;b8sAFOMB>0D8p>>AK%9y zwYRifFcas+UquDGn2ZfEwy3pbU~EZ6rOuei_o}uqi}Anq&z8e>hB@PAP}N9s(V%4% zWYWLK`rH!w6Hsy0mFrws(B#I?IH#S@+Xzpv5jm5B>KM7Q#61sDd?a>EPvAIOCTGN8RV`=t{;ay~Fd1O&bbL(?8X>elkE(JS@IoW%OOwpW+(~xWVU;`fKw+He* zc*cz2jq8sUH7@Wvk@a1-EuG%xo8U_>&a7;4+bGkq-JRdIZp>EthgnPUo%J*gq*tM| zxw{#$M8&qR-B?i>WB&ilfnOk-k7ebN(l&j8hs`B=U3WO9vT+8X%;ftg_-d|}{|^P} z{$CWt0f&NobUB}4$5B40aS^&yI06V0&Pe3H>=}IAHxUNM55akiU>+dEXg6jam9PKV z(Md*0T>El+_A4ZLpeOkpQWCCp5TkA8kQPYe?Dy)2#;$4)Qb(}tXOtq2;o2iQ4da+x zFgvROxy(L*B5HoP*~QS@PERz~zyt1PgI1iK8j2`I4j=uUc$DS6@3ENKE;7HA%KEuL zOTtsftimyrFPw!_8CZE5uU}v}urEV=kNLA?fYm@yG&q|V?FD3!%BOtnz8VP=3CN}x z#09DTdFTb5*|Ms#_Lj`5;TATTL=$zDA%h34$(47}7wHvWZc4vCc_Urc0Cl*?amc71 z*$r3_M`FuD`|W$mPvwg_njSHa_JOP`=f;m|>8cExc3o{pcAR<#%a8wS(yGY+(Oqg& zez|zr@^S|a<6sO{J)Qxd=Z;3ZH2;_CWfIC6f}@<_T=K7l@HhyE<8#H;&B=L_xzEnW zM}xC-{ZKu{pw-}|rkjhIRt9tGw!=2GIcvOm)S_7I!9}|7gV-zPmd1vven*~``qa;U zdz2&{Z!%~7Im+z>bxMYN6jjACR*z?a4d>q4*1EN*S-5{~tQ5WTvQv0}@gb{Uzf8x#Ej3u`QWf+gyaM_m`2r312%-86{@(3OFEJ z7ONaPVajVvgKB?D8KUKcVJ^H#Ha9)Gm$(Lgk-Zq{eBmKF`}jI5w}?{Uxj}OJGqrBw zw>bX{9Ir|!>g@e+iqMyfzGJQ*s0Ou%D&f-y2VYKvO78IRegUEcLO4S@?()_;cg>lf zcX~=ctg@K{d84$hl%M)BRqcU7TOTX5gSF}A0TnSq>9NPpt{s5!@kL{c zlk;|SazhypL>J66AGv))Ap83i^}(KID>hk5TAw~EOuEG`kAqYljobv;w z@0WI4W@h4eb)6v3Kln1p9y89~G>d%i9ln?j2sQ)sH+2!Ep%w`t!Y|i#4-}<>Iq+WQ z1gQ}OXOb-8`Vl?F=oR;J2Be3qGU_IykE+8#)a*;{a>)vg0U^{w)B46Eoc}JC5+L*5 z$pE>~yKVr-VD{|Mn%}{0ljvP4;cYS+K>Sv8uD;>r%_OkJV{BvKf-qKgzQ->k_{X%y zX70+$oH+X{YoQ#+VzacFu%Z;DeeWs$H?ba~uihcEGPd=AUw?xf%;#?rY?Ud6y>7mSP4cW0WmbcDWukO47 z#^ta;=7IZI1J1H4#($BPxQPyoa*(1*qO8Wq87iapS%w+A9E`-TkN%Jy+F|d~i>FAl z9tlzz+GF!slxXJO!OyroR0Zjvxq+MC8tQy1r(3dnT!gXSQ_GI>Dqc_savPGnObyuD zHos|fpVWuo@F7hCRr7cP!ZMvq}_@6+^VF)+l7*?+q`C@l3+EB4<)W@@*Oavf%@F3BvbZSG6K zpL!yy8!_p(rv*tz8wnjvM}GGh@i3R50g+T1g!zxT6Bil*aHXEJH$NMpX0F(8vJ)Wo zW~j5-$~`lDTStxOteEAay4E8js0S5X5wS3L8Pa;Z1JA==Zd4$*cFL6MLN~+!&^afY z)BWgm$NAIABZmIl#0v-Dl5@;<^iww6sBbPqS=Dy18eWO z7=3~r9W;fI^G-VmJfe56&&o96Luexu73h9Ha^>cyaQS;jD6esB@7@B4Xwmw{?xczx zE(trWYpl13$?%881Q|a$ufb{z7?)B0J1aEe@s13(&Fd2k^Y47{#f9RqZrejBrcPgb z0aE+b&=_Zn9)XB+7xDrbjb|oxEv}O%kNM%!j)xreh)?jcH*t(;D zq&Rd}X!y-y9qL0C zPq0@T!pP$%*b~)w-@wg;=}qbfW+&+OxDa=^Uhtfq-M3axyQrSsTLimRX6ax4`CXxs zE-PLWJLq++s<-QjICtu2n4aM4$wq4<{i6q*RPF0feU+eqmpnQI=L&^&dCet0kg@Ku*v1CI>Ez%yR z8vA+Uzf1TWt~iG32hve-lfZX6&{H;q4NDrO1F%0qB`hk&{lDOmTqol%>>QnkEo&N` zL&sk!CJW7mB0l$y`Tc8@gq|{?Zte6uoavq___l(_5cY~{)MGFxiTzfRFZ_1dL}N+w z7~}J#|M!_W!EsQtrUo^*T}j1zPsEOy^;^cuw=NeSe_xg1MQ^2>N4ZpBp^(u0 zGI%cV_tUn!BWJDC^03AJlf5JDi(y2rzlWXPvWM}}Rd;SX@=4GCA^M5Ca{jTQ@)S+8G{bkr`Pk^Mw3dpib?=D^1bk8v7S2QMSx_{I{s*f*lkawH z=MRl6oFKJEXR+rE2S&)Tn6z(o?%JPSWXttTh9-=@0`(usIRrk&)L!)LRDX&ETO z@{gOTsHB?+5E+i)RWK_dtFd2hS; zm(e_Dr{8{fF@=Q4DQFJ6jG=K&*+wMCTBPFI&=3EQjRbiAqWS21Mp82WnVT*#v>jQu zxA)3U|K;;pUy7BaY?+QrXwO}0VOe&>`83A(HtA@vKR;<(_{7IK=G|wa=#UHcfN^X5qYWeo zci!^Y>Y0IN${d(~4y33Vf;Y==v{B7g5N8NA3d~KBK7?4b$YyWZl-B--5zT6ic#791 z-2T3H>1HPZBdIToUV$zP2|YK~3r)8PWuc*B33|V2S~AjQjKrU7RUZebE2m_ zIDJf+*Xp8Heyv<7DKFWYr7{hqB$}Rr_MJYBk^1|Cch;Zs^r=jxSFJ6#bj_mlNcj27 zSpavf9z|zhk_Z2rvB32ltTGJdn5lbE9mmjDHXe|9aaF?#lT$fseBqhzWXSDOhVQc( zTvzsJwsM^OQ(oG`O#0&9Yd*&1tW$*X#2aUuNvM@HmN2QP(RG@5^=i+lYBb!VXNmMK`zPN67vh# zBk*6l?zn5+8||I-Z{iZhgJ-VoEdKckc7a_7M_%a>0wIqRySFxW^VlBvB!o7h&0!xx zy%ua019*umr#7}m0~dj(O|qhF^84PacYPN0zR;75JDDCO9x#RD+%@a*dG|0$L;veO z!S4(N#1w1QN3|^PuO|`?S}4sV+AEbOS5F0~Wa*)b?B1uc4a4VB){h?Wh^{{|N);6| z?jkMz+D}yQ$g4oNHQmm&&Rhf=>#@$eRraSgEMFz&&5!N09@b>qp?V7E^5MS7c3E5| z(|4Jn!?69bhcUBzp5dE86?nWgp3ZvsxfEFGF=$u4{uC%e`p!#6$(FCe*?5kE}e&j;Jx+=0_>e;Utc zI@cTN2yL#YUYHienNk}9z_fqzso_Int%qw1x$tQ2Yqw9)70(V*`7PVnN#E|eqiUY~ z5x4aYDmdyho9Da!Xs%RBZuR(=Kv=IEuK$?F+5hAPQ{>rc@$eV)H=#TVO~2fQIh0O*n4Zh^kTg4sM|A7!tYUXXHjy=n6;csM0unSnj?8S zcDy=|2V(h`7h@j8b~{Ij;iQ(aCYT;jR^h!Ku`(#ty{3K?@w`4_Cifn>ps23FQ7r)k z2MP+gPI0%6l@0tdH`R|=+F~uq@6%-`EHz9Rg>R$C)3GQ0VnV;EqEwHK)Nb; zb4vs2=lcgV0rx}`hD!E3K5K*IOKL@`tv1&D&LNA)Tlh z|9%tquQ13Jua+Xr?6svgALe@DV(BWzaCzM3QtGMHa7Kp{Qv!X$R@rrFka8bm>!iO7 zZnlN@JLKzaH#zm7lXf}UQ(fQjqOZ1O_pH9!eQNN{pm{wePk7Nd^GjMwC8=CKYuHx} zOrNM3xhu102V75&{g4l(;$68pb0f{*tDyuwPPV_0-v8=-eCM)=Znpgraf1@p?!G$o zocL`9sW++YzHWt2&-2UL#;57)kKvr%+DG|T(N%s{={q}51-#+>gz2qvB;QNi7Mvk8 zx!SYdyT6UbsQ!BEb(6k!P7GJ3y8Zg80sthG|KfN}?4vNob5=f;^g>kSi_TSTI&6wG zGGT?%h+OM;z>Wqm4RN7dzb>nJS+PBM&*!&3)f2_kU8}5@t#%LQa-__v9kOQzl^rX0 zzd}-aLgMl@%19_pryA8mI(XFkY_3XJ9{*)&k zr7|cNwIBM)(j1J1u6_V}Y{zt&RB*X$4cv$~+HYizqJFHk z`~HTZPOID#l5CJu7chEWzhE<%N^O19?`D!sRtAN@UOh3^_jzt+x%uU5+my1BYHM7i zDpH|qp0nvGGZm|YcGdz&IK3PvOwuJ9eQI_&-rD>L`%$W@0i;c9%V8t@h!<5{N|Qc7 zLfDEf@#}2lhs7WKlo8pfQwFSD#vG176HPYL*I!&H+X(v}|Fy*2Hws-UzodW`2+*4Kcp=BqL0I(_2RT;vL@ zXufrKK%xzfQ)6Eo^SEAq6yvraa5?%&HcGks{*QsH@loF0_o6l(KcnJA9Lg?>5^Lnk zpIoa7HpsFiQK6w59=;9pwj0Qg;Cm#NK`QIT zdFlS3Y`mp*zI-&_-_JczpoaMR{K|-GAg;Uccv7KUKPGB-#i87h6 zZ^tPf|238nAhN*6OK^|fmz8+eyp3I)%!|+W^TM1$fvVkzF1)Ob-)AU1k2igII{S^> z<@s5`VX{RB8YTA)dNr*e3cK1fk;--sSl*M(ii!MD1(3;!7h23H29Q`m{-Lnb?MY`B z#A4@}I|$Pg(cHu6*>4P57nf{_DDF&0A@!9z6duIhE;q#D!^SD@IR*hPH}-`SFqeX?^A#YQaVQ^Mb}xfIoGH_fKY&=0AKTLMC{~okGcQbjF6{w z5-}tA;GVeOQNVm5afi2C`YvTsrI^a)tF@Jp^V9I-Dft>Hsl1IF$?h!AnD+H}nA{Vf z6tH!nlcmcu#PhiduUZla;RZIPVosf=bin z9@#&+YbCi;ZhIBxRU!GEc+8oVeNhjg2+ED^A8ayocF_U~U!BbHG@Y*P{4rY4EOX!A z@p)lGd8Sm6HN06Ap20+N(BJIMh6}9fe3ZsByz{|pR7OTg-7H;ViZ2`*xX9Sa>f8Gg zw`Rprso6`_YiV+^(5f>0bWv8Y*m0kkx%+A%Gdp0tjVd1N-nG7u{|CWDPUgXzI*(rr z(w$Jxx{;8B&-?0F6n_e0+K#*oaU?%OT5Y615T}m8!MBNGxW9(4TjPCj+ z@JmS3S-B%BwQ8s^IMqU-xazgwpT+g>lmpiD!2|L7tZn-2(~-DeK?5|wnjZ2o)yjLc zn%IVC-Yqt?VtZ_nw}Z1Km79lbH5{p5gerhuZ4y=C*n#IAnyks0G-D-${%rt7_Df1< zGaFY!*4#-`7}W)~2A|0zSo)sSSeJ9qUEwkHZ{cC#P8b3Q$`nouZq|&?2gu{jocJ*c z{_u)1q%c-I(h9mX?VbP6Jo7E<3gZ^rokgr{0!Y+ziK4yhFBmx`)N`#q9;j%!^TMk$ zAJ~~xMVx_q{~etfM9Aj$iW;UTol~pNW@piZmPkm|l>0v;X?9-87I+dxbdu|TXRXmg zc`i<`c)T%{*FKLp?_LmL2otCLn6t$t9}W{&AJ$L&YpN5rVuE!=-$XWpGMb8PKV+9gzRR zifo$8b5?dY-!P9su@8bHm;893_*1lCO@)T6ZR^m;gMT2Z;Sf%$BD}0^)`bUK9{HHy z=j?YkeKeiB7AmniQVP=hF{288TUE!9Q2){VYtu!f>e<^4KW=toiKL|>Lzqu`P(sYQ z(Yl?Zd-1Ef6F7=zku?{|(GXSo1j$Uj5Z9>h<#z?JqsnM!Ygw_x^K6RnrYQ-_hTB!Ka1bI9Xge85&pGPqI91hTDm2Z^HmYpILn!n;E zR~~v_Mt9e>XB|jWqeW|0`Ue~q*_I>#W*Z)bdktPUerJ1)DwF|e<8hDvv?_-J?;S-S zmw@!aAch7ypxxU=n*wpX;N>41*y3+e_{dfn)G~e7?5}Yq&-&hey+??5a--X_Pk?%b zW*QYcKc?T(ThgN{*pvoyCAQHFdR`zGB3E5q;Z1CO*7wTgbI@Xdi#J!JzyQ+0Fr7Tp zrfYA%*;4;4SmI6)i1TEXepi>~I%E2|v;S(2Ynu8;J0>x^SZYG!R*-8d;`x8?gRhf` z8!ll8ES;yF9njQvR8@KWurtA>^yY|mLhHXgkUf(N6*8l$`E%l+K$<}R-_v!oJ}W_Z zm=q#-P%V0-qKXO=RDwG>Kpm{XrGgMXvg00b0d#oue){H;W7}bRp$Bqft@iIxGF0!q zpK81DPxJhd!$v02@n24_Qkjgj!FZ(udd`30CgUZ#Iu99EgUzVwE#8GmtM1Pl`Sq*q zkDS}A8+|C(RG%!%Wk6Bosy;R?oORk=94zc8|CB_GxzD^Niqo~P={qcG6p?fU6LaTFu!pF>a>!bSEuyXmCK$ePoOqdP|W1q>|Crr>7cQUW}WL|(76b8i$0swgPy z<(uUd z0?F0n@2e|6Dc6G95R-R?9!i68U3qmy-thTBdAGoW?sBj4UjmSmW$lr^k1n`>C6P2C z7;kCb)qqY`N06h=>GL&}X>K6Z>jv)ry)jk#0na;{)L&qvEMM01xc+-CoMh*=NatM5 zKP8>TPYhc3XMErh!2LU6^wX)zpP+IEW98zB2yBDH7H=F&c^O@*G3_~Hh+G4=sqT=4K-GD%q}B9 zNxwAHT%cYy`YQWJ^~BV3&3`9;S0)_P7?0595Swjfwc^*syI&X5j)!^?Bsr-;TSS5Q zD~hfNDvq$v95XB4%3%u$dILOKPbA;g1UH?~=jp@>DO5k0X23Ko`SS6d?JK7wO+}^i z)44WJO>r`_VTAPoVj9+Z0XI%8j}n-f?>w&PVrAA4xz+QQnEg(*8~<&>GQiNOe%q$i z-2-iiYU7!7s4fzhmiCQa z1>~gf>66!>9bvvp2}(ruiOy9s0fmWmJot$3aYt_1QlHCMhQEzwh}Xr@Y`A{YdtEZ( z9!}il!Jbva)49R_05s|4sTmPBJ=t0?75=^ui@3rbSy>o~yeduna9?y9E=~AWXy5x4 zN)=Tt&&RLqQ*x=e?Unahm^5TCP#RF=Qf$!0aCL@SdlEulI-wf!hc|32=z7+{*U)A3Z3 zHqEf@t-cbK#iX~oDlj=#q{nfd(+L&k4OgW6qVG5alht#b8C^x(CNR*K#~RKiG^U~L z6Db`UAN9v~qp{^fz<6nEL~<*XYd+0|dC&X72SNKzXJ;QVOtFVYsDIeEN?q<(<=AeA zfQ*`AY5IF3-u-$%(9(-V)K-P5P$(o zeoM~8^xe#EFiPyho~rvhtq0jQqRpaKV54>_rI(ERC%xW~IQS?37G8QSV+?(#gLCC3 zqP@$IU%Ol^Vx(F43_p$A?#MyD&#zshP{Nfy3_3Mp7gLo_-SKf~de>T=v7kQtqb3P# zUmdA`873gi^Q&7MVkqdCd+{>JBcU2K5+!r@nbqhkB|F5#Z`hGAjh-NA+H-gn=gTL7 z@n98MJ;=ZHZ7Yk0@bO_~9sTjF+C7uNPJby-1UdP9zxRVVy`g^_{r4ZMjIIP>n+_yb zycvw6v$o9iFhkTzIT@K7b-4xqraD6ebf5jJ5cbH&Bx?@>JZq(Mo++qT!*je=mce>V zf~-OS1!1<8UA-xRKS1`>FiFSsUjT9~q2uqMwk4>E>7wA4J)pnDJLHjsX-7Ez5~ro+ z^MQsBA|+{N@c!ZI!pzKH8KXCnmF?3q5Zm+w=WIMR=snihq-I#R4c=1Yzk3;&*2OOB zZsdpdZsz)XSmII;E;0K-E9F)7lXi4Z&)>%ebrL9zqK|2r!Yb#;Z_c*mQk?hQ#e~A~ zSM>K>bhEjiT8ZqDyk;fOmY*T+A`b#lNv?zoUN{N&DdW_;2w1&7l#qY|Hi>JQgr#oc zD2YB(<~==hQXEFzgw7Ka{bbTSt`^PZ)2t8X21gmD1^f8;^*&XQ%Rn>Iz>t!_@$SG= zdnxV#TWp!n(GrcXRduPQ#@gV)>@$mbSL>mx&WxFeMx#zUJs9?*?3u{&gH$fszj2=+ zG-Kg9YOM5>mh+a18R*Ofc2S>SLBSRf%S*|I(c;(w^FA~4tRSZvKi?TJZZWExbupFg zHt3N;mW9qlltp#;1FU!EjvdfN;pJnnA5Z(e?d^|8XKv0>cQ3gtjv9|GH5seH&kI?B zF+Y7>n3dfF`_Wpq<1V+&a!16K>L<*ziNWNZO?MI{ln?kj?#3K-Inn&*pId z$eDxMA;1Hhqsv(YA&9G&Dvmr|LF!CIVvt`f;LT*eMeWvZ<+N!rv>I?&%NX!k)*rw7 z$MYOFI=a}pa0y;SuS?HXeS_kY@}T3%p2n&96g(;lLsw2!xs+-;YH~Ml5Bc}%j~#u! zh@d}RsHUez)dqYK&JptR*~}l34*2(QpM*~7 z@4>vvvu`3yH$(51X1F^Iby+!;(%pU~gA|wAOmu>GYMT}cqg7qre-cOu!h4g}_&WFL z{p{}_oLLJX2J+}UL1~OPww%3pR2-AL{t=b@tg1kgfZ6>$YqRgLtv@UZ{4}evec2WQ z6cV4m?ECQIVm~vGfJF^L7(#55Mdpy#1!E)D#6<2Jc$0HIx!4nX!ev<`UPgb}fC=!q5CmGm zcwf^aG33GYQ?X}ideY6>7(tyOHnEGo(L$@!Iku9ddlJYUXMzt)ZK>bUBc9=dbJziAJ*$eEcAX8;Ze}oV!7;i!USRZz1 zB@!I$`1XDS_+nlzOR}a$|FzD^S6>rdE}^@gLjLC@;zR6r$Fs+|^#9wWva|LzM~AE| z6{Vd*oA0-o>KD7jarlku&stiYTyY2emk^{&ZbJTqkEZZu^?HZs75HD*r}=M%S%C*? zsL#^4W#h7VXhRH`5d#`e?TK?0idBZH}>hC#ryaJhgX@9VS1)jPB} zanzP6cn48t(j(r2!y;YAczNbUmuw(xM1t1s@ubR0sOP23W`YtH z`Eu#9N=zls#6!-b!C5)vyiYhJrlD_mdf9MU14=oUp=d+353oAM9~Z0wfq) z9-g0nnfGO6Iz6S%Pxm8ZRp4ev>jwOZ0m#|@w;J*oI{1=b?#BlW1yK+kDA={hO4M31 zDkbNlVW!Q|562he<##KB27%x}q~&)hfkG^@0S(!=MH;9kSR{yK4V)C{*(*oDthPT0 z*_q`;-z~!9bWGm}u0*AUf%)#)du6#NN+$jkM=<2vhU1Ht?p=R8e6q{7$dn>2eiv%H z=(rHjhhlwsk$&|{`Csi9GixHs z2CM8|t_YB7ZYYotr7}~J$#`!+FP0p#j9XGRs?&q*G>fWv84K!r3T|vBm^}x@vHY=3 z|6H7&pJZG=AqDAlFsR36Dw4+I+n~s2{vXS~)@*;b^O@(Kvood)MzJK2f8sOwi+V@R zNtH32DcE)1K~N?fJh@C|yOY{ogg*~-N}u_@T4Xv9ivWZ&{Opiskua%scJgpP1RA_I^8+078KL=pknRVFNdzS z(TiGB?$_RD60#FcsUN+Gwyaxpi%&*6OzW@pe<>Aa$)t%IaW(vHgkxjpxvC)#(KnD; z;*mIGRNUvy%i+y%{UzR&`1|28H*w->{wm;w(r|BVJu@x(o-s}8_|&6Z6X*w9S1%S@ zN%EaSvYdx`gjPMP(naFc{#P$(?s-R*hC?VhI9vEu5d^wQdWrF=xx7PoGQz}Ple^up z?=b5J!_}YAPOe{fZ)el6h;=1`eUI5o)8lDYT-$w5%q!?=a*{^S+xX-9_V$AIzT?0y z)oD)`fkE*_$t@j)W{|qI1gz)p*jmb?I{FVf}@)yprLiFF8X zWmx$EoWf^Mza)e;c-Y;)t`2Zb5BUR0Es$Or*uQe;J+Zs3n9rN&+5Wu~aW?x;441!E z&tMV%jYj-4qEtDF-;`&1N}*r#R9rpW5J~QLLbl!?-k;l@I5OnG)IDfp(nNOXlz3y#HrY;SwS8LnN#(f6w_cH{JGT4dr9jVOxX#i&(%u)Lt>b|H;lgp1i189H@aw z0er4&J+BZ5bnXP)ZR|Q{W<0BzZJK@}sNsppf)^e!*0CVLAG~6!#Q0%!+Pdq`x_~6n zKO1YzMTK@|`>q)Lk3&INsCwzGNAXTH3NRQlOaIVOwGv~f@`M%+N!EKMnl~x_fX>UI z{2Dzwe@j-E6;f|e{f`C7Q5*B)$q@+1FnK+*roVqb`_E;;n(A^K>Yn(oyih+7SU&S@-P^4Cq+rD|FSQgZex2VeZ){i zGzvg4Z75Z_ihonKsQAO8>@gjDKyYo=?rsit=Y|JGW8jkt2`kcnt8inA?}xQ>4mU>* zDuT`eQ!8TtAPgKEERS($c{ZZ!oOkL`IG@h*Al2~Vu*=vBTNeFWs8Q6+I$%346S8Gb zwX>S=sON~KPWEdEb?_3Wi}3y;@(gz&{^p74`Pef1y*2;nKI<v9SVtW4XPQDord2x`Usi!@X`OjvI&@OH1d%oIJt<+a)ZRyi%-?m?o zIk%VFA5Cq0eAUjKroVCXQ;>dWmr{C%{fEeVs^Ys;A6^p^`Xmc+udX>SOz16@)$M}< z0pqs<#b~R5anK>t?Ti1)FD>%aKb-r6U`8Mj(bDxzVgN3*PbUSFJiT{%3rE&nXK}mPr~d|)c@GbwcuxIA3wlB=LjzN2U&)ML{)`h+ z+1e~_E`PvWe!P*)qvFIa$+Ga^{bKE$ZS+d~?ooY?yrjZPj{Lms{$Jh|?ysKfI=e54 z=gkUDeq^>sQhL1il%NCrN>LgvjK^%9DCl-`<#mBNE+T(HI`?_Bcqnk70C{*u=nP;y zaaI?aO)ET~{e(2hZoOtO?P0g-O*-uA496YD^}Dd?6%Fk?Zo-_S?#};mj`08E95w{b zL1lD5nVmp1mWf}p4_*MT ztrh65e8%>mE6c9XRLo{nH+lf!AH5#i&Tb@mE?8;X zm1`gKuFq1Z9=oEQ>OeTr`&Ned?IU@H{2J?)apR>vf8m9hXl0`8O6T-r=Fi>NZ-_rb zE^W)07f)`@4k1B1fjw-s=RP_{6J33wmiBD14X&&5oG+8G51Speqq_=Q5t3;F&83vLo_ph#CwrRrUwG!?tMLA~I`yQWITR|Ec`NA8{J<1c~( z2P6z`=VCzepc9frVXK;R^U(|bQ-*??&QLRQrTpXc7hE{D^1L^LALGA0_kFEHN|q}d z#pTcV;ON*kuR9RtoEm)@D9>A3W`SGHN}b25RFu-Vq(?w=Qd;ZWpLKUgwM_JFF`)KO zt-E&G8upt}c9t6L(^;zibtVL@#@EtXjPtMTbPrRgBi;AxDr59Q;%=3#bIUw+jkoMK zIO^WKRIv2T2^1+zcKIe)h+fTGt-)uRkEr+_W`*XsIwN!U&5M7_)vKLR$_fs|SGt_a z9EnNQoam}!4lU;5Nycg5QRUmB5jilyS10EUa*9RX$mf@%-BRnfP7iuEhPR-WY1syDcX}D` z;}>f2IE7d*bxSkr+_+7T>~6GP+l&W8FJ4ZX+eu9P9UKO1Q^Rl2g_nnnTx1YD*)wS#gxmeZqc+Gw8U%i|ZE9gzr?xrod57iD7mK7Gn_(=xv z?^v*oZhWJ0VH$2_eWv(|{6(Mtfchvr|HBsIYNy-p>HL?)U=RgUp)qTJzuzM3aGs5n{Y(s^d#|`vjsN*Wm z{9u}whK$mz4Yjc%^mBDjbxw@^}B!$c*zU)s{D)_`>|=B@+_2V&auDK zD;v?o!#WvohZch&wIMLv-5Sw)pDsT<4G98QOMN71C>tB67RT2H3*@_uDcta#K_XA{ zvKpCMx7=?SmQcr6-Mp(Fxnc~XzdziZrUUGs^rV~j6Pc+gPSq-XqaXIymgpWpjOsZq zFO7Z?oBF-K2A$D=^_wLvUR8n1h=0?*KnR4F=w|6XOa+Qma|mR^u*Od58qw;tikYhLwepXy$`Vb2z_I4nW87yQxKwj^MD82%-AKH_63o^)C^LGq*;!6G_h4R@2l2T3_Sta|yc^u~sOEvJf?0kViCq|wO@8oH%_a)M@nGj;omagA`faU>H(d8~ zgsK2Uy$>27;%VC#leR3i_}eHa6}Zx-RjN3$VM^7gmd<6w*QM$c zmGVGjj3F_Bf_Q~kl2GToyZ1+V(r+U|uf$zdSC)(wMl2KZBU)I6kds_R+9?9KHqtHt znNtGq>)hYEUSH}TB)GFJyfy8vhHX>1ZdqY#cBrqQVyO1}uMb*vPr6Sd-xOXk8IUCO zGuCFlmjIH(&zShgh94`$Ffn~AzaWzzpj*1bt?&Q&Byr>Xe`KQsO~Xr1+|g$5EFmdd z5l166_pXc*e>-ScGWeKD8|#Um^jB%mXPfJmBN!9<5BAzSVVelt-jWQI4H{7Zr&)~8 z!K8GW>Un3VOQya_HxU2oQ!2o4+$A1;`p*}qxgsHE{5tpj=gvR_<(}Q?J@|MRd4IN-PgKkDFxmYKNad+DEgG~iQ<{>td z?hbxTJBy^}QDQ?Lc{QBRj@pTfE|A{{MZ9$VXk#$&Hx(-PdheZP`F@s2Cj)0x{KO5> z33-ma)sNPPq-^IMjnsgUy;R^pY#i?jyJx*vT9yXdiS~2O%ruo>=6SI>;QnL@*zLphrwWRQZBl*>OXy* zg0b-V*&@u5+b-lOMZtsL6LrgzUs2-IJ1)0TPv>qXP}~EoAAL>d9St@1^Jp%dCVgaR8gYSV1$y0U1Egi(R76cj-v%~%6Asf zWRzS?8hh2&T9MrIe5!k#?F|p}uE^3(!IdpZvgOaucWIx03RZe)4M$quzIO!Ucy3mG z=5Otspd1u$?-4L&Z>fy`g~Y*OYjm@@g+uAzZVM&!F9`G!b&+?XS(h~@()(LBwWl1z z5Y<#Ixz8?6L~I(h33H@3F`HRwgk=%APRgkXzM$b*mY^bm`qFGUpvy5?;lOp7yo+db zlEVABl@M2$=x;xctWH%*N)IbGLm?aet#hd8BI(l|K^*eo7FwpExME#?eBmU$@4QB6 zs?a|_OVrJ0+|iHn;g#vV{@wV}=^=-~Q^Z;b-pyK@#I`!I;RDw*X==irGnQ+r!SsV* zU4um>Ag&uvyo^)>t1yw^#7No^LNyDt=!Ov)KUXG(n%m4`y$!r@gL5j@x%%)OeZjRwa?D zoOsS}ej{mncFD;qgS0Rm@hWfI?rPol{*BOBuQE<~vMYw4>w?*~jade?HZD0ev}G!$ z&FnqZirdzG(V45@bCEB?AoqTzu{WP0ID5SRli=88%S7F=tE#*Dn}uBb#bg9D{`Bqn zz>FIG-DWfRLrTQ&5m&$Fx1o1c%J5VEj7GXDD*)8gudB-RM`1peH5=OIK#@Nh^|y<> z2cJ_?A_zN*dukWGB{hF9_!r}$Fz;`*>|DFkJ130tW(^Ehr=CuPNx0cn6pF3+*I&HP z#Ga8XtwZLV#x150jzyuRfIMTI9fo6lodKB-Jn$0rag-Xy@VPuU^=GV$5@b~FA z)liE%gJ*r?Iln~{!5so-}KFgbkO5=B8-$X_`dbCkN%gKQJ#iRA8koc6ai5m^w*u$(nO@rBp7 zdBRuGAnuxdBk19nW&@eIpqb~PulH8zW(EOBbwhSA^CMtsuwg6G-}`hhyB%&hwCkWp zGBzDu1d%T#zkMLt(8N^G!y2AmyFA-@>7HgmW=eON4a2My#r+DD3<+r~18QMvToy{8 zFkK;D1WQi01+($%CslefP8K*l^VjU0b?v`AwU(Z$*|}<% z>;mm2%q%3REmf(`*zvE$ zh&i^iLu@-0NhG3pR~}aiNP_ow3S6pQTy&m~JhcS?si7}f2YI`tqxxHbG=Ar2EtYld z?ru&A+SK&sB>%YC)&x24Nq0m-_6=QD4nC`;goNx?8+9rGO5m2&78coWhL%^-tLuM4 z*fYCL7ucGRjjgGE+1tL_yPLiJ-oy8*Mqy^RX+@6Gog!AlrNrK%!lOzfnb(>sowp#} zZ)6`tK5bXGkecUEE^(u2-OUz>84}|6FWov%19@1_IXgXOcRIgzrfWhG{#2M_*m&j@ zqw8p+j4Lkh9VLKJ^+$1DKI+)vpB(?0Uo031oNx7{;u(%mLAOi>@d~$G_q?gBwV<@< zr4PBh37z}gVOAfbBshP@8;lz4h4{mnG@?z|<*9AP38PpRV`{F&JKKXqTjMY|Tp;2b zWL{;O5$2D?R<-Qv1urudKGW38Lnq81 zWd3CH*jmp6a|g<(r@eY!K3xAcc<>^GDeuvZNV(EmXy=J9{?FPdc+!58M3md zGHmz3^G$goj4iUXq^s&vTJXQJuAd)cE<7+G;ed21|JKEuk8*0$D&on->caP>5Jbp3 z;Ie@c&urN){Xkb*A~y2Q7`o@^TR@zyh_jWj77XFRgcQ9?8KrXmES_23Y;dPcFJh^eopX$3;SQLx`7kAmzW)Gw`y$NM1!va z0w#~0x|e|RX*_x;GOR!obb(u^8tHFFMAY|bR3C!Bsvgg840_wq>dY*Hc1vyFxwmCq z=#@*&|NN0cN==<9b|3FhFiWaaMJBjhm9}TIJG$vV1U$Jvc}V6ktLMX~lZVw05sy{9 zxGZEIxgC368ry6#W+O|lQ6XuNtQF7RC}JB7!siE<6ss*w7~!QUh!4G2`?v@CBMRh> zvCoInQTKe}RBpc{{m{q>?r}F>rNmN!36zXW$@_iKAMHM6tY$|iQnczm>h1A&f)NZl z@13E2i#MAfhI*LA)^|OTcSCb8;08OxM9dZ1pR#^%iyeR5S=O+LU=a3iwcR=&>BGgK zVlR~|;Qg?{T{L3T!7zTeLBi}h!>GVez@PuE`IWH@PfFUxS;C%B_?Sb$4snVe8=d*M zV!V`A88wNHB(dghcBNpn^`d3!;bfkY9=t@yN=^Mz^JWaWKx>+K8!;*xn0FJL9q8|N z+;o9ehI26Kb5gnG+Sf+_b!{x)6elVF2?X%6mO2@1NY3qOlvk0D-Aa@s6TE}1I*X4p z{~QC0^X+xiLo41_EV`r9ORE{?wBRlB57y%H-_n?&4cz|D1`LlmIwb?lTa!VZwBheY_WZw8H(UPbzWyR?|oXCksnT6^xmw*8Jm3n%?DHff5; z-5!NqsZTbW_@B#ZHF(K*LPp%L_t(N@_QF4orP4na{K$ai@?*hNHh}Wpe7vo$TG?$@ z6)2dZa#M^!z`hTi*W%L{Z2mYY`Dt+yw~tgbCFeZNM1Romk?$sag$8eMs)q%ll5{nl zjiLbBsU&%A7J7r4=~d0n=5OaY5AN>&k$>6HdYG7|@!!HA1mojIp}2)p`(vOyaW*26J8W~Pfsj8P_&ab8uSz89b^5UvD2GWgFe@D6=H3Y zSY}?cmW!|R7%2jzsg*;Rwg=~;k-=1c$*q6B9RJ<3j1z@_Y*1-5zJRrpuKvlO^GUBU zH4)u#K7Hf#W#Wg~$MW$uO}ggi6Vbc-QpRvluE&kn$S2H2V9M|6W@~;;)jUDS?3u)| zRF%klN*9UJjy!BQ%_o1?Gx|4Q8!F%< z1p*pC$(8V{TUctQ_7+?$d%)hwhcvJDZKy*we=9GO%-KwZP!KYjR}2(6n*t%b&C6sZ z;Sao<+1S_i>Jb$YW3%r#lXt-V04HLD%Kc?)2CDqA^fF zu1+4mtDvtrn$K^7uFeWEd1sg(Z}a2}-E`p%{i2|VYg1^?Qa}D3oENR}(jt=+uHLS1 zYwyGo5j`YKZ6TFH+43YKaBoW9kjipPcwPME#5F( zL|}OT6RPmvYVrZ;XEPvQJd&edrZ-IW6sGu<0^;_tdM0&NfV%w z)QcQg+IVeNs{~jxx|u5HU>(o@qk%BP3IEVMyB{*tSe+P3b_e4e*{1!LP~6MUGl@`z z?e`h<`}|DuoA5L1v60P^0DOvBe)yo9A#I+f-xeF1=1h1pQu703O0>VX&-!A1gI^d1 zAR|?>x6H24eR!^_F!Y|M>@5Sk0Gp(j>KW8>vLa1QbT6igD$9^4nB7i z8<;@*vmqkXrS=^L`TD8w%ex9Lm|nRDcj~U^g}81hT~Y1M#R+6Cv)r~kAb;S%A2%^- zLL{6RKSM}M+m4|K>FNGR~mOsnqJ#k)9Ggr zP-4Woj!Q5*!DBvu8l!nh{RQ3wbpM9he38wXzQx|@|MrE;7AJbgON9tVw!?hD$CvD@KfG2M$RlHrGs|=8nG__iuf@vG&yWF zo=~tv8v~FX8XyP`#Zh?cCEHvZR?{CB4(`u%|jMS_N-6Ft@XDn+(4*rRE$IuLk5i#vm zxRRRWAc0J{5O_E2+fcSaVk-tNEu`_I>(IF|z3)?EHMJB-sa&r_xoQr)V_G9#CIi%= z%-o_+(aVS3L0m_3QG(AqDx>ccpNB3B-I^A(?u~#RyDOV;L{$gAv{44I$@vxtcH=}m zdp7(yY2`MGZpiQrapqnIhA+;RyV>3~boidn;@>1=uLv{f`yp6Kspg0V%$a~Pu6J+E z!l&!9%NG`38o_gHyr_Vnlbrw(#rYtUh$LCrM+OhPnez7$pjjq5Z`FR5hKZ)Nro|0- zi}D}%N_Pf`M3X235-PVg)aL*1q3+AW-jhWuA?~3c!SUZ?@Xwv)tSu_BdKWUmd(ekC zkejn#ufCUQ71-_5k*K}cL!Vt|P(wA}#+dH&JHK?+Ny08f!wu#IQTsxUz8#rAI=;=c zftS7lR$3u8Dbeb&t{H{$Nvzjcxr<62;`d)$AIC%A6rMC=?DazmU1*rO*vZ$w#kf=p zu@RO2rTQImeiKCotd+2XxN2@}KctVpT`hI2VCIv0%)lpaYv#m` z4xD(^umg`7?)7>Sqeqpa8?@%#i?9$w9sN4?Cwdp7X-)H{fKw~I1TCjTy~@!d;Z@HN!|Xg&U7|k z|1pyBykiYMN5*6{gN}$(RWeHw4(SMdf>sE#sWVNKpy+?O*LEqUm8za84)0V6rmnlN zI%GiUeIcYHclqNQi@=BD^Mb9Gt#!TiF0)mb4G_eICw7W3n$g5#n^1XX6X zZK9p>Bhp>24SBOJP;OpM@GR=4Y2hyd_cyxLLg(tDth#g2luNgA#Uhd}RdaBmW^)Qa zVW%XiQzfDhYX_^jk$b^y0^d29)TKNOKM6b5)>@bL^3jaAe~5#BC=|V=vo%R05%F>5OfM$; zzsSZ@8Z@5qzn&eo=ufdvFO3+`XvTB2a)lUu;Qf!Lg#wLi{1@c%9DRju(MvL5s`k?) zin-Z&LhwI!HI(F{1j`O``YTmrHC`8o+evI`^&L! zkd$HAraEIZ_$od&Ryl-2VbYJ65vA7&LsImkCiBdTWGGbM1|>|N}uWFPm>EnaO@ichOp<9Qn>yC zR-e&)4@sC_G{%zbYSl9PKvkG#kn(8NTf6&KF(svqgafpn`WqIOXQ~1BA?+p@-+%e^ zjr7X52&T{^%Vn*dIL^oSHPohM(EA^HUMw^0XpBXK?OBp4#m@HhK=`1m+Z;;iM{ds? zW@fE=*G1%$99^!13ysMtzgjZ47D=s(^M-g1d<{d8sGyZSzDx3rdzFA=NKMsj#>2%i zN$sa-Bl(DnN@_xPqYQ=ztBd{C=<;71vX}Ae?Z&9GURay+afc=Oo02Nv#JDY2n@Y!w z3-yycwEa=FM^Zm)OG{N4k!v*d?8He%fiQd?enokjE*R8RX!1`p|DpwDcgmYYB>t}7 z95ZPKzasm8_NP;cG1wwYOorq6N`slM8`nb31O-gH;;4fX4SWAf4QH@cdw&yhNz}E0 zh2aW-4EE2Du zHqBD0?lbE2X-=Egu1S5~mZ_h2k6sgm=508SiBNyvCur^~uUkCQj~6bF3CMXG0{3g8 z#^A%5sSR?sD)T!r@5Av-NxTETV)-5kg3iESnNnPHmg<3zQf9vKT&@XQH;|bCGW==p zr9QRx$p>&bx7y3&?y6jsX-owg3qJHTXawDDJEY;KSWxfcC52uH&KiI4JR33mjHUm* z=ng~W2XQC}_rDU()Ry))XSoL#G%m6t1Wo8Lw#^{yyl@Xx(n5>){zuQl@-i^NLb-vy z+ZzM#mtQ;iYbn(?RNEEHJ7D1r-IOKRuxB9bWW$V}$V`p?-)HZ8q^DSW4$!Bm zad1fO8gf^t+6D@Ci?Y_*D~AN;IQcl>!-ObHUSyDz<-OREKc>W9iLblU1_Z;Tb2xiq z(IFU%K3Y$H|B>IaMRrqLj6}^EQG}9Yip2qPCJxbFQ&B- zSrQwgEh8Y3q(hiJmSx?7)r%`R!i~*@QxKO)<K)o4VG<+3K!R;i1^FxpVNJCb z0=Lv>7Lf)s8wRxLe(%NYzS>6qpvtuiEV4isF+JR=#F)Am2eUt?ZN2to;dT-2e9`yk zN6(4^=d1{OK>cW+av~bGR!6^dQ4WG`FeNb@3s^W-#&8KBYayOrIKSq1Qlf**81|mV9C}C3EAfOc=1{c z3r+VP)!+j9w5t5UD)7d=Rnu?`cT zPP~GB$xvb|hAk#MiJy&qOY$f{6Q;fED`fg#U(bdEb#-y6n=1vRLtj(%)^EZIN;J)a zQfdsNoE~1JP5+a ze}z}s0AT2}j{(;q4uUAeP*{ePDmlEkQRfsTyZ5|q_%+!N132LtVhQ1(uhsjg#VIZE zx8h(H6q`7?A+*B^@@EIwmL|wfQ27P+XRIPZU3M>5NmDOK|-P%TolNeS_;Wp zYYK4kD}@md;+M$-;`qkCw;YGM&Zo~C3*#6b_jRloGAz`w#I2cVZ6JH?)sM4zXTrw6 zE9;h0fuyGNJwa_1wfdJ2>^@&)=g{a9(sL*RkD>XOe>A@Q!B5NZ@CzyWfaK~#rvyxG(XHVUQ z2GCu_&2d)YnO(tmnXRrb?0dGlUIJizm`PtR2SZ1eP0rZprD-BVi2QQ$+a&l~9ipc5 zbj`=_cAAX@g&yya=i9LTSWtF{5J{Ii}Vvn9y71Tr_o5C3~$!^(?(lZs&bF+`Po^P&7t z)#F40JwpN>icb#3DRBZ9oKDKbV}u1}=2^NAIY$HtWplm6Voe9kG-;fbYr|LCyjR#% zx7}{_B$4(vXpc-cRr062NioPUo@ai~_0g>AMK`@k$0m_YvdxeM{ZsyeVb72X0p@CmD*alBeE= zR?3(s#xHvKZt82-4&1sR?#BCzGG=Y>_@a8970uxwjm|ww_@x09iiGx@QLvNupRINM z1W~!j!d2ZN3Idw3?5ijGB7F zEXh_W<$ZY-{!p0RaRM+&S!*X|laIgiA3RlCl_QG)4=?VIyEL@)#OuooQ|cKJ055)M zEiwH!Rp_dSag%-n|4Z}LK*}9<(7*2arKxs&hfbP`TUR+jFEQTwYRbK9LX8ym?_qw| zc3FTP6~2`pqlq0GjXp?z^i=Sm2$P>tvT=7hB&xwY63tv=t-z zuT}4ng_%c%=a0n>Wu52R*zJr+j+<5LPdkdi$X0XaD*cv~Kz)=MZ`nPk;rw5*2k-qB zOw%*YPD1*DFKlO@0%j2RclUE)rGE+9xb*!TV3Y!afHp6$nB<>I9xN#~2P`tKehI&S zVwfpmWMlaeF8(_{8A(E}QP)k;1Iqd<6ktexP14!DAO9-#2fY=rD? zVZ`4!9LDH@U)uS-;nCpM=)^hZqN4$JxH4hur*E>!PF{)xecCUR;Znb0N2WP;YO`RO zi}NUNKC$|ZLx;DPPg-299T-WmAmzkxEkamK7_pfwWj_*kcJiMm>njP>b4L<*V$eD4 zE7tdfD|0Ra(_gkcm23~O2TjmmpS!zr0+-%oxBX)iB>c#5aSgSI3;g%Eynj4wdwMdx ziDqz&QzOEh)G2#9gf!Us*ZjqPf*(y1RRdtj*5$S7{gjGAokD6pzE4m!_b=h#w5J=K6>u`xt?<=pRJw zHkZNp7@(Kz;umAaeL-Rbr~CrxyXSh;vX@OQ)6HS!G8(TlQ(W-R>sb@v1xw8G8tnC% zCsz5umtfdW=U=Jqrfcs!^k*tP3r@gV$CWIjR0w9itw9J-Lrx%)iQk^MU2udZo^M4{ z2X)sGmIp^0x26V3hYup4UHdFC|dokkS%1A$2y7V=Ho+$1@8QqG6E}*XIIr2>JEIa zt$c2DLrCwvoNXPA-H6rw#a)6crK}}MRn7n_7%!-rv|ecr~$Y;C=B;X`X)>(4VYMvxZkv9ShiW^VxX z(~bt55O2j$@Z*lhH=x2#?3p|e)XDzv=XbSKYpe0aZkd-2cqHFbXI*d=_W8|Jvyo~F z4*VXua@^OuBaDOvIkMJ) z{CoUD0Fp$jH-5Dt343GawW}?&rU9re3otwL-vARd*9S5s$>fm-^<1Q;ka}7%B?*JW zu`sFOg$X?>@hkwQ3jkjfFdoZfPP0^_BYl(FY#c^Nm{Pt+-E$`mS%asL(H+Gt$v(ru%C8&yTBJ2O^Mc(vTJCUZoAsQ_Z14sh(w^6( z_x5Oee+c#~H*3$$bMfqeg5vG$RuaT@rjxu%$QU+wHlKU8%5FO=Z%RiaLqu*s>d1Y8 z@-Ixai#iIfcG^A#&=3oCKAgH5{P^HmH2(}D?*t$+}y!}*a>V6on8%N zU4%Y~UC~9yj~Vw9m~~X%dd^ zd*;EEszq4WDW0;0#;Or2{UH@TmA@CpcvjqFT?supPN{f_We?3$>HUv-uF{$~?+l#LSG9*atCh8vm4 z#IM7En(p_VVh#arM;%;et#D{QZd3%Huts-c+wAja3c%7xL}w>Pf#-Zin*5vTL)Qq6 zz|)EjPlqh-;X54+l2KiqI;DtuoP?ARX_DpLKDIx?SYf!gbr&gmS$7Lm=WbSjbft(n*tQISP&DllC2We zSC?tcZ-QIuY?-CrwW=bFS@4rx#Fb*I^7Xg-gd7^3*LAEwA^}=f)OkWeZ9k{8Ilw0x z$?wVGdI|Jn;PMG_QJ93WX|o`%TK4#lG&dt`eT6LSU^decUPoG!7~Yd-KW2gg6dcJW zjb001O0aMvFuow=@x+~p<%mgBMQq~&%=)JX&bNB-LWGuM;;MVfYQW$QXYIpjP+;st zkr%V4_{q^kb+M@1(lJwp`Dy-zcNtl1+2r$zGVeBNBACHbPcqW}H| zQY%2sZn#yWWUWfY9LAK!vff=b*RfNW!urfF$-C^JRF74G30*E50bt(7X84!~E*K8F zm{R`@kNeHI<7CRJxaUs+U`s8>XR}7juL+b04Z4236_8bbxApsASXciaZBf?!Y0Xwk zk1OwA(+O(|lR+pwptl8?6;Rvd<07nb26+^e$_{=QzG&&1t&{F^3+2uz+zC2@d%41gV_)TAS2Ue~+9-{Gev4Ys=vqo?e(u)J%eF?g zGCrRbzmy}1eS06hY0I;#iAm2e4a_{BcDnS%f2Ct!iD3+b@+F^mc z0{x3Nj1tNf$#bY4P{#<02IVDh5tFIxUi zqZYLmCziv#zUD_U;(L=W^~w@FPFq|I^wh}^&Bp!7`B$u%r_-@5MwZyqu0~2+$^T6^ z1IT$0>%Z~^uYc>}=rz1xtSYSK*V6`pNSB=VXAuCpR@4vk+go=K{l?_O;QYE)J{j|P zTG`#jKt<3B>Q2<`9jyZGai!35{#3eFm!+Vw9dWwOIg`s_0i^%diyQgK*d7kt0O{q> z{85j=OZa+R_SVhsOM3APFuBdxWvsoM2m+>?=V)bW8)F-K#i0I_yzlIKd}jjzmPtDC zu;=>>IHd^IA+V>6*S{oEzBRElmzT-26YKf1H%9p!T19X@JAbcwhfurP<5>|%+E4(O zdV4tSmcBG^wO-b^HwsZ6J%9G2h38A{5hg(E4Gj|B{m#;|^@SOxl7GxJ{k4cUO9p`5 z5dMi$C1(yias zp#_j<_;`WT2bVG&x%=&(VlsUwMEF;8aryJAJ4=Mr4@gZA0_MJv*3&?N(GCG^o1DjTdIApch zn=fMuZG+@&T9XN$2^cCHbMVks*&_Dt@U0t8Mu$;LV~+$lysPlvgz86oQ4=kvxJX>d zL`u66gF&hcqlFC*SEg$>(|$)E7K7f?>aLmnDd-Qh#tmCMA2C8?T>#|IImT%&)KB<^dNh0V$ZQ|FV92rHB282{xBPuy*NapM#HEfRWjE3 znaMt*aBOdZPt+5-a2>blSSyqLgfPDdqkL)JbIitWWtirwnv!)y4r=enWUzCh{vn06 zBa)p-GE^_DDyVKm>+z9wS?8yFlRl!s`_&u68G#te*=72l0cv=BRE+s0w^bZm*@7#i zz`e4LS5NIz4$dp|^pkxLjJ1xoUJ5Ngj)^{LdLe~@LEnb`ga3KBBVU*f79CpXN9Kw6 z&S|1w-B;$o=oxUfNr4~JC>EsT^9%pr+zD;ktB03`2M9h3Ywoctg0;kw5m!V*r3{0< z9JBR_poW)Pyre`uhqvSOj%2|{u1-*hD{`Rlo%NWVhq19(kVtJxi$dM*9H>VTQV z*Ew?F;NWGPX%1L)O(=J%S()BsdyL5=G5))%?;tAw?dq9_fFpeShurP1o5;FCfqO0Q zrjf@JhjSG9K~=Bc9ewEUCWNo6gS^*Z_nA?`;Oc%w@9%_nnT6pI+ZE1cSTv*um7!)|OqfY!-W_Ufh{O`G^qR^_~pr3Qp z;rS!jZqv!{YCJF~CG8%I*WYWFJ<_RcGRF%?5c4r26Ay9MuF~9QG4kK$_%}lg0=xr! zu11_%#+l)OkZ!H~Gc$N1IBx!GI{xHLo4XcVMH3(Z@*d|y|L=`8$=2=1-}`vK)9YY{ zxgpT~-cG+RuaDwMje@5-u)9wiMIui=X?Vq|=WOf-J4@vOTJ3;>t>NUi`%Lx{K(!wf36b8_R-*=uxLO@Z+W1MfDtb68V1BiQX1w zi}g2S;0gIf-3DUEN#J?&Cw!^JxbS@;P<-Ip{pz?`7r7!|QL;trK>Ww`zZ2m*;LL({ znXat-tcvrH7CIdb^+jg~6q|ENN`mUqq@(_M42VUB89}8$iw$62e2FeQxbbakf5Yuc zX6m$S{HB7kWF2YySGYNq;Ci~f6ej5#QcrBrR%l$L7a^X${}7)cYV#}D+D zZWAmDp|%Z6XG{%b*-U97QdLPi`r=oq{-|o_x-p{LemNSr-VPs=;+?in)9&w7cJTh9fq5R43fFnADb^Zj2Yr07Gnk@Xn z-M->9tFnbqOp~I}^tI}AeBz25Gl+BE%FLA+c^{3DdJv(#oEsi|R;Mh&U;Vfz?@3X& zk>eMc>n$9@DQYWzH{q~6>;s~my^uc&uaZ1--uV~Q)!&2wO8`XES2`yj9Ggrn9V*PK zCMQ?5lV%V!>k`gJdFC|}(M1m_rjU$w)l$hW+D-nKtfl^IiMoXI^OG7v=Ff{uFLQH; zuY;Dg4)l+uOqnm6iOQK)A|slez@0@Gj7&!Cu6jur&2FgXmfnDUo|_lTAdYrcZvI10 zCy;TjTb0sCiY=L0K`5&`vaMhr5y;Bf$>(O>Tb|SQ#!!Ny6^oN`CQ`b!C=WATMri6+ z$$#&MjAw7#7&?b-Ab&=$xKsOxI!|%uaPZPE+y~?H4bq_z^De<-3s2BQj{0wMB;3dm z?!Om!hq2onU}18&dq`u~7;H+a*H7%>LOD~)Q*1FH<6g)h9 zk?iGs9-^8vQoG>j=(f~<(p-gpxh$riWp{S-*_<_>U-o@oO*@0g3{T{9ETk%lBBSz{Nae@h$&5qF znE%hH=UhP>52Gl&%|4_>YjC;ua+Bbp>#TO+- zf=Xe1K2KAPTF3G~a^G&t+omNiEM&oUfveB~Z%i zY(_uWC_P2@k{_wIYUM*|L1LAn#fNi2Fwcpxmu06z<6O!hj+XtLRbSuvPv~d}7o;equV_R3v#U)}?y&iYuDhEQFd)*c2-lP@Z@p77#l}O3 zDCKUf!9mo-cy50cybZ+BU78H=5RMt}P=WFR*fnR~N8B5E8`SC#LOW$@>ZCqW(5}1e zb(-f17u$oZ{`$Yd83IlUsC`Af=B~I_$U~RGkR^MawnbiyYwX)%A!lFh$J#8}PwfQ_ z_}qAR*`VwWxpQS5YsUI7j^@^~_a^>7axL)=M4tK09!~&wHGDZSo-?XURu~`np7NhPmo@V?4jSOHr6jkCwgH1^p(zDH^W(`Ni~KJp6tw0 zc=O0q-xGL`(lc5X$)ceSICMv5g(B!)Jfn;MtTehoq&GKm($M52Ye4J(zm2E1fxa%$ zQRjqT#qS?Tzi}^Bt7iZ6r|&OxKm**t@JsG-Z?-QK)Yfm20*gUeY5HS=zjrj}r}KOP89E1chMq6I5f+c%_8On}C@Prp%z0e@(QalwBA>3=z9Qu6wyblb3x?AO zW>PYS3YjVy1?BLrd7Bt_coV4}y;Ja zlTbeame!{19*yE3oiVxI>@SHd!_Zp`Yuu!xvCr!5HI$RN85omkoGkY zg(FYqZlBpY*6AA=Vsg1}9=;E#mzc~G>k4L$v#|~~v9-fHn!c6GHoTn=iPGOzUB7^G zx>li*sQZVbAk&~_dZ6jMQ*mykZ_f z+zXfi2bjUgEbC|~9T0i}*KysFv#`IH5YUDR26~yslBN)iLdp6FOCAvcqJ?VL#C@E9 zN~3_n`rPN2Hg)`c8=wPvKa=22`uq8OEGMnOUKdh z;WETmz>xP{@}XvWJ?M(g8`yc4sw!7(lc29iSVbM-*bq80TV`la=hFBsK|CfY|3-so zz%%v)Kh)wwZToM9l1H{1wzNb-jXFvs1w*H88WytC10ml6sOtVK4ep<@VW_bdH0puO z;dTn5P-X0Q23e$?rFDnq^s_vruf$%?WLjaLIbTuDa^&M#B|IHgwcMFVo1&nqB#`dK z?NKM#g+0w65 zW4|WjGhFU{;p6;#>#cVSyeC_0Q88SKlt=6)COCR&_Yio($PY*K z{i4*f%iAGsKjK-!Sa~*NJ^IqK7+^G<*bpyQ5Y%E4Lo#EbzNE?Hr|@i<`{4* zVPdbDZ=IRfOjvIR^%0Sj-f~To%&v=OOo4aUyuG}akGgBVsiiqH+;ev7{Ab|;=HNX2{;CYAMfE)%ek7uGG!kQ|0cftZm)dnPGC#x z@a+S$Wu}2JO~PoOPTQ&e?XCR$Ib_*ozAB*gqRLFQm+XW(@lea10Ps(V^H;kk+IHif z@^V({SpEwvM!A9S@TK-x^cZ?@aMRiimyAlKYiWH(1$s@5^Zn@HP=!qg>F3+;a?kl& z!n5c{%#ul7_447UqAiZ1-1bmd0ZTQX9YV}_#VH^zbWa6Og+xwxvgL`^`(RodOEyw& zZT@zEo5aQ0rpce3%pIQYG*D2>BAgF?l{7i>sr-z~Cnrw6RsGR3#0#jcG7fa)`E$So z__Sl?^8IDBk;9F*dr!}@(_%-0loL>i`4n^!Rp(RiCBTufx3B5R`H$7*M`4&VhW2`E z#4Ehyz27ON_U}Rzo@4M&{{>l6rOmvhUqZ}9UR4T<8@+u~R}LzkN#h!*xJ~~a@RXZ- zgtR7!-hkGunPKXbpV1(tZJ)BmVCV&z!Qu%U35i)hc@X#McnvhcsScqBz$u>%P<>io~wcc-uAg+q3t zdIE^nXtP1W0bheX_r@LROyj)YWxTuEZ@XTmN;ndv7xX3VmFKd*qiRFnKJgtUvJs!? z1=ydtf3E;0alfC47yWr#Om87#tTcgJ+uG(ZIK|Tt-;`8z z=S@v(Q6G537%EfdetmWw_(blShVTO|Ie<(GuZM;+x`DCk(Ix-=@x`KIqFYou@n}%> zW`z={DDnVjnZMo1J=J7F?aVuHKJGsp= zm)yCdZ+PGOYh6)0_IvSDfJs>uo;J6z(vf>#a1(Fu(n!uJ9AdJs<^3Ci`Gijzbyhbn zr88Pv(H>W7B{z@6ktIJK^DQ4dB~?^^%4qVR0m zO}*{Vi9-mb!KZ(*F;CNvF=e}}3^*SNhz5pk1_yqOC3Vs20%`JbP4{UfJgf|m-z=L0 za?r&tWqUmd-39y~sS>E_VCoS}1*>J*jNxrn8hq<k#{~L|PCrfQ)Uh*_Zm}ITGVa35B2)FK?{&mxKgzIX zyRT@eDFY5du0b|MdR*5~(O}570bQY`O_vrEi7IYFx?ZTqcjkjS8qL-YOuE-STFkeK z1x?`_l3(WnTJ~jm#dXzul3GQ}rk)luqm{i^~~rTO=6J)=JSf*!#{sL%9$q|ujvkaKmwN+|MDm#dOU8-bI1nfd{Z`;6|5|a zF3h!0i^2l=4g+S^+%qX*yTL!eH(H5i-J3N|6WodL{U~lO7-$LDC)T&;f2P*cvQ|>| zuc=28bx1873$Nh``svs3Ln7N6DyR>6XgK`ZWPfouHs-^w@)0e34ac|BRE$weff)G& z-aB+;zHwRbXt>|)1{sxMGL)aMb8~AdmnopdF<4a{Wy5d*-iLcijMJ|SQ5>ydttDwv zGi6jqwH$@7)yo56>ESu-(NmmJHZCMPk^&bcvHSUh#n-e+=L^rS@H^BvWyI@T?|R={ zv>Q6^5Jri(TXO^eUH_jy$NvXG9MB+$hWW?W3~2Sr^Z(JXJV*06o}nQSVl)Ku1VxS} zdtjlj@z5n+IxX|%)OF`slV`c^*2Z0RdAnLV zWx_l9o|78_0F9?r?el9`3lroaX(5ns9j1)0duw$vyxa&7(^w*u-zcX;B)1)N7?)sG+5bWF} zQh-}CVnUhFcF_e}GzpUTQGIss=5-`O0@5^g{q?Gje~AjO9Ujs)Vs2A*4Sr&g7UGY@A^i2yo*gGM{^*WN=xU?!BI^;8)+S1i*{HN%|lz4p5h&1Yv zy#r}+VWcd6iumF%7@moePRizj^2WS*kN||_ne88)NIMS*81!V^Tio+(kLBw;*fm87 z`%J>e!-_uh{!>21mhOt+A_=5dDCAO9`q`h zy)SGD@Z)Co;r(Bqz1$c#b{J~vObz3Ew;+T>$bMT;QDv)O);wf${UQprzwBsyoR<^V&zIe>7`oxU{#mk z5|?NDD|(JGcT7kBu&F1^IwObxTlu=4&~x`4(wzY2xvz>ov9W46vdd0@=c#Wu*B_o3 zoMSnkZYSTU2>W(4BQqwofE)MZ=|UPaA3m(gjl?d5n(lwnE|R~TH!ju62)r=0FsW0? zN*VrcboJ5su|)LLVS#ab`zfZSoS9zN=Axi`ZAw798e7)pVLxU*n(@$*l=Zg6C?g{u zVTjVm_cTv9)c;cz;+OdK`XUCsNRjSA<74XmmW~9>gSV)N=lTxN$Lt*`{Y3MC0yoG_ zXX7v;E{aPU`OqRP9k>omNW`@SZ>@8#xxMr^Rnd`FpQsA$MIHH{wNVXnzkHLi` zQ$H`;>X1gZ9!<;bf7t!wpKg}pE=hSlBN6Q;m{dG39kE0ix$i^5I}gN)IE=%mk-fJU zOaGL;hQZz)0O(F%pGioN`ToI!h+n|%aga&iDnH2bMuOXYIu3zb%vx9 zN4Il+4H&=H7u&+oBl?C{T&%YtlF2k91idB6s2|j`TCKhuDYr3feGXu zQlk4|4d}7d{+S1G^RNGN%E!LZRA+=yy`U_tN{U14^_cnV|ME!s@w3>tks*iUv=|E8 zir_X~lH1XY(5n7kmp(Q9J}G`WG5F@Lk1rxs`EdAbkKZS!Y^dhInks0`!P-%)En7|Y zc(W0wFr{Qf3ak7@)KP0lFnztx=Wp}hzP5`0Qc|C~vp18TE$pN4C>VXj_NeF#c-`wQ1YUmuj#o%RYDeyeznz@LlKs+v-%)@$E zD&i9sCN^xC*D45|!u*fEqkd>Qfg)EkZUTUvE6c#vPB}-HF6}gV9}Cv1`EMe+meMt* zfpg*I1>AV;tD$9t1a$D+f8i;Qp+HX9zl9)>52%PIda3s?Xs`+v`x+A9E%Mm)6rEXA zmW=oDtRduQ0aYxaypWw#c!~3HOZ)AbR&U^O!G(w`5^{EbdgKL~R1R2IUs^I9I@`8r zkQ(gaPY+o8v^QtBUJ9&PcAUMkl5K3s9B9-_@0u7G^O(EqU6*OIBF&^rS&^QZOaHj*I420Jb$>lgV+asuIbyB7;IfG!rAkG36Y zsXZ&vvX!1v67gWORsT06p~o4_%?X-Y!?8MAZ{pcoxDjFwa2<}vNe^AFeK0+Qe!D9; zJMFmK`0=FjqU~&!y0(88BXSJSWb(fk>&P>Ko^q+qs_usSj8*YNFRK2!wZU=D+Wg5C zpY)s1s=AOPFv;i8&#u`FgF`6uZ-sk@lXivmjT4>VJo40$I!W;*UDk%B94^V7ks!X_ zT;87pW$gs8mF}*k8zS{0-e<5Y9zD}9){BpPl9eZ@fwVN9_!I4ehbn0EZ4`MSRB^X2aacvoolXV*_<8Lp^Y;-n zPKWe_X&l#c`o!{!P`^OjZ@~9DxhIt^Wcj#~Gto-HEc12u<<6g~Q6D-b4xMs8)@sOJ z2lQ}&1n$qrzM7o_c~Fut5^c1_b;O70v{DqsRGI#APBc3yh)N@ub6MCYeA@1Iu`(dQY+J_Tk*MkbBXEgXBYlVt0O$FAZSMUeh|2>`at;Af*nz}P}Gp$>na;tUZ;2vB5gM?&e)R3g8#l6Y^XtL3K5n! z5Od-P|M?Vz_S_A<6Trr?wG(-+9Y{upYkK@5&F6Ak&pb5l{_g5`hSzZBc)gd@e=KO~6eoHCc+y{9)_1(2GbdHb=cflzM0^ah)Y zbT4QVIESB7?WttGBTD;0QCQ%o(_##t`u`#7ETh^Clx__ahoS|FLyHtIUR+9XEAA=o zP`nTb6e&*d6ff@XPH}e+Qrw*ooSSp*I_vwDEPD=EVW8Xf$=yZU3QZ*s!%P?$_uiY;99I z|8>{fWTxX`3b>3?1^@Ly_|9-%7G_xNS&?z)mQ3OyNMbGU?tP)XNT-?W>D*R`s=X9C z@>THF!b;bM>)0MV&i=J%AiBenY(ab0;XdPRcPsrMNRR`Q1zpN^`Z;K(mf45(p zsQEoFex6HC(%?|BEX?8*6zrM4n_gZE@z)dDxBJ~G@WVZYCR2QAb=|WGr?IqS^wRO) zpPw}xbywUTVocMM({V9m2S;sCz68%fn-e-tpLG;W#zI|W$%do!5jP-{v&q`giAHQ) zyWR=M8R^e=8;Nda>@y5?$ophrTx9JwWjjBlrLZrf=PixcgdY{l!q2>>70NY9K2?2i zynSUr9&E+h3M0kouDa-K^x#0Z+px9C2^OIrBER?WO_Fp zia3Vx2(FoyOx8%~XY;4h_MprWRL@*YkOvoS(UjjD^|e)T1|b`ASxzd;k4$-z;C^xG zp4>El8GXYxFzQav%#1{NkwZplAB})X1x+BZFD)(%OzV`KE6U}hbSC^Z%2@Zp zA;m|>yRn9G?{INuxdimV0sU(=a#UK}YM`VaL9`39KsWC%BF8$K+^iiZa0bHFue1!k z;w03c19$MVquAo)3O08*rQeCD#}8A3N(tzh!k?28lj8Sz_vqb)w|I4vgXC}YGSrw6 z>m?eTycPADiTh%?zw`brBKv-+1UD!Ou!l>15NEF6&MhbHFjCpBAR1RN(K<*53fBPVHC^+g z_YeLCV?r~{mbyc;pQ;YCr1K8yLpTh!f!hk}bq9ojTzA1q;IM-k=F)Nvt<6&qU?3qP z8*NIm>01LE`gIBY$3A}H`QLi)>TQbD&wU@~CJOipqsVFFd{Qs`XQU?2&|{S8 zsP-uk@&pJ;utLFp?!#CU%wPKf-S`kC$*?!z@iKVos+Gy(?yosxPhlwWu z!(^;sjc+wemR(DZM|`J=m~xuhy(#Hl}SE6P65 z4%ulAIrhO6De`Xb;c)LTlMN-6epKL7c^d!mR-4g-e!SLRFGQO{&^n5Xi1I9%iGX8$ zccfFR$9s(JR_T|bFM09IgeWydBdu?z@>XJChMN0$P)IMNhLD%?Qau;OGc2Vp z&mAuC7U_Qu9n=V-@&6q<91yQoqX%R(2uTMqf@%;UL>^d=&j?`$Cc>YC9B`A3yiiZiX;$|Qm7A@l$4G}}ETn>R!&u8wdbowPs484J3PhTGu<7}g3 zwC57XFPFO+5dUvJ%-6qO?!ovSJ$pR|$akfYGp&7@s~>CSc;V*Nt`Dm!j_D1rM4!gY zTKxz%kD;b@P(`JE(lo7Ct>uQ7a0>&%fI7S`8SAhgTTgz7_I{^v{S-;E(Zvkf7z5b# zoU->$J&{ro2y6OV;mq19O(3yLmAX;+TervXt;qK(qx>4=4aFYHV2U||W5FUB=L##i+B#Zmuq0QX(ZF%^VM>bs}Se zG--Yv8psQ=%%|fZ)B8&ZRG=o&Q&^!@zv!{^;?DPRUA;~q1O!ukqRS@I9JY;U96n3b}#!` z**}m7axdgvrRJ=vC(7GL;yMC6(4LVG88(L98~44L-y6zL&3im5(r+Z+`HbSLz4cQ= z*b814F0FDd$QT5&U=q6--4BRk8`iAeG*8;Z?;r1}LaPC7Bb6!V2VX?*njG{oLR;U0 z$13BUoH|KQ*MVMqEe%xe1U%jDEai8{?$pa8UAIO0HelHk{_dy7yRuI#Z)AFp?P`uv zt@|nlBS=O!ou{Iekn9@APPr@B9BYBA!{GGJLAV2G;oO5^nv$R#a|TIpv6ww(H@z|V zJ=CB^`Hq%NIL+>PS-iQof#}wH_F*=?jnU;HBX1)GX0wn$e!Zs)EG9T_);3h4(H%k| zq61~-IOV)o6ftFh<A|YC_JysbMk1A1#sI+nQdauc?53$C=B?HaA zq`86y9wz5gYT*cvUI#3N)Ulxzu(*7i7d4c4;LijjFe_!Y5`Ez8t#dm_0kHFYzERtk zjYC#ATSQI)n1uve54w)3;T5b~!Nile#POw`NM?){Jufq*QyQ{6V_!#t%+#z;2-2_^z@F z59bVJ3K3MDtO!Et_$Rd0TKtHZUreU^C_)2Hk2Up(h2 zpN~PFha?=>If`7w=t}@?ueMu{AN94bfKO?TCVn=_#N$$brce>BnH}+F7p2}!D9M#N z5My-#+lXC87kDQh&7%M}i5Fat-a+0+cxHvG3kkugZmxnK4xYy(w8S+6F9Ucp@>;k_t1T^m1fbHq(F;Jje90e`67BrSd1&*ZnirFGSJj0wsEwXgq*T~A>7s_OPV-ZRP$x5VYLu>x z?~5$lrGEBPz5>^{5n~FtV`Tdwqg6atb*W=ZnnQqidN#1}q|U=>0jUGAgVGK|p&>NB zFS0bd>yz4BBfLD+WvIN?Z#VN9vGv?v4Co^!u0tih+<&R|Ot&ng(tU?(@4Ua1yYpr! z7i#>NmDcwCw!Cy~V`_h=HYT*Y&$?BAbgOFWHRZ@(X|%IQ<%8{+9oeddnP=9uDsID? z^^FnphAkP8=dlOG6k~kqdP57!TDP+jr{6%NddS+9LyGkGQsvE9wBRkh9x}ESB6uH|EnKtq6hJ%)g}-EEPZW%h{yQ$2Yme z_q~{68dDPW!1`g2_dCgN^A!?ESMUhwn8&#bIf7)mUgKtB7!Q2KloX%zek;JPbS4I` zhJ%pF=Stg4GNTUYCrrNkI{Kr2)Hc(Wp2i$|s>V>JI>u!ETUy$@Xz+aHzUWsAbhnOqbI&1p~*OQ0v|MI5>=Ah9k6pgM0&Xf(K;Z>l0P=s z8&;6i5IP3glc?0eMvW^>(kaL0i-u^(g^;Sv-90BCGtTpt=xrj(8{6_ybxXL(L>5~C z2J^tA@B%IyN6;(>#4MWiS8N7{e9sSR{ym=@1oB;|KnnYC59H?&9rd1o*=%528eM&D zwf2!uATydEVG9_#k`63h33_=yS)ub!dvMRwpK3h4YUF+a(7x3Ulz9H`@7WU)%5>s) zTfVbl&Lz-p4*$d%s>UTJLUGqNu2An;J$YhoY^>-IR%Kh`3B4MuXy2b$w7%E3GUZ~z zEdLGnQ4zcHc3QK~*>ziaKDl%eNBPsw7i`hWUssq(>xCbB;)!plnC1oLeJ@xfuHGcE z^`bb9<>A+(8~@#7-z2@}aIGli2%W%{b%vX#_{zB)i}*d*&D&d#`}1FCY{bmd;MM=~ zE7U3!Wb);+lB4YJEIlrt&zX!thJ!XZa}lB%S`A1b1o1*6v+*;I1jA6?r9eZLPYDx{}2#-^6#=x-SPMKwOY++^@1&CLg3!}86pM`u*h9o zpVcQI{%OYVv-$<79FJ3F<4e2AVx?!}1@;g(KksR)*Oq%`e1zucEJGO;jj>+rsz<>| z?CGG+8zfTlMYIbX$D_B6LF)o$0!P`cJ>GAv9A86ZN&oLJNaRq7Vq@uPnm%!m6%bmm;?BMq+y2o|zf0 z8-QBtmQL1uJq6i(m!H#j8h6W4*Q=51Z@MVhIROF>uf^e1_PSI7e?2(g&&cr1ia|_T z0W}OhC-pVF!t&U7h48;`dS!@=2y&`lLPh0e5VF z1($ukz3;{`DTm{Z4*id(F21MKNUm`XL_02np+An9^F1dSTe0xKoV_eF!HBT+`(4(0 zMxT~whG)pnyYPm-bCz=bk1G?)n_vnE{)eaE0m-W#;NkJ%L- zm3k+kDS{`Nnsx_?r;j7Bq-8ZTz5t9sRdEO)%Jc^*8Vy;7rY3e#ZsQ6h*G%33zEY^w z$4{zVnR}@ag^dUow!;fxL=CU{M*PIB`h?`Uk_ku(xyH=>d?b2HG~t|HQ(;_-@OQd< zTXA~sdGBgJQH!zpoTGyWu7HA?{69EgW5kU#sLt-%O@Ne_tUIzLA$U|@cBvwBd+cft zCm)z?1notg?f32<hgY{_%>^I^1x`N(Cwt z*{Tx$hs1WFHiy4rTIRAfI%1o!M7WK7!jnm0rXJU(0gxWq$Bk@I67=(E1qMM{V=`9M zd=s4QB}VHhyqh_)m;(v^$4#bIAA^Ut$Mq3S?VWP`?k9HmzApW*JH?)fQvp$p%a0?6 zmpk4ql&7_x_kn{>83D>r{K)p9G%w*gw`nrBIn!la4T%I1 zXRAyg%@i6t3ED%tif60X>s#P-UASI#gg34MA|&F&uK_`jiLYj)+#3Sn>HzZJ$!we! z9c{9GbtYh~7StDZ?j_i-!|K|n=&nq${O*~7fMsiQTUjeS<)AnylF&~rpL3PN?N zm+S`Y1OxGwOCeHJtE98*mk?>^wQ%)ZwvhF{h~hzHkOz6TTkiS1H``@p)l>P8wU` zWl7HCR{r>S>M!XxW4EvM(LH3*nf^|7yHFoC{^!<8vALR@qqVgXSbYTE_}BPZ%IG5G zegTh<4*WAyTT8-=v7PmDe_ddE8j7Ih$ zZVLA;u3M)K-m1^#WF01o4e`ZM6DMJl#g33I24CXSF&7W;NcQV~SuYqS>i3rh-}5cp zsGjK%bz21F_F=mx#V*lpDH$jq&>E21D-LqP`%ynftaCPW_Id{F-|UR6E_{(%LLf~X zJe@`J>J>sKP5relmVnmLTI9qQEb{T;X%o~fsKeF$Wg(d?(|gdV_115x7vZ*?#oM?e zYjXK!uXrV)>g?gdR>y-#Ifb>w=jgb)tS9+>7E2w9>tu~AOMSjaaRud1M8+#>dKNQh zu=N>*uE~1TU!ywF<#LX}8?1YQ5WFL;&HjtzEtfj^Q#WDW54gHwL)Nv=TT0Jo(>mb} zUxg_vq{RIDGdSvaRwd$`LLL$+ry(|Ulzfn}LbATBBd4w(!25tpC|<{2#YKwD3qV8LYtn9H!tSC`(Tq5HPwGQg(2=UI6MHWlJGZSpP;R^ zp{a-VXx!}&fK2r30}?BMWgvNc)d9*@7dwXfuL>!473CA&4Pd6$x!&sO5CwKEqk}%j zCzvor{=5*y7rjXq%?Xqg0fQ1QPMfLLF{KH-Y@qG^kym`(ztMO3y^&m6c`6*O6{G)j zf=qEwVZy4L#^bOrfQ$2%S=MrP_1ajE7WEe>>Zm{?vQa>2*VLkK4oDRllt$%C&{1_R_n5lR*fP?(5L*~1)KSw<84&TN4#Y`NESgv zuYOPMF$MuMeP4U;RqfETPTFen) zKXxd9PKC#Iei4G*(Su@wK|Mh3zF(AleUPUIS9}uKpB3)S&$;6Ezhjv9KP0{CcfIpi zb4GflOdmWcpVv2);KF}=RblZtBBxw_)UmZk80tJxSq^>?0XhhpUO&$r=G~2o!CQIt zPtPjCHT9S*4xeWnXY>TpiYf+p{us!+Ua$F$r(WU~zL4KM!Wd-YIP&_#e2yzK+UfHh zaauq#mJ-*85mRQAK9Ok4i5*mG`PcSSv>TQSGArJcbxEHvTCIO}-c$DnsxCS~m_V_BQxp8=Gdl6rE1n&^^I zlEopCm8?O02|pdo!)ovCkW4U)_Xw3q!%XgGru3gHYP=`iQhsw&SY#bEPEMGfG+v?H znH!*g3}Hg$8sq-pr7Y$D_31M5B4dhgYx)2t=w=LS_zWNS@m6!~gl9c`Sk2_5F(~Ue zcfIWo#i(!^Dk1BXs3a{lHr8{!w!HD>)Z8l-$k8_td&Ac-Uz3z4Xz>znp`WOQDR69? z?5PUPU4-&!oqRcS*k?7at9>|5zPo&ena_K8kr3nwo$gZn9Lrc8-M}fTN@^}-+%y1q z7!mU4$IK>^gA=v+9Mc%=(eDH^#YNtI^$)k9{)shMI{T$yPe)s!xT@gw+9Nulje(3N zMl+K`e<$h3jhL@qw=1LSHcz}tTQ3&kRK*{BzL_U5{-G56&+ecQ4>xAq`oXeq*|~mA z2wYF(5Jh*#-l;7yX9Ji!bj`r}5@Hrtq5QYBB-ngwMe}rpW5Gr{Z5*$W30uSmj?eev z#dXNJ#k}rQN&mDqVm;0ibMfiHnLGvh*K*f@ zkg&klBde4gy%2f&;L}tt8>vqe#)0`DyAN8WKGlFmET?##)g`gKXEkJ)Zn+QZ+kQ3h zu|&U!?zEhUaCi1YRo@D8ia`m@)XaQP`!{A4kYvuCiiYF#yMF6@Wg*?9;InlR@D)sa z_K*N87I64{7IVj*#{mOkWc`+Z(hAa{OA$D#mTDz?ml=+v2ECWov2hM#@(N>^Cb)%? zl1je+OJI|ALiC?Xa*vtH;sd@Z=IA@@EHT(iABeL_`Km>`qdN!E{5HG3o)08fSM;Ao zttMzw>{XT^^()S9Zj7dSOdEPTeIUxQJSMj-u)b#}-$ac#SfM&o9l0C1xP=@iPxnS~ zYrA0zw4yaZ>Uiegkb0-p1ET)s>T@Ep%t<7ZK04bvic-H*;M7*2MkyJ|8|8fmC=;@7 z6N-B0_T``NMJnl6-hI}9X6On0ezs#jE2*^3FrMZPx3G>%2VJy;Ok% ztG#xfoXC$LM4_7SOb3!=Wl3^stW!!*BcCwS(Jk9Yc3+Z_sAEFFf!*c(~PE@YrM9`L(CTZ)j zs&TT%BsA|mYYSDM7<^KTd5nqyfDQ$dv#6i1bB>;Fu2$7Z{iaIO$U@DWN8h23*(p;EPy(4 zSlv@-7&wId^$a`gT;PP1lvQOnDUXvcF;Vr0t>m}^6Y_Bggt&0WC z?j_n^eSeFv8KD1>68rcTeob`C*7$6PU^PIC`fCw4rp(i z{tfb`OlyrX(Q}{3+>v!)bG4|j!Y*(cPTX=cpbL1rhbED{YUo=SnhFUQfT#zM`;=dS z;87&H3REbP4QxW%w)HHRNWDwb+{Qr*pDjq0AHLoP9dVd5>pnnY zN|^^|3X#K}e)1(twBXSHbR%~ar$YiEhJ4Withcx&fQuPo*@uUxr+c%(FX*<(I>I&Ee5yV*0Dwr?kZWw$9mRX?TGj%Iw>l6v_nZ#IM;TEWtl)k-V<6TN37(2%gT1l z@3&7;3+Br`9o^@|FLE>(k+6yvez>*+#QrdmY1{;l$axz34z_bDUMjq!y9Y|$bfybj ziCLtfu!PVK{T`ELt~MlC!9PHPjH3^tm@K42BMxJ+0@?g^mNla8A9mBXK<~C=SpwyJ z5$yNU3vUk%-l;|-IH^K3LE0N={sizxeVyZ3LMd}+=SE2@PMcq_J@*g_z8QO7IjPAC z-PxJiO!bDj&T)2*f@<~B8?{bEv_H`T3*z=6#OnNoWqvXMN7Ad~(Cv8@*Px6KUOv?0 zYdPhNdE$c=tzs8cAGE)~)oExm;WQJP`SRQFS`!<0S(2ZbNgiJmzZkI{kQ#(f2RTax z#6_C%-%g0ZZ+HrTQ)}iAR}xR3X#RflB(xLarQw+*)rJ4vp>fsKH%h6WVTV4C7ZC|m ztZW);+4{+TNg3U@>7&Q|iEEL%B|?joxnKlAW1LWLKeYBXpIzUc6Wg;ywq+2eh4nCV z2Wq>BIxnt23J^>7wI&9#EK;QL-AuT=TD`Zj2}5bONEZ{mzXct3;1d=X^ka|8~WeFISG2Mr?#ajMy@WLV);`j1&{*_{bqQ> zgT9Yba=K*xcCEb85e8?pt z+FjfVhZAVmxX&OqzpO4~UhPMoINF|q4ljKz#qF^%{!RtcW(t^buku7^i5B}l= zBc#IMf+hxuM;&^4^iK;&=15J#cr<%P_OEC;d}!}Xt!LNkMt~;$XyrI;#h@c`*Yjdo z=XIfUGEe`jn;@qEL|I^Pc$fb0A=OanwOM6t{x8nq?@wfB2~U?!t*&Q3@%?Y_FtR#m zMa=J$ZxJ~b_V5*)(-U%PaC9Mn6#ergySIp@=GX(e(AkMYjiAcAIa7g!z03xFkHwwZ zh%QEjK)XcWQ*fu|g40(pCX`g?-QWP}_a6~MLI3Go1p(ALxDPlcY%!hen2e#YoxZ)D_)|7VG}RVA^>IoxqVta+3uhsWh<5czE9 zc&Crv>IAcSJpK%Kv>a;s1PETewr6G&yKnxW;=Vw`J?4oTb@EM#(Z)6}O_fJj|W_2K;@-ssQjOY*N>GHupT0z1!J)ad3Dy+b`) zZeU6vGu|_-cwOA|C7|HxH6hOMw4_CrBm1-_xx3BVE+iU^lM!5LPZ@jPPrLIk`K_Y+ z)yl!m^Ok>?P38cRQ=y0hzMqx;ygk_LW@g&w4slBU$0XNeU_sUl3c;=OUS6&rE?Zr~ zDO=*z-X`O@OP$7c7LRId4U8zLjJS3i zA^WBs9=g4}BEd-I3?qE-ANEuA^Yadk#dZs&@gx3AOUyU5)P>-1W1RSmExDW|r$9<% zGAKT8vvrLmk#-%4)l~mw{Ie2~%pw6{2b}QYW#;2OO4{%1T$p>&H)(1N6vT1> zLelgb^ZuO2Dlw}P&nKlt9j%MAM7%rq{`1&==Fn9jc%7<{t&2!BJlIVJ0)Ccf2bm0O zY}=?VTvo$}cE`wmsBc}Z+Q39s9!>;C4zF4D+k9W@?YC0c1~g>^&(1p5jcsQWk6XO0 zZMlPM<5RmcIh<0jjaZlG6n_~*gg8nfztY_F(M4E&^j_=c84TmgvQ6U3=iuPngCF@XRCq=Igr-VT*4Y9e`?}(?#7`i%(YmI6gC7KPHbzDdV)@}p zzaew?V)~~&ms>Ym>OGDB8-DE$|Ir3AYvPv!zqYowuqMIj9v~!FElYF31i*P(v;RJo ze>!*uHT7U*pB0OsjNge6Z;8jYpX$%Ij|PS-jXWVLuZBal?9y&bvo!Ouhfi&u{}iyQ z#}}+l)S=zeS*v{*ZBBtPMucez7#43=z9@(^upoV6DC@_q3Y%ryyDusG*_^MWWT4nn zF2R`*4m#tI7>{nKc5-set()HrHBp{I->d!(P}(+c9O-fL%Xc4V@wQ_kxQ+Y;rY88G z1IPb?4krZYaOBYOr@lwf4IG5&2FeT8^MBtEy&xk#AiunRenCUba1SURu%Pjg@%ue0 z_==&Lk(|Na6pgr@ERYdlrTMgljj0)n6NnX~G({`ceF{<$CL9d?Vw43Vs}wf>UUd+) zrS~wob+^;MabVq8dXnix1K{+Jfo7d;Tn!v^s9UT^Jg90{%p_jiQdM&hNIK2*PJmAK zO%Y4KZzzl(8DOkop=B=SXa)s2M^Mf}f!eBY5QCUVRQa?Jau~T)8*zmB!vtj(H?jT% zC%4|W>z$5Pm4{RniQ{VA0s|#CJ+^|B!aLupn~K7oKDVBc)hVZ++NvF!C0nhHUsJBc z3Kn>h&Q8P9Q+d0FZW#Y|MMO$7EH`-R;>aS?Ahdr}>vVcOmgY~^F~Ewg%L;pfIRlzZ zvnT3M^8gk;dM&BMhnKfxp>p(qQ<--?8*K)6=AS-nO*L}eke^&tol%MZIMsJ(oWQg2 z&C^F@c1)a^z}*1HzMe+gz7P<4Pr|oZSxQ3;V30+mOrzJ_@%^z`N7L)0pwD=dHiBQA zse5wI!hf^gBJuJpC9CD?<_+IHa<1KIn_Eh-O>VT^Uqm9MtTI$VoX?K)Viek*PQtk;$^!PS-+Ib8;|cc$5kg$^;^qx6Gz!vN5GgdI;R2VVpq=5^@*8=x{r-i zdD|9M)WNeid&Tap0O%q4=K%}EzX{|?DkvN?qez#k+CpU$i zFV6#gv!SgkDpS8oADui?aA|Jk*LEF2UMs?Qc}EvyBD2EUEqkJZSM}ajn#e~fhDFyn zxLmmhbV`?Xd`E4)C>&YTjK^Py+-n%kq zhD{sNpUXt@mE&Yue(8wERr%Zxy!~20ry(Ys?6$O{QMXN7|#-{M(75c*<5tLo#7DE@&Q6dIg?@ z2qH4dn9iEPGupa&|04YMxjwpvVsQQNl30?o$EFYd=GJ_vMyrM4|UO`RoEbkO|{hRQv`aB=a)|S2J?XU05y*z2YtxB1m z%&v$}kXA?OtIDAhNiOCX6RC+WQPLSY0^R=D@n*Wd4_D@i6Ln#dBKFyb@iuhQO8c5* zcHj-I_#>^`TpxGa9l^BHoD(cgI_ZQXy~f2TrOcIOTvMv&eq9k4<#2DU=+cwi0jbDf zUYfF1}CKa!t^iIbv(?d5dOw*wlYRP86izERaoC=jXy<q zoOy3i$Z@I?=|<@g453h2mQ9X7af%P#|7DCbb#EI%^6EBWcR85fmJWd9`{wz^Xql>l zU~0#7r3mnu`a0bzo2`p2+{C*W6cN|zEV6=CK*zKf@^4%$)bG#C!%d#!m#I;f81QMD z@5|l`L%*&#$YoP0{m$Lff9G%r?TofY_cqO7$_Xgt>MpFHHM^2x$_3J|HJO!?-orR^`penx*@0ZNa~m zrJt=p>`f`2+ULIQqQG?_<#y_c5L|J1 zdI9-pAAa&RkJVGssMn;QelXrYHXM_k+#9T1e7O?i)3U$y-!7#YNgYmCURcWK$Qq}) zkUvtN`uOb}EBfp)-)G%TE{T~(l&-%vF{!p2J3lq)ZHvpQ?Sh{keQq~@HjcL|kph*WbLLCy4-Kaw zwMAim?;6NYH(hUbn}_dwofTzv3la|BZHJk>f5T>(Yc5AoCbKux>L5Msk{q^On+hCT zR!OiVJ^b^Zo{F-M~IA;yFFO1EY0R?Sn;q(_%YZ_)FXj=DBIME6}wv6NBc3z@-3QFHj< zoynlZzv*iJ^6hkY-K&znHs^gQCl3Hmj11oXJ!u(We_Rf9S-;Y+bVe`>z+vFR5YvL* z@dPGv${G^X!8A^0t3Drj(N4kR!N#O<#1!&m-a#cS7CF3jV(*eNI=cE*9qg9HpTaX5 zO7fN66?z8Usu$Ky_%mPS>!_WLhx76UObmxhXy3pm~lK1F&%tDsfT?h&8%u=AmT{Vi4D;r<)~Po}gNxUFsbEs}9T7 zFrBbMUD$%BJfC%I|7VH@5(ptxle%k=iJYsv#Nusv$U;0d;X4c9JcH%;0x&siB<|8MHQq(C;^K*J5?QP^M0weF>TxYM@xz?M;(}C2ail3`X$zCSP zu9R^cU;kit2Ww)_O-LQ59dyk6{caQ4nkKE}x2(ncB$a?f81K)rp62krOeYF*FHIp` zVDRc5Y22d2H$YJp@%@c=(MWXZx3%{mN6D1ULCeDX;uYPlbV}~}({eDNe3Yz2XeCD# z>O{X*<`bcCJ|v~RFxei+C~Gp^KJl``Jl?8YuxcXqgY&_hHZAMovVX3f@90%A%#aAP z5DSbn`RCx#uiYWe@l-#hLZBYYp4l6AU%;8!pB>rZsb43pMLzEYaP%XCdMrOxf9Vlt9{!tQO98c6T&lI4K zy8JQA^W*P^|7?Rs6k$h-aMQ8QIg0}_)8`PWZ5g0yo%Ks`zkDqusYTQm|=!o>yXmG96@@@S?Az#G*=?Ap)W_6q@M zLr2`vbA22svIep*rPZR^XD>aqHR8H!-a}#v&)sD4k)Z;lKnMJkn6|LT#q0-&bIa=W ziWuDO%3P0X)Js4rO;eu=0NCd#N^mZI#nC;boCf) zQ9+&pYB~B^z|Mq8O3G7U_;2Ss@U!QMYlTqQuafwc(sGi6J%5dGg4dot*CJyM)9w(R zpm*ZzqO@WTCPiO_<$f1071z&Ii_cL0)ZT^$=EUnq{|kJ*kzmI1cl`I6`u4l1>L6a{ z=pS!CF;;F#M)QsT_kKnh%r=lSl9g%D{Hoq#(%az2QAu`VFn-p|Al}%fG2V;%Ya&gy zCDAm7AJVX(Ea2yj(xsWKBbPSZpy~n>fZ(z@(pZ5<8&s|G3FhNR?sYYiJ6F$L5jl1$ zq}pMRIqAeVlUvT$R#jTaMf_zz!1P!E0&pjM7>Dm+ex>X9JGtwgn1!dRHy1w}^ZmDQ zB@`$XiB`!g7;Be7JK_MiB~f$QSEOrKMwPqCH_iuW(@nk=Ti3ss_B9jm@?FX|;Ez#T z$k<#SIUld1E^$XUBrBLN8Ri0+_W`ZX3}p@5nVv}G6PbTxirTSmHCT3$VTrk7o=Xz* zQ#9xyo&@TLh@GX3{KOe9Di}> zwQ}ySXSgO?gtQBb+Gd;#mn6zH9;s#fJGziUxfWL^>00(K-KoIYpW{BX-*&!epw*5| z6+14o;8_Z#3N0U@R4IqMeivt7^b~0_#?yxqp~_1i+N*xk;+@L)oKrwG?`7HyZ_l_( zY_(Hu!HmGDeTkz#Shr`E~dlT)T3enJIyR zCk5L%1>s!0zmGt+klv!Z5%C#mDJn=I|cJZ~-mk!x6s^%}$bI+y&c@oI8 zhwAOh({X;MX$Ezg9|F_q64%`Q7#0b&6_yHqjHijFj$8?^7qz!xPXzBvV?ZVZhW7R% zO{(5E31!dma%Zg>(ycBQJ&m-b-&No~imhxO%9y>2i3!~p{NzB)Znn#UeVt3@D}>Bq zu+d$sEMKNE+{`RQjBU3L)+{vPlz`VPI9M4i62+ohL~8!q;-P^bJBE5=aVp)rCwv(>ZT!fEORDtvJ&7jwJ%91Y5b8O;()qOXxlHrRB1h=dNO1~b5l`|)^-N_X!wUo+d}q+q=CcmK319^oNLtBq{3) zePAl(&@5oJmYSK93%7>TSF59I5Nhln>WQOFuNT6KnFOZh;2H!x?OY26D=ZiHxq*K- zAD(`?*O#E^1&BV|3;O?_eHERwn30U$-*~sgD;)OmdV{VWcLz{k5mQ!$)C7k61SPA?Y=z3*~cjJOBzDMCHzozPm1`pnjriVDBOdb z(--M$1mwf5F`ibKpPPgB*S4+(K8NzVImKFY7r{HJHIkj>`(OrM!T`8cS}JI8mJ{>0 zy?pJ6`vHsna3yKKi*P2$S3j8 z$;waQz7+j%Fd+tYRX^#@IqVs+e!KKnsIBMc6_yeveX#5Y!P^6zlBl1QR}$SB*bB*C zaGp>MOL2X~QOYz<={Rumj6>M;{Iq1}fOWOD=?6cDyH*+mzd&Z+XKr_Tza?d}_KYDb zU6`XCjcBM@maSr3d!Am7Ri@YvMUwiOPuadvx+PLa(Fb5UQWC~^ML z%FBJdWGzDEFRfZp8@zoeOXO^-sqGR&46mf$KybyEsqdS_Bt;1xjQIN}Ogiy}W50s> zNEySq+l}kDOZh{sz#CZCgC&tiur6%9ik#e5=6^KToPrvku#aW&t!FI7RVYdg^Y< zC-H{#8%oLY&F`^`qqGO6X-b;ChwMd3M-c5OAD)xCukph%Z8x`z-ksa}w2_hdGaapN zsa4tA>~xAIZekNASHQh16iL+OsfJsc&U4C5 z9&l-G{W6(Ow$7UuhxX~@KIp4ferGn<6eGXX{YLv0VjTbAn{A=!zt_ETXqWKv7od|kFgJbudgkOl(*K96(Av)JL);OpS_NJKfuHQ&LiMS- z>TY8{*9{ScC$mhgJ}!;@?Q^>TRq-ivFiyUT^BH8^KyCRdwdmQnV3f7}zNLM4$>#W? z#eq;HJ667hX?2TcNc(d$_DK-IQRY!nw5*#^H7`H|@Eqj|{f? z&h^dZSXmyqbDl;}bmzaSmAUV|j;*`aBLeYdc6VchF3{Fx9sZ0VvV@gNFwKQEuyTC= zY@mGlB85QLCyqFN@4v#HoDn6Fvm)Mc;uC;QfYkj?(D}K~M(*hK8i+FBPdtceqEvd$ zOad;)y?SjJh_wAwz`NCanxTZK+mI*+vOO~q!ijyKNHCf-u^IK z$4_&k4F*NdYeZfMbtS%O(XP>Wnt^Za4fjFMSw+(<5&eSUV4b%guwK(R^9B`onP5pk?&H*!0BkXTmA=4 zlUGvR6h(eT(dfccih2^x*Gd|l$Yc`F4b)ld0^SkypIY1&M;M$w)+Lh;*wBuvY*HTd z21NgRL&zQCDdD?hd%hg`_xziIZg-yTyAHpk?PSc1ZoSH#Ny+^?`R~-_ z>Bdt8w-Edg>{-F=D8c){D`&MNWYX=7)9TPAj(;eZw#eqWD9L@dYuR9 zy9FfAaDR2h<65oIPU3c;m)nLee+VpnS=HNNd3010H2%XFG?_Yepm8U1-@XBQ+#y2R z=SJw@d5SJpXn~S}1`8$Aaa5`f2DG~}Ou(ttsW}rzw^&ti2O&LR*aH}UFRNKpwEs9+ z-`HuyCEbQKRAsb3*dcVc?#V`5hO5Rp^XVgGfW_m6fsk!^s=L}EoRFi2D-qaZ^tJ(a zeYvg7Q~gp!o$rP}|GT)Kw-b6y`p|`#AJe3y{p*Fn1s^p{15?UIQv&%k2FGQqA!t)! z2JATiV2p$wgq+zW_Wy`_tFSh{{(BoJT8bAa4lU4@BE>bhYjJmXcP%Z@;%>pUxNDH& z?jEdY&>+Dj{PTU^>$!eMlg!zkgPFb8XRUjYFki}51|Pi%-OD0>;quzU;}oW(;~2Ba zi^YGha#ZlRqJq>I+d!9&u6rUK;w6k23u6htW=?(3-?NCmiUo83$!)3S_)%?$R%*Ow zobP!!oq@#jfIu}$mP=!jgA`wM(pzde3xBJUB$u2(p>rA&{Qm9a%asAfahzVx&oG~o z(!dUmjnk2C22h;4a}ZCl`&RNP)2EW7{kNq+ByQR)ic7n>eA27Wi!)ud?z&B5oEbkb z+1HGaS11f$GFNNj9B~aSR(33urjgpSa}8pDvjnRE!`#tY-QFQ7csvGjzqK%rmAtdw z!JFxlQ@Et?El^ts5lyiFD@8VQKUYvJelkl#O1{Io+C+TWMrcP6*KxDtFHt5mrvVn= z-LR6xdE+P8^G}#;W(wQo(Mp{hj_w#3F-#TJ^kQi}UpU$<7TDc8f+}GDyuM;hZ(Psl z)*5A!;Pb}q6`t8;A)d0+R?m-?86qn_N!$V58zZAhns@7+7l|S{?APryv+IxphoE)Q zpL^TmtTgnNrD7Tw){Z-W78!WNHOY1PDv+I_L^-m z77O)IT*a*e#PGmC;}ZQFd)Yy}=daekJs)RK=rqo!WQRc$`YQ z!cT-4eH3|qj%%a;_f2p_4v#${4koL30?-GObKMXJWXTGTMkJZhZ@O-K-;;>;5(@E; z{2kig-xc9^Nc%B~%<+3T^2Wb`RHfUUb!Tl+xy^r~vrBj{NSc=vEGFz1*?4ih(*_pK zjxaeZe;l9x;h_)^ySN9!I!KlViTL=+PC|*~xkYO|E5>yrhRwtoM3X*eT+U3g-k7eg z=Y3G!uU>7$E;0-`_@}Epo{Q)FM-%)ibD|*=6Ei`t6M`bzi9h#S^ak+$){au(@$M`wQ=+vTPR14t9FkB^ zf35fGS23;;Ms{h~UK)nx*&c%$Kluh3*EP}hC9NLJS(x{O%m6I(LfuJJFH~EuTpkm0 z;2u1|p5~*#R-;w61F`T~zgT--kbA(zqwcz3g_7L2bo*a;xaKx&j0<%T9dAb7TQNfi zg)zhb8oge?^ldQ^E-y+l9!5^f4k|HK0)0MHxIix>uo_tgn$wG_ugePL6BS9G1X)N9}!soweOuNGqHu{dHzx2>* z#0=+!!`EouZ^TTMgSKiJNKg6FHdq@DO?HBs`?Oc1jfaOUgFJ2q3o42zcBssCEzeZ& z#(|VmUY#{@X+NnP_>+9o4T(cUd_{mT${c$MQ0_Ncx`bl%MM2$9RA|ZHD9pBwJPP9& zmk)AGBVZ3UpW`w4cIROi;HQd`F>KL0gH$w|wSwnK+1Du9PGUCD^5z@a$J31V`ldH* zwVE^66whYv^BTKy3uu{dmvw9_brJ{*?jncm zb9e)w!u(j%8C@}vAX4Ofi7@ZuMj-I|y1ABemf0UtKd0=}@2`S(h?Z37}V z>+Z74FY709Q8q3oHFn7>2eXl0z^*jlStm-u){7%x$fxeJPd2l zWK~GLMbFln2`g+N&}(NNHSbTQh1)1e25xL>!&^nZdIQV*{VC5LAof!Kmqg4^^czO9 zKivBZ3%JXF%bavQ9~6!5Y@obSuP2^P?N%`yuP>gxFCHBQd!01YR2T{-w!8;>(wmJI z6j0WNv{yf}t{=<~4r$d*u6}$Mql@-qO0&8X!%*PBbA1-MDnrrg^0ME#xxIP^edC6C zj(Q5e^GkOY?QxB%GI()^sUn?(?c)@fPEhEaxmLXqKNFu3`0d_2m@MJispW?y5lq{> zf<+udKVW4c^3Ooh-kNvts#3P^@@bD-#|{~uA!WqC=@P4xv9V)Pg@>}=$y7f8G`=dH z&oHKq^B!EG!?#;2P_@{X580VbM=2=T90?~k z)}Z&>pI_fuG}PLb4ref~S2!`P>-I~?>2=#KwByq2Z%XM6M+L_YYu?or)86@|$6>q4 z_mvLTBy^15Wg#PoX(eOtkhez$I!%--i8TM>iCxJqdQ%m=X?v?0;;&1=ZaTf@*4V5czA!&BNvS zEc8QgSOLP`Z@$@FJvU~A<^Q1gmiG3_L~yDRFK*9uW0F7qEhQ-V2XDJb(ng&j3f8KA z>`O54BWQr)0#Y&M)q%xIMP8fKw~|(d{C7{x_KoV-0Y*Es%z&0(A?piK(p2?O%G36o zqRs6X%2S8jv@zc`+T3`-i0!N)zZxnyLsSD6r!W*ik=bIW^B@0c9BUm+VbBh^zQJhFg7`*i6mqP1ri zhqRl9mDlFNV%7FF-7?dzq`AngD$ZV4frq3o*mDY6js9T-{^y8d^SNp_?Ta;YH+!@1 z-8aja?1-k*-p90KkF%#3f2moKtQ%eJWr;cNMM_N5{O8u78_0026C`O)S*+oEyXMjM zguxl}z0}3>{TbEL+|a$FufFBu^P|ZYv`e75U#Qf6)k1h5%Aq%&pfI3ST9adew{BRh zwMjea(aj{+boljjBGqQ+Bf$g|#J|>`#^cfvZWtw2cC}b<@~H8A9OB-bd?i{or4OM^V@UvG*Um{+ZhO zYw_I8EBX@f*}rG6^bs`?;WEo7BuMGLo6|hHRx8H$vfH`2>FNBE8{pw}qX56!N%DqF z0`8uMoP@jlA+uW^RMRdQqwQi@?Q^*^w zmHcmsNNv}2huv+jVKN_4Y*Lj{1*cpWG~?1Bmst^2kCm$W%!~EO$3k*_JMWLo7OuHc z%*eI0hj)Sr3o@6q)TXytl7a(_`>uCCw>YHc*USFJk2Jl^yW92n5g*#^Dn$_&0+$oF z*`4bNl$A1O{@rToOm_v%9Gl~k8*lIVi;B+?9#l~H{#VuD&f0{GyH4@1R(a-Tb^hkYPNqU4vH>BvM zu$3=9=sJ14M31*fpKS=kbsp$^oo?pfZ5wVW}bJ51+kG~Z=O1vsCvmU_*4*E5B!uY1Uso&nAkr*EMF`TjVh{z0R0F@u5>0g)G4bSN;s!5)+pw>;TvCGrj~=FXi&vg zRIZ3i$KT**M4{;Nz{r>a$fNgZsIz90uNwT$2$#7fd$V(Zqh3%br!?>=rb7Qwd_y*N zA`?AS65TAfScc7GJv-C1?>9?~JkMhvq2&E9vyV1PQ|*;WUdodUH1^?hokRYajpX7J zSQy+*)vCBff;Yo~Rhw^MuMO9=fkFBBpEI)vi>C|8;HzSv9FJ$yeXM&IEa{L*|InaT z8+D>T6t!K<5B+2D&Mg=O8p_l=p&ZiM3nvAtH*?;SD2&hneUK?FOhfVB57`bIVN@Nb zkZ3VzEK62RjEKSh48=$r|5Qz3Bj zx{W0n0z#Hf8+=7t6pXKXIgOj|x9c#vTwUv|uWhz3T)G1JJ?O}$TEx?uVEmr5Pelre ziLcVZAOH6HE%#OjEZ1m#w~**?Wk{VbC{X)#srfsO>ZFhSi1Iz`W@NL|Wn70WJxV%b zN-HEZnWcU`!_cERqW&3RDFG0qp`nw{F%57iugP{A>W_)P)3lRxGOk;leXb9lcYaJ& zY2{I{`jfg<%LC7F-*vRD%x4&R1LYhF{A0Hjml+xikQsXDAD&X9|}T8 z>`8A@%0>tbuUn@7s|c*}oc1%a<^H5|RB=qgTuoZ$lT?624BCMeU^X)rQ1$W;Ai=^!2Pfg7=E+5eQ_s?jWf4rQ&&Qn4 zN_HzCN`4M7SJPXx`V&miN+!-w$606Rt#TqJ2}O5r96#g4y)#rb$t!yXd>2u+ar7!J z1^)^{?*h#QN-FuLRBPdc#iZfp=aX)x=BA;b3r&h&)ov$JV9gwG@vU^1SXIgrt7A{B zZ)KFc7$)7^upjv_<5*c}BbG1*)e_k-s!qE~#NeM>yX+sS&v`ZDs%14`XH!5`xzWGQ z!)K=N+2UxS5IJ&SU+LVhAY$dD`Uc^!A;k#r(rEOQSBfIr)b)A zRlid5nw%7&F7FI|Oy$#js}##EY$9IiLWu;FM{sMrAO*K)7t zoW!|Dnn>OqC{2O6TPSNY)dKXcD)tOG78`fmkdKi*`4dTxZ1VHH;ZHJ~uwL#{PG3@_ zK0}2()5$VttE(@(o)XPk6(2^cJ{UBHwLE8R8OdUG_A^`O?M*}tNC}q37PUz|Sq|5) zJ+tB2ck5h_ZZ6yQ6$86hSgvHn!#(CDD243bBT+*XVRZf9-&wfA-J)XxP_H2Tk9*>` zU!v$sjPs4(OAAw8z``vr%#r@3vocO$_jdfNJ&?IV9zv8Sc?9CPzP#|`guXQpV_!DI!qUxhvGuZZWMpsq0} z>tmfIJ!~=@sv4;^$7~-Rv)Ud-8r}N*)V~A5K?-5Yp@eEtm1Cw>v5?be76Ln3MS)dN z;&@`}pS7#I@Y`2^v$R7{iI{dux}bGMou64cVe8kf-tWgKGikb=^}u%=36+ImBc2b< zs4&=V3H+mzt6A&~YaL=;Yw1i4f+Zcgg!knOsHOPH-+S-_KI0NoLmcMl`o-u?o~#Bu z_Jb$+S@pM0LNea#jh3p|?Z)&oPhkh%()b|FzU_!Vr&qp@n|-yD{qhGn;5e&FWaIwD z|DbCpgI`9(q4XcLqH&QmytHr30&i%cFlqepgiW`^d1ItZO~FlFsL!YTP~hnlE0D7C{(D$rgu=E`X*8gJ1m7EMQZK ziQnPRGPV}$R{Kb{AJCGMm#)fZ@X*K)R!H5P$|jfY9PEgN1MvfDHjnRWyZp?^M3O&z zkY}js+J8Jn2|m&)xNa}IVa5YJ$E%=WW{m%(M`3~cHRiSIA#Ed5=SdOsbtC88X2n(2 ze))-JY`fLANWm==>wh8xClKbD_mis~-g0i#%`QoGR(| zv+Bwmu|DIsT)F(AYI~_&n^ci=neYnA-U)Q?G_b`NrXE{ezI$4sL=s9UrQ`w3e>GC4 z&xV&H{d;4=)YV5LMLc@v)pz2gJljn#r&r5VHpKPQXA=?}%nvAClRJyP&;_Zf8+St5 z&k;8F;}Oboo)(Hn&L2p>Imfp_ntq=(TfcUktMl^H4-?X0+Je`xcz%g|7NrQ`_&h%@ zfX0MiI-J1XXCaS=Ts?VsNQV{O-b9a~)qJUtZGTn`e27M%3n#JJyB@*e)0yI!Sd4t1 zBH%Q|z_ERjrP)mdVT)UV5;YcNH75aFemQ z*|aTh2`*5kVERE8nRUpykQ3*9X1W0Jd4+<8*(}xA9JOB<`ML!d?B3q-=3BkKbS_Id zpxb^z1=)ghB@uPEP_53HmqQ&iihFxf(hX25ARtC2mdir>mj4N;wQg0D>|tP?(T$<{ zXMKa5=VW19E63alk+ZIDK7tD@buJK4r^qtQTj*tMZk*qTS{(R+8k~lnci*D*DJdTO z9YTk=#Jt+ruk{MmhHOoI8it}9}&OrKX)xEwBPlI`0EAOyy1h-~#~ ze@((*a#8bv?}Rhhj}er{B6^>t|GMa#&ok;flYb>_4wu$5(v5lCW88~$p!xKy%*9K( zqNNG`G&w)}C3cTBl<&<5VBoc}w_@Zyi;l|OiaF56UHIh}n4kK0iT6%8d(%VugZSEm zeXr=4{&jZ9Si57$e~$vjEQ!SVCkwAC*OvdH7%tai6t?#Z!TCz@WZ)45%*cEL(8>bj12Z*!S%GRl`J& zFY}>WkQXic$+1pd7UNfLF+2zF$!U#(KraY#gkx?vbA9orIyTM)-%Ry3T$Em1evZBX zI6^r7WFk#qKl|(+EHlxNX`FTJ>xv|QjenW&M@E31QQVid5us)Q2*Pi81fOPBi%ofd5!m9)cj~3iUr%F$nhF0=c?MKxF3`grH7Id zW+|z;z0~~(zwJ^A>Moz9VgmXdxCc#$#8kf=PSF^@JoG*~E42pg-#o0Y?+)luG4p~p z0C<51b8Za35$CO-pN%gZV4X z{?q9Dw4tGoXn+46xn28i4!FyGI3q?uvqX!z2;FxE&g)4LN@C>$N=kR&OKAk+6a;Ez zH%_7L?ds{qjHFwxUj$f(^Zy__a|q^-hC2|oI9onbrzI9(ySrBFFHH#s>~1U4Ujoa~ zx_M92j*Nj!YPS3lqca?L3||x||NSQ>#;Gr()uOnM^4r?7bbdKVPf^^G1DyZlKwx1yg^N^fQFr6COQBIL!H;-OuiBgM9)9ZQQ%~ zaPTZzozu>sSAX65|Ji$`a&8c1nB(sf$Qo;$b`jaw8q!>?aD7yFlox-4Pi9R}Z=fnx zJM-}5yW>QGB)XH;vH|pM3ACw4%H?HHGc6?^#@j24j66;+aSP@T_8g{v0c%wR7z^5y zH5Lat``&eT@5iy|w`!?|&IbZyuF9xJoF?J3(||w!t{84lUE5e7x>e`pzVt<(*=SAa zAL^sb2KCbgH#f+Ou#|LXQfF-oV*Xuk}$E&aChKyKjfY7v1P-3OavG0Ax(aektG$wV=;DYXY2yz9W6L* z*4J}N3Dv(N?PYk>u}K0H3dy*VkP*kZA+2ScT8#cnQ=&1!Gk&9Hk80|kZ#%@R&vI2C z8pb~V)A3;&;0ix{jFZ! zNrM2-rUGAmeKYE@GLsn2rx71IE-YGYd|qMx8kyzY>@l!mhg`->$0WyQtq}}|@))x3 zpI)rFh2-A}&9K!yfv(%&F98$zT8`ZHH!TK~RkcG4Fy2{#>alNg{WME35?$5Zn|qXn zPCDc(?A!xe+<4?1^ixMI)K8dp`i>s3RZfL%UiK#~U5Bh^q&YLRbu38e8aKAWlZ_30_H)Mld{1;Qqq@@B1kTJX zHy&Fpo)<1qh+{R{y;m#GD0^*LmGwa~?IH_@_vzKR()R1b0>{(giOOGvVM>h4!!bom%p0M8m%t^$Y09fr7!7J53BX*{kA)(JMRT3+sx zPaMU6e+J<>bxJRBIm+kZ!f&#M`f zy``6zm##Jx5i}34z7Azr5gz&A;3Z$<%I#am5sYFW|6d{Edf{wm4arp$xhUQ_x2xNr zj|@1Mo)>o)i#;s#j!8{6v~OEbrFCPIQ-PLjYrImAf2#Qa4OeMjh^7+5u19glgjshR z!e={IdL#WK@vLZhK8x44eqc14O)R@|`Gpd6!|bSm`c<556VFk_Kt8P5S|F~UTXH@n zEh%d1N8dWmo6wI0`^78fLsI}L;XTL38<{ajDPmIIxEnqyj}E>~&Y8mgc3g(^h!}Kbfk2#efuL znfEboA#o5Vky`~g3DVmELl`q??W1;@gYjew2wn0JuQ;)`lVUg!7Id5=v2^-JM`d5T zl7@|DvNuc~=2)QsQS>_B$cmgEk7GL(Vic!;4kb>xdgV{JOF9wwVr9p#mt>dt2Rk;wSs19{epu$5`serG4$azp&{7{;PWF6<68o(`nrJk zFc8MYJKetilk=}8<>mMtje0>(Q{SOW=tF6bqa73jFhnuULW}TyZ`w}(*3m+najtTp z_d~~hv$4P6^Ufg$Vi=pX?<_I}@@dFDF8lmPf-ECi+Pf&VcAnS$nrvs0Ga9BcPTmC z;&@Vvrnx)sH~Qw>q9^+4>Ps0R;W^ey3wZVZ4QVjN@mp0w4Auq%?Z|zVVN`{`hTog9 zwhZnIb0aBSKQH9|X1Zl5vTQVlg_=a~uw|WybJBfSrV&9xag`C2B+j{Y7)phb;w6HG zCE|1okJlQiNulj)Vl=_Ny*9N}8%!p4LUQkyw-It@WU@c6pBH?^vm?;JA=*&c_>9Zn zrOuy&80PKg8uXGran~T{Rk5FObLAxf^q zZdrX8bktZdbMj(OTe(m?^XS|?^Uj^=HyHP($OXN6uscNWKcCz(gbdWl=15curNX3vFEBvY%JAq~EcbreWjYGX{-gyXYVeZ@uDQb#F%G#Hs7(m8D%Qac63W z&AKiWQ0vPw*7EUeDX=4;w&4^sWN~}+xcASE_hhA$zHsqL4jyM8JSz+;YcIAt3-NG0 zeNV8$f_Q%fo?OqZ*O16ix1fCs=@j47aks|haOc7yo7^Man>1+skr93rw&H(c6z&gJ zkMGR@tE<;5)w^atWiI2Y=G$_$6vfcH$21a91v9i(`vl&yRW2LsAE^+9JixS!|6N5! zKISA$NjpC?!mity>U%6&c8B_7V=~L9r1tsPJ=@fbFF-{eIPIzP6iA@t=5oZ|zdASKF74}+KO42YYd=hk`M1n;&up72Vv>PetiR_$fI$C%swfVjm5 zSJk&0UvWMkX5(k!(+B1=ZB?vR@)-Te5%TY zuva_&zB@V3+wADKr)eK_)XPV164RWo3o$MXRDAte20^iV*+@ZFGaS`gHSIw&i*0 z)t_;<_d_^|3$=!6gyK$34QHr_XPZo@QgUX`hR3aXdvYIxv4#`gwp9d!K)|a%T#fnt zDvGpp^u_|_Mgx{aR8JN6b9AXHi{|g771!jC4=rQe=^!7z-#KC_?i{9VYh|*PW>8LN!=9 z6Y$S1Ph4{<8OH~|A*bzK{y!d_g)<)D^Jh7aQ$(A0rNJ`;O2K~qCKs1vx|v42m$1Mu zaqo=VJ6+OuE7zB^nbB~3o9ydtq~s}d4QQwUeu2tPZD(%0#Cb^a?dFG#3XocPx;hDn zrGP3i_~!R~GHv@NRnju|BRPmH@6+?!_R=TNVK`>tyr(Qf(FUnp(e%2aBGeaZS^MwH zim==OIEdN$^0Q|E+`dpQ`P+1zo`0ENr2IL0bZV?l!meflM|?_rj6X81O(gKxAFD?V zC19Q(kST^Xl4W0lh|5qdr7$?qUC(@HA2VKPhny@WEkuVI5t|8;YB;TzmivkY0o%mF zKmQs*Q%Q7xdFPE3qa;x&=DT^aez-Ceos6#Xc(~%ioRqi`^!IuGO_|>U%P*dJy zUEtkD6pE~VPEWVIZJqKthuY${&^_pKjbx$#>OUlZ=DYDZ+|$yc{#~}~+3z`D-ry^G zE!X=QA<~)&De#hoFJQdSgKNr{*tm%yyO5vV59!;WR??^3%KBS!`n~tS39zDR3J>t4 zUON`gww3|a(h&9!qs)QqHrBLt8KOag*`IUy?m>6tOt_eh#QV91&UCzyuT<&WW-_ns!8=zavsmSubxCIa;rtI^@qf~V8$!B}|90m`gCKGuAykT2FPKjVxdH=W z-T1F;1QSs*Lhv8D6Y+(a6K}(zkJ@B1UlbncUQ`@=JwZ>e{X8*w1o6(02^mah5Bq6= z0Ky3SK}{~CT%cqAy?vOg8p*HF7rivS*G~f+14KG52wS{qs0dqH0za&{yPoaA=T})s zA0%2}&p}x!3d<6Dq{Ib%TdSc-Q4PLLzTlOCtz#B5FIoJ`Z-2@F$KWh!kx`!s4%giAWF?anS_$=#mY1?P2vthRqd}_Zrw1|FCyfXUA+J(-X5lSjP ze8SOw6K9usm>Md&esSe7m9NRx?T{_A@eD7`f(`cJQaPu`P7VO@45~%^ipFZo44CVt z*Jlbztm1h*!Hq#2skL0{<$GD$w*r)vsc%A1rgyj?X0z>Ct3}!?qPB)d35Qvv*FXmt z$XY@5;j>u=^t}EJQcle`GiRl2sBW1C#37dEEO}0X49BHiVPPg#*=BRrF**Q9@$&#V z@<*Q>|JjohclqJBpwQ{O1ddc#(|Y0q?Y5=L`pI88^B$JIMuyRG{h*wX>ArUX7betm z%;YRFsAxIpF)U)77z?wkGER>0L0u)9i!x(4J6yU2-pzK3y;1o||L zdonu@cYH1#twW8{g*;Rp425*kVS9_ zRNt`-;qE8OLx!Wr%%QGRO1Am)ZKe2&gQvuH>KYzg%ztg|U2)b6GUW0`AJcqCz6t&O z3#|t6JYLfDj2I4PehHu2mxAIf1cJvXRAf?#&EtIBMmqvYbV=_YYy2FcV^?+KH=eoB zeeJ^D!^}xf)+W8Qx8I z8|<$R`wQM>SPOdpIJDDy8z*e$VSg4AcgxnnGvU-2I5e}}zEYyXc3^kr0zIcSGn_S~ z*yV(n*atp2Hf*k_aoL_gbR8f(kG%X25QBXvbF!pb+Ps!t-AWdZQu)7x^-O;SXd>jU zC0hj6hcPSu%@iITQ$UMcrYy4jq5C!KUDUF#sIz9Idr|47!%{gQP0TYGSUup_!P*`F zMd+gi^Voa*)Zfj4n(74PG%L>w^48{7pw7s-QAG8QvVvh{_e7B7UWSAv&^0Wco8o@9 z45-A>^UGcs<3BlfSmVM*fV(DNBy=G7(CLhSgE6+Y`}0AiX?K`s&4MY|q&!q|7Io&} z<$Kfdh&2U99o32F16#cnV@n<1X*7i9f-%j%D{Dh2a`pH!0-{S{PW5Jr6DCDxfQPfy zcHEBXj-R`m5{)f7@J$tO#ZCu*my7>qZ+2uHldT_jU??bSl8XF`FtU zRxClnen;P^(=(+5PfxSO&t@#;WkGP`-$gQ(YPN1lik8!y7A=hUIP=4%|B5=XCdR%q zAl9DRUwIPJRY~_H#ox9)*#D-19r%o2<=Rwt1EOk2FBvr#e?Kwl8t1l^q_e(ze+lZ&BOhnTzL) z{$#JkH7S-@#_MJ#%6>mU4tS_7!%6ypT#PjcOMk!jy-u+Vghxq$#GsAq71y_n5`^yQ zjz;&fb#^R$CaA)ivM~$W+Y&F5+c2jV{>X0-v5ja7M^aHF>@bnJj63*ok#^xtbC~QU zcYkCRWOTA(v|f8JvFvA%8yx6*HgNx4B)v`MqX;e=3PIODKWd(M+J1fs6gk742(shaLti}{b8_O-7iXFslhm&W=&~^C9)bHE8~dRPT0o{4 zX7KfF9LbzL9ji^WNQU@GYvnJO zo{<*Rvd_?-JLr#>y3QuwohH(taosq!{aeh<;0mvgZtdVwIe^|Ej=>KY4z=+ zb?KYACN2|?$K4#TV(v^!X)`Ucp<0!YK#W7E=1Cp))rT^|i{adsYB^>WFyuVh9e=C< zQy<(kE6Ueofb_U=TtLCvyI(?TyBaBLsy3$i&M1B_F|AH@=SlBN`DO#wPZfD)TMHQ` zwCn76tS{UBbt~_&sYKjr^e^`X)3m9kD(2A*-<2lj^gqy78wbYW66&F1{18pVLf13J zP<;7_)`bCJjV<<-fixKAL&*Ta6)>F4MP=iAI?K3v0pUVOg&tKk9=Br35W<=?)HX*( zW20q_w?w1tEaEC75O4V~4cy7?n$Aedg+6Z%SsR@vZGr<2DhBqpB*=y;EI3K;gzT&I zGejthmpz-_Qqq;i-I`3nB~X4Y&6?*M%6g3}zvlL5unbNPNmXKN%67ofzU3yehb$8h zxHxZ~iCC^k(I#XWekRO<${!ASGYC3rRp-Cc$Ch5&1a}@6jYjg=W@;1|tqwvWR2hyER?)GS<04Oj!5dsTRF&+w^GQq=cIAn1yHSHTuT~F$*PTZ7m4#a{Hb)R5^aP zBCA|l)wyGkl&Sb5^3ea){WsfCw`85+UN|cBGk<<5GRAOB8$7k5^GR9AnR(XKjF@8k zifM$Ylo{hngAqKkUD2cQ;nXLMZeUJnQHToUaxwTtMVL|l0oNYmc3+#+I! zlEAEw08x$%0^sJ11F9`8SyzvP3lw zKmP{Lf<%wL>rip7VDx{e3?JL$k>A$?Owg?cu>hnf{M_54O_hCB>+Gf&Gv&+WXcn}J zm4+fHTnW#BMic%ty5|2LkgROjKuybMvcP-lx6crYpUOE4a6DPMtl+pmk?J7QFNYWp z&n2>!0k6pMa3$s5Bgg-#FSq;8H_w(y?N;C(#=VOb1uy5s15Zt!th_~20GWYAdLGV> zu0ol+japDk$_bL_9e5bwR~2?(waLYZ*VjEyVi-Km-LUiXeQLMUjSI-}J+25>Zct|I z0DH-hx3hOknC5n)khO^Sm{XU&$1%s2y8PtMdV!}5vfZjvGYN?N#`@Y70HjMQ1~YTi z@OK_hXt0K5A2d(8rd`&V3qoy^4zo}S>Madh{A1in-nLieFhLcPl+;?t5(-9)DKfM+ zN~Fl;jO0>3P4C2WFzOB+{^Ea()UHAET3wnNAg!FBe&PFtX`*jzFp;OL|6`g)BxtIBMiyb7- zQqZkE!{(u$FG%`P`2n{Igs7qmrQcd6o_c=8b;aN;PTFUBfV^wQg&zbv}rb2x$e^#Miq33!tB9Ek7 ze#qLQ-x9b|WmLb3G;P)Sk76(=_veOzPsIvJq5d=dL{HBNLHA>h&H5bc>Si`XbO?Z(mu9=0(@ zG(QG_FJsbnz-OL&+hRYgWpXDE92hd3PgWYN1AQF4ua5UPA>1X9DPe28ruRe?uKn@W zO|K{qziNXWTLvAnZ6PQ;MX@@~Yh^_Jf@gibrkry3=y+I zaC+XRLmfEs6&rMm&Vgzv%5`6RqkenHP2VvU#5m>t%M(1f1>3!Cj?ZLW@OwXOsBPCQ zywBO~{GwUhvc7>A)ML^8Wjy`esdF1gCJ)q`88KuJ2~Ug}R+2!+LdBQBcnT?4j8I4W zAKT*pqzZS0R8b>n+)0a2Cy)`L5{&;(pLmN9E&c;s5FlU||H&7)FRu`TqorPI3N+6v z1nry^H+ShI?e|8@r-C5nx^?TJPn+(QeLJt-FsbzV@C>;^ghRLRy<<0cjyLe4geVQi zKk}Zmtr|4=1U#H>gpCX};7s|i#N)g(wW6hLS+lwlpY526OEjz6iO%+(oEl~IxS5HN#v25Z?jJ{gz6a?jnv0Yi zBM+Z1vbZ}(dX=Dt=N75qRFz6;LkjKZJZyle9T5u+23^l5v&5!A@jm^p3rxw{Ak# zFzliv{owBguHv5)76&B`r#1@sN(&1&ab@*&BC9iC^ zH%4YZnY?Rt(Dq1iCK4#XHYV9%|K;qa@%q>nbe+(5Jo_k{Z5{`?!Nn%br`TC!R?%da z(4$K8I;NMg9`l&|Zlcb_xG%=76~*7Esp&pkyjq8v1r3afbX*xPjc_EepHf9M>Q!OCpW zLW(b#*vKCi)F{IcC9O<`hd3SJ>R_|#srBxYIyWR*dW!(<$ zj^?%atZ;%;Cfz3+0sPM#bjN*rTs(dtw{(f1*9ga};?DANTj9XOADokuh%3~p_ z4MEQ5O^R+2Sae@QgRoa^+SKE|?=g*0@Y-{JT7*6;5u3Nax)R~2(^#t|!P^O^C`Zu9 zD;ACR?A6$z1)lD4m8Rg@RHSi>np00X=)NzG(e$>^Ov%DV8%r7l#Iv$~0AHW3s-n*X z9P*3|?fPW43w7g+&xn{2#OF3QigxauhPL9SsS68_W#y=6_}Rk?=CNttHW6SjlH0I4 zzA+YR`VQ&twUHxOiLgCr&orzujrZP8%?E$Jqv0aYS3UoOTon^4C93}e-_8*y=hh(g zcL{0UTv*(+jCrGfdxif^;9ix&ZwDM2Wfo~?u6s&2xnd8t(av&osk;ue7ZV2*%dA>& z>3P-b!nJp7g}2sW?F`?)0&m;R>U+AjG?JYT-d&F0AcbdbGm5Wnm}gj>eD~PY*(j!_ zjYX@FYF0U^2jK9GyheWOVP4$XV!kNpp->oq?od;MQF~{l^{aE-1g@^@x0ua|Y%p3ScAl<*w#g&_k_hs;Is@WZj->Xd8*NNGcBdNgAs+Yf8 zMOw#bH7T9v8A&aIRzR|j;(WKT48_SNr7lR6zU+ozr5WQ3I?a+I-*^N*W^W!HE<(Cl z%rMdxpFIRbQ>>@l_)j0YozHv9Ovin>TH$522sK~KG%>BM0omc{i;>K%)epcy;{)~>87qHGQE!OW^ z_TZWjQddRy-x1KzuE9))^wJ%?%`9Dci~`2+7NcfTN&NXkKfA^t#}$_xc~rvV{DqiS zNa>l{VD8mVvZcF0Cnmc2Ing!^x`$=$Q2VHlCEo%kb1P?m7HVHy(o(V3I=&jlM55tG zKo+yp13IJ6LWC@zLEpz z#?WT4u$fHZ#RRVb^noTx7=au;7(Gm_ zV+w_@nk7s=V&sp(r0!ij7DI`7FTfPZpx$kz@yY%hAzK~A9)H~Fl(K8zwVwQs z_fY89PX&dHrKQ7jsBLKmli4w{TI%mdiP?=!r|f;#uM60=N|V4D_L0lebQ^BK@nBBS z*nLEhZ%lJ8;QG=1Uw&E04hkIo6xN@pEmFX6%_Hrt;zj8J__!r68hkDvMO+90l(l!@ zoS*j+mBhz?r9-5xUa-c9Hd}$;o0YiNT{a!uxZT<3oVvS|{~u9r9o1GBb$eq)ixrAX zaf%jqC={oK(xSy$+=9EdXem~p#UZ#8oS>mV(Eve;y99ShfFNI<_q+GLBjY3^|L$?l zI(z@tTyxs&x}BI9pNx_uB5#fYYE%-hZeGnGf&$Y)J#1}e{Y6Jh8n3MU<0bPs)k*L$ zFEZrhduPdI9vdAcl}($D0Xh;jaB2$)(aK{zK}lAL`pRfJdd#rg9|sdvV#h&TUQ)Y5dx1s2L$+eIS}uFxe)j%1+t^SwC6(6iy`?G`7IzvsA2+2K#oU?<^5 zK!AK&?XV|-cHZo*>$o>V6ZL!U_8?Au303C3tw`_AI{|~_r&_1%Uy|{sL!Y9^<53{$ zh-mXrnPH2^0iZdJvqJFhNclrYw2RL*z}N-3vOND|>oj^XzgM&bIZ*cfdJ9w%!>?}p zvAK(U$y;mb(ba! zv-0FXRuexO*C{T`HR; z_^q?DhsCJI=HC@ThmW8$7YC7o2U^UO81FV0n>#I5copf|bc#h){js{N+e1RpKIy^( z_IB-%kdY^0M|pCG*QS-PG2oRgD|bGkmMmK#BKRo=_9UT|+}TW6?*IBaz*9Lt&R3%; z8OvowM+3uYjLqoxfR;TpDa(hBV4H)e)0>$F!7GRfiH#kPRvw_9i7enKV7{`8$dX0!OXc*y*o&Qzs;V$?>l`7W__1 zCwW$xv(u)_9+o*M3-aMxoSh&x(b4cN*UC={sk}SgfBLdQXw5>xn);DlQ?bW%L#FTH zQ~xes{0y#p?V5-ph9LO7wX$ZJWckh-gk8M6Lc&48l-hVp&!_DI{d>4AhCDOgDE@in zZy8raP#}s7eF~1d3s#snl!Vt?$ux|%si_t!?zXf~9UF|%tq2?rNduV}Ax5)XJkmkA zjLYu^A&uX{Dg+o^N5B#8CU2T|`U4onp(I_67CtF^O@(-vs%;Bc93>tlgutraT1@yK@7-^hqirY`f)?$S zRZN$jR)nW5xMyMaO2>w?i%%kGhj}G9_0P-o98Tj^d48LE#^OWP-#a{9`u&1G&6F84 z4S$~bMFWHNhX^qfUiHz|ieTdB=>fx5XT96)JX8mvFW!twXX0t)J~fTp-pLcG;Pxf- zBAC~TC8$5lDZGzt{r%!c2gF-pQKnt-?*{x09&(MX%UyQ!*c{Pfme6b)Xeb~Mx-xuM z{b+S!#VZYaV=7_$Z)|BsxMroTTs_7%>zKHvkV6RMTP~yY89RATEOPEevQa+Z<{!C_ z>|*=DL64=>@W%Wh!WR{8_8n^^%3NCGvxy%i@1ez+$Wxy}ji%r3Beu>J)NRrt!F$Qx za6_i{x;>}RSl+jYoW_1b-IF`ezoX@v3ge*4oUiS>n8V_Y_VH0 znux>wX)TuY*LF+zm|uv$0I@s%+g)zIk;Fb-tG|X9(LA?cyfjr?uY65dX|awDRSKA- zn^{*tM~r0`RTMSeg~oJlkHSZkFSxZoz-o$6W9IzHZxYjxkj;S^Woy-iEabt4aa$5o z8x=A>nS`!4h7|t1?0S#NG=>eHV~ZjcsvO)(X%jdStz&4*C8_CF;?woiCQzj$2xf4c z^lx4z=W~hH!HZJ9PRl36xN2!!)^9fnTlfM%_32o;Dpy{)#+89SxN^K*(hi?UC?Bms zgxm(qMl@nt1a~qo>^vF8>{Ftc(S9@UaOOVO)gE;qpm7A(w-~(X{hr|(tAxru6|cp8 zh{)C!2BqqjiAt)}N=zjFUrSD0W;Cq$|2;Ci(7#ufG-fZ*&KQJfQ1J{csUSeZ3&Q`o zNYOqS1n4|eqDLb1;x)_U91xp^7z+(=t;V_}zVTzQPp^nxwW-oe?}ocj;&e`0N;%4%)ZyDTXI-|7ND zBQAnK6NY^R6{x%8REY+q^+D;>$Rig;rbMp}`c&|1W$V@IoJ^zqBrhJB#`z765r<0~ zNT8QRltN|k5om7vEF0r*!o%l<4&x6#ihrBJpjy=8Q+LFPEkBpXv@IZ2k27^m*AFlq zeG9KKdj|)S{_4WR6PlC)daD~yt^na`R1LfgFgx(K_4cgu;n%Qi-v%<;HCl}thICk%)d&JR6G)nq5q_SeAy zza%*(lV?0&OzTOaggk|?JnD1pGY8^N$E63c9e(6sR0HGrm%|pEc*M&!V{D2h=SmNG zYAn&V=m(5f)@wdlHBa0sxPk~N*f7wPcqV6gKu1)MhN@Fm z!i-GIE&^(Wy;E;`E!+fcFwlpqKGpGyk%+f=#t9I1C)G2CXdfwagBM>r(}tIdH#qwlwO_0rM4@D)ozU)$_j)yfRD^`%qDljtHKEy6~FvzMmb< z8oxOm%ZE+OWj_LELR}YscnYG*>xD*Nw*QWL`d5zap;%){G@pvGomH`C^_`ljWFQM? zJ4pa-Ga>%ER(Qc$=7W^C4+Y%^GE)MzNmBHAEj7ud`CFgbz1iYY+4~&tv8yWC?aX59 zt{y?&61bzMzpM*GzG&oojZCy&K+^a41>&M}YkWcfu8Lp9SC4^Mb?qNKrO5 z7W4gnc$GlyWbkd@WaWrL=$)`{PQ!qINakb==gW_WLJJdvh4nT%KCqB&GfSf^jR=h2 zhvn|>qVW+USKzSwj-qCh$5H;&S<^Njh~GmSH0y7hF+UJPd9mdFtOKqsK^3YXB{S8| zUWBvonGPLe+GIT6lDI_@$$n2zj+A8HWX{8E9JrXQ*%-Rwd9)MJ;0*x3jgg%eB^27e z67P7MOOOJdVko*1p}Hkk1*)>fP?Cy0%n=>L3W@)+n1lR7wwS*5={fEm7!+Gu&J$QQx+eIIx=7v2o~v7bu0m2_~q zyHz1y-_~)b^J{^2=_rF)v&6zR0C>jks#=%+iVn52)>uDeAf=>qwgHhiwkZ;G@*2v->lmgqt@|0f*bOF-j=rIjTycAXzc^^ zKBw`S`Z(AfGn?9>-j?C)w1fM=u&!PKi$ zY}6Ho2Js}O!Onit396%}SKw&m`9|z&TYa(umwQQUgWlGcpWYut6QkD3=CNigAR9g=r@{esUj!OtdxyjGuMeO5Vgj(BMW5o*m-X8*>t&tw8Wn(R|w>-(&m*+*r0yCQGw zg!d+~nc^P!t+bq51bfYYFBXNPn5fK5FjN^OXJ=PEC;sFxE*_Mh(h)r;<>(tBm2i%hcPc@)WJRUTzI& zY&4gatzrmECe+u-S}g(^&X%b@dBURIV5aQrJ4s_QmAs4VqVq8<>qeI3R$IH4ZRH;amgC2K3y(68uI9EwAwm$-gklAi9q_<&s8->`o?rGao#deL z!r88^APQ%KgE_>DgKB?GC#z%Iri)}qtGGFg37LiU+W1qPpyaIv1QxZSu>-mYgl6P; zroeZ#idj$$w%At!(mxacV#kg=ag_wnyU4b6A(Ynre;#2 zqL5t`KBNJ{mj9nu2pFq#_Pky0;26zyENl(B?34Gw#}a|6#nrtUPqoO1p6R^ZRZt=Q z!2qbA5L_^jgImSM(4TZkk8K`GAcFSAz@xVZDAyDF#zp=CIWzgih8C(f$P3c`xybJb zH_a4w=BR+ zRUI#_xkx_ahxl+{-vRU3wsb|Zj#q>@nIUAFOXzt~(%f!S9 z?~0XSGG<0=){davpm22Nz;elC1;%-JGChBin?`Ti;ht#;jxs&OKv8 z|H$~gzq^k+0i^S2hqO}0dYgBEoo0a7@M@=lC2%Ql`4!?UFw3EBpa8Yh|0VQprE~dC zh9q%g;oF7B{%(yk;MLWxQ9%gOBsJXc;Fu$&feI7f=yMW4RvXM$PP}A`y0l32QD~r8erl7|j6MDgAIf@ejAfLo}uaVrBx-Y(iH~zWN zi9?AULurSQ`o#kg_qh_Cw#z^gxy2~@SM3b(ZLRGRhZ@yF`vvh>YXBx_OGCqO;z<6S zdsco;;KRS2I}dQJbeHPRMk8$8rj5H=+&PV`wNPd)Fl-2cZC|D?_A*`oW3z9zs#_dt zA!KPybCu}C6{4?~rQ`IXV}Q0xE752sMejAI;Ya3rbG!J8_*UFl>mSmZzp2!E9=Uaz z_Hd{_E#VZt&nFWG+A5jclyfKkCuKy0FH2x`8a`&ld)I)DTUV%jl9;W#_`43PLO|48 zw^xK2LzFFKbTQxicPSYeHCO!w5(sL<=1XWx{La^4HX)6m)!fJHChWjtSafV6Cv4z& z?2bo3;xgc7&!g7Frz4QbWf^9^0w|S-N32m9Kp#vTJgG7LH z0;ZS;rE*R+J04M<7<-oGf0fF3$R8#Y+&t#rUkOR8d&kzfKKMYt3{*1-az4aQ)zd|- z1{*>AVNOR|F4V)X|Dtra6!(jHrR-Ro-E)`+0&7s|g-mY7TXAD3J5=(7N1N$)jIae^ zj@$2}(#mG6c@f2Z?HqwQo(;>t1O%EZp&>uiS>shmYXA{AnS4Hfp52*K6%&{x2z4dj zg`{9zxpn+yy{KE_bc_WxBV3`lAItu|4B{OU+K=dT&3ljQda4iS#?C zF?Sf&oNG6_Hmp_`a=Z(D&pY*xg!oXT1>-{l?KovE#eX48JHN#ww9ehCyXK7pIUp@N zki?~svyJmg6t`U8?d;)rIj+`PCRy0`$2o;b?(qZ4zw0jRTYuGPAIDGbLIOX5Lboqg zFV_z)6arS(!RK6H>Jugfhi&d-@n^HGa(5xEY;!OpILEu57tQb`NWeN4Xqlnj0+c%& zt79wpE*s-3`(n0N&~on>W_!mi*MGo88AvOyBgpQ=i}66RMZ(;y!e2l*?nZjwz__~V#- zQs7VvCYl4-gV)J+r7tk(25>PxqH5&}C>WS!4mRH22&h{eJIg(e+TP9OY?A>>7~_d0 z*|M-qlK6mdqi4vV;TW}S!a5{JnN7T@X7ou^pJH_gn2%Usl9Z}740)#GVbJjR$RnWoTDq?7l+OLT&!_&Wy72ur;+XVPO8>=-!jw}O z<~&Mm`#T9sE#3OVW;;SPrGw}=J*Gvuq}3$9sT7QBlM!ba$_@^atjhV;AASK7tZ6^= z%3$!Tk(<&_ky2ThkOp}qIjJrRVV_h)4)%^EdGQL{%&$kslR-i>_AbUw1h=c?Lmcyo z?2xdcbn2XvRZ4Cj*dgL%47&nWSo31hd5G&fkP}1mk70_cSN*q)bVzF&iG#g#8ecC! zr8+6rYj0i29h^c?-cjGp@qyG1=#kmMw_^h01}4<$!0Ww} z%W4g34ZP?}TJILni9Q)MZ)sDw^Ezjw?;TtkJEGgsLOKu0z60|KGxar=8!zlxp7L2v zo9Xb*UK{|Dtm`2(q=jGRS>t7s0de0M= z%Q60B?>J)TW%ynjY?$3@Og#eVzBOtz-BdjP>V+XMgi_cPS1WmGau6m}MdKl@ncng=bsc${>vx$WU=E>n@b)+w4+1W`H@(P3WAjdoZeH()4s>_oj!Cn2=#P zXUkOU>+sLmz6*!W$*a4&=0!Y$C-Oe5TE9D~03rv1*nb{<2TSFs7NhMN4&DTENrT>x zuD>Nrl3Nue&-144+Y(YEZSGcHyexEmGXDKTu*f90%c%Yb*^=U^gZUB#m);tI`#PV2 zf%}~FD=38I_N(U=%TEA-pS91WOAg4F%OgrC?=pNpJt5uIBB$9rg>f)*{Po`J?Q1ep zbF>vmC_V2*HfMQp4U;5QNzFwC%Y5TC8mDw9}w~Wx*h~jC=4zi9HVZ#dj z!4V#b_eZIZ3x5F**V@dZ3`cB_hg}($FqEm;BQh(IG%i^pw+%Vt;+r#|$OJvQ8(o&K zbeD2X1jsRr78e(!&mdZM*gmy|_jcq6X1hAM%VZsRG-M$}2ry2Kol_at-J3tCaQlqN zm_>L0yXhIeDvJ%GRZyaEHTqMl`9-TKMIJdKjtLZg2$KFv{!UrJnf$flMW#LG2xmw8 zs~NnBuCoP4wMtii*NfQ2hnm}1=Z_Hci=0M0r8Xj4r}FON>PvKF-q z4N`0@p;v!OUQk{<8DLm>Oixfh*>VN{>ohU*9t?XH5W)b+-vw3W)REWGtoR2iE4Sk_ zdSBboJyAaJeEm9yjr8|ZKe}nc2z<(oCG z8m4x;wQ0;HWjEXQqc1-+lO`O%_gl|TxC+in;Gb!4tjgI_w~WBBAj79V+{(vki?L3V zy;)X>0dI3FjD-3FP<^^E=K#|WGG?iP8}GE9u>I1J&DY1Wp#RS z+a>C$OKYL^BZwe>;>tcWoK}H^xtJp&*QdCc-*24Re#5>6BmG-X1qj1@#}pAMA;52S zHXlkOvCkVlDm5Ey<7y~1^XE?3#ab|!Ae*5mz_2IMTDS20rSYPl&hbsj%@os zF+*Hm2p}Z?yuwS)Dc2~gcWUmz3S@EQS(g@=j9nW0<<*jPnpNA6Vy1TWI*Vjcdz39W zVE?G+eR^neFAFxR*F!4MJLlhzR}DErIZ<9$i|EBq-pf3=j_2VUxZT1 z*S!U-FxM&ge3%GNV>@md+N;ewwBHiom`eecN;9Z=#_nSUB1mJ@%m2CEXFaVCd2rhx zO@B`O9*9jr`SC6msTTe6Ioky5-6C)Cx!(9su&%5VoJyB%2g9^1C7HTz(G24O2U}{3{^DzW|`j^jJJdlI$Bpa3fTy6WkZoj%Vr5p_V2MmS?R#MADuDo<@ zBubSmb~ya&TDulT)X9|qJi3=&&Dw@{j*9z^r%Iv)imlH`WmXkd43;ACby>E$xiE5+ z=*M5Y>BNN0$|fY4fvGAhL;77@s{%`$ay+|4nYx4r<)P^40=o&x=q`Gruyo}Q`btZe zb#>u#jWR4XKM=#3ra7dBh|8nImb%*^p4oV&hw@1xh@an#+M~ZTt;Aar{>^$P!B2;6 zM*wN7sn@d-_i=^JdQpu@igr_`L_?c zlI8;Qt5?$FptgA$CIV?fGD>RsEWbTYHgziJEx2(fzMLlTi25{{TBw)hG&=dOnboxp zKRRMhHzOr_@mg?2v&r+OdCig8sgYm{8dK2SI-&c)aXAuUI+L+n!xsQtwy`VH`PD0f z76KA-a5-RkINw6&zD;~#Luu#|mzw;}YLj8|%yr+tI(XEYFL~HU?djh@YGn!o6$A&4 z>zDY0H+m2bHtXZXD)3+ODsYyCNY|Yk+JeObaqq*Y)YO1EVslH;oSSO~I*b5Ydmw+v z(|12~zxmwG3)wK?xp#VYnuwVXP=!aRyH0Vwe@~)7O>Y~f`!Kis5>TFK|5(Y1GwGO# zCDUn-y11t(=9`-w_}swj-ffyy+qKAW#8+kSQ`yDwE~tuIC@93mIO-&H_AubS(VVbI zA8fI4t0VsK;U&Hv&qGi$trrH)=M4-dBm?rdjB3ovfQLh0HHtly(W{j&2=e^9d>gd? z)~?AoRkbSF@7dP%qmG4wTVP@A?2%ax17yKm_HykmWV@?n&9}5vVkOAkRH5aL#lEW)5eT2_XI?8f$63jZ8*1|O1xb>+&=Mhzm=+_ssjq26dzo}2UI#k@!{hyq8>=JZ#p)WclLqPz$_KGxy&4#J(6fx< z-~}K4XHB=1tky#JH>N7>2a?fi`MRO^-p{y50Zyx`~uHbt0fTkK~Ry&ay6CoB36l z0rd!rR-cpKQukW)1K>@1`A_AGbM0CUrX5av|31IU+F<|FT=Y?#p!4d7aldE`zb(E| zBPv#s2eWZfAFsL9ZgZ}YOtvx-UT=GIbiA_)FlDTp$aLjqPyHT&mCQUV z#SMBtAKBcxB=x*&fbzBSGsuI3;#b@4l(I^5M3iZ+4{Kq3IzIy$ehOnOrQd^msOV0j zr^8OvcaxBr$12TOVID)O6JVyt%3JsRz=XCHLWg{i7@Yv=y#1K9q&%Knf6{YmEiGV( zcbZzf=E+%~;;i?^L?vFQ#j*`7Aiyk_K+hgsH#LgRmDBI$6v~1+Z;QO*3f|89Z4GU~ z{9TEm7iXT!{&Jn-CmRQ6qt@e}4xdNQNYFTw9vLu}Ddr^>UQmfDvC~dkShE#@&YwYV z;P4}4K*1i=5no77O)|uISzsGp3tai*@JvC%b?40QQ-Xo(#bF!2qave;u}N4D!U#-6 zjd4kpn?3O3r$bqkEap$~K{OYnEF2Fee@@$|u@@v^D57c^hwH{Hcng?zb#2h%Vg_4%RQ;%l7e->A!Y^qshrxu$xRX)3LsV(_ zSZg`qT96nxrnY%D8oP_^u)IkbOnoWJ^zjKfr`4mNa{?2RG(md!Q5&$^zNpH z>b~JX`uCoLeq4W4pkUOfK6S2v0wm|Ow<8fe6S91A-zs!+FK|{q<3cLpKlYGas;O_u z0`;ruUH>Kf(;Qaakno(4?33r7y~I%uF8|jIBj&RMm8j~SB8enTvG_?}+6woVd|LOp@cH@Uiq^t;W#&!sG&7a)jSyJ$^Xx*-##IZp(vLz+boV)UC%1QO zw`w_>&1LVPNp1&F>h4{LGzpkDLjL|o!u7zHP6tbg7*>3oik=MdNhW2TXW!6x*?W5e z@eBGv6T0XQXS}^uIL;9_u#pG*o-WO;$fX=!$Z5%JZk}}pySNJJ2)0c14)a`o9^;Aa z6*4oT{Hb>}M!hrUyVJ`DQyFx_!C-4N;i^3}ajEA|-|B2j?>Y%YdLFHtQz*HK&v1Kc zPh&I_jD5%b`ci-rSp6<%X^-6GtWFXabG@`9Yk!Wb{bAht*c4DQsIfpYUa|K5CvQ{s z->tE#Rj#YH?Dfwt1t}Fw7X_-iti(&@^RCkIPxdB=;%?rF`cM%c=Ls7r()f;BzhJ~b z8?&Wq%wb=Xq#_*bo<9>K2>|K0$kdu#p7Qel=Bg@<>@h{BQEG)1uPd<@#pD6C73$9) zo4Yd0GIDrEj^vL<#PI}1_Lo2kYjAjw^U6`K3zMxBh?hMSY5ccV zqy-olna}9Z z-kemkYuwWuMFF5s>iV=wn)mY%id`J10EbnP{Uo??Y7|k~dxG@|g@dNpK@ZHt-r=#c z2cJ28os)MjnT)&zu7J#;D0x>Gu!E_?w)$Z|;weX3@Xz^|M04;Z&of_n>K#)W4fI$< zcY#g#EL7if^uk>NWbnu-L-}6b*%K7=MWea!(%=;SkTQqi`}HN$Hh_rk27hm5C`6zJ zmfEVri_z#ERk7PyMB(32vxP_lDou>lSA0H`<2S6E(pGpGKB@T^Y2(B2bM!NF3-n>B zeZfN$72PvZYSc-BIdU>~`@2LkZRB6YCW#$Cvn@(P8K-{Nqm4aCDQf zxpY@<@3-ZJ`RU?V@a(u@9B4jxvC4bUTPHzi&=T#uX9~MYG?na-@9q` zYZT8RiDj6Pxj|Jl8YLe#xZ!=DsyDoAL?^3xrvLrKBfzfo^R)F5+b7h2Y46qKv|>#I zP)aV~p{>RMVUC(#>+K$usLz=JhBl=$F||u&b973Yu5?at*~&0mEJPN=7H93iFj)Z? z-Y@WfMp3uLk+%r9;N}BU1=vHtw#m+7mkk!i-vXtXdoOY8gOcTW@xaWi`-K79ua*g1 z7yQ;b6|{6qb_{mpn(l7T!&-X8BKAu3HDcc{LKhFZ^dic}!agBrrb$s=K1>U0!F4P|pF*{3Rv-b`S`RmtsnbNRLhGg5)6MkZAba!bro_;I zqffsk_4U!^yaeA_9YKwL>zE;ouer+-NP|%}FuFVU@n9K3U(C08NLqBq`ckzbw>P*1 ztAu9)pGYx64R(u{=^L6>$Vu9IAzd+Vw_u`hY<_Lsp?nv7R4M|?@m}{&1e%RpHyliE z=FSGzm@k3q&f)n8L(isvTa8U49%CXUM8PWFY_{(Wf-{<}Za!8C32_o)aC=hCMxMZ{ zH%d(*IrHwEOuz^6c5GSJbgpf7&#XqOWw$7Hh8Y*BP0uJt3j3MX;rAz#1~qu2t{)1B zgCSpHiRh<<`O{<8O=KZ2^{<}aB-+yCC=um<-mgK~{N?V&ru?V&X?HvMf$#k1msB}0 z@t>cM^(|+Z;i-DKqA%M1c|RGtKA$YUd2jsv33@LwtAC9%j@5eS@-fv$1}_KPa7z68 zednDmETD`c*QP?2vm1vXg;^^!yWnC})b?1%l{qM29kO~2tb53SO1V3gQq%rxhzOe%cxKu~=}|fAvfGw{dE8eqwZQ*8OoX zWJSJ<68qVq;i6pb{JN4GIT$Ps`CBb$n8iJkU81oOvuq=$ELc4BvP%BGdI3|~>;|(j zUrAwdh5YpdH*G=<7$5IYgN97A0G>K_J&QRg1*Kb6Yj*kK#VyD&!F{IJP^R|ucN=x1 zrc%)`BYz{nDgG>+>@cl-gL92XD$4~M_gvp#{Z9cUx@sbguO-&L8KQ6zJlMKT-V>fO zgbH}9bqH*~3SCZpTj-X5TrE0lOn4k0;ux~Y#tSe7kODvod#6Prst0z#Auu0c^y5Y5 zsEw@KI1%&+<|5zb+j7;uQwcVc1*ExzgBDrb&mS(1xYW? z2k_2*mG9oUt5O-z<4sIYGrZ?d$P~Q5ju?3B@P)X2Gu|b9D1AM9-T!PV_QR)tfn=K! z5&gV(-(MG6REx4|;y#vo$r%wF^Sa4>5WtHMLxs86{`2fASYP(xIru)~wDdYzwWu|z zQKirBhSrOY)622F^lM#D_PNF4WQXa-OOl64n!G*(I`jW|JfzgQrV+%4&V4^G4{}i} zkrvpsyTP}kxw>`3Jnw!}KkJTSnCwtybz&FunD z7WU;_k3r3-L)C_5`;aVc7#MBl7D#X2KWFJJ5{i9@yFV84gZob-J7eH47gWG%{XAl* zP4_G7FVMdw9jn-5bg;JM<}qTnJ$@7uqO9XQ?ib%2W@9@+Nuo!!!d8A=5iZ$ zTnrTJ1uNaO-!7yiZ+B1W<+exB-qce}PKuaQQ!Q9aEYPHwqcz&`!@CV3Q4NcKc~^!> ze1e)fR=tU>^heXrhRA784@SkvFj;z=_p&g_1c{e8AwP)GN3{cKWn=31$eos_%RrU)-SvV?!;F@KrPK7-UYb z{p)o|#>#vBN0!ExB!DH0Xye%0?F5BVn8R>O{wrR?tq>#XE@^;V6C`CmN{XNG*j}n! z)Xaj6T1=+?`tb{R(qZr;JoQ~2{{_VN%>kz-?m2uCGs#e$r$Z@4xiT{-x5PoqW4=tp zCe7RPt+>ljKabYJI5hs3_<41I>??Z_vS<6_3^d^{o8_21UZJby(GF_|qtRE;y|4=p z=dI*UkakZgrqJ%Kx;<>y|1Py$QJ=H|rhn{?LkWcXbUmc82&oq5g{TvUuy4O}3bNiqVMB z8&kr{S!V&r`50&82RLh&6>2|PSua1cF0%`$oRm95xp$m1xenB{aWbYTFZTaq^O0ru zt(B{D^2X2CS{=KN{bnRONpx9Wl}-E}kC*n5N;)_gn42$CxQWL%1b9Z>U5*Mw`MIC} zkU=jAiZ2Mm;02JB{vcm-MzQo@q;eK3r!v^@M-o%Mrbe-8O!+gSn4cQ&1xzK-`D_T-ow z7BNmwPl4Tps{{KxlhxY?-sgMbx;(mYE{C?0N1;r-8YkNfLQ(b)?CZ1@X8Z5cFpQ67 z;T>PKw-UnV(bWQg61d|WBsnAv+=DaYF}ljMx5$&r^$5xo_ShNoXpnKv5J>&nd|;0C zlBbjO#9;2)8$ENq+uMm6kYDTVG^v3!(N_nthAw3%jLz+L#(iIp5#6}x_lhQ85hU zvklolTZRN|N`fg1mV~KaOM7I%70>IMfq zz{Nu4>7ciEpR63oE>ebdWJ>%A1F`yC|mjZW0mpDGQN?yj1t@bmL6VsaNu+c z#ne_JLm%XiVkuTguI;~{j0t2<$se~e6rPg2kO9;cO@FNJwcCn82Uz_4EKEN@15*jz zJ&?-n-X2LvF)(}RtfDSqQw`s|Gv}|DtF_xb*a5~GZe6&qTi%^^<{<0np2AcP`*&dI z=yD5lCR8lTMibhPWK*1g+)KZ9o~udpZPymOcDKM)_qD;hOh>V5x8N%_!)>d@(fL(h zLto6#geuSI;78pVhUIzHM1%^RJcl*`YA~6yYSzjw@l6|yq}+Zfc8qNJ3lIg_I7Sbd z!7JJVUKzKh3C&Fh{a4#H)D23<>WUQN(H2evb}M(`@is=Eye5Ea)gv}nIeNlY>|u<> z6Cqp8TLuTpQS~e}_vpm{*lkUW65rMu)dkEIyTfcu{5Ni6r)ydQdbrFpln_Z z@)8XJh`_%l>8b9Zw zQp$N)LD-Pqh#djN5Rc`o>XvYMthPjHj`v7_OO`6nN)MPd*4h_K>EXo&Hf2qI{s7(| z_WrL9i}=i&A{npRanbGO#Nk;mMW4(k_QhGkgogEb^sm4&MYyq)HMgR61>Rz=xNshw2-xaEYpz)*xotKm52^n z30#p(A-yPD%A~Fy@icl_ckt4>MlPsevyV9|n<=qj1cRWQAlyHJOzse${JBUQ@4{s|skkQCk&|x+ig|tAvo}BP zX3c>^5m)?0IEWH`6F9A(xqr(rDE-OBy|F%l(0butww*JRd0Ll2#|ynatdEg=0MWVl(02xvlHc^mpetr$Q@T?{1D zi(gQ`nc5Waopo1cJjHvTg5SR-UBllfkCo5hk*ET5_O)>R}3 zkHXcE0V;T|_%=Y&yZp5{_`K#+qj1-=kfCI9WSA+UI&bS;Qy4cBXC%2huH@t$nVUhL ze?#>42F?Go)c9Y7;fqEX1GUY`3}|TvAsSUYK_d$+G|s@fM;@WQGzidt@bA&<7Pytr z5w2!ZcdT#bKJJ~^;eC^L`pLvT3V_PBv3o!UD`B|YWk5$ip%=KPb>X^Z>1sq<2+!SbOYds@+%C^tUOkpNX^ zMnKk;YV$=lOkUxwO!luZrCMVZF^6GYgJH?19yfpcIKE^cV*z#SViwvpJ4A?CP&1F* zs`mocTHA#eC3^VL;~hK}#PsPI1#Y;<;f6=RBk`qrS;*sJl-^!jLF%s;4rv-rrXSs$ zdH8^uoI5{><}tNcxXJ6Hc}S?uD#bDd-K}^W!jywQT48#>(R}ln2Fn*Sc+4~^T@JnF z$VvFSnf2-tbY5>b|Iq*}x!d+mHl(%i!b$d!2bHX0;ZV^*rj$usJojBI)LXJ4w{#CW z(twm(J~mkGi>Q%#xalzb=)SzUx$?VnvsCe6VX@656uHDIsK5sP9pM9Kg+(u$nNxsk z8}SNUHO&bJSX?VhCyaU2R z1`cLRrT>!fKUTo?FG-Osrgy;jUh*9V?Yx>PkY#ggO5gL!1DI0OY}#k%0%5*9^Yh?f zr|!z7pf|3UrTfE^JbFIXou6OL6lYmX{mPwGzB1my01RyFe{37SCNAO%`=c7Uu%F_H z#zT^t;RY1M*jvuHXCcP{Lba)^H5G=>k>Jcq-4TetlpIVyNd8ZO)B^+Asa%TxS3f*+ zyrbwHSL1wSdTgo@T)tqTPce-Ry^B;lnKiAVIjU&Tb0F;5N{_08F0}&V_9>~Md)+}o z_pTY#CwH@BBB6-y)F&jgmvJp$VD7%${as8twspSn4&ASN0`E=_h0HIPseCk5922hW%`FYcdgw#1VatLtI+XCdS_fLe3u;#yDY#fMVTE zHE9{OS9O)rJ0;Y^je%)GJ|L^B-MixXIK2(zyfXHUy8Vxi9= zW>llI=PChy@leo)pl{cvt965%T4{Lpfe)5jmu1^{MH16IPs$S*?p zb|(0z`Hoh6-GxHq5D-~cSf6(eQVyrgOD?*YJ$!$t=m|#7{OI04)MY>*^&&tv0cD5u zbxj9T7Q3CFzt;S>Maj!;P!je{~5?bP%UP|{XO)^LZh-M zUx{cqvH)yr0(}z#Kanf$Ql4&_!}|_Q0G<2NPd~A=soS$&eY#f=SG@N^;Ejit(t6jf znB;)mdtLMskvh2g!H!Sf%x5OJqJg9h6j=kvtR}4u=xMXl|Cq@Gs{c(xFL$dm7vk=b zfB)c7LZD++F*KR-@$llhHO=DM$v1BKrsYcJq;jCLhDu6)jM>$|iv#5^$b(n2e7uck z<}cz(%NA?_Xl8JUwpsY??Q{E~w2$Fy^Q4r%)rTN)vcPUpTXqH^(W+7-N-|l33I#s>W zIvd+Q=NRI_^O))r7SRb|C}R%xh9r+UAEs2CU*ukkYAsc-vSv)~|6_fF>p{Lm@bq&# z20I=Vx;BDy%}9tVSI-^i+H{)w6=$_JlBgpOk;h-GtbMtHp_Gy(nyI@R%U4TIzOIP%kwK|&YZPf_n-MxI^Lltde&+WIL(ffC>C8T0LHXpEgEGF8^1a%ObO202 ztdcZLdhF-YVJA!TtMP7c@c^mR`>NKG4)WWHu@Yao|G@a(ZmyWL&x(072iNUOR*Y-g zIrHYsO=oPYvv^#DzA+M?Veb0Sym3|YEIzN!JT?>nXu8a&e9mK{<1~;ZUiK+-6E|0f zgwW>vu9wr(-FN7z*f#?zFq7}L;SCqd|ISg)v6<`n2dk=Bp(T3-8eh`!&xhoYlnzaq znXgI_an%21N2{3!*Q~gOv5_4yvA(^DWQ!WNxH3PJZB8W@j=FIwR6Eb56eh>Cx0PX8rxO_bi`=%y?sZzIGj|J)OO0 zPAk#rdM@c~ho(&1%$o1)NSbP;dKijr1*6e+O@{}80%<78T1P6RF#F-7MT*{1R_LSW zdV9|LKb z7|@Ufq&{I{|OpTjNNGGqk}P5dk>#miBEVIoR^ z6j5+A$v)?t#=?rs5H6oCJL|ubfA4whBTHNwQuZ0HruI{f_Lak177rDI7;^Es|EnX6 zL`bCRy1Q?7dk!CZ91~`P>tFcWH=f>37|jREy{lwDbfXQa<~7XCt=-xpVeUBDDb8`T z-8t%#+EDIFddO%os$;pn#~iRBAk{6}6)Z{OU<=Z!O?sxfrhMJg==i>^hRvDvptWpL z0`-=$d%Jr+4S;S-N3+msOBtViRkG%%_G<}smrrLtMf?lOu<2|g={O{F4j_F9_0@Jr zZK{!lmG0XsAFd7y&r7>VF&d%Q`&`00*fF(ghc1fv7+?5s;h?~r0)RpfzSo@Rk-G*9 zmh=(op7md;u5%t!z=O7xn{V$8%O)}c^WV04zul!A(Fbc_V6;Ibc-Cr?$rjlh^M1@1LJaUSaRsC^XzkW zEHB&uZp^|<*LbD?rlKK3Nd*et8r$rntZ`W##2n~UqLEKB`Zppc^=7R`qz%GCwA-F_ zo7u%>irufbUpov69gm4#?j~Un!e@ELLGrrhbtm5^!o>^Sa9vyFkr%6%jobO29KRk# zaoulxSKIzkj4^>mK~S2KmBtbg0KVs(*O3#0!Q~M@LOorK_DtKJbKe(^UL;hXK0-Y@ zqx)nz%M`dE=GjCjb}TmH&WK@X$&al$r5P(jaX7M0%rViV@kzP&q2Xxn)X^-l%QS1& z%Z2SuYH#vP7HHRqq4uch(bU9?fdx$M7@F03x8Lg6r!7Le1H`R^JU-JY!f5S+h;aS= z$&=f1nay4H^|krFXOrjhf&zf#NKPF@UionWUHIEurN2oba}$9y1Ub^wv03r`kFEF{m3-R*qS`-Nzv8jQiT!9I zb&ukNXniXMTAl^eI70x*Sr7oe=UnH?iBW>3T%oR5`=s4o^O$D#ew9#N;Um;1tovL` zsp2G(ge{i;9QKSZM3-rkHX^_7T}G1W;+o9t>pOIliSv0zI?$P1mY1`_%^E4el7$!@S{pI2C93Q*P)5FhmHPq!BHq6m1K8D?$a*9{f zstGiUHM8Bgoj=#w#Ta|nWS;CZ%r_7K(!)+BjVFMoW|hl)!O{wCh&SGB#fw(f{-yBT zN2m()SbZt$PM2IR{3%-9VQNa889y4~O}Kd}^LI}0k;Xy5=^X-I=N!8i0G1Vm>I%Ka&$@53Uk6=V5&*6%N9WNl zPciDN`dXGC#)Zal<CAVcf&v!G0qE%FCcbV>Vd%p8& zqnc7SAeYG_x#oF$^LF{>D&0GFbel}3*X53aXhECgd^~rp-Z0%vO0!0-P4gt=WCF-> zh@@l=%;fe~>zM;-&^ni$S$85Gs9KdrmIn=Qb%M|{NlCH({en@7nelXES@5cxN6ft1 zDPgc*N#b~uhX#Cl32=ts#1>EiJ_ns+<(b<;XAO%z>p!VK2i;TWuB(aam&+4IdzHqs zES@k=vN(1bjbcYn+OT5SBr^6nFY~mqVtKkQ4mX*K{kt;`jh5r%Q?FV%W?9M1>f!?@ z8bs7bM|434-K_12Nl0p&9_{8GO{U1z>A_-paJPuHjgFFR%bo%Rx~+Y)|J|i+sT4Fx z;na1GIh}Q6_{pQpd`I!ZP~;vfjxi4gDCRdQ3XF)vs)fj<5_8Ui6^-vu8?H#o@Kuwb z!lu7q-Q-1^yE&UK826-P?vu_;zfK_rnS zVm^Lm{%s`v5%2 zraCKzesX6qr(`G+O#959tX(Z?{7X)r?B;itdD3aTgqEEYXwqsv7AAg=LCT+p zY<4R4K*=A@kgGTs2tdOCPiJRS002M+AOHXW002uL004LZ000w~>d7Df0RIjD3I7!T z0RIgC0{;R375@kS75@$Y5dR4A{{TJ*onfcln-86ju-H}pOQv@2xxz`<4#0!r_po}Z zQD3VA?Lbp;9@E(D`u{H+Fz}g+1p`&u%!t*gX5>2I%r&bM(-~(c9i~gs9*&y~(`3c} zUCKP2=RlhGEV$5NoSrRu-TSTz=W14c-WThAhP13h5Fmha;})AF{~-hBSW-62g%h{! zVP*Z7#d5Q}%QKHxAq37R_C~`?17)$1{W8x=y2!{~J*ztqKq9lzifGf{eWp=JAILU; z+kv;&7au)g+vvA0V8o?eq)v2+A^nfRb-Gh=+i1Z;^j{9?Uw(<%FSivt(ekrXj@>u( zmb|x2NpG?p?B0eXKE#$r0G=V|$2M0)| zfC@}w6UzO^E^}Q+GLP$|o7{^DVz_?J%--C^=+nCii%FxL;}b{w-sbb^c)D1B__WH+ zcKPzlk64tfbWav-S?27K*6}3o@#wNQ%=8Q}4;|837Sjn-j zPs{$hq*-(|Yq?n7W{nqfE))=*w~g&M_q002oQg|j@>5L9b?vL8i&DvmYFkOtocKEV zcaB*OEyJp9mwO#ISW@Jbi2sxiFt9s9M0*U0tR0$7NhNRh)@~}@tar!RzP@&)I;LZM zzPZmQ70pkFQX0LLGm%}`Be<<|JA#L10KWG;rt#A*ATF;g?8fTXwD;V$@zbs$q7PT7 zd)B@O%dPsF}?coe}-p{H`2h1`BFNDg86dU|+7Mn^lGbf2Y_Mfim;_6f1b2#Iy<%RjHZ;S@Bhc>tC zU7S|3njU6eyn5Ox>2WuoXFalb^5A&MHM>rQbSA8EVvDM>)* zJIq1t1DpAYL(ZzwG)ZrcUypzHr;BrDOIhoS%avUaqbb2A87Ey3CzZl48mwEjT|7}K( znP*HnIc~j`CJ%LYI%D!;_4=npM)%q7Ph3PlZ!>SUN5^gNIrP&e9FkOWjAYIfS0OiL zIc)Ga25yvWt{(+p4~?c%r=^yW5}*G9MoxNQ!MgJOy&F95-Yrur_jZM#pC^~ndI>-? z`Cd!K!?TVSo3+`j`a6Um@+Hg5HZ-6Gyzym8DsJiX>A(DmMv|!wg+~)^sSF+|$xZ({ zp+M0$G;+_2j^MZa3Uz0+Po1TfK^1~Xl|}loe;CHdp2khR)7Mje;mn7w z+vnncj%yFw4br3E-LQ7Ic6)ev=KfbPieqZR%Ea?XK5V<6Qzv$LUXWvOew*X4q31ct zjY6=nCf>8dWNe4el55u>fQBQLX;5jWkUYsGr(%w~ZWg=4b@j1+bI*I1aEalJMA4Le zedk%A0SH`fergK}8k33iN@>?1#!1JL^C&w{TuN2(TmC)Nmxj^v(>d5zCkBDzBvmHDx#uuC#RlpMSWi|?`o^RA z(Y>p&{Nry#_QmSk{h9agA38jCgXNmVp^;{ZvCR7o47!KV*KmjG6i7+V@M}rZ4r{cq z!ll=dot^@_X25oww_p659Xa3E` z=&pYcx-Ap?x)M4$ApaifQ;hno6P^RU{!GF1!oVht(=qN3<}mWjj@bMpJm(@i+t~Z3 z=RfxF=RLRj%gTYVGv;S(KHuR>p4s`zYPZ*}KJ3mvV%~Ay*rq@C(V=z4oJ@CT`d**u zPF1T4#JV@`$JD+0#p55M9_+`uDL$Y`L_l941v#LFHU@AQ_q;2$c{Y6%HiZJu>F^<9 z=4GJ%bXd1K{%fu6#f#@YdEv9mo0n%VFaP1J&mLxb!BK}pXLvHW+l;o4o@8XcN|wIa zZozh#=`aT}o~ac;=R+`BG`1RB`Iy}01et89)-sLO(e?O|G(^Gm`s2Fk6WXFlx4Q3BjYAtu$2ry5Qb78Fi+}p2 zI>0`t08Fm-*jE~?!MZM=vTjFjc@VAgx}Vr8NJ4E`0nMRcTNp99RbF32p_GVtkZCDg zW~*5b0GY);fx!{Nk*SKf3Nu+>eYZBNW#(P`9^#t_B%()&x~7?I=IdRD)8YW2K!$l)n{q2!982QlC z$Ms$+mDx?#m$dvPz9@B|?&1j3{U%x@P5IkQmvO69QSvervS@adck4~9xE3~YV&{yz z*&mJPh<#-Ue^==zwR_GpC7yL*QT-af!hfc< zXQFq&iL5Djjid^8{bT=zGGj$pIeWh0p_imTn&ZcxrH8UyyS==*|8SGTXHHu^DcjzE z_~Xvu+x3Tg56%00Z8e#b_njtZZOx~bV0JitnqH@Ao1ZqIA~h)Vb+{bAy4)?lQvfIy zQVuTGszmMsQRu=2tLypcZTy~Q;BdGcU6Y}93y{xq&P`(x0)WHHMJ9M9yB3exzYSK{1Mxstdn#KXVrQLx+La)&V2#aO!+a#?J`G=Q zuDZ#YH;n$=a?RQIlX+aYH&?_@_U?zL)Q7!uTZ`aKZhJ3D+KEjCb*6N6o=ukC&}Z*n z8vqLFFf!Z`RUZml2~h2{(%trB|IqwQm&5A)|Fh;<5ABl(UA!V?gC82=hEDv#jvtiR zp~*E|+DQL@x5eJ6o$yWaaARr9se-h6*irp?TT@p7&hS%&e_|{)!Ol z#`^pJ2JNo1TINW8#ZP;dKUJP(3SJ0}E$Va8f9ZYl_Wi5pzwSSt<@#&JaTL282VIvf zCMKipG0DDiwM{p!?X$7%aZM+m1Y1g7O0<8chnIG#bk0x(yeeyh?U#i98ZGV(7NEA%k71t{Yx1a@oypPuzcA@2G?pE$SK6Y#Bn!l)YJ$mx;9L|LAoMc6=bYURZIB51 z{F}YXKJn{=&TfU7H#D#KX=l{0)=4l7LI@$m`agE?C|C!evGsM+XJ@RP?qGe(9?JL7 z)EU_h?u_A{eUprgETg5Ec)4It)wzzgfk@XjNoeaxx~H)b9`B|>jHT(@Kl>m*+T$iD zNGMN8S>$rq$=)il7bf(swjZwb+1<;9W!po?GFVBq+n@mD1FZl@&z4>>g<#tRU$jx7 zr^A0q8le{&*59zBWkS%# zr}RxfxVo)ATsi>FkxgzX6Mi~TLrw+`eh9sm349Rr*=PJ^&+4nn4MvxEK;#R_!!L)% zx=*5W+L$(`kO-l1M7aKFlzw_I7GQ4Lc2-`InPeYknYd>9w2W9uCQKCT4-bCQ!7nCO zbO7k&(9|J{4yZ+p+0RC7d3R;$oe81>$;NbGxL|np-c!yH03wlTyA9JtV()a?hyZ(l z^tfKyRlm43cUH}(FZ*1d?e`B!Qp&T0M57$ww61=07)^TTY1HafOCd$uZ>kZ!KAuF& z5k8f>)}3x`uhPJ21f*kj*wSD4*v%K6#oLg2c6swH45+uzuQ&rEB5-Jy`JECM{>nqj?bu{)>#-# z!DDPC$CuL?=ROb;KUR|L#j_Xlg)JiU+SKWMpWSlghT;0RqZ?1wyD=T3SoQ_J@m4F?m+9jU7%f0!MS0z5K!Pb;@ezKh2Ye1AM{ zx%Kdmp)NL&4nlMu4{1wunA%wZh&O;vFFO}EDUGP{^ZTz-4j}(d zlB=cPCPFZin^jP0xNs0{W{M_)R)1PxCj1OfT0T#)E%kii}M zXaEN}I7feQVCVu~2tE4>x^?s}ziH`=;!))lKG*34v0dn_={Ikxu=4Xc0kG?n5E2Dj zW0N@g|DAyOkeOv3dNR|jEo&s6E?2f5QF;tBHoQNdCrab^7(RYUFsgGR zlPL+kNWEpTuO&cgnXnkBGutK?&-eaZ000Pi`-OBJ#};x7iA^}w=5`SlPqF^8J=h)c z`dBTaFm|<+0GO_m+JZo<1%br>%e0}5e_naZzC#isa~9|0KHlW`tX~l82uxOZtfZV1;qBnbhY0w`nk_;UvNfro4FvFr+3v0Dx&ekfxdr5>q_D8dn4~+gEN!c>+5@nt((%jGe`BtsF3u5)2uy^znar@t@vU_09FZ^FKYwep+>gI%PCR(>YGKYiC-HIus}(dug&xBf#E4Gh$+D z@lk$NvKt#dWR$f60HB(5UAfK90)P`C^3#&t#TZ z(^fR1wKp$vdj0R|qHTPKdHmhl+)N%q1u%u4*-LC=6b?5&8(QCTZk0OOkq^JBWt>4Sol$X$yMwAgl3H+30_~ zchH(Hz}16btq+X;LY8(C$HWwxQU^~G<%6f+kt#n(Kjr##r`lMg8-IH_+u;}X*$yVo zhnJ@(XFr#B-9LBz$g+|wJ0Pj09GAMSG#NWpW8e3RhSn#Wo^NgELF&+M);{v@|J#-N z`sODerwsrA!XS;H$>d2*lO);#fc@SxPffIs)k_{~xi9k^W~lT*JrY{adC|5As2_@^ zjau-J+cYK8Bri$Yo@#xpQ`1M%(*Hv(_{)3umSVh-xV7)iu+5JjgS+OrUYBa#$dylx zTzVh*wX>(`w_o*9qH)_!zh5HFY-CNLA=e%gGy|RHJ*)tp2OZ-IF&CF!AZOR7|8M(~dIy)?U61uV54B-V#^c>K?Xd=B z+dDeTuRZIn&xfy1X2U(POLRC)ytUe1Yj1wElQrlx8)Vzh7W|wzpxV6{#^F{BCoQ|Y z7XSdgc=>#G^63Ty)-V*1#CO30{F+@aBeLr>7j1WiRG{=l8m-;E>g6wJubc~+>D}qa z03t$!y>CWO!phFV!-tKu*QW=E`S?4hx9Wx9TJeOL**=q;FFqzq1d*JUM`*q((?o0I zo!uK*;~|k$?X$XpZk9B(v0kIl6AriwKsyCq2PMHLNZCQjy&>B(iyZzAN`MDQCQv$z zUYPD3FlY)US)3Q_dhGwRo&Y$RrKSSQ(QL3>72~P3>!it=j98tSG4-&p*CfMmm}z2a zl2JNl&`eCn3>}*gCFH~s%9&s`v>emtu3M#~LnK$EMcn*I$iaBlxVuBx!Sbp)^za zW*i`7mOuufeFg}=7d83@$cat93>p0;W%Bo+M&Ci0z*O^PVC0jCx`mcWFo`C3k|_Te z{&TKOcQJ}C&bwP4Z2Fivoh5rrSTyT|=}OJdS|{5DisN9pST&vmLs?B`4yzjFG>m(9 zISW(1RDsaf0MKM+>n2(La*T)zM8KBDaa+SIvFmh()a13eV`YihHq_Zzs;QIztH@;YCr$K zZ8ICt{H+VZ9?0d+Kpf{*^^o!h4eoEHnwS~>NO%c|ezfT_{w(v!TA{*FuxSFu0pTNj z`k(=R2d!}j@<7zrhdraOE9vJ!V>$ri7}mHb8T~x#6>|c^;Z1Uhge}2D{a^mW%sLfW zlz#o%iPT=d9zMN@iBs|Ri5)Fv?6+s+f!_NNS&owzP4`?}KS$@M^y)dck2Jr2iuBr9 z@@`5TS#LKW66?2fVKXdu^T`qkRrQ$8!hIq=%&-_5;phSa(0~CB zUI%6R0c8}d`DHeGe-_K%gSvDFn+ZghhgLQcFHvvE2~1&Fsvu@-7`yyO5%*u6O^vsdr-_vGzUe7W{W*NyvGj3R3+a z|L;~&5pw&cyz*O-y5VJf`qznvul6_9|9@80JZ9_Z0O7Sc@p-Pt``BSMujQY5ai7EUFY$tpy~e3DdG(@w`gj47#Jl-(Rf~UgrsjWS9=5C zd5JIxqSOCBHK+0f-5PiDzCYA&e{P4BMQtU#_IXlr?E9_Xe;|AOmn`pOkw1oIWWP8p zUT^z1YP#;nGO-bo!~Lfgs2?eSPh_!@iusqtZPs(B6$Jnm%YVHJkMFv<>1!y}27pZ| z-+g3baCkXBa(v$rc5)}<2AH97j+r_OdwXW_7Zh`EU&Y@u#SGu0)vViK852w30>drr z<(@xGXb#DZ4RWdxIqTaED*LHt%D5~Y)7NY1K>FT>viUgAUvWL5w}X7dCDD)**^AWU zax01Q0im7Y0}3zzabD*H?hRpbT2$hP12%epes@l0ZqV}tVtJX2k|XIk0fqW#@w`;P zjR`?$l#60H@`nuMMir5DpW?KW$QJ+%BN`^ZoZD*Te(bY<{pa<+zFZl5aC-bd?_PiU zlh>`Ee_(87G=6)PZ}@F=vAg_ZBa7dQcI_GklisU7j+?|n#dAxOHj;%&>p|Z*Tzbq{ zK0bzd0pODYP!h|%_ecJWbpE@>Z(w%JQ%Avm9-9(vQZDS=^#Lee+^e3_qg^ss7S)n> zyr1q;l@LkBO>jgW;lRZWUwAycg&+cVE6Mm}`WOJ9xjVDWcxC}J^$Tr&1fpcI#pmlp zpHB#gy7*J~P0o_vMiMlS_$m&R5Kn916UZP6Ugs3)0c077-6uxL{fl$L_yS>bP`eMa zQF8w+i|3W9Du~8@to+HjjYx)>J-zPU`j6jxVA-!;I{n{kZykt<6W!?aMx1fl-dWf) z`MCYu=wNqvSoLni>zhA2gQ^NKU1oKjAF(L>b&OrSkU^u{1GggKrkm@;7PM(GKFx-(grYwPe;8dW22Tx~bQvd)!h9Cd{0000>9{>P)0002#2%q>L z{~7-j{{;UI{|5gA{|WyK{|EmK{{{aE{|5R00sjX+_oU?p7zxyu6(f(QQ~wTX(iJoV z|jt&;)z*+?;rMn5FV0_A)X%Fgx>m*;~#IFYPDe@oBhM z=O_~Zh8IBZ#Z$|+2Nn}LJYL*RI($Yv-X%X=?OC*Y2U3@(C<3pPYY7FQC4U?>G5v zSa3<20=&$T+d^H9x5dSg!)pKU$U+g|uRs7G;8d%vhV$`ud%s3C73}V!a-QC#(k2Bl zck&3pp9}U*JCz|fGh)|fY=(`oaXPxDpHOGJEtq)T7E7mXDu$Lr(TVtLxfNw*wt{&! zKNg~>g~~ahWDbIdfzj*v=Rr+*fM)@6eqrQsZ%t~MN+BVsf>8SZR}Nm5BqIjPfB5_VJwE*s z2V(ReUw+7PdbauzyeRW`AC@=IU-aUw?QYLMMBls2@{Rp1%P;xs^V7G-r)w-fFQm%y zzmI<>5vtpHaG~rzoyj&|mibS>}KCq)^|O&pR?tTcIMnhBCQ;VZRuFEBz^fujzn(nC0+Z0<_+G{(%Isf!- zQZ%O>Bq~N*Mh@c~U<3XJrSSnKD+Dn=FcL4^#zC=pfZGLPd^re=;yv+OCQnS5NE2NB zfBN&kKPz*wvJstref-2?WAr53{cb+=urE(u-%tK*aq)dmf9M;J_dO`Rwz!MPm_NCu z|F;%-zBB6&YbQ+s{O$Dnx{7Fo^J3Mbr;T<#td=!Abp3vD?_1cgfR5X4zBc;X>&i|* z=FVQ`zMS7B%ia4`vQT@pxm4`Uhh}S{L*s=!?Qc`yZ?y|b?!M4Yc4DA{wsBV4Mnmd$ z`_A}#VcT&ckAyCFAlWtWNhN#6A$>WOR4TH*xbRt+8grDel!qxBZe|r4u{!EZ=wYH?Mlde2h}UAO1k8i2Q}$VC*KiNuh6ARzR+{PM@5U5@N8AE z>;Hf0tQO-7NZe;X`u^YhekT3AJ@dD7ndhB(?^7N>xANoOm8-|2Ggpo=e#N6>4<_^5 z(ax!HEx-Hm@e?(Zjh4&%x=&X7Rl_PfxiT|l+%?vVfpNQ9W*%7SsELOO3IP6J$;X$A z&o1+qD1a|rz2xzGnyd5Ai`!neRD?BA^Ok7N)27`iLMJbPWu73#-d#*PhoPPYsD_A0 z-gaTopn{3Y15}E|evshK(2(|6M3hgGR`jzI&SaSqv-63LE~I7Z;LZ|*k+xd4+#TZI zmiC^{>^5s*HCQdv0|Lzp1LuMRR197RHU0pG4|HM0D7o(3lg3Mog_x>`Gf+u)O=SoE zz*I^kLgSaypL^R-wsc~1ZeAN$a=ChWcgF4D*blwHi{smk7an@yy4Qzp?niEqV`q&f z$4L77qWbw?{qC3fZMV2+A>`ZQ(a$xDQ+o`d8xy=`oerU9pbrevgLcaT008DgGUomI zW82ja003}nuAkF>d8;1IKd#BDw%ysW>qfMTeA2QXdzlCay<`hSX~X#wqmpOD;iQ!& zSq(=?&{)H{Otf#@k3sHGdcX}btpk^9ZGD4X-PlsGe&_UBU2=C@Kkm!iYfV5AH1cuY zPWDR7cgc8MXgzMfKVPTWZJ7-S(E|Wp2i4^YGW!tK{GrAuyb?R_>FW`bAy~_$m=*7d z$pIa4zKKbAp@`ooNE_R2m3lh!hVMfIQxV)wtcUc8TH)K;jeleM`l~}L zzaOJd$(Yy1a+z<;6Zxz0@9(~8T7dd_^Y{qR4ha`DpTJVA<8dDQnNFYNaw-4-yq&(S z$MEy^U4fD)d>(whKDY7KpUd6bKq@GZ<2ds$yz|MP`YUtZp1pD7f`sr761?`%!~6kqg$^o86W0=MpjXmyz=>(G+pf`l#;W$Pv#`qu;e+8~ZjQ@PS6AdHK`kX#Az0T`nvZ5z3(@@pD|)R|f&8${p@D z@^j_${k6KfUSF=S$)qix+*kLJ;f0<~GytCWbnHe6vxA&JLS>XZU*6M*%Z5Z0H9SHc zHWEKL5g9W8TLVZ46H7}AB2IsV|F@H%H^E2Emu5q+Cm|+D4aTWJBsE}RCz&UUDW;o_ zb^XpB%Iz`Ba>S@HM!Rp;oVm-I6sJE=o1a$=IhhsaTRbu{FP7me6w>>bH zan@IHTsgeFc{z55<)rkk?ud_^>%Ec$w#Xa*lMe3$9UKK!CC^v49w zDgb~wujPGnhjBG;2mo7x*kZ9ioL}5}Rs01d)aYHND}L*K{nYG~ zQC{`b8eEGuX)mvR^9);u>4z+D>)v^Yz1?*!00aR>bdB8$Dv{*9T5A49l_m8+NUuVJ z+;Z|Ti)Ekh`drR!o$^5*_Q0%@{9()LWKDB!b9wIKWDVZ-6zrg@d_Wf#jKc5Ddq#PA zw}C+4UZGj?Gq^Z@l`tfWFtJjoY%GoapWS9=X8ZpyGt(3It=aeV!5ztbU4K1z@=Oam zbhq5om|Yz=en0Q>`B7trnaAoz_b-k{F^ipV?>E0XZizf2QU5FW%^_ZF%j?5(^?cu- zmhQ{)>;nJ*(SBICmp&QACkg-}+V-?#e`?Z)!T!zR-{vBjv~=EZy^jnnRZMg-CtOWy zBj%fJPb8v!<(n%ZgCy; zOB+Z*?Sh=yjj26lcRn3C?XTCRb7dxIY8lCTYN)m{xaUKsO@hmm8w8#QZEie8hRD`- zg)Oks*Uo!ZchG$EA$pWGRF=HYmc{c*A!PQ5j-o&E({a}M2IBEe9p@LHU;T-dZ69G} z&8p*sHQO^xcy|A~)tebFK23=Gan@3=+0;ChA&D@pmE4G!ol7W?x z)mTGdTA0&8nED{h=I6^rNoDau8rD|-$^=O@Sp2N3Ge9$#0=_bN#{r%Pb#d7>K~!;G zp+}ayCvD!-yDh8b54h45cGyDKwJZs-1XER_#s81)o?IAr8%@U27v3IEHukTcUrYbI zd#^phSn_)KdDV-W%wL#zd;0kG-&&g4K8wXj*ewT!E(%}?9{coB^=DIXz(M&oMP-k4Yxb5Qc z%2&9T!ar(F+1xq=uNIcozMxNTS%B}xO^-?K1W!K!0!{E$1SRmrkE;>BO#?m$b#kXg z{(&xhV1?t(LAANlVzUq|@r8xqGZsKHd0r`0m3{jEFJJ0l!@X$rlbprbNRrXtt=jW5 zvD^Lk7pIw<|M5-?51kIre_aeF9UhGqd*An-%bT9tu6F+{X{@U&X3es(6S0svqT8#ZT~?@c-a04P(pT93e9DnzzdmwGDEls0zT*X7Di zfM+sO=1vIx`xj8Cl(x>PlYRns@iBuf=CUgl`h4ksaUfqO!h+Fy0M~T;ss(M!i~0L^ zZhT|35{A{UG1VhvIL?=2I5VI<{MJc2KfPW{+O`T)@i_+g*3ANomT1E$mF94s2d!Wv zthvD>UlG<>`FeR!M=ylQJCaAbLTzJ9(3;e^7MOzAQVoJD|Nl4yq+LWjBb#xFrqPVE zc4MJ&oQ^fCbDOc~*gBnV(sX}1npEo=v1~&Ru`X>$8yJ5FmKutr$D{YI9@=uu?)9;& zGxsE2t(^e?Kwjvtvv@MTjsOHrv(LLEbrWqXA~yB((Xp8{9F1~Hvsynb(QcPd01D-E zA;IIqmeHu|npp}orK+c~QD=N`J;eRQCDE~Ff4)+|%-{lu1BRmC$Mp~LFR96OXul$< zm}(jM>+^{XCLNa+HCxish?blYd`K$fqLx8Y0X=Bsur;{>eg{o*#69gGrz`ZZm9H-k z>dlt&+!6HYBW#itj-CUwnS$prRVB)$&;8?J{F;P`Ew;XVLZ40f{NZPN-f(FDRo2LU zeZO(^+&aZgBe<@ZNld42NVFj4a5&Wx6Ftv|so(FBF(kh?0EaeJyV?|m$!=MnX z!06ynJ`Ecmb;Ywxo>yurTa*Xmx}|Pg!kO zQ@8t?O924jPKZ0RFUb@D0H}>e4lZaSwdmd9wgrrlZX)|9LlR-r(se&H*J&*}X|Dc2 z+fXr)u1UeswrysN32lILty)f8b~CDyZQTuNUe6#iHu3#CQ+6wbf z0%8!~UMpTBdvl#HR~Xaar*ZLGr_0*goZ zw6Wx?TJNAyu235Ty79Y>g|2F6nY=_*g-nzijQ!xQnv^5UFij(t>A7w{+<$TQu}RT? zk=5AvZnS6hd9i)baUZYFx4k(0eD9iN&R6fT^O$eXKU=Qx>Kx$6uaA#KS5Zah`=wja z(@bcLVq?jk?Y=R*oN#?f3IGsYm-qkI{qMK~08zkoVOo2>-not0ibUO&oyaErTRv8= zAPxxthfu6|zq=c4mYz5x&`N7fNiO47u+~A$r}*#7-y^aQUkHS+#e>xdQwiHmsicyp zEq3xtwHO`g%OfdmeiM?+&158l5;blzb-&3Dq-PUO<(ht!{Bk@%vycvp`F!3!u7Yj(z4-Zsbh}e7axJcn zRi!oT_~yp;py5useI*6}bpO$z-#53{q5^^9yj^Z@Uw*Vd!OXU3)10{8HoEu6xcj;P z5lHlH61pPSJ4A5ymMbHeXf~WwMr}TtrsF{HnWt4(4W%C?jcSv%Bn>6S_Kr;2wCGQW z0?kL&(~3w#nEdaSS-q^%Ik4`zSpvSLv;WR2L{Ml+5Cm?*S8#wUYQ`9v;-isKMil^_ z2W>=O>K}jZgKnfgqm#<; z4-hsRDP28zlr>FD##l1U96yjf=jxS}Q7j_acH-K7Bv!2q>*2cJ(`GNfw%g6f^g)r{y~4004H()1UpXf7v}yfSS=?;X;jj^bt8dBG;Hh-0eXUH8_&00@aZBLUm=UO)}ZD^qQL<9%n{8-tk(0jQX+BQv6m4K^`x>{&{1BT3$3P*Sj z1wPmu%?$F=pve2fxG_oI;Ir!;xG*S|@k_gDCY%Pq^r)|_}tj^+H7fB8xHA2m|NN{h32rV9b0lYxl88_y9bSl zM9^4E+P$UNuXBFtYN{vzAQw5Va{Pt@U~_}3yT5NfMuFTemq?cMA?SGeza5@w7~69B zLSR92#V#oRX_K5H@9P3ct9{d-@jAlFN3qa-rn9bW-$OCcr8OF;J03&5qM@zg20o^w z7kY`RYxS{|c1#@vZoJQpeKBuic3<~ryzt|%S;k2to4_j37y99R)?m?;-5Lq*B)A3*?hqV;ySpYxV~s-t4fN%ls&oI^4|_ka zTDA6EV~+7ng(($u^-2C2ir;Tk2#|ftw9^M10AOMw*7a^*va(NO)5$ql_Ia%PH|Kb!Tvv`=6unS?) zrPRIjJQlO~C?Dc0=&U}}gsg-8Oer>kXA4<`NhExg-v8;hqEpmwp)M;Nu^4UzhBOZ~ zpaQ3GSt(2S++g=YdlCne4cP=qd=9r*4JF5L^)!|6a(tO?)T(H?7sa8~m`JUBSZ$>3 z*tPHsij;0+i@UPON$bq1kd4q#UeetwTN^@hudquuY zO+VXpIlc;P(P_yWjD$60>|fBI+lFcvJzYPzexy~v>kY-8O0F|j7}*bwN|rKrR7do! zrJk|y`IQ^pd13oSLe!{W5!2U<RdnI ze@y5mP%p#c(W0>iz1+7xb<(onMGp#UTT$`7!AyYU)Fuw?t?yO+adT_nxAK2&{L)&J zB`Q~Nbi_FuF*mMjaXsf|iwLMU(mR_5{?mbB)hlFn`fpX$C5gP*tZYUz&JQs_od@}9 zQF|KuGHdfe%Rx6^!2T;6&WtHzfrgdNoEW#D8Zs0{($le3)(?^+`QYvOto7|nr8@U) z6H4t3E$JDKlWU1NN|hpx3T1Fs5W~;;vv?kX7S(yyZe@mJx+m57RyF-f_3E&{$sTM| z00C-S!1iHvAsU=im_t{!uGD-wh}{jTo!>Uy-Oh-WK}p;u(pYHl$0ZqoX8TOSm&c{@ z$9GuB3sBID5vIg*@5Rb<`nmYa?aThe+>Ws%Q(GdDTY~%wO-}qiEWnu1$il*R{Ctf`)tj!E z^UP9U>~WVSNhix|czCiXQcSy}`an&>+(!WfJleeK{0r2|2a)O36viA&- zXmIhOweCq?Hj_5Fez#gM9({|S^SdFoI-k16i-M3^8>l8a)-_4^zknrzz;dvcwT!K9 zHJhH!S6A;zE8y9T)#pReDNpUX2D?bqbbWhuBw2z%USxlJi{1q zieV5}p0+ioZD9`j4r9bK`J>(BdkK_0v#8&!$q;)R8_zP~{6vTFv-QPu|rkWZcVs zujXwLZcI!ntg*5?EmTuj!<~?&R9IpB?#+bW{Cros&=Cp(mZDaBp!`V_b>7=- zdY;#tx8(~KO$UFtN^ksCxsH|uFgz#dG>J7x0GgL%1H=08x=z%i;ZxJD;lng@YMGd(Tf$ zN`BI@YUhi5iXc}E-E22-7bku8nUQ{Cz>d;S)ULyOG@9WbWmB5DieANPGmGT0`=%rE1chBg)9r3DFaXLg zp9VL@e}6f|<#CcRcjD#zOoT2&Me?as3qjWF)*+9xTfg|2BUET2#=P82)*2{o z0ap>2EyhI?Us3W@@Cm3!5!~*rKh3A!a%4REyYPx+A~%^os;XG>$BtFr>|3TmbwCNR9fe)h_yw27UDp=VV86 zWyu?~{55|apHn2XN92WmBI!AE$xVFX)L#ui+sA#3sbEc;facY$5dFFG!?%tk{nx>a zT7^Z!W|#JPgP*~ReSHr8waSu_*$Z=*?Hv`elO_HVE;kr+_c zlL6i9Cbl7W@QE_+?w%#z>uGzvK9tDn%CY1GpLYkB7F4Qmg2|*#?Dk!KON<6Eeg8u`KiBh5gY+Zr9*eBmlaa(0JoP6xi?5!cE%Uj zArGw6paJ;2J1)JOs$bv9H{suGU>o0|_N8nj8db;Cuj~5}N1%ee#9w}38gfn1x`W$7 z8ic6J6Fxz)_aLpINN3f@iCXU3Xf6}8zDgZy`6`yFKfD5f_<5;hqVI0!8kT`cNVenfv9fMjFJ^-8*iOb}Z`=V%me-pHgimQhgu!jq9Gqc642J~O0A z(gdbIAC$4xNC;DB8XfKtV`K?Qu>Bs7;(<07E@RM=w#M&yzc%QXO&FA?idFSZ{)6nJ9-YY*H zkG;qz=_Wv=20i-(!;`#~@h?Pxou{p~gYxHH@?Dz$sS`*v|6iR5eEWiPp@NXY5Fei& zU}&#zW(o`#Dg*`(g`vK@kt$KBQ1WIm{HNx|-XI+@WhZFgR0lDF8)o%}4~FWos+Jnx z#(3@e{pku36OSF~VM?pvc<0>x_UBfR9j-*@Y^wdHeI_4?#fUnRSd_{{a~ zrz{)3wS@U0fieqegBbn!>`1Aih(itG`LC&cUB~k^8yRM0{J61z%ITSnK)vdMwNhxt z=F>(q&))sSnX|{6$=wAJ%x*@*o+Cf47IF%xwatB>f^L12pk?=H|>pShvSM{NqFOW61xF56lc2=`B zU~@)d!(x_ZEZP1>nCx;nQqc`Cx5tzgQ*~awp$NEQi5!$CP7>eIeIB0^xIUbq+)#KJ zL~t`wc4NaTf>L(nlp2HP?wX_c-2uX}1iEnwlrT{(k9#Ta)kgu0F1IhuxK9?mFPvR% z56%~kX*ElkF9*NuZRoctaY^gSBEX|R)^e>d!-)ZQtvw`4ZKO6MW_#n~oait%z(US@ zH#?)AsLFY08da0_jyQr&+xc-EM#y^-HsC56pm4js-AM?;EjO+Cpj`5oB-VQR+r9&j zkC>bjA}Y3TZV}3UEJKl_7i*ilqq~pt9e@ov9kFqloF?zDUnkOo!*(NPqfwV61z$89 z^>!|K)CKPS6y*~}-yHpz#r?H=f|5O#zd4(hx<6(R2}=HkooRJ?8;!W7Geoo8*V6s- zagu4e@c)fh@kiRh#9!HY&wk+rrxY2Ha*oWFypr-Q;E&$4%F^1aP#7Iv3qHsY#b zIXQ=|DPGc^d=x6VN?7|MW~FA@dB!%PVi`OtF<79vGRzLXfoyea@)GG}W!ujKqU+v% zC}e)eXG|#3&J8&M)rN-Yf<)m1iv{~no9sJcGjfoqwhSm&)5hZs(p(Ul<}I4RlTTBz zlu6T{j4X$4EDySVrz+gJqn4q9uu<1Xi$BAy%pl+SU%u)Q&wTP+e0tBfdGN|ssd38I zx5kiOUkv=?YcMF)G4g5ROZ}wQhB?0S`ka&u-`>_3HWxA(1}F1d4(SfQLHKj+LyntL zfkGWl$HcpJUmWq1DDBeuPT<5o!(e6VU>dBqdd=OkwjMZ@H3nI*b}{Vreb|8O_A@_^%1e_a#Xp*TUsfC+6 z34KNa#LW(}00M z={gcQpQlym_~zTxZEf#14VsUsfgJ?|oiwVPdwoeBTAC@%a|PNaIfj`-1ih|7wz3E<$Zc5oW%#$D@qd9RU?2s;s6_ACLK~q8eTit(97PL{}5cTf1Iw zM_mMfcYhGOlJ@`ElFqTyy(V6jZFG3Ss7s=9{U(K@z5*!7OytH>VO-BZ?2)>O|u zSO7Q=xm?q2E890=eB|nRRmlLF#z2lUcT)sHggR6zoR4?!)QyHoM`GA@ArRd!ov9YaT(LTG{oc^QU)$ zgj~0OVEdORJp$y5x|x}2bf@FI5C*t+{1?-r(%Zxh+Lvji3%fAM^gwEDJ@{Y zv9pNmA0g~{j=iY_hA0|@f4*c+%Q`QYxch1*zpQtJQFndK5y(4l(M$~pMlrfXwCvF> z(s@(Kr5DZx(G_3xOnP>XU~ zVl5YW55JxMm%; zoA^}gC!?b}5|mCX(7@)LuALucuzlX?+vP*}cvn05owx4&`#zWJcPQK|SkI0{ z1d3rj^3%BMwm!r=*|pI}KcxJ*N&K5fB^HnQgBtflve*J}9$|HoWjchpP%Fv20M;rq zdzH?xNycQFf|k#}b8B;EYdyR?bqr<*B;}((_dk$WgGa52-^!n{ceD;iMt6dpXfMMT zI33{}$!eG5z4cE|6bP%?@ThMC`aTWT!WwpL$4@3*7c>r6$AZTcgF1ypVsHK825UGk z53YnPGDf508ys!up{+KD+HI}9k+yL(V?VaajNVsJin~B6YGzWz2!L6@6s5c~#~p1? zdULvJH8qX`-1qf}@G6|=RZboT%Grml%}F2f9{n*wLrx8i*k0`0(=Ksd&Q`v#2#T6R zFp&}ZS^k|OU$p(yjp|}&C5IYc3(y;h*nX$8-NO&2(iuO8xWZ-)pujRY)=Z)u2Z>5) z%_%l@#J?vpL3bx1Hbr}WU%DFw=v-y6urBEe-;9BYZ&~iV82l2)(ewk&PMdz6e=Dtu@vVq$}Igv6jk88by$;bXUY3n8VAB1PR_Cns;REN$(w0z*UqcH@8~Y9=RvOz z_phN`fek{j6vWwgV+x2`afFnvn`+T=sDOI4oy=(t#jo`#2$5Pq|*zMDK?+l^Qm}Q#l&c9 z@Vt$DozsdmBmEIN$eyoJbNXH-#9C`8H01gr0nYfX9%Pec{KbCfk=#0;afJ7iO(?V` ztW@lb6#Q$9&3qkx1{rcE^p%#>`wM>k@wsse(LN+U}SyAVTnRy zqQW@yMm)h?_iICndDK^>G=p;QK)foQeSZ#tyV`J7%ki_N$#DIej1k1wEmfrXL-I^} zIei@??gc6*<=rQ0L>^2z$L~|6R`wF`R47Js7$U5{=N;CY{Oc4Th4`7HlYpR`H}WRQ zU6uV7;@@3d?uajVc8=0NUMZrueV2*98iQ0j^X!ZH+jZF`*m_osqjXv#PCYl%6nMKC zN0`nf#DjO0(q%^0^0{HUclB%=BbUGQMccY>0wkATw;_v1^br%XZSELz?Smcdkm`do zyUcg%M7a74pCxh=txhuA*gYXD+{YHU#O#t;;-oH*^Z#Z6va31jWks}1isg&v$)PjO z)tTs!UI&A%v{UZrb{H^K6zMXjKB)g318rt5+D7#%<%=Ym(|K3YX1P`LyqY3yoIs6s z=^~lJNb~%r5Pt~HbVprD3_<-mGN#j|G=Z%=;1$J43ehseid`#k%--o+Z66$C-=3wK zZqIzL6&tp#%pQ+2s&LN2h~)G`|Lomy#*K`0ju*eb^oNYGjs;ZJ6gNdkKIAQjN4iEl zb`sGc)ESh5RlL~sW4jZl3T*9SMU%s>^lm<|L)cz4fvDBSJL-{BdyUeEOC}twa%65p z1Nw4Hp*Ux*N8c7aqwhRZXJJD0uld~MoRU@+JySxB%dypRzhr)bIXO94t zv{oQ&zqNE|s=!r1yh9pTge=?HHMFd$&e*?}5{1pRL+ z0}h7$-!ul%o5O+N?ZJc*!N_3v#;cof2q^Wfwv*Q>t%D#rsrMcTNyAEC{P4!dd@y&t ze9;`i$EabT7)-}nkth}HBtcPL!ChMZceo9$#5`@*~xA$$e!3fAAe#2SlFg|K4^#tgu%Ch|$u&H%nCMvSG_y7A^9^Kn&!ndbogrQ;_-y*`GqgcI zbGq8hc(rU{Xz9Fabk&YRzFBs{SpPo12-M1)-F?hMZBU&Zk}fc|zE`_PX*H_@__{EWyOwsG)Eoow2a+d z*3komsE&8Wkt-YX3%~*`QmUnw*d47nG8NC8#)6D2&za8ze08>F5tOF&&if-M@u%po z!z}zlww;u9Vc!o83aZsy1-Mu#_XO1(o)atQps8te9PRgdJ~kGXT4eq@)UIms(e*MV6pvi ztW{eX@~GV+AMSpUtgnCMp$=j}wiXrH;dIiYxWo5&n_@k#?NJUI#J{m+Lnz{<@oAVX za654$D56;|;qh{OI=@b^wsq8t?OI!xBXT)EQH`$Wm@OIFO3WUf@xhCku;)uSfe{mf zokKkYNK6UQ8^yRw4a6m~9W?f^jNf$uR)z^sZp;?p+4NJsHNkCaXv^NL?us7|7GmNy zX0lK5wR71zV!wAq2wu(o6>dnVm*KDAoliRzGfj#T0&s}+PQN%9U=IMboj_=6Vk-Hf z$bVDAsHvZr9r9o5rsDV<+V;wB_yUx#W_d}Q7wTZfTLwp3q-ahQzHc zpLiP|)PPc1W&(A0vIq@?4gfba%n}c|!l;@^oWh>Q>_iJEeke{-;W(6`>Mg9=KRehr z91AoMxISl&TaT~^5kXJozTcBnZN! zzC?zEgGZ;ak;}+N&x%{yzmg(oE{Iu#STX5rtn|H=fgQ2zL;4RC5ukV#(%Jtf z+?7wowQl*|_hZQ$cTzHT=yjLts@BAiVwi30W#$YosGiee0vQNbCgDPk?3CL;VI}Ny z@!HGb-%#zFA0T9uDJMA*WHj(s=3JDb#SASb&%vX2ad|7ffU5OHjJ<7$h#-Wcv-D@% ziwi#!wiqMo9>CBM|b~}CaGh%F#xwJFWT+ust1Wj2V9ql=+B;>gPob zlGcQ~CbyvOjS4_%@u>0|iiG=pw5I3IJ1YEk&&(S`8I-+8iCZM>kZz%rW||L~lXfjt zvR6{L`+(G!P7$+W*#ZyS0`yt#)Ee?C8 zQ|Zri`kh`fIsJkAeZG?o(+eaj-GoU(9HJTVNWvOxvp9{wr<_T%-x+}yD4v+)1wVMG zjqtWPJ-1S|B%!OX;JzEbl^TPZi6z z8X_xf)-;xMXus`Z&`a~5MRx{z0h87PTy(G#cA~V$Rfb7-NX|uv6or59P|gHJfkUgJ z&cWKkWeuGWkBdw1KF@*yu}^{)oS0j~0ZGL^PL4&&P6zlKL?99giNq~vu9-mwG#Q?C zO!a<{b)td)nuaxu`2%HAf9;lsU^M6g9CI)lKgpwZ-_vu&3>Xz9^46KK|2eOc7=Qn& z-N3KCKJxeL#8z<(qXO-9c`vbl7?N!wogq@-s^v)Iw|>3mP;(l6X{r*k2q=5=vCD!G z@$z+1UYxUwcX=;OafMX&Xq2`&-F~Dc4nRlqGmS667^NG4M0+~A+~|wS`i!@fjk1-6 zKohIaZZ~(Y^-Qp2EtU(Pz5ZeTW#z@(X#g#ZSeA8W=vep~xa+dFI|{zPwz|T%4JHuF zO2X6s&TbGF-ylfs=4)XA%>?rMEoGb+sO}6LfHockl|>UAg1d+V+z+>#uhv=z4^m=- zJ$c(iI|ZxW25R{$BucN+Y?Uy!oL=Xoe($o$LyL$V@_UHOFlbenCL&C54Ch*Thk(}e zT-7JBgEoYvkDxoFr2{5xG2vtizXZ01UUbc6r=yi;`Cn z`YYxax;PO~#|1cxs~93zQ0>%Ev8klZMHfC(?-VFqXdhPM?ua1+>m|!(xEYvJq{?^~ z04`?puJh(KCNBOS?}*i)5On(IW#_p)AuVZ!+9jT%1l^1wXjScw;y#7k@n2c^V{VPeDnP@sCo)vv!Ycz6vRO8;yZTHV-VB-?JnjsV|O8L-2~a%xFS>+#~i zAKG-+&02D~z6LO}7+!S94;?j<-u9||BzuRN$PlO zOVsoM{)KRQ4YT%4oKSq5&J5jurxd$>xV+FT2+y=|UK^|O-WSh+VQ?7X1s5`fx+laN zBq2tU2dsX%qpZi=Ea=+qt;<(4An7nj6o1CQcz9acZUA=ef{pGi+iI$YhRWLFxH!%5 zmpkn%%Uc#)N13Q!qQ81q5aJSZwM`3ovJ*I+mhEo^&D-%CIW*J8mYw;dcN+ywXWVhE z2UwS<)Y3vLCuDmjH7sc{?A=Dxmtt5=PY#~j^>c`h=qfEL-v}b~;Dyvy6+I?~b)NL3 z*%6C;CnWI|lMfb(b+6d-#&InZ)|Kt`oUEMQJ;G=X0wYVtL63Vmo}%BxJ~JnvmHv#s zaK#dFkd~LR%?!m&PJatwfawvJ$khuf2`1|7U&1*_WEm}Ep0b*!YAEeo#0F7?8aufJ zzp-*B;FEkGPCSC$cD5Nn9V&_`J+RA^Xs-i388@koG12QsDQ51KwGdGJ++Ib zfW(oS_N8mE*Bs&vs7txWk!J``N^krxZPtXKAC~XZUFZGjj@Y?oBR%|D8*9R`IHXy) z*WMLn&Hquox1pwoa^JfRvx=Zch~xrO6vA6$@k=wnHQXB&h`U8bu>Y>xP^5fvF}u#dQ4odxZ`e~Y zW$m5wO}SzW_a%1cuJ#uj>S@Hnpq}M|U;?`mxNT%3oOi_NdL|-j4G$Zf(D1}$IYQbK zCY|SMXh}EjLw=snUKoegPdAF%_rO~dQIGTiOAFDn$i$fiIf+LJlWj`B=?>`_JabWS>*Qy{lPz8}~%#inkC!@uPgD*v_GcRYt&7_-rE*eeaW5#>VuS@n^ z{P_#_Q$9IGI-hSj$4CrcI=^pS-SP=vnuPRKN^ydB@$rBk+0f{87urB4&77wP!k{8t zn_$8>>0NKG>TUPm$n(?a%w&kLnaTe>`TeQya@KYV^JpfV>P^BcjihJPWnVu`@BNQG zC<5c#V_&hA)9^3IiQSr!j|9TUNqjrUWwdkHp8XMcY7tx2=~~LnI+dkXpx5gv>e>A6 zctP^{0l5G+94LJ7x}Z0fm6Go#6Ih+JvOCtj?q?wh+2<8rm;_29=5<;7Tl$)FT`y9d zEg0nsPwRA_i+`v8!4a~hZJ7pnp`hVxElUpW4Qch;_+SzhT3U98`=f zS5Z(po8z4y>W8ea&EPn)tOyBy{?+WGLY3WmymoI23iQ`8b9Zmamnr>i2s;mnV!|Ad?j;5 z>p=#WgqWrrOZOUAoc*~Q=?vHI!+99dVCTbh>K!*~G_Kx@HonW_Si%kiMO5OA1F`5} zvK>IR^OeMZQBStu);Txc4%@|JY>ovDO7Fj~0ZrvTl7?KQ=QotWfxIS0J(3XmfnyB^ zJQ+hO)>_zz<9G8NFCGT+p)4`g?7ZK$W7Qk=!3cm~%)}d$f-X@)KH~~bsj6p(sBPP~ zCthAboj=gWcx|q}OJGWf;c>c`i=Q2aP<;5KiM1AFU7o8wZRJj)PEvd{8F-R}>YLcQaq6bA3%K%e z*Wrb$EN!c)#d`4Y(OD{E7TBFOvDoJc7P7;;;;GdeO{9pKuV_k*cu(B(@zAp=8Gg13 zkp!XAse_NTMk_qHruNs|{DxJXXEIJYvL;Ti?1B9Y70bK1OM$h-)&6-Mj7#+$ee|DR zerEMME+_a4{wP}H)KB!ObkS_pB(@vb9@1xy;YpUfoC~OM{{vC{pW+exrg&&#>fcbk zNgL>IMhVm>7|EN?f&50Kc=unZB@PVx28R812-PFdFzQ;=-RV9VZQU0(;gAfl-HXj0 z>Ot%hOhT~&RH0X1P&aT0jx?CMVK_O$pqT>}~qB2s_el$n!6!Yiv0Vp0`QmOVQFio}uO* zH$M*1&nqU&)nx*FFbiLN^vKZ2Y%(=|TZ`|u9pJuCs;-Ma=>Ou?-117;8MEBrPp2RI zheP425yr#7gp#&f^m;qAPi-fiS0#15@1525fh+eL&VP()3Yb>djr=wD)xfWHBDORb zD35d}@)!0Zr^a@mh;C8yc>ast2B@RaFB;$660{=sTih2}(*=|UeIHbx{?eRum`h;S zh3D|MyR9AaL*U=mP8sY-Y=LtJN>8r|aQU9_^pUH^l!?9K{Vwxi(vjC%y~H`4 zI?kcoytBU>@brw)+#(j@|ES;N(HbWhJhSv?DfE`2k*d(Sy~jghWO})#-DMW&aL%4z(86?L_yjs5hZA4=&Tgj>nk8IGo_3bZ z1SAc#b1s7KEmZghMS$D))UP>1@3?aRP0gK?^Q$#Zy1z6U&OlPEJqq~qbsKRxZ_P9sI@UKVgK{1LZ zL_l84re4oO1I7Ta+VRDaqEGDOGSDV=VwM`03{WF>dA=r(ufnjmIx1}awXc*_(xhBG zhqD5vnRbq7c^T_O2e_-O6_DKmZLe=fxyve8_Ha5zR=Kg%@n4G3#Woc6c^T)WI!4RI zJvir4LNp?$b1JyQ6Y|c#^tNWK^aMjUx*2ZA1Q?+QZ3KCFRx)-a)8gF!HpkdG z7Kve{if9KuAxbp zhMfrxc6#qLp!M9MO?7f_Wm9%eXTU^a`ZBgg@Uv$&y9$uzg_MsXet^N?qQxIHyhq0k*ZuSN#+e_yS{p@@QcFeym>YBHKAlbn)WADCifFYmrf zNllX6C|xAS-ZFXS>ou1H27&xuym12U}tUv;i4f9>rj}Ml(<&L;S z@WP+qdXSC!Q1-ELB*o0`vNpw!21TOJ098 z7FN~v!oCP}i~kGMOD`V{PK62suQQ;N18S~6;4JTP zXG}LJZYYN6Pn5L;l7d3UZ`NDO{V#lKdfFYyPH2M}5-5?BG{>?9j7g)*fCz|bcy|?I zgdCN48Q$q|1p40p#7u?`5p1Y~k)2H8ugMoL|6H><0cZ7QOh*P%7Z)8)n_gMbFGT9) zVm~6b)G!x+tGvn_KD<1Jxz!=}SaZgG&oV(`%;?k%fWF*i)a7ovSD8Br8;Qr$(On#$ zLH2^;?XHuyeL4egyZxJ1g9M$8=5^MmBzAw>(?2Q3SRlrs9o zB&&`*yYX+cFM3+!6)phc_asjJ1Joc+-WBVKH%^WYmQr590B;@-Nw!4Vx)BsK zX=-c!M)KjO`nyOmZsZ*V6x%xEciTuR<8Wze2ro}|L+fl_KC`NvvyG9qEl(xOK*9+h zzmn*mu8tHAod$1R6ou^FdRX|4``y3Ge@}13n^#ZjFpqY%y_cXyATi6I-lmswuDHDG zQ?a{if1i6nB!5RMCJ<-?-Fu@;3CX0*7xeS~+p14-b}&LfgX7e65z)$uUHXj>dp&+3 zVv(+VpqH{8gF=IR`uZ9b=h8p_Jg#MA5agQqEX8}{T!|%=T`=&zOA>y>5+2YR%mf<; zFG%w})Ekq%(hInG*+(aW*g=T%|V?mA1}LRqhr3@!W3(s8y~3`;+!|PfxnHLNo~&CiNRv# zYrU5o$UhwBwlQr)wHd!eFl0g6bpw6a{;FiU_kSwz6g#*$5e-)Tw#qH|tq*Pgf@&|pcgX#`hIKtSU5F&V*U#a#GPjw0i4 zv^~l{1s&f=;h>+inG2S4z+J@QhxZx1)XO2Y$&LBb({<-KBg3Y?J@uj1+l6z)`b$#M z(gv`{Pjoq*lBurZf<5XjeSKd)t#y<_C#3rfYcHyXaSKe+sn7;^=VT4d5^(QdL5RbO zHfaN22#aZlQMO)(hF(=LuX` zx~2~;?tZ-N)1dau`Ly?gGC5*#Fy1E0kWi;~#IZK0 z_d>s5(}9%s%evtDdCK8wUo2i@F92b=Jted@P=zLZ2<~mf!W9}TM`IOqk>M*VluPqsinO2T zGpX)PR9?#KF#C*`yW>g}{~azj3eD$AJ{?J4=W`zNuP?jue0^Y)1)fhXu)F#NlV<&$p1@sd`tDdomPlColaRoE- zy2CAb8G%hIS=+O^&2oi+Y_B8a8`|$p-1H{vg1_m+a=9y)X%8A1UEQ*vC}h{?s34W!0FQ;0xu*-ET8Fxe-mXGNf6=+k=wGE0^VAU{b(f^?2lHO z?Jl|Ze$$_-O%voAJ-Jr?RNa!tjyIhhKb0W%ZaYD3lm>aT*s_PMnz6z|_8QQ)fAK)>I`kQhSb7g{aU0Qi=TNwaEq;*F;sl zr|@`d;|%|Cx9B}mg7Ptho_h}k=1f=}x*R!2wT^3jXDZt;&jAvHklX)xr*IHkm1lVH zdov_DdY|c^ECOby?iBTO)9XI<{9P9K7W_D?JrH84H3@3UXey5%^Xo?2?Wu`>s+TLQNgi#j-M8WfBd$S3O|(%0f8NcscelOsZwJ&#f5u!8|NE*PMnl$ZYfGsy48xzT zN%ZWMu|-$8LnNq2P(%ZU8bY16^hml&31qYJv3?BX(qi=-ZN|RSvbL=~%~&3K0xEDd z_{~$YChY1b}jn*IGum1f=E4;~t zxbL`SG1(I}_VdaTv5i2tKnAgmtp$-;%69!{Omh;Co{66*O2L)QIpF$;RvRaZ9WXrK zffpylJ#$Fy$ako&dxCYT46{X*4#wDhVvr-prt`2ZLQ3qk(Rf-v;utZ{Iq`SdYB;tX ziT+a0^LD7S+`_Y-(`R_OHR)_oqjsD^AqeyCWflh^_9zH*uJ8k@sj{>0|2!MR|EFL8 z-xLh$+BKv1|4Dqji53WNObWs`+Xl{?o`Lc9;J%3&*l%y-9+2Zdgcjk`A5b+gQPs{^ z+lt{XJce-UQdEX>8cb&F1H8TH(&LECB|Xg){?irsV}`Dfph0x&ni?t)=+o z@#-Jcq8Z&OUbVeKhZsa^V${3oQNR2;o@|pu9HjfXwk(iyBB;u*Gn#|W#;{#;weLL* z*5Uo>RsHJkR@0Qc%S&(a>umh*9Ga*UQK+0H?n)#{Z1b0iL*aW%{?eVeqC2BYP zXwmS5PV>^*E&{JE&NMzbm$F}cTq{OoFAb8t`?KaTGiC@&0%-47yKtU1rMJ|Ri*V#i zC78J)Rz$Jlwl+ZuD_Kr?OC^c#<<-gLY&ClqeiTF=DMQsw(Mhr$Mn3|KR~!e?=+Qe4 zG*26Dzn^s5L=kiAMV4Ji8l??C)$KIk)EUuL$z8H45PlnnUE%+9xpMn$qji4wqL9Eb zF|EKSTwVIozHfMm?d`){vhe{D$oKc(b9CEbTvC^jFSKolVok2xK=%HSAfkgw-89HM zARlM1VaCC;;09hC`5Ur;J081 zA_?I1E+=8g1WeH!f}V^z%R%j(1~p7~c}`=#RA#%qnu;dqJM>dVk={&72-=$3UJu_a zpUZBs#%tw@XBjp5`joaY=$vv;^KPV8_YYm)i*Y}+;E=0;ZAk)UCO`4RfIb1=04H%7E$nC=6FmmU+ql_gN{c_Ae zk95BldM$OAHL#(lj9_-l+5RJFJtGS6uk8}j(Ms7l1T1_;dYpu#$P7ZjHb%~CCtP2i zgZ`EPvqBsLkiovlDhUy6K>r33FjNq0wY;W_4W}y>HQ`J4>%&TdqtM{iaZg?Agd{`- z2o;ITZ^o*+R}5%ABWvTCv;n%qBIi`7)O;Ha0;ipZX<*jrQ9C9#!486ypy=UGe{|mc z5mTKr0)6$4ItMigvgiX!(zEXG3VBM-6H&9ex0jM zZBy8VF7QRb!oL?cpX8e>Y-8Gyti9dow~oQRcJ1q;1s0gj!*JkCj0yDV(*BnJN7Pvc zwbejd8<#?{B8B2oiaQi{E7sypad&rXi$j6p?(PztQoOiJaJN9Q00|*q-uum+J4sF^ z`I(%Y*;#w7XN52Nc8!~I2n^`yZ`aK1FMzW6RPvr~Vk-r=Q6_#B2)FhB*2GZ_GUUcW zW~o6%0I#TaU*YC48FiVh8?uI+6<|`$p-6BtsyxqLl6M{x^;*Y8Dq@*pMeb-0!M3y4 z8V*O-j=iD&Ec8^TpO!ObLaqskpS(vJ;E&sqqra|(PmX`Aq`$qp5!z53 zab8%(*c5LU@yybDbCJB-C-FhaV(b0p<_&LK%SJN#SLPH89XfD zc1QcNDR+$DVfF;Yypz#Ikad^9`-ZD+5_E2=wuaJu&lx_=vDsY#;Vr3>=k=e)7q_b2c$lb?Hiv z_>~tXlUrW^AX((iDmAVT)%*J-#14(ocJdV;+1TXdKp1W?+!@;2kmZ~T!}fUgch9TD zVHIml((&i)3Bzp4K4dAbDma>#krDNJm#@QK_$Rx1L4S+SD&kTaUCP$=Q}v~{#V74% zKK+1n+ia=)5Gv629*tdOxR;&^&UrB&PyCsB%IGN|_8J3mmdxSNQ!yqT%Ep$N!8cp7 zaKg4i2;WfA3D5^Q!7wmNFBtY-oG2GgEdBtrSOqla*Nx7yF;lO@!g|I09% zw3!MHj{e#12^;xkc_zux)^g(vV}THSKe^~3T?>_4C=v8{%$3TS2Sp_znIbNn*!hxU zAg)=Trdt`&tF;3>bJP0DbBPP``!ppJ&MpVAo>;^n>RF8(R{nyvCZ{-zExsQt$+rQd zo>o;;xZSNWhwsQfXFk2kOEZ`Ed|+<%zZm!%YQkqOJv>Qhb~NQWruV?GWgQV9;!M%C zF+YQJ)$~3xp!+Wrk z;)*E$aXxsJEFSFvXR+;zHT^hunJ@1|H$P2uc)37AQ6m0kl}@2l!f#_gUZ^|Qb*5i(LW`@m`bZ4V z!J1wAHxGiIF0}*(9S%MIjA^gmq;j`&L9%QZ_W-Sl0SJQKgMj(jV_o zw{vscLs67DhmWFk_j;f4b=Y1Ek$qooK$=^Aznwq1!|Rl@MfgW}jl}-LanY5u`@Sj>r*7WG zPU>R@PYf+vye8d8)OW3j;UW*weI{J1yxr^NSFcImCuA4?=BLP0$Dcu!!O8~*0o@ND zJXY6t35Oz_cd(Z#cHjx(@$_s(hyUz*y|1aCf;&qo5numpfGt@+E}I{`J3h*E0}6e% z*60HjKV6q34~!uB-n#TWh~7ild*z%F{86Cf)D;VkF0a}a?rLV zUpp&L)vOT7IZ7>0lr$f*&sqbkS~r2NeEx?VFWBxTsG7n)euI;&lJA~)6>NG}1$&a| zb9?ny`dn-UnmEW5Ffr^pCXzo8(D43uxj=E$KdFON_!yLBJnt1^UwwX8A!q_wbg6m{ zKZ`y3ISY0G@^nBtuaFU`Jj8E=N>WICW4hF~T_aXLP-Ad(VP#k$XV(h*y?@R-z3 z^#mAbCJ!n(wwrostA5na7x|+uuMks*G^a`Ew-oS-zCai$PmZ=%$%;kV?;AzCDXvnSS9YyV7aKP7Bt z%J38G@Z3oc&OF^1l7L=0DlapHHT>ye*Po^Rcq(k%MSYJNf*8E;#PNrG$U1U0dA_q| zk%4T`F_bgzLVR^3OHx>ynn-`A`_WcXC}ZW-TqYJE%W$am zvp{MSclPebOVN-@$t@S-p36z05r|o!+B&eoGuu^$hRhjm{5xp7S))5ES?TAo})# zlP!CLzd+hb^X-$<262zBfPo=bCi^5a-CLA5o;^N1ZfnJ3Z;AIh+-VQv5%M3^J#sQm zS7}3k_wq)iVp>k5Zg510s$Cs&(2p4t1-L}K(j+cNMqRnZ@In@WG_0z9BpdG7u+2ucXXH|2e9uHQIhOXxJ3jj&AjeyHpkqT_s+5V# z=4pk4_MS18aSGEoG?#(rmHswStd!6`; zicz5L_cTT|f}CXyy{XfOBT-zL!O>TNyd~ahJ)9B&LH8Rclh5`%q_Fb*=VwpT>8k9C zqwAH`b}~cm;qqm2DOE+8#HvwHlW4y$jU{y;NoAPQdTGw-EJ|4YUYC9NsrBqw8K)yP z*kXE|Z+oa+bMzr1*6`f-?GcL|M47hCua32lu=CyH<%#a!^YN@jKDbK#zBXKY+)0=( zIH+qGX^ud{wOFT&$~lf75O82HMnPZKvSK9UO&7xP^sVcQG|hJu1bCvaacI{q8`()V z<$t9P40?pX@&6&5VTfl-4V)t?grtFuaA}Ys9{333214$*fWluP?ueH-rkE!G*yWIm z1XUm=K-)V;P&VH@$usNVT-&y|`CW2rx(Vo-){l;^sgnlU@0aYJVm6iAr(xZ-9P^Ew zsvo+o2L`{78=cXB!Tz?uL!Mk)B+ZPio7}y3nYkoFj+65weEa|IJ_mGKJ&gBo?P8Uj zB#KmPe0K9mnxv|{mMxh9{lp04zxYD709$!agEWk!2*pFKQ&3K^H5?0CsSpRRve3b;?6?c0f-3W}k|e7$){*%UFU~KfH0t^;sjl;qtRc z6ntBPw!-AHNorrsBoQbG{%sr!N=&_YlSL&Ehf65`Z?E|L2-)^~49VN*b_{Av=NqJ6 zj9B9k03WOUasGEuZHS2lZ>WE4jMjNEyB+lexmyc~^%iOawne@gMTz9IKHO;g%itOe z#26&dxpl(UJzm%kB8Ro*wL!Z7O$;Xky1LAZflthh8Ba_xPNdLL)|YbQo0?`|#bP*_ zazKujQir4G38^>5qSd`>EGd!r$8JLLWxrVwHoUB94ggtYTqg5Qr5t5C!&3a~=QQ~ms#u+a!As+d-4=_0Na@s*5Bf?D5Hgw72x-Q;obFXfHV`));CE7D5Q!K5>{RN}W z3A6vzO(|@CnUA%q+VwLResqn3eZE5lVneKbk+{cRN)Gn*}*cuf-9 zmt8owk2>yFDwd(o#CDP@lL@)UU6MIRLJPmzFbi{L=Tl%UV&7F1o`1>LH*Dc2%b;5W z%V(IBB`bQKIWpXp7ah>8NB?CwqXzp2X@BruHxKeUGQr$B^Ie<%nhSmU^-INqt=Wz> zf%Z{7FqnoXyZ-nZzl#tG7ukkxtu}j0ThLVv!H`VtY_yik>FjERKU=CsgfAz?^3=1~ zmQTNVevh7&{bw8r@sYTZ%}aSRT86H^b#Z>jKUen?MI?FXrhA5aLt;XA;r`cW^q5S2 zCP-6K-Gi-$X}?cCTylFe@!K$XSP%Zur|tUh+1O1|AYQ-_aM$DCj@-qGCx)FRQ>Jn&|UwhWr27U3M&Y~vw85NiGnj^*ZZiOW0p`+jGj}PzlL8)g3 zTPA`7>d}6-e(Gee%WRmV2Br7E&IfeI9cGNqYiX7p ze4l~;5vyLu9Mc-hl7j0{BtI*>4d^w6gm-A1Y}I|r?@LM760n&FMoB$i61K(Yf4;8| zbJSrnN*ERB-nK_83LSw0dFBeQ@>?8$@fZxu^5z|{62^F?i=|2o$ivlC=y3`G_G%-GO=Jy+lvPwLiOOB z=|<>Qt0xnXe?Mrg+wIC#?<#K=K2S3u3V}A{82YR)B)=FeXK%T*Z3Rk1#b2b`r#HvV zoX(2j7qqKu#f2QD*#3?L<&>l zwtTgi2pT#=E$t;?Dq5dkNoj6{n0#ORY2c!8zOSHnG|aYUXPU@);**~q2(C*1*ut@T zL)iy*@*>qNq*<sojDlD%tY3WV;2Zaq7Qx_93`#WUXyuLBUCr!m{$8{aFgPjLq~??<=y{myT_ zG`v1cang5R{@KmZdb@YY0S>k@HeJQFj3Q=UkN?q30>}iPq-%JkQBs5U&WHJ2Cy~D% zi5#C?&PSxR*64ANBWbbx8^6jujItRyl#xMGx;@$_RYo~wk_p^+7>)nT7_(Jvu4+5} zby=Q)IhMbDHe2uBzQ$J1*R|ri?z=^dF9*f`AM~^~y8^xKmt%VpsZuHQe^ipRdjS3@ z4qiEf+PFyM`H`p}D5vPw}=VW%wjEC4E2lXM{vLG`+STc?*yXn+zP}WNGgq1zrC-VmN1Wv8}>;`^d zeyvB=vb=Q#_~^fQpp7MKSX^l zQgW`b6SkV^;}d0YZ0MvgH>&ejE`0C)qhwm9ux-7a`P}AkW$TgIRmkt6EbEpr6I9!mXcSXK#-0G>AG#)_v4y&?=NOmNoR8Lw*yIuS z{t-7R#(Ay&l-(R>;I@aK6W(N&gYEK5XiF@n;>uRd+8**(vF>=l>g^9NDkJhAk?C3Nijy^>ctefueZDe{2Yy~IJ>tTWx4%5aYOrkx zbfo#k$)c4{oW`H)hAm(6u7Kz$KXJIbypnX+e9j%t_^mjQ&?mV7g`{wF_K(S95gp6_ zRub)Sln(dbkWe@V)D+rQfY}Ppe%Jh!!TW1HeG|u1Q~!_Y(yT`DyePoS4cG~{80+qW zu68evBHx!+HR|5iS34Fp6THcYbTaw7pis_y8s>bHj`KW&g2-6^R*ObI8Ee+aqT>W4 z&7kLft?wQ4c=}0Hkm9_iEY6MgV_z)lT(bC1H0{j?6{eRkNk^0^?|b?{8-<_A94Td# z3Gub$&5Hcz^y7x)QJ)qv75JMl&+L|vB7gkCTfkIMDG_hCIeUKjXzzXc)}d-ag~}rl z$Q89&KKq3U+E(dcckIxftoxfU3~m(t*hvuHO^fsGeP?hf!ROXE8lXZLa)2DssK!|@ zo`$I?zgzQ25GfDKpmOEY9D1hF7r1< z5aHmVS#jXP>1Nb%w}?r74J(_{tmG*_AE5Qk$dSR!W)L8tK*v{^>~^4CHsM^!f{DM3 z?;?`8c>Wm8+L6y&V`ACDQ?{LXw!HD;1^m_R@_vam)t>zJ$rjGp{@W&7DxlZ%ss?Zz zb#z*2f3v>e(l0KCs^sIQkJcaOpZ!D9r}=Z}#EvKnlFpFg0)S8)WxcGyk%8S412z=0 z`XcO>CUqw9nWkYUh_wqZe0j;DM8hX|>g`kJkYn57&fUJgt9=^FBA(lm!T@>(&$2Z) zH1jRe7ADmuryMeIDR?4t+}JsIcKk|)arVFQ>ZaM^j2_ zL(#r#zf*aLx;6YMqVxOMA#WK+_TM=}?5}IZ3H~$d@ovC1r6ZKjMSLwU$9Pp!JocU* zA5Wl%Bg07K9&83%ukElf>bpynTj%V8{=6@n#YN-mP{5hu}X)bAmM zVAdVbp-KHLy~$Z#Jt+i6a=H@-yH1!Hx+$)7L@(QP_Y3X<3i_LG5|G=lyCoqBn-VPIy?$xHxP42Jb4FvjGkpp3fbE7^Q+ z{bJ>FJvz6(U@IJDa2x2JvBP@Juo2+Ay%L-4)t~6Hf2hLbE?YL6%Ex4-V{1v}l5-eT zpdgNF`an6Zr4&9UjoS}=EBq^z%8Sv5?v-3bpO~1r74eFd!VIK(a)CwNe}oyWfoPwS zPC}vox#i(H@QMu{n#-s`g<3ot@f)!{j7H(qj|&H2E*ZX(C5Y;4TVCbf;dlu@(xdhBmMSCS!Srv zvG)sZeS>P_=zWzqYm5qHSKzuAV{G1W%73U)@=s9Z88E`!Gr8nG8#SL|J88r#hP%?z7c z9_Q3ffeFoEEH!*0tk#Jgea-)kohbaDk`azjGH@$h`DhV>1wKN*AVj22P!LBn#PPov z3i|&vq9VAReGkUJ>CgzsqfdR`Auc56xqMAnJW_mCDiAMpaR%29Aqv4 zIC#g6m>Qvd01EO4lY9+xk=)D8jNRTlu+f>|$9I&d^8m0M*f(iYa`!2X%=M)ZOlEcj zxXl4Rs)K{H?-@EJ7N~u!fs%pIhNV6kMn{@tn-7cNL!U|M;}p`AanjlT^mFS^d}^Bx z2F3z=D^o^-VV{Gg^bDNU)3L`a`p42&Ka?Ra<-YMec&M1*<%wy$FZ zyN2j^z%L<7);m>MDoo0BTCDsPZ9{*na0&AZUWXy2 z$ORr6Pp9TTxsK;iiLHeb_0}!#ibR*5?yX2hC#c3Ssu{z?>vx=qG*__A?Y^h*{>K96 zUdNlzX;d-_9r+GfHgjxO-98LGWF_~Ia|nfs(5l})Fg{>I{Fq(6NHvTh zSPNL;cpBeBB^=c$Gtd$S85`C$A;Fiz()kw=`BE88<&2>b`fF(ixb5Wa3*gX`(5#3W z9t=KI&$gZuqmrn9E#~9_USj9j67ud0Z4iTpmSr4R8(ydd?4?^xR0!s)&}usfss?>5 zni7cvq5Q=wP2}B;2wXFCP|r;-z2DmSvZ;NQU7DHQ0{8+VJ{6hb1qAB+Zt1lB^5N-4 zJ3xA4Yr&-OJ;fl`3_ZV;&dKIw{>uX0t_yf(uv~Z*j7Q#yW3!hD4%kGh~wr)+6gw>8QWoM1j>+(3i4`1j)(%ALhvE1RF zQ(c!7MuV>?8GatRpEyl73XDt|E;~6quiE(7dJ~d9vJ?dG*X_RFINJXb5Dj{|@@x*& z9Wx;EfAoH9b-Lo`rGL|D>V_VL$+#liVMUr@Kyf1K?X=fYa=9Zs7jyK7`_k5!eX2%^ zQVo#1_Pv)lVfDeOGd(2KevRu!n!%YDB8AE{x=8y|lB9Sco;`>0yq7WjV(iCoL?lke z(z~SZOlh=hQ|u1FK^+hCS9{iSZ!pfgo9OcCfHvoajjLZ+0xTrbNy5X> zvmI%W@{f&Inx4j2} zkaeFiS4%xCJP^`e3;Qb1A+Qt<_%yQ^L?!<@KN|t zbn_HAfnl5=GsqME>%n+NTmMuV*kPIlu`)FydE(muEn1(0p&pZx`Z6@RS-r6 ze}ISH52szYk~?MFA5A4o`sgQlGDGs~t4kljVE>D2JpsMvOss;0fuz&T8fbq)%m+Kx zwjZ5lD$tNKNpVRUX8s*>7NP$Nq&M&Jz?y~n-5Smu3R$h5v*;JUb;9(X8*LdEG6&y< zr@(rvPf_T!iDuqQAHUFa-!5H1#QZ|96xiaRMpuVgb{gajIa5hQe@-Nhfnx!K5TVhf zZ1~IIGxdsd-^_MUyJt>+-KKwd3P&bn8(W(5J+iruaNrsOq9J?k7xgE-(wWU`M9bB` zDArdLw;{`$gcZt?=6%-6!*zA|`xf1f=P6v|SS%kM{F#y66=v3s|mnWDhm5L$E6 zjrl@~WQ_K^HJFV8BaXFUzJ6OEtn{(bM{R(I+HhfGqwm8qnPLBlud)9I40IvXATxB_ z`n*iaRT>ZXRWCQ35kjm*KK-5s(mpb@s+O>DlOQzF{}9Q<`cShU35g-@v*e({713tJ zN3|SVUx|O7pd<#?g6n3Q0(A1qq3RuBLC!>aE z0#1jghF_gtZaIo&lE`P;y5@1wo?j=tLl4paKBI_8VBfFZ^!~CAo=^nHl2-e>*xrh8 zDHVSC{rvUK@=Dt`hNA>GoqrdPCc4UC`U+N~V@6G!RYT+4Ka0j{A)kJ|DhgDh zOfar^jWo|2L=<7?Gy|IE+1&0>uk1`5*vUU6&!e1R>B2ZS-)5ljNim)B3y=FTzw53b zyJ-$cYS2Fx_TIJ%gq^|j_&Pkge-Nk(v|)3)A@=nr*v7;uE07$X62N{#WTFR3)7tm| zL;r@QNJ$W*$mqu*zRU={?<1s{5-`cu2&Zj4XX0M5Bi9bmd+n~v{q0`h@Z-hVB-a~& z?|JBjt-)5$%Xn1iRPa?}q)8tYt@-_RKP|*x+iY2{XdsFvys|WVFN zgJ@O$*ypFd?ks68el<4zjC~C$>TbN7%G}<9h^cv{=tHuC5TRo4=P+@*ZZ%a zV|RM}PZ`rj9RY;4YL`xxGVciH4GYOr5n(OyHC$tMxuip1j=Z@afc-iSH6vo!7 zv%7<8iGdeO2Q1!AQ_gl8uI_G^sG8RCr?cDKQD{a=IlCywhrdhGG86Ijscat7qf#m@ z&LpR{?&zcA2LY>Y4%qJ7W?ah*!9tKsf0X-=QN;|S0hk_^XE8Br?hiL zU7zZz?|OGMSOON~3L-cCm--G)lMdK%-(4{a{hheASzmUP{yMQ}lH^Jqzg)=|EX)b^ z{T5-fdpmsB<5>T922FcsD1KrJ?62>=i3;QgZsjlO24GWFbz-gV+h$&5bk|c$1?$c~aj7 z5*{Gz2;dGrLd+AccU`YuEq-vCJ5?RPp;MwK*MKhxJJ=P7eFr9X4?eYm0=wcAq5l0B zMKcP++q9P)sW=Z}7jU?|OZv7Co$$fmdOb6pS|`0)18oP4!}O9ez#PN)JkaI3!V`q5aJVc0^aFV$pCxUE)wd;g6t64erIZ$MYOS^@WhD-6 z6g918Ui2hIwlol^N)g9(s!}oiUf)?yBhKq;nD1v|3>=vJ}?ChTOa4;aILE^lcOeC<54Fs@Z$r<$Fg^DqFb}(c7`R(fy6?K_C zIpNaIq{_HcFZw%y93V_>zK+K_-k<8m=M#f}Oo&C2w0yIWCru-$hH|$Nv1OgH;^BOy z1w)uN9f`?oGMzgF($g1D)gBeeW&}56%TlPH+mmoVBoJ`RFz#mRzh*?75w%Wg*3o;0 zA>{4gPp`aZlrMfC%5E-Smc15&Na;4eUpdIj|_bz)v_|@LwojrmeL1ozY^% zxn3Ype69l3Q$p~TM!y(AWN6p&@rY@Fe=F?ypkVt>4SIA9&KS$NLe~bx^)A#(xHRTh zMPi%NpZ_?-XBTbGtp|&)bB_7)^ry+mtSraJT9j<1Rp?0uHgsmJ1LX@PeHm9hPH=ux zKCXobNy*PB2O~)+ee$|z3aXvMf(2$*woWEUx{WDRWy?X-W6SI(jQFq|Q&LLY+%3J& z;$Oy~eQN?%tR|5JQ_=|{0J^l0n<=dZK_8I^gTbnXI_}%r0Mb3B#jhV{iO+FOA973A ztQG7atM{J(J$a&=nv{XOcs z*xaLv3Qu>DJK-(DTLa<+p6l=zSZ~I%A}IP9IQq3>?~EPEZ#L;B3a)u1w@vYVvMcU; z9=t!r*uTwQMG%!|nd$NZ^Y-wxBc-;`m+u+Lf!lUE5;O?ym;Ybrimfz@9jeF5Xr00{ zD)DozZ0hRCSC`zw&yI)7)csZ z)%ZVsBLbms)EDsE(I9jU9QZpp!80P2@}E)T4I+tx1t^9CWDARkj4ZDSm3oaDPR zUwTq$VB~Zr()KeJHPh-_s%17W@s}})oZ!n_+LUPl6y=5iqvs5$aUyEM zN>)=wWQ34)Qmb(_SahS8lWS(&P2Ux@l;3Um-Zzcj2hkxR=9%p&Vbb5@O*Z;=%hi(z zY68Q-w#ep$`KZVff>gI0qya2ZUDxTX&I|&J)AI9Amyd53_?>g2m#fBGK25vW@xCKO z|0qJkLW`ctO-p6}m!I}IYPNi+LS~Wfdp^!M=*9QFUY5#mBwQ^O>09SkhU@)1GbC>@ zr*K!=v+xY$7Yq~H_*L2nz0+2s_)jS-7wSpi(Y_(W|Xy{{YEgHzMq zdmQwB(wb`*5u&UbO=Sb-x7Tc{Y%j0?^8A=Y-|~lv-K$l{sdU$*FH3lrR4^JC9q^=AsYklZMpI^)I^QCX@}Rw^EUNsQj5AG6l7z{G zPEV=x@o$X&TTeBbt>DZ4v9DRx8T<~n0pgP@l*(u=6zb~TkSkse ze0Q(W!C@!1C(>u^;wRDp&bxvRU#f+|ENq1fw$;(W=jqP|cBRfj0#oNojOLDkMJQGA7Q8jhLo(MIA=&D z3z0!7aqjUuUL&O+V}Jqf*a_+8cfNYM}WOKE}Olm z=xezLE>Zrsl1R}JhheA8gC#oAPL3<)(*HY5q5mVQ<;PK~mEO zKv$7WBp7*Odve#9xq!nkh)C$IOCIrWNHqZ`T8tFcWLH@N$`*#2j7;W_(jOCqEuU&^ z4L!rLyikj0{{542up(0zFR^@$4*jBYl|ZX2oTV09FsLc^uv;m%ah|?4oDyUdGzx@t zm+6*ozHBBb5{ZBcOoUdUp=281i~X7Yi!3v-Mr*y^hl#{)`d%liCZ>RI?TY!s8Yw*1 z>*JSR$MyRzZ7qK2qBwSJf3in)dYeK~=Fh%!G11&YVD~R?R+ctL#X#QAxVfItt-$HN z8m^?@Jzr?W$r$H#bBNo1iZM}SJRR`YSe7c6xKJJ8az199Rm28p3H|O|m!}}Uy9`wh z1}30uDBDX1!#;P#;m5F|KiLEb77_c2Cdqq zA7EC*Jm&C*zp)Xy1M?Y)^mB6OK-Hzs(ramUE?7w(t1C@#fL@HFt)| zd#M`2{f{9d>_kWgVbe0!#G1fmV}48v25#fJ2Vw@)tf0h}9qWl;+{zx>DugN2v&7wu zMr3zoA}_(?K7_jmx3`{Z;4pVBaD+TG^g(3%VI{`?=_$y2 zr7sWXsmlMZvu!+C^jw3|E>g_{K+|3`>Tu~HM)l)~u965TNHB)!M(V6mN93yWGGp8I zo<&c%A1J<6Tfa+?XfT7d-;r6HTDX^eK*oEu z`5~FSxp2G*JpSVQ!ZD5>WO?de8c_`NEdJ321-~36854!;l^EMUKo~yCMSw9P!Rgk@ zFQpa>H4a8tM3t7(=yIxgdxd3zLhHw4?5LdRQ-6gX{M>fC z|M6ci{>R?S-KT@TPgmC(uq|OHx;K;EhLg#|Y^0(;f2tb%24|W)91qe>9M4+Q6M@mR zK_`cSQ%`SslB!v*6;G_|dYqHZ?y9HPt!_&;r+4mtJ5R?O+6R?~&nWfhkSyE}@HXBT^S&SL zE^{)ZxA!SJWu_nU`eBLEt8L-@Kra|`JW7{*$RcN8_MS4~1L7}#u}uJ{6d81O)RwR= z-+t1DdrZ2}K;f8WIq}Z(nHA6Se5Hw%KKcoRspz?2!d=#VaP!i##(BS35V(fAe!t zle*;YV=Ev@!?%b@N?YpcsYtQE*QrF8bZKs>J8}wy2P)^$W((NDU}@{zVMCXrekT5f zLvp~7=fc^>Syho-jPTB8IHYRROSH_WoKv^;wF@2%c8WC5S{UUa15c`leY_R+|1{fb zF&tW=g%8EMJB}%$I!nN)cP;Y0tOd2_%8PoT$ELcjv{)awVl5uANK=tsMvUoEQnAq* zR)H;dX??B}bIAX2i8C&wnqHJ7S6;{TkLfg){R2r5s;cUs6aMIc3*AF5)%Shmz!_@p z1!nHe6cEVO?Z|io8~`-N#Rms#7>VO?xeMe@A6BrnYd}UX&U<>ZWE_Oyt>%tGqzkWg zJ6)WCqfq-mARak+6*u;~tZ1g5c$-xc3p@2S~KcL z;fBqjHpb)lZwU_a>+JTfq@!1rhD{7tpIp}&m2_0;Gcu`^DJDkiLOD9#3=8iErsuPx z`DpE`75o{E(-x_*-;V8E3IuUrC$~9n{k}^Jj1R6=gPY2QsR(?xvHguNG?BGGM(_iH)9vQXbObUJE+P=)8;7sKxyI zoZY>2JX=Pl<&AIX4s5_X-kR)>S6H~(q<>wE^(qDQ69Eg~&sns=TY0G;;wIgdH^Sw2 z1MM%7vR8ztS2R1n17Updyec1JQIl8UQ(7^NQyNx`7VIzSJD8gn>n^RxM~vsOa(v<@ z5cl1IvC+({;6Ns+BzRMRguBDPiXgF1>!W)LZKb|PQTGKT8Q@u|ol%i)GLT%%qJ)kz zD`cL#9!1nJe{eJemr}4#VNk<(WzvPtT265=C8R zJSyFjABRfBJUc4^7&y?`ga4 zoJ`_b-#F^t49<%3yGZFaubD5Gkd4%+=%wH_eY@v`UtZK1xopEswAMhWFwyBir*vLT zf)onf1cQcyUS1~D*2KeFh-bwZqqhK`Ys z(Q`}YiKF)HOLuCi+_zM>yH{Rz9Q$~)NaQ$uqhd8SNpr<5U4LA4*tZvilKgMcRE){x zXzK9cOx&yjzMOvAkvC&aP4}T(bkY7gSem&nw;Mw~rq5p(>mmn+Ls|fNyid1tW{!Qz z+k@!Ue{2J{X-`}*GyC$DzUI+Oban`Bt zJ8JMwSlVFHYJvpUE&>2ZXx&JGe`dV@-f{r}WS$g--%J75O1$O|Hk6I2n}WBfm4l+`VQtOmluw16z7saQa+34NFBy+Rr~_ydpgof6%`;?)L&^R#n;aTzCSD zbw`WrNn|z-%9{EQdu67T!^@>-duzbRN*3-qKYaqXxP>>=Pk z4x7COWrP-Ox`~(X)>q!MA@gU`6z|3`KK65FqZnAp3Uecq!r5md7ty{wk( z*w5#f;Q@O4<~Wa@Apjb9|M@~-6)*kG+9)(3UR<(wCu-qhW?Bq39T^84zPW|R9Rgo$ zrlse5)G}>*d0p$rSzOvI9||o){*Ar3WWn~ghR?kG1(Cn=hxcAHt{{tg9lKS({(M#X z=UMl1$VVP~QnAcYB-C4gs++Vhg^JK9hulL<`R=RV}B_0_w+Sf>{eC47&eqgjr zm?Kcsk1k9Kh-1>p_*(ogvHV#;2ju<8!ns*A(jXu;4wM|!6FXH`-Yd6A zqTHbIerEuz{`KgLH6T37O=r)0U+@D9cyrp|#gap`3Zo5^B>1$$tfVJQzG|8lv|PxS z?}5`%^vBK`p^O?IoDNPZ)o?=(3Q2DtkJ%`|P=dTa7qg~>kD$0UN2b8kJ$CB2EZ zzQJ6p{mHz0C1RNg9GX+3J!{Z=bWUok$%{1Y-H)E2TC;uF%~I%1nK`r^ zz`sXt$8%l8G9~zLUv?o`>m4F-X3$yvdNJv(ZL7NO@~`R^mokC>N7PwIHTj2sACwT0 zl9CogQM#mCQd*^Bbcf`K5h~pw9Rn#50m;!I-J=JLfpj;F7;MkJ&-448=j@!__t~G< zIrrzj_PXBh_ho*^<1g(U*-kP>YCLbHE@J&V0n{ctkE}eDDE{;*KOW|tIo9+%?PA(= z26TRR?d@hNMRt_^xvV@m94TWe`(tOT$vhI z;dCH!#&Zc{fQAJm&>aQF!@bvO|~ebdx`}S(5%s*dx{g(GLnI%0azhFy)??v8s^iRZq2*U|!ZqAP8(jhxh#o`dQD z=MWWcqyeS9uDrBA0El-c1Fr#k&fcJcMNd_tw9H%>9s?LnDC>y~%33#jm)B?A+Z0%d zRvuYYlWd5kvpg8M+cPZY%hhss*AAN1JeA>VI28C3Wo9Z$_W8Y{Yknf4ZD#ghF#3KK zJtUoV{97SY6;V7maTAmayL`ar`l#TV6=>Eb4X$3q4-lIeY|E%$&^4+f8kQ^{r&Yvd zzb29$USJrZ4xdy1rkX8Rctl&v*jhe$!bG@3kYbL+Rr>Vq$;V+?SF~cgA4Jk5A**vH zLX;m-!Xv=j{<5kwgBI%Rq{rnf%D$eUN9t-Ksoy1&*_AH9(HFKUbM$0?jqTGp7!tDNmMYxTYE z+D#M>gXvrD%3x>sqJFucPDgwHsfB)qF*^{2s&@ga-5 z`IMJ@T;K9kh4jjPrR@Osd1!N2TQqz=)GkWI{)4tBTG1taw12TGQ#Cp0vxANMSwf8_ z7b#9xcPhX|_Sh(1*>e>?ti>onwnZ~!_4nVy0pAQ+N!tZ2Y2#xE?Z9?$_yL_J zng6yL06^B@(CR$=>F=wf+6H3xe%H~2pwn@jtRh#$-nCV>Y+7^R5C?4wpK}hhegCjl zlB?Y$zalGs+1kaj5vXN}-0_q04qTO@tumhJ`^OHOd2=ZJQu71R?m%Z7bV$+EN$kQm z@+4ofQ>js$l~N|y`Uma{q(#7f+b0^e>dqK?;lCHq81ank!x_7=9%T(8wMo9>^8F8h zH$^=aLHr<>z6UBiAW@CSkEO6w@xGVRguK<_L8kb?tG@j=k0#TjIBXnD+!P1eoZ9=qF>e*+L3i0>!RDo@u+m6bnyaH~aJ7^4qPL^Bb1?gDM*=+J!Ne`hSIdmnSOs2H zvXi-@M6FvX*Sh=*otjXpf|LO68<)(E1DV*%-0ZwAZ^l++Dxv-8>+_g7Bhz>r*8vM( zei4l=KC4Th3?FQu|1sudQSjR>#ZSe)mtPLDdv(f$UMv$ZO?S^!;=yiPS&JZnB<^G_ zm1(W6^w$Tn3a)x_$X`zBZ?L$TQZX}kd@Lv*bXItP;XImKVnE-I)cw)h_$FT0vx$x? zxLUcKrN=02N4WguNIYuNzpp< z399WK4$&Tmbr&idX;joc_ll5?5m!nR<7Z-_JrfTz&hqIvGT3 zTX(h!0`t16sefbu^7+q@Pbw?$?|2~*h;^wi+x}J$wLW1m)UuGFC;0Wz4obitJsRKj z);D!Uz(i_@+YahIrf=YQ2-Vhjs2>bkHgR%qX}25kJ=peT?u1s_HmK685ByF4`XQwO zb=<@&63NGYRB77n z>{XpvXBk!3oe_k+Ck;TyS7lJ>!yc05^M#P%7~+KOm@JT3J9ew`EiI4_$@iR{b=Res610SJ#4Z`-deW{ zEz?2++70S(g(1Njrr%V>7IHlh@^G+p%V}XfG8QN)oTMPGt zgvSkNf$Q!~U4jE{#{ktLm@~nlyRwj5XdqazsnPxxSr_6FJUz?V3LS}D3ecj5AZA9V zZ6_mGTfjWtR&HBjmHN^%{eMiIO1vv3M%LI!JV%<$wkl2Ei0Ww|l7SFmsK3vCQ{chG z?*QYj2Ou^gIiNBuk(w4K`{q~D_b#DyU1<|xe++%G=J7Jag);6sxUxDx@56`+L+%XD z&IlMk)!xo$4D4$pnhqYm(*TMH>K<%=J}EvmDYXzE8OY}MSKnXZ z+10#PBrRO^8iVy=Z2o0B`0lg?Z8Jp$-?!Yg=%=3U1DmeOI4D&h&=us`v`QR;!2pin zG-;i^6IjWVZIQiQJPf*S9Zm}uQX1>kEw;Ui-t1=u%Se%df${y64a${{QF#2oirFEHEGWnpnxSu+ zp}~x*8wf-P>Aj%o`95nY3UwN&>Ong1`^;*O>zd1KC|r5dahtw&3{UUKuiahV^T}-R z0_fhYq{hK`^v5>L0$zW;8!(9$Fo~j7S)ehq#@% zU+lHDZ~v0cy+cgJR3KN)>oE;D7HA+QicdUb+~`mRa|dz8|vL z^|Gw7KMlY1?7UEoA`mGbDg0RGf9oOx>`G^m@!6&wis!M;A4K&%D0G3S&UQBNcihuBJ@WclB-5bf8>G z9P=yF{xofKDb=}spes08azg4Vci4)-mXH2UN`Nr?C;o3}Vpm(4>bqO1wc)hcU0FDk3}q=kX$G7n%z%1Svf zvUybt%j25143!ggM#ZmR9=81|+QM~DKdpD0#6gIP*G6q`S;&@`Cy}YWUZ@@V~6!h-;J1t526t zd(`+v@ipD%{5G?PhfE-f0~*h_jPWy1>9mC26T3H|`i?RC%kQp4t1537`W9TqLNJck zbq0|#r(Lq#(|?&#j}b!9MR$7=|H{UZl0MeBwR2_$m|~O>kyiZ9R68wc9z14T&?U7% zXJSfI|KXS+l?;`)vRRXu8#s=4`^HJb{d(T*qw+5f4dBq6P5f+s1uiDi1B=Z*RFFBnVlzwHC2LCJ@4eT5 zz;!r5Ao`C&e?PFlWZrvkSdS}=r-(DCHkgRpxJp*b6 zY79goFcYe_A1V!J? z(AnqHjH7D4oQDgkWbAk@#yZ@#F1-YwzMK?GC}&tO8oWd7OT#v;08WC4XZz4}xI2O}N3l1SO&&&>!T zp6%(^#&kN-H%Cg1UaXSp!n2Kh_%k98STA=sV$LlFK8Mo%!%=Q zAM!bHc=*#&n?Og_al?kELR+96hdUU3@b@8h9Li+dyLU1zouYOdR*@i%+i+c4rL z0d$^^d$wT4*eEn$vV=iP$r!+X5x)QlEQH@0-J#iOMKTJ?G=!eV8`cWfuJi{lLvA{R zD!dUiM8rzO3GmCi3+G#QTzY)x=yI)l=O0}PRovy2?*#f{N{> z9X&UkQyS6x`*Vd!M@q8gt&$+ndxBURD$eUd(X0#uj3DNLg~17Gx}$q|Rgf<3Bh_HX z3v#uhV5E!V*A{-m_FHXh<<_!$xEGkCwC#OVFb~$U=zjHU&zRA@qCm=uym#s=M{?5L zNOPID+ar!`8ltj}%Z&Jsk!u$AR9Q?jojrxy3mw&SLE`A6hGPt1jxY7fZGIeBQ~z<+ zWbQ@ticMAuS8L9=2{h2enO1B+bu(wb3$gBZ$O_Z)X2AKWffz07{IeT=a7v~6H7MvM zJBU{{uP(MS(emTLfv7K_?quBm_}EuVuJF7-$-*^RS!Lip=L1t9Rw&r0r1zsLdI((g z{b)}k_fvXn>BV2i@wZ0dpQ2HnuT6V5cGo3MGSFlV6F*=3%TMiA_BUo`Nu?r_7367> zF0bZAw*wbQQin)EGNfExO3$^^Uf?g!G4A)ez@NlcV1(T++RENm`CsT>zwQeCXMJ-) zRn+P!_M)8e31CGD}jDDifK9+Mgmt5 z*Bc{OEuKclH%q6C+$N&Z&8ooVTC1AC+k@JpdlS#RNDd#eR`00FgzXUz#B~)fkz8!C z<8g`jkBmOs>d^0X#%x2i?LIfCLW%*)#c_E6pg{N4mm zeP5*K0((Ji5K?Xukurb1Uv^YtDOFv#a7{reCuc%JWj>Ibo~**>i5GM=662#H0TZ|q ze+5%mtzQ(Ktnq zueIVjIiB9jCM#o7*8rRu;g&rRyu4QpzAt_zc;jc^)1i{8L1`Y5@y4`eB!b;n(~hCG z@;5?x+e_3D*MW-OfWs&2K8cetW;z_|<{^3KX_+zT1_P3b14s5grkPXk70o_23zjs% z(b@9MkM5ek)+_nx<0~KfB+GxrDk9E|6X$nlpleF(bsBj`F@yF=*|K0>&16<8b7_D8 zH7qtRD}{Votsk}1poa#U?3VoAM7zs76g6l(0n?AsWiR<;X;5n5bO5C?qFc>OEo!Pd zBN0NLfGF`TiNtPc9Od3B3aP%=D`0EGdGXu_cs0t{OcX=!3->jDo}C>8r3i#kW!q%> zQl%XMuFr0u^{u^HdL86^ml`-n*LN0TE_Se;1^Fg}(hRJus1u9_ZfBOIdGF1MJ3~Z` z+^ihdEir~$C%#^RLuXrpUSC{mG#9=S`(Kcm(b1K}ZQns&YTAL;J=?|l?Uzq~lyXks zSmk*+Zkb5|+-S*gh+|}bi=TTQa4@vyIR zd+&6sh5iG&x?A5J-8j>b;X6l*Q=H^pWO}R<=~(Uk!ZK+V8Sa(&Yjw4vQ8Qc8k-k&p zhO5PH>Nk)3XY+l!#uWv}GSsZaWUeOD`%{oTWpsS7P|EXf3x88E$yw&fMwk(yg^jYGEhj9W9^^j=al8z?jES2<^W&9rw`$W3UH zCF4m??Qk)*0XeZO@7(LzU;0XI$IJKz`dyJ>{0uNNOINpd%C-H6o)tX-z!L&#LqWR6 zI%MP9WZqPPvN3_NCFA%)xXID6w7Yw2VvmtD!c1-K!Q%6u9g$u=HM_5#siG<^C%4a> zlBbp8;pV&pl|NOVy;fbAP*+=d94e)kc|uY?Rd2T9rTkWGx0=6oNMr`E)_M$GzIOfc z9ax?oP2L4Y7k}g*0!i=joNI2nc znTW-F_EN#kCeEfjuu}P9$K1iXf^!a|IzXCUWDl0(#k=3j1jlUv2Te>pla_@E;#;zQ zXCHJtNHhnXFIYg2qNQ0nGw)9}a##SH)hl+4`5-ZIrrYL_yZaSHUd^$rTN?`AH^zXF zj6W)Yg9m<<^mdx=rymCTK@n8&p#l>?Ol9umDSkT<9j$6+2|+|Du)C92uCHO?3gy66{&mOpkUd`6DS znv9(pgyVPG>bztx6o_t0#Kc~#HC$8=_(@@ASD-XB_K2Vk>`Q@8_I!6l`sfy-Jp|hC zI_J~AH|S_-$Xb&0V#{B2xyp;(h(AK*wKZIfty6m~ADuI@6jBsBi7%=~nrQ@W`Sn}2 zG(A=Q^$PMONEAG#(LhzGVOVh;)c&V!aLq#+y)+kizDOWX(uH)RQ1QjlDJ)=K^xE+2V zDOUW4L*zIIZ%@9n}@>s3F%KAwOV&u~P?aJa2vmgXBU!;CJ0eJB- zmxW1BS2(BTPu%_6>HCRUp$xO|2Y%l|%R45Iz6I$;{WzO8{@D1Wv^uY_z`!qo+{9{tO4_) zk9~e+p^!rpsoLODmkp94zTNV=p4K!NpI{IO=1+FM`~xbJF|aw;>~gutN4fE)yjaO9amrD>b<*%GfT;6(_tj#721 z4w+0Hue<1T9J^IgSQhaqgIWs;fbv9JR}ntz8K>9F|3xu(oA=jmG)g&e|J84p#PR43 z0PaA~*16n|jyj!H@D6Fu81KeL5AzkSjlAS-G8A>oKe&=;mLXZuifk~_rAQ6!EHTC3 z7<+`JBG`Vw6;D5L;CPX0AKWgnBLD>jFFdR1q~UjCUuka8NaI)gsWUi$1`ikn{i|rd zIrY{Kd7pZ7Yt+#*U$)3V>t20n-5GN4F3@znlv?fXci%xPE7Ia{w3C9wVgPJ!3{}GW#So%STr5^gu-{Y|3TEtS zlcpjnmqGZf4n5m0o#D8JtWZGigiPPYolVjM2tRx2;H70&zE@>Gz_5rNw?4Z=`I*Te zhkMGmuDVmiP*(q3pO0*cHT1dE*O(ZM^g;+?wSQ|>2gqV9Gk`HWQZ!>#8PH?rwdXs8QCDJd->E#MCK|a z#Z3m)4nWv82VBiwM7Hm<6cNJuP^a^)O%<~F=r_o_%>`Nez|(>GIssEDIAQF&HfH^F z%>@~*0m-hp##sJ4Z)$<*AmVS<@IzlQ?Yg(M8v~>aI!Ou7q>dRoNVfLN>{;CaL1+*I zj&Z1xv5!R@h#NoZ_a0K*{`6{I*W#;v#LlL7TAk(g#g;+&2UvgPt14qX!-AcpCdj}3 zeoofcXDyYuKhj1lYZr&FLX7WPoo5m(dX-j?)5>3oi`0=vF?R9XHXMUw(1HZ*b5+Ji z7nx7eH3$Dap|zpJg4hHzKdzr)^O?F_HvfD{Tk=ys8+1kdi}^3A=cgslM{@m_Pydz* zxE)Z!)|*)n?*#J8Z-ns_zZyZ3fV03qrOpNSg|}^MaH+DE-(n(=fM!-)?PAg z?Stqyw>5?~$*?hx0uiQwgv0phH%x2`px9Ss>LR(KEg5(@x({$)|IzdxuG79L;*)Q2 zJh2T{!6E-Eyx_^Qe110^U82L?&Y}n^fXlK(c4p(8gpXH=UH*=Ajh@g9uvDcz6vn2U z9)HvErzhbfDK2mPZFy<*r~Fz{Xmc>uM`%BJwsi7)@RZj}j9*))yth3`*xOm&ocHw| zM;uEF7m#5gwuwLrDp|T(GSBC#o%&P7US!yk%o$zNsy=kO9?OjW$YV%|NHp>zwg|V0 z@5Hj{ZucyD0X6c}s6QBhXf+F6*xf!X@Tk&e$gf3}JSt%NV!q&2f`z^E_~WO$rL$^nGcS+m_z)f{PZS z7Lip&=UJ8)PEIv1u#(|?B@}|{Ly~zlz1_DDc|nHLH3hsktQN-6Y41Upcg|xh)gS!C zON>9ri;lgSdo;BLL(a(QlYDbk#VCl%#jY`k(2Sc;d4EouSp(k+p4B?+l;1esLjl(Z z5-BtZzZHcMXT3NVJN+nYVEB*Kx$wrj5Y`qxb4|D48l6t`54 zX0ZsBI+)3@@cd_|_-AGJ33`gi=6SQ2E=uBVF*1snydRw}w9aSh$AS|DIgV^7t{kF@ z%^hb`q7Tug@@XpUrusAZ{nme#W^=~*Nj2C3vbFh@r=WYY&9GM%<`PS_jfcqo*T49%r~6I zi~8+IE{UibfMYVAjr6F)WejKW9Eo@Ex;H1pObHH=gRef-KEO(6`pvGz_?4*Ek4bZf zX4>UpjugCvraNsdD@@?zCl^MqwA0!DMiE7CV(RYd{%%H&m$HCBr(_$1AIT6H1hjR3 zcPouqVt?%?>{$H#CEszWL5DQK?w#AYcpflZziOmSym4l-E(**!A2e>qzC@0IwJ}I) zL9RA5m*Y3C*Wis44u-vsbvKTz#9GfpC+FfZ#kpAbdj*;Da5c<9j z8_8PvDTh7(h4kW-uyM41p2tQ#Y6!EN285fU6JE>h{u_Ie%YRGYQ4#R$=8|nUz({#L zf2%nmr+DIb^Kqq_X>{*wj&i5dWB>ibu%@P5T#X26jYr=Ze8?okNdIe8^{xp{2%N5R z`uiB`eV|_1VStCe)~7!^{k!j;Hzxloe#aees2b%zDA05_e|)Xb6S9f<4$(R_8AyI6 zGt}Bu7TaS0pCv=BE&kwhU#c``UOad5b*%{m!qi8i#Jtk`PYNaUF8+)JoAV~Unq|qa zXkHsGZ@KXl*~>?`Zi_)1WYrX+a6T(#WZ#=9saaE=kGUbwXDJ!ZR1GA&cJ0JDVj%$; zvvp!-T+Q&}`;{IUb$8r)WpvnKR#tqp1LEDIndkb^bNl`f!HyMBv7;k(IU2C+Co(N}yYR2I4{c#DWasr!b=izl&ha*aYs- zumqJkA=9?ewXcQb&(-NaH(yeMm%J8fSBtRgt@T;7Vs50D(@WMA9>tS0Z*T1Yrup)M zvjL~Q%a<$CJsT+d{I_>*7>>El>m`=pFt4(>21+E9BoPvcT*}gJgOET5R@>;0j)P8a zohr1cBe#`A4taf#C#c4+GFsbj&?EbE=bpJP+d~hA$Mqf=Fu>9Eb9rVE+17Ge%*pZb z8ZG}c52Yx5nsu_JT8_HWlUV1MYMAAL)oLkHBYoVaAKB(~{#)CcV$fki@n3n(eq2*i}JhWk%N;|H$-%?#BALwI(EX{1duqpYsK<-1Ouh zrf)WA=>3%9WBuB#<5r7_3szl`I-k@vZT0zw$dGltT?2&p9#%~DNncgBnjUX0UT-xl zyFIB2vO0DH`uqfE1l_><>JD>Mwi~ljMVx0dGv2g~)gI@0>S-jrn#mrzI(~l;?=Q&v z$OQL?-DV%Yz-o0y;L5@*X#2bq+J?K^LjEd@mn-%VE$I%)N36%yZq~8@&jCV$U<#b@ z<#;%|3!_Z*=Tp=pwk|iK->R)nFM3grCi@qKAtF?*l_EIuBW<8#LrKzMdJY9f;koA5}`1AwC0dwOh${TbIT1 zmN3w5sOKsAmb69kg;_HMCb}H-Z+V|=)G82Nt^#n7wm$MY+W)e%6lb&Oy2}3Ds{M^s zh>?Dk8Cl-J{<8MN#d-voSsa>3Qg-bLjL|H(Sg^1X8H0#-^0ENk14TOpa@|E6v#iBr z4R7mw_CZydw2>ZJ*jY}}77sA7pDdibTX5pFVzrDn8zE1WF8GU?oO z`yURtGP@>DBILdiU5_wl@!EFqRE^daj91FMmoL{VM8YcOyi{I_dY#;vNH< zHSVZVHaoMX*~u2!50PEFp7x8b9?*z;YtG@3RbvkfX@(*Nj<-2@83XRljzZ3_TwQ_w z2l)~M3VR2*N;`JDpkL!;>&s5v^aVP0q1nMpAdu++FYkQl_2nER&JxHlX}lUd)3eT8 z(R?En`!u?ep~HUbO#)kicDjOH64T5@wS;0;{H$30)^#_RQ(&x^PLp& z$ABkopxY2r@iUX12GREsn?C7QI?v;9K&SupdGje^plXcPV*#NIY0WVGZHkfR z^-cVe@vbcSy+crp3oNxvH@4~5IIq9WwbOFX07?Yl>C_uzt|1|GDWg{!S^k=|Gq_p? zlbPk8B$OnN*SSQxKP0*}2FGe{ zV#Hi2Ou2%a1-4U*L!|$m@!xvpqiD4fz~Szf#=?~F;iV~GUBFPbbC9)i@`j19>$`)D z&T|CA$4YR}7@a)@*!-W9jqzh06=l{dnJ+wOg1q#1Vodel_Ifh^Hj)PLww@do$ZzYi z?&?3;(-gR?ZM~W#W3qbv`<&DNF?)Z2qz z^UsIyiW z`h1iqpEB3$HJjCO!|$mAwgvN$o%9ZmEa)rRmm6%g9NQJDa zhI_|V_W=W4&-(p&Jt^|?d{(kZpR`ko~YiW)md}UuXYzLp_fgw|lj#2vX zT7~e3bnY+OpNtjO)bujx#@#EDvzm@?W84f9NSk-EbG<4%6a8RvG7-W!!YSWohH=cd zP1BRBtJMF@Wu(={O;siMAL(7cJ_*~2;nNn7D$cPj?`8kXpnB~oOdr@cy0t(Mdr&b& z$miGdutLz6)V2c@D6xJ*N7(7PwNjm47dHv2uQkDln@b1DR^%^?m3g&yniw)x`hldu z?qtx18H}=hH65|hjEUqzeEK9kS6%~7zK^6xP;)D3{@G>C=XCR|--jI~=}(qml8evD z(s)lg46i&iy{{~N+nV%xCV5};;mVaM+`V&f_}J8(x}>>C^Mxi92R(X<+60~@53iQI z{-<9>!&-S(%8SwGOmQmCAg0WrDo=&RaN0L*R#BM_`Q_(*q!rLVpC4;KSz*~uR8?2V zUaPt>!VP^og7{yLO~n7lB@tL$g4o;4{eSCn{{thW*o+c->=h3SP^hrr1P}WQF^0w* zmYbn>{YH+U+)GR-*Yc+nW?fe`XP23@sSOWFT`5>+x?~Bv7VwJ^Y4?B z7pb$NsCfv$;W+i6u4We10lc|eKCK%!z6sA!;j0d~7;@}BTd?qgpk76qGVpg5`+eMG?jZV)gjMd*|v>W$2wJ*`^I0!|KyRMZq z^G@ehX^x#ITCWUMDdR0pec(z;4AU2^ZNJQ4ZFpxQUH>PU{CP;Fa@h~|EobrH)S3#a znbNVnk*=*UJg zelG@OIF3VI`80R1T=r!a#XhTCM%b(^qpVSPYt^22^|g1mK4n5k#!tZVPsq%87o{?mHxC%u5YQ0#iAgUw-sm9>>2FlL%Q;< zM=&n;+E#5yX_N$we->CW)c;UT^~aw^LyzB*k(H_BYEL6GY+Ph--#=~>_73VB7|L|- z{6iXpN3Oq8FTK;GyfKWI5|Omu8lzH*eBU{O)R?tl+nu_7>IRzS{!FJ6Iwc~@>FTk+ zB_C^XBGa|{?G-+D_zQ_W!M9METWq&fGy-LcK-J#t=178WZtpHy#&^)D^?{n{!~OO0 zik){dzL0y6jj?t{rff`=?#LXEOusXZ;p`V?*kwxWRSi5iC!XYGpW2ynbeY&z#d+<1 z>4(rBnm$Sd_i@$Nq`up`hP3An&ZR8BlH7PD?)BjgI(VA&?!_TYYDl|Q7+Te215KX^Q24bb0R)Tw}FbMu@{-Q4m6v`X-2mf;Jw_ z&Boa!Cpdu<7WLilFm*`Iv5uf4b%v7=XglPoXJ+>AJb;&8&qf!__deP2 zNjJr#MM^Eu`vE*X$#P6(qigmj8NINC62F;H%7PjN9A?PD^yp!RiFf*bMq}(G|ANnm zS6-O=!}dN~lFoxsG7po|=XS)F{|YdVdfYq~w4}UO$E;Dm+bu;Jk=+R-@N?I;jhs5? zMDyjg)h|Rw`G;ze&TE%+Or#>g6})aetLjen<;WV#g2gJzGc9ErtGXh?T=!&~!3Fpk zf2E`|ae=S4$F|RdgPe(X*3MqO3lQe+QdzU;Uf3dBdDCTHlJV}MDdsi)AeUSSy#;61 zX4%s%Dwg2wh1AFN6x=+|cQ(>XU59r@?sP`O88DMpeeiMcmC=YxL#(fh=i|V^VKDvt zr0(d1$!o}muXTU!teRd@4`%&Hn;Sp{YKBnF7Vq&pxNiU*@CeDKzdVrH&fSVeRCDO; zyZe@U?(JodEQA9I)4%b8o{7p9Y#5a)Yp|V8F_Nw?4ZOxKCgr^OG~_L84W2&jb6&B; zoNS$5C5FUCCBz@2>O!>Y%un3bmd%3iS6r`T;btppVU^q$_P<^yKZ#U-uT z)I=6RD&3wtv)lKO485hC={D`+<;OX8{Sp!lMN%kFg_{fPto?kh?{fUf2enoovqm7q z)hX@VbfEJUywR6zt==1rYnnBvsHDM=d@)_`%EiX}EBSg(r*VUulgg91&tfvs7$mNzrp*-JkwEUM z=pdW&px|$4|G`>(dG_+#=RciuS%*9y1jig&$U}8GWeSt$h%tOVY)zcO`j z!D-F!-dR!$O*#cGuxaw8{Ny{WwNWRUd8i|Xh;++lLY_#H@6phu)@e7YIn)vMgOQh#i7UMT@fH4$x-3a$6@CXWZ6t>j`l&b-nnD zb;+r(nJjBZnO~K~=vz$SroXyCiAq?;ZIQ>LoQ&zqD}f=B^z6Gw>-pBqA6b6)GGU%R z0SzUb>XocvXy8hQ+U~3p__GXEw84wH$Ki_5UpF!(*&=XG!*@*dK2LZaVoQ>4=0`|Q zD1f%>>us+5b~M5U;!rK$ZN)nY+vS-%;r`ZNp|CkWk$4XimSMk{=g)K72zCWsZk=rB z@yaYPwTv0w7pMfgd}&-eZ*!eVvs#yTiHgAa_Y)De zrW_6j+K(^rj0*d5$zJGC=uRH;;{t3vq^Z`ePP&!d}p8fNH z6G^9k%;aR}xPQJ`lX?=-!fY@$!e#~6DZZjR_08u-@+pN{DJAds?$---Q<^4YQ5nfw zfqrycTvnYRnHyiX;GK!U^g#@85I}2{T3hA!ggnh`e{+_PYdbn z0$hIx-aW{xJfTI!bc4`M6-a8)eIDy|rf@QKnH4S5_AhkPx6cc!R z>fof&SGpEnde2yya1%h$GwtXF(+2bvu38j>sSD(`5Wj`^ZVrS{GX)t=5Dr26JY?Rx z?8K2=IVV?_j@Bhtl*|-YVMrtiyiesEO}en$Lsu9 z(N`56R)Ln)((T{@of}L31YTHJc)JtiVtGWIuWpi0jvDJlkr$bdp0c!fu-{(>VBoPJ zJA9-|fQM4%dHB1)dawN<1$G%#?f|wEd2YBU5U5OtY1(S@U4?(Kk20fQ%yd67DSglF zmur0v4sQ8~wm~u-M{MO}>?ii4f#8OLGJ{A|m)l*79+(p)3F>HCnn#e!#xwi$yXM}w z`1?!#b}R7_vXQ*X-G^GnURcPdsMV6c5zI5?l(!P>VmESHQnm|;w zQ#*{Yqj_w)53P3Y7Gnvg16Q(22^w$gO1~@|Oc37_{orI1yn9N0 z*1jl|8lFSbZZIgg;D&KV+ULtB9jyLrx;L7ODD7{*L*~U^CR~WfoybaV4u$xrxe3Kx zD(w>ROv?@Hb5JzeZmRfI(iFh?#$*A`o@InVDv<>Wc8Hdit>d@qRnM8`&q@A$3$>N{ zb0xw8i{LT)R(-YVXdL-l+ZBq>%ZK+4C&b%U=U(7*7O$Iv z6y5;p&G8(1w`B*vcu*=0CUm{VzFjkn#PBDcEZWx#AkMD(O|Lj}AA8Edhy!A7=aMDZHeFZmxj{YO{M9b?{<@1|m zdn=*HdXu%>@BDFIZv)}kM>rpn1CV1JT)aC0N8;amA)!)%7L;jH@n!pXYHiz0QxDn_ z7z@*8B;T|_Cs5~aoi-D6DUOR?v5yR`G(Is#XXQN0CRbzfV7cd^j-C4;19Ayew<4G% zl^)q&7jrS-mTvGXW5cV0ReP*`NI3MbY9n_h)~jHjVO{wc&tt%(5=!_VmziD7S1S_ym5Dbt-mz z-0@P`_qiB$IprfnZ*r&B$W5^zfb5m>*Alq>puSsaU!V0dKf-_rZS;(CGQr_v} zUTab9l~0cOsbDh}Oxdx4*GO@ukw`mD0^mZ;3j4rRokxW5+XX2ulvT*S>Ui6BeYON8 zF9=ZyPV)!Os8zi;VN}Bpw)M@Cn?Cv=uTZM9T{4&a8KiWfU8_3Aoeay7V3o=PDiOfe z|I2C3RKIx?Q9K>JM#{*1yY&OP8l8kixp%RXDUaKlF@nfiH=qJ!#ywOVH+snC%gXt4 z6$y3Z-_4@K-P;{5wl|E zn={@%_NGUydIvGW#eOC5on<)1^5^xVZ+3s`QCZ2#O0rknsR^@NC^9>tW)5dw{x$S* zVNj=QfiE5ux-A&3>wGC~1s5P576X0cC56Nb-VcM`J_D%n44@@CbtHojoo)hVzjDHY zODCrdAMt!FCr`{s^R#{Yzx}#{|HnpR|C5sJj5q!#C3%9z#Ry4AFeV!!%=KR%4JGFO z7}HimiYEFW@)jr?fvtJJ@@rakX-+Z8j}}1M78$#iknP^?^I_1AA}ac$W?KJ;s0ZBL z8r_1w?ea1sf&pYJjI#FaQ`V;!Z(_qc@5&AdA}{7`_*bR2#*e!Piq?j9l0r_YPtRnl z(FZe`0##eXIlA5eW5~dCRV9O4FB4D>w0PUcVf^R9OqJUNOI?F+QGxns^g!%H#Z|gR zGxM`KW7NuYv=@TfU}@*d%Q=98$H$lbu1&(S%U@Ycz32;PMbVSEVs&aCuz}~&Pqoaw z1*>nZ!ApMyl>DG=5l`4VQ{1=UlmSxGlAaL9<(~J@_j)174&0=}MKKTHXGR zwup#u=4&O(Dg2uZ4bdCJipOD@&rAB+cd2BR0A`e6xZV6QBtsm4U0v7$S+7uuT*D|l zTlDZLAQtR;g~wqm||Ee^wBfc?b~g4r%o5feh@A z-G*huH@Ir&g>poZ)5$Bva9eMAfBIEXi0{w5*JRG$cj@@#<-9znqS`#N+4NSd$Gz$M z1|_t6^V0b11vX8IJbqG{x>dI#-IE+42l7=Fpgt6-mID44Qe-Wq(UT`O@8)bxDJwmS zOBCKW<>YDO{aAYjMjEnK8=E)Gy2n}h(yn-6YsHOa& zQ|x$O54aaSuYrWEHQ{Atl9}(lW=jvJV@u1U$uQk}f9~Bdz(h0e`KUbMIhiyG!iFHmsZCnEgxx`)+*HBW8H^ju93AS-=|=NL5_qi3{B- zbKsCQJy_1_BH_I;foCqa6_vUgwLTeR8hRQ~;==t76O-MjYQ}_WNA|^T?jkdbI$f@L zm?0)7{&AwElGi<{7O>$x`Q?TV&(?+JB&0pL$gz|u#iN=B9dGv!JxmQ*^G`12I)r7# z?wBfk?Lo=_AHBTR!6h24q>)ga2cB_k!CE-5rZn8>qx(+B$`ZRnJ~q8Xr<>K})d%U1 zcqUf)W75Gzux< z(YeQ=VI8ty&%2icUBZm99#ee&s}~#1s^2u)o|GOJbB*9Vp2HE#86d*+n#1!YYa;}i ztuHvunS2#^+`ISoLI*7e6V9vruv!(M*E`6x+G>)Mx2+&&V!w!1=rKc) z895}xWD@eywh8lQ)DBGw)&}@?i%7{7!7pXyQe23wdkqaEpjFLLZX!5?bhkBYAYnjUtFLtG!bFMm z!pLF?mUup$_c2~@Hd^nq&-^zvstHUW9^1!eb%B|Vf^YdJ9W~O;cUKP6wJJ3Vd15U4 z?;Z-Tj3;5)n~iz4wwiX-u$@pWB)E@xe~RmV5XL48(n%qaUB?+<|G|a zPK=pKuF{QKNzKMipRRP*gcKmzLm#jIxElr^(aYCi7@|;ACDq2XDp=*I0@8C(I2&~M z@8kypz4f<`;3WL6+64-&I!~LtKVDiH=c3jpeqaZrw&f6^)!R$ zgcQ-jjF`)7Bfc**-XDcFnyrEr^4E6D_PsUUVD&etrsSEc&D5lKcSnx&xQtUt4Sa`B}~~y^2DP+u+gx?%=zpi$WNf+5tI=SQN&mvB{lbl9Ye2v2VE# zi?}H?@tAB5@_P<_=oIz7MFlRINjK8nc{3)LGr*SKZFH2emw7?aZ$-yB+n7D=|+MLE}^pd?9gcN zpm60g4P8He9+=G|bQF4<=-I1GojKqAfZB+o6cQp2bq$?9ZH$6lN@kwrk~zqacyQ46 zVj5%_pZJ)F>(Y~v1hK<)yt7fT+J=KeZ~6T;6C5>TC)o%eSyyRlCE5>ep4 z$x%`jPwU^DqaYA5)(NV?3B`^`iWk6NtC2`3egaZqjAAtDMH_fZFj@cw;yO#1evQ**REp&0U*pnmj|+*0>$C39 zmg&h<_BWt66X5X$bGz`3=>icj(z!E1m5D`63RsRt1sW_M&c3+R7Ib!=Ho^uf=-OvR z`$OuZ_N=cee`nn$Zn|Xn^qu$I{xjEx0*R( zeTRA_A}NaNcfHU0YMgzK^lBx|hoawCr{^rz^h{0u+>GIEa|~x)q9bBBpQ&--(s$&m zVNE8*#GR936F{*(Bd4BY27?(MUFSx8acMVDu6i&ppXsyf#;EG?l^kTnso+%+IQE_> zZ9%SL-Mifeq){uI%pf%n9Zj%6bzQf4+(BY#$?fyb+-3aNFBke)fE$;qUX6!|o3r9& z@J3_z)LMXt5a=>(PM2)fn!!9@x}j!NVB1bR@4V4GUL~I=?ji1F+S$@$e+oJK+t6B( z{n#vx#p?$gU~)lQRrADUDBlpj9Z{Dd+^P&@20op=2&%_^=J54~TFhi-SwY>2$qjFt zFk*%*OEMb#*Kj5M5oLR(&fMX}M}Znf{iwFwu6TN`R)_KJnM)}dtD->aj3VjWR6=UE zLNeuRp(m>Yh=-rT*K26yRGr5rV52TsLH^Jt{`MCBpm5wiU zlP*j^*^}8sEViA7X`6Y#?nAE?-g%8u4xsgqf6q`??>9!54RF7JXgEWGe&2V?++aN( zD3UjKWcyoh(8J3w?y*nNjpu0nwGaG;ZGK*PPLc0vSp85Bg6>jQ1pBoE6`M zHDRr?W;M7^3V9?a_r9MI3iG+~MPYqN9=X|9-zviS50B=zO8oG-1UK2M_>VYuhZLyp zxX`g7XDzSdw84}wRdL)HyvodTgE+>r?qtpFoUN|i_=1gYXMa!%TP}?fAtgLKmFBL{((Kxkja%c zGmpj(E)k!b3h#0wZE|r~kdnMHzp9>@>`FVR@62_!3A`X%e3e?B4;D!Bd-g%#3ts?5 zMCw>R^WW#s9M2iCza&I{xy+@iJx)`uQs!+>fAo3L;w;={=v-BcZl?8*$(O3M=GO@5 z+!*cPq};R1*$T3dqJkHaLMHfCjyde5KPI(?dt+_zlMCmfN*FLp?fG;`k;ilMWx_?~ zPL|hsNs+B?RKZDy&@=i=lqt9FhhISjeQoIF{i$sFu`)ht3)bKk?o3My^JUUH1wYqp zyYudQ(#EnrSls2&GA?;dxOSj_B}ucW{q^vj$o6uKt2G~tWPE>fCnsVv`E0hjXkhdO zdml<3VXXU%hVbBZ_ck^6B5UsZcNkGmh1?Ocq76@QmqGB_%bY*JH}2o=LbhY_>4)>C zkBr|zYoEOdbZp?9g$3NC?^ijoYZ!QUWxXoe<93g(`~1*}e_^SWP?ai_KAnmjmkJPi#^a(tEf^TJVmtWn;@}ZN#+) z#$MOL$3JTPCFo@1PoE$^NDcRuq=lc>M`&VwiJGvpe2y-Fu0?eZi zXF}c(s3TkHC7VSUX1QM`QOo_?!yJbx19k)&?1^rgZFyLWm1gV9zC>5*Qy)UMsFgjs z(zGAr4g_@X`8_$L5>Z51hNfmlONWl%Q5K`2U)l=bYXaIUGU*;}gpygXCz-$EJqod< z-!F?RVgIjh<`E|bas0m|kuRA0>{fdV*YT^{FL5v#<+A{owESm_9f(KxkmqB;%OF* zAoBjbT-&XyO=x?N@EGYxRh{K(;NB-#x|x<1-D7%2$X$P>wyT0}+fgXnIO3w6MXkW8 zFHcI&6!!Vo+jmRH?!tm0p*DaZix4rj%9TGz_wMC>wOfNNlY-p<6slkOBeEVMA&4YB z%DE1S-i^m%SU4dYg5htx#u~$WsjbVQKC=s-%GtlL7;5C~BYHF@-5x11LpLMVL8w<_ z>~0(kE@EEenUf|6JNz~OOtUU?T&?1Y=Q$_+c=_LPhqbVvi+Yd#vHPDhWw0_Xnuzds z#DdraFYvG}hRo)o>slBuYA-X>M_F$M1j_t&uFj}>5ASv==1yP>XL=t>e@E*D>FC`% zlG!{=LbqD|oQ2>nolh<~wh^@ZlHvuZ)p`P!r-QoJmRy$b%&M3^0{J+wyASXv=-^k)UuT_(pntd~=bX#&%z zI;G}W;l+pV$HO4u$hpM$-sHG|{@bZul`V<`otoAP+eVZDr)I-I26W;pi7eHh9n5#~oFIbS52# z{35!vdmp#(zH+@ATNZw@XvNrAz?^~HGKjmc>bxybUd!;$+M!E=%fyWXt&f`ILWeJh z7SmRGdRT#Jl4P(RdWE&W%kEw|esj7Xbh+=Z6=RX`-Z6vLB(!U9B4;>XS`b0uu`&jX)oOdnTL%-7DEb#_3&ShuyWuR)CJmFKk9 zH+p}wH*`bNtGeK6g%l*CRHL|U!tt-cm&1%N zXX&~M!1kJf!Y)@x%& z6%|)<(5+oj zX}6On-W2{_zW=x407fz1q&7NfSLK=1lq&lJ$N#U(BsT7U_B!UFl(KA`v2!Pz+q8SH zsTPkQxyQCf*JEb}D8aC??I0>s1EOqbdwAqKk{+$51=;157uTEhK)vSJoyY#dtTQ%Z{W zO?10giK+#!5>Lpw;TGk! zTU0BDw1hQbCGS|Rtl)`XN5XW=R9bq5g10rWBxy6|r7Kw)qaYVJ;&>=`D);I8CIi%PeKh3qVWGF_j)hQ$MSC%Bn zdJvN+KY0MA^cLTB-}O;}q-HeVz60nW4VZIm-LT`0el-(yEZ%y1_oK>|u|i3y0^yTR z*KiTfLlnKXLkR$F9s6iE#@GA=AKGGtvS2;i>2R-bI+RcO++!#II9n&}XLQ1yvA7At zbh#X7j$p9noKZ7_dEQgi!^-StaXFYNilB$~sqkPN%_Ns(-;cu-IJLuqa&W{lgr4v{ z3FiC2yc(j7IGSjuwsXk8A$eraxl#{@$($viD#iSQ{~g8SmZ{BeTNjp31$rKsauIR$ zx8dQp2*ZM09&-7Y8~?mR2BVCiLwVtB>i#Q?*JY9?!OIB!>#{dyuJEczH}XtD0$8a7 z^JV#;XRI$zsbW(5!Zr_%C#pGm+}=YYh*Vy$ z+dNvg2`XA_wfTiPLczFkCp)#Q>H%T&l{XwqGLG^>aw|+qhli3wm^2k>wdGQZ*H1#Z zBE+9rfig&Dq(~DgH65*&LNZuHkv7`E(w0Wm($6 zld7BjMCHeo510v-vV5;NslT>`^$f3ZHsk*&jA~jR{xT0vbB<$o!Zl+_U_2tdm(jLw zaDf73$rFD%)BpL=0ory@8{z00jWcP-HApAEd?h1zy-dZq&`s#_xmB$`VXwY%u>+*` z>@VQUh;(Z*8SE=9J81^le+~#}uRP+<=4?1a-LhsA=Es@0Jhr-i5Z);2y|yV60i%%< zHvKmOXFp-(@t~|#R%)A_@ql5{LIB`!Z5pYkkoq1{k{;PE2T_a)sZ&!LOVgl!c>gR(_AMCI_lJ*b5xBD?}DD+*WlfoGB&pU zP4r*-5kz5fMG0DTd7{X?J4pt>I1STf2NMSz&|`rEbr(a5hxI!ai%J)mr4=aUo(NRW z^0IV2nj-Y9dKta0I{Oc5y5?4R=FXF6)kCtv$PUm_xSNB>8;cgg^6dzWTjm8>yhDvG z1_kEho*D)nRZ9=AurkIyuXJWTf5O%xXVoct5f=LZ5M>|3!jFjPPE(w(ku(u~C&3uF zq}B2GuB)ya8S=8O-Cn%`^3!K|{X1&sJP2Wbt7d_n{0@r&kL#<4$S@!FMD63}zmvPa zaRdmc&x0o_4PNC6<}k2-Y690%Lh`=OjG{TIY>WVdVyqy+In9wPM!~uS7hux65E#;y znh~A7|66GikbCqylKi>e*+0xzkv})NwS~(9h&K-5c4lg_bnsvE#nTMD{iyX)H$Vd;H3z(69dF2d!rwW-a$Py!1`O<~=9bPg%nx zQ|r~^B_e`{J@ve$`S4%+Y%5Ovp8Rr~FKkd}RAF%d*e#b@%H!W7sMLq++}tqid+|h{ zdyS<}9tXU^Gx^Z9L-QkgT!}#CJ5CsZd4@XHLW^v}fDm7L*hsMvf!olZH9;IjNsGyX zX;^oq@fDUXCYR0Sb25&OPd(bl|KHY;Ou?j6&5&w3MQ7C;SYJWc)`cY5P(T19xuxhG zSkgjgby>>y{cwL;@$9 zleA~xT>9Q71`nRWq0lIJIENt*?shlZN!im^&0S+UO1Yd^s|y|NeyWDfP-zi!O_g6n zO=+NVI4=uS7j%f)`m$EeSH~4LPGoNM{yld=#Zvvxao~{|Pip_J;j7}!Xi^1-5qWjM*R+e73LprPakf0HMhCx29 z1R!^k&q+6(qm`Crvg*CrCi;QEc+XT6fCKLn~Y=XS7rTuv%A~Dp^OsUgGr5}h3$o%23I;*)sG!<(>t!>GWVRr zUqUs+9ewN@6$V?XG0S3s^b{j+w`GiAZPLDn!RVJOaz`4(ag9y+d<^-MT4l6|D2L9un6>6SkwZ)?zG>JVfH2* zJKZ68_{`rib%~Scw*FJ2rHPc zz$zUE5IjR>AIVM^Dn6&;0-K}e$n!URcqg18kcpeE#g|sp>w= z|9y)U6(`iF$9<&CIi(TC8LnHEq!Q;ZFTqALZ#aE0{L|7}qNAa1lr*N$ypemGvl_ro z*=u$tE;8mEF}!ACRz6x}X=4XlkEe3dCuYJ@59If5OR$T0F-vJs_QZsiObgCV0HDh+ z%kE70;g4@v4P0v54UCsdPnhD1D0_N*-Kf>O#aTew&P|>up9xjYukWa-?+f9+->mM! z^kwrjW)=vT4U$UofB+O3<}%BVg_58!2#9GLoQ~SQw;nD;Tx3>NW$`_0>YRWD#oO&w}-KIkrQu}Z^cKBmya^flMu z>8=~C!uG6Oz+8xST4m`;&ag`wsOzkL8Zw;XRalyFcYO=L-JGwD8u zUfK@^ab)nOUQjPhwH~`t_W+myS2m&P7G1kbS5<~Qgjg3r&v9MXx7Oov2(YNh0N0qj zE_v_BWg{h?<)wML`J=I6(IL{3D~SUGg9PomFTKj zZu==Dp=Vq$K$7JMtO03zI0P?tErqch6Jbbat7BdSKYmbTdEeHCAQb3W(Xf@}(e^4|w~jdK(FQ~L z#XkYWU!1sXooC!G?N!55{T*S$KZBQwY{lIs*OLw+8J$!}{s{&rTd1-yR9|SCzQlVO zB8zAV+%(;%Sf;%Q>0XyxoXy+6G;w@&^RazeplSA>PG3+2MX(VTYlJ2a+vgY(3`U)w zlHnq@;^hO~+{DbZ79MCH5&?L+#*w&~F9Ovym)I3PEiR z*Wdj@deJu%N6sOJCvfCNE;MfOU;6{}9LhXCc@h@X?iRdy6e4)gaRs3N`K=0kqJES( zj1y740OIkMYRVlrq4-2-rl7XaoB_{ORjS>`9g(=c&qVhafdbk}>EQd;$XWUM2Llu9 zR`p$G(R#I5LVaAT|A(>M)6bw8h%(!UP=oO2M{8(VD5^iI9>K@y?)nE!`_m zQ)Z9+oRJgwz+{E8sI0$1))nw6Gf#Q3dtkan;=@JG@W&yJ)kequc8y$Pyr`oSl7BZ$ z>_3Q2|Fdmpd@U1Ep2z=Cf44Fx4!7BKV~m?j4ZD_3xVuYu{s9AeCfO<9dbcOB)UJhq zTaJ&8_HVA(#kZpdj&^SvrAo~cF};1yInFL-mx53dw7}~smrj`V0{Dz0JK&|>{$=RE zvU%HFOg;z7nqbM+jRiJyM4lNlFyr5jyI!*!-0X0jDVs4jOCv;BDUD>y0Cqqf1444S z$-$4Fk9QkiqqI{){a^j*7X7zqDdAL=UM$qdc*^+Whj#L-OUT_S4)U4Aw)BR&;>Uz4 zYOVf$ODfLTOMmw!+b3z=eg^8rJ^0P5s)*{ORBShFI(M~+QM0XH(+Vj8qu(zVCt7G) zxz>BrMy)*<`z&;moQ+E!u_ngX$P z6m%;FblI$28OtSD=?op}BS_E<7ag<%h@m!j3UgKG&~o`KCiE7e@|`+YvX-?38Mm-y z@d*MK!NNF}efQHLRUde2oZjCVd+_7&>o-Cy`AYh(4tJ8#(s&x11J&5446&{WwWwSX|8q>4-Ev&9x>!9G@SrP-a)bV0D-NPG`3e%H#dR@k zh|4|BxvYEhwc^GCHIn6B^A}8$%z0Ofunf{RVm}ykVP48oPI#q$TigIISBJGOe=c?m zT--2aD>Ekg!XYVu^O20~zqcYWKevYC!@YgidEMU?#p~mKR@m1gN`RadCwTJ|ivR<^ zTua2Bxt%Pt;wo8J=r4`_JKqV01p6V*^@0b_P(HDS;YTB#La1M|0k^)FHwT9*)JtRY zMYE>YcFlnjf`)K!^DD~$n4_izC_7UKI916W52v4bQ~}rxAEeM-iy^F0ntmF z*-^arMNirX5{%|!5%K&Xi&@|Mk1R*u(w+s^@P+Kn zQgY+RAIVDrd6(+}gY0_Fgds?l;;)!Rd;WZ69UN!22<1M|11_uynS_rXZYlXk>w@}E zkTDPueBJRDHKo8rSz1!TpPLg>&=d8+4$HNbJb8qFTW;{Lpl}fKM6gYE;pF_^Dt!4U zp*s!=F|)w<)g3x5L(>K2g_g?wfnB=?Ij$`^(j>WK1rdX9JKh<-$#j4O9;6ghXKh(~ z-Js*Dvly*Psh;i0bd&AWtys99)^aRAm(U5Bi_gxapMqJ!*SIAY*g9AE*T>|(IuRFM z1D{G{YO`~8P%*4yJBe)`OEe!0=F@aXBBM5R=}jK9-b>) zVl2^PK;@Ps=t;M!TFy5wDltiZZo%NFsVtmm9~7Ji(|C}V@wL?rzX9+dV%XkUUFkP< zCUd^G^Jgj{Q=S9TS#DxeVk?XfvFRd~_6^dxN0X(^UEHbiX1CtGZ`IAq+T?GP;3mBe zy@m;aZJ*WvF0|rFB|O^D>j>x7clky!hd=MKwR~*(Y@gMo_4zM`SH8+P3U0gLFp~y& z6_K)qZd@TAA=;H6hS|q=Z%<3tW&>7)wfFnCPcDRqGZ{Yyyrk1W-YvRmV3k|POWC>V z%D+QbT{#R;S0Xp>*h+whzXR~zjQHIHCW7;5=C4` zsfiI)HF$Xi?^}zP*O^0LuPGOusr@vFpPVbcf_x-pd#<&Hk$mODzY2L{n`2#_GFCQ| z$yf-6`cbMm->poZAeq2+#D&B}xuntiMG9p>4P7YG&K1A6anLuC7PS`YEwyt6os9Qz zgmGtE?#-V&Nk|Lpe%xFs{?QYZurZ-qrBI)h`?VY0v zZhKm#It^YW33{!NeK#b}7nR5k0;|FaE&zDhibwiyS>k#qNWRu~-Gp%^(~$Kbp1wdH zmwaKBfh4RY^0LS7{e;%b450JF+oB4dfj(M7DcpR;e_P|TxKHs};BvcPO@*jxQ6|%q zYL*Q(Av&39x{`^m$KlubD*j0|^pJ#qWZior3j0{+0z3je76#}eiRxH~T&}XglZX#1p<%Ge(>m@X0fSw`H5$SEamn95 z{P`;0)ej4vu-Slqf@H2&w#HbyYiV+!Nw43ItU7VTBc^*St#+@^6f z>^A`lU%Nz(hD3ES-0lEoax~QT9q-=`a~{VoA1i?y0Rf=Fj$2CDY~#NokkWLcA(CME zsVx0dbLJ*i0`xd;Z^OO!dHfMYz8$f4^855Y>m=nhtq=V=4C=Pv7U$I2xRo7$wEM5& zz>DhX4%Fr+kV;4wa;ot7V|^fpLLl<2XTf~?yxycun)Plv3IbQ*)6ZoJ;Y-te@t!vI z%~eZPw@vV|T#@v1E{{^u+hdWc^0n$#QP;)F-@&pAbi4>%p+%p|v^*U9Y@wczLerJk z4;Eq1ZjKY*S7Wh$MwdF;5d7=2Z z7R}5NFkG1*sRRE5Rr%yR!rBw9-&2`qml?4httb9EFg`9ZtjU#c)yb68$D*1dgMak- z=HKm4&{qGo1o=4gLGQp7Kmfs&^e@ROR8>iJhwE}d?v~isEo*;sIi3-w&J!5#t#sVC zjT-paz%ou}RYy^;zl58WsN{mNchSK%@$;!k5$5h?c}M_!MercFN~}FF^_B1ZJtU}A za2JtocGJ}snD80lB5p3|Srew1J&_gqKoC76rwxeCI0TWaiRFkDh*3FFMmG^0k$yP4 z3Z$g9e7Cb!)C~k$gx9Rd?S>>rr^p;0YJ`9}@?o-fUFA;o0%&_h-Z+A&qu|2GwO$;Q z7F(NtzWje`uie3|_E+#x4EGA(s5FEhIl!xGUi~VLO%p!<^wSr!%;c%4WW!6CRtWp| zi)ie)nV?l731a?|!(0b=v!q$}gd7&Q5ojNicx5a-FW*^jOT&6B+kfEBAJjQen6mS{ zkULdv^*Le|r(D!??tI1*0F_aVTIPR4g~ktPsUnmQGgt+HPXQ?y=x1!(RWh5 zquF?FDY{AA!r)m~BV==y+}Vo=d^-90${EjNMB@*N_fKtbrEx!B(dQOVYOG*I#fD}l zhsGx|C24`~PB{ln-OvJQFBRPijEX0gqy;6isjn2w7pv6QtA3M&5#XeJA%Bfa6E9*{ z{Hfyk|6c+V^M5?!8wO_#J{jO-#Yi{EF!bX8xl>4PG0`3P812TR|G^sMXa>yKA^VHy zsPsV!HSY`7ofCYn>^3UmqJ9jL>k5l}qXO9xTM!!9yg}O?Ey~dh)!#m}Zvg66eCJ$j zLID1E199CgBZm%>4&g{Io1=DE?`mIMef_@MP*0Eli^(*_+^tEm z0D=^QASOc=vNzSF+B>SUM!lvGnb~ zwMSVtm?v&^=scIh;#NrQp<~B)GPH-DqIacyBn8r72`UMBGaZBa>iY^?3{MAQ; zu4@plq&n+;tiOTbHG{kUH;5}B`Kb!9``SLX6mfWX8<1=wPCjD2c36AtlQT~K%LQi* zLZ`-;63jW`z2pz7e>_zlhWa_$oW86XBAA}2!tM+q6RiOWo%+KLuW%4M-l&(HBY6YW z6XM&Pa%q9mNmOj!hmQXI`MrcApe`3pv{9-zkS0|ff>7F8g;L#H^eFABS;wG%gEQv>pHr9!=hR||wowx`AW>V<9ww?E9NV+r!6>b(y>r(M&J?7&&A|DzH4F zeYxcL&vxXR(wKoIz!l2A%=k}W_%^^MCQZs--u|RxiLG*fXFFb`Jwx#y=bzWF5|x*S zyyxmVP2zLZe^za-c><2T1y)a^$-6?{^4@ zr`Pdjeg&(nc!d1}%g_;mKNM%-(J?AI$ASs--$e6Y6Thha7_w5xOz(X?pY-HoOyE9JG58b{!u|JJ_O=b>ri+9cR5Gr`E zJAY62_^O~UEx%vn^B>LU;1c+TWD6pqtb=dU0E2BYh` zu_|5uMmEifHY_$cbF8>`Pc3xlT{E+y7rDwBQWS7%B_mV}QWdG)atlW)6i5L#Z;KNo zq(gjmXM+5F)YImvc~v9>zmF!@qS^Go!>j!)Pc+>`5mA?WyzqYgl9|;E=^JM+uN+PDwlK6lxoUK1UHa)-{5lc@^%EFAP= z`xvQPv=Yazcety2q`aDT> zJC$|L72yjl{Q}LD#U8yh@5+CJG|Swc%Qwtc4NjL}LhQI*5$O2 zwfq1f+{xG&nYEcMdVam!`|Cz~MhvGv03Qp$K%(OX2w)oG4dtGqjAH^Y)0s|toBNo2 z!}@2Y+jeo>H*dX7nkU0SyMBu00J2XhGMSGP}T+4qeC}VP>#1U0*F#I%bys>6;_7()1_FcNfU1Qnv>_z zuLpEn1#{XJo#&G_gS^flLKFyj76O7mJ@lxlQAeI75kbJ=fjjYGWX~9LFG=@3nGSz@RF(r@H3@mgUidP z;^McKOUQdh33&ig+`~miUA^w~+SBOt*kUfyK*A~>JD&PG`E!eTvmt#<-f2{&CfLn(@4$b&flkzy7hv6Yy?2-91{~6u7l^Z9I6J0>CuPdULzwZD&ouZcF`f@_H}QgWO*abXV_d#{ zTz;GpdSLv+ixJO>)|D6Ok9Y<|0>|&-J!hEJ2IMIq{7h$C_XUcerH%y3Z^N#e{R7!v zkJ@#w&nyns&J5nYM}xrzOTL8PLmeYrenUyHFei_t=C7=lX#|2a}APMy^sHV4!l*k`s5n0Vb~XEmACI}eJCQ!#K;;@el|5Eazu6tL?+ap zloIq!A8+1)IyX|_eQvE`N^$`q%(aRNIUx=*>3sTPv2fn^w)>S0nLs&{!%+(7M^W4_ z-5!iJu7MeRpKX?7gaR71u{3e>IoW&!s%Db+K$??sEGxV9HCzI?Lh}2M$NK}qgHxCN zT;Dj6F4a*copu5)$*mpFYDy!_DrGZ7&4aJ@Y&Edzmjd(|z9x!DKRZRsRIp-ckD= zH{RW3yYCxo^ge#Z`SC8PTPZ8NfJI#5dXWcR2f7aep^~~y1MCoir`5~uF`;+otq5ep za?SM`*rum2Qa)I0uX|@+(|>MKNPErqP$v%IxU`I)ZSvMRuPy^Raqh>I2=&%{QO^EL zq1vjat5yQs>+98vW)08e`=ZgIwn32wwX2mv(tQ+?c#tGHT>$h_Qv9?*w+LD3a~UOd zz)T%rlOE;LGTl1L%qg68q0Kl^np25?}iPZw&9b+s@M@Qg| zmzf!TLTSNJVRsDlRyxMtJ2x~nbT_DB4a`Q$yFbYeXL{wUZmY<3Erzfa*26qjLtgM% zh(dSUIz#Sw{$1bhBhNIoQc+gVAF}@b`7mZ($6moq;8l1Cuxm#Xi!BPSe*Bf7@RVfL zWBqNvO3g2@R)+S;Gpsi6T1$NQVIt-^^=cuB6;jY*aB%hnYR@&1$UwyV-OmOXmvgr? zx@tU=Dd1ElKv|DEwxBwT$N>Fvw53rQs>yZmxq{@XCGJlIhO5 z3F@*nnl*`}rk_6vj|lIXxubS(S*z8N-SP}U;a#E0c12*!dHY0xt9Fy2 z#p6Qt4Id}qa+dgAxNiE&mbkLJ3ziL>SRpQMdtEqCR(`45Za-`O z-=-wfYTjzd)dxB_iASxmeHf|>IBp3UCYnt4j0)u%`a_{T~%XLCOH7LBb%E z8l6(oAYDo~(#;G)q$Ed=Mp|;h7*i0C99?68!03$_Z1jG6e}3QZ_j8?V*E!ezd|l@{ z=XLJqeLwDsa!r|ghSNvQ-#iFX9+0-&Md)z;8w#>_5>2Q|M1u`%jvI9ux5}w&3(da< ziAUPj%iy*x#di4zV+=pKJSEihK?tdvtontwqQxw$X`(`<=MpJz)sz_@Y7KD~<>SqA zUR3K*ny_W$mlQHV@o>2vo;P;u9}ke==T}#yJrkPp+)rKQqPAXa(GWb6KpF-2aQJ-P zU@NiUnQ-o(bx*!!FVg=PbS{V9xcAoIM7yW-1rr+qZ8;M?TIuPtEgH(*Yo};aK0s}Q z-nb$j&+Wb!-jNv);+O68m90n;8L{*dN(-|sFW7(E7#NN)Gwhqlm^eTiVNZuvSDI&+ zWC@ocopQX5x!wfE^hm5>BJcS&1#4zooFMK7MP7t^Pys_IBxDbEc8ICEp{f=5~G~DAe?taK899^LvgM;wYie$GQuQ<%5WXeZnnK5+UO>+E4J(%rO zOdXL0Y|oD1TRJ|RK?#~?B9SrhWVoDihz4^b(#3B&-U6zndhYsQtW;BethJ?>2#s%< z>BR&P)|(QWYU%`6|31`1P6{bsadUmTLE`eTR+y6@@nc%it9G;Bu_3!Ua55fp)8*Tb zy~%%QXE;+Q@<(lMym-AN5WJ(f{%!x}#+kI6}XpZRxhR_!Ow2CNHelZw`LTxjcr5mEvw&m&4j|<8ypzL`$*{ zokW?-4g6T8QBV2&+RPGKnkg#$ha^1EhpVw!ByWZK7LOueX)h9eddj%*TX`4qzR1w0 za=CuQri{>k&E(ZP&)ZoU0GP35<*vm@O5x8`{FQt5Go7l#ULpz*C-l{lJE{~IAGPd>_Q4SrPh5IU*!3Ni9s)&6oh&j*x4CM3>%B8FQNY^-!>kOR(R7>;HyPdjD6^ zh$kr;Red5woFob32I=?TagF5GxJ5e1NtG_QNJ__bQW%BahRHhf*vRxw-Ia)wzaq-d z#`K>l8J(G2o@|MCmWJTxUh1MlRy9iEXNE-d!N=`1|7=~oh|8_{*h&?rS+kJkBZE{e zX6S@DSiU0_{WE(>H~azu&P7i+4sT>3#Ls2zV(op+HhmA=7?8!Xu=_5Ig2{E}vbfZD zL43z~^dFv}yHpiw1^kGSv#yOudBI=hsnDI%K3k@$X&4)$k@CbNvMx|Pe51fRJZ@;? ze&nqu4>QJHJjBMvaF$1ghHvhusPY-%qZ*~JW^}$Ns*%dh^pZmOEa^x$Oo>Ph?ivY1grVK$hwHlfPiE1gd`rc z^ky^SBD7)D9JhV`!uOBnQX{3J%d`Hs>zVdM1vb94f7&`cj;(9k&D3&Ymt`-RcT?a% zUls|N;WDULS|}qOxI@A3 zK0+t_1cY*JwOpv1N6G?WUUk(%n8mel_}}AU`H9}e>Q8GF5N%%r$GEs#%yJI%9}hBU z@m22EsV?YE&o4|{dYyG0MZz$Jpgr*kSfofLzVFP_$>=%_NRs@A^~pO?D=~hLU*x)O zDq}&U7}s2Ta8i+DPTfWvi|F3zVxUY;!kW-GIdflfpDR_DmPIixCqhT3ewKGFY;8M* z=H>IXGRHssM)yuUvYc9c{@u$8_;`mtPC40#-_Y^D?HJ*+Er8+-3-a07BclAwW#Bf_ zycS)tq&M*AZ4vI@YrM+eF9w&}%tBqD`5oE=JuUfFLwGDNxk zuuI6AHe#oQCghK<+}?V?7?SI6r>MT!Y~0c0r{|*(h`^E*Qr4vOI(Vu=?8)6!4 zirfLVR$Kd-Hq2E(76zv}V%NQ7h)1C>oq^c-8iuED!myyH9|u73kq5!Hzoh<>2Wue^ z0wRgYmrrlA3hGVkwHy+2E%-|fp4Qr2mUWYh$@IYzkM<)kzoG=b-}XcA-GH@l#_1^y z=6*f2X1d_~BmvQNlsB7}B6E+^dr|zpVdVYSu_rc6q;dO#E3cL(v&o5ZBTpVxOhE@7&wd=l#rq*-IpDel7Y7G)URwpL~OzC}f>YlQ-dOe{)8V1pmiK+Hq&FkYcLjfD&U0YUL95Q;LPN z$ilFy95e3Ss%{voAN2yz5}KE0v)7iJ+>_g42Az971`sMy6beN2K|1bH0muS}>DII7 zf?D$w%2V<06uF^#r8ew;Ep^;8j7xrJz6<^3RG#+y*>&Kekx$Om`_I?3?4~E}K~h)7eK`l1rP5XtS$PwUGk59xuGxib{OW zlFdR>@Of~jY{YCQtj=Lqo#g(a6KAsG)$**Lkd2^n2?HTC2(BT|6}AF(1(U8@1yF;# zO*VQnW8eRNkk`EM3}+ou$Hc@6%cmMkVp3;DNo)~{kraICrEf!a{tWH0>OYJ4Zm_fU zUOJ>P6lTDjpAjLG9T^3RAlrU=#3yf>Sg6qkKP-k(MssqV>KMxr#aXT!lAdbEHgr#EN_Ohf&^-2)A_G z+J=t4U$ivjB!WijsPCOi;*8*g>9nrw4smR%Y9g!l!C)|rGO_m&NK1z&SwoFXPPgg^xZDH`87F?(fJ^Agw!~iXR+a}5>twU<{yJ!RlDn+ z56$2h8cbjCBQ{S@6BMXxB5XPqaygv2>=w?}GM=(vw=X~O zDYzKlZRU?FjZy^^l#4Q=ywn2n!ZrgizF?YtC zBlw3{w%P&8AEsj5v+ofv6PmBnmHvvF%D5?_9@}qy^CdXv28l+so|2FGFf0Grgw$wm zyU>V@uIRm{3J3b(AD!YS|FrCSe4tl;Kc6DI)4+uN5z*SD09Ry#S~3W5gc~r;jHBt2 z={zDMI>!Krh$DOpV1V^_w17W%5PgnRH$}`kUzH8Y$Cv8p^3wd>qt0BoE}1ZXH?$s< z;8)kKCawe7MFq8swl%Aq%aUeg)=+n9a-X&Z>=AK~LW$NN{;BL9g~$2&(hV|2@+)93 zwmgRbV>=%x=3TC3QRl4oPUJcg=lU7LO||(pWef~*u8Nk(5L0++ESrxp?pWN3Rvl;p zFI$!^+UOX*`+HA?RYwu$*>oZp!%1`ISLY$&yWT3+_X|=r`afya6m^?~FPKIWox9^t zwWaRH-{(TD8g={766ZA}1@hX!j2BptzJv3&;Me?fklF*)yg%se{iW#%y!yeffnP@N z@7!N@T|b}NTijH2PqG=gnBLz`EO=zK7T7t+K9e6TJWsgN5~)sNS)-rx(<{_5qYdj- z+XJ(BtR-Ei+T!=-)|+wFLVuXvDoxrDxrB>}xc_*-vPV16!Siv-Y4*lia%5x+IhhNG zg=b-1)Lr5@l!3zK+jd9Ge!Wy0U%*9N+>xxy#hvY~`A5~;ozdo^V7TfCc41OtRd(kU! zjmOnP)9v>hjAd)-4nB^in2*C9v}z#Lf|D;{nJf2|ERXzIPcgYW`n4n$>%8eit{< zv=~Xspar)ma>p2@uVVMVAuV^Y2o9bX!Nq%CXZAapdxZ-xoqI!^M1EzjMriHP*?_^_E zmJ`%FGqAffe=gj9X!lXV>LACQjPs{%tq8%tzRd5sY-X0LM+$Sb&f)D9 zPF)rdCaw#`U+-;bd5o8;-e^%NhXWnajpyLo-xut8N(4T?&8Z}lpV>Vh5Im&u1+nM7 ze|)MU>@}AejqDSAY`H32f!GYO9xMIW!vLPJj0=fcmfg6I~0^yiL1FpHM!Uh%<>Wny;T>$9Y$_35n>+ifwL zNj|7+j+H3pvH3@`mr$oAg)nf0k65dnsgiOLh#=BBh;AI22m*JDX9q0~Vq-p;C^S6K z=~{r-m^6I24k}U@x8>1(_F45IhulV>!%WoitfV=(m7Cl#@FH52+jcd8AR2LofC$A& z=8iy@-iY9jC)`oJu00++NQ8a1hp~2X47!5)pl{zNq(z)rPa;pTx3--35qqo$j?}>{ zcqT+G`A)5qjn``qk#7kBnbqv)Fdy>Zq-G^N{t^ZzeijADA@fmblqOv3>ct zQaLzPD;l=t{gi%GMM~8gv==#9^Q$fPIxt6g=5X;SrFg7@7BQKvqPt7(vyr(-U>n$@ zBg02Bx6cGNcoQRb{?(=Yj;8v3?4;w|RNq;pp>^MKj4ta#+?TjJ1CL`InRtBcHk=+F z+r~-X(~9B{aHo zw#1e{h8=p@=eL6QiC=37mzICb0R|?@^-=GB|2RzD`t+xtZRUY3UC@mD)v>?%{OM(B zQRu9k=9Y8lRf6k0I*3<1%X$RFg=!+48Q*J_Yc`(~L+oa@dN+lZe7g^@$t+{*l&7~7 zL}%omf?RQjR#0PdUe4BBnCZr`5Wa$46-kT{fVjs?$2e=xtn!9NgZR=fTaSsF;r@2_Uo269GN?+Mlc1 z##7WEUQiStO!TEI9$IV0{VEE&PF{ME^`bfGS!v~(_0r7{>x$Tb!PS`CCie~Qknj$f zUDc~Mr`j(X4d)_!7aI36Wa@6dvJRHK+`UrMu5+ZaGrn~<=u~|(CeiXa;ZEQVhmCAk zp#P{=M=;v5q45f}YODtf!1qvkE?ov3^+It8$D-bHB$XHSw6!Hno-s2f&)aI*^~W*J z4XSG}x8}IMECo7ll)@jqtchj3|G}Z@rFI`=6_>4z@%qHg10?X&jZ_j9W`^c^M$m)P zx>rj&+bx6?Y#(EjMBOiZq|!J|%kSN+3Y%6`9c3wcu#*hxCXe~64*XC#-!Ba$R>jr7OeE0X_$j%2vF zOXB^9t>6-0HLlS?2iUYMt(x`A&h zv?+3|U-D!qfu6`bCG>f5joAt>wXTbk9=4O>D6X!hEeOq)18`r>)WCDd2?TmTN zxeqwvx>5D-y2X?G%lu?avm)C)8=DemErQ41XAT4v=u?gKW{q}cN8nG#F0L%peDmS; zY0JK>Z)xYJir>1xZkROL!xQDcrP+cbnvSsgmWx;J42yF+9CLmORR0z{RP^LaKV2`r z)=6ni=tbR}`mv_&G4(S5v0d|7*L@9~tK1T^IOn_;0^fEdPk0(^e9KNb&7PQ?NhfHj zXSASjSTka|+J0wn$L@tRP{7nVF9IKLYCRZqNg1>Q;FD#Ea9vu{l3!}X_{`u|;kH0( zkVM{=4<=x?-Ur(^?fbkiJIrP3#<(k>Pm1D}!S0{Vgl^}ht%FMIwA$}T(_6rRJYlIO zi3VMZWZL!Jzj*;OQ?L_DMr#tVIyvw25xgAR4 zNvYN3=R1;xjLe;sDE8=l40*lR?Es^>9(31~5~%EOdYv=)&(wiv<6zmLfYHA4t%6bF zk}I|&MIv$4e|_Miu0p|C`o+Sderh@A;7!YJ*w$5S=R#O}{F_|J_2!lb4|d!w4OtlO1OaQz%^34dd(f8|Fmcg`gsI7Fw;wC43hSqd?C`+Z=CaKBYHrc2;WU| z27pj)gR7V4#|g+>y7qU=D_&j0X+rWB{(G47S!e$=eg@%e`A538xs2VjZ`Uq7kH07PN^+>V4mSBXBbOsK*cKfL(F= z7m(<0i|T(B;+igxfo1`Z10#o?9e9lWa@ed&dXT{&g=7dxmaty*5`zsOG{lRL<6}ph zZ8;f=9Eyy;4)QYhBLc@c%(#@s<{pm=BpA5Bj$Ej?~I-1npKkf^Fj2iW=fZz0I3U|B_X zF-}0M)VTD^jp{a=5m%-(_X)qO$3;G1y`r7uak1fNQz*UF7u^pc%5=UK{cWF$JmH`G z@vQK6l4!ROS?6<_ul@FM?>tRmiJ8E`?Ijwzjt!sI+YA!V8n|TCaCa*_<8SJ6Rut3R zVYQ)@QzKRjmJkMDa_*)gJxYC3aAc;wRoVQ*{z=zXZDYr3X1(-t;vJ-B^~A7I^uidn?|+S5Cm@YiK~y5#`BxxJ&!6tGeO?O zsqUpOARys#7{nCr3mh--sBXlDyp;w<5b_-W5k&tfAEx08{JhmsAktJ<*utBx(gf|P zX5{3y-7+y{Gv1ceY>px1ZKR%dr5|6Fp1e}|Fci^=KwdF^lA`w=0)k{Y%54_r+@TBp zLo1G{ylJVI>1w}eljA+$ZCC|`z~Yyx`;JPxRs)ADOHplG!OQTwkdD8KkWZ*K6FbQ zqVz!dyKGSdkppG2_`a(3ETuF8Hx5(UN!XExR-1 zfP8%xE~P-OQK);kgw)%rTReubU$T4m`s?GCLi1@Bb+z7ef!813nrem-t~%aabgk?< zc>3FnH#fJyev%!7P|nSs^0zdrO5L1*Ff3z3hwR!X8^w^cTSxI_ZaYii{1({S;yU?# zL=Awq$2_+5^by#yChl28fD75*w$};E%~A7JFHmLn+d3_E$8xQ!^6S-1ne`EMbNMW~ zF9x67SxdQRRr)w4#x|64a`pukJ7FOSTRoHF+qS*(xP{7(wYff{B3bxrr;WTa`rVdO z_9rGD354oH!WNUKowhB&d;x}em*NPJL2cId!2+2!AXkSA6QZG>#7E}IDyQy2xohbC z@P2d$uZa~Rjr@4@uYX5BV-)n74wMtAJ_M3d*rf~dgS_o4pn6j+vQVM-r&Q6h-Ek~r zqz$ZDIuxp~H#TatWx|`SpjYyzH9Kf`sNxQV02%Uu#~YWlgRM_lp?_af#!Lt_>ZFxz zaecgcz-icPtg^KlE(N&7C%JP`cxY^f_Dzy{uVo5VkWgvWdqdUgd9&$P zHoFn$idGQsT=97oNLoVYHWQQSSj>8Jz3D7)Pf98fakcpnenq!TF-cd*bzC#P!W>Dn z8S}{Kku0ge;O>tnoF1W0-s!t@lPW%f8@|QHOW%5c8UDAZ3Cd>3_vzV>FDMRn8b8_ng#n=?f66`%v`4a?GjnGd6g#OK zC+3(tTri2pfpNwnwhpcYDc19y>Dxjln|@c9X!MF92L;*w2gBUa#+!++Ec$c38Y*v_ zfm?*>S`r0H&o(0|d=apOOb@v;d)4@^?RZ z%%}r&YtCAWm<6G`duBo5lN06w*@$G=6p95VgvlxWLn9omub3x(9(|#kf6+ zAyNL{RI_9082f_O^V8~ILc=0EAv*dl0gn8B4?;XHPklR24i=i3K2R-xT_}AmjNz{o z)3mSq(EP3THJ>K4++*IBbf%leCp5_?36??9M|;Vvr|moAwns4GrBv7~q{oY2I)*dL ztIvgpd2FAle^CDlF76J|{9F4uh(583>`EwS=dJ#Kd5H2Zqt&F5yX?Ksp|5&PNx8}a zKp)GL<5ZuhNSAq@BUM2bPc1{2T@5idqlKy4O!~l*DQR3!R~i#Wv}Xwdlm_zk&=&}71X zL<{mt^5XDqq-q>T8`oUAw;swvD#4)u&5cCEU|7k$i6DKn%=Y_DH$uqiX4jtc2jR5W zFO~xSxC8Ce^i##)c`BJb9#v%}cjFda(DfgqZXM{lAQz{3?gSgWDB*Zi=jQTb@WAVZ zX1lw)%mE9rb8ooq4DSv;zLRV?I+va{fk$0*UQVcY3$kQNy}lq-bK1OLX!`b z98I;)0!AHKLN4dyYjWvq-(DI&{4e70!&s1=?cB8gb!K0a- zAq{ypxSB{^(YH53=o)=tIoU0IMce)c#k$NF?bOcWATJIY}x7JxRK_`9FRNO5!~tBkB0B?Ujb)w75Z}B|UC828@^h zX5nU)M_u*Uw)%{ETi}@aL`8Dx;g_c78z*kJe^U?hL=8VY=VxjWa)R0)&c%N`2M_i6 ztN?o94sr#j-8b~=z@7M=KM9!Ssa*rFJt3=+!2bQ;iKpwkeoz^~?Rmm^(3oCbGS`U5 zGo%0#Z&NVRb6rQ>4!W)htndN19&grAQTYEO-uV7YMe+V@rqSev81xV?haX|e{a{Ug z|J{4mDtmQr-gs*HU3vSD_m+RUJ+7N^+68N9AVDGN;Ui*8K|No-)+lO))6O4%JIP@v zK33d#ZJGcdq5_Y*ECmeQ--cj zTppk&q!BwPuD(@fb0Ss=UBACwIAL(&27SDZ+}?cj=-(@EQtrskkB_U@|3X1yqk^BH zi-Y<(@5x6>h5PLdF3IZJ)U}024lk3Ik>8PL$D8ir$Q7yDTdYqK%8v85Tgc{Ri}oc}$LD=!&&It2as(5zFie1J2sGCJ>n($4Zy~*KGGh6-Fg4FTl_6X`uZ0M)t{Zj`;U`Mi&|KsupzkP9dG1Zz|NNs zv!zpPpnPEmVt3Z4V|D$T1>@%1<9?B?;8|ynLiB5krqe6fQOobbMxl(!9=>YyY1afS zVZPTY`As~d*o*4-k4P_L>-FB5I`NwJ!^TQk1`M0O{5{|j`%(Lt)MY}ta;A57RTPgy zB0Xb1OGMM0N1N~ChwxB8kE{l~e;De(lLhcvcaGo@DUDl}m-sgq>xa^@ctk6~-Mt+? zCkzX2+v;A}_TB%1=#q-ky%#_cA0qi-QlQ15=H?*t2!ZvM$+OsH(LJU#SG8QDq9=JY zX6TC=zvsA|z1ST)*pMY)MoM2n>g*o8pz4~~ebHRYeG>4uxWn^qTmpz?pn2PCabfoh zf!{MRG3B@a;GOH(GgJPwa=TZf9pf>!eSzyF9~~s1(5M@&I-`eCBAZE2pw!-H#7GU( zz~8&tbCWl-si9oiNQEYXeyb-B|GGi*-tV{?$A89q{>uchnFk4x=BqSSRSo(l#xnQi4q^}5;qz@nS6@_3ejm?~2TXVu1BSHy; zOpG14JDUETpZ2?99;3e-183Q0$zXkEWjmASrgxd(5#6~LdTE6XY&!D%@5GI{1W$Fo zziMiBRUFZyeD&_k|KdTvpSe}9d$a^xfu;3oh<2yAdzEPO4Tpg#J9oqDV)%5ta z+TWORdIVm*E%7rdMez9P*`r`uDZguVb|&zBCoLN5tfHo#@S@wyWfXmeRPcX^U+l^waTn z5A;i^)<1P0ImMq(Oat=BuJ9!8?O5WgslFvvo#?&8ct2gERTSiAJg;2%b2Y*R>63+| z?9nq)_=(CBMjl!cyT-!Xg80kB=K#}J0&KwM;pu>0uNgQ8!P#|}&pKSBvqRL^d!y4T zC;`$l;0bI~0zC97Yfc&2@<(1FGd?t%*Rdl3eW!@F!I1V#ZHhuScpk+)y@{)pE^;!h z=lt@C7h=$`!x2++`EOd1!|TVZp{MURMDZ7EbH>!`jk*R|EHVr-(@ZQSY`F1HyH3kR zB8{WYZx0QFZ3 z8(OBwcuqmaJ0z1ToYqK%~g2D>At9LawKl0H@d`@ot-0a zZpS99G#P=cO%{.m~k2D@sB;?^2v|4c7;$ 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