From 58561a5eead87653270ef28f04f494a71531dae7 Mon Sep 17 00:00:00 2001 From: Sollace Date: Mon, 26 Feb 2024 20:47:39 +0000 Subject: [PATCH 01/17] Reduce the space requirement for the sour apple saplings --- .../java/com/minelittlepony/unicopia/server/world/UTreeGen.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/minelittlepony/unicopia/server/world/UTreeGen.java b/src/main/java/com/minelittlepony/unicopia/server/world/UTreeGen.java index 7ad5aa26..143db033 100644 --- a/src/main/java/com/minelittlepony/unicopia/server/world/UTreeGen.java +++ b/src/main/java/com/minelittlepony/unicopia/server/world/UTreeGen.java @@ -48,7 +48,7 @@ public interface UTreeGen { Tree SWEET_APPLE_TREE = createAppleTree("sweet_apple", UBlocks.SWEET_APPLE_LEAVES, 3, 0.1F) .placement("orchard", 6, 0.1F, 3, BiomeSelectors.includeByKey(UWorldGen.SWEET_APPLE_ORCHARD)) .build(); - Tree SOUR_APPLE_TREE = createAppleTree("sour_apple", UBlocks.SOUR_APPLE_LEAVES, 5, 0.2F).build(); + Tree SOUR_APPLE_TREE = createAppleTree("sour_apple", UBlocks.SOUR_APPLE_LEAVES, 3, 0.2F).build(); Tree GOLDEN_APPLE_TREE = Tree.Builder.create(Unicopia.id("golden_oak_tree"), new StraightTrunkPlacer(6, 1, 3), new BlobFoliagePlacer(ConstantIntProvider.create(3), ConstantIntProvider.create(0), 3) From 850aa8a9fd9f37a56f06081b8ca602b84f738810 Mon Sep 17 00:00:00 2001 From: Sollace Date: Mon, 26 Feb 2024 20:56:22 +0000 Subject: [PATCH 02/17] Fixed chilling breath spell --- .../java/com/minelittlepony/unicopia/EquinePredicates.java | 3 ++- .../minelittlepony/unicopia/ability/UnicornCastingAbility.java | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/minelittlepony/unicopia/EquinePredicates.java b/src/main/java/com/minelittlepony/unicopia/EquinePredicates.java index 9f055212..deedb819 100644 --- a/src/main/java/com/minelittlepony/unicopia/EquinePredicates.java +++ b/src/main/java/com/minelittlepony/unicopia/EquinePredicates.java @@ -11,6 +11,7 @@ import com.minelittlepony.unicopia.item.enchantment.WantItNeedItEnchantment; import net.minecraft.entity.*; import net.minecraft.entity.decoration.AbstractDecorationEntity; import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.vehicle.BoatEntity; import net.minecraft.predicate.entity.EntityPredicates; public interface EquinePredicates { @@ -33,7 +34,7 @@ public interface EquinePredicates { Predicate IS_CASTER = e -> !e.isRemoved() && (e instanceof Caster || IS_PLAYER.test(e)); Predicate IS_PLACED_SPELL = e -> e instanceof Caster && !e.isRemoved(); - Predicate IS_MAGIC_IMMUNE = e -> (e instanceof MagicImmune || !(e instanceof LivingEntity)) && !(e instanceof ItemEntity) && !(e instanceof ExperienceOrbEntity); + Predicate IS_MAGIC_IMMUNE = e -> (e instanceof MagicImmune || !(e instanceof LivingEntity)) && !(e instanceof ItemEntity) && !(e instanceof ExperienceOrbEntity) && !(e instanceof BoatEntity); Predicate EXCEPT_MAGIC_IMMUNE = IS_MAGIC_IMMUNE.negate(); Predicate VALID_LIVING_AND_NOT_MAGIC_IMMUNE = EntityPredicates.VALID_LIVING_ENTITY.and(EXCEPT_MAGIC_IMMUNE); diff --git a/src/main/java/com/minelittlepony/unicopia/ability/UnicornCastingAbility.java b/src/main/java/com/minelittlepony/unicopia/ability/UnicornCastingAbility.java index 3d3dbc00..5726a36e 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/UnicornCastingAbility.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/UnicornCastingAbility.java @@ -113,7 +113,7 @@ public class UnicornCastingAbility extends AbstractSpellCastingAbility { } else { player.setAnimation(Animation.ARMS_UP, Animation.Recipient.HUMAN); if (s instanceof HomingSpell homer) { - TraceHelper.findEntity(player.asEntity(), homer.getRange(player), 1, EquinePredicates.VALID_LIVING_AND_NOT_MAGIC_IMMUNE).ifPresent(homer::setTarget); + TraceHelper.findEntity(player.asEntity(), homer.getRange(player), 1, EquinePredicates.EXCEPT_MAGIC_IMMUNE).ifPresent(homer::setTarget); } player.playSound(USounds.SPELL_CAST_SUCCESS, 0.05F, 2.2F); } From 5d7227f5472360ece48f35e6617a141246ff091f Mon Sep 17 00:00:00 2001 From: Sollace Date: Mon, 26 Feb 2024 21:21:44 +0000 Subject: [PATCH 03/17] Fixed frozen effect rendering on boats when sodium is installed --- .../spell/effect/ChillingBreathSpell.java | 1 + .../client/render/EntityDisguiseRenderer.java | 10 +++++----- .../client/render/WorldRenderDelegate.java | 20 ++++++++++++++----- .../client/MixinEntityRenderDispatcher.java | 2 +- 4 files changed, 22 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/effect/ChillingBreathSpell.java b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/effect/ChillingBreathSpell.java index 18965bd4..90bcfd2d 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/effect/ChillingBreathSpell.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/effect/ChillingBreathSpell.java @@ -30,6 +30,7 @@ public class ChillingBreathSpell extends AbstractSpell implements HomingSpell { public boolean setTarget(Entity target) { if (target instanceof LavaAffine affine) { affine.setLavaAffine(!affine.isLavaAffine()); + setDead(); } return true; } diff --git a/src/main/java/com/minelittlepony/unicopia/client/render/EntityDisguiseRenderer.java b/src/main/java/com/minelittlepony/unicopia/client/render/EntityDisguiseRenderer.java index 1e0aba0c..4d8ecef3 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/render/EntityDisguiseRenderer.java +++ b/src/main/java/com/minelittlepony/unicopia/client/render/EntityDisguiseRenderer.java @@ -34,7 +34,7 @@ class EntityDisguiseRenderer { public boolean render(Living pony, Disguise disguise, double x, double y, double z, - float tickDelta, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light) { + float tickDelta, MatrixStack matrices, VertexConsumerProvider vertices, int light) { int fireTicks = pony.asEntity().doesRenderOnFire() ? 1 : 0; disguise.update(pony, false); @@ -51,20 +51,20 @@ class EntityDisguiseRenderer { e.setBoundingBox(pony.asEntity().getBoundingBox()); } - render(ve, e, x, y, z, fireTicks, tickDelta, matrices, vertexConsumers, light); + render(ve, e, x, y, z, fireTicks, tickDelta, matrices, vertices, light); ve.getAttachments().forEach(ee -> { PehkUtil.copyScale(pony.asEntity(), ee); Vec3d difference = ee.getPos().subtract(e.getPos()); - render(ve, ee, x + difference.x, y + difference.y, z + difference.z, fireTicks, tickDelta, matrices, vertexConsumers, light); + render(ve, ee, x + difference.x, y + difference.y, z + difference.z, fireTicks, tickDelta, matrices, vertices, light); PehkUtil.clearScale(ee); }); matrices.push(); matrices.translate(x, y, z); - SpellEffectsRenderDispatcher.INSTANCE.render(matrices, vertexConsumers, light, pony, 0, 0, tickDelta, pony.asEntity().age + tickDelta, 0, 0); + SpellEffectsRenderDispatcher.INSTANCE.render(matrices, vertices, light, pony, 0, 0, tickDelta, pony.asEntity().age + tickDelta, 0, 0); matrices.pop(); - delegate.afterEntityRender(pony, matrices, light); + delegate.afterEntityRender(pony, matrices, vertices, light); PehkUtil.clearScale(e); return true; } diff --git a/src/main/java/com/minelittlepony/unicopia/client/render/WorldRenderDelegate.java b/src/main/java/com/minelittlepony/unicopia/client/render/WorldRenderDelegate.java index 70a7c975..2d813635 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/render/WorldRenderDelegate.java +++ b/src/main/java/com/minelittlepony/unicopia/client/render/WorldRenderDelegate.java @@ -31,6 +31,7 @@ import net.minecraft.util.math.*; public class WorldRenderDelegate { public static final WorldRenderDelegate INSTANCE = new WorldRenderDelegate(); private static final Optional RED_SKY_COLOR = Optional.of(new Vec3d(1, 0, 0)); + private static final Identifier SHADOW_TEXTURE = new Identifier("textures/misc/shadow.png"); private final EntityReplacementManager disguiseLookup = new EntityReplacementManager(); private final EntityDisguiseRenderer disguiseRenderer = new EntityDisguiseRenderer(this); @@ -71,13 +72,23 @@ public class WorldRenderDelegate { if (MinecraftClient.getInstance().getResourceManager().getResource(frostingTexture).isPresent()) { recurseFrosting = true; + + Immediate immediate = MinecraftClient.getInstance().getBufferBuilders().getEffectVertexConsumers(); + client.getEntityRenderDispatcher().render(entity, x, y, z, yaw, tickDelta, matrices, layer -> { - if (RenderLayerUtil.getTexture(layer).orElse(null) == null) { + + Identifier texture = RenderLayerUtil.getTexture(layer).orElse(null); + + if (texture == null || texture.equals(SHADOW_TEXTURE)) { return vertices.getBuffer(layer); } - return VertexConsumers.union(vertices.getBuffer(layer), vertices.getBuffer(RenderLayers.getEntityTranslucent(frostingTexture))); + return VertexConsumers.union( + vertices.getBuffer(layer), + immediate.getBuffer(RenderLayers.getEntityTranslucent(frostingTexture)) + ); }, light); recurseFrosting = false; + immediate.draw(); return true; } } @@ -89,14 +100,13 @@ public class WorldRenderDelegate { return Equine.of(entity).filter(eq -> onEntityRender(eq, x, y, z, yaw, tickDelta, matrices, vertices, light)).isPresent(); } - public void afterEntityRender(Equine pony, MatrixStack matrices, int light) { + public void afterEntityRender(Equine pony, MatrixStack matrices, VertexConsumerProvider vertices, int light) { if (recurseFrosting) { return; } if (pony instanceof Creature creature && smittenEyesRenderer.isSmitten(creature)) { - Immediate immediate = MinecraftClient.getInstance().getBufferBuilders().getEntityVertexConsumers(); - smittenEyesRenderer.render(creature, matrices, immediate, light, 0); + smittenEyesRenderer.render(creature, matrices, vertices, light, 0); } if (pony instanceof Pony p) { diff --git a/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinEntityRenderDispatcher.java b/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinEntityRenderDispatcher.java index b81bb782..2d784220 100644 --- a/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinEntityRenderDispatcher.java +++ b/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinEntityRenderDispatcher.java @@ -27,6 +27,6 @@ abstract class MixinEntityRenderDispatcher { @Inject(method = RENDER, at = @At("RETURN")) private void afterRender(E entity, double x, double y, double z, float yaw, float tickDelta, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, CallbackInfo info) { - Equine.of(entity).ifPresent(eq -> WorldRenderDelegate.INSTANCE.afterEntityRender(eq, matrices, light)); + Equine.of(entity).ifPresent(eq -> WorldRenderDelegate.INSTANCE.afterEntityRender(eq, matrices, vertexConsumers, light)); } } From 8a2463d0a8cb10cf8415b32052db9c14cf0c42ef Mon Sep 17 00:00:00 2001 From: Sollace Date: Mon, 26 Feb 2024 23:04:38 +0000 Subject: [PATCH 04/17] You can now safely collect slime pustules with shears and silk touch tools --- .../unicopia/block/SlimePustuleBlock.java | 2 +- .../loot_tables/blocks/slime_pustule.json | 55 +++++++++++++++++++ 2 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 src/main/resources/data/unicopia/loot_tables/blocks/slime_pustule.json diff --git a/src/main/java/com/minelittlepony/unicopia/block/SlimePustuleBlock.java b/src/main/java/com/minelittlepony/unicopia/block/SlimePustuleBlock.java index a931844c..97406a32 100644 --- a/src/main/java/com/minelittlepony/unicopia/block/SlimePustuleBlock.java +++ b/src/main/java/com/minelittlepony/unicopia/block/SlimePustuleBlock.java @@ -115,7 +115,7 @@ public class SlimePustuleBlock extends Block { @Override public void onBreak(World world, BlockPos pos, BlockState state, PlayerEntity player) { if (state.get(SHAPE) == Shape.POD) { - world.getOtherEntities(null, new Box(pos).expand(1)).forEach(entity -> { + world.getOtherEntities(player.canHarvest(state) ? player : null, new Box(pos).expand(1)).forEach(entity -> { entity.damage(entity.getDamageSources().inFire(), 2); entity.setFireTicks(3); }); diff --git a/src/main/resources/data/unicopia/loot_tables/blocks/slime_pustule.json b/src/main/resources/data/unicopia/loot_tables/blocks/slime_pustule.json new file mode 100644 index 00000000..3945bf2f --- /dev/null +++ b/src/main/resources/data/unicopia/loot_tables/blocks/slime_pustule.json @@ -0,0 +1,55 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1.0, + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "name": "unicopia:slime_pustule" + } + ], + "conditions": [ + { + "condition": "minecraft:all_of", + "terms": [ + { + "block": "unicopia:slime_pustule", + "condition": "minecraft:block_state_property", + "properties": { + "shape": "pod" + } + }, + { + "condition": "minecraft:any_of", + "terms": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "items": [ + "minecraft:shears" + ] + } + }, + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ] + } + ] + } + ] + } + ] +} \ No newline at end of file From ba2e673de7e0e9ee8a0520ce4086996b35e6f636 Mon Sep 17 00:00:00 2001 From: Sollace Date: Mon, 26 Feb 2024 23:05:30 +0000 Subject: [PATCH 05/17] Each butterly type has its own item and throwing a butterfly in a jar will spawn a butterfly of that type where it lands --- .../unicopia/client/URenderers.java | 3 + .../unicopia/entity/mob/ButterflyEntity.java | 20 ++++++- .../unicopia/item/ButterflyItem.java | 53 ++++++++++++++++++ .../unicopia/item/FilledJarItem.java | 14 ++++- .../minelittlepony/unicopia/item/UItems.java | 2 +- .../unicopia/models/item/blue_butterfly.json | 6 ++ .../models/item/brimstone_butterfly.json | 6 ++ .../unicopia/models/item/butterfly.json | 18 +++++- .../unicopia/models/item/green_butterfly.json | 6 ++ .../models/item/hedylidae_butterfly.json | 6 ++ .../unicopia/models/item/lime_butterfly.json | 6 ++ .../models/item/lycaenidae_butterfly.json | 6 ++ .../models/item/magenta_butterfly.json | 6 ++ .../models/item/monarch_butterfly.json | 6 ++ .../models/item/nymphalidae_butterfly.json | 6 ++ .../unicopia/models/item/pink_butterfly.json | 6 ++ .../models/item/purple_butterfly.json | 6 ++ .../unicopia/models/item/red_butterfly.json | 6 ++ .../models/item/white_monarch_butterfly.json | 6 ++ .../models/item/yellow_butterfly.json | 6 ++ .../unicopia/textures/item/blue_butterfly.png | Bin 0 -> 6965 bytes .../textures/item/brimstone_butterfly.png | Bin 0 -> 7522 bytes .../unicopia/textures/item/butterfly.png | Bin 559 -> 6730 bytes .../textures/item/green_butterfly.png | Bin 0 -> 6934 bytes .../textures/item/hedylidae_butterfly.png | Bin 0 -> 7172 bytes .../unicopia/textures/item/lime_butterfly.png | Bin 0 -> 7003 bytes .../textures/item/lycaenidae_butterfly.png | Bin 0 -> 7251 bytes .../textures/item/magenta_butterfly.png | Bin 0 -> 6959 bytes .../textures/item/monarch_butterfly.png | Bin 0 -> 7731 bytes .../textures/item/nymphalidae_butterfly.png | Bin 0 -> 7363 bytes .../unicopia/textures/item/pink_butterfly.png | Bin 0 -> 6999 bytes .../textures/item/purple_butterfly.png | Bin 0 -> 6971 bytes .../unicopia/textures/item/red_butterfly.png | Bin 0 -> 6974 bytes .../textures/item/white_monarch_butterfly.png | Bin 0 -> 7489 bytes .../textures/item/yellow_butterfly.png | Bin 0 -> 7007 bytes 35 files changed, 188 insertions(+), 6 deletions(-) create mode 100644 src/main/java/com/minelittlepony/unicopia/item/ButterflyItem.java create mode 100644 src/main/resources/assets/unicopia/models/item/blue_butterfly.json create mode 100644 src/main/resources/assets/unicopia/models/item/brimstone_butterfly.json create mode 100644 src/main/resources/assets/unicopia/models/item/green_butterfly.json create mode 100644 src/main/resources/assets/unicopia/models/item/hedylidae_butterfly.json create mode 100644 src/main/resources/assets/unicopia/models/item/lime_butterfly.json create mode 100644 src/main/resources/assets/unicopia/models/item/lycaenidae_butterfly.json create mode 100644 src/main/resources/assets/unicopia/models/item/magenta_butterfly.json create mode 100644 src/main/resources/assets/unicopia/models/item/monarch_butterfly.json create mode 100644 src/main/resources/assets/unicopia/models/item/nymphalidae_butterfly.json create mode 100644 src/main/resources/assets/unicopia/models/item/pink_butterfly.json create mode 100644 src/main/resources/assets/unicopia/models/item/purple_butterfly.json create mode 100644 src/main/resources/assets/unicopia/models/item/red_butterfly.json create mode 100644 src/main/resources/assets/unicopia/models/item/white_monarch_butterfly.json create mode 100644 src/main/resources/assets/unicopia/models/item/yellow_butterfly.json create mode 100644 src/main/resources/assets/unicopia/textures/item/blue_butterfly.png create mode 100644 src/main/resources/assets/unicopia/textures/item/brimstone_butterfly.png create mode 100644 src/main/resources/assets/unicopia/textures/item/green_butterfly.png create mode 100644 src/main/resources/assets/unicopia/textures/item/hedylidae_butterfly.png create mode 100644 src/main/resources/assets/unicopia/textures/item/lime_butterfly.png create mode 100644 src/main/resources/assets/unicopia/textures/item/lycaenidae_butterfly.png create mode 100644 src/main/resources/assets/unicopia/textures/item/magenta_butterfly.png create mode 100644 src/main/resources/assets/unicopia/textures/item/monarch_butterfly.png create mode 100644 src/main/resources/assets/unicopia/textures/item/nymphalidae_butterfly.png create mode 100644 src/main/resources/assets/unicopia/textures/item/pink_butterfly.png create mode 100644 src/main/resources/assets/unicopia/textures/item/purple_butterfly.png create mode 100644 src/main/resources/assets/unicopia/textures/item/red_butterfly.png create mode 100644 src/main/resources/assets/unicopia/textures/item/white_monarch_butterfly.png create mode 100644 src/main/resources/assets/unicopia/textures/item/yellow_butterfly.png diff --git a/src/main/java/com/minelittlepony/unicopia/client/URenderers.java b/src/main/java/com/minelittlepony/unicopia/client/URenderers.java index 2d7155b2..798d7668 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/URenderers.java +++ b/src/main/java/com/minelittlepony/unicopia/client/URenderers.java @@ -26,7 +26,9 @@ import com.minelittlepony.unicopia.client.render.*; import com.minelittlepony.unicopia.client.render.entity.*; import com.minelittlepony.unicopia.client.render.shader.UShaders; import com.minelittlepony.unicopia.client.render.spell.SpellRendererFactory; +import com.minelittlepony.unicopia.entity.mob.ButterflyEntity; import com.minelittlepony.unicopia.entity.mob.UEntities; +import com.minelittlepony.unicopia.item.ButterflyItem; import com.minelittlepony.unicopia.item.ChameleonItem; import com.minelittlepony.unicopia.item.EnchantableItem; import com.minelittlepony.unicopia.item.FancyBedItem; @@ -119,6 +121,7 @@ public interface URenderers { PolearmRenderer.register(UItems.WOODEN_POLEARM, UItems.STONE_POLEARM, UItems.IRON_POLEARM, UItems.GOLDEN_POLEARM, UItems.DIAMOND_POLEARM, UItems.NETHERITE_POLEARM); ModelPredicateProviderRegistry.register(UItems.GEMSTONE, new Identifier("affinity"), (stack, world, entity, seed) -> EnchantableItem.isEnchanted(stack) ? EnchantableItem.getSpellKey(stack).getAffinity().getAlignment() : 0); ModelPredicateProviderRegistry.register(UItems.ROCK_CANDY, new Identifier("count"), (stack, world, entity, seed) -> stack.getCount() / (float)stack.getMaxCount()); + ModelPredicateProviderRegistry.register(UItems.BUTTERFLY, new Identifier("variant"), (stack, world, entity, seed) -> (float)ButterflyItem.getVariant(stack).ordinal() / ButterflyEntity.Variant.VALUES.length); ModelPredicateProviderRegistry.register(Unicopia.id("zap_cycle"), new ClampedModelPredicateProvider() { private double targetAngle; private double lastAngle; diff --git a/src/main/java/com/minelittlepony/unicopia/entity/mob/ButterflyEntity.java b/src/main/java/com/minelittlepony/unicopia/entity/mob/ButterflyEntity.java index e16091bf..2fe5e15e 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/mob/ButterflyEntity.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/mob/ButterflyEntity.java @@ -1,19 +1,25 @@ package com.minelittlepony.unicopia.entity.mob; +import java.util.Arrays; import java.util.HashMap; +import java.util.Locale; import java.util.Map; import java.util.Optional; +import java.util.function.Function; +import java.util.stream.Collectors; import org.jetbrains.annotations.Nullable; import com.minelittlepony.unicopia.USounds; import com.minelittlepony.unicopia.Unicopia; +import com.minelittlepony.unicopia.item.ButterflyItem; import com.minelittlepony.unicopia.util.NbtSerialisable; import net.minecraft.block.BlockState; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityPose; import net.minecraft.entity.EntityType; +import net.minecraft.entity.ItemEntity; import net.minecraft.entity.SpawnReason; import net.minecraft.entity.attribute.DefaultAttributeContainer; import net.minecraft.entity.attribute.EntityAttributes; @@ -23,6 +29,7 @@ import net.minecraft.entity.data.TrackedData; import net.minecraft.entity.data.TrackedDataHandlerRegistry; import net.minecraft.entity.mob.AmbientEntity; import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; import net.minecraft.nbt.NbtCompound; import net.minecraft.predicate.entity.EntityPredicates; import net.minecraft.sound.SoundEvent; @@ -304,6 +311,11 @@ public class ButterflyEntity extends AmbientEntity { return getHeight() / 2; } + @Override + public ItemEntity dropStack(ItemStack stack, float yOffset) { + return super.dropStack(ButterflyItem.setVariant(stack, getVariant()), yOffset); + } + @Override public void writeCustomDataToNbt(NbtCompound nbt) { super.writeCustomDataToNbt(nbt); @@ -351,14 +363,14 @@ public class ButterflyEntity extends AmbientEntity { WHITE_MONARCH, BRIMSTONE; - private static final Variant[] VALUES = Variant.values(); + public static final Variant[] VALUES = Variant.values(); + private static final Map REGISTRY = Arrays.stream(VALUES).collect(Collectors.toMap(a -> a.name().toLowerCase(Locale.ROOT), Function.identity())); private final Identifier skin = Unicopia.id("textures/entity/butterfly/" + name().toLowerCase() + ".png"); public Identifier getSkin() { return skin; } - static Variant byId(int index) { return VALUES[Math.max(0, index) % VALUES.length]; } @@ -366,5 +378,9 @@ public class ButterflyEntity extends AmbientEntity { static Variant random(Random rand) { return VALUES[rand.nextInt(VALUES.length)]; } + + public static Variant byName(String name) { + return REGISTRY.getOrDefault(name == null ? "" : name, BUTTERFLY); + } } } diff --git a/src/main/java/com/minelittlepony/unicopia/item/ButterflyItem.java b/src/main/java/com/minelittlepony/unicopia/item/ButterflyItem.java new file mode 100644 index 00000000..374838a6 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/item/ButterflyItem.java @@ -0,0 +1,53 @@ +package com.minelittlepony.unicopia.item; + +import java.util.Arrays; +import java.util.List; +import java.util.Locale; + +import org.jetbrains.annotations.Nullable; + +import com.minelittlepony.unicopia.entity.mob.ButterflyEntity; +import com.minelittlepony.unicopia.item.group.MultiItem; + +import net.minecraft.client.item.TooltipContext; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NbtCompound; +import net.minecraft.nbt.NbtElement; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; +import net.minecraft.world.World; + +public class ButterflyItem extends Item implements MultiItem { + + public ButterflyItem(Settings settings) { + super(settings); + } + + @Override + public List getDefaultStacks() { + return Arrays.stream(ButterflyEntity.Variant.VALUES).map(variant -> setVariant(getDefaultStack(), variant)).toList(); + } + + @Override + public void appendTooltip(ItemStack stack, @Nullable World world, List tooltip, TooltipContext context) { + tooltip.add(Text.literal(getVariant(stack).name()).formatted(Formatting.LIGHT_PURPLE)); + } + + public static ButterflyEntity.Variant getVariant(ItemStack stack) { + NbtCompound nbt = stack.getNbt(); + if (nbt == null || !nbt.contains("variant", NbtElement.STRING_TYPE)) { + return ButterflyEntity.Variant.BUTTERFLY; + } + String variant = nbt.getString("variant"); + return ButterflyEntity.Variant.byName(variant); + } + + public static ItemStack setVariant(ItemStack stack, ButterflyEntity.Variant variant) { + if (stack.isOf(UItems.BUTTERFLY)) { + stack.getOrCreateNbt().putString("variant", variant.name().toLowerCase(Locale.ROOT)); + } + return stack; + } + +} diff --git a/src/main/java/com/minelittlepony/unicopia/item/FilledJarItem.java b/src/main/java/com/minelittlepony/unicopia/item/FilledJarItem.java index 6a5b9c08..ee6dc0dc 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/FilledJarItem.java +++ b/src/main/java/com/minelittlepony/unicopia/item/FilledJarItem.java @@ -2,6 +2,8 @@ package com.minelittlepony.unicopia.item; import com.minelittlepony.unicopia.entity.IItemEntity; import com.minelittlepony.unicopia.entity.Living; +import com.minelittlepony.unicopia.entity.mob.ButterflyEntity; +import com.minelittlepony.unicopia.entity.mob.UEntities; import com.minelittlepony.unicopia.projectile.MagicProjectileEntity; import net.minecraft.block.Block; @@ -125,8 +127,16 @@ public class FilledJarItem extends JarItem implements ChameleonItem { @Override public void onImpact(MagicProjectileEntity projectile) { ItemStack stack = getAppearanceStack(projectile.getStack()); - stack.damage(1, projectile.getWorld().random, null); - projectile.dropStack(stack); + + if (stack.isOf(UItems.BUTTERFLY)) { + ButterflyEntity butterfly = UEntities.BUTTERFLY.create(projectile.getWorld()); + butterfly.setVariant(ButterflyItem.getVariant(stack)); + butterfly.updatePosition(projectile.getX(), projectile.getY(), projectile.getZ()); + projectile.getWorld().spawnEntity(butterfly); + } else { + stack.damage(1, projectile.getWorld().random, null); + projectile.dropStack(stack); + } projectile.getWorld().syncWorldEvent(WorldEvents.BLOCK_BROKEN, projectile.getBlockPos(), Block.getRawIdFromState(Blocks.GLASS.getDefaultState())); } diff --git a/src/main/java/com/minelittlepony/unicopia/item/UItems.java b/src/main/java/com/minelittlepony/unicopia/item/UItems.java index cf71cf2a..5ee6baeb 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/UItems.java +++ b/src/main/java/com/minelittlepony/unicopia/item/UItems.java @@ -145,7 +145,7 @@ public interface UItems { Item LOOT_BUG_SPAWN_EGG = register("loot_bug_spawn_egg", new SpawnEggItem(UEntities.LOOT_BUG, 0x3C9D14, 0xE66F16, new Item.Settings()), ItemGroups.SPAWN_EGGS); Item BUTTERFLY_SPAWN_EGG = register("butterfly_spawn_egg", new SpawnEggItem(UEntities.BUTTERFLY, 0x222200, 0xAAEEFF, new Item.Settings()), ItemGroups.SPAWN_EGGS); - Item BUTTERFLY = register("butterfly", new Item(new Item.Settings().food(UFoodComponents.INSECTS)), ItemGroups.FOOD_AND_DRINK); + Item BUTTERFLY = register("butterfly", new ButterflyItem(new Item.Settings().food(UFoodComponents.INSECTS)), ItemGroups.FOOD_AND_DRINK); Item PALM_BOAT = ItemGroupRegistry.register(TerraformBoatItemHelper.registerBoatItem(Unicopia.id("palm_boat"), UWoodTypes.PALM_BOAT_TYPE, false), ItemGroups.FUNCTIONAL); Item PALM_CHEST_BOAT = ItemGroupRegistry.register(TerraformBoatItemHelper.registerBoatItem(Unicopia.id("palm_chest_boat"), UWoodTypes.PALM_BOAT_TYPE, true), ItemGroups.FUNCTIONAL); diff --git a/src/main/resources/assets/unicopia/models/item/blue_butterfly.json b/src/main/resources/assets/unicopia/models/item/blue_butterfly.json new file mode 100644 index 00000000..5006b4ce --- /dev/null +++ b/src/main/resources/assets/unicopia/models/item/blue_butterfly.json @@ -0,0 +1,6 @@ +{ + "parent": "unicopia:item/mug", + "textures": { + "layer0": "unicopia:item/blue_butterfly" + } +} diff --git a/src/main/resources/assets/unicopia/models/item/brimstone_butterfly.json b/src/main/resources/assets/unicopia/models/item/brimstone_butterfly.json new file mode 100644 index 00000000..264d61b3 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/item/brimstone_butterfly.json @@ -0,0 +1,6 @@ +{ + "parent": "unicopia:item/mug", + "textures": { + "layer0": "unicopia:item/brimstone_butterfly" + } +} diff --git a/src/main/resources/assets/unicopia/models/item/butterfly.json b/src/main/resources/assets/unicopia/models/item/butterfly.json index 9ec18ca8..875fa092 100644 --- a/src/main/resources/assets/unicopia/models/item/butterfly.json +++ b/src/main/resources/assets/unicopia/models/item/butterfly.json @@ -2,5 +2,21 @@ "parent": "unicopia:item/mug", "textures": { "layer0": "unicopia:item/butterfly" - } + }, + "overrides": [ + { "predicate": { "variant": 0.0666666666}, "model": "unicopia:item/yellow_butterfly" }, + { "predicate": { "variant": 0.1333333333}, "model": "unicopia:item/lime_butterfly" }, + { "predicate": { "variant": 0.2}, "model": "unicopia:item/red_butterfly" }, + { "predicate": { "variant": 0.2666666666}, "model": "unicopia:item/green_butterfly" }, + { "predicate": { "variant": 0.3333333333}, "model": "unicopia:item/blue_butterfly" }, + { "predicate": { "variant": 0.4}, "model": "unicopia:item/purple_butterfly" }, + { "predicate": { "variant": 0.4666666666}, "model": "unicopia:item/magenta_butterfly" }, + { "predicate": { "variant": 0.5333333333}, "model": "unicopia:item/pink_butterfly" }, + { "predicate": { "variant": 0.6}, "model": "unicopia:item/hedylidae_butterfly" }, + { "predicate": { "variant": 0.6666666666}, "model": "unicopia:item/lycaenidae_butterfly" }, + { "predicate": { "variant": 0.7333333333}, "model": "unicopia:item/nymphalidae_butterfly" }, + { "predicate": { "variant": 0.8}, "model": "unicopia:item/monarch_butterfly" }, + { "predicate": { "variant": 0.8666666666}, "model": "unicopia:item/white_monarch_butterfly" }, + { "predicate": { "variant": 0.9333333333}, "model": "unicopia:item/brimstone_butterfly" } + ] } diff --git a/src/main/resources/assets/unicopia/models/item/green_butterfly.json b/src/main/resources/assets/unicopia/models/item/green_butterfly.json new file mode 100644 index 00000000..f79317d9 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/item/green_butterfly.json @@ -0,0 +1,6 @@ +{ + "parent": "unicopia:item/mug", + "textures": { + "layer0": "unicopia:item/green_butterfly" + } +} diff --git a/src/main/resources/assets/unicopia/models/item/hedylidae_butterfly.json b/src/main/resources/assets/unicopia/models/item/hedylidae_butterfly.json new file mode 100644 index 00000000..5151d763 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/item/hedylidae_butterfly.json @@ -0,0 +1,6 @@ +{ + "parent": "unicopia:item/mug", + "textures": { + "layer0": "unicopia:item/hedylidae_butterfly" + } +} diff --git a/src/main/resources/assets/unicopia/models/item/lime_butterfly.json b/src/main/resources/assets/unicopia/models/item/lime_butterfly.json new file mode 100644 index 00000000..bbb36011 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/item/lime_butterfly.json @@ -0,0 +1,6 @@ +{ + "parent": "unicopia:item/mug", + "textures": { + "layer0": "unicopia:item/lime_butterfly" + } +} diff --git a/src/main/resources/assets/unicopia/models/item/lycaenidae_butterfly.json b/src/main/resources/assets/unicopia/models/item/lycaenidae_butterfly.json new file mode 100644 index 00000000..e0457136 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/item/lycaenidae_butterfly.json @@ -0,0 +1,6 @@ +{ + "parent": "unicopia:item/mug", + "textures": { + "layer0": "unicopia:item/lycaenidae_butterfly" + } +} diff --git a/src/main/resources/assets/unicopia/models/item/magenta_butterfly.json b/src/main/resources/assets/unicopia/models/item/magenta_butterfly.json new file mode 100644 index 00000000..dfe6072c --- /dev/null +++ b/src/main/resources/assets/unicopia/models/item/magenta_butterfly.json @@ -0,0 +1,6 @@ +{ + "parent": "unicopia:item/mug", + "textures": { + "layer0": "unicopia:item/magenta_butterfly" + } +} diff --git a/src/main/resources/assets/unicopia/models/item/monarch_butterfly.json b/src/main/resources/assets/unicopia/models/item/monarch_butterfly.json new file mode 100644 index 00000000..895dcb56 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/item/monarch_butterfly.json @@ -0,0 +1,6 @@ +{ + "parent": "unicopia:item/mug", + "textures": { + "layer0": "unicopia:item/monarch_butterfly" + } +} diff --git a/src/main/resources/assets/unicopia/models/item/nymphalidae_butterfly.json b/src/main/resources/assets/unicopia/models/item/nymphalidae_butterfly.json new file mode 100644 index 00000000..46a1dde2 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/item/nymphalidae_butterfly.json @@ -0,0 +1,6 @@ +{ + "parent": "unicopia:item/mug", + "textures": { + "layer0": "unicopia:item/nymphalidae_butterfly" + } +} diff --git a/src/main/resources/assets/unicopia/models/item/pink_butterfly.json b/src/main/resources/assets/unicopia/models/item/pink_butterfly.json new file mode 100644 index 00000000..2093f6b6 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/item/pink_butterfly.json @@ -0,0 +1,6 @@ +{ + "parent": "unicopia:item/mug", + "textures": { + "layer0": "unicopia:item/pink_butterfly" + } +} diff --git a/src/main/resources/assets/unicopia/models/item/purple_butterfly.json b/src/main/resources/assets/unicopia/models/item/purple_butterfly.json new file mode 100644 index 00000000..fc5a8214 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/item/purple_butterfly.json @@ -0,0 +1,6 @@ +{ + "parent": "unicopia:item/mug", + "textures": { + "layer0": "unicopia:item/purple_butterfly" + } +} diff --git a/src/main/resources/assets/unicopia/models/item/red_butterfly.json b/src/main/resources/assets/unicopia/models/item/red_butterfly.json new file mode 100644 index 00000000..df49e71e --- /dev/null +++ b/src/main/resources/assets/unicopia/models/item/red_butterfly.json @@ -0,0 +1,6 @@ +{ + "parent": "unicopia:item/mug", + "textures": { + "layer0": "unicopia:item/red_butterfly" + } +} diff --git a/src/main/resources/assets/unicopia/models/item/white_monarch_butterfly.json b/src/main/resources/assets/unicopia/models/item/white_monarch_butterfly.json new file mode 100644 index 00000000..e89aa594 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/item/white_monarch_butterfly.json @@ -0,0 +1,6 @@ +{ + "parent": "unicopia:item/mug", + "textures": { + "layer0": "unicopia:item/white_monarch_butterfly" + } +} diff --git a/src/main/resources/assets/unicopia/models/item/yellow_butterfly.json b/src/main/resources/assets/unicopia/models/item/yellow_butterfly.json new file mode 100644 index 00000000..c4d12496 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/item/yellow_butterfly.json @@ -0,0 +1,6 @@ +{ + "parent": "unicopia:item/mug", + "textures": { + "layer0": "unicopia:item/yellow_butterfly" + } +} diff --git a/src/main/resources/assets/unicopia/textures/item/blue_butterfly.png b/src/main/resources/assets/unicopia/textures/item/blue_butterfly.png new file mode 100644 index 0000000000000000000000000000000000000000..ab4ea1eb02695ad988a20eb43b41b5cba3ecb6e2 GIT binary patch literal 6965 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 w+{_-%17v0sOxL~&vJL#7x17m1&BXaE2J literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/item/butterfly.png b/src/main/resources/assets/unicopia/textures/item/butterfly.png index 35e5ebd6644a201f3620d403ea235e6a8556e4d5..fad1ac6d1084fc1c6a7ee900f01ed1863ba4d4af 100644 GIT binary patch literal 6730 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 Z14ZB5*$_&4R~-NV002ovPDHLkV1hav36KB) diff --git a/src/main/resources/assets/unicopia/textures/item/green_butterfly.png b/src/main/resources/assets/unicopia/textures/item/green_butterfly.png new file mode 100644 index 0000000000000000000000000000000000000000..b645ccaccec06c1d915a1eb7427dc4f10babede3 GIT binary patch literal 6934 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/item/hedylidae_butterfly.png b/src/main/resources/assets/unicopia/textures/item/hedylidae_butterfly.png new file mode 100644 index 0000000000000000000000000000000000000000..843ece55a00a75a79323e27f1444aae45518d294 GIT binary patch literal 7172 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 P*AkI%diYnN^9%kRTd?0i literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/item/lime_butterfly.png b/src/main/resources/assets/unicopia/textures/item/lime_butterfly.png new file mode 100644 index 0000000000000000000000000000000000000000..efe12901fcfc59ad44bab78caa145892e7bd71b1 GIT binary patch literal 7003 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/item/lycaenidae_butterfly.png b/src/main/resources/assets/unicopia/textures/item/lycaenidae_butterfly.png new file mode 100644 index 0000000000000000000000000000000000000000..81e81ee65bbabd816718fd56ecb8eedec4613fec GIT binary patch literal 7251 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 OL?j#+UOnpT`Tqp{<0%9H literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/item/magenta_butterfly.png b/src/main/resources/assets/unicopia/textures/item/magenta_butterfly.png new file mode 100644 index 0000000000000000000000000000000000000000..d8df366ab087228ad97e410f1322b0c5a6f03022 GIT binary patch literal 6959 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 air^)V_gycoQ(`~51dFEoADH|_&OZPPdwlHx literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/item/pink_butterfly.png b/src/main/resources/assets/unicopia/textures/item/pink_butterfly.png new file mode 100644 index 0000000000000000000000000000000000000000..384ee2d5fa0f6f26b43615ac340bcc81a8c4f0f3 GIT binary patch literal 6999 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/item/purple_butterfly.png b/src/main/resources/assets/unicopia/textures/item/purple_butterfly.png new file mode 100644 index 0000000000000000000000000000000000000000..79c5c4ed6d1e5c5d593f20999966244572ccec6e GIT binary patch literal 6971 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/item/red_butterfly.png b/src/main/resources/assets/unicopia/textures/item/red_butterfly.png new file mode 100644 index 0000000000000000000000000000000000000000..ff07e69bc71dd91cefbf9fed4e1486e0ca5bca25 GIT binary patch literal 6974 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 bKWvn4*V@HnXQ!dx6118r+3$}3)8c;tF~+Pk literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/item/white_monarch_butterfly.png b/src/main/resources/assets/unicopia/textures/item/white_monarch_butterfly.png new file mode 100644 index 0000000000000000000000000000000000000000..62a868cf44f4c807ef35a5441b409ba843a00902 GIT binary patch literal 7489 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 USmU;&qCYLDRbx`$Pky!bpYda;kpKVy literal 0 HcmV?d00001 From 9c71272def2dcd9d289188af7c359c609f1ca3f7 Mon Sep 17 00:00:00 2001 From: Sollace Date: Tue, 27 Feb 2024 00:01:22 +0000 Subject: [PATCH 06/17] Only interact with the datatracker after it's safe to do so --- .../minelittlepony/unicopia/entity/Creature.java | 10 +++++++--- .../unicopia/entity/EntityPhysics.java | 8 -------- .../com/minelittlepony/unicopia/entity/Equine.java | 2 ++ .../minelittlepony/unicopia/entity/ItemImpl.java | 8 ++++++-- .../unicopia/entity/ItemPhysics.java | 2 +- .../com/minelittlepony/unicopia/entity/Living.java | 7 +++++-- .../unicopia/entity/player/Acrobatics.java | 7 ++++--- .../unicopia/entity/player/ManaContainer.java | 11 ++++++++++- .../unicopia/entity/player/PlayerLevelStore.java | 1 - .../unicopia/entity/player/Pony.java | 14 +++++++++++--- .../minelittlepony/unicopia/mixin/MixinEntity.java | 10 ++++++++++ .../unicopia/network/datasync/EffectSync.java | 4 ++++ .../unicopia/projectile/MagicProjectileEntity.java | 2 +- 13 files changed, 61 insertions(+), 25 deletions(-) diff --git a/src/main/java/com/minelittlepony/unicopia/entity/Creature.java b/src/main/java/com/minelittlepony/unicopia/entity/Creature.java index 82039a7f..77d0c083 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/Creature.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/Creature.java @@ -70,13 +70,17 @@ public class Creature extends Living implements WeaklyOwned.Mutabl public Creature(LivingEntity entity) { super(entity, EFFECT); physics = new EntityPhysics<>(entity, GRAVITY); + addTicker(physics); + addTicker(this::updateConsumption); + } + + @Override + public void initDataTracker() { + super.initDataTracker(); entity.getDataTracker().startTracking(MASTER, owner.toNBT()); entity.getDataTracker().startTracking(EATING, 0); entity.getDataTracker().startTracking(DISCORDED, false); entity.getDataTracker().startTracking(SMITTEN, false); - - addTicker(physics); - addTicker(this::updateConsumption); } @Override diff --git a/src/main/java/com/minelittlepony/unicopia/entity/EntityPhysics.java b/src/main/java/com/minelittlepony/unicopia/entity/EntityPhysics.java index 3b912b76..1529989b 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/EntityPhysics.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/EntityPhysics.java @@ -28,16 +28,8 @@ public class EntityPhysics implements Physics, Copyable gravity) { - this(entity, gravity, true); - } - - public EntityPhysics(T entity, TrackedData gravity, boolean register) { this.entity = entity; this.gravity = gravity; - - if (register) { - this.entity.getDataTracker().startTracking(gravity, 1F); - } } @Override diff --git a/src/main/java/com/minelittlepony/unicopia/entity/Equine.java b/src/main/java/com/minelittlepony/unicopia/entity/Equine.java index a9cf3707..691bbfcf 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/Equine.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/Equine.java @@ -19,6 +19,8 @@ public interface Equine extends NbtSerialisable, Tickable, Pro void setSpecies(Race race); + void initDataTracker(); + /** * Called at the beginning of an update cycle. */ diff --git a/src/main/java/com/minelittlepony/unicopia/entity/ItemImpl.java b/src/main/java/com/minelittlepony/unicopia/entity/ItemImpl.java index 50680348..3d594ea7 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/ItemImpl.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/ItemImpl.java @@ -41,8 +41,12 @@ public class ItemImpl implements Equine { public ItemImpl(ItemEntity owner) { this.entity = owner; this.physics = new ItemPhysics(owner); - owner.getDataTracker().startTracking(ITEM_GRAVITY, 1F); - owner.getDataTracker().startTracking(ITEM_RACE, Race.REGISTRY.getId(Race.HUMAN).toString()); + } + + @Override + public void initDataTracker() { + entity.getDataTracker().startTracking(ITEM_GRAVITY, 1F); + entity.getDataTracker().startTracking(ITEM_RACE, Race.REGISTRY.getId(Race.HUMAN).toString()); } @Override diff --git a/src/main/java/com/minelittlepony/unicopia/entity/ItemPhysics.java b/src/main/java/com/minelittlepony/unicopia/entity/ItemPhysics.java index f1675f0d..b747dd0a 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/ItemPhysics.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/ItemPhysics.java @@ -4,7 +4,7 @@ import net.minecraft.entity.ItemEntity; class ItemPhysics extends EntityPhysics { public ItemPhysics(ItemEntity entity) { - super(entity, ItemImpl.ITEM_GRAVITY, false); + super(entity, ItemImpl.ITEM_GRAVITY); } @Override diff --git a/src/main/java/com/minelittlepony/unicopia/entity/Living.java b/src/main/java/com/minelittlepony/unicopia/entity/Living.java index 40d6ee7f..40e9fc21 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/Living.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/Living.java @@ -111,12 +111,15 @@ public abstract class Living implements Equine, Caste protected Living(T entity, TrackedData effect) { this.entity = entity; this.effectDelegate = new EffectSync(this, effect); - this.sneakingHeuristic = addTicker(new Interactable(entity::isSneaking)); this.landedHeuristic = addTicker(new Interactable(entity::isOnGround)); this.jumpingHeuristic = addTicker(new Interactable(((LivingEntityDuck)entity)::isJumping)); + } - entity.getDataTracker().startTracking(effect, new NbtCompound()); + @Override + public void initDataTracker() { + effectDelegate.initDataTracker(); + entity.getDataTracker().startTracking(Creature.GRAVITY, 1F); entity.getDataTracker().startTracking(CARRIER_ID, Optional.empty()); } diff --git a/src/main/java/com/minelittlepony/unicopia/entity/player/Acrobatics.java b/src/main/java/com/minelittlepony/unicopia/entity/player/Acrobatics.java index eb9c98eb..37009bb5 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/player/Acrobatics.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/player/Acrobatics.java @@ -41,12 +41,13 @@ public class Acrobatics implements Tickable, NbtSerialisable { public Acrobatics(Pony pony) { this.pony = pony; this.entity = pony.asEntity(); - - entity.getDataTracker().startTracking(HANGING_POSITION, Optional.empty()); - pony.addTicker(this::checkDislodge); } + public void initDataTracker() { + entity.getDataTracker().startTracking(HANGING_POSITION, Optional.empty()); + } + public boolean isImmobile() { return isFloppy() && entity.isOnGround(); } diff --git a/src/main/java/com/minelittlepony/unicopia/entity/player/ManaContainer.java b/src/main/java/com/minelittlepony/unicopia/entity/player/ManaContainer.java index 4ab1ddf4..c527430d 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/player/ManaContainer.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/player/ManaContainer.java @@ -38,6 +38,10 @@ class ManaContainer implements MagicReserves, Tickable, NbtSerialisable, Copyabl }); } + public void initDataTracker() { + bars.values().forEach(BarInst::initDataTracker); + } + protected BarInst addBar(String name, BarInst bar) { bars.put(name, bar); return bar; @@ -164,7 +168,12 @@ class ManaContainer implements MagicReserves, Tickable, NbtSerialisable, Copyabl this.marker = marker; this.max = max; this.trailingValue = initial; - pony.asEntity().getDataTracker().startTracking(marker, getMax() * initial); + this.prevTrailingValue = initial; + this.prevValue = initial; + } + + public void initDataTracker() { + pony.asEntity().getDataTracker().startTracking(marker, max * trailingValue); } @Override diff --git a/src/main/java/com/minelittlepony/unicopia/entity/player/PlayerLevelStore.java b/src/main/java/com/minelittlepony/unicopia/entity/player/PlayerLevelStore.java index 006f20f8..f883529a 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/player/PlayerLevelStore.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/player/PlayerLevelStore.java @@ -21,7 +21,6 @@ class PlayerLevelStore implements Levelled.LevelStore { this.dataEntry = dataEntry; this.upgradeMana = upgradeMana; this.levelUpSound = levelUpSound; - pony.asEntity().getDataTracker().startTracking(dataEntry, 0); } @Override diff --git a/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java b/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java index 67a93b73..02c1d532 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java @@ -125,15 +125,23 @@ public class Pony extends Living implements Copyable, Update this.corruption = new PlayerLevelStore(this, CORRUPTION, false, USounds.ENTITY_PLAYER_CORRUPTION); this.mana = addTicker(new ManaContainer(this)); - player.getDataTracker().startTracking(RACE, Race.DEFAULT_ID); - player.getDataTracker().startTracking(SUPPRESSED_RACE, Race.DEFAULT_ID); - addTicker(this::updateAnimations); addTicker(this::updateBatPonyAbilities); addTicker(this::updateCorruptionDecay); addTicker(new PlayerAttributes(this)); } + @Override + public void initDataTracker() { + super.initDataTracker(); + acrobatics.initDataTracker(); + mana.initDataTracker(); + entity.getDataTracker().startTracking(LEVEL, 0); + entity.getDataTracker().startTracking(CORRUPTION, 0); + entity.getDataTracker().startTracking(RACE, Race.DEFAULT_ID); + entity.getDataTracker().startTracking(SUPPRESSED_RACE, Race.DEFAULT_ID); + } + public static void registerAttributes(DefaultAttributeContainer.Builder builder) { builder.add(UEntityAttributes.EXTRA_MINING_SPEED); builder.add(UEntityAttributes.ENTITY_GRAVITY_MODIFIER); diff --git a/src/main/java/com/minelittlepony/unicopia/mixin/MixinEntity.java b/src/main/java/com/minelittlepony/unicopia/mixin/MixinEntity.java index 986e9bf5..6a9c29d3 100644 --- a/src/main/java/com/minelittlepony/unicopia/mixin/MixinEntity.java +++ b/src/main/java/com/minelittlepony/unicopia/mixin/MixinEntity.java @@ -19,12 +19,14 @@ import com.minelittlepony.unicopia.entity.Living; import com.minelittlepony.unicopia.entity.duck.EntityDuck; import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityType; import net.minecraft.entity.ItemEntity; import net.minecraft.entity.Entity.PositionUpdater; import net.minecraft.entity.Entity.RemovalReason; import net.minecraft.fluid.Fluid; import net.minecraft.item.ItemStack; import net.minecraft.registry.tag.TagKey; +import net.minecraft.world.World; @Mixin(Entity.class) abstract class MixinEntity implements EntityDuck { @@ -64,6 +66,14 @@ abstract class MixinEntity implements EntityDuck { return self.hasVehicle() && self.getVehicle() instanceof LavaAffine affine && affine.isLavaAffine(); } + + @Inject(method = "", at = @At(value = "INVOKE", target = "net/minecraft/entity/Entity.initDataTracker()V")) + private void onInstanceInit(EntityType type, World world, CallbackInfo info) { + if (this instanceof Equine.Container c) { + c.get().initDataTracker(); + } + } + @Inject(method = "isFireImmune", at = @At("HEAD"), cancellable = true) private void onIsFireImmune(CallbackInfoReturnable info) { if (isLavaAffine() || (this instanceof Equine.Container c) && c.get().getCompositeRace().includes(Race.KIRIN)) { diff --git a/src/main/java/com/minelittlepony/unicopia/network/datasync/EffectSync.java b/src/main/java/com/minelittlepony/unicopia/network/datasync/EffectSync.java index 724c5660..c66cac4c 100644 --- a/src/main/java/com/minelittlepony/unicopia/network/datasync/EffectSync.java +++ b/src/main/java/com/minelittlepony/unicopia/network/datasync/EffectSync.java @@ -43,6 +43,10 @@ public class EffectSync implements SpellContainer, NbtSerialisable { this.param = param; } + public void initDataTracker() { + owner.asEntity().getDataTracker().startTracking(param, new NbtCompound()); + } + public boolean tick(Situation situation) { return tick(spell -> { if (spell.isDying()) { diff --git a/src/main/java/com/minelittlepony/unicopia/projectile/MagicProjectileEntity.java b/src/main/java/com/minelittlepony/unicopia/projectile/MagicProjectileEntity.java index 09fbff79..6ca4cb3c 100644 --- a/src/main/java/com/minelittlepony/unicopia/projectile/MagicProjectileEntity.java +++ b/src/main/java/com/minelittlepony/unicopia/projectile/MagicProjectileEntity.java @@ -67,7 +67,7 @@ public class MagicProjectileEntity extends ThrownItemEntity implements Caster physics = new EntityPhysics<>(this, GRAVITY, false); + private final EntityPhysics physics = new EntityPhysics<>(this, GRAVITY); private final EntityReference homingTarget = new EntityReference<>(); private EntityReference owner; From e03fb016d51a3f9857ad2ca1f3ef0efc7d7bef3f Mon Sep 17 00:00:00 2001 From: Sollace Date: Tue, 27 Feb 2024 21:20:33 +0000 Subject: [PATCH 07/17] Fixed shields not deflecting projectiles --- .../java/com/minelittlepony/unicopia/EquinePredicates.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/minelittlepony/unicopia/EquinePredicates.java b/src/main/java/com/minelittlepony/unicopia/EquinePredicates.java index deedb819..de83f274 100644 --- a/src/main/java/com/minelittlepony/unicopia/EquinePredicates.java +++ b/src/main/java/com/minelittlepony/unicopia/EquinePredicates.java @@ -11,6 +11,7 @@ import com.minelittlepony.unicopia.item.enchantment.WantItNeedItEnchantment; import net.minecraft.entity.*; import net.minecraft.entity.decoration.AbstractDecorationEntity; import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.projectile.ProjectileEntity; import net.minecraft.entity.vehicle.BoatEntity; import net.minecraft.predicate.entity.EntityPredicates; @@ -34,7 +35,11 @@ public interface EquinePredicates { Predicate IS_CASTER = e -> !e.isRemoved() && (e instanceof Caster || IS_PLAYER.test(e)); Predicate IS_PLACED_SPELL = e -> e instanceof Caster && !e.isRemoved(); - Predicate IS_MAGIC_IMMUNE = e -> (e instanceof MagicImmune || !(e instanceof LivingEntity)) && !(e instanceof ItemEntity) && !(e instanceof ExperienceOrbEntity) && !(e instanceof BoatEntity); + Predicate IS_MAGIC_IMMUNE = e -> (e instanceof MagicImmune || !(e instanceof LivingEntity)) + && !(e instanceof ItemEntity) + && !(e instanceof ExperienceOrbEntity) + && !(e instanceof BoatEntity) + && !(e instanceof ProjectileEntity); Predicate EXCEPT_MAGIC_IMMUNE = IS_MAGIC_IMMUNE.negate(); Predicate VALID_LIVING_AND_NOT_MAGIC_IMMUNE = EntityPredicates.VALID_LIVING_ENTITY.and(EXCEPT_MAGIC_IMMUNE); From aa00b1a9b0dba31adefa572533dc2035de77d181 Mon Sep 17 00:00:00 2001 From: Sollace Date: Tue, 27 Feb 2024 21:20:50 +0000 Subject: [PATCH 08/17] Fixed shields rendering on players in the inventory screen --- .../client/render/spell/SpellEffectsRenderDispatcher.java | 8 ++++++++ .../mixin/client/MixinEntityRenderDispatcher.java | 8 +++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/minelittlepony/unicopia/client/render/spell/SpellEffectsRenderDispatcher.java b/src/main/java/com/minelittlepony/unicopia/client/render/spell/SpellEffectsRenderDispatcher.java index 37c4c51b..72d0db23 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/render/spell/SpellEffectsRenderDispatcher.java +++ b/src/main/java/com/minelittlepony/unicopia/client/render/spell/SpellEffectsRenderDispatcher.java @@ -79,6 +79,10 @@ public class SpellEffectsRenderDispatcher implements SynchronousResourceReloader } public void render(MatrixStack matrices, VertexConsumerProvider vertices, int light, Caster caster, float limbAngle, float limbDistance, float tickDelta, float animationProgress, float headYaw, float headPitch) { + if (!((RenderDispatcherAccessor)client.getEntityRenderDispatcher()).shouldRenderShadows()) { + return; + } + caster.getSpellSlot().forEach(spell -> { render(matrices, vertices, spell, caster, light, limbAngle, limbDistance, tickDelta, animationProgress, headYaw, headPitch); return Operation.SKIP; @@ -156,4 +160,8 @@ public class SpellEffectsRenderDispatcher implements SynchronousResourceReloader matrices.pop(); } } + + public interface RenderDispatcherAccessor { + boolean shouldRenderShadows(); + } } diff --git a/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinEntityRenderDispatcher.java b/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinEntityRenderDispatcher.java index 2d784220..c1954772 100644 --- a/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinEntityRenderDispatcher.java +++ b/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinEntityRenderDispatcher.java @@ -1,11 +1,13 @@ package com.minelittlepony.unicopia.mixin.client; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import com.minelittlepony.unicopia.client.render.WorldRenderDelegate; +import com.minelittlepony.unicopia.client.render.spell.SpellEffectsRenderDispatcher; import com.minelittlepony.unicopia.entity.Equine; import net.minecraft.client.render.VertexConsumerProvider; @@ -14,7 +16,7 @@ import net.minecraft.client.util.math.MatrixStack; import net.minecraft.entity.Entity; @Mixin(EntityRenderDispatcher.class) -abstract class MixinEntityRenderDispatcher { +abstract class MixinEntityRenderDispatcher implements SpellEffectsRenderDispatcher.RenderDispatcherAccessor { private static final String RENDER = "render(Lnet/minecraft/entity/Entity;DDDFFLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;I)V"; @@ -29,4 +31,8 @@ abstract class MixinEntityRenderDispatcher { private void afterRender(E entity, double x, double y, double z, float yaw, float tickDelta, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, CallbackInfo info) { Equine.of(entity).ifPresent(eq -> WorldRenderDelegate.INSTANCE.afterEntityRender(eq, matrices, vertexConsumers, light)); } + + @Accessor("renderShadows") + @Override + public abstract boolean shouldRenderShadows(); } From e21cffcf7de2b22413e8697099817abe95f89c44 Mon Sep 17 00:00:00 2001 From: Sollace Date: Tue, 27 Feb 2024 21:21:08 +0000 Subject: [PATCH 09/17] Butterflies will now follow the player if they're holding a flower --- .../unicopia/entity/mob/ButterflyEntity.java | 42 ++++++++++++++----- 1 file changed, 31 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/minelittlepony/unicopia/entity/mob/ButterflyEntity.java b/src/main/java/com/minelittlepony/unicopia/entity/mob/ButterflyEntity.java index 2fe5e15e..b313e4fb 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/mob/ButterflyEntity.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/mob/ButterflyEntity.java @@ -34,6 +34,8 @@ import net.minecraft.nbt.NbtCompound; import net.minecraft.predicate.entity.EntityPredicates; import net.minecraft.sound.SoundEvent; import net.minecraft.registry.tag.BlockTags; +import net.minecraft.registry.tag.ItemTags; +import net.minecraft.util.Hand; import net.minecraft.util.Identifier; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; @@ -151,6 +153,11 @@ public class ButterflyEntity extends AmbientEntity { if (e instanceof PlayerEntity) { PlayerEntity player = (PlayerEntity)e; + if (player.getStackInHand(Hand.MAIN_HAND).isIn(ItemTags.FLOWERS)) { + setTarget(player); + return false; + } + if (player.isCreative() || player.isSpectator()) { return false; } @@ -181,6 +188,7 @@ public class ButterflyEntity extends AmbientEntity { if (!flowerPosition.isPresent()) { setResting(false); return; + } if (getWorld().getBlockState(below).isAir() @@ -200,20 +208,32 @@ public class ButterflyEntity extends AmbientEntity { } else { ticksResting = 0; - updateFlowerPosition().map(flower -> { - if (flower.isWithinDistance(getPos(), 1)) { - setResting(true); - visited.put(flower, (long)age); - if (breedingCooldown <= 0) { - breedingCooldown = MAX_BREEDING_COOLDOWN / 10; - } + if (getTarget() instanceof PlayerEntity player) { + if (player.isRemoved() || !player.getStackInHand(Hand.MAIN_HAND).isIn(ItemTags.FLOWERS)) { + setTarget(null); } + if (distanceTo(player) > 3) { + moveTowards(player.getBlockPos()); + } else { + this.addVelocity(random.nextFloat() * 0.1 - 0.05F, random.nextFloat() * 0.1, random.nextFloat() * 0.1 - 0.05F); + } + } else { - return flower; - }).or(this::findNextHoverPosition).ifPresent(this::moveTowards); + updateFlowerPosition().map(flower -> { + if (flower.isWithinDistance(getPos(), 1)) { + setResting(true); + visited.put(flower, (long)age); + if (breedingCooldown <= 0) { + breedingCooldown = MAX_BREEDING_COOLDOWN / 10; + } + } - if (random.nextInt(100) == 0 && getWorld().getBlockState(below).isOpaque()) { - setResting(true); + return flower; + }).or(this::findNextHoverPosition).ifPresent(this::moveTowards); + + if (random.nextInt(100) == 0 && getWorld().getBlockState(below).isOpaque()) { + setResting(true); + } } } } From 975f49d390a46454be9acbdfd8b37d8f795ce527 Mon Sep 17 00:00:00 2001 From: Sollace Date: Wed, 28 Feb 2024 20:56:57 +0000 Subject: [PATCH 10/17] Create blockus addon --- BlockusAddon | 1 + 1 file changed, 1 insertion(+) create mode 160000 BlockusAddon diff --git a/BlockusAddon b/BlockusAddon new file mode 160000 index 00000000..c1839383 --- /dev/null +++ b/BlockusAddon @@ -0,0 +1 @@ +Subproject commit c183938375b36b5d296e937c533501fd0ee95dc0 From f0f02b478fd87f15b665005270d74915eeaaf261 Mon Sep 17 00:00:00 2001 From: Cryghast Date: Thu, 29 Feb 2024 23:12:53 +0800 Subject: [PATCH 11/17] update zh_cn.json --- src/main/resources/assets/unicopia/lang/zh_cn.json | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/resources/assets/unicopia/lang/zh_cn.json b/src/main/resources/assets/unicopia/lang/zh_cn.json index f15eb241..295bfc97 100644 --- a/src/main/resources/assets/unicopia/lang/zh_cn.json +++ b/src/main/resources/assets/unicopia/lang/zh_cn.json @@ -301,11 +301,11 @@ "block.unicopia.chitin": "几丁质块", "block.unicopia.chitin_spikes": "几丁质尖刺", "block.unicopia.chiselled_chitin": "雕纹几丁质块", - "block.unicopia.chiselled_chitin_hull": "雕纹几丁质船体", + "block.unicopia.chiselled_chitin_hull": "雕纹几丁质壁", "block.unicopia.chiselled_chitin_slab": "雕纹几丁质台阶", "block.unicopia.chiselled_chitin_stairs": "雕纹几丁质楼梯", - "block.unicopia.shaping_bench": "塑形长椅", + "block.unicopia.shaping_bench": "塑形台", "block.unicopia.cloud": "浮云", "block.unicopia.cloud_slab": "云台阶", "block.unicopia.cloud_stairs": "云楼梯", @@ -382,7 +382,7 @@ "effect.unicopia.change_race_hippogriff": "转生骏鹰", "effect.unicopia.morph_race_earth": "变身陆马", - "effect.unicopia.morph_race_unicopia": "变身独角兽", + "effect.unicopia.morph_race_unicorn": "变身独角兽", "effect.unicopia.morph_race_pegasus": "变身天马", "effect.unicopia.morph_race_changeling": "变身幻形灵", "effect.unicopia.morph_race_bat": "变身夜骐", @@ -617,6 +617,7 @@ "tag.unicopia.food_types.desserts": "甜品", "tag.unicopia.food_types.fruits_and_vegetables": "水果和蔬菜", "tag.unicopia.food_types.drinks": "饮品", + "tag.minecraft.leaves": "叶子", "tag.unicopia.food_types.forage_edible_filling": "大型植物料", "tag.unicopia.food_types.forage_edible": "植物料", From df0cc6d22524e2397facaf05ee60c2dcf6bf31f0 Mon Sep 17 00:00:00 2001 From: Sollace Date: Fri, 1 Mar 2024 23:28:01 +0000 Subject: [PATCH 12/17] Allow for placing our saplings in flower pots --- .gitignore | 2 +- .../unicopia/server/world/Tree.java | 17 +++++---- .../potted_golden_oak_sapling.json | 7 ++++ .../potted_green_apple_sapling.json | 7 ++++ .../blockstates/potted_mango_sapling.json | 7 ++++ .../blockstates/potted_palm_sapling.json | 7 ++++ .../potted_sour_apple_sapling.json | 7 ++++ .../potted_sweet_apple_sapling.json | 7 ++++ .../unicopia/blockstates/potted_zapling.json | 7 ++++ .../resources/assets/unicopia/lang/en_us.json | 7 ++++ .../block/potted_golden_oak_sapling.json | 6 ++++ .../block/potted_green_apple_sapling.json | 6 ++++ .../models/block/potted_mango_sapling.json | 6 ++++ .../models/block/potted_palm_sapling.json | 6 ++++ .../block/potted_sour_apple_sapling.json | 6 ++++ .../block/potted_sweet_apple_sapling.json | 6 ++++ .../unicopia/models/block/potted_zapling.json | 6 ++++ .../blocks/potted_golden_oak_sapling.json | 36 +++++++++++++++++++ .../blocks/potted_green_apple_sapling.json | 36 +++++++++++++++++++ .../blocks/potted_mango_sapling.json | 36 +++++++++++++++++++ .../blocks/potted_palm_sapling.json | 36 +++++++++++++++++++ .../blocks/potted_sour_apple_sapling.json | 36 +++++++++++++++++++ .../blocks/potted_sweet_apple_sapling.json | 36 +++++++++++++++++++ .../loot_tables/blocks/potted_zapling.json | 36 +++++++++++++++++++ 24 files changed, 361 insertions(+), 8 deletions(-) create mode 100644 src/main/resources/assets/unicopia/blockstates/potted_golden_oak_sapling.json create mode 100644 src/main/resources/assets/unicopia/blockstates/potted_green_apple_sapling.json create mode 100644 src/main/resources/assets/unicopia/blockstates/potted_mango_sapling.json create mode 100644 src/main/resources/assets/unicopia/blockstates/potted_palm_sapling.json create mode 100644 src/main/resources/assets/unicopia/blockstates/potted_sour_apple_sapling.json create mode 100644 src/main/resources/assets/unicopia/blockstates/potted_sweet_apple_sapling.json create mode 100644 src/main/resources/assets/unicopia/blockstates/potted_zapling.json create mode 100644 src/main/resources/assets/unicopia/models/block/potted_golden_oak_sapling.json create mode 100644 src/main/resources/assets/unicopia/models/block/potted_green_apple_sapling.json create mode 100644 src/main/resources/assets/unicopia/models/block/potted_mango_sapling.json create mode 100644 src/main/resources/assets/unicopia/models/block/potted_palm_sapling.json create mode 100644 src/main/resources/assets/unicopia/models/block/potted_sour_apple_sapling.json create mode 100644 src/main/resources/assets/unicopia/models/block/potted_sweet_apple_sapling.json create mode 100644 src/main/resources/assets/unicopia/models/block/potted_zapling.json create mode 100644 src/main/resources/data/unicopia/loot_tables/blocks/potted_golden_oak_sapling.json create mode 100644 src/main/resources/data/unicopia/loot_tables/blocks/potted_green_apple_sapling.json create mode 100644 src/main/resources/data/unicopia/loot_tables/blocks/potted_mango_sapling.json create mode 100644 src/main/resources/data/unicopia/loot_tables/blocks/potted_palm_sapling.json create mode 100644 src/main/resources/data/unicopia/loot_tables/blocks/potted_sour_apple_sapling.json create mode 100644 src/main/resources/data/unicopia/loot_tables/blocks/potted_sweet_apple_sapling.json create mode 100644 src/main/resources/data/unicopia/loot_tables/blocks/potted_zapling.json diff --git a/.gitignore b/.gitignore index 94183b67..f2cb75bf 100644 --- a/.gitignore +++ b/.gitignore @@ -15,4 +15,4 @@ ideas *.iml classes/ out/ -jars/ \ No newline at end of file +jars/ diff --git a/src/main/java/com/minelittlepony/unicopia/server/world/Tree.java b/src/main/java/com/minelittlepony/unicopia/server/world/Tree.java index 7128f919..089b1fd0 100644 --- a/src/main/java/com/minelittlepony/unicopia/server/world/Tree.java +++ b/src/main/java/com/minelittlepony/unicopia/server/world/Tree.java @@ -32,7 +32,8 @@ public record Tree ( TreeFeatureConfig.Builder config, RegistryKey> configuredFeatureId, Set placements, - Optional sapling + Optional sapling, + Optional pot ) { public static final List REGISTRY = new ArrayList<>(); @@ -133,6 +134,12 @@ public record Tree ( public Tree build() { RegistryKey> configuredFeatureId = RegistryKey.of(RegistryKeys.CONFIGURED_FEATURE, id); + Optional sapling = saplingId.map(id -> UBlocks.register(id, saplingConstructor.apply(new SaplingGenerator() { + @Override + protected RegistryKey> getTreeFeature(Random rng, boolean flowersNearby) { + return configuredFeatureId; + } + }, FabricBlockSettings.copy(Blocks.OAK_SAPLING)), ItemGroups.NATURAL)); Tree tree = new Tree(id, configParameters.apply(new TreeFeatureConfig.Builder( BlockStateProvider.of(logType), trunkPlacer, @@ -141,12 +148,8 @@ public record Tree ( size.get() )), configuredFeatureId, placements.values().stream() .collect(Collectors.toUnmodifiableSet()), - saplingId.map(id -> UBlocks.register(id, saplingConstructor.apply(new SaplingGenerator() { - @Override - protected RegistryKey> getTreeFeature(Random rng, boolean flowersNearby) { - return configuredFeatureId; - } - }, FabricBlockSettings.copy(Blocks.OAK_SAPLING)), ItemGroups.NATURAL))); + sapling, + sapling.map(saplingBlock -> Registry.register(Registries.BLOCK, saplingId.get().withPrefixedPath("potted_"), Blocks.createFlowerPotBlock(saplingBlock)))); if (REGISTRY.isEmpty()) { bootstrap(); diff --git a/src/main/resources/assets/unicopia/blockstates/potted_golden_oak_sapling.json b/src/main/resources/assets/unicopia/blockstates/potted_golden_oak_sapling.json new file mode 100644 index 00000000..0ceb8e14 --- /dev/null +++ b/src/main/resources/assets/unicopia/blockstates/potted_golden_oak_sapling.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "unicopia:block/potted_golden_oak_sapling" + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/unicopia/blockstates/potted_green_apple_sapling.json b/src/main/resources/assets/unicopia/blockstates/potted_green_apple_sapling.json new file mode 100644 index 00000000..69b2a3ca --- /dev/null +++ b/src/main/resources/assets/unicopia/blockstates/potted_green_apple_sapling.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "unicopia:block/potted_green_apple_sapling" + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/unicopia/blockstates/potted_mango_sapling.json b/src/main/resources/assets/unicopia/blockstates/potted_mango_sapling.json new file mode 100644 index 00000000..427a7b7c --- /dev/null +++ b/src/main/resources/assets/unicopia/blockstates/potted_mango_sapling.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "unicopia:block/potted_mango_sapling" + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/unicopia/blockstates/potted_palm_sapling.json b/src/main/resources/assets/unicopia/blockstates/potted_palm_sapling.json new file mode 100644 index 00000000..b73dcef1 --- /dev/null +++ b/src/main/resources/assets/unicopia/blockstates/potted_palm_sapling.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "unicopia:block/potted_palm_sapling" + } + } +} diff --git a/src/main/resources/assets/unicopia/blockstates/potted_sour_apple_sapling.json b/src/main/resources/assets/unicopia/blockstates/potted_sour_apple_sapling.json new file mode 100644 index 00000000..00aa2145 --- /dev/null +++ b/src/main/resources/assets/unicopia/blockstates/potted_sour_apple_sapling.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "unicopia:block/potted_sour_apple_sapling" + } + } +} diff --git a/src/main/resources/assets/unicopia/blockstates/potted_sweet_apple_sapling.json b/src/main/resources/assets/unicopia/blockstates/potted_sweet_apple_sapling.json new file mode 100644 index 00000000..b8106136 --- /dev/null +++ b/src/main/resources/assets/unicopia/blockstates/potted_sweet_apple_sapling.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "unicopia:block/potted_sweet_apple_sapling" + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/unicopia/blockstates/potted_zapling.json b/src/main/resources/assets/unicopia/blockstates/potted_zapling.json new file mode 100644 index 00000000..8e6fa653 --- /dev/null +++ b/src/main/resources/assets/unicopia/blockstates/potted_zapling.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "unicopia:block/potted_zapling" + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/unicopia/lang/en_us.json b/src/main/resources/assets/unicopia/lang/en_us.json index b0c81599..525c448b 100644 --- a/src/main/resources/assets/unicopia/lang/en_us.json +++ b/src/main/resources/assets/unicopia/lang/en_us.json @@ -228,6 +228,7 @@ "block.unicopia.spectral_fire": "Spectral Fire", "block.unicopia.bananas": "Bananas", "block.unicopia.zapling": "Zapling", + "block.unicopia.potted_zapling": "Potted Zapling", "block.unicopia.zap_log": "Zap Apple Log", "block.unicopia.zap_wood": "Zap Apple Wood", "block.unicopia.stripped_zap_log": "Stripped Zap Apple Log", @@ -251,6 +252,7 @@ "block.unicopia.zap_apple": "Zap Apple", "block.unicopia.zap_bulb": "Unripened Zap Apple", "block.unicopia.palm_sapling": "Palm Sapling", + "block.unicopia.potted_palm_sapling": "Potted Palm Sapling", "block.unicopia.palm_log": "Palm Log", "block.unicopia.palm_wood": "Palm Wood", "block.unicopia.palm_planks": "Palm Planks", @@ -273,11 +275,13 @@ "block.unicopia.gold_root": "Gold Root", "block.unicopia.golden_oak_sprout": "Golden Oak Sprout", "block.unicopia.golden_oak_sapling": "Golden Oak Sapling", + "block.unicopia.potted_golden_oak_sapling": "Potted Golden Oak Sapling", "block.unicopia.golden_oak_leaves": "Golden Oak Leaves", "block.unicopia.golden_oak_log": "Golden Oak Log", "block.unicopia.mango": "Mango", "block.unicopia.mango_leaves": "Mango Leaves", "block.unicopia.mango_sapling": "Mango Sapling", + "block.unicopia.potted_mango_sapling": "Potted Mango Sapling", "block.unicopia.pineapple": "Pineapple Plant", "block.unicopia.clam_shell": "Clam Shell", @@ -286,12 +290,15 @@ "block.unicopia.green_apple_leaves": "Granny Smith Leaves", "block.unicopia.green_apple_sapling": "Granny Smith Sapling", + "block.unicopia.potted_green_apple_sapling": "Potted Granny Smith Sapling", "block.unicopia.green_apple_sprout": "Granny Smith Sprout", "block.unicopia.sweet_apple_leaves": "Sweet Apple Leaves", "block.unicopia.sweet_apple_sapling": "Sweet Apple Sapling", + "block.unicopia.potted_sweet_apple_sapling": "Potted Sweet Apple Sapling", "block.unicopia.sweet_apple_sprout": "Sweet Apple Sprout", "block.unicopia.sour_apple_leaves": "Sour Apple Leaves", "block.unicopia.sour_apple_sapling": "Sour Apple Sapling", + "block.unicopia.potted_sour_apple_sapling": "Potted Sour Apple Sapling", "block.unicopia.sour_apple_sprout": "Sour Apple Sprout", "block.unicopia.surface_chitin": "Surface Chitin", diff --git a/src/main/resources/assets/unicopia/models/block/potted_golden_oak_sapling.json b/src/main/resources/assets/unicopia/models/block/potted_golden_oak_sapling.json new file mode 100644 index 00000000..96ab1741 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/block/potted_golden_oak_sapling.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/flower_pot_cross", + "textures": { + "plant": "unicopia:block/golden_oak_sapling" + } +} diff --git a/src/main/resources/assets/unicopia/models/block/potted_green_apple_sapling.json b/src/main/resources/assets/unicopia/models/block/potted_green_apple_sapling.json new file mode 100644 index 00000000..e9d2b784 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/block/potted_green_apple_sapling.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/flower_pot_cross", + "textures": { + "plant": "unicopia:block/green_apple_sapling" + } +} diff --git a/src/main/resources/assets/unicopia/models/block/potted_mango_sapling.json b/src/main/resources/assets/unicopia/models/block/potted_mango_sapling.json new file mode 100644 index 00000000..40bb156d --- /dev/null +++ b/src/main/resources/assets/unicopia/models/block/potted_mango_sapling.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/flower_pot_cross", + "textures": { + "plant": "unicopia:block/mango_sapling" + } +} diff --git a/src/main/resources/assets/unicopia/models/block/potted_palm_sapling.json b/src/main/resources/assets/unicopia/models/block/potted_palm_sapling.json new file mode 100644 index 00000000..72cf54e1 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/block/potted_palm_sapling.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/flower_pot_cross", + "textures": { + "plant": "unicopia:block/palm_sapling" + } +} diff --git a/src/main/resources/assets/unicopia/models/block/potted_sour_apple_sapling.json b/src/main/resources/assets/unicopia/models/block/potted_sour_apple_sapling.json new file mode 100644 index 00000000..5a51feda --- /dev/null +++ b/src/main/resources/assets/unicopia/models/block/potted_sour_apple_sapling.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/flower_pot_cross", + "textures": { + "plant": "unicopia:block/sour_apple_sapling" + } +} diff --git a/src/main/resources/assets/unicopia/models/block/potted_sweet_apple_sapling.json b/src/main/resources/assets/unicopia/models/block/potted_sweet_apple_sapling.json new file mode 100644 index 00000000..3eadea75 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/block/potted_sweet_apple_sapling.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/flower_pot_cross", + "textures": { + "plant": "unicopia:block/sweet_apple_sapling" + } +} diff --git a/src/main/resources/assets/unicopia/models/block/potted_zapling.json b/src/main/resources/assets/unicopia/models/block/potted_zapling.json new file mode 100644 index 00000000..d410f118 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/block/potted_zapling.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/flower_pot_cross", + "textures": { + "plant": "unicopia:block/zapling" + } +} diff --git a/src/main/resources/data/unicopia/loot_tables/blocks/potted_golden_oak_sapling.json b/src/main/resources/data/unicopia/loot_tables/blocks/potted_golden_oak_sapling.json new file mode 100644 index 00000000..514f8e3a --- /dev/null +++ b/src/main/resources/data/unicopia/loot_tables/blocks/potted_golden_oak_sapling.json @@ -0,0 +1,36 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:flower_pot" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "unicopia:golden_oak_sapling" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "minecraft:blocks/potted_dead_bush" +} diff --git a/src/main/resources/data/unicopia/loot_tables/blocks/potted_green_apple_sapling.json b/src/main/resources/data/unicopia/loot_tables/blocks/potted_green_apple_sapling.json new file mode 100644 index 00000000..a648cbaf --- /dev/null +++ b/src/main/resources/data/unicopia/loot_tables/blocks/potted_green_apple_sapling.json @@ -0,0 +1,36 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:flower_pot" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "unicopia:green_apple_sapling" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "minecraft:blocks/potted_dead_bush" +} diff --git a/src/main/resources/data/unicopia/loot_tables/blocks/potted_mango_sapling.json b/src/main/resources/data/unicopia/loot_tables/blocks/potted_mango_sapling.json new file mode 100644 index 00000000..72ffe675 --- /dev/null +++ b/src/main/resources/data/unicopia/loot_tables/blocks/potted_mango_sapling.json @@ -0,0 +1,36 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:flower_pot" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "unicopia:mango_sapling" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "minecraft:blocks/potted_dead_bush" +} diff --git a/src/main/resources/data/unicopia/loot_tables/blocks/potted_palm_sapling.json b/src/main/resources/data/unicopia/loot_tables/blocks/potted_palm_sapling.json new file mode 100644 index 00000000..8428fcdc --- /dev/null +++ b/src/main/resources/data/unicopia/loot_tables/blocks/potted_palm_sapling.json @@ -0,0 +1,36 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:flower_pot" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "unicopia:palm_sapling" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "minecraft:blocks/potted_dead_bush" +} diff --git a/src/main/resources/data/unicopia/loot_tables/blocks/potted_sour_apple_sapling.json b/src/main/resources/data/unicopia/loot_tables/blocks/potted_sour_apple_sapling.json new file mode 100644 index 00000000..6e5b7e92 --- /dev/null +++ b/src/main/resources/data/unicopia/loot_tables/blocks/potted_sour_apple_sapling.json @@ -0,0 +1,36 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:flower_pot" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "unicopia:sour_apple_sapling" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "minecraft:blocks/potted_dead_bush" +} diff --git a/src/main/resources/data/unicopia/loot_tables/blocks/potted_sweet_apple_sapling.json b/src/main/resources/data/unicopia/loot_tables/blocks/potted_sweet_apple_sapling.json new file mode 100644 index 00000000..bc6aff30 --- /dev/null +++ b/src/main/resources/data/unicopia/loot_tables/blocks/potted_sweet_apple_sapling.json @@ -0,0 +1,36 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:flower_pot" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "unicopia:sweet_apple_sapling" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "minecraft:blocks/potted_dead_bush" +} diff --git a/src/main/resources/data/unicopia/loot_tables/blocks/potted_zapling.json b/src/main/resources/data/unicopia/loot_tables/blocks/potted_zapling.json new file mode 100644 index 00000000..a93849c6 --- /dev/null +++ b/src/main/resources/data/unicopia/loot_tables/blocks/potted_zapling.json @@ -0,0 +1,36 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:flower_pot" + } + ], + "rolls": 1.0 + }, + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "unicopia:zapling" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "minecraft:blocks/potted_dead_bush" +} From 06015ee10b2d9f888a9f39a4f1c1b0a8b59b6b46 Mon Sep 17 00:00:00 2001 From: Sollace Date: Fri, 1 Mar 2024 23:28:12 +0000 Subject: [PATCH 13/17] Bump blockus addon --- BlockusAddon | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BlockusAddon b/BlockusAddon index c1839383..dcde57ad 160000 --- a/BlockusAddon +++ b/BlockusAddon @@ -1 +1 @@ -Subproject commit c183938375b36b5d296e937c533501fd0ee95dc0 +Subproject commit dcde57ad9209e39914835b2d493d0bf289a4f62e From 2f74a90afc02f9492d440258503d4a0c3b746fae Mon Sep 17 00:00:00 2001 From: Sollace Date: Sat, 2 Mar 2024 00:35:23 +0000 Subject: [PATCH 14/17] Le fixes --- .../java/com/minelittlepony/unicopia/server/world/Tree.java | 6 +++++- .../unicopia/models/block/potted_golden_oak_sapling.json | 2 +- .../unicopia/models/block/potted_green_apple_sapling.json | 2 +- .../assets/unicopia/models/block/potted_mango_sapling.json | 2 +- .../assets/unicopia/models/block/potted_palm_sapling.json | 2 +- .../unicopia/models/block/potted_sour_apple_sapling.json | 2 +- .../unicopia/models/block/potted_sweet_apple_sapling.json | 2 +- .../assets/unicopia/models/block/potted_zapling.json | 2 +- 8 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/minelittlepony/unicopia/server/world/Tree.java b/src/main/java/com/minelittlepony/unicopia/server/world/Tree.java index 089b1fd0..c85fa322 100644 --- a/src/main/java/com/minelittlepony/unicopia/server/world/Tree.java +++ b/src/main/java/com/minelittlepony/unicopia/server/world/Tree.java @@ -149,7 +149,11 @@ public record Tree ( )), configuredFeatureId, placements.values().stream() .collect(Collectors.toUnmodifiableSet()), sapling, - sapling.map(saplingBlock -> Registry.register(Registries.BLOCK, saplingId.get().withPrefixedPath("potted_"), Blocks.createFlowerPotBlock(saplingBlock)))); + sapling.map(saplingBlock -> { + Block flowerPot = Registry.register(Registries.BLOCK, saplingId.get().withPrefixedPath("potted_"), Blocks.createFlowerPotBlock(saplingBlock)); + UBlocks.TRANSLUCENT_BLOCKS.add(flowerPot); + return flowerPot; + })); if (REGISTRY.isEmpty()) { bootstrap(); diff --git a/src/main/resources/assets/unicopia/models/block/potted_golden_oak_sapling.json b/src/main/resources/assets/unicopia/models/block/potted_golden_oak_sapling.json index 96ab1741..3423faef 100644 --- a/src/main/resources/assets/unicopia/models/block/potted_golden_oak_sapling.json +++ b/src/main/resources/assets/unicopia/models/block/potted_golden_oak_sapling.json @@ -1,6 +1,6 @@ { "parent": "minecraft:block/flower_pot_cross", "textures": { - "plant": "unicopia:block/golden_oak_sapling" + "plant": "unicopia:item/golden_oak_sapling" } } diff --git a/src/main/resources/assets/unicopia/models/block/potted_green_apple_sapling.json b/src/main/resources/assets/unicopia/models/block/potted_green_apple_sapling.json index e9d2b784..b2d76a3a 100644 --- a/src/main/resources/assets/unicopia/models/block/potted_green_apple_sapling.json +++ b/src/main/resources/assets/unicopia/models/block/potted_green_apple_sapling.json @@ -1,6 +1,6 @@ { "parent": "minecraft:block/flower_pot_cross", "textures": { - "plant": "unicopia:block/green_apple_sapling" + "plant": "unicopia:item/green_apple_sapling" } } diff --git a/src/main/resources/assets/unicopia/models/block/potted_mango_sapling.json b/src/main/resources/assets/unicopia/models/block/potted_mango_sapling.json index 40bb156d..c076b71d 100644 --- a/src/main/resources/assets/unicopia/models/block/potted_mango_sapling.json +++ b/src/main/resources/assets/unicopia/models/block/potted_mango_sapling.json @@ -1,6 +1,6 @@ { "parent": "minecraft:block/flower_pot_cross", "textures": { - "plant": "unicopia:block/mango_sapling" + "plant": "unicopia:item/mango_sapling" } } diff --git a/src/main/resources/assets/unicopia/models/block/potted_palm_sapling.json b/src/main/resources/assets/unicopia/models/block/potted_palm_sapling.json index 72cf54e1..37ca7b25 100644 --- a/src/main/resources/assets/unicopia/models/block/potted_palm_sapling.json +++ b/src/main/resources/assets/unicopia/models/block/potted_palm_sapling.json @@ -1,6 +1,6 @@ { "parent": "minecraft:block/flower_pot_cross", "textures": { - "plant": "unicopia:block/palm_sapling" + "plant": "unicopia:item/palm_sapling" } } diff --git a/src/main/resources/assets/unicopia/models/block/potted_sour_apple_sapling.json b/src/main/resources/assets/unicopia/models/block/potted_sour_apple_sapling.json index 5a51feda..6a5cd19e 100644 --- a/src/main/resources/assets/unicopia/models/block/potted_sour_apple_sapling.json +++ b/src/main/resources/assets/unicopia/models/block/potted_sour_apple_sapling.json @@ -1,6 +1,6 @@ { "parent": "minecraft:block/flower_pot_cross", "textures": { - "plant": "unicopia:block/sour_apple_sapling" + "plant": "unicopia:item/sour_apple_sapling" } } diff --git a/src/main/resources/assets/unicopia/models/block/potted_sweet_apple_sapling.json b/src/main/resources/assets/unicopia/models/block/potted_sweet_apple_sapling.json index 3eadea75..84f2327a 100644 --- a/src/main/resources/assets/unicopia/models/block/potted_sweet_apple_sapling.json +++ b/src/main/resources/assets/unicopia/models/block/potted_sweet_apple_sapling.json @@ -1,6 +1,6 @@ { "parent": "minecraft:block/flower_pot_cross", "textures": { - "plant": "unicopia:block/sweet_apple_sapling" + "plant": "unicopia:item/sweet_apple_sapling" } } diff --git a/src/main/resources/assets/unicopia/models/block/potted_zapling.json b/src/main/resources/assets/unicopia/models/block/potted_zapling.json index d410f118..24cd445e 100644 --- a/src/main/resources/assets/unicopia/models/block/potted_zapling.json +++ b/src/main/resources/assets/unicopia/models/block/potted_zapling.json @@ -1,6 +1,6 @@ { "parent": "minecraft:block/flower_pot_cross", "textures": { - "plant": "unicopia:block/zapling" + "plant": "unicopia:item/zapling" } } From b6f71400a9be37636aa085047367d950fff91283 Mon Sep 17 00:00:00 2001 From: Sollace Date: Sat, 2 Mar 2024 15:01:11 +0000 Subject: [PATCH 15/17] Update blockus addon --- BlockusAddon | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BlockusAddon b/BlockusAddon index dcde57ad..877b4f6a 160000 --- a/BlockusAddon +++ b/BlockusAddon @@ -1 +1 @@ -Subproject commit dcde57ad9209e39914835b2d493d0bf289a4f62e +Subproject commit 877b4f6a1b5aaa9601a5b6bd6c0f353ab21fa92b From 58b134577f2708fe9949d3fa75b4d840d93673ed Mon Sep 17 00:00:00 2001 From: Sollace Date: Sat, 2 Mar 2024 15:12:15 +0000 Subject: [PATCH 16/17] Update blockus ref --- BlockusAddon | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BlockusAddon b/BlockusAddon index 877b4f6a..ec6ea81e 160000 --- a/BlockusAddon +++ b/BlockusAddon @@ -1 +1 @@ -Subproject commit 877b4f6a1b5aaa9601a5b6bd6c0f353ab21fa92b +Subproject commit ec6ea81ed5f0862ab2dfa6201c66504287e3ef76 From 75d41c14680cf725d84b23c813fc924eea66d365 Mon Sep 17 00:00:00 2001 From: Sollace Date: Sat, 2 Mar 2024 15:40:07 +0000 Subject: [PATCH 17/17] Bump blockus --- BlockusAddon | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BlockusAddon b/BlockusAddon index ec6ea81e..94ff5bab 160000 --- a/BlockusAddon +++ b/BlockusAddon @@ -1 +1 @@ -Subproject commit ec6ea81ed5f0862ab2dfa6201c66504287e3ef76 +Subproject commit 94ff5babb976911f46d7efcdad2586652fb33047