diff --git a/build.gradle b/build.gradle index 1ca1690f..f68e5510 100644 --- a/build.gradle +++ b/build.gradle @@ -65,6 +65,7 @@ allprojects { maven { url "https://jitpack.io" } maven { url "https://www.cursemaven.com" } maven { url "https://api.modrinth.com/maven/" } + maven { url "https://maven.blamejared.com" } } tasks.withType(JavaCompile) { diff --git a/common/build.gradle b/common/build.gradle index 26b5e534..78625d87 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -17,9 +17,9 @@ dependencies { // compileOnly("curse.maven:backpack-${project.backpack_curseforge_id}:${project.backpack_curseforge_file_id}") // compileOnly("curse.maven:regions_unexplored-${project.regions_unexplored_curseforge_id}:${project.regions_unexplored_curseforge_file_id}") // compileOnly("curse.maven:geckolib-${project.geckolib_curseforge_id}:${project.geckolib_curseforge_file_id}") - compileOnly(files("$rootDir/infinite_dimensions_jars/infinity-2.7.1+1.21.1-neoforge.jar")) - compileOnly(files("$rootDir/infinite_dimensions_jars/infinity-2.7.1+1.21.1-fabric.jar")) - compileOnly(files("$rootDir/infinite_dimensions_jars/infinity-2.7.1+1.21.1-neoforge-sources.jar")) + compileOnly(files("$rootDir/infinite_dimensions_jars/infinity-2.7.2+1.21.1-neoforge.jar")) +// compileOnly(files("$rootDir/infinite_dimensions_jars/infinity-2.7.1+1.21.1-fabric.jar")) +// compileOnly(files("$rootDir/infinite_dimensions_jars/infinity-2.7.1+1.21.1-neoforge-sources.jar")) compileOnly(files("$rootDir/infinite_dimensions_jars/gravity-api-1.0.7-1.20.1.jar")) // compileOnly(files("$rootDir/infinite_dimensions_jars/Cloro's Gravity Gun Mod (Release 1.3.1).jar")) // compileOnly(files("$rootDir/infinite_dimensions_jars/antarchy-1.0.0+1.21.1-neoforge.jar")) @@ -34,6 +34,7 @@ dependencies { // names throughout, so this is the one common can safely compile against. compileOnly(files("$rootDir/sizeable_foliage_jars/sizeable_foliage-neoforge-1.21.1-1.0.0.jar")) compileOnly("software.bernie.geckolib:geckolib-neoforge-${minecraft_version}:${geckolib_version}") + compileOnly("mezz.jei:jei-${minecraft_version}-common-api:${jei_version}") // // compileOnly group: 'org.ow2.asm', name: 'asm-tree', version: '9.4' // implementation group: 'com.google.code.findbugs', name: 'jsr305', version: '3.0.2' diff --git a/common/src/main/java/com/craisinlord/antarchy/compat/infinity/InfinityCompatVersion.java b/common/src/main/java/com/craisinlord/antarchy/compat/infinity/InfinityCompatVersion.java new file mode 100644 index 00000000..00a52abb --- /dev/null +++ b/common/src/main/java/com/craisinlord/antarchy/compat/infinity/InfinityCompatVersion.java @@ -0,0 +1,56 @@ +package com.craisinlord.antarchy.compat.infinity; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public final class InfinityCompatVersion { + private static final Pattern VERSION_PARTS = Pattern.compile("(\\d+)(?:\\.(\\d+))?(?:\\.(\\d+))?"); + private static final int REQUIRED_MAJOR = 2; + private static final int REQUIRED_MINOR = 7; + private static final int REQUIRED_PATCH = 2; + + private InfinityCompatVersion() { + } + + public static boolean isSupported(String version) { + int[] parsed = parse(version); + if (parsed == null) { + return false; + } + if (parsed[0] != REQUIRED_MAJOR) { + return parsed[0] > REQUIRED_MAJOR; + } + if (parsed[1] != REQUIRED_MINOR) { + return parsed[1] > REQUIRED_MINOR; + } + return parsed[2] >= REQUIRED_PATCH; + } + + public static String requiredVersion() { + return REQUIRED_MAJOR + "." + REQUIRED_MINOR + "." + REQUIRED_PATCH; + } + + private static int[] parse(String version) { + if (version == null || version.isBlank()) { + return null; + } + + Matcher matcher = VERSION_PARTS.matcher(version); + if (!matcher.find()) { + return null; + } + + return new int[]{ + parsePart(matcher.group(1)), + parsePart(matcher.group(2)), + parsePart(matcher.group(3)) + }; + } + + private static int parsePart(String value) { + if (value == null || value.isBlank()) { + return 0; + } + return Integer.parseInt(value); + } +} diff --git a/common/src/main/java/com/craisinlord/antarchy/compat/jei/AmericanizeJeiRecipeCategory.java b/common/src/main/java/com/craisinlord/antarchy/compat/jei/AmericanizeJeiRecipeCategory.java new file mode 100644 index 00000000..94efc7fc --- /dev/null +++ b/common/src/main/java/com/craisinlord/antarchy/compat/jei/AmericanizeJeiRecipeCategory.java @@ -0,0 +1,64 @@ +package com.craisinlord.antarchy.compat.jei; + +import com.craisinlord.antarchy.Antarchy; +import java.util.List; +import mezz.jei.api.gui.builder.IRecipeLayoutBuilder; +import mezz.jei.api.gui.drawable.IDrawable; +import mezz.jei.api.helpers.IGuiHelper; +import mezz.jei.api.recipe.IFocusGroup; +import mezz.jei.api.recipe.RecipeIngredientRole; +import mezz.jei.api.recipe.RecipeType; +import mezz.jei.api.recipe.category.IRecipeCategory; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.ItemStack; + +public final class AmericanizeJeiRecipeCategory implements IRecipeCategory { + public static final RecipeType TYPE = RecipeType.create(Antarchy.MODID, "americanize", Recipe.class); + + private final IDrawable icon; + + public record Recipe(List foods, ItemStack hfcs, List results) { + } + + public AmericanizeJeiRecipeCategory(IGuiHelper guiHelper, ItemStack hfcsIcon) { + this.icon = guiHelper.createDrawableItemStack(hfcsIcon); + } + + @Override + public RecipeType getRecipeType() { + return TYPE; + } + + @Override + public Component getTitle() { + return Component.translatable("jei.antarchy.americanize"); + } + + @Override + public int getWidth() { + return 78; + } + + @Override + public int getHeight() { + return 18; + } + + @Override + public IDrawable getIcon() { + return this.icon; + } + + @Override + public void setRecipe(IRecipeLayoutBuilder builder, Recipe recipe, IFocusGroup focuses) { + builder.addSlot(RecipeIngredientRole.RENDER_ONLY, 1, 1) + .setStandardSlotBackground() + .addItemStacks(recipe.foods()); + builder.addSlot(RecipeIngredientRole.INPUT, 30, 1) + .setStandardSlotBackground() + .addItemStack(recipe.hfcs()); + builder.addSlot(RecipeIngredientRole.RENDER_ONLY, 59, 1) + .setStandardSlotBackground() + .addItemStacks(recipe.results()); + } +} diff --git a/common/src/main/java/com/craisinlord/antarchy/compat/jei/AntarchyJeiPlugin.java b/common/src/main/java/com/craisinlord/antarchy/compat/jei/AntarchyJeiPlugin.java new file mode 100644 index 00000000..dbe6a041 --- /dev/null +++ b/common/src/main/java/com/craisinlord/antarchy/compat/jei/AntarchyJeiPlugin.java @@ -0,0 +1,98 @@ +package com.craisinlord.antarchy.compat.jei; + +import com.craisinlord.antarchy.Antarchy; +import com.craisinlord.antarchy.content.AmericanizeRecipe; +import com.craisinlord.antarchy.content.AntarchyObjects; +import com.craisinlord.antarchy.content.AntarchyTags; +import com.craisinlord.antarchy.content.CustomBrewingRecipes; +import com.craisinlord.antarchy.config.AntarchySettings; +import com.craisinlord.antarchy.content.entity.glimmer.GlimmerVariant; +import com.craisinlord.antarchy.content.item.GlimmerBottleItem; +import java.util.ArrayList; +import java.util.List; +import mezz.jei.api.IModPlugin; +import mezz.jei.api.JeiPlugin; +import mezz.jei.api.constants.RecipeTypes; +import mezz.jei.api.recipe.vanilla.IJeiBrewingRecipe; +import mezz.jei.api.recipe.vanilla.IVanillaRecipeFactory; +import mezz.jei.api.registration.IRecipeCategoryRegistration; +import mezz.jei.api.registration.IRecipeRegistration; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.TagKey; +import net.minecraft.util.Unit; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Ingredient; + +@JeiPlugin +public class AntarchyJeiPlugin implements IModPlugin { + private static final ResourceLocation UID = ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "jei_plugin"); + + @Override + public ResourceLocation getPluginUid() { + return UID; + } + + @Override + public void registerCategories(IRecipeCategoryRegistration registration) { + ItemStack hfcs = new ItemStack(CustomBrewingRecipes.highFructoseCornSyrupItem()); + registration.addRecipeCategories(new AmericanizeJeiRecipeCategory(registration.getJeiHelpers().getGuiHelper(), hfcs)); + } + + @Override + public void registerRecipes(IRecipeRegistration registration) { + IVanillaRecipeFactory factory = registration.getVanillaRecipeFactory(); + List recipes = new ArrayList<>(); + + recipes.add(factory.createBrewingRecipe( + List.of(new ItemStack(CustomBrewingRecipes.cornItem())), + CustomBrewingRecipes.waterBottleStack(), + new ItemStack(CustomBrewingRecipes.highFructoseCornSyrupItem()))); + + recipes.add(factory.createBrewingRecipe( + tagItems(CustomBrewingRecipes.rootsTag()), + new ItemStack(CustomBrewingRecipes.highFructoseCornSyrupItem()), + new ItemStack(CustomBrewingRecipes.rootBeerItem()))); + + ItemStack glimmerBottleInput = GlimmerBottleItem.create(GlimmerVariant.APPLE_COW); + recipes.add(factory.createBrewingRecipe(tagItems(AntarchyTags.Items.GLIMMER_AUGMENT_OURANWOOD_DEER), + glimmerBottleInput, GlimmerBottleItem.create(GlimmerVariant.OURANWOOD_DEER))); + recipes.add(factory.createBrewingRecipe(tagItems(AntarchyTags.Items.GLIMMER_AUGMENT_FROG), + glimmerBottleInput, GlimmerBottleItem.create(GlimmerVariant.FROG))); + recipes.add(factory.createBrewingRecipe(tagItems(AntarchyTags.Items.GLIMMER_AUGMENT_ANT), + glimmerBottleInput, GlimmerBottleItem.create(GlimmerVariant.ANT))); + recipes.add(factory.createBrewingRecipe(tagItems(AntarchyTags.Items.GLIMMER_AUGMENT_ELKA), + glimmerBottleInput, GlimmerBottleItem.create(GlimmerVariant.ELKA))); + + ItemStack glimmerBottleDeer = GlimmerBottleItem.create(GlimmerVariant.OURANWOOD_DEER); + recipes.add(factory.createBrewingRecipe(tagItems(AntarchyTags.Items.GLIMMER_AUGMENT_APPLE_COW), + glimmerBottleDeer, GlimmerBottleItem.create(GlimmerVariant.APPLE_COW))); + + registration.addRecipes(RecipeTypes.BREWING, recipes); + if (AntarchySettings.americanizingEnabled()) { + registration.addRecipes(AmericanizeJeiRecipeCategory.TYPE, List.of(americanizeDisplay())); + } + } + + private static AmericanizeJeiRecipeCategory.Recipe americanizeDisplay() { + List foods = new ArrayList<>(); + List results = new ArrayList<>(); + for (Item item : BuiltInRegistries.ITEM) { + ItemStack stack = new ItemStack(item); + if (AmericanizeRecipe.isEligibleFood(stack)) { + foods.add(stack); + ItemStack result = stack.copyWithCount(1); + result.set(AntarchyObjects.AMERICAN_COMPONENT.get(), Unit.INSTANCE); + results.add(result); + } + } + + ItemStack hfcs = new ItemStack(CustomBrewingRecipes.highFructoseCornSyrupItem()); + return new AmericanizeJeiRecipeCategory.Recipe(foods, hfcs, results); + } + + private static List tagItems(TagKey tag) { + return List.of(Ingredient.of(tag).getItems()); + } +} diff --git a/common/src/main/java/com/craisinlord/antarchy/config/AntarchySettings.java b/common/src/main/java/com/craisinlord/antarchy/config/AntarchySettings.java index 1af8f10f..62426b0e 100644 --- a/common/src/main/java/com/craisinlord/antarchy/config/AntarchySettings.java +++ b/common/src/main/java/com/craisinlord/antarchy/config/AntarchySettings.java @@ -127,9 +127,19 @@ public final class AntarchySettings { private static double gravityGunBlastStrength = 1.4D; private static double gravityGunCooldownSeconds = 0.35D; private static double gravityGunMaxHoldDistance = 10.0D; + private static boolean minersDreamEnabled = true; + private static int minersDreamMinimumRange = 48; + private static int minersDreamMaximumRange = 96; + private static int minersDreamTorchSpacing = 10; + private static int minersDreamBlocksPerTick = 150; private static double lucidAttackRange = 9.0D; private static double lucidPearlInvertedDurationSeconds = 6.0D; private static int corneaEarNightVisionSeconds = 15; + private static boolean americanizingEnabled = true; + private static int americanBonusNutrition = 2; + private static double americanBonusSaturation = 1.0D; + private static int americanRegenerationDurationTicks = 60; + private static int americanRegenerationAmplifier = 0; private static int mogglesVisionRadius = 2; private static int mogglesVisionMaxLight = 7; private static float mogglesVisionAlpha = 0.35f; @@ -490,6 +500,7 @@ public final class AntarchySettings { private static double herculesBeetleHealth = 500.0D; private static double herculesBeetleAttackDamage = 30.0D; private static double herculesBeetleChargeDamage = 40.0D; + private static double ouranwoodDeerHealth = 20.0D; private static double glimmerHealth = 20.0D; private AntarchySettings() { @@ -947,6 +958,26 @@ public final class AntarchySettings { return gravityGunMaxHoldDistance; } + public static boolean minersDreamEnabled() { + return minersDreamEnabled; + } + + public static int minersDreamMinimumRange() { + return minersDreamMinimumRange; + } + + public static int minersDreamMaximumRange() { + return minersDreamMaximumRange; + } + + public static int minersDreamTorchSpacing() { + return minersDreamTorchSpacing; + } + + public static int minersDreamBlocksPerTick() { + return minersDreamBlocksPerTick; + } + public static void setDisableInfinityBookPortalCreation(boolean value) { disableInfinityBookPortalCreation = value; } @@ -1393,6 +1424,26 @@ public final class AntarchySettings { gravityGunMaxHoldDistance = value; } + public static void setMinersDreamEnabled(boolean value) { + minersDreamEnabled = value; + } + + public static void setMinersDreamMinimumRange(int value) { + minersDreamMinimumRange = value; + } + + public static void setMinersDreamMaximumRange(int value) { + minersDreamMaximumRange = value; + } + + public static void setMinersDreamTorchSpacing(int value) { + minersDreamTorchSpacing = value; + } + + public static void setMinersDreamBlocksPerTick(int value) { + minersDreamBlocksPerTick = value; + } + public static double lucidAttackRange() { return lucidAttackRange; } @@ -1417,6 +1468,46 @@ public final class AntarchySettings { corneaEarNightVisionSeconds = value; } + public static boolean americanizingEnabled() { + return americanizingEnabled; + } + + public static void setAmericanizingEnabled(boolean value) { + americanizingEnabled = value; + } + + public static int americanBonusNutrition() { + return americanBonusNutrition; + } + + public static void setAmericanBonusNutrition(int value) { + americanBonusNutrition = value; + } + + public static double americanBonusSaturation() { + return americanBonusSaturation; + } + + public static void setAmericanBonusSaturation(double value) { + americanBonusSaturation = value; + } + + public static int americanRegenerationDurationTicks() { + return americanRegenerationDurationTicks; + } + + public static void setAmericanRegenerationDurationTicks(int value) { + americanRegenerationDurationTicks = value; + } + + public static int americanRegenerationAmplifier() { + return americanRegenerationAmplifier; + } + + public static void setAmericanRegenerationAmplifier(int value) { + americanRegenerationAmplifier = value; + } + public static int mogglesVisionRadius() { return mogglesVisionRadius; } @@ -2548,6 +2639,8 @@ public final class AntarchySettings { public static double herculesBeetleChargeDamage() { return herculesBeetleChargeDamage; } public static void setHerculesBeetleChargeDamage(double v) { herculesBeetleChargeDamage = v; } public static void setDorrieHealth(double v) { dorrieHealth = v; } + public static double ouranwoodDeerHealth() { return ouranwoodDeerHealth; } + public static void setOuranwoodDeerHealth(double v) { ouranwoodDeerHealth = v; } public static double glimmerHealth() { return glimmerHealth; } public static void setGlimmerHealth(double v) { glimmerHealth = v; } } diff --git a/common/src/main/java/com/craisinlord/antarchy/content/AmericanizeRecipe.java b/common/src/main/java/com/craisinlord/antarchy/content/AmericanizeRecipe.java new file mode 100644 index 00000000..f8cf9dfb --- /dev/null +++ b/common/src/main/java/com/craisinlord/antarchy/content/AmericanizeRecipe.java @@ -0,0 +1,114 @@ +package com.craisinlord.antarchy.content; + +import com.craisinlord.antarchy.config.AntarchySettings; +import net.minecraft.core.HolderLookup; +import net.minecraft.core.NonNullList; +import net.minecraft.core.component.DataComponents; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Unit; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.CraftingBookCategory; +import net.minecraft.world.item.crafting.CraftingInput; +import net.minecraft.world.item.crafting.CustomRecipe; +import net.minecraft.world.item.crafting.RecipeSerializer; +import net.minecraft.world.item.crafting.SimpleCraftingRecipeSerializer; +import net.minecraft.world.level.Level; + +public class AmericanizeRecipe extends CustomRecipe { + private static final ResourceLocation HIGH_FRUCTOSE_CORN_SYRUP_ID = ResourceLocation.fromNamespaceAndPath("antarchy", "high_fructose_corn_syrup"); + + public static final RecipeSerializer SERIALIZER = new SimpleCraftingRecipeSerializer<>(AmericanizeRecipe::new); + + public AmericanizeRecipe(CraftingBookCategory category) { + super(category); + } + + @Override + public boolean matches(CraftingInput input, Level level) { + return findFood(input) != null; + } + + @Override + public ItemStack assemble(CraftingInput input, HolderLookup.Provider registries) { + ItemStack food = findFood(input); + if (food == null) { + return ItemStack.EMPTY; + } + + ItemStack result = food.copyWithCount(1); + result.set(AntarchyObjects.AMERICAN_COMPONENT.get(), Unit.INSTANCE); + return result; + } + + @Override + public boolean canCraftInDimensions(int width, int height) { + return width * height >= 2; + } + + @Override + public NonNullList getRemainingItems(CraftingInput input) { + NonNullList remaining = NonNullList.withSize(input.size(), ItemStack.EMPTY); + for (int i = 0; i < input.size(); i++) { + if (isHighFructoseCornSyrup(input.getItem(i))) { + remaining.set(i, new ItemStack(Items.GLASS_BOTTLE)); + } + } + return remaining; + } + + @Override + public RecipeSerializer getSerializer() { + return SERIALIZER; + } + + private static ItemStack findFood(CraftingInput input) { + ItemStack food = ItemStack.EMPTY; + ItemStack hfcs = ItemStack.EMPTY; + for (int i = 0; i < input.size(); i++) { + ItemStack stack = input.getItem(i); + if (stack.isEmpty()) { + continue; + } + + if (isHighFructoseCornSyrup(stack)) { + if (!hfcs.isEmpty()) { + return null; + } + hfcs = stack; + } else { + if (!food.isEmpty()) { + return null; + } + food = stack; + } + } + + if (food.isEmpty() || hfcs.isEmpty() || !isEligibleFood(food)) { + return null; + } + + return food; + } + + public static boolean isEligibleFood(ItemStack stack) { + if (!AntarchySettings.americanizingEnabled()) { + return false; + } + if (stack.isEmpty() || isHighFructoseCornSyrup(stack)) { + return false; + } + if (stack.has(AntarchyObjects.AMERICAN_COMPONENT.get())) { + return false; + } + if (stack.is(AntarchyTags.Items.HFCS_CANNOT_AMERICANIZE)) { + return false; + } + return stack.get(DataComponents.FOOD) != null; + } + + public static boolean isHighFructoseCornSyrup(ItemStack stack) { + return !stack.isEmpty() && stack.is(BuiltInRegistries.ITEM.get(HIGH_FRUCTOSE_CORN_SYRUP_ID)); + } +} diff --git a/common/src/main/java/com/craisinlord/antarchy/content/AntarchyObjects.java b/common/src/main/java/com/craisinlord/antarchy/content/AntarchyObjects.java index 20caefd9..e660342a 100644 --- a/common/src/main/java/com/craisinlord/antarchy/content/AntarchyObjects.java +++ b/common/src/main/java/com/craisinlord/antarchy/content/AntarchyObjects.java @@ -34,12 +34,14 @@ import net.minecraft.core.particles.SimpleParticleType; import net.minecraft.world.effect.MobEffect; import net.minecraft.world.entity.ai.attributes.Attribute; import net.minecraft.world.entity.EntityType; +import net.minecraft.world.inventory.MenuType; import net.minecraft.world.item.Item; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockBehaviour; import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Fluid; public final class AntarchyObjects { private static final Supplier UNBOUND = () -> { @@ -99,9 +101,34 @@ public final class AntarchyObjects { @SuppressWarnings("unchecked") public static Supplier> HERCULES_BEETLE = (Supplier>) UNBOUND; @SuppressWarnings("unchecked") - public static Supplier> GLIMMER = (Supplier>) UNBOUND; + public static Supplier> OURANWOOD_DEER = (Supplier>) UNBOUND; @SuppressWarnings("unchecked") - public static Supplier> GLIMMERS_GRACE = (Supplier>) UNBOUND; + public static Supplier> GLIMMER = (Supplier>) UNBOUND; + @SuppressWarnings("unchecked") + public static Supplier SPIRIT_APPLE = (Supplier) UNBOUND; + @SuppressWarnings("unchecked") + public static Supplier> ELKA = (Supplier>) UNBOUND; + @SuppressWarnings("unchecked") + public static Supplier PEACH = (Supplier) UNBOUND; + @SuppressWarnings("unchecked") + public static Supplier CORN = (Supplier) UNBOUND; + @SuppressWarnings("unchecked") + public static Supplier CORN_SEEDS = (Supplier) UNBOUND; + @SuppressWarnings("unchecked") + public static Supplier WILD_CORN = (Supplier) UNBOUND; + @SuppressWarnings("unchecked") + public static Supplier RAW_VENISON = (Supplier) UNBOUND; + @SuppressWarnings("unchecked") + public static Supplier COOKED_VENISON = (Supplier) UNBOUND; + @SuppressWarnings("unchecked") + public static Supplier COOKED_CORNDOG = (Supplier) UNBOUND; + @SuppressWarnings("unchecked") + public static Supplier GLIMMER_BOTTLE = (Supplier) UNBOUND; + @SuppressWarnings("unchecked") + public static Supplier> GLIMMER_VARIANT_COMPONENT = + (Supplier>) UNBOUND; + @SuppressWarnings("unchecked") + public static Supplier> DORRIE_INVENTORY_MENU = (Supplier>) UNBOUND; @SuppressWarnings("unchecked") public static Supplier CHEEP_ITEM = (Supplier) UNBOUND; @SuppressWarnings("unchecked") @@ -205,6 +232,16 @@ public final class AntarchyObjects { @SuppressWarnings("unchecked") public static Supplier> STINKY_EFFECT = (Supplier>) UNBOUND; @SuppressWarnings("unchecked") + public static Supplier LUMEN = (Supplier) UNBOUND; + @SuppressWarnings("unchecked") + public static Supplier FLOWING_LUMEN = (Supplier) UNBOUND; + @SuppressWarnings("unchecked") + public static Supplier LUMEN_BUCKET = (Supplier) UNBOUND; + @SuppressWarnings("unchecked") + public static Supplier LUMEN_BLOCK = (Supplier) UNBOUND; + @SuppressWarnings("unchecked") + public static Supplier LUMEN_FROGLIGHT = (Supplier) UNBOUND; + @SuppressWarnings("unchecked") public static Supplier OURANWOOD_ACORN_BLOCK = (Supplier) UNBOUND; @SuppressWarnings("unchecked") public static Supplier MOSSY_OURANWOOD_LOG = (Supplier) UNBOUND; @@ -223,6 +260,14 @@ public final class AntarchyObjects { @SuppressWarnings("unchecked") public static Supplier WASP_NEST = (Supplier) UNBOUND; @SuppressWarnings("unchecked") + public static Supplier UMBRAL_MOSS_BLOCK = (Supplier) UNBOUND; + @SuppressWarnings("unchecked") + public static Supplier UMBRAL_MOSS_CARPET = (Supplier) UNBOUND; + @SuppressWarnings("unchecked") + public static Supplier BLUSH_MOSS_BLOCK = (Supplier) UNBOUND; + @SuppressWarnings("unchecked") + public static Supplier BLUSH_MOSS_CARPET = (Supplier) UNBOUND; + @SuppressWarnings("unchecked") public static Supplier HUSHWEED = (Supplier) UNBOUND; @SuppressWarnings("unchecked") public static Supplier SQUIRREL_NEST_BLOCK = (Supplier) UNBOUND; @@ -240,6 +285,11 @@ public final class AntarchyObjects { public static Supplier STINKY_GAS = (Supplier) UNBOUND; @SuppressWarnings("unchecked") public static Supplier STINKY_FLY = (Supplier) UNBOUND; + @SuppressWarnings("unchecked") + public static Supplier PEACH_LEAVES_PARTICLE = (Supplier) UNBOUND; + @SuppressWarnings("unchecked") + public static Supplier> AMERICAN_COMPONENT = + (Supplier>) UNBOUND; private AntarchyObjects() { } @@ -319,6 +369,10 @@ public final class AntarchyObjects { Supplier ouranwoodAcornBlock, Supplier mossyOuranwoodLog, Supplier mossyOuranwoodWood, + Supplier umbralMossBlock, + Supplier umbralMossCarpet, + Supplier blushMossBlock, + Supplier blushMossCarpet, Supplier orangeMilkweed, Supplier pinkMilkweed, Supplier bedBugEggs, @@ -334,6 +388,7 @@ public final class AntarchyObjects { Supplier> hushweedBlockEntity, Supplier stinkyGas, Supplier stinkyFly, + Supplier peachLeaves, Supplier> doubleDamageChance, Supplier> bloodglassMaxHearts, Supplier> bloodglassWard @@ -412,6 +467,10 @@ public final class AntarchyObjects { OURANWOOD_ACORN_BLOCK = ouranwoodAcornBlock; MOSSY_OURANWOOD_LOG = mossyOuranwoodLog; MOSSY_OURANWOOD_WOOD = mossyOuranwoodWood; + UMBRAL_MOSS_BLOCK = umbralMossBlock; + UMBRAL_MOSS_CARPET = umbralMossCarpet; + BLUSH_MOSS_BLOCK = blushMossBlock; + BLUSH_MOSS_CARPET = blushMossCarpet; ORANGE_MILKWEED = orangeMilkweed; PINK_MILKWEED = pinkMilkweed; BED_BUG_EGG = bedBugEggs; @@ -427,6 +486,7 @@ public final class AntarchyObjects { HUSHWEED_BLOCK_ENTITY = hushweedBlockEntity; STINKY_GAS = stinkyGas; STINKY_FLY = stinkyFly; + PEACH_LEAVES_PARTICLE = peachLeaves; DOUBLE_DAMAGE_CHANCE = doubleDamageChance; BLOODGLASS_MAX_HEARTS = bloodglassMaxHearts; BLOODGLASS_WARD = bloodglassWard; @@ -444,12 +504,88 @@ public final class AntarchyObjects { HERCULES_BEETLE = supplier; } - public static void setGlimmer(Supplier> supplier) { + public static void setOuranwoodDeer(Supplier> supplier) { + OURANWOOD_DEER = supplier; + } + + public static void setGlimmer(Supplier> supplier) { GLIMMER = supplier; } - public static void setGlimmersGrace(Supplier> supplier) { - GLIMMERS_GRACE = supplier; + public static void setLumen(Supplier supplier) { + LUMEN = supplier; + } + + public static void setFlowingLumen(Supplier supplier) { + FLOWING_LUMEN = supplier; + } + + public static void setLumenBucket(Supplier supplier) { + LUMEN_BUCKET = supplier; + } + + public static void setLumenBlock(Supplier supplier) { + LUMEN_BLOCK = supplier; + } + + public static void setLumenFroglight(Supplier supplier) { + LUMEN_FROGLIGHT = supplier; + } + + public static void setSpiritApple(Supplier supplier) { + SPIRIT_APPLE = supplier; + } + + public static void setElka(Supplier> supplier) { + ELKA = supplier; + } + + public static void setPeach(Supplier supplier) { + PEACH = supplier; + } + + public static void setCorn(Supplier supplier) { + CORN = supplier; + } + + public static void setCornSeeds(Supplier supplier) { + CORN_SEEDS = supplier; + } + + public static void setWildCorn(Supplier supplier) { + WILD_CORN = supplier; + } + + public static void setRawVenison(Supplier supplier) { + RAW_VENISON = supplier; + } + + public static void setCookedVenison(Supplier supplier) { + COOKED_VENISON = supplier; + } + + public static void setCookedCorndog(Supplier supplier) { + COOKED_CORNDOG = supplier; + } + + public static void setGlimmerBottle(Supplier supplier) { + GLIMMER_BOTTLE = supplier; + } + + public static void setPeachLeavesParticle(Supplier supplier) { + PEACH_LEAVES_PARTICLE = supplier; + } + + public static void setGlimmerVariantComponent(Supplier> supplier) { + GLIMMER_VARIANT_COMPONENT = supplier; + } + + public static void setDorrieInventoryMenu(Supplier> supplier) { + DORRIE_INVENTORY_MENU = supplier; + } + + public static void setAmericanComponent(Supplier> supplier) { + AMERICAN_COMPONENT = supplier; } public static BlockBehaviour.Properties shellstoneProperties() { diff --git a/common/src/main/java/com/craisinlord/antarchy/content/AntarchyTags.java b/common/src/main/java/com/craisinlord/antarchy/content/AntarchyTags.java index ae5cd781..ac89e719 100644 --- a/common/src/main/java/com/craisinlord/antarchy/content/AntarchyTags.java +++ b/common/src/main/java/com/craisinlord/antarchy/content/AntarchyTags.java @@ -10,6 +10,7 @@ import net.minecraft.world.entity.EntityType; import net.minecraft.world.item.Item; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.material.Fluid; public final class AntarchyTags { private AntarchyTags() { @@ -30,10 +31,12 @@ public final class AntarchyTags { public static final TagKey MOLEVORE_SEE_THROUGH_BLOCKS = TagKey.create(Registries.BLOCK, id("molevore_see_through_blocks")); public static final TagKey TERMITE_FOODS = TagKey.create(Registries.BLOCK, id("termite_foods")); public static final TagKey UMBRAL_MOSS_REPLACEABLE = TagKey.create(Registries.BLOCK, id("umbral_moss_replaceable")); + public static final TagKey BLUSH_MOSS_REPLACEABLE = TagKey.create(Registries.BLOCK, id("blush_moss_replaceable")); public static final TagKey HERCULES_BEETLE_CHARGE_IMMUNE_BLOCKS = TagKey.create(Registries.BLOCK, id("hercules_beetle_charge_immune_blocks")); public static final TagKey ELYTHIA_PORTAL_FRAMES = TagKey.create(Registries.BLOCK, id("elythia_portal_frames")); public static final TagKey THORAXIS_PORTAL_FRAMES = TagKey.create(Registries.BLOCK, id("thoraxis_portal_frames")); public static final TagKey CAVARYN_PORTAL_FRAMES = TagKey.create(Registries.BLOCK, id("cavaryn_portal_frames")); + public static final TagKey MINERS_DREAM_CARVABLE = TagKey.create(Registries.BLOCK, id("miners_dream_carvable")); private Blocks() { } @@ -94,16 +97,30 @@ public final class AntarchyTags { public static final TagKey REVERIE_DUPLICATION_ITEMS = TagKey.create(Registries.ITEM, id("reverie_duplication_items")); public static final TagKey HERCULES_BEETLE_FOOD = TagKey.create(Registries.ITEM, id("hercules_beetle_food")); public static final TagKey ROLLY_POLLY_FOOD = TagKey.create(Registries.ITEM, id("rolly_polly_food")); - public static final TagKey GLIMMER_FOOD = TagKey.create(Registries.ITEM, id("glimmer_food")); + public static final TagKey OURANWOOD_DEER_FOOD = TagKey.create(Registries.ITEM, id("ouranwood_deer_food")); + public static final TagKey GLIMMER_AUGMENT_APPLE_COW = TagKey.create(Registries.ITEM, id("glimmer_augment_apple_cow")); + public static final TagKey GLIMMER_AUGMENT_OURANWOOD_DEER = TagKey.create(Registries.ITEM, id("glimmer_augment_ouranwood_deer")); + public static final TagKey GLIMMER_AUGMENT_FROG = TagKey.create(Registries.ITEM, id("glimmer_augment_frog")); + public static final TagKey GLIMMER_AUGMENT_ANT = TagKey.create(Registries.ITEM, id("glimmer_augment_ant")); + public static final TagKey GLIMMER_AUGMENT_ELKA = TagKey.create(Registries.ITEM, id("glimmer_augment_elka")); + public static final TagKey HFCS_CANNOT_AMERICANIZE = TagKey.create(Registries.ITEM, id("hfcs_cannot_americanize")); private Items() { } } + public static final class Fluids { + public static final TagKey LUMEN = TagKey.create(Registries.FLUID, id("lumen")); + + private Fluids() { + } + } + public static final class Biomes { public static final TagKey MANTIS_SPAWN_BIOMES = TagKey.create(Registries.BIOME, id("mantis_spawn_biomes")); public static final TagKey MANTIS_OVERWORLD_SPAWN_BIOMES = TagKey.create(Registries.BIOME, id("mantis_overworld_spawn_biomes")); public static final TagKey ELYTHIA_FIREFLY_PARTICLE_BIOMES = TagKey.create(Registries.BIOME, id("elythia_firefly_particle_biomes")); + public static final TagKey WILD_CORN_SPAWN_BIOMES = TagKey.create(Registries.BIOME, id("wild_corn_spawn_biomes")); private Biomes() { } diff --git a/common/src/main/java/com/craisinlord/antarchy/content/CreativeTabOrder.java b/common/src/main/java/com/craisinlord/antarchy/content/CreativeTabOrder.java new file mode 100644 index 00000000..b5e6464c --- /dev/null +++ b/common/src/main/java/com/craisinlord/antarchy/content/CreativeTabOrder.java @@ -0,0 +1,315 @@ +package com.craisinlord.antarchy.content; + +import java.util.Comparator; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.world.item.Item; + +public final class CreativeTabOrder { + private CreativeTabOrder() {} + + public static final Comparator COMPARATOR = + Comparator.comparingInt(CreativeTabOrder::group) + .thenComparingInt(CreativeTabOrder::subOrder); + + public static int group(Item item) { + String path = BuiltInRegistries.ITEM.getKey(item).getPath(); + return switch (path) { + case "glimmer_bottle" -> -1; + case "ouranwood_log", "ouranwood_wood", "mossy_ouranwood_log", "mossy_ouranwood_wood", + "stripped_ouranwood_log", "stripped_ouranwood_wood", "duplicator_log", + "ouranwood_planks", "ouranwood_stairs", "ouranwood_slab", + "ouranwood_fence", "ouranwood_fence_gate", + "ouranwood_door", "ouranwood_trapdoor", + "ouranwood_pressure_plate", "ouranwood_button", + "ouranwood_sign", "ouranwood_hanging_sign", + "ouranwood_boat", "ouranwood_chest_boat", + "peach_log", "peach_wood", "stripped_peach_log", "stripped_peach_wood", + "peach_planks", "peach_stairs", "peach_slab", "peach_fence", "peach_fence_gate", + "peach_door", "peach_trapdoor", "peach_pressure_plate", "peach_button", + "peach_sign", "peach_hanging_sign", "peach_boat", "peach_chest_boat" -> 0; + case "nyxite", "polished_nyxite", "chiseled_nyxite", "nyxite_bricks", + "nyxite_stairs", "nyxite_slab", "nyxite_wall", + "polished_nyxite_stairs", "polished_nyxite_slab", "polished_nyxite_wall", + "nyxite_brick_stairs", "nyxite_brick_slab", "nyxite_brick_wall", + "pale_nyxite", "nyxite_spike", "potent_nyxite" -> 1; + case "shellstone", "polished_shellstone", "shellstone_bricks", "chiseled_shellstone", + "mossy_shellstone_bricks", "cracked_shellstone_bricks", + "shellstone_stairs", "shellstone_slab", "shellstone_wall", + "polished_shellstone_stairs", "polished_shellstone_slab", "polished_shellstone_wall", + "shellstone_brick_stairs", "shellstone_brick_slab", "shellstone_brick_wall", + "mossy_shellstone_brick_stairs", "mossy_shellstone_brick_slab", "mossy_shellstone_brick_wall" -> 2; + case "antimetal", "polished_antimetal" -> 3; + case "dream_sand", "dream_sandstone", "chiseled_dream_sandstone", + "cut_dream_sandstone", "smooth_dream_sandstone", + "dream_sandstone_stairs", "dream_sandstone_slab", "dream_sandstone_wall", + "smooth_dream_sandstone_stairs", "smooth_dream_sandstone_slab", + "cut_dream_sandstone_slab" -> 4; + case "umbral_moss_block", "umbral_moss_carpet", + "blush_moss_block", "blush_moss_carpet" -> 4; + case "uranium_ore", "deepslate_uranium_ore", "titanium_ore", "deepslate_titanium_ore", + "uranium_block", "titanium_block", + "cut_uranium", "cut_titanium", "cut_uranium_slab", "cut_titanium_slab", + "cut_uranium_stairs", "cut_titanium_stairs", + "chiseled_uranium", "chiseled_titanium", + "uranium_door", "titanium_door", "uranium_trapdoor", "titanium_trapdoor", + "uranium_bars", "titanium_bars", "uranium_bulb", "titanium_bulb" -> 6; + case "raw_uranium", "raw_titanium", "raw_uranium_scrap", "raw_titanium_scrap", + "raw_uranium_block", "raw_titanium_block" -> 7; + case "blood_crystal_block", "small_blood_crystal_bud", "medium_blood_crystal_bud", + "large_blood_crystal_bud", "budding_blood_crystal", "blood_crystal_cluster", + "myrmite", "broodstone", "chiten_block", "chiten_spike", "amber_moss_block", "amber_moss_carpet" -> 8; + case "ouranwood_leaves", "peach_leaves" -> 9; + case "duplicator_sapling", "ouranwood_acorn", "peach_sapling", "corn_seeds" -> 10; + case "orange_milkweed", "pink_milkweed", "hushweed", "amber_lichen", "creepvine", + "triffid_goo_block", "cloud_block", "wasp_nest", + "red_ant_nest", "brown_ant_nest", "rainbow_ant_nest", "termite_nest" -> 11; + case "dream_torch", "dream_lantern", "dream_campfire", "dream_fire", "dream_fire_ceiling", + "lumen_froglight", "roseate_froglight" -> 12; + case "antimetal_scaffolding" -> 13; + case "infested_rooted_dirt", "infested_coarse_dirt", "bed_bug_egg", + "creeping_horror_egg", "lurking_terror_egg" -> 14; + case "ultimate_pickaxe", "ultimate_axe", "ultimate_shovel", "ultimate_hoe", + "duct_tape", "diamond_minecart", "gravity_sculk_sensor", "miners_dream" -> 15; + case "bile_bucket", "ichor_bucket", "antiwater_bucket", "cloud_bucket", "lumen_bucket" -> 16; + case "moggles", "brutalfly_elytra", "fallen_king_crown", "jumpy_boots" -> 17; + case "battle_axe", "basilisk_dagger", "squidzooka", "shrink_ray", "growth_ray", + "gravity_gun", "water_cannon", "nightmare_sword", "lucid_pearl", "scorpion_whip", "blood_crystal_katana", + "big_bertha", "big_bertha_blade", "big_bertha_handle", "big_bertha_hilt", + "ultimate_sword", "ultimate_mace" -> 18; + case "primordial_helmet", "primordial_chestplate", + "primordial_leggings", "primordial_boots", + "blood_crystal_helmet", "blood_crystal_chestplate", + "blood_crystal_leggings", "blood_crystal_boots", + "nightmare_helmet", "nightmare_chestplate", + "nightmare_leggings", "nightmare_boots", + "ultimate_helmet", "ultimate_chestplate", + "ultimate_leggings", "ultimate_boots" -> 19; + case "ultimate_bow", "ultimate_crossbow" -> 20; + case "cloud_shark_fin_soup", "mud_pie", "rainbow_sugar", + "blood_crystal_apple", "spirit_apple", "peach", "raw_corndog", "cooked_corndog", + "raw_venison", "cooked_venison" -> 21; + case "blood_crystal_shard", "cloud_shark_fin", "basilisk_fang", "kraken_tooth", + "emperor_scorpion_stinger", "nightmare_scale", "molevore_nose", + "moleworm", "uranium_nugget", "titanium_nugget", + "uranium_ingot", "titanium_ingot", "lucid_eye", + "mantis_claw", "jumpy_bug_leg", "brutalfly_wing", "cornea_ear", + "primordial_scute", "triffid_goo", "vortex_eye", + "king_scale", "queen_scale", "chiten", "stink_bug", "corn", "high_fructose_corn_syrup" -> 22; + case "reverie_bottle", "root_beer" -> 24; + case "easter_bunny_spawn_egg", "flying_squirrel_spawn_egg", "caterpillar_spawn_egg", + "butterfly_spawn_egg", "reverie_spawn_egg", "brutalfly_spawn_egg", + "red_ant_spawn_egg", "brown_ant_spawn_egg", "rainbow_ant_spawn_egg", "termite_spawn_egg", + "moleworm_spawn_egg", "mantis_spawn_egg", "alpha_mantis_spawn_egg", "rolly_polly_spawn_egg", + "molevore_spawn_egg", "triffid_spawn_egg", "apple_cow_spawn_egg", "golden_apple_cow_spawn_egg", + "enchanted_golden_apple_cow_spawn_egg", "dr_trayaurus_spawn_egg", "wasp_spawn_egg", + "bomber_spawn_egg", "jumpy_bug_spawn_egg", "stink_bug_spawn_egg", "cloud_shark_spawn_egg", + "kraken_spawn_egg", "missile_squid_spawn_egg", "octopus_bomb_spawn_egg", + "nightmare_spawn_egg", "bed_bug_spawn_egg", "lucid_spawn_egg", "scorpion_spawn_egg", + "basilisk_spawn_egg", "emperor_scorpion_spawn_egg", "toreterror_spawn_egg", + "dorrie_spawn_egg", "glimmer_spawn_egg", "ouranwood_deer_spawn_egg", "elka_spawn_egg", + "hercules_beetle_spawn_egg", "creeping_horror_spawn_egg", "lurking_terror_spawn_egg" -> 25; + default -> 99; + }; + } + + public static int subOrder(Item item) { + String path = BuiltInRegistries.ITEM.getKey(item).getPath(); + return switch (path) { + case "ouranwood_log" -> 0; + case "ouranwood_wood" -> 1; + case "mossy_ouranwood_log" -> 2; + case "mossy_ouranwood_wood" -> 3; + case "stripped_ouranwood_log" -> 4; + case "stripped_ouranwood_wood" -> 5; + case "duplicator_log" -> 6; + case "ouranwood_planks" -> 7; + case "ouranwood_stairs" -> 8; + case "ouranwood_slab" -> 9; + case "ouranwood_fence" -> 10; + case "ouranwood_fence_gate" -> 11; + case "ouranwood_door" -> 12; + case "ouranwood_trapdoor" -> 13; + case "ouranwood_pressure_plate" -> 14; + case "ouranwood_button" -> 15; + case "ouranwood_sign" -> 16; + case "ouranwood_hanging_sign" -> 17; + case "ouranwood_boat" -> 18; + case "ouranwood_chest_boat" -> 19; + case "peach_log" -> 20; + case "peach_wood" -> 21; + case "stripped_peach_log" -> 22; + case "stripped_peach_wood" -> 23; + case "peach_planks" -> 24; + case "peach_stairs" -> 25; + case "peach_slab" -> 26; + case "peach_fence" -> 27; + case "peach_fence_gate" -> 28; + case "peach_door" -> 29; + case "peach_trapdoor" -> 30; + case "peach_pressure_plate" -> 31; + case "peach_button" -> 32; + case "peach_sign" -> 33; + case "peach_hanging_sign" -> 34; + case "peach_boat" -> 35; + case "peach_chest_boat" -> 36; + case "ouranwood_leaves" -> 0; + case "peach_leaves" -> 1; + case "duplicator_sapling" -> 0; + case "ouranwood_acorn" -> 1; + case "peach_sapling" -> 2; + case "corn_seeds" -> 3; + case "orange_milkweed" -> 0; + case "pink_milkweed" -> 1; + case "hushweed" -> 2; + case "amber_lichen" -> 3; + case "creepvine" -> 4; + case "triffid_goo_block" -> 5; + case "cloud_block" -> 6; + case "wasp_nest" -> 7; + case "red_ant_nest" -> 8; + case "brown_ant_nest" -> 9; + case "rainbow_ant_nest" -> 10; + case "termite_nest" -> 11; + case "blood_crystal_block" -> 0; + case "small_blood_crystal_bud" -> 1; + case "medium_blood_crystal_bud" -> 2; + case "large_blood_crystal_bud" -> 3; + case "budding_blood_crystal" -> 4; + case "blood_crystal_cluster" -> 5; + case "myrmite" -> 6; + case "broodstone" -> 7; + case "chiten_block" -> 8; + case "chiten_spike" -> 9; + case "amber_moss_block" -> 10; + case "amber_moss_carpet" -> 11; + case "uranium_ore" -> 0; + case "deepslate_uranium_ore" -> 1; + case "titanium_ore" -> 2; + case "deepslate_titanium_ore" -> 3; + case "uranium_block" -> 4; + case "titanium_block" -> 5; + case "cut_uranium" -> 6; + case "cut_titanium" -> 7; + case "cut_uranium_slab" -> 8; + case "cut_titanium_slab" -> 9; + case "cut_uranium_stairs" -> 10; + case "cut_titanium_stairs" -> 11; + case "chiseled_uranium" -> 12; + case "chiseled_titanium" -> 13; + case "uranium_door" -> 14; + case "titanium_door" -> 15; + case "uranium_trapdoor" -> 16; + case "titanium_trapdoor" -> 17; + case "uranium_bars" -> 18; + case "titanium_bars" -> 19; + case "uranium_bulb" -> 20; + case "titanium_bulb" -> 21; + case "raw_uranium" -> 0; + case "raw_titanium" -> 1; + case "raw_uranium_scrap" -> 2; + case "raw_titanium_scrap" -> 3; + case "raw_uranium_block" -> 4; + case "raw_titanium_block" -> 5; + case "dream_torch" -> 0; + case "dream_lantern" -> 1; + case "dream_campfire" -> 2; + case "dream_fire" -> 3; + case "dream_fire_ceiling" -> 4; + case "lumen_froglight" -> 5; + case "roseate_froglight" -> 6; + case "infested_rooted_dirt" -> 0; + case "infested_coarse_dirt" -> 1; + case "bed_bug_egg" -> 2; + case "creeping_horror_egg" -> 3; + case "lurking_terror_egg" -> 4; + case "ultimate_pickaxe" -> 0; + case "ultimate_axe" -> 1; + case "ultimate_shovel" -> 2; + case "ultimate_hoe" -> 3; + case "duct_tape" -> 4; + case "diamond_minecart" -> 5; + case "gravity_sculk_sensor" -> 6; + case "miners_dream" -> 7; + case "bile_bucket" -> 0; + case "ichor_bucket" -> 1; + case "antiwater_bucket" -> 2; + case "cloud_bucket" -> 3; + case "lumen_bucket" -> 4; + case "moggles" -> 0; + case "brutalfly_elytra" -> 1; + case "fallen_king_crown" -> 2; + case "jumpy_boots" -> 3; + case "battle_axe" -> 0; + case "basilisk_dagger" -> 1; + case "squidzooka" -> 2; + case "shrink_ray" -> 3; + case "growth_ray" -> 4; + case "gravity_gun" -> 5; + case "water_cannon" -> 6; + case "nightmare_sword" -> 7; + case "lucid_pearl" -> 8; + case "scorpion_whip" -> 9; + case "blood_crystal_katana" -> 10; + case "big_bertha" -> 11; + case "big_bertha_blade" -> 12; + case "big_bertha_handle" -> 13; + case "big_bertha_hilt" -> 14; + case "ultimate_sword" -> 15; + case "ultimate_mace" -> 16; + case "primordial_helmet" -> 0; + case "primordial_chestplate" -> 1; + case "primordial_leggings" -> 2; + case "primordial_boots" -> 3; + case "blood_crystal_helmet" -> 4; + case "blood_crystal_chestplate" -> 5; + case "blood_crystal_leggings" -> 6; + case "blood_crystal_boots" -> 7; + case "nightmare_helmet" -> 8; + case "nightmare_chestplate" -> 9; + case "nightmare_leggings" -> 10; + case "nightmare_boots" -> 11; + case "ultimate_helmet" -> 12; + case "ultimate_chestplate" -> 13; + case "ultimate_leggings" -> 14; + case "ultimate_boots" -> 15; + case "ultimate_bow" -> 0; + case "ultimate_crossbow" -> 1; + case "blood_crystal_apple" -> 0; + case "spirit_apple" -> 1; + case "peach" -> 2; + case "raw_corndog" -> 3; + case "cooked_corndog" -> 4; + case "raw_venison" -> 5; + case "cooked_venison" -> 6; + case "reverie_bottle" -> 0; + case "root_beer" -> 1; + case "blood_crystal_shard" -> 0; + case "cloud_shark_fin" -> 1; + case "basilisk_fang" -> 2; + case "kraken_tooth" -> 3; + case "emperor_scorpion_stinger" -> 4; + case "nightmare_scale" -> 5; + case "molevore_nose" -> 6; + case "moleworm" -> 7; + case "uranium_nugget" -> 8; + case "titanium_nugget" -> 9; + case "uranium_ingot" -> 10; + case "titanium_ingot" -> 11; + case "lucid_eye" -> 12; + case "mantis_claw" -> 13; + case "jumpy_bug_leg" -> 14; + case "brutalfly_wing" -> 15; + case "cornea_ear" -> 16; + case "primordial_scute" -> 17; + case "triffid_goo" -> 18; + case "vortex_eye" -> 19; + case "king_scale" -> 20; + case "queen_scale" -> 21; + case "chiten" -> 22; + case "stink_bug" -> 23; + case "corn" -> 24; + case "high_fructose_corn_syrup" -> 25; + default -> 0; + }; + } +} diff --git a/common/src/main/java/com/craisinlord/antarchy/content/CustomBrewingRecipes.java b/common/src/main/java/com/craisinlord/antarchy/content/CustomBrewingRecipes.java new file mode 100644 index 00000000..8f4ea530 --- /dev/null +++ b/common/src/main/java/com/craisinlord/antarchy/content/CustomBrewingRecipes.java @@ -0,0 +1,119 @@ +package com.craisinlord.antarchy.content; + +import com.craisinlord.antarchy.content.entity.glimmer.GlimmerVariant; +import com.craisinlord.antarchy.content.item.GlimmerBottleItem; +import net.minecraft.core.Holder; +import net.minecraft.core.component.DataComponents; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.TagKey; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.alchemy.PotionContents; +import net.minecraft.world.item.alchemy.Potions; + +public final class CustomBrewingRecipes { + private static final ResourceLocation CORN_ID = ResourceLocation.fromNamespaceAndPath("antarchy", "corn"); + private static final ResourceLocation HIGH_FRUCTOSE_CORN_SYRUP_ID = ResourceLocation.fromNamespaceAndPath("antarchy", "high_fructose_corn_syrup"); + private static final ResourceLocation ROOT_BEER_ID = ResourceLocation.fromNamespaceAndPath("antarchy", "root_beer"); + private static final TagKey ROOTS = TagKey.create(net.minecraft.core.registries.Registries.ITEM, ResourceLocation.fromNamespaceAndPath("antarchy", "roots")); + + private CustomBrewingRecipes() { + } + + public static boolean hasMix(ItemStack input, ItemStack ingredient) { + return !getOutput(input, ingredient).isEmpty(); + } + + public static ItemStack getOutput(ItemStack input, ItemStack ingredient) { + if (input.isEmpty() || ingredient.isEmpty()) { + return ItemStack.EMPTY; + } + + if (matchesCornToSyrup(input, ingredient) || matchesCornToSyrup(ingredient, input)) { + return new ItemStack(highFructoseCornSyrupItem()); + } + + if (matchesSyrupToRootBeer(input, ingredient) || matchesSyrupToRootBeer(ingredient, input)) { + return new ItemStack(rootBeerItem()); + } + + ItemStack glimmerAugment = getGlimmerAugmentOutput(input, ingredient); + if (!glimmerAugment.isEmpty()) { + return glimmerAugment; + } + + return ItemStack.EMPTY; + } + + private static ItemStack getGlimmerAugmentOutput(ItemStack input, ItemStack ingredient) { + if (!input.is(AntarchyObjects.GLIMMER_BOTTLE.get())) { + return ItemStack.EMPTY; + } + + GlimmerVariant target = glimmerAugmentTarget(ingredient); + if (target == null || target == GlimmerBottleItem.getVariant(input)) { + return ItemStack.EMPTY; + } + + return GlimmerBottleItem.create(target); + } + + private static GlimmerVariant glimmerAugmentTarget(ItemStack ingredient) { + if (ingredient.is(AntarchyTags.Items.GLIMMER_AUGMENT_APPLE_COW)) { + return GlimmerVariant.APPLE_COW; + } + if (ingredient.is(AntarchyTags.Items.GLIMMER_AUGMENT_OURANWOOD_DEER)) { + return GlimmerVariant.OURANWOOD_DEER; + } + if (ingredient.is(AntarchyTags.Items.GLIMMER_AUGMENT_FROG)) { + return GlimmerVariant.FROG; + } + if (ingredient.is(AntarchyTags.Items.GLIMMER_AUGMENT_ANT)) { + return GlimmerVariant.ANT; + } + if (ingredient.is(AntarchyTags.Items.GLIMMER_AUGMENT_ELKA)) { + return GlimmerVariant.ELKA; + } + return null; + } + + private static boolean matchesCornToSyrup(ItemStack base, ItemStack ingredient) { + return isWaterBottle(base) && ingredient.is(cornItem()); + } + + private static boolean matchesSyrupToRootBeer(ItemStack base, ItemStack ingredient) { + return base.is(highFructoseCornSyrupItem()) && ingredient.is(ROOTS); + } + + private static boolean isWaterBottle(ItemStack stack) { + if (!stack.is(Items.POTION)) { + return false; + } + PotionContents contents = stack.getOrDefault(DataComponents.POTION_CONTENTS, PotionContents.EMPTY); + return contents.is(Potions.WATER); + } + + public static Item cornItem() { + return BuiltInRegistries.ITEM.get(CORN_ID); + } + + public static Item highFructoseCornSyrupItem() { + return BuiltInRegistries.ITEM.get(HIGH_FRUCTOSE_CORN_SYRUP_ID); + } + + public static Item rootBeerItem() { + return BuiltInRegistries.ITEM.get(ROOT_BEER_ID); + } + + public static TagKey rootsTag() { + return ROOTS; + } + + public static ItemStack waterBottleStack() { + ItemStack stack = new ItemStack(Items.POTION); + stack.set(DataComponents.POTION_CONTENTS, new PotionContents(Potions.WATER)); + return stack; + } +} diff --git a/common/src/main/java/com/craisinlord/antarchy/content/block/BigBushBlock.java b/common/src/main/java/com/craisinlord/antarchy/content/block/BigBushBlock.java deleted file mode 100644 index 8d4264e8..00000000 --- a/common/src/main/java/com/craisinlord/antarchy/content/block/BigBushBlock.java +++ /dev/null @@ -1,291 +0,0 @@ -package com.craisinlord.antarchy.content.block; - -import com.craisinlord.antarchy.Antarchy; -import com.mojang.serialization.MapCodec; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.util.RandomSource; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.ItemInteractionResult; -import net.minecraft.world.entity.player.Player; -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; -import net.minecraft.world.level.LevelReader; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.BonemealableBlock; -import net.minecraft.world.level.block.BushBlock; -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 net.minecraft.world.level.block.state.properties.DirectionProperty; -import net.minecraft.world.level.block.state.properties.IntegerProperty; -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 java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -/** - * Multiblock bush grown with bonemeal. The origin block carries the - * loot/age; the rest of the footprint is filled with invisible - * {@link BigBushPartBlock}s. - * - * age 0: single block (1x1x1) - * age 1: 2x2x2 footprint; FACING + FACING.getClockWise() pick the horizontal quadrant - * age 2: 3x3x3 footprint centered on the origin column - * - * Grown stages require a sturdy support block under every column of their - * footprint. Growing from 2x2 to 3x3 may relocate the origin to any of the four - * occupied columns to find room. - */ -public class BigBushBlock extends BushBlock implements BonemealableBlock { - public static final MapCodec CODEC = Block.simpleCodec(BigBushBlock::new); - - public static final IntegerProperty AGE = BlockStateProperties.AGE_2; - public static final DirectionProperty FACING = BlockStateProperties.HORIZONTAL_FACING; - - private static final VoxelShape SMALL_SHAPE = Block.box(2.0, 0.0, 2.0, 14.0, 13.0, 14.0); - - public BigBushBlock(BlockBehaviour.Properties properties) { - super(properties); - this.registerDefaultState(this.stateDefinition.any() - .setValue(AGE, 0) - .setValue(FACING, Direction.EAST)); - } - - @Override - public MapCodec codec() { - return CODEC; - } - - @Override - protected void createBlockStateDefinition(StateDefinition.Builder builder) { - builder.add(AGE, FACING); - } - - @Override - protected VoxelShape getShape(BlockState state, BlockGetter level, BlockPos pos, CollisionContext context) { - return state.getValue(AGE) == 0 ? SMALL_SHAPE : Shapes.block(); - } - - /** All part positions belonging to a bush with the given origin state/pos */ - public static List partPositions(BlockState state, BlockPos origin) { - List positions = new ArrayList<>(); - int age = state.getValue(AGE); - if (age == 1) { - Direction forward = state.getValue(FACING); - Direction side = forward.getClockWise(); - for (int dy = 0; dy <= 1; dy++) { - for (BlockPos column : new BlockPos[]{ - origin, origin.relative(forward), origin.relative(side), origin.relative(forward).relative(side)}) { - BlockPos pos = column.above(dy); - if (!pos.equals(origin)) { - positions.add(pos); - } - } - } - } else if (age == 2) { - for (int dx = -1; dx <= 1; dx++) { - for (int dy = 0; dy <= 2; dy++) { - for (int dz = -1; dz <= 1; dz++) { - if (dx == 0 && dy == 0 && dz == 0) { - continue; - } - positions.add(origin.offset(dx, dy, dz)); - } - } - } - } - return positions; - } - - /** Ground columns of the footprint, each needs a sturdy block below it. */ - public static List supportColumns(BlockState state, BlockPos origin) { - List columns = new ArrayList<>(); - int age = state.getValue(AGE); - if (age == 1) { - Direction forward = state.getValue(FACING); - Direction side = forward.getClockWise(); - columns.add(origin); - columns.add(origin.relative(forward)); - columns.add(origin.relative(side)); - columns.add(origin.relative(forward).relative(side)); - } else if (age == 2) { - for (int dx = -1; dx <= 1; dx++) { - for (int dz = -1; dz <= 1; dz++) { - columns.add(origin.offset(dx, 0, dz)); - } - } - } else { - columns.add(origin); - } - return columns; - } - - public static boolean hasFullSupport(BlockState state, LevelReader level, BlockPos origin) { - for (BlockPos column : supportColumns(state, origin)) { - BlockPos below = column.below(); - if (!level.getBlockState(below).isFaceSturdy(level, below, Direction.UP)) { - return false; - } - } - return true; - } - - @Override - protected boolean canSurvive(BlockState state, LevelReader level, BlockPos pos) { - if (state.getValue(AGE) == 0) { - return super.canSurvive(state, level, pos); - } - return hasFullSupport(state, level, pos); - } - - private static Block partBlock() { - return BuiltInRegistries.BLOCK.get(ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "big_bush_part")); - } - - private record GrowthTarget(BlockPos origin, BlockState state) {} - - @Nullable - private GrowthTarget findGrowthTarget(LevelReader level, BlockPos pos, BlockState state, RandomSource random) { - int age = state.getValue(AGE); - if (age == 0) { - List facings = new ArrayList<>(Direction.Plane.HORIZONTAL.stream().toList()); - for (int i = facings.size() - 1; i > 0; i--) { - Direction swap = facings.set(random.nextInt(i + 1), facings.get(i)); - facings.set(i, swap); - } - for (Direction facing : facings) { - BlockState grown = state.setValue(AGE, 1).setValue(FACING, facing); - if (canGrowTo(level, pos, grown, Set.of(pos))) { - return new GrowthTarget(pos, grown); - } - } - return null; - } - if (age == 1) { - Direction forward = state.getValue(FACING); - Direction side = forward.getClockWise(); - Set owned = new HashSet<>(partPositions(state, pos)); - owned.add(pos); - BlockState grown = state.setValue(AGE, 2); - // Any of the four occupied columns can become the new center of the 3x3. - for (BlockPos candidate : new BlockPos[]{ - pos, pos.relative(forward).relative(side), pos.relative(forward), pos.relative(side)}) { - if (canGrowTo(level, candidate, grown, owned)) { - return new GrowthTarget(candidate, grown); - } - } - } - return null; - } - - private boolean canGrowTo(LevelReader level, BlockPos newOrigin, BlockState grownState, Set owned) { - if (!hasFullSupport(grownState, level, newOrigin)) { - return false; - } - List positions = new ArrayList<>(partPositions(grownState, newOrigin)); - positions.add(newOrigin); - for (BlockPos pos : positions) { - if (owned.contains(pos)) { - continue; - } - if (!level.getBlockState(pos).canBeReplaced()) { - return false; - } - } - return true; - } - - public static void placeBushBlocks(LevelAccessor level, BlockPos origin, BlockState grownState, int flags) { - level.setBlock(origin, grownState, flags); - Block part = partBlock(); - BlockPos capPos = grownState.getValue(AGE) == 2 ? origin.above(2) : null; - for (BlockPos pos : partPositions(grownState, origin)) { - level.setBlock(pos, part.defaultBlockState() - .setValue(BigBushPartBlock.CAP, pos.equals(capPos)), flags); - } - } - - private void placeStage(ServerLevel level, BlockPos origin, BlockState grownState) { - placeBushBlocks(level, origin, grownState, 3); - } - - @Override - protected void onRemove(BlockState state, Level level, BlockPos pos, BlockState newState, boolean movedByPiston) { - if (!state.is(newState.getBlock())) { - for (BlockPos partPos : partPositions(state, pos)) { - if (level.getBlockState(partPos).getBlock() instanceof BigBushPartBlock) { - level.setBlock(partPos, Blocks.AIR.defaultBlockState(), 35); - } - } - } - super.onRemove(state, level, pos, newState, movedByPiston); - } - - @Override - public boolean isValidBonemealTarget(LevelReader level, BlockPos pos, BlockState state) { - return state.getValue(AGE) < 2; - } - - @Override - public boolean isBonemealSuccess(Level level, RandomSource random, BlockPos pos, BlockState state) { - return findGrowthTarget(level, pos, state, random) != null; - } - - @Override - public void performBonemeal(ServerLevel level, RandomSource random, BlockPos pos, BlockState state) { - GrowthTarget target = findGrowthTarget(level, pos, state, random); - if (target == null) { - return; - } - if (!target.origin().equals(pos)) { - level.removeBlock(pos, false); - } - placeStage(level, target.origin(), target.state()); - } - - /** Pops a bonus item when bone meal is used on a fully-grown (age 2) bush; shared with {@link BigBushPartBlock}. */ - public static boolean grantBonemealBonus(Level level, BlockPos originPos, BlockState originState, Player player, ItemStack stack) { - if (!(originState.getBlock() instanceof BigBushBlock bigBush) || originState.getValue(AGE) != 2) { - return false; - } - if (!level.isClientSide) { - bigBush.popResource(level, originPos, new ItemStack(bigBush, 1)); - if (!player.getAbilities().instabuild) { - stack.shrink(1); - } - level.levelEvent(1505, originPos, 15); - } - return true; - } - - @Override - protected ItemInteractionResult useItemOn( - ItemStack stack, - BlockState state, - Level level, - BlockPos pos, - Player player, - InteractionHand hand, - BlockHitResult hitResult - ) { - if (stack.is(Items.BONE_MEAL) && grantBonemealBonus(level, pos, state, player, stack)) { - return ItemInteractionResult.sidedSuccess(level.isClientSide); - } - return super.useItemOn(stack, state, level, pos, player, hand, hitResult); - } -} diff --git a/common/src/main/java/com/craisinlord/antarchy/content/block/BigBushPartBlock.java b/common/src/main/java/com/craisinlord/antarchy/content/block/BigBushPartBlock.java deleted file mode 100644 index 56a0731e..00000000 --- a/common/src/main/java/com/craisinlord/antarchy/content/block/BigBushPartBlock.java +++ /dev/null @@ -1,177 +0,0 @@ -package com.craisinlord.antarchy.content.block; - -import com.mojang.serialization.MapCodec; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.util.RandomSource; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.ItemInteractionResult; -import net.minecraft.world.entity.player.Player; -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; -import net.minecraft.world.level.LevelReader; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.BonemealableBlock; -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.BooleanProperty; -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; - -/** - * Invisible filler block for the grown {@link BigBushBlock} footprint. Breaking a - * part destroys the whole bush (drops come from the origin's loot table). The one - * part directly two above the origin of a stage-3 bush renders the top slice of - * the oversized cross model - */ -public class BigBushPartBlock extends Block implements BonemealableBlock { - public static final MapCodec CODEC = Block.simpleCodec(BigBushPartBlock::new); - - public static final BooleanProperty CAP = BooleanProperty.create("cap"); - - public BigBushPartBlock(BlockBehaviour.Properties properties) { - super(properties); - this.registerDefaultState(this.stateDefinition.any().setValue(CAP, false)); - } - - @Override - public MapCodec codec() { - return CODEC; - } - - @Override - protected void createBlockStateDefinition(StateDefinition.Builder builder) { - builder.add(CAP); - } - - @Override - protected VoxelShape getShape(BlockState state, BlockGetter level, BlockPos pos, CollisionContext context) { - return Shapes.block(); - } - - /** Finds the origin bush this part belongs to, or null if orphaned. */ - @Nullable - public static BlockPos findOrigin(LevelReader level, BlockPos partPos) { - for (int dx = -1; dx <= 1; dx++) { - for (int dy = -2; dy <= 0; dy++) { - for (int dz = -1; dz <= 1; dz++) { - if (dx == 0 && dy == 0 && dz == 0) { - continue; - } - BlockPos candidate = partPos.offset(dx, dy, dz); - BlockState state = level.getBlockState(candidate); - if (state.getBlock() instanceof BigBushBlock - && BigBushBlock.partPositions(state, candidate).contains(partPos)) { - return candidate; - } - } - } - } - return null; - } - - @Override - public BlockState playerWillDestroy(Level level, BlockPos pos, BlockState state, Player player) { - if (!level.isClientSide) { - BlockPos origin = findOrigin(level, pos); - if (origin != null) { - BlockState originState = level.getBlockState(origin); - if (!player.getAbilities().instabuild) { - Block.dropResources(originState, level, origin, null, player, player.getMainHandItem()); - } - level.destroyBlock(origin, false); - } - } - return super.playerWillDestroy(level, pos, state, player); - } - - @Override - protected void onRemove(BlockState state, Level level, BlockPos pos, BlockState newState, boolean movedByPiston) { - if (!state.is(newState.getBlock()) && !level.isClientSide) { - BlockPos origin = findOrigin(level, pos); - if (origin != null) { - level.destroyBlock(origin, true); - } - } - super.onRemove(state, level, pos, newState, movedByPiston); - } - - @Override - protected BlockState updateShape(BlockState state, Direction direction, BlockState neighborState, - LevelAccessor level, BlockPos pos, BlockPos neighborPos) { - level.scheduleTick(pos, this, 1); - return super.updateShape(state, direction, neighborState, level, pos, neighborPos); - } - - @Override - protected void tick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) { - BlockPos origin = findOrigin(level, pos); - if (origin == null) { - level.removeBlock(pos, false); - return; - } - BlockState originState = level.getBlockState(origin); - if (!originState.canSurvive(level, origin)) { - level.destroyBlock(origin, true); - } - } - - /** Bonemeal applied to any part of a growing bush grows the whole thing, same as clicking the origin. */ - @Override - public boolean isValidBonemealTarget(LevelReader level, BlockPos pos, BlockState state) { - BlockPos origin = findOrigin(level, pos); - return origin != null && level.getBlockState(origin).getBlock() instanceof BigBushBlock bigBush - && bigBush.isValidBonemealTarget(level, origin, level.getBlockState(origin)); - } - - @Override - public boolean isBonemealSuccess(Level level, RandomSource random, BlockPos pos, BlockState state) { - BlockPos origin = findOrigin(level, pos); - return origin != null && level.getBlockState(origin).getBlock() instanceof BigBushBlock bigBush - && bigBush.isBonemealSuccess(level, random, origin, level.getBlockState(origin)); - } - - @Override - public void performBonemeal(ServerLevel level, RandomSource random, BlockPos pos, BlockState state) { - BlockPos origin = findOrigin(level, pos); - if (origin != null && level.getBlockState(origin).getBlock() instanceof BigBushBlock bigBush) { - bigBush.performBonemeal(level, random, origin, level.getBlockState(origin)); - } - } - - @Override - protected ItemInteractionResult useItemOn( - ItemStack stack, - BlockState state, - Level level, - BlockPos pos, - Player player, - InteractionHand hand, - BlockHitResult hitResult - ) { - if (stack.is(Items.BONE_MEAL)) { - BlockPos origin = findOrigin(level, pos); - if (origin != null && BigBushBlock.grantBonemealBonus(level, origin, level.getBlockState(origin), player, stack)) { - return ItemInteractionResult.sidedSuccess(level.isClientSide); - } - } - return super.useItemOn(stack, state, level, pos, player, hand, hitResult); - } - - @Override - public ItemStack getCloneItemStack(LevelReader level, BlockPos pos, BlockState state) { - BlockPos origin = findOrigin(level, pos); - if (origin != null) { - return new ItemStack(level.getBlockState(origin).getBlock()); - } - return ItemStack.EMPTY; - } -} diff --git a/common/src/main/java/com/craisinlord/antarchy/content/block/BlushMossBlock.java b/common/src/main/java/com/craisinlord/antarchy/content/block/BlushMossBlock.java new file mode 100644 index 00000000..03ac77bc --- /dev/null +++ b/common/src/main/java/com/craisinlord/antarchy/content/block/BlushMossBlock.java @@ -0,0 +1,53 @@ +package com.craisinlord.antarchy.content.block; + +import com.craisinlord.antarchy.Antarchy; +import com.mojang.serialization.MapCodec; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Holder; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.BonemealableBlock; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; + +public class BlushMossBlock extends Block implements BonemealableBlock { + public static final MapCodec CODEC = Block.simpleCodec(BlushMossBlock::new); + private static final ResourceKey> BLUSH_MOSS_PATCH_BONEMEAL = ResourceKey.create( + Registries.CONFIGURED_FEATURE, + ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "blush_moss_patch_bonemeal") + ); + + public BlushMossBlock(BlockBehaviour.Properties properties) { + super(properties); + } + + @Override + public MapCodec codec() { + return CODEC; + } + + @Override + public boolean isValidBonemealTarget(LevelReader level, BlockPos pos, BlockState state) { + return level.getBlockState(pos.above()).isAir(); + } + + @Override + public boolean isBonemealSuccess(Level level, RandomSource random, BlockPos pos, BlockState state) { + return true; + } + + @Override + public void performBonemeal(ServerLevel level, RandomSource random, BlockPos pos, BlockState state) { + Holder.Reference> feature = level.registryAccess() + .lookupOrThrow(Registries.CONFIGURED_FEATURE) + .getOrThrow(BLUSH_MOSS_PATCH_BONEMEAL); + feature.value().place(level, level.getChunkSource().getGenerator(), random, pos); + } +} diff --git a/common/src/main/java/com/craisinlord/antarchy/content/block/BlushMossCarpetBlock.java b/common/src/main/java/com/craisinlord/antarchy/content/block/BlushMossCarpetBlock.java new file mode 100644 index 00000000..17dd3464 --- /dev/null +++ b/common/src/main/java/com/craisinlord/antarchy/content/block/BlushMossCarpetBlock.java @@ -0,0 +1,136 @@ +package com.craisinlord.antarchy.content.block; + +import com.mojang.serialization.MapCodec; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +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 net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.block.state.properties.WallSide; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; + +public class BlushMossCarpetBlock extends Block { + public static final MapCodec CODEC = Block.simpleCodec(BlushMossCarpetBlock::new); + public static final BooleanProperty BOTTOM = BlockStateProperties.BOTTOM; + public static final net.minecraft.world.level.block.state.properties.EnumProperty NORTH_WALL = BlockStateProperties.NORTH_WALL; + public static final net.minecraft.world.level.block.state.properties.EnumProperty EAST_WALL = BlockStateProperties.EAST_WALL; + public static final net.minecraft.world.level.block.state.properties.EnumProperty SOUTH_WALL = BlockStateProperties.SOUTH_WALL; + public static final net.minecraft.world.level.block.state.properties.EnumProperty WEST_WALL = BlockStateProperties.WEST_WALL; + + private static final VoxelShape FLOOR_SHAPE = Block.box(0.0D, 0.0D, 0.0D, 16.0D, 1.0D, 16.0D); + private static final VoxelShape NORTH_LOW = Block.box(0.0D, 0.0D, 0.0D, 16.0D, 6.0D, 1.0D); + private static final VoxelShape NORTH_TALL = Block.box(0.0D, 0.0D, 0.0D, 16.0D, 16.0D, 1.0D); + private static final VoxelShape EAST_LOW = Block.box(15.0D, 0.0D, 0.0D, 16.0D, 6.0D, 16.0D); + private static final VoxelShape EAST_TALL = Block.box(15.0D, 0.0D, 0.0D, 16.0D, 16.0D, 16.0D); + private static final VoxelShape SOUTH_LOW = Block.box(0.0D, 0.0D, 15.0D, 16.0D, 6.0D, 16.0D); + private static final VoxelShape SOUTH_TALL = Block.box(0.0D, 0.0D, 15.0D, 16.0D, 16.0D, 16.0D); + private static final VoxelShape WEST_LOW = Block.box(0.0D, 0.0D, 0.0D, 1.0D, 6.0D, 16.0D); + private static final VoxelShape WEST_TALL = Block.box(0.0D, 0.0D, 0.0D, 1.0D, 16.0D, 16.0D); + + public BlushMossCarpetBlock(BlockBehaviour.Properties properties) { + super(properties); + this.registerDefaultState(this.stateDefinition.any() + .setValue(BOTTOM, true) + .setValue(NORTH_WALL, WallSide.NONE) + .setValue(EAST_WALL, WallSide.NONE) + .setValue(SOUTH_WALL, WallSide.NONE) + .setValue(WEST_WALL, WallSide.NONE)); + } + + @Override + public MapCodec codec() { + return CODEC; + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + builder.add(BOTTOM, NORTH_WALL, EAST_WALL, SOUTH_WALL, WEST_WALL); + } + + @Override + public BlockState getStateForPlacement(net.minecraft.world.item.context.BlockPlaceContext context) { + BlockPos pos = context.getClickedPos(); + Direction face = context.getClickedFace(); + BlockState state = this.defaultBlockState() + .setValue(BOTTOM, face == Direction.UP) + .setValue(NORTH_WALL, WallSide.NONE) + .setValue(EAST_WALL, WallSide.NONE) + .setValue(SOUTH_WALL, WallSide.NONE) + .setValue(WEST_WALL, WallSide.NONE); + if (!state.getValue(BOTTOM)) { + state = switch (face) { + case NORTH -> state.setValue(NORTH_WALL, WallSide.TALL); + case EAST -> state.setValue(EAST_WALL, WallSide.TALL); + case SOUTH -> state.setValue(SOUTH_WALL, WallSide.TALL); + case WEST -> state.setValue(WEST_WALL, WallSide.TALL); + default -> state; + }; + } + return state; + } + + @Override + protected boolean canSurvive(BlockState state, LevelReader level, BlockPos pos) { + if (state.getValue(BOTTOM)) { + return level.getBlockState(pos.below()).isFaceSturdy(level, pos.below(), Direction.UP); + } + + if (supportsWall(level, pos, Direction.NORTH, state.getValue(NORTH_WALL))) { + return true; + } + if (supportsWall(level, pos, Direction.EAST, state.getValue(EAST_WALL))) { + return true; + } + if (supportsWall(level, pos, Direction.SOUTH, state.getValue(SOUTH_WALL))) { + return true; + } + if (supportsWall(level, pos, Direction.WEST, state.getValue(WEST_WALL))) { + return true; + } + + return level.getBlockState(pos.above()).isFaceSturdy(level, pos.above(), Direction.DOWN); + } + + @Override + protected BlockState updateShape(BlockState state, Direction direction, BlockState neighborState, LevelAccessor level, BlockPos pos, BlockPos neighborPos) { + return state.canSurvive(level, pos) ? state : net.minecraft.world.level.block.Blocks.AIR.defaultBlockState(); + } + + @Override + protected VoxelShape getShape(BlockState state, BlockGetter level, BlockPos pos, CollisionContext context) { + if (state.getValue(BOTTOM)) { + return FLOOR_SHAPE; + } + + VoxelShape shape = Shapes.empty(); + shape = combine(shape, state.getValue(NORTH_WALL), NORTH_LOW, NORTH_TALL); + shape = combine(shape, state.getValue(EAST_WALL), EAST_LOW, EAST_TALL); + shape = combine(shape, state.getValue(SOUTH_WALL), SOUTH_LOW, SOUTH_TALL); + shape = combine(shape, state.getValue(WEST_WALL), WEST_LOW, WEST_TALL); + return shape.isEmpty() ? FLOOR_SHAPE : shape; + } + + private static boolean supportsWall(LevelReader level, BlockPos pos, Direction direction, WallSide side) { + if (side == WallSide.NONE) { + return false; + } + BlockPos supportPos = pos.relative(direction); + return level.getBlockState(supportPos).isFaceSturdy(level, supportPos, direction.getOpposite()); + } + + private static VoxelShape combine(VoxelShape current, WallSide side, VoxelShape lowShape, VoxelShape tallShape) { + if (side == WallSide.NONE) { + return current; + } + return Shapes.or(current, side == WallSide.TALL ? tallShape : lowShape); + } +} diff --git a/common/src/main/java/com/craisinlord/antarchy/content/block/CornCropBlock.java b/common/src/main/java/com/craisinlord/antarchy/content/block/CornCropBlock.java new file mode 100644 index 00000000..b5d5cbe4 --- /dev/null +++ b/common/src/main/java/com/craisinlord/antarchy/content/block/CornCropBlock.java @@ -0,0 +1,179 @@ +package com.craisinlord.antarchy.content.block; + +import com.mojang.serialization.MapCodec; +import java.util.Optional; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.RandomSource; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.ItemLike; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.BonemealableBlock; +import net.minecraft.world.level.block.BushBlock; +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 net.minecraft.world.level.block.state.properties.DoubleBlockHalf; +import net.minecraft.world.level.block.state.properties.EnumProperty; +import net.minecraft.world.level.block.state.properties.IntegerProperty; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; + +public class CornCropBlock extends BushBlock implements BonemealableBlock { + public static final MapCodec CODEC = Block.simpleCodec(CornCropBlock::new); + public static final IntegerProperty AGE = BlockStateProperties.AGE_3; + public static final EnumProperty HALF = BlockStateProperties.DOUBLE_BLOCK_HALF; + private static final int MAX_AGE = 3; + private static final int TALL_AGE = 2; + private static final VoxelShape[] LOWER_SHAPES = new VoxelShape[] { + Block.box(4.0D, 0.0D, 4.0D, 12.0D, 6.0D, 12.0D), + Block.box(3.0D, 0.0D, 3.0D, 13.0D, 11.0D, 13.0D), + Block.box(2.0D, 0.0D, 2.0D, 14.0D, 14.0D, 14.0D), + Block.box(1.0D, 0.0D, 1.0D, 15.0D, 16.0D, 15.0D) + }; + private static final VoxelShape[] UPPER_SHAPES = new VoxelShape[] { + Block.box(0.0D, 0.0D, 0.0D, 0.0D, 0.0D, 0.0D), + Block.box(0.0D, 0.0D, 0.0D, 0.0D, 0.0D, 0.0D), + Block.box(2.0D, 0.0D, 2.0D, 14.0D, 16.0D, 14.0D), + Block.box(1.0D, 0.0D, 1.0D, 15.0D, 16.0D, 15.0D) + }; + private static final ResourceLocation CORN_SEEDS_ID = ResourceLocation.fromNamespaceAndPath("antarchy", "corn_seeds"); + + public CornCropBlock(BlockBehaviour.Properties properties) { + super(properties); + this.registerDefaultState(this.stateDefinition.any().setValue(AGE, 0).setValue(HALF, DoubleBlockHalf.LOWER)); + } + + @Override + public MapCodec codec() { + return CODEC; + } + + @Override + protected VoxelShape getShape(BlockState state, BlockGetter level, BlockPos pos, CollisionContext context) { + int age = state.getValue(AGE); + return state.getValue(HALF) == DoubleBlockHalf.UPPER ? UPPER_SHAPES[age] : LOWER_SHAPES[age]; + } + + @Override + protected boolean mayPlaceOn(BlockState state, BlockGetter level, BlockPos pos) { + return state.is(Blocks.FARMLAND); + } + + @Override + protected boolean canSurvive(BlockState state, LevelReader level, BlockPos pos) { + DoubleBlockHalf half = state.getValue(HALF); + int age = state.getValue(AGE); + if (half == DoubleBlockHalf.UPPER) { + BlockState below = level.getBlockState(pos.below()); + return below.is(this) && below.getValue(HALF) == DoubleBlockHalf.LOWER && below.getValue(AGE) >= TALL_AGE; + } + + if (!super.canSurvive(state, level, pos)) { + return false; + } + + return age < TALL_AGE || level.getBlockState(pos.above()).is(this) + && level.getBlockState(pos.above()).getValue(HALF) == DoubleBlockHalf.UPPER + && level.getBlockState(pos.above()).getValue(AGE) == age; + } + + @Override + protected BlockState updateShape( + BlockState state, + Direction direction, + BlockState neighborState, + LevelAccessor level, + BlockPos pos, + BlockPos neighborPos + ) { + if (!state.canSurvive(level, pos)) { + return Blocks.AIR.defaultBlockState(); + } + return super.updateShape(state, direction, neighborState, level, pos, neighborPos); + } + + @Override + protected boolean isRandomlyTicking(BlockState state) { + return state.getValue(HALF) == DoubleBlockHalf.LOWER && state.getValue(AGE) < MAX_AGE; + } + + @Override + protected void randomTick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) { + if (level.getRawBrightness(pos, 0) < 9 || random.nextInt(5) != 0) { + return; + } + + this.grow(level, pos, state); + } + + @Override + public boolean isValidBonemealTarget(LevelReader level, BlockPos pos, BlockState state) { + BlockPos lowerPos = state.getValue(HALF) == DoubleBlockHalf.UPPER ? pos.below() : pos; + BlockState lowerState = level.getBlockState(lowerPos); + if (!lowerState.is(this) || lowerState.getValue(HALF) != DoubleBlockHalf.LOWER) { + return false; + } + + int age = lowerState.getValue(AGE); + return age < MAX_AGE && (age >= TALL_AGE || level.getBlockState(lowerPos.above()).canBeReplaced()); + } + + @Override + public boolean isBonemealSuccess(Level level, RandomSource random, BlockPos pos, BlockState state) { + return true; + } + + @Override + public void performBonemeal(ServerLevel level, RandomSource random, BlockPos pos, BlockState state) { + BlockPos lowerPos = state.getValue(HALF) == DoubleBlockHalf.UPPER ? pos.below() : pos; + BlockState lowerState = level.getBlockState(lowerPos); + if (lowerState.is(this)) { + this.grow(level, lowerPos, lowerState); + } + } + + private void grow(ServerLevel level, BlockPos lowerPos, BlockState lowerState) { + int age = lowerState.getValue(AGE); + if (age >= MAX_AGE) { + return; + } + + if (age + 1 >= TALL_AGE) { + BlockPos upperPos = lowerPos.above(); + if (!level.getBlockState(upperPos).canBeReplaced() && !level.getBlockState(upperPos).is(this)) { + return; + } + } + + int newAge = age + 1; + level.setBlock(lowerPos, lowerState.setValue(AGE, newAge), Block.UPDATE_ALL); + if (newAge >= TALL_AGE) { + level.setBlock(lowerPos.above(), this.defaultBlockState().setValue(HALF, DoubleBlockHalf.UPPER).setValue(AGE, newAge), Block.UPDATE_ALL); + } + } + + @Override + public ItemStack getCloneItemStack(LevelReader level, BlockPos pos, BlockState state) { + return new ItemStack(this.getBaseSeedId()); + } + + protected ItemLike getBaseSeedId() { + Optional item = BuiltInRegistries.ITEM.getOptional(CORN_SEEDS_ID); + return item.orElse(Blocks.AIR.asItem()); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + builder.add(AGE, HALF); + } +} diff --git a/common/src/main/java/com/craisinlord/antarchy/content/block/HangingPeachBlock.java b/common/src/main/java/com/craisinlord/antarchy/content/block/HangingPeachBlock.java new file mode 100644 index 00000000..6eead20a --- /dev/null +++ b/common/src/main/java/com/craisinlord/antarchy/content/block/HangingPeachBlock.java @@ -0,0 +1,70 @@ +package com.craisinlord.antarchy.content.block; + +import com.craisinlord.antarchy.Antarchy; +import com.mojang.serialization.MapCodec; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.BlockTags; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.BushBlock; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; + +public class HangingPeachBlock extends BushBlock { + public static final MapCodec CODEC = Block.simpleCodec(HangingPeachBlock::new); + private static final ResourceLocation PEACH_LEAVES_ID = ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "peach_leaves"); + private static final ResourceLocation PEACH_ITEM_ID = ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "peach"); + private static final VoxelShape SHAPE = Block.box(4.0D, 2.0D, 4.0D, 12.0D, 16.0D, 12.0D); + + public HangingPeachBlock(BlockBehaviour.Properties properties) { + super(properties); + } + + @Override + public MapCodec codec() { + return CODEC; + } + + @Override + protected VoxelShape getShape(BlockState state, BlockGetter level, BlockPos pos, CollisionContext context) { + return SHAPE; + } + + @Override + protected VoxelShape getCollisionShape(BlockState state, BlockGetter level, BlockPos pos, CollisionContext context) { + return Shapes.empty(); + } + + @Override + public ItemStack getCloneItemStack(LevelReader level, BlockPos pos, BlockState state) { + return new ItemStack(BuiltInRegistries.ITEM.getOptional(PEACH_ITEM_ID).orElse(Blocks.AIR.asItem())); + } + + @Override + protected boolean canSurvive(BlockState state, LevelReader level, BlockPos pos) { + BlockState above = level.getBlockState(pos.above()); + return above.is(BuiltInRegistries.BLOCK.getOptional(PEACH_LEAVES_ID).orElse(Blocks.AIR)); + } + + @Override + protected BlockState updateShape( + BlockState state, + Direction direction, + BlockState neighborState, + LevelAccessor level, + BlockPos pos, + BlockPos neighborPos + ) { + return state.canSurvive(level, pos) ? super.updateShape(state, direction, neighborState, level, pos, neighborPos) : Blocks.AIR.defaultBlockState(); + } +} diff --git a/common/src/main/java/com/craisinlord/antarchy/content/block/OuranwoodVineBlock.java b/common/src/main/java/com/craisinlord/antarchy/content/block/OuranwoodVineBlock.java deleted file mode 100644 index a8c023c9..00000000 --- a/common/src/main/java/com/craisinlord/antarchy/content/block/OuranwoodVineBlock.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.craisinlord.antarchy.content.block; - -import com.mojang.serialization.MapCodec; -import net.minecraft.core.BlockPos; -import net.minecraft.world.level.BlockGetter; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.WeepingVinesBlock; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.state.BlockBehaviour; -import net.minecraft.world.phys.shapes.CollisionContext; -import net.minecraft.world.phys.shapes.Shapes; -import net.minecraft.world.phys.shapes.VoxelShape; - -@SuppressWarnings({"rawtypes", "unchecked"}) -public class OuranwoodVineBlock extends WeepingVinesBlock { - public static final MapCodec CODEC = simpleCodec(OuranwoodVineBlock::new); - private static Block bodyBlock; - - public OuranwoodVineBlock(BlockBehaviour.Properties properties) { - super(properties); - } - - @Override - public MapCodec codec() { - return (MapCodec) CODEC; - } - - @Override - protected Block getBodyBlock() { - return bodyBlock; - } - - @Override - protected VoxelShape getShape(BlockState state, BlockGetter level, BlockPos pos, CollisionContext context) { - return Shapes.block(); - } - - public static void bindBodyBlock(Block block) { - bodyBlock = block; - } -} diff --git a/common/src/main/java/com/craisinlord/antarchy/content/block/OuranwoodVinePlantBlock.java b/common/src/main/java/com/craisinlord/antarchy/content/block/OuranwoodVinePlantBlock.java deleted file mode 100644 index 4d663c0b..00000000 --- a/common/src/main/java/com/craisinlord/antarchy/content/block/OuranwoodVinePlantBlock.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.craisinlord.antarchy.content.block; - -import com.mojang.serialization.MapCodec; -import net.minecraft.core.BlockPos; -import net.minecraft.world.level.BlockGetter; -import net.minecraft.world.level.block.GrowingPlantHeadBlock; -import net.minecraft.world.level.block.WeepingVinesBlock; -import net.minecraft.world.level.block.WeepingVinesPlantBlock; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.state.BlockBehaviour; -import net.minecraft.world.phys.shapes.CollisionContext; -import net.minecraft.world.phys.shapes.Shapes; -import net.minecraft.world.phys.shapes.VoxelShape; - -@SuppressWarnings({"rawtypes", "unchecked"}) -public class OuranwoodVinePlantBlock extends WeepingVinesPlantBlock { - public static final MapCodec CODEC = simpleCodec(OuranwoodVinePlantBlock::new); - private static GrowingPlantHeadBlock headBlock; - - public OuranwoodVinePlantBlock(BlockBehaviour.Properties properties) { - super(properties); - } - - @Override - public MapCodec codec() { - return (MapCodec) CODEC; - } - - @Override - protected GrowingPlantHeadBlock getHeadBlock() { - return headBlock; - } - - @Override - protected VoxelShape getShape(BlockState state, BlockGetter level, BlockPos pos, CollisionContext context) { - return Shapes.block(); - } - - public static void bindHeadBlock(WeepingVinesBlock block) { - headBlock = block; - } -} diff --git a/common/src/main/java/com/craisinlord/antarchy/content/block/PeachLeavesBlock.java b/common/src/main/java/com/craisinlord/antarchy/content/block/PeachLeavesBlock.java new file mode 100644 index 00000000..1ac4bc33 --- /dev/null +++ b/common/src/main/java/com/craisinlord/antarchy/content/block/PeachLeavesBlock.java @@ -0,0 +1,88 @@ +package com.craisinlord.antarchy.content.block; + +import com.craisinlord.antarchy.Antarchy; +import com.craisinlord.antarchy.content.AntarchyObjects; +import com.mojang.serialization.MapCodec; +import net.minecraft.core.BlockPos; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.RandomSource; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.BonemealableBlock; +import net.minecraft.world.level.block.LeavesBlock; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.level.material.Fluids; + +public class PeachLeavesBlock extends LeavesBlock implements BonemealableBlock { + public static final MapCodec CODEC = Block.simpleCodec(PeachLeavesBlock::new); + private static final ResourceLocation HANGING_PEACH_ID = ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "hanging_peach"); + + public PeachLeavesBlock(BlockBehaviour.Properties properties) { + super(properties); + this.registerDefaultState(this.defaultBlockState() + .setValue(DISTANCE, DECAY_DISTANCE) + .setValue(PERSISTENT, false) + .setValue(WATERLOGGED, false)); + } + + @Override + public MapCodec codec() { + return CODEC; + } + + @Override + public BlockState getStateForPlacement(BlockPlaceContext context) { + FluidState fluidState = context.getLevel().getFluidState(context.getClickedPos()); + return this.defaultBlockState() + .setValue(PERSISTENT, true) + .setValue(WATERLOGGED, fluidState.getType() == Fluids.WATER); + } + + @Override + public void animateTick(BlockState state, Level level, BlockPos pos, RandomSource random) { + if (random.nextInt(18) != 0) { + return; + } + + level.addParticle( + AntarchyObjects.PEACH_LEAVES_PARTICLE.get(), + pos.getX() + random.nextDouble(), + pos.getY() + random.nextDouble(), + pos.getZ() + random.nextDouble(), + 0.0D, + -0.02D, + 0.0D + ); + } + + @Override + public boolean isValidBonemealTarget(LevelReader level, BlockPos pos, BlockState state) { + return level.getBlockState(pos.below()).isAir(); + } + + @Override + public boolean isBonemealSuccess(Level level, RandomSource random, BlockPos pos, BlockState state) { + return true; + } + + @Override + public void performBonemeal(ServerLevel level, RandomSource random, BlockPos pos, BlockState state) { + if (!level.getBlockState(pos.below()).isAir()) { + return; + } + + level.setBlock(pos.below(), createHangingPeachState(), Block.UPDATE_ALL); + } + + public static BlockState createHangingPeachState() { + return BuiltInRegistries.BLOCK.getOptional(HANGING_PEACH_ID) + .map(Block::defaultBlockState) + .orElseThrow(() -> new IllegalStateException("Missing hanging peach block: " + HANGING_PEACH_ID)); + } +} diff --git a/common/src/main/java/com/craisinlord/antarchy/content/block/PeachSaplingBlock.java b/common/src/main/java/com/craisinlord/antarchy/content/block/PeachSaplingBlock.java new file mode 100644 index 00000000..d6363788 --- /dev/null +++ b/common/src/main/java/com/craisinlord/antarchy/content/block/PeachSaplingBlock.java @@ -0,0 +1,134 @@ +package com.craisinlord.antarchy.content.block; + +import com.craisinlord.antarchy.content.worldgen.elythia.PeachTreeGrowers; +import com.mojang.serialization.MapCodec; +import java.util.LinkedHashMap; +import java.util.Map; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Holder; +import net.minecraft.core.registries.Registries; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.BonemealableBlock; +import net.minecraft.world.level.block.BushBlock; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; + +public class PeachSaplingBlock extends BushBlock implements BonemealableBlock { + public static final MapCodec CODEC = Block.simpleCodec(PeachSaplingBlock::new); + + public PeachSaplingBlock(BlockBehaviour.Properties properties) { + super(properties); + } + + @Override + public MapCodec codec() { + return CODEC; + } + + @Override + protected void randomTick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) { + if (level.getMaxLocalRawBrightness(pos.above()) >= 9 && random.nextInt(7) == 0) { + this.growConfiguredTree(level, pos, state, random); + } + } + + @Override + protected BlockState updateShape( + BlockState state, + net.minecraft.core.Direction direction, + BlockState neighborState, + LevelAccessor level, + BlockPos pos, + BlockPos neighborPos + ) { + return state.canSurvive(level, pos) + ? super.updateShape(state, direction, neighborState, level, pos, neighborPos) + : Blocks.AIR.defaultBlockState(); + } + + @Override + public boolean isValidBonemealTarget(LevelReader level, BlockPos pos, BlockState state) { + return true; + } + + @Override + public boolean isBonemealSuccess(Level level, RandomSource random, BlockPos pos, BlockState state) { + return random.nextFloat() < 0.45F; + } + + @Override + public void performBonemeal(ServerLevel level, RandomSource random, BlockPos pos, BlockState state) { + this.growConfiguredTree(level, pos, state, random); + } + + private void growConfiguredTree(ServerLevel level, BlockPos pos, BlockState state, RandomSource random) { + Footprint largeFootprint = this.findFootprint(level, pos); + if (largeFootprint != null) { + this.placeConfiguredTree(level, largeFootprint, PeachTreeGrowers.PEACH_LARGE_TREE, random); + return; + } + + this.placeConfiguredTree(level, new Footprint(pos, Map.of(pos, state)), PeachTreeGrowers.PEACH_TREE, random); + } + + private Footprint findFootprint(ServerLevel level, BlockPos pos) { + for (int offsetX = 0; offsetX < 2; offsetX++) { + for (int offsetZ = 0; offsetZ < 2; offsetZ++) { + BlockPos origin = pos.offset(-offsetX, 0, -offsetZ); + Map blocks = new LinkedHashMap<>(); + boolean matches = true; + + for (int x = 0; x < 2 && matches; x++) { + for (int z = 0; z < 2; z++) { + BlockPos checkPos = origin.offset(x, 0, z); + BlockState checkState = level.getBlockState(checkPos); + if (!checkState.is(this)) { + matches = false; + break; + } + blocks.put(checkPos, checkState); + } + } + + if (matches) { + return new Footprint(origin, blocks); + } + } + } + + return null; + } + + private void placeConfiguredTree( + ServerLevel level, + Footprint footprint, + net.minecraft.resources.ResourceKey> featureKey, + RandomSource random + ) { + Holder.Reference> feature = level.registryAccess() + .lookupOrThrow(Registries.CONFIGURED_FEATURE) + .getOrThrow(featureKey); + + for (BlockPos saplingPos : footprint.blocks().keySet()) { + level.removeBlock(saplingPos, false); + } + + if (feature.value().place(level, level.getChunkSource().getGenerator(), random, footprint.origin())) { + return; + } + + for (Map.Entry entry : footprint.blocks().entrySet()) { + level.setBlock(entry.getKey(), entry.getValue(), Block.UPDATE_ALL); + } + } + + private record Footprint(BlockPos origin, Map blocks) { + } +} diff --git a/common/src/main/java/com/craisinlord/antarchy/content/block/TorchflowerBushBlock.java b/common/src/main/java/com/craisinlord/antarchy/content/block/TorchflowerBushBlock.java deleted file mode 100644 index 00cf1a0d..00000000 --- a/common/src/main/java/com/craisinlord/antarchy/content/block/TorchflowerBushBlock.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.craisinlord.antarchy.content.block; - -import com.mojang.serialization.MapCodec; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockBehaviour; - -public class TorchflowerBushBlock extends MilkweedBlock { - public static final MapCodec CODEC = Block.simpleCodec(TorchflowerBushBlock::new); - - public TorchflowerBushBlock(BlockBehaviour.Properties properties) { - super(properties); - } - - @Override - public MapCodec codec() { - return (MapCodec) (MapCodec) CODEC; - } -} diff --git a/common/src/main/java/com/craisinlord/antarchy/content/block/VeryShortGrassBlock.java b/common/src/main/java/com/craisinlord/antarchy/content/block/VeryShortGrassBlock.java deleted file mode 100644 index eca0a8e4..00000000 --- a/common/src/main/java/com/craisinlord/antarchy/content/block/VeryShortGrassBlock.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.craisinlord.antarchy.content.block; - -import com.mojang.serialization.MapCodec; -import net.minecraft.core.BlockPos; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.util.RandomSource; -import net.minecraft.world.level.BlockGetter; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.LevelReader; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.BonemealableBlock; -import net.minecraft.world.level.block.BushBlock; -import net.minecraft.world.level.block.state.BlockBehaviour; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.phys.shapes.CollisionContext; -import net.minecraft.world.phys.shapes.VoxelShape; - -public class VeryShortGrassBlock extends BushBlock implements BonemealableBlock { - public static final MapCodec CODEC = Block.simpleCodec(VeryShortGrassBlock::new); - - private static final VoxelShape SHAPE = Block.box(2.0, 0.0, 2.0, 14.0, 8.0, 14.0); - - public VeryShortGrassBlock(BlockBehaviour.Properties properties) { - super(properties); - } - - @Override - public MapCodec codec() { - return CODEC; - } - - @Override - protected VoxelShape getShape(BlockState state, BlockGetter level, BlockPos pos, CollisionContext context) { - return SHAPE; - } - - @Override - public boolean isValidBonemealTarget(LevelReader level, BlockPos pos, BlockState state) { - return true; - } - - @Override - public boolean isBonemealSuccess(Level level, RandomSource random, BlockPos pos, BlockState state) { - return true; - } - - @Override - public void performBonemeal(ServerLevel level, RandomSource random, BlockPos pos, BlockState state) { - level.setBlock(pos, Blocks.SHORT_GRASS.defaultBlockState(), 3); - } -} diff --git a/common/src/main/java/com/craisinlord/antarchy/content/block/VeryTallGrassBlock.java b/common/src/main/java/com/craisinlord/antarchy/content/block/VeryTallGrassBlock.java deleted file mode 100644 index 1bf0808a..00000000 --- a/common/src/main/java/com/craisinlord/antarchy/content/block/VeryTallGrassBlock.java +++ /dev/null @@ -1,170 +0,0 @@ -package com.craisinlord.antarchy.content.block; - -import com.mojang.serialization.MapCodec; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.util.RandomSource; -import net.minecraft.util.StringRepresentable; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.ItemInteractionResult; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.Items; -import net.minecraft.world.item.context.BlockPlaceContext; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.LevelAccessor; -import net.minecraft.world.level.LevelReader; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.BonemealableBlock; -import net.minecraft.world.level.block.BushBlock; -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.EnumProperty; -import net.minecraft.world.phys.BlockHitResult; -import org.jetbrains.annotations.Nullable; - -public class VeryTallGrassBlock extends BushBlock implements BonemealableBlock { - public static final MapCodec CODEC = Block.simpleCodec(VeryTallGrassBlock::new); - public static final EnumProperty PART = EnumProperty.create("part", Part.class); - - public VeryTallGrassBlock(BlockBehaviour.Properties properties) { - super(properties); - this.registerDefaultState(this.stateDefinition.any().setValue(PART, Part.LOWER)); - } - - @Override - public MapCodec codec() { - return CODEC; - } - - @Override - protected void createBlockStateDefinition(StateDefinition.Builder builder) { - builder.add(PART); - } - - @Override - protected boolean canSurvive(BlockState state, LevelReader level, BlockPos pos) { - return switch (state.getValue(PART)) { - case LOWER -> super.canSurvive(state, level, pos); - case MIDDLE -> level.getBlockState(pos.below()).is(this) - && level.getBlockState(pos.below()).getValue(PART) == Part.LOWER - && level.getBlockState(pos.above()).is(this) - && level.getBlockState(pos.above()).getValue(PART) == Part.UPPER; - case UPPER -> level.getBlockState(pos.below()).is(this) - && level.getBlockState(pos.below()).getValue(PART) == Part.MIDDLE; - }; - } - - @Override - protected BlockState updateShape( - BlockState state, - Direction direction, - BlockState neighborState, - LevelAccessor level, - BlockPos pos, - BlockPos neighborPos - ) { - Part part = state.getValue(PART); - if (part == Part.LOWER && direction == Direction.UP && (!neighborState.is(this) || neighborState.getValue(PART) != Part.MIDDLE)) { - return Blocks.AIR.defaultBlockState(); - } - if (part == Part.MIDDLE) { - if (direction == Direction.DOWN && (!neighborState.is(this) || neighborState.getValue(PART) != Part.LOWER)) { - return Blocks.AIR.defaultBlockState(); - } - if (direction == Direction.UP && (!neighborState.is(this) || neighborState.getValue(PART) != Part.UPPER)) { - return Blocks.AIR.defaultBlockState(); - } - } - if (part == Part.UPPER && direction == Direction.DOWN && (!neighborState.is(this) || neighborState.getValue(PART) != Part.MIDDLE)) { - return Blocks.AIR.defaultBlockState(); - } - return state.canSurvive(level, pos) ? super.updateShape(state, direction, neighborState, level, pos, neighborPos) : Blocks.AIR.defaultBlockState(); - } - - @Override - protected ItemInteractionResult useItemOn( - ItemStack stack, - BlockState state, - Level level, - BlockPos pos, - Player player, - InteractionHand hand, - BlockHitResult hitResult - ) { - if (player.getItemInHand(hand).is(Items.BONE_MEAL)) { - popResource(level, pos, new ItemStack(state.getBlock().asItem(), 1)); - return ItemInteractionResult.PASS_TO_DEFAULT_BLOCK_INTERACTION; - } - - return super.useItemOn(stack, state, level, pos, player, hand, hitResult); - } - - @Override - public boolean isValidBonemealTarget(LevelReader level, BlockPos pos, BlockState state) { - return false; - } - - @Override - public boolean isBonemealSuccess(Level level, RandomSource random, BlockPos pos, BlockState state) { - return false; - } - - @Override - public void performBonemeal(ServerLevel level, RandomSource random, BlockPos pos, BlockState state) { - } - - @Override - protected boolean canBeReplaced(BlockState state, BlockPlaceContext context) { - return false; - } - - @Nullable - @Override - public BlockState getStateForPlacement(BlockPlaceContext context) { - BlockPos pos = context.getClickedPos(); - Level level = context.getLevel(); - if (!level.getBlockState(pos.above()).canBeReplaced(context) || !level.getBlockState(pos.above(2)).canBeReplaced(context)) { - return null; - } - return super.getStateForPlacement(context); - } - - @Override - public void setPlacedBy(Level level, BlockPos pos, BlockState state, @Nullable net.minecraft.world.entity.LivingEntity placer, ItemStack stack) { - placeAt(level, pos, Block.UPDATE_ALL); - } - - public static void placeAt(LevelAccessor level, BlockPos pos, int flags) { - level.setBlock(pos, defaultState(Part.LOWER), flags); - level.setBlock(pos.above(), defaultState(Part.MIDDLE), flags); - level.setBlock(pos.above(2), defaultState(Part.UPPER), flags); - } - - private static BlockState defaultState(Part part) { - return net.minecraft.core.registries.BuiltInRegistries.BLOCK - .get(net.minecraft.resources.ResourceLocation.fromNamespaceAndPath("antarchy", "very_tall_grass")) - .defaultBlockState() - .setValue(PART, part); - } - - public enum Part implements StringRepresentable { - LOWER("lower"), - MIDDLE("middle"), - UPPER("upper"); - - private final String name; - - Part(String name) { - this.name = name; - } - - @Override - public String getSerializedName() { - return this.name; - } - } -} diff --git a/common/src/main/java/com/craisinlord/antarchy/content/block/WildCornBlock.java b/common/src/main/java/com/craisinlord/antarchy/content/block/WildCornBlock.java new file mode 100644 index 00000000..4c87b9dc --- /dev/null +++ b/common/src/main/java/com/craisinlord/antarchy/content/block/WildCornBlock.java @@ -0,0 +1,63 @@ +package com.craisinlord.antarchy.content.block; + +import com.craisinlord.antarchy.content.AntarchyObjects; +import com.mojang.serialization.MapCodec; +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.RandomSource; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.DoubleBlockHalf; + +public final class WildCornBlock extends CornCropBlock { + public static final MapCodec CODEC = Block.simpleCodec(WildCornBlock::new); + + public WildCornBlock(BlockBehaviour.Properties properties) { + super(properties); + this.registerDefaultState(this.stateDefinition.any().setValue(AGE, 3).setValue(HALF, DoubleBlockHalf.LOWER)); + } + + @Override + public MapCodec codec() { + return CODEC; + } + + @Override + protected boolean mayPlaceOn(BlockState state, BlockGetter level, BlockPos pos) { + return state.is(Blocks.GRASS_BLOCK); + } + + @Override + protected boolean isRandomlyTicking(BlockState state) { + return false; + } + + @Override + protected void randomTick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) { + } + + @Override + public boolean isValidBonemealTarget(LevelReader level, BlockPos pos, BlockState state) { + return false; + } + + @Override + public boolean isBonemealSuccess(Level level, RandomSource random, BlockPos pos, BlockState state) { + return false; + } + + @Override + public void performBonemeal(ServerLevel level, RandomSource random, BlockPos pos, BlockState state) { + } + + @Override + public ItemStack getCloneItemStack(LevelReader level, BlockPos pos, BlockState state) { + return new ItemStack(AntarchyObjects.CORN.get()); + } +} diff --git a/common/src/main/java/com/craisinlord/antarchy/content/client/model/ElkaModel.java b/common/src/main/java/com/craisinlord/antarchy/content/client/model/ElkaModel.java new file mode 100644 index 00000000..7b08e13e --- /dev/null +++ b/common/src/main/java/com/craisinlord/antarchy/content/client/model/ElkaModel.java @@ -0,0 +1,34 @@ +package com.craisinlord.antarchy.content.client.model; + +import com.craisinlord.antarchy.Antarchy; +import com.craisinlord.antarchy.content.entity.ElkaEntity; +import net.minecraft.resources.ResourceLocation; +import software.bernie.geckolib.model.GeoModel; + +public class ElkaModel extends GeoModel { + private static final ResourceLocation ADULT_GEO = rl("geo/elka.geo.json"); + private static final ResourceLocation BABY_GEO = rl("geo/elka_baby.geo.json"); + private static final ResourceLocation ADULT_ANIM = rl("animations/elka.animation.json"); + private static final ResourceLocation BABY_ANIM = rl("animations/elka_baby.animation.json"); + private static final ResourceLocation ADULT_TEXTURE = rl("textures/entity/elka.png"); + private static final ResourceLocation BABY_TEXTURE = rl("textures/entity/elka_baby.png"); + + private static ResourceLocation rl(String path) { + return ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, path); + } + + @Override + public ResourceLocation getModelResource(ElkaEntity animatable) { + return animatable.isBaby() ? BABY_GEO : ADULT_GEO; + } + + @Override + public ResourceLocation getAnimationResource(ElkaEntity animatable) { + return animatable.isBaby() ? BABY_ANIM : ADULT_ANIM; + } + + @Override + public ResourceLocation getTextureResource(ElkaEntity animatable) { + return animatable.isBaby() ? BABY_TEXTURE : ADULT_TEXTURE; + } +} diff --git a/common/src/main/java/com/craisinlord/antarchy/content/client/model/GlimmerModel.java b/common/src/main/java/com/craisinlord/antarchy/content/client/model/GlimmerModel.java deleted file mode 100644 index b17874e3..00000000 --- a/common/src/main/java/com/craisinlord/antarchy/content/client/model/GlimmerModel.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.craisinlord.antarchy.content.client.model; - -import com.craisinlord.antarchy.Antarchy; -import com.craisinlord.antarchy.content.entity.GlimmerEntity; -import net.minecraft.resources.ResourceLocation; -import software.bernie.geckolib.model.GeoModel; - -public class GlimmerModel extends GeoModel { - private static final ResourceLocation ADULT_GEO = rl("geo/glimmer.geo.json"); - private static final ResourceLocation BABY_GEO = rl("geo/glimmer_baby.geo.json"); - private static final ResourceLocation ADULT_ANIM = rl("animations/glimmer.animation.json"); - private static final ResourceLocation BABY_ANIM = rl("animations/glimmer_baby.animation.json"); - private static final ResourceLocation ADULT_DAY = rl("textures/entity/glimmer/glimmer_day.png"); - private static final ResourceLocation ADULT_NIGHT = rl("textures/entity/glimmer/glimmer.png"); - private static final ResourceLocation BABY_DAY = rl("textures/entity/glimmer/glimmer_baby_day.png"); - private static final ResourceLocation BABY_NIGHT = rl("textures/entity/glimmer/glimmer_baby.png"); - public static final ResourceLocation ADULT_EMISSIVE = rl("textures/entity/glimmer/glimmer_emissive.png"); - public static final ResourceLocation BABY_EMISSIVE = rl("textures/entity/glimmer/glimmer_baby_emissive.png"); - - private static ResourceLocation rl(String path) { - return ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, path); - } - - @Override - public ResourceLocation getModelResource(GlimmerEntity animatable) { - return animatable.isBaby() ? BABY_GEO : ADULT_GEO; - } - - @Override - public ResourceLocation getAnimationResource(GlimmerEntity animatable) { - return animatable.isBaby() ? BABY_ANIM : ADULT_ANIM; - } - - @Override - public ResourceLocation getTextureResource(GlimmerEntity animatable) { - return textureFor(animatable, animatable.getGlowBlend(0.0F) >= 0.5F); - } - - public static ResourceLocation textureFor(GlimmerEntity animatable, boolean glowing) { - if (animatable.isBaby()) { - return glowing ? BABY_NIGHT : BABY_DAY; - } - return glowing ? ADULT_NIGHT : ADULT_DAY; - } -} diff --git a/common/src/main/java/com/craisinlord/antarchy/content/client/model/OuranwoodDeerModel.java b/common/src/main/java/com/craisinlord/antarchy/content/client/model/OuranwoodDeerModel.java new file mode 100644 index 00000000..cfedeb41 --- /dev/null +++ b/common/src/main/java/com/craisinlord/antarchy/content/client/model/OuranwoodDeerModel.java @@ -0,0 +1,41 @@ +package com.craisinlord.antarchy.content.client.model; + +import com.craisinlord.antarchy.Antarchy; +import com.craisinlord.antarchy.content.entity.OuranwoodDeerEntity; +import net.minecraft.resources.ResourceLocation; +import software.bernie.geckolib.model.GeoModel; + +public class OuranwoodDeerModel extends GeoModel { + private static final ResourceLocation ADULT_GEO = rl("geo/ouranwood_deer.geo.json"); + private static final ResourceLocation BABY_GEO = rl("geo/ouranwood_deer_baby.geo.json"); + private static final ResourceLocation ADULT_ANIM = rl("animations/ouranwood_deer.animation.json"); + private static final ResourceLocation BABY_ANIM = rl("animations/ouranwood_deer_baby.animation.json"); + private static final ResourceLocation BUCK_TEXTURE = rl("textures/entity/ouranwood_deer/deer_buck.png"); + private static final ResourceLocation DOE_TEXTURE = rl("textures/entity/ouranwood_deer/deer_doe.png"); + private static final ResourceLocation STAG_TEXTURE = rl("textures/entity/ouranwood_deer/deer_stag.png"); + + private static ResourceLocation rl(String path) { + return ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, path); + } + + @Override + public ResourceLocation getModelResource(OuranwoodDeerEntity animatable) { + return animatable.isBaby() ? BABY_GEO : ADULT_GEO; + } + + @Override + public ResourceLocation getAnimationResource(OuranwoodDeerEntity animatable) { + return animatable.isBaby() ? BABY_ANIM : ADULT_ANIM; + } + + @Override + public ResourceLocation getTextureResource(OuranwoodDeerEntity animatable) { + if (animatable.isBaby()) { + return STAG_TEXTURE; + } + return switch (animatable.getVariant()) { + case BUCK -> BUCK_TEXTURE; + case DOE -> DOE_TEXTURE; + }; + } +} diff --git a/common/src/main/java/com/craisinlord/antarchy/content/client/model/glimmer/GlimmerFrogModel.java b/common/src/main/java/com/craisinlord/antarchy/content/client/model/glimmer/GlimmerFrogModel.java new file mode 100644 index 00000000..a71dfd60 --- /dev/null +++ b/common/src/main/java/com/craisinlord/antarchy/content/client/model/glimmer/GlimmerFrogModel.java @@ -0,0 +1,50 @@ +package com.craisinlord.antarchy.content.client.model.glimmer; + +import com.craisinlord.antarchy.content.entity.glimmer.GlimmerEntity; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.model.EntityModel; +import net.minecraft.client.model.FrogModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.util.Mth; + +/** + * Reuses vanilla Frog geometry ({@link FrogModel}/{@code ModelLayers.FROG}) for the Frog + * Glimmer variant instead of an ill-fitting GeckoLib placeholder mesh, with a simplified + * walk/idle animation (GlimmerEntity has no Frog-specific jump/tongue state). + */ +public class GlimmerFrogModel extends EntityModel { + private final ModelPart root; + private final ModelPart head; + private final ModelPart leftArm; + private final ModelPart rightArm; + private final ModelPart leftLeg; + private final ModelPart rightLeg; + + public GlimmerFrogModel(ModelPart bakeRoot) { + this.root = bakeRoot.getChild("root"); + ModelPart body = this.root.getChild("body"); + this.head = body.getChild("head"); + this.leftArm = body.getChild("left_arm"); + this.rightArm = body.getChild("right_arm"); + this.leftLeg = this.root.getChild("left_leg"); + this.rightLeg = this.root.getChild("right_leg"); + } + + @Override + public void setupAnim(GlimmerEntity entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { + this.head.yRot = netHeadYaw * ((float) Math.PI / 180F); + this.head.xRot = headPitch * ((float) Math.PI / 180F); + + float legSwing = Mth.sin(limbSwing * 0.6662F) * limbSwingAmount; + this.leftLeg.xRot = legSwing; + this.rightLeg.xRot = -legSwing; + this.leftArm.xRot = -legSwing; + this.rightArm.xRot = legSwing; + } + + @Override + public void renderToBuffer(PoseStack poseStack, VertexConsumer buffer, int packedLight, int packedOverlay, int color) { + this.root.render(poseStack, buffer, packedLight, packedOverlay, color); + } +} diff --git a/common/src/main/java/com/craisinlord/antarchy/content/client/model/glimmer/GlimmerModel.java b/common/src/main/java/com/craisinlord/antarchy/content/client/model/glimmer/GlimmerModel.java new file mode 100644 index 00000000..82bf3761 --- /dev/null +++ b/common/src/main/java/com/craisinlord/antarchy/content/client/model/glimmer/GlimmerModel.java @@ -0,0 +1,22 @@ +package com.craisinlord.antarchy.content.client.model.glimmer; + +import com.craisinlord.antarchy.content.entity.glimmer.GlimmerEntity; +import net.minecraft.resources.ResourceLocation; +import software.bernie.geckolib.model.GeoModel; + +public class GlimmerModel extends GeoModel { + @Override + public ResourceLocation getModelResource(GlimmerEntity animatable) { + return animatable.getVariant().getBehavior().modelGeo(); + } + + @Override + public ResourceLocation getAnimationResource(GlimmerEntity animatable) { + return animatable.getVariant().getBehavior().animationFile(); + } + + @Override + public ResourceLocation getTextureResource(GlimmerEntity animatable) { + return animatable.getVariant().getBehavior().texture(animatable); + } +} diff --git a/common/src/main/java/com/craisinlord/antarchy/content/GlimmerParticles.java b/common/src/main/java/com/craisinlord/antarchy/content/client/particle/GlimmerParticles.java similarity index 74% rename from common/src/main/java/com/craisinlord/antarchy/content/GlimmerParticles.java rename to common/src/main/java/com/craisinlord/antarchy/content/client/particle/GlimmerParticles.java index 4be4e240..0b5d6400 100644 --- a/common/src/main/java/com/craisinlord/antarchy/content/GlimmerParticles.java +++ b/common/src/main/java/com/craisinlord/antarchy/content/client/particle/GlimmerParticles.java @@ -1,4 +1,4 @@ -package com.craisinlord.antarchy.content; +package com.craisinlord.antarchy.content.client.particle; import net.minecraft.core.particles.DustParticleOptions; import net.minecraft.server.level.ServerLevel; @@ -42,4 +42,22 @@ public final class GlimmerParticles { serverLevel.sendParticles(TRAIL, behind.x, behind.y, behind.z, 1, 0.05D, 0.05D, 0.05D, 0.0D); } } + + public static void tickBurst(LivingEntity entity) { + if (!(entity.level() instanceof ServerLevel serverLevel) || !entity.isAlive()) { + return; + } + + serverLevel.sendParticles( + TRAIL, + entity.getRandomX(0.4D), + entity.getY(0.1D) + entity.getBbHeight() * 0.4D, + entity.getRandomZ(0.4D), + 3, + 0.12D, + 0.12D, + 0.12D, + 0.0D + ); + } } diff --git a/common/src/main/java/com/craisinlord/antarchy/content/client/particle/PeachLeavesParticle.java b/common/src/main/java/com/craisinlord/antarchy/content/client/particle/PeachLeavesParticle.java new file mode 100644 index 00000000..3a578435 --- /dev/null +++ b/common/src/main/java/com/craisinlord/antarchy/content/client/particle/PeachLeavesParticle.java @@ -0,0 +1,69 @@ +package com.craisinlord.antarchy.content.client.particle; + +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.particle.Particle; +import net.minecraft.client.particle.ParticleProvider; +import net.minecraft.client.particle.ParticleRenderType; +import net.minecraft.client.particle.SpriteSet; +import net.minecraft.client.particle.TextureSheetParticle; +import net.minecraft.core.particles.SimpleParticleType; + +public final class PeachLeavesParticle extends TextureSheetParticle { + private final SpriteSet sprites; + private final float gravity; + + private PeachLeavesParticle(ClientLevel level, double x, double y, double z, SpriteSet sprites) { + super(level, x, y, z, 0.0D, 0.0D, 0.0D); + this.sprites = sprites; + this.gravity = 0.02F + this.random.nextFloat() * 0.01F; + this.lifetime = 28 + this.random.nextInt(26); + this.quadSize = 0.14F + this.random.nextFloat() * 0.05F; + this.xd = (this.random.nextDouble() - 0.5D) * 0.04D; + this.yd = -0.015D - this.random.nextDouble() * 0.02D; + this.zd = (this.random.nextDouble() - 0.5D) * 0.04D; + this.hasPhysics = true; + this.setSpriteFromAge(sprites); + } + + @Override + public void tick() { + this.xo = this.x; + this.yo = this.y; + this.zo = this.z; + + if (this.age++ >= this.lifetime) { + this.remove(); + return; + } + + double sway = Math.sin((this.age + this.x) * 0.22D) * 0.0035D; + this.xd += sway; + this.zd -= sway; + this.yd -= this.gravity * 0.015D; + + this.xd *= 0.91D; + this.yd *= 0.92D; + this.zd *= 0.91D; + + this.move(this.xd, this.yd, this.zd); + this.setSpriteFromAge(this.sprites); + } + + @Override + public ParticleRenderType getRenderType() { + return ParticleRenderType.PARTICLE_SHEET_TRANSLUCENT; + } + + public static final class Provider implements ParticleProvider { + private final SpriteSet sprites; + + public Provider(SpriteSet sprites) { + this.sprites = sprites; + } + + @Override + public Particle createParticle(SimpleParticleType type, ClientLevel level, double x, double y, double z, double xd, double yd, double zd) { + return new PeachLeavesParticle(level, x, y, z, this.sprites); + } + } +} diff --git a/common/src/main/java/com/craisinlord/antarchy/content/client/renderer/AppleCowRenderer.java b/common/src/main/java/com/craisinlord/antarchy/content/client/renderer/AppleCowRenderer.java index a46c13aa..90dee763 100644 --- a/common/src/main/java/com/craisinlord/antarchy/content/client/renderer/AppleCowRenderer.java +++ b/common/src/main/java/com/craisinlord/antarchy/content/client/renderer/AppleCowRenderer.java @@ -53,7 +53,7 @@ public class AppleCowRenderer extends GeoEntityRenderer { public void render(PoseStack poseStack, AppleCowEntity animatable, BakedGeoModel bakedModel, @Nullable RenderType renderType, MultiBufferSource bufferSource, @Nullable VertexConsumer buffer, float partialTick, int packedLight, int packedOverlay) { - if (!(animatable instanceof EnchantedGoldenAppleCow)) { + if (!(animatable instanceof EnchantedGoldenAppleCow) || animatable.isBaby()) { return; } diff --git a/common/src/main/java/com/craisinlord/antarchy/content/client/renderer/ElkaRenderer.java b/common/src/main/java/com/craisinlord/antarchy/content/client/renderer/ElkaRenderer.java new file mode 100644 index 00000000..80a42c0d --- /dev/null +++ b/common/src/main/java/com/craisinlord/antarchy/content/client/renderer/ElkaRenderer.java @@ -0,0 +1,15 @@ +package com.craisinlord.antarchy.content.client.renderer; + +import com.craisinlord.antarchy.content.client.model.ElkaModel; +import com.craisinlord.antarchy.content.entity.ElkaEntity; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import software.bernie.geckolib.renderer.GeoEntityRenderer; + +public class ElkaRenderer extends GeoEntityRenderer { + private static final float SHADOW_RADIUS = 0.9F; + + public ElkaRenderer(EntityRendererProvider.Context context) { + super(context, new ElkaModel()); + this.shadowRadius = SHADOW_RADIUS; + } +} diff --git a/common/src/main/java/com/craisinlord/antarchy/content/client/renderer/GlimmerRenderer.java b/common/src/main/java/com/craisinlord/antarchy/content/client/renderer/GlimmerRenderer.java deleted file mode 100644 index 65e3344c..00000000 --- a/common/src/main/java/com/craisinlord/antarchy/content/client/renderer/GlimmerRenderer.java +++ /dev/null @@ -1,108 +0,0 @@ -package com.craisinlord.antarchy.content.client.renderer; - -import com.craisinlord.antarchy.content.client.model.GlimmerModel; -import com.craisinlord.antarchy.content.entity.GlimmerEntity; -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; -import net.minecraft.client.renderer.texture.OverlayTexture; -import net.minecraft.resources.ResourceLocation; -import org.jetbrains.annotations.Nullable; -import software.bernie.geckolib.cache.object.BakedGeoModel; -import software.bernie.geckolib.renderer.GeoEntityRenderer; -import software.bernie.geckolib.renderer.layer.GeoRenderLayer; - -public class GlimmerRenderer extends GeoEntityRenderer { - private static final float SHADOW_RADIUS = 0.5F; - - public GlimmerRenderer(EntityRendererProvider.Context context) { - super(context, new GlimmerModel()); - this.shadowRadius = SHADOW_RADIUS; - this.addRenderLayer(new GlimmerCrossfadeLayer(this)); - this.addRenderLayer(new GlimmerEmissiveLayer(this)); - } - - @Override - public RenderType getRenderType(GlimmerEntity animatable, ResourceLocation texture, @Nullable MultiBufferSource bufferSource, float partialTick) { - return RenderType.entityTranslucent(texture); - } - - @Override - public void preRender(PoseStack poseStack, GlimmerEntity animatable, BakedGeoModel model, @Nullable MultiBufferSource bufferSource, - @Nullable VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, int colour) { - super.preRender(poseStack, animatable, model, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, colour); - this.shadowRadius = SHADOW_RADIUS; - } - - private static final class GlimmerCrossfadeLayer extends GeoRenderLayer { - private GlimmerCrossfadeLayer(GeoEntityRenderer renderer) { - super(renderer); - } - - @Override - public void render(PoseStack poseStack, GlimmerEntity animatable, BakedGeoModel bakedModel, @Nullable RenderType renderType, - MultiBufferSource bufferSource, @Nullable VertexConsumer buffer, float partialTick, - int packedLight, int packedOverlay) { - float glowBlend = animatable.getGlowBlend(partialTick); - if (glowBlend <= 0.0F || glowBlend >= 1.0F) { - return; - } - - boolean baseGlowing = glowBlend >= 0.5F; - float overlayAlpha = baseGlowing ? 1.0F - glowBlend : glowBlend; - if (overlayAlpha <= 0.0F) { - return; - } - - ResourceLocation overlayTexture = GlimmerModel.textureFor(animatable, !baseGlowing); - RenderType overlayType = RenderType.entityTranslucent(overlayTexture); - VertexConsumer overlayBuffer = bufferSource.getBuffer(overlayType); - int color = ((Math.max(0, Math.min(255, Math.round(overlayAlpha * 255.0F))) & 0xFF) << 24) | 0x00FFFFFF; - this.getRenderer().reRender( - bakedModel, - poseStack, - bufferSource, - animatable, - overlayType, - overlayBuffer, - partialTick, - packedLight, - packedOverlay, - color - ); - } - } - - private static final class GlimmerEmissiveLayer extends GeoRenderLayer { - private GlimmerEmissiveLayer(GeoEntityRenderer renderer) { - super(renderer); - } - - @Override - public void render(PoseStack poseStack, GlimmerEntity animatable, BakedGeoModel bakedModel, @Nullable RenderType renderType, - MultiBufferSource bufferSource, @Nullable VertexConsumer buffer, float partialTick, - int packedLight, int packedOverlay) { - if (!animatable.isGlowingState()) { - return; - } - - ResourceLocation texture = animatable.isBaby() ? GlimmerModel.BABY_EMISSIVE : GlimmerModel.ADULT_EMISSIVE; - RenderType emissiveType = RenderType.eyes(texture); - VertexConsumer emissiveBuffer = bufferSource.getBuffer(emissiveType); - this.getRenderer().reRender( - bakedModel, - poseStack, - bufferSource, - animatable, - emissiveType, - emissiveBuffer, - partialTick, - 0xF000F0, - OverlayTexture.NO_OVERLAY, - 0xFFFFFFFF - ); - } - } -} diff --git a/common/src/main/java/com/craisinlord/antarchy/content/client/renderer/OuranwoodDeerRenderer.java b/common/src/main/java/com/craisinlord/antarchy/content/client/renderer/OuranwoodDeerRenderer.java new file mode 100644 index 00000000..c1a1e6ce --- /dev/null +++ b/common/src/main/java/com/craisinlord/antarchy/content/client/renderer/OuranwoodDeerRenderer.java @@ -0,0 +1,15 @@ +package com.craisinlord.antarchy.content.client.renderer; + +import com.craisinlord.antarchy.content.client.model.OuranwoodDeerModel; +import com.craisinlord.antarchy.content.entity.OuranwoodDeerEntity; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import software.bernie.geckolib.renderer.GeoEntityRenderer; + +public class OuranwoodDeerRenderer extends GeoEntityRenderer { + private static final float SHADOW_RADIUS = 0.5F; + + public OuranwoodDeerRenderer(EntityRendererProvider.Context context) { + super(context, new OuranwoodDeerModel()); + this.shadowRadius = SHADOW_RADIUS; + } +} diff --git a/common/src/main/java/com/craisinlord/antarchy/content/client/renderer/PeachBoatRenderer.java b/common/src/main/java/com/craisinlord/antarchy/content/client/renderer/PeachBoatRenderer.java new file mode 100644 index 00000000..ecd6111a --- /dev/null +++ b/common/src/main/java/com/craisinlord/antarchy/content/client/renderer/PeachBoatRenderer.java @@ -0,0 +1,78 @@ +package com.craisinlord.antarchy.content.client.renderer; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.mojang.math.Axis; +import net.minecraft.client.model.BoatModel; +import net.minecraft.client.model.ChestBoatModel; +import net.minecraft.client.model.ListModel; +import net.minecraft.client.model.WaterPatchModel; +import net.minecraft.client.model.geom.ModelLayerLocation; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.entity.EntityRenderer; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.vehicle.Boat; +import org.joml.Quaternionf; + +public class PeachBoatRenderer extends EntityRenderer { + private static final String MAIN_LAYER = "main"; + private final ResourceLocation texture; + private final ListModel model; + + public PeachBoatRenderer(EntityRendererProvider.Context context, ResourceLocation texture, boolean chest) { + super(context); + this.shadowRadius = 0.8F; + this.texture = texture; + this.model = chest + ? new ChestBoatModel(context.bakeLayer(chestBoatLayer())) + : new BoatModel(context.bakeLayer(boatLayer())); + } + + public static ModelLayerLocation boatLayer() { + return new ModelLayerLocation(ResourceLocation.fromNamespaceAndPath("antarchy", "boat/peach"), MAIN_LAYER); + } + + public static ModelLayerLocation chestBoatLayer() { + return new ModelLayerLocation(ResourceLocation.fromNamespaceAndPath("antarchy", "chest_boat/peach"), MAIN_LAYER); + } + + @Override + public void render(T boat, float entityYaw, float partialTick, PoseStack poseStack, MultiBufferSource buffer, int packedLight) { + poseStack.pushPose(); + poseStack.translate(0.0F, 0.375F, 0.0F); + poseStack.mulPose(Axis.YP.rotationDegrees(180.0F - entityYaw)); + + float hurtTime = boat.getHurtTime() - partialTick; + float damage = Math.max(boat.getDamage() - partialTick, 0.0F); + if (hurtTime > 0.0F) { + poseStack.mulPose(Axis.XP.rotationDegrees(Mth.sin(hurtTime) * hurtTime * damage / 10.0F * boat.getHurtDir())); + } + + float bubbleAngle = boat.getBubbleAngle(partialTick); + if (!Mth.equal(bubbleAngle, 0.0F)) { + poseStack.mulPose(new Quaternionf().setAngleAxis(boat.getBubbleAngle(partialTick) * ((float) Math.PI / 180.0F), 1.0F, 0.0F, 1.0F)); + } + + poseStack.scale(-1.0F, -1.0F, 1.0F); + poseStack.mulPose(Axis.YP.rotationDegrees(90.0F)); + this.model.setupAnim(boat, partialTick, 0.0F, -0.1F, 0.0F, 0.0F); + VertexConsumer consumer = buffer.getBuffer(this.model.renderType(this.texture)); + this.model.renderToBuffer(poseStack, consumer, packedLight, OverlayTexture.NO_OVERLAY); + if (!boat.isUnderWater() && this.model instanceof WaterPatchModel waterPatchModel) { + VertexConsumer waterConsumer = buffer.getBuffer(RenderType.waterMask()); + waterPatchModel.waterPatch().render(poseStack, waterConsumer, packedLight, OverlayTexture.NO_OVERLAY); + } + + poseStack.popPose(); + super.render(boat, entityYaw, partialTick, poseStack, buffer, packedLight); + } + + @Override + public ResourceLocation getTextureLocation(T boat) { + return this.texture; + } +} diff --git a/common/src/main/java/com/craisinlord/antarchy/content/client/renderer/glimmer/GlimmerRenderer.java b/common/src/main/java/com/craisinlord/antarchy/content/client/renderer/glimmer/GlimmerRenderer.java new file mode 100644 index 00000000..f32df558 --- /dev/null +++ b/common/src/main/java/com/craisinlord/antarchy/content/client/renderer/glimmer/GlimmerRenderer.java @@ -0,0 +1,128 @@ +package com.craisinlord.antarchy.content.client.renderer.glimmer; + +import com.craisinlord.antarchy.content.client.model.glimmer.GlimmerFrogModel; +import com.craisinlord.antarchy.content.client.model.glimmer.GlimmerModel; +import com.craisinlord.antarchy.content.entity.glimmer.GlimmerEntity; +import com.craisinlord.antarchy.content.entity.glimmer.GlimmerVariant; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.mojang.math.Axis; +import net.minecraft.client.model.EntityModel; +import net.minecraft.client.model.geom.ModelLayers; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import org.jetbrains.annotations.Nullable; +import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.renderer.GeoEntityRenderer; +import software.bernie.geckolib.renderer.layer.GeoRenderLayer; + +public class GlimmerRenderer extends GeoEntityRenderer { + private static final float SHADOW_RADIUS = 0.0F; + private static final float COOLDOWN_DIM_MIN = 0.35F; + + private final GlimmerFrogModel frogModel; + + public GlimmerRenderer(EntityRendererProvider.Context context) { + super(context, new GlimmerModel()); + this.shadowRadius = SHADOW_RADIUS; + this.addRenderLayer(new GlimmerEmissiveLayer(this)); + this.frogModel = new GlimmerFrogModel(context.bakeLayer(ModelLayers.FROG)); + } + + @Override + public void render(GlimmerEntity entity, float entityYaw, float partialTick, PoseStack poseStack, MultiBufferSource bufferSource, int packedLight) { + if (entity.getVariant() == GlimmerVariant.FROG) { + this.renderVanillaModel(this.frogModel, entity, entityYaw, partialTick, poseStack, bufferSource, packedLight); + return; + } + super.render(entity, entityYaw, partialTick, poseStack, bufferSource, packedLight); + } + + private void renderVanillaModel(EntityModel model, GlimmerEntity entity, float entityYaw, float partialTick, + PoseStack poseStack, MultiBufferSource bufferSource, int packedLight) { + poseStack.pushPose(); + poseStack.mulPose(Axis.YP.rotationDegrees(180.0F - entityYaw)); + poseStack.scale(-1.0F, -1.0F, 1.0F); + poseStack.translate(0.0F, -1.501F, 0.0F); + + float limbSwing = entity.walkAnimation.position(partialTick); + float limbSwingAmount = entity.walkAnimation.speed(partialTick); + float ageInTicks = entity.tickCount + partialTick; + float netHeadYaw = Mth.rotLerp(partialTick, entity.yHeadRotO, entity.yHeadRot) - entityYaw; + float headPitch = Mth.lerp(partialTick, entity.xRotO, entity.getXRot()); + + model.setupAnim(entity, limbSwing, limbSwingAmount, ageInTicks, netHeadYaw, headPitch); + + int color = packColor(entity.getFadeAlpha(partialTick), brightnessFor(entity, partialTick)); + + ResourceLocation texture = entity.getVariant().getBehavior().texture(entity); + VertexConsumer buffer = bufferSource.getBuffer(RenderType.entityCutoutNoCull(texture)); + model.renderToBuffer(poseStack, buffer, packedLight, OverlayTexture.NO_OVERLAY, color); + + ResourceLocation emissiveTexture = entity.getVariant().getBehavior().emissiveTexture(entity); + VertexConsumer emissiveBuffer = bufferSource.getBuffer(RenderType.eyes(emissiveTexture)); + model.renderToBuffer(poseStack, emissiveBuffer, 0xF000F0, OverlayTexture.NO_OVERLAY, color); + + poseStack.popPose(); + } + + private static int packColor(float alpha, float brightness) { + int alphaByte = Mth.clamp(Math.round(alpha * 255.0F), 0, 255); + int colorByte = Mth.clamp(Math.round(brightness * 255.0F), 0, 255); + return (alphaByte << 24) | (colorByte << 16) | (colorByte << 8) | colorByte; + } + + private static float brightnessFor(GlimmerEntity entity, float partialTick) { + float cooldownFraction = entity.getAbilityCooldownFraction(partialTick); + return Mth.lerp(cooldownFraction, 1.0F, COOLDOWN_DIM_MIN); + } + + @Override + public RenderType getRenderType(GlimmerEntity animatable, ResourceLocation texture, @Nullable MultiBufferSource bufferSource, float partialTick) { + return RenderType.entityTranslucent(texture); + } + + @Override + public software.bernie.geckolib.util.Color getRenderColor(GlimmerEntity animatable, float partialTick, int packedLight) { + float brightness = brightnessFor(animatable, partialTick); + return software.bernie.geckolib.util.Color.ofRGBA(brightness, brightness, brightness, animatable.getFadeAlpha(partialTick)); + } + + @Override + public void preRender(PoseStack poseStack, GlimmerEntity animatable, BakedGeoModel model, @Nullable MultiBufferSource bufferSource, + @Nullable VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, int colour) { + super.preRender(poseStack, animatable, model, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, colour); + this.shadowRadius = SHADOW_RADIUS; + } + + private static final class GlimmerEmissiveLayer extends GeoRenderLayer { + private GlimmerEmissiveLayer(GeoEntityRenderer renderer) { + super(renderer); + } + + @Override + public void render(PoseStack poseStack, GlimmerEntity animatable, BakedGeoModel bakedModel, @Nullable RenderType renderType, + MultiBufferSource bufferSource, @Nullable VertexConsumer buffer, float partialTick, + int packedLight, int packedOverlay) { + ResourceLocation texture = animatable.getVariant().getBehavior().emissiveTexture(animatable); + RenderType emissiveType = RenderType.eyes(texture); + VertexConsumer emissiveBuffer = bufferSource.getBuffer(emissiveType); + this.getRenderer().reRender( + bakedModel, + poseStack, + bufferSource, + animatable, + emissiveType, + emissiveBuffer, + partialTick, + 0xF000F0, + OverlayTexture.NO_OVERLAY, + packColor(animatable.getFadeAlpha(partialTick), brightnessFor(animatable, partialTick)) + ); + } + } +} diff --git a/common/src/main/java/com/craisinlord/antarchy/content/client/screen/DorrieInventoryScreen.java b/common/src/main/java/com/craisinlord/antarchy/content/client/screen/DorrieInventoryScreen.java new file mode 100644 index 00000000..d9dfd3a9 --- /dev/null +++ b/common/src/main/java/com/craisinlord/antarchy/content/client/screen/DorrieInventoryScreen.java @@ -0,0 +1,69 @@ +package com.craisinlord.antarchy.content.client.screen; + +import com.craisinlord.antarchy.content.entity.DorrieEntity; +import com.craisinlord.antarchy.content.menu.DorrieInventoryMenu; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; +import net.minecraft.client.gui.screens.inventory.InventoryScreen; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Inventory; + +public class DorrieInventoryScreen extends AbstractContainerScreen { + private static final ResourceLocation HORSE_INVENTORY_TEXTURE = + ResourceLocation.withDefaultNamespace("textures/gui/container/horse.png"); + private static final ResourceLocation CHEST_SLOTS_SPRITE = + ResourceLocation.withDefaultNamespace("container/horse/chest_slots"); + + private static final int CHEST_SLOTS_TEX_WIDTH = 90; + private static final int CHEST_SLOTS_TEX_HEIGHT = 54; + + private float xMouse; + private float yMouse; + + public DorrieInventoryScreen(DorrieInventoryMenu menu, Inventory playerInventory, Component title) { + super(menu, playerInventory, title); + this.imageWidth = 176; + this.imageHeight = 166; + this.inventoryLabelY = this.imageHeight - 94; + } + + @Override + protected void renderBg(GuiGraphics guiGraphics, float partialTick, int mouseX, int mouseY) { + int left = this.leftPos; + int top = this.topPos; + + guiGraphics.blit(HORSE_INVENTORY_TEXTURE, left, top, 0, 0, this.imageWidth, this.imageHeight); + + int storageWidth = DorrieInventoryMenu.STORAGE_COLUMNS * 18; + guiGraphics.blitSprite(CHEST_SLOTS_SPRITE, CHEST_SLOTS_TEX_WIDTH, CHEST_SLOTS_TEX_HEIGHT, 0, 0, + left + 79, top + 17, storageWidth, CHEST_SLOTS_TEX_HEIGHT); + guiGraphics.blitSprite(CHEST_SLOTS_SPRITE, CHEST_SLOTS_TEX_WIDTH, CHEST_SLOTS_TEX_HEIGHT, 0, 0, + left + 7, top + 17, 18, 18); + + DorrieEntity dorrie = this.menu.dorrie(); + if (dorrie != null) { + InventoryScreen.renderEntityInInventoryFollowsMouse( + guiGraphics, + left + 8, + top + 18, + left + 71, + top + 70, + 24, + 0.25F, + this.xMouse, + this.yMouse, + dorrie + ); + } + } + + @Override + public void render(GuiGraphics guiGraphics, int mouseX, int mouseY, float partialTick) { + this.xMouse = mouseX; + this.yMouse = mouseY; + this.renderBackground(guiGraphics, mouseX, mouseY, partialTick); + super.render(guiGraphics, mouseX, mouseY, partialTick); + this.renderTooltip(guiGraphics, mouseX, mouseY); + } +} diff --git a/common/src/main/java/com/craisinlord/antarchy/content/effect/GlimmersGraceMobEffect.java b/common/src/main/java/com/craisinlord/antarchy/content/effect/GlimmersGraceMobEffect.java deleted file mode 100644 index 4a44f095..00000000 --- a/common/src/main/java/com/craisinlord/antarchy/content/effect/GlimmersGraceMobEffect.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.craisinlord.antarchy.content.effect; - -import com.craisinlord.antarchy.Antarchy; -import com.craisinlord.antarchy.content.GlimmerParticles; -import net.minecraft.core.Holder; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.effect.MobEffect; -import net.minecraft.world.effect.MobEffectCategory; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.ai.attributes.Attribute; -import net.minecraft.world.entity.ai.attributes.AttributeInstance; -import net.minecraft.world.entity.ai.attributes.AttributeMap; -import net.minecraft.world.entity.ai.attributes.AttributeModifier; -import net.minecraft.world.entity.ai.attributes.Attributes; - -public final class GlimmersGraceMobEffect extends MobEffect { - private static final ResourceLocation SPEED_MODIFIER_ID = - ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "glimmers_grace_speed"); - private static final ResourceLocation JUMP_MODIFIER_ID = - ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "glimmers_grace_jump"); - private static final ResourceLocation FALL_DAMAGE_MODIFIER_ID = - ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "glimmers_grace_fall_damage"); - - public GlimmersGraceMobEffect() { - super(MobEffectCategory.BENEFICIAL, 0x7FDBFF); - } - - @Override - public void addAttributeModifiers(AttributeMap attributeMap, int amplifier) { - addModifier(attributeMap, Attributes.MOVEMENT_SPEED, SPEED_MODIFIER_ID, 0.35D * (amplifier + 1)); - addModifier(attributeMap, Attributes.JUMP_STRENGTH, JUMP_MODIFIER_ID, 0.5D * (amplifier + 1)); - addModifier(attributeMap, Attributes.FALL_DAMAGE_MULTIPLIER, FALL_DAMAGE_MODIFIER_ID, -0.6D * (amplifier + 1)); - } - - @Override - public void removeAttributeModifiers(AttributeMap attributeMap) { - removeModifier(attributeMap, Attributes.MOVEMENT_SPEED, SPEED_MODIFIER_ID); - removeModifier(attributeMap, Attributes.JUMP_STRENGTH, JUMP_MODIFIER_ID); - removeModifier(attributeMap, Attributes.FALL_DAMAGE_MULTIPLIER, FALL_DAMAGE_MODIFIER_ID); - } - - @Override - public boolean shouldApplyEffectTickThisTick(int duration, int amplifier) { - return true; - } - - @Override - public boolean applyEffectTick(LivingEntity livingEntity, int amplifier) { - GlimmerParticles.tickAmbient(livingEntity, livingEntity.getDeltaMovement().horizontalDistanceSqr() > 0.01D); - return true; - } - - private static void addModifier(AttributeMap attributeMap, Holder attribute, ResourceLocation id, double amount) { - AttributeInstance instance = attributeMap.getInstance(attribute); - if (instance == null) { - return; - } - instance.addTransientModifier(new AttributeModifier(id, amount, AttributeModifier.Operation.ADD_MULTIPLIED_TOTAL)); - } - - private static void removeModifier(AttributeMap attributeMap, Holder attribute, ResourceLocation id) { - AttributeInstance instance = attributeMap.getInstance(attribute); - if (instance == null) { - return; - } - instance.removeModifier(id); - } -} diff --git a/common/src/main/java/com/craisinlord/antarchy/content/entity/DorrieEntity.java b/common/src/main/java/com/craisinlord/antarchy/content/entity/DorrieEntity.java index 67a28023..00b629fb 100644 --- a/common/src/main/java/com/craisinlord/antarchy/content/entity/DorrieEntity.java +++ b/common/src/main/java/com/craisinlord/antarchy/content/entity/DorrieEntity.java @@ -6,6 +6,7 @@ import java.util.List; import net.minecraft.core.BlockPos; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.network.syncher.EntityDataSerializers; import net.minecraft.network.syncher.SynchedEntityData; @@ -42,6 +43,8 @@ import net.minecraft.world.entity.animal.Animal; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; +import net.minecraft.world.SimpleContainer; +import net.minecraft.world.SimpleMenuProvider; import net.minecraft.world.level.Level; import net.minecraft.world.level.pathfinder.PathType; import net.minecraft.world.phys.Vec3; @@ -57,6 +60,9 @@ import software.bernie.geckolib.util.GeckoLibUtil; public class DorrieEntity extends Animal implements GeoEntity { private static final ResourceLocation CHEEP_ITEM_ID = ResourceLocation.fromNamespaceAndPath("antarchy", "cheep"); + private static final String INVENTORY_TAG = "Inventory"; + private static final int SADDLE_SLOT = 0; + private static final int INVENTORY_SIZE = 17; private static final EntityDataAccessor HAS_SADDLE = SynchedEntityData.defineId(DorrieEntity.class, EntityDataSerializers.BOOLEAN); @@ -67,12 +73,13 @@ public class DorrieEntity extends Animal implements GeoEntity { private static final EntityDataAccessor QUIRK_TICKS = SynchedEntityData.defineId(DorrieEntity.class, EntityDataSerializers.INT); - private static final int MAX_CHARGE_TICKS = 40; - private static final float WATER_RIDE_SPEED = 0.78F; - private static final float LAND_BEACH_SPEED = 0.10F; + private static final int MAX_CHARGE_TICKS = 90; + private static final float WATER_RIDE_SPEED = 0.42F; + private static final float LAND_BEACH_SPEED = 0.07F; + private static final double ASCEND_SPEED = 0.06D; private static final int QUIRK_DURATION_TICKS = 65; - private static final int MIN_QUIRK_COOLDOWN_TICKS = 140; - private static final int MAX_QUIRK_COOLDOWN_TICKS = 260; + private static final int MIN_QUIRK_COOLDOWN_TICKS = 260; + private static final int MAX_QUIRK_COOLDOWN_TICKS = 420; private static final double MOVING_ANIM_THRESHOLD_SQ = 0.0025D; private static final RawAnimation IDLE_GROUND_ANIM = RawAnimation.begin().thenLoop("idle_ground"); @@ -87,6 +94,13 @@ public class DorrieEntity extends Animal implements GeoEntity { private final AnimatableInstanceCache geoCache = GeckoLibUtil.createInstanceCache(this); private final MoveControl landMoveControl; private final MoveControl waterMoveControl; + private final SimpleContainer inventory = new SimpleContainer(INVENTORY_SIZE) { + @Override + public void setChanged() { + super.setChanged(); + DorrieEntity.this.onInventoryChanged(); + } + }; private static final int RIDES_TO_TAME = 4; private static final int BUCK_DELAY_TICKS = 60; @@ -101,6 +115,7 @@ public class DorrieEntity extends Animal implements GeoEntity { private int swimForwardTicks = 0; private int quirkCooldownTicks = MIN_QUIRK_COOLDOWN_TICKS; private boolean usingLandNavigation = true; + private boolean pressingJump = false; public DorrieEntity(EntityType entityType, Level level) { super(entityType, level); @@ -131,8 +146,8 @@ public class DorrieEntity extends Animal implements GeoEntity { this.goalSelector.addGoal(0, new TryFindWaterGoal(this)); this.goalSelector.addGoal(1, new HuntCheepGoal(this)); this.goalSelector.addGoal(2, new DolphinSwimGoal()); - this.goalSelector.addGoal(3, new RandomSwimmingGoal(this, 1.35D, 8)); - this.goalSelector.addGoal(4, new WaterAvoidingRandomStrollGoal(this, 0.72D, 40)); + this.goalSelector.addGoal(3, new RandomSwimmingGoal(this, 1.45D, 4)); + this.goalSelector.addGoal(4, new WaterAvoidingRandomStrollGoal(this, 0.9D, 10)); this.goalSelector.addGoal(5, new LookAtPlayerGoal(this, Player.class, 6.0F)); this.goalSelector.addGoal(6, new RandomLookAroundGoal(this)); } @@ -153,6 +168,10 @@ public class DorrieEntity extends Animal implements GeoEntity { this.entityData.set(HAS_SADDLE, saddle); } + public SimpleContainer inventory() { + return this.inventory; + } + public boolean isTamed() { return this.entityData.get(TAMED); } @@ -181,16 +200,38 @@ public class DorrieEntity extends Animal implements GeoEntity { public void addAdditionalSaveData(CompoundTag tag) { super.addAdditionalSaveData(tag); tag.putBoolean("Tamed", this.isTamed()); - tag.putBoolean("HasSaddle", this.hasSaddle()); tag.putInt("RideAttempts", this.rideAttempts); + ListTag inventoryTag = new ListTag(); + for (int slot = 0; slot < this.inventory.getContainerSize(); slot++) { + ItemStack stack = this.inventory.getItem(slot); + if (stack.isEmpty()) { + continue; + } + + CompoundTag stackTag = new CompoundTag(); + stackTag.putByte("Slot", (byte) slot); + stackTag.put("Item", stack.save(this.registryAccess())); + inventoryTag.add(stackTag); + } + tag.put(INVENTORY_TAG, inventoryTag); } @Override public void readAdditionalSaveData(CompoundTag tag) { super.readAdditionalSaveData(tag); this.setTamed(tag.getBoolean("Tamed")); - this.setSaddle(tag.getBoolean("HasSaddle")); this.rideAttempts = tag.getInt("RideAttempts"); + this.inventory.clearContent(); + ListTag inventoryTag = tag.getList(INVENTORY_TAG, 10); + for (int i = 0; i < inventoryTag.size(); i++) { + CompoundTag stackTag = inventoryTag.getCompound(i); + int slot = stackTag.getByte("Slot") & 255; + if (slot < 0 || slot >= this.inventory.getContainerSize()) { + continue; + } + this.inventory.setItem(slot, ItemStack.parseOptional(this.registryAccess(), stackTag.getCompound("Item"))); + } + this.syncSaddleState(); } @Override @@ -204,38 +245,24 @@ public class DorrieEntity extends Animal implements GeoEntity { return InteractionResult.sidedSuccess(this.level().isClientSide); } - if (this.hasSaddle() && !player.isPassengerOfSameVehicle(this)) { - if (!stack.isEmpty()) { - return super.mobInteract(player, hand); - } - - if (!player.isShiftKeyDown()) { - if (!this.level().isClientSide) { - player.startRiding(this); - } - return InteractionResult.sidedSuccess(this.level().isClientSide); - } + if (player.isSecondaryUseActive()) { + this.openInventory(player); + return InteractionResult.sidedSuccess(this.level().isClientSide); + } + if (this.hasSaddle() && stack.isEmpty() && !player.isPassengerOfSameVehicle(this)) { if (!this.level().isClientSide) { - this.setSaddle(false); - this.spawnAtLocation(new ItemStack(Items.SADDLE)); - this.playSound(SoundEvents.HORSE_SADDLE, 1.0F, 1.0F); + player.startRiding(this); } return InteractionResult.sidedSuccess(this.level().isClientSide); } - if (!this.hasSaddle() && stack.is(Items.SADDLE)) { - if (!this.level().isClientSide) { - this.setSaddle(true); - if (!player.getAbilities().instabuild) { - stack.shrink(1); - } - this.playSound(SoundEvents.HORSE_SADDLE, 1.0F, 1.0F); - } - return InteractionResult.sidedSuccess(this.level().isClientSide); + if (!stack.isEmpty() && this.isFood(stack)) { + return super.mobInteract(player, hand); } - return super.mobInteract(player, hand); + this.openInventory(player); + return InteractionResult.sidedSuccess(this.level().isClientSide); } @Override @@ -268,7 +295,7 @@ public class DorrieEntity extends Animal implements GeoEntity { @Override protected float getRiddenSpeed(Player player) { float speed = (this.isInWater() || this.isInLava()) - ? WATER_RIDE_SPEED * (1.0F + Math.min(this.swimForwardTicks, 60) * 0.03F) + ? WATER_RIDE_SPEED * (1.0F + Math.min(this.swimForwardTicks, 60) * 0.0125F) : LAND_BEACH_SPEED; return (float) this.getAttributeValue(Attributes.MOVEMENT_SPEED) * speed; } @@ -300,6 +327,10 @@ public class DorrieEntity extends Animal implements GeoEntity { this.swimForwardTicks = 0; } + if (this.isVehicle() && this.getQuirkTicks() > 0) { + this.setQuirkTicks(0); + } + if (!this.level().isClientSide && !this.isTamed() && this.getFirstPassenger() instanceof Player rider) { buckTimer++; if (buckTimer >= BUCK_DELAY_TICKS) { @@ -338,7 +369,9 @@ public class DorrieEntity extends Animal implements GeoEntity { wasInAir = inAirNow; } - public void setPressingJump(boolean pressing) {} + public void setPressingJump(boolean pressing) { + this.pressingJump = pressing; + } public void startJumpCharge() { if (!this.level().isClientSide) { @@ -365,16 +398,22 @@ public class DorrieEntity extends Animal implements GeoEntity { Vec3 riddenInput = this.getRiddenInput(rider, travelVector); this.setSpeed(this.getRiddenSpeed(rider)); + if (this.isLeaping) { + super.travel(travelVector); + return; + } + if (this.isInWater() || this.isInLava()) { this.moveRelative(this.getSpeed(), new Vec3(riddenInput.x, 0.0D, riddenInput.z)); Vec3 motion = this.getDeltaMovement(); double vertical = 0.0D; - if (!this.isLeaping) { - if (this.isUnderWater()) { - vertical = riddenInput.y * 0.025D; - } else if (riddenInput.y < 0.0D) { - vertical = riddenInput.y * 0.02D; - } + if (this.isUnderWater()) { + vertical = riddenInput.y * 0.025D; + } else if (riddenInput.y < 0.0D) { + vertical = riddenInput.y * 0.02D; + } + if (this.pressingJump) { + vertical += ASCEND_SPEED; } this.setDeltaMovement( motion.x * 0.92D, @@ -396,7 +435,7 @@ public class DorrieEntity extends Animal implements GeoEntity { Vec3 look = this.getLookAngle(); Vec3 current = this.getDeltaMovement(); double forwardAdd = 0.18D + power * 0.42D; - double vertical = 0.28D + power * 0.62D; + double vertical = 0.85D + power * 1.35D; this.setDeltaMovement( current.x + look.x * forwardAdd, current.y + vertical, @@ -429,9 +468,34 @@ public class DorrieEntity extends Animal implements GeoEntity { @Override protected void dropEquipment() { super.dropEquipment(); - if (this.hasSaddle()) { - this.spawnAtLocation(new ItemStack(Items.SADDLE)); + if (this.level().isClientSide) { + return; } + for (int slot = 0; slot < this.inventory.getContainerSize(); slot++) { + ItemStack stack = this.inventory.removeItemNoUpdate(slot); + if (!stack.isEmpty()) { + this.spawnAtLocation(stack); + } + } + } + + private void onInventoryChanged() { + this.syncSaddleState(); + } + + private void syncSaddleState() { + ItemStack saddleStack = this.inventory.getItem(SADDLE_SLOT); + this.setSaddle(!saddleStack.isEmpty() && saddleStack.is(Items.SADDLE)); + } + + private void openInventory(Player player) { + if (this.level().isClientSide) { + return; + } + player.openMenu(new SimpleMenuProvider( + (containerId, playerInventory, ignored) -> new com.craisinlord.antarchy.content.menu.DorrieInventoryMenu(containerId, playerInventory, this.inventory, this), + this.getDisplayName() + )); } @Override @@ -567,7 +631,7 @@ public class DorrieEntity extends Animal implements GeoEntity { private boolean canUseQuirkAnimation() { return this.isInWater() && !this.isUnderWater() - && this.getControllingPassenger() == null + && !this.isVehicle() && !this.isLeaping && this.landAnimTicks <= 0 && !this.isCharging @@ -653,7 +717,7 @@ public class DorrieEntity extends Animal implements GeoEntity { private class DolphinSwimGoal extends Goal { private static final int COOLDOWN_MIN_TICKS = 120; - private static final int COOLDOWN_MAX_TICKS = 240; + private static final int COOLDOWN_MAX_TICKS = 180; private static final int DIVE_MIN_TICKS = 50; private static final int DIVE_MAX_TICKS = 110; private static final int ROAM_MIN_TICKS = 70; @@ -691,7 +755,7 @@ public class DorrieEntity extends Animal implements GeoEntity { this.cooldownTicks--; return false; } - if (DorrieEntity.this.random.nextInt(6) != 0) { + if (DorrieEntity.this.random.nextInt(3) != 0) { return false; } this.targetPos = DorrieEntity.this.isUnderWater() diff --git a/common/src/main/java/com/craisinlord/antarchy/content/entity/ElkaEntity.java b/common/src/main/java/com/craisinlord/antarchy/content/entity/ElkaEntity.java new file mode 100644 index 00000000..0a3ea56e --- /dev/null +++ b/common/src/main/java/com/craisinlord/antarchy/content/entity/ElkaEntity.java @@ -0,0 +1,448 @@ +package com.craisinlord.antarchy.content.entity; + +import com.craisinlord.antarchy.content.AntarchyObjects; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.syncher.EntityDataAccessor; +import net.minecraft.network.syncher.EntityDataSerializers; +import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.tags.BlockTags; +import net.minecraft.util.Mth; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.AgeableMob; +import net.minecraft.world.entity.EntityDimensions; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.Pose; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.goal.BreedGoal; +import net.minecraft.world.entity.ai.goal.FloatGoal; +import net.minecraft.world.entity.ai.goal.Goal; +import net.minecraft.world.entity.ai.goal.LookAtPlayerGoal; +import net.minecraft.world.entity.ai.goal.MeleeAttackGoal; +import net.minecraft.world.entity.ai.goal.RandomLookAroundGoal; +import net.minecraft.world.entity.ai.goal.TemptGoal; +import net.minecraft.world.entity.ai.goal.WaterAvoidingRandomStrollGoal; +import net.minecraft.world.entity.ai.goal.target.HurtByTargetGoal; +import net.minecraft.world.entity.animal.Animal; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.core.BlockPos; +import software.bernie.geckolib.animatable.GeoEntity; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.animation.AnimationController; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.animation.PlayState; +import software.bernie.geckolib.animation.RawAnimation; +import software.bernie.geckolib.util.GeckoLibUtil; + +public class ElkaEntity extends Animal implements GeoEntity { + private static final EntityDataAccessor SITTING = + SynchedEntityData.defineId(ElkaEntity.class, EntityDataSerializers.BOOLEAN); + private static final EntityDataAccessor QUIRK_TICKS = + SynchedEntityData.defineId(ElkaEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor QUIRK_VARIANT = + SynchedEntityData.defineId(ElkaEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor ATTACK_TICKS = + SynchedEntityData.defineId(ElkaEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor CRY_TICKS = + SynchedEntityData.defineId(ElkaEntity.class, EntityDataSerializers.INT); + + private static final String SITTING_KEY = "Sitting"; + private static final String SIT_TICKS_KEY = "SitTicks"; + private static final String SIT_COOLDOWN_KEY = "SitCooldown"; + private static final String QUIRK_TICKS_KEY = "QuirkTicks"; + private static final String QUIRK_VARIANT_KEY = "QuirkVariant"; + + private static final String MAIN_CONTROLLER = "main_controller"; + private static final String SIT_TRANSITION_CONTROLLER = "sit_transition_controller"; + private static final String START_SIT_TRIGGER = "start_sit"; + private static final String GET_UP_TRIGGER = "get_up"; + + private static final int IDLE_ANIMATION_CYCLE_TICKS = 60; + private static final int QUIRK_ANIMATION_TICKS = 40; + private static final int QUIRK_CHANCE = 60; + private static final int SIT_MIN_TICKS = 20 * 60; + private static final int SIT_MAX_TICKS = 20 * 60 * 3; + private static final int SIT_COOLDOWN_TICKS = 20 * 60 * 6; + private static final int SIT_CHECK_CHANCE_SHADE = 300; + private static final int SIT_CHECK_CHANCE_OPEN = 1200; + private static final int ATTACK_ANIM_TICKS = 20; + private static final int CRY_ANIM_TICKS = 60; + + private static final RawAnimation WALK_ANIM = RawAnimation.begin().thenLoop("walk"); + private static final RawAnimation IDLE_ANIM = RawAnimation.begin().thenLoop("idle"); + private static final RawAnimation SIT_IDLE_ANIM = RawAnimation.begin().thenLoop("sit_idle"); + private static final RawAnimation QUIRK_ANIM = RawAnimation.begin().thenPlay("quirk"); + private static final RawAnimation QUIRK_2_ANIM = RawAnimation.begin().thenPlay("quirk_2"); + private static final RawAnimation QUIRK_3_ANIM = RawAnimation.begin().thenPlay("quirk_3"); + private static final RawAnimation ATTACK_ANIM = RawAnimation.begin().thenPlay("attack"); + private static final RawAnimation CRY_ANIM = RawAnimation.begin().thenPlay("cry"); + private static final RawAnimation START_SIT_ANIM = RawAnimation.begin().thenPlay("sit"); + private static final RawAnimation GET_UP_ANIM = RawAnimation.begin().thenPlay("get_up"); + + private final AnimatableInstanceCache geoCache = GeckoLibUtil.createInstanceCache(this); + private int sitTicksRemaining; + private int sitCooldownTicks; + private int idleAnimationCycleTicks; + + public ElkaEntity(EntityType entityType, net.minecraft.world.level.Level level) { + super(entityType, level); + this.sitCooldownTicks = SIT_COOLDOWN_TICKS; + } + + public static AttributeSupplier.Builder createAttributes() { + return Mob.createMobAttributes() + .add(Attributes.MAX_HEALTH, 34.0D) + .add(Attributes.MOVEMENT_SPEED, 0.22D) + .add(Attributes.ATTACK_DAMAGE, 7.0D) + .add(Attributes.FOLLOW_RANGE, 24.0D) + .add(Attributes.KNOCKBACK_RESISTANCE, 0.3D); + } + + @Override + protected void defineSynchedData(SynchedEntityData.Builder builder) { + super.defineSynchedData(builder); + builder.define(SITTING, false); + builder.define(QUIRK_TICKS, 0); + builder.define(QUIRK_VARIANT, 0); + builder.define(ATTACK_TICKS, 0); + builder.define(CRY_TICKS, 0); + } + + @Override + protected void registerGoals() { + this.goalSelector.addGoal(0, new FloatGoal(this)); + if (!this.isBaby()) { + this.goalSelector.addGoal(1, new MeleeAttackGoal(this, 1.2D, true)); + } + this.goalSelector.addGoal(2, new BreedGoal(this, 1.0D)); + this.goalSelector.addGoal(3, new TemptGoal(this, 1.1D, Ingredient.of(AntarchyObjects.PEACH.get()), false)); + this.goalSelector.addGoal(4, new ElkaSitGoal()); + this.goalSelector.addGoal(5, new WaterAvoidingRandomStrollGoal(this, 1.0D)); + this.goalSelector.addGoal(6, new LookAtPlayerGoal(this, Player.class, 8.0F)); + this.goalSelector.addGoal(7, new RandomLookAroundGoal(this)); + this.targetSelector.addGoal(1, new ElkaHurtByTargetGoal(this)); + } + + @Override + public boolean isFood(ItemStack stack) { + return stack.is(AntarchyObjects.PEACH.get()); + } + + @Override + public ElkaEntity getBreedOffspring(ServerLevel level, AgeableMob otherParent) { + return AntarchyObjects.ELKA.get().create(level); + } + + @Override + public boolean requiresCustomPersistence() { + return true; + } + + @Override + public boolean removeWhenFarAway(double distanceToClosestPlayer) { + return false; + } + + public boolean isSitting() { + return this.entityData.get(SITTING); + } + + private void startSitting() { + this.entityData.set(SITTING, true); + this.sitTicksRemaining = Mth.nextInt(this.random, SIT_MIN_TICKS, SIT_MAX_TICKS); + this.getNavigation().stop(); + if (!this.level().isClientSide) { + this.triggerAnim(SIT_TRANSITION_CONTROLLER, START_SIT_TRIGGER); + } + } + + private void stopSitting() { + if (!this.isSitting()) { + return; + } + this.entityData.set(SITTING, false); + this.sitTicksRemaining = 0; + this.sitCooldownTicks = SIT_COOLDOWN_TICKS; + if (!this.level().isClientSide) { + this.triggerAnim(SIT_TRANSITION_CONTROLLER, GET_UP_TRIGGER); + } + } + + private boolean isEligibleToSit() { + return this.onGround() + && !this.isInWaterOrBubble() + && !this.isOnFire() + && !this.isLeashed() + && !this.isPassenger() + && !this.isVehicle() + && !this.isInLove() + && !this.isBaby() + && this.getTarget() == null + && this.getDeltaMovement().horizontalDistanceSqr() < 1.0E-4D + && this.getNavigation().isDone(); + } + + private boolean isNearShade() { + BlockPos base = this.blockPosition(); + for (BlockPos pos : BlockPos.betweenClosed(base.offset(-3, -1, -3), base.offset(3, 3, 3))) { + if (this.level().getBlockState(pos).is(BlockTags.LEAVES)) { + return true; + } + } + return false; + } + + private void tickSitDecision() { + if (this.isSitting()) { + if (this.getTarget() != null || this.isInWaterOrBubble() || this.isOnFire() || this.hurtTime > 0 + || this.isLeashed() || this.isPassenger() || this.isVehicle() || this.isInLove() || !this.onGround()) { + this.stopSitting(); + return; + } + if (this.sitTicksRemaining > 0) { + this.sitTicksRemaining--; + if (this.sitTicksRemaining <= 0) { + this.stopSitting(); + } + } + return; + } + + if (this.sitCooldownTicks > 0) { + this.sitCooldownTicks--; + return; + } + + if (!this.isEligibleToSit()) { + return; + } + + int chance = this.isNearShade() ? SIT_CHECK_CHANCE_SHADE : SIT_CHECK_CHANCE_OPEN; + if (this.random.nextInt(chance) == 0) { + this.startSitting(); + } + } + + private void tickIdleQuirk() { + if (this.entityData.get(QUIRK_TICKS) > 0 || this.getDeltaMovement().horizontalDistanceSqr() > 1.0E-4D + || this.getTarget() != null) { + this.idleAnimationCycleTicks = 0; + return; + } + + this.idleAnimationCycleTicks++; + if (this.idleAnimationCycleTicks < IDLE_ANIMATION_CYCLE_TICKS) { + return; + } + this.idleAnimationCycleTicks = 0; + + if (this.random.nextInt(QUIRK_CHANCE) != 0) { + return; + } + + this.entityData.set(QUIRK_TICKS, QUIRK_ANIMATION_TICKS); + if (this.isBaby()) { + this.entityData.set(QUIRK_VARIANT, 0); + } else if (this.isSitting()) { + this.entityData.set(QUIRK_VARIANT, 2); + } else { + this.entityData.set(QUIRK_VARIANT, this.random.nextBoolean() ? 0 : 1); + } + } + + public void triggerCry() { + this.entityData.set(CRY_TICKS, CRY_ANIM_TICKS); + } + + public void triggerAttackAnim() { + this.entityData.set(ATTACK_TICKS, ATTACK_ANIM_TICKS); + } + + @Override + public boolean doHurtTarget(net.minecraft.world.entity.Entity target) { + boolean hurt = super.doHurtTarget(target); + if (hurt) { + this.triggerAttackAnim(); + } + return hurt; + } + + @Override + public void tick() { + super.tick(); + + if (this.level().isClientSide) { + return; + } + + int quirkTicks = this.entityData.get(QUIRK_TICKS); + if (quirkTicks > 0) { + this.entityData.set(QUIRK_TICKS, quirkTicks - 1); + } + + int attackTicks = this.entityData.get(ATTACK_TICKS); + if (attackTicks > 0) { + this.entityData.set(ATTACK_TICKS, attackTicks - 1); + } + + int cryTicks = this.entityData.get(CRY_TICKS); + if (cryTicks > 0) { + this.entityData.set(CRY_TICKS, cryTicks - 1); + } + + this.tickSitDecision(); + this.tickIdleQuirk(); + } + + @Override + public boolean hurt(DamageSource source, float amount) { + this.stopSitting(); + return super.hurt(source, amount); + } + + @Override + public EntityDimensions getDefaultDimensions(Pose pose) { + return this.isBaby() + ? EntityDimensions.scalable(1.0F, 1.5F) + : EntityDimensions.scalable(2.2F, 2.75F); + } + + @Override + protected void ageBoundaryReached() { + super.ageBoundaryReached(); + this.refreshDimensions(); + } + + @Override + public void addAdditionalSaveData(CompoundTag tag) { + super.addAdditionalSaveData(tag); + tag.putBoolean(SITTING_KEY, this.isSitting()); + tag.putInt(SIT_TICKS_KEY, this.sitTicksRemaining); + tag.putInt(SIT_COOLDOWN_KEY, this.sitCooldownTicks); + tag.putInt(QUIRK_TICKS_KEY, this.entityData.get(QUIRK_TICKS)); + tag.putInt(QUIRK_VARIANT_KEY, this.entityData.get(QUIRK_VARIANT)); + } + + @Override + public void readAdditionalSaveData(CompoundTag tag) { + super.readAdditionalSaveData(tag); + this.entityData.set(SITTING, tag.getBoolean(SITTING_KEY)); + this.sitTicksRemaining = tag.getInt(SIT_TICKS_KEY); + this.sitCooldownTicks = tag.contains(SIT_COOLDOWN_KEY) ? tag.getInt(SIT_COOLDOWN_KEY) : SIT_COOLDOWN_TICKS; + this.entityData.set(QUIRK_TICKS, tag.getInt(QUIRK_TICKS_KEY)); + this.entityData.set(QUIRK_VARIANT, tag.getInt(QUIRK_VARIANT_KEY)); + } + + @Override + protected SoundEvent getAmbientSound() { + return SoundEvents.PANDA_AMBIENT; + } + + @Override + protected SoundEvent getHurtSound(DamageSource damageSource) { + return SoundEvents.PANDA_BITE; + } + + @Override + protected SoundEvent getDeathSound() { + return SoundEvents.PANDA_DEATH; + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar controllers) { + controllers.add(new AnimationController<>(this, MAIN_CONTROLLER, 0, this::mainAnimController)); + if (!this.isBaby()) { + controllers.add(new AnimationController<>(this, SIT_TRANSITION_CONTROLLER, 0, state -> PlayState.STOP) + .triggerableAnim(START_SIT_TRIGGER, START_SIT_ANIM) + .triggerableAnim(GET_UP_TRIGGER, GET_UP_ANIM)); + } + } + + private PlayState mainAnimController(AnimationState state) { + if (this.entityData.get(ATTACK_TICKS) > 0) { + return state.setAndContinue(ATTACK_ANIM); + } + if (this.entityData.get(CRY_TICKS) > 0) { + return state.setAndContinue(CRY_ANIM); + } + if (state.isMoving()) { + return state.setAndContinue(WALK_ANIM); + } + if (this.entityData.get(QUIRK_TICKS) > 0) { + return switch (this.entityData.get(QUIRK_VARIANT)) { + case 1 -> state.setAndContinue(QUIRK_2_ANIM); + case 2 -> state.setAndContinue(QUIRK_3_ANIM); + default -> state.setAndContinue(QUIRK_ANIM); + }; + } + if (this.isSitting()) { + return state.setAndContinue(SIT_IDLE_ANIM); + } + return state.setAndContinue(IDLE_ANIM); + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return this.geoCache; + } + + private final class ElkaSitGoal extends Goal { + private ElkaSitGoal() { + this.setFlags(java.util.EnumSet.of(Flag.MOVE, Flag.JUMP, Flag.LOOK)); + } + + @Override + public boolean canUse() { + return ElkaEntity.this.isSitting(); + } + + @Override + public boolean canContinueToUse() { + return ElkaEntity.this.isSitting(); + } + + @Override + public void start() { + ElkaEntity.this.getNavigation().stop(); + ElkaEntity.this.setDeltaMovement(0.0D, ElkaEntity.this.getDeltaMovement().y, 0.0D); + } + + @Override + public void tick() { + ElkaEntity.this.getNavigation().stop(); + ElkaEntity.this.setZza(0.0F); + ElkaEntity.this.setXxa(0.0F); + } + } + + private static final class ElkaHurtByTargetGoal extends HurtByTargetGoal { + private ElkaHurtByTargetGoal(ElkaEntity elka) { + super(elka); + } + + @Override + public void start() { + super.start(); + if (this.mob instanceof ElkaEntity elka && elka.isBaby()) { + this.alertOthers(); + this.stop(); + } + } + + @Override + protected void alertOther(Mob mob, LivingEntity target) { + if (mob instanceof ElkaEntity elka && !elka.isBaby()) { + elka.triggerCry(); + super.alertOther(mob, target); + } + } + } +} diff --git a/common/src/main/java/com/craisinlord/antarchy/content/entity/ElythiaFrog.java b/common/src/main/java/com/craisinlord/antarchy/content/entity/ElythiaFrog.java new file mode 100644 index 00000000..5a1a130b --- /dev/null +++ b/common/src/main/java/com/craisinlord/antarchy/content/entity/ElythiaFrog.java @@ -0,0 +1,38 @@ +package com.craisinlord.antarchy.content.entity; + +import com.craisinlord.antarchy.Antarchy; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.animal.FrogVariant; +import net.minecraft.world.entity.animal.frog.Frog; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.ServerLevelAccessor; + +public final class ElythiaFrog { + public static final ResourceKey ELYTHIA = ResourceKey.create( + net.minecraft.core.registries.Registries.DIMENSION, + ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "elythia") + ); + public static final ResourceKey VARIANT = ResourceKey.create( + net.minecraft.core.registries.Registries.FROG_VARIANT, + ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "elythia") + ); + public static final ResourceLocation TEXTURE = + ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "textures/entity/frog/frog_elythia.png"); + + private ElythiaFrog() { + } + + public static boolean shouldBecomeElythiaFrog(ServerLevelAccessor level) { + return level.getLevel().dimension().equals(ELYTHIA); + } + + public static void applyVariant(Frog frog) { + BuiltInRegistries.FROG_VARIANT.getHolder(VARIANT).ifPresent(frog::setVariant); + } + + public static boolean isElythiaFrog(Frog frog) { + return frog.getVariant().unwrapKey().filter(VARIANT::equals).isPresent(); + } +} diff --git a/common/src/main/java/com/craisinlord/antarchy/content/entity/GlimmerEntity.java b/common/src/main/java/com/craisinlord/antarchy/content/entity/GlimmerEntity.java deleted file mode 100644 index 79732784..00000000 --- a/common/src/main/java/com/craisinlord/antarchy/content/entity/GlimmerEntity.java +++ /dev/null @@ -1,430 +0,0 @@ -package com.craisinlord.antarchy.content.entity; - -import com.craisinlord.antarchy.config.AntarchySettings; -import com.craisinlord.antarchy.content.AntarchyObjects; -import com.craisinlord.antarchy.content.AntarchyTags; -import com.craisinlord.antarchy.content.GlimmerParticles; -import java.util.EnumSet; -import java.util.HashMap; -import java.util.Map; -import java.util.UUID; -import net.minecraft.core.BlockPos; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.ListTag; -import net.minecraft.network.syncher.EntityDataAccessor; -import net.minecraft.network.syncher.EntityDataSerializers; -import net.minecraft.network.syncher.SynchedEntityData; -import net.minecraft.sounds.SoundEvent; -import net.minecraft.sounds.SoundEvents; -import net.minecraft.world.DifficultyInstance; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; -import net.minecraft.world.damagesource.DamageSource; -import net.minecraft.world.effect.MobEffectInstance; -import net.minecraft.world.entity.AgeableMob; -import net.minecraft.world.entity.EntityType; -import net.minecraft.world.entity.MobSpawnType; -import net.minecraft.world.entity.SpawnGroupData; -import net.minecraft.world.entity.ai.attributes.AttributeSupplier; -import net.minecraft.world.entity.ai.attributes.Attributes; -import net.minecraft.world.entity.ai.goal.FloatGoal; -import net.minecraft.world.entity.ai.goal.FollowParentGoal; -import net.minecraft.world.entity.ai.goal.Goal; -import net.minecraft.world.entity.ai.goal.LookAtPlayerGoal; -import net.minecraft.world.entity.ai.goal.PanicGoal; -import net.minecraft.world.entity.ai.goal.RandomLookAroundGoal; -import net.minecraft.world.entity.ai.goal.TemptGoal; -import net.minecraft.world.entity.ai.goal.WaterAvoidingRandomStrollGoal; -import net.minecraft.world.entity.ai.util.DefaultRandomPos; -import net.minecraft.world.entity.animal.Animal; -import net.minecraft.world.entity.monster.Monster; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.crafting.Ingredient; -import net.minecraft.util.Mth; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.ServerLevelAccessor; -import net.minecraft.world.level.pathfinder.Path; -import net.minecraft.world.phys.Vec3; -import net.minecraft.server.level.ServerLevel; -import org.jetbrains.annotations.Nullable; -import software.bernie.geckolib.animatable.GeoEntity; -import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; -import software.bernie.geckolib.animation.AnimatableManager; -import software.bernie.geckolib.animation.AnimationController; -import software.bernie.geckolib.animation.AnimationState; -import software.bernie.geckolib.animation.PlayState; -import software.bernie.geckolib.animation.RawAnimation; -import software.bernie.geckolib.util.GeckoLibUtil; - -public class GlimmerEntity extends Animal implements GeoEntity { - private static final EntityDataAccessor GLOW_TICKS = - SynchedEntityData.defineId(GlimmerEntity.class, EntityDataSerializers.INT); - private static final RawAnimation IDLE_ANIM = RawAnimation.begin().thenLoop("idle"); - private static final RawAnimation WALK_ANIM = RawAnimation.begin().thenLoop("walk"); - private static final RawAnimation RUN_ANIM = RawAnimation.begin().thenLoop("run"); - private static final String QUIRK_CONTROLLER = "quirk_controller"; - private static final String QUIRK_TRIGGER = "quirk"; - - private static final int TRUST_REQUIRED_FEEDS = 3; - private static final int GRACE_DURATION_TICKS = 2400; - private static final int GRACE_COOLDOWN_TICKS = 6000; - private static final int GLOW_LIGHT_THRESHOLD = 7; - private static final int GLOW_CHECK_INTERVAL_TICKS = 20; - private static final int GLOW_TRANSITION_TICKS = 10; - private static final double WALK_SPEED_THRESHOLD_SQR = 0.0009D; - private static final double RUN_SPEED_THRESHOLD_SQR = 0.0035D; - - private static final int MIN_QUIRK_COOLDOWN = 20 * 8; - private static final int MAX_QUIRK_COOLDOWN = 20 * 25; - - private static final String TRUST_KEY = "GlimmerTrust"; - private static final String TRUST_PLAYER_KEY = "Player"; - private static final String TRUST_FEED_COUNT_KEY = "FeedCount"; - private static final String TRUST_TRUSTED_KEY = "Trusted"; - private static final String TRUST_COOLDOWN_KEY = "GraceCooldown"; - private static final String GLOWING_SAVE_KEY = "Glowing"; - - private final AnimatableInstanceCache geoCache = GeckoLibUtil.createInstanceCache(this); - private final Map trustByPlayer = new HashMap<>(); - - private boolean glowing; - private int quirkCooldown = createQuirkCooldown(); - - public GlimmerEntity(EntityType entityType, Level level) { - super(entityType, level); - } - - public static AttributeSupplier.Builder createAttributes() { - return net.minecraft.world.entity.Mob.createMobAttributes() - .add(Attributes.MAX_HEALTH, AntarchySettings.glimmerHealth()) - .add(Attributes.MOVEMENT_SPEED, 0.3D) - .add(Attributes.FOLLOW_RANGE, 24.0D); - } - - @Override - protected void defineSynchedData(SynchedEntityData.Builder builder) { - super.defineSynchedData(builder); - builder.define(GLOW_TICKS, 0); - } - - @Override - protected void registerGoals() { - this.goalSelector.addGoal(0, new FloatGoal(this)); - this.goalSelector.addGoal(1, new PanicGoal(this, 1.6D)); - this.goalSelector.addGoal(2, new TemptGoal(this, 1.1D, Ingredient.of(AntarchyTags.Items.GLIMMER_FOOD), false)); - this.goalSelector.addGoal(3, new AvoidUntrustedPlayerGoal(10.0F, 1.15D)); - this.goalSelector.addGoal(4, new net.minecraft.world.entity.ai.goal.AvoidEntityGoal<>(this, Monster.class, 8.0F, 1.0D, 1.2D)); - this.goalSelector.addGoal(5, new FollowParentGoal(this, 1.25D)); - this.goalSelector.addGoal(6, new WaterAvoidingRandomStrollGoal(this, 1.0D)); - this.goalSelector.addGoal(7, new LookAtPlayerGoal(this, Player.class, 8.0F)); - this.goalSelector.addGoal(8, new RandomLookAroundGoal(this)); - } - - @Override - public boolean isFood(ItemStack stack) { - return stack.is(AntarchyTags.Items.GLIMMER_FOOD); - } - - @Override - public GlimmerEntity getBreedOffspring(ServerLevel level, AgeableMob otherParent) { - return null; - } - - @Override - public InteractionResult mobInteract(Player player, InteractionHand hand) { - ItemStack stack = player.getItemInHand(hand); - if (stack.is(AntarchyTags.Items.GLIMMER_FOOD)) { - return this.feedGlimmerFood(player, stack, hand); - } - return super.mobInteract(player, hand); - } - - private InteractionResult feedGlimmerFood(Player player, ItemStack stack, InteractionHand hand) { - if (this.level().isClientSide) { - return InteractionResult.CONSUME; - } - - this.usePlayerItem(player, hand, stack); - this.playSound(SoundEvents.GENERIC_EAT, 1.0F, 1.0F + (this.random.nextFloat() - 0.5F) * 0.2F); - - if (!this.isBaby()) { - TrustEntry entry = this.trustByPlayer.computeIfAbsent(player.getUUID(), id -> new TrustEntry()); - if (!entry.trusted) { - entry.feedCount++; - if (entry.feedCount >= TRUST_REQUIRED_FEEDS) { - entry.trusted = true; - } - } else if (this.glowing && entry.graceCooldown <= 0) { - player.addEffect(new MobEffectInstance(AntarchyObjects.GLIMMERS_GRACE.get(), GRACE_DURATION_TICKS, 0, false, true, true)); - entry.graceCooldown = GRACE_COOLDOWN_TICKS; - } - } - - return InteractionResult.SUCCESS; - } - - public boolean isTrusted(UUID playerId) { - TrustEntry entry = this.trustByPlayer.get(playerId); - return entry != null && entry.trusted; - } - - private boolean hasAnyTrustProgress() { - for (TrustEntry entry : this.trustByPlayer.values()) { - if (entry.trusted || entry.feedCount > 0) { - return true; - } - } - return false; - } - - @Override - public boolean isPersistenceRequired() { - return super.isPersistenceRequired() || (!this.isBaby() && this.hasAnyTrustProgress()); - } - - public boolean isGlowingState() { - return this.getGlowTicks() > 0; - } - - public float getGlowBlend(float partialTick) { - return Mth.clamp((this.getGlowTicks() + partialTick) / (float) GLOW_TRANSITION_TICKS, 0.0F, 1.0F); - } - - @Override - public void tick() { - super.tick(); - - if (this.quirkCooldown > 0) { - this.quirkCooldown--; - } - - if (!this.level().isClientSide && this.tickCount % GLOW_CHECK_INTERVAL_TICKS == 0) { - this.glowing = this.level().getMaxLocalRawBrightness(this.blockPosition()) <= GLOW_LIGHT_THRESHOLD; - } - - if (!this.level().isClientSide) { - int glowTicks = this.getGlowTicks(); - if (this.glowing && glowTicks < GLOW_TRANSITION_TICKS) { - this.setGlowTicks(glowTicks + 1); - } else if (!this.glowing && glowTicks > 0) { - this.setGlowTicks(glowTicks - 1); - } - } - - if (this.isGlowingState()) { - GlimmerParticles.tickAmbient(this, this.getDeltaMovement().horizontalDistanceSqr() > RUN_SPEED_THRESHOLD_SQR); - } - - if (this.level().isClientSide) { - return; - } - - for (TrustEntry entry : this.trustByPlayer.values()) { - if (entry.graceCooldown > 0) { - entry.graceCooldown--; - } - } - } - - @Override - public void addAdditionalSaveData(CompoundTag tag) { - super.addAdditionalSaveData(tag); - tag.putBoolean(GLOWING_SAVE_KEY, this.glowing); - - ListTag trustList = new ListTag(); - for (Map.Entry entry : this.trustByPlayer.entrySet()) { - CompoundTag entryTag = new CompoundTag(); - entryTag.putUUID(TRUST_PLAYER_KEY, entry.getKey()); - entryTag.putInt(TRUST_FEED_COUNT_KEY, entry.getValue().feedCount); - entryTag.putBoolean(TRUST_TRUSTED_KEY, entry.getValue().trusted); - entryTag.putInt(TRUST_COOLDOWN_KEY, entry.getValue().graceCooldown); - trustList.add(entryTag); - } - tag.put(TRUST_KEY, trustList); - } - - @Override - public void readAdditionalSaveData(CompoundTag tag) { - super.readAdditionalSaveData(tag); - this.glowing = tag.getBoolean(GLOWING_SAVE_KEY); - this.setGlowTicks(this.glowing ? GLOW_TRANSITION_TICKS : 0); - - this.trustByPlayer.clear(); - for (net.minecraft.nbt.Tag rawEntry : tag.getList(TRUST_KEY, net.minecraft.nbt.Tag.TAG_COMPOUND)) { - CompoundTag entryTag = (CompoundTag) rawEntry; - TrustEntry entry = new TrustEntry(); - entry.feedCount = entryTag.getInt(TRUST_FEED_COUNT_KEY); - entry.trusted = entryTag.getBoolean(TRUST_TRUSTED_KEY); - entry.graceCooldown = entryTag.getInt(TRUST_COOLDOWN_KEY); - this.trustByPlayer.put(entryTag.getUUID(TRUST_PLAYER_KEY), entry); - } - } - - @Override - @Nullable - public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, MobSpawnType spawnReason, @Nullable SpawnGroupData spawnGroupData) { - GlimmerSpawnData glimmerSpawnData = spawnGroupData instanceof GlimmerSpawnData data ? data : new GlimmerSpawnData(); - SpawnGroupData result = super.finalizeSpawn(level, difficulty, spawnReason, spawnGroupData); - - if ((spawnReason == MobSpawnType.NATURAL || spawnReason == MobSpawnType.CHUNK_GENERATION)) { - if (glimmerSpawnData.adultSpawned) { - this.setAge(-24000); - } else { - glimmerSpawnData.adultSpawned = true; - } - } - - return result != null ? result : glimmerSpawnData; - } - - @Override - public net.minecraft.world.entity.EntityDimensions getDefaultDimensions(net.minecraft.world.entity.Pose pose) { - net.minecraft.world.entity.EntityDimensions dimensions = super.getDefaultDimensions(pose); - if (this.isBaby()) { - return dimensions; - } - return net.minecraft.world.entity.EntityDimensions.scalable(dimensions.width() * 2.0F, dimensions.height() * 2.0F); - } - - @Override - protected void ageBoundaryReached() { - super.ageBoundaryReached(); - this.refreshDimensions(); - } - - @Override - protected SoundEvent getAmbientSound() { - return SoundEvents.FOX_AMBIENT; - } - - @Override - protected SoundEvent getHurtSound(DamageSource damageSource) { - return SoundEvents.FOX_HURT; - } - - @Override - protected SoundEvent getDeathSound() { - return SoundEvents.FOX_DEATH; - } - - @Override - protected float getSoundVolume() { - return 0.8F; - } - - @Override - public void registerControllers(AnimatableManager.ControllerRegistrar controllers) { - controllers.add(new AnimationController<>(this, "main_controller", 0, this::mainAnimController)); - controllers.add(new AnimationController<>(this, QUIRK_CONTROLLER, 0, state -> PlayState.STOP) - .triggerableAnim(QUIRK_TRIGGER, RawAnimation.begin().thenPlay("quirk"))); - } - - private PlayState mainAnimController(AnimationState state) { - double speedSqr = this.getDeltaMovement().horizontalDistanceSqr(); - if (speedSqr > RUN_SPEED_THRESHOLD_SQR) { - return state.setAndContinue(RUN_ANIM); - } - if (speedSqr > WALK_SPEED_THRESHOLD_SQR) { - return state.setAndContinue(WALK_ANIM); - } - - if (this.quirkCooldown <= 0) { - this.quirkCooldown = this.createQuirkCooldown(); - this.triggerAnim(QUIRK_CONTROLLER, QUIRK_TRIGGER); - } - - return state.setAndContinue(IDLE_ANIM); - } - - private int createQuirkCooldown() { - return MIN_QUIRK_COOLDOWN + this.random.nextInt(MAX_QUIRK_COOLDOWN - MIN_QUIRK_COOLDOWN + 1); - } - - @Override - public AnimatableInstanceCache getAnimatableInstanceCache() { - return this.geoCache; - } - - private int getGlowTicks() { - return this.entityData.get(GLOW_TICKS); - } - - private void setGlowTicks(int glowTicks) { - this.entityData.set(GLOW_TICKS, Mth.clamp(glowTicks, 0, GLOW_TRANSITION_TICKS)); - } - - private static final class TrustEntry { - int feedCount; - boolean trusted; - int graceCooldown; - } - - private static final class GlimmerSpawnData implements SpawnGroupData { - private boolean adultSpawned; - } - - private final class AvoidUntrustedPlayerGoal extends Goal { - private final float maxDistance; - private final double speedModifier; - private Player avoidTarget; - private Path path; - - AvoidUntrustedPlayerGoal(float maxDistance, double speedModifier) { - this.maxDistance = maxDistance; - this.speedModifier = speedModifier; - this.setFlags(EnumSet.of(Flag.MOVE)); - } - - @Override - public boolean canUse() { - if (GlimmerEntity.this.isBaby()) { - return false; - } - - Player nearest = GlimmerEntity.this.level().getNearestPlayer(GlimmerEntity.this, this.maxDistance); - if (nearest == null || nearest.isSpectator() || nearest.isCreative() - || GlimmerEntity.this.isTrusted(nearest.getUUID()) - || GlimmerEntity.this.distanceToSqr(nearest) > (double) (this.maxDistance * this.maxDistance)) { - return false; - } - - Path escapePath = this.findEscapePath(nearest); - if (escapePath == null) { - return false; - } - - this.avoidTarget = nearest; - this.path = escapePath; - return true; - } - - @Override - public boolean canContinueToUse() { - return this.avoidTarget != null - && this.avoidTarget.isAlive() - && !GlimmerEntity.this.isTrusted(this.avoidTarget.getUUID()) - && !GlimmerEntity.this.getNavigation().isDone(); - } - - @Override - public void start() { - GlimmerEntity.this.getNavigation().moveTo(this.path, this.speedModifier); - } - - @Override - public void stop() { - this.avoidTarget = null; - this.path = null; - } - - @Nullable - private Path findEscapePath(Player toAvoid) { - Vec3 escapeVec = DefaultRandomPos.getPosAway(GlimmerEntity.this, 16, 7, toAvoid.position()); - if (escapeVec == null) { - return null; - } - return GlimmerEntity.this.getNavigation().createPath(BlockPos.containing(escapeVec), 0); - } - } -} diff --git a/common/src/main/java/com/craisinlord/antarchy/content/entity/OuranwoodDeerEntity.java b/common/src/main/java/com/craisinlord/antarchy/content/entity/OuranwoodDeerEntity.java new file mode 100644 index 00000000..777b6f21 --- /dev/null +++ b/common/src/main/java/com/craisinlord/antarchy/content/entity/OuranwoodDeerEntity.java @@ -0,0 +1,303 @@ +package com.craisinlord.antarchy.content.entity; + +import com.craisinlord.antarchy.config.AntarchySettings; +import com.craisinlord.antarchy.content.AntarchyObjects; +import com.craisinlord.antarchy.content.AntarchyTags; +import java.util.EnumSet; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.syncher.EntityDataAccessor; +import net.minecraft.network.syncher.EntityDataSerializers; +import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.world.DifficultyInstance; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.AgeableMob; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.MobSpawnType; +import net.minecraft.world.entity.SpawnGroupData; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.goal.BreedGoal; +import net.minecraft.world.entity.ai.goal.FloatGoal; +import net.minecraft.world.entity.ai.goal.FollowParentGoal; +import net.minecraft.world.entity.ai.goal.Goal; +import net.minecraft.world.entity.ai.goal.LookAtPlayerGoal; +import net.minecraft.world.entity.ai.goal.PanicGoal; +import net.minecraft.world.entity.ai.goal.RandomLookAroundGoal; +import net.minecraft.world.entity.ai.goal.TemptGoal; +import net.minecraft.world.entity.ai.util.DefaultRandomPos; +import net.minecraft.world.entity.animal.Animal; +import net.minecraft.world.entity.monster.Monster; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.util.Mth; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.ServerLevelAccessor; +import net.minecraft.world.phys.Vec3; +import net.minecraft.server.level.ServerLevel; +import org.jetbrains.annotations.Nullable; +import software.bernie.geckolib.animatable.GeoEntity; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.animation.AnimationController; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.animation.PlayState; +import software.bernie.geckolib.animation.RawAnimation; +import software.bernie.geckolib.util.GeckoLibUtil; + +public class OuranwoodDeerEntity extends Animal implements GeoEntity { + public enum Variant { BUCK, DOE } + + private static final EntityDataAccessor VARIANT = + SynchedEntityData.defineId(OuranwoodDeerEntity.class, EntityDataSerializers.INT); + private static final String VARIANT_KEY = "Variant"; + + private static final float ADULT_HITBOX_SCALE = 1.5F; + private static final RawAnimation IDLE_ANIM = RawAnimation.begin().thenLoop("idle"); + private static final RawAnimation WALK_ANIM = RawAnimation.begin().thenLoop("walk"); + private static final RawAnimation RUN_ANIM = RawAnimation.begin().thenLoop("run"); + private static final String QUIRK_CONTROLLER = "quirk_controller"; + private static final String QUIRK_TRIGGER = "quirk"; + + private static final double WALK_SPEED_THRESHOLD_SQR = 0.0009D; + private static final double RUN_SPEED_THRESHOLD_SQR = 0.0035D; + private static final double WALK_STROLL_SPEED = 1.0D; + private static final double RUN_STROLL_SPEED = 1.45D; + + private static final int MIN_QUIRK_COOLDOWN = 20 * 8; + private static final int MAX_QUIRK_COOLDOWN = 20 * 25; + + private final AnimatableInstanceCache geoCache = GeckoLibUtil.createInstanceCache(this); + + private int quirkCooldown = createQuirkCooldown(); + + public OuranwoodDeerEntity(EntityType entityType, Level level) { + super(entityType, level); + } + + public static AttributeSupplier.Builder createAttributes() { + return net.minecraft.world.entity.Mob.createMobAttributes() + .add(Attributes.MAX_HEALTH, AntarchySettings.ouranwoodDeerHealth()) + .add(Attributes.MOVEMENT_SPEED, 0.3D) + .add(Attributes.FOLLOW_RANGE, 24.0D); + } + + @Override + protected void defineSynchedData(SynchedEntityData.Builder builder) { + super.defineSynchedData(builder); + builder.define(VARIANT, Variant.DOE.ordinal()); + } + + public Variant getVariant() { + return Variant.values()[Mth.clamp(this.entityData.get(VARIANT), 0, Variant.values().length - 1)]; + } + + public void setVariant(Variant variant) { + this.entityData.set(VARIANT, variant.ordinal()); + } + + @Override + protected void registerGoals() { + this.goalSelector.addGoal(0, new FloatGoal(this)); + this.goalSelector.addGoal(1, new PanicGoal(this, 1.8D)); + this.goalSelector.addGoal(2, new BreedGoal(this, 1.0D)); + this.goalSelector.addGoal(3, new TemptGoal(this, 1.1D, Ingredient.of(AntarchyTags.Items.OURANWOOD_DEER_FOOD), false)); + this.goalSelector.addGoal(4, new net.minecraft.world.entity.ai.goal.AvoidEntityGoal<>(this, Monster.class, 8.0F, 1.1D, 1.5D)); + this.goalSelector.addGoal(5, new FollowParentGoal(this, 1.25D)); + this.goalSelector.addGoal(6, new OuranwoodDeerStrollGoal()); + this.goalSelector.addGoal(7, new LookAtPlayerGoal(this, Player.class, 8.0F)); + this.goalSelector.addGoal(8, new RandomLookAroundGoal(this)); + } + + @Override + public boolean isFood(ItemStack stack) { + return stack.is(AntarchyTags.Items.OURANWOOD_DEER_FOOD); + } + + @Override + public OuranwoodDeerEntity getBreedOffspring(ServerLevel level, AgeableMob otherParent) { + return AntarchyObjects.OURANWOOD_DEER.get().create(level); + } + + @Override + public void tick() { + super.tick(); + + if (this.quirkCooldown > 0) { + this.quirkCooldown--; + } + + if (this.level().isClientSide) { + return; + } + } + + @Override + public void addAdditionalSaveData(CompoundTag tag) { + super.addAdditionalSaveData(tag); + tag.putString(VARIANT_KEY, this.getVariant().name()); + } + + @Override + public void readAdditionalSaveData(CompoundTag tag) { + super.readAdditionalSaveData(tag); + if (tag.contains(VARIANT_KEY)) { + try { + this.setVariant(Variant.valueOf(tag.getString(VARIANT_KEY))); + } catch (IllegalArgumentException ignored) { + this.setVariant(Variant.DOE); + } + } + } + + @Override + @Nullable + public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, MobSpawnType spawnReason, @Nullable SpawnGroupData spawnGroupData) { + DeerSpawnData deerSpawnData = spawnGroupData instanceof DeerSpawnData data ? data : new DeerSpawnData(); + SpawnGroupData result = super.finalizeSpawn(level, difficulty, spawnReason, spawnGroupData); + + if (spawnReason == MobSpawnType.NATURAL || spawnReason == MobSpawnType.CHUNK_GENERATION || spawnReason == MobSpawnType.SPAWN_EGG) { + this.setVariant(Variant.values()[this.random.nextInt(Variant.values().length)]); + } + + if ((spawnReason == MobSpawnType.NATURAL || spawnReason == MobSpawnType.CHUNK_GENERATION)) { + if (deerSpawnData.adultSpawned) { + this.setAge(-24000); + } else { + deerSpawnData.adultSpawned = true; + } + } + + return result != null ? result : deerSpawnData; + } + + @Override + public net.minecraft.world.entity.EntityDimensions getDefaultDimensions(net.minecraft.world.entity.Pose pose) { + net.minecraft.world.entity.EntityDimensions dimensions = super.getDefaultDimensions(pose); + if (this.isBaby()) { + return dimensions; + } + return net.minecraft.world.entity.EntityDimensions.scalable( + dimensions.width() * ADULT_HITBOX_SCALE, + dimensions.height() * ADULT_HITBOX_SCALE + ); + } + + @Override + protected void ageBoundaryReached() { + super.ageBoundaryReached(); + this.refreshDimensions(); + } + + @Override + protected SoundEvent getAmbientSound() { + return SoundEvents.FOX_AMBIENT; + } + + @Override + protected SoundEvent getHurtSound(DamageSource damageSource) { + return SoundEvents.FOX_HURT; + } + + @Override + protected SoundEvent getDeathSound() { + return SoundEvents.FOX_DEATH; + } + + @Override + protected float getSoundVolume() { + return 0.8F; + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar controllers) { + controllers.add(new AnimationController<>(this, "main_controller", 0, this::mainAnimController)); + controllers.add(new AnimationController<>(this, QUIRK_CONTROLLER, 0, state -> PlayState.STOP) + .triggerableAnim(QUIRK_TRIGGER, RawAnimation.begin().thenPlay("quirk"))); + } + + private PlayState mainAnimController(AnimationState state) { + double speedSqr = this.getDeltaMovement().horizontalDistanceSqr(); + if (this.hurtTime > 0 || speedSqr > RUN_SPEED_THRESHOLD_SQR) { + return state.setAndContinue(RUN_ANIM); + } + if (speedSqr > WALK_SPEED_THRESHOLD_SQR) { + return state.setAndContinue(WALK_ANIM); + } + + if (this.quirkCooldown <= 0) { + this.quirkCooldown = this.createQuirkCooldown(); + this.triggerAnim(QUIRK_CONTROLLER, QUIRK_TRIGGER); + } + + return state.setAndContinue(IDLE_ANIM); + } + + private int createQuirkCooldown() { + return MIN_QUIRK_COOLDOWN + this.random.nextInt(MAX_QUIRK_COOLDOWN - MIN_QUIRK_COOLDOWN + 1); + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return this.geoCache; + } + + private static final class DeerSpawnData implements SpawnGroupData { + private boolean adultSpawned; + } + + private final class OuranwoodDeerStrollGoal extends Goal { + private static final int RUN_CHANCE = 5; + @Nullable + private Vec3 targetPos; + private double speedModifier; + + private OuranwoodDeerStrollGoal() { + this.setFlags(EnumSet.of(Flag.MOVE)); + } + + @Override + public boolean canUse() { + if (OuranwoodDeerEntity.this.isVehicle() || !OuranwoodDeerEntity.this.getNavigation().isDone()) { + return false; + } + if (OuranwoodDeerEntity.this.getRandom().nextInt(reducedTickDelay(60)) != 0) { + return false; + } + + this.targetPos = DefaultRandomPos.getPos(OuranwoodDeerEntity.this, 10, 7); + if (this.targetPos == null) { + return false; + } + + this.speedModifier = this.pickSpeed(); + return true; + } + + @Override + public boolean canContinueToUse() { + return this.targetPos != null && !OuranwoodDeerEntity.this.getNavigation().isDone(); + } + + @Override + public void start() { + if (this.targetPos != null) { + OuranwoodDeerEntity.this.getNavigation().moveTo(this.targetPos.x, this.targetPos.y, this.targetPos.z, this.speedModifier); + } + } + + @Override + public void stop() { + this.targetPos = null; + } + + private double pickSpeed() { + if (OuranwoodDeerEntity.this.hurtTime > 0) { + return RUN_STROLL_SPEED; + } + return OuranwoodDeerEntity.this.random.nextInt(RUN_CHANCE) == 0 ? RUN_STROLL_SPEED : WALK_STROLL_SPEED; + } + } +} diff --git a/common/src/main/java/com/craisinlord/antarchy/content/entity/PeachBoatEntity.java b/common/src/main/java/com/craisinlord/antarchy/content/entity/PeachBoatEntity.java new file mode 100644 index 00000000..287f0148 --- /dev/null +++ b/common/src/main/java/com/craisinlord/antarchy/content/entity/PeachBoatEntity.java @@ -0,0 +1,21 @@ +package com.craisinlord.antarchy.content.entity; + +import com.craisinlord.antarchy.Antarchy; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.vehicle.Boat; +import net.minecraft.world.item.Item; +import net.minecraft.world.level.Level; + +public class PeachBoatEntity extends Boat { + public PeachBoatEntity(EntityType entityType, Level level) { + super(entityType, level); + this.setVariant(Type.OAK); + } + + @Override + public Item getDropItem() { + return BuiltInRegistries.ITEM.get(ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "peach_boat")); + } +} diff --git a/common/src/main/java/com/craisinlord/antarchy/content/entity/PeachChestBoatEntity.java b/common/src/main/java/com/craisinlord/antarchy/content/entity/PeachChestBoatEntity.java new file mode 100644 index 00000000..27779150 --- /dev/null +++ b/common/src/main/java/com/craisinlord/antarchy/content/entity/PeachChestBoatEntity.java @@ -0,0 +1,22 @@ +package com.craisinlord.antarchy.content.entity; + +import com.craisinlord.antarchy.Antarchy; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.vehicle.Boat; +import net.minecraft.world.entity.vehicle.ChestBoat; +import net.minecraft.world.item.Item; +import net.minecraft.world.level.Level; + +public class PeachChestBoatEntity extends ChestBoat { + public PeachChestBoatEntity(EntityType entityType, Level level) { + super(entityType, level); + this.setVariant(Type.OAK); + } + + @Override + public Item getDropItem() { + return BuiltInRegistries.ITEM.get(ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "peach_chest_boat")); + } +} diff --git a/common/src/main/java/com/craisinlord/antarchy/content/entity/flying_squirrel/FlyingSquirrelEntity.java b/common/src/main/java/com/craisinlord/antarchy/content/entity/flying_squirrel/FlyingSquirrelEntity.java index 1c7dcc9f..6b12ca98 100644 --- a/common/src/main/java/com/craisinlord/antarchy/content/entity/flying_squirrel/FlyingSquirrelEntity.java +++ b/common/src/main/java/com/craisinlord/antarchy/content/entity/flying_squirrel/FlyingSquirrelEntity.java @@ -370,7 +370,7 @@ public class FlyingSquirrelEntity extends TamableAnimal implements GeoEntity { Player shoulderPlayer = this.shoulderPlayerId != null ? this.level().getPlayerByUUID(this.shoulderPlayerId) : null; - if (shoulderPlayer == null || !shoulderPlayer.isAlive()) { + if (shoulderPlayer == null || !shoulderPlayer.isAlive() || shoulderPlayer.isSpectator()) { this.dismountShoulder(); } else { this.tickClimbingToShoulder(shoulderPlayer); @@ -381,7 +381,7 @@ public class FlyingSquirrelEntity extends TamableAnimal implements GeoEntity { if (this.isOnShoulder()) { Player shoulderPlayer = this.getShoulderPlayer(); - if (shoulderPlayer == null || !shoulderPlayer.isAlive()) { + if (shoulderPlayer == null || !shoulderPlayer.isAlive() || shoulderPlayer.isSpectator()) { this.dismountShoulder(); } else if (this.shoulderSneakGraceTicks <= 0 && shoulderPlayer.isShiftKeyDown()) { this.glideOffShoulder(); @@ -555,6 +555,10 @@ public class FlyingSquirrelEntity extends TamableAnimal implements GeoEntity { return false; } + if (player.isSpectator()) { + return true; + } + if (this.isOnShoulder()) { if (!this.level().isClientSide) { this.glideOffShoulder(); @@ -629,6 +633,12 @@ public class FlyingSquirrelEntity extends TamableAnimal implements GeoEntity { this.pickupAnimTicks = 0; return finalized; } + + @Override + public boolean shouldBeSaved() { + return super.shouldBeSaved() && !this.isOnShoulder() && !this.isClimbingToShoulder(); + } + @Override protected SoundEvent getAmbientSound() { return AntarchySoundEvents.FLYING_SQUIRREL_IDLE.get(); @@ -731,6 +741,9 @@ public class FlyingSquirrelEntity extends TamableAnimal implements GeoEntity { } private void startShoulderMountSequence(Player player) { + if (player.isSpectator()) { + return; + } this.shoulderPlayerId = player.getUUID(); this.shoulderClimbStartPos = this.position(); this.climbingToShoulderTicks = SHOULDER_CLIMB_TICKS; diff --git a/common/src/main/java/com/craisinlord/antarchy/content/entity/glimmer/GlimmerAntBehavior.java b/common/src/main/java/com/craisinlord/antarchy/content/entity/glimmer/GlimmerAntBehavior.java new file mode 100644 index 00000000..85ea61a6 --- /dev/null +++ b/common/src/main/java/com/craisinlord/antarchy/content/entity/glimmer/GlimmerAntBehavior.java @@ -0,0 +1,124 @@ +package com.craisinlord.antarchy.content.entity.glimmer; + +import com.craisinlord.antarchy.Antarchy; +import com.craisinlord.antarchy.content.AntarchySoundEvents; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.EntityDimensions; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.ai.attributes.AttributeInstance; +import net.minecraft.world.entity.ai.attributes.AttributeModifier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.goal.FloatGoal; +import net.minecraft.world.entity.ai.goal.LookAtPlayerGoal; +import net.minecraft.world.entity.ai.goal.RandomLookAroundGoal; +import net.minecraft.world.entity.ai.goal.WaterAvoidingRandomStrollGoal; +import net.minecraft.world.entity.monster.Enemy; +import net.minecraft.world.entity.player.Player; + +public class GlimmerAntBehavior implements GlimmerVariantBehavior { + private static final ResourceLocation REACH_BOOST_ID = + ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "glimmer_ant_reach_boost"); + private static final double REACH_BOOST_AMOUNT = 0.5D; + private static final float LARGE_ENEMY_MIN_HEALTH = 40.0F; + private static final int ABILITY_COOLDOWN_TICKS = 20 * 120; + private static final int STRENGTH_BURST_DURATION = 20 * 12; + + private static ResourceLocation rl(String path) { + return ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, path); + } + + @Override + public void registerGoals(GlimmerEntity entity) { + entity.addGoal(0, new FloatGoal(entity)); + entity.addGoal(5, new WaterAvoidingRandomStrollGoal(entity, 1.1D)); + entity.addGoal(6, new LookAtPlayerGoal(entity, Player.class, 8.0F)); + entity.addGoal(7, new RandomLookAroundGoal(entity)); + } + + @Override + public ResourceLocation modelGeo() { + return rl("geo/ant.geo.json"); + } + + @Override + public ResourceLocation animationFile() { + return rl("animations/ant.animation.json"); + } + + @Override + public ResourceLocation texture(GlimmerEntity entity) { + return rl("textures/entity/glimmer/glimmer_ant.png"); + } + + @Override + public ResourceLocation emissiveTexture(GlimmerEntity entity) { + return rl("textures/entity/glimmer/glimmer_ant_emmisive.png"); + } + + @Override + public SoundEvent ambientSound() { + return AntarchySoundEvents.ANT_AMBIENT.get(); + } + + @Override + public SoundEvent hurtSound() { + return AntarchySoundEvents.ANT_HURT.get(); + } + + @Override + public SoundEvent deathSound() { + return AntarchySoundEvents.ANT_HURT.get(); + } + + @Override + public EntityDimensions adultDimensions() { + // Matches the real ant's hitbox. + return EntityDimensions.scalable(0.6375F, 0.2125F); + } + + @Override + public void tickPassiveEveryTick(GlimmerEntity entity, Player owner) { + AttributeInstance instance = owner.getAttribute(Attributes.ENTITY_INTERACTION_RANGE); + if (instance == null) { + return; + } + if (instance.getModifier(REACH_BOOST_ID) == null) { + instance.addTransientModifier(new AttributeModifier(REACH_BOOST_ID, REACH_BOOST_AMOUNT, AttributeModifier.Operation.ADD_VALUE)); + } + } + + @Override + public void clearPassive(GlimmerEntity entity, Player owner) { + AttributeInstance instance = owner.getAttribute(Attributes.ENTITY_INTERACTION_RANGE); + if (instance != null) { + instance.removeModifier(REACH_BOOST_ID); + } + } + + @Override + public int abilityCooldownTicks() { + return ABILITY_COOLDOWN_TICKS; + } + + @Override + public void tickAbilityCheck(GlimmerEntity entity, Player owner) { + if (owner.getLastHurtMobTimestamp() != owner.tickCount) { + return; + } + + LivingEntity target = owner.getLastHurtMob(); + if (!(target instanceof Enemy) || target.getMaxHealth() < LARGE_ENEMY_MIN_HEALTH) { + return; + } + + owner.addEffect(new MobEffectInstance(MobEffects.DAMAGE_BOOST, STRENGTH_BURST_DURATION, 1, false, true, true)); + owner.level().playSound(null, owner.blockPosition(), SoundEvents.PLAYER_ATTACK_STRONG, owner.getSoundSource(), 1.0F, 0.8F); + this.sendAbilityMessage(owner, Component.translatable("entity.antarchy.glimmer.ability.ant", target.getDisplayName())); + entity.startAbilityCooldown(); + } +} diff --git a/common/src/main/java/com/craisinlord/antarchy/content/entity/glimmer/GlimmerAppleCowBehavior.java b/common/src/main/java/com/craisinlord/antarchy/content/entity/glimmer/GlimmerAppleCowBehavior.java new file mode 100644 index 00000000..0c8ec870 --- /dev/null +++ b/common/src/main/java/com/craisinlord/antarchy/content/entity/glimmer/GlimmerAppleCowBehavior.java @@ -0,0 +1,140 @@ +package com.craisinlord.antarchy.content.entity.glimmer; + +import com.craisinlord.antarchy.Antarchy; +import com.craisinlord.antarchy.content.AntarchyObjects; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.EntityDimensions; +import net.minecraft.world.entity.ai.goal.FloatGoal; +import net.minecraft.world.entity.ai.goal.LookAtPlayerGoal; +import net.minecraft.world.entity.ai.goal.RandomLookAroundGoal; +import net.minecraft.world.entity.ai.goal.WaterAvoidingRandomStrollGoal; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.food.FoodData; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import org.jetbrains.annotations.Nullable; + +public class GlimmerAppleCowBehavior implements GlimmerVariantBehavior { + private static final int SHEAR_REGROW_TICKS = 20 * 60 * 3; + private static final float EXHAUSTION_REDUCTION = 0.25F; + private static final int LOW_FOOD_THRESHOLD = 16; + private static final int ABILITY_COOLDOWN_TICKS = 20 * 120; + + private static ResourceLocation rl(String path) { + return ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, path); + } + + @Override + public void registerGoals(GlimmerEntity entity) { + entity.addGoal(0, new FloatGoal(entity)); + entity.addGoal(5, new WaterAvoidingRandomStrollGoal(entity, 1.0D)); + entity.addGoal(6, new LookAtPlayerGoal(entity, Player.class, 8.0F)); + entity.addGoal(7, new RandomLookAroundGoal(entity)); + } + + @Override + public ResourceLocation modelGeo() { + return rl("geo/apple_cow.geo.json"); + } + + @Override + public ResourceLocation animationFile() { + return rl("animations/apple_cow.animation.json"); + } + + @Override + public ResourceLocation texture(GlimmerEntity entity) { + return entity.isShearCooldownActive() + ? rl("textures/entity/glimmer/apple_cow_glimmer_sheared.png") + : rl("textures/entity/glimmer/apple_cow_glimmer.png"); + } + + @Override + public ResourceLocation emissiveTexture(GlimmerEntity entity) { + return entity.isShearCooldownActive() + ? rl("textures/entity/glimmer/apple_cow_glimmer_sheared_emissive.png") + : rl("textures/entity/glimmer/apple_cow_glimmer_emissive.png"); + } + + @Override + public SoundEvent ambientSound() { + return SoundEvents.COW_AMBIENT; + } + + @Override + public SoundEvent hurtSound() { + return SoundEvents.COW_HURT; + } + + @Override + public SoundEvent deathSound() { + return SoundEvents.COW_DEATH; + } + + @Override + public EntityDimensions adultDimensions() { + // Matches the real Apple Cow's hitbox (extends vanilla Cow). + return EntityDimensions.scalable(0.9F, 1.4F); + } + + @Override + @Nullable + public InteractionResult onInteract(GlimmerEntity entity, Player player, ItemStack stack, InteractionHand hand) { + if (entity.isTame() || entity.isShearCooldownActive() || !stack.is(Items.SHEARS)) { + return null; + } + + if (entity.level().isClientSide) { + return InteractionResult.CONSUME; + } + + entity.startShearCooldown(SHEAR_REGROW_TICKS); + entity.playSound(SoundEvents.SHEEP_SHEAR, 1.0F, 1.0F); + stack.hurtAndBreak(1, player, hand == InteractionHand.MAIN_HAND + ? net.minecraft.world.entity.EquipmentSlot.MAINHAND + : net.minecraft.world.entity.EquipmentSlot.OFFHAND); + entity.spawnAtLocation(new net.minecraft.world.item.ItemStack(AntarchyObjects.SPIRIT_APPLE.get()), entity.getBbHeight() * 0.6F); + return InteractionResult.SUCCESS; + } + + @Override + public void tickPassiveEveryTick(GlimmerEntity entity, Player owner) { + FoodData food = owner.getFoodData(); + float current = food.getExhaustionLevel(); + float last = entity.getLastOwnerExhaustion(); + if (last >= 0.0F && current > last) { + owner.causeFoodExhaustion(-(current - last) * EXHAUSTION_REDUCTION); + } + entity.setLastOwnerExhaustion(food.getExhaustionLevel()); + } + + @Override + public void clearPassive(GlimmerEntity entity, Player owner) { + entity.setLastOwnerExhaustion(-1.0F); + } + + @Override + public int abilityCooldownTicks() { + return ABILITY_COOLDOWN_TICKS; + } + + @Override + public void tickAbilityCheck(GlimmerEntity entity, Player owner) { + if (owner.getFoodData().getFoodLevel() > LOW_FOOD_THRESHOLD) { + return; + } + + owner.addEffect(new MobEffectInstance(MobEffects.SATURATION, 20, 1, false, false, true)); + owner.addEffect(new MobEffectInstance(MobEffects.REGENERATION, 20 * 8, 1, false, true, true)); + entity.playSound(SoundEvents.COW_AMBIENT, 1.2F, 0.8F); + this.sendAbilityMessage(owner, Component.translatable("entity.antarchy.glimmer.ability.apple_cow")); + entity.startAbilityCooldown(); + } +} diff --git a/common/src/main/java/com/craisinlord/antarchy/content/entity/glimmer/GlimmerCompanionSavedData.java b/common/src/main/java/com/craisinlord/antarchy/content/entity/glimmer/GlimmerCompanionSavedData.java new file mode 100644 index 00000000..ef75fe86 --- /dev/null +++ b/common/src/main/java/com/craisinlord/antarchy/content/entity/glimmer/GlimmerCompanionSavedData.java @@ -0,0 +1,94 @@ +package com.craisinlord.antarchy.content.entity.glimmer; + +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; +import net.minecraft.core.HolderLookup; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.level.saveddata.SavedData; + +/** + * Tracks each player's current Glimmer companion so taming a new one despawns the old, + * even if the old companion is in a different loaded dimension. + */ +public class GlimmerCompanionSavedData extends SavedData { + private static final String ID = "antarchy_glimmer_companions"; + private static final String ENTRIES_KEY = "Entries"; + private static final String OWNER_KEY = "Owner"; + private static final String COMPANION_KEY = "Companion"; + + private final Map companionByOwner = new HashMap<>(); + + public static GlimmerCompanionSavedData create() { + return new GlimmerCompanionSavedData(); + } + + public static GlimmerCompanionSavedData load(CompoundTag tag, HolderLookup.Provider registries) { + GlimmerCompanionSavedData data = new GlimmerCompanionSavedData(); + for (net.minecraft.nbt.Tag rawEntry : tag.getList(ENTRIES_KEY, net.minecraft.nbt.Tag.TAG_COMPOUND)) { + CompoundTag entryTag = (CompoundTag) rawEntry; + data.companionByOwner.put(entryTag.getUUID(OWNER_KEY), entryTag.getUUID(COMPANION_KEY)); + } + return data; + } + + @Override + public CompoundTag save(CompoundTag tag, HolderLookup.Provider registries) { + ListTag entries = new ListTag(); + for (Map.Entry entry : this.companionByOwner.entrySet()) { + CompoundTag entryTag = new CompoundTag(); + entryTag.putUUID(OWNER_KEY, entry.getKey()); + entryTag.putUUID(COMPANION_KEY, entry.getValue()); + entries.add(entryTag); + } + tag.put(ENTRIES_KEY, entries); + return tag; + } + + private static GlimmerCompanionSavedData get(MinecraftServer server) { + return server.overworld().getDataStorage().computeIfAbsent( + new SavedData.Factory(GlimmerCompanionSavedData::create, GlimmerCompanionSavedData::load, null), + ID + ); + } + + /** + * Records {@code newCompanion} as {@code owner}'s current Glimmer. Any previous + * companion found in a currently loaded dimension isn't removed - it just loses + * its owner and becomes a wild, re-tameable Glimmer again. + */ + public static void replaceCompanion(MinecraftServer server, UUID owner, UUID newCompanion) { + GlimmerCompanionSavedData data = get(server); + UUID previous = data.companionByOwner.put(owner, newCompanion); + data.setDirty(); + + if (previous == null || previous.equals(newCompanion)) { + return; + } + + for (ServerLevel level : server.getAllLevels()) { + Entity entity = level.getEntity(previous); + if (entity instanceof GlimmerEntity glimmer) { + glimmer.setTame(false, true); + glimmer.setOwnerUUID(null); + return; + } + } + } + + /** + * Removes {@code owner}'s companion record if it currently points at {@code companion}, + * used when that Glimmer is captured into a bottle rather than replaced by a new one. + */ + public static void clearCompanion(MinecraftServer server, UUID owner, UUID companion) { + GlimmerCompanionSavedData data = get(server); + if (companion.equals(data.companionByOwner.get(owner))) { + data.companionByOwner.remove(owner); + data.setDirty(); + } + } +} diff --git a/common/src/main/java/com/craisinlord/antarchy/content/entity/glimmer/GlimmerElkaBehavior.java b/common/src/main/java/com/craisinlord/antarchy/content/entity/glimmer/GlimmerElkaBehavior.java new file mode 100644 index 00000000..60292e1b --- /dev/null +++ b/common/src/main/java/com/craisinlord/antarchy/content/entity/glimmer/GlimmerElkaBehavior.java @@ -0,0 +1,148 @@ +package com.craisinlord.antarchy.content.entity.glimmer; + +import com.craisinlord.antarchy.Antarchy; +import com.craisinlord.antarchy.content.AntarchyObjects; +import com.craisinlord.antarchy.content.bloodglass.BloodglassAccess; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.entity.EntityDimensions; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.ai.goal.FloatGoal; +import net.minecraft.world.entity.ai.goal.LookAtPlayerGoal; +import net.minecraft.world.entity.ai.goal.RandomLookAroundGoal; +import net.minecraft.world.entity.ai.goal.WaterAvoidingRandomStrollGoal; +import net.minecraft.world.entity.monster.Enemy; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.entity.projectile.Projectile; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.Vec3; +import org.jetbrains.annotations.Nullable; + +public class GlimmerElkaBehavior implements GlimmerVariantBehavior { + private static final int PASSIVE_REFRESH_DURATION = 20 * 4; + private static final int WARD_AMPLIFIER = 1; + private static final int ABILITY_COOLDOWN_TICKS = 20 * 60; + private static final int CRY_ANIM_TICKS = 40; + private static final double SHOCKWAVE_RADIUS = 6.0D; + private static final double SHOCKWAVE_KNOCKBACK = 1.3D; + + private static ResourceLocation rl(String path) { + return ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, path); + } + + @Override + public void registerGoals(GlimmerEntity entity) { + entity.addGoal(0, new FloatGoal(entity)); + entity.addGoal(5, new WaterAvoidingRandomStrollGoal(entity, 1.0D)); + entity.addGoal(6, new LookAtPlayerGoal(entity, Player.class, 8.0F)); + entity.addGoal(7, new RandomLookAroundGoal(entity)); + } + + @Override + public ResourceLocation modelGeo() { + return rl("geo/elka.geo.json"); + } + + @Override + public ResourceLocation animationFile() { + return rl("animations/elka.animation.json"); + } + + @Override + public ResourceLocation texture(GlimmerEntity entity) { + return rl("textures/entity/glimmer/elka_glimmer.png"); + } + + @Override + public ResourceLocation emissiveTexture(GlimmerEntity entity) { + return rl("textures/entity/glimmer/elka_glimmer_emmisive.png"); + } + + @Override + public SoundEvent ambientSound() { + return SoundEvents.PANDA_AMBIENT; + } + + @Override + public SoundEvent hurtSound() { + return SoundEvents.PANDA_BITE; + } + + @Override + public SoundEvent deathSound() { + return SoundEvents.PANDA_DEATH; + } + + @Override + public EntityDimensions adultDimensions() { + return EntityDimensions.scalable(2.2F, 3.5F); + } + + @Override + public EntityDimensions babyDimensions() { + return EntityDimensions.scalable(1.0F, 1.5F); + } + + @Override + public void tickPassive(GlimmerEntity entity, Player owner) { + owner.addEffect(new MobEffectInstance(AntarchyObjects.BLOODGLASS_WARD.get(), PASSIVE_REFRESH_DURATION, WARD_AMPLIFIER, false, false, true)); + } + + @Override + public void tickPassiveEveryTick(GlimmerEntity entity, Player owner) { + if (!(owner instanceof BloodglassAccess access)) { + return; + } + + long lostNow = access.antarchy$getArmorShieldLostCount() + access.antarchy$getAppleShieldLostCount(); + long lastLost = entity.getLastOwnerShieldLostCount(); + if (lastLost >= 0L && lostNow > lastLost && !entity.isAbilityOnCooldown()) { + this.shatterWard(entity, owner); + } + entity.setLastOwnerShieldLostCount(lostNow); + } + + @Override + public void clearPassive(GlimmerEntity entity, Player owner) { + entity.setLastOwnerShieldLostCount(-1L); + } + + @Override + public int abilityCooldownTicks() { + return ABILITY_COOLDOWN_TICKS; + } + + @Override + @Nullable + public software.bernie.geckolib.animation.RawAnimation abilityAnimation() { + return software.bernie.geckolib.animation.RawAnimation.begin().thenPlay("cry"); + } + + private void shatterWard(GlimmerEntity entity, Player owner) { + entity.playAbilityAnimation(CRY_ANIM_TICKS); + entity.playSound(SoundEvents.PANDA_CANT_BREED, 1.2F, 0.7F); + entity.level().playSound(null, entity.blockPosition(), SoundEvents.GLASS_BREAK, entity.getSoundSource(), 1.0F, 0.6F); + + AABB area = owner.getBoundingBox().inflate(SHOCKWAVE_RADIUS); + for (Entity nearby : owner.level().getEntities(owner, area)) { + if (nearby instanceof Projectile projectile) { + Vec3 away = projectile.position().subtract(owner.position()).normalize(); + projectile.setDeltaMovement(away.scale(1.5D)); + continue; + } + + if (nearby instanceof LivingEntity living && (nearby instanceof Enemy || living.getLastHurtByMob() == owner)) { + Vec3 away = living.position().subtract(owner.position()); + double horizontalDistance = Math.max(0.1D, away.horizontalDistance()); + living.knockback(SHOCKWAVE_KNOCKBACK, -away.x / horizontalDistance, -away.z / horizontalDistance); + } + } + + this.sendAbilityMessage(owner, Component.translatable("entity.antarchy.glimmer.ability.elka")); + entity.startAbilityCooldown(); + } +} diff --git a/common/src/main/java/com/craisinlord/antarchy/content/entity/glimmer/GlimmerEntity.java b/common/src/main/java/com/craisinlord/antarchy/content/entity/glimmer/GlimmerEntity.java new file mode 100644 index 00000000..f907feef --- /dev/null +++ b/common/src/main/java/com/craisinlord/antarchy/content/entity/glimmer/GlimmerEntity.java @@ -0,0 +1,551 @@ +package com.craisinlord.antarchy.content.entity.glimmer; + +import com.craisinlord.antarchy.config.AntarchySettings; +import com.craisinlord.antarchy.content.AntarchyObjects; +import com.craisinlord.antarchy.content.client.particle.GlimmerParticles; +import com.craisinlord.antarchy.Antarchy; +import net.minecraft.network.chat.Component; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.syncher.EntityDataAccessor; +import net.minecraft.network.syncher.EntityDataSerializers; +import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Holder; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.util.Mth; +import net.minecraft.world.DifficultyInstance; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.AgeableMob; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityDimensions; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.MobSpawnType; +import net.minecraft.world.entity.Pose; +import net.minecraft.world.entity.SpawnGroupData; +import net.minecraft.world.entity.TamableAnimal; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.goal.Goal; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.ServerLevelAccessor; +import net.minecraft.world.phys.shapes.VoxelShape; +import org.jetbrains.annotations.Nullable; +import software.bernie.geckolib.animatable.GeoEntity; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.animation.AnimationController; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.animation.PlayState; +import software.bernie.geckolib.animation.RawAnimation; +import software.bernie.geckolib.util.GeckoLibUtil; + +public class GlimmerEntity extends TamableAnimal implements GeoEntity { + private static final ResourceKey GLIMMERING_POOLS = ResourceKey.create( + Registries.BIOME, + ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "glimmering_pools") + ); + private static final RawAnimation IDLE_ANIM = RawAnimation.begin().thenLoop("idle"); + private static final RawAnimation WALK_ANIM = RawAnimation.begin().thenLoop("walk"); + + private static final EntityDataAccessor VARIANT = + SynchedEntityData.defineId(GlimmerEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor SHEAR_COOLDOWN = + SynchedEntityData.defineId(GlimmerEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor FADE_TICKS = + SynchedEntityData.defineId(GlimmerEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor FOLLOWING = + SynchedEntityData.defineId(GlimmerEntity.class, EntityDataSerializers.BOOLEAN); + private static final EntityDataAccessor ABILITY_COOLDOWN = + SynchedEntityData.defineId(GlimmerEntity.class, EntityDataSerializers.INT); + private static final EntityDataAccessor GROWTH_SCALE = + SynchedEntityData.defineId(GlimmerEntity.class, EntityDataSerializers.FLOAT); + private static final EntityDataAccessor ABILITY_ANIM_TICKS = + SynchedEntityData.defineId(GlimmerEntity.class, EntityDataSerializers.INT); + + public static final int FADE_DURATION_TICKS = 40; + private static final int PASSIVE_RANGE = 16; + private static final int PASSIVE_EFFECT_REFRESH_TICKS = 60; + + private static final String VARIANT_KEY = "GlimmerVariant"; + private static final String SHEAR_COOLDOWN_KEY = "ShearCooldown"; + private static final String VARIANT_LOCKED_KEY = "VariantLocked"; + private static final String FOLLOWING_KEY = "GlimmerFollowing"; + private static final String ABILITY_COOLDOWN_KEY = "AbilityCooldown"; + + private final AnimatableInstanceCache geoCache = GeckoLibUtil.createInstanceCache(this); + private boolean variantLocked; + private float lastOwnerExhaustion = -1.0F; + private long lastOwnerShieldLostCount = -1L; + + public GlimmerEntity(EntityType entityType, Level level) { + super(entityType, level); + this.noPhysics = true; + this.setInvulnerable(true); + } + + public static AttributeSupplier.Builder createAttributes() { + return TamableAnimal.createMobAttributes() + .add(Attributes.MAX_HEALTH, AntarchySettings.glimmerHealth()) + .add(Attributes.MOVEMENT_SPEED, 0.3D) + .add(Attributes.FOLLOW_RANGE, 24.0D); + } + + @Override + public boolean isPushable() { + return false; + } + + @Override + public void push(Entity entity) { + // no-op: Glimmers pass through other entities + } + + @Override + public boolean isInvulnerableTo(DamageSource damageSource) { + return true; + } + + @Override + public int getMaxHeadYRot() { + return this.getVariant() == GlimmerVariant.FROG ? 5 : super.getMaxHeadYRot(); + } + + @Override + protected void defineSynchedData(SynchedEntityData.Builder builder) { + super.defineSynchedData(builder); + builder.define(VARIANT, GlimmerVariant.APPLE_COW.ordinal()); + builder.define(SHEAR_COOLDOWN, 0); + builder.define(FADE_TICKS, 0); + builder.define(FOLLOWING, true); + builder.define(ABILITY_COOLDOWN, 0); + builder.define(GROWTH_SCALE, 1.0F); + builder.define(ABILITY_ANIM_TICKS, 0); + } + + public void playAbilityAnimation(int ticks) { + this.entityData.set(ABILITY_ANIM_TICKS, ticks); + } + + /** + * Ticks remaining in the daytime despawn fade-out, or 0 if not currently fading. + * Used client-side to fade the render alpha to nothing before the entity is removed. + */ + public int getFadeTicks() { + return this.entityData.get(FADE_TICKS); + } + + public float getFadeAlpha(float partialTick) { + int ticks = this.getFadeTicks(); + if (ticks <= 0) { + return 1.0F; + } + return Mth.clamp((ticks - partialTick) / (float) FADE_DURATION_TICKS, 0.0F, 1.0F); + } + + public boolean isFollowingOwner() { + return this.entityData.get(FOLLOWING); + } + + public boolean isAbilityOnCooldown() { + return this.entityData.get(ABILITY_COOLDOWN) > 0; + } + + public void startAbilityCooldown() { + this.entityData.set(ABILITY_COOLDOWN, this.getVariant().getBehavior().abilityCooldownTicks()); + } + + public float getAbilityCooldownFraction(float partialTick) { + int max = this.getVariant().getBehavior().abilityCooldownTicks(); + if (max <= 0) { + return 0.0F; + } + int ticks = this.entityData.get(ABILITY_COOLDOWN); + return Mth.clamp((ticks - partialTick) / (float) max, 0.0F, 1.0F); + } + + public float getLastOwnerExhaustion() { + return this.lastOwnerExhaustion; + } + + public void setLastOwnerExhaustion(float value) { + this.lastOwnerExhaustion = value; + } + + public long getLastOwnerShieldLostCount() { + return this.lastOwnerShieldLostCount; + } + + public void setLastOwnerShieldLostCount(long value) { + this.lastOwnerShieldLostCount = value; + } + + public float getGrowthScale() { + return this.entityData.get(GROWTH_SCALE); + } + + public void setGrowthScale(float scale) { + this.entityData.set(GROWTH_SCALE, scale); + this.refreshDimensions(); + } + + private void cycleMovementState(Player player) { + if (this.isOrderedToSit()) { + this.setOrderedToSit(false); + this.entityData.set(FOLLOWING, true); + player.displayClientMessage(Component.translatable("entity.antarchy.glimmer.set_follow"), true); + } else if (this.isFollowingOwner()) { + this.entityData.set(FOLLOWING, false); + player.displayClientMessage(Component.translatable("entity.antarchy.glimmer.set_wander"), true); + } else { + this.setOrderedToSit(true); + this.getNavigation().stop(); + player.displayClientMessage(Component.translatable("entity.antarchy.glimmer.set_sit"), true); + } + } + + public GlimmerVariant getVariant() { + int ordinal = Mth.clamp(this.entityData.get(VARIANT), 0, GlimmerVariant.values().length - 1); + return GlimmerVariant.values()[ordinal]; + } + + public void setVariant(GlimmerVariant variant) { + this.entityData.set(VARIANT, variant.ordinal()); + } + + public void lockVariant(GlimmerVariant variant) { + this.setVariant(variant); + this.variantLocked = true; + } + + @Override + public void onSyncedDataUpdated(EntityDataAccessor key) { + super.onSyncedDataUpdated(key); + if (VARIANT.equals(key)) { + this.refreshDimensions(); + if (!this.level().isClientSide) { + this.goalSelector.removeAllGoals(goal -> true); + this.targetSelector.removeAllGoals(goal -> true); + this.registerGoals(); + } + } + } + + @Override + public EntityDimensions getDefaultDimensions(Pose pose) { + GlimmerVariantBehavior behavior = this.getVariant().getBehavior(); + EntityDimensions base = this.isBaby() ? behavior.babyDimensions() : behavior.adultDimensions(); + float growth = this.getGrowthScale(); + return growth == 1.0F ? base : base.scale(growth); + } + + @Override + protected void ageBoundaryReached() { + super.ageBoundaryReached(); + this.refreshDimensions(); + } + + public boolean isShearCooldownActive() { + return this.entityData.get(SHEAR_COOLDOWN) > 0; + } + + public void startShearCooldown(int ticks) { + this.entityData.set(SHEAR_COOLDOWN, ticks); + } + + @Override + protected void registerGoals() { + this.goalSelector.addGoal(1, new net.minecraft.world.entity.ai.goal.SitWhenOrderedToGoal(this)); + this.goalSelector.addGoal(3, new GlimmerFollowOwnerGoal(this, this.getVariant().getBehavior().followSpeedModifier())); + this.getVariant().getBehavior().registerGoals(this); + } + + public void addGoal(int priority, Goal goal) { + this.goalSelector.addGoal(priority, goal); + } + + public void addTargetGoal(int priority, Goal goal) { + this.targetSelector.addGoal(priority, goal); + } + + @Override + @Nullable + public AgeableMob getBreedOffspring(ServerLevel level, AgeableMob otherParent) { + return null; + } + + @Override + public boolean isFood(ItemStack stack) { + return false; + } + + @Override + public boolean doHurtTarget(Entity target) { + boolean hurt = super.doHurtTarget(target); + if (hurt) { + this.getVariant().getBehavior().onHurtTarget(this, target); + } + return hurt; + } + + @Override + public InteractionResult mobInteract(Player player, InteractionHand hand) { + ItemStack stack = player.getItemInHand(hand); + + if (!this.isTame() && stack.is(AntarchyObjects.SPIRIT_APPLE.get())) { + return this.tameWithSpiritApple(player, hand, stack); + } + + if (this.isTame() && this.isOwnedBy(player) && stack.is(net.minecraft.world.item.Items.GLASS_BOTTLE)) { + return this.captureInBottle(player, hand, stack); + } + + if (this.isTame() && this.isOwnedBy(player) && stack.isEmpty() && !player.isSecondaryUseActive()) { + if (!this.level().isClientSide) { + this.cycleMovementState(player); + } + return InteractionResult.SUCCESS; + } + + InteractionResult variantResult = this.getVariant().getBehavior().onInteract(this, player, stack, hand); + if (variantResult != null) { + return variantResult; + } + + return super.mobInteract(player, hand); + } + + private InteractionResult tameWithSpiritApple(Player player, InteractionHand hand, ItemStack stack) { + if (this.level().isClientSide) { + return InteractionResult.CONSUME; + } + + this.usePlayerItem(player, hand, stack); + this.tame(player); + this.setOrderedToSit(false); + this.level().broadcastEntityEvent(this, (byte) 7); + GlimmerParticles.tickBurst(this); + + if (this.level() instanceof ServerLevel serverLevel) { + GlimmerCompanionSavedData.replaceCompanion(serverLevel.getServer(), player.getUUID(), this.getUUID()); + } + + if (player instanceof net.minecraft.server.level.ServerPlayer serverPlayer) { + com.craisinlord.antarchy.content.AntarchyAdvancements.award(serverPlayer, this.getVariant().tameAdvancementId()); + } + + return InteractionResult.SUCCESS; + } + + private InteractionResult captureInBottle(Player player, InteractionHand hand, ItemStack stack) { + if (this.level().isClientSide) { + return InteractionResult.CONSUME; + } + + ItemStack filled = com.craisinlord.antarchy.content.item.GlimmerBottleItem.create(this.getVariant()); + ItemStack result = net.minecraft.world.item.ItemUtils.createFilledResult(stack, player, filled); + player.setItemInHand(hand, result); + this.playSound(net.minecraft.sounds.SoundEvents.BOTTLE_FILL, 1.0F, 1.0F); + + if (this.level() instanceof ServerLevel serverLevel) { + GlimmerCompanionSavedData.clearCompanion(serverLevel.getServer(), player.getUUID(), this.getUUID()); + } + + this.discard(); + return InteractionResult.SUCCESS; + } + + @Override + @Nullable + public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, MobSpawnType spawnReason, @Nullable SpawnGroupData spawnGroupData) { + SpawnGroupData result = super.finalizeSpawn(level, difficulty, spawnReason, spawnGroupData); + if (!this.variantLocked) { + this.setVariant(selectNaturalVariant(level, this.blockPosition())); + this.variantLocked = true; + } + return result; + } + + private GlimmerVariant selectNaturalVariant(ServerLevelAccessor level, BlockPos pos) { + Holder biome = level.getBiome(pos); + if (biome.is(GLIMMERING_POOLS)) { + GlimmerVariant[] poolVariants = new GlimmerVariant[] { + GlimmerVariant.FROG, + GlimmerVariant.OURANWOOD_DEER, + GlimmerVariant.APPLE_COW + }; + return poolVariants[this.random.nextInt(poolVariants.length)]; + } + return GlimmerVariant.random(this.random); + } + + @Override + public void tick() { + super.tick(); + + GlimmerParticles.tickAmbient(this, this.getDeltaMovement().horizontalDistanceSqr() > 0.01D); + + if (!this.level().isClientSide) { + int fadeTicks = this.entityData.get(FADE_TICKS); + if (this.isTame()) { + if (fadeTicks > 0) { + this.entityData.set(FADE_TICKS, 0); + } + } else if (fadeTicks > 0 || this.level().isDay()) { + if (fadeTicks <= 0) { + fadeTicks = FADE_DURATION_TICKS; + } + fadeTicks--; + this.entityData.set(FADE_TICKS, fadeTicks); + if (fadeTicks <= 0) { + this.discard(); + return; + } + } + + int shearCooldown = this.entityData.get(SHEAR_COOLDOWN); + if (shearCooldown > 0) { + this.entityData.set(SHEAR_COOLDOWN, shearCooldown - 1); + } + + this.applyGroundSupport(); + this.getVariant().getBehavior().customTick(this); + this.tickAbilitiesAndPassive(); + this.tickGrowthDecay(); + } + } + + private void tickAbilitiesAndPassive() { + int cooldown = this.entityData.get(ABILITY_COOLDOWN); + if (cooldown > 0) { + this.entityData.set(ABILITY_COOLDOWN, cooldown - 1); + } + + int animTicks = this.entityData.get(ABILITY_ANIM_TICKS); + if (animTicks > 0) { + this.entityData.set(ABILITY_ANIM_TICKS, animTicks - 1); + } + + if (!this.isTame() || !(this.getOwner() instanceof Player owner)) { + return; + } + + boolean nearby = owner.level() == this.level() + && this.distanceToSqr(owner) <= (double) (PASSIVE_RANGE * PASSIVE_RANGE); + if (!nearby) { + this.getVariant().getBehavior().clearPassive(this, owner); + return; + } + + if (this.tickCount % PASSIVE_EFFECT_REFRESH_TICKS == 0) { + this.getVariant().getBehavior().tickPassive(this, owner); + } + this.getVariant().getBehavior().tickPassiveEveryTick(this, owner); + + if (cooldown <= 0) { + this.getVariant().getBehavior().tickAbilityCheck(this, owner); + } + } + + private void tickGrowthDecay() { + float scale = this.getGrowthScale(); + if (scale == 1.0F) { + return; + } + double decayPerTick = this.getVariant().getBehavior().growthDecayPerTick(); + if (decayPerTick <= 0.0D) { + return; + } + float next = scale > 1.0F + ? (float) Math.max(1.0D, scale - decayPerTick) + : (float) Math.min(1.0D, scale + decayPerTick); + if (next != scale) { + this.setGrowthScale(next); + } + } + + private void applyGroundSupport() { + BlockPos below = BlockPos.containing(this.getX(), this.getY() - 0.05D, this.getZ()); + VoxelShape shape = this.level().getBlockState(below).getCollisionShape(this.level(), below); + if (!shape.isEmpty()) { + double top = below.getY() + shape.max(Direction.Axis.Y); + if (this.getY() <= top + 0.2D && this.getDeltaMovement().y <= 0.0D) { + this.setPos(this.getX(), top, this.getZ()); + this.setDeltaMovement(this.getDeltaMovement().x, 0.0D, this.getDeltaMovement().z); + this.setOnGround(true); + return; + } + } + this.setOnGround(false); + } + + @Override + public void addAdditionalSaveData(CompoundTag tag) { + super.addAdditionalSaveData(tag); + tag.putString(VARIANT_KEY, this.getVariant().name()); + tag.putInt(SHEAR_COOLDOWN_KEY, this.entityData.get(SHEAR_COOLDOWN)); + tag.putBoolean(VARIANT_LOCKED_KEY, this.variantLocked); + tag.putBoolean(FOLLOWING_KEY, this.isFollowingOwner()); + tag.putInt(ABILITY_COOLDOWN_KEY, this.entityData.get(ABILITY_COOLDOWN)); + } + + @Override + public void readAdditionalSaveData(CompoundTag tag) { + super.readAdditionalSaveData(tag); + if (tag.contains(VARIANT_KEY)) { + this.setVariant(GlimmerVariant.byName(tag.getString(VARIANT_KEY))); + } + this.entityData.set(SHEAR_COOLDOWN, tag.getInt(SHEAR_COOLDOWN_KEY)); + this.variantLocked = tag.getBoolean(VARIANT_LOCKED_KEY); + this.entityData.set(FOLLOWING, !tag.contains(FOLLOWING_KEY) || tag.getBoolean(FOLLOWING_KEY)); + this.entityData.set(ABILITY_COOLDOWN, tag.getInt(ABILITY_COOLDOWN_KEY)); + } + + @Override + protected SoundEvent getAmbientSound() { + return this.getVariant().getBehavior().ambientSound(); + } + + @Override + protected SoundEvent getHurtSound(DamageSource damageSource) { + return this.getVariant().getBehavior().hurtSound(); + } + + @Override + protected SoundEvent getDeathSound() { + return this.getVariant().getBehavior().deathSound(); + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar controllers) { + controllers.add(new AnimationController<>(this, "main_controller", 0, this::mainAnimController)); + } + + private PlayState mainAnimController(AnimationState state) { + if (this.entityData.get(ABILITY_ANIM_TICKS) > 0) { + RawAnimation abilityAnim = this.getVariant().getBehavior().abilityAnimation(); + if (abilityAnim != null) { + return state.setAndContinue(abilityAnim); + } + } + if (state.isMoving()) { + RawAnimation movingAnim = this.getVariant().getBehavior().movingAnimation(this); + return state.setAndContinue(movingAnim != null ? movingAnim : WALK_ANIM); + } + return state.setAndContinue(IDLE_ANIM); + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return this.geoCache; + } +} diff --git a/common/src/main/java/com/craisinlord/antarchy/content/entity/glimmer/GlimmerFollowOwnerGoal.java b/common/src/main/java/com/craisinlord/antarchy/content/entity/glimmer/GlimmerFollowOwnerGoal.java new file mode 100644 index 00000000..69a3e73e --- /dev/null +++ b/common/src/main/java/com/craisinlord/antarchy/content/entity/glimmer/GlimmerFollowOwnerGoal.java @@ -0,0 +1,77 @@ +package com.craisinlord.antarchy.content.entity.glimmer; + +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.ai.goal.Goal; + +import java.util.EnumSet; + +public class GlimmerFollowOwnerGoal extends Goal { + private static final float START_DISTANCE = 8.0F; + private static final float STOP_DISTANCE = 3.0F; + private static final float TELEPORT_DISTANCE = 20.0F; + + private final GlimmerEntity glimmer; + private final double speedModifier; + private LivingEntity owner; + + public GlimmerFollowOwnerGoal(GlimmerEntity glimmer, double speedModifier) { + this.glimmer = glimmer; + this.speedModifier = speedModifier; + this.setFlags(EnumSet.of(Flag.MOVE, Flag.LOOK)); + } + + @Override + public boolean canUse() { + if (!this.glimmer.isTame() || this.glimmer.isOrderedToSit() || !this.glimmer.isFollowingOwner()) { + return false; + } + + LivingEntity owner = this.glimmer.getOwner(); + if (owner == null || owner.isSpectator()) { + return false; + } + + if (this.glimmer.distanceToSqr(owner) < START_DISTANCE * START_DISTANCE) { + return false; + } + + this.owner = owner; + return true; + } + + @Override + public boolean canContinueToUse() { + if (this.owner == null || !this.glimmer.isTame() || this.glimmer.isOrderedToSit() || !this.glimmer.isFollowingOwner()) { + return false; + } + return this.glimmer.distanceToSqr(this.owner) > STOP_DISTANCE * STOP_DISTANCE; + } + + @Override + public void start() { + this.glimmer.getNavigation().stop(); + } + + @Override + public void stop() { + this.owner = null; + this.glimmer.getNavigation().stop(); + } + + @Override + public void tick() { + if (this.owner == null) { + return; + } + + this.glimmer.getLookControl().setLookAt(this.owner, 10.0F, this.glimmer.getMaxHeadXRot()); + + double distanceSq = this.glimmer.distanceToSqr(this.owner); + if (distanceSq > TELEPORT_DISTANCE * TELEPORT_DISTANCE) { + this.glimmer.teleportTo(this.owner.getX(), this.owner.getY(), this.owner.getZ()); + return; + } + + this.glimmer.getNavigation().moveTo(this.owner, this.speedModifier); + } +} diff --git a/common/src/main/java/com/craisinlord/antarchy/content/entity/glimmer/GlimmerFrogBehavior.java b/common/src/main/java/com/craisinlord/antarchy/content/entity/glimmer/GlimmerFrogBehavior.java new file mode 100644 index 00000000..b563d363 --- /dev/null +++ b/common/src/main/java/com/craisinlord/antarchy/content/entity/glimmer/GlimmerFrogBehavior.java @@ -0,0 +1,172 @@ +package com.craisinlord.antarchy.content.entity.glimmer; + +import com.craisinlord.antarchy.Antarchy; +import com.craisinlord.antarchy.content.AntarchyObjects; +import com.craisinlord.antarchy.content.entity.multipart.MultipartEntityOwner; +import net.minecraft.core.registries.Registries; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.tags.TagKey; +import net.minecraft.util.Mth; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityDimensions; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.ai.goal.FloatGoal; +import net.minecraft.world.entity.ai.goal.LookAtPlayerGoal; +import net.minecraft.world.entity.ai.goal.MeleeAttackGoal; +import net.minecraft.world.entity.ai.goal.RandomLookAroundGoal; +import net.minecraft.world.entity.ai.goal.WaterAvoidingRandomStrollGoal; +import net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal; +import net.minecraft.world.entity.boss.enderdragon.EnderDragon; +import net.minecraft.world.entity.boss.wither.WitherBoss; +import net.minecraft.world.entity.monster.Enemy; +import net.minecraft.world.entity.monster.MagmaCube; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.phys.AABB; + +public class GlimmerFrogBehavior implements GlimmerVariantBehavior { + private static final int SMALL_SLIME_SIZE = 1; + private static final TagKey> NO_EAT_TAG = + TagKey.create(Registries.ENTITY_TYPE, ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "frog_glimmer_no_eat")); + private static final int PASSIVE_REFRESH_DURATION = 20 * 4; + private static final int ABILITY_COOLDOWN_TICKS = 20 * 120; + private static final double EAT_RANGE = 8.0D; + private static final float GROWTH_PER_EAT_MIN = 0.05F; + private static final float GROWTH_PER_EAT_MAX = 0.6F; + private static final float GROWTH_MAX_SCALE = 2.2F; + private static final double GROWTH_DECAY_PER_TICK = 0.0006D; + + private static ResourceLocation rl(String path) { + return ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, path); + } + + @Override + public void registerGoals(GlimmerEntity entity) { + entity.addGoal(0, new FloatGoal(entity)); + entity.addGoal(1, new MeleeAttackGoal(entity, 1.1D, true)); + entity.addGoal(5, new WaterAvoidingRandomStrollGoal(entity, 1.0D)); + entity.addGoal(6, new LookAtPlayerGoal(entity, Player.class, 8.0F)); + entity.addGoal(7, new RandomLookAroundGoal(entity)); + entity.addTargetGoal(2, new NearestAttackableTargetGoal<>(entity, MagmaCube.class, 10, true, false, + magmaCube -> ((MagmaCube) magmaCube).getSize() == SMALL_SLIME_SIZE)); + } + + @Override + public void onHurtTarget(GlimmerEntity entity, Entity target) { + if (!(target instanceof MagmaCube magmaCube) || magmaCube.isAlive() || magmaCube.getSize() != SMALL_SLIME_SIZE) { + return; + } + + entity.spawnAtLocation(AntarchyObjects.LUMEN_FROGLIGHT.get()); + } + + @Override + public ResourceLocation modelGeo() { + return rl("geo/apple_cow.geo.json"); + } + + @Override + public ResourceLocation animationFile() { + return rl("animations/apple_cow.animation.json"); + } + + @Override + public ResourceLocation texture(GlimmerEntity entity) { + return rl("textures/entity/glimmer/frog_glimmer.png"); + } + + @Override + public ResourceLocation emissiveTexture(GlimmerEntity entity) { + return rl("textures/entity/glimmer/frog_glimmer_emmisive.png"); + } + + @Override + public SoundEvent ambientSound() { + return SoundEvents.FROG_AMBIENT; + } + + @Override + public SoundEvent hurtSound() { + return SoundEvents.FROG_HURT; + } + + @Override + public SoundEvent deathSound() { + return SoundEvents.FROG_DEATH; + } + + @Override + public EntityDimensions adultDimensions() { + // Matches vanilla Frog's real hitbox. + return EntityDimensions.scalable(0.5F, 0.5F); + } + + @Override + public void tickPassive(GlimmerEntity entity, Player owner) { + owner.addEffect(new MobEffectInstance(MobEffects.JUMP, PASSIVE_REFRESH_DURATION, 0, false, false, true)); + } + + @Override + public int abilityCooldownTicks() { + return ABILITY_COOLDOWN_TICKS; + } + + @Override + public double growthDecayPerTick() { + return GROWTH_DECAY_PER_TICK; + } + + @Override + public void tickAbilityCheck(GlimmerEntity entity, Player owner) { + LivingEntity target = findEdibleTarget(entity, owner); + if (target != null) { + this.eatTarget(entity, owner, target); + } + } + + private static LivingEntity findEdibleTarget(GlimmerEntity entity, Player owner) { + AABB area = owner.getBoundingBox().inflate(EAT_RANGE); + LivingEntity best = null; + double bestDistSq = EAT_RANGE * EAT_RANGE; + for (Entity candidate : owner.level().getEntities(entity, area)) { + if (!(candidate instanceof Enemy) || !(candidate instanceof LivingEntity living) || !living.isAlive()) { + continue; + } + if (isExcluded(living)) { + continue; + } + double distSq = candidate.distanceToSqr(owner); + if (distSq > bestDistSq) { + continue; + } + bestDistSq = distSq; + best = living; + } + return best; + } + + private static boolean isExcluded(LivingEntity target) { + if (target instanceof MultipartEntityOwner || target instanceof EnderDragon || target instanceof WitherBoss) { + return true; + } + return target.getType().is(NO_EAT_TAG); + } + + private void eatTarget(GlimmerEntity entity, Player owner, LivingEntity target) { + float growthAdd = Mth.clamp(target.getMaxHealth() / 40.0F, GROWTH_PER_EAT_MIN, GROWTH_PER_EAT_MAX); + entity.setGrowthScale(Math.min(GROWTH_MAX_SCALE, entity.getGrowthScale() + growthAdd)); + + Component targetName = target.getDisplayName(); + entity.playSound(SoundEvents.FROG_EAT, 1.2F, 0.9F); + target.teleportTo(entity.getX(), entity.getY() + entity.getBbHeight() * 0.5D, entity.getZ()); + target.remove(Entity.RemovalReason.DISCARDED); + + this.sendAbilityMessage(owner, Component.translatable("entity.antarchy.glimmer.ability.frog", targetName)); + entity.startAbilityCooldown(); + } +} diff --git a/common/src/main/java/com/craisinlord/antarchy/content/entity/glimmer/GlimmerOuranwoodDeerBehavior.java b/common/src/main/java/com/craisinlord/antarchy/content/entity/glimmer/GlimmerOuranwoodDeerBehavior.java new file mode 100644 index 00000000..e607c230 --- /dev/null +++ b/common/src/main/java/com/craisinlord/antarchy/content/entity/glimmer/GlimmerOuranwoodDeerBehavior.java @@ -0,0 +1,175 @@ +package com.craisinlord.antarchy.content.entity.glimmer; + +import com.craisinlord.antarchy.Antarchy; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityDimensions; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.ai.goal.FloatGoal; +import net.minecraft.world.entity.ai.goal.LookAtPlayerGoal; +import net.minecraft.world.entity.ai.goal.RandomLookAroundGoal; +import net.minecraft.world.entity.ai.goal.WaterAvoidingRandomStrollGoal; +import net.minecraft.world.entity.monster.Enemy; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.Vec3; +import org.jetbrains.annotations.Nullable; +import software.bernie.geckolib.animation.RawAnimation; + +public class GlimmerOuranwoodDeerBehavior implements GlimmerVariantBehavior { + private static final int PASSIVE_REFRESH_DURATION = 20 * 4; + private static final int ABILITY_COOLDOWN_TICKS = 20 * 10; + private static final double FOLLOW_SPEED_MODIFIER = 1.75D; + private static final RawAnimation RUN_ANIM = RawAnimation.begin().thenLoop("run"); + private static final double CHARGE_RANGE = 12.0D; + private static final double CHARGE_CONE_DOT = 0.5D; + private static final double CHARGE_CORRIDOR_WIDTH = 1.75D; + private static final float CHARGE_DAMAGE = 9.0F; + private static final double CHARGE_KNOCKBACK = 1.6D; + private static final int CHARGE_ANIM_TICKS = 45; + + private static ResourceLocation rl(String path) { + return ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, path); + } + + @Override + public void registerGoals(GlimmerEntity entity) { + entity.addGoal(0, new FloatGoal(entity)); + entity.addGoal(5, new WaterAvoidingRandomStrollGoal(entity, 1.15D)); + entity.addGoal(6, new LookAtPlayerGoal(entity, Player.class, 8.0F)); + entity.addGoal(7, new RandomLookAroundGoal(entity)); + } + + @Override + public ResourceLocation modelGeo() { + return rl("geo/ouranwood_deer.geo.json"); + } + + @Override + public ResourceLocation animationFile() { + return rl("animations/ouranwood_deer.animation.json"); + } + + @Override + public ResourceLocation texture(GlimmerEntity entity) { + return rl("textures/entity/glimmer/deer_glimmer.png"); + } + + @Override + public ResourceLocation emissiveTexture(GlimmerEntity entity) { + return rl("textures/entity/glimmer/deer_glimmer_emissive.png"); + } + + @Override + public SoundEvent ambientSound() { + return SoundEvents.FOX_AMBIENT; + } + + @Override + public SoundEvent hurtSound() { + return SoundEvents.FOX_HURT; + } + + @Override + public SoundEvent deathSound() { + return SoundEvents.FOX_DEATH; + } + + @Override + public EntityDimensions adultDimensions() { + return EntityDimensions.scalable(1.35F, 2.1F); + } + + @Override + public EntityDimensions babyDimensions() { + return EntityDimensions.scalable(0.9F, 1.4F); + } + + @Override + public void tickPassive(GlimmerEntity entity, Player owner) { + owner.addEffect(new MobEffectInstance(MobEffects.MOVEMENT_SPEED, PASSIVE_REFRESH_DURATION, 0, false, false, true)); + } + + @Override + public double followSpeedModifier() { + return FOLLOW_SPEED_MODIFIER; + } + + @Override + @Nullable + public RawAnimation movingAnimation(GlimmerEntity entity) { + return entity.isFollowingOwner() ? RUN_ANIM : null; + } + + @Override + public int abilityCooldownTicks() { + return ABILITY_COOLDOWN_TICKS; + } + + @Override + @Nullable + public RawAnimation abilityAnimation() { + return RawAnimation.begin().thenPlay("charge_start").thenPlay("charge_loop").thenPlay("charge_end"); + } + + @Override + public void tickAbilityCheck(GlimmerEntity entity, Player owner) { + if (!owner.isSprinting()) { + return; + } + + Vec3 look = owner.getLookAngle(); + LivingEntity bestTarget = null; + double bestDistSq = CHARGE_RANGE * CHARGE_RANGE; + for (Entity candidate : owner.level().getEntities(owner, owner.getBoundingBox().inflate(CHARGE_RANGE))) { + if (!(candidate instanceof Enemy) || !(candidate instanceof LivingEntity living) || !living.isAlive()) { + continue; + } + Vec3 toTarget = candidate.position().subtract(owner.position()); + double distSq = toTarget.lengthSqr(); + if (distSq > bestDistSq) { + continue; + } + if (toTarget.normalize().dot(look) < CHARGE_CONE_DOT) { + continue; + } + bestDistSq = distSq; + bestTarget = living; + } + + if (bestTarget != null) { + this.performCharge(entity, owner, bestTarget); + } + } + + private void performCharge(GlimmerEntity entity, Player owner, LivingEntity target) { + Vec3 from = entity.position(); + Vec3 direction = target.position().subtract(from); + double horizontalDistance = Math.max(1.0D, direction.horizontalDistance()); + double dirX = direction.x / horizontalDistance; + double dirZ = direction.z / horizontalDistance; + + entity.setDeltaMovement(dirX * 1.4D, entity.getDeltaMovement().y, dirZ * 1.4D); + entity.playAbilityAnimation(CHARGE_ANIM_TICKS); + entity.playSound(SoundEvents.RAVAGER_ROAR, 1.0F, 1.3F); + + AABB corridor = new AABB(from, target.position()).inflate(CHARGE_CORRIDOR_WIDTH, 1.5D, CHARGE_CORRIDOR_WIDTH); + for (Entity candidate : owner.level().getEntities(entity, corridor)) { + if (!(candidate instanceof Enemy) || !(candidate instanceof LivingEntity living) || !living.isAlive()) { + continue; + } + living.hurt(owner.damageSources().mobAttack(entity), CHARGE_DAMAGE); + Vec3 away = living.position().subtract(from); + double awayDistance = Math.max(0.1D, away.horizontalDistance()); + living.knockback(CHARGE_KNOCKBACK, -away.x / awayDistance, -away.z / awayDistance); + } + + this.sendAbilityMessage(owner, Component.translatable("entity.antarchy.glimmer.ability.deer")); + entity.startAbilityCooldown(); + } +} diff --git a/common/src/main/java/com/craisinlord/antarchy/content/entity/glimmer/GlimmerVariant.java b/common/src/main/java/com/craisinlord/antarchy/content/entity/glimmer/GlimmerVariant.java new file mode 100644 index 00000000..345f2f64 --- /dev/null +++ b/common/src/main/java/com/craisinlord/antarchy/content/entity/glimmer/GlimmerVariant.java @@ -0,0 +1,54 @@ +package com.craisinlord.antarchy.content.entity.glimmer; + +import com.craisinlord.antarchy.Antarchy; +import com.mojang.serialization.Codec; +import java.util.Locale; +import net.minecraft.network.chat.Component; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.resources.ResourceLocation; + +public enum GlimmerVariant { + APPLE_COW(new GlimmerAppleCowBehavior(), "apple_of_my_eye"), + OURANWOOD_DEER(new GlimmerOuranwoodDeerBehavior(), "deerly_beloved"), + FROG(new GlimmerFrogBehavior(), "hoppy_together"), + ANT(new GlimmerAntBehavior(), "spirant_animal"), + ELKA(new GlimmerElkaBehavior(), "elkcellent_choice"); + + public static final Codec CODEC = Codec.STRING.xmap(GlimmerVariant::byName, GlimmerVariant::name); + public static final StreamCodec STREAM_CODEC = + ByteBufCodecs.STRING_UTF8.map(GlimmerVariant::byName, GlimmerVariant::name); + + private final GlimmerVariantBehavior behavior; + private final ResourceLocation tameAdvancementId; + + GlimmerVariant(GlimmerVariantBehavior behavior, String tameAdvancementPath) { + this.behavior = behavior; + this.tameAdvancementId = ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, tameAdvancementPath); + } + + public GlimmerVariantBehavior getBehavior() { + return this.behavior; + } + + public ResourceLocation tameAdvancementId() { + return this.tameAdvancementId; + } + + public Component displayName() { + return Component.translatable("glimmer_variant.antarchy." + this.name().toLowerCase(Locale.ROOT)); + } + + public static GlimmerVariant random(net.minecraft.util.RandomSource random) { + GlimmerVariant[] values = values(); + return values[random.nextInt(values.length)]; + } + + public static GlimmerVariant byName(String name) { + try { + return GlimmerVariant.valueOf(name); + } catch (IllegalArgumentException ignored) { + return APPLE_COW; + } + } +} diff --git a/common/src/main/java/com/craisinlord/antarchy/content/entity/glimmer/GlimmerVariantBehavior.java b/common/src/main/java/com/craisinlord/antarchy/content/entity/glimmer/GlimmerVariantBehavior.java new file mode 100644 index 00000000..58d673f0 --- /dev/null +++ b/common/src/main/java/com/craisinlord/antarchy/content/entity/glimmer/GlimmerVariantBehavior.java @@ -0,0 +1,147 @@ +package com.craisinlord.antarchy.content.entity.glimmer; + +import net.minecraft.resources.ResourceLocation; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityDimensions; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import org.jetbrains.annotations.Nullable; + +/** + * Per-variant behavior for the composite {@link GlimmerEntity}: AI, model/texture selection, and sounds. + * One concrete implementation per {@link GlimmerVariant}, chosen via composition rather than subclassing + * so a single EntityType can be reliably reconstructed across save/load. + */ +public interface GlimmerVariantBehavior { + void registerGoals(GlimmerEntity entity); + + ResourceLocation modelGeo(); + + ResourceLocation animationFile(); + + ResourceLocation texture(GlimmerEntity entity); + + ResourceLocation emissiveTexture(GlimmerEntity entity); + + SoundEvent ambientSound(); + + SoundEvent hurtSound(); + + SoundEvent deathSound(); + + /** + * Optional variant-specific interaction (e.g. shearing the Apple Cow variant for a Spirit Apple). + * Return null to fall through to the entity's default interaction handling. + */ + @Nullable + default InteractionResult onInteract(GlimmerEntity entity, Player player, ItemStack stack, InteractionHand hand) { + return null; + } + + /** + * Optional per-tick hook for variant-specific server logic (e.g. the Basilisk's petrify gaze). + */ + default void customTick(GlimmerEntity entity) { + } + + /** + * Optional hook fired after {@code entity} lands a successful hit on {@code target} + * (e.g. the Frog variant dropping Lumen Froglight when it kills a small Magma Cube). + */ + default void onHurtTarget(GlimmerEntity entity, Entity target) { + } + + /** + * Called periodically (roughly once a second) while this Glimmer is tamed and its + * owner is nearby and loaded. Should (re)apply the variant's passive effect with a + * short duration so it naturally lapses if the owner leaves range. + */ + default void tickPassive(GlimmerEntity entity, Player owner) { + } + + /** + * Called every server tick (not just the coarse refresh interval) while nearby, for + * passives that need finer-grained bookkeeping than a periodic effect refresh (e.g. + * the Apple Cow's exhaustion dampening). + */ + default void tickPassiveEveryTick(GlimmerEntity entity, Player owner) { + } + + /** + * Called once the tick the owner leaves range (or the companion is otherwise no + * longer eligible) so any directly-applied (non-MobEffect) passive state can be undone. + */ + default void clearPassive(GlimmerEntity entity, Player owner) { + } + + /** + * Animation (from this variant's own animation file) to play while + * {@link GlimmerEntity#playAbilityAnimation(int)} is active. Null plays no override. + */ + @Nullable + default software.bernie.geckolib.animation.RawAnimation abilityAnimation() { + return null; + } + + /** + * Animation to play in place of the default walk loop while moving. Null uses the + * default walk animation (e.g. the Deer switches to its run clip while following its owner). + */ + @Nullable + default software.bernie.geckolib.animation.RawAnimation movingAnimation(GlimmerEntity entity) { + return null; + } + + /** + * Navigation speed multiplier used while following the owner (see {@link GlimmerFollowOwnerGoal}). + */ + default double followSpeedModifier() { + return 1.15D; + } + + /** + * Shared action-bar feedback helper for ability-use messages. + */ + default void sendAbilityMessage(Player owner, net.minecraft.network.chat.Component message) { + owner.displayClientMessage(message, true); + } + + /** + * Called every server tick while the owner is nearby and the ability is off cooldown. + * Implementations should check their own trigger condition and, if it fires, perform + * the ability and call {@link GlimmerEntity#startAbilityCooldown()}. + */ + default void tickAbilityCheck(GlimmerEntity entity, Player owner) { + } + + /** + * Cooldown duration for this variant's active ability, in ticks. + */ + default int abilityCooldownTicks() { + return 20 * 120; + } + + /** + * Per-tick shrink/growth-recovery rate used to decay {@link GlimmerEntity#getGrowthScale()} + * back toward 1.0 after an ability temporarily changes it. 0 means the variant never changes scale. + */ + default double growthDecayPerTick() { + return 0.0D; + } + + /** + * Hitbox size matching the real creature this variant is a "spirit" of, rather than + * a single hitbox shared by every variant. + */ + EntityDimensions adultDimensions(); + + /** + * Defaults to half the adult size, matching vanilla's typical baby scaling. + */ + default EntityDimensions babyDimensions() { + return this.adultDimensions().scale(0.5F); + } +} diff --git a/common/src/main/java/com/craisinlord/antarchy/content/entity/kraken/KrakenEntity.java b/common/src/main/java/com/craisinlord/antarchy/content/entity/kraken/KrakenEntity.java index 3d754405..327fa364 100644 --- a/common/src/main/java/com/craisinlord/antarchy/content/entity/kraken/KrakenEntity.java +++ b/common/src/main/java/com/craisinlord/antarchy/content/entity/kraken/KrakenEntity.java @@ -80,6 +80,7 @@ public class KrakenEntity extends Monster implements GeoEntity, MultipartEntityO private static final int ATTACK_GRAB = 1; private static final int ATTACK_SWING_LEFT = 2; private static final int ATTACK_SWING_RIGHT = 3; + private static final int ATTACK_SLAM = 4; // Synced animation state values private static final int ANIM_NONE = 0; @@ -87,7 +88,8 @@ public class KrakenEntity extends Monster implements GeoEntity, MultipartEntityO private static final int ANIM_GRAB = 2; private static final int ANIM_SWING_LEFT = 3; private static final int ANIM_SWING_RIGHT = 4; - private static final int ANIM_DEATH = 5; + private static final int ANIM_SLAM = 5; + private static final int ANIM_DEATH = 6; private static final int DEATH_ANIM_TICKS = 60; @@ -105,8 +107,11 @@ public class KrakenEntity extends Monster implements GeoEntity, MultipartEntityO private static final RawAnimation GRAB_ANIM = RawAnimation.begin().thenPlay("grab"); private static final RawAnimation SWING_LEFT_ANIM = RawAnimation.begin().thenPlay("swing_left"); private static final RawAnimation SWING_RIGHT_ANIM = RawAnimation.begin().thenPlay("swing_right"); + private static final RawAnimation SLAM_ANIM = RawAnimation.begin().thenPlay("attack"); private static final RawAnimation DEATH_ANIM = RawAnimation.begin().thenPlay("death"); + private static final Vec3 GRAB_ANCHOR_LOCAL = new Vec3(22.0D / 16.0D, 223.5D / 16.0D, -12.5D / 16.0D); + private final ServerBossEvent bossEvent = new ServerBossEvent(Component.literal("The Kraken"), BossEvent.BossBarColor.BLUE, BossEvent.BossBarOverlay.PROGRESS); private final AnimatableInstanceCache geoCache = GeckoLibUtil.createInstanceCache(this); @@ -208,6 +213,7 @@ public class KrakenEntity extends Monster implements GeoEntity, MultipartEntityO case ANIM_GRAB -> state.setAndContinue(GRAB_ANIM); case ANIM_SWING_LEFT -> state.setAndContinue(SWING_LEFT_ANIM); case ANIM_SWING_RIGHT -> state.setAndContinue(SWING_RIGHT_ANIM); + case ANIM_SLAM -> state.setAndContinue(SLAM_ANIM); case ANIM_DEATH -> state.setAndContinue(DEATH_ANIM); default -> PlayState.STOP; }; @@ -551,6 +557,7 @@ public class KrakenEntity extends Monster implements GeoEntity, MultipartEntityO case ATTACK_GRAB -> this.tickGrabAttack(target); case ATTACK_SWING_LEFT -> this.tickSwingAttack(false); case ATTACK_SWING_RIGHT -> this.tickSwingAttack(true); + case ATTACK_SLAM -> this.tickSlamAttack(); default -> this.finishAttack(); } } @@ -562,6 +569,9 @@ public class KrakenEntity extends Monster implements GeoEntity, MultipartEntityO if (attackState == ATTACK_GRAB) { this.actionTicks = 55; this.playSound(AntarchySoundEvents.KRAKEN_ATTACK.get(), 1.45F, 0.9F); + } else if (attackState == ATTACK_SLAM) { + this.actionTicks = 40; + this.playSound(AntarchySoundEvents.KRAKEN_ATTACK.get(), 1.55F, this.isPhaseTwo() ? 0.78F : 0.84F); } else if (attackState == ATTACK_SWING_LEFT || attackState == ATTACK_SWING_RIGHT) { this.actionTicks = 40; this.playSound(AntarchySoundEvents.KRAKEN_SPIN.get(), 1.3F, 0.95F); @@ -603,6 +613,16 @@ public class KrakenEntity extends Monster implements GeoEntity, MultipartEntityO } } + private void tickSlamAttack() { + if (this.actionTicks == 20) { + this.performSlam(); + } + + if (--this.actionTicks <= 0) { + this.finishAttack(); + } + } + private void finishAttack() { int finished = this.getAttackState(); this.setAttackState(ATTACK_NONE); @@ -652,14 +672,16 @@ public class KrakenEntity extends Monster implements GeoEntity, MultipartEntityO double distSqr = this.distanceToSqr(target); boolean canGrab = distSqr <= 64.0D; boolean canSwing = distSqr <= 81.0D; + boolean canSlam = distSqr <= 121.0D; - if (!canGrab && !canSwing) { + if (!canGrab && !canSwing && !canSlam) { return ATTACK_NONE; } int grabWeight = canGrab ? (this.lastAttackState == ATTACK_GRAB ? 1 : 4) : 0; int swingWeight = canSwing ? (this.isSwingAttack(this.lastAttackState) ? 1 : 5) : 0; - int total = grabWeight + swingWeight; + int slamWeight = canSlam ? (this.lastAttackState == ATTACK_SLAM ? 1 : 3) : 0; + int total = grabWeight + swingWeight + slamWeight; if (total == 0) { return ATTACK_NONE; } @@ -668,6 +690,10 @@ public class KrakenEntity extends Monster implements GeoEntity, MultipartEntityO if (roll < grabWeight) { return ATTACK_GRAB; } + roll -= grabWeight; + if (roll < slamWeight) { + return ATTACK_SLAM; + } return this.resolveSwingDirection(target); } @@ -675,6 +701,10 @@ public class KrakenEntity extends Monster implements GeoEntity, MultipartEntityO return attackState == ATTACK_SWING_LEFT || attackState == ATTACK_SWING_RIGHT; } + private boolean isSlamAttack(int attackState) { + return attackState == ATTACK_SLAM; + } + // Determines left vs right based on which side the target is on relative to the Kraken. // Kraken's right vector is forward x world-up. If target is on the Kraken's right side, // use swing_right (which knocks them left). If on the left, use swing_left (knocks them right). @@ -707,10 +737,28 @@ public class KrakenEntity extends Monster implements GeoEntity, MultipartEntityO } } + private void performSlam() { + if (!(this.level() instanceof ServerLevel serverLevel)) { + return; + } + + AABB hitBox = this.getBoundingBox().inflate(9.0D, 4.0D, 9.0D); + List players = this.level().getEntitiesOfClass(Player.class, hitBox, LivingEntity::isAlive); + float damage = (float) this.getAttributeValue(Attributes.ATTACK_DAMAGE) * 1.4F; + + for (Player player : players) { + if (!player.hurt(AntarchyDamageSources.krakenMauling(serverLevel, this), damage)) { + continue; + } + this.knockAway(player, 3.2D, 0.75D); + } + + serverLevel.sendParticles(ParticleTypes.SPLASH, this.getX(), this.getY() + 0.8D, this.getZ(), 40, 2.0D, 0.8D, 2.0D, 0.12D); + serverLevel.sendParticles(ParticleTypes.BUBBLE, this.getX(), this.getY() + 0.6D, this.getZ(), 30, 1.8D, 0.6D, 1.8D, 0.05D); + } + private void holdGrabbedTarget(LivingEntity target) { - Vec3 anchor = this.position() - .add(this.getViewVector(1.0F).normalize().scale(this.getBbWidth() * 0.65D)) - .add(0.0D, this.getBbHeight() * 0.28D, 0.0D); + Vec3 anchor = this.getGrabAnchorWorldPos(); target.setDeltaMovement(anchor.subtract(target.position()).scale(0.35D)); target.resetFallDistance(); if (target instanceof ServerPlayer serverPlayer) { @@ -721,6 +769,33 @@ public class KrakenEntity extends Monster implements GeoEntity, MultipartEntityO target.hurtMarked = true; } + private Vec3 getGrabAnchorWorldPos() { + Vec3 localAnchor = this.getGrabAnchorOffset(); + Vec3 rotatedAnchor = localToWorldOffset(localAnchor); + return this.position().add(rotatedAnchor); + } + + private Vec3 getGrabAnchorOffset() { + if (this.getAttackState() != ATTACK_GRAB) { + return new Vec3(this.getBbWidth() * 0.65D, this.getBbHeight() * 0.28D, 0.0D); + } + + double progress = 1.0D - (this.actionTicks / 55.0D); + double forward = Mth.lerp(progress, this.getBbWidth() * 0.45D, GRAB_ANCHOR_LOCAL.z); + double vertical = Mth.lerp(progress, this.getBbHeight() * 0.18D, GRAB_ANCHOR_LOCAL.y); + double lateral = Mth.lerp(progress, this.getBbWidth() * 0.18D, GRAB_ANCHOR_LOCAL.x); + return new Vec3(lateral, vertical, forward); + } + + private Vec3 localToWorldOffset(Vec3 localOffset) { + float bodyYawRadians = this.yBodyRot * Mth.DEG_TO_RAD; + double cos = Math.cos(bodyYawRadians); + double sin = Math.sin(bodyYawRadians); + double worldX = localOffset.x * cos - localOffset.z * sin; + double worldZ = localOffset.z * cos + localOffset.x * sin; + return new Vec3(worldX, localOffset.y, worldZ); + } + private void knockAway(LivingEntity target, double horizontalStrength, double verticalStrength) { Vec3 direction = target.position().subtract(this.position()); Vec3 horizontal = new Vec3(direction.x, 0.0D, direction.z); @@ -1123,6 +1198,10 @@ public class KrakenEntity extends Monster implements GeoEntity, MultipartEntityO this.setAnimationState(ANIM_SWING_RIGHT); return; } + case ATTACK_SLAM -> { + this.setAnimationState(ANIM_SLAM); + return; + } default -> { } } diff --git a/common/src/main/java/com/craisinlord/antarchy/content/fluid/LumenLiquidBlock.java b/common/src/main/java/com/craisinlord/antarchy/content/fluid/LumenLiquidBlock.java new file mode 100644 index 00000000..a8a7d724 --- /dev/null +++ b/common/src/main/java/com/craisinlord/antarchy/content/fluid/LumenLiquidBlock.java @@ -0,0 +1,109 @@ +package com.craisinlord.antarchy.content.fluid; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.util.RandomSource; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.LiquidBlock; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.FlowingFluid; + +public class LumenLiquidBlock extends LiquidBlock { + private static final int SOURCE_PARTICLE_INTERVAL = 8; + private static final int FLOW_PARTICLE_INTERVAL = 20; + + public LumenLiquidBlock(FlowingFluid fluid, BlockBehaviour.Properties properties) { + super(fluid, properties); + } + + @Override + protected void onPlace(BlockState state, Level level, BlockPos pos, BlockState oldState, boolean movedByPiston) { + super.onPlace(state, level, pos, oldState, movedByPiston); + scheduleCurrentLumenTick(level, pos); + } + + @Override + protected void neighborChanged(BlockState state, Level level, BlockPos pos, Block neighborBlock, BlockPos neighborPos, boolean movedByPiston) { + super.neighborChanged(state, level, pos, neighborBlock, neighborPos, movedByPiston); + scheduleCurrentLumenTick(level, pos); + } + + @Override + protected BlockState updateShape(BlockState state, Direction direction, BlockState neighborState, LevelAccessor level, BlockPos pos, BlockPos neighborPos) { + scheduleCurrentLumenTick(level, pos); + return super.updateShape(state, direction, neighborState, level, pos, neighborPos); + } + + @Override + protected void onRemove(BlockState state, Level level, BlockPos pos, BlockState newState, boolean movedByPiston) { + if (!state.is(newState.getBlock())) { + scheduleDependentLumenTicks(level, pos); + } + super.onRemove(state, level, pos, newState, movedByPiston); + } + + @Override + public void animateTick(BlockState state, Level level, BlockPos pos, RandomSource random) { + super.animateTick(state, level, pos, random); + if (!isSurfaceExposed(level, pos)) { + return; + } + + int chance = state.getValue(LEVEL) == 0 ? SOURCE_PARTICLE_INTERVAL : FLOW_PARTICLE_INTERVAL; + if (random.nextInt(chance) != 0) { + return; + } + + double x = pos.getX() + 0.15D + random.nextDouble() * 0.7D; + double y = pos.getY() + 0.76D + random.nextDouble() * 0.18D; + double z = pos.getZ() + 0.15D + random.nextDouble() * 0.7D; + level.addParticle(ParticleTypes.GLOW, x, y, z, 0.0D, 0.02D, 0.0D); + + if (random.nextInt(4) == 0) { + level.addParticle(ParticleTypes.ENCHANT, x, y + 0.02D, z, 0.0D, 0.015D, 0.0D); + } + } + + @Override + public void entityInside(BlockState state, Level level, BlockPos pos, Entity entity) { + super.entityInside(state, level, pos, entity); + if (!level.isClientSide || !(entity instanceof LivingEntity) || !isSurfaceExposed(level, pos)) { + return; + } + + RandomSource random = level.getRandom(); + if (random.nextInt(10) != 0) { + return; + } + + double x = entity.getX() + (random.nextDouble() - 0.5D) * entity.getBbWidth(); + double y = entity.getY() + 0.1D + random.nextDouble() * Math.max(0.2D, entity.getBbHeight() * 0.2D); + double z = entity.getZ() + (random.nextDouble() - 0.5D) * entity.getBbWidth(); + level.addParticle(ParticleTypes.GLOW, x, y, z, 0.0D, 0.03D, 0.0D); + if (random.nextBoolean()) { + level.addParticle(ParticleTypes.ENCHANT, x, y + 0.05D, z, 0.0D, 0.04D, 0.0D); + } + } + + private static boolean isSurfaceExposed(Level level, BlockPos pos) { + BlockState above = level.getBlockState(pos.above()); + return above.isAir() || !above.canOcclude(); + } + + private void scheduleCurrentLumenTick(LevelAccessor level, BlockPos pos) { + level.scheduleTick(pos, this.fluid, this.fluid.getTickDelay(level)); + } + + private void scheduleDependentLumenTicks(LevelAccessor level, BlockPos pos) { + level.scheduleTick(pos.above(), this.fluid, this.fluid.getTickDelay(level)); + for (Direction direction : Direction.Plane.HORIZONTAL) { + level.scheduleTick(pos.relative(direction), this.fluid, this.fluid.getTickDelay(level)); + } + } +} diff --git a/common/src/main/java/com/craisinlord/antarchy/content/item/GlimmerBottleItem.java b/common/src/main/java/com/craisinlord/antarchy/content/item/GlimmerBottleItem.java new file mode 100644 index 00000000..596c3c1b --- /dev/null +++ b/common/src/main/java/com/craisinlord/antarchy/content/item/GlimmerBottleItem.java @@ -0,0 +1,85 @@ +package com.craisinlord.antarchy.content.item; + +import com.craisinlord.antarchy.content.AntarchyObjects; +import com.craisinlord.antarchy.content.client.particle.GlimmerParticles; +import com.craisinlord.antarchy.content.entity.glimmer.GlimmerCompanionSavedData; +import com.craisinlord.antarchy.content.entity.glimmer.GlimmerEntity; +import com.craisinlord.antarchy.content.entity.glimmer.GlimmerVariant; +import java.util.List; +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.ItemUtils; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.Level; +import org.jetbrains.annotations.Nullable; + +public class GlimmerBottleItem extends Item { + public GlimmerBottleItem() { + super(new Item.Properties().stacksTo(1)); + } + + public static ItemStack create(GlimmerVariant variant) { + ItemStack stack = new ItemStack(AntarchyObjects.GLIMMER_BOTTLE.get()); + stack.set(AntarchyObjects.GLIMMER_VARIANT_COMPONENT.get(), variant); + return stack; + } + + @Nullable + public static GlimmerVariant getVariant(ItemStack stack) { + return stack.get(AntarchyObjects.GLIMMER_VARIANT_COMPONENT.get()); + } + + @Override + public InteractionResultHolder use(Level level, Player player, InteractionHand hand) { + ItemStack stack = player.getItemInHand(hand); + GlimmerVariant variant = getVariant(stack); + if (variant == null) { + return InteractionResultHolder.fail(stack); + } + + if (level.isClientSide) { + return InteractionResultHolder.consume(stack); + } + + GlimmerEntity glimmer = AntarchyObjects.GLIMMER.get().create(level); + if (glimmer == null) { + return InteractionResultHolder.fail(stack); + } + + glimmer.moveTo(player.getX(), player.getY(), player.getZ(), player.getYRot(), 0.0F); + glimmer.lockVariant(variant); + glimmer.tame(player); + glimmer.setOrderedToSit(false); + level.addFreshEntity(glimmer); + GlimmerCompanionSavedData.replaceCompanion(((ServerLevel) level).getServer(), player.getUUID(), glimmer.getUUID()); + GlimmerParticles.tickBurst(glimmer); + level.playSound(null, player.getX(), player.getY(), player.getZ(), SoundEvents.BOTTLE_EMPTY, SoundSource.PLAYERS, 1.0F, 1.0F); + + if (player instanceof net.minecraft.server.level.ServerPlayer serverPlayer) { + com.craisinlord.antarchy.content.AntarchyAdvancements.award(serverPlayer, variant.tameAdvancementId()); + } + + ItemStack result = ItemUtils.createFilledResult(stack, player, new ItemStack(Items.GLASS_BOTTLE)); + return InteractionResultHolder.success(result); + } + + @Override + public void appendHoverText(ItemStack stack, Item.TooltipContext context, List tooltip, TooltipFlag flag) { + super.appendHoverText(stack, context, tooltip, flag); + GlimmerVariant variant = getVariant(stack); + if (variant != null) { + tooltip.add(Component.translatable("item.antarchy.glimmer_bottle.contains", variant.displayName())); + String key = variant.name().toLowerCase(java.util.Locale.ROOT); + tooltip.add(Component.translatable("item.antarchy.glimmer_bottle.passive." + key).withStyle(net.minecraft.ChatFormatting.GRAY)); + tooltip.add(Component.translatable("item.antarchy.glimmer_bottle.ability." + key).withStyle(net.minecraft.ChatFormatting.DARK_GRAY)); + } + } +} diff --git a/common/src/main/java/com/craisinlord/antarchy/content/item/HighFructoseCornSyrupItem.java b/common/src/main/java/com/craisinlord/antarchy/content/item/HighFructoseCornSyrupItem.java new file mode 100644 index 00000000..4686339a --- /dev/null +++ b/common/src/main/java/com/craisinlord/antarchy/content/item/HighFructoseCornSyrupItem.java @@ -0,0 +1,64 @@ +package com.craisinlord.antarchy.content.item; + +import net.minecraft.advancements.CriteriaTriggers; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.stats.Stats; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.ItemUtils; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.UseAnim; +import net.minecraft.world.level.Level; + +public class HighFructoseCornSyrupItem extends Item { + public HighFructoseCornSyrupItem(Properties properties) { + super(properties); + } + + @Override + public ItemStack finishUsingItem(ItemStack stack, Level level, LivingEntity livingEntity) { + ItemStack result = super.finishUsingItem(stack, level, livingEntity); + if (!level.isClientSide) { + livingEntity.addEffect(new MobEffectInstance(MobEffects.CONFUSION, 80, 0)); + } + + if (livingEntity instanceof ServerPlayer serverPlayer) { + CriteriaTriggers.CONSUME_ITEM.trigger(serverPlayer, stack); + serverPlayer.awardStat(Stats.ITEM_USED.get(this)); + } + + if (stack.isEmpty()) { + return new ItemStack(Items.GLASS_BOTTLE); + } + + if (livingEntity instanceof Player player && !player.getAbilities().instabuild) { + ItemStack bottle = new ItemStack(Items.GLASS_BOTTLE); + if (!player.getInventory().add(bottle)) { + player.drop(bottle, false); + } + } + + return result; + } + + @Override + public int getUseDuration(ItemStack stack, LivingEntity entity) { + return 32; + } + + @Override + public UseAnim getUseAnimation(ItemStack stack) { + return UseAnim.DRINK; + } + + @Override + public InteractionResultHolder use(Level level, Player player, InteractionHand usedHand) { + return ItemUtils.startUsingInstantly(level, player, usedHand); + } +} diff --git a/common/src/main/java/com/craisinlord/antarchy/content/item/MinersDreamCaveGenerator.java b/common/src/main/java/com/craisinlord/antarchy/content/item/MinersDreamCaveGenerator.java new file mode 100644 index 00000000..4aa42bac --- /dev/null +++ b/common/src/main/java/com/craisinlord/antarchy/content/item/MinersDreamCaveGenerator.java @@ -0,0 +1,173 @@ +package com.craisinlord.antarchy.content.item; + +import com.craisinlord.antarchy.content.AntarchyTags; +import it.unimi.dsi.fastutil.longs.LongOpenHashSet; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.Mth; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.block.state.BlockState; + +public final class MinersDreamCaveGenerator { + private static final double MIN_HORIZONTAL_RADIUS = 2.0D; + private static final double MAX_HORIZONTAL_RADIUS = 5.0D; + private static final double MIN_VERTICAL_RADIUS = 1.5D; + private static final double MAX_VERTICAL_RADIUS = 4.0D; + private static final double MAX_VERTICAL_DEVIATION = 8.0D; + private static final double SOFT_VERTICAL_DEVIATION = 4.0D; + private static final int WORLD_MARGIN = 3; + + private MinersDreamCaveGenerator() { + } + + public record CaveNode(BlockPos center, double horizontalRadius, double verticalRadius) { + } + + public record CaveGenerationResult(List nodes, Set torchCheckpoints) { + } + + public static CaveGenerationResult generate(BlockPos start, Direction initialDirection, int length, + int torchSpacing, int minBuildHeight, int maxBuildHeight, RandomSource random) { + List nodes = new ArrayList<>(length); + Set torchCheckpoints = new HashSet<>(); + + double x = start.getX() + 0.5D; + double y = start.getY() + 0.5D; + double z = start.getZ() + 0.5D; + double startY = y; + + double headingX = initialDirection.getStepX(); + double headingZ = initialDirection.getStepZ(); + if (headingX == 0.0D && headingZ == 0.0D) { + headingX = 1.0D; + } + + double verticalVelocity = 0.0D; + double horizontalRadius = 3.0D; + double verticalRadius = 2.0D; + int minY = minBuildHeight + WORLD_MARGIN; + int maxY = maxBuildHeight - WORLD_MARGIN; + + int spacing = Math.max(4, torchSpacing); + int traveledSinceTorch = 0; + int nextTorchDistance = spacing + random.nextInt(5) - 2; + + for (int i = 0; i < length; i++) { + BlockPos center = BlockPos.containing(x, Mth.clamp(y, minY, maxY), z); + nodes.add(new CaveNode(center, horizontalRadius, verticalRadius)); + + traveledSinceTorch++; + if (traveledSinceTorch >= Math.max(1, nextTorchDistance)) { + torchCheckpoints.add(i); + traveledSinceTorch = 0; + nextTorchDistance = spacing + random.nextInt(5) - 2; + } + + double turnDegrees = random.nextGaussian() * 8.0D; + if (random.nextFloat() < 0.1F) { + turnDegrees = random.nextGaussian() * 15.0D; + } + turnDegrees = Mth.clamp(turnDegrees, -25.0D, 25.0D); + double turnRadians = Math.toRadians(turnDegrees); + double cos = Math.cos(turnRadians); + double sin = Math.sin(turnRadians); + double newHeadingX = headingX * cos - headingZ * sin; + double newHeadingZ = headingX * sin + headingZ * cos; + double headingLength = Math.sqrt(newHeadingX * newHeadingX + newHeadingZ * newHeadingZ); + headingX = newHeadingX / headingLength; + headingZ = newHeadingZ / headingLength; + + verticalVelocity += random.nextGaussian() * 0.15D; + double deviation = y - startY; + verticalVelocity -= deviation * 0.06D; + if (deviation > SOFT_VERTICAL_DEVIATION) { + verticalVelocity -= 0.08D; + } else if (deviation < -SOFT_VERTICAL_DEVIATION) { + verticalVelocity += 0.08D; + } + verticalVelocity = Mth.clamp(verticalVelocity, -0.6D, 0.6D); + + x += headingX; + z += headingZ; + y = Mth.clamp(y + verticalVelocity, startY - MAX_VERTICAL_DEVIATION, startY + MAX_VERTICAL_DEVIATION); + + horizontalRadius = Mth.clamp(horizontalRadius + random.nextGaussian() * 0.15D, MIN_HORIZONTAL_RADIUS, MAX_HORIZONTAL_RADIUS); + verticalRadius = Mth.clamp(verticalRadius + random.nextGaussian() * 0.12D, MIN_VERTICAL_RADIUS, MAX_VERTICAL_RADIUS); + if (random.nextFloat() < 0.05F) { + horizontalRadius = Mth.clamp(horizontalRadius + 0.6D, MIN_HORIZONTAL_RADIUS, MAX_HORIZONTAL_RADIUS); + verticalRadius = Mth.clamp(verticalRadius + 0.5D, MIN_VERTICAL_RADIUS, MAX_VERTICAL_RADIUS); + } + } + + return new CaveGenerationResult(nodes, torchCheckpoints); + } + + public static void collectNodeCandidates(ServerLevel level, CaveNode node, LongOpenHashSet visited, RandomSource random, List out) { + BlockPos center = node.center(); + int hr = Mth.ceil(node.horizontalRadius()); + double upExtent = node.verticalRadius() * 1.25D; + double downExtent = node.verticalRadius() * 0.65D; + int upR = Mth.ceil(upExtent); + int downR = Mth.ceil(downExtent); + int minBuildHeight = level.getMinBuildHeight(); + int maxBuildHeight = level.getMaxBuildHeight(); + + for (int dy = -downR; dy <= upR; dy++) { + double vExtent = dy >= 0 ? upExtent : downExtent; + if (vExtent <= 0.0D) { + continue; + } + double vTerm = (dy * dy) / (vExtent * vExtent); + if (vTerm > 1.05D) { + continue; + } + + for (int dx = -hr; dx <= hr; dx++) { + double hxTerm = (dx * dx) / (node.horizontalRadius() * node.horizontalRadius()); + for (int dz = -hr; dz <= hr; dz++) { + double hzTerm = (dz * dz) / (node.horizontalRadius() * node.horizontalRadius()); + double distance = hxTerm + vTerm + hzTerm; + if (distance > 1.0D) { + continue; + } + if (distance > 0.7D) { + double edgeChance = (1.0D - distance) / 0.3D * 0.85D; + if (random.nextFloat() > edgeChance) { + continue; + } + } + + BlockPos pos = center.offset(dx, dy, dz); + if (pos.getY() < minBuildHeight || pos.getY() >= maxBuildHeight) { + continue; + } + + long packed = pos.asLong(); + if (visited.contains(packed)) { + continue; + } + + BlockState state = level.getBlockState(pos); + if (!state.is(AntarchyTags.Blocks.MINERS_DREAM_CARVABLE)) { + continue; + } + if (level.getBlockEntity(pos) != null) { + continue; + } + + visited.add(packed); + out.add(pos); + } + } + } + } + + public static boolean isChunkLoaded(ServerLevel level, BlockPos pos) { + return level.isLoaded(pos); + } +} diff --git a/common/src/main/java/com/craisinlord/antarchy/content/item/MinersDreamExcavation.java b/common/src/main/java/com/craisinlord/antarchy/content/item/MinersDreamExcavation.java new file mode 100644 index 00000000..6d7e01a0 --- /dev/null +++ b/common/src/main/java/com/craisinlord/antarchy/content/item/MinersDreamExcavation.java @@ -0,0 +1,152 @@ +package com.craisinlord.antarchy.content.item; + +import it.unimi.dsi.fastutil.longs.LongOpenHashSet; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; +import java.util.UUID; +import net.minecraft.core.BlockPos; +import net.minecraft.core.particles.BlockParticleOption; +import net.minecraft.core.particles.DustParticleOptions; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.resources.ResourceKey; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import org.joml.Vector3f; + +public final class MinersDreamExcavation { + private static final Vector3f TRIFFID_GOO_COLOR = new Vector3f(0.35F, 0.85F, 0.4F); + private static final int SLICES_BETWEEN_RUMBLE = 4; + + private final UUID owner; + private final ResourceKey dimension; + private final List nodes; + private final Set torchCheckpoints; + private final LongOpenHashSet visited = new LongOpenHashSet(); + + private int nodeIndex = 0; + private List currentNodePositions = null; + private int positionCursor = 0; + private int slicesSinceRumble = 0; + private boolean finished = false; + + public MinersDreamExcavation(UUID owner, ResourceKey dimension, List nodes, Set torchCheckpoints) { + this.owner = owner; + this.dimension = dimension; + this.nodes = nodes; + this.torchCheckpoints = torchCheckpoints; + } + + public UUID owner() { + return owner; + } + + public ResourceKey dimension() { + return dimension; + } + + public boolean isFinished() { + return finished; + } + + public void tick(ServerLevel level, int blockBudget) { + RandomSource random = level.getRandom(); + int remaining = blockBudget; + + while (remaining > 0 && !finished) { + if (currentNodePositions == null) { + if (nodeIndex >= nodes.size()) { + finished = true; + playCompletionSound(level); + return; + } + + MinersDreamCaveGenerator.CaveNode node = nodes.get(nodeIndex); + if (!MinersDreamCaveGenerator.isChunkLoaded(level, node.center())) { + advanceNode(level, node); + continue; + } + + currentNodePositions = new ArrayList<>(); + MinersDreamCaveGenerator.collectNodeCandidates(level, node, visited, random, currentNodePositions); + positionCursor = 0; + } + + if (currentNodePositions.isEmpty()) { + MinersDreamCaveGenerator.CaveNode node = nodes.get(nodeIndex); + advanceNode(level, node); + continue; + } + + int endIndex = Math.min(currentNodePositions.size(), positionCursor + remaining); + for (; positionCursor < endIndex; positionCursor++) { + BlockPos pos = currentNodePositions.get(positionCursor); + BlockState removedState = level.getBlockState(pos); + if (removedState.isAir()) { + continue; + } + level.setBlock(pos, Blocks.AIR.defaultBlockState(), 3); + remaining--; + if (random.nextFloat() < 0.12F) { + spawnBreakParticles(level, pos, removedState, random); + } + } + + if (positionCursor >= currentNodePositions.size()) { + MinersDreamCaveGenerator.CaveNode node = nodes.get(nodeIndex); + advanceNode(level, node); + } + } + } + + private void advanceNode(ServerLevel level, MinersDreamCaveGenerator.CaveNode node) { + RandomSource random = level.getRandom(); + spawnFrontDust(level, node, random); + slicesSinceRumble++; + if (slicesSinceRumble >= SLICES_BETWEEN_RUMBLE) { + slicesSinceRumble = 0; + playRumble(level, node); + } + + if (torchCheckpoints.contains(nodeIndex)) { + MinersDreamTorchPlacer.tryPlaceTorch(level, node.center(), random); + } + + currentNodePositions = null; + positionCursor = 0; + nodeIndex++; + } + + private void spawnBreakParticles(ServerLevel level, BlockPos pos, BlockState state, RandomSource random) { + level.sendParticles(new BlockParticleOption(ParticleTypes.BLOCK, state), + pos.getX() + 0.5D, pos.getY() + 0.5D, pos.getZ() + 0.5D, 2, 0.25D, 0.25D, 0.25D, 0.02D); + if (random.nextFloat() < 0.2F) { + level.sendParticles(new DustParticleOptions(TRIFFID_GOO_COLOR, 1.0F), + pos.getX() + 0.5D, pos.getY() + 0.5D, pos.getZ() + 0.5D, 1, 0.2D, 0.2D, 0.2D, 0.0D); + } + } + + private void spawnFrontDust(ServerLevel level, MinersDreamCaveGenerator.CaveNode node, RandomSource random) { + BlockPos center = node.center(); + level.sendParticles(ParticleTypes.CLOUD, center.getX() + 0.5D, center.getY() + 0.5D, center.getZ() + 0.5D, + 3, node.horizontalRadius() * 0.4D, node.verticalRadius() * 0.3D, node.horizontalRadius() * 0.4D, 0.01D); + } + + private void playRumble(ServerLevel level, MinersDreamCaveGenerator.CaveNode node) { + BlockPos center = node.center(); + level.playSound(null, center, SoundEvents.STONE_BREAK, SoundSource.BLOCKS, 0.5F, 0.7F); + } + + private void playCompletionSound(ServerLevel level) { + if (nodes.isEmpty()) { + return; + } + BlockPos center = nodes.get(nodes.size() - 1).center(); + level.playSound(null, center, SoundEvents.BEACON_ACTIVATE, SoundSource.PLAYERS, 0.4F, 1.4F); + } +} diff --git a/common/src/main/java/com/craisinlord/antarchy/content/item/MinersDreamExcavationManager.java b/common/src/main/java/com/craisinlord/antarchy/content/item/MinersDreamExcavationManager.java new file mode 100644 index 00000000..4effa987 --- /dev/null +++ b/common/src/main/java/com/craisinlord/antarchy/content/item/MinersDreamExcavationManager.java @@ -0,0 +1,81 @@ +package com.craisinlord.antarchy.content.item; + +import com.craisinlord.antarchy.config.AntarchySettings; +import java.util.Iterator; +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.Mth; +import net.minecraft.util.RandomSource; + +public final class MinersDreamExcavationManager { + private static final int MAX_ACTIVE_TASKS = 8; + private static final int SAFE_MIN_RANGE = 8; + private static final int SAFE_MAX_RANGE = 256; + private static final Map ACTIVE = new ConcurrentHashMap<>(); + + private MinersDreamExcavationManager() { + } + + public static boolean hasActiveExcavation(UUID owner) { + return ACTIVE.containsKey(owner); + } + + public static MinersDreamExcavation tryStart(ServerLevel level, UUID owner, BlockPos startPos, Direction direction) { + if (ACTIVE.containsKey(owner) || ACTIVE.size() >= MAX_ACTIVE_TASKS) { + return null; + } + + int minRange = Mth.clamp(AntarchySettings.minersDreamMinimumRange(), SAFE_MIN_RANGE, SAFE_MAX_RANGE); + int maxRange = Mth.clamp(AntarchySettings.minersDreamMaximumRange(), SAFE_MIN_RANGE, SAFE_MAX_RANGE); + if (minRange > maxRange) { + int swap = minRange; + minRange = maxRange; + maxRange = swap; + } + + RandomSource random = level.getRandom(); + int length = minRange == maxRange ? minRange : minRange + random.nextInt(maxRange - minRange + 1); + + MinersDreamCaveGenerator.CaveGenerationResult result = MinersDreamCaveGenerator.generate( + startPos, + direction, + length, + AntarchySettings.minersDreamTorchSpacing(), + level.getMinBuildHeight(), + level.getMaxBuildHeight(), + random + ); + + if (result.nodes().isEmpty()) { + return null; + } + + MinersDreamExcavation excavation = new MinersDreamExcavation(owner, level.dimension(), result.nodes(), result.torchCheckpoints()); + ACTIVE.put(owner, excavation); + return excavation; + } + + public static void tick(ServerLevel level) { + if (ACTIVE.isEmpty()) { + return; + } + + int budget = Math.max(1, AntarchySettings.minersDreamBlocksPerTick()); + Iterator> iterator = ACTIVE.entrySet().iterator(); + while (iterator.hasNext()) { + MinersDreamExcavation excavation = iterator.next().getValue(); + if (!excavation.dimension().equals(level.dimension())) { + continue; + } + + excavation.tick(level, budget); + if (excavation.isFinished()) { + iterator.remove(); + } + } + } +} diff --git a/common/src/main/java/com/craisinlord/antarchy/content/item/MinersDreamItem.java b/common/src/main/java/com/craisinlord/antarchy/content/item/MinersDreamItem.java new file mode 100644 index 00000000..d0ec451f --- /dev/null +++ b/common/src/main/java/com/craisinlord/antarchy/content/item/MinersDreamItem.java @@ -0,0 +1,79 @@ +package com.craisinlord.antarchy.content.item; + +import com.craisinlord.antarchy.config.AntarchySettings; +import java.util.List; +import net.minecraft.ChatFormatting; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.item.context.UseOnContext; +import net.minecraft.world.level.Level; + +public final class MinersDreamItem extends Item { + public MinersDreamItem(Properties properties) { + super(properties); + } + + @Override + public InteractionResult useOn(UseOnContext context) { + Level level = context.getLevel(); + Player player = context.getPlayer(); + if (player == null) { + return InteractionResult.PASS; + } + + if (!AntarchySettings.minersDreamEnabled()) { + if (!level.isClientSide()) { + player.displayClientMessage(Component.translatable("message.antarchy.miners_dream_disabled"), true); + } + return InteractionResult.FAIL; + } + + if (level.isClientSide()) { + return InteractionResult.SUCCESS; + } + + ServerLevel serverLevel = (ServerLevel) level; + BlockPos clickedPos = context.getClickedPos(); + Direction clickedFace = context.getClickedFace(); + Direction travelDirection = clickedFace.getAxis().isHorizontal() ? clickedFace : player.getDirection(); + BlockPos startPos = clickedPos.relative(travelDirection); + + if (!serverLevel.isInWorldBounds(startPos) || !MinersDreamCaveGenerator.isChunkLoaded(serverLevel, startPos)) { + return InteractionResult.FAIL; + } + + if (MinersDreamExcavationManager.hasActiveExcavation(player.getUUID())) { + player.displayClientMessage(Component.translatable("message.antarchy.miners_dream_busy"), true); + return InteractionResult.FAIL; + } + + MinersDreamExcavation excavation = MinersDreamExcavationManager.tryStart(serverLevel, player.getUUID(), startPos, travelDirection); + if (excavation == null) { + return InteractionResult.FAIL; + } + + serverLevel.playSound(null, clickedPos, SoundEvents.TNT_PRIMED, SoundSource.PLAYERS, 0.8F, 1.1F); + + if (!player.getAbilities().instabuild) { + context.getItemInHand().shrink(1); + } + + return InteractionResult.CONSUME; + } + + @Override + public void appendHoverText(ItemStack stack, Item.TooltipContext context, List tooltipComponents, TooltipFlag tooltipFlag) { + tooltipComponents.add(Component.translatable("tooltip.antarchy.miners_dream.line1").withStyle(ChatFormatting.GRAY)); + tooltipComponents.add(Component.translatable("tooltip.antarchy.miners_dream.line2").withStyle(ChatFormatting.GRAY)); + super.appendHoverText(stack, context, tooltipComponents, tooltipFlag); + } +} diff --git a/common/src/main/java/com/craisinlord/antarchy/content/item/MinersDreamTorchPlacer.java b/common/src/main/java/com/craisinlord/antarchy/content/item/MinersDreamTorchPlacer.java new file mode 100644 index 00000000..08e8f78b --- /dev/null +++ b/common/src/main/java/com/craisinlord/antarchy/content/item/MinersDreamTorchPlacer.java @@ -0,0 +1,89 @@ +package com.craisinlord.antarchy.content.item; + +import java.util.List; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundSource; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; + +public final class MinersDreamTorchPlacer { + private MinersDreamTorchPlacer() { + } + + public static void tryPlaceTorch(ServerLevel level, BlockPos center, RandomSource random) { + BlockPos floorSpot = findFloorSpot(level, center); + boolean floorFirst = random.nextBoolean(); + + if (floorFirst) { + if (floorSpot != null && placeFloorTorch(level, floorSpot)) { + return; + } + placeWallTorch(level, center, random); + return; + } + + if (placeWallTorch(level, center, random)) { + return; + } + if (floorSpot != null) { + placeFloorTorch(level, floorSpot); + } + } + + private static BlockPos findFloorSpot(ServerLevel level, BlockPos center) { + for (int dy = -2; dy <= 1; dy++) { + BlockPos candidate = center.offset(0, dy, 0); + if (!isOpenForTorch(level, candidate)) { + continue; + } + BlockState below = level.getBlockState(candidate.below()); + if (below.isFaceSturdy(level, candidate.below(), Direction.UP)) { + return candidate; + } + } + return null; + } + + private static boolean placeFloorTorch(ServerLevel level, BlockPos pos) { + if (!isOpenForTorch(level, pos)) { + return false; + } + BlockState state = Blocks.TORCH.defaultBlockState(); + if (!state.canSurvive(level, pos)) { + return false; + } + level.setBlock(pos, state, 3); + level.playSound(null, pos, state.getSoundType().getPlaceSound(), SoundSource.BLOCKS, 1.0F, 1.0F); + return true; + } + + private static boolean placeWallTorch(ServerLevel level, BlockPos center, RandomSource random) { + List order = Direction.Plane.HORIZONTAL.shuffledCopy(random); + for (int dy = -1; dy <= 1; dy++) { + BlockPos candidate = center.offset(0, dy, 0); + if (!isOpenForTorch(level, candidate)) { + continue; + } + for (Direction wallSide : order) { + Direction facing = wallSide.getOpposite(); + BlockState state = Blocks.WALL_TORCH.defaultBlockState().setValue(BlockStateProperties.HORIZONTAL_FACING, facing); + if (!state.canSurvive(level, candidate)) { + continue; + } + level.setBlock(candidate, state, 3); + level.playSound(null, candidate, state.getSoundType().getPlaceSound(), SoundSource.BLOCKS, 1.0F, 1.0F); + return true; + } + } + return false; + } + + private static boolean isOpenForTorch(ServerLevel level, BlockPos pos) { + BlockState state = level.getBlockState(pos); + return (state.isAir() || state.canBeReplaced()) && level.getFluidState(pos).isEmpty(); + } +} diff --git a/common/src/main/java/com/craisinlord/antarchy/content/item/PeachBoatOnlyItem.java b/common/src/main/java/com/craisinlord/antarchy/content/item/PeachBoatOnlyItem.java new file mode 100644 index 00000000..eeab43ca --- /dev/null +++ b/common/src/main/java/com/craisinlord/antarchy/content/item/PeachBoatOnlyItem.java @@ -0,0 +1,31 @@ +package com.craisinlord.antarchy.content.item; + +import com.craisinlord.antarchy.content.entity.PeachBoatEntity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.entity.vehicle.Boat; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.HitResult; +import net.minecraft.world.phys.Vec3; + +public class PeachBoatOnlyItem extends OuranwoodBoatItem { + private final EntityType entityType; + + public PeachBoatOnlyItem(EntityType entityType, Properties properties) { + super(properties); + this.entityType = entityType; + } + + @Override + protected Boat createBoat(Level level, HitResult hitResult, ItemStack stack, Player player) { + Vec3 pos = hitResult.getLocation(); + PeachBoatEntity boat = new PeachBoatEntity(this.entityType, level); + boat.setPos(pos.x, pos.y, pos.z); + boat.xo = pos.x; + boat.yo = pos.y; + boat.zo = pos.z; + this.applyDefaultStackConfig(level, stack, player, boat); + return boat; + } +} diff --git a/common/src/main/java/com/craisinlord/antarchy/content/item/PeachChestBoatItem.java b/common/src/main/java/com/craisinlord/antarchy/content/item/PeachChestBoatItem.java new file mode 100644 index 00000000..66a0ea72 --- /dev/null +++ b/common/src/main/java/com/craisinlord/antarchy/content/item/PeachChestBoatItem.java @@ -0,0 +1,31 @@ +package com.craisinlord.antarchy.content.item; + +import com.craisinlord.antarchy.content.entity.PeachChestBoatEntity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.entity.vehicle.Boat; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.HitResult; +import net.minecraft.world.phys.Vec3; + +public class PeachChestBoatItem extends OuranwoodBoatItem { + private final EntityType entityType; + + public PeachChestBoatItem(EntityType entityType, Properties properties) { + super(properties); + this.entityType = entityType; + } + + @Override + protected Boat createBoat(Level level, HitResult hitResult, ItemStack stack, Player player) { + Vec3 pos = hitResult.getLocation(); + PeachChestBoatEntity boat = new PeachChestBoatEntity(this.entityType, level); + boat.setPos(pos.x, pos.y, pos.z); + boat.xo = pos.x; + boat.yo = pos.y; + boat.zo = pos.z; + this.applyDefaultStackConfig(level, stack, player, boat); + return boat; + } +} diff --git a/common/src/main/java/com/craisinlord/antarchy/content/item/PeachItem.java b/common/src/main/java/com/craisinlord/antarchy/content/item/PeachItem.java new file mode 100644 index 00000000..f75e2631 --- /dev/null +++ b/common/src/main/java/com/craisinlord/antarchy/content/item/PeachItem.java @@ -0,0 +1,13 @@ +package com.craisinlord.antarchy.content.item; + +import net.minecraft.world.food.FoodProperties; +import net.minecraft.world.item.Item; + +public class PeachItem extends Item { + public PeachItem() { + super(new Item.Properties().food(new FoodProperties.Builder() + .nutrition(4) + .saturationModifier(2.4F) + .build())); + } +} diff --git a/common/src/main/java/com/craisinlord/antarchy/content/item/RootBeerItem.java b/common/src/main/java/com/craisinlord/antarchy/content/item/RootBeerItem.java new file mode 100644 index 00000000..39df6034 --- /dev/null +++ b/common/src/main/java/com/craisinlord/antarchy/content/item/RootBeerItem.java @@ -0,0 +1,59 @@ +package com.craisinlord.antarchy.content.item; + +import net.minecraft.advancements.CriteriaTriggers; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.stats.Stats; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.food.FoodProperties; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.ItemUtils; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.UseAnim; +import net.minecraft.world.level.Level; + +public class RootBeerItem extends Item { + public RootBeerItem(Properties properties) { + super(properties); + } + + @Override + public ItemStack finishUsingItem(ItemStack stack, Level level, LivingEntity livingEntity) { + ItemStack result = super.finishUsingItem(stack, level, livingEntity); + if (livingEntity instanceof ServerPlayer serverPlayer) { + CriteriaTriggers.CONSUME_ITEM.trigger(serverPlayer, stack); + serverPlayer.awardStat(Stats.ITEM_USED.get(this)); + } + + if (stack.isEmpty()) { + return new ItemStack(Items.GLASS_BOTTLE); + } + + if (livingEntity instanceof Player player && !player.getAbilities().instabuild) { + ItemStack bottle = new ItemStack(Items.GLASS_BOTTLE); + if (!player.getInventory().add(bottle)) { + player.drop(bottle, false); + } + } + + return result; + } + + @Override + public int getUseDuration(ItemStack stack, LivingEntity entity) { + return 32; + } + + @Override + public UseAnim getUseAnimation(ItemStack stack) { + return UseAnim.DRINK; + } + + @Override + public InteractionResultHolder use(Level level, Player player, InteractionHand usedHand) { + return ItemUtils.startUsingInstantly(level, player, usedHand); + } +} diff --git a/common/src/main/java/com/craisinlord/antarchy/content/item/SpiritAppleItem.java b/common/src/main/java/com/craisinlord/antarchy/content/item/SpiritAppleItem.java new file mode 100644 index 00000000..3e0e3a22 --- /dev/null +++ b/common/src/main/java/com/craisinlord/antarchy/content/item/SpiritAppleItem.java @@ -0,0 +1,21 @@ +package com.craisinlord.antarchy.content.item; + +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; + +import java.util.List; + +public class SpiritAppleItem extends Item { + public SpiritAppleItem(Properties properties) { + super(properties); + } + + @Override + public void appendHoverText(ItemStack stack, Item.TooltipContext context, List tooltipComponents, TooltipFlag tooltipFlag) { + tooltipComponents.add(Component.translatable("tooltip.antarchy.spirit_apple").withStyle(ChatFormatting.GRAY)); + super.appendHoverText(stack, context, tooltipComponents, tooltipFlag); + } +} diff --git a/common/src/main/java/com/craisinlord/antarchy/content/menu/DorrieInventoryMenu.java b/common/src/main/java/com/craisinlord/antarchy/content/menu/DorrieInventoryMenu.java new file mode 100644 index 00000000..7fe61a7d --- /dev/null +++ b/common/src/main/java/com/craisinlord/antarchy/content/menu/DorrieInventoryMenu.java @@ -0,0 +1,127 @@ +package com.craisinlord.antarchy.content.menu; + +import com.craisinlord.antarchy.content.AntarchyObjects; +import com.craisinlord.antarchy.content.entity.DorrieEntity; +import net.minecraft.world.Container; +import net.minecraft.world.SimpleContainer; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.inventory.Slot; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import org.jetbrains.annotations.Nullable; + +public class DorrieInventoryMenu extends AbstractContainerMenu { + public static final int SADDLE_SLOT = 0; + public static final int STORAGE_COLUMNS = 5; + public static final int STORAGE_ROWS = 3; + public static final int DORRIE_SLOT_COUNT = 1 + STORAGE_COLUMNS * STORAGE_ROWS; + private static final int PLAYER_INV_Y = 84; + private static final int PLAYER_HOTBAR_Y = 142; + + private final Container dorrieInventory; + @Nullable + private final DorrieEntity dorrie; + + public DorrieInventoryMenu(int containerId, Inventory playerInventory) { + this(containerId, playerInventory, new SimpleContainer(DORRIE_SLOT_COUNT), null); + } + + public DorrieInventoryMenu(int containerId, Inventory playerInventory, Container dorrieInventory, @Nullable DorrieEntity dorrie) { + super(AntarchyObjects.DORRIE_INVENTORY_MENU.get(), containerId); + checkContainerSize(dorrieInventory, DORRIE_SLOT_COUNT); + this.dorrieInventory = dorrieInventory; + this.dorrie = dorrie; + dorrieInventory.startOpen(playerInventory.player); + + this.addSlot(new Slot(dorrieInventory, SADDLE_SLOT, 8, 18) { + @Override + public boolean mayPlace(ItemStack stack) { + return stack.is(Items.SADDLE) && !this.hasItem(); + } + + @Override + public int getMaxStackSize() { + return 1; + } + }); + + for (int row = 0; row < STORAGE_ROWS; row++) { + for (int col = 0; col < STORAGE_COLUMNS; col++) { + this.addSlot(new Slot(dorrieInventory, 1 + col + row * STORAGE_COLUMNS, 80 + col * 18, 18 + row * 18)); + } + } + + for (int row = 0; row < 3; row++) { + for (int col = 0; col < 9; col++) { + this.addSlot(new Slot(playerInventory, col + row * 9 + 9, 8 + col * 18, PLAYER_INV_Y + row * 18)); + } + } + + for (int col = 0; col < 9; col++) { + this.addSlot(new Slot(playerInventory, col, 8 + col * 18, PLAYER_HOTBAR_Y)); + } + } + + public Container dorrieInventory() { + return this.dorrieInventory; + } + + @Nullable + public DorrieEntity dorrie() { + return this.dorrie; + } + + @Override + public boolean stillValid(Player player) { + return this.dorrieInventory.stillValid(player) + && (this.dorrie == null || this.dorrie.isAlive() && this.dorrie.distanceTo(player) < 8.0F); + } + + @Override + public ItemStack quickMoveStack(Player player, int index) { + ItemStack quickMoved = ItemStack.EMPTY; + Slot slot = this.slots.get(index); + if (!slot.hasItem()) { + return ItemStack.EMPTY; + } + + ItemStack stack = slot.getItem(); + quickMoved = stack.copy(); + int dorrieEnd = DORRIE_SLOT_COUNT; + int playerStart = dorrieEnd; + int playerEnd = this.slots.size(); + + if (index < dorrieEnd) { + if (!this.moveItemStackTo(stack, playerStart, playerEnd, true)) { + return ItemStack.EMPTY; + } + } else if (stack.is(Items.SADDLE)) { + if (!this.moveItemStackTo(stack, SADDLE_SLOT, SADDLE_SLOT + 1, false)) { + return ItemStack.EMPTY; + } + } else if (!this.moveItemStackTo(stack, 1, dorrieEnd, false)) { + return ItemStack.EMPTY; + } + + if (stack.isEmpty()) { + slot.setByPlayer(ItemStack.EMPTY); + } else { + slot.setChanged(); + } + + if (stack.getCount() == quickMoved.getCount()) { + return ItemStack.EMPTY; + } + + slot.onTake(player, stack); + return quickMoved; + } + + @Override + public void removed(Player player) { + super.removed(player); + this.dorrieInventory.stopOpen(player); + } +} diff --git a/common/src/main/java/com/craisinlord/antarchy/content/worldgen/elythia/ElythiaBiomeSource.java b/common/src/main/java/com/craisinlord/antarchy/content/worldgen/elythia/ElythiaBiomeSource.java index 90eb49c8..bf7750b7 100644 --- a/common/src/main/java/com/craisinlord/antarchy/content/worldgen/elythia/ElythiaBiomeSource.java +++ b/common/src/main/java/com/craisinlord/antarchy/content/worldgen/elythia/ElythiaBiomeSource.java @@ -37,6 +37,26 @@ public class ElythiaBiomeSource extends BiomeSource { Registries.BIOME, ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "elythia_beach") ); + private static final ResourceKey OURANWOOD_FOREST = ResourceKey.create( + Registries.BIOME, + ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "ouranwood_forest") + ); + private static final ResourceKey SPARSE_OURANWOOD_FOREST = ResourceKey.create( + Registries.BIOME, + ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "sparse_ouranwood_forest") + ); + private static final ResourceKey PEACH_FOREST = ResourceKey.create( + Registries.BIOME, + ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "peach_forest") + ); + private static final ResourceKey FUNGAL_OURANWOOD_FOREST = ResourceKey.create( + Registries.BIOME, + ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "fungal_ouranwood_forest") + ); + private static final ResourceKey GLIMMERING_POOLS = ResourceKey.create( + Registries.BIOME, + ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "glimmering_pools") + ); private static final int[] SURFACE_FALLBACK_BLOCK_YS = new int[]{192, 160, 128, 96, 64, 32, 0}; public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( @@ -58,6 +78,7 @@ public class ElythiaBiomeSource extends BiomeSource { private final int seaLevelQuartY; private final Holder oceanHolder; private final Holder defaultLandHolder; + private final Holder glimmeringPoolsHolder; public ElythiaBiomeSource(Climate.ParameterList> parameters, int molewormCavesMaxY, int surfaceBiomeSampleY, int oceanMaxY, int seaLevel) { this.parameters = parameters; @@ -74,10 +95,16 @@ public class ElythiaBiomeSource extends BiomeSource { .filter(h -> h.is(ELYTHIA_OCEAN)) .findFirst() .orElse(null); + this.glimmeringPoolsHolder = parameters.values().stream() + .map(Pair::getSecond) + .filter(h -> h.is(GLIMMERING_POOLS)) + .findFirst() + .orElse(null); this.defaultLandHolder = parameters.values().stream() .map(Pair::getSecond) .filter(h -> !isOceanBiome(h) && !h.is(ELYTHIA_BEACH) - && !h.is(MOLEWORM_CAVES) && !h.is(ELYTHIA_LUSH_CAVES)) + && !h.is(MOLEWORM_CAVES) && !h.is(ELYTHIA_LUSH_CAVES) + && !h.is(GLIMMERING_POOLS)) .findFirst() .orElse(null); } @@ -110,7 +137,7 @@ public class ElythiaBiomeSource extends BiomeSource { // Cap moleworm caves below their max Y — replace with surface biome above it if (biome.is(MOLEWORM_CAVES) && y > this.molewormCavesMaxQuartY) { - return resolveSurfaceFallback(x, y, z, sampler, MOLEWORM_CAVES); + return resolveSurfaceFallback(x, y, z, sampler, MOLEWORM_CAVES, GLIMMERING_POOLS); } // Use continentalness (XZ-only noise) to classify the column. @@ -138,6 +165,10 @@ public class ElythiaBiomeSource extends BiomeSource { return resolveLandFallback(x, z, sampler); } + if (isGlimmeringPoolsCandidate(biome, target, x, z)) { + return this.glimmeringPoolsHolder != null ? this.glimmeringPoolsHolder : biome; + } + return biome; } @@ -150,6 +181,44 @@ public class ElythiaBiomeSource extends BiomeSource { return biome.is(ELYTHIA_OCEAN) || biome.is(ELYTHIA_CORAL_SPIKES); } + private static boolean isOuranwoodBiome(Holder biome) { + return biome.is(OURANWOOD_FOREST) || biome.is(SPARSE_OURANWOOD_FOREST) + || biome.is(PEACH_FOREST) || biome.is(FUNGAL_OURANWOOD_FOREST); + } + + private static boolean isGlimmeringPoolsCandidate(Holder biome, Climate.TargetPoint target, int x, int z) { + if (!isOuranwoodBiome(biome)) { + return false; + } + + long humidity = target.humidity(); + long continentalness = target.continentalness(); + long weirdness = target.weirdness(); + long depth = target.depth(); + + if (humidity < Climate.quantizeCoord(0.68F) || humidity > Climate.quantizeCoord(1.0F)) { + return false; + } + if (continentalness < Climate.quantizeCoord(0.32F) || continentalness > Climate.quantizeCoord(0.88F)) { + return false; + } + if (weirdness < Climate.quantizeCoord(-0.84F) || weirdness > Climate.quantizeCoord(0.29F)) { + return false; + } + if (depth < Climate.quantizeCoord(0.0F) || depth > Climate.quantizeCoord(0.80F)) { + return false; + } + + // Hash on coarse cells (not raw per-quart coords) so eligible columns + // clump into contiguous patches instead of speckling per-quart. + // Cell size bumped from 6 to 8 blocks so patches (and the pools/streams + // they host) run slightly larger than before. + long cellX = Math.floorDiv(x, 8); + long cellZ = Math.floorDiv(z, 8); + long gate = Math.floorMod(cellX * 73428767L + cellZ * 912931L, 5L); + return gate <= 2L; + } + // Used for moleworm caves — returns best Y-sample, falls back to whatever the delegate gives @SafeVarargs private Holder resolveSurfaceFallback(int x, int y, int z, Climate.Sampler sampler, ResourceKey... excluded) { @@ -191,7 +260,8 @@ public class ElythiaBiomeSource extends BiomeSource { private static boolean isOceanOrCave(Holder biome) { return isOceanBiome(biome) || biome.is(ELYTHIA_BEACH) - || biome.is(MOLEWORM_CAVES) || biome.is(ELYTHIA_LUSH_CAVES); + || biome.is(MOLEWORM_CAVES) || biome.is(ELYTHIA_LUSH_CAVES) + || biome.is(GLIMMERING_POOLS); } @Override diff --git a/common/src/main/java/com/craisinlord/antarchy/content/worldgen/elythia/ElythiaFloraFeature.java b/common/src/main/java/com/craisinlord/antarchy/content/worldgen/elythia/ElythiaFloraFeature.java index c7517782..7917e702 100644 --- a/common/src/main/java/com/craisinlord/antarchy/content/worldgen/elythia/ElythiaFloraFeature.java +++ b/common/src/main/java/com/craisinlord/antarchy/content/worldgen/elythia/ElythiaFloraFeature.java @@ -39,13 +39,14 @@ public class ElythiaFloraFeature extends Feature { int attempts = switch (this.variant) { case FOREST -> 185; case MEADOW -> 95; + case PEACH_FOREST -> 120; case TORCHFLOWER_FIELDS -> 60; case BUTTERFLY_FIELDS -> 150; case FLOWER_FOREST_MILKWEED -> 14; }; int radius = switch (this.variant) { case FOREST -> 8; - case MEADOW, TORCHFLOWER_FIELDS -> 14; + case MEADOW, PEACH_FOREST, TORCHFLOWER_FIELDS -> 14; case BUTTERFLY_FIELDS -> 18; case FLOWER_FOREST_MILKWEED -> 8; }; @@ -54,6 +55,7 @@ public class ElythiaFloraFeature extends Feature { int torchflowerPatchRolls = switch (this.variant) { case TORCHFLOWER_FIELDS -> 3 + random.nextInt(3); case BUTTERFLY_FIELDS -> 2 + random.nextInt(3); + case PEACH_FOREST -> 1; case FLOWER_FOREST_MILKWEED -> 0; default -> 1; }; @@ -61,6 +63,7 @@ public class ElythiaFloraFeature extends Feature { float torchflowerChance = switch (this.variant) { case FOREST -> 0.24F; case MEADOW -> 0.42F; + case PEACH_FOREST -> 0.08F; case TORCHFLOWER_FIELDS -> 0.95F; case BUTTERFLY_FIELDS -> 0.24F; case FLOWER_FOREST_MILKWEED -> 0.0F; @@ -72,6 +75,7 @@ public class ElythiaFloraFeature extends Feature { if (random.nextFloat() < switch (this.variant) { case MEADOW -> 0.1F; + case PEACH_FOREST -> 0.0F; case TORCHFLOWER_FIELDS -> 0.04F; case BUTTERFLY_FIELDS -> 0.12F; case FOREST -> 0.05F; @@ -81,6 +85,7 @@ public class ElythiaFloraFeature extends Feature { } if (random.nextFloat() < switch (this.variant) { case MEADOW -> 0.16F; + case PEACH_FOREST -> 0.0F; case TORCHFLOWER_FIELDS -> 0.08F; case BUTTERFLY_FIELDS -> 0.95F; case FOREST -> 0.06F; @@ -90,6 +95,7 @@ public class ElythiaFloraFeature extends Feature { } if (random.nextFloat() < switch (this.variant) { case MEADOW -> 0.16F; + case PEACH_FOREST -> 0.0F; case TORCHFLOWER_FIELDS -> 0.08F; case BUTTERFLY_FIELDS -> 0.95F; case FOREST -> 0.06F; @@ -98,7 +104,7 @@ public class ElythiaFloraFeature extends Feature { placedAny |= this.placeMilkweedPatch(level, origin, random, AntarchyObjects.PINK_MILKWEED.get()); } - if (this.variant == Variant.FOREST) { + if (this.variant == Variant.FOREST || this.variant == Variant.PEACH_FOREST) { placedAny |= this.placeBigBushes(level, origin, random, radius); } @@ -113,7 +119,8 @@ public class ElythiaFloraFeature extends Feature { continue; } - maybeOvergrowGround(level, groundPos, random, this.variant != Variant.FOREST); + normalizePeachForestGround(level, groundPos, this.variant); + maybeOvergrowGround(level, groundPos, random, this.variant); if (placeSelectedPlant(level, plantPos, groundPos, random)) { placedAny = true; } @@ -170,6 +177,14 @@ public class ElythiaFloraFeature extends Feature { return placeDouble(level, plantPos, Blocks.LARGE_FERN.defaultBlockState()); } + if (this.variant == Variant.PEACH_FOREST) { + float roll = random.nextFloat(); + if (roll < 0.58F) { + return placeSingle(level, plantPos, Blocks.SHORT_GRASS); + } + return placeSingle(level, plantPos, veryShortGrass()); + } + float roll = random.nextFloat(); if (this.variant == Variant.MEADOW) { if (roll < 0.34F) { @@ -223,7 +238,10 @@ public class ElythiaFloraFeature extends Feature { } boolean placed = false; - int bushAttempts = 12 + random.nextInt(7); + int bushAttempts = switch (this.variant) { + case PEACH_FOREST -> 1 + random.nextInt(2); + default -> 12 + random.nextInt(7); + }; for (int i = 0; i < bushAttempts; i++) { int x = origin.getX() + random.nextInt(radius * 2 + 1) - radius; int z = origin.getZ() + random.nextInt(radius * 2 + 1) - radius; @@ -402,6 +420,7 @@ public class ElythiaFloraFeature extends Feature { int attempts = switch (this.variant) { case FOREST -> 3; case MEADOW -> 5; + case PEACH_FOREST -> 3; case TORCHFLOWER_FIELDS -> 2; case BUTTERFLY_FIELDS -> 3; case FLOWER_FOREST_MILKWEED -> 2; @@ -451,18 +470,42 @@ public class ElythiaFloraFeature extends Feature { return isOpenPlantSpot(level, plantPos) ? plantPos : null; } - private static void maybeOvergrowGround(WorldGenLevel level, BlockPos groundPos, RandomSource random, boolean meadow) { - if (!isValidGround(level, groundPos) || random.nextFloat() > (meadow ? 0.45F : 0.24F)) { + private static void normalizePeachForestGround(WorldGenLevel level, BlockPos groundPos, Variant variant) { + if (variant != Variant.PEACH_FOREST) { return; } - BlockState replacement = random.nextFloat() < 0.35F + BlockState state = level.getBlockState(groundPos); + if (state.is(Blocks.MOSS_BLOCK) || state.is(Blocks.ROOTED_DIRT)) { + level.setBlock(groundPos, AntarchyObjects.BLUSH_MOSS_BLOCK.get().defaultBlockState(), 2); + } + } + + private static void maybeOvergrowGround(WorldGenLevel level, BlockPos groundPos, RandomSource random, Variant variant) { + boolean meadow = variant != Variant.FOREST; + float overgrowChance = switch (variant) { + case PEACH_FOREST -> 0.20F; + case FOREST -> 0.24F; + default -> 0.45F; + }; + if (!isValidGround(level, groundPos) || random.nextFloat() > overgrowChance) { + return; + } + + BlockState replacement = variant == Variant.PEACH_FOREST + ? AntarchyObjects.BLUSH_MOSS_BLOCK.get().defaultBlockState() + : random.nextFloat() < 0.35F ? Blocks.ROOTED_DIRT.defaultBlockState() : Blocks.MOSS_BLOCK.defaultBlockState(); level.setBlock(groundPos, replacement, 2); for (DirectionHolder direction : DirectionHolder.HORIZONTAL) { - if (random.nextFloat() > (meadow ? 0.22F : 0.1F)) { + float spreadChance = switch (variant) { + case PEACH_FOREST -> 0.07F; + case FOREST -> 0.1F; + default -> 0.22F; + }; + if (random.nextFloat() > spreadChance) { continue; } BlockPos spreadPos = groundPos.offset(direction.stepX, 0, direction.stepZ); @@ -492,7 +535,11 @@ public class ElythiaFloraFeature extends Feature { } private static boolean isIntendedGround(BlockState state) { - return state.is(BlockTags.DIRT) || state.is(Blocks.GRASS_BLOCK) || state.is(Blocks.MOSS_BLOCK) || state.is(Blocks.ROOTED_DIRT); + return state.is(BlockTags.DIRT) + || state.is(Blocks.GRASS_BLOCK) + || state.is(Blocks.MOSS_BLOCK) + || state.is(Blocks.ROOTED_DIRT) + || state.is(AntarchyObjects.BLUSH_MOSS_BLOCK.get()); } private static boolean isUnderwaterGround(WorldGenLevel level, BlockPos pos) { @@ -533,6 +580,7 @@ public class ElythiaFloraFeature extends Feature { public enum Variant { FOREST, MEADOW, + PEACH_FOREST, TORCHFLOWER_FIELDS, BUTTERFLY_FIELDS, FLOWER_FOREST_MILKWEED diff --git a/common/src/main/java/com/craisinlord/antarchy/content/worldgen/elythia/LumenLilyPadFeature.java b/common/src/main/java/com/craisinlord/antarchy/content/worldgen/elythia/LumenLilyPadFeature.java new file mode 100644 index 00000000..2fa0badd --- /dev/null +++ b/common/src/main/java/com/craisinlord/antarchy/content/worldgen/elythia/LumenLilyPadFeature.java @@ -0,0 +1,52 @@ +package com.craisinlord.antarchy.content.worldgen.elythia; + +import com.craisinlord.antarchy.content.AntarchyTags; +import com.mojang.serialization.Codec; +import net.minecraft.core.BlockPos; +import net.minecraft.util.RandomSource; +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.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; + +public final class LumenLilyPadFeature extends Feature { + public LumenLilyPadFeature(Codec codec) { + super(codec); + } + + @Override + public boolean place(FeaturePlaceContext context) { + WorldGenLevel level = context.level(); + RandomSource random = context.random(); + BlockPos origin = context.origin(); + boolean placedAny = false; + + for (int i = 0; i < 24; i++) { + int x = origin.getX() + random.nextInt(17) - 8; + int z = origin.getZ() + random.nextInt(17) - 8; + int surfaceY = level.getHeight(Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, x, z) - 1; + BlockPos fluidPos = new BlockPos(x, surfaceY, z); + if (!level.getFluidState(fluidPos).is(AntarchyTags.Fluids.LUMEN) || !level.getFluidState(fluidPos).isSource()) { + continue; + } + + BlockPos padPos = fluidPos.above(); + if (!level.isEmptyBlock(padPos)) { + continue; + } + + BlockState lilyPad = Blocks.LILY_PAD.defaultBlockState(); + if (!lilyPad.canSurvive(level, padPos)) { + continue; + } + + level.setBlock(padPos, lilyPad, 2); + placedAny = true; + } + + return placedAny; + } +} diff --git a/common/src/main/java/com/craisinlord/antarchy/content/worldgen/elythia/LumenPoolFeature.java b/common/src/main/java/com/craisinlord/antarchy/content/worldgen/elythia/LumenPoolFeature.java new file mode 100644 index 00000000..08d7a2f4 --- /dev/null +++ b/common/src/main/java/com/craisinlord/antarchy/content/worldgen/elythia/LumenPoolFeature.java @@ -0,0 +1,191 @@ +package com.craisinlord.antarchy.content.worldgen.elythia; + +import com.craisinlord.antarchy.content.AntarchyObjects; +import com.mojang.serialization.Codec; +import net.minecraft.core.BlockPos; +import net.minecraft.util.Mth; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.LiquidBlock; +import net.minecraft.world.level.block.state.BlockState; +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; + +public final class LumenPoolFeature extends Feature { + private static final int SMALL_RADIUS_MIN = 2; + private static final int SMALL_RADIUS_MAX = 4; + private static final int LARGE_RADIUS_MIN = 5; + private static final int LARGE_RADIUS_MAX = 6; + private static final int HUGE_RADIUS_MIN = 11; + private static final int HUGE_RADIUS_MAX = 17; + + public LumenPoolFeature(Codec codec) { + super(codec); + } + + @Override + public boolean place(FeaturePlaceContext context) { + WorldGenLevel level = context.level(); + RandomSource random = context.random(); + BlockPos origin = context.origin(); + + BlockPos center = findSurfaceCenter(level, origin); + if (center == null) { + return false; + } + + int radius; + int maxDepth; + if (random.nextInt(20) == 0) { + radius = randomBetween(random, HUGE_RADIUS_MIN, HUGE_RADIUS_MAX); + maxDepth = randomBetween(random, 9, 13); + } else if (random.nextInt(8) == 0) { + radius = randomBetween(random, LARGE_RADIUS_MIN, LARGE_RADIUS_MAX); + maxDepth = randomBetween(random, 4, 6); + } else { + radius = randomBetween(random, SMALL_RADIUS_MIN, SMALL_RADIUS_MAX); + maxDepth = randomBetween(random, 3, 4); + } + BlockState lumenBlockState = AntarchyObjects.LUMEN_BLOCK.get().defaultBlockState(); + BlockState shellstoneState = AntarchyObjects.SHELLSTONE.get().defaultBlockState(); + BlockState tuffState = Blocks.TUFF.defaultBlockState(); + BlockState mossState = Blocks.MOSS_BLOCK.defaultBlockState(); + int waterlineY = center.getY() - 1; + + int floorY = waterlineY - maxDepth; + if (floorY <= level.getMinBuildHeight() + 2) { + return false; + } + + if (!hasSolidSubstrate(level, center.getX(), center.getZ(), floorY)) { + return false; + } + + boolean placedAny = false; + BlockPos.MutableBlockPos mutable = new BlockPos.MutableBlockPos(); + + for (int dx = -radius - 2; dx <= radius + 2; dx++) { + for (int dz = -radius - 2; dz <= radius + 2; dz++) { + double distance = warpedDistance(dx, dz, random, radius); + if (distance > radius + 0.7D) { + continue; + } + + int worldX = center.getX() + dx; + int worldZ = center.getZ() + dz; + int localSurfaceY = level.getHeight(Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, worldX, worldZ) - 1; + if (localSurfaceY < center.getY() - 2 || localSurfaceY > center.getY() + 1) { + continue; + } + + double normalized = Mth.clamp((float) (distance / Math.max(radius, 1)), 0.0F, 1.25F); + int basinDepth = Math.max(2, Mth.floor((1.0D - (normalized * normalized)) * maxDepth)); + if (distance <= radius * 0.45D) { + basinDepth = Math.max(basinDepth, maxDepth - 1); + } + int localWaterlineY = Math.min(waterlineY, localSurfaceY - 1); + int localFloorY = localWaterlineY - basinDepth; + if (localFloorY <= level.getMinBuildHeight() + 1) { + continue; + } + if (!hasSolidSubstrate(level, worldX, worldZ, localFloorY)) { + continue; + } + + boolean edge = distance >= radius - 0.55D; + boolean shoulder = !edge && distance >= radius - 1.2D; + boolean innerWall = !edge && distance >= radius - 0.9D; + int bankTopY = Math.max(localWaterlineY + 1, Math.min(localSurfaceY, center.getY())); + + for (int y = localSurfaceY; y > localFloorY; y--) { + mutable.set(worldX, y, worldZ); + if (y > localWaterlineY) { + level.setBlock(mutable, y <= bankTopY && (edge || shoulder) ? pickWallState(random, shellstoneState, tuffState) : Blocks.AIR.defaultBlockState(), 2); + placedAny = true; + continue; + } + + if (edge || (innerWall && y >= localFloorY + 1)) { + level.setBlock(mutable, pickWallState(random, shellstoneState, tuffState), 2); + placedAny = true; + continue; + } + + level.setBlock(mutable, LumenWorldgenHelper.lumenState(lumenBlockState, 0), 2); + LumenWorldgenHelper.scheduleFluidTick(level, mutable.immutable()); + placedAny = true; + } + + mutable.set(worldX, localFloorY, worldZ); + BlockState floorState = pickFloorState(random, shellstoneState, tuffState, mossState, edge); + level.setBlock(mutable, floorState, 2); + placedAny = true; + } + } + + return placedAny; + } + + private static BlockPos findSurfaceCenter(WorldGenLevel level, BlockPos origin) { + int bestY = Integer.MIN_VALUE; + BlockPos bestPos = null; + for (int dx = -4; dx <= 4; dx++) { + for (int dz = -4; dz <= 4; dz++) { + int x = origin.getX() + dx; + int z = origin.getZ() + dz; + int topY = level.getHeight(Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, x, z) - 1; + BlockPos pos = LumenWorldgenHelper.findNaturalFloor(level, x, z, topY, level.getMinBuildHeight() + 1); + if (pos != null && pos.getY() > bestY) { + bestY = pos.getY(); + bestPos = pos; + } + } + } + return bestPos; + } + + private static boolean hasSolidSubstrate(WorldGenLevel level, int x, int z, int floorY) { + BlockPos.MutableBlockPos mutable = new BlockPos.MutableBlockPos(); + for (int y = floorY - 1; y >= floorY - 3; y--) { + mutable.set(x, y, z); + if (LumenWorldgenHelper.isSolidSupport(level.getBlockState(mutable))) { + return true; + } + } + return false; + } + + private static BlockState pickWallState(RandomSource random, BlockState shellstoneState, BlockState tuffState) { + return random.nextFloat() < 0.72F ? shellstoneState : tuffState; + } + + private static BlockState pickFloorState(RandomSource random, BlockState shellstoneState, BlockState tuffState, BlockState mossState, boolean edge) { + int roll = random.nextInt(100); + if (roll < 65) { + return shellstoneState; + } + if (roll < 95) { + return tuffState; + } + return edge ? mossState : shellstoneState; + } + + private static double warpedDistance(int dx, int dz, RandomSource random, int radius) { + double scaleX = 1.0D + random.nextDouble() * 0.18D; + double scaleZ = 0.85D + random.nextDouble() * 0.22D; + double warpX = Math.sin((dz * 0.42D) + random.nextDouble() * Math.PI * 2.0D) * 0.18D; + double warpZ = Math.cos((dx * 0.48D) + random.nextDouble() * Math.PI * 2.0D) * 0.18D; + double warpedX = (dx / scaleX) + warpX; + double warpedZ = (dz / scaleZ) + warpZ; + return Mth.sqrt((float) ((warpedX * warpedX) + (warpedZ * warpedZ))); + } + + private static int randomBetween(RandomSource random, int minInclusive, int maxInclusive) { + int min = Math.min(minInclusive, maxInclusive); + int max = Math.max(minInclusive, maxInclusive); + return min >= max ? min : min + random.nextInt(max - min + 1); + } +} diff --git a/common/src/main/java/com/craisinlord/antarchy/content/worldgen/elythia/LumenStreamFeature.java b/common/src/main/java/com/craisinlord/antarchy/content/worldgen/elythia/LumenStreamFeature.java new file mode 100644 index 00000000..0c2477f7 --- /dev/null +++ b/common/src/main/java/com/craisinlord/antarchy/content/worldgen/elythia/LumenStreamFeature.java @@ -0,0 +1,340 @@ +package com.craisinlord.antarchy.content.worldgen.elythia; + +import com.craisinlord.antarchy.content.AntarchyObjects; +import com.mojang.serialization.Codec; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.util.Mth; +import net.minecraft.util.RandomSource; +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.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; + +public final class LumenStreamFeature extends Feature { + private static final int MAX_LENGTH = 160; + private static final int MIN_LENGTH = 60; + private static final int MAX_WIDTH = 4; + + public LumenStreamFeature(Codec codec) { + super(codec); + } + + @Override + public boolean place(FeaturePlaceContext context) { + WorldGenLevel level = context.level(); + RandomSource random = context.random(); + BlockPos origin = context.origin(); + + StreamStart start = findStart(level, origin); + if (start == null) { + return false; + } + + BlockState lumenBlockState = AntarchyObjects.LUMEN_BLOCK.get().defaultBlockState(); + BlockState shellstoneState = AntarchyObjects.SHELLSTONE.get().defaultBlockState(); + BlockState tuffState = Blocks.TUFF.defaultBlockState(); + + Direction direction = pickDownhillDirection(level, start.x(), start.z(), start.surfaceY(), random); + if (direction == null) { + return false; + } + + int length = randomBetween(random, MIN_LENGTH, MAX_LENGTH); + int x = start.x(); + int z = start.z(); + int previousSurfaceY = start.surfaceY(); + boolean placedAny = false; + + for (int step = 0; step < length; step++) { + int surfaceY = level.getHeight(Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, x, z) - 1; + if (surfaceY <= level.getMinBuildHeight() + 4) { + break; + } + + if (step > 0 && surfaceY - previousSurfaceY > 2) { + break; + } + + int channelDepth = step == 0 ? 4 : 3 + random.nextInt(2); + int waterlineY = surfaceY - 1; + int floorY = waterlineY - channelDepth; + if (!hasSolidSubstrate(level, x, z, floorY)) { + break; + } + + placedAny |= carveChannelSegment(level, random, x, z, surfaceY, waterlineY, floorY, lumenBlockState, shellstoneState, tuffState, step); + + Direction nextDirection = chooseNextDirection(level, x, z, direction, random); + if (nextDirection == null) { + break; + } + + direction = nextDirection; + previousSurfaceY = surfaceY; + x += direction.getStepX(); + z += direction.getStepZ(); + } + + if (placedAny) { + placedAny |= createTerminalBasin(level, random, x, z, lumenBlockState, shellstoneState, tuffState); + } + + return placedAny; + } + + private static boolean carveChannelSegment( + WorldGenLevel level, + RandomSource random, + int centerX, + int centerZ, + int surfaceY, + int waterlineY, + int floorY, + BlockState lumenBlockState, + BlockState shellstoneState, + BlockState tuffState, + int step + ) { + boolean placedAny = false; + BlockPos.MutableBlockPos mutable = new BlockPos.MutableBlockPos(); + int width = 1 + random.nextInt(MAX_WIDTH); + + for (int dx = -width; dx <= width; dx++) { + for (int dz = -width; dz <= width; dz++) { + double distance = Math.sqrt(dx * dx + dz * dz); + if (distance > width + 0.4D) { + continue; + } + + int worldX = centerX + dx; + int worldZ = centerZ + dz; + int localSurfaceY = level.getHeight(Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, worldX, worldZ) - 1; + if (localSurfaceY < floorY + 1) { + continue; + } + + double normalized = Mth.clamp((float) (distance / Math.max(width, 1)), 0.0F, 1.25F); + int localDepth = Math.max(2, Mth.floor((1.0D - (normalized * normalized)) * (waterlineY - floorY))); + if (distance <= width * 0.45D) { + localDepth = Math.max(localDepth, waterlineY - floorY - 1); + } + int localWaterlineY = Math.min(waterlineY, localSurfaceY - 1); + int localFloorY = localWaterlineY - localDepth; + if (!hasSolidSubstrate(level, worldX, worldZ, localFloorY)) { + continue; + } + + boolean edge = distance >= width - 0.45D; + boolean innerWall = !edge && distance >= width - 0.8D; + int bankTopY = Math.max(localWaterlineY + 1, Math.min(localSurfaceY, surfaceY)); + for (int y = localSurfaceY; y > localFloorY; y--) { + mutable.set(worldX, y, worldZ); + if (y > localWaterlineY) { + level.setBlock(mutable, y <= bankTopY && (edge || innerWall) ? pickWallState(random, shellstoneState, tuffState) : Blocks.AIR.defaultBlockState(), 2); + placedAny = true; + continue; + } + + if (edge || (innerWall && y >= localFloorY + 1)) { + level.setBlock(mutable, pickWallState(random, shellstoneState, tuffState), 2); + placedAny = true; + continue; + } + + level.setBlock(mutable, LumenWorldgenHelper.lumenState(lumenBlockState, 0), 2); + LumenWorldgenHelper.scheduleFluidTick(level, mutable.immutable()); + placedAny = true; + } + + mutable.set(worldX, localFloorY, worldZ); + level.setBlock(mutable, random.nextFloat() < 0.65F ? shellstoneState : tuffState, 2); + placedAny = true; + } + } + + return placedAny; + } + + private static boolean createTerminalBasin( + WorldGenLevel level, + RandomSource random, + int centerX, + int centerZ, + BlockState lumenBlockState, + BlockState shellstoneState, + BlockState tuffState + ) { + int surfaceY = level.getHeight(Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, centerX, centerZ) - 1; + int radius = 3 + random.nextInt(2); + int waterlineY = surfaceY - 1; + int maxDepth = 3 + random.nextInt(2); + int floorY = waterlineY - maxDepth; + if (!hasSolidSubstrate(level, centerX, centerZ, floorY)) { + return false; + } + + boolean placedAny = false; + BlockPos.MutableBlockPos mutable = new BlockPos.MutableBlockPos(); + for (int dx = -radius; dx <= radius; dx++) { + for (int dz = -radius; dz <= radius; dz++) { + double distance = Math.sqrt(dx * dx + dz * dz); + if (distance > radius + 0.6D) { + continue; + } + + int worldX = centerX + dx; + int worldZ = centerZ + dz; + int localSurfaceY = level.getHeight(Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, worldX, worldZ) - 1; + if (localSurfaceY < floorY + 1) { + continue; + } + + double normalized = Mth.clamp((float) (distance / Math.max(radius, 1)), 0.0F, 1.25F); + int localDepth = Math.max(2, Mth.floor((1.0D - (normalized * normalized)) * maxDepth)); + int localWaterlineY = Math.min(waterlineY, localSurfaceY - 1); + int localFloorY = localWaterlineY - localDepth; + boolean edge = distance >= radius - 0.45D; + boolean innerWall = !edge && distance >= radius - 0.85D; + int bankTopY = Math.max(localWaterlineY + 1, Math.min(localSurfaceY, surfaceY)); + for (int y = localSurfaceY; y > localFloorY; y--) { + mutable.set(worldX, y, worldZ); + if (y > localWaterlineY) { + level.setBlock(mutable, y <= bankTopY && (edge || innerWall) ? pickWallState(random, shellstoneState, tuffState) : Blocks.AIR.defaultBlockState(), 2); + placedAny = true; + continue; + } + + if (edge || (innerWall && y >= localFloorY + 1)) { + level.setBlock(mutable, pickWallState(random, shellstoneState, tuffState), 2); + placedAny = true; + continue; + } + + level.setBlock(mutable, lumenBlockState, 2); + LumenWorldgenHelper.scheduleFluidTick(level, mutable.immutable()); + placedAny = true; + } + + mutable.set(worldX, localFloorY, worldZ); + level.setBlock(mutable, random.nextFloat() < 0.75F ? shellstoneState : tuffState, 2); + placedAny = true; + } + } + + return placedAny; + } + + private static StreamStart findStart(WorldGenLevel level, BlockPos origin) { + int bestY = Integer.MIN_VALUE; + StreamStart best = null; + for (int dx = -4; dx <= 4; dx++) { + for (int dz = -4; dz <= 4; dz++) { + int x = origin.getX() + dx; + int z = origin.getZ() + dz; + int topY = level.getHeight(Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, x, z) - 1; + BlockPos floor = LumenWorldgenHelper.findNaturalFloor(level, x, z, topY, level.getMinBuildHeight() + 1); + if (floor != null && floor.getY() > bestY) { + bestY = floor.getY(); + best = new StreamStart(x, z, floor.getY()); + } + } + } + return best; + } + + private static BlockState pickWallState(RandomSource random, BlockState shellstoneState, BlockState tuffState) { + return random.nextFloat() < 0.7F ? shellstoneState : tuffState; + } + + private static Direction pickDownhillDirection(WorldGenLevel level, int x, int z, int surfaceY, RandomSource random) { + Direction bestDirection = null; + int bestDrop = Integer.MIN_VALUE; + for (Direction direction : Direction.Plane.HORIZONTAL) { + int nextX = x + direction.getStepX() * 3; + int nextZ = z + direction.getStepZ() * 3; + int nextY = level.getHeight(Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, nextX, nextZ) - 1; + int drop = surfaceY - nextY; + if (drop > bestDrop) { + bestDrop = drop; + bestDirection = direction; + } + } + + if (bestDirection == null) { + return null; + } + + if (bestDrop < -1 && random.nextInt(4) != 0) { + return null; + } + + return bestDirection; + } + + private static Direction chooseNextDirection(WorldGenLevel level, int x, int z, Direction current, RandomSource random) { + Direction[] candidates = new Direction[] { + current, + turnLeft(current), + turnRight(current) + }; + + Direction best = null; + int bestScore = Integer.MAX_VALUE; + for (Direction candidate : candidates) { + int nextX = x + candidate.getStepX() * 2; + int nextZ = z + candidate.getStepZ() * 2; + int nextY = level.getHeight(Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, nextX, nextZ) - 1; + int score = nextY * 8 + random.nextInt(3); + if (score < bestScore) { + bestScore = score; + best = candidate; + } + } + + return best; + } + + private static Direction turnLeft(Direction direction) { + return switch (direction) { + case NORTH -> Direction.WEST; + case WEST -> Direction.SOUTH; + case SOUTH -> Direction.EAST; + case EAST -> Direction.NORTH; + default -> direction; + }; + } + + private static Direction turnRight(Direction direction) { + return switch (direction) { + case NORTH -> Direction.EAST; + case EAST -> Direction.SOUTH; + case SOUTH -> Direction.WEST; + case WEST -> Direction.NORTH; + default -> direction; + }; + } + + private static boolean hasSolidSubstrate(WorldGenLevel level, int x, int z, int floorY) { + BlockPos.MutableBlockPos mutable = new BlockPos.MutableBlockPos(); + for (int y = floorY - 1; y >= floorY - 4; y--) { + mutable.set(x, y, z); + if (LumenWorldgenHelper.isSolidSupport(level.getBlockState(mutable))) { + return true; + } + } + return false; + } + + private static int randomBetween(RandomSource random, int minInclusive, int maxInclusive) { + int min = Math.min(minInclusive, maxInclusive); + int max = Math.max(minInclusive, maxInclusive); + return min >= max ? min : min + random.nextInt(max - min + 1); + } + + private record StreamStart(int x, int z, int surfaceY) { + } +} diff --git a/common/src/main/java/com/craisinlord/antarchy/content/worldgen/elythia/LumenWorldgenHelper.java b/common/src/main/java/com/craisinlord/antarchy/content/worldgen/elythia/LumenWorldgenHelper.java new file mode 100644 index 00000000..dd527123 --- /dev/null +++ b/common/src/main/java/com/craisinlord/antarchy/content/worldgen/elythia/LumenWorldgenHelper.java @@ -0,0 +1,71 @@ +package com.craisinlord.antarchy.content.worldgen.elythia; + +import com.craisinlord.antarchy.content.AntarchyObjects; +import net.minecraft.core.BlockPos; +import net.minecraft.tags.BlockTags; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.LiquidBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.FluidState; + +final class LumenWorldgenHelper { + private LumenWorldgenHelper() { + } + + static boolean isNaturalFloor(BlockState state) { + return state.is(net.minecraft.tags.BlockTags.DIRT) + || state.is(net.minecraft.world.level.block.Blocks.GRASS_BLOCK) + || state.is(net.minecraft.world.level.block.Blocks.MOSS_BLOCK) + || state.is(net.minecraft.world.level.block.Blocks.ROOTED_DIRT) + || state.is(AntarchyObjects.SHELLSTONE.get()) + || state.is(net.minecraft.world.level.block.Blocks.TUFF); + } + + static boolean isSolidSupport(BlockState state) { + return !state.isAir() + && state.blocksMotion() + && state.getFluidState().isEmpty() + && !state.is(BlockTags.LOGS) + && !state.is(BlockTags.LEAVES); + } + + static BlockPos findNaturalFloor(WorldGenLevel level, int x, int z, int topY, int minY) { + BlockPos.MutableBlockPos mutable = new BlockPos.MutableBlockPos(); + for (int y = topY; y >= minY; y--) { + mutable.set(x, y, z); + BlockState state = level.getBlockState(mutable); + if (isNaturalFloor(state)) { + return mutable.immutable(); + } + if (state.is(BlockTags.LOGS) || state.is(BlockTags.LEAVES)) { + continue; + } + if (!state.isAir() && state.blocksMotion()) { + break; + } + } + return null; + } + + static BlockState lumenState(BlockState lumenBlockState, boolean source) { + if (source || !lumenBlockState.hasProperty(LiquidBlock.LEVEL)) { + return source ? lumenBlockState.setValue(LiquidBlock.LEVEL, 0) : lumenBlockState; + } + + return lumenBlockState.setValue(LiquidBlock.LEVEL, 7); + } + + static BlockState lumenState(BlockState lumenBlockState, int level) { + if (!lumenBlockState.hasProperty(LiquidBlock.LEVEL)) { + return lumenBlockState; + } + return lumenBlockState.setValue(LiquidBlock.LEVEL, net.minecraft.util.Mth.clamp(level, 0, 15)); + } + + static void scheduleFluidTick(WorldGenLevel level, BlockPos pos) { + FluidState fluidState = level.getFluidState(pos); + if (!fluidState.isEmpty()) { + level.scheduleTick(pos, fluidState.getType(), fluidState.getType().getTickDelay(level)); + } + } +} diff --git a/common/src/main/java/com/craisinlord/antarchy/content/worldgen/elythia/PeachForestMossyBoulderFeature.java b/common/src/main/java/com/craisinlord/antarchy/content/worldgen/elythia/PeachForestMossyBoulderFeature.java new file mode 100644 index 00000000..4448150e --- /dev/null +++ b/common/src/main/java/com/craisinlord/antarchy/content/worldgen/elythia/PeachForestMossyBoulderFeature.java @@ -0,0 +1,136 @@ +package com.craisinlord.antarchy.content.worldgen.elythia; + +import com.mojang.serialization.Codec; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.tags.BlockTags; +import net.minecraft.util.Mth; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.SlabBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.SlabType; +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; + +public class PeachForestMossyBoulderFeature extends Feature { + public PeachForestMossyBoulderFeature(Codec codec) { + super(codec); + } + + @Override + public boolean place(FeaturePlaceContext context) { + WorldGenLevel level = context.level(); + RandomSource random = context.random(); + BlockPos origin = context.origin(); + BlockPos surfacePos = new BlockPos(origin.getX(), level.getHeight(Heightmap.Types.WORLD_SURFACE_WG, origin.getX(), origin.getZ()) - 1, origin.getZ()); + if (!isSoil(level.getBlockState(surfacePos))) { + return false; + } + + BlockPos base = surfacePos.below(random.nextInt(2)); + int height = 6 + random.nextInt(5); + int baseRadius = 2 * (2 + random.nextInt(2)); + boolean placed = false; + + int driftX = 0; + int driftZ = 0; + int topRadius = 1; + BlockPos topCenter = base; + for (int y = 0; y < height; y++) { + double heightFraction = (double) y / (height - 1); + double taper = 1.0D - heightFraction * 0.7D; + int radius = Math.max(1, Math.round((float) (baseRadius * taper))); + + driftX = Mth.clamp(driftX + random.nextInt(3) - 1, -1, 1); + driftZ = Mth.clamp(driftZ + random.nextInt(3) - 1, -1, 1); + BlockPos levelCenter = base.above(y).offset(driftX, 0, driftZ); + + placed |= this.placeDisk(level, levelCenter, radius, heightFraction, random); + topCenter = levelCenter; + topRadius = radius; + } + + if (placed) { + this.softCapWithSlabs(level, topCenter, topRadius, random); + } + + return placed; + } + + private boolean placeDisk(WorldGenLevel level, BlockPos center, int radius, double heightFraction, RandomSource random) { + boolean placed = false; + double rr = radius * radius; + for (int x = -radius; x <= radius; x++) { + for (int z = -radius; z <= radius; z++) { + double distance = (x * x + z * z) / Math.max(1.0D, rr); + if (distance > 1.0D + random.nextDouble() * 0.3D) { + continue; + } + + BlockPos targetPos = center.offset(x, 0, z); + BlockState targetState = level.getBlockState(targetPos); + if (targetState.isAir() || targetState.canBeReplaced() || isSoil(targetState)) { + level.setBlock(targetPos, pickBlockState(heightFraction, random), 2); + placed = true; + } + } + } + return placed; + } + + private void softCapWithSlabs(WorldGenLevel level, BlockPos center, int radius, RandomSource random) { + for (int x = -radius; x <= radius; x++) { + for (int z = -radius; z <= radius; z++) { + BlockPos topPos = center.offset(x, 0, z); + while (topPos.getY() < level.getMaxBuildHeight() - 1 && isBoulderBlock(level.getBlockState(topPos.above()))) { + topPos = topPos.above(); + } + + BlockState topState = level.getBlockState(topPos); + if (!isBoulderBlock(topState)) { + continue; + } + + BlockPos slabPos = topPos.above(); + if (!level.isEmptyBlock(slabPos) || random.nextFloat() > 0.25F) { + continue; + } + + int openSides = 0; + for (Direction direction : Direction.Plane.HORIZONTAL) { + if (!isBoulderBlock(level.getBlockState(topPos.relative(direction)))) { + openSides++; + } + } + + if (openSides == 0) { + continue; + } + + BlockState slabState = (random.nextFloat() < 0.55F ? Blocks.MOSSY_COBBLESTONE_SLAB : Blocks.COBBLESTONE_SLAB) + .defaultBlockState().setValue(SlabBlock.TYPE, SlabType.BOTTOM); + level.setBlock(slabPos, slabState, 2); + } + } + } + + private static BlockState pickBlockState(double heightFraction, RandomSource random) { + if (heightFraction < 0.35D) { + return Blocks.TUFF.defaultBlockState(); + } + + return random.nextFloat() < 0.55F ? Blocks.MOSSY_COBBLESTONE.defaultBlockState() : Blocks.COBBLESTONE.defaultBlockState(); + } + + private static boolean isBoulderBlock(BlockState state) { + return state.is(Blocks.TUFF) || state.is(Blocks.COBBLESTONE) || state.is(Blocks.MOSSY_COBBLESTONE); + } + + private static boolean isSoil(BlockState state) { + return state.is(BlockTags.DIRT) || state.is(Blocks.GRASS_BLOCK) || state.is(Blocks.MOSS_BLOCK) || state.is(Blocks.ROOTED_DIRT); + } +} diff --git a/common/src/main/java/com/craisinlord/antarchy/content/worldgen/elythia/PeachForestPondConfiguration.java b/common/src/main/java/com/craisinlord/antarchy/content/worldgen/elythia/PeachForestPondConfiguration.java new file mode 100644 index 00000000..e8b13b34 --- /dev/null +++ b/common/src/main/java/com/craisinlord/antarchy/content/worldgen/elythia/PeachForestPondConfiguration.java @@ -0,0 +1,19 @@ +package com.craisinlord.antarchy.content.worldgen.elythia; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.world.level.levelgen.feature.configurations.FeatureConfiguration; + +public record PeachForestPondConfiguration( + int minRadius, + int maxRadius, + int minDepth, + int maxDepth +) implements FeatureConfiguration { + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + Codec.intRange(1, 32).fieldOf("min_radius").forGetter(PeachForestPondConfiguration::minRadius), + Codec.intRange(1, 32).fieldOf("max_radius").forGetter(PeachForestPondConfiguration::maxRadius), + Codec.intRange(1, 16).fieldOf("min_depth").forGetter(PeachForestPondConfiguration::minDepth), + Codec.intRange(1, 16).fieldOf("max_depth").forGetter(PeachForestPondConfiguration::maxDepth) + ).apply(instance, PeachForestPondConfiguration::new)); +} diff --git a/common/src/main/java/com/craisinlord/antarchy/content/worldgen/elythia/PeachForestPondFeature.java b/common/src/main/java/com/craisinlord/antarchy/content/worldgen/elythia/PeachForestPondFeature.java new file mode 100644 index 00000000..6f3b6049 --- /dev/null +++ b/common/src/main/java/com/craisinlord/antarchy/content/worldgen/elythia/PeachForestPondFeature.java @@ -0,0 +1,140 @@ +package com.craisinlord.antarchy.content.worldgen.elythia; + +import com.mojang.serialization.Codec; +import net.minecraft.core.BlockPos; +import net.minecraft.tags.BlockTags; +import net.minecraft.tags.FluidTags; +import net.minecraft.util.Mth; +import net.minecraft.util.RandomSource; +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.levelgen.Heightmap; +import net.minecraft.world.level.levelgen.feature.Feature; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; + +public class PeachForestPondFeature extends Feature { + private static final int NOISE_SAMPLES = 12; + + public PeachForestPondFeature(Codec codec) { + super(codec); + } + + @Override + public boolean place(FeaturePlaceContext context) { + WorldGenLevel level = context.level(); + RandomSource random = context.random(); + BlockPos origin = context.origin(); + PeachForestPondConfiguration config = context.config(); + + int surfaceY = level.getHeight(Heightmap.Types.WORLD_SURFACE_WG, origin.getX(), origin.getZ()) - 1; + BlockPos center = new BlockPos(origin.getX(), surfaceY, origin.getZ()); + if (!isSoil(level.getBlockState(center))) { + return false; + } + + int radiusX = Mth.nextInt(random, config.minRadius(), config.maxRadius()); + int radiusZ = Mth.clamp(radiusX + random.nextInt(3) - 1, config.minRadius(), config.maxRadius()); + int depth = Mth.nextInt(random, config.minDepth(), config.maxDepth()); + double[] edgeNoise = generateEdgeNoise(random); + boolean placed = false; + + for (int x = -radiusX - 2; x <= radiusX + 2; x++) { + for (int z = -radiusZ - 2; z <= radiusZ + 2; z++) { + double noiseFactor = sampleEdgeNoise(edgeNoise, x, z); + double distance = ((x * x) / (double) (radiusX * radiusX) + (z * z) / (double) (radiusZ * radiusZ)) / (noiseFactor * noiseFactor); + BlockPos topPos = center.offset(x, 0, z); + + if (distance <= 1.0D) { + int floorY = center.getY() - (distance < 0.4D ? depth + 1 : depth); + for (int y = center.getY(); y > floorY; y--) { + level.setBlock(new BlockPos(topPos.getX(), y, topPos.getZ()), Blocks.WATER.defaultBlockState(), 2); + } + level.setBlock(new BlockPos(topPos.getX(), floorY, topPos.getZ()), Blocks.TUFF.defaultBlockState(), 2); + clearFloatingVegetation(level, topPos, center.getY()); + placed = true; + } else if (distance <= 1.2D) { + int floorY = center.getY() - depth; + for (int y = center.getY(); y >= floorY; y--) { + level.setBlock(new BlockPos(topPos.getX(), y, topPos.getZ()), Blocks.TUFF.defaultBlockState(), 2); + } + clearFloatingVegetation(level, topPos, center.getY()); + placed = true; + } else if (distance <= 1.45D && isSoil(level.getBlockState(topPos))) { + level.setBlock(topPos, Blocks.TUFF.defaultBlockState(), 2); + } + } + } + + if (placed) { + this.placeLilyPads(level, center, radiusX, radiusZ, edgeNoise, random); + } + + return placed; + } + + private static double[] generateEdgeNoise(RandomSource random) { + double[] noise = new double[NOISE_SAMPLES]; + for (int i = 0; i < NOISE_SAMPLES; i++) { + noise[i] = 0.72D + random.nextDouble() * 0.56D; + } + return noise; + } + + private static double sampleEdgeNoise(double[] edgeNoise, int x, int z) { + if (x == 0 && z == 0) { + return 1.0D; + } + + double angle = Math.atan2(z, x); + double normalized = (angle / (Math.PI * 2.0D) + 1.0D) * NOISE_SAMPLES; + int index0 = ((int) Math.floor(normalized)) % NOISE_SAMPLES; + int index1 = (index0 + 1) % NOISE_SAMPLES; + double t = normalized - Math.floor(normalized); + return Mth.lerp(t, edgeNoise[index0], edgeNoise[index1]); + } + + private static void clearFloatingVegetation(WorldGenLevel level, BlockPos topPos, int surfaceY) { + int topOfDebris = Math.max(surfaceY, level.getHeight(Heightmap.Types.WORLD_SURFACE_WG, topPos.getX(), topPos.getZ()) - 1); + int airStreak = 0; + for (int offset = 1; offset <= 24 && airStreak < 3; offset++) { + BlockPos abovePos = new BlockPos(topPos.getX(), topOfDebris + offset, topPos.getZ()); + BlockState aboveState = level.getBlockState(abovePos); + if (aboveState.isAir()) { + airStreak++; + continue; + } + airStreak = 0; + level.setBlock(abovePos, Blocks.AIR.defaultBlockState(), 2); + } + } + + private void placeLilyPads(WorldGenLevel level, BlockPos center, int radiusX, int radiusZ, double[] edgeNoise, RandomSource random) { + int attempts = 6 + (radiusX + radiusZ) * 2; + for (int i = 0; i < attempts; i++) { + int x = random.nextInt(radiusX * 2 + 1) - radiusX; + int z = random.nextInt(radiusZ * 2 + 1) - radiusZ; + double noiseFactor = sampleEdgeNoise(edgeNoise, x, z); + double distance = ((x * x) / (double) (radiusX * radiusX) + (z * z) / (double) (radiusZ * radiusZ)) / (noiseFactor * noiseFactor); + if (distance > 0.85D || random.nextFloat() > 0.55F) { + continue; + } + + BlockPos padPos = center.offset(x, 1, z); + if (!level.getFluidState(padPos.below()).is(FluidTags.WATER) || !level.isEmptyBlock(padPos)) { + continue; + } + + BlockState lilyPad = Blocks.LILY_PAD.defaultBlockState(); + if (!lilyPad.canSurvive(level, padPos)) { + continue; + } + + level.setBlock(padPos, lilyPad, 2); + } + } + + private static boolean isSoil(BlockState state) { + return state.is(BlockTags.DIRT) || state.is(Blocks.GRASS_BLOCK) || state.is(Blocks.MOSS_BLOCK) || state.is(Blocks.ROOTED_DIRT); + } +} diff --git a/common/src/main/java/com/craisinlord/antarchy/content/worldgen/elythia/PeachTreeConfiguration.java b/common/src/main/java/com/craisinlord/antarchy/content/worldgen/elythia/PeachTreeConfiguration.java new file mode 100644 index 00000000..5bd8efdb --- /dev/null +++ b/common/src/main/java/com/craisinlord/antarchy/content/worldgen/elythia/PeachTreeConfiguration.java @@ -0,0 +1,29 @@ +package com.craisinlord.antarchy.content.worldgen.elythia; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.util.valueproviders.IntProvider; +import net.minecraft.world.level.levelgen.feature.configurations.FeatureConfiguration; +import net.minecraft.world.level.levelgen.feature.stateproviders.BlockStateProvider; + +public record PeachTreeConfiguration( + BlockStateProvider trunkProvider, + BlockStateProvider foliageProvider, + IntProvider height, + IntProvider canopyRadius, + IntProvider branchCount, + int trunkWidth, + float fruitChance, + float topCanopyScale +) implements FeatureConfiguration { + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + BlockStateProvider.CODEC.fieldOf("trunk_provider").forGetter(PeachTreeConfiguration::trunkProvider), + BlockStateProvider.CODEC.fieldOf("foliage_provider").forGetter(PeachTreeConfiguration::foliageProvider), + IntProvider.codec(4, 64).fieldOf("height").forGetter(PeachTreeConfiguration::height), + IntProvider.codec(2, 16).fieldOf("canopy_radius").forGetter(PeachTreeConfiguration::canopyRadius), + IntProvider.codec(1, 12).fieldOf("branch_count").forGetter(PeachTreeConfiguration::branchCount), + Codec.intRange(1, 2).optionalFieldOf("trunk_width", 1).forGetter(PeachTreeConfiguration::trunkWidth), + Codec.floatRange(0.0F, 1.0F).optionalFieldOf("fruit_chance", 0.45F).forGetter(PeachTreeConfiguration::fruitChance), + Codec.floatRange(0.2F, 1.2F).optionalFieldOf("top_canopy_scale", 0.8F).forGetter(PeachTreeConfiguration::topCanopyScale) + ).apply(instance, PeachTreeConfiguration::new)); +} diff --git a/common/src/main/java/com/craisinlord/antarchy/content/worldgen/elythia/PeachTreeFeature.java b/common/src/main/java/com/craisinlord/antarchy/content/worldgen/elythia/PeachTreeFeature.java new file mode 100644 index 00000000..35bf2e73 --- /dev/null +++ b/common/src/main/java/com/craisinlord/antarchy/content/worldgen/elythia/PeachTreeFeature.java @@ -0,0 +1,472 @@ +package com.craisinlord.antarchy.content.worldgen.elythia; + +import com.craisinlord.antarchy.Antarchy; +import com.craisinlord.antarchy.content.block.PeachLeavesBlock; +import com.mojang.serialization.Codec; +import java.util.ArrayDeque; +import java.util.ArrayList; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Set; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.LeavesBlock; +import net.minecraft.world.level.block.RotatedPillarBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.feature.Feature; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; +import net.minecraft.world.level.block.state.properties.IntegerProperty; + +public class PeachTreeFeature extends Feature { + private static final ResourceLocation PEACH_LOG_ID = ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "peach_log"); + private static final ResourceLocation PEACH_LEAVES_ID = ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "peach_leaves"); + + public PeachTreeFeature(Codec codec) { + super(codec); + } + + @Override + public boolean place(FeaturePlaceContext context) { + WorldGenLevel level = context.level(); + RandomSource random = context.random(); + BlockPos origin = context.origin(); + PeachTreeConfiguration config = context.config(); + int height = config.height().sample(random); + int canopyRadius = config.canopyRadius().sample(random); + int trunkWidth = config.trunkWidth(); + + if (!canGrowOn(level, origin.below())) { + return false; + } + + List trunkPath = buildTrunkPath(origin, height, random); + Set logPositions = new LinkedHashSet<>(); + Set leafPositions = new LinkedHashSet<>(); + + placeTrunk(level, trunkPath, logPositions, height, trunkWidth, random, config); + + int branchStart = Math.max(6, height - 5); + List branchTips = buildBranches(level, trunkPath, branchStart, logPositions, leafPositions, canopyRadius, trunkWidth, random, config); + BlockPos canopyCenter = trunkPath.get(trunkPath.size() - 1).offset(trunkWidth - 1, 1, trunkWidth - 1); + placeCentralCanopy(level, canopyCenter, canopyRadius, logPositions, leafPositions, random, config); + for (BranchTip tip : branchTips) { + placeBranchCanopy(level, tip, canopyCenter, canopyRadius, logPositions, leafPositions, random, config); + } + if (trunkWidth == 2) { + reinforceLargeCanopy(level, canopyCenter, branchTips, logPositions, leafPositions, random, config); + } + connectCanopy(level, canopyCenter, branchTips, logPositions, leafPositions, random); + refreshLeafDistances(level, leafPositions, logPositions); + placeHangingPeaches(level, canopyCenter, canopyRadius, leafPositions, random, config); + + return !logPositions.isEmpty() || !leafPositions.isEmpty(); + } + + private List buildTrunkPath(BlockPos origin, int height, RandomSource random) { + List trunkPath = new ArrayList<>(height); + Direction leanDirection = Direction.Plane.HORIZONTAL.getRandomDirection(random); + double driftX = leanDirection.getStepX() * (0.12D + random.nextDouble() * 0.05D); + double driftZ = leanDirection.getStepZ() * (0.12D + random.nextDouble() * 0.05D); + double wobbleX = (random.nextDouble() - 0.5D) * 0.04D; + double wobbleZ = (random.nextDouble() - 0.5D) * 0.04D; + double offsetX = 0.0D; + double offsetZ = 0.0D; + + for (int y = 0; y < height; y++) { + double progress = y / (double) Math.max(1, height - 1); + double bend = progress < 0.35D ? 0.0D : (progress - 0.35D) / 0.65D; + offsetX += (driftX + wobbleX) * bend; + offsetZ += (driftZ + wobbleZ) * bend; + trunkPath.add(origin.offset(Mth.floor(offsetX), y, Mth.floor(offsetZ))); + } + + return trunkPath; + } + + private void placeTrunk(WorldGenLevel level, List trunkPath, Set logPositions, int height, int trunkWidth, RandomSource random, PeachTreeConfiguration config) { + Direction leanDirection = Direction.NORTH; + if (trunkPath.size() >= 2) { + BlockPos base = trunkPath.get(0); + BlockPos next = trunkPath.get(1); + leanDirection = directionFromDelta(next.getX() - base.getX(), next.getZ() - base.getZ()); + } + + for (int i = 0; i < trunkPath.size(); i++) { + BlockPos pos = trunkPath.get(i); + placeTrunkColumn(level, pos, trunkWidth, Direction.Axis.Y, logPositions, config, random); + + if (trunkWidth == 1 && height >= 13 && i < 2) { + placeLog(level, pos.relative(leanDirection.getOpposite()), Direction.Axis.Y, logPositions, config, random); + } + if (trunkWidth == 1 && height >= 15 && i == 0) { + placeLog(level, pos.relative(leanDirection.getClockWise()), Direction.Axis.Y, logPositions, config, random); + } + } + } + + private List buildBranches( + WorldGenLevel level, + List trunkPath, + int branchStart, + Set logPositions, + Set leafPositions, + int canopyRadius, + int trunkWidth, + RandomSource random + , PeachTreeConfiguration config + ) { + int branchCount = config.branchCount().sample(random); + double baseAngle = random.nextDouble() * Math.PI * 2.0D; + List tips = new ArrayList<>(branchCount); + + for (int i = 0; i < branchCount; i++) { + int attachIndex = Math.min(trunkPath.size() - 1, branchStart + random.nextInt(Math.max(1, trunkPath.size() - branchStart))); + BlockPos anchor = trunkPath.get(attachIndex).offset(trunkWidth - 1, 0, trunkWidth - 1); + double angle = baseAngle + (Math.PI * 2.0D * i / branchCount) + (random.nextDouble() - 0.5D) * 0.55D; + int length = trunkWidth == 2 ? 6 + random.nextInt(5) : 3 + random.nextInt(4); + int rise = trunkWidth == 2 ? 2 + random.nextInt(3) : 1 + random.nextInt(2); + BlockPos tip = placeBranch(level, anchor, angle, length, rise, logPositions, leafPositions, random, config); + tips.add(new BranchTip(anchor, tip, angle)); + + if (random.nextFloat() < 0.30F) { + double forkAngle = angle + (random.nextBoolean() ? Math.PI / 3.0D : -Math.PI / 3.0D); + placeBranch(level, tip, forkAngle, trunkWidth == 2 ? 2 + random.nextInt(3) : 1 + random.nextInt(3), random.nextInt(2), logPositions, leafPositions, random, config); + } + } + + return tips; + } + + private BlockPos placeBranch( + WorldGenLevel level, + BlockPos start, + double angle, + int length, + int rise, + Set logPositions, + Set leafPositions, + RandomSource random, + PeachTreeConfiguration config + ) { + double dirX = Math.cos(angle); + double dirZ = Math.sin(angle); + double perpX = -dirZ; + double perpZ = dirX; + double curveStrength = 0.75D + random.nextDouble() * 0.55D; + BlockPos tip = start; + + for (int step = 1; step <= length; step++) { + double t = step / (double) length; + double curve = Math.sin(t * Math.PI) * curveStrength; + int x = Mth.floor(Mth.lerp(t, start.getX(), start.getX() + dirX * length) + perpX * curve); + int y = Mth.floor(Mth.lerp(t, start.getY(), start.getY() + rise) + Math.sin(t * Math.PI) * 0.35D); + int z = Mth.floor(Mth.lerp(t, start.getZ(), start.getZ() + dirZ * length) + perpZ * curve); + BlockPos current = new BlockPos(x, y, z); + BlockPos previous = tip; + tip = current; + + Direction.Axis axis = axisForSegment(previous, current); + placeLog(level, current, axis, logPositions, config, random); + if (step >= length - 1) { + placeLeafCluster(level, current.above(), 2 + random.nextInt(2), leafPositions, random); + } + } + + return tip; + } + + private void placeCentralCanopy(WorldGenLevel level, BlockPos center, int canopyRadius, Set logPositions, Set leafPositions, RandomSource random, PeachTreeConfiguration config) { + placeCanopyLobe(level, center.below(), canopyRadius + 1, 1, canopyRadius, 0.35D, leafPositions, random); + placeCanopyLobe(level, center, canopyRadius + 1, 2, canopyRadius + 1, 0.42D, leafPositions, random); + int topRadius = Math.max(2, Mth.floor(canopyRadius * config.topCanopyScale())); + placeCanopyLobe(level, center.above(), topRadius, 1, topRadius, 0.24D, leafPositions, random); + placeLeafCluster(level, center.above(2), Math.max(2, topRadius - 1), leafPositions, random); + placeLog(level, center.below(), Direction.Axis.Y, logPositions, config, random); + } + + private void placeBranchCanopy( + WorldGenLevel level, + BranchTip tip, + BlockPos canopyCenter, + int canopyRadius, + Set logPositions, + Set leafPositions, + RandomSource random, + PeachTreeConfiguration config + ) { + int lobeRadius = Math.max(3, canopyRadius - 1 + random.nextInt(2)); + BlockPos lobeCenter = tip.tip().above(random.nextInt(2)); + placeCanopyLobe(level, lobeCenter, lobeRadius, 2, lobeRadius, 0.36D, leafPositions, random); + placeCanopyLobe(level, lobeCenter.above(), Math.max(2, lobeRadius - 1), 1, Math.max(2, lobeRadius - 1), 0.22D, leafPositions, random); + + BlockPos bridgeCenter = tip.tip().offset( + Mth.floor(Math.cos(tip.angle()) * 2.0D), + 0, + Mth.floor(Math.sin(tip.angle()) * 2.0D) + ).above(1); + placeLeafCluster(level, bridgeCenter, Math.max(2, canopyRadius - 2), leafPositions, random); + placeLog(level, canopyCenter, Direction.Axis.Y, logPositions, config, random); + } + + private void reinforceLargeCanopy( + WorldGenLevel level, + BlockPos canopyCenter, + List branchTips, + Set logPositions, + Set leafPositions, + RandomSource random, + PeachTreeConfiguration config + ) { + placeLog(level, canopyCenter.above(), Direction.Axis.Y, logPositions, config, random); + placeLog(level, canopyCenter.above(2), Direction.Axis.Y, logPositions, config, random); + placeLog(level, canopyCenter.below(), Direction.Axis.Y, logPositions, config, random); + + for (BranchTip tip : branchTips) { + BlockPos mid = interpolate(tip.tip(), canopyCenter, 0.5D, 0.0D).above(1); + placeLog(level, mid, axisForSegment(tip.tip(), mid), logPositions, config, random); + + BlockPos nearTip = interpolate(tip.tip(), canopyCenter, 0.25D, 0.0D); + placeLog(level, nearTip.above(), axisForSegment(nearTip, canopyCenter), logPositions, config, random); + + BlockPos supportStart = tip.anchor().above(1); + BlockPos supportEnd = tip.tip().above(1); + placeLog(level, supportStart, axisForSegment(supportStart, supportEnd), logPositions, config, random); + placeLog(level, supportEnd, axisForSegment(supportStart, supportEnd), logPositions, config, random); + } + + placeLeafCluster(level, canopyCenter.above(1), Math.max(2, config.canopyRadius().sample(random) - 1), leafPositions, random); + } + + private void connectCanopy( + WorldGenLevel level, + BlockPos canopyCenter, + List branchTips, + Set logPositions, + Set leafPositions, + RandomSource random + ) { + for (BranchTip tip : branchTips) { + BlockPos start = tip.tip(); + int steps = 2 + random.nextInt(2); + for (int i = 1; i <= steps; i++) { + double t = i / (double) (steps + 1); + BlockPos pos = interpolate(start, canopyCenter, t, 0.0D).above(random.nextInt(2)); + placeLeaf(level, pos, leafPositions); + } + } + } + + private void placeCanopyLobe( + WorldGenLevel level, + BlockPos center, + int radiusX, + int radiusY, + int radiusZ, + double edgeNoise, + Set leafPositions, + RandomSource random + ) { + int minY = -radiusY; + int maxY = radiusY; + for (int dy = minY; dy <= maxY; dy++) { + double vertical = dy / (double) Math.max(1, radiusY); + for (int dx = -radiusX; dx <= radiusX; dx++) { + for (int dz = -radiusZ; dz <= radiusZ; dz++) { + double nx = dx / (double) Math.max(1, radiusX); + double nz = dz / (double) Math.max(1, radiusZ); + double normalized = nx * nx + (vertical * vertical * 1.2D) + nz * nz; + if (normalized > 1.0D + edgeNoise + random.nextDouble() * 0.04D) { + continue; + } + if (dy < 0 && normalized > 0.65D && random.nextFloat() < 0.55F) { + continue; + } + if (dy > 0 && normalized < 0.25D && random.nextFloat() < 0.18F) { + continue; + } + + BlockPos pos = center.offset(dx, dy, dz); + placeLeaf(level, pos, leafPositions); + } + } + } + } + + private void placeLeafCluster(WorldGenLevel level, BlockPos center, int radius, Set leafPositions, RandomSource random) { + int radiusSq = radius * radius; + for (int x = -radius; x <= radius; x++) { + for (int y = -1; y <= 1; y++) { + for (int z = -radius; z <= radius; z++) { + int distanceSq = x * x + z * z + y * y; + if (distanceSq > radiusSq) { + continue; + } + if (distanceSq > radiusSq - radius && random.nextFloat() < 0.20F) { + continue; + } + placeLeaf(level, center.offset(x, y, z), leafPositions); + } + } + } + } + + private void placeHangingPeaches(WorldGenLevel level, BlockPos canopyCenter, int canopyRadius, Set leafPositions, RandomSource random, PeachTreeConfiguration config) { + int fruitAttempts = 12 + random.nextInt(10); + List candidates = new ArrayList<>(leafPositions); + for (int i = 0; i < fruitAttempts && !candidates.isEmpty(); i++) { + BlockPos leafPos = candidates.get(random.nextInt(candidates.size())); + int dx = Math.abs(leafPos.getX() - canopyCenter.getX()); + int dz = Math.abs(leafPos.getZ() - canopyCenter.getZ()); + int horizontal = dx + dz; + if (horizontal < Math.max(2, canopyRadius - 2)) { + continue; + } + BlockPos fruitPos = leafPos.below(); + if (!level.getBlockState(fruitPos).isAir()) { + continue; + } + if (random.nextFloat() > config.fruitChance()) { + continue; + } + setBlock(level, fruitPos, PeachLeavesBlock.createHangingPeachState()); + } + } + + private void refreshLeafDistances(WorldGenLevel level, Set leafPositions, Set logPositions) { + ArrayDeque queue = new ArrayDeque<>(logPositions); + java.util.Map distances = new java.util.HashMap<>(); + for (BlockPos logPos : logPositions) { + distances.put(logPos, 0); + } + + while (!queue.isEmpty()) { + BlockPos current = queue.removeFirst(); + int currentDistance = distances.getOrDefault(current, 0); + if (currentDistance >= 6) { + continue; + } + + for (Direction direction : Direction.values()) { + BlockPos next = current.relative(direction); + if (distances.containsKey(next)) { + continue; + } + BlockState state = level.getBlockState(next); + if (!(state.getBlock() instanceof LeavesBlock)) { + continue; + } + distances.put(next, currentDistance + 1); + queue.addLast(next); + } + } + + for (BlockPos pos : leafPositions) { + BlockState state = level.getBlockState(pos); + if (!(state.getBlock() instanceof LeavesBlock)) { + continue; + } + + IntegerProperty property = state.getBlock() instanceof PeachLeavesBlock ? LeavesBlock.DISTANCE : null; + if (property == null) { + continue; + } + + int distance = Math.min(6, distances.getOrDefault(pos, 6)); + if (state.getValue(property) != distance) { + setBlock(level, pos, state.setValue(property, distance)); + } + } + } + + private void placeTrunkColumn(WorldGenLevel level, BlockPos pos, int trunkWidth, Direction.Axis axis, Set logPositions, PeachTreeConfiguration config, RandomSource random) { + for (int dx = 0; dx < trunkWidth; dx++) { + for (int dz = 0; dz < trunkWidth; dz++) { + placeLog(level, pos.offset(dx, 0, dz), axis, logPositions, config, random); + } + } + } + + private boolean placeLog(WorldGenLevel level, BlockPos pos, Direction.Axis axis, Set logPositions, PeachTreeConfiguration config, RandomSource random) { + if (!canReplace(level, pos)) { + return false; + } + BlockState state = config.trunkProvider().getState(random, pos); + if (state.hasProperty(RotatedPillarBlock.AXIS)) { + state = state.setValue(RotatedPillarBlock.AXIS, axis); + } + setBlock(level, pos, state); + logPositions.add(pos); + return true; + } + + private boolean placeLeaf(WorldGenLevel level, BlockPos pos, Set leafPositions) { + if (!canReplace(level, pos)) { + return false; + } + setBlock(level, pos, leafState()); + leafPositions.add(pos); + return true; + } + + private BlockState leafState() { + return peachBlock(PEACH_LEAVES_ID).defaultBlockState(); + } + + private static Block peachBlock(ResourceLocation id) { + return BuiltInRegistries.BLOCK.getOptional(id) + .orElseThrow(() -> new IllegalStateException("Missing peach block: " + id)); + } + + private static boolean canGrowOn(WorldGenLevel level, BlockPos pos) { + BlockState state = level.getBlockState(pos); + return state.isFaceSturdy(level, pos, Direction.UP); + } + + private static boolean canReplace(WorldGenLevel level, BlockPos pos) { + BlockState state = level.getBlockState(pos); + return state.isAir() || state.canBeReplaced() || state.getBlock() instanceof LeavesBlock; + } + + private static Direction.Axis axisForSegment(BlockPos from, BlockPos to) { + int dx = Math.abs(to.getX() - from.getX()); + int dy = Math.abs(to.getY() - from.getY()); + int dz = Math.abs(to.getZ() - from.getZ()); + if (dy > dx && dy > dz) { + return Direction.Axis.Y; + } + return dx >= dz ? Direction.Axis.X : Direction.Axis.Z; + } + + private static Direction directionFromDelta(int dx, int dz) { + if (Math.abs(dx) >= Math.abs(dz)) { + return dx >= 0 ? Direction.EAST : Direction.WEST; + } + return dz >= 0 ? Direction.SOUTH : Direction.NORTH; + } + + private static BlockPos interpolate(BlockPos start, BlockPos end, double t, double sidewaysOffset) { + double x = Mth.lerp(t, start.getX(), end.getX()); + double y = Mth.lerp(t, start.getY(), end.getY()); + double z = Mth.lerp(t, start.getZ(), end.getZ()); + if (sidewaysOffset != 0.0D) { + double dx = end.getX() - start.getX(); + double dz = end.getZ() - start.getZ(); + double length = Math.sqrt(dx * dx + dz * dz); + if (length > 0.0D) { + x += (-dz / length) * sidewaysOffset; + z += (dx / length) * sidewaysOffset; + } + } + return new BlockPos(Mth.floor(x), Mth.floor(y), Mth.floor(z)); + } + + private record BranchTip(BlockPos anchor, BlockPos tip, double angle) { + } +} diff --git a/common/src/main/java/com/craisinlord/antarchy/content/worldgen/elythia/PeachTreeGrowers.java b/common/src/main/java/com/craisinlord/antarchy/content/worldgen/elythia/PeachTreeGrowers.java new file mode 100644 index 00000000..55653217 --- /dev/null +++ b/common/src/main/java/com/craisinlord/antarchy/content/worldgen/elythia/PeachTreeGrowers.java @@ -0,0 +1,27 @@ +package com.craisinlord.antarchy.content.worldgen.elythia; + +import com.craisinlord.antarchy.Antarchy; +import java.util.Optional; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.block.grower.TreeGrower; +import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; + +public final class PeachTreeGrowers { + public static final ResourceKey> PEACH_LARGE_TREE = featureKey("peach_large_tree"); + public static final ResourceKey> PEACH_TREE = featureKey("peach_tree"); + public static final TreeGrower PEACH = new TreeGrower( + "peach", + Optional.of(PEACH_LARGE_TREE), + Optional.of(PEACH_TREE), + Optional.empty() + ); + + private PeachTreeGrowers() { + } + + private static ResourceKey> featureKey(String path) { + return ResourceKey.create(Registries.CONFIGURED_FEATURE, ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, path)); + } +} diff --git a/common/src/main/java/com/craisinlord/antarchy/content/worldgen/overworld/CornPatchFeature.java b/common/src/main/java/com/craisinlord/antarchy/content/worldgen/overworld/CornPatchFeature.java new file mode 100644 index 00000000..c9014b00 --- /dev/null +++ b/common/src/main/java/com/craisinlord/antarchy/content/worldgen/overworld/CornPatchFeature.java @@ -0,0 +1,61 @@ +package com.craisinlord.antarchy.content.worldgen.overworld; + +import com.craisinlord.antarchy.content.AntarchyObjects; +import com.craisinlord.antarchy.content.block.CornCropBlock; +import com.mojang.serialization.Codec; +import net.minecraft.core.BlockPos; +import net.minecraft.util.RandomSource; +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.DoubleBlockHalf; +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; + +public final class CornPatchFeature extends Feature { + public CornPatchFeature(Codec codec) { + super(codec); + } + + @Override + public boolean place(FeaturePlaceContext context) { + WorldGenLevel level = context.level(); + RandomSource random = context.random(); + BlockPos origin = context.origin(); + Block wildCorn = AntarchyObjects.WILD_CORN.get(); + int radius = 4 + random.nextInt(3); + int targetPlacements = 10 + random.nextInt(11); + int attempts = targetPlacements * 4; + int placed = 0; + + for (int i = 0; i < attempts && placed < targetPlacements; i++) { + int x = origin.getX() + random.nextInt(radius * 2 + 1) - radius; + int z = origin.getZ() + random.nextInt(radius * 2 + 1) - radius; + int surfaceY = level.getHeight(Heightmap.Types.WORLD_SURFACE_WG, x, z); + BlockPos lowerPos = new BlockPos(x, surfaceY, z); + BlockPos upperPos = lowerPos.above(); + + if (!level.getBlockState(lowerPos.below()).is(net.minecraft.world.level.block.Blocks.GRASS_BLOCK)) { + continue; + } + if (!level.getBlockState(lowerPos).canBeReplaced() || !level.getBlockState(upperPos).canBeReplaced()) { + continue; + } + + BlockState lowerState = wildCorn.defaultBlockState() + .setValue(CornCropBlock.AGE, 3) + .setValue(CornCropBlock.HALF, DoubleBlockHalf.LOWER); + BlockState upperState = wildCorn.defaultBlockState() + .setValue(CornCropBlock.AGE, 3) + .setValue(CornCropBlock.HALF, DoubleBlockHalf.UPPER); + + level.setBlock(lowerPos, lowerState, 2); + level.setBlock(upperPos, upperState, 2); + placed++; + } + + return placed > 0; + } +} diff --git a/common/src/main/java/com/craisinlord/antarchy/mixins/AmericanFoodConsumeMixin.java b/common/src/main/java/com/craisinlord/antarchy/mixins/AmericanFoodConsumeMixin.java new file mode 100644 index 00000000..416e3aa1 --- /dev/null +++ b/common/src/main/java/com/craisinlord/antarchy/mixins/AmericanFoodConsumeMixin.java @@ -0,0 +1,35 @@ +package com.craisinlord.antarchy.mixins; + +import com.craisinlord.antarchy.config.AntarchySettings; +import com.craisinlord.antarchy.content.AntarchyObjects; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.food.FoodProperties; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +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; + +@Mixin(Player.class) +public abstract class AmericanFoodConsumeMixin { + @Inject( + method = "eat(Lnet/minecraft/world/level/Level;Lnet/minecraft/world/item/ItemStack;Lnet/minecraft/world/food/FoodProperties;)Lnet/minecraft/world/item/ItemStack;", + at = @At("RETURN") + ) + private void antarchy$applyAmericanBonus(Level level, ItemStack stack, FoodProperties foodProperties, CallbackInfoReturnable cir) { + if (level.isClientSide || !stack.has(AntarchyObjects.AMERICAN_COMPONENT.get())) { + return; + } + + Player self = (Player) (Object) this; + self.getFoodData().eat(AntarchySettings.americanBonusNutrition(), (float) AntarchySettings.americanBonusSaturation()); + + int duration = AntarchySettings.americanRegenerationDurationTicks(); + if (duration > 0) { + self.addEffect(new MobEffectInstance(MobEffects.REGENERATION, duration, AntarchySettings.americanRegenerationAmplifier())); + } + } +} diff --git a/common/src/main/java/com/craisinlord/antarchy/mixins/AmericanFoodNameMixin.java b/common/src/main/java/com/craisinlord/antarchy/mixins/AmericanFoodNameMixin.java new file mode 100644 index 00000000..95dc1dd6 --- /dev/null +++ b/common/src/main/java/com/craisinlord/antarchy/mixins/AmericanFoodNameMixin.java @@ -0,0 +1,20 @@ +package com.craisinlord.antarchy.mixins; + +import com.craisinlord.antarchy.content.AntarchyObjects; +import net.minecraft.network.chat.Component; +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.CallbackInfoReturnable; + +@Mixin(ItemStack.class) +public abstract class AmericanFoodNameMixin { + @Inject(method = "getHoverName", at = @At("RETURN"), cancellable = true) + private void antarchy$prefixAmericanName(CallbackInfoReturnable cir) { + ItemStack self = (ItemStack) (Object) this; + if (self.has(AntarchyObjects.AMERICAN_COMPONENT.get())) { + cir.setReturnValue(Component.translatable("item.antarchy.american_name", cir.getReturnValue())); + } + } +} diff --git a/common/src/main/java/com/craisinlord/antarchy/mixins/BlockEntityTypeSignMixin.java b/common/src/main/java/com/craisinlord/antarchy/mixins/BlockEntityTypeSignMixin.java index de6f8f78..8943dd41 100644 --- a/common/src/main/java/com/craisinlord/antarchy/mixins/BlockEntityTypeSignMixin.java +++ b/common/src/main/java/com/craisinlord/antarchy/mixins/BlockEntityTypeSignMixin.java @@ -22,16 +22,26 @@ public abstract class BlockEntityTypeSignMixin { private static Block antarchy$ouranwoodHangingSign; @Unique private static Block antarchy$ouranwoodWallHangingSign; + @Unique + private static Block antarchy$peachSign; + @Unique + private static Block antarchy$peachWallSign; + @Unique + private static Block antarchy$peachHangingSign; + @Unique + private static Block antarchy$peachWallHangingSign; @Inject(method = "isValid", at = @At("HEAD"), cancellable = true) private void antarchy$allowOuranwoodSigns(BlockState state, CallbackInfoReturnable cir) { Object self = this; if (self == BlockEntityType.SIGN) { - if (state.is(antarchy$sign()) || state.is(antarchy$wallSign())) { + if (state.is(antarchy$sign()) || state.is(antarchy$wallSign()) + || state.is(antarchy$peachSign()) || state.is(antarchy$peachWallSign())) { cir.setReturnValue(true); } } else if (self == BlockEntityType.HANGING_SIGN) { - if (state.is(antarchy$hangingSign()) || state.is(antarchy$wallHangingSign())) { + if (state.is(antarchy$hangingSign()) || state.is(antarchy$wallHangingSign()) + || state.is(antarchy$peachHangingSign()) || state.is(antarchy$peachWallHangingSign())) { cir.setReturnValue(true); } } @@ -69,6 +79,38 @@ public abstract class BlockEntityTypeSignMixin { return antarchy$ouranwoodWallHangingSign; } + @Unique + private static Block antarchy$peachSign() { + if (antarchy$peachSign == null) { + antarchy$peachSign = antarchy$resolve("peach_sign"); + } + return antarchy$peachSign; + } + + @Unique + private static Block antarchy$peachWallSign() { + if (antarchy$peachWallSign == null) { + antarchy$peachWallSign = antarchy$resolve("peach_wall_sign"); + } + return antarchy$peachWallSign; + } + + @Unique + private static Block antarchy$peachHangingSign() { + if (antarchy$peachHangingSign == null) { + antarchy$peachHangingSign = antarchy$resolve("peach_hanging_sign"); + } + return antarchy$peachHangingSign; + } + + @Unique + private static Block antarchy$peachWallHangingSign() { + if (antarchy$peachWallHangingSign == null) { + antarchy$peachWallHangingSign = antarchy$resolve("peach_wall_hanging_sign"); + } + return antarchy$peachWallHangingSign; + } + @Unique private static Block antarchy$resolve(String path) { return BuiltInRegistries.BLOCK.get(ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, path)); diff --git a/common/src/main/java/com/craisinlord/antarchy/mixins/FrogSpawnVariantMixin.java b/common/src/main/java/com/craisinlord/antarchy/mixins/FrogSpawnVariantMixin.java new file mode 100644 index 00000000..16198b8e --- /dev/null +++ b/common/src/main/java/com/craisinlord/antarchy/mixins/FrogSpawnVariantMixin.java @@ -0,0 +1,41 @@ +package com.craisinlord.antarchy.mixins; + +import com.craisinlord.antarchy.content.entity.ElythiaFrog; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.DifficultyInstance; +import net.minecraft.world.entity.AgeableMob; +import net.minecraft.world.entity.MobSpawnType; +import net.minecraft.world.entity.SpawnGroupData; +import net.minecraft.world.entity.animal.frog.Frog; +import net.minecraft.world.level.ServerLevelAccessor; +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; + +@Mixin(Frog.class) +public abstract class FrogSpawnVariantMixin { + @Inject(method = "finalizeSpawn", at = @At("TAIL")) + private void antarchy$setElythiaSpawnVariant( + ServerLevelAccessor level, + DifficultyInstance difficulty, + MobSpawnType spawnType, + SpawnGroupData spawnGroupData, + CallbackInfoReturnable cir + ) { + if (spawnType == MobSpawnType.BUCKET || !ElythiaFrog.shouldBecomeElythiaFrog(level)) { + return; + } + + ElythiaFrog.applyVariant((Frog) (Object) this); + } + + @Inject(method = "getBreedOffspring", at = @At("RETURN")) + private void antarchy$setElythiaOffspringVariant(ServerLevel level, AgeableMob otherParent, CallbackInfoReturnable cir) { + if (!(cir.getReturnValue() instanceof Frog frog) || !ElythiaFrog.shouldBecomeElythiaFrog(level)) { + return; + } + + ElythiaFrog.applyVariant(frog); + } +} diff --git a/common/src/main/java/com/craisinlord/antarchy/mixins/FrogVariantBootstrapMixin.java b/common/src/main/java/com/craisinlord/antarchy/mixins/FrogVariantBootstrapMixin.java new file mode 100644 index 00000000..852735ba --- /dev/null +++ b/common/src/main/java/com/craisinlord/antarchy/mixins/FrogVariantBootstrapMixin.java @@ -0,0 +1,23 @@ +package com.craisinlord.antarchy.mixins; + +import com.craisinlord.antarchy.content.entity.ElythiaFrog; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.animal.FrogVariant; +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; + +@Mixin(FrogVariant.class) +public abstract class FrogVariantBootstrapMixin { + @Inject(method = "bootstrap", at = @At("TAIL")) + private static void antarchy$registerElythiaVariant(Registry registry, CallbackInfoReturnable cir) { + ResourceLocation id = ElythiaFrog.VARIANT.location(); + if (registry.containsKey(id)) { + return; + } + + Registry.register(registry, id, new FrogVariant(ElythiaFrog.TEXTURE)); + } +} diff --git a/common/src/main/java/com/craisinlord/antarchy/mixins/GlowSquidLumenSpawnMixin.java b/common/src/main/java/com/craisinlord/antarchy/mixins/GlowSquidLumenSpawnMixin.java new file mode 100644 index 00000000..fb1eb786 --- /dev/null +++ b/common/src/main/java/com/craisinlord/antarchy/mixins/GlowSquidLumenSpawnMixin.java @@ -0,0 +1,36 @@ +package com.craisinlord.antarchy.mixins; + +import com.craisinlord.antarchy.content.AntarchyTags; +import net.minecraft.core.BlockPos; +import net.minecraft.util.RandomSource; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.GlowSquid; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.MobSpawnType; +import net.minecraft.world.level.ServerLevelAccessor; +import net.minecraft.world.level.block.Blocks; +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; + +@Mixin(GlowSquid.class) +public abstract class GlowSquidLumenSpawnMixin { + @Inject(method = "checkGlowSquidSpawnRules", at = @At("HEAD"), cancellable = true) + private static void antarchy$allowGlowSquidsInLumen( + EntityType entityType, + ServerLevelAccessor level, + MobSpawnType spawnType, + BlockPos pos, + RandomSource random, + CallbackInfoReturnable cir + ) { + if (pos.getY() > level.getSeaLevel() - 33 || level.getRawBrightness(pos, 0) != 0) { + return; + } + + if (level.getBlockState(pos).is(Blocks.WATER) || level.getFluidState(pos).is(AntarchyTags.Fluids.LUMEN)) { + cir.setReturnValue(true); + } + } +} diff --git a/common/src/main/java/com/craisinlord/antarchy/mixins/PotionBrewingMixin.java b/common/src/main/java/com/craisinlord/antarchy/mixins/PotionBrewingMixin.java new file mode 100644 index 00000000..a5510c83 --- /dev/null +++ b/common/src/main/java/com/craisinlord/antarchy/mixins/PotionBrewingMixin.java @@ -0,0 +1,27 @@ +package com.craisinlord.antarchy.mixins; + +import com.craisinlord.antarchy.content.CustomBrewingRecipes; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.alchemy.PotionBrewing; +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; + +@Mixin(PotionBrewing.class) +public abstract class PotionBrewingMixin { + @Inject(method = "hasMix", at = @At("HEAD"), cancellable = true) + private void antarchy$hasCustomMix(ItemStack input, ItemStack ingredient, CallbackInfoReturnable cir) { + if (CustomBrewingRecipes.hasMix(input, ingredient)) { + cir.setReturnValue(true); + } + } + + @Inject(method = "mix", at = @At("HEAD"), cancellable = true) + private void antarchy$mixCustomRecipe(ItemStack ingredient, ItemStack input, CallbackInfoReturnable cir) { + ItemStack output = CustomBrewingRecipes.getOutput(input, ingredient); + if (!output.isEmpty()) { + cir.setReturnValue(output); + } + } +} diff --git a/common/src/main/java/com/craisinlord/antarchy/mixins/VillagerTradesMixin.java b/common/src/main/java/com/craisinlord/antarchy/mixins/VillagerTradesMixin.java new file mode 100644 index 00000000..cb788cc9 --- /dev/null +++ b/common/src/main/java/com/craisinlord/antarchy/mixins/VillagerTradesMixin.java @@ -0,0 +1,93 @@ +package com.craisinlord.antarchy.mixins; + +import com.craisinlord.antarchy.content.AntarchyObjects; +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; +import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; +import net.minecraft.world.entity.npc.VillagerProfession; +import net.minecraft.world.entity.npc.VillagerTrades; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.trading.ItemCost; +import net.minecraft.world.item.trading.MerchantOffer; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Mutable; +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; + +@Mixin(VillagerTrades.class) +public abstract class VillagerTradesMixin { + @Shadow @Mutable @Final private static Map TRADES; + @Shadow @Mutable @Final private static Int2ObjectMap WANDERING_TRADER_TRADES; + + @Inject(method = "", at = @At("TAIL")) + private static void antarchy$appendTrades(CallbackInfo ci) { + appendVillagerTrade(VillagerProfession.FARMER, 1, + emeraldForItems(AntarchyObjects.CORN.get(), 20, 16, 2)); + appendVillagerTrade(VillagerProfession.BUTCHER, 1, + emeraldForItems(AntarchyObjects.COOKED_CORNDOG.get(), 5, 16, 2)); + appendWanderingTrade(0, + itemsForEmerald(AntarchyObjects.CORN_SEEDS.get(), 1, 3, 12, 2)); + } + + private static VillagerTrades.ItemListing emeraldForItems(net.minecraft.world.item.Item item, int count, int maxUses, int villagerXp) { + return (trader, random) -> new MerchantOffer(new ItemCost(item, count), new ItemStack(Items.EMERALD), maxUses, villagerXp, 0.05F); + } + + private static VillagerTrades.ItemListing itemsForEmerald(net.minecraft.world.item.Item item, int emeraldCost, int count, int maxUses, int villagerXp) { + return (trader, random) -> new MerchantOffer(new ItemCost(Items.EMERALD, emeraldCost), new ItemStack(item, count), maxUses, villagerXp, 0.05F); + } + + @SuppressWarnings("unchecked") + private static void appendVillagerTrade(VillagerProfession profession, int level, VillagerTrades.ItemListing listing) { + Object tradeValue = TRADES.get(profession); + if (!(tradeValue instanceof Map tradeMap)) { + return; + } + + Int2ObjectOpenHashMap copy = new Int2ObjectOpenHashMap<>(); + for (Map.Entry entry : tradeMap.entrySet()) { + if (entry.getKey() instanceof Integer key && entry.getValue() instanceof VillagerTrades.ItemListing[] listings) { + copy.put(key, listings); + } + } + + VillagerTrades.ItemListing[] existing = copy.get(level); + VillagerTrades.ItemListing[] merged = Arrays.copyOf(existing == null ? new VillagerTrades.ItemListing[0] : existing, + (existing == null ? 0 : existing.length) + 1); + merged[merged.length - 1] = listing; + copy.put(level, merged); + Map rebuilt = new HashMap<>(); + for (Object entryObject : TRADES.entrySet()) { + Map.Entry entry = (Map.Entry) entryObject; + if (entry.getKey() != profession) { + rebuilt.put(entry.getKey(), entry.getValue()); + } + } + rebuilt.put(profession, copy); + TRADES = rebuilt; + } + + @SuppressWarnings("unchecked") + private static void appendWanderingTrade(int group, VillagerTrades.ItemListing listing) { + Int2ObjectOpenHashMap copy = new Int2ObjectOpenHashMap<>(); + for (Object entryObject : ((Map) WANDERING_TRADER_TRADES).entrySet()) { + Map.Entry entry = (Map.Entry) entryObject; + if (entry.getKey() instanceof Integer key && entry.getValue() instanceof VillagerTrades.ItemListing[] listings) { + copy.put((int) key, listings); + } + } + + VillagerTrades.ItemListing[] existing = copy.get(group); + VillagerTrades.ItemListing[] merged = Arrays.copyOf(existing == null ? new VillagerTrades.ItemListing[0] : existing, + (existing == null ? 0 : existing.length) + 1); + merged[merged.length - 1] = listing; + copy.put(group, merged); + WANDERING_TRADER_TRADES = copy; + } +} diff --git a/common/src/main/java/com/craisinlord/antarchy/mixins/WaterlilyLumenMixin.java b/common/src/main/java/com/craisinlord/antarchy/mixins/WaterlilyLumenMixin.java new file mode 100644 index 00000000..0ac9787b --- /dev/null +++ b/common/src/main/java/com/craisinlord/antarchy/mixins/WaterlilyLumenMixin.java @@ -0,0 +1,25 @@ +package com.craisinlord.antarchy.mixins; + +import com.craisinlord.antarchy.content.AntarchyTags; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.block.WaterlilyBlock; +import net.minecraft.world.level.block.state.BlockState; +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; + +@Mixin(WaterlilyBlock.class) +public abstract class WaterlilyLumenMixin { + @Inject( + method = "mayPlaceOn(Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/BlockGetter;Lnet/minecraft/core/BlockPos;)Z", + at = @At("HEAD"), + cancellable = true + ) + private void antarchy$allowLumenSupport(BlockState state, BlockGetter level, BlockPos pos, CallbackInfoReturnable cir) { + if (level.getFluidState(pos).is(AntarchyTags.Fluids.LUMEN)) { + cir.setReturnValue(true); + } + } +} diff --git a/common/src/main/java/com/craisinlord/antarchy/mixins/client/FrogRendererElythiaMixin.java b/common/src/main/java/com/craisinlord/antarchy/mixins/client/FrogRendererElythiaMixin.java new file mode 100644 index 00000000..899a3a71 --- /dev/null +++ b/common/src/main/java/com/craisinlord/antarchy/mixins/client/FrogRendererElythiaMixin.java @@ -0,0 +1,29 @@ +package com.craisinlord.antarchy.mixins.client; + +import com.craisinlord.antarchy.content.entity.ElythiaFrog; +import net.minecraft.client.model.FrogModel; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.entity.MobRenderer; +import net.minecraft.client.renderer.entity.FrogRenderer; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.animal.frog.Frog; +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; + +@Mixin(FrogRenderer.class) +public abstract class FrogRendererElythiaMixin extends MobRenderer> { + protected FrogRendererElythiaMixin(EntityRendererProvider.Context context, FrogModel model, float shadowRadius) { + super(context, model, shadowRadius); + } + + @Inject(method = "getTextureLocation(Lnet/minecraft/world/entity/animal/frog/Frog;)Lnet/minecraft/resources/ResourceLocation;", at = @At("HEAD"), cancellable = true) + private void antarchy$useElythiaTexture(Frog frog, CallbackInfoReturnable cir) { + if (!ElythiaFrog.isElythiaFrog(frog)) { + return; + } + + cir.setReturnValue(ElythiaFrog.TEXTURE); + } +} diff --git a/common/src/main/java/com/craisinlord/antarchy/mixins/gravity/client/EntityRenderDispatcherGravityMixin.java b/common/src/main/java/com/craisinlord/antarchy/mixins/gravity/client/EntityRenderDispatcherGravityMixin.java index aedd87d7..057577a5 100644 --- a/common/src/main/java/com/craisinlord/antarchy/mixins/gravity/client/EntityRenderDispatcherGravityMixin.java +++ b/common/src/main/java/com/craisinlord/antarchy/mixins/gravity/client/EntityRenderDispatcherGravityMixin.java @@ -1,5 +1,6 @@ package com.craisinlord.antarchy.mixins.gravity.client; +import com.craisinlord.antarchy.Antarchy; import com.craisinlord.antarchy.content.gravity.AntarchyGravityApi; import com.craisinlord.antarchy.content.gravity.AntarchyGravityRotationUtil; import com.llamalad7.mixinextras.injector.wrapoperation.Operation; @@ -22,6 +23,8 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; * Rotates entity rendering for inverted gravity. */ public abstract class EntityRenderDispatcherGravityMixin { + @org.spongepowered.asm.mixin.Unique + private static boolean antarchy$loggedGravityRenderFailure; @Inject( method = "render", @@ -39,12 +42,16 @@ public abstract class EntityRenderDispatcherGravityMixin { int packedLight, CallbackInfo ci ) { - float flipProgress = AntarchyGravityApi.getGravityFlipProgress(entity, partialTick); - if (!AntarchyGravityApi.isGravityInverted(entity) && flipProgress <= 0.0F) { - return; - } + try { + float flipProgress = AntarchyGravityApi.getGravityFlipProgress(entity, partialTick); + if (!AntarchyGravityApi.isGravityInverted(entity) && flipProgress <= 0.0F) { + return; + } - poseStack.mulPose(AntarchyGravityRotationUtil.getCameraRotationQuaternion(entity, partialTick)); + poseStack.mulPose(AntarchyGravityRotationUtil.getCameraRotationQuaternion(entity, partialTick)); + } catch (Throwable throwable) { + antarchy$logGravityRenderFailure(entity, throwable); + } } @ModifyVariable( @@ -62,14 +69,19 @@ public abstract class EntityRenderDispatcherGravityMixin { float blue, float partialTick ) { - if (!AntarchyGravityApi.isGravityInverted(entity)) { + try { + if (!AntarchyGravityApi.isGravityInverted(entity)) { + return box; + } + + return AntarchyGravityRotationUtil.boxWorldToPlayer( + box, + AntarchyGravityApi.getGravityDirection(entity) + ); + } catch (Throwable throwable) { + antarchy$logGravityRenderFailure(entity, throwable); return box; } - - return AntarchyGravityRotationUtil.boxWorldToPlayer( - box, - AntarchyGravityApi.getGravityDirection(entity) - ); } @WrapOperation( @@ -78,13 +90,28 @@ public abstract class EntityRenderDispatcherGravityMixin { ) private static Vec3 antarchy$rotateRenderedHitboxViewVector(Entity entity, float partialTick, Operation original) { Vec3 viewVector = original.call(entity, partialTick); - if (!AntarchyGravityApi.isGravityInverted(entity)) { + try { + if (!AntarchyGravityApi.isGravityInverted(entity)) { + return viewVector; + } + + return AntarchyGravityRotationUtil.vecWorldToPlayer( + viewVector, + AntarchyGravityApi.getGravityDirection(entity) + ); + } catch (Throwable throwable) { + antarchy$logGravityRenderFailure(entity, throwable); return viewVector; } + } - return AntarchyGravityRotationUtil.vecWorldToPlayer( - viewVector, - AntarchyGravityApi.getGravityDirection(entity) - ); + @org.spongepowered.asm.mixin.Unique + private static void antarchy$logGravityRenderFailure(Entity entity, Throwable throwable) { + if (antarchy$loggedGravityRenderFailure) { + return; + } + + antarchy$loggedGravityRenderFailure = true; + Antarchy.LOGGER.error("Disabling Antarchy gravity render adjustments after a client render failure on entity {}", entity, throwable); } } diff --git a/common/src/main/resources/antarchy-common.mixins.json b/common/src/main/resources/antarchy-common.mixins.json index c8baf76c..63429f3f 100644 --- a/common/src/main/resources/antarchy-common.mixins.json +++ b/common/src/main/resources/antarchy-common.mixins.json @@ -5,6 +5,8 @@ "compatibilityLevel": "JAVA_21", "mixins": [ "AccessorRangedAttribute", + "AmericanFoodConsumeMixin", + "AmericanFoodNameMixin", "BlockEntityTypeSignMixin", "BloodglassMixin", "DreamFireBlockMixin", @@ -12,8 +14,14 @@ "FireVisualBaseFireBlockMixin", "FireVisualEntityMixin", "FlintAndSteelPortalIgnitionMixin", + "FrogSpawnVariantMixin", + "FrogVariantBootstrapMixin", + "GlowSquidLumenSpawnMixin", "GlowVinesUnderLeavesMixin", "NightmareSwordDamageMixin", + "PotionBrewingMixin", + "VillagerTradesMixin", + "WaterlilyLumenMixin", "ServerPlayerGameModeMixin", "SquidzookaEnchantMixin", "SquidzookaMultishotMixin", @@ -50,6 +58,7 @@ "client": [ "client.ElythiaSkyMixin", "client.ElytraModelAccessor", + "client.FrogRendererElythiaMixin", "client.GameRendererSwingThroughGrassMixin", "client.LightningBoltRendererMixin", "client.MountedVehicleCameraMixin", diff --git a/common/src/main/resources/assets/antarchy/animations/elka.animation.json b/common/src/main/resources/assets/antarchy/animations/elka.animation.json new file mode 100644 index 00000000..9c7b5e9b --- /dev/null +++ b/common/src/main/resources/assets/antarchy/animations/elka.animation.json @@ -0,0 +1,3578 @@ +{ + "format_version": "1.8.0", + "animations": { + "walk": { + "loop": true, + "animation_length": 3, + "bones": { + "right_ear": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "post": { + "vector": [0, 0, -22.5] + }, + "lerp_mode": "catmullrom" + }, + "0.375": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.5": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.75": { + "post": { + "vector": [0, 0, -22.5] + }, + "lerp_mode": "catmullrom" + }, + "1.875": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "left_ear": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "post": { + "vector": [0, 0, 22.5] + }, + "lerp_mode": "catmullrom" + }, + "0.375": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.5": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.75": { + "post": { + "vector": [0, 0, 22.5] + }, + "lerp_mode": "catmullrom" + }, + "1.875": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "head": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.5833": { + "post": { + "vector": [15, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.9583": { + "post": { + "vector": [-2.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.25": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.5": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.75": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "2.0833": { + "post": { + "vector": [15, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "2.4583": { + "post": { + "vector": [-2.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "3.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "right_leg": { + "rotation": { + "0.0": { + "vector": [27.5, 0, 0] + }, + "0.7083": { + "pre": { + "vector": [31.53, 0, 0] + }, + "post": { + "vector": [31.53, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.5": { + "vector": [-27.5, 0, 0] + }, + "3.0": { + "vector": [27.5, 0, 0] + } + }, + "position": { + "0.0": { + "vector": [0, -0.25, 4] + }, + "0.375": { + "pre": { + "vector": [0, -0.25, 3] + }, + "post": { + "vector": [0, -0.25, 3] + }, + "lerp_mode": "catmullrom" + }, + "0.9167": { + "post": { + "vector": [0, -0.25, -2.83] + }, + "lerp_mode": "catmullrom" + }, + "1.5": { + "vector": [0, -0.25, -2] + }, + "1.7917": { + "vector": [0, 0.5, -0.83] + }, + "2.25": { + "vector": [0, -0.25, 1] + }, + "3.0": { + "vector": [0, -0.25, 4] + } + } + }, + "torso": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.25": { + "pre": { + "vector": [0, 0, 5] + }, + "post": { + "vector": [0, 0, 5] + }, + "lerp_mode": "catmullrom" + }, + "0.4167": { + "post": { + "vector": [0, 0, -5] + }, + "lerp_mode": "catmullrom" + }, + "0.5833": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.5": { + "vector": [0, 0, 0] + }, + "1.75": { + "pre": { + "vector": [0, 0, 5] + }, + "post": { + "vector": [0, 0, 5] + }, + "lerp_mode": "catmullrom" + }, + "1.9167": { + "post": { + "vector": [0, 0, -5] + }, + "lerp_mode": "catmullrom" + }, + "2.0833": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + }, + "position": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "post": { + "vector": [0, -2, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.9583": { + "post": { + "vector": [0, 2, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.0833": { + "post": { + "vector": [0, 0.95, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.2917": { + "post": { + "vector": [0, 2, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.5": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.875": { + "post": { + "vector": [0, -2, 0] + }, + "lerp_mode": "catmullrom" + }, + "2.4583": { + "post": { + "vector": [0, 2, 0] + }, + "lerp_mode": "catmullrom" + }, + "3.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "left_leg": { + "rotation": { + "0.0": { + "vector": [-27.5, 0, 0] + }, + "1.5": { + "vector": [27.5, 0, 0] + }, + "2.2083": { + "pre": { + "vector": [31.53, 0, 0] + }, + "post": { + "vector": [31.53, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "3.0": { + "vector": [-27.5, 0, 0] + } + }, + "position": { + "0.0": { + "vector": [0, -0.25, -2] + }, + "0.2917": { + "vector": [0, 0.5, -0.83] + }, + "0.75": { + "vector": [0, -0.25, 1] + }, + "1.5": { + "vector": [0, -0.25, 4] + }, + "1.875": { + "pre": { + "vector": [0, -0.25, 3] + }, + "post": { + "vector": [0, -0.25, 3] + }, + "lerp_mode": "catmullrom" + }, + "2.4167": { + "post": { + "vector": [0, -0.25, -2.83] + }, + "lerp_mode": "catmullrom" + }, + "3.0": { + "vector": [0, -0.25, -2] + } + } + }, + "right_back_leg": { + "rotation": { + "0.0": { + "vector": [-18.5, 0, 0] + }, + "0.2083": { + "vector": [-27.5, 0, 0] + }, + "1.7083": { + "vector": [27.5, 0, 0] + }, + "2.4167": { + "pre": { + "vector": [31.53, 0, 0] + }, + "post": { + "vector": [31.53, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "3.0": { + "vector": [-18.5, 0, 0] + } + }, + "position": { + "0.0": { + "vector": [0, -0.31, -2.59] + }, + "0.2083": { + "vector": [0, -0.25, -2] + }, + "0.5": { + "vector": [0, 0.5, -0.83] + }, + "0.9583": { + "vector": [0, -0.25, 1] + }, + "1.7083": { + "vector": [0, -0.25, 4] + }, + "2.0833": { + "pre": { + "vector": [0, -0.25, 3] + }, + "post": { + "vector": [0, -0.25, 3] + }, + "lerp_mode": "catmullrom" + }, + "2.625": { + "post": { + "vector": [0, -0.25, -2.83] + }, + "lerp_mode": "catmullrom" + }, + "3.0": { + "vector": [0, -0.31, -2.59] + } + } + }, + "left_back_leg": { + "rotation": { + "0.0": { + "vector": [19.86, 0, 0] + }, + "0.2083": { + "vector": [27.5, 0, 0] + }, + "0.9167": { + "pre": { + "vector": [31.53, 0, 0] + }, + "post": { + "vector": [31.53, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.5": { + "vector": [-18.5, 0, 0] + }, + "1.7083": { + "vector": [-27.5, 0, 0] + }, + "3.0": { + "vector": [19.86, 0, 0] + } + }, + "position": { + "0.0": { + "vector": [0, -0.25, 3.17] + }, + "0.2083": { + "vector": [0, -0.25, 4] + }, + "0.5833": { + "pre": { + "vector": [0, -0.25, 3] + }, + "post": { + "vector": [0, -0.25, 3] + }, + "lerp_mode": "catmullrom" + }, + "1.125": { + "post": { + "vector": [0, -0.25, -2.83] + }, + "lerp_mode": "catmullrom" + }, + "1.5": { + "vector": [0, -0.31, -2.59] + }, + "1.7083": { + "vector": [0, -0.25, -2] + }, + "2.0": { + "vector": [0, 0.5, -0.83] + }, + "2.4583": { + "vector": [0, -0.25, 1] + }, + "3.0": { + "vector": [0, -0.25, 3.17] + } + } + }, + "panda": { + "position": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.125": { + "vector": [0, 0, 0] + }, + "0.25": { + "vector": [0, -1, 0] + }, + "0.375": { + "vector": [0, 0, 0] + }, + "1.5": { + "vector": [0, 0, 0] + }, + "1.625": { + "vector": [0, 0, 0] + }, + "1.75": { + "vector": [0, -1, 0] + }, + "1.875": { + "vector": [0, 0, 0] + } + } + } + } + }, + "idle": { + "loop": true, + "animation_length": 4, + "bones": { + "head": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.9167": { + "post": { + "vector": [7.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "4.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "torso": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.0417": { + "post": { + "vector": [1.40491, -0.06133, 2.49925] + }, + "lerp_mode": "catmullrom" + }, + "2.0833": { + "post": { + "vector": [2.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "3.0833": { + "post": { + "vector": [1.45366, 0.00412, -0.16804] + }, + "lerp_mode": "catmullrom" + }, + "4.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + } + } + }, + "sit": { + "animation_length": 1, + "bones": { + "right_ear": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.4583": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [0, 0, -22.5] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "left_ear": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.4583": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [0, 0, 22.5] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "jaw": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.5": { + "vector": [0, 0, 0] + }, + "0.75": { + "vector": [15, 0, 0] + }, + "1.0": { + "vector": [0, 0, 0] + } + } + }, + "head": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [30, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [37.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [30, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "right_leg": { + "position": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [0, 7, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [0, 7, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [0, 7, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "torso": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [-17.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [-17.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [-17.5, 0, 0] + }, + "lerp_mode": "catmullrom" + } + }, + "position": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [0, 4, 3] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [0, 2, 3] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [0, 4, 3] + }, + "lerp_mode": "catmullrom" + } + } + }, + "left_leg": { + "position": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [0, 7, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [0, 7, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [0, 7, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "right_back_leg": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [-90, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [-90, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [-90, 0, 0] + }, + "lerp_mode": "catmullrom" + } + }, + "position": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [0, -4, 3] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [0, -4, 3] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [0, -4, 3] + }, + "lerp_mode": "catmullrom" + } + } + }, + "left_back_leg": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [-90, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [-90, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [-90, 0, 0] + }, + "lerp_mode": "catmullrom" + } + }, + "position": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [0, -4, 3] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [0, -4, 3] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [0, -4, 3] + }, + "lerp_mode": "catmullrom" + } + } + }, + "back": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "panda": { + "position": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [0, -8, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [0, -8, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [0, -8, 0] + }, + "lerp_mode": "catmullrom" + } + } + } + } + }, + "sit_idle": { + "loop": true, + "animation_length": 4, + "bones": { + "right_ear": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "2.0": { + "post": { + "vector": [0, 0, -12.5] + }, + "lerp_mode": "catmullrom" + }, + "4.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "left_ear": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "2.0": { + "post": { + "vector": [0, 0, 12.5] + }, + "lerp_mode": "catmullrom" + }, + "4.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "jaw": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "2.0": { + "post": { + "vector": [20, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "4.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "head": { + "rotation": { + "0.0": { + "post": { + "vector": [30, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [33.6659, -3.12234, 4.68136] + }, + "lerp_mode": "catmullrom" + }, + "2.0": { + "post": { + "vector": [37.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "3.0417": { + "post": { + "vector": [33.41527, 2.75839, -4.1719] + }, + "lerp_mode": "catmullrom" + }, + "4.0": { + "post": { + "vector": [30, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "right_leg": { + "position": { + "0.0": { + "post": { + "vector": [0, 7, 0] + }, + "lerp_mode": "catmullrom" + }, + "4.0": { + "post": { + "vector": [0, 7, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "torso": { + "rotation": { + "0.0": { + "post": { + "vector": [-17.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.9583": { + "post": { + "vector": [-17.48436, 0.75155, 2.38443] + }, + "lerp_mode": "catmullrom" + }, + "2.0": { + "post": { + "vector": [-17.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "2.8333": { + "post": { + "vector": [-17.48246, -0.84288, -2.67423] + }, + "lerp_mode": "catmullrom" + }, + "4.0": { + "post": { + "vector": [-17.5, 0, 0] + }, + "lerp_mode": "catmullrom" + } + }, + "position": { + "0.0": { + "post": { + "vector": [0, 4, 3] + }, + "lerp_mode": "catmullrom" + }, + "4.0": { + "post": { + "vector": [0, 4, 3] + }, + "lerp_mode": "catmullrom" + } + } + }, + "left_leg": { + "position": { + "0.0": { + "post": { + "vector": [0, 7, 0] + }, + "lerp_mode": "catmullrom" + }, + "4.0": { + "post": { + "vector": [0, 7, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "right_back_leg": { + "rotation": { + "0.0": { + "post": { + "vector": [-90, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "4.0": { + "post": { + "vector": [-90, 0, 0] + }, + "lerp_mode": "catmullrom" + } + }, + "position": { + "0.0": { + "post": { + "vector": [0, -4, 3] + }, + "lerp_mode": "catmullrom" + }, + "4.0": { + "post": { + "vector": [0, -4, 3] + }, + "lerp_mode": "catmullrom" + } + } + }, + "left_back_leg": { + "rotation": { + "0.0": { + "post": { + "vector": [-90, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "4.0": { + "post": { + "vector": [-90, 0, 0] + }, + "lerp_mode": "catmullrom" + } + }, + "position": { + "0.0": { + "post": { + "vector": [0, -4, 3] + }, + "lerp_mode": "catmullrom" + }, + "4.0": { + "post": { + "vector": [0, -4, 3] + }, + "lerp_mode": "catmullrom" + } + } + }, + "back": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "4.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "panda": { + "position": { + "0.0": { + "post": { + "vector": [0, -8, 0] + }, + "lerp_mode": "catmullrom" + }, + "4.0": { + "post": { + "vector": [0, -8, 0] + }, + "lerp_mode": "catmullrom" + } + } + } + } + }, + "cry": { + "animation_length": 1.25, + "bones": { + "jaw": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.5833": { + "post": { + "vector": [37.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.25": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "head": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.3333": { + "post": { + "vector": [37.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.5417": { + "post": { + "vector": [37.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.6667": { + "post": { + "vector": [-10, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.25": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "torso": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.6667": { + "post": { + "vector": [-5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.25": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + } + } + }, + "get_up": { + "animation_length": 1, + "bones": { + "right_ear": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.4583": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "left_ear": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.4583": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "jaw": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.4583": { + "vector": [0, 0, 0] + }, + "1.0": { + "vector": [0, 0, 0] + } + } + }, + "head": { + "rotation": { + "0.0": { + "post": { + "vector": [30, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.4583": { + "post": { + "vector": [30, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "right_leg": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.6667": { + "post": { + "vector": [12.5, 40, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + }, + "position": { + "0.0": { + "post": { + "vector": [0, 7, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.4583": { + "post": { + "vector": [0, 7, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "torso": { + "rotation": { + "0.0": { + "post": { + "vector": [-17.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.4583": { + "post": { + "vector": [-7.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + }, + "position": { + "0.0": { + "post": { + "vector": [0, 4, 3] + }, + "lerp_mode": "catmullrom" + }, + "0.4583": { + "post": { + "vector": [0, 4, 3] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "left_leg": { + "position": { + "0.0": { + "post": { + "vector": [0, 7, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.4583": { + "post": { + "vector": [0, 7, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "right_back_leg": { + "rotation": { + "0.0": { + "post": { + "vector": [-90, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.4583": { + "post": { + "vector": [-90, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + }, + "position": { + "0.0": { + "post": { + "vector": [0, -4, 3] + }, + "lerp_mode": "catmullrom" + }, + "0.4583": { + "post": { + "vector": [0, -4, 3] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "left_back_leg": { + "rotation": { + "0.0": { + "post": { + "vector": [-90, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.5417": { + "post": { + "vector": [-62.91, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + }, + "position": { + "0.0": { + "post": { + "vector": [0, -4, 3] + }, + "lerp_mode": "catmullrom" + }, + "0.4583": { + "post": { + "vector": [0, -4, 3] + }, + "lerp_mode": "catmullrom" + }, + "0.5417": { + "post": { + "vector": [0, 0.43, 2.68] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "back": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.4583": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "panda": { + "position": { + "0.0": { + "post": { + "vector": [0, -8, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.4583": { + "post": { + "vector": [0, -8, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + } + } + }, + "attack": { + "animation_length": 1, + "bones": { + "right_ear": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "post": { + "vector": [45, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.375": { + "post": { + "vector": [45, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [-27.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.7083": { + "post": { + "vector": [-27.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.875": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.9167": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "left_ear": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "post": { + "vector": [45, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.375": { + "post": { + "vector": [45, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [-27.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.7083": { + "post": { + "vector": [-27.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.875": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.9167": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "jaw": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.5": { + "vector": [37.5, 0, 0] + }, + "0.7083": { + "vector": [37.5, 0, 0] + }, + "0.875": { + "vector": [0, 0, 0] + }, + "0.9167": { + "vector": [0, 0, 0] + }, + "1.0": { + "vector": [0, 0, 0] + } + } + }, + "head": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "post": { + "vector": [57.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.375": { + "post": { + "vector": [35, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [-5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.7083": { + "post": { + "vector": [-5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.875": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.9167": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + }, + "position": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.375": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [0, 0, -3] + }, + "lerp_mode": "catmullrom" + }, + "0.5833": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "right_leg": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.375": { + "vector": [0, 0, 0] + }, + "0.5": { + "vector": [-20, 0, 27.5] + }, + "0.7083": { + "vector": [-20, 0, 27.5] + }, + "0.875": { + "vector": [0, 0, 0] + }, + "0.9167": { + "vector": [0, 0, 0] + }, + "1.0": { + "vector": [0, 0, 0] + } + }, + "position": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.1667": { + "post": { + "vector": [0, 1, 2.67] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "post": { + "vector": [0, 0, 4] + }, + "lerp_mode": "catmullrom" + }, + "0.375": { + "post": { + "vector": [0, 0, 4] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [-3, 6, -2] + }, + "lerp_mode": "catmullrom" + }, + "0.7083": { + "post": { + "vector": [-3, 6, -2] + }, + "lerp_mode": "catmullrom" + }, + "0.875": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.9167": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "torso": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "post": { + "vector": [17.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.375": { + "post": { + "vector": [17.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [-20, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.7083": { + "post": { + "vector": [-20, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.875": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.9167": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "left_leg": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.375": { + "vector": [0, 0, 0] + }, + "0.5": { + "vector": [-20, 0, -27.5] + }, + "0.7083": { + "vector": [-20, 0, -27.5] + }, + "0.875": { + "vector": [0, 0, 0] + }, + "0.9167": { + "vector": [0, 0, 0] + }, + "1.0": { + "vector": [0, 0, 0] + } + }, + "position": { + "0.0": { + "post": { + "vector": [3, 0, -2] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "post": { + "vector": [0, 0, 4] + }, + "lerp_mode": "catmullrom" + }, + "0.375": { + "post": { + "vector": [0, 0, 4] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [3, 6, -2] + }, + "lerp_mode": "catmullrom" + }, + "0.7083": { + "post": { + "vector": [3, 6, -2] + }, + "lerp_mode": "catmullrom" + }, + "0.875": { + "post": { + "vector": [3, 0, -2] + }, + "lerp_mode": "catmullrom" + }, + "0.9167": { + "post": { + "vector": [3, 0, -2] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [3, 0, -2] + }, + "lerp_mode": "catmullrom" + } + } + }, + "right_back_leg": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.5": { + "vector": [0, -22.5, 0] + }, + "0.7083": { + "vector": [0, -22.5, 0] + }, + "0.875": { + "vector": [0, 0, 0] + }, + "0.9167": { + "vector": [0, 0, 0] + }, + "1.0": { + "vector": [0, 0, 0] + } + }, + "position": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.125": { + "post": { + "vector": [0, 3, -3] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "post": { + "vector": [0, 0, -6] + }, + "lerp_mode": "catmullrom" + }, + "0.375": { + "post": { + "vector": [0, 0, -6] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.7083": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.875": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.9167": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "left_back_leg": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "post": { + "vector": [12.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.375": { + "post": { + "vector": [12.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [0, 22.5, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.7083": { + "post": { + "vector": [0, 22.5, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.875": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.9167": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + }, + "position": { + "0.5": { + "pre": { + "vector": [0, 0, 0] + }, + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.7083": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "back": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "post": { + "vector": [-7.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.375": { + "post": { + "vector": [-7.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [-7.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.7083": { + "post": { + "vector": [-7.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.875": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.9167": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + }, + "scale": { + "0.0": { + "vector": [1, 1, 1] + }, + "0.3333": { + "vector": [1, 1, 1] + }, + "0.375": { + "pre": { + "vector": [1.1, 1, 1] + }, + "post": { + "vector": [1.1, 1, 1] + }, + "lerp_mode": "catmullrom" + }, + "0.4167": { + "post": { + "vector": [1, 1, 1] + }, + "lerp_mode": "catmullrom" + }, + "0.4583": { + "post": { + "vector": [1.1, 1, 1] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [1, 1, 1] + }, + "lerp_mode": "catmullrom" + }, + "0.5417": { + "vector": [1.1, 1, 1] + }, + "0.5833": { + "vector": [1, 1, 1] + } + } + }, + "panda": { + "position": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.25": { + "vector": [0, 0, 0] + }, + "0.3333": { + "vector": [0, 0, 0] + }, + "0.375": { + "vector": [0, -2, 2] + }, + "0.4167": { + "vector": [0, 0.33, 1] + }, + "0.625": { + "vector": [0, 0, -4] + }, + "0.7917": { + "vector": [0, 0, -4] + }, + "0.875": { + "vector": [0, 0, 0] + }, + "0.9167": { + "vector": [0, -2, 0] + }, + "1.0": { + "vector": [0, 0, 0] + } + } + } + } + }, + "quirk": { + "loop": true, + "animation_length": 4, + "bones": { + "right_ear": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.0417": { + "post": { + "vector": [0, 0, -25] + }, + "lerp_mode": "catmullrom" + }, + "2.2083": { + "post": { + "vector": [28.72, 0, -4.2] + }, + "lerp_mode": "catmullrom" + }, + "2.5": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "2.7917": { + "post": { + "vector": [-15.85903, 0, 0.31062] + }, + "lerp_mode": "catmullrom" + }, + "3.4167": { + "post": { + "vector": [20, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "4.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "left_ear": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.0417": { + "post": { + "vector": [0, 0, 25] + }, + "lerp_mode": "catmullrom" + }, + "2.2083": { + "post": { + "vector": [43.72, 0, 4.2] + }, + "lerp_mode": "catmullrom" + }, + "2.5": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "2.7917": { + "post": { + "vector": [-24.4684, 0, -0.31062] + }, + "lerp_mode": "catmullrom" + }, + "3.4167": { + "post": { + "vector": [20, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "4.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "jaw": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.75": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "2.0417": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "2.375": { + "post": { + "vector": [45, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "2.6667": { + "post": { + "vector": [-5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "4.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "head": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.5833": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.875": { + "post": { + "vector": [3.42004, -17.47073, -1.02787] + }, + "lerp_mode": "catmullrom" + }, + "1.2083": { + "post": { + "vector": [3.42004, -17.47073, -1.02787] + }, + "lerp_mode": "catmullrom" + }, + "1.625": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "2.0": { + "post": { + "vector": [3.05502, 16.23765, 0.86455] + }, + "lerp_mode": "catmullrom" + }, + "2.4167": { + "post": { + "vector": [27.76497, 14.69599, 0.78246] + }, + "lerp_mode": "catmullrom" + }, + "2.7083": { + "post": { + "vector": [-4.99339, 14.21392, 0.7568] + }, + "lerp_mode": "catmullrom" + }, + "3.375": { + "post": { + "vector": [15.62466, 6.79132, 0.36159] + }, + "lerp_mode": "catmullrom" + }, + "4.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "right_leg": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "2.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "2.2917": { + "post": { + "vector": [12.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "2.4583": { + "post": { + "vector": [12.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "2.75": { + "post": { + "vector": [-27.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "3.0417": { + "post": { + "vector": [2.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "3.2917": { + "post": { + "vector": [7.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "3.5833": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "torso": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.0417": { + "post": { + "vector": [1.40491, -0.06133, 2.49925] + }, + "lerp_mode": "catmullrom" + }, + "2.0833": { + "post": { + "vector": [2.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "2.4167": { + "post": { + "vector": [2.37983, -0.63438, 14.84347] + }, + "lerp_mode": "catmullrom" + }, + "2.7917": { + "post": { + "vector": [-5.56124, -0.29927, 6.95604] + }, + "lerp_mode": "catmullrom" + }, + "3.0833": { + "post": { + "vector": [1.45366, 0.00412, -0.16804] + }, + "lerp_mode": "catmullrom" + }, + "4.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + } + } + }, + "quirk_2": { + "animation_length": 3, + "bones": { + "jaw": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.2083": { + "post": { + "vector": [40, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.4583": { + "post": { + "vector": [7.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.8333": { + "post": { + "vector": [40, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "2.5": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "2.625": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "2.75": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "head": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [60, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [87.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.2083": { + "post": { + "vector": [22.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.7917": { + "post": { + "vector": [70, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "2.5": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "2.625": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "2.75": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "right_leg": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [-35, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.25": { + "post": { + "vector": [-29.28825, 19.9034, 31.25201] + }, + "lerp_mode": "catmullrom" + }, + "1.875": { + "post": { + "vector": [-29.28825, 19.9034, 31.25201] + }, + "lerp_mode": "catmullrom" + }, + "2.5": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "2.625": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "2.75": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + }, + "position": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [-1, 24, 11] + }, + "lerp_mode": "catmullrom" + }, + "1.1667": { + "post": { + "vector": [-1, 23, 11] + }, + "lerp_mode": "catmullrom" + }, + "1.875": { + "post": { + "vector": [-1, 21, 11] + }, + "lerp_mode": "catmullrom" + }, + "2.5": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "2.625": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "2.75": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "torso": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [-62.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.9583": { + "post": { + "vector": [-52.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.125": { + "post": { + "vector": [-70, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.5": { + "post": { + "vector": [-67.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "2.0": { + "post": { + "vector": [-72.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "2.25": { + "post": { + "vector": [-46.12, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "2.5": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "2.625": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "2.75": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + }, + "position": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.2917": { + "post": { + "vector": [0, -0.75, 3.25] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [0, 9, 13] + }, + "lerp_mode": "catmullrom" + }, + "1.875": { + "post": { + "vector": [0, 6.11, 16.11] + }, + "lerp_mode": "catmullrom" + }, + "2.5": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "2.625": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "2.75": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "left_leg": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [-35, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.25": { + "post": { + "vector": [-29.28825, -19.9034, -31.25201] + }, + "lerp_mode": "catmullrom" + }, + "1.875": { + "post": { + "vector": [-29.28825, -19.9034, -31.25201] + }, + "lerp_mode": "catmullrom" + }, + "2.5": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "2.625": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "2.75": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + }, + "position": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [1, 24, 11] + }, + "lerp_mode": "catmullrom" + }, + "1.1667": { + "post": { + "vector": [1, 23, 11] + }, + "lerp_mode": "catmullrom" + }, + "1.875": { + "post": { + "vector": [1, 21, 11] + }, + "lerp_mode": "catmullrom" + }, + "2.5": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "2.625": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "2.75": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "back": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [-10, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "3.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "panda": { + "position": { + "0.0": { + "vector": [0, 0, 0] + }, + "2.5": { + "vector": [0, 0, 0] + }, + "2.625": { + "vector": [0, -3, 0] + }, + "2.75": { + "vector": [0, 0, 0] + } + } + } + } + }, + "quirk_3": { + "animation_length": 4, + "bones": { + "right_ear": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "2.0": { + "post": { + "vector": [0, 0, -12.5] + }, + "lerp_mode": "catmullrom" + }, + "2.2917": { + "post": { + "vector": [55, 0, -12.38251] + }, + "lerp_mode": "catmullrom" + }, + "2.75": { + "post": { + "vector": [-24.72222, 0, -8.70491] + }, + "lerp_mode": "catmullrom" + }, + "3.125": { + "post": { + "vector": [28.29653, 0, -6.18874] + }, + "lerp_mode": "catmullrom" + }, + "4.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "left_ear": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "2.0": { + "post": { + "vector": [0, 0, 12.5] + }, + "lerp_mode": "catmullrom" + }, + "2.2917": { + "post": { + "vector": [55, 0, 12.38251] + }, + "lerp_mode": "catmullrom" + }, + "2.75": { + "post": { + "vector": [-24.72222, 0, 8.70491] + }, + "lerp_mode": "catmullrom" + }, + "3.125": { + "post": { + "vector": [18.29653, 0, 6.18874] + }, + "lerp_mode": "catmullrom" + }, + "4.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "jaw": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.4583": { + "post": { + "vector": [70, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.625": { + "post": { + "vector": [7.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.7917": { + "post": { + "vector": [70, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.9583": { + "post": { + "vector": [7.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "2.125": { + "post": { + "vector": [70, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "2.2917": { + "post": { + "vector": [7.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "4.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "head": { + "rotation": { + "0.0": { + "post": { + "vector": [30, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [33.6659, -3.12234, 4.68136] + }, + "lerp_mode": "catmullrom" + }, + "1.625": { + "post": { + "vector": [49.00148, -1.52623, 2.29092] + }, + "lerp_mode": "catmullrom" + }, + "2.0": { + "post": { + "vector": [37.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "2.2083": { + "post": { + "vector": [54.16098, 0.30871, -0.4661] + }, + "lerp_mode": "catmullrom" + }, + "2.4583": { + "post": { + "vector": [54.16098, 0.30871, -0.4661] + }, + "lerp_mode": "catmullrom" + }, + "2.6667": { + "post": { + "vector": [1.15437, 1.89129, -2.86005] + }, + "lerp_mode": "catmullrom" + }, + "3.0417": { + "post": { + "vector": [33.41527, 2.75839, -4.1719] + }, + "lerp_mode": "catmullrom" + }, + "4.0": { + "post": { + "vector": [30, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "right_leg": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [-57.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [-57.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.4583": { + "post": { + "vector": [-41.9978, -43.69869, -37.50059] + }, + "lerp_mode": "catmullrom" + }, + "4.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + }, + "position": { + "0.0": { + "post": { + "vector": [0, 7, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.4583": { + "post": { + "vector": [-14, 10, -4] + }, + "lerp_mode": "catmullrom" + }, + "1.9167": { + "post": { + "vector": [-11.55, 5.86, -3.81] + }, + "lerp_mode": "catmullrom" + }, + "2.4583": { + "post": { + "vector": [-7.97, 7.38, -2.85] + }, + "lerp_mode": "catmullrom" + }, + "2.8333": { + "post": { + "vector": [-7.97, 7.38, -2.85] + }, + "lerp_mode": "catmullrom" + }, + "4.0": { + "post": { + "vector": [0, 7, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "torso": { + "rotation": { + "0.0": { + "post": { + "vector": [-17.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.9583": { + "post": { + "vector": [-17.48436, 0.75155, 2.38443] + }, + "lerp_mode": "catmullrom" + }, + "1.25": { + "post": { + "vector": [-11.54439, 0.89972, 2.85453] + }, + "lerp_mode": "catmullrom" + }, + "1.4167": { + "post": { + "vector": [-17.183, 0.76913, 2.4402] + }, + "lerp_mode": "catmullrom" + }, + "1.7917": { + "post": { + "vector": [-12.62965, 0.30631, 0.97183] + }, + "lerp_mode": "catmullrom" + }, + "2.0": { + "post": { + "vector": [-17.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "2.2917": { + "post": { + "vector": [-7.85386, -0.32245, -1.02305] + }, + "lerp_mode": "catmullrom" + }, + "2.6667": { + "post": { + "vector": [-29.59683, -0.77679, -2.46453] + }, + "lerp_mode": "catmullrom" + }, + "2.8333": { + "post": { + "vector": [-17.48246, -0.84288, -2.67423] + }, + "lerp_mode": "catmullrom" + }, + "2.9583": { + "post": { + "vector": [-14.46631, -0.78707, -2.49717] + }, + "lerp_mode": "catmullrom" + }, + "3.125": { + "post": { + "vector": [-17.48246, -0.84288, -2.67423] + }, + "lerp_mode": "catmullrom" + }, + "3.4583": { + "post": { + "vector": [-10.10109, -0.79418, -2.51972] + }, + "lerp_mode": "catmullrom" + }, + "4.0": { + "post": { + "vector": [-17.5, 0, 0] + }, + "lerp_mode": "catmullrom" + } + }, + "position": { + "0.0": { + "post": { + "vector": [0, 4, 3] + }, + "lerp_mode": "catmullrom" + }, + "4.0": { + "post": { + "vector": [0, 4, 3] + }, + "lerp_mode": "catmullrom" + } + } + }, + "left_leg": { + "position": { + "0.0": { + "post": { + "vector": [0, 7, 0] + }, + "lerp_mode": "catmullrom" + }, + "4.0": { + "post": { + "vector": [0, 7, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "right_back_leg": { + "rotation": { + "0.0": { + "post": { + "vector": [-90, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "4.0": { + "post": { + "vector": [-90, 0, 0] + }, + "lerp_mode": "catmullrom" + } + }, + "position": { + "0.0": { + "post": { + "vector": [0, -4, 3] + }, + "lerp_mode": "catmullrom" + }, + "4.0": { + "post": { + "vector": [0, -4, 3] + }, + "lerp_mode": "catmullrom" + } + } + }, + "left_back_leg": { + "rotation": { + "0.0": { + "post": { + "vector": [-90, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "4.0": { + "post": { + "vector": [-90, 0, 0] + }, + "lerp_mode": "catmullrom" + } + }, + "position": { + "0.0": { + "post": { + "vector": [0, -4, 3] + }, + "lerp_mode": "catmullrom" + }, + "4.0": { + "post": { + "vector": [0, -4, 3] + }, + "lerp_mode": "catmullrom" + } + } + }, + "back": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "4.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "panda": { + "position": { + "0.0": { + "post": { + "vector": [0, -8, 0] + }, + "lerp_mode": "catmullrom" + }, + "4.0": { + "post": { + "vector": [0, -8, 0] + }, + "lerp_mode": "catmullrom" + } + } + } + } + } + } +} \ No newline at end of file diff --git a/common/src/main/resources/assets/antarchy/animations/elka_baby.animation.json b/common/src/main/resources/assets/antarchy/animations/elka_baby.animation.json new file mode 100644 index 00000000..e97b0151 --- /dev/null +++ b/common/src/main/resources/assets/antarchy/animations/elka_baby.animation.json @@ -0,0 +1,1091 @@ +{ + "format_version": "1.8.0", + "animations": { + "idle": { + "loop": true, + "animation_length": 2, + "bones": { + "head": { + "rotation": { + "0.0": { + "post": { + "vector": [-0.28, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [10, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.5": { + "post": { + "vector": [-8.75, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "2.0": { + "post": { + "vector": [-0.28, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "jaw": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.875": { + "post": { + "vector": [12.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "2.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "torso": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "2.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + } + } + }, + "walk": { + "loop": true, + "animation_length": 0.5, + "bones": { + "head": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 8.75] + }, + "lerp_mode": "catmullrom" + }, + "0.125": { + "post": { + "vector": [2.5, 0, -4.45] + }, + "lerp_mode": "catmullrom" + }, + "0.2083": { + "post": { + "vector": [0, 0, -10] + }, + "lerp_mode": "catmullrom" + }, + "0.375": { + "post": { + "vector": [2.5, 0, 3.96] + }, + "lerp_mode": "catmullrom" + }, + "0.4583": { + "vector": [0, 0, 10] + }, + "0.5": { + "vector": [0, 0, 8.75] + } + } + }, + "right_ear": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, -22.5] + }, + "lerp_mode": "catmullrom" + }, + "0.125": { + "post": { + "vector": [0, 0, -30] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "post": { + "vector": [0, 0, -22.5] + }, + "lerp_mode": "catmullrom" + }, + "0.375": { + "post": { + "vector": [0, 0, -30] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [0, 0, -22.5] + }, + "lerp_mode": "catmullrom" + } + } + }, + "left_ear": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 22.5] + }, + "lerp_mode": "catmullrom" + }, + "0.125": { + "post": { + "vector": [0, 0, 30] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "post": { + "vector": [0, 0, 22.5] + }, + "lerp_mode": "catmullrom" + }, + "0.375": { + "post": { + "vector": [0, 0, 30] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [0, 0, 22.5] + }, + "lerp_mode": "catmullrom" + } + } + }, + "torso": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, -5] + }, + "lerp_mode": "catmullrom" + }, + "0.0833": { + "post": { + "vector": [-1.5, 0, -2.4074] + }, + "lerp_mode": "catmullrom" + }, + "0.1667": { + "post": { + "vector": [1.5, 0, 2.08] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "post": { + "vector": [0, 0, 5] + }, + "lerp_mode": "catmullrom" + }, + "0.3333": { + "post": { + "vector": [-1.5, 0, 2.4074] + }, + "lerp_mode": "catmullrom" + }, + "0.4167": { + "post": { + "vector": [1.5, 0, -2.08] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [0, 0, -5] + }, + "lerp_mode": "catmullrom" + } + } + }, + "body": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.125": { + "post": { + "vector": [0, 0, 5] + }, + "lerp_mode": "catmullrom" + }, + "0.375": { + "post": { + "vector": [0, 0, -5] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + }, + "position": { + "0.0": { + "post": { + "vector": [0, 1.25, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.0417": { + "post": { + "vector": [0, 0.25, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.0833": { + "vector": [0, -0.42, 0] + }, + "0.125": { + "vector": [0, -0.5, 0] + }, + "0.1667": { + "pre": { + "vector": [0, 0.58, 0] + }, + "post": { + "vector": [0, 0.58, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.2083": { + "post": { + "vector": [0, 1, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "post": { + "vector": [0, 1.25, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.2917": { + "post": { + "vector": [0, 0.25, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.3333": { + "vector": [0, -0.42, 0] + }, + "0.375": { + "vector": [0, -0.5, 0] + }, + "0.4167": { + "pre": { + "vector": [0, 0.58, 0] + }, + "post": { + "vector": [0, 0.58, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.4583": { + "post": { + "vector": [0, 1, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [0, 1.25, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "right_leg": { + "rotation": { + "0.0": { + "post": { + "vector": [32.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.125": { + "post": { + "vector": [-15, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "vector": [-30, 0, 0] + }, + "0.375": { + "pre": { + "vector": [22.5, 0, 0] + }, + "post": { + "vector": [22.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [32.5, 0, 0] + }, + "lerp_mode": "catmullrom" + } + }, + "position": { + "0.0": { + "post": { + "vector": [0, 0, 3] + }, + "lerp_mode": "catmullrom" + }, + "0.1667": { + "post": { + "vector": [0.25, 1, -0.25] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "vector": [0.5, 1, -1] + }, + "0.3333": { + "vector": [0, 0, 1.11] + }, + "0.4167": { + "pre": { + "vector": [0, 0, 2] + }, + "post": { + "vector": [0, 0, 2] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [0, 0, 3] + }, + "lerp_mode": "catmullrom" + } + } + }, + "left_leg": { + "rotation": { + "0.0": { + "vector": [-30, 0, 0] + }, + "0.125": { + "pre": { + "vector": [22.5, 0, 0] + }, + "post": { + "vector": [22.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "post": { + "vector": [32.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.375": { + "post": { + "vector": [-15, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "vector": [-30, 0, 0] + } + }, + "position": { + "0.0": { + "vector": [-0.5, 1, -1] + }, + "0.0833": { + "vector": [0, 0, 1.11] + }, + "0.1667": { + "pre": { + "vector": [0, 0, 2] + }, + "post": { + "vector": [0, 0, 2] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "post": { + "vector": [0, 0, 3] + }, + "lerp_mode": "catmullrom" + }, + "0.4167": { + "post": { + "vector": [-0.25, 1, -0.25] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "vector": [-0.5, 1, -1] + } + } + }, + "back_right_leg": { + "rotation": { + "0.0": { + "post": { + "vector": [35, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.0417": { + "post": { + "vector": [32.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.1667": { + "post": { + "vector": [-15, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "vector": [-31.2, 0, 0] + }, + "0.2917": { + "vector": [-30, 0, 0] + }, + "0.4167": { + "pre": { + "vector": [22.5, 0, 0] + }, + "post": { + "vector": [22.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [35, 0, 0] + }, + "lerp_mode": "catmullrom" + } + }, + "position": { + "0.0": { + "post": { + "vector": [0, -0.06, 2.76] + }, + "lerp_mode": "catmullrom" + }, + "0.0417": { + "post": { + "vector": [0, 0, 3] + }, + "lerp_mode": "catmullrom" + }, + "0.1667": { + "post": { + "vector": [0.25, 0.79, 0.47] + }, + "lerp_mode": "catmullrom" + }, + "0.2083": { + "post": { + "vector": [0.25, 1, -0.25] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "vector": [0.25, 1.13, -0.96] + }, + "0.2917": { + "vector": [0.25, 1, -1] + }, + "0.375": { + "vector": [0, 0, 1.11] + }, + "0.4583": { + "pre": { + "vector": [0, 0, 2] + }, + "post": { + "vector": [0, 0, 2] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [0, -0.06, 2.76] + }, + "lerp_mode": "catmullrom" + } + } + }, + "back_left_leg": { + "rotation": { + "0.0": { + "vector": [-31.2, 0, 0] + }, + "0.0417": { + "vector": [-30, 0, 0] + }, + "0.1667": { + "pre": { + "vector": [22.5, 0, 0] + }, + "post": { + "vector": [22.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "post": { + "vector": [35, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.2917": { + "post": { + "vector": [32.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.4167": { + "post": { + "vector": [-15, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "vector": [-31.2, 0, 0] + } + }, + "position": { + "0.0": { + "vector": [-0.25, 1.13, -0.96] + }, + "0.0417": { + "vector": [-0.25, 1, -1] + }, + "0.125": { + "vector": [0, 0, 1.11] + }, + "0.2083": { + "pre": { + "vector": [0, 0, 2] + }, + "post": { + "vector": [0, 0, 2] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "post": { + "vector": [0, -0.06, 2.76] + }, + "lerp_mode": "catmullrom" + }, + "0.2917": { + "post": { + "vector": [0, 0, 3] + }, + "lerp_mode": "catmullrom" + }, + "0.4167": { + "post": { + "vector": [-0.25, 0.79, 0.47] + }, + "lerp_mode": "catmullrom" + }, + "0.4583": { + "post": { + "vector": [-0.25, 1, -0.25] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "vector": [-0.25, 1.13, -0.96] + } + } + } + } + }, + "quirk": { + "animation_length": 0.8333, + "bones": { + "head": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.1667": { + "post": { + "vector": [10, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "post": { + "vector": [-2.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.375": { + "post": { + "vector": [-6.8, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.4583": { + "post": { + "vector": [-2.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.5417": { + "post": { + "vector": [10, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.7083": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.8333": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "torso": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.125": { + "pre": { + "vector": [-2.5, 0, 0] + }, + "post": { + "vector": [-2.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.2083": { + "post": { + "vector": [2.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.375": { + "post": { + "vector": [0.45, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [-2.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.5833": { + "post": { + "vector": [2.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.7083": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.8333": { + "vector": [0, 0, 0] + } + } + }, + "body": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.0833": { + "post": { + "vector": [-5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.2083": { + "post": { + "vector": [5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.3333": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.4583": { + "post": { + "vector": [-5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.5833": { + "post": { + "vector": [5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.7083": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.8333": { + "vector": [0, 0, 0] + } + }, + "position": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.0833": { + "pre": { + "vector": [0, 2, 0] + }, + "post": { + "vector": [0, 2, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.1667": { + "post": { + "vector": [0, 2.5, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "post": { + "vector": [0, 1.5, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.3333": { + "vector": [0, 0, 0] + }, + "0.4167": { + "pre": { + "vector": [0, 2, 0] + }, + "post": { + "vector": [0, 2, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [0, 2.5, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.5833": { + "post": { + "vector": [0, 1.5, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.6667": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [0, -0.36, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.8333": { + "vector": [0, 0, 0] + } + } + }, + "right_leg": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.0833": { + "pre": { + "vector": [22.5, 0, 0] + }, + "post": { + "vector": [22.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "post": { + "vector": [-45, 7.5, 15] + }, + "lerp_mode": "catmullrom" + }, + "0.3333": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.4167": { + "post": { + "vector": [22.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.5833": { + "post": { + "vector": [-45, 7.5, 15] + }, + "lerp_mode": "catmullrom" + }, + "0.6667": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "vector": [0, 0, 0] + }, + "0.8333": { + "pre": { + "vector": [0, 0, 0] + }, + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "left_leg": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.0833": { + "pre": { + "vector": [22.5, 0, 0] + }, + "post": { + "vector": [22.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "post": { + "vector": [-45, -7.5, -15] + }, + "lerp_mode": "catmullrom" + }, + "0.3333": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.4167": { + "post": { + "vector": [22.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.5833": { + "post": { + "vector": [-45, -7.5, -15] + }, + "lerp_mode": "catmullrom" + }, + "0.6667": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "vector": [0, 0, 0] + }, + "0.8333": { + "pre": { + "vector": [0, 0, 0] + }, + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "back_right_leg": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.0417": { + "pre": { + "vector": [22.5, 0, 0] + }, + "post": { + "vector": [22.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "post": { + "vector": [-27.5, 7.5, 17.5] + }, + "lerp_mode": "catmullrom" + }, + "0.375": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.4167": { + "post": { + "vector": [22.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.625": { + "post": { + "vector": [-27.5, 7.5, 17.5] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.8333": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "back_left_leg": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.0417": { + "pre": { + "vector": [22.5, 0, 0] + }, + "post": { + "vector": [22.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "post": { + "vector": [-27.5, -7.5, -17.5] + }, + "lerp_mode": "catmullrom" + }, + "0.375": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.4167": { + "post": { + "vector": [22.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.625": { + "post": { + "vector": [-27.5, -7.5, -17.5] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.8333": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + } + } + } + } +} \ No newline at end of file diff --git a/common/src/main/resources/assets/antarchy/animations/kraken.animation.json b/common/src/main/resources/assets/antarchy/animations/kraken.animation.json index 95d60f28..f60646db 100644 --- a/common/src/main/resources/assets/antarchy/animations/kraken.animation.json +++ b/common/src/main/resources/assets/antarchy/animations/kraken.animation.json @@ -4,12 +4,87 @@ "idle": { "loop": true, "animation_length": 4, - "sound_effects": { - "0.0": { - "effect": "antarchy:kraken_flying_loop|0.45|1.0" - } - }, "bones": { + "body": { + "rotation": { + "0.0": { + "post": { + "vector": [1.3, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.875": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "2.875": { + "post": { + "vector": [5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "4.0": { + "post": { + "vector": [1.3, 0, 0] + }, + "lerp_mode": "catmullrom" + } + }, + "position": { + "0.0": { + "post": { + "vector": [0, 218.48, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.625": { + "post": { + "vector": [0, 214, 0] + }, + "lerp_mode": "catmullrom" + }, + "2.625": { + "post": { + "vector": [0, 254, 0] + }, + "lerp_mode": "catmullrom" + }, + "4.0": { + "post": { + "vector": [0, 218.48, 0] + }, + "lerp_mode": "catmullrom" + } + }, + "scale": { + "0.0": { + "post": { + "vector": [1, 1, 1] + }, + "lerp_mode": "catmullrom" + }, + "2.0": { + "post": { + "vector": [1, 1.1, 1] + }, + "lerp_mode": "catmullrom" + }, + "3.0": { + "post": { + "vector": [1, 1.1, 1] + }, + "lerp_mode": "catmullrom" + }, + "4.0": { + "post": { + "vector": [1, 1, 1] + }, + "lerp_mode": "catmullrom" + } + } + }, "l_shoulder": { "rotation": { "0.0": { @@ -902,19 +977,19 @@ "rotation": { "0.0": { "post": { - "vector": [-85, -10, -90] + "vector": [-17.5, -10, 0] }, "lerp_mode": "catmullrom" }, "2.0": { "post": { - "vector": [-90, -15, -90] + "vector": [-5, -15, 0] }, "lerp_mode": "catmullrom" }, "4.0": { "post": { - "vector": [-85, -10, -90] + "vector": [-17.5, -10, 0] }, "lerp_mode": "catmullrom" } @@ -1226,19 +1301,19 @@ "rotation": { "0.0": { "post": { - "vector": [90, 37.5, -90] + "vector": [17.5, -10, 0] }, "lerp_mode": "catmullrom" }, - "2.5": { + "2.0": { "post": { - "vector": [89.99992, 1.25, -89.99992] + "vector": [5, 15, 0] }, "lerp_mode": "catmullrom" }, "4.0": { "post": { - "vector": [90, 37.5, -90] + "vector": [17.5, -10, 0] }, "lerp_mode": "catmullrom" } @@ -1377,8 +1452,13 @@ "lerp_mode": "catmullrom" } } - }, - "Kraken": { + } + } + }, + "death": { + "animation_length": 3, + "bones": { + "body": { "rotation": { "0.0": { "post": { @@ -1386,19 +1466,31 @@ }, "lerp_mode": "catmullrom" }, - "0.875": { + "0.25": { "post": { - "vector": [0, 0, 0] + "vector": [1.28919, 0.1664, -7.35346] }, "lerp_mode": "catmullrom" }, - "2.875": { + "0.6667": { "post": { - "vector": [5, 0, 0] + "vector": [1.2985, -0.05997, 2.64399] }, "lerp_mode": "catmullrom" }, - "4.0": { + "1.1667": { + "post": { + "vector": [1.28919, 0.1664, -7.35346] + }, + "lerp_mode": "catmullrom" + }, + "1.5417": { + "post": { + "vector": [1.2985, -0.05997, 2.64399] + }, + "lerp_mode": "catmullrom" + }, + "2.0": { "post": { "vector": [1.3, 0, 0] }, @@ -1412,21 +1504,39 @@ }, "lerp_mode": "catmullrom" }, - "0.625": { + "0.5": { "post": { - "vector": [0, 214, 0] + "vector": [0, 179.48, 0] }, "lerp_mode": "catmullrom" }, - "2.625": { + "1.0": { "post": { - "vector": [0, 254, 0] + "vector": [0, 120.48, 0] }, "lerp_mode": "catmullrom" }, - "4.0": { + "1.5": { "post": { - "vector": [0, 218.48, 0] + "vector": [0, 41.48, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.7917": { + "post": { + "vector": [0, -19.52, 0] + }, + "lerp_mode": "catmullrom" + }, + "2.0": { + "post": { + "vector": [0, -36.52, 0] + }, + "lerp_mode": "catmullrom" + }, + "2.5": { + "post": { + "vector": [0, -19.52, 0] }, "lerp_mode": "catmullrom" } @@ -1438,31 +1548,68 @@ }, "lerp_mode": "catmullrom" }, + "0.25": { + "post": { + "vector": [1, 0.9, 1] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [1, 1, 1] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [1, 0.9, 1] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [1, 1, 1] + }, + "lerp_mode": "catmullrom" + }, + "1.25": { + "post": { + "vector": [1, 0.9, 1] + }, + "lerp_mode": "catmullrom" + }, + "1.5": { + "post": { + "vector": [1, 1, 1] + }, + "lerp_mode": "catmullrom" + }, + "1.6667": { + "post": { + "vector": [1, 0.9, 1] + }, + "lerp_mode": "catmullrom" + }, + "1.7917": { + "post": { + "vector": [1, 0.9, 1] + }, + "lerp_mode": "catmullrom" + }, "2.0": { "post": { - "vector": [1, 1.1, 1] + "vector": [1, 0.7, 1] }, "lerp_mode": "catmullrom" }, - "3.0": { - "post": { - "vector": [1, 1.1, 1] - }, - "lerp_mode": "catmullrom" - }, - "4.0": { + "2.5": { "post": { "vector": [1, 1, 1] }, "lerp_mode": "catmullrom" } } - } - } - }, - "death": { - "animation_length": 3, - "bones": { + }, "right_eye": { "scale": { "0.0": { @@ -2633,13 +2780,13 @@ "rotation": { "0.0": { "post": { - "vector": [-85, -10, -90] + "vector": [0, -10, 0] }, "lerp_mode": "catmullrom" }, "0.5": { "post": { - "vector": [-88.86743, -49.96822, -94.19588] + "vector": [0, -49.96822, 0] }, "lerp_mode": "catmullrom" } @@ -2963,25 +3110,25 @@ "rotation": { "0.0": { "post": { - "vector": [90, 37.5, -90] + "vector": [0, 37.5, 0] }, "lerp_mode": "catmullrom" }, "0.5": { "post": { - "vector": [90, 42.5, -90] + "vector": [0, 42.5, 0] }, "lerp_mode": "catmullrom" }, "2.0": { "post": { - "vector": [90, 50, -90] + "vector": [0, 50, 0] }, "lerp_mode": "catmullrom" }, "3.0": { "post": { - "vector": [90, 50, -90] + "vector": [0, 50, 0] }, "lerp_mode": "catmullrom" } @@ -3132,158 +3279,6 @@ "lerp_mode": "catmullrom" } } - }, - "Kraken": { - "rotation": { - "0.0": { - "post": { - "vector": [1.3, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "0.25": { - "post": { - "vector": [1.28919, 0.1664, -7.35346] - }, - "lerp_mode": "catmullrom" - }, - "0.6667": { - "post": { - "vector": [1.2985, -0.05997, 2.64399] - }, - "lerp_mode": "catmullrom" - }, - "1.1667": { - "post": { - "vector": [1.28919, 0.1664, -7.35346] - }, - "lerp_mode": "catmullrom" - }, - "1.5417": { - "post": { - "vector": [1.2985, -0.05997, 2.64399] - }, - "lerp_mode": "catmullrom" - }, - "2.0": { - "post": { - "vector": [1.3, 0, 0] - }, - "lerp_mode": "catmullrom" - } - }, - "position": { - "0.0": { - "post": { - "vector": [0, 218.48, 0] - }, - "lerp_mode": "catmullrom" - }, - "0.5": { - "post": { - "vector": [0, 179.48, 0] - }, - "lerp_mode": "catmullrom" - }, - "1.0": { - "post": { - "vector": [0, 120.48, 0] - }, - "lerp_mode": "catmullrom" - }, - "1.5": { - "post": { - "vector": [0, 41.48, 0] - }, - "lerp_mode": "catmullrom" - }, - "1.7917": { - "post": { - "vector": [0, -19.52, 0] - }, - "lerp_mode": "catmullrom" - }, - "2.0": { - "post": { - "vector": [0, -36.52, 0] - }, - "lerp_mode": "catmullrom" - }, - "2.5": { - "post": { - "vector": [0, -19.52, 0] - }, - "lerp_mode": "catmullrom" - } - }, - "scale": { - "0.0": { - "post": { - "vector": [1, 1, 1] - }, - "lerp_mode": "catmullrom" - }, - "0.25": { - "post": { - "vector": [1, 0.9, 1] - }, - "lerp_mode": "catmullrom" - }, - "0.5": { - "post": { - "vector": [1, 1, 1] - }, - "lerp_mode": "catmullrom" - }, - "0.75": { - "post": { - "vector": [1, 0.9, 1] - }, - "lerp_mode": "catmullrom" - }, - "1.0": { - "post": { - "vector": [1, 1, 1] - }, - "lerp_mode": "catmullrom" - }, - "1.25": { - "post": { - "vector": [1, 0.9, 1] - }, - "lerp_mode": "catmullrom" - }, - "1.5": { - "post": { - "vector": [1, 1, 1] - }, - "lerp_mode": "catmullrom" - }, - "1.6667": { - "post": { - "vector": [1, 0.9, 1] - }, - "lerp_mode": "catmullrom" - }, - "1.7917": { - "post": { - "vector": [1, 0.9, 1] - }, - "lerp_mode": "catmullrom" - }, - "2.0": { - "post": { - "vector": [1, 0.7, 1] - }, - "lerp_mode": "catmullrom" - }, - "2.5": { - "post": { - "vector": [1, 1, 1] - }, - "lerp_mode": "catmullrom" - } - } } } }, @@ -3782,7 +3777,7 @@ }, "0.875": { "post": { - "vector": [-38.70323, -17.28727, -18.81969] + "vector": [-38.7, -17.29, -18.82] }, "lerp_mode": "catmullrom" }, @@ -4284,6 +4279,2159 @@ } } }, + "attack": { + "animation_length": 2, + "bones": { + "jaw": { + "rotation": { + "0.6667": { + "vector": [0, 0, 0] + }, + "0.9167": { + "pre": { + "vector": [40, 0, 0] + }, + "post": { + "vector": [40, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.0417": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.25": { + "vector": [0, 0, 0] + } + } + }, + "body": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.2917": { + "pre": { + "vector": [-18.33, 0, 0] + }, + "post": { + "vector": [-18.33, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.7083": { + "post": { + "vector": [-23.92, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [-77.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.375": { + "post": { + "vector": [-49.13, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.7083": { + "post": { + "vector": [-3.22, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "2.0": { + "vector": [0, 0, 0] + } + }, + "position": { + "0.0": { + "vector": [0, 279, 0] + }, + "0.0833": { + "pre": { + "vector": [0, 290, 15] + }, + "post": { + "vector": [0, 290, 15] + }, + "lerp_mode": "catmullrom" + }, + "0.375": { + "post": { + "vector": [0, 330.19, 27.44] + }, + "lerp_mode": "catmullrom" + }, + "0.6667": { + "post": { + "vector": [0, 302, 101] + }, + "lerp_mode": "catmullrom" + }, + "0.9167": { + "post": { + "vector": [0, 173, 91] + }, + "lerp_mode": "catmullrom" + }, + "1.0417": { + "post": { + "vector": [0, 144, -61] + }, + "lerp_mode": "catmullrom" + }, + "1.2083": { + "post": { + "vector": [0, 134, -100] + }, + "lerp_mode": "catmullrom" + }, + "1.4583": { + "post": { + "vector": [0, 220.31, -39.81] + }, + "lerp_mode": "catmullrom" + }, + "1.625": { + "post": { + "vector": [0, 262.74, -9.25] + }, + "lerp_mode": "catmullrom" + }, + "1.75": { + "post": { + "vector": [0, 269, 6] + }, + "lerp_mode": "catmullrom" + }, + "2.0": { + "vector": [0, 279, 0] + } + }, + "scale": { + "0.0": { + "vector": [1, 1, 1] + }, + "0.25": { + "pre": { + "vector": [0.9, 1.2, 0.9] + }, + "post": { + "vector": [0.9, 1.2, 0.9] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "vector": [1, 1, 1] + }, + "0.7917": { + "vector": [1, 1, 1] + }, + "0.9583": { + "pre": { + "vector": [1.2, 0.6, 1.2] + }, + "post": { + "vector": [1.2, 0.6, 1.2] + }, + "lerp_mode": "catmullrom" + }, + "1.125": { + "post": { + "vector": [1, 1, 1] + }, + "lerp_mode": "catmullrom" + }, + "1.25": { + "post": { + "vector": [1, 1, 1] + }, + "lerp_mode": "catmullrom" + } + } + }, + "l_shoulder": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.1667": { + "pre": { + "vector": [0, 0, 0] + }, + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.5417": { + "post": { + "vector": [0, 0, -8.75] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [0, 0, -51.27] + }, + "lerp_mode": "catmullrom" + }, + "0.9167": { + "post": { + "vector": [0, 0, -57.5] + }, + "lerp_mode": "catmullrom" + }, + "1.0833": { + "post": { + "vector": [0, 0, 5] + }, + "lerp_mode": "catmullrom" + }, + "1.2083": { + "post": { + "vector": [0, 0, 15] + }, + "lerp_mode": "catmullrom" + }, + "1.4583": { + "post": { + "vector": [0, 0, 3.31] + }, + "lerp_mode": "catmullrom" + }, + "1.75": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "2.0": { + "vector": [0, 0, 0] + } + } + }, + "l_arm": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.2083": { + "pre": { + "vector": [0, 0, 0] + }, + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.5833": { + "post": { + "vector": [0, 0, -10.53] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [0, 0, -60] + }, + "lerp_mode": "catmullrom" + }, + "1.1667": { + "post": { + "vector": [0, 0, -10] + }, + "lerp_mode": "catmullrom" + }, + "1.4167": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "2.0": { + "vector": [0, 0, 0] + } + } + }, + "l_arm2": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.2917": { + "vector": [0, 0, 0] + }, + "0.625": { + "pre": { + "vector": [0, 0, 15] + }, + "post": { + "vector": [0, 0, 15] + }, + "lerp_mode": "catmullrom" + }, + "0.9583": { + "post": { + "vector": [0, 0, -42.5] + }, + "lerp_mode": "catmullrom" + }, + "1.125": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.2083": { + "post": { + "vector": [0, 0, -11.94] + }, + "lerp_mode": "catmullrom" + }, + "1.3333": { + "post": { + "vector": [0, 0, -10] + }, + "lerp_mode": "catmullrom" + }, + "1.625": { + "vector": [0, 0, 0] + } + } + }, + "l_arm3": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.375": { + "pre": { + "vector": [0, 0, 0] + }, + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [0, 0, 27.5] + }, + "lerp_mode": "catmullrom" + }, + "1.0417": { + "post": { + "vector": [0, 0, -52.5] + }, + "lerp_mode": "catmullrom" + }, + "1.2083": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.5417": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "l_arm4": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.4583": { + "pre": { + "vector": [0, 0, 0] + }, + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [0, 0, 35] + }, + "lerp_mode": "catmullrom" + }, + "1.0417": { + "post": { + "vector": [0, 0, -50] + }, + "lerp_mode": "catmullrom" + }, + "1.2083": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.625": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "l_hand2": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.2083": { + "post": { + "vector": [0, 0, 7.5] + }, + "lerp_mode": "catmullrom" + }, + "0.4167": { + "post": { + "vector": [0, 0, -17.5] + }, + "lerp_mode": "catmullrom" + }, + "0.5417": { + "post": { + "vector": [0, 0, -39.75] + }, + "lerp_mode": "catmullrom" + }, + "0.6667": { + "post": { + "vector": [0, 0, 30] + }, + "lerp_mode": "catmullrom" + }, + "0.8333": { + "post": { + "vector": [0, 0, 20.95] + }, + "lerp_mode": "catmullrom" + }, + "1.0417": { + "post": { + "vector": [0, 0, -45] + }, + "lerp_mode": "catmullrom" + }, + "1.125": { + "post": { + "vector": [0, 0, -57.5] + }, + "lerp_mode": "catmullrom" + }, + "1.25": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.3333": { + "post": { + "vector": [0, 0, -8.24] + }, + "lerp_mode": "catmullrom" + }, + "1.5": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "r_shoulder": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.1667": { + "pre": { + "vector": [0, 0, 0] + }, + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.5417": { + "post": { + "vector": [0, 0, 8.75] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [0, 0, 51.27] + }, + "lerp_mode": "catmullrom" + }, + "0.9167": { + "post": { + "vector": [0, 0, 57.5] + }, + "lerp_mode": "catmullrom" + }, + "1.0833": { + "post": { + "vector": [0, 0, -5] + }, + "lerp_mode": "catmullrom" + }, + "1.2083": { + "post": { + "vector": [0, 0, -15] + }, + "lerp_mode": "catmullrom" + }, + "1.4583": { + "post": { + "vector": [0, 0, -3.31] + }, + "lerp_mode": "catmullrom" + }, + "1.75": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "2.0": { + "vector": [0, 0, 0] + } + } + }, + "r_arm": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.2083": { + "pre": { + "vector": [0, 0, 0] + }, + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.5833": { + "post": { + "vector": [0, 0, 10.53] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [0, 0, 60] + }, + "lerp_mode": "catmullrom" + }, + "1.1667": { + "post": { + "vector": [0, 0, 10] + }, + "lerp_mode": "catmullrom" + }, + "1.4167": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "2.0": { + "vector": [0, 0, 0] + } + } + }, + "r_arm2": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.2917": { + "vector": [0, 0, 0] + }, + "0.625": { + "pre": { + "vector": [0, 0, -15] + }, + "post": { + "vector": [0, 0, -15] + }, + "lerp_mode": "catmullrom" + }, + "0.9583": { + "post": { + "vector": [0, 0, 42.5] + }, + "lerp_mode": "catmullrom" + }, + "1.125": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.2083": { + "post": { + "vector": [0, 0, 11.94] + }, + "lerp_mode": "catmullrom" + }, + "1.3333": { + "post": { + "vector": [0, 0, 10] + }, + "lerp_mode": "catmullrom" + }, + "1.625": { + "vector": [0, 0, 0] + } + } + }, + "r_arm3": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.375": { + "pre": { + "vector": [0, 0, 0] + }, + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [0, 0, -27.5] + }, + "lerp_mode": "catmullrom" + }, + "1.0417": { + "post": { + "vector": [0, 0, 52.5] + }, + "lerp_mode": "catmullrom" + }, + "1.2083": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.5417": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "r_arm4": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.4583": { + "pre": { + "vector": [0, 0, 0] + }, + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [0, 0, -35] + }, + "lerp_mode": "catmullrom" + }, + "1.0417": { + "post": { + "vector": [0, 0, 50] + }, + "lerp_mode": "catmullrom" + }, + "1.2083": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.625": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "r_hand2": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.2083": { + "post": { + "vector": [0, 0, -7.5] + }, + "lerp_mode": "catmullrom" + }, + "0.4167": { + "post": { + "vector": [0, 0, 17.5] + }, + "lerp_mode": "catmullrom" + }, + "0.5417": { + "post": { + "vector": [0, 0, 39.75] + }, + "lerp_mode": "catmullrom" + }, + "0.6667": { + "post": { + "vector": [0, 0, -30] + }, + "lerp_mode": "catmullrom" + }, + "0.8333": { + "post": { + "vector": [0, 0, -20.95] + }, + "lerp_mode": "catmullrom" + }, + "1.0417": { + "post": { + "vector": [0, 0, 45] + }, + "lerp_mode": "catmullrom" + }, + "1.125": { + "post": { + "vector": [0, 0, 57.5] + }, + "lerp_mode": "catmullrom" + }, + "1.25": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.5": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "r_tentacule": { + "rotation": { + "0.0": { + "vector": [0, 45, 0] + }, + "0.1667": { + "pre": { + "vector": [0, 45, 0] + }, + "post": { + "vector": [0, 45, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.5417": { + "post": { + "vector": [-8.75, 45, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [-51.27, 45, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.9167": { + "post": { + "vector": [-57.5, 45, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.0833": { + "post": { + "vector": [5, 45, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.2083": { + "post": { + "vector": [15, 45, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.4583": { + "post": { + "vector": [3.31, 45, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.75": { + "post": { + "vector": [0, 45, 0] + }, + "lerp_mode": "catmullrom" + }, + "2.0": { + "vector": [0, 45, 0] + } + } + }, + "r_tentacule2": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.2083": { + "pre": { + "vector": [0, 0, 0] + }, + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.5833": { + "post": { + "vector": [-10.53, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [-60, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.1667": { + "post": { + "vector": [-10, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.4167": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "2.0": { + "vector": [0, 0, 0] + } + } + }, + "r_tentacule3": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.2917": { + "vector": [0, 0, 0] + }, + "0.625": { + "pre": { + "vector": [15, 0, 0] + }, + "post": { + "vector": [15, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.9583": { + "post": { + "vector": [-42.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.125": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.2083": { + "post": { + "vector": [-11.94, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.3333": { + "post": { + "vector": [-10, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.625": { + "vector": [0, 0, 0] + } + } + }, + "r_tentacule4": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.375": { + "pre": { + "vector": [0, 0, 0] + }, + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [27.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.0417": { + "post": { + "vector": [-52.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.2083": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.5417": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "r_tentacule5": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.4583": { + "pre": { + "vector": [0, 0, 0] + }, + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [35, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.0417": { + "post": { + "vector": [-50, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.2083": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.625": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "l_back_tentacule": { + "rotation": { + "0.0": { + "vector": [0, 45, 0] + }, + "0.1667": { + "pre": { + "vector": [0, 45, 0] + }, + "post": { + "vector": [0, 45, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.5417": { + "post": { + "vector": [8.75, 45, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [51.27, 45, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.9167": { + "post": { + "vector": [57.5, 45, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.0833": { + "post": { + "vector": [-5, 45, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.2083": { + "post": { + "vector": [-15, 45, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.4583": { + "post": { + "vector": [-3.31, 45, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.75": { + "post": { + "vector": [0, 45, 0] + }, + "lerp_mode": "catmullrom" + }, + "2.0": { + "vector": [0, 45, 0] + } + } + }, + "l_back_tentacule2": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.2083": { + "pre": { + "vector": [0, 0, 0] + }, + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.5833": { + "post": { + "vector": [10.53, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [60, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.1667": { + "post": { + "vector": [10, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.4167": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "2.0": { + "vector": [0, 0, 0] + } + } + }, + "l_back_tentacule3": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.2917": { + "vector": [0, 0, 0] + }, + "0.625": { + "pre": { + "vector": [-15, 0, 0] + }, + "post": { + "vector": [-15, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.9583": { + "post": { + "vector": [42.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.125": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.2083": { + "post": { + "vector": [11.94, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.3333": { + "post": { + "vector": [10, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.625": { + "vector": [0, 0, 0] + } + } + }, + "l_back_tentacule4": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.375": { + "pre": { + "vector": [0, 0, 0] + }, + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [-27.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.0417": { + "post": { + "vector": [52.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.2083": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.5417": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "l_back_tentacule5": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.4583": { + "pre": { + "vector": [0, 0, 0] + }, + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [-35, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.0417": { + "post": { + "vector": [50, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.2083": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.625": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "r_back_tentacule": { + "rotation": { + "0.0": { + "vector": [0, -45, 0] + }, + "0.1667": { + "pre": { + "vector": [0, -45, 0] + }, + "post": { + "vector": [0, -45, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.5417": { + "post": { + "vector": [8.75, -45, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [51.27, -45, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.9167": { + "post": { + "vector": [57.5, -45, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.0833": { + "post": { + "vector": [-5, -45, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.2083": { + "post": { + "vector": [-15, -45, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.4583": { + "post": { + "vector": [-3.31, -45, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.75": { + "post": { + "vector": [0, -45, 0] + }, + "lerp_mode": "catmullrom" + }, + "2.0": { + "vector": [0, -45, 0] + } + } + }, + "r_back_tentacule2": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.2083": { + "pre": { + "vector": [0, 0, 0] + }, + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.5833": { + "post": { + "vector": [10.53, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [60, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.1667": { + "post": { + "vector": [10, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.4167": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "2.0": { + "vector": [0, 0, 0] + } + } + }, + "r_back_tentacule3": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.2917": { + "vector": [0, 0, 0] + }, + "0.625": { + "pre": { + "vector": [-15, 0, 0] + }, + "post": { + "vector": [-15, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.9583": { + "post": { + "vector": [42.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.125": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.2083": { + "post": { + "vector": [11.94, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.3333": { + "post": { + "vector": [10, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.625": { + "vector": [0, 0, 0] + } + } + }, + "r_back_tentacule4": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.375": { + "pre": { + "vector": [0, 0, 0] + }, + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [-27.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.0417": { + "post": { + "vector": [52.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.2083": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.5417": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "r_back_tentacule5": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.4583": { + "pre": { + "vector": [0, 0, 0] + }, + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [-35, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.0417": { + "post": { + "vector": [50, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.2083": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.625": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "center_tentacule": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.1667": { + "pre": { + "vector": [0, 0, 0] + }, + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.5417": { + "post": { + "vector": [-8.75, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [-51.27, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.9167": { + "post": { + "vector": [-57.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.0833": { + "post": { + "vector": [5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.2083": { + "post": { + "vector": [15, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.4583": { + "post": { + "vector": [3.31, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.75": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "2.0": { + "vector": [0, 0, 0] + } + } + }, + "center_tentacule2": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.2083": { + "pre": { + "vector": [0, 0, 0] + }, + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.5833": { + "post": { + "vector": [-10.53, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [-60, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.1667": { + "post": { + "vector": [-10, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.4167": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "2.0": { + "vector": [0, 0, 0] + } + } + }, + "center_tentacule3": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.2917": { + "vector": [0, 0, 0] + }, + "0.625": { + "pre": { + "vector": [15, 0, 0] + }, + "post": { + "vector": [15, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.9583": { + "post": { + "vector": [-42.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.125": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.2083": { + "post": { + "vector": [-11.94, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.3333": { + "post": { + "vector": [-10, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.625": { + "vector": [0, 0, 0] + } + } + }, + "center_tentacule4": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.375": { + "pre": { + "vector": [0, 0, 0] + }, + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [27.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.0417": { + "post": { + "vector": [-52.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.2083": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.5417": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "center_tentacule5": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.4583": { + "pre": { + "vector": [0, 0, 0] + }, + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [35, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.0417": { + "post": { + "vector": [-50, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.2083": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.625": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "l_tentacule": { + "rotation": { + "0.0": { + "vector": [0, -45, 0] + }, + "0.1667": { + "pre": { + "vector": [0, -45, 0] + }, + "post": { + "vector": [0, -45, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.5417": { + "post": { + "vector": [-8.75, -45, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [-51.27, -45, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.9167": { + "post": { + "vector": [-57.5, -45, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.0833": { + "post": { + "vector": [5, -45, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.2083": { + "post": { + "vector": [15, -45, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.4583": { + "post": { + "vector": [3.31, -45, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.75": { + "post": { + "vector": [0, -45, 0] + }, + "lerp_mode": "catmullrom" + }, + "2.0": { + "vector": [0, -45, 0] + } + } + }, + "l_tentacule2": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.2083": { + "pre": { + "vector": [0, 0, 0] + }, + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.5833": { + "post": { + "vector": [-10.53, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [-60, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.1667": { + "post": { + "vector": [-10, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.4167": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "2.0": { + "vector": [0, 0, 0] + } + } + }, + "l_tentacule3": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.2917": { + "vector": [0, 0, 0] + }, + "0.625": { + "pre": { + "vector": [15, 0, 0] + }, + "post": { + "vector": [15, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.9583": { + "post": { + "vector": [-42.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.125": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.2083": { + "post": { + "vector": [-11.94, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.3333": { + "post": { + "vector": [-10, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.625": { + "vector": [0, 0, 0] + } + } + }, + "l_tentacule4": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.375": { + "pre": { + "vector": [0, 0, 0] + }, + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [27.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.0417": { + "post": { + "vector": [-52.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.2083": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.5417": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "l_tentacule5": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.4583": { + "pre": { + "vector": [0, 0, 0] + }, + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [35, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.0417": { + "post": { + "vector": [-50, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.2083": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.625": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "center_tentacule_back": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.1667": { + "pre": { + "vector": [0, 0, 0] + }, + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.5417": { + "post": { + "vector": [8.75, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [51.27, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.9167": { + "post": { + "vector": [57.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.0833": { + "post": { + "vector": [-5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.2083": { + "post": { + "vector": [-15, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.4583": { + "post": { + "vector": [-3.31, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.75": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "2.0": { + "vector": [0, 0, 0] + } + } + }, + "center_tentacule_back2": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.2083": { + "pre": { + "vector": [0, 0, 0] + }, + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.5833": { + "post": { + "vector": [10.53, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [60, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.1667": { + "post": { + "vector": [10, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.4167": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "2.0": { + "vector": [0, 0, 0] + } + } + }, + "center_tentacule_back3": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.2917": { + "vector": [0, 0, 0] + }, + "0.625": { + "pre": { + "vector": [-15, 0, 0] + }, + "post": { + "vector": [-15, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.9583": { + "post": { + "vector": [42.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.125": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.2083": { + "post": { + "vector": [11.94, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.3333": { + "post": { + "vector": [10, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.625": { + "vector": [0, 0, 0] + } + } + }, + "center_tentacule_back4": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.375": { + "pre": { + "vector": [0, 0, 0] + }, + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [-27.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.0417": { + "post": { + "vector": [52.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.2083": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.5417": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "center_tentacule_back5": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.4583": { + "pre": { + "vector": [0, 0, 0] + }, + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [-35, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.0417": { + "post": { + "vector": [50, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.2083": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.625": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + } + } + }, "cry": { "animation_length": 3, "bones": { @@ -4343,6 +6491,120 @@ } } }, + "body": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "post": { + "vector": [7.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.4583": { + "post": { + "vector": [4.93, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.6667": { + "post": { + "vector": [-22.82, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.7917": { + "post": { + "vector": [-27.83, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.4167": { + "post": { + "vector": [-27.83, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.9167": { + "post": { + "vector": [-22.65, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "2.2083": { + "post": { + "vector": [-16.23, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "2.5833": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "3.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + }, + "position": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.4583": { + "vector": [0, 0, 0] + }, + "0.5": { + "vector": [0, 27, 0] + }, + "0.5417": { + "vector": [0, -33, 0] + }, + "0.5833": { + "vector": [0, 14, 0] + }, + "0.6667": { + "vector": [0, -19, 0] + }, + "0.75": { + "pre": { + "vector": [0, 5, 0] + }, + "post": { + "vector": [0, 5, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.875": { + "post": { + "vector": [0, -10, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.1667": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, "l_shoulder": { "rotation": { "0.0": { @@ -4505,6 +6767,12 @@ }, "lerp_mode": "catmullrom" }, + "2.3333": { + "post": { + "vector": [0, 0, -6.67] + }, + "lerp_mode": "catmullrom" + }, "3.0": { "post": { "vector": [0, 0, 0] @@ -4539,6 +6807,12 @@ }, "lerp_mode": "catmullrom" }, + "2.4167": { + "post": { + "vector": [0, 0, -35.38] + }, + "lerp_mode": "catmullrom" + }, "3.0": { "post": { "vector": [0, 0, 0] @@ -4573,6 +6847,12 @@ }, "lerp_mode": "catmullrom" }, + "2.5417": { + "post": { + "vector": [0, 0, -39.58] + }, + "lerp_mode": "catmullrom" + }, "3.0": { "post": { "vector": [0, 0, 0] @@ -4777,6 +7057,12 @@ }, "lerp_mode": "catmullrom" }, + "2.3333": { + "post": { + "vector": [0, 0, 6.67] + }, + "lerp_mode": "catmullrom" + }, "3.0": { "post": { "vector": [0, 0, 0] @@ -4811,6 +7097,12 @@ }, "lerp_mode": "catmullrom" }, + "2.4167": { + "post": { + "vector": [0, 0, 35.38] + }, + "lerp_mode": "catmullrom" + }, "3.0": { "post": { "vector": [0, 0, 0] @@ -4845,6 +7137,12 @@ }, "lerp_mode": "catmullrom" }, + "2.5417": { + "post": { + "vector": [0, 0, 39.58] + }, + "lerp_mode": "catmullrom" + }, "3.0": { "post": { "vector": [0, 0, 0] @@ -4886,660 +7184,6 @@ "lerp_mode": "catmullrom" } } - }, - "Kraken": { - "rotation": { - "0.0": { - "post": { - "vector": [0, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "0.25": { - "post": { - "vector": [5, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "0.5": { - "post": { - "vector": [5, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "1.7083": { - "post": { - "vector": [-10, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "2.5": { - "post": { - "vector": [-10, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "3.0": { - "post": { - "vector": [0, 0, 0] - }, - "lerp_mode": "catmullrom" - } - }, - "position": { - "0.0": { - "post": { - "vector": [0, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "0.5": { - "post": { - "vector": [0, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "0.5417": { - "post": { - "vector": [3, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "0.5833": { - "post": { - "vector": [0, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "0.625": { - "post": { - "vector": [3, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "0.6667": { - "post": { - "vector": [0, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "0.7083": { - "post": { - "vector": [3, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "0.75": { - "post": { - "vector": [0, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "0.7917": { - "post": { - "vector": [3, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "0.8333": { - "post": { - "vector": [0, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "0.875": { - "post": { - "vector": [3, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "0.9167": { - "post": { - "vector": [0, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "0.9583": { - "post": { - "vector": [3, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "1.0": { - "post": { - "vector": [0, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "1.0417": { - "post": { - "vector": [3, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "1.0833": { - "post": { - "vector": [0, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "1.125": { - "post": { - "vector": [3, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "1.1667": { - "post": { - "vector": [0, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "1.2083": { - "post": { - "vector": [3, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "1.25": { - "post": { - "vector": [0, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "1.2917": { - "post": { - "vector": [3, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "1.3333": { - "post": { - "vector": [0, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "1.375": { - "post": { - "vector": [3, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "1.4167": { - "post": { - "vector": [0, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "1.4583": { - "post": { - "vector": [3, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "1.5": { - "post": { - "vector": [0, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "1.5417": { - "post": { - "vector": [3, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "1.5833": { - "post": { - "vector": [0, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "1.625": { - "post": { - "vector": [3, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "1.6667": { - "post": { - "vector": [0, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "1.7083": { - "post": { - "vector": [3, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "1.75": { - "post": { - "vector": [0, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "1.7917": { - "post": { - "vector": [3, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "1.8333": { - "post": { - "vector": [0, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "1.875": { - "post": { - "vector": [3, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "1.9167": { - "post": { - "vector": [0, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "1.9583": { - "post": { - "vector": [3, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "2.0": { - "post": { - "vector": [0, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "2.0417": { - "post": { - "vector": [3, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "2.0833": { - "post": { - "vector": [0, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "2.125": { - "post": { - "vector": [3, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "2.1667": { - "post": { - "vector": [0, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "2.2083": { - "post": { - "vector": [3, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "2.25": { - "post": { - "vector": [0, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "2.2917": { - "post": { - "vector": [3, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "2.3333": { - "post": { - "vector": [0, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "2.375": { - "post": { - "vector": [3, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "2.4167": { - "post": { - "vector": [0, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "2.4583": { - "post": { - "vector": [3, 0, 0] - }, - "lerp_mode": "catmullrom" - }, - "2.5": { - "post": { - "vector": [0, 0, 0] - }, - "lerp_mode": "catmullrom" - } - }, - "scale": { - "0.0": { - "post": { - "vector": [1, 1, 1] - }, - "lerp_mode": "catmullrom" - }, - "0.5": { - "post": { - "vector": [1, 1, 1] - }, - "lerp_mode": "catmullrom" - }, - "0.5417": { - "post": { - "vector": [1.1, 1.1, 1] - }, - "lerp_mode": "catmullrom" - }, - "0.5833": { - "post": { - "vector": [1, 1, 1] - }, - "lerp_mode": "catmullrom" - }, - "0.625": { - "post": { - "vector": [1.1, 1.1, 1] - }, - "lerp_mode": "catmullrom" - }, - "0.6667": { - "post": { - "vector": [1, 1, 1] - }, - "lerp_mode": "catmullrom" - }, - "0.7083": { - "post": { - "vector": [1.1, 1.1, 1] - }, - "lerp_mode": "catmullrom" - }, - "0.75": { - "post": { - "vector": [1, 1, 1] - }, - "lerp_mode": "catmullrom" - }, - "0.7917": { - "post": { - "vector": [1.1, 1.1, 1] - }, - "lerp_mode": "catmullrom" - }, - "0.8333": { - "post": { - "vector": [1, 1, 1] - }, - "lerp_mode": "catmullrom" - }, - "0.875": { - "post": { - "vector": [1.1, 1.1, 1] - }, - "lerp_mode": "catmullrom" - }, - "0.9167": { - "post": { - "vector": [1, 1, 1] - }, - "lerp_mode": "catmullrom" - }, - "0.9583": { - "post": { - "vector": [1.1, 1.1, 1] - }, - "lerp_mode": "catmullrom" - }, - "1.0": { - "post": { - "vector": [1, 1, 1] - }, - "lerp_mode": "catmullrom" - }, - "1.0417": { - "post": { - "vector": [1.1, 1.1, 1] - }, - "lerp_mode": "catmullrom" - }, - "1.0833": { - "post": { - "vector": [1, 1, 1] - }, - "lerp_mode": "catmullrom" - }, - "1.125": { - "post": { - "vector": [1.1, 1.1, 1] - }, - "lerp_mode": "catmullrom" - }, - "1.1667": { - "post": { - "vector": [1, 1, 1] - }, - "lerp_mode": "catmullrom" - }, - "1.2083": { - "post": { - "vector": [1.1, 1.1, 1] - }, - "lerp_mode": "catmullrom" - }, - "1.25": { - "post": { - "vector": [1, 1, 1] - }, - "lerp_mode": "catmullrom" - }, - "1.2917": { - "post": { - "vector": [1.1, 1.1, 1] - }, - "lerp_mode": "catmullrom" - }, - "1.3333": { - "post": { - "vector": [1, 1, 1] - }, - "lerp_mode": "catmullrom" - }, - "1.375": { - "post": { - "vector": [1.1, 1.1, 1] - }, - "lerp_mode": "catmullrom" - }, - "1.4167": { - "post": { - "vector": [1, 1, 1] - }, - "lerp_mode": "catmullrom" - }, - "1.4583": { - "post": { - "vector": [1.1, 1.1, 1] - }, - "lerp_mode": "catmullrom" - }, - "1.5": { - "post": { - "vector": [1, 1, 1] - }, - "lerp_mode": "catmullrom" - }, - "1.5417": { - "post": { - "vector": [1.1, 1.1, 1] - }, - "lerp_mode": "catmullrom" - }, - "1.5833": { - "post": { - "vector": [1, 1, 1] - }, - "lerp_mode": "catmullrom" - }, - "1.625": { - "post": { - "vector": [1.1, 1.1, 1] - }, - "lerp_mode": "catmullrom" - }, - "1.6667": { - "post": { - "vector": [1, 1, 1] - }, - "lerp_mode": "catmullrom" - }, - "1.7083": { - "post": { - "vector": [1.1, 1.1, 1] - }, - "lerp_mode": "catmullrom" - }, - "1.75": { - "post": { - "vector": [1, 1, 1] - }, - "lerp_mode": "catmullrom" - }, - "1.7917": { - "post": { - "vector": [1.1, 1.1, 1] - }, - "lerp_mode": "catmullrom" - }, - "1.8333": { - "post": { - "vector": [1, 1, 1] - }, - "lerp_mode": "catmullrom" - }, - "1.875": { - "post": { - "vector": [1.1, 1.1, 1] - }, - "lerp_mode": "catmullrom" - }, - "1.9167": { - "post": { - "vector": [1, 1, 1] - }, - "lerp_mode": "catmullrom" - }, - "1.9583": { - "post": { - "vector": [1.1, 1.1, 1] - }, - "lerp_mode": "catmullrom" - }, - "2.0": { - "post": { - "vector": [1, 1, 1] - }, - "lerp_mode": "catmullrom" - }, - "2.0417": { - "post": { - "vector": [1.1, 1.1, 1] - }, - "lerp_mode": "catmullrom" - }, - "2.0833": { - "post": { - "vector": [1, 1, 1] - }, - "lerp_mode": "catmullrom" - }, - "2.125": { - "post": { - "vector": [1.1, 1.1, 1] - }, - "lerp_mode": "catmullrom" - }, - "2.1667": { - "post": { - "vector": [1, 1, 1] - }, - "lerp_mode": "catmullrom" - }, - "2.2083": { - "post": { - "vector": [1.1, 1.1, 1] - }, - "lerp_mode": "catmullrom" - }, - "2.25": { - "post": { - "vector": [1, 1, 1] - }, - "lerp_mode": "catmullrom" - }, - "2.2917": { - "post": { - "vector": [1.1, 1.1, 1] - }, - "lerp_mode": "catmullrom" - }, - "2.3333": { - "post": { - "vector": [1, 1, 1] - }, - "lerp_mode": "catmullrom" - }, - "2.375": { - "post": { - "vector": [1.1, 1.1, 1] - }, - "lerp_mode": "catmullrom" - }, - "2.4167": { - "post": { - "vector": [1, 1, 1] - }, - "lerp_mode": "catmullrom" - }, - "3.0": { - "post": { - "vector": [1, 1, 1] - }, - "lerp_mode": "catmullrom" - } - } - }, - "Kraken": { - "position": { - "0.0": { - "post": { - "vector": [0, 218.48, 0] - }, - "lerp_mode": "catmullrom" - }, - "3.0": { - "post": { - "vector": [0, 218.48, 0] - }, - "lerp_mode": "catmullrom" - } - } } } } diff --git a/common/src/main/resources/assets/antarchy/animations/glimmer_baby.animation.json b/common/src/main/resources/assets/antarchy/animations/ouranwood_deer.animation.json similarity index 65% rename from common/src/main/resources/assets/antarchy/animations/glimmer_baby.animation.json rename to common/src/main/resources/assets/antarchy/animations/ouranwood_deer.animation.json index 9084e98c..786efc3d 100644 --- a/common/src/main/resources/assets/antarchy/animations/glimmer_baby.animation.json +++ b/common/src/main/resources/assets/antarchy/animations/ouranwood_deer.animation.json @@ -1664,6 +1664,911 @@ } } } + }, + "charge_start": { + "animation_length": 0.375, + "bones": { + "head": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.0417": { + "pre": { + "vector": [25, 0, 0] + }, + "post": { + "vector": [25, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.2083": { + "post": { + "vector": [65, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.375": { + "post": { + "vector": [-13, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "neck": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.125": { + "pre": { + "vector": [-10, 0, 0] + }, + "post": { + "vector": [-10, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.2083": { + "post": { + "vector": [32.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.2917": { + "post": { + "vector": [62.66, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.375": { + "post": { + "vector": [72.5, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "torso": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.125": { + "vector": [0, 0, 0] + }, + "0.375": { + "pre": { + "vector": [10, 0, 0] + }, + "post": { + "vector": [10, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "right_leg": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.1667": { + "post": { + "vector": [50.62, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.2917": { + "post": { + "vector": [-3.51, 0, 17.5] + }, + "lerp_mode": "catmullrom" + }, + "0.375": { + "post": { + "vector": [-15.98, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "left_leg": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.1667": { + "pre": { + "vector": [37.5, 0, 0] + }, + "post": { + "vector": [37.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.2917": { + "post": { + "vector": [-37.5, 0, -12.5] + }, + "lerp_mode": "catmullrom" + }, + "0.375": { + "post": { + "vector": [-15.19, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "back_right_leg": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.0833": { + "pre": { + "vector": [47.5, 0, 10] + }, + "post": { + "vector": [47.5, 0, 10] + }, + "lerp_mode": "catmullrom" + }, + "0.1667": { + "post": { + "vector": [50, 0, 10] + }, + "lerp_mode": "catmullrom" + }, + "0.2917": { + "post": { + "vector": [71.42, 0, 3.76] + }, + "lerp_mode": "catmullrom" + }, + "0.375": { + "post": { + "vector": [-17.5, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "back_left_leg": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.0833": { + "pre": { + "vector": [30, -7.5, -12.5] + }, + "post": { + "vector": [30, -7.5, -12.5] + }, + "lerp_mode": "catmullrom" + }, + "0.1667": { + "post": { + "vector": [37.5, -10, -17.5] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "post": { + "vector": [76.44, 0, -6.24] + }, + "lerp_mode": "catmullrom" + }, + "0.375": { + "vector": [0, 0, 0] + } + } + }, + "body": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.0833": { + "pre": { + "vector": [-35, 0, 0] + }, + "post": { + "vector": [-35, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.2083": { + "post": { + "vector": [-40, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.2917": { + "post": { + "vector": [-12.81, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.375": { + "vector": [0, 0, 0] + } + }, + "position": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.0417": { + "vector": [0, 2, 2] + }, + "0.0833": { + "pre": { + "vector": [0, 3, 4] + }, + "post": { + "vector": [0, 3, 4] + }, + "lerp_mode": "catmullrom" + }, + "0.1667": { + "post": { + "vector": [0, 4.04, 5.93] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "post": { + "vector": [0, 4, -5] + }, + "lerp_mode": "catmullrom" + }, + "0.375": { + "vector": [0, 0, 0] + } + } + } + } + }, + "charge_loop": { + "loop": true, + "animation_length": 0.25, + "bones": { + "head": { + "rotation": { + "0.0": { + "post": { + "vector": [-13, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.0833": { + "post": { + "vector": [-8, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.1875": { + "post": { + "vector": [-15.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "post": { + "vector": [-13, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "neck": { + "rotation": { + "0.0": { + "post": { + "vector": [72.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.0625": { + "post": { + "vector": [62.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.1875": { + "post": { + "vector": [77.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "post": { + "vector": [72.5, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "torso": { + "rotation": { + "vector": [10, 0, 0] + } + }, + "right_leg": { + "rotation": { + "0.0": { + "post": { + "vector": [-15.98, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.0208": { + "post": { + "vector": [-32.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.0625": { + "vector": [-15.19, 0, 0] + }, + "0.0833": { + "vector": [0, 0, 0] + }, + "0.125": { + "vector": [32.5, 0, 0] + }, + "0.1875": { + "pre": { + "vector": [52.5, 0, 0] + }, + "post": { + "vector": [52.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "post": { + "vector": [-15.98, 0, 0] + }, + "lerp_mode": "catmullrom" + } + }, + "position": { + "0.0": { + "post": { + "vector": [0, 2, -3] + }, + "lerp_mode": "catmullrom" + }, + "0.0417": { + "post": { + "vector": [0, 0.5, -1.5] + }, + "lerp_mode": "catmullrom" + }, + "0.0625": { + "vector": [0, 0.19, -0.72] + }, + "0.0833": { + "vector": [0, 0, 0] + }, + "0.1042": { + "vector": [0, -0.5, 1] + }, + "0.125": { + "vector": [0, -2, 2] + }, + "0.1875": { + "pre": { + "vector": [0, 1, 0] + }, + "post": { + "vector": [0, 1, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "post": { + "vector": [0, 2, -3] + }, + "lerp_mode": "catmullrom" + } + } + }, + "left_leg": { + "rotation": { + "0.0": { + "vector": [-15.19, 0, 0] + }, + "0.0208": { + "vector": [0, 0, 0] + }, + "0.0625": { + "vector": [32.5, 0, 0] + }, + "0.125": { + "pre": { + "vector": [52.5, 0, 0] + }, + "post": { + "vector": [52.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.2083": { + "post": { + "vector": [-32.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "vector": [-15.19, 0, 0] + } + }, + "position": { + "0.0": { + "vector": [0, 0.19, -0.72] + }, + "0.0208": { + "vector": [0, 0, 0] + }, + "0.0417": { + "vector": [0, -0.5, 1] + }, + "0.0625": { + "vector": [0, -2, 2] + }, + "0.125": { + "pre": { + "vector": [0, 1, 0] + }, + "post": { + "vector": [0, 1, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.1875": { + "post": { + "vector": [0, 2, -3] + }, + "lerp_mode": "catmullrom" + }, + "0.2292": { + "post": { + "vector": [0, 0.5, -1.5] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "vector": [0, 0.19, -0.72] + } + } + }, + "back_right_leg": { + "rotation": { + "0.0": { + "post": { + "vector": [-17.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.0625": { + "vector": [0, 0, 0] + }, + "0.1042": { + "vector": [40, 0, 0] + }, + "0.1667": { + "pre": { + "vector": [35.83, 0, 0] + }, + "post": { + "vector": [35.83, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "post": { + "vector": [-17.5, 0, 0] + }, + "lerp_mode": "catmullrom" + } + }, + "position": { + "0.0": { + "post": { + "vector": [0, 2.01, -2.12] + }, + "lerp_mode": "catmullrom" + }, + "0.0208": { + "post": { + "vector": [0, 0.69, -1.44] + }, + "lerp_mode": "catmullrom" + }, + "0.0625": { + "vector": [0, 0, 0] + }, + "0.0833": { + "vector": [0, -1, 2] + }, + "0.1042": { + "vector": [0, -0.33, 2.33] + }, + "0.1458": { + "pre": { + "vector": [0, 1, 3] + }, + "post": { + "vector": [0, 1, 3] + }, + "lerp_mode": "catmullrom" + }, + "0.2292": { + "post": { + "vector": [0, 3, -2] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "post": { + "vector": [0, 2.01, -2.12] + }, + "lerp_mode": "catmullrom" + } + } + }, + "back_left_leg": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.0417": { + "vector": [40, 0, 0] + }, + "0.1042": { + "pre": { + "vector": [35.83, 0, 0] + }, + "post": { + "vector": [35.83, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.1875": { + "post": { + "vector": [-17.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "vector": [0, 0, 0] + } + }, + "position": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.0208": { + "vector": [0, -1, 2] + }, + "0.0417": { + "vector": [0, -0.33, 2.33] + }, + "0.0833": { + "pre": { + "vector": [0, 1, 3] + }, + "post": { + "vector": [0, 1, 3] + }, + "lerp_mode": "catmullrom" + }, + "0.1667": { + "post": { + "vector": [0, 3, -2] + }, + "lerp_mode": "catmullrom" + }, + "0.2083": { + "post": { + "vector": [0, 0.69, -1.44] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "vector": [0, 0, 0] + } + } + }, + "body": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.0417": { + "vector": [2.5, 0, 0] + }, + "0.1042": { + "pre": { + "vector": [5, 0, 0] + }, + "post": { + "vector": [5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.1875": { + "post": { + "vector": [-5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "vector": [0, 0, 0] + } + }, + "position": { + "0.0": { + "vector": [0, 0, 2] + }, + "0.0417": { + "vector": [0, -1, 4] + }, + "0.1042": { + "pre": { + "vector": [0, 0.5, 5.25] + }, + "post": { + "vector": [0, 0.5, 5.25] + }, + "lerp_mode": "catmullrom" + }, + "0.1667": { + "post": { + "vector": [0, 2, 3.75] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "vector": [0, 0, 2] + } + } + } + } + }, + "charge_end": { + "loop": "hold_on_last_frame", + "animation_length": 0.5, + "bones": { + "head": { + "rotation": { + "0.0": { + "vector": [-13, 0, 0] + }, + "0.2083": { + "pre": { + "vector": [4.5, 0, 0] + }, + "post": { + "vector": [4.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "neck": { + "rotation": { + "0.0": { + "post": { + "vector": [72.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "post": { + "vector": [80, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "torso": { + "rotation": { + "0.0": { + "vector": [10, 0, 0] + }, + "0.125": { + "pre": { + "vector": [12.5, 0, 0] + }, + "post": { + "vector": [12.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.3333": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.4583": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "right_leg": { + "rotation": { + "0.0": { + "post": { + "vector": [-15.98, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.2917": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + }, + "position": { + "0.0": { + "post": { + "vector": [0, 2, -3] + }, + "lerp_mode": "catmullrom" + }, + "0.125": { + "post": { + "vector": [0, 1.68, -0.77] + }, + "lerp_mode": "catmullrom" + }, + "0.2917": { + "vector": [0, 0, 0] + } + } + }, + "left_leg": { + "rotation": { + "0.0": { + "vector": [-15.19, 0, 0] + }, + "0.2917": { + "pre": { + "vector": [0, 0, 0] + }, + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + }, + "position": { + "0.0": { + "vector": [0, 0.19, -0.72] + }, + "0.125": { + "pre": { + "vector": [0, 1.19, -0.47] + }, + "post": { + "vector": [0, 1.19, -0.47] + }, + "lerp_mode": "catmullrom" + }, + "0.2917": { + "vector": [0, 0, 0] + }, + "0.5": { + "vector": [0, 0, 0] + } + } + }, + "back_right_leg": { + "rotation": { + "0.0": { + "post": { + "vector": [-17.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.125": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.3333": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + }, + "position": { + "0.0": { + "post": { + "vector": [0, 2.01, -2.12] + }, + "lerp_mode": "catmullrom" + }, + "0.0833": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "back_left_leg": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.1667": { + "pre": { + "vector": [0, 0, 0] + }, + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.375": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + }, + "position": { + "vector": [0, 0, 0] + } + } + } } } } \ No newline at end of file diff --git a/common/src/main/resources/assets/antarchy/animations/glimmer.animation.json b/common/src/main/resources/assets/antarchy/animations/ouranwood_deer_baby.animation.json similarity index 100% rename from common/src/main/resources/assets/antarchy/animations/glimmer.animation.json rename to common/src/main/resources/assets/antarchy/animations/ouranwood_deer_baby.animation.json diff --git a/common/src/main/resources/assets/antarchy/blockstates/big_bush.json b/common/src/main/resources/assets/antarchy/blockstates/big_bush.json deleted file mode 100644 index 7ea0c8aa..00000000 --- a/common/src/main/resources/assets/antarchy/blockstates/big_bush.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "variants": { - "age=0,facing=north": { "model": "antarchy:block/big_bush_stage1" }, - "age=0,facing=east": { "model": "antarchy:block/big_bush_stage1" }, - "age=0,facing=south": { "model": "antarchy:block/big_bush_stage1" }, - "age=0,facing=west": { "model": "antarchy:block/big_bush_stage1" }, - "age=1,facing=east": { "model": "antarchy:block/big_bush_stage2" }, - "age=1,facing=south": { "model": "antarchy:block/big_bush_stage2", "y": 90 }, - "age=1,facing=west": { "model": "antarchy:block/big_bush_stage2", "y": 180 }, - "age=1,facing=north": { "model": "antarchy:block/big_bush_stage2", "y": 270 }, - "age=2,facing=north": { "model": "antarchy:block/big_bush_stage3_bottom" }, - "age=2,facing=east": { "model": "antarchy:block/big_bush_stage3_bottom" }, - "age=2,facing=south": { "model": "antarchy:block/big_bush_stage3_bottom" }, - "age=2,facing=west": { "model": "antarchy:block/big_bush_stage3_bottom" } - } -} diff --git a/common/src/main/resources/assets/antarchy/blockstates/big_bush_part.json b/common/src/main/resources/assets/antarchy/blockstates/big_bush_part.json deleted file mode 100644 index ea083469..00000000 --- a/common/src/main/resources/assets/antarchy/blockstates/big_bush_part.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "variants": { - "cap=false": { "model": "antarchy:block/big_bush_part" }, - "cap=true": { "model": "antarchy:block/big_bush_stage3_top" } - } -} diff --git a/common/src/main/resources/assets/antarchy/blockstates/blush_moss_block.json b/common/src/main/resources/assets/antarchy/blockstates/blush_moss_block.json new file mode 100644 index 00000000..fd0dbfdd --- /dev/null +++ b/common/src/main/resources/assets/antarchy/blockstates/blush_moss_block.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "antarchy:block/blush_moss_block" + } + } +} diff --git a/common/src/main/resources/assets/antarchy/blockstates/blush_moss_carpet.json b/common/src/main/resources/assets/antarchy/blockstates/blush_moss_carpet.json new file mode 100644 index 00000000..fa1bd926 --- /dev/null +++ b/common/src/main/resources/assets/antarchy/blockstates/blush_moss_carpet.json @@ -0,0 +1,154 @@ +{ + "multipart": [ + { + "apply": { + "model": "antarchy:block/blush_moss_carpet" + }, + "when": { + "bottom": "true" + } + }, + { + "apply": { + "model": "antarchy:block/blush_moss_carpet" + }, + "when": { + "bottom": "false", + "east": "none", + "north": "none", + "south": "none", + "west": "none" + } + }, + { + "apply": { + "model": "antarchy:block/blush_moss_carpet_side_tall" + }, + "when": { + "north": "tall" + } + }, + { + "apply": { + "model": "antarchy:block/blush_moss_carpet_side_small" + }, + "when": { + "north": "low" + } + }, + { + "apply": { + "model": "antarchy:block/blush_moss_carpet_side_tall" + }, + "when": { + "bottom": "false", + "east": "none", + "north": "none", + "south": "none", + "west": "none" + } + }, + { + "apply": { + "model": "antarchy:block/blush_moss_carpet_side_tall", + "uvlock": true, + "y": 90 + }, + "when": { + "east": "tall" + } + }, + { + "apply": { + "model": "antarchy:block/blush_moss_carpet_side_small", + "uvlock": true, + "y": 90 + }, + "when": { + "east": "low" + } + }, + { + "apply": { + "model": "antarchy:block/blush_moss_carpet_side_tall", + "uvlock": true, + "y": 90 + }, + "when": { + "bottom": "false", + "east": "none", + "north": "none", + "south": "none", + "west": "none" + } + }, + { + "apply": { + "model": "antarchy:block/blush_moss_carpet_side_tall", + "uvlock": true, + "y": 180 + }, + "when": { + "south": "tall" + } + }, + { + "apply": { + "model": "antarchy:block/blush_moss_carpet_side_small", + "uvlock": true, + "y": 180 + }, + "when": { + "south": "low" + } + }, + { + "apply": { + "model": "antarchy:block/blush_moss_carpet_side_tall", + "uvlock": true, + "y": 180 + }, + "when": { + "bottom": "false", + "east": "none", + "north": "none", + "south": "none", + "west": "none" + } + }, + { + "apply": { + "model": "antarchy:block/blush_moss_carpet_side_tall", + "uvlock": true, + "y": 270 + }, + "when": { + "west": "tall" + } + }, + { + "apply": { + "model": "antarchy:block/blush_moss_carpet_side_small", + "uvlock": true, + "y": 270 + }, + "when": { + "west": "low" + } + }, + { + "apply": { + "model": "antarchy:block/blush_moss_carpet_side_tall", + "uvlock": true, + "y": 270 + }, + "when": { + "bottom": "false", + "east": "none", + "north": "none", + "south": "none", + "west": "none" + } + } + ] +} diff --git a/common/src/main/resources/assets/antarchy/blockstates/corn_crop.json b/common/src/main/resources/assets/antarchy/blockstates/corn_crop.json new file mode 100644 index 00000000..ecdc71fe --- /dev/null +++ b/common/src/main/resources/assets/antarchy/blockstates/corn_crop.json @@ -0,0 +1,28 @@ +{ + "variants": { + "age=0,half=lower": { + "model": "antarchy:block/corn_crop_stage_0" + }, + "age=0,half=upper": { + "model": "antarchy:block/corn_crop_stage_0" + }, + "age=1,half=lower": { + "model": "antarchy:block/corn_crop_stage_1" + }, + "age=1,half=upper": { + "model": "antarchy:block/corn_crop_stage_1" + }, + "age=2,half=lower": { + "model": "antarchy:block/corn_crop_stage_2_bottom" + }, + "age=2,half=upper": { + "model": "antarchy:block/corn_crop_stage_2_top" + }, + "age=3,half=lower": { + "model": "antarchy:block/corn_crop_stage_3_bottom" + }, + "age=3,half=upper": { + "model": "antarchy:block/corn_crop_stage_3_top" + } + } +} diff --git a/common/src/main/resources/assets/antarchy/blockstates/hanging_peach.json b/common/src/main/resources/assets/antarchy/blockstates/hanging_peach.json new file mode 100644 index 00000000..48e7f45e --- /dev/null +++ b/common/src/main/resources/assets/antarchy/blockstates/hanging_peach.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "antarchy:block/hanging_peach" + } + } +} diff --git a/common/src/main/resources/assets/antarchy/blockstates/lumen.json b/common/src/main/resources/assets/antarchy/blockstates/lumen.json new file mode 100644 index 00000000..777d6ac3 --- /dev/null +++ b/common/src/main/resources/assets/antarchy/blockstates/lumen.json @@ -0,0 +1,20 @@ +{ + "variants": { + "level=0": { "model": "minecraft:block/water" }, + "level=1": { "model": "minecraft:block/water" }, + "level=2": { "model": "minecraft:block/water" }, + "level=3": { "model": "minecraft:block/water" }, + "level=4": { "model": "minecraft:block/water" }, + "level=5": { "model": "minecraft:block/water" }, + "level=6": { "model": "minecraft:block/water" }, + "level=7": { "model": "minecraft:block/water" }, + "level=8": { "model": "minecraft:block/water" }, + "level=9": { "model": "minecraft:block/water" }, + "level=10": { "model": "minecraft:block/water" }, + "level=11": { "model": "minecraft:block/water" }, + "level=12": { "model": "minecraft:block/water" }, + "level=13": { "model": "minecraft:block/water" }, + "level=14": { "model": "minecraft:block/water" }, + "level=15": { "model": "minecraft:block/water" } + } +} diff --git a/common/src/main/resources/assets/antarchy/blockstates/lumen_froglight.json b/common/src/main/resources/assets/antarchy/blockstates/lumen_froglight.json new file mode 100644 index 00000000..e69294a3 --- /dev/null +++ b/common/src/main/resources/assets/antarchy/blockstates/lumen_froglight.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "antarchy:block/lumen_froglight" + } + } +} diff --git a/common/src/main/resources/assets/antarchy/blockstates/ouranwood_vine.json b/common/src/main/resources/assets/antarchy/blockstates/ouranwood_vine.json deleted file mode 100644 index dace25bd..00000000 --- a/common/src/main/resources/assets/antarchy/blockstates/ouranwood_vine.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "antarchy:block/ouranwood_vine" - } - } -} diff --git a/common/src/main/resources/assets/antarchy/blockstates/ouranwood_vine_plant.json b/common/src/main/resources/assets/antarchy/blockstates/ouranwood_vine_plant.json deleted file mode 100644 index ab51785b..00000000 --- a/common/src/main/resources/assets/antarchy/blockstates/ouranwood_vine_plant.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "antarchy:block/ouranwood_vine_plant" - } - } -} diff --git a/common/src/main/resources/assets/antarchy/blockstates/peach_button.json b/common/src/main/resources/assets/antarchy/blockstates/peach_button.json new file mode 100644 index 00000000..cccef879 --- /dev/null +++ b/common/src/main/resources/assets/antarchy/blockstates/peach_button.json @@ -0,0 +1,119 @@ +{ + "variants": { + "face=ceiling,facing=east,powered=false": { + "model": "antarchy:block/peach_button", + "x": 180, + "y": 270 + }, + "face=ceiling,facing=east,powered=true": { + "model": "antarchy:block/peach_button_pressed", + "x": 180, + "y": 270 + }, + "face=ceiling,facing=north,powered=false": { + "model": "antarchy:block/peach_button", + "x": 180, + "y": 180 + }, + "face=ceiling,facing=north,powered=true": { + "model": "antarchy:block/peach_button_pressed", + "x": 180, + "y": 180 + }, + "face=ceiling,facing=south,powered=false": { + "model": "antarchy:block/peach_button", + "x": 180 + }, + "face=ceiling,facing=south,powered=true": { + "model": "antarchy:block/peach_button_pressed", + "x": 180 + }, + "face=ceiling,facing=west,powered=false": { + "model": "antarchy:block/peach_button", + "x": 180, + "y": 90 + }, + "face=ceiling,facing=west,powered=true": { + "model": "antarchy:block/peach_button_pressed", + "x": 180, + "y": 90 + }, + "face=floor,facing=east,powered=false": { + "model": "antarchy:block/peach_button", + "y": 90 + }, + "face=floor,facing=east,powered=true": { + "model": "antarchy:block/peach_button_pressed", + "y": 90 + }, + "face=floor,facing=north,powered=false": { + "model": "antarchy:block/peach_button" + }, + "face=floor,facing=north,powered=true": { + "model": "antarchy:block/peach_button_pressed" + }, + "face=floor,facing=south,powered=false": { + "model": "antarchy:block/peach_button", + "y": 180 + }, + "face=floor,facing=south,powered=true": { + "model": "antarchy:block/peach_button_pressed", + "y": 180 + }, + "face=floor,facing=west,powered=false": { + "model": "antarchy:block/peach_button", + "y": 270 + }, + "face=floor,facing=west,powered=true": { + "model": "antarchy:block/peach_button_pressed", + "y": 270 + }, + "face=wall,facing=east,powered=false": { + "model": "antarchy:block/peach_button", + "uvlock": true, + "x": 90, + "y": 90 + }, + "face=wall,facing=east,powered=true": { + "model": "antarchy:block/peach_button_pressed", + "uvlock": true, + "x": 90, + "y": 90 + }, + "face=wall,facing=north,powered=false": { + "model": "antarchy:block/peach_button", + "uvlock": true, + "x": 90 + }, + "face=wall,facing=north,powered=true": { + "model": "antarchy:block/peach_button_pressed", + "uvlock": true, + "x": 90 + }, + "face=wall,facing=south,powered=false": { + "model": "antarchy:block/peach_button", + "uvlock": true, + "x": 90, + "y": 180 + }, + "face=wall,facing=south,powered=true": { + "model": "antarchy:block/peach_button_pressed", + "uvlock": true, + "x": 90, + "y": 180 + }, + "face=wall,facing=west,powered=false": { + "model": "antarchy:block/peach_button", + "uvlock": true, + "x": 90, + "y": 270 + }, + "face=wall,facing=west,powered=true": { + "model": "antarchy:block/peach_button_pressed", + "uvlock": true, + "x": 90, + "y": 270 + } + } +} + diff --git a/common/src/main/resources/assets/antarchy/blockstates/peach_door.json b/common/src/main/resources/assets/antarchy/blockstates/peach_door.json new file mode 100644 index 00000000..f2b86d87 --- /dev/null +++ b/common/src/main/resources/assets/antarchy/blockstates/peach_door.json @@ -0,0 +1,125 @@ +{ + "variants": { + "facing=east,half=lower,hinge=left,open=false": { + "model": "antarchy:block/peach_door_bottom_left" + }, + "facing=east,half=lower,hinge=left,open=true": { + "model": "antarchy:block/peach_door_bottom_left_open", + "y": 90 + }, + "facing=east,half=lower,hinge=right,open=false": { + "model": "antarchy:block/peach_door_bottom_right" + }, + "facing=east,half=lower,hinge=right,open=true": { + "model": "antarchy:block/peach_door_bottom_right_open", + "y": 270 + }, + "facing=east,half=upper,hinge=left,open=false": { + "model": "antarchy:block/peach_door_top_left" + }, + "facing=east,half=upper,hinge=left,open=true": { + "model": "antarchy:block/peach_door_top_left_open", + "y": 90 + }, + "facing=east,half=upper,hinge=right,open=false": { + "model": "antarchy:block/peach_door_top_right" + }, + "facing=east,half=upper,hinge=right,open=true": { + "model": "antarchy:block/peach_door_top_right_open", + "y": 270 + }, + "facing=north,half=lower,hinge=left,open=false": { + "model": "antarchy:block/peach_door_bottom_left", + "y": 270 + }, + "facing=north,half=lower,hinge=left,open=true": { + "model": "antarchy:block/peach_door_bottom_left_open" + }, + "facing=north,half=lower,hinge=right,open=false": { + "model": "antarchy:block/peach_door_bottom_right", + "y": 270 + }, + "facing=north,half=lower,hinge=right,open=true": { + "model": "antarchy:block/peach_door_bottom_right_open", + "y": 180 + }, + "facing=north,half=upper,hinge=left,open=false": { + "model": "antarchy:block/peach_door_top_left", + "y": 270 + }, + "facing=north,half=upper,hinge=left,open=true": { + "model": "antarchy:block/peach_door_top_left_open" + }, + "facing=north,half=upper,hinge=right,open=false": { + "model": "antarchy:block/peach_door_top_right", + "y": 270 + }, + "facing=north,half=upper,hinge=right,open=true": { + "model": "antarchy:block/peach_door_top_right_open", + "y": 180 + }, + "facing=south,half=lower,hinge=left,open=false": { + "model": "antarchy:block/peach_door_bottom_left", + "y": 90 + }, + "facing=south,half=lower,hinge=left,open=true": { + "model": "antarchy:block/peach_door_bottom_left_open", + "y": 180 + }, + "facing=south,half=lower,hinge=right,open=false": { + "model": "antarchy:block/peach_door_bottom_right", + "y": 90 + }, + "facing=south,half=lower,hinge=right,open=true": { + "model": "antarchy:block/peach_door_bottom_right_open" + }, + "facing=south,half=upper,hinge=left,open=false": { + "model": "antarchy:block/peach_door_top_left", + "y": 90 + }, + "facing=south,half=upper,hinge=left,open=true": { + "model": "antarchy:block/peach_door_top_left_open", + "y": 180 + }, + "facing=south,half=upper,hinge=right,open=false": { + "model": "antarchy:block/peach_door_top_right", + "y": 90 + }, + "facing=south,half=upper,hinge=right,open=true": { + "model": "antarchy:block/peach_door_top_right_open" + }, + "facing=west,half=lower,hinge=left,open=false": { + "model": "antarchy:block/peach_door_bottom_left", + "y": 180 + }, + "facing=west,half=lower,hinge=left,open=true": { + "model": "antarchy:block/peach_door_bottom_left_open", + "y": 270 + }, + "facing=west,half=lower,hinge=right,open=false": { + "model": "antarchy:block/peach_door_bottom_right", + "y": 180 + }, + "facing=west,half=lower,hinge=right,open=true": { + "model": "antarchy:block/peach_door_bottom_right_open", + "y": 90 + }, + "facing=west,half=upper,hinge=left,open=false": { + "model": "antarchy:block/peach_door_top_left", + "y": 180 + }, + "facing=west,half=upper,hinge=left,open=true": { + "model": "antarchy:block/peach_door_top_left_open", + "y": 270 + }, + "facing=west,half=upper,hinge=right,open=false": { + "model": "antarchy:block/peach_door_top_right", + "y": 180 + }, + "facing=west,half=upper,hinge=right,open=true": { + "model": "antarchy:block/peach_door_top_right_open", + "y": 90 + } + } +} + diff --git a/common/src/main/resources/assets/antarchy/blockstates/peach_fence.json b/common/src/main/resources/assets/antarchy/blockstates/peach_fence.json new file mode 100644 index 00000000..d337b1a2 --- /dev/null +++ b/common/src/main/resources/assets/antarchy/blockstates/peach_fence.json @@ -0,0 +1,49 @@ +{ + "multipart": [ + { + "apply": { + "model": "antarchy:block/peach_fence_post" + } + }, + { + "apply": { + "model": "antarchy:block/peach_fence_side", + "uvlock": true + }, + "when": { + "north": "true" + } + }, + { + "apply": { + "model": "antarchy:block/peach_fence_side", + "uvlock": true, + "y": 90 + }, + "when": { + "east": "true" + } + }, + { + "apply": { + "model": "antarchy:block/peach_fence_side", + "uvlock": true, + "y": 180 + }, + "when": { + "south": "true" + } + }, + { + "apply": { + "model": "antarchy:block/peach_fence_side", + "uvlock": true, + "y": 270 + }, + "when": { + "west": "true" + } + } + ] +} + diff --git a/common/src/main/resources/assets/antarchy/blockstates/peach_fence_gate.json b/common/src/main/resources/assets/antarchy/blockstates/peach_fence_gate.json new file mode 100644 index 00000000..56353c76 --- /dev/null +++ b/common/src/main/resources/assets/antarchy/blockstates/peach_fence_gate.json @@ -0,0 +1,81 @@ +{ + "variants": { + "facing=east,in_wall=false,open=false": { + "model": "antarchy:block/peach_fence_gate", + "uvlock": true, + "y": 270 + }, + "facing=east,in_wall=false,open=true": { + "model": "antarchy:block/peach_fence_gate_open", + "uvlock": true, + "y": 270 + }, + "facing=east,in_wall=true,open=false": { + "model": "antarchy:block/peach_fence_gate_wall", + "uvlock": true, + "y": 270 + }, + "facing=east,in_wall=true,open=true": { + "model": "antarchy:block/peach_fence_gate_wall_open", + "uvlock": true, + "y": 270 + }, + "facing=north,in_wall=false,open=false": { + "model": "antarchy:block/peach_fence_gate", + "uvlock": true, + "y": 180 + }, + "facing=north,in_wall=false,open=true": { + "model": "antarchy:block/peach_fence_gate_open", + "uvlock": true, + "y": 180 + }, + "facing=north,in_wall=true,open=false": { + "model": "antarchy:block/peach_fence_gate_wall", + "uvlock": true, + "y": 180 + }, + "facing=north,in_wall=true,open=true": { + "model": "antarchy:block/peach_fence_gate_wall_open", + "uvlock": true, + "y": 180 + }, + "facing=south,in_wall=false,open=false": { + "model": "antarchy:block/peach_fence_gate", + "uvlock": true + }, + "facing=south,in_wall=false,open=true": { + "model": "antarchy:block/peach_fence_gate_open", + "uvlock": true + }, + "facing=south,in_wall=true,open=false": { + "model": "antarchy:block/peach_fence_gate_wall", + "uvlock": true + }, + "facing=south,in_wall=true,open=true": { + "model": "antarchy:block/peach_fence_gate_wall_open", + "uvlock": true + }, + "facing=west,in_wall=false,open=false": { + "model": "antarchy:block/peach_fence_gate", + "uvlock": true, + "y": 90 + }, + "facing=west,in_wall=false,open=true": { + "model": "antarchy:block/peach_fence_gate_open", + "uvlock": true, + "y": 90 + }, + "facing=west,in_wall=true,open=false": { + "model": "antarchy:block/peach_fence_gate_wall", + "uvlock": true, + "y": 90 + }, + "facing=west,in_wall=true,open=true": { + "model": "antarchy:block/peach_fence_gate_wall_open", + "uvlock": true, + "y": 90 + } + } +} + diff --git a/common/src/main/resources/assets/antarchy/blockstates/peach_hanging_sign.json b/common/src/main/resources/assets/antarchy/blockstates/peach_hanging_sign.json new file mode 100644 index 00000000..55e63aa2 --- /dev/null +++ b/common/src/main/resources/assets/antarchy/blockstates/peach_hanging_sign.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "minecraft:block/jungle_hanging_sign" + } + } +} diff --git a/common/src/main/resources/assets/antarchy/blockstates/peach_leaves.json b/common/src/main/resources/assets/antarchy/blockstates/peach_leaves.json new file mode 100644 index 00000000..e7645105 --- /dev/null +++ b/common/src/main/resources/assets/antarchy/blockstates/peach_leaves.json @@ -0,0 +1,6 @@ +{ + "variants": { + "": { "model": "antarchy:block/peach_leaves" } + } +} + diff --git a/common/src/main/resources/assets/antarchy/blockstates/peach_log.json b/common/src/main/resources/assets/antarchy/blockstates/peach_log.json new file mode 100644 index 00000000..36f25917 --- /dev/null +++ b/common/src/main/resources/assets/antarchy/blockstates/peach_log.json @@ -0,0 +1,17 @@ +{ + "variants": { + "axis=x": { + "model": "antarchy:block/peach_log_horizontal", + "x": 90, + "y": 90 + }, + "axis=y": { + "model": "antarchy:block/peach_log" + }, + "axis=z": { + "model": "antarchy:block/peach_log_horizontal", + "x": 90 + } + } +} + diff --git a/common/src/main/resources/assets/antarchy/blockstates/peach_planks.json b/common/src/main/resources/assets/antarchy/blockstates/peach_planks.json new file mode 100644 index 00000000..0477ebee --- /dev/null +++ b/common/src/main/resources/assets/antarchy/blockstates/peach_planks.json @@ -0,0 +1,8 @@ +{ + "variants": { + "": { + "model": "antarchy:block/peach_planks" + } + } +} + diff --git a/common/src/main/resources/assets/antarchy/blockstates/peach_pressure_plate.json b/common/src/main/resources/assets/antarchy/blockstates/peach_pressure_plate.json new file mode 100644 index 00000000..47b689b7 --- /dev/null +++ b/common/src/main/resources/assets/antarchy/blockstates/peach_pressure_plate.json @@ -0,0 +1,11 @@ +{ + "variants": { + "powered=false": { + "model": "antarchy:block/peach_pressure_plate" + }, + "powered=true": { + "model": "antarchy:block/peach_pressure_plate_down" + } + } +} + diff --git a/common/src/main/resources/assets/antarchy/blockstates/peach_sapling.json b/common/src/main/resources/assets/antarchy/blockstates/peach_sapling.json new file mode 100644 index 00000000..1d4e00c9 --- /dev/null +++ b/common/src/main/resources/assets/antarchy/blockstates/peach_sapling.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "antarchy:block/peach_sapling" + } + } +} diff --git a/common/src/main/resources/assets/antarchy/blockstates/peach_sign.json b/common/src/main/resources/assets/antarchy/blockstates/peach_sign.json new file mode 100644 index 00000000..dae0a1fd --- /dev/null +++ b/common/src/main/resources/assets/antarchy/blockstates/peach_sign.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "minecraft:block/jungle_sign" + } + } +} diff --git a/common/src/main/resources/assets/antarchy/blockstates/peach_slab.json b/common/src/main/resources/assets/antarchy/blockstates/peach_slab.json new file mode 100644 index 00000000..f2d21f55 --- /dev/null +++ b/common/src/main/resources/assets/antarchy/blockstates/peach_slab.json @@ -0,0 +1,14 @@ +{ + "variants": { + "type=bottom": { + "model": "antarchy:block/peach_slab" + }, + "type=double": { + "model": "antarchy:block/peach_planks" + }, + "type=top": { + "model": "antarchy:block/peach_slab_top" + } + } +} + diff --git a/common/src/main/resources/assets/antarchy/blockstates/peach_stairs.json b/common/src/main/resources/assets/antarchy/blockstates/peach_stairs.json new file mode 100644 index 00000000..eb8c244d --- /dev/null +++ b/common/src/main/resources/assets/antarchy/blockstates/peach_stairs.json @@ -0,0 +1,210 @@ +{ + "variants": { + "facing=east,half=bottom,shape=inner_left": { + "model": "antarchy:block/peach_stairs_inner", + "uvlock": true, + "y": 270 + }, + "facing=east,half=bottom,shape=inner_right": { + "model": "antarchy:block/peach_stairs_inner" + }, + "facing=east,half=bottom,shape=outer_left": { + "model": "antarchy:block/peach_stairs_outer", + "uvlock": true, + "y": 270 + }, + "facing=east,half=bottom,shape=outer_right": { + "model": "antarchy:block/peach_stairs_outer" + }, + "facing=east,half=bottom,shape=straight": { + "model": "antarchy:block/peach_stairs" + }, + "facing=east,half=top,shape=inner_left": { + "model": "antarchy:block/peach_stairs_inner", + "uvlock": true, + "x": 180 + }, + "facing=east,half=top,shape=inner_right": { + "model": "antarchy:block/peach_stairs_inner", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=east,half=top,shape=outer_left": { + "model": "antarchy:block/peach_stairs_outer", + "uvlock": true, + "x": 180 + }, + "facing=east,half=top,shape=outer_right": { + "model": "antarchy:block/peach_stairs_outer", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=east,half=top,shape=straight": { + "model": "antarchy:block/peach_stairs", + "uvlock": true, + "x": 180 + }, + "facing=north,half=bottom,shape=inner_left": { + "model": "antarchy:block/peach_stairs_inner", + "uvlock": true, + "y": 180 + }, + "facing=north,half=bottom,shape=inner_right": { + "model": "antarchy:block/peach_stairs_inner", + "uvlock": true, + "y": 270 + }, + "facing=north,half=bottom,shape=outer_left": { + "model": "antarchy:block/peach_stairs_outer", + "uvlock": true, + "y": 180 + }, + "facing=north,half=bottom,shape=outer_right": { + "model": "antarchy:block/peach_stairs_outer", + "uvlock": true, + "y": 270 + }, + "facing=north,half=bottom,shape=straight": { + "model": "antarchy:block/peach_stairs", + "uvlock": true, + "y": 270 + }, + "facing=north,half=top,shape=inner_left": { + "model": "antarchy:block/peach_stairs_inner", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=north,half=top,shape=inner_right": { + "model": "antarchy:block/peach_stairs_inner", + "uvlock": true, + "x": 180 + }, + "facing=north,half=top,shape=outer_left": { + "model": "antarchy:block/peach_stairs_outer", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=north,half=top,shape=outer_right": { + "model": "antarchy:block/peach_stairs_outer", + "uvlock": true, + "x": 180 + }, + "facing=north,half=top,shape=straight": { + "model": "antarchy:block/peach_stairs", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=south,half=bottom,shape=inner_left": { + "model": "antarchy:block/peach_stairs_inner" + }, + "facing=south,half=bottom,shape=inner_right": { + "model": "antarchy:block/peach_stairs_inner", + "uvlock": true, + "y": 90 + }, + "facing=south,half=bottom,shape=outer_left": { + "model": "antarchy:block/peach_stairs_outer" + }, + "facing=south,half=bottom,shape=outer_right": { + "model": "antarchy:block/peach_stairs_outer", + "uvlock": true, + "y": 90 + }, + "facing=south,half=bottom,shape=straight": { + "model": "antarchy:block/peach_stairs", + "uvlock": true, + "y": 90 + }, + "facing=south,half=top,shape=inner_left": { + "model": "antarchy:block/peach_stairs_inner", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=south,half=top,shape=inner_right": { + "model": "antarchy:block/peach_stairs_inner", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=south,half=top,shape=outer_left": { + "model": "antarchy:block/peach_stairs_outer", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=south,half=top,shape=outer_right": { + "model": "antarchy:block/peach_stairs_outer", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=south,half=top,shape=straight": { + "model": "antarchy:block/peach_stairs", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=west,half=bottom,shape=inner_left": { + "model": "antarchy:block/peach_stairs_inner", + "uvlock": true, + "y": 90 + }, + "facing=west,half=bottom,shape=inner_right": { + "model": "antarchy:block/peach_stairs_inner", + "uvlock": true, + "y": 180 + }, + "facing=west,half=bottom,shape=outer_left": { + "model": "antarchy:block/peach_stairs_outer", + "uvlock": true, + "y": 90 + }, + "facing=west,half=bottom,shape=outer_right": { + "model": "antarchy:block/peach_stairs_outer", + "uvlock": true, + "y": 180 + }, + "facing=west,half=bottom,shape=straight": { + "model": "antarchy:block/peach_stairs", + "uvlock": true, + "y": 180 + }, + "facing=west,half=top,shape=inner_left": { + "model": "antarchy:block/peach_stairs_inner", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=west,half=top,shape=inner_right": { + "model": "antarchy:block/peach_stairs_inner", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=west,half=top,shape=outer_left": { + "model": "antarchy:block/peach_stairs_outer", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=west,half=top,shape=outer_right": { + "model": "antarchy:block/peach_stairs_outer", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=west,half=top,shape=straight": { + "model": "antarchy:block/peach_stairs", + "uvlock": true, + "x": 180, + "y": 180 + } + } +} + diff --git a/common/src/main/resources/assets/antarchy/blockstates/peach_trapdoor.json b/common/src/main/resources/assets/antarchy/blockstates/peach_trapdoor.json new file mode 100644 index 00000000..6ef25c2b --- /dev/null +++ b/common/src/main/resources/assets/antarchy/blockstates/peach_trapdoor.json @@ -0,0 +1,70 @@ +{ + "variants": { + "facing=east,half=bottom,open=false": { + "model": "antarchy:block/peach_trapdoor_bottom", + "y": 90 + }, + "facing=east,half=bottom,open=true": { + "model": "antarchy:block/peach_trapdoor_open", + "y": 90 + }, + "facing=east,half=top,open=false": { + "model": "antarchy:block/peach_trapdoor_top", + "y": 90 + }, + "facing=east,half=top,open=true": { + "model": "antarchy:block/peach_trapdoor_open", + "x": 180, + "y": 270 + }, + "facing=north,half=bottom,open=false": { + "model": "antarchy:block/peach_trapdoor_bottom" + }, + "facing=north,half=bottom,open=true": { + "model": "antarchy:block/peach_trapdoor_open" + }, + "facing=north,half=top,open=false": { + "model": "antarchy:block/peach_trapdoor_top" + }, + "facing=north,half=top,open=true": { + "model": "antarchy:block/peach_trapdoor_open", + "x": 180, + "y": 180 + }, + "facing=south,half=bottom,open=false": { + "model": "antarchy:block/peach_trapdoor_bottom", + "y": 180 + }, + "facing=south,half=bottom,open=true": { + "model": "antarchy:block/peach_trapdoor_open", + "y": 180 + }, + "facing=south,half=top,open=false": { + "model": "antarchy:block/peach_trapdoor_top", + "y": 180 + }, + "facing=south,half=top,open=true": { + "model": "antarchy:block/peach_trapdoor_open", + "x": 180, + "y": 0 + }, + "facing=west,half=bottom,open=false": { + "model": "antarchy:block/peach_trapdoor_bottom", + "y": 270 + }, + "facing=west,half=bottom,open=true": { + "model": "antarchy:block/peach_trapdoor_open", + "y": 270 + }, + "facing=west,half=top,open=false": { + "model": "antarchy:block/peach_trapdoor_top", + "y": 270 + }, + "facing=west,half=top,open=true": { + "model": "antarchy:block/peach_trapdoor_open", + "x": 180, + "y": 90 + } + } +} + diff --git a/common/src/main/resources/assets/antarchy/blockstates/peach_wall_hanging_sign.json b/common/src/main/resources/assets/antarchy/blockstates/peach_wall_hanging_sign.json new file mode 100644 index 00000000..55e63aa2 --- /dev/null +++ b/common/src/main/resources/assets/antarchy/blockstates/peach_wall_hanging_sign.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "minecraft:block/jungle_hanging_sign" + } + } +} diff --git a/common/src/main/resources/assets/antarchy/blockstates/peach_wall_sign.json b/common/src/main/resources/assets/antarchy/blockstates/peach_wall_sign.json new file mode 100644 index 00000000..dae0a1fd --- /dev/null +++ b/common/src/main/resources/assets/antarchy/blockstates/peach_wall_sign.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "minecraft:block/jungle_sign" + } + } +} diff --git a/common/src/main/resources/assets/antarchy/blockstates/peach_wood.json b/common/src/main/resources/assets/antarchy/blockstates/peach_wood.json new file mode 100644 index 00000000..18f45dfd --- /dev/null +++ b/common/src/main/resources/assets/antarchy/blockstates/peach_wood.json @@ -0,0 +1,17 @@ +{ + "variants": { + "axis=x": { + "model": "antarchy:block/peach_wood", + "x": 90, + "y": 90 + }, + "axis=y": { + "model": "antarchy:block/peach_wood" + }, + "axis=z": { + "model": "antarchy:block/peach_wood", + "x": 90 + } + } +} + diff --git a/common/src/main/resources/assets/antarchy/blockstates/red_ant_nest.json b/common/src/main/resources/assets/antarchy/blockstates/red_ant_nest.json index a8412942..b75a3e29 100644 --- a/common/src/main/resources/assets/antarchy/blockstates/red_ant_nest.json +++ b/common/src/main/resources/assets/antarchy/blockstates/red_ant_nest.json @@ -1,7 +1,28 @@ { "variants": { - "": { - "model": "antarchy:block/red_ant_nest" - } + "facing=north": [ + {"model": "antarchy:block/red_ant_nest"}, + {"model": "antarchy:block/red_ant_nest", "y": 90}, + {"model": "antarchy:block/red_ant_nest", "y": 180}, + {"model": "antarchy:block/red_ant_nest", "y": 270} + ], + "facing=east": [ + {"model": "antarchy:block/red_ant_nest", "y": 90}, + {"model": "antarchy:block/red_ant_nest", "y": 180}, + {"model": "antarchy:block/red_ant_nest", "y": 270}, + {"model": "antarchy:block/red_ant_nest"} + ], + "facing=south": [ + {"model": "antarchy:block/red_ant_nest", "y": 180}, + {"model": "antarchy:block/red_ant_nest", "y": 270}, + {"model": "antarchy:block/red_ant_nest"}, + {"model": "antarchy:block/red_ant_nest", "y": 90} + ], + "facing=west": [ + {"model": "antarchy:block/red_ant_nest", "y": 270}, + {"model": "antarchy:block/red_ant_nest"}, + {"model": "antarchy:block/red_ant_nest", "y": 90}, + {"model": "antarchy:block/red_ant_nest", "y": 180} + ] } -} \ No newline at end of file +} diff --git a/common/src/main/resources/assets/antarchy/blockstates/roseate_froglight.json b/common/src/main/resources/assets/antarchy/blockstates/roseate_froglight.json new file mode 100644 index 00000000..8b93d9c2 --- /dev/null +++ b/common/src/main/resources/assets/antarchy/blockstates/roseate_froglight.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "antarchy:block/roseate_froglight" + } + } +} diff --git a/common/src/main/resources/assets/antarchy/blockstates/stripped_peach_log.json b/common/src/main/resources/assets/antarchy/blockstates/stripped_peach_log.json new file mode 100644 index 00000000..e7bf00d4 --- /dev/null +++ b/common/src/main/resources/assets/antarchy/blockstates/stripped_peach_log.json @@ -0,0 +1,17 @@ +{ + "variants": { + "axis=x": { + "model": "antarchy:block/stripped_peach_log_horizontal", + "x": 90, + "y": 90 + }, + "axis=y": { + "model": "antarchy:block/stripped_peach_log" + }, + "axis=z": { + "model": "antarchy:block/stripped_peach_log_horizontal", + "x": 90 + } + } +} + diff --git a/common/src/main/resources/assets/antarchy/blockstates/stripped_peach_wood.json b/common/src/main/resources/assets/antarchy/blockstates/stripped_peach_wood.json new file mode 100644 index 00000000..7e0dea68 --- /dev/null +++ b/common/src/main/resources/assets/antarchy/blockstates/stripped_peach_wood.json @@ -0,0 +1,17 @@ +{ + "variants": { + "axis=x": { + "model": "antarchy:block/stripped_peach_wood", + "x": 90, + "y": 90 + }, + "axis=y": { + "model": "antarchy:block/stripped_peach_wood" + }, + "axis=z": { + "model": "antarchy:block/stripped_peach_wood", + "x": 90 + } + } +} + diff --git a/common/src/main/resources/assets/antarchy/blockstates/torchflower_bush.json b/common/src/main/resources/assets/antarchy/blockstates/torchflower_bush.json deleted file mode 100644 index b743846f..00000000 --- a/common/src/main/resources/assets/antarchy/blockstates/torchflower_bush.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "variants": { - "half=lower": { - "model": "antarchy:block/torchflower_bush_bottom" - }, - "half=upper": { - "model": "antarchy:block/torchflower_bush_top" - } - } -} diff --git a/common/src/main/resources/assets/antarchy/blockstates/very_short_grass.json b/common/src/main/resources/assets/antarchy/blockstates/very_short_grass.json deleted file mode 100644 index c25b3915..00000000 --- a/common/src/main/resources/assets/antarchy/blockstates/very_short_grass.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "variants": { - "": { "model": "antarchy:block/very_short_grass" } - } -} diff --git a/common/src/main/resources/assets/antarchy/blockstates/very_tall_grass.json b/common/src/main/resources/assets/antarchy/blockstates/very_tall_grass.json deleted file mode 100644 index 65ddba9e..00000000 --- a/common/src/main/resources/assets/antarchy/blockstates/very_tall_grass.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "part=lower": { "model": "antarchy:block/very_tall_grass_bottom" }, - "part=middle": { "model": "antarchy:block/very_tall_grass_middle" }, - "part=upper": { "model": "antarchy:block/very_tall_grass_top" } - } -} diff --git a/common/src/main/resources/assets/antarchy/blockstates/wild_corn.json b/common/src/main/resources/assets/antarchy/blockstates/wild_corn.json new file mode 100644 index 00000000..aa33127a --- /dev/null +++ b/common/src/main/resources/assets/antarchy/blockstates/wild_corn.json @@ -0,0 +1,28 @@ +{ + "variants": { + "age=0,half=lower": { + "model": "antarchy:block/corn_crop_stage_3_bottom" + }, + "age=0,half=upper": { + "model": "antarchy:block/corn_crop_stage_3_top" + }, + "age=1,half=lower": { + "model": "antarchy:block/corn_crop_stage_3_bottom" + }, + "age=1,half=upper": { + "model": "antarchy:block/corn_crop_stage_3_top" + }, + "age=2,half=lower": { + "model": "antarchy:block/corn_crop_stage_3_bottom" + }, + "age=2,half=upper": { + "model": "antarchy:block/corn_crop_stage_3_top" + }, + "age=3,half=lower": { + "model": "antarchy:block/corn_crop_stage_3_bottom" + }, + "age=3,half=upper": { + "model": "antarchy:block/corn_crop_stage_3_top" + } + } +} diff --git a/common/src/main/resources/assets/antarchy/geo/elka.geo.json b/common/src/main/resources/assets/antarchy/geo/elka.geo.json new file mode 100644 index 00000000..83bf0d6c --- /dev/null +++ b/common/src/main/resources/assets/antarchy/geo/elka.geo.json @@ -0,0 +1,111 @@ +{ + "format_version": "1.12.0", + "minecraft:geometry": [ + { + "description": { + "identifier": "geometry.unknown", + "texture_width": 128, + "texture_height": 128, + "visible_bounds_width": 4, + "visible_bounds_height": 4.5, + "visible_bounds_offset": [0, 1.75, 0] + }, + "bones": [ + { + "name": "panda", + "pivot": [0, 19.6, -0.4] + }, + { + "name": "body", + "parent": "panda", + "pivot": [0, 19.6, -0.4] + }, + { + "name": "right_leg", + "parent": "body", + "pivot": [-6.5, 18, -12.5], + "cubes": [ + {"origin": [-10.5, 0, -17], "size": [8, 18, 9], "inflate": 0.01, "uv": [72, 73]} + ] + }, + { + "name": "left_leg", + "parent": "body", + "pivot": [6.5, 18, -12.5], + "cubes": [ + {"origin": [2.5, 0, -17], "size": [8, 18, 9], "inflate": 0.01, "uv": [72, 73], "mirror": true} + ] + }, + { + "name": "right_back_leg", + "parent": "body", + "pivot": [-6.5, 17, 12.5], + "cubes": [ + {"origin": [-10.5, 0, 8], "size": [8, 17, 9], "uv": [64, 47]} + ] + }, + { + "name": "left_back_leg", + "parent": "body", + "pivot": [6.5, 17, 12.5], + "cubes": [ + {"origin": [2.5, 0, 8], "size": [8, 17, 9], "uv": [64, 47], "mirror": true} + ] + }, + { + "name": "torso", + "parent": "body", + "pivot": [0, 28, -2], + "cubes": [ + {"origin": [-10.5, 16, -17], "size": [21, 24, 15], "inflate": 0.1, "uv": [0, 76]} + ] + }, + { + "name": "head", + "parent": "torso", + "pivot": [4.5, 23, -23], + "cubes": [ + {"origin": [-5.5, 16, -34], "size": [11, 7, 6], "uv": [0, 25]}, + {"origin": [-8.5, 16, -28], "size": [17, 14, 11], "uv": [0, 0]}, + {"origin": [-21.5, 28, -21], "size": [13, 10, 0], "uv": [101, 66]}, + {"origin": [8.5, 28, -21], "size": [13, 10, 0], "uv": [101, 66], "mirror": true}, + {"origin": [-4.5, 28, -29], "size": [2, 5, 2], "uv": [0, 0]}, + {"origin": [2.5, 28, -29], "size": [2, 5, 2], "uv": [0, 0], "mirror": true} + ] + }, + { + "name": "jaw", + "parent": "head", + "pivot": [0, 17, -27.5], + "cubes": [ + {"origin": [-5.5, 15, -33.5], "size": [11, 2, 6], "inflate": -0.1, "uv": [0, 59]} + ] + }, + { + "name": "right_ear", + "parent": "head", + "pivot": [-6.5, 29, -24], + "cubes": [ + {"origin": [-10.5, 29, -25], "size": [8, 6, 2], "uv": [0, 38]} + ] + }, + { + "name": "left_ear", + "parent": "head", + "pivot": [6.5, 29, -24], + "cubes": [ + {"origin": [2.5, 29, -25], "size": [8, 6, 2], "uv": [0, 38], "mirror": true} + ] + }, + { + "name": "back", + "parent": "torso", + "pivot": [0, 25, -2], + "cubes": [ + {"origin": [-10.5, 14, -2], "size": [21, 22, 19], "inflate": 0.05, "uv": [48, 6]} + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/common/src/main/resources/assets/antarchy/geo/elka_baby.geo.json b/common/src/main/resources/assets/antarchy/geo/elka_baby.geo.json new file mode 100644 index 00000000..23efa651 --- /dev/null +++ b/common/src/main/resources/assets/antarchy/geo/elka_baby.geo.json @@ -0,0 +1,109 @@ +{ + "format_version": "1.12.0", + "minecraft:geometry": [ + { + "description": { + "identifier": "geometry.unknown", + "texture_width": 128, + "texture_height": 128, + "visible_bounds_width": 3, + "visible_bounds_height": 2.5, + "visible_bounds_offset": [0, 0.75, 0] + }, + "bones": [ + { + "name": "baby_elka", + "pivot": [0, 0, -7] + }, + { + "name": "body", + "parent": "baby_elka", + "pivot": [0, 11, 1] + }, + { + "name": "torso", + "parent": "body", + "pivot": [0, 6, -2.5], + "cubes": [ + {"origin": [-6, 6, -7], "size": [12, 12, 9], "inflate": 0.1, "uv": [0, 0]} + ] + }, + { + "name": "head", + "parent": "torso", + "pivot": [-0.8, 10.3, -7.05], + "cubes": [ + {"origin": [-5, 6, -15], "size": [10, 9, 8], "uv": [40, 23]}, + {"origin": [-3, 6.5, -18], "size": [6, 4, 3], "uv": [0, 46]}, + {"origin": [-3, 14, -16], "size": [2, 4, 2], "uv": [14, 40]}, + {"origin": [1, 14, -16], "size": [2, 4, 2], "uv": [14, 40], "mirror": true} + ] + }, + { + "name": "jaw", + "parent": "head", + "pivot": [0, 6.75, -15], + "cubes": [ + {"origin": [-3, 5.75, -18], "size": [6, 1, 3], "inflate": -0.05, "uv": [41, 19]} + ] + }, + { + "name": "right_ear", + "parent": "head", + "pivot": [-4, 13, -11.5], + "cubes": [ + {"origin": [-7, 13, -12], "size": [6, 5, 1], "uv": [0, 40]} + ] + }, + { + "name": "left_ear", + "parent": "head", + "pivot": [4, 13, -11.5], + "cubes": [ + {"origin": [1, 13, -12], "size": [6, 5, 1], "uv": [0, 40], "mirror": true} + ] + }, + { + "name": "back", + "parent": "torso", + "pivot": [0, 10.5, 2], + "cubes": [ + {"origin": [-6, 5, 2], "size": [12, 11, 8], "uv": [0, 21]} + ] + }, + { + "name": "back_left_leg", + "parent": "body", + "pivot": [4, 5, 6], + "cubes": [ + {"origin": [2, 0, 4], "size": [4, 8, 4], "inflate": -0.05, "uv": [42, 0], "mirror": true} + ] + }, + { + "name": "back_right_leg", + "parent": "body", + "pivot": [-4, 5, 6], + "cubes": [ + {"origin": [-6, 0, 4], "size": [4, 8, 4], "inflate": -0.05, "uv": [42, 0]} + ] + }, + { + "name": "left_leg", + "parent": "body", + "pivot": [4, 6, -5], + "cubes": [ + {"origin": [2, 0, -7], "size": [4, 8, 4], "uv": [56, 10], "mirror": true} + ] + }, + { + "name": "right_leg", + "parent": "body", + "pivot": [-4, 6, -5], + "cubes": [ + {"origin": [-6, 0, -7], "size": [4, 8, 4], "uv": [56, 10]} + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/common/src/main/resources/assets/antarchy/geo/kraken.geo.json b/common/src/main/resources/assets/antarchy/geo/kraken.geo.json index eba7b341..2138a567 100644 --- a/common/src/main/resources/assets/antarchy/geo/kraken.geo.json +++ b/common/src/main/resources/assets/antarchy/geo/kraken.geo.json @@ -13,10 +13,10 @@ "bones": [ { "name": "Kraken", - "pivot": [0, 51, -8] + "pivot": [0, 0, 0] }, { - "name": "head", + "name": "body", "parent": "Kraken", "pivot": [0, 51, -8], "cubes": [ @@ -26,7 +26,7 @@ }, { "name": "mouth", - "parent": "head", + "parent": "body", "pivot": [0, 51, -23.9], "cubes": [ {"origin": [-6.5, 20, -44.4], "size": [13, 33, 24], "uv": [169, 296]} @@ -44,7 +44,7 @@ }, { "name": "head_top", - "parent": "head", + "parent": "body", "pivot": [0, 79.25, -6.25], "cubes": [ {"origin": [-42.5, 79, -49], "size": [85, 99, 85], "uv": [0, 0]}, @@ -55,7 +55,7 @@ }, { "name": "right_eye", - "parent": "head", + "parent": "body", "pivot": [-53, 73, -41], "cubes": [ {"origin": [-59.5, 58, -56], "size": [13, 30, 30], "uv": [0, 296]} @@ -63,7 +63,7 @@ }, { "name": "left_eye", - "parent": "head", + "parent": "body", "pivot": [53, 73, -41], "cubes": [ {"origin": [46.5, 58, -56], "size": [13, 30, 30], "uv": [0, 296], "mirror": true} @@ -71,7 +71,7 @@ }, { "name": "l_shoulder", - "parent": "head", + "parent": "body", "pivot": [31.1875, 61.375, -12.5], "cubes": [ {"origin": [25, 14, -29], "size": [17, 47, 33], "uv": [0, 356]} @@ -133,13 +133,20 @@ {"origin": [25, -265, -26], "size": [8, 21, 27], "uv": [172, 468]} ] }, + { + "name": "Grab", + "parent": "l_hand2", + "pivot": [22, -223.5, -12.5], + "locators": { + "grab": [22, -223.5, -12.5] + } + }, { "name": "center_tentacule", - "parent": "head", + "parent": "body", "pivot": [0, 58.375, -52.5], - "rotation": [0, 90, 0], "cubes": [ - {"origin": [-6.1875, 11, -69], "size": [17, 47, 33], "uv": [0, 436]} + {"origin": [-6.1875, 11, -69], "size": [17, 47, 33], "pivot": [0.3125, -79.5, -52.5], "rotation": [0, 90, 0], "uv": [0, 436]} ] }, { @@ -147,7 +154,7 @@ "parent": "center_tentacule", "pivot": [1.48214, 10.92857, -52.5], "cubes": [ - {"origin": [-6.1875, -37, -66], "size": [14, 48, 27], "uv": [86, 296]} + {"origin": [-6.1875, -37, -66], "size": [14, 48, 27], "pivot": [0.3125, -79.5, -52.5], "rotation": [0, 90, 0], "uv": [86, 296]} ] }, { @@ -155,7 +162,7 @@ "parent": "center_tentacule2", "pivot": [1.29167, -37.00833, -52.5], "cubes": [ - {"origin": [-6.1875, -85, -63], "size": [14, 48, 21], "uv": [100, 371]} + {"origin": [-6.1875, -85, -63], "size": [14, 48, 21], "pivot": [0.3125, -79.5, -52.5], "rotation": [0, 90, 0], "uv": [100, 371]} ] }, { @@ -163,7 +170,7 @@ "parent": "center_tentacule3", "pivot": [1.025, -85, -52.5], "cubes": [ - {"origin": [-6.1875, -133, -63], "size": [14, 48, 21], "uv": [170, 371]} + {"origin": [-6.1875, -133, -63], "size": [14, 48, 21], "pivot": [0.3125, -79.5, -52.5], "rotation": [0, 90, 0], "uv": [170, 371]} ] }, { @@ -171,7 +178,7 @@ "parent": "center_tentacule4", "pivot": [-0.375, -132.975, -52.5], "cubes": [ - {"origin": [-6.1875, -181, -61], "size": [12, 48, 17], "uv": [243, 330]} + {"origin": [-6.1875, -181, -61], "size": [12, 48, 17], "pivot": [0.3125, -79.5, -52.5], "rotation": [0, 90, 0], "uv": [243, 330]} ] }, { @@ -179,16 +186,15 @@ "parent": "center_tentacule5", "pivot": [-0.70833, -180.99167, -52.5], "cubes": [ - {"origin": [-6.1875, -206, -59], "size": [9, 25, 13], "uv": [242, 398]} + {"origin": [-6.1875, -206, -59], "size": [9, 25, 13], "pivot": [0.3125, -79.5, -52.5], "rotation": [0, 90, 0], "uv": [242, 398]} ] }, { "name": "center_tentacule_back", - "parent": "head", + "parent": "body", "pivot": [0, 58.375, 24.5], - "rotation": [0, -90, 0], "cubes": [ - {"origin": [-6.1875, 11, 8], "size": [17, 47, 33], "uv": [0, 436]} + {"origin": [-6.1875, 11, 8], "size": [17, 47, 33], "pivot": [0.3125, -79.5, 24.5], "rotation": [0, -90, 0], "uv": [0, 436]} ] }, { @@ -196,7 +202,7 @@ "parent": "center_tentacule_back", "pivot": [1.48214, 10.92857, 24.5], "cubes": [ - {"origin": [-6.1875, -37, 11], "size": [14, 48, 27], "uv": [86, 296]} + {"origin": [-6.1875, -37, 11], "size": [14, 48, 27], "pivot": [0.3125, -79.5, 24.5], "rotation": [0, -90, 0], "uv": [86, 296]} ] }, { @@ -204,7 +210,7 @@ "parent": "center_tentacule_back2", "pivot": [1.29167, -37.00833, 24.5], "cubes": [ - {"origin": [-6.1875, -85, 14], "size": [14, 48, 21], "uv": [100, 371]} + {"origin": [-6.1875, -85, 14], "size": [14, 48, 21], "pivot": [0.3125, -79.5, 24.5], "rotation": [0, -90, 0], "uv": [100, 371]} ] }, { @@ -212,7 +218,7 @@ "parent": "center_tentacule_back3", "pivot": [1.025, -85, 24.5], "cubes": [ - {"origin": [-6.1875, -133, 14], "size": [14, 48, 21], "uv": [170, 371]} + {"origin": [-6.1875, -133, 14], "size": [14, 48, 21], "pivot": [0.3125, -79.5, 24.5], "rotation": [0, -90, 0], "uv": [170, 371]} ] }, { @@ -220,7 +226,7 @@ "parent": "center_tentacule_back4", "pivot": [-0.375, -132.975, 24.5], "cubes": [ - {"origin": [-6.1875, -181, 16], "size": [12, 48, 17], "uv": [243, 330]} + {"origin": [-6.1875, -181, 16], "size": [12, 48, 17], "pivot": [0.3125, -79.5, 24.5], "rotation": [0, -90, 0], "uv": [243, 330]} ] }, { @@ -228,16 +234,15 @@ "parent": "center_tentacule_back5", "pivot": [-0.70833, -180.99167, 24.5], "cubes": [ - {"origin": [-6.1875, -206, 18], "size": [9, 25, 13], "uv": [242, 398]} + {"origin": [-6.1875, -206, 18], "size": [9, 25, 13], "pivot": [0.3125, -79.5, 24.5], "rotation": [0, -90, 0], "uv": [242, 398]} ] }, { "name": "l_back_tentacule", - "parent": "head", + "parent": "body", "pivot": [22.1875, 58.375, 14.5], - "rotation": [0, -90, 0], "cubes": [ - {"origin": [16, 11, -2], "size": [17, 47, 33], "uv": [0, 356]} + {"origin": [16, 11, -2], "size": [17, 47, 33], "pivot": [22.5, -79.5, 14.5], "rotation": [0, -90, 0], "uv": [0, 356]} ] }, { @@ -245,7 +250,7 @@ "parent": "l_back_tentacule", "pivot": [21.85714, 10.92857, 14.5], "cubes": [ - {"origin": [16, -37, 1], "size": [14, 48, 27], "uv": [86, 296]} + {"origin": [16, -37, 1], "size": [14, 48, 27], "pivot": [22.5, -79.5, 14.5], "rotation": [0, -90, 0], "uv": [86, 296]} ] }, { @@ -253,7 +258,7 @@ "parent": "l_back_tentacule2", "pivot": [21.66667, -37.00833, 14.5], "cubes": [ - {"origin": [16, -85, 4], "size": [14, 48, 21], "uv": [100, 371]} + {"origin": [16, -85, 4], "size": [14, 48, 21], "pivot": [22.5, -79.5, 14.5], "rotation": [0, -90, 0], "uv": [100, 371]} ] }, { @@ -261,7 +266,7 @@ "parent": "l_back_tentacule3", "pivot": [21.4, -85, 14.5], "cubes": [ - {"origin": [16, -133, 4], "size": [14, 48, 21], "uv": [170, 371]} + {"origin": [16, -133, 4], "size": [14, 48, 21], "pivot": [22.5, -79.5, 14.5], "rotation": [0, -90, 0], "uv": [170, 371]} ] }, { @@ -269,7 +274,7 @@ "parent": "l_back_tentacule4", "pivot": [21, -132.975, 14.5], "cubes": [ - {"origin": [16, -181, 6], "size": [12, 48, 17], "uv": [243, 330]} + {"origin": [16, -181, 6], "size": [12, 48, 17], "pivot": [22.5, -79.5, 14.5], "rotation": [0, -90, 0], "uv": [243, 330]} ] }, { @@ -277,16 +282,15 @@ "parent": "l_back_tentacule5", "pivot": [20.66667, -180.99167, 14.5], "cubes": [ - {"origin": [16, -206, 8], "size": [9, 25, 13], "uv": [242, 398]} + {"origin": [16, -206, 8], "size": [9, 25, 13], "pivot": [22.5, -79.5, 14.5], "rotation": [0, -90, 0], "uv": [242, 398]} ] }, { "name": "r_back_tentacule", - "parent": "head", + "parent": "body", "pivot": [-22.1875, 58.375, 14.5], - "rotation": [0, 90, 0], "cubes": [ - {"origin": [-33, 11, -2], "size": [17, 47, 33], "uv": [0, 356], "mirror": true} + {"origin": [-33, 11, -2], "size": [17, 47, 33], "pivot": [-22.5, -79.5, 14.5], "rotation": [0, 90, 0], "uv": [0, 356], "mirror": true} ] }, { @@ -294,7 +298,7 @@ "parent": "r_back_tentacule", "pivot": [-21.85714, 10.92857, 14.5], "cubes": [ - {"origin": [-30, -37, 1], "size": [14, 48, 27], "uv": [86, 296], "mirror": true} + {"origin": [-30, -37, 1], "size": [14, 48, 27], "pivot": [-22.5, -79.5, 14.5], "rotation": [0, 90, 0], "uv": [86, 296], "mirror": true} ] }, { @@ -302,7 +306,7 @@ "parent": "r_back_tentacule2", "pivot": [-21.66667, -37.00833, 14.5], "cubes": [ - {"origin": [-30, -85, 4], "size": [14, 48, 21], "uv": [100, 371], "mirror": true} + {"origin": [-30, -85, 4], "size": [14, 48, 21], "pivot": [-22.5, -79.5, 14.5], "rotation": [0, 90, 0], "uv": [100, 371], "mirror": true} ] }, { @@ -310,7 +314,7 @@ "parent": "r_back_tentacule3", "pivot": [-21.4, -85, 14.5], "cubes": [ - {"origin": [-30, -133, 4], "size": [14, 48, 21], "uv": [170, 371], "mirror": true} + {"origin": [-30, -133, 4], "size": [14, 48, 21], "pivot": [-22.5, -79.5, 14.5], "rotation": [0, 90, 0], "uv": [170, 371], "mirror": true} ] }, { @@ -318,7 +322,7 @@ "parent": "r_back_tentacule4", "pivot": [-21, -132.975, 14.5], "cubes": [ - {"origin": [-28, -181, 6], "size": [12, 48, 17], "uv": [243, 330], "mirror": true} + {"origin": [-28, -181, 6], "size": [12, 48, 17], "pivot": [-22.5, -79.5, 14.5], "rotation": [0, 90, 0], "uv": [243, 330], "mirror": true} ] }, { @@ -326,16 +330,15 @@ "parent": "r_back_tentacule5", "pivot": [-20.66667, -180.99167, 14.5], "cubes": [ - {"origin": [-25, -206, 8], "size": [9, 25, 13], "uv": [242, 398], "mirror": true} + {"origin": [-25, -206, 8], "size": [9, 25, 13], "pivot": [-22.5, -79.5, 14.5], "rotation": [0, 90, 0], "uv": [242, 398], "mirror": true} ] }, { "name": "r_tentacule", - "parent": "head", + "parent": "body", "pivot": [-28.1875, 58.375, -42.5], - "rotation": [0, -90, 0], "cubes": [ - {"origin": [-39, 11, -59], "size": [17, 47, 33], "uv": [0, 356], "mirror": true} + {"origin": [-39, 11, -59], "size": [17, 47, 33], "pivot": [-28.5, -79.5, -42.5], "rotation": [0, -90, 0], "uv": [0, 356], "mirror": true} ] }, { @@ -343,7 +346,7 @@ "parent": "r_tentacule", "pivot": [-27.85714, 10.92857, -42.5], "cubes": [ - {"origin": [-36, -37, -56], "size": [14, 48, 27], "uv": [86, 296], "mirror": true} + {"origin": [-36, -37, -56], "size": [14, 48, 27], "pivot": [-28.5, -79.5, -42.5], "rotation": [0, -90, 0], "uv": [86, 296], "mirror": true} ] }, { @@ -351,7 +354,7 @@ "parent": "r_tentacule2", "pivot": [-27.66667, -37.00833, -42.5], "cubes": [ - {"origin": [-36, -85, -53], "size": [14, 48, 21], "uv": [100, 371], "mirror": true} + {"origin": [-36, -85, -53], "size": [14, 48, 21], "pivot": [-28.5, -79.5, -42.5], "rotation": [0, -90, 0], "uv": [100, 371], "mirror": true} ] }, { @@ -359,7 +362,7 @@ "parent": "r_tentacule3", "pivot": [-27.4, -85, -42.5], "cubes": [ - {"origin": [-36, -133, -53], "size": [14, 48, 21], "uv": [170, 371], "mirror": true} + {"origin": [-36, -133, -53], "size": [14, 48, 21], "pivot": [-28.5, -79.5, -42.5], "rotation": [0, -90, 0], "uv": [170, 371], "mirror": true} ] }, { @@ -367,7 +370,7 @@ "parent": "r_tentacule4", "pivot": [-27, -132.975, -42.5], "cubes": [ - {"origin": [-34, -181, -51], "size": [12, 48, 17], "uv": [243, 330], "mirror": true} + {"origin": [-34, -181, -51], "size": [12, 48, 17], "pivot": [-28.5, -79.5, -42.5], "rotation": [0, -90, 0], "uv": [243, 330], "mirror": true} ] }, { @@ -375,16 +378,15 @@ "parent": "r_tentacule5", "pivot": [-26.66667, -180.99167, -42.5], "cubes": [ - {"origin": [-31, -206, -49], "size": [9, 25, 13], "uv": [242, 398], "mirror": true} + {"origin": [-31, -206, -49], "size": [9, 25, 13], "pivot": [-28.5, -79.5, -42.5], "rotation": [0, -90, 0], "uv": [242, 398], "mirror": true} ] }, { "name": "l_tentacule", - "parent": "head", + "parent": "body", "pivot": [28.1875, 58.375, -42.5], - "rotation": [0, 90, 0], "cubes": [ - {"origin": [22, 11, -59], "size": [17, 47, 33], "uv": [0, 356]} + {"origin": [22, 11, -59], "size": [17, 47, 33], "pivot": [28.5, -79.5, -42.5], "rotation": [0, 90, 0], "uv": [0, 356]} ] }, { @@ -392,7 +394,7 @@ "parent": "l_tentacule", "pivot": [27.85714, 10.92857, -42.5], "cubes": [ - {"origin": [22, -37, -56], "size": [14, 48, 27], "uv": [86, 296]} + {"origin": [22, -37, -56], "size": [14, 48, 27], "pivot": [28.5, -79.5, -42.5], "rotation": [0, 90, 0], "uv": [86, 296]} ] }, { @@ -400,7 +402,7 @@ "parent": "l_tentacule2", "pivot": [27.66667, -37.00833, -42.5], "cubes": [ - {"origin": [22, -85, -53], "size": [14, 48, 21], "uv": [100, 371]} + {"origin": [22, -85, -53], "size": [14, 48, 21], "pivot": [28.5, -79.5, -42.5], "rotation": [0, 90, 0], "uv": [100, 371]} ] }, { @@ -408,7 +410,7 @@ "parent": "l_tentacule3", "pivot": [27.4, -85, -42.5], "cubes": [ - {"origin": [22, -133, -53], "size": [14, 48, 21], "uv": [170, 371]} + {"origin": [22, -133, -53], "size": [14, 48, 21], "pivot": [28.5, -79.5, -42.5], "rotation": [0, 90, 0], "uv": [170, 371]} ] }, { @@ -416,7 +418,7 @@ "parent": "l_tentacule4", "pivot": [27, -132.975, -42.5], "cubes": [ - {"origin": [22, -181, -51], "size": [12, 48, 17], "uv": [243, 330]} + {"origin": [22, -181, -51], "size": [12, 48, 17], "pivot": [28.5, -79.5, -42.5], "rotation": [0, 90, 0], "uv": [243, 330]} ] }, { @@ -424,12 +426,12 @@ "parent": "l_tentacule5", "pivot": [26.66667, -180.99167, -42.5], "cubes": [ - {"origin": [22, -206, -49], "size": [9, 25, 13], "uv": [242, 398]} + {"origin": [22, -206, -49], "size": [9, 25, 13], "pivot": [28.5, -79.5, -42.5], "rotation": [0, 90, 0], "uv": [242, 398]} ] }, { "name": "r_shoulder", - "parent": "head", + "parent": "body", "pivot": [-31.1875, 61.375, -12.5], "cubes": [ {"origin": [-42, 14, -29], "size": [17, 47, 33], "uv": [0, 356], "mirror": true} diff --git a/common/src/main/resources/assets/antarchy/geo/glimmer.geo.json b/common/src/main/resources/assets/antarchy/geo/ouranwood_deer.geo.json similarity index 100% rename from common/src/main/resources/assets/antarchy/geo/glimmer.geo.json rename to common/src/main/resources/assets/antarchy/geo/ouranwood_deer.geo.json diff --git a/common/src/main/resources/assets/antarchy/geo/glimmer_baby.geo.json b/common/src/main/resources/assets/antarchy/geo/ouranwood_deer_baby.geo.json similarity index 100% rename from common/src/main/resources/assets/antarchy/geo/glimmer_baby.geo.json rename to common/src/main/resources/assets/antarchy/geo/ouranwood_deer_baby.geo.json diff --git a/common/src/main/resources/assets/antarchy/lang/en_us.json b/common/src/main/resources/assets/antarchy/lang/en_us.json index ef4967c6..7bbad3f6 100644 --- a/common/src/main/resources/assets/antarchy/lang/en_us.json +++ b/common/src/main/resources/assets/antarchy/lang/en_us.json @@ -17,18 +17,33 @@ "block.antarchy.ouranwood_button": "Ouranwood Button", "block.antarchy.ouranwood_leaves": "Ouranwood Leaves", "block.antarchy.ouranwood_acorn": "Ouranwood Acorn", - "block.antarchy.ouranwood_vine": "Ouranwood Vine", "block.antarchy.ouranwood_sign": "Ouranwood Sign", "block.antarchy.ouranwood_hanging_sign": "Ouranwood Hanging Sign", + "block.antarchy.peach_log": "Peach Log", + "block.antarchy.peach_wood": "Peach Wood", + "block.antarchy.stripped_peach_log": "Stripped Peach Log", + "block.antarchy.stripped_peach_wood": "Stripped Peach Wood", + "block.antarchy.peach_planks": "Peach Planks", + "block.antarchy.peach_stairs": "Peach Stairs", + "block.antarchy.peach_slab": "Peach Slab", + "block.antarchy.peach_fence": "Peach Fence", + "block.antarchy.peach_fence_gate": "Peach Fence Gate", + "block.antarchy.peach_door": "Peach Door", + "block.antarchy.peach_trapdoor": "Peach Trapdoor", + "block.antarchy.peach_pressure_plate": "Peach Pressure Plate", + "block.antarchy.peach_button": "Peach Button", + "block.antarchy.peach_leaves": "Peach Leaves", + "block.antarchy.hanging_peach": "Hanging Peach", + "block.antarchy.peach_sapling": "Peach Sapling", + "block.antarchy.peach_sign": "Peach Sign", + "block.antarchy.peach_hanging_sign": "Peach Hanging Sign", "block.antarchy.orange_milkweed": "Orange Milkweed", "block.antarchy.pink_milkweed": "Pink Milkweed", "block.antarchy.hushweed": "Hushweed", - "block.antarchy.big_bush": "Big Bush", - "block.antarchy.big_bush_part": "Big Bush", - "block.antarchy.very_short_grass": "Very Short Grass", - "block.antarchy.very_tall_grass": "Very Tall Grass", "block.antarchy.umbral_moss_block": "Umbral Moss Block", "block.antarchy.umbral_moss_carpet": "Umbral Moss Carpet", + "block.antarchy.blush_moss_block": "Blush Moss Block", + "block.antarchy.blush_moss_carpet": "Blush Moss Carpet", "block.antarchy.duplicator_sapling": "Duplicator Sapling", "block.antarchy.duct_tape": "Duct Tape", "block.antarchy.infested_rooted_dirt": "Infested Rooted Dirt", @@ -75,6 +90,7 @@ "block.antarchy.polished_antimetal": "Polished Antimetal", "block.antarchy.antimetal_scaffolding": "Antimetal Scaffolding", "block.antarchy.cornea_stalk": "Cornea Stalk", + "block.antarchy.corn_crop": "Corn Crop", "block.antarchy.dream_torch": "Dream Torch", "block.antarchy.dream_wall_torch": "Dream Wall Torch", "block.antarchy.dream_lantern": "Dream Lantern", @@ -131,11 +147,17 @@ "block.antarchy.bile": "Bile", "block.antarchy.ichor": "Ichor", "block.antarchy.antiwater": "Antiwater", + "block.antarchy.lumen": "Lumen", + "block.antarchy.lumen_froglight": "Lumen Froglight", + "block.antarchy.roseate_froglight": "Roseate Froglight", "entity.antarchy.apple_cow": "Apple Cow", "entity.antarchy.golden_apple_cow": "Golden Apple Cow", "entity.antarchy.enchanted_golden_apple_cow": "Enchanted Golden Apple Cow", "entity.antarchy.easter_bunny": "Easter Bunny", "entity.antarchy.glimmer": "Glimmer", + "entity.antarchy.ouranwood_deer": "Ouranwood Deer", + "entity.antarchy.elka": "Elka", + "entity.antarchy.dorrie": "Dorrie", "entity.antarchy.flying_squirrel": "Flying Squirrel", "entity.antarchy.caterpillar": "Caterpillar", "entity.antarchy.butterfly": "Butterfly", @@ -254,20 +276,23 @@ "item.antarchy.polished_antimetal": "Polished Antimetal", "item.antarchy.antimetal_scaffolding": "Antimetal Scaffolding", "item.antarchy.ouranwood_acorn": "Ouranwood Acorn", - "item.antarchy.ouranwood_vine": "Ouranwood Vine", "item.antarchy.ouranwood_boat": "Ouranwood Boat", "item.antarchy.ouranwood_chest_boat": "Ouranwood Chest Boat", - "item.antarchy.big_bush": "Big Bush", - "item.antarchy.big_bush.tooltip": "Can be bonemealed", - "item.antarchy.very_short_grass": "Very Short Grass", - "item.antarchy.very_tall_grass": "Very Tall Grass", + "item.antarchy.raw_venison": "Raw Venison", + "item.antarchy.cooked_venison": "Cooked Venison", + "item.antarchy.peach_sapling": "Peach Sapling", + "item.antarchy.peach": "Peach", + "item.antarchy.peach_sign": "Peach Sign", + "item.antarchy.peach_hanging_sign": "Peach Hanging Sign", + "item.antarchy.peach_boat": "Peach Boat", + "item.antarchy.peach_chest_boat": "Peach Chest Boat", "item.antarchy.orange_milkweed": "Orange Milkweed", "item.antarchy.pink_milkweed": "Pink Milkweed", "item.antarchy.hushweed": "Hushweed", "item.antarchy.umbral_moss_block": "Umbral Moss Block", "item.antarchy.umbral_moss_carpet": "Umbral Moss Carpet", - "item.antarchy.torchflower_bush": "Torchflower Bush", - "block.antarchy.torchflower_bush": "Torchflower Bush", + "item.antarchy.blush_moss_block": "Blush Moss Block", + "item.antarchy.blush_moss_carpet": "Blush Moss Carpet", "item.antarchy.mud_pie": "Mud Pie", "item.antarchy.duct_tape": "Duct Tape", "item.antarchy.duct_tape.tooltip": "Place down and right-click to repair tools", @@ -302,12 +327,21 @@ "item.antarchy.brutalfly_elytra": "Brutalfly Elytra", "tooltip.antarchy.brutalfly_elytra.flap": "While flying, hold %s to flap your wings", "item.antarchy.cornea_ear": "Ear of Cornea", + "item.antarchy.corn": "Corn", + "item.antarchy.corn_seeds": "Corn Seeds", + "item.antarchy.raw_corndog": "Raw Corndog", + "item.antarchy.cooked_corndog": "Cooked Corndog", + "item.antarchy.high_fructose_corn_syrup": "High Fructose Corn Syrup", + "jei.antarchy.americanize": "Americanize", + "item.antarchy.american_name": "American %s", + "item.antarchy.root_beer": "Root Beer", "item.antarchy.primordial_scute": "Primordial Scute", "item.antarchy.triffid_goo": "Triffid Goo", "item.antarchy.triffid_goo_block": "Triffid Goo Block", "tooltip.antarchy.triffid_goo_block": "At high velocity bounce up, otherwise sink through.", "item.antarchy.cloud_bucket": "Cloud Bucket", "tooltip.antarchy.cloud_bucket.midair": "Can be placed midair", + "item.antarchy.lumen_bucket": "Lumen Bucket", "item.antarchy.scorpion_whip": "Emperor Scorpion Whip", "tooltip.antarchy.scorpion_whip.lash": "Lashes prey from afar and embeds a venomous tether.", "tooltip.antarchy.scorpion_whip.reel": "Right-click to reel tethered prey.", @@ -343,6 +377,11 @@ "tooltip.antarchy.reverie_bottle.capture": "Right click a Reverie with a glass bottle to store it.", "tooltip.antarchy.reverie_bottle.release": "Right click to release the Reverie.", "item.antarchy.gravity_gun": "Gravity Gun", + "item.antarchy.miners_dream": "Miner's Dream", + "tooltip.antarchy.miners_dream.line1": "Right-click to carve a winding cave.", + "tooltip.antarchy.miners_dream.line2": "Leaves valuable blocks untouched.", + "message.antarchy.miners_dream_disabled": "The Miner's Dream is disabled.", + "message.antarchy.miners_dream_busy": "Your previous dream is still unfolding.", "item.antarchy.diamond_minecart": "The Diamond Minecart", "item.antarchy.cogwheel_pet": "Cogwheel Pet", "item.antarchy.fire_dragon_pet": "Fire Dragon Pet", @@ -358,6 +397,45 @@ "item.antarchy.dr_trayaurus_spawn_egg": "Dr. Trayaurus Spawn Egg", "item.antarchy.easter_bunny_spawn_egg": "Easter Bunny Spawn Egg", "item.antarchy.glimmer_spawn_egg": "Glimmer Spawn Egg", + "item.antarchy.ouranwood_deer_spawn_egg": "Ouranwood Deer Spawn Egg", + "item.antarchy.spirit_apple": "Spirit Apple", + "item.antarchy.elka_spawn_egg": "Elka Spawn Egg", + "item.antarchy.glimmer_bottle": "Bottle of Glimmer", + "item.antarchy.glimmer_bottle.contains": "Contains: %s", + "glimmer_variant.antarchy.apple_cow": "Apple Cow", + "glimmer_variant.antarchy.ouranwood_deer": "Ouranwood Deer", + "glimmer_variant.antarchy.frog": "Frog", + "glimmer_variant.antarchy.ant": "Ant", + "glimmer_variant.antarchy.elka": "Elka", + "entity.antarchy.glimmer.set_sit": "Glimmer set to sit.", + "entity.antarchy.glimmer.set_follow": "Glimmer set to follow.", + "entity.antarchy.glimmer.set_wander": "Glimmer set to wander.", + "entity.antarchy.glimmer.ability.ant": "Your Ant riles you up against the %s!", + "entity.antarchy.glimmer.ability.apple_cow": "Your Apple Cow moos and nourishes you!", + "entity.antarchy.glimmer.ability.elka": "Your Elka cries out and shatters the ward!", + "entity.antarchy.glimmer.ability.deer": "Your Ouranwood Deer charges through the enemy!", + "entity.antarchy.glimmer.ability.frog": "Your Frog devoured a %s!", + "item.antarchy.glimmer_bottle.passive.apple_cow": "Passive: Hunger drains 25% slower", + "item.antarchy.glimmer_bottle.ability.apple_cow": "Ability: Moos for a burst of Saturation and Regeneration when you're low on food", + "item.antarchy.glimmer_bottle.passive.ouranwood_deer": "Passive: Speed I", + "item.antarchy.glimmer_bottle.ability.ouranwood_deer": "Ability: Charges through hostile mobs when you sprint at them, knocking them flying", + "item.antarchy.glimmer_bottle.passive.frog": "Passive: Jump Boost I", + "item.antarchy.glimmer_bottle.ability.frog": "Ability: Devours a nearby hostile mob, growing bigger and stronger for a while", + "item.antarchy.glimmer_bottle.passive.ant": "Passive: Slightly further attack reach", + "item.antarchy.glimmer_bottle.ability.ant": "Ability: Landing a hit on a large enemy grants you a burst of Strength II", + "item.antarchy.glimmer_bottle.passive.elka": "Passive: Bloodglass Ward II", + "item.antarchy.glimmer_bottle.ability.elka": "Ability: Cries and shatters into a shockwave when one of your ward hearts breaks", + "advancements.antarchy.spirant_animal.title": "SpirANT Animal", + "advancements.antarchy.spirant_animal.description": "Tame an Ant Glimmer", + "advancements.antarchy.hoppy_together.title": "Hoppy Together", + "advancements.antarchy.hoppy_together.description": "Tame a Frog Glimmer", + "advancements.antarchy.deerly_beloved.title": "Deerly Beloved", + "advancements.antarchy.deerly_beloved.description": "Tame an Ouranwood Deer Glimmer", + "advancements.antarchy.elkcellent_choice.title": "ELKcellent Choice", + "advancements.antarchy.elkcellent_choice.description": "Tame an Elka Glimmer", + "advancements.antarchy.apple_of_my_eye.title": "Apple of my Eye", + "advancements.antarchy.apple_of_my_eye.description": "Tame an Apple Cow Glimmer", + "item.antarchy.dorrie_spawn_egg": "Dorrie Spawn Egg", "item.antarchy.flying_squirrel_spawn_egg": "Flying Squirrel Spawn Egg", "item.antarchy.caterpillar_spawn_egg": "Caterpillar Spawn Egg", "item.antarchy.butterfly_spawn_egg": "Butterfly Spawn Egg", @@ -383,6 +461,8 @@ "biome.antarchy.butterfly_fields": "Butterfly Fields", "biome.antarchy.torchflower_fields": "Torchflower Fields", "biome.antarchy.ouranwood_forest": "Ouranwood Forest", + "biome.antarchy.glimmering_pools": "Glimmering Pools", + "biome.antarchy.peach_forest": "Peach Forest", "biome.antarchy.fungal_ouranwood_forest": "Fungal Ouranwood Forest", "message.antarchy.brown_ant_activated": "The brown ant is ready to open its destination.", "message.antarchy.brown_ant_needs_reagent": "This brown ant needs a reagent before it can open its destination.", @@ -413,7 +493,6 @@ "effect.antarchy.paralyzed": "Paralyzed", "effect.antarchy.inverted": "Inverted", "effect.antarchy.stinky": "Stinky", - "effect.antarchy.glimmers_grace": "Glimmer's Grace", "effect.antarchy.shrinking": "Shrinking", "effect.antarchy.growth": "Growth", "effect.antarchy.bloodglass_ward": "Bloodglass Ward", @@ -723,6 +802,7 @@ "biome.antarchy.lucid_pools": "Lucid Pools", "biome.antarchy.dream_dunes": "Dream Dunes", "biome.antarchy.cloud_sea": "Cloud Sea", + "block.antarchy.wild_corn": "Wild Corn", "trim_material.antarchy.blood_crystal": "Blood Crystal", "trim_material.antarchy.nightmare_scale": "Nightmare Scale", "trim_material.antarchy.uranium": "Uranium", diff --git a/common/src/main/resources/assets/antarchy/models/block/big_bush_part.json b/common/src/main/resources/assets/antarchy/models/block/big_bush_part.json deleted file mode 100644 index 906b6240..00000000 --- a/common/src/main/resources/assets/antarchy/models/block/big_bush_part.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "textures": { - "particle": "antarchy:block/big_bush/big_bush_stage3" - } -} diff --git a/common/src/main/resources/assets/antarchy/models/block/big_bush_stage1.json b/common/src/main/resources/assets/antarchy/models/block/big_bush_stage1.json deleted file mode 100644 index dc28fa4f..00000000 --- a/common/src/main/resources/assets/antarchy/models/block/big_bush_stage1.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:block/tinted_cross", - "textures": { - "cross": "antarchy:block/big_bush/big_bush_stage1" - } -} diff --git a/common/src/main/resources/assets/antarchy/models/block/big_bush_stage2.json b/common/src/main/resources/assets/antarchy/models/block/big_bush_stage2.json deleted file mode 100644 index 05dd9750..00000000 --- a/common/src/main/resources/assets/antarchy/models/block/big_bush_stage2.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "ambientocclusion": false, - "textures": { - "particle": "antarchy:block/big_bush/big_bush_stage2", - "cross": "antarchy:block/big_bush/big_bush_stage2" - }, - "elements": [ - { - "from": [1.6, 0, 16], - "to": [30.4, 32, 16], - "rotation": { "origin": [16, 16, 16], "axis": "y", "angle": 45, "rescale": true }, - "shade": false, - "faces": { - "north": { "uv": [0, 0, 16, 16], "texture": "#cross", "tintindex": 0 }, - "south": { "uv": [0, 0, 16, 16], "texture": "#cross", "tintindex": 0 } - } - }, - { - "from": [16, 0, 1.6], - "to": [16, 32, 30.4], - "rotation": { "origin": [16, 16, 16], "axis": "y", "angle": 45, "rescale": true }, - "shade": false, - "faces": { - "west": { "uv": [0, 0, 16, 16], "texture": "#cross", "tintindex": 0 }, - "east": { "uv": [0, 0, 16, 16], "texture": "#cross", "tintindex": 0 } - } - } - ] -} diff --git a/common/src/main/resources/assets/antarchy/models/block/big_bush_stage3_bottom.json b/common/src/main/resources/assets/antarchy/models/block/big_bush_stage3_bottom.json deleted file mode 100644 index ac5a27de..00000000 --- a/common/src/main/resources/assets/antarchy/models/block/big_bush_stage3_bottom.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "ambientocclusion": false, - "textures": { - "particle": "antarchy:block/big_bush/big_bush_stage3", - "cross": "antarchy:block/big_bush/big_bush_stage3" - }, - "elements": [ - { - "from": [-13.6, 0, 8], - "to": [29.6, 32, 8], - "rotation": { "origin": [8, 16, 8], "axis": "y", "angle": 45, "rescale": true }, - "shade": false, - "faces": { - "north": { "uv": [0, 5.3333, 16, 16], "texture": "#cross", "tintindex": 0 }, - "south": { "uv": [0, 5.3333, 16, 16], "texture": "#cross", "tintindex": 0 } - } - }, - { - "from": [8, 0, -13.6], - "to": [8, 32, 29.6], - "rotation": { "origin": [8, 16, 8], "axis": "y", "angle": 45, "rescale": true }, - "shade": false, - "faces": { - "west": { "uv": [0, 5.3333, 16, 16], "texture": "#cross", "tintindex": 0 }, - "east": { "uv": [0, 5.3333, 16, 16], "texture": "#cross", "tintindex": 0 } - } - } - ] -} diff --git a/common/src/main/resources/assets/antarchy/models/block/big_bush_stage3_top.json b/common/src/main/resources/assets/antarchy/models/block/big_bush_stage3_top.json deleted file mode 100644 index fb49b817..00000000 --- a/common/src/main/resources/assets/antarchy/models/block/big_bush_stage3_top.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "ambientocclusion": false, - "textures": { - "particle": "antarchy:block/big_bush/big_bush_stage3", - "cross": "antarchy:block/big_bush/big_bush_stage3" - }, - "elements": [ - { - "from": [-13.6, 0, 8], - "to": [29.6, 16, 8], - "rotation": { "origin": [8, 8, 8], "axis": "y", "angle": 45, "rescale": true }, - "shade": false, - "faces": { - "north": { "uv": [0, 0, 16, 5.3333], "texture": "#cross", "tintindex": 0 }, - "south": { "uv": [0, 0, 16, 5.3333], "texture": "#cross", "tintindex": 0 } - } - }, - { - "from": [8, 0, -13.6], - "to": [8, 16, 29.6], - "rotation": { "origin": [8, 8, 8], "axis": "y", "angle": 45, "rescale": true }, - "shade": false, - "faces": { - "west": { "uv": [0, 0, 16, 5.3333], "texture": "#cross", "tintindex": 0 }, - "east": { "uv": [0, 0, 16, 5.3333], "texture": "#cross", "tintindex": 0 } - } - } - ] -} diff --git a/common/src/main/resources/assets/antarchy/models/block/blush_moss_block.json b/common/src/main/resources/assets/antarchy/models/block/blush_moss_block.json new file mode 100644 index 00000000..df917fb8 --- /dev/null +++ b/common/src/main/resources/assets/antarchy/models/block/blush_moss_block.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "antarchy:block/blush_moss/blush_moss_block" + } +} diff --git a/common/src/main/resources/assets/antarchy/models/block/blush_moss_carpet.json b/common/src/main/resources/assets/antarchy/models/block/blush_moss_carpet.json new file mode 100644 index 00000000..d5f159f3 --- /dev/null +++ b/common/src/main/resources/assets/antarchy/models/block/blush_moss_carpet.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/carpet", + "textures": { + "wool": "antarchy:block/blush_moss/blush_moss_carpet" + } +} diff --git a/common/src/main/resources/assets/antarchy/models/block/blush_moss_carpet_side_small.json b/common/src/main/resources/assets/antarchy/models/block/blush_moss_carpet_side_small.json new file mode 100644 index 00000000..993f37b4 --- /dev/null +++ b/common/src/main/resources/assets/antarchy/models/block/blush_moss_carpet_side_small.json @@ -0,0 +1,18 @@ +{ + "ambientocclusion": true, + "textures": { + "particle": "#side", + "side": "antarchy:block/blush_moss/blush_moss_carpet" + }, + "elements": [ + { + "from": [0, 0, 0.1], + "to": [16, 6, 0.1], + "shade": true, + "faces": { + "north": {"uv": [16, 0, 0, 6], "texture": "#side"}, + "south": {"uv": [0, 0, 16, 6], "texture": "#side"} + } + } + ] +} diff --git a/common/src/main/resources/assets/antarchy/models/block/blush_moss_carpet_side_tall.json b/common/src/main/resources/assets/antarchy/models/block/blush_moss_carpet_side_tall.json new file mode 100644 index 00000000..533a670a --- /dev/null +++ b/common/src/main/resources/assets/antarchy/models/block/blush_moss_carpet_side_tall.json @@ -0,0 +1,18 @@ +{ + "ambientocclusion": true, + "textures": { + "particle": "#side", + "side": "antarchy:block/blush_moss/blush_moss_carpet" + }, + "elements": [ + { + "from": [0, 0, 0.1], + "to": [16, 16, 0.1], + "shade": true, + "faces": { + "north": {"uv": [16, 0, 0, 16], "texture": "#side"}, + "south": {"uv": [0, 0, 16, 16], "texture": "#side"} + } + } + ] +} diff --git a/common/src/main/resources/assets/antarchy/models/block/torchflower_bush_bottom.json b/common/src/main/resources/assets/antarchy/models/block/corn_crop_stage_0.json similarity index 53% rename from common/src/main/resources/assets/antarchy/models/block/torchflower_bush_bottom.json rename to common/src/main/resources/assets/antarchy/models/block/corn_crop_stage_0.json index b39440d2..7c935ae4 100644 --- a/common/src/main/resources/assets/antarchy/models/block/torchflower_bush_bottom.json +++ b/common/src/main/resources/assets/antarchy/models/block/corn_crop_stage_0.json @@ -1,6 +1,6 @@ { "parent": "minecraft:block/cross", "textures": { - "cross": "antarchy:block/torchflower_bush_bottom" + "cross": "antarchy:block/corn/corn_crop_stage_0" } } diff --git a/common/src/main/resources/assets/antarchy/models/block/ouranwood_vine.json b/common/src/main/resources/assets/antarchy/models/block/corn_crop_stage_1.json similarity index 52% rename from common/src/main/resources/assets/antarchy/models/block/ouranwood_vine.json rename to common/src/main/resources/assets/antarchy/models/block/corn_crop_stage_1.json index dcfef446..c7a8fbfc 100644 --- a/common/src/main/resources/assets/antarchy/models/block/ouranwood_vine.json +++ b/common/src/main/resources/assets/antarchy/models/block/corn_crop_stage_1.json @@ -1,6 +1,6 @@ { "parent": "minecraft:block/cross", "textures": { - "cross": "antarchy:block/ouranwood/ouranwood_vine" + "cross": "antarchy:block/corn/corn_crop_stage_1" } } diff --git a/common/src/main/resources/assets/antarchy/models/block/ouranwood_vine_plant.json b/common/src/main/resources/assets/antarchy/models/block/corn_crop_stage_2_bottom.json similarity index 50% rename from common/src/main/resources/assets/antarchy/models/block/ouranwood_vine_plant.json rename to common/src/main/resources/assets/antarchy/models/block/corn_crop_stage_2_bottom.json index e5543ea7..cb9cdbd2 100644 --- a/common/src/main/resources/assets/antarchy/models/block/ouranwood_vine_plant.json +++ b/common/src/main/resources/assets/antarchy/models/block/corn_crop_stage_2_bottom.json @@ -1,6 +1,6 @@ { "parent": "minecraft:block/cross", "textures": { - "cross": "antarchy:block/ouranwood/ouranwood_vine_plant" + "cross": "antarchy:block/corn/corn_crop_stage_2_bottom" } } diff --git a/common/src/main/resources/assets/antarchy/models/block/corn_crop_stage_2_top.json b/common/src/main/resources/assets/antarchy/models/block/corn_crop_stage_2_top.json new file mode 100644 index 00000000..ada37860 --- /dev/null +++ b/common/src/main/resources/assets/antarchy/models/block/corn_crop_stage_2_top.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cross", + "textures": { + "cross": "antarchy:block/corn/corn_crop_stage_2_top" + } +} diff --git a/common/src/main/resources/assets/antarchy/models/block/corn_crop_stage_3_bottom.json b/common/src/main/resources/assets/antarchy/models/block/corn_crop_stage_3_bottom.json new file mode 100644 index 00000000..a2148ba9 --- /dev/null +++ b/common/src/main/resources/assets/antarchy/models/block/corn_crop_stage_3_bottom.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cross", + "textures": { + "cross": "antarchy:block/corn/corn_crop_stage_3_bottom" + } +} diff --git a/common/src/main/resources/assets/antarchy/models/block/corn_crop_stage_3_top.json b/common/src/main/resources/assets/antarchy/models/block/corn_crop_stage_3_top.json new file mode 100644 index 00000000..d38872f2 --- /dev/null +++ b/common/src/main/resources/assets/antarchy/models/block/corn_crop_stage_3_top.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cross", + "textures": { + "cross": "antarchy:block/corn/corn_crop_stage_3_top" + } +} diff --git a/common/src/main/resources/assets/antarchy/models/block/torchflower_bush_top.json b/common/src/main/resources/assets/antarchy/models/block/hanging_peach.json similarity index 54% rename from common/src/main/resources/assets/antarchy/models/block/torchflower_bush_top.json rename to common/src/main/resources/assets/antarchy/models/block/hanging_peach.json index f50f0a28..240e552a 100644 --- a/common/src/main/resources/assets/antarchy/models/block/torchflower_bush_top.json +++ b/common/src/main/resources/assets/antarchy/models/block/hanging_peach.json @@ -1,6 +1,6 @@ { "parent": "minecraft:block/cross", "textures": { - "cross": "antarchy:block/torchflower_bush_top" + "cross": "antarchy:block/peach/peach_hanging" } } diff --git a/common/src/main/resources/assets/antarchy/models/block/lumen_froglight.json b/common/src/main/resources/assets/antarchy/models/block/lumen_froglight.json new file mode 100644 index 00000000..14e41e27 --- /dev/null +++ b/common/src/main/resources/assets/antarchy/models/block/lumen_froglight.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/cube_bottom_top", + "textures": { + "bottom": "antarchy:block/lumen_froglight_side", + "top": "antarchy:block/lumen_froglight_top", + "side": "antarchy:block/lumen_froglight_side" + } +} diff --git a/common/src/main/resources/assets/antarchy/models/item/big_bush.json b/common/src/main/resources/assets/antarchy/models/block/peach_button.json similarity index 57% rename from common/src/main/resources/assets/antarchy/models/item/big_bush.json rename to common/src/main/resources/assets/antarchy/models/block/peach_button.json index 0b62849a..77f042f7 100644 --- a/common/src/main/resources/assets/antarchy/models/item/big_bush.json +++ b/common/src/main/resources/assets/antarchy/models/block/peach_button.json @@ -1,6 +1,7 @@ { - "parent": "minecraft:item/generated", + "parent": "minecraft:block/jungle_button", "textures": { - "layer0": "antarchy:block/big_bush/big_bush_stage1" + "texture": "antarchy:block/peach/peach_planks" } } + diff --git a/common/src/main/resources/assets/antarchy/models/block/peach_button_inventory.json b/common/src/main/resources/assets/antarchy/models/block/peach_button_inventory.json new file mode 100644 index 00000000..c2a473ed --- /dev/null +++ b/common/src/main/resources/assets/antarchy/models/block/peach_button_inventory.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/jungle_button_inventory", + "textures": { + "texture": "antarchy:block/peach/peach_planks" + } +} + diff --git a/common/src/main/resources/assets/antarchy/models/block/peach_button_pressed.json b/common/src/main/resources/assets/antarchy/models/block/peach_button_pressed.json new file mode 100644 index 00000000..886dde0f --- /dev/null +++ b/common/src/main/resources/assets/antarchy/models/block/peach_button_pressed.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/jungle_button_pressed", + "textures": { + "texture": "antarchy:block/peach/peach_planks" + } +} + diff --git a/common/src/main/resources/assets/antarchy/models/block/peach_door_bottom_left.json b/common/src/main/resources/assets/antarchy/models/block/peach_door_bottom_left.json new file mode 100644 index 00000000..6750e6ce --- /dev/null +++ b/common/src/main/resources/assets/antarchy/models/block/peach_door_bottom_left.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/jungle_door_bottom_left", + "textures": { + "bottom": "antarchy:block/peach/peach_door_bottom", + "top": "antarchy:block/peach/peach_door_top" + } +} + diff --git a/common/src/main/resources/assets/antarchy/models/block/peach_door_bottom_left_open.json b/common/src/main/resources/assets/antarchy/models/block/peach_door_bottom_left_open.json new file mode 100644 index 00000000..79bf6df4 --- /dev/null +++ b/common/src/main/resources/assets/antarchy/models/block/peach_door_bottom_left_open.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/jungle_door_bottom_left_open", + "textures": { + "bottom": "antarchy:block/peach/peach_door_bottom", + "top": "antarchy:block/peach/peach_door_top" + } +} + diff --git a/common/src/main/resources/assets/antarchy/models/block/peach_door_bottom_right.json b/common/src/main/resources/assets/antarchy/models/block/peach_door_bottom_right.json new file mode 100644 index 00000000..ecc2ea76 --- /dev/null +++ b/common/src/main/resources/assets/antarchy/models/block/peach_door_bottom_right.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/jungle_door_bottom_right", + "textures": { + "bottom": "antarchy:block/peach/peach_door_bottom", + "top": "antarchy:block/peach/peach_door_top" + } +} + diff --git a/common/src/main/resources/assets/antarchy/models/block/peach_door_bottom_right_open.json b/common/src/main/resources/assets/antarchy/models/block/peach_door_bottom_right_open.json new file mode 100644 index 00000000..1c9317d4 --- /dev/null +++ b/common/src/main/resources/assets/antarchy/models/block/peach_door_bottom_right_open.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/jungle_door_bottom_right_open", + "textures": { + "bottom": "antarchy:block/peach/peach_door_bottom", + "top": "antarchy:block/peach/peach_door_top" + } +} + diff --git a/common/src/main/resources/assets/antarchy/models/block/peach_door_top_left.json b/common/src/main/resources/assets/antarchy/models/block/peach_door_top_left.json new file mode 100644 index 00000000..77956de2 --- /dev/null +++ b/common/src/main/resources/assets/antarchy/models/block/peach_door_top_left.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/jungle_door_top_left", + "textures": { + "bottom": "antarchy:block/peach/peach_door_bottom", + "top": "antarchy:block/peach/peach_door_top" + } +} + diff --git a/common/src/main/resources/assets/antarchy/models/block/peach_door_top_left_open.json b/common/src/main/resources/assets/antarchy/models/block/peach_door_top_left_open.json new file mode 100644 index 00000000..ad865d33 --- /dev/null +++ b/common/src/main/resources/assets/antarchy/models/block/peach_door_top_left_open.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/jungle_door_top_left_open", + "textures": { + "bottom": "antarchy:block/peach/peach_door_bottom", + "top": "antarchy:block/peach/peach_door_top" + } +} + diff --git a/common/src/main/resources/assets/antarchy/models/block/peach_door_top_right.json b/common/src/main/resources/assets/antarchy/models/block/peach_door_top_right.json new file mode 100644 index 00000000..3a5d342f --- /dev/null +++ b/common/src/main/resources/assets/antarchy/models/block/peach_door_top_right.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/jungle_door_top_right", + "textures": { + "bottom": "antarchy:block/peach/peach_door_bottom", + "top": "antarchy:block/peach/peach_door_top" + } +} + diff --git a/common/src/main/resources/assets/antarchy/models/block/peach_door_top_right_open.json b/common/src/main/resources/assets/antarchy/models/block/peach_door_top_right_open.json new file mode 100644 index 00000000..a3772f2c --- /dev/null +++ b/common/src/main/resources/assets/antarchy/models/block/peach_door_top_right_open.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/jungle_door_top_right_open", + "textures": { + "bottom": "antarchy:block/peach/peach_door_bottom", + "top": "antarchy:block/peach/peach_door_top" + } +} + diff --git a/common/src/main/resources/assets/antarchy/models/block/peach_fence_gate.json b/common/src/main/resources/assets/antarchy/models/block/peach_fence_gate.json new file mode 100644 index 00000000..0e6d3ad5 --- /dev/null +++ b/common/src/main/resources/assets/antarchy/models/block/peach_fence_gate.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/jungle_fence_gate", + "textures": { + "texture": "antarchy:block/peach/peach_planks" + } +} + diff --git a/common/src/main/resources/assets/antarchy/models/block/peach_fence_gate_open.json b/common/src/main/resources/assets/antarchy/models/block/peach_fence_gate_open.json new file mode 100644 index 00000000..7e9432ad --- /dev/null +++ b/common/src/main/resources/assets/antarchy/models/block/peach_fence_gate_open.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/jungle_fence_gate_open", + "textures": { + "texture": "antarchy:block/peach/peach_planks" + } +} + diff --git a/common/src/main/resources/assets/antarchy/models/block/peach_fence_gate_wall.json b/common/src/main/resources/assets/antarchy/models/block/peach_fence_gate_wall.json new file mode 100644 index 00000000..296b5a69 --- /dev/null +++ b/common/src/main/resources/assets/antarchy/models/block/peach_fence_gate_wall.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/jungle_fence_gate_wall", + "textures": { + "texture": "antarchy:block/peach/peach_planks" + } +} + diff --git a/common/src/main/resources/assets/antarchy/models/block/peach_fence_gate_wall_open.json b/common/src/main/resources/assets/antarchy/models/block/peach_fence_gate_wall_open.json new file mode 100644 index 00000000..8bd8170c --- /dev/null +++ b/common/src/main/resources/assets/antarchy/models/block/peach_fence_gate_wall_open.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/jungle_fence_gate_wall_open", + "textures": { + "texture": "antarchy:block/peach/peach_planks" + } +} + diff --git a/common/src/main/resources/assets/antarchy/models/block/peach_fence_inventory.json b/common/src/main/resources/assets/antarchy/models/block/peach_fence_inventory.json new file mode 100644 index 00000000..318d6270 --- /dev/null +++ b/common/src/main/resources/assets/antarchy/models/block/peach_fence_inventory.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/jungle_fence_inventory", + "textures": { + "texture": "antarchy:block/peach/peach_planks" + } +} + diff --git a/common/src/main/resources/assets/antarchy/models/block/peach_fence_post.json b/common/src/main/resources/assets/antarchy/models/block/peach_fence_post.json new file mode 100644 index 00000000..72b4d302 --- /dev/null +++ b/common/src/main/resources/assets/antarchy/models/block/peach_fence_post.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/jungle_fence_post", + "textures": { + "texture": "antarchy:block/peach/peach_planks" + } +} + diff --git a/common/src/main/resources/assets/antarchy/models/block/peach_fence_side.json b/common/src/main/resources/assets/antarchy/models/block/peach_fence_side.json new file mode 100644 index 00000000..9ee46975 --- /dev/null +++ b/common/src/main/resources/assets/antarchy/models/block/peach_fence_side.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/jungle_fence_side", + "textures": { + "texture": "antarchy:block/peach/peach_planks" + } +} + diff --git a/common/src/main/resources/assets/antarchy/models/block/peach_leaves.json b/common/src/main/resources/assets/antarchy/models/block/peach_leaves.json new file mode 100644 index 00000000..4b357a8e --- /dev/null +++ b/common/src/main/resources/assets/antarchy/models/block/peach_leaves.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "antarchy:block/peach/peach_leaves" + } +} + diff --git a/common/src/main/resources/assets/antarchy/models/block/peach_log.json b/common/src/main/resources/assets/antarchy/models/block/peach_log.json new file mode 100644 index 00000000..c20762cc --- /dev/null +++ b/common/src/main/resources/assets/antarchy/models/block/peach_log.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/jungle_log", + "textures": { + "end": "antarchy:block/peach/peach_log_top", + "side": "antarchy:block/peach/peach_log" + } +} + diff --git a/common/src/main/resources/assets/antarchy/models/block/peach_log_horizontal.json b/common/src/main/resources/assets/antarchy/models/block/peach_log_horizontal.json new file mode 100644 index 00000000..2d279990 --- /dev/null +++ b/common/src/main/resources/assets/antarchy/models/block/peach_log_horizontal.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/jungle_log_horizontal", + "textures": { + "end": "antarchy:block/peach/peach_log_top", + "side": "antarchy:block/peach/peach_log" + } +} + diff --git a/common/src/main/resources/assets/antarchy/models/block/peach_planks.json b/common/src/main/resources/assets/antarchy/models/block/peach_planks.json new file mode 100644 index 00000000..db7c1f01 --- /dev/null +++ b/common/src/main/resources/assets/antarchy/models/block/peach_planks.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "antarchy:block/peach/peach_planks" + } +} + diff --git a/common/src/main/resources/assets/antarchy/models/block/peach_pressure_plate.json b/common/src/main/resources/assets/antarchy/models/block/peach_pressure_plate.json new file mode 100644 index 00000000..fe224f3f --- /dev/null +++ b/common/src/main/resources/assets/antarchy/models/block/peach_pressure_plate.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/jungle_pressure_plate", + "textures": { + "texture": "antarchy:block/peach/peach_planks" + } +} + diff --git a/common/src/main/resources/assets/antarchy/models/block/peach_pressure_plate_down.json b/common/src/main/resources/assets/antarchy/models/block/peach_pressure_plate_down.json new file mode 100644 index 00000000..2af87b5f --- /dev/null +++ b/common/src/main/resources/assets/antarchy/models/block/peach_pressure_plate_down.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/jungle_pressure_plate_down", + "textures": { + "texture": "antarchy:block/peach/peach_planks" + } +} + diff --git a/common/src/main/resources/assets/antarchy/models/block/peach_sapling.json b/common/src/main/resources/assets/antarchy/models/block/peach_sapling.json new file mode 100644 index 00000000..11f97b6f --- /dev/null +++ b/common/src/main/resources/assets/antarchy/models/block/peach_sapling.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cross", + "textures": { + "cross": "antarchy:block/peach/peach_sapling" + } +} diff --git a/common/src/main/resources/assets/antarchy/models/block/peach_slab.json b/common/src/main/resources/assets/antarchy/models/block/peach_slab.json new file mode 100644 index 00000000..81588d4d --- /dev/null +++ b/common/src/main/resources/assets/antarchy/models/block/peach_slab.json @@ -0,0 +1,9 @@ +{ + "parent": "minecraft:block/jungle_slab", + "textures": { + "bottom": "antarchy:block/peach/peach_planks", + "side": "antarchy:block/peach/peach_planks", + "top": "antarchy:block/peach/peach_planks" + } +} + diff --git a/common/src/main/resources/assets/antarchy/models/block/peach_slab_top.json b/common/src/main/resources/assets/antarchy/models/block/peach_slab_top.json new file mode 100644 index 00000000..01ee38e4 --- /dev/null +++ b/common/src/main/resources/assets/antarchy/models/block/peach_slab_top.json @@ -0,0 +1,9 @@ +{ + "parent": "minecraft:block/jungle_slab_top", + "textures": { + "bottom": "antarchy:block/peach/peach_planks", + "side": "antarchy:block/peach/peach_planks", + "top": "antarchy:block/peach/peach_planks" + } +} + diff --git a/common/src/main/resources/assets/antarchy/models/block/peach_stairs.json b/common/src/main/resources/assets/antarchy/models/block/peach_stairs.json new file mode 100644 index 00000000..d4a28a68 --- /dev/null +++ b/common/src/main/resources/assets/antarchy/models/block/peach_stairs.json @@ -0,0 +1,9 @@ +{ + "parent": "minecraft:block/jungle_stairs", + "textures": { + "bottom": "antarchy:block/peach/peach_planks", + "side": "antarchy:block/peach/peach_planks", + "top": "antarchy:block/peach/peach_planks" + } +} + diff --git a/common/src/main/resources/assets/antarchy/models/block/peach_stairs_inner.json b/common/src/main/resources/assets/antarchy/models/block/peach_stairs_inner.json new file mode 100644 index 00000000..843cafd6 --- /dev/null +++ b/common/src/main/resources/assets/antarchy/models/block/peach_stairs_inner.json @@ -0,0 +1,9 @@ +{ + "parent": "minecraft:block/jungle_stairs_inner", + "textures": { + "bottom": "antarchy:block/peach/peach_planks", + "side": "antarchy:block/peach/peach_planks", + "top": "antarchy:block/peach/peach_planks" + } +} + diff --git a/common/src/main/resources/assets/antarchy/models/block/peach_stairs_outer.json b/common/src/main/resources/assets/antarchy/models/block/peach_stairs_outer.json new file mode 100644 index 00000000..545c33ba --- /dev/null +++ b/common/src/main/resources/assets/antarchy/models/block/peach_stairs_outer.json @@ -0,0 +1,9 @@ +{ + "parent": "minecraft:block/jungle_stairs_outer", + "textures": { + "bottom": "antarchy:block/peach/peach_planks", + "side": "antarchy:block/peach/peach_planks", + "top": "antarchy:block/peach/peach_planks" + } +} + diff --git a/common/src/main/resources/assets/antarchy/models/block/peach_trapdoor_bottom.json b/common/src/main/resources/assets/antarchy/models/block/peach_trapdoor_bottom.json new file mode 100644 index 00000000..17f6d21a --- /dev/null +++ b/common/src/main/resources/assets/antarchy/models/block/peach_trapdoor_bottom.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/jungle_trapdoor_bottom", + "textures": { + "texture": "antarchy:block/peach/peach_trapdoor" + } +} + diff --git a/common/src/main/resources/assets/antarchy/models/block/peach_trapdoor_open.json b/common/src/main/resources/assets/antarchy/models/block/peach_trapdoor_open.json new file mode 100644 index 00000000..d29de2f6 --- /dev/null +++ b/common/src/main/resources/assets/antarchy/models/block/peach_trapdoor_open.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/jungle_trapdoor_open", + "textures": { + "texture": "antarchy:block/peach/peach_trapdoor" + } +} + diff --git a/common/src/main/resources/assets/antarchy/models/block/peach_trapdoor_top.json b/common/src/main/resources/assets/antarchy/models/block/peach_trapdoor_top.json new file mode 100644 index 00000000..822ea421 --- /dev/null +++ b/common/src/main/resources/assets/antarchy/models/block/peach_trapdoor_top.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/jungle_trapdoor_top", + "textures": { + "texture": "antarchy:block/peach/peach_trapdoor" + } +} + diff --git a/common/src/main/resources/assets/antarchy/models/block/peach_wood.json b/common/src/main/resources/assets/antarchy/models/block/peach_wood.json new file mode 100644 index 00000000..092ff7fc --- /dev/null +++ b/common/src/main/resources/assets/antarchy/models/block/peach_wood.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/jungle_wood", + "textures": { + "end": "antarchy:block/peach/peach_log", + "side": "antarchy:block/peach/peach_log" + } +} + diff --git a/common/src/main/resources/assets/antarchy/models/block/red_ant_nest.json b/common/src/main/resources/assets/antarchy/models/block/red_ant_nest.json index b8200917..178432bd 100644 --- a/common/src/main/resources/assets/antarchy/models/block/red_ant_nest.json +++ b/common/src/main/resources/assets/antarchy/models/block/red_ant_nest.json @@ -1,12 +1,12 @@ { "parent": "minecraft:block/cube", "textures": { - "particle": "minecraft:block/magma", + "particle": "antarchy:block/red_ant_nest/red_ant_nest_side", "down": "minecraft:block/magma", - "up": "antarchy:block/red_ant_nest_top", - "north": "minecraft:block/magma", - "south": "minecraft:block/magma", - "west": "minecraft:block/magma", - "east": "minecraft:block/magma" + "up": "antarchy:block/red_ant_nest/red_ant_nest_top", + "north": "antarchy:block/red_ant_nest/red_ant_nest_side", + "south": "antarchy:block/red_ant_nest/red_ant_nest_side", + "west": "antarchy:block/red_ant_nest/red_ant_nest_side", + "east": "antarchy:block/red_ant_nest/red_ant_nest_side" } } diff --git a/common/src/main/resources/assets/antarchy/models/block/roseate_froglight.json b/common/src/main/resources/assets/antarchy/models/block/roseate_froglight.json new file mode 100644 index 00000000..116f3137 --- /dev/null +++ b/common/src/main/resources/assets/antarchy/models/block/roseate_froglight.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/cube_bottom_top", + "textures": { + "bottom": "antarchy:block/roseate_froglight_side", + "top": "antarchy:block/roseate_froglight_top", + "side": "antarchy:block/roseate_froglight_side" + } +} diff --git a/common/src/main/resources/assets/antarchy/models/block/stripped_peach_log.json b/common/src/main/resources/assets/antarchy/models/block/stripped_peach_log.json new file mode 100644 index 00000000..b0ade65e --- /dev/null +++ b/common/src/main/resources/assets/antarchy/models/block/stripped_peach_log.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/stripped_jungle_log", + "textures": { + "end": "antarchy:block/peach/stripped_peach_log_top", + "side": "antarchy:block/peach/stripped_peach_log" + } +} + diff --git a/common/src/main/resources/assets/antarchy/models/block/stripped_peach_log_horizontal.json b/common/src/main/resources/assets/antarchy/models/block/stripped_peach_log_horizontal.json new file mode 100644 index 00000000..98b68ebf --- /dev/null +++ b/common/src/main/resources/assets/antarchy/models/block/stripped_peach_log_horizontal.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/stripped_jungle_log_horizontal", + "textures": { + "end": "antarchy:block/peach/stripped_peach_log_top", + "side": "antarchy:block/peach/stripped_peach_log" + } +} + diff --git a/common/src/main/resources/assets/antarchy/models/block/stripped_peach_wood.json b/common/src/main/resources/assets/antarchy/models/block/stripped_peach_wood.json new file mode 100644 index 00000000..03406fca --- /dev/null +++ b/common/src/main/resources/assets/antarchy/models/block/stripped_peach_wood.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/stripped_jungle_wood", + "textures": { + "end": "antarchy:block/peach/stripped_peach_log", + "side": "antarchy:block/peach/stripped_peach_log" + } +} + diff --git a/common/src/main/resources/assets/antarchy/models/block/umbral_moss_carpet_side_small.json b/common/src/main/resources/assets/antarchy/models/block/umbral_moss_carpet_side_small.json index e943626d..7ab3586f 100644 --- a/common/src/main/resources/assets/antarchy/models/block/umbral_moss_carpet_side_small.json +++ b/common/src/main/resources/assets/antarchy/models/block/umbral_moss_carpet_side_small.json @@ -1,6 +1,18 @@ { - "parent": "minecraft:block/mossy_carpet_side", + "ambientocclusion": true, "textures": { + "particle": "#side", "side": "antarchy:block/umbral_moss/umbral_moss_carpet_side_small" - } + }, + "elements": [ + { + "from": [0, 0, 0.1], + "to": [16, 6, 0.1], + "shade": true, + "faces": { + "north": {"uv": [16, 0, 0, 6], "texture": "#side"}, + "south": {"uv": [0, 0, 16, 6], "texture": "#side"} + } + } + ] } diff --git a/common/src/main/resources/assets/antarchy/models/block/very_short_grass.json b/common/src/main/resources/assets/antarchy/models/block/very_short_grass.json deleted file mode 100644 index c1f1d394..00000000 --- a/common/src/main/resources/assets/antarchy/models/block/very_short_grass.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:block/tinted_cross", - "textures": { - "cross": "antarchy:block/very_short_grass" - } -} diff --git a/common/src/main/resources/assets/antarchy/models/block/very_tall_grass_bottom.json b/common/src/main/resources/assets/antarchy/models/block/very_tall_grass_bottom.json deleted file mode 100644 index c571f76e..00000000 --- a/common/src/main/resources/assets/antarchy/models/block/very_tall_grass_bottom.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:block/tinted_cross", - "textures": { - "cross": "antarchy:block/very_tall_grass/very_tall_grass_bottom" - } -} diff --git a/common/src/main/resources/assets/antarchy/models/block/very_tall_grass_middle.json b/common/src/main/resources/assets/antarchy/models/block/very_tall_grass_middle.json deleted file mode 100644 index 5854e53a..00000000 --- a/common/src/main/resources/assets/antarchy/models/block/very_tall_grass_middle.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:block/tinted_cross", - "textures": { - "cross": "antarchy:block/very_tall_grass/very_tall_grass_middle" - } -} diff --git a/common/src/main/resources/assets/antarchy/models/block/very_tall_grass_top.json b/common/src/main/resources/assets/antarchy/models/block/very_tall_grass_top.json deleted file mode 100644 index 44d2ee41..00000000 --- a/common/src/main/resources/assets/antarchy/models/block/very_tall_grass_top.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:block/tinted_cross", - "textures": { - "cross": "antarchy:block/very_tall_grass/very_tall_grass_top" - } -} diff --git a/common/src/main/resources/assets/antarchy/models/item/blush_moss_block.json b/common/src/main/resources/assets/antarchy/models/item/blush_moss_block.json new file mode 100644 index 00000000..2d078db7 --- /dev/null +++ b/common/src/main/resources/assets/antarchy/models/item/blush_moss_block.json @@ -0,0 +1,3 @@ +{ + "parent": "antarchy:block/blush_moss_block" +} diff --git a/common/src/main/resources/assets/antarchy/models/item/blush_moss_carpet.json b/common/src/main/resources/assets/antarchy/models/item/blush_moss_carpet.json new file mode 100644 index 00000000..3a315ab2 --- /dev/null +++ b/common/src/main/resources/assets/antarchy/models/item/blush_moss_carpet.json @@ -0,0 +1,3 @@ +{ + "parent": "antarchy:block/blush_moss_carpet" +} diff --git a/common/src/main/resources/assets/antarchy/models/item/very_short_grass.json b/common/src/main/resources/assets/antarchy/models/item/cooked_corndog.json similarity index 57% rename from common/src/main/resources/assets/antarchy/models/item/very_short_grass.json rename to common/src/main/resources/assets/antarchy/models/item/cooked_corndog.json index 0929ced1..1cea5262 100644 --- a/common/src/main/resources/assets/antarchy/models/item/very_short_grass.json +++ b/common/src/main/resources/assets/antarchy/models/item/cooked_corndog.json @@ -1,6 +1,6 @@ { "parent": "minecraft:item/generated", "textures": { - "layer0": "antarchy:block/very_short_grass" + "layer0": "antarchy:item/cooked_corndog" } } diff --git a/common/src/main/resources/assets/antarchy/models/item/torchflower_bush.json b/common/src/main/resources/assets/antarchy/models/item/cooked_venison.json similarity index 55% rename from common/src/main/resources/assets/antarchy/models/item/torchflower_bush.json rename to common/src/main/resources/assets/antarchy/models/item/cooked_venison.json index ed844f3a..de553e83 100644 --- a/common/src/main/resources/assets/antarchy/models/item/torchflower_bush.json +++ b/common/src/main/resources/assets/antarchy/models/item/cooked_venison.json @@ -1,6 +1,6 @@ { "parent": "minecraft:item/generated", "textures": { - "layer0": "antarchy:block/torchflower_bush_top" + "layer0": "antarchy:item/cooked_venison" } } diff --git a/common/src/main/resources/assets/antarchy/models/item/ouranwood_vine.json b/common/src/main/resources/assets/antarchy/models/item/corn.json similarity index 53% rename from common/src/main/resources/assets/antarchy/models/item/ouranwood_vine.json rename to common/src/main/resources/assets/antarchy/models/item/corn.json index dbd3bb74..c8ff373d 100644 --- a/common/src/main/resources/assets/antarchy/models/item/ouranwood_vine.json +++ b/common/src/main/resources/assets/antarchy/models/item/corn.json @@ -1,6 +1,6 @@ { "parent": "minecraft:item/generated", "textures": { - "layer0": "antarchy:block/ouranwood/ouranwood_vine" + "layer0": "antarchy:item/corn" } } diff --git a/common/src/main/resources/assets/antarchy/models/item/corn_seeds.json b/common/src/main/resources/assets/antarchy/models/item/corn_seeds.json new file mode 100644 index 00000000..20bee2b7 --- /dev/null +++ b/common/src/main/resources/assets/antarchy/models/item/corn_seeds.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "antarchy:item/corn_seeds" + } +} diff --git a/common/src/main/resources/assets/antarchy/models/item/elka_spawn_egg.json b/common/src/main/resources/assets/antarchy/models/item/elka_spawn_egg.json new file mode 100644 index 00000000..ddd15597 --- /dev/null +++ b/common/src/main/resources/assets/antarchy/models/item/elka_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} diff --git a/common/src/main/resources/assets/antarchy/models/item/glimmer_bottle.json b/common/src/main/resources/assets/antarchy/models/item/glimmer_bottle.json new file mode 100644 index 00000000..eb725288 --- /dev/null +++ b/common/src/main/resources/assets/antarchy/models/item/glimmer_bottle.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "antarchy:item/glimmer_bottle" + } +} diff --git a/common/src/main/resources/assets/antarchy/models/item/high_fructose_corn_syrup.json b/common/src/main/resources/assets/antarchy/models/item/high_fructose_corn_syrup.json new file mode 100644 index 00000000..b719b3f0 --- /dev/null +++ b/common/src/main/resources/assets/antarchy/models/item/high_fructose_corn_syrup.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "antarchy:item/high_fructose_corn_syrup" + } +} diff --git a/common/src/main/resources/assets/antarchy/models/item/lumen_froglight.json b/common/src/main/resources/assets/antarchy/models/item/lumen_froglight.json new file mode 100644 index 00000000..6ba41b3b --- /dev/null +++ b/common/src/main/resources/assets/antarchy/models/item/lumen_froglight.json @@ -0,0 +1,3 @@ +{ + "parent": "antarchy:block/lumen_froglight" +} diff --git a/common/src/main/resources/assets/antarchy/models/item/miners_dream.json b/common/src/main/resources/assets/antarchy/models/item/miners_dream.json new file mode 100644 index 00000000..c7a0f166 --- /dev/null +++ b/common/src/main/resources/assets/antarchy/models/item/miners_dream.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "antarchy:item/miners_dream" + } +} diff --git a/common/src/main/resources/assets/antarchy/models/item/ouranwood_deer_spawn_egg.json b/common/src/main/resources/assets/antarchy/models/item/ouranwood_deer_spawn_egg.json new file mode 100644 index 00000000..ddd15597 --- /dev/null +++ b/common/src/main/resources/assets/antarchy/models/item/ouranwood_deer_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} diff --git a/common/src/main/resources/assets/antarchy/models/item/peach.json b/common/src/main/resources/assets/antarchy/models/item/peach.json new file mode 100644 index 00000000..1f1914ef --- /dev/null +++ b/common/src/main/resources/assets/antarchy/models/item/peach.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "antarchy:item/peach" + } +} diff --git a/common/src/main/resources/assets/antarchy/models/item/peach_boat.json b/common/src/main/resources/assets/antarchy/models/item/peach_boat.json new file mode 100644 index 00000000..ce8a29a3 --- /dev/null +++ b/common/src/main/resources/assets/antarchy/models/item/peach_boat.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "antarchy:item/peach_boat" + } +} + diff --git a/common/src/main/resources/assets/antarchy/models/item/peach_button.json b/common/src/main/resources/assets/antarchy/models/item/peach_button.json new file mode 100644 index 00000000..b6539669 --- /dev/null +++ b/common/src/main/resources/assets/antarchy/models/item/peach_button.json @@ -0,0 +1,4 @@ +{ + "parent": "antarchy:block/peach_button_inventory" +} + diff --git a/common/src/main/resources/assets/antarchy/models/item/peach_chest_boat.json b/common/src/main/resources/assets/antarchy/models/item/peach_chest_boat.json new file mode 100644 index 00000000..4aa30319 --- /dev/null +++ b/common/src/main/resources/assets/antarchy/models/item/peach_chest_boat.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "antarchy:item/peach_chest_boat" + } +} + diff --git a/common/src/main/resources/assets/antarchy/models/item/peach_door.json b/common/src/main/resources/assets/antarchy/models/item/peach_door.json new file mode 100644 index 00000000..7f6da626 --- /dev/null +++ b/common/src/main/resources/assets/antarchy/models/item/peach_door.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "antarchy:item/peach_door_icon" + } +} + diff --git a/common/src/main/resources/assets/antarchy/models/item/peach_fence.json b/common/src/main/resources/assets/antarchy/models/item/peach_fence.json new file mode 100644 index 00000000..38f63661 --- /dev/null +++ b/common/src/main/resources/assets/antarchy/models/item/peach_fence.json @@ -0,0 +1,4 @@ +{ + "parent": "antarchy:block/peach_fence_inventory" +} + diff --git a/common/src/main/resources/assets/antarchy/models/item/peach_fence_gate.json b/common/src/main/resources/assets/antarchy/models/item/peach_fence_gate.json new file mode 100644 index 00000000..8601b7e8 --- /dev/null +++ b/common/src/main/resources/assets/antarchy/models/item/peach_fence_gate.json @@ -0,0 +1,4 @@ +{ + "parent": "antarchy:block/peach_fence_gate" +} + diff --git a/common/src/main/resources/assets/antarchy/models/item/peach_hanging_sign.json b/common/src/main/resources/assets/antarchy/models/item/peach_hanging_sign.json new file mode 100644 index 00000000..adc4be1f --- /dev/null +++ b/common/src/main/resources/assets/antarchy/models/item/peach_hanging_sign.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "antarchy:item/peach_hanging_sign" + } +} + diff --git a/common/src/main/resources/assets/antarchy/models/item/peach_leaves.json b/common/src/main/resources/assets/antarchy/models/item/peach_leaves.json new file mode 100644 index 00000000..bbadf8b9 --- /dev/null +++ b/common/src/main/resources/assets/antarchy/models/item/peach_leaves.json @@ -0,0 +1,4 @@ +{ + "parent": "antarchy:block/peach_leaves" +} + diff --git a/common/src/main/resources/assets/antarchy/models/item/peach_log.json b/common/src/main/resources/assets/antarchy/models/item/peach_log.json new file mode 100644 index 00000000..cc668db3 --- /dev/null +++ b/common/src/main/resources/assets/antarchy/models/item/peach_log.json @@ -0,0 +1,4 @@ +{ + "parent": "antarchy:block/peach_log" +} + diff --git a/common/src/main/resources/assets/antarchy/models/item/peach_planks.json b/common/src/main/resources/assets/antarchy/models/item/peach_planks.json new file mode 100644 index 00000000..712b1147 --- /dev/null +++ b/common/src/main/resources/assets/antarchy/models/item/peach_planks.json @@ -0,0 +1,4 @@ +{ + "parent": "antarchy:block/peach_planks" +} + diff --git a/common/src/main/resources/assets/antarchy/models/item/peach_pressure_plate.json b/common/src/main/resources/assets/antarchy/models/item/peach_pressure_plate.json new file mode 100644 index 00000000..0f392d10 --- /dev/null +++ b/common/src/main/resources/assets/antarchy/models/item/peach_pressure_plate.json @@ -0,0 +1,4 @@ +{ + "parent": "antarchy:block/peach_pressure_plate" +} + diff --git a/common/src/main/resources/assets/antarchy/models/item/peach_sapling.json b/common/src/main/resources/assets/antarchy/models/item/peach_sapling.json new file mode 100644 index 00000000..1aeac284 --- /dev/null +++ b/common/src/main/resources/assets/antarchy/models/item/peach_sapling.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "antarchy:block/peach/peach_sapling" + } +} diff --git a/common/src/main/resources/assets/antarchy/models/item/peach_sign.json b/common/src/main/resources/assets/antarchy/models/item/peach_sign.json new file mode 100644 index 00000000..977817ee --- /dev/null +++ b/common/src/main/resources/assets/antarchy/models/item/peach_sign.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "antarchy:item/peach_sign" + } +} + diff --git a/common/src/main/resources/assets/antarchy/models/item/peach_slab.json b/common/src/main/resources/assets/antarchy/models/item/peach_slab.json new file mode 100644 index 00000000..69cec5cf --- /dev/null +++ b/common/src/main/resources/assets/antarchy/models/item/peach_slab.json @@ -0,0 +1,4 @@ +{ + "parent": "antarchy:block/peach_slab" +} + diff --git a/common/src/main/resources/assets/antarchy/models/item/peach_stairs.json b/common/src/main/resources/assets/antarchy/models/item/peach_stairs.json new file mode 100644 index 00000000..da2ce419 --- /dev/null +++ b/common/src/main/resources/assets/antarchy/models/item/peach_stairs.json @@ -0,0 +1,4 @@ +{ + "parent": "antarchy:block/peach_stairs" +} + diff --git a/common/src/main/resources/assets/antarchy/models/item/peach_trapdoor.json b/common/src/main/resources/assets/antarchy/models/item/peach_trapdoor.json new file mode 100644 index 00000000..991cc7ab --- /dev/null +++ b/common/src/main/resources/assets/antarchy/models/item/peach_trapdoor.json @@ -0,0 +1,4 @@ +{ + "parent": "antarchy:block/peach_trapdoor_bottom" +} + diff --git a/common/src/main/resources/assets/antarchy/models/item/peach_wood.json b/common/src/main/resources/assets/antarchy/models/item/peach_wood.json new file mode 100644 index 00000000..e4b6c7c0 --- /dev/null +++ b/common/src/main/resources/assets/antarchy/models/item/peach_wood.json @@ -0,0 +1,4 @@ +{ + "parent": "antarchy:block/peach_wood" +} + diff --git a/common/src/main/resources/assets/antarchy/models/item/raw_corndog.json b/common/src/main/resources/assets/antarchy/models/item/raw_corndog.json new file mode 100644 index 00000000..837b733d --- /dev/null +++ b/common/src/main/resources/assets/antarchy/models/item/raw_corndog.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "antarchy:item/raw_corndog" + } +} diff --git a/common/src/main/resources/assets/antarchy/models/item/raw_venison.json b/common/src/main/resources/assets/antarchy/models/item/raw_venison.json new file mode 100644 index 00000000..7d4db7cd --- /dev/null +++ b/common/src/main/resources/assets/antarchy/models/item/raw_venison.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "antarchy:item/raw_venison" + } +} diff --git a/common/src/main/resources/assets/antarchy/models/item/root_beer.json b/common/src/main/resources/assets/antarchy/models/item/root_beer.json new file mode 100644 index 00000000..f02e8fba --- /dev/null +++ b/common/src/main/resources/assets/antarchy/models/item/root_beer.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "antarchy:item/root_beer" + } +} diff --git a/common/src/main/resources/assets/antarchy/models/item/roseate_froglight.json b/common/src/main/resources/assets/antarchy/models/item/roseate_froglight.json new file mode 100644 index 00000000..e9d680ab --- /dev/null +++ b/common/src/main/resources/assets/antarchy/models/item/roseate_froglight.json @@ -0,0 +1,3 @@ +{ + "parent": "antarchy:block/roseate_froglight" +} diff --git a/common/src/main/resources/assets/antarchy/models/item/spirit_apple.json b/common/src/main/resources/assets/antarchy/models/item/spirit_apple.json new file mode 100644 index 00000000..34602711 --- /dev/null +++ b/common/src/main/resources/assets/antarchy/models/item/spirit_apple.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "antarchy:item/spirit_apple" + } +} diff --git a/common/src/main/resources/assets/antarchy/models/item/stripped_peach_log.json b/common/src/main/resources/assets/antarchy/models/item/stripped_peach_log.json new file mode 100644 index 00000000..5ab747f0 --- /dev/null +++ b/common/src/main/resources/assets/antarchy/models/item/stripped_peach_log.json @@ -0,0 +1,4 @@ +{ + "parent": "antarchy:block/stripped_peach_log" +} + diff --git a/common/src/main/resources/assets/antarchy/models/item/stripped_peach_wood.json b/common/src/main/resources/assets/antarchy/models/item/stripped_peach_wood.json new file mode 100644 index 00000000..908f1210 --- /dev/null +++ b/common/src/main/resources/assets/antarchy/models/item/stripped_peach_wood.json @@ -0,0 +1,4 @@ +{ + "parent": "antarchy:block/stripped_peach_wood" +} + diff --git a/common/src/main/resources/assets/antarchy/models/item/very_tall_grass.json b/common/src/main/resources/assets/antarchy/models/item/very_tall_grass.json deleted file mode 100644 index 541bc2be..00000000 --- a/common/src/main/resources/assets/antarchy/models/item/very_tall_grass.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "antarchy:block/very_tall_grass/very_tall_grass_bottom" - } -} diff --git a/common/src/main/resources/assets/antarchy/particles/peach_leaves_particle.json b/common/src/main/resources/assets/antarchy/particles/peach_leaves_particle.json new file mode 100644 index 00000000..2c124f3e --- /dev/null +++ b/common/src/main/resources/assets/antarchy/particles/peach_leaves_particle.json @@ -0,0 +1,16 @@ +{ + "textures": [ + "antarchy:peach/peach_0", + "antarchy:peach/peach_1", + "antarchy:peach/peach_2", + "antarchy:peach/peach_3", + "antarchy:peach/peach_4", + "antarchy:peach/peach_5", + "antarchy:peach/peach_6", + "antarchy:peach/peach_7", + "antarchy:peach/peach_8", + "antarchy:peach/peach_9", + "antarchy:peach/peach_10", + "antarchy:peach/peach_11" + ] +} diff --git a/common/src/main/resources/assets/antarchy/textures/block/big_bush/big_bush_stage1.png b/common/src/main/resources/assets/antarchy/textures/block/big_bush/big_bush_stage1.png deleted file mode 100644 index 21da1087..00000000 Binary files a/common/src/main/resources/assets/antarchy/textures/block/big_bush/big_bush_stage1.png and /dev/null differ diff --git a/common/src/main/resources/assets/antarchy/textures/block/big_bush/big_bush_stage2.png b/common/src/main/resources/assets/antarchy/textures/block/big_bush/big_bush_stage2.png deleted file mode 100644 index eaecfc99..00000000 Binary files a/common/src/main/resources/assets/antarchy/textures/block/big_bush/big_bush_stage2.png and /dev/null differ diff --git a/common/src/main/resources/assets/antarchy/textures/block/big_bush/big_bush_stage3.png b/common/src/main/resources/assets/antarchy/textures/block/big_bush/big_bush_stage3.png deleted file mode 100644 index e4e92e5d..00000000 Binary files a/common/src/main/resources/assets/antarchy/textures/block/big_bush/big_bush_stage3.png and /dev/null differ diff --git a/common/src/main/resources/assets/antarchy/textures/block/bile/bile_vein.png b/common/src/main/resources/assets/antarchy/textures/block/bile/bile_vein.png index 2a99d09c..fbade520 100644 Binary files a/common/src/main/resources/assets/antarchy/textures/block/bile/bile_vein.png and b/common/src/main/resources/assets/antarchy/textures/block/bile/bile_vein.png differ diff --git a/common/src/main/resources/assets/antarchy/textures/block/bile/bile_vein.png.mcmeta b/common/src/main/resources/assets/antarchy/textures/block/bile/bile_vein.png.mcmeta index b44a2ee6..6714e205 100644 --- a/common/src/main/resources/assets/antarchy/textures/block/bile/bile_vein.png.mcmeta +++ b/common/src/main/resources/assets/antarchy/textures/block/bile/bile_vein.png.mcmeta @@ -1,16 +1,6 @@ { "animation": { "frametime": 16, - "interpolate": true, - "frames": [ - 0, - 1, - 0, - 2, - 0, - 1, - 2, - 1 - ] + "interpolate": true } } diff --git a/common/src/main/resources/assets/antarchy/textures/block/blush_moss/blush_moss_block.png b/common/src/main/resources/assets/antarchy/textures/block/blush_moss/blush_moss_block.png new file mode 100644 index 00000000..0501cf58 Binary files /dev/null and b/common/src/main/resources/assets/antarchy/textures/block/blush_moss/blush_moss_block.png differ diff --git a/common/src/main/resources/assets/antarchy/textures/block/blush_moss/blush_moss_carpet.png b/common/src/main/resources/assets/antarchy/textures/block/blush_moss/blush_moss_carpet.png new file mode 100644 index 00000000..0501cf58 Binary files /dev/null and b/common/src/main/resources/assets/antarchy/textures/block/blush_moss/blush_moss_carpet.png differ diff --git a/common/src/main/resources/assets/antarchy/textures/block/corn/corn_crop_stage_0.png b/common/src/main/resources/assets/antarchy/textures/block/corn/corn_crop_stage_0.png new file mode 100644 index 00000000..5a285cb4 Binary files /dev/null and b/common/src/main/resources/assets/antarchy/textures/block/corn/corn_crop_stage_0.png differ diff --git a/common/src/main/resources/assets/antarchy/textures/block/corn/corn_crop_stage_1.png b/common/src/main/resources/assets/antarchy/textures/block/corn/corn_crop_stage_1.png new file mode 100644 index 00000000..9eb94b8c Binary files /dev/null and b/common/src/main/resources/assets/antarchy/textures/block/corn/corn_crop_stage_1.png differ diff --git a/common/src/main/resources/assets/antarchy/textures/block/corn/corn_crop_stage_2_bottom.png b/common/src/main/resources/assets/antarchy/textures/block/corn/corn_crop_stage_2_bottom.png new file mode 100644 index 00000000..3635e3a3 Binary files /dev/null and b/common/src/main/resources/assets/antarchy/textures/block/corn/corn_crop_stage_2_bottom.png differ diff --git a/common/src/main/resources/assets/antarchy/textures/block/corn/corn_crop_stage_2_top.png b/common/src/main/resources/assets/antarchy/textures/block/corn/corn_crop_stage_2_top.png new file mode 100644 index 00000000..5f173158 Binary files /dev/null and b/common/src/main/resources/assets/antarchy/textures/block/corn/corn_crop_stage_2_top.png differ diff --git a/common/src/main/resources/assets/antarchy/textures/block/corn/corn_crop_stage_3_bottom.png b/common/src/main/resources/assets/antarchy/textures/block/corn/corn_crop_stage_3_bottom.png new file mode 100644 index 00000000..572d562d Binary files /dev/null and b/common/src/main/resources/assets/antarchy/textures/block/corn/corn_crop_stage_3_bottom.png differ diff --git a/common/src/main/resources/assets/antarchy/textures/block/corn/corn_crop_stage_3_top.png b/common/src/main/resources/assets/antarchy/textures/block/corn/corn_crop_stage_3_top.png new file mode 100644 index 00000000..1bdde9d1 Binary files /dev/null and b/common/src/main/resources/assets/antarchy/textures/block/corn/corn_crop_stage_3_top.png differ diff --git a/common/src/main/resources/assets/antarchy/textures/block/lumen_flow.png b/common/src/main/resources/assets/antarchy/textures/block/lumen_flow.png new file mode 100644 index 00000000..4fe95180 Binary files /dev/null and b/common/src/main/resources/assets/antarchy/textures/block/lumen_flow.png differ diff --git a/common/src/main/resources/assets/antarchy/textures/block/lumen_flow.png.mcmeta b/common/src/main/resources/assets/antarchy/textures/block/lumen_flow.png.mcmeta new file mode 100644 index 00000000..3479f1d8 --- /dev/null +++ b/common/src/main/resources/assets/antarchy/textures/block/lumen_flow.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "frametime": 1, + "interpolate": true + } +} \ No newline at end of file diff --git a/common/src/main/resources/assets/antarchy/textures/block/lumen_flowing.png b/common/src/main/resources/assets/antarchy/textures/block/lumen_flowing.png new file mode 100644 index 00000000..4fe95180 Binary files /dev/null and b/common/src/main/resources/assets/antarchy/textures/block/lumen_flowing.png differ diff --git a/common/src/main/resources/assets/antarchy/textures/block/lumen_flowing.png.mcmeta b/common/src/main/resources/assets/antarchy/textures/block/lumen_flowing.png.mcmeta new file mode 100644 index 00000000..cb44715a --- /dev/null +++ b/common/src/main/resources/assets/antarchy/textures/block/lumen_flowing.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "frametime": 5, + "interpolate": true + } +} \ No newline at end of file diff --git a/common/src/main/resources/assets/antarchy/textures/block/lumen_froglight_side.png b/common/src/main/resources/assets/antarchy/textures/block/lumen_froglight_side.png new file mode 100644 index 00000000..4a01510a Binary files /dev/null and b/common/src/main/resources/assets/antarchy/textures/block/lumen_froglight_side.png differ diff --git a/common/src/main/resources/assets/antarchy/textures/block/lumen_froglight_top.png b/common/src/main/resources/assets/antarchy/textures/block/lumen_froglight_top.png new file mode 100644 index 00000000..36ce869b Binary files /dev/null and b/common/src/main/resources/assets/antarchy/textures/block/lumen_froglight_top.png differ diff --git a/common/src/main/resources/assets/antarchy/textures/block/lumen_still.png b/common/src/main/resources/assets/antarchy/textures/block/lumen_still.png new file mode 100644 index 00000000..1b35db30 Binary files /dev/null and b/common/src/main/resources/assets/antarchy/textures/block/lumen_still.png differ diff --git a/common/src/main/resources/assets/antarchy/textures/block/lumen_still.png.mcmeta b/common/src/main/resources/assets/antarchy/textures/block/lumen_still.png.mcmeta new file mode 100644 index 00000000..cb44715a --- /dev/null +++ b/common/src/main/resources/assets/antarchy/textures/block/lumen_still.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "frametime": 5, + "interpolate": true + } +} \ No newline at end of file diff --git a/common/src/main/resources/assets/antarchy/textures/block/ouranwood/ouranwood_vine.png b/common/src/main/resources/assets/antarchy/textures/block/ouranwood/ouranwood_vine.png deleted file mode 100644 index d95e4c07..00000000 Binary files a/common/src/main/resources/assets/antarchy/textures/block/ouranwood/ouranwood_vine.png and /dev/null differ diff --git a/common/src/main/resources/assets/antarchy/textures/block/ouranwood/ouranwood_vine_plant.png b/common/src/main/resources/assets/antarchy/textures/block/ouranwood/ouranwood_vine_plant.png deleted file mode 100644 index 75b6fa30..00000000 Binary files a/common/src/main/resources/assets/antarchy/textures/block/ouranwood/ouranwood_vine_plant.png and /dev/null differ diff --git a/common/src/main/resources/assets/antarchy/textures/block/pale_nyxite.png b/common/src/main/resources/assets/antarchy/textures/block/pale_nyxite.png index 387c9a6a..2c6a2834 100644 Binary files a/common/src/main/resources/assets/antarchy/textures/block/pale_nyxite.png and b/common/src/main/resources/assets/antarchy/textures/block/pale_nyxite.png differ diff --git a/common/src/main/resources/assets/antarchy/textures/block/peach/peach_door_bottom.png b/common/src/main/resources/assets/antarchy/textures/block/peach/peach_door_bottom.png new file mode 100644 index 00000000..7edbab7e Binary files /dev/null and b/common/src/main/resources/assets/antarchy/textures/block/peach/peach_door_bottom.png differ diff --git a/common/src/main/resources/assets/antarchy/textures/block/peach/peach_door_top.png b/common/src/main/resources/assets/antarchy/textures/block/peach/peach_door_top.png new file mode 100644 index 00000000..2773d585 Binary files /dev/null and b/common/src/main/resources/assets/antarchy/textures/block/peach/peach_door_top.png differ diff --git a/common/src/main/resources/assets/antarchy/textures/block/peach/peach_hanging.png b/common/src/main/resources/assets/antarchy/textures/block/peach/peach_hanging.png new file mode 100644 index 00000000..cae2364a Binary files /dev/null and b/common/src/main/resources/assets/antarchy/textures/block/peach/peach_hanging.png differ diff --git a/common/src/main/resources/assets/antarchy/textures/block/peach/peach_leaves.png b/common/src/main/resources/assets/antarchy/textures/block/peach/peach_leaves.png new file mode 100644 index 00000000..f71691f4 Binary files /dev/null and b/common/src/main/resources/assets/antarchy/textures/block/peach/peach_leaves.png differ diff --git a/common/src/main/resources/assets/antarchy/textures/block/peach/peach_log.png b/common/src/main/resources/assets/antarchy/textures/block/peach/peach_log.png new file mode 100644 index 00000000..519ec0fb Binary files /dev/null and b/common/src/main/resources/assets/antarchy/textures/block/peach/peach_log.png differ diff --git a/common/src/main/resources/assets/antarchy/textures/block/peach/peach_log_top.png b/common/src/main/resources/assets/antarchy/textures/block/peach/peach_log_top.png new file mode 100644 index 00000000..4c5215c8 Binary files /dev/null and b/common/src/main/resources/assets/antarchy/textures/block/peach/peach_log_top.png differ diff --git a/common/src/main/resources/assets/antarchy/textures/block/peach/peach_planks.png b/common/src/main/resources/assets/antarchy/textures/block/peach/peach_planks.png new file mode 100644 index 00000000..a8072afd Binary files /dev/null and b/common/src/main/resources/assets/antarchy/textures/block/peach/peach_planks.png differ diff --git a/common/src/main/resources/assets/antarchy/textures/block/peach/peach_sapling.png b/common/src/main/resources/assets/antarchy/textures/block/peach/peach_sapling.png new file mode 100644 index 00000000..9908bdc9 Binary files /dev/null and b/common/src/main/resources/assets/antarchy/textures/block/peach/peach_sapling.png differ diff --git a/common/src/main/resources/assets/antarchy/textures/block/peach/peach_trapdoor.png b/common/src/main/resources/assets/antarchy/textures/block/peach/peach_trapdoor.png new file mode 100644 index 00000000..50cf8b95 Binary files /dev/null and b/common/src/main/resources/assets/antarchy/textures/block/peach/peach_trapdoor.png differ diff --git a/common/src/main/resources/assets/antarchy/textures/block/peach/stripped_peach_log.png b/common/src/main/resources/assets/antarchy/textures/block/peach/stripped_peach_log.png new file mode 100644 index 00000000..9590b8e2 Binary files /dev/null and b/common/src/main/resources/assets/antarchy/textures/block/peach/stripped_peach_log.png differ diff --git a/common/src/main/resources/assets/antarchy/textures/block/peach/stripped_peach_log_top.png b/common/src/main/resources/assets/antarchy/textures/block/peach/stripped_peach_log_top.png new file mode 100644 index 00000000..821a0f79 Binary files /dev/null and b/common/src/main/resources/assets/antarchy/textures/block/peach/stripped_peach_log_top.png differ diff --git a/common/src/main/resources/assets/antarchy/textures/block/red_ant_nest.png b/common/src/main/resources/assets/antarchy/textures/block/red_ant_nest.png deleted file mode 100644 index 06db6100..00000000 Binary files a/common/src/main/resources/assets/antarchy/textures/block/red_ant_nest.png and /dev/null differ diff --git a/common/src/main/resources/assets/antarchy/textures/block/red_ant_nest/red_ant_nest_side.png b/common/src/main/resources/assets/antarchy/textures/block/red_ant_nest/red_ant_nest_side.png new file mode 100644 index 00000000..2307b613 Binary files /dev/null and b/common/src/main/resources/assets/antarchy/textures/block/red_ant_nest/red_ant_nest_side.png differ diff --git a/common/src/main/resources/assets/antarchy/textures/block/red_ant_nest/red_ant_nest_side.png.mcmeta b/common/src/main/resources/assets/antarchy/textures/block/red_ant_nest/red_ant_nest_side.png.mcmeta new file mode 100644 index 00000000..1fd02729 --- /dev/null +++ b/common/src/main/resources/assets/antarchy/textures/block/red_ant_nest/red_ant_nest_side.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation": { + "frametime": 9 + } +} diff --git a/common/src/main/resources/assets/antarchy/textures/block/red_ant_nest/red_ant_nest_top.png b/common/src/main/resources/assets/antarchy/textures/block/red_ant_nest/red_ant_nest_top.png new file mode 100644 index 00000000..73985873 Binary files /dev/null and b/common/src/main/resources/assets/antarchy/textures/block/red_ant_nest/red_ant_nest_top.png differ diff --git a/common/src/main/resources/assets/antarchy/textures/block/red_ant_nest/red_ant_nest_top.png.mcmeta b/common/src/main/resources/assets/antarchy/textures/block/red_ant_nest/red_ant_nest_top.png.mcmeta new file mode 100644 index 00000000..1fd02729 --- /dev/null +++ b/common/src/main/resources/assets/antarchy/textures/block/red_ant_nest/red_ant_nest_top.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation": { + "frametime": 9 + } +} diff --git a/common/src/main/resources/assets/antarchy/textures/block/red_ant_nest_top.png b/common/src/main/resources/assets/antarchy/textures/block/red_ant_nest_top.png deleted file mode 100644 index f14da613..00000000 Binary files a/common/src/main/resources/assets/antarchy/textures/block/red_ant_nest_top.png and /dev/null differ diff --git a/common/src/main/resources/assets/antarchy/textures/block/roseate_froglight_side.png b/common/src/main/resources/assets/antarchy/textures/block/roseate_froglight_side.png new file mode 100644 index 00000000..699b9a0d Binary files /dev/null and b/common/src/main/resources/assets/antarchy/textures/block/roseate_froglight_side.png differ diff --git a/common/src/main/resources/assets/antarchy/textures/block/roseate_froglight_top.png b/common/src/main/resources/assets/antarchy/textures/block/roseate_froglight_top.png new file mode 100644 index 00000000..9419b2ea Binary files /dev/null and b/common/src/main/resources/assets/antarchy/textures/block/roseate_froglight_top.png differ diff --git a/common/src/main/resources/assets/antarchy/textures/block/torchflower_bush_bottom.png b/common/src/main/resources/assets/antarchy/textures/block/torchflower_bush_bottom.png deleted file mode 100644 index c17c76d8..00000000 Binary files a/common/src/main/resources/assets/antarchy/textures/block/torchflower_bush_bottom.png and /dev/null differ diff --git a/common/src/main/resources/assets/antarchy/textures/block/torchflower_bush_top.png b/common/src/main/resources/assets/antarchy/textures/block/torchflower_bush_top.png deleted file mode 100644 index cdd07bc3..00000000 Binary files a/common/src/main/resources/assets/antarchy/textures/block/torchflower_bush_top.png and /dev/null differ diff --git a/common/src/main/resources/assets/antarchy/textures/block/very_short_grass.png b/common/src/main/resources/assets/antarchy/textures/block/very_short_grass.png deleted file mode 100644 index 2b9c8433..00000000 Binary files a/common/src/main/resources/assets/antarchy/textures/block/very_short_grass.png and /dev/null differ diff --git a/common/src/main/resources/assets/antarchy/textures/block/very_tall_grass/very_tall_grass_bottom.png b/common/src/main/resources/assets/antarchy/textures/block/very_tall_grass/very_tall_grass_bottom.png deleted file mode 100644 index 7b39df63..00000000 Binary files a/common/src/main/resources/assets/antarchy/textures/block/very_tall_grass/very_tall_grass_bottom.png and /dev/null differ diff --git a/common/src/main/resources/assets/antarchy/textures/block/very_tall_grass/very_tall_grass_middle.png b/common/src/main/resources/assets/antarchy/textures/block/very_tall_grass/very_tall_grass_middle.png deleted file mode 100644 index 20d8e01d..00000000 Binary files a/common/src/main/resources/assets/antarchy/textures/block/very_tall_grass/very_tall_grass_middle.png and /dev/null differ diff --git a/common/src/main/resources/assets/antarchy/textures/block/very_tall_grass/very_tall_grass_top.png b/common/src/main/resources/assets/antarchy/textures/block/very_tall_grass/very_tall_grass_top.png deleted file mode 100644 index d81d7528..00000000 Binary files a/common/src/main/resources/assets/antarchy/textures/block/very_tall_grass/very_tall_grass_top.png and /dev/null differ diff --git a/common/src/main/resources/assets/antarchy/textures/entity/boat/peach.png b/common/src/main/resources/assets/antarchy/textures/entity/boat/peach.png new file mode 100644 index 00000000..8dabe8ce Binary files /dev/null and b/common/src/main/resources/assets/antarchy/textures/entity/boat/peach.png differ diff --git a/common/src/main/resources/assets/antarchy/textures/entity/chest_boat/peach.png b/common/src/main/resources/assets/antarchy/textures/entity/chest_boat/peach.png new file mode 100644 index 00000000..df8d0dc8 Binary files /dev/null and b/common/src/main/resources/assets/antarchy/textures/entity/chest_boat/peach.png differ diff --git a/common/src/main/resources/assets/antarchy/textures/entity/elka.png b/common/src/main/resources/assets/antarchy/textures/entity/elka.png new file mode 100644 index 00000000..27a2d587 Binary files /dev/null and b/common/src/main/resources/assets/antarchy/textures/entity/elka.png differ diff --git a/common/src/main/resources/assets/antarchy/textures/entity/elka_baby.png b/common/src/main/resources/assets/antarchy/textures/entity/elka_baby.png new file mode 100644 index 00000000..23c415a8 Binary files /dev/null and b/common/src/main/resources/assets/antarchy/textures/entity/elka_baby.png differ diff --git a/common/src/main/resources/assets/antarchy/textures/entity/frog/frog_elythia.png b/common/src/main/resources/assets/antarchy/textures/entity/frog/frog_elythia.png new file mode 100644 index 00000000..f32b311e Binary files /dev/null and b/common/src/main/resources/assets/antarchy/textures/entity/frog/frog_elythia.png differ diff --git a/common/src/main/resources/assets/antarchy/textures/entity/glimmer/apple_cow_glimmer.png b/common/src/main/resources/assets/antarchy/textures/entity/glimmer/apple_cow_glimmer.png new file mode 100644 index 00000000..8507daba Binary files /dev/null and b/common/src/main/resources/assets/antarchy/textures/entity/glimmer/apple_cow_glimmer.png differ diff --git a/common/src/main/resources/assets/antarchy/textures/entity/glimmer/apple_cow_glimmer_emissive.png b/common/src/main/resources/assets/antarchy/textures/entity/glimmer/apple_cow_glimmer_emissive.png new file mode 100644 index 00000000..d18c587d Binary files /dev/null and b/common/src/main/resources/assets/antarchy/textures/entity/glimmer/apple_cow_glimmer_emissive.png differ diff --git a/common/src/main/resources/assets/antarchy/textures/entity/glimmer/apple_cow_glimmer_sheared.png b/common/src/main/resources/assets/antarchy/textures/entity/glimmer/apple_cow_glimmer_sheared.png new file mode 100644 index 00000000..c84c8e16 Binary files /dev/null and b/common/src/main/resources/assets/antarchy/textures/entity/glimmer/apple_cow_glimmer_sheared.png differ diff --git a/common/src/main/resources/assets/antarchy/textures/entity/glimmer/apple_cow_glimmer_sheared_emissive.png b/common/src/main/resources/assets/antarchy/textures/entity/glimmer/apple_cow_glimmer_sheared_emissive.png new file mode 100644 index 00000000..81144589 Binary files /dev/null and b/common/src/main/resources/assets/antarchy/textures/entity/glimmer/apple_cow_glimmer_sheared_emissive.png differ diff --git a/common/src/main/resources/assets/antarchy/textures/entity/glimmer/glimmer.png b/common/src/main/resources/assets/antarchy/textures/entity/glimmer/deer_glimmer.png similarity index 100% rename from common/src/main/resources/assets/antarchy/textures/entity/glimmer/glimmer.png rename to common/src/main/resources/assets/antarchy/textures/entity/glimmer/deer_glimmer.png diff --git a/common/src/main/resources/assets/antarchy/textures/entity/glimmer/glimmer_emissive.png b/common/src/main/resources/assets/antarchy/textures/entity/glimmer/deer_glimmer_emissive.png similarity index 100% rename from common/src/main/resources/assets/antarchy/textures/entity/glimmer/glimmer_emissive.png rename to common/src/main/resources/assets/antarchy/textures/entity/glimmer/deer_glimmer_emissive.png diff --git a/common/src/main/resources/assets/antarchy/textures/entity/glimmer/elka_glimmer.png b/common/src/main/resources/assets/antarchy/textures/entity/glimmer/elka_glimmer.png new file mode 100644 index 00000000..0d83677c Binary files /dev/null and b/common/src/main/resources/assets/antarchy/textures/entity/glimmer/elka_glimmer.png differ diff --git a/common/src/main/resources/assets/antarchy/textures/entity/glimmer/elka_glimmer_emmisive.png b/common/src/main/resources/assets/antarchy/textures/entity/glimmer/elka_glimmer_emmisive.png new file mode 100644 index 00000000..8bdbbeaf Binary files /dev/null and b/common/src/main/resources/assets/antarchy/textures/entity/glimmer/elka_glimmer_emmisive.png differ diff --git a/common/src/main/resources/assets/antarchy/textures/entity/glimmer/frog_glimmer.png b/common/src/main/resources/assets/antarchy/textures/entity/glimmer/frog_glimmer.png new file mode 100644 index 00000000..abb1d8f4 Binary files /dev/null and b/common/src/main/resources/assets/antarchy/textures/entity/glimmer/frog_glimmer.png differ diff --git a/common/src/main/resources/assets/antarchy/textures/entity/glimmer/frog_glimmer_emmisive.png b/common/src/main/resources/assets/antarchy/textures/entity/glimmer/frog_glimmer_emmisive.png new file mode 100644 index 00000000..54570e63 Binary files /dev/null and b/common/src/main/resources/assets/antarchy/textures/entity/glimmer/frog_glimmer_emmisive.png differ diff --git a/common/src/main/resources/assets/antarchy/textures/entity/glimmer/glimmer_ant.png b/common/src/main/resources/assets/antarchy/textures/entity/glimmer/glimmer_ant.png new file mode 100644 index 00000000..0c15178e Binary files /dev/null and b/common/src/main/resources/assets/antarchy/textures/entity/glimmer/glimmer_ant.png differ diff --git a/common/src/main/resources/assets/antarchy/textures/entity/glimmer/glimmer_ant_emmisive.png b/common/src/main/resources/assets/antarchy/textures/entity/glimmer/glimmer_ant_emmisive.png new file mode 100644 index 00000000..0c15178e Binary files /dev/null and b/common/src/main/resources/assets/antarchy/textures/entity/glimmer/glimmer_ant_emmisive.png differ diff --git a/common/src/main/resources/assets/antarchy/textures/entity/glimmer/glimmer_baby.png b/common/src/main/resources/assets/antarchy/textures/entity/glimmer/glimmer_baby.png deleted file mode 100644 index 4198a656..00000000 Binary files a/common/src/main/resources/assets/antarchy/textures/entity/glimmer/glimmer_baby.png and /dev/null differ diff --git a/common/src/main/resources/assets/antarchy/textures/entity/glimmer/glimmer_baby_day.png b/common/src/main/resources/assets/antarchy/textures/entity/glimmer/glimmer_baby_day.png deleted file mode 100644 index 0ce1e803..00000000 Binary files a/common/src/main/resources/assets/antarchy/textures/entity/glimmer/glimmer_baby_day.png and /dev/null differ diff --git a/common/src/main/resources/assets/antarchy/textures/entity/glimmer/glimmer_baby_emissive.png b/common/src/main/resources/assets/antarchy/textures/entity/glimmer/glimmer_baby_emissive.png deleted file mode 100644 index 4c406021..00000000 Binary files a/common/src/main/resources/assets/antarchy/textures/entity/glimmer/glimmer_baby_emissive.png and /dev/null differ diff --git a/common/src/main/resources/assets/antarchy/textures/entity/glimmer/rabbit_glimmer.png b/common/src/main/resources/assets/antarchy/textures/entity/glimmer/rabbit_glimmer.png new file mode 100644 index 00000000..9ba7dade Binary files /dev/null and b/common/src/main/resources/assets/antarchy/textures/entity/glimmer/rabbit_glimmer.png differ diff --git a/common/src/main/resources/assets/antarchy/textures/entity/glimmer/rabbit_glimmer_emmisive.png b/common/src/main/resources/assets/antarchy/textures/entity/glimmer/rabbit_glimmer_emmisive.png new file mode 100644 index 00000000..9ba7dade Binary files /dev/null and b/common/src/main/resources/assets/antarchy/textures/entity/glimmer/rabbit_glimmer_emmisive.png differ diff --git a/common/src/main/resources/assets/antarchy/textures/entity/glimmer/glimmer_day.png b/common/src/main/resources/assets/antarchy/textures/entity/ouranwood_deer/deer_buck.png similarity index 100% rename from common/src/main/resources/assets/antarchy/textures/entity/glimmer/glimmer_day.png rename to common/src/main/resources/assets/antarchy/textures/entity/ouranwood_deer/deer_buck.png diff --git a/common/src/main/resources/assets/antarchy/textures/entity/ouranwood_deer/deer_doe.png b/common/src/main/resources/assets/antarchy/textures/entity/ouranwood_deer/deer_doe.png new file mode 100644 index 00000000..d68e79dc Binary files /dev/null and b/common/src/main/resources/assets/antarchy/textures/entity/ouranwood_deer/deer_doe.png differ diff --git a/common/src/main/resources/assets/antarchy/textures/entity/ouranwood_deer/deer_stag.png b/common/src/main/resources/assets/antarchy/textures/entity/ouranwood_deer/deer_stag.png new file mode 100644 index 00000000..651c3e49 Binary files /dev/null and b/common/src/main/resources/assets/antarchy/textures/entity/ouranwood_deer/deer_stag.png differ diff --git a/common/src/main/resources/assets/antarchy/textures/entity/signs/hanging/peach.png b/common/src/main/resources/assets/antarchy/textures/entity/signs/hanging/peach.png new file mode 100644 index 00000000..3c735251 Binary files /dev/null and b/common/src/main/resources/assets/antarchy/textures/entity/signs/hanging/peach.png differ diff --git a/common/src/main/resources/assets/antarchy/textures/entity/signs/peach.png b/common/src/main/resources/assets/antarchy/textures/entity/signs/peach.png new file mode 100644 index 00000000..46c2e786 Binary files /dev/null and b/common/src/main/resources/assets/antarchy/textures/entity/signs/peach.png differ diff --git a/common/src/main/resources/assets/antarchy/textures/gui/hanging_signs/ouranwood.png b/common/src/main/resources/assets/antarchy/textures/gui/hanging_signs/ouranwood.png index 7903f083..030fada5 100644 Binary files a/common/src/main/resources/assets/antarchy/textures/gui/hanging_signs/ouranwood.png and b/common/src/main/resources/assets/antarchy/textures/gui/hanging_signs/ouranwood.png differ diff --git a/common/src/main/resources/assets/antarchy/textures/gui/hanging_signs/peach.png b/common/src/main/resources/assets/antarchy/textures/gui/hanging_signs/peach.png new file mode 100644 index 00000000..5e5d565e Binary files /dev/null and b/common/src/main/resources/assets/antarchy/textures/gui/hanging_signs/peach.png differ diff --git a/common/src/main/resources/assets/antarchy/textures/item/cooked_corndog.png b/common/src/main/resources/assets/antarchy/textures/item/cooked_corndog.png new file mode 100644 index 00000000..3a1a67b3 Binary files /dev/null and b/common/src/main/resources/assets/antarchy/textures/item/cooked_corndog.png differ diff --git a/common/src/main/resources/assets/antarchy/textures/item/cooked_venison.png b/common/src/main/resources/assets/antarchy/textures/item/cooked_venison.png new file mode 100644 index 00000000..f0a7a31f Binary files /dev/null and b/common/src/main/resources/assets/antarchy/textures/item/cooked_venison.png differ diff --git a/common/src/main/resources/assets/antarchy/textures/item/corn.png b/common/src/main/resources/assets/antarchy/textures/item/corn.png new file mode 100644 index 00000000..ff703392 Binary files /dev/null and b/common/src/main/resources/assets/antarchy/textures/item/corn.png differ diff --git a/common/src/main/resources/assets/antarchy/textures/item/corn_seeds.png b/common/src/main/resources/assets/antarchy/textures/item/corn_seeds.png new file mode 100644 index 00000000..bea63bd9 Binary files /dev/null and b/common/src/main/resources/assets/antarchy/textures/item/corn_seeds.png differ diff --git a/common/src/main/resources/assets/antarchy/textures/item/glimmer_bottle.png b/common/src/main/resources/assets/antarchy/textures/item/glimmer_bottle.png new file mode 100644 index 00000000..f9c4da5c Binary files /dev/null and b/common/src/main/resources/assets/antarchy/textures/item/glimmer_bottle.png differ diff --git a/common/src/main/resources/assets/antarchy/textures/item/high_fructose_corn_syrup.png b/common/src/main/resources/assets/antarchy/textures/item/high_fructose_corn_syrup.png new file mode 100644 index 00000000..1e0da1b2 Binary files /dev/null and b/common/src/main/resources/assets/antarchy/textures/item/high_fructose_corn_syrup.png differ diff --git a/common/src/main/resources/assets/antarchy/textures/item/kraken_tentacle.png b/common/src/main/resources/assets/antarchy/textures/item/kraken_tentacle.png new file mode 100644 index 00000000..25ff5880 Binary files /dev/null and b/common/src/main/resources/assets/antarchy/textures/item/kraken_tentacle.png differ diff --git a/common/src/main/resources/assets/antarchy/textures/item/kraken_tooth.png b/common/src/main/resources/assets/antarchy/textures/item/kraken_tooth.png index 200ab731..c1a119d3 100644 Binary files a/common/src/main/resources/assets/antarchy/textures/item/kraken_tooth.png and b/common/src/main/resources/assets/antarchy/textures/item/kraken_tooth.png differ diff --git a/common/src/main/resources/assets/antarchy/textures/item/lumen_bucket.png b/common/src/main/resources/assets/antarchy/textures/item/lumen_bucket.png new file mode 100644 index 00000000..4bfd1f2a Binary files /dev/null and b/common/src/main/resources/assets/antarchy/textures/item/lumen_bucket.png differ diff --git a/common/src/main/resources/assets/antarchy/textures/item/miners_dream.png b/common/src/main/resources/assets/antarchy/textures/item/miners_dream.png new file mode 100644 index 00000000..d8371b7b Binary files /dev/null and b/common/src/main/resources/assets/antarchy/textures/item/miners_dream.png differ diff --git a/common/src/main/resources/assets/antarchy/textures/item/peach.png b/common/src/main/resources/assets/antarchy/textures/item/peach.png new file mode 100644 index 00000000..104920f7 Binary files /dev/null and b/common/src/main/resources/assets/antarchy/textures/item/peach.png differ diff --git a/common/src/main/resources/assets/antarchy/textures/item/peach_boat.png b/common/src/main/resources/assets/antarchy/textures/item/peach_boat.png new file mode 100644 index 00000000..320204cf Binary files /dev/null and b/common/src/main/resources/assets/antarchy/textures/item/peach_boat.png differ diff --git a/common/src/main/resources/assets/antarchy/textures/item/peach_chest_boat.png b/common/src/main/resources/assets/antarchy/textures/item/peach_chest_boat.png new file mode 100644 index 00000000..c3c4d905 Binary files /dev/null and b/common/src/main/resources/assets/antarchy/textures/item/peach_chest_boat.png differ diff --git a/common/src/main/resources/assets/antarchy/textures/item/peach_door_icon.png b/common/src/main/resources/assets/antarchy/textures/item/peach_door_icon.png new file mode 100644 index 00000000..a734788f Binary files /dev/null and b/common/src/main/resources/assets/antarchy/textures/item/peach_door_icon.png differ diff --git a/common/src/main/resources/assets/antarchy/textures/item/peach_hanging_sign.png b/common/src/main/resources/assets/antarchy/textures/item/peach_hanging_sign.png new file mode 100644 index 00000000..e1f0f03e Binary files /dev/null and b/common/src/main/resources/assets/antarchy/textures/item/peach_hanging_sign.png differ diff --git a/common/src/main/resources/assets/antarchy/textures/item/peach_sign.png b/common/src/main/resources/assets/antarchy/textures/item/peach_sign.png new file mode 100644 index 00000000..17d927dc Binary files /dev/null and b/common/src/main/resources/assets/antarchy/textures/item/peach_sign.png differ diff --git a/common/src/main/resources/assets/antarchy/textures/item/raw_corndog.png b/common/src/main/resources/assets/antarchy/textures/item/raw_corndog.png new file mode 100644 index 00000000..a8e5749e Binary files /dev/null and b/common/src/main/resources/assets/antarchy/textures/item/raw_corndog.png differ diff --git a/common/src/main/resources/assets/antarchy/textures/item/raw_venison.png b/common/src/main/resources/assets/antarchy/textures/item/raw_venison.png new file mode 100644 index 00000000..3bf72b68 Binary files /dev/null and b/common/src/main/resources/assets/antarchy/textures/item/raw_venison.png differ diff --git a/common/src/main/resources/assets/antarchy/textures/item/root_beer.png b/common/src/main/resources/assets/antarchy/textures/item/root_beer.png new file mode 100644 index 00000000..63024ad4 Binary files /dev/null and b/common/src/main/resources/assets/antarchy/textures/item/root_beer.png differ diff --git a/common/src/main/resources/assets/antarchy/textures/item/spirit_apple.png b/common/src/main/resources/assets/antarchy/textures/item/spirit_apple.png new file mode 100644 index 00000000..118f47e5 Binary files /dev/null and b/common/src/main/resources/assets/antarchy/textures/item/spirit_apple.png differ diff --git a/common/src/main/resources/assets/antarchy/textures/mob_effect/bloodglass_ward.png b/common/src/main/resources/assets/antarchy/textures/mob_effect/bloodglass_ward.png index fb2becad..1f6cf4fd 100644 Binary files a/common/src/main/resources/assets/antarchy/textures/mob_effect/bloodglass_ward.png and b/common/src/main/resources/assets/antarchy/textures/mob_effect/bloodglass_ward.png differ diff --git a/common/src/main/resources/assets/antarchy/textures/mob_effect/glimmers_grace.png b/common/src/main/resources/assets/antarchy/textures/mob_effect/glimmers_grace.png deleted file mode 100644 index b0214de7..00000000 Binary files a/common/src/main/resources/assets/antarchy/textures/mob_effect/glimmers_grace.png and /dev/null differ diff --git a/common/src/main/resources/assets/antarchy/textures/mob_effect/stinky.png b/common/src/main/resources/assets/antarchy/textures/mob_effect/stinky.png index 7436c983..316e3b2c 100644 Binary files a/common/src/main/resources/assets/antarchy/textures/mob_effect/stinky.png and b/common/src/main/resources/assets/antarchy/textures/mob_effect/stinky.png differ diff --git a/common/src/main/resources/assets/antarchy/textures/particle/peach/peach_0.png b/common/src/main/resources/assets/antarchy/textures/particle/peach/peach_0.png new file mode 100644 index 00000000..242fa84b Binary files /dev/null and b/common/src/main/resources/assets/antarchy/textures/particle/peach/peach_0.png differ diff --git a/common/src/main/resources/assets/antarchy/textures/particle/peach/peach_1.png b/common/src/main/resources/assets/antarchy/textures/particle/peach/peach_1.png new file mode 100644 index 00000000..961d31f0 Binary files /dev/null and b/common/src/main/resources/assets/antarchy/textures/particle/peach/peach_1.png differ diff --git a/common/src/main/resources/assets/antarchy/textures/particle/peach/peach_10.png b/common/src/main/resources/assets/antarchy/textures/particle/peach/peach_10.png new file mode 100644 index 00000000..5c64f4a9 Binary files /dev/null and b/common/src/main/resources/assets/antarchy/textures/particle/peach/peach_10.png differ diff --git a/common/src/main/resources/assets/antarchy/textures/particle/peach/peach_11.png b/common/src/main/resources/assets/antarchy/textures/particle/peach/peach_11.png new file mode 100644 index 00000000..4eb7df29 Binary files /dev/null and b/common/src/main/resources/assets/antarchy/textures/particle/peach/peach_11.png differ diff --git a/common/src/main/resources/assets/antarchy/textures/particle/peach/peach_2.png b/common/src/main/resources/assets/antarchy/textures/particle/peach/peach_2.png new file mode 100644 index 00000000..31216de6 Binary files /dev/null and b/common/src/main/resources/assets/antarchy/textures/particle/peach/peach_2.png differ diff --git a/common/src/main/resources/assets/antarchy/textures/particle/peach/peach_3.png b/common/src/main/resources/assets/antarchy/textures/particle/peach/peach_3.png new file mode 100644 index 00000000..de88560a Binary files /dev/null and b/common/src/main/resources/assets/antarchy/textures/particle/peach/peach_3.png differ diff --git a/common/src/main/resources/assets/antarchy/textures/particle/peach/peach_4.png b/common/src/main/resources/assets/antarchy/textures/particle/peach/peach_4.png new file mode 100644 index 00000000..62f51e91 Binary files /dev/null and b/common/src/main/resources/assets/antarchy/textures/particle/peach/peach_4.png differ diff --git a/common/src/main/resources/assets/antarchy/textures/particle/peach/peach_5.png b/common/src/main/resources/assets/antarchy/textures/particle/peach/peach_5.png new file mode 100644 index 00000000..fba2d3c6 Binary files /dev/null and b/common/src/main/resources/assets/antarchy/textures/particle/peach/peach_5.png differ diff --git a/common/src/main/resources/assets/antarchy/textures/particle/peach/peach_6.png b/common/src/main/resources/assets/antarchy/textures/particle/peach/peach_6.png new file mode 100644 index 00000000..bb9a5465 Binary files /dev/null and b/common/src/main/resources/assets/antarchy/textures/particle/peach/peach_6.png differ diff --git a/common/src/main/resources/assets/antarchy/textures/particle/peach/peach_7.png b/common/src/main/resources/assets/antarchy/textures/particle/peach/peach_7.png new file mode 100644 index 00000000..c7681755 Binary files /dev/null and b/common/src/main/resources/assets/antarchy/textures/particle/peach/peach_7.png differ diff --git a/common/src/main/resources/assets/antarchy/textures/particle/peach/peach_8.png b/common/src/main/resources/assets/antarchy/textures/particle/peach/peach_8.png new file mode 100644 index 00000000..e9085c2b Binary files /dev/null and b/common/src/main/resources/assets/antarchy/textures/particle/peach/peach_8.png differ diff --git a/common/src/main/resources/assets/antarchy/textures/particle/peach/peach_9.png b/common/src/main/resources/assets/antarchy/textures/particle/peach/peach_9.png new file mode 100644 index 00000000..28fb3bb3 Binary files /dev/null and b/common/src/main/resources/assets/antarchy/textures/particle/peach/peach_9.png differ diff --git a/common/src/main/resources/assets/minecraft/atlases/armor_trims.json b/common/src/main/resources/assets/minecraft/atlases/armor_trims.json new file mode 100644 index 00000000..a4220b78 --- /dev/null +++ b/common/src/main/resources/assets/minecraft/atlases/armor_trims.json @@ -0,0 +1,52 @@ +{ + "sources": [ + { + "type": "paletted_permutations", + "textures": [ + "trims/models/armor/coast", + "trims/models/armor/coast_leggings", + "trims/models/armor/sentry", + "trims/models/armor/sentry_leggings", + "trims/models/armor/dune", + "trims/models/armor/dune_leggings", + "trims/models/armor/wild", + "trims/models/armor/wild_leggings", + "trims/models/armor/ward", + "trims/models/armor/ward_leggings", + "trims/models/armor/eye", + "trims/models/armor/eye_leggings", + "trims/models/armor/vex", + "trims/models/armor/vex_leggings", + "trims/models/armor/tide", + "trims/models/armor/tide_leggings", + "trims/models/armor/snout", + "trims/models/armor/snout_leggings", + "trims/models/armor/rib", + "trims/models/armor/rib_leggings", + "trims/models/armor/spire", + "trims/models/armor/spire_leggings", + "trims/models/armor/wayfinder", + "trims/models/armor/wayfinder_leggings", + "trims/models/armor/shaper", + "trims/models/armor/shaper_leggings", + "trims/models/armor/silence", + "trims/models/armor/silence_leggings", + "trims/models/armor/raiser", + "trims/models/armor/raiser_leggings", + "trims/models/armor/host", + "trims/models/armor/host_leggings", + "trims/models/armor/flow", + "trims/models/armor/flow_leggings", + "trims/models/armor/bolt", + "trims/models/armor/bolt_leggings" + ], + "palette_key": "trims/color_palettes/trim_palette", + "permutations": { + "uranium": "antarchy:trims/color_palettes/uranium", + "titanium": "antarchy:trims/color_palettes/titanium", + "blood_crystal": "antarchy:trims/color_palettes/blood_crystal", + "nightmare_scale": "antarchy:trims/color_palettes/nightmare_scale" + } + } + ] +} diff --git a/common/src/main/resources/assets/minecraft/textures/entity/signs/hanging/ouranwood.png b/common/src/main/resources/assets/minecraft/textures/entity/signs/hanging/ouranwood.png deleted file mode 100644 index 7903f083..00000000 Binary files a/common/src/main/resources/assets/minecraft/textures/entity/signs/hanging/ouranwood.png and /dev/null differ diff --git a/common/src/main/resources/assets/minecraft/textures/entity/signs/ouranwood.png b/common/src/main/resources/assets/minecraft/textures/entity/signs/ouranwood.png deleted file mode 100644 index b134ba8c..00000000 Binary files a/common/src/main/resources/assets/minecraft/textures/entity/signs/ouranwood.png and /dev/null differ diff --git a/common/src/main/resources/data/antarchy/advancement/apple_of_my_eye.json b/common/src/main/resources/data/antarchy/advancement/apple_of_my_eye.json new file mode 100644 index 00000000..da282d0d --- /dev/null +++ b/common/src/main/resources/data/antarchy/advancement/apple_of_my_eye.json @@ -0,0 +1,29 @@ +{ + "parent": "minecraft:adventure/root", + "criteria": { + "impossible": { + "trigger": "minecraft:impossible" + } + }, + "display": { + "announce_to_chat": true, + "description": { + "translate": "advancements.antarchy.apple_of_my_eye.description" + }, + "frame": "task", + "icon": { + "count": 1, + "id": "antarchy:glimmer_bottle" + }, + "show_toast": true, + "title": { + "translate": "advancements.antarchy.apple_of_my_eye.title" + } + }, + "requirements": [ + [ + "impossible" + ] + ], + "sends_telemetry_event": true +} diff --git a/common/src/main/resources/data/antarchy/advancement/deerly_beloved.json b/common/src/main/resources/data/antarchy/advancement/deerly_beloved.json new file mode 100644 index 00000000..f0c07944 --- /dev/null +++ b/common/src/main/resources/data/antarchy/advancement/deerly_beloved.json @@ -0,0 +1,29 @@ +{ + "parent": "minecraft:adventure/root", + "criteria": { + "impossible": { + "trigger": "minecraft:impossible" + } + }, + "display": { + "announce_to_chat": true, + "description": { + "translate": "advancements.antarchy.deerly_beloved.description" + }, + "frame": "task", + "icon": { + "count": 1, + "id": "antarchy:glimmer_bottle" + }, + "show_toast": true, + "title": { + "translate": "advancements.antarchy.deerly_beloved.title" + } + }, + "requirements": [ + [ + "impossible" + ] + ], + "sends_telemetry_event": true +} diff --git a/common/src/main/resources/data/antarchy/advancement/elkcellent_choice.json b/common/src/main/resources/data/antarchy/advancement/elkcellent_choice.json new file mode 100644 index 00000000..924d3655 --- /dev/null +++ b/common/src/main/resources/data/antarchy/advancement/elkcellent_choice.json @@ -0,0 +1,29 @@ +{ + "parent": "minecraft:adventure/root", + "criteria": { + "impossible": { + "trigger": "minecraft:impossible" + } + }, + "display": { + "announce_to_chat": true, + "description": { + "translate": "advancements.antarchy.elkcellent_choice.description" + }, + "frame": "task", + "icon": { + "count": 1, + "id": "antarchy:glimmer_bottle" + }, + "show_toast": true, + "title": { + "translate": "advancements.antarchy.elkcellent_choice.title" + } + }, + "requirements": [ + [ + "impossible" + ] + ], + "sends_telemetry_event": true +} diff --git a/common/src/main/resources/data/antarchy/advancement/hoppy_together.json b/common/src/main/resources/data/antarchy/advancement/hoppy_together.json new file mode 100644 index 00000000..db152869 --- /dev/null +++ b/common/src/main/resources/data/antarchy/advancement/hoppy_together.json @@ -0,0 +1,29 @@ +{ + "parent": "minecraft:adventure/root", + "criteria": { + "impossible": { + "trigger": "minecraft:impossible" + } + }, + "display": { + "announce_to_chat": true, + "description": { + "translate": "advancements.antarchy.hoppy_together.description" + }, + "frame": "task", + "icon": { + "count": 1, + "id": "antarchy:glimmer_bottle" + }, + "show_toast": true, + "title": { + "translate": "advancements.antarchy.hoppy_together.title" + } + }, + "requirements": [ + [ + "impossible" + ] + ], + "sends_telemetry_event": true +} diff --git a/common/src/main/resources/data/antarchy/advancement/spirant_animal.json b/common/src/main/resources/data/antarchy/advancement/spirant_animal.json new file mode 100644 index 00000000..87c986a6 --- /dev/null +++ b/common/src/main/resources/data/antarchy/advancement/spirant_animal.json @@ -0,0 +1,29 @@ +{ + "parent": "minecraft:adventure/root", + "criteria": { + "impossible": { + "trigger": "minecraft:impossible" + } + }, + "display": { + "announce_to_chat": true, + "description": { + "translate": "advancements.antarchy.spirant_animal.description" + }, + "frame": "task", + "icon": { + "count": 1, + "id": "antarchy:glimmer_bottle" + }, + "show_toast": true, + "title": { + "translate": "advancements.antarchy.spirant_animal.title" + } + }, + "requirements": [ + [ + "impossible" + ] + ], + "sends_telemetry_event": true +} diff --git a/common/src/main/resources/data/antarchy/dimension/elythia.json b/common/src/main/resources/data/antarchy/dimension/elythia.json index 551c88de..71c4dcb8 100644 --- a/common/src/main/resources/data/antarchy/dimension/elythia.json +++ b/common/src/main/resources/data/antarchy/dimension/elythia.json @@ -95,7 +95,7 @@ } }, { - "biome": "antarchy:ouranwood_forest", + "biome": "antarchy:peach_forest", "parameters": { "temperature": 0.67, "humidity": 0.93, @@ -106,6 +106,30 @@ "offset": 0.0 } }, + { + "biome": "antarchy:peach_forest", + "parameters": { + "temperature": 0.66, + "humidity": 0.89, + "continentalness": 0.54, + "erosion": 0.29, + "weirdness": -0.58, + "depth": 0.45, + "offset": 0.0 + } + }, + { + "biome": "antarchy:glimmering_pools", + "parameters": { + "temperature": 0.67, + "humidity": 0.95, + "continentalness": 0.54, + "erosion": 0.23, + "weirdness": -0.46, + "depth": 0.45, + "offset": 0.0 + } + }, { "biome": "antarchy:sparse_ouranwood_forest", "parameters": { @@ -118,18 +142,6 @@ "offset": 0.0 } }, - { - "biome": "antarchy:ouranwood_forest", - "parameters": { - "temperature": 0.45, - "humidity": 0.85, - "continentalness": 0.55, - "erosion": -0.15, - "weirdness": -0.75, - "depth": 0.3, - "offset": 0.0 - } - }, { "biome": "antarchy:ouranwood_forest", "parameters": { @@ -166,30 +178,6 @@ "offset": 0.0 } }, - { - "biome": "antarchy:ouranwood_forest", - "parameters": { - "temperature": 0.45, - "humidity": 0.85, - "continentalness": 0.55, - "erosion": -0.15, - "weirdness": -0.75, - "depth": 0.0, - "offset": 0.0 - } - }, - { - "biome": "antarchy:ouranwood_forest", - "parameters": { - "temperature": 0.45, - "humidity": 0.85, - "continentalness": 0.75, - "erosion": 0.0, - "weirdness": 0.7, - "depth": 0.0, - "offset": 0.0 - } - }, { "biome": "antarchy:ouranwood_forest", "parameters": { @@ -310,18 +298,6 @@ "offset": 0.0 } }, - { - "biome": "antarchy:ouranwood_forest", - "parameters": { - "temperature": 0.45, - "humidity": 0.85, - "continentalness": 0.55, - "erosion": -0.15, - "weirdness": -0.75, - "depth": 0.5, - "offset": 0.0 - } - }, { "biome": "antarchy:ouranwood_forest", "parameters": { @@ -346,18 +322,6 @@ "offset": 0.0 } }, - { - "biome": "antarchy:ouranwood_forest", - "parameters": { - "temperature": 0.50, - "humidity": 0.87, - "continentalness": 0.70, - "erosion": -0.05, - "weirdness": 0.0, - "depth": 0.85, - "offset": 0.0 - } - }, { "biome": "antarchy:butterfly_fields", "parameters": { diff --git a/common/src/main/resources/data/antarchy/loot_table/blocks/blush_moss_block.json b/common/src/main/resources/data/antarchy/loot_table/blocks/blush_moss_block.json new file mode 100644 index 00000000..566101fa --- /dev/null +++ b/common/src/main/resources/data/antarchy/loot_table/blocks/blush_moss_block.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "antarchy:blush_moss_block" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "minecraft:blocks/moss_block" +} diff --git a/common/src/main/resources/data/antarchy/loot_table/blocks/blush_moss_carpet.json b/common/src/main/resources/data/antarchy/loot_table/blocks/blush_moss_carpet.json new file mode 100644 index 00000000..2c408c83 --- /dev/null +++ b/common/src/main/resources/data/antarchy/loot_table/blocks/blush_moss_carpet.json @@ -0,0 +1,29 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "antarchy:blush_moss_carpet", + "condition": "minecraft:block_state_property", + "properties": { + "bottom": "true" + } + } + ], + "functions": [ + { + "function": "minecraft:explosion_decay" + } + ], + "name": "antarchy:blush_moss_carpet" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "minecraft:blocks/moss_carpet" +} diff --git a/common/src/main/resources/data/antarchy/loot_table/blocks/corn_crop.json b/common/src/main/resources/data/antarchy/loot_table/blocks/corn_crop.json new file mode 100644 index 00000000..90a0d86e --- /dev/null +++ b/common/src/main/resources/data/antarchy/loot_table/blocks/corn_crop.json @@ -0,0 +1,70 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1.0, + "conditions": [ + { + "condition": "minecraft:block_state_property", + "block": "antarchy:corn_crop", + "properties": { + "half": "lower" + } + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "antarchy:corn" + } + ] + }, + { + "rolls": 1.0, + "conditions": [ + { + "condition": "minecraft:block_state_property", + "block": "antarchy:corn_crop", + "properties": { + "half": "lower", + "age": "3" + } + }, + { + "condition": "minecraft:random_chance", + "chance": 0.5 + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "antarchy:corn" + } + ] + }, + { + "rolls": 1.0, + "conditions": [ + { + "condition": "minecraft:block_state_property", + "block": "antarchy:corn_crop", + "properties": { + "half": "lower", + "age": "3" + } + }, + { + "condition": "minecraft:random_chance", + "chance": 0.5 + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "antarchy:corn" + } + ] + } + ], + "random_sequence": "antarchy:blocks/corn_crop" +} diff --git a/common/src/main/resources/data/antarchy/loot_table/blocks/hanging_peach.json b/common/src/main/resources/data/antarchy/loot_table/blocks/hanging_peach.json new file mode 100644 index 00000000..96e05f39 --- /dev/null +++ b/common/src/main/resources/data/antarchy/loot_table/blocks/hanging_peach.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "antarchy:peach" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "antarchy:blocks/hanging_peach" +} diff --git a/common/src/main/resources/data/antarchy/loot_table/blocks/ouranwood_vine.json b/common/src/main/resources/data/antarchy/loot_table/blocks/ouranwood_vine.json deleted file mode 100644 index 193598c4..00000000 --- a/common/src/main/resources/data/antarchy/loot_table/blocks/ouranwood_vine.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "conditions": [ - { - "condition": "minecraft:match_tool", - "predicate": { - "items": [ - "minecraft:shears" - ] - } - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "antarchy:ouranwood_vine" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "antarchy:blocks/ouranwood_vine" -} diff --git a/common/src/main/resources/data/antarchy/loot_table/blocks/peach_button.json b/common/src/main/resources/data/antarchy/loot_table/blocks/peach_button.json new file mode 100644 index 00000000..74410c74 --- /dev/null +++ b/common/src/main/resources/data/antarchy/loot_table/blocks/peach_button.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "antarchy:peach_button" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "minecraft:blocks/jungle_button" +} diff --git a/common/src/main/resources/data/antarchy/loot_table/blocks/peach_door.json b/common/src/main/resources/data/antarchy/loot_table/blocks/peach_door.json new file mode 100644 index 00000000..c8b63c95 --- /dev/null +++ b/common/src/main/resources/data/antarchy/loot_table/blocks/peach_door.json @@ -0,0 +1,30 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "antarchy:peach_door", + "condition": "minecraft:block_state_property", + "properties": { + "half": "lower" + } + } + ], + "name": "antarchy:peach_door" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "minecraft:blocks/jungle_door" +} diff --git a/common/src/main/resources/data/antarchy/loot_table/blocks/peach_fence.json b/common/src/main/resources/data/antarchy/loot_table/blocks/peach_fence.json new file mode 100644 index 00000000..31c7edd6 --- /dev/null +++ b/common/src/main/resources/data/antarchy/loot_table/blocks/peach_fence.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "antarchy:peach_fence" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "minecraft:blocks/jungle_fence" +} diff --git a/common/src/main/resources/data/antarchy/loot_table/blocks/peach_fence_gate.json b/common/src/main/resources/data/antarchy/loot_table/blocks/peach_fence_gate.json new file mode 100644 index 00000000..fd509861 --- /dev/null +++ b/common/src/main/resources/data/antarchy/loot_table/blocks/peach_fence_gate.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "antarchy:peach_fence_gate" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "minecraft:blocks/jungle_fence_gate" +} diff --git a/common/src/main/resources/data/antarchy/loot_table/blocks/peach_hanging_sign.json b/common/src/main/resources/data/antarchy/loot_table/blocks/peach_hanging_sign.json new file mode 100644 index 00000000..511868c3 --- /dev/null +++ b/common/src/main/resources/data/antarchy/loot_table/blocks/peach_hanging_sign.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "antarchy:peach_hanging_sign" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "minecraft:blocks/jungle_hanging_sign" +} diff --git a/common/src/main/resources/data/antarchy/loot_table/blocks/peach_leaves.json b/common/src/main/resources/data/antarchy/loot_table/blocks/peach_leaves.json new file mode 100644 index 00000000..f1a2b349 --- /dev/null +++ b/common/src/main/resources/data/antarchy/loot_table/blocks/peach_leaves.json @@ -0,0 +1,138 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:any_of", + "terms": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "items": "minecraft:shears" + } + }, + { + "condition": "minecraft:match_tool", + "predicate": { + "predicates": { + "minecraft:enchantments": [ + { + "enchantments": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + } + ] + } + ], + "name": "antarchy:peach_leaves" + }, + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:survives_explosion" + }, + { + "chances": [ + 0.025, + 0.027777778, + 0.03125, + 0.041666668, + 0.1 + ], + "condition": "minecraft:table_bonus", + "enchantment": "minecraft:fortune" + } + ], + "name": "antarchy:peach_sapling" + } + ] + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:inverted", + "term": { + "condition": "minecraft:any_of", + "terms": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "items": "minecraft:shears" + } + }, + { + "condition": "minecraft:match_tool", + "predicate": { + "predicates": { + "minecraft:enchantments": [ + { + "enchantments": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + } + ] + } + } + ], + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "chances": [ + 0.02, + 0.022222223, + 0.025, + 0.033333335, + 0.1 + ], + "condition": "minecraft:table_bonus", + "enchantment": "minecraft:fortune" + } + ], + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 2.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + }, + { + "function": "minecraft:explosion_decay" + } + ], + "name": "minecraft:stick" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "antarchy:blocks/peach_leaves" +} + diff --git a/common/src/main/resources/data/antarchy/loot_table/blocks/peach_log.json b/common/src/main/resources/data/antarchy/loot_table/blocks/peach_log.json new file mode 100644 index 00000000..35a91254 --- /dev/null +++ b/common/src/main/resources/data/antarchy/loot_table/blocks/peach_log.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "antarchy:peach_log" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "minecraft:blocks/jungle_log" +} diff --git a/common/src/main/resources/data/antarchy/loot_table/blocks/peach_planks.json b/common/src/main/resources/data/antarchy/loot_table/blocks/peach_planks.json new file mode 100644 index 00000000..1bd313c7 --- /dev/null +++ b/common/src/main/resources/data/antarchy/loot_table/blocks/peach_planks.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "antarchy:peach_planks" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "minecraft:blocks/jungle_planks" +} diff --git a/common/src/main/resources/data/antarchy/loot_table/blocks/peach_pressure_plate.json b/common/src/main/resources/data/antarchy/loot_table/blocks/peach_pressure_plate.json new file mode 100644 index 00000000..7f9121ef --- /dev/null +++ b/common/src/main/resources/data/antarchy/loot_table/blocks/peach_pressure_plate.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "antarchy:peach_pressure_plate" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "minecraft:blocks/jungle_pressure_plate" +} diff --git a/common/src/main/resources/data/antarchy/loot_table/blocks/peach_sapling.json b/common/src/main/resources/data/antarchy/loot_table/blocks/peach_sapling.json new file mode 100644 index 00000000..7d35a420 --- /dev/null +++ b/common/src/main/resources/data/antarchy/loot_table/blocks/peach_sapling.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1.0, + "entries": [ + { + "type": "minecraft:item", + "name": "antarchy:peach_sapling" + } + ] + } + ], + "random_sequence": "antarchy:blocks/peach_sapling" +} diff --git a/common/src/main/resources/data/antarchy/loot_table/blocks/peach_sign.json b/common/src/main/resources/data/antarchy/loot_table/blocks/peach_sign.json new file mode 100644 index 00000000..610ea19d --- /dev/null +++ b/common/src/main/resources/data/antarchy/loot_table/blocks/peach_sign.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "antarchy:peach_sign" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "minecraft:blocks/jungle_sign" +} diff --git a/common/src/main/resources/data/antarchy/loot_table/blocks/peach_slab.json b/common/src/main/resources/data/antarchy/loot_table/blocks/peach_slab.json new file mode 100644 index 00000000..53e759d0 --- /dev/null +++ b/common/src/main/resources/data/antarchy/loot_table/blocks/peach_slab.json @@ -0,0 +1,35 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "add": false, + "conditions": [ + { + "block": "antarchy:peach_slab", + "condition": "minecraft:block_state_property", + "properties": { + "type": "double" + } + } + ], + "count": 2.0, + "function": "minecraft:set_count" + }, + { + "function": "minecraft:explosion_decay" + } + ], + "name": "antarchy:peach_slab" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "minecraft:blocks/jungle_slab" +} diff --git a/common/src/main/resources/data/antarchy/loot_table/blocks/peach_stairs.json b/common/src/main/resources/data/antarchy/loot_table/blocks/peach_stairs.json new file mode 100644 index 00000000..3f81f57e --- /dev/null +++ b/common/src/main/resources/data/antarchy/loot_table/blocks/peach_stairs.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "antarchy:peach_stairs" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "minecraft:blocks/jungle_stairs" +} diff --git a/common/src/main/resources/data/antarchy/loot_table/blocks/peach_trapdoor.json b/common/src/main/resources/data/antarchy/loot_table/blocks/peach_trapdoor.json new file mode 100644 index 00000000..ee2c8580 --- /dev/null +++ b/common/src/main/resources/data/antarchy/loot_table/blocks/peach_trapdoor.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "antarchy:peach_trapdoor" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "minecraft:blocks/jungle_trapdoor" +} diff --git a/common/src/main/resources/data/antarchy/loot_table/blocks/peach_wood.json b/common/src/main/resources/data/antarchy/loot_table/blocks/peach_wood.json new file mode 100644 index 00000000..f1787698 --- /dev/null +++ b/common/src/main/resources/data/antarchy/loot_table/blocks/peach_wood.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "antarchy:peach_wood" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "minecraft:blocks/jungle_wood" +} diff --git a/common/src/main/resources/data/antarchy/loot_table/blocks/stripped_peach_log.json b/common/src/main/resources/data/antarchy/loot_table/blocks/stripped_peach_log.json new file mode 100644 index 00000000..514158bb --- /dev/null +++ b/common/src/main/resources/data/antarchy/loot_table/blocks/stripped_peach_log.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "antarchy:stripped_peach_log" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "minecraft:blocks/stripped_jungle_log" +} diff --git a/common/src/main/resources/data/antarchy/loot_table/blocks/stripped_peach_wood.json b/common/src/main/resources/data/antarchy/loot_table/blocks/stripped_peach_wood.json new file mode 100644 index 00000000..91106444 --- /dev/null +++ b/common/src/main/resources/data/antarchy/loot_table/blocks/stripped_peach_wood.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "antarchy:stripped_peach_wood" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "minecraft:blocks/stripped_jungle_wood" +} diff --git a/common/src/main/resources/data/antarchy/loot_table/blocks/wild_corn.json b/common/src/main/resources/data/antarchy/loot_table/blocks/wild_corn.json new file mode 100644 index 00000000..46f29bdc --- /dev/null +++ b/common/src/main/resources/data/antarchy/loot_table/blocks/wild_corn.json @@ -0,0 +1,24 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1.0, + "conditions": [ + { + "condition": "minecraft:block_state_property", + "block": "antarchy:wild_corn", + "properties": { + "half": "lower" + } + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "antarchy:corn" + } + ] + } + ], + "random_sequence": "antarchy:blocks/wild_corn" +} diff --git a/common/src/main/resources/data/antarchy/loot_table/entities/ouranwood_deer.json b/common/src/main/resources/data/antarchy/loot_table/entities/ouranwood_deer.json new file mode 100644 index 00000000..5bd5aaec --- /dev/null +++ b/common/src/main/resources/data/antarchy/loot_table/entities/ouranwood_deer.json @@ -0,0 +1,75 @@ +{ + "type": "minecraft:entity", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:leather", + "functions": [ + { + "function": "minecraft:set_count", + "count": { + "type": "minecraft:uniform", + "min": 0.0, + "max": 2.0 + } + }, + { + "function": "minecraft:enchanted_count_increase", + "enchantment": "minecraft:looting", + "count": { + "type": "minecraft:uniform", + "min": 0.0, + "max": 1.0 + } + } + ] + } + ] + }, + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "antarchy:raw_venison", + "functions": [ + { + "function": "minecraft:set_count", + "count": { + "type": "minecraft:uniform", + "min": 1.0, + "max": 3.0 + } + }, + { + "function": "minecraft:furnace_smelt", + "conditions": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "flags": { + "is_on_fire": true + } + } + } + ] + }, + { + "function": "minecraft:enchanted_count_increase", + "enchantment": "minecraft:looting", + "count": { + "type": "minecraft:uniform", + "min": 0.0, + "max": 1.0 + } + } + ] + } + ] + } + ] +} diff --git a/common/src/main/resources/data/antarchy/recipe/americanize.json b/common/src/main/resources/data/antarchy/recipe/americanize.json new file mode 100644 index 00000000..ebddb8ef --- /dev/null +++ b/common/src/main/resources/data/antarchy/recipe/americanize.json @@ -0,0 +1,4 @@ +{ + "type": "antarchy:americanize", + "category": "misc" +} diff --git a/common/src/main/resources/data/antarchy/recipe/blush_moss_carpet.json b/common/src/main/resources/data/antarchy/recipe/blush_moss_carpet.json new file mode 100644 index 00000000..0a73f660 --- /dev/null +++ b/common/src/main/resources/data/antarchy/recipe/blush_moss_carpet.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "#": { + "item": "antarchy:blush_moss_block" + } + }, + "pattern": [ + "#", + "#" + ], + "result": { + "count": 3, + "id": "antarchy:blush_moss_carpet" + } +} diff --git a/common/src/main/resources/data/antarchy/recipe/cooked_corndog_from_smelting.json b/common/src/main/resources/data/antarchy/recipe/cooked_corndog_from_smelting.json new file mode 100644 index 00000000..8e6950c1 --- /dev/null +++ b/common/src/main/resources/data/antarchy/recipe/cooked_corndog_from_smelting.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:smelting", + "category": "food", + "cookingtime": 200, + "experience": 0.35, + "ingredient": { + "item": "antarchy:raw_corndog" + }, + "result": { + "id": "antarchy:cooked_corndog" + } +} diff --git a/common/src/main/resources/data/antarchy/recipe/cooked_corndog_from_smoking.json b/common/src/main/resources/data/antarchy/recipe/cooked_corndog_from_smoking.json new file mode 100644 index 00000000..b34b2896 --- /dev/null +++ b/common/src/main/resources/data/antarchy/recipe/cooked_corndog_from_smoking.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:smoking", + "category": "food", + "cookingtime": 100, + "experience": 0.35, + "ingredient": { + "item": "antarchy:raw_corndog" + }, + "result": { + "id": "antarchy:cooked_corndog" + } +} diff --git a/common/src/main/resources/data/antarchy/recipe/corn_seeds.json b/common/src/main/resources/data/antarchy/recipe/corn_seeds.json new file mode 100644 index 00000000..2afe7c63 --- /dev/null +++ b/common/src/main/resources/data/antarchy/recipe/corn_seeds.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "misc", + "ingredients": [ + { + "item": "antarchy:corn" + } + ], + "result": { + "count": 3, + "id": "antarchy:corn_seeds" + } +} diff --git a/common/src/main/resources/data/antarchy/recipe/miners_dream.json b/common/src/main/resources/data/antarchy/recipe/miners_dream.json new file mode 100644 index 00000000..b35b1c80 --- /dev/null +++ b/common/src/main/resources/data/antarchy/recipe/miners_dream.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "pattern": [ + "GGG", + "RDR", + "TTT" + ], + "key": { + "G": { "item": "antarchy:triffid_goo" }, + "R": { "item": "minecraft:redstone_block" }, + "D": { "item": "minecraft:diamond_pickaxe" }, + "T": { "item": "minecraft:tnt" } + }, + "result": { + "id": "antarchy:miners_dream", + "count": 1 + } +} diff --git a/common/src/main/resources/data/antarchy/recipe/peach/peach_boat.json b/common/src/main/resources/data/antarchy/recipe/peach/peach_boat.json new file mode 100644 index 00000000..9007e56b --- /dev/null +++ b/common/src/main/resources/data/antarchy/recipe/peach/peach_boat.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "key": { + "#": { + "item": "antarchy:peach_planks" + } + }, + "pattern": [ + "# #", + "###" + ], + "result": { + "count": 1, + "id": "antarchy:peach_boat" + } +} + diff --git a/common/src/main/resources/data/antarchy/recipe/peach/peach_button.json b/common/src/main/resources/data/antarchy/recipe/peach/peach_button.json new file mode 100644 index 00000000..385fea05 --- /dev/null +++ b/common/src/main/resources/data/antarchy/recipe/peach/peach_button.json @@ -0,0 +1,14 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "redstone", + "group": "wooden_button", + "ingredients": [ + { + "item": "antarchy:peach_planks" + } + ], + "result": { + "count": 1, + "id": "antarchy:peach_button" + } +} diff --git a/common/src/main/resources/data/antarchy/recipe/peach/peach_chest_boat.json b/common/src/main/resources/data/antarchy/recipe/peach/peach_chest_boat.json new file mode 100644 index 00000000..c865282a --- /dev/null +++ b/common/src/main/resources/data/antarchy/recipe/peach/peach_chest_boat.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "equipment", + "ingredients": [ + { + "item": "antarchy:peach_boat" + }, + { + "item": "minecraft:chest" + } + ], + "result": { + "count": 1, + "id": "antarchy:peach_chest_boat" + } +} + diff --git a/common/src/main/resources/data/antarchy/recipe/peach/peach_door.json b/common/src/main/resources/data/antarchy/recipe/peach/peach_door.json new file mode 100644 index 00000000..d912173b --- /dev/null +++ b/common/src/main/resources/data/antarchy/recipe/peach/peach_door.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "redstone", + "group": "wooden_door", + "key": { + "#": { + "item": "antarchy:peach_planks" + } + }, + "pattern": [ + "##", + "##", + "##" + ], + "result": { + "count": 3, + "id": "antarchy:peach_door" + } +} diff --git a/common/src/main/resources/data/antarchy/recipe/peach/peach_fence.json b/common/src/main/resources/data/antarchy/recipe/peach/peach_fence.json new file mode 100644 index 00000000..f86ace23 --- /dev/null +++ b/common/src/main/resources/data/antarchy/recipe/peach/peach_fence.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "group": "wooden_fence", + "key": { + "#": { + "item": "minecraft:stick" + }, + "W": { + "item": "antarchy:peach_planks" + } + }, + "pattern": [ + "W#W", + "W#W" + ], + "result": { + "count": 3, + "id": "antarchy:peach_fence" + } +} diff --git a/common/src/main/resources/data/antarchy/recipe/peach/peach_fence_gate.json b/common/src/main/resources/data/antarchy/recipe/peach/peach_fence_gate.json new file mode 100644 index 00000000..7954228f --- /dev/null +++ b/common/src/main/resources/data/antarchy/recipe/peach/peach_fence_gate.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "redstone", + "group": "wooden_fence_gate", + "key": { + "#": { + "item": "minecraft:stick" + }, + "W": { + "item": "antarchy:peach_planks" + } + }, + "pattern": [ + "#W#", + "#W#" + ], + "result": { + "count": 1, + "id": "antarchy:peach_fence_gate" + } +} diff --git a/common/src/main/resources/data/antarchy/recipe/peach/peach_hanging_sign.json b/common/src/main/resources/data/antarchy/recipe/peach/peach_hanging_sign.json new file mode 100644 index 00000000..8fcc4847 --- /dev/null +++ b/common/src/main/resources/data/antarchy/recipe/peach/peach_hanging_sign.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "group": "hanging_sign", + "key": { + "#": { + "item": "antarchy:stripped_peach_log" + }, + "X": { + "item": "minecraft:chain" + } + }, + "pattern": [ + "X X", + "###", + "###" + ], + "result": { + "count": 6, + "id": "antarchy:peach_hanging_sign" + } +} diff --git a/common/src/main/resources/data/antarchy/recipe/peach/peach_planks.json b/common/src/main/resources/data/antarchy/recipe/peach/peach_planks.json new file mode 100644 index 00000000..d0892886 --- /dev/null +++ b/common/src/main/resources/data/antarchy/recipe/peach/peach_planks.json @@ -0,0 +1,14 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "group": "planks", + "ingredients": [ + { + "tag": "antarchy:peach_logs" + } + ], + "result": { + "count": 4, + "id": "antarchy:peach_planks" + } +} diff --git a/common/src/main/resources/data/antarchy/recipe/peach/peach_pressure_plate.json b/common/src/main/resources/data/antarchy/recipe/peach/peach_pressure_plate.json new file mode 100644 index 00000000..09fb8352 --- /dev/null +++ b/common/src/main/resources/data/antarchy/recipe/peach/peach_pressure_plate.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "redstone", + "group": "wooden_pressure_plate", + "key": { + "#": { + "item": "antarchy:peach_planks" + } + }, + "pattern": [ + "##" + ], + "result": { + "count": 1, + "id": "antarchy:peach_pressure_plate" + } +} diff --git a/common/src/main/resources/data/antarchy/recipe/peach/peach_sign.json b/common/src/main/resources/data/antarchy/recipe/peach/peach_sign.json new file mode 100644 index 00000000..cc36aa0d --- /dev/null +++ b/common/src/main/resources/data/antarchy/recipe/peach/peach_sign.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "group": "wooden_sign", + "key": { + "#": { + "item": "antarchy:peach_planks" + }, + "X": { + "item": "minecraft:stick" + } + }, + "pattern": [ + "###", + "###", + " X " + ], + "result": { + "count": 3, + "id": "antarchy:peach_sign" + } +} diff --git a/common/src/main/resources/data/antarchy/recipe/peach/peach_slab.json b/common/src/main/resources/data/antarchy/recipe/peach/peach_slab.json new file mode 100644 index 00000000..7cfe2b41 --- /dev/null +++ b/common/src/main/resources/data/antarchy/recipe/peach/peach_slab.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "group": "wooden_slab", + "key": { + "#": { + "item": "antarchy:peach_planks" + } + }, + "pattern": [ + "###" + ], + "result": { + "count": 6, + "id": "antarchy:peach_slab" + } +} diff --git a/common/src/main/resources/data/antarchy/recipe/peach/peach_stairs.json b/common/src/main/resources/data/antarchy/recipe/peach/peach_stairs.json new file mode 100644 index 00000000..84cad977 --- /dev/null +++ b/common/src/main/resources/data/antarchy/recipe/peach/peach_stairs.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "group": "wooden_stairs", + "key": { + "#": { + "item": "antarchy:peach_planks" + } + }, + "pattern": [ + "# ", + "## ", + "###" + ], + "result": { + "count": 4, + "id": "antarchy:peach_stairs" + } +} diff --git a/common/src/main/resources/data/antarchy/recipe/peach/peach_trapdoor.json b/common/src/main/resources/data/antarchy/recipe/peach/peach_trapdoor.json new file mode 100644 index 00000000..3332467d --- /dev/null +++ b/common/src/main/resources/data/antarchy/recipe/peach/peach_trapdoor.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "redstone", + "group": "wooden_trapdoor", + "key": { + "#": { + "item": "antarchy:peach_planks" + } + }, + "pattern": [ + "###", + "###" + ], + "result": { + "count": 2, + "id": "antarchy:peach_trapdoor" + } +} diff --git a/common/src/main/resources/data/antarchy/recipe/peach/peach_wood.json b/common/src/main/resources/data/antarchy/recipe/peach/peach_wood.json new file mode 100644 index 00000000..5fd213ea --- /dev/null +++ b/common/src/main/resources/data/antarchy/recipe/peach/peach_wood.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "group": "bark", + "key": { + "#": { + "item": "antarchy:peach_log" + } + }, + "pattern": [ + "##", + "##" + ], + "result": { + "count": 3, + "id": "antarchy:peach_wood" + } +} diff --git a/common/src/main/resources/data/antarchy/recipe/peach/stripped_peach_wood.json b/common/src/main/resources/data/antarchy/recipe/peach/stripped_peach_wood.json new file mode 100644 index 00000000..6c28a618 --- /dev/null +++ b/common/src/main/resources/data/antarchy/recipe/peach/stripped_peach_wood.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "group": "bark", + "key": { + "#": { + "item": "antarchy:stripped_peach_log" + } + }, + "pattern": [ + "##", + "##" + ], + "result": { + "count": 3, + "id": "antarchy:stripped_peach_wood" + } +} diff --git a/common/src/main/resources/data/antarchy/recipe/raw_corndog.json b/common/src/main/resources/data/antarchy/recipe/raw_corndog.json new file mode 100644 index 00000000..6d5e09fb --- /dev/null +++ b/common/src/main/resources/data/antarchy/recipe/raw_corndog.json @@ -0,0 +1,24 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "food", + "key": { + "#": { + "tag": "antarchy:corndog_meats" + }, + "C": { + "item": "antarchy:corn" + }, + "S": { + "item": "minecraft:stick" + } + }, + "pattern": [ + "CCC", + " # ", + " S " + ], + "result": { + "count": 1, + "id": "antarchy:raw_corndog" + } +} diff --git a/common/src/main/resources/data/antarchy/tags/block/blush_moss_replaceable.json b/common/src/main/resources/data/antarchy/tags/block/blush_moss_replaceable.json new file mode 100644 index 00000000..9ccd3add --- /dev/null +++ b/common/src/main/resources/data/antarchy/tags/block/blush_moss_replaceable.json @@ -0,0 +1,8 @@ +{ + "values": [ + "#minecraft:moss_replaceable", + "antarchy:nyxite", + "minecraft:blackstone", + "antarchy:blush_moss_block" + ] +} diff --git a/common/src/main/resources/data/antarchy/tags/block/miners_dream_carvable.json b/common/src/main/resources/data/antarchy/tags/block/miners_dream_carvable.json new file mode 100644 index 00000000..6f7d26ee --- /dev/null +++ b/common/src/main/resources/data/antarchy/tags/block/miners_dream_carvable.json @@ -0,0 +1,36 @@ +{ + "replace": false, + "values": [ + "#minecraft:base_stone_overworld", + "#minecraft:base_stone_nether", + "minecraft:stone", + "minecraft:deepslate", + "minecraft:granite", + "minecraft:diorite", + "minecraft:andesite", + "minecraft:tuff", + "minecraft:calcite", + "minecraft:netherrack", + "minecraft:blackstone", + "minecraft:basalt", + "minecraft:smooth_basalt", + "minecraft:end_stone", + "minecraft:dirt", + "minecraft:coarse_dirt", + "minecraft:rooted_dirt", + "minecraft:podzol", + "minecraft:mycelium", + "minecraft:gravel", + "minecraft:sand", + "minecraft:red_sand", + "minecraft:sandstone", + "minecraft:red_sandstone", + "minecraft:clay", + "minecraft:soul_sand", + "minecraft:soul_soil", + "antarchy:nyxite", + "antarchy:pale_nyxite", + "antarchy:dream_sand", + "antarchy:dream_sandstone" + ] +} diff --git a/common/src/main/resources/data/antarchy/tags/block/peach_logs.json b/common/src/main/resources/data/antarchy/tags/block/peach_logs.json new file mode 100644 index 00000000..5a1d9ec3 --- /dev/null +++ b/common/src/main/resources/data/antarchy/tags/block/peach_logs.json @@ -0,0 +1,9 @@ +{ + "replace": false, + "values": [ + "antarchy:peach_log", + "antarchy:peach_wood", + "antarchy:stripped_peach_log", + "antarchy:stripped_peach_wood" + ] +} diff --git a/common/src/main/resources/data/antarchy/tags/entity_type/basilisk_prey.json b/common/src/main/resources/data/antarchy/tags/entity_type/basilisk_prey.json index cca32e6b..9ab26ecf 100644 --- a/common/src/main/resources/data/antarchy/tags/entity_type/basilisk_prey.json +++ b/common/src/main/resources/data/antarchy/tags/entity_type/basilisk_prey.json @@ -7,6 +7,7 @@ "minecraft:sheep", "minecraft:cow", "minecraft:mooshroom", + "minecraft:frog", "antarchy:flying_squirrel", "antarchy:moleworm", "antarchy:red_ant", @@ -15,6 +16,7 @@ "antarchy:apple_cow", "antarchy:golden_apple_cow", "antarchy:enchanted_golden_apple_cow", - "antarchy:caterpillar" + "antarchy:caterpillar", + "antarchy:glimmer" ] } diff --git a/common/src/main/resources/data/antarchy/tags/entity_type/dread_hallucination_mobs.json b/common/src/main/resources/data/antarchy/tags/entity_type/dread_hallucination_mobs.json index b78de163..c3129700 100644 --- a/common/src/main/resources/data/antarchy/tags/entity_type/dread_hallucination_mobs.json +++ b/common/src/main/resources/data/antarchy/tags/entity_type/dread_hallucination_mobs.json @@ -9,6 +9,9 @@ "minecraft:wither", "minecraft:creeper", "minecraft:skeleton", - "minecraft:spider" + "minecraft:spider", + "antarchy:toreterror", + "antarchy:creeping_horror", + "antarchy:lurking_terror" ] } diff --git a/common/src/main/resources/data/antarchy/tags/entity_type/frog_glimmer_no_eat.json b/common/src/main/resources/data/antarchy/tags/entity_type/frog_glimmer_no_eat.json new file mode 100644 index 00000000..abe11627 --- /dev/null +++ b/common/src/main/resources/data/antarchy/tags/entity_type/frog_glimmer_no_eat.json @@ -0,0 +1,9 @@ +{ + "values": [ + "antarchy:kraken", + "antarchy:toreterror", + "antarchy:emperor_scorpion", + "antarchy:alpha_mantis", + "antarchy:brutalfly" + ] +} diff --git a/common/src/main/resources/data/antarchy/tags/fluids/lumen.json b/common/src/main/resources/data/antarchy/tags/fluids/lumen.json new file mode 100644 index 00000000..f44595c4 --- /dev/null +++ b/common/src/main/resources/data/antarchy/tags/fluids/lumen.json @@ -0,0 +1,7 @@ +{ + "replace": false, + "values": [ + "antarchy:lumen", + "antarchy:flowing_lumen" + ] +} diff --git a/common/src/main/resources/data/antarchy/tags/item/corndog_meats.json b/common/src/main/resources/data/antarchy/tags/item/corndog_meats.json new file mode 100644 index 00000000..e7b7233e --- /dev/null +++ b/common/src/main/resources/data/antarchy/tags/item/corndog_meats.json @@ -0,0 +1,19 @@ +{ + "replace": false, + "values": [ + "minecraft:chicken", + "minecraft:porkchop", + { + "id": "c:foods/raw_meat", + "required": false + }, + { + "id": "c:foods/raw_chicken", + "required": false + }, + { + "id": "c:foods/raw_pork", + "required": false + } + ] +} diff --git a/common/src/main/resources/data/antarchy/tags/item/glimmer_augment_ant.json b/common/src/main/resources/data/antarchy/tags/item/glimmer_augment_ant.json new file mode 100644 index 00000000..2bee141d --- /dev/null +++ b/common/src/main/resources/data/antarchy/tags/item/glimmer_augment_ant.json @@ -0,0 +1,5 @@ +{ + "values": [ + "minecraft:bread" + ] +} diff --git a/common/src/main/resources/data/antarchy/tags/item/glimmer_augment_apple_cow.json b/common/src/main/resources/data/antarchy/tags/item/glimmer_augment_apple_cow.json new file mode 100644 index 00000000..3fa00a6b --- /dev/null +++ b/common/src/main/resources/data/antarchy/tags/item/glimmer_augment_apple_cow.json @@ -0,0 +1,5 @@ +{ + "values": [ + "minecraft:apple" + ] +} diff --git a/common/src/main/resources/data/antarchy/tags/item/glimmer_augment_elka.json b/common/src/main/resources/data/antarchy/tags/item/glimmer_augment_elka.json new file mode 100644 index 00000000..b11da3ed --- /dev/null +++ b/common/src/main/resources/data/antarchy/tags/item/glimmer_augment_elka.json @@ -0,0 +1,5 @@ +{ + "values": [ + "antarchy:peach" + ] +} diff --git a/common/src/main/resources/data/antarchy/tags/item/glimmer_augment_frog.json b/common/src/main/resources/data/antarchy/tags/item/glimmer_augment_frog.json new file mode 100644 index 00000000..d9233809 --- /dev/null +++ b/common/src/main/resources/data/antarchy/tags/item/glimmer_augment_frog.json @@ -0,0 +1,5 @@ +{ + "values": [ + "minecraft:slime_ball" + ] +} diff --git a/common/src/main/resources/data/antarchy/tags/item/glimmer_augment_ouranwood_deer.json b/common/src/main/resources/data/antarchy/tags/item/glimmer_augment_ouranwood_deer.json new file mode 100644 index 00000000..f0885728 --- /dev/null +++ b/common/src/main/resources/data/antarchy/tags/item/glimmer_augment_ouranwood_deer.json @@ -0,0 +1,5 @@ +{ + "values": [ + "minecraft:glow_berries" + ] +} diff --git a/common/src/main/resources/data/antarchy/tags/item/hfcs_cannot_americanize.json b/common/src/main/resources/data/antarchy/tags/item/hfcs_cannot_americanize.json new file mode 100644 index 00000000..86dde3df --- /dev/null +++ b/common/src/main/resources/data/antarchy/tags/item/hfcs_cannot_americanize.json @@ -0,0 +1,3 @@ +{ + "values": [] +} diff --git a/common/src/main/resources/data/antarchy/tags/item/glimmer_food.json b/common/src/main/resources/data/antarchy/tags/item/ouranwood_deer_food.json similarity index 100% rename from common/src/main/resources/data/antarchy/tags/item/glimmer_food.json rename to common/src/main/resources/data/antarchy/tags/item/ouranwood_deer_food.json diff --git a/common/src/main/resources/data/antarchy/tags/item/peach_logs.json b/common/src/main/resources/data/antarchy/tags/item/peach_logs.json new file mode 100644 index 00000000..5a1d9ec3 --- /dev/null +++ b/common/src/main/resources/data/antarchy/tags/item/peach_logs.json @@ -0,0 +1,9 @@ +{ + "replace": false, + "values": [ + "antarchy:peach_log", + "antarchy:peach_wood", + "antarchy:stripped_peach_log", + "antarchy:stripped_peach_wood" + ] +} diff --git a/common/src/main/resources/data/antarchy/tags/item/roots.json b/common/src/main/resources/data/antarchy/tags/item/roots.json new file mode 100644 index 00000000..149abdd0 --- /dev/null +++ b/common/src/main/resources/data/antarchy/tags/item/roots.json @@ -0,0 +1,8 @@ +{ + "replace": false, + "values": [ + "minecraft:hanging_roots", + "minecraft:crimson_roots", + "minecraft:warped_roots" + ] +} diff --git a/common/src/main/resources/data/antarchy/tags/item/venison_foods.json b/common/src/main/resources/data/antarchy/tags/item/venison_foods.json new file mode 100644 index 00000000..43bb9bec --- /dev/null +++ b/common/src/main/resources/data/antarchy/tags/item/venison_foods.json @@ -0,0 +1,7 @@ +{ + "replace": false, + "values": [ + "antarchy:raw_venison", + "antarchy:cooked_venison" + ] +} diff --git a/common/src/main/resources/data/antarchy/tags/worldgen/biome/cloud_shark_spawn_biomes.json b/common/src/main/resources/data/antarchy/tags/worldgen/biome/cloud_shark_spawn_biomes.json index ce383501..6968700c 100644 --- a/common/src/main/resources/data/antarchy/tags/worldgen/biome/cloud_shark_spawn_biomes.json +++ b/common/src/main/resources/data/antarchy/tags/worldgen/biome/cloud_shark_spawn_biomes.json @@ -1,7 +1,6 @@ { "replace": false, "values": [ - "antarchy:ouranwood_forest", - "antarchy:elythia_meadow" + "antarchy:cloud_sea" ] } diff --git a/common/src/main/resources/data/antarchy/tags/worldgen/biome/elythia_firefly_particle_biomes.json b/common/src/main/resources/data/antarchy/tags/worldgen/biome/elythia_firefly_particle_biomes.json index ff348954..6a681567 100644 --- a/common/src/main/resources/data/antarchy/tags/worldgen/biome/elythia_firefly_particle_biomes.json +++ b/common/src/main/resources/data/antarchy/tags/worldgen/biome/elythia_firefly_particle_biomes.json @@ -5,6 +5,7 @@ "antarchy:torchflower_fields", "antarchy:butterfly_fields", "antarchy:ouranwood_forest", + "antarchy:peach_forest", "antarchy:sparse_ouranwood_forest" ] } diff --git a/common/src/main/resources/data/antarchy/tags/worldgen/biome/flying_squirrel_spawn_biomes.json b/common/src/main/resources/data/antarchy/tags/worldgen/biome/flying_squirrel_spawn_biomes.json index 893e9545..f0e41d94 100644 --- a/common/src/main/resources/data/antarchy/tags/worldgen/biome/flying_squirrel_spawn_biomes.json +++ b/common/src/main/resources/data/antarchy/tags/worldgen/biome/flying_squirrel_spawn_biomes.json @@ -1,6 +1,7 @@ { "replace": false, "values": [ - "antarchy:ouranwood_forest" + "antarchy:ouranwood_forest", + "antarchy:peach_forest" ] } diff --git a/common/src/main/resources/data/antarchy/tags/worldgen/biome/honeyed_apple_cow_spawn_biomes.json b/common/src/main/resources/data/antarchy/tags/worldgen/biome/honeyed_apple_cow_spawn_biomes.json deleted file mode 100644 index 8b04fba0..00000000 --- a/common/src/main/resources/data/antarchy/tags/worldgen/biome/honeyed_apple_cow_spawn_biomes.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "replace": false, - "values": [ - "#c:is_plains", - "#c:is_forest", - "#c:is_taiga", - "antarchy:ouranwood_forest", - "antarchy:elythia_meadow" - ] -} diff --git a/common/src/main/resources/data/antarchy/tags/worldgen/biome/is_elythia.json b/common/src/main/resources/data/antarchy/tags/worldgen/biome/is_elythia.json index 8e11611d..37c02378 100644 --- a/common/src/main/resources/data/antarchy/tags/worldgen/biome/is_elythia.json +++ b/common/src/main/resources/data/antarchy/tags/worldgen/biome/is_elythia.json @@ -8,6 +8,8 @@ "antarchy:torchflower_fields", "antarchy:moleworm_caves", "antarchy:ouranwood_forest", + "antarchy:peach_forest", + "antarchy:glimmering_pools", "antarchy:sparse_ouranwood_forest", "antarchy:elythia_ocean", "antarchy:elythia_coral_spikes", diff --git a/common/src/main/resources/data/antarchy/tags/worldgen/biome/wild_corn_spawn_biomes.json b/common/src/main/resources/data/antarchy/tags/worldgen/biome/wild_corn_spawn_biomes.json new file mode 100644 index 00000000..44db277a --- /dev/null +++ b/common/src/main/resources/data/antarchy/tags/worldgen/biome/wild_corn_spawn_biomes.json @@ -0,0 +1,13 @@ +{ + "replace": false, + "values": [ + "#c:is_plains", + "minecraft:plains", + "minecraft:sunflower_plains", + "minecraft:meadow", + { + "id": "#c:plains", + "required": false + } + ] +} diff --git a/common/src/main/resources/data/antarchy/worldgen/biome/elythia_meadow.json b/common/src/main/resources/data/antarchy/worldgen/biome/elythia_meadow.json index 52a9652b..ec8424ab 100644 --- a/common/src/main/resources/data/antarchy/worldgen/biome/elythia_meadow.json +++ b/common/src/main/resources/data/antarchy/worldgen/biome/elythia_meadow.json @@ -18,6 +18,10 @@ } }, "spawn_costs": { + "antarchy:mantis": { + "energy_budget": 0.1, + "charge": 18.0 + }, "antarchy:mantis": { "energy_budget": 0.1, "charge": 15.0 @@ -100,7 +104,7 @@ "weight": 16, "minCount": 1, "maxCount": 3 - }, + } ], "ambient": [ { diff --git a/common/src/main/resources/data/antarchy/worldgen/biome/fungal_ouranwood_forest.json b/common/src/main/resources/data/antarchy/worldgen/biome/fungal_ouranwood_forest.json index 356f0ce0..c6c5746e 100644 --- a/common/src/main/resources/data/antarchy/worldgen/biome/fungal_ouranwood_forest.json +++ b/common/src/main/resources/data/antarchy/worldgen/biome/fungal_ouranwood_forest.json @@ -73,6 +73,12 @@ "spawners": { "monster": [], "creature": [ + { + "type": "minecraft:frog", + "weight": 3, + "minCount": 1, + "maxCount": 1 + }, { "type": "antarchy:caterpillar", "weight": 5, @@ -85,6 +91,12 @@ "minCount": 1, "maxCount": 2 }, + { + "type": "antarchy:ouranwood_deer", + "weight": 5, + "minCount": 1, + "maxCount": 2 + } ], "ambient": [ { diff --git a/common/src/main/resources/data/antarchy/worldgen/biome/glimmering_pools.json b/common/src/main/resources/data/antarchy/worldgen/biome/glimmering_pools.json new file mode 100644 index 00000000..d7022a41 --- /dev/null +++ b/common/src/main/resources/data/antarchy/worldgen/biome/glimmering_pools.json @@ -0,0 +1,94 @@ +{ + "has_precipitation": false, + "temperature": 0.76, + "downfall": 1.0, + "effects": { + "fog_color": 8084735, + "water_color": 5923435, + "water_fog_color": 3297596, + "sky_color": 8084735, + "foliage_color": 2867501, + "grass_color": 4304168, + "grass_color_modifier": "none", + "mood_sound": { + "sound": "minecraft:ambient.crimson_forest.mood", + "tick_delay": 6000, + "block_search_extent": 8, + "offset": 2.0 + } + }, + "spawn_costs": {}, + "carvers": { + "air": [], + "liquid": [] + }, + "features": [ + [], + [ + "antarchy:lumen_pools", + "antarchy:lumen_streams", + "antarchy:lumen_lily_pads" + ], + [], + [], + [], + [], + [ + "minecraft:ore_coal_upper", + "minecraft:ore_coal_lower", + "minecraft:ore_iron_upper", + "minecraft:ore_iron_middle", + "minecraft:ore_iron_small", + "minecraft:ore_gold", + "minecraft:ore_gold_lower", + "minecraft:ore_redstone", + "minecraft:ore_redstone_lower", + "minecraft:ore_diamond", + "minecraft:ore_diamond_medium", + "minecraft:ore_diamond_large", + "minecraft:ore_diamond_buried", + "minecraft:ore_lapis", + "minecraft:ore_lapis_buried", + "minecraft:ore_copper" + ], + [ + "antarchy:elythia_underground", + "minecraft:large_dripstone", + "minecraft:pointed_dripstone" + ], + [], + [ + "antarchy:ouranwood_trees_sparse", + "antarchy:elythia_forest_flora", + "antarchy:elythia_brown_ant_nests", + "antarchy:elythia_rainbow_ant_nests" + ], + [] + ], + "creature_spawn_probability": 0.16, + "spawners": { + "monster": [], + "creature": [ + { + "type": "antarchy:glimmer", + "weight": 36, + "minCount": 3, + "maxCount": 6 + } + ], + "ambient": [ + ], + "axolotls": [], + "underground_water_creature": [ + { + "type": "minecraft:glow_squid", + "weight": 14, + "minCount": 2, + "maxCount": 4 + } + ], + "water_creature": [], + "water_ambient": [], + "misc": [] + } +} diff --git a/common/src/main/resources/data/antarchy/worldgen/biome/ouranwood_forest.json b/common/src/main/resources/data/antarchy/worldgen/biome/ouranwood_forest.json index a9bc5c29..2c09276a 100644 --- a/common/src/main/resources/data/antarchy/worldgen/biome/ouranwood_forest.json +++ b/common/src/main/resources/data/antarchy/worldgen/biome/ouranwood_forest.json @@ -85,6 +85,12 @@ } ], "creature": [ + { + "type": "minecraft:frog", + "weight": 3, + "minCount": 1, + "maxCount": 1 + }, { "type": "antarchy:caterpillar", "weight": 6, @@ -97,6 +103,12 @@ "minCount": 1, "maxCount": 1 }, + { + "type": "antarchy:ouranwood_deer", + "weight": 6, + "minCount": 1, + "maxCount": 2 + } ], "ambient": [ ], diff --git a/common/src/main/resources/data/antarchy/worldgen/biome/peach_forest.json b/common/src/main/resources/data/antarchy/worldgen/biome/peach_forest.json new file mode 100644 index 00000000..6cbf84be --- /dev/null +++ b/common/src/main/resources/data/antarchy/worldgen/biome/peach_forest.json @@ -0,0 +1,106 @@ +{ + "has_precipitation": false, + "temperature": 0.69, + "downfall": 0.97, + "effects": { + "fog_color": 8084735, + "water_color": 5021432, + "water_fog_color": 2502722, + "sky_color": 8084735, + "foliage_color": 2867501, + "grass_color": 16748737, + "grass_color_modifier": "none", + "mood_sound": { + "sound": "minecraft:ambient.crimson_forest.mood", + "tick_delay": 6000, + "block_search_extent": 8, + "offset": 2.0 + } + }, + "spawn_costs": { + }, + "carvers": { + "air": [], + "liquid": [] + }, + "features": [ + [], + [], + [ + "antarchy:peach_forest_ponds_large", + "antarchy:peach_forest_ponds_medium", + "antarchy:peach_forest_ponds_small" + ], + [], + [], + [], + [ + "minecraft:ore_coal_upper", + "minecraft:ore_coal_lower", + "minecraft:ore_iron_upper", + "minecraft:ore_iron_middle", + "minecraft:ore_iron_small", + "minecraft:ore_gold", + "minecraft:ore_gold_lower", + "minecraft:ore_redstone", + "minecraft:ore_redstone_lower", + "minecraft:ore_diamond", + "minecraft:ore_diamond_medium", + "minecraft:ore_diamond_large", + "minecraft:ore_diamond_buried", + "minecraft:ore_lapis", + "minecraft:ore_lapis_buried", + "minecraft:ore_copper" + ], + [ + "antarchy:elythia_underground", + "minecraft:large_dripstone", + "minecraft:pointed_dripstone" + ], + [], + [ + "antarchy:peach_forest_mossy_boulders", + "antarchy:blush_moss_patch", + "antarchy:peach_forest_petals", + "antarchy:peach_large_tree", + "antarchy:peach_tree", + "antarchy:peach_forest_flora", + "antarchy:elythia_rainbow_ant_nests" + ], + [] + ], + "creature_spawn_probability": 0.18, + "spawners": { + "monster": [ + ], + "creature": [ + { + "type": "antarchy:elka", + "weight": 15, + "minCount": 1, + "maxCount": 3 + }, + { + "type": "minecraft:frog", + "weight": 25, + "minCount": 3, + "maxCount": 6 + } + ], + "ambient": [ + { + "type": "antarchy:butterfly", + "weight": 7, + "minCount": 1, + "maxCount": 2 + } + ], + "axolotls": [], + "underground_water_creature": [], + "water_creature": [ + ], + "water_ambient": [ + ], + "misc": [] + } +} diff --git a/common/src/main/resources/data/antarchy/worldgen/biome/sparse_ouranwood_forest.json b/common/src/main/resources/data/antarchy/worldgen/biome/sparse_ouranwood_forest.json index 6f0ff98e..3b97d701 100644 --- a/common/src/main/resources/data/antarchy/worldgen/biome/sparse_ouranwood_forest.json +++ b/common/src/main/resources/data/antarchy/worldgen/biome/sparse_ouranwood_forest.json @@ -107,6 +107,12 @@ "minCount": 1, "maxCount": 2 }, + { + "type": "antarchy:ouranwood_deer", + "weight": 4, + "minCount": 1, + "maxCount": 1 + } ], "ambient": [ { diff --git a/common/src/main/resources/data/antarchy/worldgen/configured_feature/blush_moss_patch.json b/common/src/main/resources/data/antarchy/worldgen/configured_feature/blush_moss_patch.json new file mode 100644 index 00000000..1c3ecfe4 --- /dev/null +++ b/common/src/main/resources/data/antarchy/worldgen/configured_feature/blush_moss_patch.json @@ -0,0 +1,27 @@ +{ + "type": "minecraft:vegetation_patch", + "config": { + "depth": 1, + "extra_bottom_block_chance": 0.0, + "extra_edge_column_chance": 0.3, + "ground_state": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "antarchy:blush_moss_block" + } + }, + "replaceable": "#antarchy:blush_moss_replaceable", + "surface": "floor", + "vegetation_chance": 0.8, + "vegetation_feature": { + "feature": "antarchy:blush_moss_vegetation", + "placement": [] + }, + "vertical_range": 5, + "xz_radius": { + "type": "minecraft:uniform", + "max_inclusive": 7, + "min_inclusive": 4 + } + } +} diff --git a/common/src/main/resources/data/antarchy/worldgen/configured_feature/blush_moss_patch_bonemeal.json b/common/src/main/resources/data/antarchy/worldgen/configured_feature/blush_moss_patch_bonemeal.json new file mode 100644 index 00000000..1c3ecfe4 --- /dev/null +++ b/common/src/main/resources/data/antarchy/worldgen/configured_feature/blush_moss_patch_bonemeal.json @@ -0,0 +1,27 @@ +{ + "type": "minecraft:vegetation_patch", + "config": { + "depth": 1, + "extra_bottom_block_chance": 0.0, + "extra_edge_column_chance": 0.3, + "ground_state": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "antarchy:blush_moss_block" + } + }, + "replaceable": "#antarchy:blush_moss_replaceable", + "surface": "floor", + "vegetation_chance": 0.8, + "vegetation_feature": { + "feature": "antarchy:blush_moss_vegetation", + "placement": [] + }, + "vertical_range": 5, + "xz_radius": { + "type": "minecraft:uniform", + "max_inclusive": 7, + "min_inclusive": 4 + } + } +} diff --git a/common/src/main/resources/data/antarchy/worldgen/configured_feature/blush_moss_vegetation.json b/common/src/main/resources/data/antarchy/worldgen/configured_feature/blush_moss_vegetation.json new file mode 100644 index 00000000..bcf78e9a --- /dev/null +++ b/common/src/main/resources/data/antarchy/worldgen/configured_feature/blush_moss_vegetation.json @@ -0,0 +1,23 @@ +{ + "type": "minecraft:simple_block", + "config": { + "to_place": { + "type": "minecraft:weighted_state_provider", + "entries": [ + { + "data": { + "Name": "antarchy:blush_moss_carpet", + "Properties": { + "bottom": "true", + "east": "none", + "north": "none", + "south": "none", + "west": "none" + } + }, + "weight": 25 + } + ] + } + } +} diff --git a/common/src/main/resources/data/antarchy/worldgen/configured_feature/corn_patch.json b/common/src/main/resources/data/antarchy/worldgen/configured_feature/corn_patch.json new file mode 100644 index 00000000..d6fd8f3c --- /dev/null +++ b/common/src/main/resources/data/antarchy/worldgen/configured_feature/corn_patch.json @@ -0,0 +1,4 @@ +{ + "type": "antarchy:corn_patch", + "config": {} +} diff --git a/common/src/main/resources/data/antarchy/worldgen/configured_feature/lumen_lily_pads.json b/common/src/main/resources/data/antarchy/worldgen/configured_feature/lumen_lily_pads.json new file mode 100644 index 00000000..f266ce88 --- /dev/null +++ b/common/src/main/resources/data/antarchy/worldgen/configured_feature/lumen_lily_pads.json @@ -0,0 +1,4 @@ +{ + "type": "antarchy:lumen_lily_pads", + "config": {} +} diff --git a/common/src/main/resources/data/antarchy/worldgen/configured_feature/lumen_pools.json b/common/src/main/resources/data/antarchy/worldgen/configured_feature/lumen_pools.json new file mode 100644 index 00000000..2c7be22b --- /dev/null +++ b/common/src/main/resources/data/antarchy/worldgen/configured_feature/lumen_pools.json @@ -0,0 +1,4 @@ +{ + "type": "antarchy:lumen_pools", + "config": {} +} diff --git a/common/src/main/resources/data/antarchy/worldgen/configured_feature/lumen_streams.json b/common/src/main/resources/data/antarchy/worldgen/configured_feature/lumen_streams.json new file mode 100644 index 00000000..d90db198 --- /dev/null +++ b/common/src/main/resources/data/antarchy/worldgen/configured_feature/lumen_streams.json @@ -0,0 +1,4 @@ +{ + "type": "antarchy:lumen_streams", + "config": {} +} diff --git a/common/src/main/resources/data/antarchy/worldgen/configured_feature/peach_forest_flora.json b/common/src/main/resources/data/antarchy/worldgen/configured_feature/peach_forest_flora.json new file mode 100644 index 00000000..7dfc323c --- /dev/null +++ b/common/src/main/resources/data/antarchy/worldgen/configured_feature/peach_forest_flora.json @@ -0,0 +1,4 @@ +{ + "type": "antarchy:peach_forest_flora", + "config": {} +} diff --git a/common/src/main/resources/data/antarchy/worldgen/configured_feature/peach_forest_mossy_boulder.json b/common/src/main/resources/data/antarchy/worldgen/configured_feature/peach_forest_mossy_boulder.json new file mode 100644 index 00000000..b980262e --- /dev/null +++ b/common/src/main/resources/data/antarchy/worldgen/configured_feature/peach_forest_mossy_boulder.json @@ -0,0 +1,4 @@ +{ + "type": "antarchy:peach_forest_mossy_boulder", + "config": {} +} diff --git a/common/src/main/resources/data/antarchy/worldgen/configured_feature/peach_forest_petals.json b/common/src/main/resources/data/antarchy/worldgen/configured_feature/peach_forest_petals.json new file mode 100644 index 00000000..0f348bb7 --- /dev/null +++ b/common/src/main/resources/data/antarchy/worldgen/configured_feature/peach_forest_petals.json @@ -0,0 +1,11 @@ +{ + "type": "minecraft:simple_block", + "config": { + "to_place": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "minecraft:pink_petals" + } + } + } +} diff --git a/common/src/main/resources/data/antarchy/worldgen/configured_feature/peach_forest_pond_large.json b/common/src/main/resources/data/antarchy/worldgen/configured_feature/peach_forest_pond_large.json new file mode 100644 index 00000000..bd272aec --- /dev/null +++ b/common/src/main/resources/data/antarchy/worldgen/configured_feature/peach_forest_pond_large.json @@ -0,0 +1,9 @@ +{ + "type": "antarchy:peach_forest_pond", + "config": { + "min_radius": 16, + "max_radius": 24, + "min_depth": 6, + "max_depth": 9 + } +} diff --git a/common/src/main/resources/data/antarchy/worldgen/configured_feature/peach_forest_pond_medium.json b/common/src/main/resources/data/antarchy/worldgen/configured_feature/peach_forest_pond_medium.json new file mode 100644 index 00000000..440d8a53 --- /dev/null +++ b/common/src/main/resources/data/antarchy/worldgen/configured_feature/peach_forest_pond_medium.json @@ -0,0 +1,9 @@ +{ + "type": "antarchy:peach_forest_pond", + "config": { + "min_radius": 12, + "max_radius": 16, + "min_depth": 4, + "max_depth": 6 + } +} diff --git a/common/src/main/resources/data/antarchy/worldgen/configured_feature/peach_forest_pond_small.json b/common/src/main/resources/data/antarchy/worldgen/configured_feature/peach_forest_pond_small.json new file mode 100644 index 00000000..2c9bfc5c --- /dev/null +++ b/common/src/main/resources/data/antarchy/worldgen/configured_feature/peach_forest_pond_small.json @@ -0,0 +1,9 @@ +{ + "type": "antarchy:peach_forest_pond", + "config": { + "min_radius": 8, + "max_radius": 12, + "min_depth": 3, + "max_depth": 4 + } +} diff --git a/common/src/main/resources/data/antarchy/worldgen/configured_feature/peach_large_tree.json b/common/src/main/resources/data/antarchy/worldgen/configured_feature/peach_large_tree.json new file mode 100644 index 00000000..ba4ed76d --- /dev/null +++ b/common/src/main/resources/data/antarchy/worldgen/configured_feature/peach_large_tree.json @@ -0,0 +1,43 @@ +{ + "type": "antarchy:peach_tree", + "config": { + "trunk_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "antarchy:peach_log", + "Properties": { + "axis": "y" + } + } + }, + "foliage_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "antarchy:peach_leaves", + "Properties": { + "distance": "7", + "persistent": "false", + "waterlogged": "false" + } + } + }, + "height": { + "type": "minecraft:uniform", + "min_inclusive": 20, + "max_inclusive": 30 + }, + "canopy_radius": { + "type": "minecraft:uniform", + "min_inclusive": 7, + "max_inclusive": 8 + }, + "branch_count": { + "type": "minecraft:uniform", + "min_inclusive": 4, + "max_inclusive": 6 + }, + "trunk_width": 2, + "fruit_chance": 0.6, + "top_canopy_scale": 0.72 + } +} diff --git a/common/src/main/resources/data/antarchy/worldgen/configured_feature/peach_tree.json b/common/src/main/resources/data/antarchy/worldgen/configured_feature/peach_tree.json new file mode 100644 index 00000000..ca1934c2 --- /dev/null +++ b/common/src/main/resources/data/antarchy/worldgen/configured_feature/peach_tree.json @@ -0,0 +1,43 @@ +{ + "type": "antarchy:peach_tree", + "config": { + "trunk_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "antarchy:peach_log", + "Properties": { + "axis": "y" + } + } + }, + "foliage_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "antarchy:peach_leaves", + "Properties": { + "distance": "7", + "persistent": "false", + "waterlogged": "false" + } + } + }, + "height": { + "type": "minecraft:uniform", + "min_inclusive": 10, + "max_inclusive": 15 + }, + "canopy_radius": { + "type": "minecraft:uniform", + "min_inclusive": 4, + "max_inclusive": 5 + }, + "branch_count": { + "type": "minecraft:uniform", + "min_inclusive": 3, + "max_inclusive": 5 + }, + "trunk_width": 1, + "fruit_chance": 0.45, + "top_canopy_scale": 0.62 + } +} diff --git a/common/src/main/resources/data/antarchy/worldgen/noise_settings/elythia.json b/common/src/main/resources/data/antarchy/worldgen/noise_settings/elythia.json index adb6c57a..82987b8d 100644 --- a/common/src/main/resources/data/antarchy/worldgen/noise_settings/elythia.json +++ b/common/src/main/resources/data/antarchy/worldgen/noise_settings/elythia.json @@ -645,6 +645,60 @@ ] } }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:biome", + "biome_is": [ + "antarchy:peach_forest" + ] + }, + "then_run": { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:above_preliminary_surface" + }, + "then_run": { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:stone_depth", + "add_surface_depth": false, + "offset": 0, + "secondary_depth_range": 0, + "surface_type": "floor" + }, + "then_run": { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:noise_threshold", + "noise": "antarchy:surface_blend", + "min_threshold": -0.28, + "max_threshold": 1.1 + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:grass_block", + "Properties": { + "snowy": "false" + } + } + } + } + }, + { + "type": "minecraft:block", + "result_state": { + "Name": "antarchy:blush_moss_block" + } + } + ] + } + } + }, { "type": "minecraft:condition", "if_true": { diff --git a/common/src/main/resources/data/antarchy/worldgen/placed_feature/blush_moss_patch.json b/common/src/main/resources/data/antarchy/worldgen/placed_feature/blush_moss_patch.json new file mode 100644 index 00000000..3f427bca --- /dev/null +++ b/common/src/main/resources/data/antarchy/worldgen/placed_feature/blush_moss_patch.json @@ -0,0 +1,44 @@ +{ + "feature": "antarchy:blush_moss_patch", + "placement": [ + { + "type": "minecraft:count", + "count": 3 + }, + { + "type": "minecraft:in_square" + }, + { + "type": "minecraft:height_range", + "height": { + "type": "minecraft:uniform", + "min_inclusive": { + "above_bottom": 0 + }, + "max_inclusive": { + "absolute": 256 + } + } + }, + { + "type": "minecraft:environment_scan", + "allowed_search_condition": { + "type": "minecraft:matching_block_tag", + "tag": "minecraft:air" + }, + "direction_of_search": "down", + "max_steps": 12, + "target_condition": { + "type": "minecraft:solid" + } + }, + { + "type": "minecraft:random_offset", + "xz_spread": 0, + "y_spread": 1 + }, + { + "type": "minecraft:biome" + } + ] +} diff --git a/common/src/main/resources/data/antarchy/worldgen/placed_feature/corn_patch.json b/common/src/main/resources/data/antarchy/worldgen/placed_feature/corn_patch.json new file mode 100644 index 00000000..7549c008 --- /dev/null +++ b/common/src/main/resources/data/antarchy/worldgen/placed_feature/corn_patch.json @@ -0,0 +1,19 @@ +{ + "feature": "antarchy:corn_patch", + "placement": [ + { + "type": "minecraft:rarity_filter", + "chance": 36 + }, + { + "type": "minecraft:in_square" + }, + { + "type": "minecraft:heightmap", + "heightmap": "WORLD_SURFACE_WG" + }, + { + "type": "minecraft:biome" + } + ] +} diff --git a/common/src/main/resources/data/antarchy/worldgen/placed_feature/lumen_lily_pads.json b/common/src/main/resources/data/antarchy/worldgen/placed_feature/lumen_lily_pads.json new file mode 100644 index 00000000..35200fdf --- /dev/null +++ b/common/src/main/resources/data/antarchy/worldgen/placed_feature/lumen_lily_pads.json @@ -0,0 +1,19 @@ +{ + "feature": "antarchy:lumen_lily_pads", + "placement": [ + { + "type": "minecraft:count", + "count": 4 + }, + { + "type": "minecraft:in_square" + }, + { + "type": "minecraft:heightmap", + "heightmap": "WORLD_SURFACE_WG" + }, + { + "type": "minecraft:biome" + } + ] +} diff --git a/common/src/main/resources/data/antarchy/worldgen/placed_feature/lumen_pools.json b/common/src/main/resources/data/antarchy/worldgen/placed_feature/lumen_pools.json new file mode 100644 index 00000000..11f62e28 --- /dev/null +++ b/common/src/main/resources/data/antarchy/worldgen/placed_feature/lumen_pools.json @@ -0,0 +1,19 @@ +{ + "feature": "antarchy:lumen_pools", + "placement": [ + { + "type": "minecraft:count", + "count": 3 + }, + { + "type": "minecraft:in_square" + }, + { + "type": "minecraft:heightmap", + "heightmap": "WORLD_SURFACE_WG" + }, + { + "type": "minecraft:biome" + } + ] +} diff --git a/common/src/main/resources/data/antarchy/worldgen/placed_feature/lumen_streams.json b/common/src/main/resources/data/antarchy/worldgen/placed_feature/lumen_streams.json new file mode 100644 index 00000000..d875b63f --- /dev/null +++ b/common/src/main/resources/data/antarchy/worldgen/placed_feature/lumen_streams.json @@ -0,0 +1,19 @@ +{ + "feature": "antarchy:lumen_streams", + "placement": [ + { + "type": "minecraft:rarity_filter", + "chance": 8 + }, + { + "type": "minecraft:in_square" + }, + { + "type": "minecraft:heightmap", + "heightmap": "WORLD_SURFACE_WG" + }, + { + "type": "minecraft:biome" + } + ] +} diff --git a/common/src/main/resources/data/antarchy/worldgen/placed_feature/peach_forest_flora.json b/common/src/main/resources/data/antarchy/worldgen/placed_feature/peach_forest_flora.json new file mode 100644 index 00000000..83a59387 --- /dev/null +++ b/common/src/main/resources/data/antarchy/worldgen/placed_feature/peach_forest_flora.json @@ -0,0 +1,19 @@ +{ + "feature": "antarchy:peach_forest_flora", + "placement": [ + { + "type": "minecraft:count", + "count": 2 + }, + { + "type": "minecraft:in_square" + }, + { + "type": "minecraft:heightmap", + "heightmap": "WORLD_SURFACE_WG" + }, + { + "type": "minecraft:biome" + } + ] +} diff --git a/common/src/main/resources/data/antarchy/worldgen/placed_feature/peach_forest_mossy_boulders.json b/common/src/main/resources/data/antarchy/worldgen/placed_feature/peach_forest_mossy_boulders.json new file mode 100644 index 00000000..f0f30851 --- /dev/null +++ b/common/src/main/resources/data/antarchy/worldgen/placed_feature/peach_forest_mossy_boulders.json @@ -0,0 +1,19 @@ +{ + "feature": "antarchy:peach_forest_mossy_boulder", + "placement": [ + { + "type": "minecraft:rarity_filter", + "chance": 72 + }, + { + "type": "minecraft:in_square" + }, + { + "type": "minecraft:heightmap", + "heightmap": "WORLD_SURFACE_WG" + }, + { + "type": "minecraft:biome" + } + ] +} diff --git a/common/src/main/resources/data/antarchy/worldgen/placed_feature/peach_forest_petals.json b/common/src/main/resources/data/antarchy/worldgen/placed_feature/peach_forest_petals.json new file mode 100644 index 00000000..fa38da85 --- /dev/null +++ b/common/src/main/resources/data/antarchy/worldgen/placed_feature/peach_forest_petals.json @@ -0,0 +1,19 @@ +{ + "feature": "antarchy:peach_forest_petals", + "placement": [ + { + "type": "minecraft:count", + "count": 3 + }, + { + "type": "minecraft:in_square" + }, + { + "type": "minecraft:heightmap", + "heightmap": "WORLD_SURFACE_WG" + }, + { + "type": "minecraft:biome" + } + ] +} diff --git a/common/src/main/resources/data/antarchy/worldgen/placed_feature/peach_forest_ponds_large.json b/common/src/main/resources/data/antarchy/worldgen/placed_feature/peach_forest_ponds_large.json new file mode 100644 index 00000000..e54f8631 --- /dev/null +++ b/common/src/main/resources/data/antarchy/worldgen/placed_feature/peach_forest_ponds_large.json @@ -0,0 +1,19 @@ +{ + "feature": "antarchy:peach_forest_pond_large", + "placement": [ + { + "type": "minecraft:rarity_filter", + "chance": 128 + }, + { + "type": "minecraft:in_square" + }, + { + "type": "minecraft:heightmap", + "heightmap": "WORLD_SURFACE_WG" + }, + { + "type": "minecraft:biome" + } + ] +} diff --git a/common/src/main/resources/data/antarchy/worldgen/placed_feature/peach_forest_ponds_medium.json b/common/src/main/resources/data/antarchy/worldgen/placed_feature/peach_forest_ponds_medium.json new file mode 100644 index 00000000..9483ada3 --- /dev/null +++ b/common/src/main/resources/data/antarchy/worldgen/placed_feature/peach_forest_ponds_medium.json @@ -0,0 +1,19 @@ +{ + "feature": "antarchy:peach_forest_pond_medium", + "placement": [ + { + "type": "minecraft:rarity_filter", + "chance": 72 + }, + { + "type": "minecraft:in_square" + }, + { + "type": "minecraft:heightmap", + "heightmap": "WORLD_SURFACE_WG" + }, + { + "type": "minecraft:biome" + } + ] +} diff --git a/common/src/main/resources/data/antarchy/worldgen/placed_feature/peach_forest_ponds_small.json b/common/src/main/resources/data/antarchy/worldgen/placed_feature/peach_forest_ponds_small.json new file mode 100644 index 00000000..ed522321 --- /dev/null +++ b/common/src/main/resources/data/antarchy/worldgen/placed_feature/peach_forest_ponds_small.json @@ -0,0 +1,19 @@ +{ + "feature": "antarchy:peach_forest_pond_small", + "placement": [ + { + "type": "minecraft:rarity_filter", + "chance": 40 + }, + { + "type": "minecraft:in_square" + }, + { + "type": "minecraft:heightmap", + "heightmap": "WORLD_SURFACE_WG" + }, + { + "type": "minecraft:biome" + } + ] +} diff --git a/common/src/main/resources/data/antarchy/worldgen/placed_feature/peach_large_tree.json b/common/src/main/resources/data/antarchy/worldgen/placed_feature/peach_large_tree.json new file mode 100644 index 00000000..e08a2556 --- /dev/null +++ b/common/src/main/resources/data/antarchy/worldgen/placed_feature/peach_large_tree.json @@ -0,0 +1,19 @@ +{ + "feature": "antarchy:peach_large_tree", + "placement": [ + { + "type": "minecraft:rarity_filter", + "chance": 4 + }, + { + "type": "minecraft:in_square" + }, + { + "type": "minecraft:heightmap", + "heightmap": "WORLD_SURFACE_WG" + }, + { + "type": "minecraft:biome" + } + ] +} diff --git a/common/src/main/resources/data/antarchy/worldgen/placed_feature/peach_tree.json b/common/src/main/resources/data/antarchy/worldgen/placed_feature/peach_tree.json new file mode 100644 index 00000000..7c6a4341 --- /dev/null +++ b/common/src/main/resources/data/antarchy/worldgen/placed_feature/peach_tree.json @@ -0,0 +1,31 @@ +{ + "feature": "antarchy:peach_tree", + "placement": [ + { + "type": "minecraft:count", + "count": { + "type": "minecraft:weighted_list", + "distribution": [ + { + "weight": 3, + "data": 1 + }, + { + "weight": 1, + "data": 0 + } + ] + } + }, + { + "type": "minecraft:in_square" + }, + { + "type": "minecraft:heightmap", + "heightmap": "WORLD_SURFACE_WG" + }, + { + "type": "minecraft:biome" + } + ] +} diff --git a/common/src/main/resources/data/antarchy/worldgen/placed_feature/titanium_ore.json b/common/src/main/resources/data/antarchy/worldgen/placed_feature/titanium_ore.json index 06f177fe..c49ace8f 100644 --- a/common/src/main/resources/data/antarchy/worldgen/placed_feature/titanium_ore.json +++ b/common/src/main/resources/data/antarchy/worldgen/placed_feature/titanium_ore.json @@ -3,7 +3,7 @@ "placement": [ { "type": "minecraft:count", - "count": 12 + "count": 13 }, { "type": "minecraft:in_square" diff --git a/common/src/main/resources/data/antarchy/worldgen/placed_feature/uranium_ore.json b/common/src/main/resources/data/antarchy/worldgen/placed_feature/uranium_ore.json index 1e443937..6297fb6c 100644 --- a/common/src/main/resources/data/antarchy/worldgen/placed_feature/uranium_ore.json +++ b/common/src/main/resources/data/antarchy/worldgen/placed_feature/uranium_ore.json @@ -3,7 +3,7 @@ "placement": [ { "type": "minecraft:count", - "count": 12 + "count": 13 }, { "type": "minecraft:in_square" diff --git a/common/src/main/resources/data/c/tags/item/foods.json b/common/src/main/resources/data/c/tags/item/foods.json index aae71222..0d0d38bf 100644 --- a/common/src/main/resources/data/c/tags/item/foods.json +++ b/common/src/main/resources/data/c/tags/item/foods.json @@ -6,6 +6,11 @@ "antarchy:mud_pie", "antarchy:rainbow_sugar", "antarchy:cornea_ear", - "antarchy:moleworm" + "antarchy:moleworm", + "antarchy:peach", + "antarchy:corn", + "antarchy:raw_corndog", + "antarchy:cooked_corndog", + "antarchy:root_beer" ] } diff --git a/common/src/main/resources/data/minecraft/loot_table/entities/magma_cube.json b/common/src/main/resources/data/minecraft/loot_table/entities/magma_cube.json new file mode 100644 index 00000000..4e011b10 --- /dev/null +++ b/common/src/main/resources/data/minecraft/loot_table/entities/magma_cube.json @@ -0,0 +1,161 @@ +{ + "type": "minecraft:entity", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:inverted", + "term": { + "condition": "minecraft:damage_source_properties", + "predicate": { + "source_entity": { + "type": "minecraft:frog" + } + } + } + }, + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type_specific": { + "type": "minecraft:slime", + "size": { + "min": 2 + } + } + } + } + ], + "functions": [ + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 1.0, + "min": -2.0 + }, + "function": "minecraft:set_count" + }, + { + "count": { + "type": "minecraft:uniform", + "max": 1.0, + "min": 0.0 + }, + "enchantment": "minecraft:looting", + "function": "minecraft:enchanted_count_increase" + } + ], + "name": "minecraft:magma_cream" + }, + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:damage_source_properties", + "predicate": { + "source_entity": { + "type": "minecraft:frog", + "type_specific": { + "type": "minecraft:frog", + "variant": "minecraft:warm" + } + } + } + } + ], + "functions": [ + { + "add": false, + "count": 1.0, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:pearlescent_froglight" + }, + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:damage_source_properties", + "predicate": { + "source_entity": { + "type": "minecraft:frog", + "type_specific": { + "type": "minecraft:frog", + "variant": "minecraft:cold" + } + } + } + } + ], + "functions": [ + { + "add": false, + "count": 1.0, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:verdant_froglight" + }, + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:damage_source_properties", + "predicate": { + "source_entity": { + "type": "minecraft:frog", + "type_specific": { + "type": "minecraft:frog", + "variant": "minecraft:temperate" + } + } + } + } + ], + "functions": [ + { + "add": false, + "count": 1.0, + "function": "minecraft:set_count" + } + ], + "name": "minecraft:ochre_froglight" + }, + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:damage_source_properties", + "predicate": { + "source_entity": { + "type": "minecraft:frog", + "type_specific": { + "type": "minecraft:frog", + "variant": "antarchy:elythia" + } + } + } + } + ], + "functions": [ + { + "add": false, + "count": 1.0, + "function": "minecraft:set_count" + } + ], + "name": "antarchy:roseate_froglight" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "minecraft:entities/magma_cube" +} diff --git a/common/src/main/resources/data/minecraft/tags/block/all_hanging_signs.json b/common/src/main/resources/data/minecraft/tags/block/all_hanging_signs.json index a9f77d6c..7e4be6b5 100644 --- a/common/src/main/resources/data/minecraft/tags/block/all_hanging_signs.json +++ b/common/src/main/resources/data/minecraft/tags/block/all_hanging_signs.json @@ -2,6 +2,8 @@ "replace": false, "values": [ "antarchy:ouranwood_hanging_sign", - "antarchy:ouranwood_wall_hanging_sign" + "antarchy:ouranwood_wall_hanging_sign", + "antarchy:peach_hanging_sign", + "antarchy:peach_wall_hanging_sign" ] } diff --git a/common/src/main/resources/data/minecraft/tags/block/ceiling_hanging_signs.json b/common/src/main/resources/data/minecraft/tags/block/ceiling_hanging_signs.json index b030962b..746c5071 100644 --- a/common/src/main/resources/data/minecraft/tags/block/ceiling_hanging_signs.json +++ b/common/src/main/resources/data/minecraft/tags/block/ceiling_hanging_signs.json @@ -1,6 +1,7 @@ { "replace": false, "values": [ - "antarchy:ouranwood_hanging_sign" + "antarchy:ouranwood_hanging_sign", + "antarchy:peach_hanging_sign" ] } diff --git a/common/src/main/resources/data/minecraft/tags/block/dirt.json b/common/src/main/resources/data/minecraft/tags/block/dirt.json index 857de3af..071a0bbc 100644 --- a/common/src/main/resources/data/minecraft/tags/block/dirt.json +++ b/common/src/main/resources/data/minecraft/tags/block/dirt.json @@ -3,6 +3,7 @@ "values": [ "antarchy:infested_rooted_dirt", "antarchy:infested_coarse_dirt", - "antarchy:umbral_moss_block" + "antarchy:umbral_moss_block", + "antarchy:blush_moss_block" ] } diff --git a/common/src/main/resources/data/minecraft/tags/block/fence_gates.json b/common/src/main/resources/data/minecraft/tags/block/fence_gates.json index 628a0416..738ac5c8 100644 --- a/common/src/main/resources/data/minecraft/tags/block/fence_gates.json +++ b/common/src/main/resources/data/minecraft/tags/block/fence_gates.json @@ -1,6 +1,7 @@ { "replace": false, "values": [ - "antarchy:ouranwood_fence_gate" + "antarchy:ouranwood_fence_gate", + "antarchy:peach_fence_gate" ] } diff --git a/common/src/main/resources/data/minecraft/tags/block/frogs_spawnable_on.json b/common/src/main/resources/data/minecraft/tags/block/frogs_spawnable_on.json new file mode 100644 index 00000000..a5ea1c6e --- /dev/null +++ b/common/src/main/resources/data/minecraft/tags/block/frogs_spawnable_on.json @@ -0,0 +1,7 @@ +{ + "replace": false, + "values": [ + "antarchy:blush_moss_block", + "minecraft:moss_block" + ] +} diff --git a/common/src/main/resources/data/minecraft/tags/block/leaves.json b/common/src/main/resources/data/minecraft/tags/block/leaves.json index 019600cb..aee0c428 100644 --- a/common/src/main/resources/data/minecraft/tags/block/leaves.json +++ b/common/src/main/resources/data/minecraft/tags/block/leaves.json @@ -1,6 +1,7 @@ { "replace": false, "values": [ - "antarchy:ouranwood_leaves" + "antarchy:ouranwood_leaves", + "antarchy:peach_leaves" ] } diff --git a/common/src/main/resources/data/minecraft/tags/block/logs.json b/common/src/main/resources/data/minecraft/tags/block/logs.json index 01800b33..bdda48a5 100644 --- a/common/src/main/resources/data/minecraft/tags/block/logs.json +++ b/common/src/main/resources/data/minecraft/tags/block/logs.json @@ -6,6 +6,10 @@ "antarchy:mossy_ouranwood_log", "antarchy:mossy_ouranwood_wood", "antarchy:stripped_ouranwood_log", - "antarchy:stripped_ouranwood_wood" + "antarchy:stripped_ouranwood_wood", + "antarchy:peach_log", + "antarchy:peach_wood", + "antarchy:stripped_peach_log", + "antarchy:stripped_peach_wood" ] } diff --git a/common/src/main/resources/data/minecraft/tags/block/logs_that_burn.json b/common/src/main/resources/data/minecraft/tags/block/logs_that_burn.json index 01800b33..bdda48a5 100644 --- a/common/src/main/resources/data/minecraft/tags/block/logs_that_burn.json +++ b/common/src/main/resources/data/minecraft/tags/block/logs_that_burn.json @@ -6,6 +6,10 @@ "antarchy:mossy_ouranwood_log", "antarchy:mossy_ouranwood_wood", "antarchy:stripped_ouranwood_log", - "antarchy:stripped_ouranwood_wood" + "antarchy:stripped_ouranwood_wood", + "antarchy:peach_log", + "antarchy:peach_wood", + "antarchy:stripped_peach_log", + "antarchy:stripped_peach_wood" ] } diff --git a/common/src/main/resources/data/minecraft/tags/block/mineable/axe.json b/common/src/main/resources/data/minecraft/tags/block/mineable/axe.json index 136beca6..4f9f8b33 100644 --- a/common/src/main/resources/data/minecraft/tags/block/mineable/axe.json +++ b/common/src/main/resources/data/minecraft/tags/block/mineable/axe.json @@ -19,6 +19,23 @@ "antarchy:ouranwood_sign", "antarchy:ouranwood_wall_sign", "antarchy:ouranwood_hanging_sign", - "antarchy:ouranwood_wall_hanging_sign" + "antarchy:ouranwood_wall_hanging_sign", + "antarchy:peach_log", + "antarchy:peach_wood", + "antarchy:stripped_peach_log", + "antarchy:stripped_peach_wood", + "antarchy:peach_planks", + "antarchy:peach_stairs", + "antarchy:peach_slab", + "antarchy:peach_fence", + "antarchy:peach_fence_gate", + "antarchy:peach_door", + "antarchy:peach_trapdoor", + "antarchy:peach_pressure_plate", + "antarchy:peach_button", + "antarchy:peach_sign", + "antarchy:peach_wall_sign", + "antarchy:peach_hanging_sign", + "antarchy:peach_wall_hanging_sign" ] } diff --git a/common/src/main/resources/data/minecraft/tags/block/mineable/hoe.json b/common/src/main/resources/data/minecraft/tags/block/mineable/hoe.json index fe4bba56..ece963cc 100644 --- a/common/src/main/resources/data/minecraft/tags/block/mineable/hoe.json +++ b/common/src/main/resources/data/minecraft/tags/block/mineable/hoe.json @@ -2,7 +2,12 @@ "replace": false, "values": [ "antarchy:ouranwood_leaves", + "antarchy:peach_leaves", + "antarchy:corn_crop", + "antarchy:wild_corn", "antarchy:umbral_moss_block", - "antarchy:umbral_moss_carpet" + "antarchy:umbral_moss_carpet", + "antarchy:blush_moss_block", + "antarchy:blush_moss_carpet" ] } diff --git a/common/src/main/resources/data/minecraft/tags/block/planks.json b/common/src/main/resources/data/minecraft/tags/block/planks.json index fbfbe78e..d98bff17 100644 --- a/common/src/main/resources/data/minecraft/tags/block/planks.json +++ b/common/src/main/resources/data/minecraft/tags/block/planks.json @@ -1,6 +1,7 @@ { "replace": false, "values": [ - "antarchy:ouranwood_planks" + "antarchy:ouranwood_planks", + "antarchy:peach_planks" ] } diff --git a/common/src/main/resources/data/minecraft/tags/block/saplings.json b/common/src/main/resources/data/minecraft/tags/block/saplings.json index 2af25ce5..5a06a14d 100644 --- a/common/src/main/resources/data/minecraft/tags/block/saplings.json +++ b/common/src/main/resources/data/minecraft/tags/block/saplings.json @@ -1,6 +1,7 @@ { "replace": false, "values": [ - "antarchy:ouranwood_acorn" + "antarchy:ouranwood_acorn", + "antarchy:peach_sapling" ] } diff --git a/common/src/main/resources/data/minecraft/tags/block/standing_signs.json b/common/src/main/resources/data/minecraft/tags/block/standing_signs.json index 61a8a4d5..6ec9e2a8 100644 --- a/common/src/main/resources/data/minecraft/tags/block/standing_signs.json +++ b/common/src/main/resources/data/minecraft/tags/block/standing_signs.json @@ -1,6 +1,7 @@ { "replace": false, "values": [ - "antarchy:ouranwood_sign" + "antarchy:ouranwood_sign", + "antarchy:peach_sign" ] } diff --git a/common/src/main/resources/data/minecraft/tags/block/wall_hanging_signs.json b/common/src/main/resources/data/minecraft/tags/block/wall_hanging_signs.json index 2b95abe7..3472b17e 100644 --- a/common/src/main/resources/data/minecraft/tags/block/wall_hanging_signs.json +++ b/common/src/main/resources/data/minecraft/tags/block/wall_hanging_signs.json @@ -1,6 +1,7 @@ { "replace": false, "values": [ - "antarchy:ouranwood_wall_hanging_sign" + "antarchy:ouranwood_wall_hanging_sign", + "antarchy:peach_wall_hanging_sign" ] } diff --git a/common/src/main/resources/data/minecraft/tags/block/wall_signs.json b/common/src/main/resources/data/minecraft/tags/block/wall_signs.json index 47091e17..406407ee 100644 --- a/common/src/main/resources/data/minecraft/tags/block/wall_signs.json +++ b/common/src/main/resources/data/minecraft/tags/block/wall_signs.json @@ -1,6 +1,7 @@ { "replace": false, "values": [ - "antarchy:ouranwood_wall_sign" + "antarchy:ouranwood_wall_sign", + "antarchy:peach_wall_sign" ] } diff --git a/common/src/main/resources/data/minecraft/tags/block/wooden_buttons.json b/common/src/main/resources/data/minecraft/tags/block/wooden_buttons.json index 9f9f176f..1d626cef 100644 --- a/common/src/main/resources/data/minecraft/tags/block/wooden_buttons.json +++ b/common/src/main/resources/data/minecraft/tags/block/wooden_buttons.json @@ -1,6 +1,7 @@ { "replace": false, "values": [ - "antarchy:ouranwood_button" + "antarchy:ouranwood_button", + "antarchy:peach_button" ] } diff --git a/common/src/main/resources/data/minecraft/tags/block/wooden_doors.json b/common/src/main/resources/data/minecraft/tags/block/wooden_doors.json index 93bb2e7f..e4ebd50e 100644 --- a/common/src/main/resources/data/minecraft/tags/block/wooden_doors.json +++ b/common/src/main/resources/data/minecraft/tags/block/wooden_doors.json @@ -1,6 +1,7 @@ { "replace": false, "values": [ - "antarchy:ouranwood_door" + "antarchy:ouranwood_door", + "antarchy:peach_door" ] } diff --git a/common/src/main/resources/data/minecraft/tags/block/wooden_fences.json b/common/src/main/resources/data/minecraft/tags/block/wooden_fences.json index d103ebdd..f1b5eb5a 100644 --- a/common/src/main/resources/data/minecraft/tags/block/wooden_fences.json +++ b/common/src/main/resources/data/minecraft/tags/block/wooden_fences.json @@ -1,6 +1,7 @@ { "replace": false, "values": [ - "antarchy:ouranwood_fence" + "antarchy:ouranwood_fence", + "antarchy:peach_fence" ] } diff --git a/common/src/main/resources/data/minecraft/tags/block/wooden_pressure_plates.json b/common/src/main/resources/data/minecraft/tags/block/wooden_pressure_plates.json index fb1e3e81..7f3d5149 100644 --- a/common/src/main/resources/data/minecraft/tags/block/wooden_pressure_plates.json +++ b/common/src/main/resources/data/minecraft/tags/block/wooden_pressure_plates.json @@ -1,6 +1,7 @@ { "replace": false, "values": [ - "antarchy:ouranwood_pressure_plate" + "antarchy:ouranwood_pressure_plate", + "antarchy:peach_pressure_plate" ] } diff --git a/common/src/main/resources/data/minecraft/tags/block/wooden_slabs.json b/common/src/main/resources/data/minecraft/tags/block/wooden_slabs.json index d60c2f07..9b0b8371 100644 --- a/common/src/main/resources/data/minecraft/tags/block/wooden_slabs.json +++ b/common/src/main/resources/data/minecraft/tags/block/wooden_slabs.json @@ -1,6 +1,7 @@ { "replace": false, "values": [ - "antarchy:ouranwood_slab" + "antarchy:ouranwood_slab", + "antarchy:peach_slab" ] } diff --git a/common/src/main/resources/data/minecraft/tags/block/wooden_stairs.json b/common/src/main/resources/data/minecraft/tags/block/wooden_stairs.json index 8e1ff149..5d419448 100644 --- a/common/src/main/resources/data/minecraft/tags/block/wooden_stairs.json +++ b/common/src/main/resources/data/minecraft/tags/block/wooden_stairs.json @@ -1,6 +1,7 @@ { "replace": false, "values": [ - "antarchy:ouranwood_stairs" + "antarchy:ouranwood_stairs", + "antarchy:peach_stairs" ] } diff --git a/common/src/main/resources/data/minecraft/tags/block/wooden_trapdoors.json b/common/src/main/resources/data/minecraft/tags/block/wooden_trapdoors.json index 3567295e..df34c0e6 100644 --- a/common/src/main/resources/data/minecraft/tags/block/wooden_trapdoors.json +++ b/common/src/main/resources/data/minecraft/tags/block/wooden_trapdoors.json @@ -1,6 +1,7 @@ { "replace": false, "values": [ - "antarchy:ouranwood_trapdoor" + "antarchy:ouranwood_trapdoor", + "antarchy:peach_trapdoor" ] } diff --git a/common/src/main/resources/data/minecraft/tags/item/boats.json b/common/src/main/resources/data/minecraft/tags/item/boats.json index 6ee8cf49..fd04ca71 100644 --- a/common/src/main/resources/data/minecraft/tags/item/boats.json +++ b/common/src/main/resources/data/minecraft/tags/item/boats.json @@ -2,6 +2,7 @@ "replace": false, "values": [ "antarchy:ouranwood_boat", - "antarchy:ouranwood_chest_boat" + "antarchy:ouranwood_chest_boat", + "antarchy:peach_boat" ] } diff --git a/common/src/main/resources/data/minecraft/tags/item/chest_boats.json b/common/src/main/resources/data/minecraft/tags/item/chest_boats.json index 8e18b86e..47f46f23 100644 --- a/common/src/main/resources/data/minecraft/tags/item/chest_boats.json +++ b/common/src/main/resources/data/minecraft/tags/item/chest_boats.json @@ -1,6 +1,7 @@ { "replace": false, "values": [ - "antarchy:ouranwood_chest_boat" + "antarchy:ouranwood_chest_boat", + "antarchy:peach_chest_boat" ] } diff --git a/common/src/main/resources/data/minecraft/tags/item/fence_gates.json b/common/src/main/resources/data/minecraft/tags/item/fence_gates.json index 628a0416..738ac5c8 100644 --- a/common/src/main/resources/data/minecraft/tags/item/fence_gates.json +++ b/common/src/main/resources/data/minecraft/tags/item/fence_gates.json @@ -1,6 +1,7 @@ { "replace": false, "values": [ - "antarchy:ouranwood_fence_gate" + "antarchy:ouranwood_fence_gate", + "antarchy:peach_fence_gate" ] } diff --git a/common/src/main/resources/data/minecraft/tags/item/hanging_signs.json b/common/src/main/resources/data/minecraft/tags/item/hanging_signs.json index b030962b..746c5071 100644 --- a/common/src/main/resources/data/minecraft/tags/item/hanging_signs.json +++ b/common/src/main/resources/data/minecraft/tags/item/hanging_signs.json @@ -1,6 +1,7 @@ { "replace": false, "values": [ - "antarchy:ouranwood_hanging_sign" + "antarchy:ouranwood_hanging_sign", + "antarchy:peach_hanging_sign" ] } diff --git a/common/src/main/resources/data/minecraft/tags/item/leaves.json b/common/src/main/resources/data/minecraft/tags/item/leaves.json index 019600cb..aee0c428 100644 --- a/common/src/main/resources/data/minecraft/tags/item/leaves.json +++ b/common/src/main/resources/data/minecraft/tags/item/leaves.json @@ -1,6 +1,7 @@ { "replace": false, "values": [ - "antarchy:ouranwood_leaves" + "antarchy:ouranwood_leaves", + "antarchy:peach_leaves" ] } diff --git a/common/src/main/resources/data/minecraft/tags/item/logs.json b/common/src/main/resources/data/minecraft/tags/item/logs.json index 01800b33..bdda48a5 100644 --- a/common/src/main/resources/data/minecraft/tags/item/logs.json +++ b/common/src/main/resources/data/minecraft/tags/item/logs.json @@ -6,6 +6,10 @@ "antarchy:mossy_ouranwood_log", "antarchy:mossy_ouranwood_wood", "antarchy:stripped_ouranwood_log", - "antarchy:stripped_ouranwood_wood" + "antarchy:stripped_ouranwood_wood", + "antarchy:peach_log", + "antarchy:peach_wood", + "antarchy:stripped_peach_log", + "antarchy:stripped_peach_wood" ] } diff --git a/common/src/main/resources/data/minecraft/tags/item/logs_that_burn.json b/common/src/main/resources/data/minecraft/tags/item/logs_that_burn.json index 01800b33..bdda48a5 100644 --- a/common/src/main/resources/data/minecraft/tags/item/logs_that_burn.json +++ b/common/src/main/resources/data/minecraft/tags/item/logs_that_burn.json @@ -6,6 +6,10 @@ "antarchy:mossy_ouranwood_log", "antarchy:mossy_ouranwood_wood", "antarchy:stripped_ouranwood_log", - "antarchy:stripped_ouranwood_wood" + "antarchy:stripped_ouranwood_wood", + "antarchy:peach_log", + "antarchy:peach_wood", + "antarchy:stripped_peach_log", + "antarchy:stripped_peach_wood" ] } diff --git a/common/src/main/resources/data/minecraft/tags/item/planks.json b/common/src/main/resources/data/minecraft/tags/item/planks.json index fbfbe78e..d98bff17 100644 --- a/common/src/main/resources/data/minecraft/tags/item/planks.json +++ b/common/src/main/resources/data/minecraft/tags/item/planks.json @@ -1,6 +1,7 @@ { "replace": false, "values": [ - "antarchy:ouranwood_planks" + "antarchy:ouranwood_planks", + "antarchy:peach_planks" ] } diff --git a/common/src/main/resources/data/minecraft/tags/item/saplings.json b/common/src/main/resources/data/minecraft/tags/item/saplings.json index 2af25ce5..5a06a14d 100644 --- a/common/src/main/resources/data/minecraft/tags/item/saplings.json +++ b/common/src/main/resources/data/minecraft/tags/item/saplings.json @@ -1,6 +1,7 @@ { "replace": false, "values": [ - "antarchy:ouranwood_acorn" + "antarchy:ouranwood_acorn", + "antarchy:peach_sapling" ] } diff --git a/common/src/main/resources/data/minecraft/tags/item/signs.json b/common/src/main/resources/data/minecraft/tags/item/signs.json index 61a8a4d5..6ec9e2a8 100644 --- a/common/src/main/resources/data/minecraft/tags/item/signs.json +++ b/common/src/main/resources/data/minecraft/tags/item/signs.json @@ -1,6 +1,7 @@ { "replace": false, "values": [ - "antarchy:ouranwood_sign" + "antarchy:ouranwood_sign", + "antarchy:peach_sign" ] } diff --git a/common/src/main/resources/data/minecraft/tags/item/trimmable_armor.json b/common/src/main/resources/data/minecraft/tags/item/trimmable_armor.json new file mode 100644 index 00000000..aa4ccea2 --- /dev/null +++ b/common/src/main/resources/data/minecraft/tags/item/trimmable_armor.json @@ -0,0 +1,19 @@ +{ + "replace": true, + "values": [ + "#minecraft:chest_armor", + "#minecraft:leg_armor", + "#minecraft:foot_armor", + "minecraft:leather_helmet", + "minecraft:chainmail_helmet", + "minecraft:golden_helmet", + "minecraft:iron_helmet", + "minecraft:diamond_helmet", + "minecraft:netherite_helmet", + "minecraft:turtle_helmet", + "antarchy:ultimate_helmet", + "antarchy:nightmare_helmet", + "antarchy:primordial_helmet", + "antarchy:blood_crystal_helmet" + ] +} diff --git a/common/src/main/resources/data/minecraft/tags/item/wooden_buttons.json b/common/src/main/resources/data/minecraft/tags/item/wooden_buttons.json index 9f9f176f..1d626cef 100644 --- a/common/src/main/resources/data/minecraft/tags/item/wooden_buttons.json +++ b/common/src/main/resources/data/minecraft/tags/item/wooden_buttons.json @@ -1,6 +1,7 @@ { "replace": false, "values": [ - "antarchy:ouranwood_button" + "antarchy:ouranwood_button", + "antarchy:peach_button" ] } diff --git a/common/src/main/resources/data/minecraft/tags/item/wooden_doors.json b/common/src/main/resources/data/minecraft/tags/item/wooden_doors.json index 93bb2e7f..e4ebd50e 100644 --- a/common/src/main/resources/data/minecraft/tags/item/wooden_doors.json +++ b/common/src/main/resources/data/minecraft/tags/item/wooden_doors.json @@ -1,6 +1,7 @@ { "replace": false, "values": [ - "antarchy:ouranwood_door" + "antarchy:ouranwood_door", + "antarchy:peach_door" ] } diff --git a/common/src/main/resources/data/minecraft/tags/item/wooden_fences.json b/common/src/main/resources/data/minecraft/tags/item/wooden_fences.json index d103ebdd..f1b5eb5a 100644 --- a/common/src/main/resources/data/minecraft/tags/item/wooden_fences.json +++ b/common/src/main/resources/data/minecraft/tags/item/wooden_fences.json @@ -1,6 +1,7 @@ { "replace": false, "values": [ - "antarchy:ouranwood_fence" + "antarchy:ouranwood_fence", + "antarchy:peach_fence" ] } diff --git a/common/src/main/resources/data/minecraft/tags/item/wooden_pressure_plates.json b/common/src/main/resources/data/minecraft/tags/item/wooden_pressure_plates.json index fb1e3e81..7f3d5149 100644 --- a/common/src/main/resources/data/minecraft/tags/item/wooden_pressure_plates.json +++ b/common/src/main/resources/data/minecraft/tags/item/wooden_pressure_plates.json @@ -1,6 +1,7 @@ { "replace": false, "values": [ - "antarchy:ouranwood_pressure_plate" + "antarchy:ouranwood_pressure_plate", + "antarchy:peach_pressure_plate" ] } diff --git a/common/src/main/resources/data/minecraft/tags/item/wooden_slabs.json b/common/src/main/resources/data/minecraft/tags/item/wooden_slabs.json index d60c2f07..9b0b8371 100644 --- a/common/src/main/resources/data/minecraft/tags/item/wooden_slabs.json +++ b/common/src/main/resources/data/minecraft/tags/item/wooden_slabs.json @@ -1,6 +1,7 @@ { "replace": false, "values": [ - "antarchy:ouranwood_slab" + "antarchy:ouranwood_slab", + "antarchy:peach_slab" ] } diff --git a/common/src/main/resources/data/minecraft/tags/item/wooden_stairs.json b/common/src/main/resources/data/minecraft/tags/item/wooden_stairs.json index 8e1ff149..5d419448 100644 --- a/common/src/main/resources/data/minecraft/tags/item/wooden_stairs.json +++ b/common/src/main/resources/data/minecraft/tags/item/wooden_stairs.json @@ -1,6 +1,7 @@ { "replace": false, "values": [ - "antarchy:ouranwood_stairs" + "antarchy:ouranwood_stairs", + "antarchy:peach_stairs" ] } diff --git a/common/src/main/resources/data/minecraft/tags/item/wooden_trapdoors.json b/common/src/main/resources/data/minecraft/tags/item/wooden_trapdoors.json index 3567295e..df34c0e6 100644 --- a/common/src/main/resources/data/minecraft/tags/item/wooden_trapdoors.json +++ b/common/src/main/resources/data/minecraft/tags/item/wooden_trapdoors.json @@ -1,6 +1,7 @@ { "replace": false, "values": [ - "antarchy:ouranwood_trapdoor" + "antarchy:ouranwood_trapdoor", + "antarchy:peach_trapdoor" ] } diff --git a/fabric/build.gradle b/fabric/build.gradle index 56f8f8a1..26766adc 100644 --- a/fabric/build.gradle +++ b/fabric/build.gradle @@ -23,6 +23,8 @@ dependencies { modApi "net.fabricmc.fabric-api:fabric-api:${project.fabric_api_version}" modImplementation "software.bernie.geckolib:geckolib-fabric-${project.minecraft_version}:${project.geckolib_version}" compileOnly("curse.maven:intapi-${project.intapi_curseforge_id}:${project.intapi_curseforge_file_id_neoforge}") + compileOnly "mezz.jei:jei-${project.minecraft_version}-common-api:${project.jei_version}" + compileOnly "mezz.jei:jei-${project.minecraft_version}-fabric-api:${project.jei_version}" // compileOnly("curse.maven:create-${project.create_curseforge_id_neoforge}:${project.create_curseforge_file_id_neoforge}") // compileOnly("curse.maven:marvel-${project.marvel_curseforge_id}:${project.marvel_curseforge_file_id}") // compileOnly("curse.maven:stellaris-${project.stellaris_curseforge_id}:${project.stellaris_curseforge_file_id}") @@ -32,8 +34,9 @@ dependencies { // compileOnly("curse.maven:iaf-${project.iaf_curseforge_id}:${project.iaf_curseforge_file_id}") // compileOnly("curse.maven:backpack-${project.backpack_curseforge_id}:${project.backpack_curseforge_file_id}") // compileOnly("curse.maven:regions_unexplored-${project.regions_unexplored_curseforge_id}:${project.regions_unexplored_curseforge_file_id}") - compileOnly(files("$rootDir/infinite_dimensions_jars/infinity-2.7.1+1.21.1-neoforge.jar")) - compileOnly(files("$rootDir/infinite_dimensions_jars/infinity-2.7.1+1.21.1-neoforge-sources.jar")) +// compileOnly(files("$rootDir/infinite_dimensions_jars/infinity-2.7.1+1.21.1-neoforge.jar")) + compileOnly(files("$rootDir/infinite_dimensions_jars/infinity-2.7.2+1.21.1-neoforge.jar")) +// compileOnly(files("$rootDir/infinite_dimensions_jars/infinity-2.7.1+1.21.1-neoforge-sources.jar")) compileOnly(files("$rootDir/infinite_dimensions_jars/gravity-api-1.0.7-1.20.1.jar")) // compileOnly(files("$rootDir/infinite_dimensions_jars/Cloro's Gravity Gun Mod (Release 1.3.1).jar")) // compileOnly(files("$rootDir/infinite_dimensions_jars/VanillaBackport-neoforge-1.21.1-1.1.7.6.jar")) diff --git a/fabric/src/main/java/com/craisinlord/antarchy/fabric/AntarchyConfigModuleFabric.java b/fabric/src/main/java/com/craisinlord/antarchy/fabric/AntarchyConfigModuleFabric.java index be11f333..deee4175 100644 --- a/fabric/src/main/java/com/craisinlord/antarchy/fabric/AntarchyConfigModuleFabric.java +++ b/fabric/src/main/java/com/craisinlord/antarchy/fabric/AntarchyConfigModuleFabric.java @@ -208,8 +208,10 @@ public final class AntarchyConfigModuleFabric { || name.startsWith("squidzooka") || name.equals("invertProjectilesFromInvertedPlayers") || name.startsWith("gravityGun") + || name.startsWith("minersDream") || name.equals("potentNyxiteInvertedDurationSeconds") || name.equals("corneaEarNightVisionSeconds") + || name.startsWith("american") || name.startsWith("mogglesVision") || name.equals("ductTapeRepairPercentPerUse") || name.startsWith("fallenKingCrown"); diff --git a/fabric/src/main/java/com/craisinlord/antarchy/fabric/AntarchyFabric.java b/fabric/src/main/java/com/craisinlord/antarchy/fabric/AntarchyFabric.java index 569179f7..181b95c5 100644 --- a/fabric/src/main/java/com/craisinlord/antarchy/fabric/AntarchyFabric.java +++ b/fabric/src/main/java/com/craisinlord/antarchy/fabric/AntarchyFabric.java @@ -38,6 +38,74 @@ public final class AntarchyFabric implements ModInitializer { Registries.BIOME, ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "mantis_overworld_spawn_biomes") ); + private static final TagKey OVERWORLD_ANT_NEST_SPAWN_BIOMES = TagKey.create( + Registries.BIOME, + ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "overworld_ant_nest_spawn_biomes") + ); + private static final TagKey RED_ANT_NEST_SPAWN_BIOMES = TagKey.create( + Registries.BIOME, + ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "red_ant_nest_spawn_biomes") + ); + private static final TagKey IS_ELYTHIA = TagKey.create( + Registries.BIOME, + ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "is_elythia") + ); + private static final TagKey APPLE_COW_SPAWN_BIOMES = TagKey.create( + Registries.BIOME, + ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "apple_cow_spawn_biomes") + ); + private static final TagKey GOLDEN_APPLE_COW_SPAWN_BIOMES = TagKey.create( + Registries.BIOME, + ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "golden_apple_cow_spawn_biomes") + ); + private static final TagKey FLYING_SQUIRREL_SPAWN_BIOMES = TagKey.create( + Registries.BIOME, + ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "flying_squirrel_spawn_biomes") + ); + private static final TagKey FLOWER_FOREST_BUTTERFLY_SPAWN_BIOMES = TagKey.create( + Registries.BIOME, + ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "flower_forest_butterfly_spawn_biomes") + ); + private static final TagKey FLOWER_FOREST_CATERPILLAR_SPAWN_BIOMES = TagKey.create( + Registries.BIOME, + ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "flower_forest_caterpillar_spawn_biomes") + ); + private static final TagKey MILKWEED_SPAWN_BIOMES = TagKey.create( + Registries.BIOME, + ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "milkweed_spawn_biomes") + ); + private static final TagKey WILD_CORN_SPAWN_BIOMES = TagKey.create( + Registries.BIOME, + ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "wild_corn_spawn_biomes") + ); + private static final ResourceKey BROWN_ANT_NEST = ResourceKey.create( + Registries.PLACED_FEATURE, + ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "brown_ant_nest") + ); + private static final ResourceKey RAINBOW_ANT_NEST = ResourceKey.create( + Registries.PLACED_FEATURE, + ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "rainbow_ant_nest") + ); + private static final ResourceKey RED_ANT_NEST = ResourceKey.create( + Registries.PLACED_FEATURE, + ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "red_ant_nest") + ); + private static final ResourceKey URANIUM_ORE = ResourceKey.create( + Registries.PLACED_FEATURE, + ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "uranium_ore") + ); + private static final ResourceKey TITANIUM_ORE = ResourceKey.create( + Registries.PLACED_FEATURE, + ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "titanium_ore") + ); + private static final ResourceKey FLOWER_FOREST_MILKWEED = ResourceKey.create( + Registries.PLACED_FEATURE, + ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "flower_forest_milkweed") + ); + private static final ResourceKey CORN_PATCH = ResourceKey.create( + Registries.PLACED_FEATURE, + ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "corn_patch") + ); @Override public void onInitialize() { AntarchyFabricNetworking.register(); @@ -91,5 +159,80 @@ public final class AntarchyFabric implements ModInitializer { AntarchyFabricContent.ALPHA_MANTIS.get(), 1, 1, 1 ); + BiomeModifications.addFeature( + BiomeSelectors.tag(OVERWORLD_ANT_NEST_SPAWN_BIOMES), + GenerationStep.Decoration.VEGETAL_DECORATION, + BROWN_ANT_NEST + ); + BiomeModifications.addFeature( + BiomeSelectors.tag(OVERWORLD_ANT_NEST_SPAWN_BIOMES), + GenerationStep.Decoration.VEGETAL_DECORATION, + RAINBOW_ANT_NEST + ); + BiomeModifications.addFeature( + BiomeSelectors.tag(RED_ANT_NEST_SPAWN_BIOMES), + GenerationStep.Decoration.VEGETAL_DECORATION, + RED_ANT_NEST + ); + BiomeModifications.addFeature( + BiomeSelectors.foundInOverworld(), + GenerationStep.Decoration.UNDERGROUND_ORES, + URANIUM_ORE + ); + BiomeModifications.addFeature( + BiomeSelectors.foundInOverworld(), + GenerationStep.Decoration.UNDERGROUND_ORES, + TITANIUM_ORE + ); + BiomeModifications.addFeature( + BiomeSelectors.tag(IS_ELYTHIA), + GenerationStep.Decoration.UNDERGROUND_ORES, + URANIUM_ORE + ); + BiomeModifications.addFeature( + BiomeSelectors.tag(IS_ELYTHIA), + GenerationStep.Decoration.UNDERGROUND_ORES, + TITANIUM_ORE + ); + BiomeModifications.addFeature( + BiomeSelectors.tag(MILKWEED_SPAWN_BIOMES), + GenerationStep.Decoration.VEGETAL_DECORATION, + FLOWER_FOREST_MILKWEED + ); + BiomeModifications.addFeature( + BiomeSelectors.tag(WILD_CORN_SPAWN_BIOMES), + GenerationStep.Decoration.VEGETAL_DECORATION, + CORN_PATCH + ); + BiomeModifications.addSpawn( + BiomeSelectors.tag(APPLE_COW_SPAWN_BIOMES), + net.minecraft.world.entity.MobCategory.CREATURE, + AntarchyFabricContent.APPLE_COW.get(), + 10, 2, 4 + ); + BiomeModifications.addSpawn( + BiomeSelectors.tag(GOLDEN_APPLE_COW_SPAWN_BIOMES), + net.minecraft.world.entity.MobCategory.CREATURE, + AntarchyFabricContent.GOLDEN_APPLE_COW.get(), + 3, 1, 3 + ); + BiomeModifications.addSpawn( + BiomeSelectors.tag(FLYING_SQUIRREL_SPAWN_BIOMES), + net.minecraft.world.entity.MobCategory.CREATURE, + AntarchyFabricContent.FLYING_SQUIRREL.get(), + 8, 1, 3 + ); + BiomeModifications.addSpawn( + BiomeSelectors.tag(FLOWER_FOREST_BUTTERFLY_SPAWN_BIOMES), + net.minecraft.world.entity.MobCategory.AMBIENT, + AntarchyFabricContent.BUTTERFLY.get(), + 28, 2, 5 + ); + BiomeModifications.addSpawn( + BiomeSelectors.tag(FLOWER_FOREST_CATERPILLAR_SPAWN_BIOMES), + net.minecraft.world.entity.MobCategory.CREATURE, + AntarchyFabricContent.CATERPILLAR.get(), + 24, 2, 4 + ); } } diff --git a/fabric/src/main/java/com/craisinlord/antarchy/fabric/AntarchyFabricContent.java b/fabric/src/main/java/com/craisinlord/antarchy/fabric/AntarchyFabricContent.java index 35f645de..a93ee3fc 100644 --- a/fabric/src/main/java/com/craisinlord/antarchy/fabric/AntarchyFabricContent.java +++ b/fabric/src/main/java/com/craisinlord/antarchy/fabric/AntarchyFabricContent.java @@ -2,8 +2,10 @@ package com.craisinlord.antarchy.fabric; import com.craisinlord.antarchy.Antarchy; import com.craisinlord.antarchy.compat.infinity.InfinityCompat; +import com.craisinlord.antarchy.compat.infinity.InfinityCompatVersion; import com.craisinlord.antarchy.config.AntarchySettings; import com.craisinlord.antarchy.content.AntarchyObjects; +import com.craisinlord.antarchy.content.CreativeTabOrder; import com.craisinlord.antarchy.content.block.*; import com.craisinlord.antarchy.content.AntarchySoundEvents; import com.craisinlord.antarchy.content.item.BloodCrystalArmorItem; @@ -15,6 +17,7 @@ import com.craisinlord.antarchy.content.block.entity.HushweedBlockEntity; import com.craisinlord.antarchy.content.block.entity.PotentNyxiteBlockEntity; import com.craisinlord.antarchy.content.block.entity.WaspNestBlockEntity; import com.craisinlord.antarchy.content.fluid.BileLiquidBlock; +import com.craisinlord.antarchy.content.fluid.LumenLiquidBlock; import com.craisinlord.antarchy.content.worldgen.ants.BrownAntNestFeature; import com.craisinlord.antarchy.content.worldgen.ants.RainbowAntNestFeature; import com.craisinlord.antarchy.content.worldgen.ants.RedAntNestFeature; @@ -23,6 +26,7 @@ import com.craisinlord.antarchy.content.worldgen.cavaryn.CavarynBileCystFeature; import com.craisinlord.antarchy.content.worldgen.cavaryn.CavarynBileVeinFeature; import com.craisinlord.antarchy.content.worldgen.cavaryn.CavarynCreepvineFeature; import com.craisinlord.antarchy.content.worldgen.cavaryn.CavarynWallAmberMossFeature; +import com.craisinlord.antarchy.content.worldgen.overworld.CornPatchFeature; import com.craisinlord.antarchy.content.worldgen.thoraxis.NyxiteSpikeConfiguration; import com.craisinlord.antarchy.content.worldgen.thoraxis.AntiwaterSpringsConfiguration; import com.craisinlord.antarchy.content.worldgen.thoraxis.AntiwaterSpringsFeature; @@ -98,6 +102,7 @@ import com.craisinlord.antarchy.fabric.item.AntimetalScaffoldingItem; import com.craisinlord.antarchy.content.item.CloudSharkFinSoupItem; import com.craisinlord.antarchy.content.item.CorneaEarItem; import com.craisinlord.antarchy.content.item.GravityGunItem; +import com.craisinlord.antarchy.content.item.MinersDreamItem; import com.craisinlord.antarchy.content.item.DuctTapeBlockItem; import com.craisinlord.antarchy.content.item.BrutalflyElytraItem; import com.craisinlord.antarchy.content.item.MobComingSoonTooltipItem; @@ -128,6 +133,9 @@ import com.craisinlord.antarchy.content.worldgen.elythia.ElythiaBiomeSource; import com.craisinlord.antarchy.content.worldgen.elythia.ElythiaRiverCarveFunction; import com.craisinlord.antarchy.content.worldgen.elythia.ElythiaFloraFeature; import com.craisinlord.antarchy.content.worldgen.elythia.ElythiaLargeTuffBoulderFeature; +import com.craisinlord.antarchy.content.worldgen.elythia.PeachForestMossyBoulderFeature; +import com.craisinlord.antarchy.content.worldgen.elythia.PeachForestPondConfiguration; +import com.craisinlord.antarchy.content.worldgen.elythia.PeachForestPondFeature; import com.craisinlord.antarchy.content.worldgen.elythia.ElythiaPondFeature; import com.craisinlord.antarchy.content.worldgen.elythia.ElythiaSurfaceCoverFeature; import com.craisinlord.antarchy.content.worldgen.elythia.ElythiaTuffBoulderFeature; @@ -135,11 +143,16 @@ import com.craisinlord.antarchy.content.worldgen.elythia.ElythiaUndergroundFeatu import com.craisinlord.antarchy.content.worldgen.elythia.MolewormCaveEntranceFeature; import com.craisinlord.antarchy.content.worldgen.elythia.MolewormSurfaceMoundsFeature; import com.craisinlord.antarchy.content.worldgen.elythia.BrutalflyCocoonFeature; +import com.craisinlord.antarchy.content.worldgen.elythia.LumenPoolFeature; +import com.craisinlord.antarchy.content.worldgen.elythia.LumenLilyPadFeature; +import com.craisinlord.antarchy.content.worldgen.elythia.LumenStreamFeature; import com.craisinlord.antarchy.content.worldgen.elythia.MolewormTunnelsFeature; import com.craisinlord.antarchy.content.worldgen.elythia.MolewormWarrensFeature; import com.craisinlord.antarchy.content.worldgen.elythia.OuranwoodCocoonTreeFeature; import com.craisinlord.antarchy.content.worldgen.elythia.OuranwoodTreeConfiguration; import com.craisinlord.antarchy.content.worldgen.elythia.OuranwoodTreeFeature; +import com.craisinlord.antarchy.content.worldgen.elythia.PeachTreeConfiguration; +import com.craisinlord.antarchy.content.worldgen.elythia.PeachTreeFeature; import com.craisinlord.antarchy.content.worldgen.elythia.TriffidPatchFeature; import com.craisinlord.antarchy.content.worldgen.cavaryn.CavarynEggPatchFeature; import com.craisinlord.antarchy.content.worldgen.cavaryn.ChitenSpikeConfiguration; @@ -210,6 +223,7 @@ import net.minecraft.world.item.Tier; import net.minecraft.world.item.Tiers; import net.minecraft.world.item.alchemy.Potions; import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.flag.FeatureFlags; import net.minecraft.core.Direction; import net.minecraft.core.particles.ParticleType; import net.minecraft.core.particles.SimpleParticleType; @@ -264,6 +278,26 @@ public final class AntarchyFabricContent { private static final DeferredRegister SOUND_EVENTS = DeferredRegister.create(Registries.SOUND_EVENT, Antarchy.MODID); private static final DeferredRegister FLUIDS = DeferredRegister.create(Registries.FLUID, Antarchy.MODID); private static final DeferredRegister> MENUS = DeferredRegister.create(Registries.MENU, Antarchy.MODID); + public static final DeferredHolder, net.minecraft.world.inventory.MenuType> DORRIE_INVENTORY_MENU = + MENUS.register("dorrie_inventory", () -> new net.minecraft.world.inventory.MenuType<>(com.craisinlord.antarchy.content.menu.DorrieInventoryMenu::new, FeatureFlags.DEFAULT_FLAGS)); + private static final DeferredRegister> DATA_COMPONENT_TYPES = + DeferredRegister.create(Registries.DATA_COMPONENT_TYPE, Antarchy.MODID); + private static final DeferredRegister> RECIPE_SERIALIZERS = + DeferredRegister.create(Registries.RECIPE_SERIALIZER, Antarchy.MODID); + public static final DeferredHolder, net.minecraft.core.component.DataComponentType> GLIMMER_VARIANT = + DATA_COMPONENT_TYPES.register("glimmer_variant", + () -> net.minecraft.core.component.DataComponentType.builder() + .persistent(com.craisinlord.antarchy.content.entity.glimmer.GlimmerVariant.CODEC) + .networkSynchronized(com.craisinlord.antarchy.content.entity.glimmer.GlimmerVariant.STREAM_CODEC) + .build()); + public static final DeferredHolder, net.minecraft.core.component.DataComponentType> AMERICAN = + DATA_COMPONENT_TYPES.register("american", + () -> net.minecraft.core.component.DataComponentType.builder() + .persistent(net.minecraft.util.Unit.CODEC) + .networkSynchronized(net.minecraft.network.codec.StreamCodec.unit(net.minecraft.util.Unit.INSTANCE)) + .build()); + public static final DeferredHolder, net.minecraft.world.item.crafting.RecipeSerializer> AMERICANIZE_SERIALIZER = + RECIPE_SERIALIZERS.register("americanize", () -> com.craisinlord.antarchy.content.AmericanizeRecipe.SERIALIZER); private static final Tier ULTIMATE_TIER = new SimpleToolTier( 3072, 10.5F, @@ -524,13 +558,53 @@ public final class AntarchyFabricContent { public static final DeferredBlock PINK_MILKWEED = BLOCKS.register("pink_milkweed", () -> new MilkweedBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.PEONY))); public static final DeferredBlock OURANWOOD_SIGN = BLOCKS.register("ouranwood_sign", - () -> new net.minecraft.world.level.block.StandingSignBlock(OuranwoodWoodTypes.OURANWOOD, BlockBehaviour.Properties.ofFullCopy(Blocks.JUNGLE_SIGN))); + () -> new net.minecraft.world.level.block.StandingSignBlock(AntarchyWoodTypes.OURANWOOD, BlockBehaviour.Properties.ofFullCopy(Blocks.JUNGLE_SIGN))); public static final DeferredBlock OURANWOOD_WALL_SIGN = BLOCKS.register("ouranwood_wall_sign", - () -> new net.minecraft.world.level.block.WallSignBlock(OuranwoodWoodTypes.OURANWOOD, BlockBehaviour.Properties.ofFullCopy(Blocks.JUNGLE_WALL_SIGN))); + () -> new net.minecraft.world.level.block.WallSignBlock(AntarchyWoodTypes.OURANWOOD, BlockBehaviour.Properties.ofFullCopy(Blocks.JUNGLE_WALL_SIGN))); public static final DeferredBlock OURANWOOD_HANGING_SIGN = BLOCKS.register("ouranwood_hanging_sign", - () -> new net.minecraft.world.level.block.CeilingHangingSignBlock(OuranwoodWoodTypes.OURANWOOD, BlockBehaviour.Properties.ofFullCopy(Blocks.JUNGLE_HANGING_SIGN))); + () -> new net.minecraft.world.level.block.CeilingHangingSignBlock(AntarchyWoodTypes.OURANWOOD, BlockBehaviour.Properties.ofFullCopy(Blocks.JUNGLE_HANGING_SIGN))); public static final DeferredBlock OURANWOOD_WALL_HANGING_SIGN = BLOCKS.register("ouranwood_wall_hanging_sign", - () -> new net.minecraft.world.level.block.WallHangingSignBlock(OuranwoodWoodTypes.OURANWOOD, BlockBehaviour.Properties.ofFullCopy(Blocks.JUNGLE_WALL_HANGING_SIGN))); + () -> new net.minecraft.world.level.block.WallHangingSignBlock(AntarchyWoodTypes.OURANWOOD, BlockBehaviour.Properties.ofFullCopy(Blocks.JUNGLE_WALL_HANGING_SIGN))); + public static final DeferredBlock PEACH_LOG = BLOCKS.register("peach_log", + () -> new RotatedPillarBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.JUNGLE_LOG))); + public static final DeferredBlock PEACH_WOOD = BLOCKS.register("peach_wood", + () -> new RotatedPillarBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.JUNGLE_WOOD))); + public static final DeferredBlock STRIPPED_PEACH_LOG = BLOCKS.register("stripped_peach_log", + () -> new RotatedPillarBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.STRIPPED_JUNGLE_LOG))); + public static final DeferredBlock STRIPPED_PEACH_WOOD = BLOCKS.register("stripped_peach_wood", + () -> new RotatedPillarBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.STRIPPED_JUNGLE_WOOD))); + public static final DeferredBlock PEACH_PLANKS = BLOCKS.register("peach_planks", + () -> new Block(BlockBehaviour.Properties.ofFullCopy(Blocks.JUNGLE_PLANKS))); + public static final DeferredBlock PEACH_STAIRS = BLOCKS.register("peach_stairs", + () -> new net.minecraft.world.level.block.StairBlock(PEACH_PLANKS.get().defaultBlockState(), BlockBehaviour.Properties.ofFullCopy(Blocks.JUNGLE_STAIRS))); + public static final DeferredBlock PEACH_SLAB = BLOCKS.register("peach_slab", + () -> new net.minecraft.world.level.block.SlabBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.JUNGLE_SLAB))); + public static final DeferredBlock PEACH_FENCE = BLOCKS.register("peach_fence", + () -> new net.minecraft.world.level.block.FenceBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.JUNGLE_FENCE))); + public static final DeferredBlock PEACH_FENCE_GATE = BLOCKS.register("peach_fence_gate", + () -> new net.minecraft.world.level.block.FenceGateBlock(net.minecraft.world.level.block.state.properties.WoodType.JUNGLE, BlockBehaviour.Properties.ofFullCopy(Blocks.JUNGLE_FENCE_GATE))); + public static final DeferredBlock PEACH_DOOR = BLOCKS.register("peach_door", + () -> new net.minecraft.world.level.block.DoorBlock(net.minecraft.world.level.block.state.properties.BlockSetType.JUNGLE, BlockBehaviour.Properties.ofFullCopy(Blocks.JUNGLE_DOOR))); + public static final DeferredBlock PEACH_TRAPDOOR = BLOCKS.register("peach_trapdoor", + () -> new net.minecraft.world.level.block.TrapDoorBlock(net.minecraft.world.level.block.state.properties.BlockSetType.JUNGLE, BlockBehaviour.Properties.ofFullCopy(Blocks.JUNGLE_TRAPDOOR))); + public static final DeferredBlock PEACH_PRESSURE_PLATE = BLOCKS.register("peach_pressure_plate", + () -> new net.minecraft.world.level.block.PressurePlateBlock(net.minecraft.world.level.block.state.properties.BlockSetType.JUNGLE, BlockBehaviour.Properties.ofFullCopy(Blocks.JUNGLE_PRESSURE_PLATE))); + public static final DeferredBlock PEACH_BUTTON = BLOCKS.register("peach_button", + () -> new net.minecraft.world.level.block.ButtonBlock(net.minecraft.world.level.block.state.properties.BlockSetType.JUNGLE, 30, BlockBehaviour.Properties.ofFullCopy(Blocks.JUNGLE_BUTTON))); + public static final DeferredBlock PEACH_LEAVES = BLOCKS.register("peach_leaves", + () -> new com.craisinlord.antarchy.content.block.PeachLeavesBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.JUNGLE_LEAVES).randomTicks())); + public static final DeferredBlock PEACH_HANGING_PEACH = BLOCKS.register("hanging_peach", + () -> new com.craisinlord.antarchy.content.block.HangingPeachBlock(BlockBehaviour.Properties.of().noOcclusion().instabreak())); + public static final DeferredBlock PEACH_SAPLING = BLOCKS.register("peach_sapling", + () -> new com.craisinlord.antarchy.content.block.PeachSaplingBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.OAK_SAPLING).randomTicks().noCollission())); + public static final DeferredBlock PEACH_SIGN = BLOCKS.register("peach_sign", + () -> new net.minecraft.world.level.block.StandingSignBlock(AntarchyWoodTypes.PEACH, BlockBehaviour.Properties.ofFullCopy(Blocks.JUNGLE_SIGN))); + public static final DeferredBlock PEACH_WALL_SIGN = BLOCKS.register("peach_wall_sign", + () -> new net.minecraft.world.level.block.WallSignBlock(AntarchyWoodTypes.PEACH, BlockBehaviour.Properties.ofFullCopy(Blocks.JUNGLE_WALL_SIGN))); + public static final DeferredBlock PEACH_HANGING_SIGN = BLOCKS.register("peach_hanging_sign", + () -> new net.minecraft.world.level.block.CeilingHangingSignBlock(AntarchyWoodTypes.PEACH, BlockBehaviour.Properties.ofFullCopy(Blocks.JUNGLE_HANGING_SIGN))); + public static final DeferredBlock PEACH_WALL_HANGING_SIGN = BLOCKS.register("peach_wall_hanging_sign", + () -> new net.minecraft.world.level.block.WallHangingSignBlock(AntarchyWoodTypes.PEACH, BlockBehaviour.Properties.ofFullCopy(Blocks.JUNGLE_WALL_HANGING_SIGN))); public static final DeferredBlock DUPLICATOR_SAPLING = BLOCKS.register("duplicator_sapling", () -> new DuplicatorSaplingBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.OAK_SAPLING).randomTicks().noCollission())); public static final DeferredBlock DUCT_TAPE = BLOCKS.register("duct_tape", @@ -629,12 +703,18 @@ public final class AntarchyFabricContent { () -> new UmbralMossBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.MOSS_BLOCK))); public static final DeferredBlock UMBRAL_MOSS_CARPET = BLOCKS.register("umbral_moss_carpet", () -> new UmbralMossCarpetBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.MOSS_CARPET).noOcclusion())); + public static final DeferredBlock BLUSH_MOSS_BLOCK = BLOCKS.register("blush_moss_block", + () -> new BlushMossBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.MOSS_BLOCK))); + public static final DeferredBlock BLUSH_MOSS_CARPET = BLOCKS.register("blush_moss_carpet", + () -> new BlushMossCarpetBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.MOSS_CARPET).noOcclusion())); public static final DeferredHolder, SimpleParticleType> DREAM_FIRE_FLAME = PARTICLE_TYPES.register("dream_fire_flame", () -> simpleParticleType()); public static final DeferredHolder, SimpleParticleType> STINKY_GAS = PARTICLE_TYPES.register("stinky_gas", () -> simpleParticleType()); public static final DeferredHolder, SimpleParticleType> STINKY_FLY = PARTICLE_TYPES.register("stinky_fly", () -> simpleParticleType()); + public static final DeferredHolder, SimpleParticleType> PEACH_LEAVES_PARTICLE = PARTICLE_TYPES.register("peach_leaves_particle", + () -> simpleParticleType()); public static final DeferredHolder, SimpleParticleType> HYPNOTIC_GAS = PARTICLE_TYPES.register("hypnotic_gas", () -> simpleParticleType()); public static final DeferredHolder, SimpleParticleType> HYPNOTIC_GAS_CLOUD = PARTICLE_TYPES.register("hypnotic_gas_cloud", @@ -706,7 +786,6 @@ public final class AntarchyFabricContent { () -> new Potion("stinky", new MobEffectInstance(mobEffectHolder(STINKY), 2400))); public static final DeferredHolder SHRINKING_EFFECT = MOB_EFFECTS.register("shrinking", ShrinkMobEffect::new); public static final DeferredHolder GROWTH_EFFECT = MOB_EFFECTS.register("growth", GrowthMobEffect::new); - // public static final DeferredHolder GLIMMERS_GRACE = MOB_EFFECTS.register("glimmers_grace", com.craisinlord.antarchy.content.effect.GlimmersGraceMobEffect::new); public static final DeferredHolder PARALYSIS = POTIONS.register("paralysis", () -> new Potion(new MobEffectInstance(mobEffectHolder(PARALYZED), 200))); public static final DeferredHolder LONG_PARALYSIS = POTIONS.register("long_paralysis", @@ -780,6 +859,33 @@ public final class AntarchyFabricContent { public static final DeferredBlock ANTIWATER_BLOCK = BLOCKS.register("antiwater", () -> new AntiwaterLiquidBlock((net.minecraft.world.level.material.FlowingFluid) ANTIWATER.get(), BlockBehaviour.Properties.ofFullCopy(Blocks.WATER).noLootTable())); + public static final DeferredHolder LUMEN = FLUIDS.register("lumen", + () -> new com.craisinlord.antarchy.fabric.content.fluid.SimpleFluid.Source( + () -> lookupFlowingFluid("lumen"), + () -> lookupFlowingFluid("flowing_lumen"), + () -> lookupItem("lumen_bucket"), + "lumen", + 4, + 1, + 5 + )); + public static final DeferredHolder FLOWING_LUMEN = FLUIDS.register("flowing_lumen", + () -> new com.craisinlord.antarchy.fabric.content.fluid.SimpleFluid.Flowing( + () -> lookupFlowingFluid("lumen"), + () -> lookupFlowingFluid("flowing_lumen"), + () -> lookupItem("lumen_bucket"), + "lumen", + 4, + 1, + 5 + )); + public static final DeferredBlock LUMEN_BLOCK = BLOCKS.register("lumen", + () -> new LumenLiquidBlock((net.minecraft.world.level.material.FlowingFluid) LUMEN.get(), + BlockBehaviour.Properties.ofFullCopy(Blocks.WATER).lightLevel(state -> 9).noLootTable())); + public static final DeferredBlock LUMEN_FROGLIGHT = BLOCKS.register("lumen_froglight", + () -> new Block(BlockBehaviour.Properties.ofFullCopy(Blocks.OCHRE_FROGLIGHT))); + public static final DeferredBlock ROSEATE_FROGLIGHT = BLOCKS.register("roseate_froglight", + () -> new Block(BlockBehaviour.Properties.ofFullCopy(Blocks.OCHRE_FROGLIGHT))); public static final DeferredHolder, EntityType> RED_ANT = ENTITY_TYPES.register("red_ant", () -> buildAntType(RedAntEntity::new, MobCategory.CREATURE, "red_ant")); public static final DeferredHolder, EntityType> BROWN_ANT = ENTITY_TYPES.register("brown_ant", @@ -813,6 +919,18 @@ public final class AntarchyFabricContent { .clientTrackingRange(10) .updateInterval(10) .build("ouranwood_chest_boat")); + public static final DeferredHolder, EntityType> PEACH_BOAT_ENTITY = ENTITY_TYPES.register("peach_boat", + () -> EntityType.Builder.of(com.craisinlord.antarchy.content.entity.PeachBoatEntity::new, MobCategory.MISC) + .sized(1.375F, 0.5625F) + .clientTrackingRange(10) + .updateInterval(10) + .build("peach_boat")); + public static final DeferredHolder, EntityType> PEACH_CHEST_BOAT_ENTITY = ENTITY_TYPES.register("peach_chest_boat", + () -> EntityType.Builder.of(com.craisinlord.antarchy.content.entity.PeachChestBoatEntity::new, MobCategory.MISC) + .sized(1.375F, 0.5625F) + .clientTrackingRange(10) + .updateInterval(10) + .build("peach_chest_boat")); public static final DeferredHolder, EntityType> MOLEVORE = ENTITY_TYPES.register("molevore", () -> EntityType.Builder.of(MolevoreEntity::new, MobCategory.MONSTER) .sized(1.95F, 1.1F) @@ -917,6 +1035,10 @@ public final class AntarchyFabricContent { () -> new com.craisinlord.antarchy.content.block.AntimetalScaffoldingBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.SCAFFOLDING))); public static final DeferredBlock CORNEA_STALK = BLOCKS.register("cornea_stalk", () -> new CorneaStalkBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.SWEET_BERRY_BUSH).randomTicks())); + public static final DeferredBlock CORN_CROP = BLOCKS.register("corn_crop", + () -> new CornCropBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.WHEAT).randomTicks().noCollission().noOcclusion())); + public static final DeferredBlock WILD_CORN = BLOCKS.register("wild_corn", + () -> new WildCornBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.WHEAT).noCollission().noOcclusion())); public static final DeferredBlock FALLEN_KING_CROWN_BLOCK = BLOCKS.register("fallen_king_crown", () -> new Block(BlockBehaviour.Properties.of() .strength(0.2F) @@ -1005,12 +1127,20 @@ public final class AntarchyFabricContent { () -> new OuranwoodTreeFeature(OuranwoodTreeConfiguration.CODEC)); public static final DeferredHolder, OuranwoodCocoonTreeFeature> OURANWOOD_COCOON_TREE = FEATURES.register("ouranwood_cocoon_tree", () -> new OuranwoodCocoonTreeFeature(OuranwoodTreeConfiguration.CODEC)); + public static final DeferredHolder, PeachTreeFeature> PEACH_TREE_FEATURE = FEATURES.register("peach_tree", + () -> new PeachTreeFeature(PeachTreeConfiguration.CODEC)); + public static final DeferredHolder, PeachTreeFeature> PEACH_LARGE_TREE_FEATURE = FEATURES.register("peach_large_tree", + () -> new PeachTreeFeature(PeachTreeConfiguration.CODEC)); public static final DeferredHolder, ElythiaFloraFeature> ELYTHIA_FOREST_FLORA = FEATURES.register("elythia_forest_flora", () -> new ElythiaFloraFeature(NoneFeatureConfiguration.CODEC, ElythiaFloraFeature.Variant.FOREST)); public static final DeferredHolder, ElythiaFloraFeature> ELYTHIA_MEADOW_FLORA = FEATURES.register("elythia_meadow_flora", () -> new ElythiaFloraFeature(NoneFeatureConfiguration.CODEC, ElythiaFloraFeature.Variant.MEADOW)); + public static final DeferredHolder, ElythiaFloraFeature> PEACH_FOREST_FLORA = FEATURES.register("peach_forest_flora", + () -> new ElythiaFloraFeature(NoneFeatureConfiguration.CODEC, ElythiaFloraFeature.Variant.PEACH_FOREST)); public static final DeferredHolder, ElythiaFloraFeature> FLOWER_FOREST_MILKWEED = FEATURES.register("flower_forest_milkweed", () -> new ElythiaFloraFeature(NoneFeatureConfiguration.CODEC, ElythiaFloraFeature.Variant.FLOWER_FOREST_MILKWEED)); + public static final DeferredHolder, CornPatchFeature> CORN_PATCH = FEATURES.register("corn_patch", + () -> new CornPatchFeature(NoneFeatureConfiguration.CODEC)); public static final DeferredHolder, ElythiaFloraFeature> ELYTHIA_BUTTERFLY_FIELDS_FLORA = FEATURES.register("butterfly_fields_flora", () -> new ElythiaFloraFeature(NoneFeatureConfiguration.CODEC, ElythiaFloraFeature.Variant.BUTTERFLY_FIELDS)); public static final DeferredHolder, ElythiaFloraFeature> ELYTHIA_TORCHFLOWER_FIELDS_FLORA = FEATURES.register("elythia_torchflower_fields_flora", @@ -1037,10 +1167,20 @@ public final class AntarchyFabricContent { () -> ElythiaRiverCarveFunction.CODEC); public static final DeferredHolder, ElythiaPondFeature> ELYTHIA_POND = FEATURES.register("elythia_pond", () -> new ElythiaPondFeature(NoneFeatureConfiguration.CODEC)); + public static final DeferredHolder, LumenPoolFeature> LUMEN_POOL = FEATURES.register("lumen_pools", + () -> new LumenPoolFeature(NoneFeatureConfiguration.CODEC)); + public static final DeferredHolder, LumenLilyPadFeature> LUMEN_LILY_PADS = FEATURES.register("lumen_lily_pads", + () -> new LumenLilyPadFeature(NoneFeatureConfiguration.CODEC)); + public static final DeferredHolder, LumenStreamFeature> LUMEN_STREAM = FEATURES.register("lumen_streams", + () -> new LumenStreamFeature(NoneFeatureConfiguration.CODEC)); public static final DeferredHolder, ElythiaTuffBoulderFeature> ELYTHIA_TUFF_BOULDER = FEATURES.register("elythia_tuff_boulder", () -> new ElythiaTuffBoulderFeature(NoneFeatureConfiguration.CODEC)); public static final DeferredHolder, ElythiaLargeTuffBoulderFeature> ELYTHIA_LARGE_TUFF_BOULDER = FEATURES.register("elythia_large_tuff_boulder", () -> new ElythiaLargeTuffBoulderFeature(NoneFeatureConfiguration.CODEC)); + public static final DeferredHolder, PeachForestMossyBoulderFeature> PEACH_FOREST_MOSSY_BOULDER = FEATURES.register("peach_forest_mossy_boulder", + () -> new PeachForestMossyBoulderFeature(NoneFeatureConfiguration.CODEC)); + public static final DeferredHolder, PeachForestPondFeature> PEACH_FOREST_POND = FEATURES.register("peach_forest_pond", + () -> new PeachForestPondFeature(PeachForestPondConfiguration.CODEC)); public static final DeferredHolder, ThoraxisFissureFeature> THORAXIS_FISSURE = FEATURES.register("thoraxis_fissure", () -> new ThoraxisFissureFeature(ThoraxisFissureConfiguration.CODEC)); public static final DeferredHolder, ThoraxisRibColumnsFeature> THORAXIS_RIB_COLUMNS = FEATURES.register("thoraxis_rib_columns", @@ -1094,6 +1234,21 @@ public final class AntarchyFabricContent { public static final DeferredItem OURANWOOD_BUTTON_ITEM = ITEMS.registerSimpleBlockItem(OURANWOOD_BUTTON); public static final DeferredItem OURANWOOD_LEAVES_ITEM = ITEMS.registerSimpleBlockItem(OURANWOOD_LEAVES); public static final DeferredItem OURANWOOD_ACORN = ITEMS.registerSimpleBlockItem(OURANWOOD_ACORN_BLOCK); + public static final DeferredItem PEACH_LOG_ITEM = ITEMS.registerSimpleBlockItem(PEACH_LOG); + public static final DeferredItem PEACH_WOOD_ITEM = ITEMS.registerSimpleBlockItem(PEACH_WOOD); + public static final DeferredItem STRIPPED_PEACH_LOG_ITEM = ITEMS.registerSimpleBlockItem(STRIPPED_PEACH_LOG); + public static final DeferredItem STRIPPED_PEACH_WOOD_ITEM = ITEMS.registerSimpleBlockItem(STRIPPED_PEACH_WOOD); + public static final DeferredItem PEACH_PLANKS_ITEM = ITEMS.registerSimpleBlockItem(PEACH_PLANKS); + public static final DeferredItem PEACH_STAIRS_ITEM = ITEMS.registerSimpleBlockItem(PEACH_STAIRS); + public static final DeferredItem PEACH_SLAB_ITEM = ITEMS.registerSimpleBlockItem(PEACH_SLAB); + public static final DeferredItem PEACH_FENCE_ITEM = ITEMS.registerSimpleBlockItem(PEACH_FENCE); + public static final DeferredItem PEACH_FENCE_GATE_ITEM = ITEMS.registerSimpleBlockItem(PEACH_FENCE_GATE); + public static final DeferredItem PEACH_DOOR_ITEM = ITEMS.registerSimpleBlockItem(PEACH_DOOR); + public static final DeferredItem PEACH_TRAPDOOR_ITEM = ITEMS.registerSimpleBlockItem(PEACH_TRAPDOOR); + public static final DeferredItem PEACH_PRESSURE_PLATE_ITEM = ITEMS.registerSimpleBlockItem(PEACH_PRESSURE_PLATE); + public static final DeferredItem PEACH_BUTTON_ITEM = ITEMS.registerSimpleBlockItem(PEACH_BUTTON); + public static final DeferredItem PEACH_LEAVES_ITEM = ITEMS.registerSimpleBlockItem(PEACH_LEAVES); + public static final DeferredItem PEACH_SAPLING_ITEM = ITEMS.registerSimpleBlockItem(PEACH_SAPLING); // public static final DeferredItem OURANWOOD_VINE_ITEM = ITEMS.registerSimpleBlockItem(OURANWOOD_VINE); public static final DeferredItem ORANGE_MILKWEED_ITEM = ITEMS.registerSimpleBlockItem(ORANGE_MILKWEED); public static final DeferredItem PINK_MILKWEED_ITEM = ITEMS.registerSimpleBlockItem(PINK_MILKWEED); @@ -1105,6 +1260,14 @@ public final class AntarchyFabricContent { () -> new OuranwoodBoatOnlyItem(OURANWOOD_BOAT_ENTITY.get(), new Item.Properties().stacksTo(1))); public static final DeferredItem OURANWOOD_CHEST_BOAT = ITEMS.register("ouranwood_chest_boat", () -> new OuranwoodChestBoatItem(OURANWOOD_CHEST_BOAT_ENTITY.get(), new Item.Properties().stacksTo(1))); + public static final DeferredItem PEACH_SIGN_ITEM = ITEMS.register("peach_sign", + () -> new net.minecraft.world.item.SignItem(new Item.Properties().stacksTo(16), PEACH_SIGN.get(), PEACH_WALL_SIGN.get())); + public static final DeferredItem PEACH_HANGING_SIGN_ITEM = ITEMS.register("peach_hanging_sign", + () -> new net.minecraft.world.item.HangingSignItem(PEACH_HANGING_SIGN.get(), PEACH_WALL_HANGING_SIGN.get(), new Item.Properties().stacksTo(16))); + public static final DeferredItem PEACH_BOAT = ITEMS.register("peach_boat", + () -> new com.craisinlord.antarchy.content.item.PeachBoatOnlyItem(PEACH_BOAT_ENTITY.get(), new Item.Properties().stacksTo(1))); + public static final DeferredItem PEACH_CHEST_BOAT = ITEMS.register("peach_chest_boat", + () -> new com.craisinlord.antarchy.content.item.PeachChestBoatItem(PEACH_CHEST_BOAT_ENTITY.get(), new Item.Properties().stacksTo(1))); public static final DeferredItem DUPLICATOR_SAPLING_ITEM = ITEMS.registerSimpleBlockItem(DUPLICATOR_SAPLING); public static final DeferredItem RED_ANT_NEST_ITEM = ITEMS.registerSimpleBlockItem(RED_ANT_NEST); public static final DeferredItem BROWN_ANT_NEST_ITEM = ITEMS.registerSimpleBlockItem(BROWN_ANT_NEST); @@ -1201,6 +1364,8 @@ public final class AntarchyFabricContent { public static final DeferredItem POTENT_NYXITE_ITEM = ITEMS.registerSimpleBlockItem(POTENT_NYXITE); public static final DeferredItem UMBRAL_MOSS_BLOCK_ITEM = ITEMS.registerSimpleBlockItem(UMBRAL_MOSS_BLOCK); public static final DeferredItem UMBRAL_MOSS_CARPET_ITEM = ITEMS.registerSimpleBlockItem(UMBRAL_MOSS_CARPET); + public static final DeferredItem BLUSH_MOSS_BLOCK_ITEM = ITEMS.registerSimpleBlockItem(BLUSH_MOSS_BLOCK); + public static final DeferredItem BLUSH_MOSS_CARPET_ITEM = ITEMS.registerSimpleBlockItem(BLUSH_MOSS_CARPET); public static final DeferredItem DREAM_TORCH_ITEM = ITEMS.register("dream_torch", () -> new StandingAndWallBlockItem(DREAM_TORCH.get(), DREAM_WALL_TORCH.get(), new Item.Properties(), Direction.UP)); public static final DeferredItem DREAM_LANTERN_ITEM = ITEMS.registerSimpleBlockItem(DREAM_LANTERN); @@ -1214,6 +1379,10 @@ public final class AntarchyFabricContent { () -> new BucketItem(ICHOR.get(), new Item.Properties().craftRemainder(Items.BUCKET).stacksTo(1))); public static final DeferredItem ANTIWATER_BUCKET = ITEMS.register("antiwater_bucket", () -> new BucketItem(ANTIWATER.get(), new Item.Properties().craftRemainder(Items.BUCKET).stacksTo(1))); + public static final DeferredItem LUMEN_BUCKET = ITEMS.register("lumen_bucket", + () -> new BucketItem(LUMEN.get(), new Item.Properties().craftRemainder(Items.BUCKET).stacksTo(1))); + public static final DeferredItem LUMEN_FROGLIGHT_ITEM = ITEMS.registerSimpleBlockItem(LUMEN_FROGLIGHT); + public static final DeferredItem ROSEATE_FROGLIGHT_ITEM = ITEMS.registerSimpleBlockItem(ROSEATE_FROGLIGHT); public static final DeferredItem CLOUD_BUCKET = ITEMS.register("cloud_bucket", () -> new com.craisinlord.antarchy.content.item.CloudBucketItem(CLOUD_BLOCK.get(), new Item.Properties().craftRemainder(Items.BUCKET))); public static final DeferredItem BLOOD_CRYSTAL_SHARD = ITEMS.register("blood_crystal_shard", @@ -1276,6 +1445,59 @@ public final class AntarchyFabricContent { .nutrition(2) .saturationModifier(0.4F) .build()))); + public static final DeferredItem CORN = ITEMS.register("corn", + () -> new Item(new Item.Properties() + .food(new FoodProperties.Builder() + .nutrition(3) + .saturationModifier(0.6F) + .build()))); + public static final DeferredItem CORN_SEEDS = ITEMS.register("corn_seeds", + () -> new net.minecraft.world.item.ItemNameBlockItem(CORN_CROP.get(), new Item.Properties())); + public static final DeferredItem RAW_VENISON = ITEMS.register("raw_venison", + () -> new Item(new Item.Properties() + .food(new FoodProperties.Builder() + .nutrition(2) + .saturationModifier(0.3F) + .build()))); + public static final DeferredItem COOKED_VENISON = ITEMS.register("cooked_venison", + () -> new Item(new Item.Properties() + .food(new FoodProperties.Builder() + .nutrition(6) + .saturationModifier(0.8F) + .build()))); + public static final DeferredItem PEACH = ITEMS.register("peach", + () -> new com.craisinlord.antarchy.content.item.PeachItem()); + public static final DeferredItem RAW_CORNDOG = ITEMS.register("raw_corndog", + () -> new Item(new Item.Properties() + .stacksTo(64) + .food(new FoodProperties.Builder() + .nutrition(8) + .saturationModifier(0.7F) + .build()))); + public static final DeferredItem COOKED_CORNDOG = ITEMS.register("cooked_corndog", + () -> new Item(new Item.Properties() + .stacksTo(64) + .food(new FoodProperties.Builder() + .nutrition(14) + .saturationModifier(1.1F) + .build()))); + public static final DeferredItem HIGH_FRUCTOSE_CORN_SYRUP = ITEMS.register("high_fructose_corn_syrup", + () -> new com.craisinlord.antarchy.content.item.HighFructoseCornSyrupItem(new Item.Properties() + .stacksTo(16) + .food(new FoodProperties.Builder() + .nutrition(0) + .saturationModifier(0.0F) + .alwaysEdible() + .build()))); + public static final DeferredItem ROOT_BEER = ITEMS.register("root_beer", + () -> new com.craisinlord.antarchy.content.item.RootBeerItem(new Item.Properties() + .stacksTo(16) + .food(new FoodProperties.Builder() + .nutrition(4) + .saturationModifier(0.4F) + .effect(new MobEffectInstance(MobEffects.REGENERATION, 100, 0), 1.0F) + .alwaysEdible() + .build()))); public static final DeferredItem TRIFFID_GOO = ITEMS.registerSimpleItem("triffid_goo", new Item.Properties().rarity(Rarity.UNCOMMON)); public static final DeferredItem VORTEX_EYE = ITEMS.register("vortex_eye", @@ -1474,6 +1696,8 @@ public final class AntarchyFabricContent { )); public static final DeferredItem GRAVITY_GUN = ITEMS.register("gravity_gun", () -> new GravityGunItem(new Item.Properties().stacksTo(1).durability(512).rarity(Rarity.RARE).fireResistant())); + public static final DeferredItem MINERS_DREAM = ITEMS.register("miners_dream", + () -> new MinersDreamItem(new Item.Properties().stacksTo(1).rarity(Rarity.RARE))); public static final DeferredItem SQUIDZOOKA = ITEMS.register("squidzooka", () -> new SquidzookaItem(new Item.Properties().stacksTo(1).durability(384).rarity(Rarity.RARE))); public static final DeferredItem BATTLE_AXE = ITEMS.register("battle_axe", @@ -1743,13 +1967,42 @@ public final class AntarchyFabricContent { public static final DeferredItem CHEEP_SPAWN_EGG = ITEMS.register("cheep_spawn_egg", () -> new DeferredSpawnEggItem(CHEEP, 0xFF00AA, 0x00FF44, new Item.Properties())); - // public static final DeferredHolder, EntityType> GLIMMER = ENTITY_TYPES.register("glimmer", - // () -> EntityType.Builder.of(com.craisinlord.antarchy.content.entity.GlimmerEntity::new, MobCategory.CREATURE) - // .sized(0.9F, 1.4F) - // .clientTrackingRange(8) - // .build("glimmer")); - // public static final DeferredItem GLIMMER_SPAWN_EGG = ITEMS.register("glimmer_spawn_egg", - // () -> new DeferredSpawnEggItem(GLIMMER, 0xBEEFFF, 0x6FD8FF, new Item.Properties())); + public static final DeferredHolder, EntityType> DORRIE = ENTITY_TYPES.register("dorrie", + () -> EntityType.Builder.of(com.craisinlord.antarchy.content.entity.DorrieEntity::new, MobCategory.CREATURE) + .sized(1.6F, 1.4F) + .clientTrackingRange(10) + .build("dorrie")); + public static final DeferredHolder, EntityType> OURANWOOD_DEER = ENTITY_TYPES.register("ouranwood_deer", + () -> EntityType.Builder.of(com.craisinlord.antarchy.content.entity.OuranwoodDeerEntity::new, MobCategory.CREATURE) + .sized(0.9F, 1.4F) + .clientTrackingRange(8) + .build("ouranwood_deer")); + public static final DeferredHolder, EntityType> GLIMMER = ENTITY_TYPES.register("glimmer", + () -> EntityType.Builder.of(com.craisinlord.antarchy.content.entity.glimmer.GlimmerEntity::new, MobCategory.CREATURE) + .sized(0.9F, 1.4F) + .clientTrackingRange(8) + .build("glimmer")); + public static final DeferredHolder, EntityType> ELKA = ENTITY_TYPES.register("elka", + () -> EntityType.Builder.of(com.craisinlord.antarchy.content.entity.ElkaEntity::new, MobCategory.CREATURE) + .sized(2.2F, 3.5F) + .clientTrackingRange(10) + .build("elka")); + public static final DeferredItem DORRIE_SPAWN_EGG = ITEMS.register("dorrie_spawn_egg", + () -> new DeferredSpawnEggItem(DORRIE, 0x6F8CFF, 0xD2F2FF, new Item.Properties())); + public static final DeferredItem OURANWOOD_DEER_SPAWN_EGG = ITEMS.register("ouranwood_deer_spawn_egg", + () -> new DeferredSpawnEggItem(OURANWOOD_DEER, 0x8A6D4B, 0xE8D9B5, new Item.Properties())); + public static final DeferredItem GLIMMER_SPAWN_EGG = ITEMS.register("glimmer_spawn_egg", + () -> new DeferredSpawnEggItem(GLIMMER, 0x7DFFFF, 0x2AC7D0, new Item.Properties())); + public static final DeferredItem ELKA_SPAWN_EGG = ITEMS.register("elka_spawn_egg", + () -> new DeferredSpawnEggItem(ELKA, 0x6B2FA0, 0xFFFFFF, new Item.Properties())); + public static final DeferredItem SPIRIT_APPLE = ITEMS.register("spirit_apple", + () -> new com.craisinlord.antarchy.content.item.SpiritAppleItem(new Item.Properties() + .food(new FoodProperties.Builder() + .nutrition(4) + .saturationModifier(0.3F) + .build()))); + public static final DeferredItem GLIMMER_BOTTLE = ITEMS.register("glimmer_bottle", + com.craisinlord.antarchy.content.item.GlimmerBottleItem::new); public static final DeferredHolder ANTARCHY_TAB = CREATIVE_MODE_TABS.register("antarchy", () -> CreativeModeTab.builder(CreativeModeTab.Row.TOP, 0) @@ -1834,7 +2087,10 @@ public final class AntarchyFabricContent { FabricDefaultAttributeRegistry.register(EMPEROR_SCORPION.get(), EmperorScorpionEntity.createAttributes().build()); FabricDefaultAttributeRegistry.register(TORETERROR.get(), ToreterrorEntity.createAttributes().build()); FabricDefaultAttributeRegistry.register(CHEEP.get(), com.craisinlord.antarchy.content.entity.CheepEntity.createAttributes().build()); - // FabricDefaultAttributeRegistry.register(GLIMMER.get(), com.craisinlord.antarchy.content.entity.GlimmerEntity.createAttributes().build()); + FabricDefaultAttributeRegistry.register(DORRIE.get(), com.craisinlord.antarchy.content.entity.DorrieEntity.createAttributes().build()); + FabricDefaultAttributeRegistry.register(OURANWOOD_DEER.get(), com.craisinlord.antarchy.content.entity.OuranwoodDeerEntity.createAttributes().build()); + FabricDefaultAttributeRegistry.register(GLIMMER.get(), com.craisinlord.antarchy.content.entity.glimmer.GlimmerEntity.createAttributes().build()); + FabricDefaultAttributeRegistry.register(ELKA.get(), com.craisinlord.antarchy.content.entity.ElkaEntity.createAttributes().build()); FabricDefaultAttributeRegistry.register(RED_ANT.get(), buildAntAttributes( AntarchySettings.redAntHealth(), @@ -1871,7 +2127,10 @@ public final class AntarchyFabricContent { SpawnPlacements.register(MISSILE_SQUID.get(), SpawnPlacementTypes.IN_WATER, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, MissileSquidEntity::canSpawn); SpawnPlacements.register(OCTOPUS_BOMB.get(), SpawnPlacementTypes.IN_WATER, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, OctopusBombEntity::canSpawn); SpawnPlacements.register(CHEEP.get(), SpawnPlacementTypes.IN_WATER, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, net.minecraft.world.entity.animal.AbstractFish::checkSurfaceWaterAnimalSpawnRules); - // SpawnPlacements.register(GLIMMER.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, net.minecraft.world.entity.animal.Animal::checkAnimalSpawnRules); + SpawnPlacements.register(DORRIE.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, net.minecraft.world.entity.animal.Animal::checkAnimalSpawnRules); + SpawnPlacements.register(OURANWOOD_DEER.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, net.minecraft.world.entity.animal.Animal::checkAnimalSpawnRules); + SpawnPlacements.register(GLIMMER.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, net.minecraft.world.entity.animal.Animal::checkAnimalSpawnRules); + SpawnPlacements.register(ELKA.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, net.minecraft.world.entity.animal.Animal::checkAnimalSpawnRules); SpawnPlacements.register(NIGHTMARE.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, NightmareEntity::canSpawn); SpawnPlacements.register(MOLEWORM.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, MolewormEntity::canSpawn); SpawnPlacements.register(MANTIS.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, MantisEntity::canSpawn); @@ -1889,15 +2148,22 @@ public final class AntarchyFabricContent { ArrayList sortedItems = new ArrayList<>(); for (var holder : ITEMS.getEntries()) { Item item = holder.get(); - if (item != Items.AIR) { + if (item != Items.AIR && item != GLIMMER_BOTTLE.get()) { sortedItems.add(item); } } - sortedItems.sort(Comparator.comparingInt(AntarchyFabricContent::creativeTabGroup)); + sortedItems.sort(CreativeTabOrder.COMPARATOR); + addGlimmerBottleVariants(output); sortedItems.forEach(output::accept); addPotionVariants(output); } + private static void addGlimmerBottleVariants(CreativeModeTab.Output output) { + for (com.craisinlord.antarchy.content.entity.glimmer.GlimmerVariant variant : com.craisinlord.antarchy.content.entity.glimmer.GlimmerVariant.values()) { + output.accept(com.craisinlord.antarchy.content.item.GlimmerBottleItem.create(variant)); + } + } + private static void addPotionVariants(CreativeModeTab.Output output) { acceptPotionFamily(output, DREAD_POTION); acceptPotionFamily(output, LONG_DREAD); @@ -1926,67 +2192,11 @@ public final class AntarchyFabricContent { } private static int creativeTabGroup(Item item) { - String path = BuiltInRegistries.ITEM.getKey(item).getPath(); - return switch (path) { - case "ouranwood_log", "ouranwood_wood", "mossy_ouranwood_log", "mossy_ouranwood_wood", - "stripped_ouranwood_log", "stripped_ouranwood_wood", "duplicator_log", - "ouranwood_planks", "ouranwood_stairs", "ouranwood_slab", - "ouranwood_fence", "ouranwood_fence_gate", - "ouranwood_door", "ouranwood_trapdoor", - "ouranwood_pressure_plate", "ouranwood_button", - "ouranwood_sign", "ouranwood_hanging_sign", - "ouranwood_boat", "ouranwood_chest_boat" -> 0; - case "nyxite", "polished_nyxite", "chiseled_nyxite", "nyxite_bricks", - "nyxite_stairs", "nyxite_slab", "nyxite_wall", - "polished_nyxite_stairs", "polished_nyxite_slab", "polished_nyxite_wall", - "nyxite_brick_stairs", "nyxite_brick_slab", "nyxite_brick_wall", - "pale_nyxite", "nyxite_spike", "potent_nyxite" -> 1; - case "shellstone", "polished_shellstone", "shellstone_bricks", "chiseled_shellstone", - "mossy_shellstone_bricks", "cracked_shellstone_bricks", - "shellstone_stairs", "shellstone_slab", "shellstone_wall", - "polished_shellstone_stairs", "polished_shellstone_slab", "polished_shellstone_wall", - "shellstone_brick_stairs", "shellstone_brick_slab", "shellstone_brick_wall", - "mossy_shellstone_brick_stairs", "mossy_shellstone_brick_slab", "mossy_shellstone_brick_wall" -> 2; - case "antimetal", "polished_antimetal" -> 3; - case "dream_sand", "dream_sandstone", "chiseled_dream_sandstone", - "cut_dream_sandstone", "smooth_dream_sandstone", - "dream_sandstone_stairs", "dream_sandstone_slab", "dream_sandstone_wall", - "smooth_dream_sandstone_stairs", "smooth_dream_sandstone_slab", - "cut_dream_sandstone_slab" -> 4; - case "umbral_moss_block", "umbral_moss_carpet" -> 4; - case "hushweed", "orange_milkweed", "pink_milkweed", "amber_lichen", "creepvine" -> 6; - case "blood_crystal_block", "budding_blood_crystal", - "small_blood_crystal_bud", "medium_blood_crystal_bud", - "large_blood_crystal_bud", "blood_crystal_cluster" -> 7; - case "myrmite", "broodstone", "chiten_block", "chiten_spike", "amber_moss_block", "amber_moss_carpet" -> 8; - case "uranium_ore", "deepslate_uranium_ore", "titanium_ore", "deepslate_titanium_ore", - "uranium_block", "titanium_block", "raw_uranium_block", "raw_titanium_block", - "cut_uranium", "cut_titanium", "cut_uranium_slab", "cut_titanium_slab", - "cut_uranium_stairs", "cut_titanium_stairs", "chiseled_uranium", - "chiseled_titanium", "uranium_bulb", "titanium_bulb", - "uranium_door", "titanium_door", "uranium_trapdoor", "titanium_trapdoor", - "uranium_bars", "titanium_bars" -> 8; - case "infested_rooted_dirt", "infested_coarse_dirt", "triffid_goo_block", - "cloud_block", "creeping_horror_egg", "lurking_terror_egg" -> 9; - case "dream_torch", "dream_lantern", "dream_campfire", "dream_fire", "dream_fire_ceiling" -> 10; - case "easter_bunny_spawn_egg", "flying_squirrel_spawn_egg", "caterpillar_spawn_egg", - "butterfly_spawn_egg", "reverie_spawn_egg", "brutalfly_spawn_egg", - "red_ant_spawn_egg", "brown_ant_spawn_egg", "rainbow_ant_spawn_egg", "termite_spawn_egg", - "moleworm_spawn_egg", "mantis_spawn_egg", "alpha_mantis_spawn_egg", "rolly_polly_spawn_egg", "molevore_spawn_egg", "triffid_spawn_egg", - "apple_cow_spawn_egg", "golden_apple_cow_spawn_egg", "enchanted_golden_apple_cow_spawn_egg", - "dr_trayaurus_spawn_egg", "wasp_spawn_egg", - "bomber_spawn_egg", "jumpy_bug_spawn_egg", "stink_bug_spawn_egg", "cloud_shark_spawn_egg", "kraken_spawn_egg", "missile_squid_spawn_egg", "octopus_bomb_spawn_egg", - "nightmare_spawn_egg", "bed_bug_spawn_egg", "lucid_spawn_egg", "scorpion_spawn_egg", - "basilisk_spawn_egg", "emperor_scorpion_spawn_egg", "toreterror_spawn_egg", - "hercules_beetle_spawn_egg", - "creeping_horror_spawn_egg", "lurking_terror_spawn_egg" -> 90; - case "stink_bug", "chiten" -> 22; - case "water_cannon" -> 52; - case "primordial_helmet", "primordial_chestplate", "primordial_leggings", "primordial_boots" -> 53; - case "jumpy_boots" -> 54; - case "king_scale", "queen_scale" -> 22; - default -> 50; - }; + return CreativeTabOrder.group(item); + } + + private static int creativeTabSubOrder(Item item) { + return CreativeTabOrder.subOrder(item); } private static BlockEntityType antNestBlockEntityType() { @@ -2281,6 +2491,8 @@ public final class AntarchyFabricContent { POTIONS.register(); ITEMS.register(); MENUS.register(); + DATA_COMPONENT_TYPES.register(); + RECIPE_SERIALIZERS.register(); CREATIVE_MODE_TABS.register(); // Wire common-module accessors after all registrations are complete. @@ -2428,8 +2640,25 @@ public final class AntarchyFabricContent { ); AntarchyObjects.setOctopusBomb(OCTOPUS_BOMB); - // AntarchyObjects.setGlimmer(GLIMMER); - // AntarchyObjects.setGlimmersGrace(() -> mobEffectHolder(GLIMMERS_GRACE)); + AntarchyObjects.setOuranwoodDeer(OURANWOOD_DEER); + AntarchyObjects.setGlimmer(GLIMMER); + AntarchyObjects.setSpiritApple(() -> SPIRIT_APPLE.get()); + AntarchyObjects.setElka(ELKA); + AntarchyObjects.setPeach(() -> PEACH.get()); + AntarchyObjects.setCorn(() -> CORN.get()); + AntarchyObjects.setCornSeeds(() -> CORN_SEEDS.get()); + AntarchyObjects.setWildCorn(() -> WILD_CORN.get()); + AntarchyObjects.setCookedCorndog(() -> COOKED_CORNDOG.get()); + AntarchyObjects.setGlimmerBottle(() -> GLIMMER_BOTTLE.get()); + AntarchyObjects.setGlimmerVariantComponent(() -> GLIMMER_VARIANT.get()); + AntarchyObjects.setAmericanComponent(() -> AMERICAN.get()); + AntarchyObjects.setLumen(() -> LUMEN.get()); + AntarchyObjects.setFlowingLumen(() -> FLOWING_LUMEN.get()); + AntarchyObjects.setLumenBucket(() -> LUMEN_BUCKET.get()); + AntarchyObjects.setLumenBlock(() -> LUMEN_BLOCK.get()); + AntarchyObjects.setLumenFroglight(() -> LUMEN_FROGLIGHT.get()); + AntarchyObjects.setPeachLeavesParticle(() -> PEACH_LEAVES_PARTICLE.get()); + AntarchyObjects.setDorrieInventoryMenu(DORRIE_INVENTORY_MENU); AntarchyObjects.bind( EASTER_BUNNY, FLYING_SQUIRREL, @@ -2454,7 +2683,7 @@ public final class AntarchyFabricContent { (java.util.function.Supplier) BOMBER, (java.util.function.Supplier) BED_BUG, CHEEP, - (java.util.function.Supplier) CHEEP, + DORRIE, () -> DUPLICATOR_LOG.get(), () -> DUPLICATOR_SAPLING.get(), () -> DUCT_TAPE.get(), @@ -2505,6 +2734,10 @@ public final class AntarchyFabricContent { () -> OURANWOOD_ACORN_BLOCK.get(), () -> MOSSY_OURANWOOD_LOG.get(), () -> MOSSY_OURANWOOD_WOOD.get(), + () -> UMBRAL_MOSS_BLOCK.get(), + () -> UMBRAL_MOSS_CARPET.get(), + () -> BLUSH_MOSS_BLOCK.get(), + () -> BLUSH_MOSS_CARPET.get(), () -> ORANGE_MILKWEED.get(), () -> PINK_MILKWEED.get(), () -> BED_BUG_EGG.get(), @@ -2520,6 +2753,7 @@ public final class AntarchyFabricContent { () -> HUSHWEED_BLOCK_ENTITY.get(), () -> STINKY_GAS.get(), () -> STINKY_FLY.get(), + () -> PEACH_LEAVES_PARTICLE.get(), () -> attributeHolder(DOUBLE_DAMAGE_CHANCE), () -> attributeHolder(BLOODGLASS_MAX_HEARTS), () -> mobEffectHolder(BLOODGLASS_WARD) @@ -2537,10 +2771,35 @@ public final class AntarchyFabricContent { com.craisinlord.antarchy.content.gravity.AntarchyGravityApi.setSyncDispatcher(AntarchyFabricNetworking::syncGravityEntity); AntarchyFabricEvents.register(); - if (FabricInfinityCompat.isAvailableOnClasspath()) { + if (isSupportedInfinityLoaded()) { InfinityCompat.bind(new FabricInfinityCompat()); } } + + private static boolean isSupportedInfinityLoaded() { + if (!FabricInfinityCompat.isAvailableOnClasspath()) { + return false; + } + + try { + String version = FabricLoader.getInstance() + .getModContainer("infinity") + .map(container -> container.getMetadata().getVersion().getFriendlyString()) + .orElse(null); + if (InfinityCompatVersion.isSupported(version)) { + return true; + } + + Antarchy.LOGGER.warn( + "Skipping Infinity integration because version {} is below the supported minimum {}", + version, + InfinityCompatVersion.requiredVersion() + ); + } catch (Throwable throwable) { + Antarchy.LOGGER.warn("Skipping Infinity integration because the installed Infinity version could not be verified", throwable); + } + return false; + } } diff --git a/fabric/src/main/java/com/craisinlord/antarchy/fabric/AntarchyFabricEvents.java b/fabric/src/main/java/com/craisinlord/antarchy/fabric/AntarchyFabricEvents.java index 972fcf8b..5f9c2e54 100644 --- a/fabric/src/main/java/com/craisinlord/antarchy/fabric/AntarchyFabricEvents.java +++ b/fabric/src/main/java/com/craisinlord/antarchy/fabric/AntarchyFabricEvents.java @@ -13,6 +13,7 @@ import com.craisinlord.antarchy.content.gravity.AntarchyGravityTransition; import com.craisinlord.antarchy.content.portal.PermanentPortalManager; import com.craisinlord.antarchy.content.command.CaterpillarCommand; import com.craisinlord.antarchy.content.command.GravityCommand; +import com.craisinlord.antarchy.content.item.MinersDreamExcavationManager; import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback; import net.fabricmc.fabric.api.entity.event.v1.ServerLivingEntityEvents; import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents; @@ -52,8 +53,15 @@ public final class AntarchyFabricEvents { ComposterBlock.COMPOSTABLES.put(AntarchyFabricContent.UMBRAL_MOSS_BLOCK.get().asItem(), 0.65f); ComposterBlock.COMPOSTABLES.put(AntarchyFabricContent.UMBRAL_MOSS_CARPET.get().asItem(), 0.3f); + ComposterBlock.COMPOSTABLES.put(AntarchyFabricContent.BLUSH_MOSS_BLOCK.get().asItem(), 0.65f); + ComposterBlock.COMPOSTABLES.put(AntarchyFabricContent.BLUSH_MOSS_CARPET.get().asItem(), 0.3f); ComposterBlock.COMPOSTABLES.put(AntarchyFabricContent.HUSHWEED.get().asItem(), 0.65f); ComposterBlock.COMPOSTABLES.put(AntarchyFabricContent.CORNEA_EAR.get(), 0.65f); + ComposterBlock.COMPOSTABLES.put(AntarchyFabricContent.PEACH_LEAVES.get().asItem(), 0.3f); + ComposterBlock.COMPOSTABLES.put(AntarchyFabricContent.PEACH_SAPLING_ITEM.get(), 0.3f); + ComposterBlock.COMPOSTABLES.put(AntarchyFabricContent.CORN.get(), 0.65f); + ComposterBlock.COMPOSTABLES.put(AntarchyFabricContent.CORN_SEEDS.get(), 0.3f); + ComposterBlock.COMPOSTABLES.put(AntarchyFabricContent.PEACH.get(), 0.65f); ServerLivingEntityEvents.AFTER_DEATH.register((entity, damageSource) -> { if (entity instanceof ServerPlayer sp) { @@ -87,6 +95,7 @@ public final class AntarchyFabricEvents { tickDuctTapePlayers(level); tickIchorPlayers(level); tickBloodglassRecharge(level); + MinersDreamExcavationManager.tick(level); } invertedPlayers.retainAll(activeThisTick); }); diff --git a/fabric/src/main/java/com/craisinlord/antarchy/fabric/OuranwoodWoodTypes.java b/fabric/src/main/java/com/craisinlord/antarchy/fabric/AntarchyWoodTypes.java similarity index 80% rename from fabric/src/main/java/com/craisinlord/antarchy/fabric/OuranwoodWoodTypes.java rename to fabric/src/main/java/com/craisinlord/antarchy/fabric/AntarchyWoodTypes.java index 86217123..7b807144 100644 --- a/fabric/src/main/java/com/craisinlord/antarchy/fabric/OuranwoodWoodTypes.java +++ b/fabric/src/main/java/com/craisinlord/antarchy/fabric/AntarchyWoodTypes.java @@ -5,10 +5,11 @@ import com.craisinlord.antarchy.fabric.mixin.WoodTypeInvoker; import net.minecraft.world.level.block.state.properties.BlockSetType; import net.minecraft.world.level.block.state.properties.WoodType; -public final class OuranwoodWoodTypes { +public final class AntarchyWoodTypes { public static final WoodType OURANWOOD = register("ouranwood"); + public static final WoodType PEACH = register("peach"); - private OuranwoodWoodTypes() { + private AntarchyWoodTypes() { } private static WoodType register(String name) { diff --git a/fabric/src/main/java/com/craisinlord/antarchy/fabric/FabricInfinityCompat.java b/fabric/src/main/java/com/craisinlord/antarchy/fabric/FabricInfinityCompat.java index 5aec90de..8c038d39 100644 --- a/fabric/src/main/java/com/craisinlord/antarchy/fabric/FabricInfinityCompat.java +++ b/fabric/src/main/java/com/craisinlord/antarchy/fabric/FabricInfinityCompat.java @@ -1,5 +1,6 @@ package com.craisinlord.antarchy.fabric; +import com.craisinlord.antarchy.Antarchy; import com.craisinlord.antarchy.compat.infinity.InfinityCompatBridge; import net.lerariemann.infinity.util.InfinityMethods; import net.lerariemann.infinity.util.teleport.WarpLogic; @@ -28,6 +29,7 @@ public final class FabricInfinityCompat implements InfinityCompatBridge { try { return InfinityMethods.getRandomId(random); } catch (Throwable throwable) { + Antarchy.LOGGER.error("[Antarchy] Failed to get a random Infinity dimension id", throwable); return null; } } @@ -38,6 +40,7 @@ public final class FabricInfinityCompat implements InfinityCompatBridge { WarpLogic.requestWarp(player, dimensionId, false); return true; } catch (Throwable throwable) { + Antarchy.LOGGER.error("[Antarchy] Failed to request an Infinity warp to {}", dimensionId, throwable); return false; } } diff --git a/fabric/src/main/java/com/craisinlord/antarchy/fabric/client/AntarchyFabricClientBootstrap.java b/fabric/src/main/java/com/craisinlord/antarchy/fabric/client/AntarchyFabricClientBootstrap.java index 7c61431e..c8aba29c 100644 --- a/fabric/src/main/java/com/craisinlord/antarchy/fabric/client/AntarchyFabricClientBootstrap.java +++ b/fabric/src/main/java/com/craisinlord/antarchy/fabric/client/AntarchyFabricClientBootstrap.java @@ -21,6 +21,7 @@ import net.fabricmc.fabric.api.client.rendering.v1.HudRenderCallback; import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderEvents; import net.minecraft.client.model.BoatModel; import net.minecraft.client.model.ChestBoatModel; +import net.minecraft.client.gui.screens.MenuScreens; import net.minecraft.client.renderer.BiomeColors; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.texture.TextureAtlas; @@ -51,6 +52,7 @@ public final class AntarchyFabricClientBootstrap { public static void register() { AntarchyKeyBindings.register(); + MenuScreens.register(AntarchyFabricContent.DORRIE_INVENTORY_MENU.get(), com.craisinlord.antarchy.content.client.screen.DorrieInventoryScreen::new); registerRenderers(); registerEntityLayers(); registerColors(); @@ -83,6 +85,8 @@ public final class AntarchyFabricClientBootstrap { EntityRendererRegistry.register(AntarchyFabricContent.TRIFFID.get(), TriffidRenderer::new); EntityRendererRegistry.register(AntarchyFabricContent.OURANWOOD_BOAT_ENTITY.get(), context -> new OuranwoodBoatRenderer<>(context, ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "textures/entity/boat/ouranwood.png"), false)); EntityRendererRegistry.register(AntarchyFabricContent.OURANWOOD_CHEST_BOAT_ENTITY.get(), context -> new OuranwoodBoatRenderer<>(context, ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "textures/entity/chest_boat/ouranwood.png"), true)); + EntityRendererRegistry.register(AntarchyFabricContent.PEACH_BOAT_ENTITY.get(), context -> new PeachBoatRenderer<>(context, ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "textures/entity/boat/peach.png"), false)); + EntityRendererRegistry.register(AntarchyFabricContent.PEACH_CHEST_BOAT_ENTITY.get(), context -> new PeachBoatRenderer<>(context, ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "textures/entity/chest_boat/peach.png"), true)); EntityRendererRegistry.register(AntarchyFabricContent.APPLE_COW.get(), AppleCowRenderer::new); EntityRendererRegistry.register(AntarchyFabricContent.GOLDEN_APPLE_COW.get(), AppleCowRenderer::new); EntityRendererRegistry.register(AntarchyFabricContent.ENCHANTED_GOLDEN_APPLE_COW.get(), AppleCowRenderer::new); @@ -111,10 +115,15 @@ public final class AntarchyFabricClientBootstrap { EntityRendererRegistry.register(AntarchyFabricContent.TORETERROR.get(), ToreterrorRenderer::new); EntityRendererRegistry.register(AntarchyFabricContent.WATER_BOMB.get(), WaterBombRenderer::new); EntityRendererRegistry.register(AntarchyFabricContent.CHEEP.get(), com.craisinlord.antarchy.content.client.renderer.CheepRenderer::new); - // EntityRendererRegistry.register(AntarchyFabricContent.GLIMMER.get(), com.craisinlord.antarchy.content.client.renderer.GlimmerRenderer::new); + EntityRendererRegistry.register(AntarchyFabricContent.DORRIE.get(), com.craisinlord.antarchy.content.client.renderer.DorrieRenderer::new); + EntityRendererRegistry.register(AntarchyFabricContent.OURANWOOD_DEER.get(), com.craisinlord.antarchy.content.client.renderer.OuranwoodDeerRenderer::new); + EntityRendererRegistry.register(AntarchyFabricContent.GLIMMER.get(), com.craisinlord.antarchy.content.client.renderer.glimmer.GlimmerRenderer::new); + EntityRendererRegistry.register(AntarchyFabricContent.ELKA.get(), com.craisinlord.antarchy.content.client.renderer.ElkaRenderer::new); EntityModelLayerRegistry.registerModelLayer(OuranwoodBoatRenderer.boatLayer(), BoatModel::createBodyModel); EntityModelLayerRegistry.registerModelLayer(OuranwoodBoatRenderer.chestBoatLayer(), ChestBoatModel::createBodyModel); + EntityModelLayerRegistry.registerModelLayer(PeachBoatRenderer.boatLayer(), BoatModel::createBodyModel); + EntityModelLayerRegistry.registerModelLayer(PeachBoatRenderer.chestBoatLayer(), ChestBoatModel::createBodyModel); } private static void registerColors() { @@ -185,6 +194,17 @@ public final class AntarchyFabricClientBootstrap { } } ); + + FluidRenderHandlerRegistry.INSTANCE.register( + AntarchyFabricContent.LUMEN.get(), + AntarchyFabricContent.FLOWING_LUMEN.get(), + new SimpleFluidRenderHandler( + ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "block/lumen_still"), + ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "block/lumen_flow"), + ResourceLocation.withDefaultNamespace("block/water_overlay"), + 0xFFFFFFFF + ) + ); } private static void registerParticles() { @@ -192,6 +212,7 @@ public final class AntarchyFabricClientBootstrap { registry.register(AntarchyFabricContent.DREAM_FIRE_FLAME.get(), DreamFlameParticle.Provider::new); registry.register(AntarchyFabricContent.STINKY_GAS.get(), HypnoticGasParticle.Provider::new); registry.register(AntarchyFabricContent.STINKY_FLY.get(), FireflyParticle.Provider::new); + registry.register(AntarchyFabricContent.PEACH_LEAVES_PARTICLE.get(), PeachLeavesParticle.Provider::new); registry.register(AntarchyFabricContent.HYPNOTIC_GAS.get(), HypnoticGasParticle.Provider::new); registry.register(AntarchyFabricContent.HYPNOTIC_GAS_DOWN.get(), sprites -> new HypnoticGasParticle.Provider(sprites, true)); registry.register(AntarchyFabricContent.HYPNOTIC_GAS_CLOUD.get(), new HypnoticGasCloudParticle.Provider()); @@ -209,6 +230,11 @@ public final class AntarchyFabricClientBootstrap { BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricContent.OURANWOOD_DOOR.get(), RenderType.cutout()); BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricContent.OURANWOOD_TRAPDOOR.get(), RenderType.cutout()); BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricContent.OURANWOOD_ACORN_BLOCK.get(), RenderType.cutout()); + BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricContent.PEACH_LEAVES.get(), RenderType.cutout()); + BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricContent.PEACH_HANGING_PEACH.get(), RenderType.cutout()); + BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricContent.PEACH_DOOR.get(), RenderType.cutout()); + BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricContent.PEACH_TRAPDOOR.get(), RenderType.cutout()); + BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricContent.PEACH_SAPLING.get(), RenderType.cutout()); // BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricContent.OURANWOOD_VINE.get(), RenderType.cutout()); // BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricContent.OURANWOOD_VINE_PLANT.get(), RenderType.cutout()); BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricContent.DUPLICATOR_SAPLING.get(), RenderType.cutout()); @@ -216,6 +242,8 @@ public final class AntarchyFabricClientBootstrap { BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricContent.PINK_MILKWEED.get(), RenderType.cutout()); BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricContent.HUSHWEED.get(), RenderType.cutout()); BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricContent.CORNEA_STALK.get(), RenderType.cutout()); + BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricContent.CORN_CROP.get(), RenderType.cutout()); + BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricContent.WILD_CORN.get(), RenderType.cutout()); BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricContent.FALLEN_KING_CROWN_BLOCK.get(), RenderType.cutout()); BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricContent.ANTIMETAL_SCAFFOLDING.get(), RenderType.cutout()); BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricContent.UMBRAL_MOSS_CARPET.get(), RenderType.cutout()); @@ -231,6 +259,7 @@ public final class AntarchyFabricClientBootstrap { BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricContent.DREAM_FIRE.get(), RenderType.cutout()); BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricContent.DREAM_CEILING_FIRE.get(), RenderType.cutout()); BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricContent.ANTIWATER_BLOCK.get(), RenderType.translucent()); + BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricContent.LUMEN_BLOCK.get(), RenderType.translucent()); BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricContent.ELYTHIA_PORTAL.get(), RenderType.translucent()); BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricContent.THORAXIS_PORTAL.get(), RenderType.translucent()); BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricContent.TRIFFID_GOO_BLOCK.get(), RenderType.translucent()); @@ -247,6 +276,8 @@ public final class AntarchyFabricClientBootstrap { AntarchyFabricContent.FLOWING_BILE.get(), AntarchyFabricContent.ICHOR.get(), AntarchyFabricContent.FLOWING_ICHOR.get(), + AntarchyFabricContent.LUMEN.get(), + AntarchyFabricContent.FLOWING_LUMEN.get(), AntarchyFabricContent.ANTIWATER.get(), AntarchyFabricContent.FLOWING_ANTIWATER.get() ); diff --git a/fabric/src/main/java/com/craisinlord/antarchy/fabric/mixin/infinity/RandomSpringMixin.java b/fabric/src/main/java/com/craisinlord/antarchy/fabric/mixin/infinity/RandomSpringMixin.java deleted file mode 100644 index 559cdba6..00000000 --- a/fabric/src/main/java/com/craisinlord/antarchy/fabric/mixin/infinity/RandomSpringMixin.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.craisinlord.antarchy.fabric.mixin.infinity; - -import net.lerariemann.infinity.dimensions.features.fluid_springs.RandomSpring; -import net.lerariemann.infinity.util.core.ConfigType; -import net.lerariemann.infinity.util.core.RandomProvider; -import net.minecraft.nbt.CompoundTag; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Redirect; - -import java.util.Random; - -@Mixin(value = RandomSpring.class, remap = false) -/* - * Skips bad fluid picks for Infinity random springs on Fabric. - */ -public abstract class RandomSpringMixin { - @Redirect( - method = "feature", - at = @At( - value = "INVOKE", - target = "Lnet/lerariemann/infinity/util/core/RandomProvider;randomName(Ljava/util/Random;Lnet/lerariemann/infinity/util/core/ConfigType;)Ljava/lang/String;" - ) - ) - private String antarchy$useFluidIdForSpring(RandomProvider provider, Random random, ConfigType configType) { - if (configType != ConfigType.FLUIDS) { - return provider.randomName(random, configType); - } - - CompoundTag fluidTag = provider.randomElement(random, configType); - String fluidId = fluidTag.getString("fluidName"); - if (!fluidId.isEmpty()) { - return fluidId; - } - return fluidTag.getString("Name"); - } -} diff --git a/fabric/src/main/resources/antarchy-fabric.mixins.json b/fabric/src/main/resources/antarchy-fabric.mixins.json index e3f62732..2a161455 100644 --- a/fabric/src/main/resources/antarchy-fabric.mixins.json +++ b/fabric/src/main/resources/antarchy-fabric.mixins.json @@ -17,7 +17,6 @@ "JumpyBootsFallDamageMixin", "entity.MultipartEntityLevelRegistryMixin", "WoodTypeInvoker", - "infinity.RandomSpringMixin", "infinity.PortalCreatorMixin" ], "client": [ diff --git a/fabric/src/main/resources/assets/antarchy/models/item/lumen_bucket.json b/fabric/src/main/resources/assets/antarchy/models/item/lumen_bucket.json new file mode 100644 index 00000000..5b384dbc --- /dev/null +++ b/fabric/src/main/resources/assets/antarchy/models/item/lumen_bucket.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "antarchy:item/lumen_bucket" + } +} diff --git a/fabric/src/main/resources/data/minecraft/tags/fluid/water.json b/fabric/src/main/resources/data/minecraft/tags/fluid/water.json index 6d00bd9c..60ad5ea5 100644 --- a/fabric/src/main/resources/data/minecraft/tags/fluid/water.json +++ b/fabric/src/main/resources/data/minecraft/tags/fluid/water.json @@ -1,6 +1,8 @@ { "values": [ "antarchy:ichor", - "antarchy:flowing_ichor" + "antarchy:flowing_ichor", + "antarchy:lumen", + "antarchy:flowing_lumen" ] } diff --git a/fabric/src/main/resources/fabric.mod.json b/fabric/src/main/resources/fabric.mod.json index 639fc562..eeb00897 100644 --- a/fabric/src/main/resources/fabric.mod.json +++ b/fabric/src/main/resources/fabric.mod.json @@ -35,5 +35,8 @@ "integrated_api": "*", "geckolib": "*", "sizeable_foliage": "*" + }, + "breaks": { + "infinity": "<2.7.2" } } diff --git a/gradle.properties b/gradle.properties index f8bee8a8..cfce331e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -38,6 +38,7 @@ structurevoidtoggle_neoforge=4.4.1+1.21 structurevoidtoggle_fabric=4.4.1+1.21 geckolib_version=4.8.4 +jei_version=19.27.0.336 intapi_curseforge_id = 817709 diff --git a/neoforge/build.gradle b/neoforge/build.gradle index 5fabcb04..739602f2 100644 --- a/neoforge/build.gradle +++ b/neoforge/build.gradle @@ -34,8 +34,8 @@ dependencies { neoForge "net.neoforged:neoforge:${rootProject.neoforge_version}" modLocalRuntime("curse.maven:intapi-${project.intapi_curseforge_id}:${project.intapi_curseforge_file_id_neoforge}") implementation "software.bernie.geckolib:geckolib-neoforge-${minecraft_version}:${geckolib_version}" - compileOnly(files(rootProject.file("infinite_dimensions_jars/infinity-2.7.1+1.21.1-neoforge.jar"))) - modLocalRuntime(files(rootProject.file("infinite_dimensions_jars/infinity-2.7.1+1.21.1-neoforge.jar"))) + compileOnly(files(rootProject.file("infinite_dimensions_jars/infinity-2.7.2+1.21.1-neoforge.jar"))) + modLocalRuntime(files(rootProject.file("infinite_dimensions_jars/infinity-2.7.2+1.21.1-neoforge.jar"))) compileOnly(files(rootProject.file("sizeable_foliage_jars/sizeable_foliage-neoforge-1.21.1-1.0.0.jar"))) runtimeOnly(files(rootProject.file("sizeable_foliage_jars/sizeable_foliage-neoforge-1.21.1-1.0.0.jar"))) @@ -44,7 +44,8 @@ dependencies { modLocalRuntime("com.telepathicgrunt:StructureVoidToggle-Neoforge:${project.structurevoidtoggle_neoforge}") // modLocalRuntime("curse.maven:idas-${idas_curseforge_id}:${idas_curseforge_file_id}") -// modLocalRuntime("curse.maven:jei-${jei_curseforge_id}:${jei_curseforge_file_id}") + compileOnly "mezz.jei:jei-${minecraft_version}-common-api:${jei_version}" + compileOnly "mezz.jei:jei-${minecraft_version}-neoforge-api:${jei_version}" // modLocalRuntime("curse.maven:create-${create_curseforge_id}:${create_curseforge_file_id}") // modLocalRuntime("curse.maven:theoneprobe-${top_curseforge_id}:${top_curseforge_file_id}") // modLocalRuntime("curse.maven:worldedit-${worldedit_curseforge_id}:${worldedit_curseforge_file_id}") diff --git a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyConfigModuleNeoforge.java b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyConfigModuleNeoforge.java index 0d3153a3..8f9cd5f8 100644 --- a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyConfigModuleNeoforge.java +++ b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyConfigModuleNeoforge.java @@ -199,6 +199,7 @@ public final class AntarchyConfigModuleNeoforge { AntarchySettings.setHerculesBeetleHealth(AntarchyMobsConfig.herculesBeetleHealth()); AntarchySettings.setHerculesBeetleAttackDamage(AntarchyMobsConfig.herculesBeetleAttackDamage()); AntarchySettings.setHerculesBeetleChargeDamage(AntarchyMobsConfig.herculesBeetleChargeDamage()); + AntarchySettings.setOuranwoodDeerHealth(AntarchyMobsConfig.ouranwoodDeerHealth()); AntarchySettings.setGlimmerHealth(AntarchyMobsConfig.glimmerHealth()); } @@ -311,9 +312,20 @@ public final class AntarchyConfigModuleNeoforge { AntarchySettings.setGravityGunCooldownSeconds(AntarchyToolsConfig.gravityGunCooldownSeconds()); AntarchySettings.setGravityGunMaxHoldDistance(AntarchyToolsConfig.gravityGunMaxHoldDistance()); + AntarchySettings.setMinersDreamEnabled(AntarchyToolsConfig.minersDreamEnabled()); + AntarchySettings.setMinersDreamMinimumRange(AntarchyToolsConfig.minersDreamMinimumRange()); + AntarchySettings.setMinersDreamMaximumRange(AntarchyToolsConfig.minersDreamMaximumRange()); + AntarchySettings.setMinersDreamTorchSpacing(AntarchyToolsConfig.minersDreamTorchSpacing()); + AntarchySettings.setMinersDreamBlocksPerTick(AntarchyToolsConfig.minersDreamBlocksPerTick()); + AntarchySettings.setDuctTapeRepairPercentPerUse(AntarchyToolsConfig.ductTapeRepairPercentPerUse()); AntarchySettings.setPotentNyxiteInvertedDurationSeconds(AntarchyToolsConfig.potentNyxiteInvertedDurationSeconds()); AntarchySettings.setCorneaEarNightVisionSeconds(AntarchyToolsConfig.corneaEarNightVisionSeconds()); + AntarchySettings.setAmericanizingEnabled(AntarchyToolsConfig.americanizingEnabled()); + AntarchySettings.setAmericanBonusNutrition(AntarchyToolsConfig.americanBonusNutrition()); + AntarchySettings.setAmericanBonusSaturation(AntarchyToolsConfig.americanBonusSaturation()); + AntarchySettings.setAmericanRegenerationDurationTicks(AntarchyToolsConfig.americanRegenerationDurationTicks()); + AntarchySettings.setAmericanRegenerationAmplifier(AntarchyToolsConfig.americanRegenerationAmplifier()); AntarchySettings.setAntDanceRadius(AntarchyMobsConfig.antDanceRadius()); AntarchySettings.setMogglesVisionRadius(AntarchyToolsConfig.mogglesVisionRadius()); diff --git a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyMobsConfig.java b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyMobsConfig.java index 849cce3b..3def0fb9 100644 --- a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyMobsConfig.java +++ b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyMobsConfig.java @@ -212,6 +212,11 @@ public final class AntarchyMobsConfig { private static final ModConfigSpec.DoubleValue DORRIE_HEALTH; + // Ouranwood Deer + + private static final ModConfigSpec.DoubleValue OURANWOOD_DEER_HEALTH; + + // Glimmer private static final ModConfigSpec.DoubleValue GLIMMER_HEALTH; @@ -547,6 +552,10 @@ public final class AntarchyMobsConfig { DORRIE_HEALTH = b.comment("Base max health.").defineInRange("health", 60.0D, 1.0D, 32768.0D); b.pop(); + b.push("ouranwood_deer"); + OURANWOOD_DEER_HEALTH = b.comment("Base max health.").defineInRange("health", 20.0D, 1.0D, 32768.0D); + b.pop(); + b.push("glimmer"); GLIMMER_HEALTH = b.comment("Base max health.").defineInRange("health", 20.0D, 1.0D, 32768.0D); b.pop(); @@ -727,6 +736,7 @@ public final class AntarchyMobsConfig { static double cheepHealth() { return CHEEP_HEALTH.get(); } static double cheepAttackDamage() { return CHEEP_ATTACK_DAMAGE.get(); } static double dorrieHealth() { return DORRIE_HEALTH.get(); } + static double ouranwoodDeerHealth() { return OURANWOOD_DEER_HEALTH.get(); } static double glimmerHealth() { return GLIMMER_HEALTH.get(); } static double herculesBeetleHealth() { return HERCULES_BEETLE_HEALTH.get(); } static double herculesBeetleAttackDamage() { return HERCULES_BEETLE_ATTACK_DAMAGE.get(); } diff --git a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyNeoForgeFluidTypes.java b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyNeoForgeFluidTypes.java index d66a0714..b3be4333 100644 --- a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyNeoForgeFluidTypes.java +++ b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyNeoForgeFluidTypes.java @@ -45,6 +45,17 @@ public final class AntarchyNeoForgeFluidTypes { .density(1200) .viscosity(1400))); + public static final DeferredHolder LUMEN_TYPE = FLUID_TYPES.register("lumen", + () -> new FluidType(FluidType.Properties.create() + .descriptionId("block.antarchy.lumen") + .fallDistanceModifier(0.0F) + .canSwim(true) + .supportsBoating(true) + .sound(SoundActions.BUCKET_FILL, SoundEvents.BUCKET_FILL) + .sound(SoundActions.BUCKET_EMPTY, SoundEvents.BUCKET_EMPTY) + .density(1000) + .viscosity(1000))); + private AntarchyNeoForgeFluidTypes() { } diff --git a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyNeoforge.java b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyNeoforge.java index bf604348..12b7006a 100644 --- a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyNeoforge.java +++ b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyNeoforge.java @@ -2,6 +2,7 @@ package com.craisinlord.antarchy.neoforge; import com.craisinlord.antarchy.Antarchy; import com.craisinlord.antarchy.compat.infinity.InfinityCompat; +import com.craisinlord.antarchy.compat.infinity.InfinityCompatVersion; import com.craisinlord.antarchy.content.AntarchyObjects; import com.craisinlord.antarchy.content.AntarchySoundEvents; import com.craisinlord.antarchy.content.item.BloodCrystalKatanaItem; @@ -168,7 +169,7 @@ public class AntarchyNeoforge { new BloodCrystalKatanaTrailPayload(player.getId(), durationTicks) )); com.craisinlord.antarchy.content.gravity.AntarchyGravityApi.setSyncDispatcher(AntarchyGravityNetworking::syncEntity); - if (isModLoaded("infinity")) { + if (isSupportedInfinityLoaded()) { InfinityCompat.bind(new NeoForgeInfinityCompat()); } AntarchyNeoForgeEvents.register(modEventBus); @@ -176,6 +177,7 @@ public class AntarchyNeoforge { AntarchyNeoforgeEntites.register(modEventBus); AntarchyNeoforgeBlocks.register(modEventBus); AntarchyNeoforgeItems.register(modEventBus); + AntarchyNeoForgeFluidTypes.register(modEventBus); AntarchyNeoforgeMisc.register(modEventBus); AntarchyNeoforgeSpawnPlacements.register(modEventBus); AntarchyNeoforgeCreativeModeTabs.register(modEventBus); @@ -217,7 +219,7 @@ public class AntarchyNeoforge { (java.util.function.Supplier) AntarchyNeoforgeEntites.BOMBER, (java.util.function.Supplier) AntarchyNeoforgeEntites.BED_BUG, AntarchyNeoforgeEntites.CHEEP, - (java.util.function.Supplier) AntarchyNeoforgeEntites.CHEEP, + AntarchyNeoforgeEntites.DORRIE, () -> AntarchyNeoforgeBlocks.DUPLICATOR_LOG.get(), () -> AntarchyNeoforgeBlocks.DUPLICATOR_SAPLING.get(), () -> AntarchyNeoforgeBlocks.DUCT_TAPE.get(), @@ -268,6 +270,10 @@ public class AntarchyNeoforge { () -> AntarchyNeoforgeBlocks.OURANWOOD_ACORN_BLOCK.get(), () -> AntarchyNeoforgeBlocks.MOSSY_OURANWOOD_LOG.get(), () -> AntarchyNeoforgeBlocks.MOSSY_OURANWOOD_WOOD.get(), + () -> AntarchyNeoforgeBlocks.UMBRAL_MOSS_BLOCK.get(), + () -> AntarchyNeoforgeBlocks.UMBRAL_MOSS_CARPET.get(), + () -> AntarchyNeoforgeBlocks.BLUSH_MOSS_BLOCK.get(), + () -> AntarchyNeoforgeBlocks.BLUSH_MOSS_CARPET.get(), () -> AntarchyNeoforgeBlocks.ORANGE_MILKWEED.get(), () -> AntarchyNeoforgeBlocks.PINK_MILKWEED.get(), () -> AntarchyNeoforgeBlocks.BED_BUG_EGG.get(), @@ -283,13 +289,30 @@ public class AntarchyNeoforge { () -> AntarchyNeoforgeBlocks.HUSHWEED_BLOCK_ENTITY.get(), () -> AntarchyNeoforgeMisc.STINKY_GAS.get(), () -> AntarchyNeoforgeMisc.STINKY_FLY.get(), + () -> AntarchyNeoforgeMisc.PEACH_LEAVES_PARTICLE.get(), () -> AntarchyNeoforgeMisc.DOUBLE_DAMAGE_CHANCE, () -> AntarchyNeoforgeMisc.BLOODGLASS_MAX_HEARTS, () -> AntarchyNeoforgeMisc.BLOODGLASS_WARD ); AntarchyObjects.setOctopusBomb(AntarchyNeoforgeEntites.OCTOPUS_BOMB); - // AntarchyObjects.setGlimmer(AntarchyNeoforgeEntites.GLIMMER); - // AntarchyObjects.setGlimmersGrace(() -> AntarchyNeoforgeMisc.GLIMMERS_GRACE); + AntarchyObjects.setOuranwoodDeer(AntarchyNeoforgeEntites.OURANWOOD_DEER); + AntarchyObjects.setGlimmer(AntarchyNeoforgeEntites.GLIMMER); + AntarchyObjects.setSpiritApple(() -> AntarchyNeoforgeItems.SPIRIT_APPLE.get()); + AntarchyObjects.setElka(AntarchyNeoforgeEntites.ELKA); + AntarchyObjects.setPeach(() -> AntarchyNeoforgeItems.PEACH.get()); + AntarchyObjects.setCorn(() -> AntarchyNeoforgeItems.CORN.get()); + AntarchyObjects.setCornSeeds(() -> AntarchyNeoforgeItems.CORN_SEEDS.get()); + AntarchyObjects.setCookedCorndog(() -> AntarchyNeoforgeItems.COOKED_CORNDOG.get()); + AntarchyObjects.setGlimmerBottle(() -> AntarchyNeoforgeItems.GLIMMER_BOTTLE.get()); + AntarchyObjects.setGlimmerVariantComponent(() -> AntarchyNeoforgeMisc.GLIMMER_VARIANT.get()); + AntarchyObjects.setAmericanComponent(() -> AntarchyNeoforgeMisc.AMERICAN.get()); + AntarchyObjects.setLumen(() -> AntarchyNeoforgeMisc.LUMEN.get()); + AntarchyObjects.setFlowingLumen(() -> AntarchyNeoforgeMisc.FLOWING_LUMEN.get()); + AntarchyObjects.setLumenBucket(() -> AntarchyNeoforgeItems.LUMEN_BUCKET.get()); + AntarchyObjects.setLumenBlock(() -> AntarchyNeoforgeBlocks.LUMEN_BLOCK.get()); + AntarchyObjects.setLumenFroglight(() -> AntarchyNeoforgeBlocks.LUMEN_FROGLIGHT.get()); + AntarchyObjects.setPeachLeavesParticle(() -> AntarchyNeoforgeMisc.PEACH_LEAVES_PARTICLE.get()); + AntarchyObjects.setDorrieInventoryMenu(AntarchyNeoforgeMisc.DORRIE_INVENTORY_MENU); } private static boolean isModLoaded(String modId) { @@ -299,4 +322,29 @@ public class AntarchyNeoforge { return false; } } + + private static boolean isSupportedInfinityLoaded() { + if (!isModLoaded("infinity")) { + return false; + } + + try { + String version = ModList.get() + .getModContainerById("infinity") + .map(container -> container.getModInfo().getVersion().toString()) + .orElse(null); + if (InfinityCompatVersion.isSupported(version)) { + return true; + } + + Antarchy.LOGGER.warn( + "Skipping Infinity integration because version {} is below the supported minimum {}", + version, + InfinityCompatVersion.requiredVersion() + ); + } catch (Throwable throwable) { + Antarchy.LOGGER.warn("Skipping Infinity integration because the installed Infinity version could not be verified", throwable); + } + return false; + } } diff --git a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyToolsConfig.java b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyToolsConfig.java index 5fe047eb..2d2cb08f 100644 --- a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyToolsConfig.java +++ b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyToolsConfig.java @@ -170,12 +170,26 @@ public final class AntarchyToolsConfig { private static final ModConfigSpec.DoubleValue GRAVITY_GUN_MAX_HOLD_DISTANCE; + // Miner's Dream + + private static final ModConfigSpec.BooleanValue MINERS_DREAM_ENABLED; + private static final ModConfigSpec.IntValue MINERS_DREAM_MINIMUM_RANGE; + private static final ModConfigSpec.IntValue MINERS_DREAM_MAXIMUM_RANGE; + private static final ModConfigSpec.IntValue MINERS_DREAM_TORCH_SPACING; + private static final ModConfigSpec.IntValue MINERS_DREAM_BLOCKS_PER_TICK; + + // Miscellaneous items / consumables private static final ModConfigSpec.DoubleValue DUCT_TAPE_REPAIR_PERCENT_PER_USE; private static final ModConfigSpec.DoubleValue POTENT_NYXITE_INVERTED_DURATION_SECONDS; private static final ModConfigSpec.BooleanValue INVERT_PROJECTILES_FROM_INVERTED_PLAYERS; private static final ModConfigSpec.IntValue CORNEA_EAR_NIGHT_VISION_SECONDS; + private static final ModConfigSpec.BooleanValue AMERICAN_ENABLED; + private static final ModConfigSpec.IntValue AMERICAN_BONUS_NUTRITION; + private static final ModConfigSpec.DoubleValue AMERICAN_BONUS_SATURATION; + private static final ModConfigSpec.IntValue AMERICAN_REGENERATION_DURATION_TICKS; + private static final ModConfigSpec.IntValue AMERICAN_REGENERATION_AMPLIFIER; // Moggles @@ -424,6 +438,17 @@ public final class AntarchyToolsConfig { b.pop(); + // Miner's Dream + + b.push("minersDream"); + MINERS_DREAM_ENABLED = b.comment("Master toggle. If false, the item remains craftable but cannot be used.").define("enabled", true); + MINERS_DREAM_MINIMUM_RANGE = b.comment("Minimum cave length in blocks. Clamped to [8, 256].") .defineInRange("minimumRange", 48, 8, 256); + MINERS_DREAM_MAXIMUM_RANGE = b.comment("Maximum cave length in blocks. Clamped to [8, 256].") .defineInRange("maximumRange", 96, 8, 256); + MINERS_DREAM_TORCH_SPACING = b.comment("Approximate blocks between torch placements along the cave.") .defineInRange("torchSpacing", 10, 4, 64); + MINERS_DREAM_BLOCKS_PER_TICK = b.comment("Maximum blocks removed per server tick while excavating.") .defineInRange("blocksPerTick", 150, 1, 2000); + b.pop(); + + // Miscellaneous items / consumables b.push("ductTape"); @@ -444,6 +469,14 @@ public final class AntarchyToolsConfig { .defineInRange("nightVisionSeconds", 15, 0, 600); b.pop(); + b.push("american"); + AMERICAN_ENABLED = b.comment("If false, foods cannot be Americanized with High Fructose Corn Syrup.").define("enabled", true); + AMERICAN_BONUS_NUTRITION = b.comment("Extra hunger points restored when eating an Americanized food.").defineInRange("bonusNutrition", 2, 0, 100); + AMERICAN_BONUS_SATURATION = b.comment("Extra saturation restored when eating an Americanized food.").defineInRange("bonusSaturation", 1.0D, 0.0D, 100.0D); + AMERICAN_REGENERATION_DURATION_TICKS = b.comment("Duration of the Regeneration effect granted when eating an Americanized food, in ticks.").defineInRange("regenerationDurationTicks", 60, 0, 72000); + AMERICAN_REGENERATION_AMPLIFIER = b.comment("Amplifier of the Regeneration effect granted when eating an Americanized food (0 = I).").defineInRange("regenerationAmplifier", 0, 0, 10); + b.pop(); + b.push("moggles"); MOGGLES_VISION_RADIUS = b.comment("Radius in blocks of the see-through effect (cube side = 2r+1).").defineInRange("visionRadius", 2, 1, 16); MOGGLES_VISION_MAX_LIGHT = b.comment("Maximum block light level where Moggles vision activates.") .defineInRange("visionMaxLight", 7, 0, 15); @@ -579,9 +612,20 @@ public final class AntarchyToolsConfig { static double gravityGunCooldownSeconds() { return GRAVITY_GUN_COOLDOWN_SECONDS.get(); } static double gravityGunMaxHoldDistance() { return GRAVITY_GUN_MAX_HOLD_DISTANCE.get(); } + static boolean minersDreamEnabled() { return MINERS_DREAM_ENABLED.get(); } + static int minersDreamMinimumRange() { return MINERS_DREAM_MINIMUM_RANGE.get(); } + static int minersDreamMaximumRange() { return MINERS_DREAM_MAXIMUM_RANGE.get(); } + static int minersDreamTorchSpacing() { return MINERS_DREAM_TORCH_SPACING.get(); } + static int minersDreamBlocksPerTick() { return MINERS_DREAM_BLOCKS_PER_TICK.get(); } + static double ductTapeRepairPercentPerUse() { return DUCT_TAPE_REPAIR_PERCENT_PER_USE.get(); } static double potentNyxiteInvertedDurationSeconds() { return POTENT_NYXITE_INVERTED_DURATION_SECONDS.get(); } static int corneaEarNightVisionSeconds() { return CORNEA_EAR_NIGHT_VISION_SECONDS.get(); } + static boolean americanizingEnabled() { return AMERICAN_ENABLED.get(); } + static int americanBonusNutrition() { return AMERICAN_BONUS_NUTRITION.get(); } + static double americanBonusSaturation() { return AMERICAN_BONUS_SATURATION.get(); } + static int americanRegenerationDurationTicks() { return AMERICAN_REGENERATION_DURATION_TICKS.get(); } + static int americanRegenerationAmplifier() { return AMERICAN_REGENERATION_AMPLIFIER.get(); } static int mogglesVisionRadius() { return MOGGLES_VISION_RADIUS.get(); } static int mogglesVisionMaxLight() { return MOGGLES_VISION_MAX_LIGHT.get(); } diff --git a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/OuranwoodWoodTypes.java b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyWoodTypes.java similarity index 77% rename from neoforge/src/main/java/com/craisinlord/antarchy/neoforge/OuranwoodWoodTypes.java rename to neoforge/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyWoodTypes.java index bf085257..d361610a 100644 --- a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/OuranwoodWoodTypes.java +++ b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyWoodTypes.java @@ -4,10 +4,11 @@ import com.craisinlord.antarchy.Antarchy; import net.minecraft.world.level.block.state.properties.BlockSetType; import net.minecraft.world.level.block.state.properties.WoodType; -public final class OuranwoodWoodTypes { +public final class AntarchyWoodTypes { public static final WoodType OURANWOOD = register("ouranwood"); + public static final WoodType PEACH = register("peach"); - private OuranwoodWoodTypes() { + private AntarchyWoodTypes() { } private static WoodType register(String name) { diff --git a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/NeoForgeInfinityCompat.java b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/NeoForgeInfinityCompat.java index a2f5d37a..03fa25f9 100644 --- a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/NeoForgeInfinityCompat.java +++ b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/NeoForgeInfinityCompat.java @@ -1,5 +1,6 @@ package com.craisinlord.antarchy.neoforge; +import com.craisinlord.antarchy.Antarchy; import com.craisinlord.antarchy.compat.infinity.InfinityCompatBridge; import net.lerariemann.infinity.util.InfinityMethods; import net.lerariemann.infinity.util.teleport.WarpLogic; @@ -18,6 +19,7 @@ public final class NeoForgeInfinityCompat implements InfinityCompatBridge { try { return InfinityMethods.getRandomId(random); } catch (Throwable throwable) { + Antarchy.LOGGER.error("[Antarchy] Failed to get a random Infinity dimension id", throwable); return null; } } @@ -28,6 +30,7 @@ public final class NeoForgeInfinityCompat implements InfinityCompatBridge { WarpLogic.requestWarp(player, dimensionId, false); return true; } catch (Throwable throwable) { + Antarchy.LOGGER.error("[Antarchy] Failed to request an Infinity warp to {}", dimensionId, throwable); return false; } } diff --git a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/client/AntarchyNeoForgeClient.java b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/client/AntarchyNeoForgeClient.java index 1e5af0fe..a63e4433 100644 --- a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/client/AntarchyNeoForgeClient.java +++ b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/client/AntarchyNeoForgeClient.java @@ -53,6 +53,7 @@ import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.fml.event.lifecycle.FMLClientSetupEvent; import net.neoforged.neoforge.client.event.RegisterParticleProvidersEvent; import net.neoforged.neoforge.client.event.RegisterColorHandlersEvent; +import net.neoforged.neoforge.client.event.RegisterMenuScreensEvent; import net.neoforged.neoforge.client.event.EntityRenderersEvent; import net.neoforged.neoforge.client.event.RegisterGuiLayersEvent; import net.neoforged.neoforge.client.extensions.common.IClientItemExtensions; @@ -68,6 +69,8 @@ public final class AntarchyNeoForgeClient { private static final ResourceLocation DR_TRAYAURUS_TEXTURE = ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "textures/entity/dr_trayaurus.png"); private static final ResourceLocation OURANWOOD_BOAT_TEXTURE = ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "textures/entity/boat/ouranwood.png"); private static final ResourceLocation OURANWOOD_CHEST_BOAT_TEXTURE = ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "textures/entity/chest_boat/ouranwood.png"); + private static final ResourceLocation PEACH_BOAT_TEXTURE = ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "textures/entity/boat/peach.png"); + private static final ResourceLocation PEACH_CHEST_BOAT_TEXTURE = ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "textures/entity/chest_boat/peach.png"); private static final ResourceLocation WATER_STILL = ResourceLocation.withDefaultNamespace("block/water_still"); private static final ResourceLocation WATER_FLOW = ResourceLocation.withDefaultNamespace("block/water_flow"); private static final ResourceLocation WATER_OVERLAY = ResourceLocation.withDefaultNamespace("block/water_overlay"); @@ -98,6 +101,8 @@ public final class AntarchyNeoForgeClient { event.registerEntityRenderer(AntarchyNeoforgeEntites.TRIFFID.get(), context -> withParalyzedGeoLayer(new TriffidRenderer(context))); event.registerEntityRenderer(AntarchyNeoforgeEntites.OURANWOOD_BOAT_ENTITY.get(), context -> new OuranwoodBoatRenderer<>(context, OURANWOOD_BOAT_TEXTURE, false)); event.registerEntityRenderer(AntarchyNeoforgeEntites.OURANWOOD_CHEST_BOAT_ENTITY.get(), context -> new OuranwoodBoatRenderer<>(context, OURANWOOD_CHEST_BOAT_TEXTURE, true)); + event.registerEntityRenderer(AntarchyNeoforgeEntites.PEACH_BOAT_ENTITY.get(), context -> new PeachBoatRenderer<>(context, PEACH_BOAT_TEXTURE, false)); + event.registerEntityRenderer(AntarchyNeoforgeEntites.PEACH_CHEST_BOAT_ENTITY.get(), context -> new PeachBoatRenderer<>(context, PEACH_CHEST_BOAT_TEXTURE, true)); event.registerEntityRenderer(AntarchyNeoforgeEntites.APPLE_COW.get(), context -> withParalyzedGeoLayer(new AppleCowRenderer(context))); event.registerEntityRenderer(AntarchyNeoforgeEntites.GOLDEN_APPLE_COW.get(), context -> withParalyzedGeoLayer(new AppleCowRenderer(context))); event.registerEntityRenderer(AntarchyNeoforgeEntites.ENCHANTED_GOLDEN_APPLE_COW.get(), context -> withParalyzedGeoLayer(new AppleCowRenderer(context))); @@ -125,7 +130,10 @@ public final class AntarchyNeoForgeClient { event.registerEntityRenderer(AntarchyNeoforgeEntites.TORETERROR.get(), ToreterrorRenderer::new); event.registerEntityRenderer(AntarchyNeoforgeEntites.WATER_BOMB.get(), WaterBombRenderer::new); event.registerEntityRenderer(AntarchyNeoforgeEntites.CHEEP.get(), context -> withParalyzedGeoLayer(new com.craisinlord.antarchy.content.client.renderer.CheepRenderer(context))); - // event.registerEntityRenderer(AntarchyNeoforgeEntites.GLIMMER.get(), context -> withParalyzedGeoLayer(new com.craisinlord.antarchy.content.client.renderer.GlimmerRenderer(context))); + event.registerEntityRenderer(AntarchyNeoforgeEntites.DORRIE.get(), context -> new com.craisinlord.antarchy.content.client.renderer.DorrieRenderer(context)); + event.registerEntityRenderer(AntarchyNeoforgeEntites.OURANWOOD_DEER.get(), context -> new com.craisinlord.antarchy.content.client.renderer.OuranwoodDeerRenderer(context)); + event.registerEntityRenderer(AntarchyNeoforgeEntites.GLIMMER.get(), context -> withParalyzedGeoLayer(new com.craisinlord.antarchy.content.client.renderer.glimmer.GlimmerRenderer(context))); + event.registerEntityRenderer(AntarchyNeoforgeEntites.ELKA.get(), context -> new com.craisinlord.antarchy.content.client.renderer.ElkaRenderer(context)); } @SubscribeEvent @@ -152,6 +160,8 @@ public final class AntarchyNeoForgeClient { public static void registerLayerDefinitions(EntityRenderersEvent.RegisterLayerDefinitions event) { event.registerLayerDefinition(OuranwoodBoatRenderer.boatLayer(), BoatModel::createBodyModel); event.registerLayerDefinition(OuranwoodBoatRenderer.chestBoatLayer(), ChestBoatModel::createBodyModel); + event.registerLayerDefinition(PeachBoatRenderer.boatLayer(), BoatModel::createBodyModel); + event.registerLayerDefinition(PeachBoatRenderer.chestBoatLayer(), ChestBoatModel::createBodyModel); } @SuppressWarnings({"rawtypes", "unchecked"}) @@ -206,6 +216,7 @@ public final class AntarchyNeoForgeClient { (stack, tintIndex) -> net.minecraft.world.level.GrassColor.getDefaultColor() ); event.register(new DynamicFluidContainerModel.Colors(), AntarchyNeoforgeItems.ICHOR_BUCKET.get()); + event.register(new DynamicFluidContainerModel.Colors(), AntarchyNeoforgeItems.LUMEN_BUCKET.get()); event.register(new DynamicFluidContainerModel.Colors(), AntarchyNeoforgeItems.ANTIWATER_BUCKET.get()); } @@ -214,6 +225,7 @@ public final class AntarchyNeoForgeClient { event.registerSpriteSet(AntarchyNeoforgeMisc.DREAM_FIRE_FLAME.get(), DreamFlameParticle.Provider::new); event.registerSpriteSet(AntarchyNeoforgeMisc.STINKY_GAS.get(), HypnoticGasParticle.Provider::new); event.registerSpriteSet(AntarchyNeoforgeMisc.STINKY_FLY.get(), FireflyParticle.Provider::new); + event.registerSpriteSet(AntarchyNeoforgeMisc.PEACH_LEAVES_PARTICLE.get(), PeachLeavesParticle.Provider::new); event.registerSpriteSet(AntarchyNeoforgeMisc.HYPNOTIC_GAS.get(), HypnoticGasParticle.Provider::new); event.registerSpriteSet(AntarchyNeoforgeMisc.HYPNOTIC_GAS_DOWN.get(), sprites -> new HypnoticGasParticle.Provider(sprites, true)); event.registerSpecial(AntarchyNeoforgeMisc.HYPNOTIC_GAS_CLOUD.get(), new HypnoticGasCloudParticle.Provider()); @@ -226,6 +238,11 @@ public final class AntarchyNeoForgeClient { event.registerSpriteSet(AntarchyNeoforgeMisc.ORANGE_ASH.get(), OrangeAshParticle.Provider::new); } + @SubscribeEvent + public static void registerMenuScreens(RegisterMenuScreensEvent event) { + event.register(AntarchyNeoforgeMisc.DORRIE_INVENTORY_MENU.get(), com.craisinlord.antarchy.content.client.screen.DorrieInventoryScreen::new); + } + @SubscribeEvent public static void registerGuiLayers(RegisterGuiLayersEvent event) { event.registerAboveAll( @@ -261,6 +278,50 @@ public final class AntarchyNeoForgeClient { @SubscribeEvent public static void registerClientExtensions(RegisterClientExtensionsEvent event) { Antarchy.LOGGER.info("[Antiwater] Registering antiwater client fluid textures still={} flow={}", ANTIWATER_STILL, ANTIWATER_FLOW); + event.registerFluidType(new IClientFluidTypeExtensions() { + @Override + public ResourceLocation getStillTexture() { + return ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "block/lumen_still"); + } + + @Override + public ResourceLocation getFlowingTexture() { + return ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "block/lumen_flow"); + } + + @Override + public ResourceLocation getOverlayTexture() { + return WATER_OVERLAY; + } + + @Override + public ResourceLocation getRenderOverlayTexture(Minecraft mc) { + return UNDERWATER_OVERLAY; + } + + @Override + public int getTintColor() { + return 0xFFFFFFFF; + } + + @Override + public int getTintColor(FluidState state, BlockAndTintGetter getter, net.minecraft.core.BlockPos pos) { + return 0xFFFFFFFF; + } + + @Override + public Vector3f modifyFogColor(Camera camera, float partialTick, ClientLevel level, int renderDistance, float darkenWorldAmount, Vector3f fluidFogColor) { + return new Vector3f(0.58F, 0.84F, 0.88F); + } + + @Override + public void modifyFogRender(Camera camera, net.minecraft.client.renderer.FogRenderer.FogMode mode, float renderDistance, float partialTick, float nearDistance, float farDistance, FogShape shape) { + RenderSystem.setShaderFogStart(0.4F); + RenderSystem.setShaderFogEnd(Math.min(farDistance, 12.0F)); + RenderSystem.setShaderFogShape(FogShape.CYLINDER); + } + }, AntarchyNeoForgeFluidTypes.LUMEN_TYPE.get()); + event.registerFluidType(new IClientFluidTypeExtensions() { @Override public ResourceLocation getStillTexture() { @@ -417,6 +478,11 @@ public final class AntarchyNeoForgeClient { ItemBlockRenderTypes.setRenderLayer(AntarchyNeoforgeBlocks.OURANWOOD_DOOR.get(), RenderType.cutout()); ItemBlockRenderTypes.setRenderLayer(AntarchyNeoforgeBlocks.OURANWOOD_TRAPDOOR.get(), RenderType.cutout()); ItemBlockRenderTypes.setRenderLayer(AntarchyNeoforgeBlocks.OURANWOOD_ACORN_BLOCK.get(), RenderType.cutout()); + ItemBlockRenderTypes.setRenderLayer(AntarchyNeoforgeBlocks.PEACH_LEAVES.get(), RenderType.cutout()); + ItemBlockRenderTypes.setRenderLayer(AntarchyNeoforgeBlocks.PEACH_HANGING_PEACH.get(), RenderType.cutout()); + ItemBlockRenderTypes.setRenderLayer(AntarchyNeoforgeBlocks.PEACH_DOOR.get(), RenderType.cutout()); + ItemBlockRenderTypes.setRenderLayer(AntarchyNeoforgeBlocks.PEACH_TRAPDOOR.get(), RenderType.cutout()); + ItemBlockRenderTypes.setRenderLayer(AntarchyNeoforgeBlocks.PEACH_SAPLING.get(), RenderType.cutout()); // ItemBlockRenderTypes.setRenderLayer(AntarchyNeoforgeBlocks.OURANWOOD_VINE.get(), RenderType.cutout()); // ItemBlockRenderTypes.setRenderLayer(AntarchyNeoforgeBlocks.OURANWOOD_VINE_PLANT.get(), RenderType.cutout()); ItemBlockRenderTypes.setRenderLayer(AntarchyNeoforgeBlocks.DUPLICATOR_SAPLING.get(), RenderType.cutout()); @@ -424,6 +490,8 @@ public final class AntarchyNeoForgeClient { ItemBlockRenderTypes.setRenderLayer(AntarchyNeoforgeBlocks.PINK_MILKWEED.get(), RenderType.cutout()); ItemBlockRenderTypes.setRenderLayer(AntarchyNeoforgeBlocks.HUSHWEED.get(), RenderType.cutout()); ItemBlockRenderTypes.setRenderLayer(AntarchyNeoforgeBlocks.CORNEA_STALK.get(), RenderType.cutout()); + ItemBlockRenderTypes.setRenderLayer(AntarchyNeoforgeBlocks.CORN_CROP.get(), RenderType.cutout()); + ItemBlockRenderTypes.setRenderLayer(AntarchyNeoforgeBlocks.WILD_CORN.get(), RenderType.cutout()); ItemBlockRenderTypes.setRenderLayer(AntarchyNeoforgeBlocks.ANTIMETAL_SCAFFOLDING.get(), RenderType.cutout()); ItemBlockRenderTypes.setRenderLayer(AntarchyNeoforgeBlocks.UMBRAL_MOSS_CARPET.get(), RenderType.cutout()); ItemBlockRenderTypes.setRenderLayer(AntarchyNeoforgeBlocks.NYXITE_SPIKE.get(), RenderType.cutout()); @@ -438,6 +506,7 @@ public final class AntarchyNeoForgeClient { ItemBlockRenderTypes.setRenderLayer(AntarchyNeoforgeBlocks.DREAM_FIRE.get(), RenderType.cutout()); ItemBlockRenderTypes.setRenderLayer(AntarchyNeoforgeBlocks.DREAM_CEILING_FIRE.get(), RenderType.cutout()); ItemBlockRenderTypes.setRenderLayer(AntarchyNeoforgeBlocks.ANTIWATER_BLOCK.get(), RenderType.translucent()); + ItemBlockRenderTypes.setRenderLayer(AntarchyNeoforgeBlocks.LUMEN_BLOCK.get(), RenderType.translucent()); ItemBlockRenderTypes.setRenderLayer(AntarchyNeoforgeBlocks.ELYTHIA_PORTAL.get(), RenderType.translucent()); ItemBlockRenderTypes.setRenderLayer(AntarchyNeoforgeBlocks.THORAXIS_PORTAL.get(), RenderType.translucent()); ItemBlockRenderTypes.setRenderLayer(AntarchyNeoforgeBlocks.TRIFFID_GOO_BLOCK.get(), RenderType.translucent()); diff --git a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/content/block/WildCornBlock.java b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/content/block/WildCornBlock.java new file mode 100644 index 00000000..e51b6534 --- /dev/null +++ b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/content/block/WildCornBlock.java @@ -0,0 +1,64 @@ +package com.craisinlord.antarchy.neoforge.content.block; + +import com.craisinlord.antarchy.content.AntarchyObjects; +import com.craisinlord.antarchy.content.block.CornCropBlock; +import com.mojang.serialization.MapCodec; +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.RandomSource; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.DoubleBlockHalf; + +public final class WildCornBlock extends CornCropBlock { + public static final MapCodec CODEC = Block.simpleCodec(WildCornBlock::new); + + public WildCornBlock(BlockBehaviour.Properties properties) { + super(properties); + this.registerDefaultState(this.stateDefinition.any().setValue(AGE, 3).setValue(HALF, DoubleBlockHalf.LOWER)); + } + + @Override + public MapCodec codec() { + return CODEC; + } + + @Override + protected boolean mayPlaceOn(BlockState state, BlockGetter level, BlockPos pos) { + return state.is(Blocks.GRASS_BLOCK); + } + + @Override + protected boolean isRandomlyTicking(BlockState state) { + return false; + } + + @Override + protected void randomTick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) { + } + + @Override + public boolean isValidBonemealTarget(LevelReader level, BlockPos pos, BlockState state) { + return false; + } + + @Override + public boolean isBonemealSuccess(Level level, RandomSource random, BlockPos pos, BlockState state) { + return false; + } + + @Override + public void performBonemeal(ServerLevel level, RandomSource random, BlockPos pos, BlockState state) { + } + + @Override + public ItemStack getCloneItemStack(LevelReader level, BlockPos pos, BlockState state) { + return new ItemStack(AntarchyObjects.CORN.get()); + } +} diff --git a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/mixins/infinity/RandomSpringMixin.java b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/mixins/infinity/RandomSpringMixin.java deleted file mode 100644 index d80afdaf..00000000 --- a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/mixins/infinity/RandomSpringMixin.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.craisinlord.antarchy.neoforge.mixins.infinity; - -import net.lerariemann.infinity.dimensions.features.fluid_springs.RandomSpring; -import net.lerariemann.infinity.util.core.ConfigType; -import net.lerariemann.infinity.util.core.RandomProvider; -import net.minecraft.nbt.CompoundTag; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Redirect; - -import java.util.Random; -@Mixin(value = RandomSpring.class, remap = false) -/* - * Skips bad fluid picks for Infinity random springs. - */ -public abstract class RandomSpringMixin { - @Redirect( - method = "feature()Lnet/minecraft/nbt/CompoundTag;", - at = @At( - value = "INVOKE", - target = "Lnet/lerariemann/infinity/util/core/RandomProvider;randomName(Ljava/util/Random;Lnet/lerariemann/infinity/util/core/ConfigType;)Ljava/lang/String;" - ), - remap = false - ) - private String antarchy$useFluidIdForSpring(RandomProvider provider, Random random, ConfigType configType) { - if (configType != ConfigType.FLUIDS) { - return provider.randomName(random, configType); - } - - CompoundTag fluidTag = provider.randomElement(random, configType); - String fluidId = fluidTag.getString("fluidName"); - if (!fluidId.isEmpty()) { - return fluidId; - } - return fluidTag.getString("Name"); - } -} diff --git a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoForgeEvents.java b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoForgeEvents.java index e12edd0a..7aa76c0b 100644 --- a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoForgeEvents.java +++ b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoForgeEvents.java @@ -4,6 +4,7 @@ import com.craisinlord.antarchy.Antarchy; import com.craisinlord.antarchy.config.AntarchySettings; import com.craisinlord.antarchy.content.AntarchyObjects; import com.craisinlord.antarchy.content.AntarchySoundEvents; +import com.craisinlord.antarchy.content.CustomBrewingRecipes; import com.craisinlord.antarchy.content.block.DuctTapeBlock; import com.craisinlord.antarchy.content.block.PotentNyxiteBlock; import com.craisinlord.antarchy.content.bloodglass.BloodglassAccess; @@ -36,6 +37,7 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.tags.FluidTags; import net.minecraft.world.item.*; import net.minecraft.world.item.alchemy.Potions; +import net.neoforged.neoforge.common.brewing.BrewingRecipe; import net.minecraft.world.level.block.ComposterBlock; import net.minecraft.world.level.block.DispenserBlock; import net.minecraft.world.level.block.RotatedPillarBlock; @@ -57,6 +59,8 @@ import net.neoforged.neoforge.event.entity.player.PlayerInteractEvent; import net.neoforged.neoforge.event.level.BlockEvent; import net.neoforged.neoforge.event.tick.EntityTickEvent; import net.neoforged.neoforge.event.tick.PlayerTickEvent; +import net.neoforged.neoforge.event.tick.ServerTickEvent; +import com.craisinlord.antarchy.content.item.MinersDreamExcavationManager; import net.neoforged.neoforge.fluids.FluidInteractionRegistry; import net.neoforged.neoforge.network.PacketDistributor; @@ -91,6 +95,7 @@ public final class AntarchyNeoForgeEvents { NeoForge.EVENT_BUS.addListener(AntarchyNeoForgeEvents::tickDreadAndIchor); NeoForge.EVENT_BUS.addListener(AntarchyNeoForgeEvents::tickScorpionWhips); NeoForge.EVENT_BUS.addListener(AntarchyNeoForgeEvents::tickDreamSandLowGravity); + NeoForge.EVENT_BUS.addListener(AntarchyNeoForgeEvents::tickMinersDreamExcavations); NeoForge.EVENT_BUS.addListener(AntarchyNeoForgeEvents::handleAntiwaterDamage); NeoForge.EVENT_BUS.addListener(AntarchyNeoForgeEvents::handleAntiwaterFall); NeoForge.EVENT_BUS.addListener(AntarchyNeoForgeEvents::handleDreamSandFall); @@ -859,6 +864,12 @@ public final class AntarchyNeoForgeEvents { } } + static void tickMinersDreamExcavations(ServerTickEvent.Post event) { + for (ServerLevel level : event.getServer().getAllLevels()) { + MinersDreamExcavationManager.tick(level); + } + } + static void tickDreamSandLowGravity(EntityTickEvent.Post event) { if (!(event.getEntity() instanceof LivingEntity livingEntity)) { return; @@ -971,6 +982,50 @@ public final class AntarchyNeoForgeEvents { } static void registerBrewingRecipes(RegisterBrewingRecipesEvent event) { + net.minecraft.tags.TagKey rootsTag = net.minecraft.tags.TagKey.create( + net.minecraft.core.registries.Registries.ITEM, + net.minecraft.resources.ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "roots") + ); + event.getBuilder().addRecipe(new BrewingRecipe( + net.minecraft.world.item.crafting.Ingredient.of(Items.POTION), + net.minecraft.world.item.crafting.Ingredient.of(AntarchyNeoforgeItems.CORN.get()), + new ItemStack(AntarchyNeoforgeItems.HIGH_FRUCTOSE_CORN_SYRUP.get()) + ) { + @Override + public boolean isInput(ItemStack stack) { + return stack.is(Items.POTION) && stack.getOrDefault(net.minecraft.core.component.DataComponents.POTION_CONTENTS, net.minecraft.world.item.alchemy.PotionContents.EMPTY).is(net.minecraft.world.item.alchemy.Potions.WATER); + } + + @Override + public boolean isIngredient(ItemStack stack) { + return stack.is(AntarchyNeoforgeItems.CORN.get()); + } + + @Override + public ItemStack getOutput(ItemStack input, ItemStack ingredient) { + return CustomBrewingRecipes.getOutput(input, ingredient); + } + }); + event.getBuilder().addRecipe(new BrewingRecipe( + net.minecraft.world.item.crafting.Ingredient.of(AntarchyNeoforgeItems.HIGH_FRUCTOSE_CORN_SYRUP.get()), + net.minecraft.world.item.crafting.Ingredient.of(rootsTag), + new ItemStack(AntarchyNeoforgeItems.ROOT_BEER.get()) + ) { + @Override + public boolean isInput(ItemStack stack) { + return stack.is(AntarchyNeoforgeItems.HIGH_FRUCTOSE_CORN_SYRUP.get()); + } + + @Override + public boolean isIngredient(ItemStack stack) { + return stack.is(rootsTag); + } + + @Override + public ItemStack getOutput(ItemStack input, ItemStack ingredient) { + return CustomBrewingRecipes.getOutput(input, ingredient); + } + }); event.getBuilder().addMix(Potions.AWKWARD, AntarchyNeoforgeItems.LUCID_EYE.get(), AntarchyNeoforgeMisc.INVERSION); event.getBuilder().addMix(AntarchyNeoforgeMisc.INVERSION, Items.REDSTONE, AntarchyNeoforgeMisc.LONG_INVERSION); event.getBuilder().addMix(Potions.AWKWARD, AntarchyNeoforgeItems.STINK_BUG.get(), AntarchyNeoforgeMisc.STINKY_POTION); @@ -1075,6 +1130,16 @@ public final class AntarchyNeoForgeEvents { if (state.is(AntarchyNeoforgeBlocks.MOSSY_OURANWOOD_WOOD.get())) { event.setFinalState(AntarchyNeoforgeBlocks.STRIPPED_OURANWOOD_WOOD.get().defaultBlockState().setValue(RotatedPillarBlock.AXIS, state.getValue(RotatedPillarBlock.AXIS))); + return; + } + + if (state.is(AntarchyNeoforgeBlocks.PEACH_LOG.get())) { + event.setFinalState(AntarchyNeoforgeBlocks.STRIPPED_PEACH_LOG.get().defaultBlockState().setValue(RotatedPillarBlock.AXIS, state.getValue(RotatedPillarBlock.AXIS))); + return; + } + + if (state.is(AntarchyNeoforgeBlocks.PEACH_WOOD.get())) { + event.setFinalState(AntarchyNeoforgeBlocks.STRIPPED_PEACH_WOOD.get().defaultBlockState().setValue(RotatedPillarBlock.AXIS, state.getValue(RotatedPillarBlock.AXIS))); } } @@ -1119,8 +1184,15 @@ public final class AntarchyNeoForgeEvents { ); ComposterBlock.COMPOSTABLES.put(AntarchyNeoforgeBlocks.UMBRAL_MOSS_BLOCK.get().asItem(), 0.65f); ComposterBlock.COMPOSTABLES.put(AntarchyNeoforgeBlocks.UMBRAL_MOSS_CARPET.get().asItem(), 0.3f); + ComposterBlock.COMPOSTABLES.put(AntarchyNeoforgeBlocks.BLUSH_MOSS_BLOCK.get().asItem(), 0.65f); + ComposterBlock.COMPOSTABLES.put(AntarchyNeoforgeBlocks.BLUSH_MOSS_CARPET.get().asItem(), 0.3f); ComposterBlock.COMPOSTABLES.put(AntarchyNeoforgeBlocks.HUSHWEED.get().asItem(), 0.65f); ComposterBlock.COMPOSTABLES.put(AntarchyNeoforgeItems.CORNEA_EAR.get(), 0.65f); + ComposterBlock.COMPOSTABLES.put(AntarchyNeoforgeBlocks.PEACH_LEAVES.get().asItem(), 0.3f); + ComposterBlock.COMPOSTABLES.put(AntarchyNeoforgeItems.PEACH_SAPLING_ITEM.get(), 0.3f); + ComposterBlock.COMPOSTABLES.put(AntarchyNeoforgeItems.CORN.get(), 0.65f); + ComposterBlock.COMPOSTABLES.put(AntarchyNeoforgeItems.CORN_SEEDS.get(), 0.3f); + ComposterBlock.COMPOSTABLES.put(AntarchyNeoforgeItems.PEACH.get(), 0.65f); }); } } diff --git a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeBlocks.java b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeBlocks.java index a77b7f12..6b591295 100644 --- a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeBlocks.java +++ b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeBlocks.java @@ -10,8 +10,10 @@ import com.craisinlord.antarchy.content.block.entity.HushweedBlockEntity; import com.craisinlord.antarchy.content.block.entity.PotentNyxiteBlockEntity; import com.craisinlord.antarchy.content.block.entity.WaspNestBlockEntity; import com.craisinlord.antarchy.content.fluid.BileLiquidBlock; +import com.craisinlord.antarchy.content.fluid.LumenLiquidBlock; import com.craisinlord.antarchy.content.portal.PermanentPortalType; -import com.craisinlord.antarchy.neoforge.OuranwoodWoodTypes; +import com.craisinlord.antarchy.neoforge.content.block.WildCornBlock; +import com.craisinlord.antarchy.neoforge.AntarchyWoodTypes; import com.craisinlord.antarchy.neoforge.content.fluid.AntiwaterFluidType; import com.mojang.serialization.MapCodec; import net.minecraft.core.Direction; @@ -84,13 +86,53 @@ public final class AntarchyNeoforgeBlocks { public static final DeferredBlock PINK_MILKWEED = BLOCKS.register("pink_milkweed", () -> new MilkweedBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.PEONY))); public static final DeferredBlock OURANWOOD_SIGN = BLOCKS.register("ouranwood_sign", - () -> new StandingSignBlock(OuranwoodWoodTypes.OURANWOOD, BlockBehaviour.Properties.ofFullCopy(Blocks.JUNGLE_SIGN))); + () -> new StandingSignBlock(AntarchyWoodTypes.OURANWOOD, BlockBehaviour.Properties.ofFullCopy(Blocks.JUNGLE_SIGN))); public static final DeferredBlock OURANWOOD_WALL_SIGN = BLOCKS.register("ouranwood_wall_sign", - () -> new WallSignBlock(OuranwoodWoodTypes.OURANWOOD, BlockBehaviour.Properties.ofFullCopy(Blocks.JUNGLE_WALL_SIGN))); + () -> new WallSignBlock(AntarchyWoodTypes.OURANWOOD, BlockBehaviour.Properties.ofFullCopy(Blocks.JUNGLE_WALL_SIGN))); public static final DeferredBlock OURANWOOD_HANGING_SIGN = BLOCKS.register("ouranwood_hanging_sign", - () -> new CeilingHangingSignBlock(OuranwoodWoodTypes.OURANWOOD, BlockBehaviour.Properties.ofFullCopy(Blocks.JUNGLE_HANGING_SIGN))); + () -> new CeilingHangingSignBlock(AntarchyWoodTypes.OURANWOOD, BlockBehaviour.Properties.ofFullCopy(Blocks.JUNGLE_HANGING_SIGN))); public static final DeferredBlock OURANWOOD_WALL_HANGING_SIGN = BLOCKS.register("ouranwood_wall_hanging_sign", - () -> new WallHangingSignBlock(OuranwoodWoodTypes.OURANWOOD, BlockBehaviour.Properties.ofFullCopy(Blocks.JUNGLE_WALL_HANGING_SIGN))); + () -> new WallHangingSignBlock(AntarchyWoodTypes.OURANWOOD, BlockBehaviour.Properties.ofFullCopy(Blocks.JUNGLE_WALL_HANGING_SIGN))); + public static final DeferredBlock PEACH_LOG = BLOCKS.register("peach_log", + () -> new RotatedPillarBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.JUNGLE_LOG))); + public static final DeferredBlock PEACH_WOOD = BLOCKS.register("peach_wood", + () -> new RotatedPillarBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.JUNGLE_WOOD))); + public static final DeferredBlock STRIPPED_PEACH_LOG = BLOCKS.register("stripped_peach_log", + () -> new RotatedPillarBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.STRIPPED_JUNGLE_LOG))); + public static final DeferredBlock STRIPPED_PEACH_WOOD = BLOCKS.register("stripped_peach_wood", + () -> new RotatedPillarBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.STRIPPED_JUNGLE_WOOD))); + public static final DeferredBlock PEACH_PLANKS = BLOCKS.register("peach_planks", + () -> new Block(BlockBehaviour.Properties.ofFullCopy(Blocks.JUNGLE_PLANKS))); + public static final DeferredBlock PEACH_STAIRS = BLOCKS.register("peach_stairs", + () -> new StairBlock(PEACH_PLANKS.get().defaultBlockState(), BlockBehaviour.Properties.ofFullCopy(Blocks.JUNGLE_STAIRS))); + public static final DeferredBlock PEACH_SLAB = BLOCKS.register("peach_slab", + () -> new SlabBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.JUNGLE_SLAB))); + public static final DeferredBlock PEACH_FENCE = BLOCKS.register("peach_fence", + () -> new FenceBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.JUNGLE_FENCE))); + public static final DeferredBlock PEACH_FENCE_GATE = BLOCKS.register("peach_fence_gate", + () -> new FenceGateBlock(WoodType.JUNGLE, BlockBehaviour.Properties.ofFullCopy(Blocks.JUNGLE_FENCE_GATE))); + public static final DeferredBlock PEACH_DOOR = BLOCKS.register("peach_door", + () -> new DoorBlock(BlockSetType.JUNGLE, BlockBehaviour.Properties.ofFullCopy(Blocks.JUNGLE_DOOR))); + public static final DeferredBlock PEACH_TRAPDOOR = BLOCKS.register("peach_trapdoor", + () -> new TrapDoorBlock(BlockSetType.JUNGLE, BlockBehaviour.Properties.ofFullCopy(Blocks.JUNGLE_TRAPDOOR))); + public static final DeferredBlock PEACH_PRESSURE_PLATE = BLOCKS.register("peach_pressure_plate", + () -> new PressurePlateBlock(BlockSetType.JUNGLE, BlockBehaviour.Properties.ofFullCopy(Blocks.JUNGLE_PRESSURE_PLATE))); + public static final DeferredBlock PEACH_BUTTON = BLOCKS.register("peach_button", + () -> new ButtonBlock(BlockSetType.JUNGLE, 30, BlockBehaviour.Properties.ofFullCopy(Blocks.JUNGLE_BUTTON))); + public static final DeferredBlock PEACH_LEAVES = BLOCKS.register("peach_leaves", + () -> new PeachLeavesBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.JUNGLE_LEAVES).randomTicks())); + public static final DeferredBlock PEACH_HANGING_PEACH = BLOCKS.register("hanging_peach", + () -> new HangingPeachBlock(BlockBehaviour.Properties.of().noOcclusion().instabreak())); + public static final DeferredBlock PEACH_SAPLING = BLOCKS.register("peach_sapling", + () -> new com.craisinlord.antarchy.content.block.PeachSaplingBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.OAK_SAPLING).randomTicks().noCollission())); + public static final DeferredBlock PEACH_SIGN = BLOCKS.register("peach_sign", + () -> new StandingSignBlock(AntarchyWoodTypes.PEACH, BlockBehaviour.Properties.ofFullCopy(Blocks.JUNGLE_SIGN))); + public static final DeferredBlock PEACH_WALL_SIGN = BLOCKS.register("peach_wall_sign", + () -> new WallSignBlock(AntarchyWoodTypes.PEACH, BlockBehaviour.Properties.ofFullCopy(Blocks.JUNGLE_WALL_SIGN))); + public static final DeferredBlock PEACH_HANGING_SIGN = BLOCKS.register("peach_hanging_sign", + () -> new CeilingHangingSignBlock(AntarchyWoodTypes.PEACH, BlockBehaviour.Properties.ofFullCopy(Blocks.JUNGLE_HANGING_SIGN))); + public static final DeferredBlock PEACH_WALL_HANGING_SIGN = BLOCKS.register("peach_wall_hanging_sign", + () -> new WallHangingSignBlock(AntarchyWoodTypes.PEACH, BlockBehaviour.Properties.ofFullCopy(Blocks.JUNGLE_WALL_HANGING_SIGN))); public static final DeferredBlock DUPLICATOR_SAPLING = BLOCKS.register("duplicator_sapling", () -> new DuplicatorSaplingBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.OAK_SAPLING).randomTicks().noCollission())); public static final DeferredBlock DUCT_TAPE = BLOCKS.register("duct_tape", @@ -189,6 +231,10 @@ public final class AntarchyNeoforgeBlocks { () -> new UmbralMossBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.MOSS_BLOCK))); public static final DeferredBlock UMBRAL_MOSS_CARPET = BLOCKS.register("umbral_moss_carpet", () -> new UmbralMossCarpetBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.MOSS_CARPET).noOcclusion())); + public static final DeferredBlock BLUSH_MOSS_BLOCK = BLOCKS.register("blush_moss_block", + () -> new BlushMossBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.MOSS_BLOCK))); + public static final DeferredBlock BLUSH_MOSS_CARPET = BLOCKS.register("blush_moss_carpet", + () -> new BlushMossCarpetBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.MOSS_CARPET).noOcclusion())); public static final DeferredBlock DREAM_TORCH = BLOCKS.register("dream_torch", () -> new DreamTorchBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.SOUL_TORCH))); public static final DeferredBlock DREAM_WALL_TORCH = BLOCKS.register("dream_wall_torch", @@ -224,6 +270,13 @@ public final class AntarchyNeoforgeBlocks { public static final DeferredBlock ANTIWATER_BLOCK = BLOCKS.register("antiwater", () -> new com.craisinlord.antarchy.content.fluid.AntiwaterLiquidBlock((FlowingFluid) AntarchyNeoforgeMisc.ANTIWATER.get(), BlockBehaviour.Properties.ofFullCopy(Blocks.WATER).noLootTable())); + public static final DeferredBlock LUMEN_BLOCK = BLOCKS.register("lumen", + () -> new LumenLiquidBlock((FlowingFluid) AntarchyNeoforgeMisc.LUMEN.get(), + BlockBehaviour.Properties.ofFullCopy(Blocks.WATER).lightLevel(state -> 9).noLootTable())); + public static final DeferredBlock LUMEN_FROGLIGHT = BLOCKS.register("lumen_froglight", + () -> new Block(BlockBehaviour.Properties.ofFullCopy(Blocks.OCHRE_FROGLIGHT))); + public static final DeferredBlock ROSEATE_FROGLIGHT = BLOCKS.register("roseate_froglight", + () -> new Block(BlockBehaviour.Properties.ofFullCopy(Blocks.OCHRE_FROGLIGHT))); public static final DeferredBlock RED_ANT_NEST = BLOCKS.register("red_ant_nest", () -> new AntNestBlock( AntarchyNeoforgeEntites.RED_ANT, @@ -291,6 +344,10 @@ public final class AntarchyNeoforgeBlocks { () -> new com.craisinlord.antarchy.content.block.AntimetalScaffoldingBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.SCAFFOLDING))); public static final DeferredBlock CORNEA_STALK = BLOCKS.register("cornea_stalk", () -> new CorneaStalkBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.SWEET_BERRY_BUSH).randomTicks())); + public static final DeferredBlock CORN_CROP = BLOCKS.register("corn_crop", + () -> new CornCropBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.WHEAT).randomTicks().noCollission().noOcclusion())); + public static final DeferredBlock WILD_CORN = BLOCKS.register("wild_corn", + () -> new WildCornBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.WHEAT).noCollission().noOcclusion())); public static final DeferredBlock FALLEN_KING_CROWN = BLOCKS.register("fallen_king_crown", () -> new Block(BlockBehaviour.Properties.of() .strength(0.2F) diff --git a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeCreativeModeTabs.java b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeCreativeModeTabs.java index d67baf59..e3514bee 100644 --- a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeCreativeModeTabs.java +++ b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeCreativeModeTabs.java @@ -2,6 +2,7 @@ package com.craisinlord.antarchy.neoforge.registry; import com.craisinlord.antarchy.Antarchy; import com.craisinlord.antarchy.content.item.ultimate.UltimateGearHelper; +import com.craisinlord.antarchy.content.CreativeTabOrder; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.core.registries.Registries; import net.minecraft.world.item.*; @@ -10,7 +11,6 @@ import net.neoforged.bus.api.IEventBus; import net.neoforged.neoforge.event.BuildCreativeModeTabContentsEvent; import net.neoforged.neoforge.registries.DeferredHolder; import net.neoforged.neoforge.registries.DeferredRegister; -import java.util.Comparator; public class AntarchyNeoforgeCreativeModeTabs { private AntarchyNeoforgeCreativeModeTabs() {} @@ -35,15 +35,17 @@ public class AntarchyNeoforgeCreativeModeTabs { java.util.ArrayList sortedItems = new java.util.ArrayList<>(); for (var holder : AntarchyNeoforgeItems.ITEMS.getEntries()) { Item item = holder.get(); - if (item != Items.AIR) sortedItems.add(item); + if (item != Items.AIR && item != AntarchyNeoforgeItems.GLIMMER_BOTTLE.get()) sortedItems.add(item); } - sortedItems.sort(Comparator - .comparingInt(AntarchyNeoforgeCreativeModeTabs::creativeTabGroup) - .thenComparing(item -> BuiltInRegistries.ITEM.getKey(item).getPath())); + sortedItems.sort(CreativeTabOrder.COMPARATOR); int n = sortedItems.size(); for (int i = Math.max(0, n - 20); i < n; i++) { Item it = sortedItems.get(i); } + for (com.craisinlord.antarchy.content.entity.glimmer.GlimmerVariant variant : com.craisinlord.antarchy.content.entity.glimmer.GlimmerVariant.values()) { + event.accept(com.craisinlord.antarchy.content.item.GlimmerBottleItem.create(variant)); + } + sortedItems.forEach(event::accept); } @@ -79,11 +81,17 @@ public class AntarchyNeoforgeCreativeModeTabs { event.accept(AntarchyNeoforgeItems.BASILISK_SPAWN_EGG.get()); event.accept(AntarchyNeoforgeItems.EMPEROR_SCORPION_SPAWN_EGG.get()); event.accept(AntarchyNeoforgeItems.TORETERROR_SPAWN_EGG.get()); + event.accept(AntarchyNeoforgeItems.DORRIE_SPAWN_EGG.get()); + event.accept(AntarchyNeoforgeItems.OURANWOOD_DEER_SPAWN_EGG.get()); + event.accept(AntarchyNeoforgeItems.GLIMMER_SPAWN_EGG.get()); + event.accept(AntarchyNeoforgeItems.ELKA_SPAWN_EGG.get()); } if (event.getTabKey() == CreativeModeTabs.NATURAL_BLOCKS) { event.accept(AntarchyNeoforgeItems.OURANWOOD_LEAVES_ITEM.get()); event.accept(AntarchyNeoforgeItems.OURANWOOD_ACORN.get()); + event.accept(AntarchyNeoforgeItems.PEACH_LEAVES_ITEM.get()); + event.accept(AntarchyNeoforgeItems.PEACH_SAPLING_ITEM.get()); // event.accept(AntarchyNeoforgeItems.OURANWOOD_VINE_ITEM.get()); event.accept(AntarchyNeoforgeItems.DUPLICATOR_LOG_ITEM.get()); event.accept(AntarchyNeoforgeItems.DUPLICATOR_SAPLING_ITEM.get()); @@ -102,6 +110,9 @@ public class AntarchyNeoforgeCreativeModeTabs { event.accept(AntarchyNeoforgeItems.DEEPSLATE_URANIUM_ORE_ITEM.get()); event.accept(AntarchyNeoforgeItems.TITANIUM_ORE_ITEM.get()); event.accept(AntarchyNeoforgeItems.DEEPSLATE_TITANIUM_ORE_ITEM.get()); + event.accept(AntarchyNeoforgeItems.LUMEN_FROGLIGHT_ITEM.get()); + event.accept(AntarchyNeoforgeItems.ROSEATE_FROGLIGHT_ITEM.get()); + event.accept(AntarchyNeoforgeItems.CORN_SEEDS.get()); } if (event.getTabKey() == CreativeModeTabs.TOOLS_AND_UTILITIES) { @@ -110,6 +121,7 @@ public class AntarchyNeoforgeCreativeModeTabs { event.accept(AntarchyNeoforgeItems.BILE_BUCKET.get()); event.accept(AntarchyNeoforgeItems.ICHOR_BUCKET.get()); event.accept(AntarchyNeoforgeItems.ANTIWATER_BUCKET.get()); + event.accept(AntarchyNeoforgeItems.LUMEN_BUCKET.get()); event.accept(AntarchyNeoforgeItems.CLOUD_BUCKET.get()); event.accept(AntarchyNeoforgeItems.REVERIE_BOTTLE.get()); event.accept(AntarchyNeoforgeItems.ULTIMATE_PICKAXE.get()); @@ -137,6 +149,7 @@ public class AntarchyNeoforgeCreativeModeTabs { event.accept(AntarchyNeoforgeItems.LUCID_EYE.get()); event.accept(AntarchyNeoforgeItems.BLOOD_CRYSTAL_SHARD.get()); event.accept(AntarchyNeoforgeItems.BLOOD_CRYSTAL_APPLE.get()); + event.accept(AntarchyNeoforgeItems.SPIRIT_APPLE.get()); event.accept(AntarchyNeoforgeItems.MANTIS_CLAW.get()); event.accept(AntarchyNeoforgeItems.KING_SCALE.get()); event.accept(AntarchyNeoforgeItems.QUEEN_SCALE.get()); @@ -149,6 +162,12 @@ public class AntarchyNeoforgeCreativeModeTabs { event.accept(AntarchyNeoforgeItems.KRAKEN_TOOTH.get()); event.accept(AntarchyNeoforgeItems.JUMPY_BUG_LEG.get()); event.accept(AntarchyNeoforgeItems.CORNEA_EAR.get()); + event.accept(AntarchyNeoforgeItems.CORN.get()); + event.accept(AntarchyNeoforgeItems.HIGH_FRUCTOSE_CORN_SYRUP.get()); + event.accept(AntarchyNeoforgeItems.PEACH.get()); + event.accept(AntarchyNeoforgeItems.RAW_CORNDOG.get()); + event.accept(AntarchyNeoforgeItems.COOKED_CORNDOG.get()); + event.accept(AntarchyNeoforgeItems.ROOT_BEER.get()); event.accept(AntarchyNeoforgeItems.RAINBOW_SUGAR.get()); event.accept(AntarchyNeoforgeItems.BIG_BERTHA_BLADE.get()); event.accept(AntarchyNeoforgeItems.BIG_BERTHA_HANDLE.get()); @@ -175,6 +194,23 @@ public class AntarchyNeoforgeCreativeModeTabs { event.accept(AntarchyNeoforgeItems.OURANWOOD_BUTTON_ITEM.get()); event.accept(AntarchyNeoforgeItems.OURANWOOD_SIGN_ITEM.get()); event.accept(AntarchyNeoforgeItems.OURANWOOD_HANGING_SIGN_ITEM.get()); + event.accept(AntarchyNeoforgeItems.PEACH_LOG_ITEM.get()); + event.accept(AntarchyNeoforgeItems.PEACH_WOOD_ITEM.get()); + event.accept(AntarchyNeoforgeItems.STRIPPED_PEACH_LOG_ITEM.get()); + event.accept(AntarchyNeoforgeItems.STRIPPED_PEACH_WOOD_ITEM.get()); + event.accept(AntarchyNeoforgeItems.PEACH_PLANKS_ITEM.get()); + event.accept(AntarchyNeoforgeItems.PEACH_STAIRS_ITEM.get()); + event.accept(AntarchyNeoforgeItems.PEACH_SLAB_ITEM.get()); + event.accept(AntarchyNeoforgeItems.PEACH_FENCE_ITEM.get()); + event.accept(AntarchyNeoforgeItems.PEACH_FENCE_GATE_ITEM.get()); + event.accept(AntarchyNeoforgeItems.PEACH_BOAT.get()); + event.accept(AntarchyNeoforgeItems.PEACH_CHEST_BOAT.get()); + event.accept(AntarchyNeoforgeItems.PEACH_DOOR_ITEM.get()); + event.accept(AntarchyNeoforgeItems.PEACH_TRAPDOOR_ITEM.get()); + event.accept(AntarchyNeoforgeItems.PEACH_PRESSURE_PLATE_ITEM.get()); + event.accept(AntarchyNeoforgeItems.PEACH_BUTTON_ITEM.get()); + event.accept(AntarchyNeoforgeItems.PEACH_SIGN_ITEM.get()); + event.accept(AntarchyNeoforgeItems.PEACH_HANGING_SIGN_ITEM.get()); event.accept(AntarchyNeoforgeItems.SHELLSTONE_ITEM.get()); event.accept(AntarchyNeoforgeItems.SHELLSTONE_STAIRS_ITEM.get()); event.accept(AntarchyNeoforgeItems.SHELLSTONE_SLAB_ITEM.get()); @@ -214,9 +250,13 @@ public class AntarchyNeoforgeCreativeModeTabs { event.accept(AntarchyNeoforgeItems.ANTIMETAL_SCAFFOLDING_ITEM.get()); event.accept(AntarchyNeoforgeItems.UMBRAL_MOSS_BLOCK_ITEM.get()); event.accept(AntarchyNeoforgeItems.UMBRAL_MOSS_CARPET_ITEM.get()); + event.accept(AntarchyNeoforgeItems.BLUSH_MOSS_BLOCK_ITEM.get()); + event.accept(AntarchyNeoforgeItems.BLUSH_MOSS_CARPET_ITEM.get()); event.accept(AntarchyNeoforgeItems.DREAM_TORCH_ITEM.get()); event.accept(AntarchyNeoforgeItems.DREAM_LANTERN_ITEM.get()); event.accept(AntarchyNeoforgeItems.DREAM_CAMPFIRE_ITEM.get()); + event.accept(AntarchyNeoforgeItems.LUMEN_FROGLIGHT_ITEM.get()); + event.accept(AntarchyNeoforgeItems.ROSEATE_FROGLIGHT_ITEM.get()); event.accept(AntarchyNeoforgeItems.DREAM_SAND_ITEM.get()); event.accept(AntarchyNeoforgeItems.DREAM_SANDSTONE_ITEM.get()); event.accept(AntarchyNeoforgeItems.CHISELED_DREAM_SANDSTONE_ITEM.get()); @@ -308,139 +348,10 @@ public class AntarchyNeoforgeCreativeModeTabs { } private static int creativeTabGroup(net.minecraft.world.item.Item item) { - String path = BuiltInRegistries.ITEM.getKey(item).getPath(); - return switch (path) { - // 0 - Ouranwood blocks - case "ouranwood_log", "ouranwood_wood", "mossy_ouranwood_log", "mossy_ouranwood_wood", - "stripped_ouranwood_log", "stripped_ouranwood_wood", "duplicator_log", - "ouranwood_planks", "ouranwood_stairs", "ouranwood_slab", - "ouranwood_fence", "ouranwood_fence_gate", - "ouranwood_door", "ouranwood_trapdoor", - "ouranwood_pressure_plate", "ouranwood_button", - "ouranwood_sign", "ouranwood_hanging_sign", - "ouranwood_boat", "ouranwood_chest_boat" -> 0; + return CreativeTabOrder.group(item); + } - // 1 - Nyxite blocks - case "nyxite", "polished_nyxite", "chiseled_nyxite", "nyxite_bricks", - "nyxite_stairs", "nyxite_slab", "nyxite_wall", - "polished_nyxite_stairs", "polished_nyxite_slab", "polished_nyxite_wall", - "nyxite_brick_stairs", "nyxite_brick_slab", "nyxite_brick_wall", - "pale_nyxite", "nyxite_spike", "potent_nyxite" -> 1; - - // 2 - Shellstone blocks - case "shellstone", "polished_shellstone", "shellstone_bricks", "chiseled_shellstone", - "mossy_shellstone_bricks", "cracked_shellstone_bricks", - "shellstone_stairs", "shellstone_slab", "shellstone_wall", - "polished_shellstone_stairs", "polished_shellstone_slab", "polished_shellstone_wall", - "shellstone_brick_stairs", "shellstone_brick_slab", "shellstone_brick_wall", - "mossy_shellstone_brick_stairs", "mossy_shellstone_brick_slab", "mossy_shellstone_brick_wall" -> 2; - - // 3 - Antimetal blocks - case "antimetal", "polished_antimetal" -> 3; - - // 4 - Dream sand and blocks - case "dream_sand", "dream_sandstone", "chiseled_dream_sandstone", - "cut_dream_sandstone", "smooth_dream_sandstone", - "dream_sandstone_stairs", "dream_sandstone_slab", "dream_sandstone_wall", - "smooth_dream_sandstone_stairs", "smooth_dream_sandstone_slab", - "cut_dream_sandstone_slab" -> 4; - - // 5 - Umbral moss - case "umbral_moss_block", "umbral_moss_carpet" -> 4; - - // 6 - All ores + metal storage/decorative blocks - case "uranium_ore", "deepslate_uranium_ore", "titanium_ore", "deepslate_titanium_ore", - "uranium_block", "titanium_block", - "cut_uranium", "cut_titanium", "cut_uranium_slab", "cut_titanium_slab", - "cut_uranium_stairs", "cut_titanium_stairs", - "chiseled_uranium", "chiseled_titanium", - "uranium_door", "titanium_door", "uranium_trapdoor", "titanium_trapdoor", - "uranium_bars", "titanium_bars", "uranium_bulb", "titanium_bulb" -> 6; - - // 7 - Raw ores - case "raw_uranium", "raw_titanium", "raw_uranium_scrap", "raw_titanium_scrap", - "raw_uranium_block", "raw_titanium_block" -> 7; - - // 8 - Blood crystal blocks (not the shard ingredient) - case "blood_crystal_block", "small_blood_crystal_bud", "medium_blood_crystal_bud", - "large_blood_crystal_bud", "budding_blood_crystal", "blood_crystal_cluster", - "myrmite", "broodstone", "chiten_block", "chiten_spike", "amber_moss_block", "amber_moss_carpet" -> 8; - - // 9 - Ouranwood leaves - case "ouranwood_leaves" -> 9; - - // 10 - Saplings / seeds - case "duplicator_sapling", "ouranwood_acorn" -> 10; - - // 11 - Plants and flowers - case "orange_milkweed", "pink_milkweed", "hushweed", "amber_lichen", "creepvine", - "triffid_goo_block", "wasp_nest", - "red_ant_nest", "brown_ant_nest", "rainbow_ant_nest", "termite_nest" -> 11; - - // 12 - Dream lighting - case "dream_torch", "dream_lantern", "dream_campfire" -> 12; - - // 13 - Antimetal scaffolding - case "antimetal_scaffolding" -> 13; - - // 14 - Infested blocks - case "infested_rooted_dirt", "infested_coarse_dirt", "bed_bug_egg", - "creeping_horror_egg", "lurking_terror_egg" -> 14; - - // 15 - Tools - case "ultimate_pickaxe", "ultimate_axe", "ultimate_shovel", "ultimate_hoe", - "duct_tape", "diamond_minecart", "gravity_sculk_sensor" -> 15; - - // 16 - Liquid buckets - case "bile_bucket", "ichor_bucket", "antiwater_bucket", "cloud_bucket" -> 16; - - // 17 - Misc wearables / gadgets - case "moggles", "brutalfly_elytra", "fallen_king_crown", "jumpy_boots" -> 17; - - // 18 - Weapons - case "battle_axe", "basilisk_dagger", "squidzooka", "shrink_ray", "growth_ray", - "gravity_gun", "water_cannon", "nightmare_sword", "lucid_pearl", "scorpion_whip", "blood_crystal_katana", - "big_bertha", "big_bertha_blade", "big_bertha_handle", "big_bertha_hilt", - "ultimate_sword", "ultimate_mace" -> 18; - - // 19 - Armor sets - case "primordial_helmet", "primordial_chestplate", - "primordial_leggings", "primordial_boots", - "blood_crystal_helmet", "blood_crystal_chestplate", - "blood_crystal_leggings", "blood_crystal_boots", - "nightmare_helmet", "nightmare_chestplate", - "nightmare_leggings", "nightmare_boots", - "ultimate_helmet", "ultimate_chestplate", - "ultimate_leggings", "ultimate_boots" -> 19; - - // 20 - Ranged weapons - case "ultimate_bow", "ultimate_crossbow" -> 20; - - // 21 - Foods - case "cloud_shark_fin_soup", "mud_pie", "rainbow_sugar", - "blood_crystal_apple" -> 21; - - // 22 - Crafting ingredients - case "blood_crystal_shard", "cloud_shark_fin", "basilisk_fang", "kraken_tooth", - "emperor_scorpion_stinger", "nightmare_scale", "molevore_nose", - "moleworm", "uranium_nugget", "titanium_nugget", - "uranium_ingot", "titanium_ingot", "lucid_eye", - "mantis_claw", "jumpy_bug_leg", "brutalfly_wing", "cornea_ear", - "primordial_scute", "triffid_goo", "vortex_eye", - "king_scale", "queen_scale", "chiten", "stink_bug" -> 22; - - // 23 - Arrows (reserved for future arrow types) - - // 24 - Potions - case "reverie_bottle" -> 24; - - // 25 - Spawn eggs - default -> { - if (!path.endsWith("_spawn_egg")) { - org.slf4j.LoggerFactory.getLogger("Antarchy/CreativeTab").warn("Unmatched creative tab item: '{}'", path); - } - yield path.endsWith("_spawn_egg") ? 25 : 99; - } - }; + private static int creativeTabSubOrder(net.minecraft.world.item.Item item) { + return CreativeTabOrder.subOrder(item); } } diff --git a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeEntites.java b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeEntites.java index 372f0a31..0fbef14c 100644 --- a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeEntites.java +++ b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeEntites.java @@ -13,7 +13,9 @@ import com.craisinlord.antarchy.content.entity.DiamondMinecartEntity; import com.craisinlord.antarchy.content.entity.DrTrayaurusEntity; import com.craisinlord.antarchy.content.entity.EasterBunnyEntity; import com.craisinlord.antarchy.content.entity.EmperorScorpionEntity; -import com.craisinlord.antarchy.content.entity.GlimmerEntity; +import com.craisinlord.antarchy.content.entity.ElkaEntity; +import com.craisinlord.antarchy.content.entity.OuranwoodDeerEntity; +import com.craisinlord.antarchy.content.entity.glimmer.GlimmerEntity; import com.craisinlord.antarchy.content.entity.HushProjectileEntity; import com.craisinlord.antarchy.content.entity.HerculesBeetleEntity; import com.craisinlord.antarchy.content.entity.JumpyBugEntity; @@ -26,6 +28,8 @@ import com.craisinlord.antarchy.content.entity.MolevoreEntity; import com.craisinlord.antarchy.content.entity.MolewormEntity; import com.craisinlord.antarchy.content.entity.OuranwoodBoatEntity; import com.craisinlord.antarchy.content.entity.OuranwoodChestBoatEntity; +import com.craisinlord.antarchy.content.entity.PeachBoatEntity; +import com.craisinlord.antarchy.content.entity.PeachChestBoatEntity; import com.craisinlord.antarchy.content.entity.ReverieEntity; import com.craisinlord.antarchy.content.entity.ScorpionEntity; import com.craisinlord.antarchy.content.entity.SizeRayProjectileEntity; @@ -115,6 +119,18 @@ public final class AntarchyNeoforgeEntites { .clientTrackingRange(10) .updateInterval(10) .build("ouranwood_chest_boat")); + public static final DeferredHolder, EntityType> PEACH_BOAT_ENTITY = ENTITY_TYPES.register("peach_boat", + () -> EntityType.Builder.of(PeachBoatEntity::new, MobCategory.MISC) + .sized(1.375F, 0.5625F) + .clientTrackingRange(10) + .updateInterval(10) + .build("peach_boat")); + public static final DeferredHolder, EntityType> PEACH_CHEST_BOAT_ENTITY = ENTITY_TYPES.register("peach_chest_boat", + () -> EntityType.Builder.of(PeachChestBoatEntity::new, MobCategory.MISC) + .sized(1.375F, 0.5625F) + .clientTrackingRange(10) + .updateInterval(10) + .build("peach_chest_boat")); public static final DeferredHolder, EntityType> MOLEVORE = ENTITY_TYPES.register("molevore", () -> EntityType.Builder.of(MolevoreEntity::new, MobCategory.MONSTER) .sized(1.95F, 1.1F) @@ -283,11 +299,26 @@ public final class AntarchyNeoforgeEntites { .sized(1.0F, 1.2F) .clientTrackingRange(8) .build("cheep")); - // public static final DeferredHolder, EntityType> GLIMMER = ENTITY_TYPES.register("glimmer", - // () -> EntityType.Builder.of(GlimmerEntity::new, MobCategory.CREATURE) - // .sized(0.9F, 1.4F) - // .clientTrackingRange(8) - // .build("glimmer")); + public static final DeferredHolder, EntityType> DORRIE = ENTITY_TYPES.register("dorrie", + () -> EntityType.Builder.of(DorrieEntity::new, MobCategory.CREATURE) + .sized(1.6F, 1.4F) + .clientTrackingRange(10) + .build("dorrie")); + public static final DeferredHolder, EntityType> OURANWOOD_DEER = ENTITY_TYPES.register("ouranwood_deer", + () -> EntityType.Builder.of(OuranwoodDeerEntity::new, MobCategory.CREATURE) + .sized(0.9F, 1.4F) + .clientTrackingRange(8) + .build("ouranwood_deer")); + public static final DeferredHolder, EntityType> GLIMMER = ENTITY_TYPES.register("glimmer", + () -> EntityType.Builder.of(GlimmerEntity::new, MobCategory.CREATURE) + .sized(0.9F, 1.4F) + .clientTrackingRange(8) + .build("glimmer")); + public static final DeferredHolder, EntityType> ELKA = ENTITY_TYPES.register("elka", + () -> EntityType.Builder.of(ElkaEntity::new, MobCategory.CREATURE) + .sized(2.2F, 3.5F) + .clientTrackingRange(10) + .build("elka")); public static final DeferredHolder, EntityType> UPWARD_FALLING_BLOCK = ENTITY_TYPES.register("upward_falling_block", () -> EntityType.Builder.of( UpwardFallingBlockEntity::new, MobCategory.MISC) diff --git a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeEntityAttributes.java b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeEntityAttributes.java index 08e38c1b..0fc3ca9f 100644 --- a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeEntityAttributes.java +++ b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeEntityAttributes.java @@ -73,7 +73,10 @@ public class AntarchyNeoforgeEntityAttributes { event.put(AntarchyNeoforgeEntites.MOLEWORM.get(), MolewormEntity.createAttributes().build()); event.put(AntarchyNeoforgeEntites.MOLEVORE.get(), MolevoreEntity.createAttributes().build()); event.put(AntarchyNeoforgeEntites.CHEEP.get(), com.craisinlord.antarchy.content.entity.CheepEntity.createAttributes().build()); - // event.put(AntarchyNeoforgeEntites.GLIMMER.get(), com.craisinlord.antarchy.content.entity.GlimmerEntity.createAttributes().build()); + event.put(AntarchyNeoforgeEntites.DORRIE.get(), com.craisinlord.antarchy.content.entity.DorrieEntity.createAttributes().build()); + event.put(AntarchyNeoforgeEntites.OURANWOOD_DEER.get(), com.craisinlord.antarchy.content.entity.OuranwoodDeerEntity.createAttributes().build()); + event.put(AntarchyNeoforgeEntites.GLIMMER.get(), com.craisinlord.antarchy.content.entity.glimmer.GlimmerEntity.createAttributes().build()); + event.put(AntarchyNeoforgeEntites.ELKA.get(), ElkaEntity.createAttributes().build()); } private static AttributeSupplier.Builder buildAntAttributes(double health, double speed, double attackDamage) { diff --git a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeItems.java b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeItems.java index d253f105..7647b884 100644 --- a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeItems.java +++ b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeItems.java @@ -158,6 +158,21 @@ public final class AntarchyNeoforgeItems { public static final DeferredItem OURANWOOD_BUTTON_ITEM = ITEMS.registerSimpleBlockItem(AntarchyNeoforgeBlocks.OURANWOOD_BUTTON); public static final DeferredItem OURANWOOD_LEAVES_ITEM = ITEMS.registerSimpleBlockItem(AntarchyNeoforgeBlocks.OURANWOOD_LEAVES); public static final DeferredItem OURANWOOD_ACORN = ITEMS.registerSimpleBlockItem(AntarchyNeoforgeBlocks.OURANWOOD_ACORN_BLOCK); + public static final DeferredItem PEACH_LOG_ITEM = ITEMS.registerSimpleBlockItem(AntarchyNeoforgeBlocks.PEACH_LOG); + public static final DeferredItem PEACH_WOOD_ITEM = ITEMS.registerSimpleBlockItem(AntarchyNeoforgeBlocks.PEACH_WOOD); + public static final DeferredItem STRIPPED_PEACH_LOG_ITEM = ITEMS.registerSimpleBlockItem(AntarchyNeoforgeBlocks.STRIPPED_PEACH_LOG); + public static final DeferredItem STRIPPED_PEACH_WOOD_ITEM = ITEMS.registerSimpleBlockItem(AntarchyNeoforgeBlocks.STRIPPED_PEACH_WOOD); + public static final DeferredItem PEACH_PLANKS_ITEM = ITEMS.registerSimpleBlockItem(AntarchyNeoforgeBlocks.PEACH_PLANKS); + public static final DeferredItem PEACH_STAIRS_ITEM = ITEMS.registerSimpleBlockItem(AntarchyNeoforgeBlocks.PEACH_STAIRS); + public static final DeferredItem PEACH_SLAB_ITEM = ITEMS.registerSimpleBlockItem(AntarchyNeoforgeBlocks.PEACH_SLAB); + public static final DeferredItem PEACH_FENCE_ITEM = ITEMS.registerSimpleBlockItem(AntarchyNeoforgeBlocks.PEACH_FENCE); + public static final DeferredItem PEACH_FENCE_GATE_ITEM = ITEMS.registerSimpleBlockItem(AntarchyNeoforgeBlocks.PEACH_FENCE_GATE); + public static final DeferredItem PEACH_DOOR_ITEM = ITEMS.registerSimpleBlockItem(AntarchyNeoforgeBlocks.PEACH_DOOR); + public static final DeferredItem PEACH_TRAPDOOR_ITEM = ITEMS.registerSimpleBlockItem(AntarchyNeoforgeBlocks.PEACH_TRAPDOOR); + public static final DeferredItem PEACH_PRESSURE_PLATE_ITEM = ITEMS.registerSimpleBlockItem(AntarchyNeoforgeBlocks.PEACH_PRESSURE_PLATE); + public static final DeferredItem PEACH_BUTTON_ITEM = ITEMS.registerSimpleBlockItem(AntarchyNeoforgeBlocks.PEACH_BUTTON); + public static final DeferredItem PEACH_LEAVES_ITEM = ITEMS.registerSimpleBlockItem(AntarchyNeoforgeBlocks.PEACH_LEAVES); + public static final DeferredItem PEACH_SAPLING_ITEM = ITEMS.registerSimpleBlockItem(AntarchyNeoforgeBlocks.PEACH_SAPLING); // public static final DeferredItem OURANWOOD_VINE_ITEM = ITEMS.registerSimpleBlockItem(AntarchyNeoforgeBlocks.OURANWOOD_VINE); public static final DeferredItem ORANGE_MILKWEED_ITEM = ITEMS.registerSimpleBlockItem(AntarchyNeoforgeBlocks.ORANGE_MILKWEED); public static final DeferredItem PINK_MILKWEED_ITEM = ITEMS.registerSimpleBlockItem(AntarchyNeoforgeBlocks.PINK_MILKWEED); @@ -169,6 +184,14 @@ public final class AntarchyNeoforgeItems { () -> new OuranwoodBoatOnlyItem(AntarchyNeoforgeEntites.OURANWOOD_BOAT_ENTITY.get(), new Item.Properties().stacksTo(1))); public static final DeferredItem OURANWOOD_CHEST_BOAT = ITEMS.register("ouranwood_chest_boat", () -> new OuranwoodChestBoatItem(AntarchyNeoforgeEntites.OURANWOOD_CHEST_BOAT_ENTITY.get(), new Item.Properties().stacksTo(1))); + public static final DeferredItem PEACH_SIGN_ITEM = ITEMS.register("peach_sign", + () -> new net.minecraft.world.item.SignItem(new Item.Properties().stacksTo(16), AntarchyNeoforgeBlocks.PEACH_SIGN.get(), AntarchyNeoforgeBlocks.PEACH_WALL_SIGN.get())); + public static final DeferredItem PEACH_HANGING_SIGN_ITEM = ITEMS.register("peach_hanging_sign", + () -> new net.minecraft.world.item.HangingSignItem(AntarchyNeoforgeBlocks.PEACH_HANGING_SIGN.get(), AntarchyNeoforgeBlocks.PEACH_WALL_HANGING_SIGN.get(), new Item.Properties().stacksTo(16))); + public static final DeferredItem PEACH_BOAT = ITEMS.register("peach_boat", + () -> new PeachBoatOnlyItem(AntarchyNeoforgeEntites.PEACH_BOAT_ENTITY.get(), new Item.Properties().stacksTo(1))); + public static final DeferredItem PEACH_CHEST_BOAT = ITEMS.register("peach_chest_boat", + () -> new PeachChestBoatItem(AntarchyNeoforgeEntites.PEACH_CHEST_BOAT_ENTITY.get(), new Item.Properties().stacksTo(1))); public static final DeferredItem DUPLICATOR_SAPLING_ITEM = ITEMS.registerSimpleBlockItem(AntarchyNeoforgeBlocks.DUPLICATOR_SAPLING); public static final DeferredItem RED_ANT_NEST_ITEM = ITEMS.registerSimpleBlockItem(AntarchyNeoforgeBlocks.RED_ANT_NEST); public static final DeferredItem BROWN_ANT_NEST_ITEM = ITEMS.registerSimpleBlockItem(AntarchyNeoforgeBlocks.BROWN_ANT_NEST); @@ -265,10 +288,14 @@ public final class AntarchyNeoforgeItems { public static final DeferredItem POTENT_NYXITE_ITEM = ITEMS.registerSimpleBlockItem(AntarchyNeoforgeBlocks.POTENT_NYXITE); public static final DeferredItem UMBRAL_MOSS_BLOCK_ITEM = ITEMS.registerSimpleBlockItem(AntarchyNeoforgeBlocks.UMBRAL_MOSS_BLOCK); public static final DeferredItem UMBRAL_MOSS_CARPET_ITEM = ITEMS.registerSimpleBlockItem(AntarchyNeoforgeBlocks.UMBRAL_MOSS_CARPET); + public static final DeferredItem BLUSH_MOSS_BLOCK_ITEM = ITEMS.registerSimpleBlockItem(AntarchyNeoforgeBlocks.BLUSH_MOSS_BLOCK); + public static final DeferredItem BLUSH_MOSS_CARPET_ITEM = ITEMS.registerSimpleBlockItem(AntarchyNeoforgeBlocks.BLUSH_MOSS_CARPET); public static final DeferredItem DREAM_TORCH_ITEM = ITEMS.register("dream_torch", () -> new StandingAndWallBlockItem(AntarchyNeoforgeBlocks.DREAM_TORCH.get(), AntarchyNeoforgeBlocks.DREAM_WALL_TORCH.get(), new Item.Properties(), net.minecraft.core.Direction.UP)); public static final DeferredItem DREAM_LANTERN_ITEM = ITEMS.registerSimpleBlockItem(AntarchyNeoforgeBlocks.DREAM_LANTERN); public static final DeferredItem DREAM_CAMPFIRE_ITEM = ITEMS.registerSimpleBlockItem(AntarchyNeoforgeBlocks.DREAM_CAMPFIRE); + public static final DeferredItem LUMEN_FROGLIGHT_ITEM = ITEMS.registerSimpleBlockItem(AntarchyNeoforgeBlocks.LUMEN_FROGLIGHT); + public static final DeferredItem ROSEATE_FROGLIGHT_ITEM = ITEMS.registerSimpleBlockItem(AntarchyNeoforgeBlocks.ROSEATE_FROGLIGHT); public static final DeferredItem BED_BUG_EGG_ITEM = ITEMS.registerSimpleBlockItem(AntarchyNeoforgeBlocks.BED_BUG_EGG); public static final DeferredItem WASP_NEST_ITEM = ITEMS.registerSimpleBlockItem(AntarchyNeoforgeBlocks.WASP_NEST); public static final DeferredItem HUSHWEED_ITEM = ITEMS.registerSimpleBlockItem(AntarchyNeoforgeBlocks.HUSHWEED); @@ -278,6 +305,8 @@ public final class AntarchyNeoforgeItems { () -> new BucketItem(AntarchyNeoforgeMisc.ICHOR.get(), new Item.Properties().craftRemainder(Items.BUCKET).stacksTo(1))); public static final DeferredItem ANTIWATER_BUCKET = ITEMS.register("antiwater_bucket", () -> new BucketItem(AntarchyNeoforgeMisc.ANTIWATER.get(), new Item.Properties().craftRemainder(Items.BUCKET).stacksTo(1))); + public static final DeferredItem LUMEN_BUCKET = ITEMS.register("lumen_bucket", + () -> new BucketItem(AntarchyNeoforgeMisc.LUMEN.get(), new Item.Properties().craftRemainder(Items.BUCKET).stacksTo(1))); public static final DeferredItem CLOUD_BUCKET = ITEMS.register("cloud_bucket", () -> new com.craisinlord.antarchy.content.item.CloudBucketItem(AntarchyNeoforgeBlocks.CLOUD_BLOCK.get(), new Item.Properties().craftRemainder(Items.BUCKET))); public static final DeferredItem BLOOD_CRYSTAL_SHARD = ITEMS.register("blood_crystal_shard", @@ -327,6 +356,59 @@ public final class AntarchyNeoforgeItems { .nutrition(2) .saturationModifier(0.4F) .build()))); + public static final DeferredItem CORN = ITEMS.register("corn", + () -> new Item(new Item.Properties() + .food(new FoodProperties.Builder() + .nutrition(3) + .saturationModifier(0.6F) + .build()))); + public static final DeferredItem CORN_SEEDS = ITEMS.register("corn_seeds", + () -> new ItemNameBlockItem(AntarchyNeoforgeBlocks.CORN_CROP.get(), new Item.Properties())); + public static final DeferredItem RAW_VENISON = ITEMS.register("raw_venison", + () -> new Item(new Item.Properties() + .food(new FoodProperties.Builder() + .nutrition(2) + .saturationModifier(0.3F) + .build()))); + public static final DeferredItem COOKED_VENISON = ITEMS.register("cooked_venison", + () -> new Item(new Item.Properties() + .food(new FoodProperties.Builder() + .nutrition(6) + .saturationModifier(0.8F) + .build()))); + public static final DeferredItem PEACH = ITEMS.register("peach", + () -> new PeachItem()); + public static final DeferredItem RAW_CORNDOG = ITEMS.register("raw_corndog", + () -> new Item(new Item.Properties() + .stacksTo(64) + .food(new FoodProperties.Builder() + .nutrition(8) + .saturationModifier(0.7F) + .build()))); + public static final DeferredItem COOKED_CORNDOG = ITEMS.register("cooked_corndog", + () -> new Item(new Item.Properties() + .stacksTo(64) + .food(new FoodProperties.Builder() + .nutrition(14) + .saturationModifier(1.1F) + .build()))); + public static final DeferredItem HIGH_FRUCTOSE_CORN_SYRUP = ITEMS.register("high_fructose_corn_syrup", + () -> new HighFructoseCornSyrupItem(new Item.Properties() + .stacksTo(16) + .food(new FoodProperties.Builder() + .nutrition(0) + .saturationModifier(0.0F) + .alwaysEdible() + .build()))); + public static final DeferredItem ROOT_BEER = ITEMS.register("root_beer", + () -> new RootBeerItem(new Item.Properties() + .stacksTo(16) + .food(new FoodProperties.Builder() + .nutrition(4) + .saturationModifier(0.4F) + .effect(() -> new MobEffectInstance(MobEffects.REGENERATION, 100, 0), 1.0F) + .alwaysEdible() + .build()))); public static final DeferredItem TRIFFID_GOO = ITEMS.registerSimpleItem("triffid_goo", new Item.Properties().rarity(Rarity.UNCOMMON)); public static final DeferredItem VORTEX_EYE = ITEMS.register("vortex_eye", @@ -457,6 +539,8 @@ public final class AntarchyNeoforgeItems { )); public static final DeferredItem GRAVITY_GUN = ITEMS.register("gravity_gun", () -> new GravityGunItem(new Item.Properties().stacksTo(1).durability(512).rarity(Rarity.RARE).fireResistant())); + public static final DeferredItem MINERS_DREAM = ITEMS.register("miners_dream", + () -> new MinersDreamItem(new Item.Properties().stacksTo(1).rarity(Rarity.RARE))); public static final DeferredItem SQUIDZOOKA = ITEMS.register("squidzooka", () -> new SquidzookaItem(new Item.Properties().stacksTo(1).durability(384).rarity(Rarity.RARE))); public static final DeferredItem BATTLE_AXE = ITEMS.register("battle_axe", @@ -480,8 +564,22 @@ public final class AntarchyNeoforgeItems { // Spawn eggs public static final DeferredItem EASTER_BUNNY_SPAWN_EGG = ITEMS.register("easter_bunny_spawn_egg", () -> new DeferredSpawnEggItem(AntarchyNeoforgeEntites.EASTER_BUNNY, 0xFFF2B2, 0xFF85B5, new Item.Properties())); - // public static final DeferredItem GLIMMER_SPAWN_EGG = ITEMS.register("glimmer_spawn_egg", - // () -> new DeferredSpawnEggItem(AntarchyNeoforgeEntites.GLIMMER, 0xBEEFFF, 0x6FD8FF, new Item.Properties())); + public static final DeferredItem DORRIE_SPAWN_EGG = ITEMS.register("dorrie_spawn_egg", + () -> new DeferredSpawnEggItem(AntarchyNeoforgeEntites.DORRIE, 0x6F8CFF, 0xD2F2FF, new Item.Properties())); + public static final DeferredItem OURANWOOD_DEER_SPAWN_EGG = ITEMS.register("ouranwood_deer_spawn_egg", + () -> new DeferredSpawnEggItem(AntarchyNeoforgeEntites.OURANWOOD_DEER, 0x8A6D4B, 0xE8D9B5, new Item.Properties())); + public static final DeferredItem GLIMMER_SPAWN_EGG = ITEMS.register("glimmer_spawn_egg", + () -> new DeferredSpawnEggItem(AntarchyNeoforgeEntites.GLIMMER, 0x7DFFFF, 0x2AC7D0, new Item.Properties())); + public static final DeferredItem ELKA_SPAWN_EGG = ITEMS.register("elka_spawn_egg", + () -> new DeferredSpawnEggItem(AntarchyNeoforgeEntites.ELKA, 0x6B2FA0, 0xFFFFFF, new Item.Properties())); + public static final DeferredItem SPIRIT_APPLE = ITEMS.register("spirit_apple", + () -> new com.craisinlord.antarchy.content.item.SpiritAppleItem(new Item.Properties() + .food(new FoodProperties.Builder() + .nutrition(4) + .saturationModifier(0.3F) + .build()))); + public static final DeferredItem GLIMMER_BOTTLE = ITEMS.register("glimmer_bottle", + com.craisinlord.antarchy.content.item.GlimmerBottleItem::new); public static final DeferredItem FLYING_SQUIRREL_SPAWN_EGG = ITEMS.register("flying_squirrel_spawn_egg", () -> new DeferredSpawnEggItem(AntarchyNeoforgeEntites.FLYING_SQUIRREL, 0x7D6649, 0xDCC59C, new Item.Properties())); public static final DeferredItem CATERPILLAR_SPAWN_EGG = ITEMS.register("caterpillar_spawn_egg", diff --git a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeMisc.java b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeMisc.java index e067e82d..1cc6e0db 100644 --- a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeMisc.java +++ b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeMisc.java @@ -4,7 +4,6 @@ import com.craisinlord.antarchy.Antarchy; import com.craisinlord.antarchy.content.client.particle.InvertedGeyserBaseParticleOptions; import com.craisinlord.antarchy.content.client.particle.InvertedGeyserParticleOptions; import com.craisinlord.antarchy.content.effect.DreadMobEffect; -import com.craisinlord.antarchy.content.effect.GlimmersGraceMobEffect; import com.craisinlord.antarchy.content.effect.GrowthMobEffect; import com.craisinlord.antarchy.content.effect.InvertedMobEffect; import com.craisinlord.antarchy.content.effect.ParalyzedMobEffect; @@ -14,6 +13,8 @@ import com.craisinlord.antarchy.content.worldgen.ants.BrownAntNestFeature; import com.craisinlord.antarchy.content.worldgen.ants.RainbowAntNestFeature; import com.craisinlord.antarchy.content.worldgen.ants.RedAntNestFeature; import com.craisinlord.antarchy.content.worldgen.elythia.*; +import com.craisinlord.antarchy.neoforge.worldgen.CornPatchFeature; +import com.craisinlord.antarchy.neoforge.worldgen.LumenLilyPadFeature; import com.craisinlord.antarchy.content.worldgen.thoraxis.*; import com.craisinlord.antarchy.neoforge.content.fluid.AntiwaterFluid; import com.craisinlord.antarchy.neoforge.content.fluid.AntiwaterFluidType; @@ -23,10 +24,12 @@ import net.minecraft.core.particles.ParticleType; import net.minecraft.core.particles.SimpleParticleType; import net.minecraft.core.registries.Registries; import net.minecraft.network.codec.StreamCodec; +import net.minecraft.world.flag.FeatureFlags; import net.minecraft.world.effect.MobEffect; import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.effect.MobEffects; import net.minecraft.world.entity.ai.attributes.Attribute; +import net.minecraft.world.inventory.MenuType; import net.minecraft.world.item.alchemy.Potion; import net.minecraft.world.level.biome.BiomeSource; import net.minecraft.world.level.levelgen.DensityFunction; @@ -56,6 +59,26 @@ public final class AntarchyNeoforgeMisc { private static final DeferredRegister> DENSITY_FUNCTION_TYPES = DeferredRegister.create(Registries.DENSITY_FUNCTION_TYPE, Antarchy.MODID); private static final DeferredRegister> ENTITY_SUB_PREDICATES = DeferredRegister.create(Registries.ENTITY_SUB_PREDICATE_TYPE, Antarchy.MODID); private static final DeferredRegister ATTRIBUTES = DeferredRegister.create(Registries.ATTRIBUTE, Antarchy.MODID); + private static final DeferredRegister> MENU_TYPES = DeferredRegister.create(Registries.MENU, Antarchy.MODID); + private static final DeferredRegister> DATA_COMPONENT_TYPES = + DeferredRegister.create(Registries.DATA_COMPONENT_TYPE, Antarchy.MODID); + private static final DeferredRegister> RECIPE_SERIALIZERS = + DeferredRegister.create(Registries.RECIPE_SERIALIZER, Antarchy.MODID); + + public static final DeferredHolder, net.minecraft.core.component.DataComponentType> GLIMMER_VARIANT = + DATA_COMPONENT_TYPES.register("glimmer_variant", + () -> net.minecraft.core.component.DataComponentType.builder() + .persistent(com.craisinlord.antarchy.content.entity.glimmer.GlimmerVariant.CODEC) + .networkSynchronized(com.craisinlord.antarchy.content.entity.glimmer.GlimmerVariant.STREAM_CODEC) + .build()); + public static final DeferredHolder, net.minecraft.core.component.DataComponentType> AMERICAN = + DATA_COMPONENT_TYPES.register("american", + () -> net.minecraft.core.component.DataComponentType.builder() + .persistent(net.minecraft.util.Unit.CODEC) + .networkSynchronized(net.minecraft.network.codec.StreamCodec.unit(net.minecraft.util.Unit.INSTANCE)) + .build()); + public static final DeferredHolder, net.minecraft.world.item.crafting.RecipeSerializer> AMERICANIZE_SERIALIZER = + RECIPE_SERIALIZERS.register("americanize", () -> com.craisinlord.antarchy.content.AmericanizeRecipe.SERIALIZER); public static final DeferredHolder DOUBLE_DAMAGE_CHANCE = ATTRIBUTES.register( "double_damage_chance", @@ -65,6 +88,10 @@ public final class AntarchyNeoforgeMisc { "bloodglass_max_hearts", () -> new net.minecraft.world.entity.ai.attributes.RangedAttribute("attribute.antarchy.bloodglass_max_hearts", 0.0, 0.0, 8.0).setSyncable(true) ); + public static final DeferredHolder, MenuType> DORRIE_INVENTORY_MENU = MENU_TYPES.register( + "dorrie_inventory", + () -> new MenuType<>(com.craisinlord.antarchy.content.menu.DorrieInventoryMenu::new, FeatureFlags.DEFAULT_FLAGS) + ); // Mob effects public static final DeferredHolder DREAD = MOB_EFFECTS.register("dread", DreadMobEffect::new); @@ -74,7 +101,6 @@ public final class AntarchyNeoforgeMisc { public static final DeferredHolder BLOODGLASS_WARD = MOB_EFFECTS.register("bloodglass_ward", com.craisinlord.antarchy.content.effect.BloodglassWardEffect::new); public static final DeferredHolder SHRINKING_EFFECT = MOB_EFFECTS.register("shrinking", ShrinkMobEffect::new); public static final DeferredHolder GROWTH_EFFECT = MOB_EFFECTS.register("growth", GrowthMobEffect::new); - // public static final DeferredHolder GLIMMERS_GRACE = MOB_EFFECTS.register("glimmers_grace", GlimmersGraceMobEffect::new); // Potions public static final DeferredHolder INVERSION = POTIONS.register("inversion", @@ -149,6 +175,10 @@ public final class AntarchyNeoforgeMisc { () -> new AntiwaterFluid.Source(antiwaterProperties())); public static final DeferredHolder FLOWING_ANTIWATER = FLUIDS.register("flowing_antiwater", () -> new AntiwaterFluid.Flowing(antiwaterProperties())); + public static final DeferredHolder LUMEN = FLUIDS.register("lumen", + () -> new BaseFlowingFluid.Source(lumenProperties())); + public static final DeferredHolder FLOWING_LUMEN = FLUIDS.register("flowing_lumen", + () -> new BaseFlowingFluid.Flowing(lumenProperties())); // Particle types public static final DeferredHolder, SimpleParticleType> DREAM_FIRE_FLAME = PARTICLE_TYPES.register("dream_fire_flame", @@ -157,6 +187,8 @@ public final class AntarchyNeoforgeMisc { () -> new SimpleParticleType(true)); public static final DeferredHolder, SimpleParticleType> STINKY_FLY = PARTICLE_TYPES.register("stinky_fly", () -> new SimpleParticleType(true)); + public static final DeferredHolder, SimpleParticleType> PEACH_LEAVES_PARTICLE = PARTICLE_TYPES.register("peach_leaves_particle", + () -> new SimpleParticleType(true)); public static final DeferredHolder, SimpleParticleType> HYPNOTIC_GAS = PARTICLE_TYPES.register("hypnotic_gas", () -> new SimpleParticleType(true)); public static final DeferredHolder, SimpleParticleType> HYPNOTIC_GAS_CLOUD = PARTICLE_TYPES.register("hypnotic_gas_cloud", @@ -193,12 +225,20 @@ public final class AntarchyNeoforgeMisc { () -> new OuranwoodTreeFeature(OuranwoodTreeConfiguration.CODEC)); public static final DeferredHolder, OuranwoodCocoonTreeFeature> OURANWOOD_COCOON_TREE = FEATURES.register("ouranwood_cocoon_tree", () -> new OuranwoodCocoonTreeFeature(OuranwoodTreeConfiguration.CODEC)); + public static final DeferredHolder, PeachTreeFeature> PEACH_TREE_FEATURE = FEATURES.register("peach_tree", + () -> new PeachTreeFeature(PeachTreeConfiguration.CODEC)); + public static final DeferredHolder, PeachTreeFeature> PEACH_LARGE_TREE_FEATURE = FEATURES.register("peach_large_tree", + () -> new PeachTreeFeature(PeachTreeConfiguration.CODEC)); public static final DeferredHolder, ElythiaFloraFeature> ELYTHIA_FOREST_FLORA = FEATURES.register("elythia_forest_flora", () -> new ElythiaFloraFeature(NoneFeatureConfiguration.CODEC, ElythiaFloraFeature.Variant.FOREST)); public static final DeferredHolder, ElythiaFloraFeature> ELYTHIA_MEADOW_FLORA = FEATURES.register("elythia_meadow_flora", () -> new ElythiaFloraFeature(NoneFeatureConfiguration.CODEC, ElythiaFloraFeature.Variant.MEADOW)); + public static final DeferredHolder, ElythiaFloraFeature> PEACH_FOREST_FLORA = FEATURES.register("peach_forest_flora", + () -> new ElythiaFloraFeature(NoneFeatureConfiguration.CODEC, ElythiaFloraFeature.Variant.PEACH_FOREST)); public static final DeferredHolder, ElythiaFloraFeature> FLOWER_FOREST_MILKWEED = FEATURES.register("flower_forest_milkweed", () -> new ElythiaFloraFeature(NoneFeatureConfiguration.CODEC, ElythiaFloraFeature.Variant.FLOWER_FOREST_MILKWEED)); + public static final DeferredHolder, CornPatchFeature> CORN_PATCH = FEATURES.register("corn_patch", + () -> new CornPatchFeature(NoneFeatureConfiguration.CODEC)); public static final DeferredHolder, ElythiaFloraFeature> ELYTHIA_BUTTERFLY_FIELDS_FLORA = FEATURES.register("butterfly_fields_flora", () -> new ElythiaFloraFeature(NoneFeatureConfiguration.CODEC, ElythiaFloraFeature.Variant.BUTTERFLY_FIELDS)); public static final DeferredHolder, ElythiaFloraFeature> ELYTHIA_TORCHFLOWER_FIELDS_FLORA = FEATURES.register("elythia_torchflower_fields_flora", @@ -221,10 +261,20 @@ public final class AntarchyNeoforgeMisc { () -> new TriffidPatchFeature(NoneFeatureConfiguration.CODEC)); public static final DeferredHolder, ElythiaPondFeature> ELYTHIA_POND = FEATURES.register("elythia_pond", () -> new ElythiaPondFeature(NoneFeatureConfiguration.CODEC)); + public static final DeferredHolder, LumenPoolFeature> LUMEN_POOL = FEATURES.register("lumen_pools", + () -> new LumenPoolFeature(NoneFeatureConfiguration.CODEC)); + public static final DeferredHolder, LumenLilyPadFeature> LUMEN_LILY_PADS = FEATURES.register("lumen_lily_pads", + () -> new LumenLilyPadFeature(NoneFeatureConfiguration.CODEC)); + public static final DeferredHolder, LumenStreamFeature> LUMEN_STREAM = FEATURES.register("lumen_streams", + () -> new LumenStreamFeature(NoneFeatureConfiguration.CODEC)); public static final DeferredHolder, ElythiaTuffBoulderFeature> ELYTHIA_TUFF_BOULDER = FEATURES.register("elythia_tuff_boulder", () -> new ElythiaTuffBoulderFeature(NoneFeatureConfiguration.CODEC)); public static final DeferredHolder, ElythiaLargeTuffBoulderFeature> ELYTHIA_LARGE_TUFF_BOULDER = FEATURES.register("elythia_large_tuff_boulder", () -> new ElythiaLargeTuffBoulderFeature(NoneFeatureConfiguration.CODEC)); + public static final DeferredHolder, PeachForestMossyBoulderFeature> PEACH_FOREST_MOSSY_BOULDER = FEATURES.register("peach_forest_mossy_boulder", + () -> new PeachForestMossyBoulderFeature(NoneFeatureConfiguration.CODEC)); + public static final DeferredHolder, PeachForestPondFeature> PEACH_FOREST_POND = FEATURES.register("peach_forest_pond", + () -> new PeachForestPondFeature(PeachForestPondConfiguration.CODEC)); public static final DeferredHolder, CoralSpikeFeature> ELYTHIA_CORAL_SPIKE = FEATURES.register("elythia_coral_spike", () -> new CoralSpikeFeature(NoneFeatureConfiguration.CODEC)); public static final DeferredHolder, FallenOuranwoodFeature> FALLEN_OURANWOOD_TREE = FEATURES.register("fallen_ouranwood_tree", @@ -281,6 +331,9 @@ public final class AntarchyNeoforgeMisc { DENSITY_FUNCTION_TYPES.register(modEventBus); ENTITY_SUB_PREDICATES.register(modEventBus); ATTRIBUTES.register(modEventBus); + MENU_TYPES.register(modEventBus); + DATA_COMPONENT_TYPES.register(modEventBus); + RECIPE_SERIALIZERS.register(modEventBus); } static BaseFlowingFluid.Properties bileProperties() { @@ -310,6 +363,15 @@ public final class AntarchyNeoforgeMisc { .tickRate(5); } + static BaseFlowingFluid.Properties lumenProperties() { + return new BaseFlowingFluid.Properties(com.craisinlord.antarchy.neoforge.AntarchyNeoForgeFluidTypes.LUMEN_TYPE, LUMEN, FLOWING_LUMEN) + .bucket(() -> AntarchyNeoforgeItems.LUMEN_BUCKET.get()) + .block(() -> AntarchyNeoforgeBlocks.LUMEN_BLOCK.get()) + .slopeFindDistance(4) + .levelDecreasePerBlock(1) + .tickRate(5); + } + private static ParticleType particleType( Function, com.mojang.serialization.MapCodec> codecFactory, Function, StreamCodec> streamCodecFactory diff --git a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeSpawnPlacements.java b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeSpawnPlacements.java index 8a6b7ccc..e79e8067 100644 --- a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeSpawnPlacements.java +++ b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeSpawnPlacements.java @@ -48,6 +48,9 @@ public class AntarchyNeoforgeSpawnPlacements { event.register(AntarchyNeoforgeEntites.BASILISK.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, BasiliskEntity::canSpawn, RegisterSpawnPlacementsEvent.Operation.OR); event.register(AntarchyNeoforgeEntites.EMPEROR_SCORPION.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, EmperorScorpionEntity::canSpawn, RegisterSpawnPlacementsEvent.Operation.OR); event.register(AntarchyNeoforgeEntites.CHEEP.get(), SpawnPlacementTypes.IN_WATER, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, AbstractFish::checkSurfaceWaterAnimalSpawnRules, RegisterSpawnPlacementsEvent.Operation.OR); - // event.register(AntarchyNeoforgeEntites.GLIMMER.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, net.minecraft.world.entity.animal.Animal::checkAnimalSpawnRules, RegisterSpawnPlacementsEvent.Operation.OR); + event.register(AntarchyNeoforgeEntites.DORRIE.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, net.minecraft.world.entity.animal.Animal::checkAnimalSpawnRules, RegisterSpawnPlacementsEvent.Operation.OR); + event.register(AntarchyNeoforgeEntites.OURANWOOD_DEER.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, net.minecraft.world.entity.animal.Animal::checkAnimalSpawnRules, RegisterSpawnPlacementsEvent.Operation.OR); + event.register(AntarchyNeoforgeEntites.GLIMMER.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, net.minecraft.world.entity.animal.Animal::checkAnimalSpawnRules, RegisterSpawnPlacementsEvent.Operation.OR); + event.register(AntarchyNeoforgeEntites.ELKA.get(), SpawnPlacementTypes.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, net.minecraft.world.entity.animal.Animal::checkAnimalSpawnRules, RegisterSpawnPlacementsEvent.Operation.OR); } } diff --git a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/worldgen/CornPatchFeature.java b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/worldgen/CornPatchFeature.java new file mode 100644 index 00000000..ac4480df --- /dev/null +++ b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/worldgen/CornPatchFeature.java @@ -0,0 +1,62 @@ +package com.craisinlord.antarchy.neoforge.worldgen; + +import com.craisinlord.antarchy.content.block.CornCropBlock; +import com.craisinlord.antarchy.neoforge.registry.AntarchyNeoforgeBlocks; +import com.mojang.serialization.Codec; +import net.minecraft.core.BlockPos; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.WorldGenLevel; +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.block.state.properties.DoubleBlockHalf; +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; + +public final class CornPatchFeature extends Feature { + public CornPatchFeature(Codec codec) { + super(codec); + } + + @Override + public boolean place(FeaturePlaceContext context) { + WorldGenLevel level = context.level(); + RandomSource random = context.random(); + BlockPos origin = context.origin(); + Block wildCorn = AntarchyNeoforgeBlocks.WILD_CORN.get(); + int radius = 4 + random.nextInt(3); + int targetPlacements = 10 + random.nextInt(11); + int attempts = targetPlacements * 4; + int placed = 0; + + for (int i = 0; i < attempts && placed < targetPlacements; i++) { + int x = origin.getX() + random.nextInt(radius * 2 + 1) - radius; + int z = origin.getZ() + random.nextInt(radius * 2 + 1) - radius; + int surfaceY = level.getHeight(Heightmap.Types.WORLD_SURFACE_WG, x, z); + BlockPos lowerPos = new BlockPos(x, surfaceY, z); + BlockPos upperPos = lowerPos.above(); + + if (!level.getBlockState(lowerPos.below()).is(Blocks.GRASS_BLOCK)) { + continue; + } + if (!level.getBlockState(lowerPos).canBeReplaced() || !level.getBlockState(upperPos).canBeReplaced()) { + continue; + } + + BlockState lowerState = wildCorn.defaultBlockState() + .setValue(CornCropBlock.AGE, 3) + .setValue(CornCropBlock.HALF, DoubleBlockHalf.LOWER); + BlockState upperState = wildCorn.defaultBlockState() + .setValue(CornCropBlock.AGE, 3) + .setValue(CornCropBlock.HALF, DoubleBlockHalf.UPPER); + + level.setBlock(lowerPos, lowerState, 2); + level.setBlock(upperPos, upperState, 2); + placed++; + } + + return placed > 0; + } +} diff --git a/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/worldgen/LumenLilyPadFeature.java b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/worldgen/LumenLilyPadFeature.java new file mode 100644 index 00000000..92d0fb4d --- /dev/null +++ b/neoforge/src/main/java/com/craisinlord/antarchy/neoforge/worldgen/LumenLilyPadFeature.java @@ -0,0 +1,52 @@ +package com.craisinlord.antarchy.neoforge.worldgen; + +import com.craisinlord.antarchy.content.AntarchyTags; +import com.mojang.serialization.Codec; +import net.minecraft.core.BlockPos; +import net.minecraft.util.RandomSource; +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.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; + +public final class LumenLilyPadFeature extends Feature { + public LumenLilyPadFeature(Codec codec) { + super(codec); + } + + @Override + public boolean place(FeaturePlaceContext context) { + WorldGenLevel level = context.level(); + RandomSource random = context.random(); + BlockPos origin = context.origin(); + boolean placedAny = false; + + for (int i = 0; i < 24; i++) { + int x = origin.getX() + random.nextInt(17) - 8; + int z = origin.getZ() + random.nextInt(17) - 8; + int surfaceY = level.getHeight(Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, x, z) - 1; + BlockPos fluidPos = new BlockPos(x, surfaceY, z); + if (!level.getFluidState(fluidPos).is(AntarchyTags.Fluids.LUMEN) || !level.getFluidState(fluidPos).isSource()) { + continue; + } + + BlockPos padPos = fluidPos.above(); + if (!level.isEmptyBlock(padPos)) { + continue; + } + + BlockState lilyPad = Blocks.LILY_PAD.defaultBlockState(); + if (!lilyPad.canSurvive(level, padPos)) { + continue; + } + + level.setBlock(padPos, lilyPad, 2); + placedAny = true; + } + + return placedAny; + } +} diff --git a/neoforge/src/main/resources/META-INF/neoforge.mods.toml b/neoforge/src/main/resources/META-INF/neoforge.mods.toml index 3c6b4e34..36f33648 100644 --- a/neoforge/src/main/resources/META-INF/neoforge.mods.toml +++ b/neoforge/src/main/resources/META-INF/neoforge.mods.toml @@ -44,4 +44,12 @@ displayURL="https://www.curseforge.com/minecraft/mc-mods/antarchy" type="required" versionRange="*" ordering="AFTER" - side="BOTH" \ No newline at end of file + side="BOTH" + +[[dependencies.antarchy]] + modId="infinity" + type="incompatible" + versionRange="(,2.7.2)" + ordering="NONE" + side="BOTH" + reason="Infinite Dimensions versions below 2.7.2 are no longer supported" \ No newline at end of file diff --git a/neoforge/src/main/resources/antarchy-neoforge.mixins.json b/neoforge/src/main/resources/antarchy-neoforge.mixins.json index f84d3e8e..30c33c5c 100644 --- a/neoforge/src/main/resources/antarchy-neoforge.mixins.json +++ b/neoforge/src/main/resources/antarchy-neoforge.mixins.json @@ -11,7 +11,6 @@ "entity.ParalyzedMobFreezeMixin", "infinity.ConfigGenInvocationMixin", "infinity.PortalCreatorMixin", - "infinity.RandomSpringMixin", "level.ClientLevelPartEntitiesAccessor", "level.ServerLevelPartEntitiesAccessor" ], diff --git a/neoforge/src/main/resources/assets/antarchy/models/item/lumen_bucket.json b/neoforge/src/main/resources/assets/antarchy/models/item/lumen_bucket.json new file mode 100644 index 00000000..49b64eed --- /dev/null +++ b/neoforge/src/main/resources/assets/antarchy/models/item/lumen_bucket.json @@ -0,0 +1,5 @@ +{ + "parent": "neoforge:item/bucket", + "loader": "neoforge:fluid_container", + "fluid": "antarchy:lumen" +} diff --git a/neoforge/src/main/resources/data/antarchy/neoforge/biome_modifier/corn_patch_in_spawn_biomes.json b/neoforge/src/main/resources/data/antarchy/neoforge/biome_modifier/corn_patch_in_spawn_biomes.json new file mode 100644 index 00000000..84d1b78c --- /dev/null +++ b/neoforge/src/main/resources/data/antarchy/neoforge/biome_modifier/corn_patch_in_spawn_biomes.json @@ -0,0 +1,8 @@ +{ + "type": "neoforge:add_features", + "biomes": "#antarchy:wild_corn_spawn_biomes", + "features": [ + "antarchy:corn_patch" + ], + "step": "vegetal_decoration" +} diff --git a/tmp_extract/Frog.javap.txt b/tmp_extract/Frog.javap.txt new file mode 100644 index 00000000..5d6a49fb Binary files /dev/null and b/tmp_extract/Frog.javap.txt differ diff --git a/tmp_extract/Frog_full.javap.txt b/tmp_extract/Frog_full.javap.txt new file mode 100644 index 00000000..5d6a49fb Binary files /dev/null and b/tmp_extract/Frog_full.javap.txt differ diff --git a/tmp_extract/ShootTongue.javap.txt b/tmp_extract/ShootTongue.javap.txt new file mode 100644 index 00000000..e35a4828 Binary files /dev/null and b/tmp_extract/ShootTongue.javap.txt differ diff --git a/tmp_extract/net/fabricmc/fabric/api/registry/FabricBrewingRecipeRegistryBuilder.java b/tmp_extract/net/fabricmc/fabric/api/registry/FabricBrewingRecipeRegistryBuilder.java new file mode 100644 index 00000000..88084cd5 --- /dev/null +++ b/tmp_extract/net/fabricmc/fabric/api/registry/FabricBrewingRecipeRegistryBuilder.java @@ -0,0 +1,69 @@ +/* + * 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. + */ + +package net.fabricmc.fabric.api.registry; + +import net.fabricmc.fabric.api.event.Event; +import net.fabricmc.fabric.api.event.EventFactory; +import net.minecraft.class_1792; +import net.minecraft.class_1842; +import net.minecraft.class_1845; +import net.minecraft.class_1856; +import net.minecraft.class_6880; +import net.minecraft.class_7699; + +/** + * An extension of {@link class_1845.class_9665} to support ingredients. + */ +public interface FabricBrewingRecipeRegistryBuilder { + /** + * An event that is called when the brewing recipe registry is being built. + */ + Event BUILD = EventFactory.createArrayBacked(FabricBrewingRecipeRegistryBuilder.BuildCallback.class, listeners -> builder -> { + for (FabricBrewingRecipeRegistryBuilder.BuildCallback listener : listeners) { + listener.build(builder); + } + }); + + default void registerItemRecipe(class_1792 input, class_1856 ingredient, class_1792 output) { + throw new AssertionError("Must be implemented via interface injection"); + } + + default void registerPotionRecipe(class_6880 input, class_1856 ingredient, class_6880 output) { + throw new AssertionError("Must be implemented via interface injection"); + } + + default void registerRecipes(class_1856 ingredient, class_6880 potion) { + throw new AssertionError("Must be implemented via interface injection"); + } + + default class_7699 getEnabledFeatures() { + throw new AssertionError("Must be implemented via interface injection"); + } + + /** + * Use this event to register custom brewing recipes. + */ + @FunctionalInterface + interface BuildCallback { + /** + * Called when the brewing recipe registry is being built. + * + * @param builder the {@link class_1845} instance + */ + void build(class_1845.class_9665 builder); + } +} diff --git a/tmp_extract/net/neoforged/neoforge/common/brewing/BrewingRecipe.java b/tmp_extract/net/neoforged/neoforge/common/brewing/BrewingRecipe.java new file mode 100644 index 00000000..48015c2b --- /dev/null +++ b/tmp_extract/net/neoforged/neoforge/common/brewing/BrewingRecipe.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) Forge Development LLC and contributors + * SPDX-License-Identifier: LGPL-2.1-only + */ + +package net.neoforged.neoforge.common.brewing; + +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Ingredient; + +public class BrewingRecipe implements IBrewingRecipe { + private final Ingredient input; + private final Ingredient ingredient; + private final ItemStack output; + + public BrewingRecipe(Ingredient input, Ingredient ingredient, ItemStack output) { + this.input = input; + this.ingredient = ingredient; + this.output = output; + } + + @Override + public boolean isInput(ItemStack stack) { + return this.input.test(stack); + } + + @Override + public ItemStack getOutput(ItemStack input, ItemStack ingredient) { + return isInput(input) && isIngredient(ingredient) ? getOutput().copy() : ItemStack.EMPTY; + } + + public Ingredient getInput() { + return input; + } + + public Ingredient getIngredient() { + return ingredient; + } + + public ItemStack getOutput() { + return output; + } + + @Override + public boolean isIngredient(ItemStack ingredient) { + return this.ingredient.test(ingredient); + } +} diff --git a/tmp_extract/net/neoforged/neoforge/common/brewing/IBrewingRecipe.java b/tmp_extract/net/neoforged/neoforge/common/brewing/IBrewingRecipe.java new file mode 100644 index 00000000..c8a113c4 --- /dev/null +++ b/tmp_extract/net/neoforged/neoforge/common/brewing/IBrewingRecipe.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) Forge Development LLC and contributors + * SPDX-License-Identifier: LGPL-2.1-only + */ + +package net.neoforged.neoforge.common.brewing; + +import static net.minecraft.world.item.alchemy.PotionBrewing.Builder; + +import net.minecraft.world.item.ItemStack; +import net.neoforged.neoforge.event.brewing.RegisterBrewingRecipesEvent; + +/** + * Interface for more flexible brewing recipes. + * + *

Register using {@link RegisterBrewingRecipesEvent} and {@link Builder#addRecipe(IBrewingRecipe)}. + */ +public interface IBrewingRecipe { + /** + * Returns true is the passed ItemStack is an input for this recipe. "Input" + * being the item that goes in one of the three bottom slots of the brewing + * stand (e.g: water bottle) + */ + boolean isInput(ItemStack input); + + /** + * Returns true if the passed ItemStack is an ingredient for this recipe. + * "Ingredient" being the item that goes in the top slot of the brewing + * stand (e.g: nether wart) + */ + boolean isIngredient(ItemStack ingredient); + + /** + * Returns the output when the passed input is brewed with the passed + * ingredient. Empty if invalid input or ingredient. + */ + ItemStack getOutput(ItemStack input, ItemStack ingredient); +} diff --git a/tmp_extract/net/neoforged/neoforge/event/brewing/RegisterBrewingRecipesEvent.java b/tmp_extract/net/neoforged/neoforge/event/brewing/RegisterBrewingRecipesEvent.java new file mode 100644 index 00000000..669e61ce --- /dev/null +++ b/tmp_extract/net/neoforged/neoforge/event/brewing/RegisterBrewingRecipesEvent.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) NeoForged and contributors + * SPDX-License-Identifier: LGPL-2.1-only + */ + +package net.neoforged.neoforge.event.brewing; + +import net.minecraft.core.RegistryAccess; +import net.minecraft.world.item.alchemy.PotionBrewing; +import net.neoforged.bus.api.Event; +import org.jetbrains.annotations.ApiStatus; + +/** + * Event to register new brewing recipes. + * + *

Fired on both client and server side, on the main event bus. + */ +public class RegisterBrewingRecipesEvent extends Event { + private final PotionBrewing.Builder builder; + private final RegistryAccess registryAccess; + + @ApiStatus.Internal + public RegisterBrewingRecipesEvent(PotionBrewing.Builder builder, RegistryAccess registryAccess) { + this.builder = builder; + this.registryAccess = registryAccess; + } + + public PotionBrewing.Builder getBuilder() { + return builder; + } + + public RegistryAccess getRegistryAccess() { + return registryAccess; + } +}