From 2abeff576794bbc262bd3b6332d297649487dcdc Mon Sep 17 00:00:00 2001 From: Sollace Date: Sun, 18 Feb 2024 14:37:49 +0000 Subject: [PATCH 01/14] Disable leaf flowers on fast graphics --- .../unicopia/block/FruitBearingBlock.java | 3 -- .../unicopia/compat/sodium/Impl.java | 17 +++++++++++ .../compat/sodium/SodiumDelegate.java | 19 ++++++++++++ .../mixin/client/MixinBlockModels.java | 29 +++++++++++++++++++ src/main/resources/unicopia.mixin.json | 1 + 5 files changed, 66 insertions(+), 3 deletions(-) create mode 100644 src/main/java/com/minelittlepony/unicopia/compat/sodium/Impl.java create mode 100644 src/main/java/com/minelittlepony/unicopia/compat/sodium/SodiumDelegate.java create mode 100644 src/main/java/com/minelittlepony/unicopia/mixin/client/MixinBlockModels.java diff --git a/src/main/java/com/minelittlepony/unicopia/block/FruitBearingBlock.java b/src/main/java/com/minelittlepony/unicopia/block/FruitBearingBlock.java index 2009d87a..51c7b4a2 100644 --- a/src/main/java/com/minelittlepony/unicopia/block/FruitBearingBlock.java +++ b/src/main/java/com/minelittlepony/unicopia/block/FruitBearingBlock.java @@ -29,8 +29,6 @@ public class FruitBearingBlock extends LeavesBlock implements TintedBlock, Bucka public static final int WITHER_AGE = 15; public static final EnumProperty STAGE = EnumProperty.of("stage", Stage.class); - public static final List REGISTRY = new ArrayList<>(); - private final Supplier fruit; private final Supplier rottenFruitSupplier; @@ -47,7 +45,6 @@ public class FruitBearingBlock extends LeavesBlock implements TintedBlock, Bucka this.overlay = overlay; this.fruit = fruit; this.rottenFruitSupplier = rottenFruitSupplier; - REGISTRY.add(this); FlammableBlockRegistry.getDefaultInstance().add(this, 30, 60); } diff --git a/src/main/java/com/minelittlepony/unicopia/compat/sodium/Impl.java b/src/main/java/com/minelittlepony/unicopia/compat/sodium/Impl.java new file mode 100644 index 00000000..32b6d887 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/compat/sodium/Impl.java @@ -0,0 +1,17 @@ +package com.minelittlepony.unicopia.compat.sodium; + +import me.jellysquid.mods.sodium.client.SodiumClientMod; +import net.fabricmc.fabric.api.util.TriState; + +public class Impl implements SodiumDelegate { + static Impl INSTANCE = new Impl(); + + @Override + public TriState isFancyLeavesOrBetter() { + return switch (SodiumClientMod.options().quality.leavesQuality) { + case FAST -> TriState.FALSE; + case FANCY -> TriState.TRUE; + case DEFAULT -> TriState.DEFAULT; + }; + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/compat/sodium/SodiumDelegate.java b/src/main/java/com/minelittlepony/unicopia/compat/sodium/SodiumDelegate.java new file mode 100644 index 00000000..c3cbb465 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/compat/sodium/SodiumDelegate.java @@ -0,0 +1,19 @@ +package com.minelittlepony.unicopia.compat.sodium; + +import net.fabricmc.fabric.api.util.TriState; +import net.fabricmc.loader.api.FabricLoader; + +public interface SodiumDelegate { + SodiumDelegate EMPTY = new SodiumDelegate() {}; + + static SodiumDelegate getInstance() { + if (FabricLoader.getInstance().isModLoaded("sodium")) { + return Impl.INSTANCE; + } + return EMPTY; + } + + default TriState isFancyLeavesOrBetter() { + return TriState.DEFAULT; + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinBlockModels.java b/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinBlockModels.java new file mode 100644 index 00000000..fad25baa --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinBlockModels.java @@ -0,0 +1,29 @@ +package com.minelittlepony.unicopia.mixin.client; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyVariable; + +import com.minelittlepony.unicopia.block.FruitBearingBlock; +import com.minelittlepony.unicopia.compat.sodium.SodiumDelegate; + +import net.minecraft.block.BlockState; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.render.block.BlockModels; + +@Mixin(BlockModels.class) +abstract class MixinBlockModels { + @ModifyVariable( + method = "getModel(Lnet/minecraft/block/BlockState;)Lnet/minecraft/client/render/model/BakedModel;", + at = @At("HEAD"), + argsOnly = true, + ordinal = 0 + ) + private BlockState getAppearance(BlockState state) { + if (state.contains(FruitBearingBlock.STAGE) + && !SodiumDelegate.getInstance().isFancyLeavesOrBetter().orElse(MinecraftClient.isFancyGraphicsOrBetter())) { + return state.with(FruitBearingBlock.STAGE, FruitBearingBlock.Stage.IDLE); + } + return state; + } +} diff --git a/src/main/resources/unicopia.mixin.json b/src/main/resources/unicopia.mixin.json index 20a09367..5cdd7249 100644 --- a/src/main/resources/unicopia.mixin.json +++ b/src/main/resources/unicopia.mixin.json @@ -65,6 +65,7 @@ "client.MixinAnimalModel", "client.MixinArmorFeatureRenderer", "client.MixinBackgroundRenderer", + "client.MixinBlockModels", "client.MixinCamera", "client.MixinClientWorld", "client.MixinClientPlayNetworkHandler", From d07b7bd5a2be2c19ca0db24cdf2a63f00b54db91 Mon Sep 17 00:00:00 2001 From: Sollace Date: Sun, 18 Feb 2024 14:39:18 +0000 Subject: [PATCH 02/14] Fix crash when discarding a spell --- .../unicopia/ability/magic/spell/PlaceableSpell.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/PlaceableSpell.java b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/PlaceableSpell.java index 9a135942..51c26ea8 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/PlaceableSpell.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/PlaceableSpell.java @@ -103,7 +103,8 @@ public class PlaceableSpell extends AbstractDelegatingSpell implements OrientedS @Override public Collection getDelegates() { - return List.of(spell.get()); + Spell spell = this.spell.get(); + return spell == null ? List.of() : List.of(spell); } @Override From 0560ff55566e7c98099d585c820d35452619b9a2 Mon Sep 17 00:00:00 2001 From: Sollace Date: Sun, 18 Feb 2024 14:42:42 +0000 Subject: [PATCH 03/14] Remove terrain adaptation from floating islands because it still looks weird --- .../data/unicopia/worldgen/structure/floating_island.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/data/unicopia/worldgen/structure/floating_island.json b/src/main/resources/data/unicopia/worldgen/structure/floating_island.json index 4a2d3351..06894644 100644 --- a/src/main/resources/data/unicopia/worldgen/structure/floating_island.json +++ b/src/main/resources/data/unicopia/worldgen/structure/floating_island.json @@ -10,6 +10,6 @@ }, "start_pool": "unicopia:clouds/start", "step": "surface_structures", - "terrain_adaptation": "beard_thin", + "terrain_adaptation": "none", "use_expansion_hack": true } \ No newline at end of file From de016d30dd61b9cd695e2dd83a67fec4f8a1c526 Mon Sep 17 00:00:00 2001 From: Sollace Date: Sun, 18 Feb 2024 14:46:20 +0000 Subject: [PATCH 04/14] Make stressed and heavy enchantments less common --- .../unicopia/item/enchantment/UEnchantments.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/minelittlepony/unicopia/item/enchantment/UEnchantments.java b/src/main/java/com/minelittlepony/unicopia/item/enchantment/UEnchantments.java index 559e9406..5b719f14 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/enchantment/UEnchantments.java +++ b/src/main/java/com/minelittlepony/unicopia/item/enchantment/UEnchantments.java @@ -35,7 +35,7 @@ public interface UEnchantments { /** * Heavy players move more slowly but are less likely to be flung around wildly. */ - Enchantment HEAVY = register("heavy", new AttributedEnchantment(Options.armor().rarity(Rarity.UNCOMMON).maxLevel(4))) + Enchantment HEAVY = register("heavy", new AttributedEnchantment(Options.armor().rarity(Rarity.RARE).maxLevel(4))) .addModifier(EntityAttributes.GENERIC_MOVEMENT_SPEED, (user, level) -> { return new EntityAttributeModifier(UUID.fromString("a3d5a94f-4c40-48f6-a343-558502a13e10"), "Heavyness", (1 - level/(float)10) - 1, Operation.MULTIPLY_TOTAL); }); @@ -72,7 +72,7 @@ public interface UEnchantments { /** * Who doesn't like a good freakout? */ - Enchantment STRESSED = register("stressed", new StressfulEnchantment(Options.allItems().rarity(Rarity.RARE).curse().treasure().maxLevel(3))); + Enchantment STRESSED = register("stressed", new StressfulEnchantment(Options.allItems().rarity(Rarity.VERY_RARE).curse().treasure().maxLevel(3))); /** * This item just wants to be held. From cdfc4babb40d979d9989787b1cf3c1d7fb96c2b6 Mon Sep 17 00:00:00 2001 From: Sollace Date: Tue, 20 Feb 2024 18:40:04 +0000 Subject: [PATCH 05/14] Fix leaf flowers rendering on fast graphics --- build.gradle | 7 ++- gradle.properties | 12 +++-- .../unicopia/client/URenderers.java | 1 + .../client/render/LeavesAdditionsModel.java | 54 +++++++++++++++++++ .../unicopia/compat/sodium/Impl.java | 17 ------ .../compat/sodium/SodiumDelegate.java | 19 ------- .../enchantment/StressfulEnchantment.java | 16 +++++- .../mixin/client/MixinBlockModels.java | 29 ---------- .../blockstates/green_apple_leaves.json | 19 +++---- .../blockstates/sour_apple_leaves.json | 19 +++---- .../blockstates/sweet_apple_leaves.json | 19 +++---- .../block/green_apple_leaves_flowering.json | 5 +- .../block/sour_apple_leaves_flowering.json | 5 +- .../block/sweet_apple_leaves_flowering.json | 37 +++---------- src/main/resources/unicopia.mixin.json | 1 - 15 files changed, 113 insertions(+), 147 deletions(-) create mode 100644 src/main/java/com/minelittlepony/unicopia/client/render/LeavesAdditionsModel.java delete mode 100644 src/main/java/com/minelittlepony/unicopia/compat/sodium/Impl.java delete mode 100644 src/main/java/com/minelittlepony/unicopia/compat/sodium/SodiumDelegate.java delete mode 100644 src/main/java/com/minelittlepony/unicopia/mixin/client/MixinBlockModels.java diff --git a/build.gradle b/build.gradle index 5d45804e..a24981db 100644 --- a/build.gradle +++ b/build.gradle @@ -44,6 +44,7 @@ repositories { maven { name 'minelp-snapshot'; url 'https://repo.minelittlepony-mod.com/maven/snapshot' } maven { name 'minelp-releases'; url 'https://repo.minelittlepony-mod.com/maven/release' } maven { name 'TerraformersMC'; url 'https://maven.terraformersmc.com/' } + maven { name 'Nodium'; url 'https://maven.cafeteria.dev/releases/' } maven { name 'Modrinth'; url 'https://api.modrinth.com/maven' } maven { name 'JitPack'; url 'https://jitpack.io'; content { includeGroup "com.github.Virtuoel" } } } @@ -73,6 +74,9 @@ dependencies { modImplementation "com.terraformersmc.terraform-api:terraform-wood-api-v1:${project.terraformer_api_version}" include "com.terraformersmc.terraform-api:terraform-wood-api-v1:${project.terraformer_api_version}" + + modImplementation "me.luligabi:NoIndium:${project.nodium_version}" + include "me.luligabi:NoIndium:${project.nodium_version}" modCompileOnly "maven.modrinth:farmers-delight-fabric:${project.farmers_delight_version}", { exclude group: "net.fabricmc.fabric-api" } if (project.use_pehkui == '1') { @@ -81,8 +85,9 @@ dependencies { } if (project.use_sodium == '1') { + modCompileOnly "maven.modrinth:indium:${project.indium_version}", { exclude group: "net.fabricmc.fabric-api" } modCompileOnly "maven.modrinth:sodium:${project.sodium_version}", { exclude group: "net.fabricmc.fabric-api" } - modCompileOnly "maven.modrinth:iris:${project.iris_version}", { exclude group: "net.fabricmc.fabric-api" } + // modCompileOnly "maven.modrinth:iris:${project.iris_version}", { exclude group: "net.fabricmc.fabric-api" } } if (project.tmi_type == 'emi') { diff --git a/gradle.properties b/gradle.properties index 950040b3..b83bd439 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,9 +4,9 @@ org.gradle.daemon=false # Fabric Properties # check these on https://fabricmc.net/develop minecraft_version=1.20.1 - yarn_mappings=1.20.1+build.9 - loader_version=0.14.21 - fabric_version=0.85.0+1.20.1 + yarn_mappings=1.20.1+build.10 + loader_version=0.15.7 + fabric_version=0.92.0+1.20.1 # Mod Properties group=com.minelittlepony @@ -27,6 +27,7 @@ org.gradle.daemon=false reach_attributes_version=2.3.4 trinkets_version=3.7.1 terraformer_api_version=7.0.0-beta.1 + nodium_version=1.1.0+1.20 # Testing use_pehkui=0 @@ -34,8 +35,9 @@ org.gradle.daemon=false farmers_delight_version=1.4.3 pehkui_version=3.7.8+1.14.4-1.20.1 - iris_version=1.6.8+1.20.1 - sodium_version=mc1.20.1-0.5.2 + iris_version=1.6.17+1.20.1 + sodium_version=mc1.20.1-0.5.8 + indium_version=1.0.30+mc1.20.4 # TMI Testing tmi_type=emi diff --git a/src/main/java/com/minelittlepony/unicopia/client/URenderers.java b/src/main/java/com/minelittlepony/unicopia/client/URenderers.java index 4f436d79..2d7155b2 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/URenderers.java +++ b/src/main/java/com/minelittlepony/unicopia/client/URenderers.java @@ -156,6 +156,7 @@ public interface URenderers { BlockRenderLayerMap.INSTANCE.putBlocks(RenderLayer.getTranslucent(), UBlocks.SEMI_TRANSPARENT_BLOCKS.stream().toArray(Block[]::new)); // for lava boats BlockRenderLayerMap.INSTANCE.putFluids(RenderLayer.getTranslucent(), Fluids.LAVA, Fluids.FLOWING_LAVA); + LeavesAdditionsModel.bootstrap(); TerraformBoatClientHelper.registerModelLayers(Unicopia.id("palm"), false); diff --git a/src/main/java/com/minelittlepony/unicopia/client/render/LeavesAdditionsModel.java b/src/main/java/com/minelittlepony/unicopia/client/render/LeavesAdditionsModel.java new file mode 100644 index 00000000..8fb9735d --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/client/render/LeavesAdditionsModel.java @@ -0,0 +1,54 @@ +package com.minelittlepony.unicopia.client.render; + +import java.util.function.Supplier; + +import com.minelittlepony.unicopia.block.FruitBearingBlock; + +import net.fabricmc.fabric.api.client.model.loading.v1.ModelLoadingPlugin; +import net.fabricmc.fabric.api.client.model.loading.v1.ModelModifier; +import net.fabricmc.fabric.api.renderer.v1.RendererAccess; +import net.fabricmc.fabric.api.renderer.v1.material.BlendMode; +import net.fabricmc.fabric.api.renderer.v1.material.MaterialFinder; +import net.fabricmc.fabric.api.renderer.v1.model.ForwardingBakedModel; +import net.fabricmc.fabric.api.renderer.v1.render.RenderContext; +import net.minecraft.block.BlockState; +import net.minecraft.client.render.model.BakedModel; +import net.minecraft.registry.Registries; +import net.minecraft.util.Identifier; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.random.Random; +import net.minecraft.world.BlockRenderView; + +public final class LeavesAdditionsModel extends ForwardingBakedModel { + public static void bootstrap() { + ModelLoadingPlugin.register(ctx -> { + ctx.modifyModelAfterBake().register(ModelModifier.WRAP_PHASE, (model, context) -> { + Identifier id = context.id(); + if (!id.getPath().endsWith("_flowering") || !(Registries.BLOCK.get(id.withPath(p -> p.replace("block/", "").replace("_flowering", ""))) instanceof FruitBearingBlock)) { + return model; + } + return model == null ? null : new LeavesAdditionsModel(model); + }); + }); + } + + private LeavesAdditionsModel(BakedModel model) { + this.wrapped = model; + } + + @Override + public boolean isVanillaAdapter() { + return false; + } + + @Override + public void emitBlockQuads(BlockRenderView blockView, BlockState state, BlockPos pos, Supplier randomSupplier, RenderContext context) { + MaterialFinder finder = RendererAccess.INSTANCE.getRenderer().materialFinder(); + context.pushTransform(quad -> { + quad.material(finder.copyFrom(quad.material()).blendMode(BlendMode.CUTOUT).find()); + return true; + }); + super.emitBlockQuads(blockView, state, pos, randomSupplier, context); + context.popTransform(); + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/compat/sodium/Impl.java b/src/main/java/com/minelittlepony/unicopia/compat/sodium/Impl.java deleted file mode 100644 index 32b6d887..00000000 --- a/src/main/java/com/minelittlepony/unicopia/compat/sodium/Impl.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.minelittlepony.unicopia.compat.sodium; - -import me.jellysquid.mods.sodium.client.SodiumClientMod; -import net.fabricmc.fabric.api.util.TriState; - -public class Impl implements SodiumDelegate { - static Impl INSTANCE = new Impl(); - - @Override - public TriState isFancyLeavesOrBetter() { - return switch (SodiumClientMod.options().quality.leavesQuality) { - case FAST -> TriState.FALSE; - case FANCY -> TriState.TRUE; - case DEFAULT -> TriState.DEFAULT; - }; - } -} diff --git a/src/main/java/com/minelittlepony/unicopia/compat/sodium/SodiumDelegate.java b/src/main/java/com/minelittlepony/unicopia/compat/sodium/SodiumDelegate.java deleted file mode 100644 index c3cbb465..00000000 --- a/src/main/java/com/minelittlepony/unicopia/compat/sodium/SodiumDelegate.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.minelittlepony.unicopia.compat.sodium; - -import net.fabricmc.fabric.api.util.TriState; -import net.fabricmc.loader.api.FabricLoader; - -public interface SodiumDelegate { - SodiumDelegate EMPTY = new SodiumDelegate() {}; - - static SodiumDelegate getInstance() { - if (FabricLoader.getInstance().isModLoaded("sodium")) { - return Impl.INSTANCE; - } - return EMPTY; - } - - default TriState isFancyLeavesOrBetter() { - return TriState.DEFAULT; - } -} diff --git a/src/main/java/com/minelittlepony/unicopia/item/enchantment/StressfulEnchantment.java b/src/main/java/com/minelittlepony/unicopia/item/enchantment/StressfulEnchantment.java index 56b8e9a9..aac70928 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/enchantment/StressfulEnchantment.java +++ b/src/main/java/com/minelittlepony/unicopia/item/enchantment/StressfulEnchantment.java @@ -5,6 +5,8 @@ import com.minelittlepony.unicopia.entity.player.MagicReserves.Bar; import com.minelittlepony.unicopia.entity.player.Pony; +import net.minecraft.entity.mob.HostileEntity; + public class StressfulEnchantment extends SimpleEnchantment { protected StressfulEnchantment(Options options) { @@ -13,8 +15,18 @@ public class StressfulEnchantment extends SimpleEnchantment { @Override public void onUserTick(Living user, int level) { - if (user instanceof Pony) { - Bar bar = ((Pony)user).getMagicalReserves().getEnergy(); + if (user instanceof Pony pony && pony.asEntity().age % 10 == 0) { + int range = (level + 1) * 3; + if (pony.asWorld().getEntitiesByClass(HostileEntity.class, user.asEntity().getBoundingBox().expand(range, 0, range), enemy -> { + return enemy != null + && enemy.canTarget(user.asEntity()) + && enemy.canSee(user.asEntity()) + && enemy.getTarget() == user.asEntity(); + }).isEmpty()) { + return; + } + + Bar bar = pony.getMagicalReserves().getEnergy(); float targetPercent = (level / (float)getMaxLevel()) * 0.05125F; float increase = 1F + (level * level)/100F; if (bar.getPercentFill() < targetPercent) { diff --git a/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinBlockModels.java b/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinBlockModels.java deleted file mode 100644 index fad25baa..00000000 --- a/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinBlockModels.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.minelittlepony.unicopia.mixin.client; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.ModifyVariable; - -import com.minelittlepony.unicopia.block.FruitBearingBlock; -import com.minelittlepony.unicopia.compat.sodium.SodiumDelegate; - -import net.minecraft.block.BlockState; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.render.block.BlockModels; - -@Mixin(BlockModels.class) -abstract class MixinBlockModels { - @ModifyVariable( - method = "getModel(Lnet/minecraft/block/BlockState;)Lnet/minecraft/client/render/model/BakedModel;", - at = @At("HEAD"), - argsOnly = true, - ordinal = 0 - ) - private BlockState getAppearance(BlockState state) { - if (state.contains(FruitBearingBlock.STAGE) - && !SodiumDelegate.getInstance().isFancyLeavesOrBetter().orElse(MinecraftClient.isFancyGraphicsOrBetter())) { - return state.with(FruitBearingBlock.STAGE, FruitBearingBlock.Stage.IDLE); - } - return state; - } -} diff --git a/src/main/resources/assets/unicopia/blockstates/green_apple_leaves.json b/src/main/resources/assets/unicopia/blockstates/green_apple_leaves.json index 635befb5..79c8b6a4 100644 --- a/src/main/resources/assets/unicopia/blockstates/green_apple_leaves.json +++ b/src/main/resources/assets/unicopia/blockstates/green_apple_leaves.json @@ -1,16 +1,11 @@ { - "variants": { - "stage=flowering": { - "model": "unicopia:block/green_apple_leaves_flowering" + "multipart": [ + { + "apply": { "model": "unicopia:block/green_apple_leaves" } }, - "stage=idle": { - "model": "unicopia:block/green_apple_leaves" - }, - "stage=fruiting": { - "model": "unicopia:block/green_apple_leaves" - }, - "stage=withering": { - "model": "unicopia:block/green_apple_leaves" + { + "apply": { "model": "unicopia:block/green_apple_leaves_flowering" }, + "when": { "stage": "flowering" } } - } + ] } diff --git a/src/main/resources/assets/unicopia/blockstates/sour_apple_leaves.json b/src/main/resources/assets/unicopia/blockstates/sour_apple_leaves.json index e15d3600..30f1e327 100644 --- a/src/main/resources/assets/unicopia/blockstates/sour_apple_leaves.json +++ b/src/main/resources/assets/unicopia/blockstates/sour_apple_leaves.json @@ -1,16 +1,11 @@ { - "variants": { - "stage=flowering": { - "model": "unicopia:block/sour_apple_leaves_flowering" + "multipart": [ + { + "apply": { "model": "unicopia:block/sour_apple_leaves" } }, - "stage=idle": { - "model": "unicopia:block/sour_apple_leaves" - }, - "stage=fruiting": { - "model": "unicopia:block/sour_apple_leaves" - }, - "stage=withering": { - "model": "unicopia:block/sour_apple_leaves" + { + "apply": { "model": "unicopia:block/sour_apple_leaves_flowering" }, + "when": { "stage": "flowering" } } - } + ] } diff --git a/src/main/resources/assets/unicopia/blockstates/sweet_apple_leaves.json b/src/main/resources/assets/unicopia/blockstates/sweet_apple_leaves.json index e09ef0b9..372d59d5 100644 --- a/src/main/resources/assets/unicopia/blockstates/sweet_apple_leaves.json +++ b/src/main/resources/assets/unicopia/blockstates/sweet_apple_leaves.json @@ -1,16 +1,11 @@ { - "variants": { - "stage=flowering": { - "model": "unicopia:block/sweet_apple_leaves_flowering" + "multipart": [ + { + "apply": { "model": "unicopia:block/sweet_apple_leaves" } }, - "stage=idle": { - "model": "unicopia:block/sweet_apple_leaves" - }, - "stage=fruiting": { - "model": "unicopia:block/sweet_apple_leaves" - }, - "stage=withering": { - "model": "unicopia:block/sweet_apple_leaves" + { + "apply": { "model": "unicopia:block/sweet_apple_leaves_flowering" }, + "when": { "stage": "flowering" } } - } + ] } diff --git a/src/main/resources/assets/unicopia/models/block/green_apple_leaves_flowering.json b/src/main/resources/assets/unicopia/models/block/green_apple_leaves_flowering.json index 1ab7bd8c..3809eb32 100644 --- a/src/main/resources/assets/unicopia/models/block/green_apple_leaves_flowering.json +++ b/src/main/resources/assets/unicopia/models/block/green_apple_leaves_flowering.json @@ -1,7 +1,6 @@ { - "parent": "unicopia:block/sweet_apple_leaves_flowering", + "parent": "minecraft:block/cube_all", "textures": { - "all": "unicopia:block/green_apple_leaves", - "overlay": "unicopia:block/green_apple_leaves_flowering" + "all": "unicopia:block/green_apple_leaves_flowering" } } \ No newline at end of file diff --git a/src/main/resources/assets/unicopia/models/block/sour_apple_leaves_flowering.json b/src/main/resources/assets/unicopia/models/block/sour_apple_leaves_flowering.json index 42924cd9..a3e5a7bd 100644 --- a/src/main/resources/assets/unicopia/models/block/sour_apple_leaves_flowering.json +++ b/src/main/resources/assets/unicopia/models/block/sour_apple_leaves_flowering.json @@ -1,7 +1,6 @@ { - "parent": "unicopia:block/sweet_apple_leaves_flowering", + "parent": "minecraft:block/cube_all", "textures": { - "all": "unicopia:block/sour_apple_leaves", - "overlay": "unicopia:block/sour_apple_leaves_flowering" + "all": "unicopia:block/sour_apple_leaves_flowering" } } \ No newline at end of file diff --git a/src/main/resources/assets/unicopia/models/block/sweet_apple_leaves_flowering.json b/src/main/resources/assets/unicopia/models/block/sweet_apple_leaves_flowering.json index 3d04aabc..773c2e74 100644 --- a/src/main/resources/assets/unicopia/models/block/sweet_apple_leaves_flowering.json +++ b/src/main/resources/assets/unicopia/models/block/sweet_apple_leaves_flowering.json @@ -1,31 +1,6 @@ -{ "parent": "minecraft:block/block", - "textures": { - "all": "unicopia:block/sweet_apple_leaves", - "particle": "#all", - "overlay": "unicopia:block/sweet_apple_leaves_flowering" - }, - "elements": [ - { "from": [ 0, 0, 0 ], - "to": [ 16, 16, 16 ], - "faces": { - "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#all", "tintindex": 0, "cullface": "down" }, - "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#all", "tintindex": 0, "cullface": "up" }, - "north": { "uv": [ 0, 0, 16, 16 ], "texture": "#all", "tintindex": 0, "cullface": "north" }, - "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#all", "tintindex": 0, "cullface": "south" }, - "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#all", "tintindex": 0, "cullface": "west" }, - "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#all", "tintindex": 0, "cullface": "east" } - } - }, - { "from": [ 0, 0, 0 ], - "to": [ 16, 16, 16 ], - "faces": { - "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#overlay", "cullface": "down" }, - "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#overlay", "cullface": "up" }, - "north": { "uv": [ 0, 0, 16, 16 ], "texture": "#overlay", "cullface": "north" }, - "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#overlay", "cullface": "south" }, - "west": { "uv": [ 0, 0, 16, 16 ], "texture": "#overlay", "cullface": "west" }, - "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#overlay", "cullface": "east" } - } - } - ] -} +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "unicopia:block/sweet_apple_leaves_flowering" + } +} \ No newline at end of file diff --git a/src/main/resources/unicopia.mixin.json b/src/main/resources/unicopia.mixin.json index 5cdd7249..20a09367 100644 --- a/src/main/resources/unicopia.mixin.json +++ b/src/main/resources/unicopia.mixin.json @@ -65,7 +65,6 @@ "client.MixinAnimalModel", "client.MixinArmorFeatureRenderer", "client.MixinBackgroundRenderer", - "client.MixinBlockModels", "client.MixinCamera", "client.MixinClientWorld", "client.MixinClientPlayNetworkHandler", From 703c8e6d398b5ea467338fd84e996d7cb89b8289 Mon Sep 17 00:00:00 2001 From: Sollace Date: Tue, 20 Feb 2024 20:09:57 +0000 Subject: [PATCH 06/14] Fix cabbage lad crash #271 --- .../unicopia/entity/mob/IgnominiousBulbEntity.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/minelittlepony/unicopia/entity/mob/IgnominiousBulbEntity.java b/src/main/java/com/minelittlepony/unicopia/entity/mob/IgnominiousBulbEntity.java index 82e99bf7..3da9137c 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/mob/IgnominiousBulbEntity.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/mob/IgnominiousBulbEntity.java @@ -180,8 +180,10 @@ public class IgnominiousBulbEntity extends MobEntity { }); } } + + @Nullable LivingEntity target = getAttacker(); - if (!canTarget(target)) { + if (target == null || !canTarget(target)) { target = null; setAttacker(null); } From 53497c70d658013574ed2123a52778ec5e1f5bb3 Mon Sep 17 00:00:00 2001 From: Sollace Date: Tue, 20 Feb 2024 20:21:16 +0000 Subject: [PATCH 07/14] Fix incompatibility with mods that add points of interest containing chests --- .../com/minelittlepony/unicopia/UPOIs.java | 74 +++++++++++++++++-- .../ability/SeaponySonarPulseAbility.java | 6 +- .../mixin/MixinPointOfInterestType.java | 16 ++++ .../mixin/PointOfInterestTypesAccessor.java | 19 +++++ src/main/resources/unicopia.mixin.json | 2 + 5 files changed, 109 insertions(+), 8 deletions(-) create mode 100644 src/main/java/com/minelittlepony/unicopia/mixin/MixinPointOfInterestType.java create mode 100644 src/main/java/com/minelittlepony/unicopia/mixin/PointOfInterestTypesAccessor.java diff --git a/src/main/java/com/minelittlepony/unicopia/UPOIs.java b/src/main/java/com/minelittlepony/unicopia/UPOIs.java index 3a7b07e4..32f82e84 100644 --- a/src/main/java/com/minelittlepony/unicopia/UPOIs.java +++ b/src/main/java/com/minelittlepony/unicopia/UPOIs.java @@ -1,16 +1,78 @@ package com.minelittlepony.unicopia; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.function.Supplier; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import com.minelittlepony.unicopia.mixin.MixinPointOfInterestType; +import com.minelittlepony.unicopia.mixin.PointOfInterestTypesAccessor; + +import net.fabricmc.fabric.api.event.registry.DynamicRegistrySetupCallback; +import net.fabricmc.fabric.api.event.registry.RegistryEntryAddedCallback; import net.fabricmc.fabric.api.object.builder.v1.world.poi.PointOfInterestHelper; import net.minecraft.block.AbstractChestBlock; -import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.ChestBlock; import net.minecraft.registry.Registries; +import net.minecraft.registry.RegistryKey; +import net.minecraft.registry.RegistryKeys; +import net.minecraft.registry.entry.RegistryEntry; +import net.minecraft.util.Identifier; import net.minecraft.world.poi.PointOfInterestType; +import net.minecraft.world.poi.PointOfInterestTypes; public interface UPOIs { - PointOfInterestType CHESTS = PointOfInterestHelper.register(Unicopia.id("chests"), 1, 64, Registries.BLOCK.getEntrySet().stream() - .map(entry -> entry.getValue()) - .filter(b -> b instanceof AbstractChestBlock) - .toArray(Block[]::new)); + Set> CHEST_POINTS_OF_INTEREST = new HashSet<>(); + RegistryKey CHESTS = register(Unicopia.id("chests"), 1, 64, () -> { + return Registries.BLOCK.getEntrySet().stream() + .map(entry -> entry.getValue()) + .filter(b -> b instanceof AbstractChestBlock) + .flatMap(block -> { + List states = block.getStateManager().getStates(); + List> existingTypes = states.stream() + .flatMap(state -> PointOfInterestTypes.getTypeForState(state).stream()) + .flatMap(entry -> entry.getKey().stream()) + .toList(); - static void bootstrap() { } + if (!existingTypes.isEmpty()) { + CHEST_POINTS_OF_INTEREST.addAll(existingTypes); + return Stream.empty(); + } + return states.stream(); + }) + .distinct(); + }); + + static RegistryKey register(Identifier id, int ticketCount, int searchDistance, Supplier> states) { + PointOfInterestType type = PointOfInterestHelper.register(id, ticketCount, searchDistance, List.of()); + ((MixinPointOfInterestType)(Object)type).setStates(new HashSet<>()); + DynamicRegistrySetupCallback.EVENT.register(registries -> { + if (type.blockStates().isEmpty()) { + type.blockStates().addAll(states.get().collect(Collectors.toSet())); + PointOfInterestTypesAccessor.registerStates(Registries.POINT_OF_INTEREST_TYPE.entryOf(CHESTS), type.blockStates()); + } + }); + return RegistryKey.of(RegistryKeys.POINT_OF_INTEREST_TYPE, id); + } + + static boolean isChest(RegistryEntry type) { + return type.getKey().filter(CHEST_POINTS_OF_INTEREST::contains).isPresent(); + } + + static void bootstrap() { + CHEST_POINTS_OF_INTEREST.add(CHESTS); + Registries.POINT_OF_INTEREST_TYPE.getEntrySet().forEach(poi -> { + if (poi.getValue().blockStates().stream().anyMatch(state -> state.getBlock() instanceof ChestBlock)) { + CHEST_POINTS_OF_INTEREST.add(poi.getKey()); + } + }); + RegistryEntryAddedCallback.event(Registries.POINT_OF_INTEREST_TYPE).register((raw, key, value) -> { + if (value.blockStates().stream().anyMatch(state -> state.getBlock() instanceof ChestBlock)) { + CHEST_POINTS_OF_INTEREST.add(RegistryKey.of(RegistryKeys.POINT_OF_INTEREST_TYPE, key)); + } + }); + } } diff --git a/src/main/java/com/minelittlepony/unicopia/ability/SeaponySonarPulseAbility.java b/src/main/java/com/minelittlepony/unicopia/ability/SeaponySonarPulseAbility.java index c4df03a4..95078776 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/SeaponySonarPulseAbility.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/SeaponySonarPulseAbility.java @@ -13,6 +13,8 @@ import com.minelittlepony.unicopia.client.render.PlayerPoser.Animation; import com.minelittlepony.unicopia.entity.player.Pony; import com.minelittlepony.unicopia.particle.ParticleUtils; import com.minelittlepony.unicopia.particle.UParticles; + +import net.minecraft.block.ChestBlock; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityGroup; import net.minecraft.entity.LivingEntity; @@ -78,8 +80,8 @@ public class SeaponySonarPulseAbility implements Ability { if (player.asWorld() instanceof ServerWorld sw) { sw.getPointOfInterestStorage().getNearestPosition( - type -> type.value() == UPOIs.CHESTS, - pos -> player.asWorld().getFluidState(pos).isIn(FluidTags.WATER), player.getOrigin(), 64, OccupationStatus.ANY) + UPOIs::isChest, + pos -> player.asWorld().getFluidState(pos).isIn(FluidTags.WATER) && (player.asWorld().getBlockState(pos).getBlock() instanceof ChestBlock), player.getOrigin(), 64, OccupationStatus.ANY) .ifPresent(chestPos -> { emitPing(player, chestPos.toCenterPos(), 20, 0.5F, 2F); }); diff --git a/src/main/java/com/minelittlepony/unicopia/mixin/MixinPointOfInterestType.java b/src/main/java/com/minelittlepony/unicopia/mixin/MixinPointOfInterestType.java new file mode 100644 index 00000000..3f772b99 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/mixin/MixinPointOfInterestType.java @@ -0,0 +1,16 @@ +package com.minelittlepony.unicopia.mixin; + +import java.util.Set; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Mutable; +import org.spongepowered.asm.mixin.gen.Accessor; +import net.minecraft.block.BlockState; +import net.minecraft.world.poi.PointOfInterestType; + +@Mixin(PointOfInterestType.class) +public interface MixinPointOfInterestType { + @Mutable + @Accessor("blockStates") + void setStates(Set states); +} diff --git a/src/main/java/com/minelittlepony/unicopia/mixin/PointOfInterestTypesAccessor.java b/src/main/java/com/minelittlepony/unicopia/mixin/PointOfInterestTypesAccessor.java new file mode 100644 index 00000000..4d212846 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/mixin/PointOfInterestTypesAccessor.java @@ -0,0 +1,19 @@ +package com.minelittlepony.unicopia.mixin; + +import java.util.Set; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; + +import net.minecraft.block.BlockState; +import net.minecraft.registry.entry.RegistryEntry; +import net.minecraft.world.poi.PointOfInterestType; +import net.minecraft.world.poi.PointOfInterestTypes; + +@Mixin(PointOfInterestTypes.class) +public interface PointOfInterestTypesAccessor { + @Invoker("registerStates") + static void registerStates(RegistryEntry poiTypeEntry, Set states) { + + } +} diff --git a/src/main/resources/unicopia.mixin.json b/src/main/resources/unicopia.mixin.json index 20a09367..d59bf63e 100644 --- a/src/main/resources/unicopia.mixin.json +++ b/src/main/resources/unicopia.mixin.json @@ -36,6 +36,7 @@ "MixinPlayerEntity", "MixinPlayerInventory", "MixinPlayerManager", + "MixinPointOfInterestType", "MixinPowderSnowBlock", "MixinProjectileEntity", "MixinPufferfishEntity", @@ -53,6 +54,7 @@ "MixinWardenEntity", "MixinWorld", "MixinWorldChunk", + "PointOfInterestTypesAccessor", "trinkets.MixinTrinketSurvivalSlot", "trinkets.MixinTrinketItem", "trinkets.MixinTrinketInventory", From 00a20fbdc7d4344bca1f5341d536dddcbda9d6ea Mon Sep 17 00:00:00 2001 From: Sollace Date: Wed, 21 Feb 2024 22:46:10 +0000 Subject: [PATCH 08/14] Fixed ability spells not cancelling when the player loses access to the granting ability. Fixes #272 --- .../com/minelittlepony/unicopia/ability/magic/Caster.java | 5 +++++ .../ability/magic/spell/DispersableDisguiseSpell.java | 5 +++++ .../unicopia/ability/magic/spell/RageAbilitySpell.java | 3 ++- .../unicopia/ability/magic/spell/RainboomAbilitySpell.java | 3 ++- .../ability/magic/spell/TimeControlAbilitySpell.java | 7 +------ .../java/com/minelittlepony/unicopia/entity/Living.java | 6 ++++++ 6 files changed, 21 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/minelittlepony/unicopia/ability/magic/Caster.java b/src/main/java/com/minelittlepony/unicopia/ability/magic/Caster.java index 150b1004..2d662cb1 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/magic/Caster.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/magic/Caster.java @@ -7,6 +7,7 @@ import java.util.stream.Stream; import org.jetbrains.annotations.Nullable; import com.minelittlepony.unicopia.*; +import com.minelittlepony.unicopia.ability.Ability; import com.minelittlepony.unicopia.ability.magic.spell.effect.SpellType; import com.minelittlepony.unicopia.entity.*; import com.minelittlepony.unicopia.entity.damage.UDamageSources; @@ -103,6 +104,10 @@ public interface Caster extends return !Ether.get(asWorld()).anyMatch(SpellType.ARCANE_PROTECTION, (spell, caster) -> spell.blocksMagicFor(caster, this, pos)); } + default boolean canUse(Ability ability) { + return false; + } + static Stream> stream(Stream entities) { return entities.map(Caster::of).flatMap(Optional::stream); } diff --git a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/DispersableDisguiseSpell.java b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/DispersableDisguiseSpell.java index c3b3bfc1..f52b0e4a 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/DispersableDisguiseSpell.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/DispersableDisguiseSpell.java @@ -2,6 +2,7 @@ package com.minelittlepony.unicopia.ability.magic.spell; import java.util.Optional; +import com.minelittlepony.unicopia.ability.Abilities; import com.minelittlepony.unicopia.ability.magic.Caster; import com.minelittlepony.unicopia.ability.magic.IllusionarySpell; import com.minelittlepony.unicopia.ability.magic.spell.effect.CustomisedSpellType; @@ -55,6 +56,10 @@ public class DispersableDisguiseSpell extends AbstractDisguiseSpell implements I } } + if (!source.canUse(Abilities.DISGUISE)) { + setDead(); + } + Entity owner = source.asEntity(); Entity appearance = getDisguise().getAppearance(); diff --git a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/RageAbilitySpell.java b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/RageAbilitySpell.java index 17e3acd8..f674edbf 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/RageAbilitySpell.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/RageAbilitySpell.java @@ -2,6 +2,7 @@ package com.minelittlepony.unicopia.ability.magic.spell; import com.minelittlepony.unicopia.InteractionManager; import com.minelittlepony.unicopia.USounds; +import com.minelittlepony.unicopia.ability.Abilities; import com.minelittlepony.unicopia.ability.magic.Caster; import com.minelittlepony.unicopia.ability.magic.spell.effect.*; import com.minelittlepony.unicopia.client.render.PlayerPoser.Animation; @@ -45,7 +46,7 @@ public class RageAbilitySpell extends AbstractSpell { @Override public boolean tick(Caster source, Situation situation) { - if (situation != Situation.BODY || source.asEntity().isRemoved()) { + if (situation != Situation.BODY || source.asEntity().isRemoved() || !source.canUse(Abilities.RAGE)) { return false; } diff --git a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/RainboomAbilitySpell.java b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/RainboomAbilitySpell.java index 6c6d1099..05ce028a 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/RainboomAbilitySpell.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/RainboomAbilitySpell.java @@ -4,6 +4,7 @@ import org.jetbrains.annotations.Nullable; import com.minelittlepony.unicopia.InteractionManager; import com.minelittlepony.unicopia.UTags; +import com.minelittlepony.unicopia.ability.Abilities; import com.minelittlepony.unicopia.ability.magic.Caster; import com.minelittlepony.unicopia.ability.magic.spell.effect.*; import com.minelittlepony.unicopia.entity.damage.UDamageTypes; @@ -43,7 +44,7 @@ public class RainboomAbilitySpell extends AbstractSpell { @Override public boolean tick(Caster source, Situation situation) { - if (situation != Situation.BODY) { + if (situation != Situation.BODY || !source.canUse(Abilities.RAINBOOM)) { return false; } diff --git a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/TimeControlAbilitySpell.java b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/TimeControlAbilitySpell.java index 6953ff87..8490cbeb 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/TimeControlAbilitySpell.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/TimeControlAbilitySpell.java @@ -4,7 +4,6 @@ import com.minelittlepony.unicopia.ability.Abilities; import com.minelittlepony.unicopia.ability.data.Rot; import com.minelittlepony.unicopia.ability.magic.Caster; import com.minelittlepony.unicopia.ability.magic.spell.effect.*; -import com.minelittlepony.unicopia.entity.player.Pony; import com.minelittlepony.unicopia.server.world.UGameRules; import com.minelittlepony.unicopia.server.world.UnicopiaWorldProperties; @@ -31,11 +30,7 @@ public class TimeControlAbilitySpell extends AbstractSpell { @Override public boolean tick(Caster source, Situation situation) { - if (!source.asWorld().getGameRules().getBoolean(UGameRules.DO_TIME_MAGIC)) { - return false; - } - - if (situation != Situation.BODY || !(source instanceof Pony pony) || !Abilities.TIME.canUse(pony.getCompositeRace())) { + if (!source.asWorld().getGameRules().getBoolean(UGameRules.DO_TIME_MAGIC) || situation != Situation.BODY || !source.canUse(Abilities.TIME)) { return false; } diff --git a/src/main/java/com/minelittlepony/unicopia/entity/Living.java b/src/main/java/com/minelittlepony/unicopia/entity/Living.java index 463a5136..53384423 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/Living.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/Living.java @@ -10,6 +10,7 @@ import com.minelittlepony.unicopia.USounds; import com.minelittlepony.unicopia.UTags; import com.minelittlepony.unicopia.Unicopia; import com.minelittlepony.unicopia.ability.Abilities; +import com.minelittlepony.unicopia.ability.Ability; import com.minelittlepony.unicopia.ability.magic.Caster; import com.minelittlepony.unicopia.ability.magic.SpellContainer; import com.minelittlepony.unicopia.ability.magic.SpellPredicate; @@ -614,6 +615,11 @@ public abstract class Living implements Equine, Caste updateVelocity(entity); } + @Override + public boolean canUse(Ability ability) { + return ability.canUse(getCompositeRace()); + } + public static Optional> getOrEmpty(Entity entity) { return Equine.of(entity, a -> a instanceof Living); } From 5acebc270cfc3398f96c305f409abf34c7158c87 Mon Sep 17 00:00:00 2001 From: Sollace Date: Wed, 21 Feb 2024 22:51:28 +0000 Subject: [PATCH 09/14] Fix cloud door recipe. Closes #265 --- src/main/resources/data/unicopia/recipes/cloud_door.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/resources/data/unicopia/recipes/cloud_door.json b/src/main/resources/data/unicopia/recipes/cloud_door.json index 7d41de39..240bf34b 100644 --- a/src/main/resources/data/unicopia/recipes/cloud_door.json +++ b/src/main/resources/data/unicopia/recipes/cloud_door.json @@ -1,6 +1,7 @@ { "type": "minecraft:crafting_shaped", "pattern": [ + "##", "##", "##" ], @@ -9,5 +10,5 @@ { "item": "unicopia:dense_cloud" } ] }, - "result": { "item": "unicopia:cloud_door", "count": 1 } + "result": { "item": "unicopia:cloud_door", "count": 3 } } From a5132859ab989ed1f03d27cbeba8589148d4f8e6 Mon Sep 17 00:00:00 2001 From: Sollace Date: Wed, 21 Feb 2024 23:21:12 +0000 Subject: [PATCH 10/14] Fixed incorrect percentage breakdown for pony diets in tooltips --- .../unicopia/diet/DietProfile.java | 21 +++++++++++++++++-- .../unicopia/diet/PonyDiets.java | 2 +- .../resources/assets/unicopia/lang/en_us.json | 2 +- 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/minelittlepony/unicopia/diet/DietProfile.java b/src/main/java/com/minelittlepony/unicopia/diet/DietProfile.java index 46900f8f..104d6958 100644 --- a/src/main/java/com/minelittlepony/unicopia/diet/DietProfile.java +++ b/src/main/java/com/minelittlepony/unicopia/diet/DietProfile.java @@ -10,6 +10,7 @@ import java.util.stream.Collectors; import org.jetbrains.annotations.Nullable; +import com.minelittlepony.unicopia.entity.player.Pony; import com.minelittlepony.unicopia.item.ItemDuck; import com.mojang.datafixers.util.Pair; import com.mojang.serialization.Codec; @@ -104,6 +105,7 @@ public record DietProfile( public void appendTooltip(ItemStack stack, @Nullable PlayerEntity user, List tooltip, TooltipContext context) { var food = stack.getItem().getFoodComponent(); + var ratios = getRatios(stack); if (food == null || isInedible(ratios)) { if (stack.getUseAction() != UseAction.DRINK) { @@ -115,15 +117,30 @@ public record DietProfile( float baseMultiplier = (isForaged(stack) ? foragingMultiplier() : defaultMultiplier()); if (context.isAdvanced()) { + var nonAdjustedFood = getNonAdjustedFoodComponent(stack, user).orElse(food); tooltip.add(Text.literal(" ").append(Text.translatable("unicopia.diet.base_multiplier", baseMultiplier).formatted(Formatting.DARK_GRAY))); - tooltip.add(Text.literal(" ").append(Text.translatable("unicopia.diet.hunger.detailed", Math.max(1, (int)(ratios.getFirst() * food.getHunger())), food.getHunger(), (int)(ratios.getFirst() * 100))).formatted(Formatting.DARK_GRAY)); - tooltip.add(Text.literal(" ").append(Text.translatable("unicopia.diet.saturation.detailed", String.format("%.2f", ratios.getSecond() * food.getSaturationModifier()), (int)(ratios.getSecond() * 100))).formatted(Formatting.DARK_GRAY)); + tooltip.add(Text.literal(" ").append(Text.translatable("unicopia.diet.hunger.detailed", food.getHunger(), nonAdjustedFood.getHunger(), (int)(ratios.getFirst() * 100))).formatted(Formatting.DARK_GRAY)); + tooltip.add(Text.literal(" ").append(Text.translatable("unicopia.diet.saturation.detailed", food.getSaturationModifier(), nonAdjustedFood.getSaturationModifier(), (int)(ratios.getSecond() * 100))).formatted(Formatting.DARK_GRAY)); } else { tooltip.add(Text.literal(" ").append(Text.translatable("unicopia.diet.hunger", (int)(ratios.getFirst() * 100))).formatted(Formatting.DARK_GRAY)); tooltip.add(Text.literal(" ").append(Text.translatable("unicopia.diet.saturation", (int)(ratios.getSecond() * 100))).formatted(Formatting.DARK_GRAY)); } } + private Optional getNonAdjustedFoodComponent(ItemStack stack, @Nullable PlayerEntity user) { + @Nullable + Pony pony = Pony.of(user); + Optional food = ((ItemDuck)stack.getItem()).getOriginalFoodComponent(); + + if (food.isEmpty() && pony.getObservedSpecies().hasIronGut()) { + return findEffect(stack) + .flatMap(Effect::foodComponent) + .or(() -> PonyDiets.getInstance().getEffects(stack).foodComponent()); + } + + return food; + } + public record Multiplier( Set> tags, float hunger, diff --git a/src/main/java/com/minelittlepony/unicopia/diet/PonyDiets.java b/src/main/java/com/minelittlepony/unicopia/diet/PonyDiets.java index a9b5459b..658cdf53 100644 --- a/src/main/java/com/minelittlepony/unicopia/diet/PonyDiets.java +++ b/src/main/java/com/minelittlepony/unicopia/diet/PonyDiets.java @@ -53,7 +53,7 @@ public class PonyDiets implements DietView { return Optional.ofNullable(diets.get(pony.getObservedSpecies())).orElse(DietProfile.EMPTY); } - private Effect getEffects(ItemStack stack) { + Effect getEffects(ItemStack stack) { return effects.stream().filter(effect -> effect.test(stack)).findFirst().orElse(Effect.EMPTY); } diff --git a/src/main/resources/assets/unicopia/lang/en_us.json b/src/main/resources/assets/unicopia/lang/en_us.json index 24d06e29..a4a00c78 100644 --- a/src/main/resources/assets/unicopia/lang/en_us.json +++ b/src/main/resources/assets/unicopia/lang/en_us.json @@ -594,7 +594,7 @@ "unicopia.diet.not_edible": "Item is not edible", "unicopia.diet.base_multiplier": "Base Multiplier: %s%%", "unicopia.diet.hunger.detailed": "Hunger gained: %s of %s (%s%%)", - "unicopia.diet.saturation.detailed": "Saturation gained: %s (%s%%)", + "unicopia.diet.saturation.detailed": "Saturation gained: %s of %s (%s%%)", "unicopia.diet.hunger": "Hunger Ratio: %s%%", "unicopia.diet.saturation": "Saturation Ratio: %s%%", From 672807e343e3879c6c385f379fe76aa58fea8da7 Mon Sep 17 00:00:00 2001 From: Sollace Date: Wed, 21 Feb 2024 23:22:28 +0000 Subject: [PATCH 11/14] Nerf leaves. Fixes #270 --- src/main/resources/assets/unicopia/lang/en_us.json | 1 + .../diets/food_effects/foraging/leafy_greens.json | 10 ++++++++++ .../tags/items/food_types/forage_edible_filling.json | 1 - 3 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 src/main/resources/data/unicopia/diets/food_effects/foraging/leafy_greens.json diff --git a/src/main/resources/assets/unicopia/lang/en_us.json b/src/main/resources/assets/unicopia/lang/en_us.json index a4a00c78..b0c81599 100644 --- a/src/main/resources/assets/unicopia/lang/en_us.json +++ b/src/main/resources/assets/unicopia/lang/en_us.json @@ -617,6 +617,7 @@ "tag.unicopia.food_types.desserts": "Desserts", "tag.unicopia.food_types.fruits_and_vegetables": "Fruits & Vegetables", "tag.unicopia.food_types.drinks": "Drinks", + "tag.minecraft.leaves": "Leaves", "tag.unicopia.food_types.forage_edible_filling": "Bulky Plant Matter", "tag.unicopia.food_types.forage_edible": "Plant Matter", diff --git a/src/main/resources/data/unicopia/diets/food_effects/foraging/leafy_greens.json b/src/main/resources/data/unicopia/diets/food_effects/foraging/leafy_greens.json new file mode 100644 index 00000000..0c81ee64 --- /dev/null +++ b/src/main/resources/data/unicopia/diets/food_effects/foraging/leafy_greens.json @@ -0,0 +1,10 @@ +{ + "tags": [ "minecraft:leaves" ], + "food_component": { + "hunger": 2, + "saturation": 1.5 + }, + "ailment": { + "effects": [] + } +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/tags/items/food_types/forage_edible_filling.json b/src/main/resources/data/unicopia/tags/items/food_types/forage_edible_filling.json index 5bf8d28d..c3245df5 100644 --- a/src/main/resources/data/unicopia/tags/items/food_types/forage_edible_filling.json +++ b/src/main/resources/data/unicopia/tags/items/food_types/forage_edible_filling.json @@ -2,7 +2,6 @@ "replace": false, "values": [ "minecraft:hay_block", - "#minecraft:leaves", "#c:foraging/edibles_filling" ] } From a11f8d33eb98b0ae5e30fbd68def448a9eef8a9c Mon Sep 17 00:00:00 2001 From: Sollace Date: Thu, 22 Feb 2024 00:04:39 +0000 Subject: [PATCH 12/14] Fixed clients slinging sneaky superfluous flight control packets. Fixes #267 --- .../minelittlepony/unicopia/entity/player/PlayerPhysics.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/minelittlepony/unicopia/entity/player/PlayerPhysics.java b/src/main/java/com/minelittlepony/unicopia/entity/player/PlayerPhysics.java index 2b4b93d0..6005489a 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/player/PlayerPhysics.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/player/PlayerPhysics.java @@ -234,7 +234,7 @@ public class PlayerPhysics extends EntityPhysics implements Tickab public void tick() { super.tick(); - if (pony.isClient() && this.isFlying()) { + if (pony.isClientPlayer() && isFlying() && (pony.getJumpingHeuristic().hasChanged(Heuristic.ONCE) || pony.sneakingChanged())) { Channel.FLIGHT_CONTROLS_INPUT.sendToServer(new MsgPlayerFlightControlsInput(pony)); } From 4b66dd517f9adc2f40fc079ef8056ddd512a0aa1 Mon Sep 17 00:00:00 2001 From: Sollace Date: Thu, 22 Feb 2024 00:49:21 +0000 Subject: [PATCH 13/14] Fixed leaves rendering weird with sodium and fast graphics --- .../textures/block/flowering_zap_leaves.png | Bin 1851 -> 6779 bytes .../textures/block/golden_oak_leaves.png | Bin 6220 -> 9012 bytes .../textures/block/green_apple_leaves.png | Bin 1466 -> 6579 bytes .../unicopia/textures/block/palm_leaves.png | Bin 1665 -> 6630 bytes .../textures/block/sour_apple_leaves.png | Bin 1466 -> 6578 bytes .../textures/block/sweet_apple_leaves.png | Bin 7105 -> 7354 bytes .../unicopia/textures/block/zap_leaves.png | Bin 256 -> 6661 bytes 7 files changed, 0 insertions(+), 0 deletions(-) diff --git a/src/main/resources/assets/unicopia/textures/block/flowering_zap_leaves.png b/src/main/resources/assets/unicopia/textures/block/flowering_zap_leaves.png index ca5c516d7f3688a8604749284018c18d4909a164..75246a8e17665ba135992e745a27ac95b5064a62 100644 GIT binary patch literal 6779 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 be)fL>t!9ESCY!p#00000NkvXXu0mjfN#m0* diff --git a/src/main/resources/assets/unicopia/textures/block/golden_oak_leaves.png b/src/main/resources/assets/unicopia/textures/block/golden_oak_leaves.png index 2242b16857eb602a0f29422b0754cb9960283603..900138a162cf98309a4b0b83d6bec89c24ab709e 100644 GIT binary patch delta 3929 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 IcHI&G4>#?MZ~y=R delta 1296 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 B4(0#= delta 1449 zcmV;a1y=gAGr9|qBYy-bdQ@0+Qek%>aB^>EX>4U6ba`-PAZ2)IW&i+q+O1Y=lJq7F z{I65w2uR|29E?rXcY_>14SvoH_Rc0T>xB|R65WzKwEX?2(qDMQSWni4=#%#bk4-j7 z#v+>YS++SDQ`_3&10TO#YQIWfL2&{w+K+jRfY)Ii`bZejWK)Q(nN2Yh zM&ZQ5YARcvIdkQu&xH#@w6aLREK)?fENYM>MUAprQmdA$1Wh_?RM8@fDx`A6!rgD` z?g~dZo*A0LFn`84(Fg5||2l?-YAp>S#_e~k5SK`!fg6h2{zD6daNYCBb%6Kr{(x8* zvCwKTM_e$QX*Dr9K66W{6Rl8mnC*Hv%$or~1m6z9uz~^OSsi;MgGgWojuHH1L@r8J zCQ!i6$&4t)s(O$UrTNC0z+G3ItYVZ9h;ZsPfSRNkTz^^XTCD{ekwe+3v(7p1f{QM> z?A2TEy!XMkTFgO%4KDZ)LJTS7sL@6jeGD^ctS!X-D+0S8)bDHzQ3sPyZi(C8>mbj!PSEO3i zYOAZhhJPAss`+58vq~?VeKPmV8gHzDFzTFHDDA949KvpbTRU-$GcYEW!FXs4Afcsk zW+GcFjX7$ZnIxzRCy3HDa%OIffkC^lxXK52CvzXX5$gWm@+Md2s8RQSFh`BL0dt?c z4Op97e=n^L4H{c3!v?BRlwWaKVwRLFTZcb%$A4JnzK%&3#M-u_(Z%~?*`?IhX0Sca zxh;Uyv8zj$7=RYK8xdP!rAyIjW!*M4tX5Jiy9l@HD=QZt=55xw*`nqYrQf4B$cObt zq5!*FHSur?U)lTJN02SzRh6D}b<=eh2SxlAqDe}?FVDHOD{p*bezY8+Crwcn4b#& z(J~z$t3g&i^s$cuqK69llD)MA==H*b*7jZFt2Bh?(g*h&|I}#clhJ41@46p7wtu~k z&&mB~lU`B%GOClZwbQ9@w2o=8{6Mi@T10Lh* zJ69=mivR!tOi4sRR5;6BQ_HP{FbtfacaJCmi2`z=Bcyc$h#C+LIMQ~s7Yaa12`Clh z9UkLnHkU|_KQrS=kXaf4=v#wkZGZBTpjjIL$V5~&Zwt1bn`gZ$zP;eL!owlZ ztj67(dB@gewKv}0P#vKhpTl(UsQgqS@_sOW40uhvaNqhc_fhb@f4_TvHg9nN{~~JE zc6<(VAdA;!ZTv_?yY6e16glj~JcuWClJw|nR>qa#LA|I%>@00000NkvXXu0mjf D#U{c= diff --git a/src/main/resources/assets/unicopia/textures/block/palm_leaves.png b/src/main/resources/assets/unicopia/textures/block/palm_leaves.png index 0dbcba9cf8bf1e43e38da14af24fcf9cd64a9454..2288fa3f9c86a817def2ab19d490061d91fb2a24 100644 GIT binary patch literal 6630 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 delta 1649 zcmV-%29EjWGl30|BYy;;dQ@0+Qek%>aB^>EX>4U6ba`-PAZ2)IW&i+q+O1Yuvg9ZX z{O1&N1SBDr{+tfeupaxWiowvbSEsqH% zV3dy6>#5f}Xx)0>$QLdf%vqp521XC0z1d}JP4cGGIQOIOh<~;PcD~`w4t%rI+y*}) z^1~5I+w82h)BEGsx3%J%oLTkRCK@aGvDcx-QI4KWOp+KnmRV^|zASxrv>?svsIvm2 zi_SVp%Mbv8bOQqgA~dMSJ42Qb4OVpWM$AZu&6C4`nKS_zMTQJCbQGwNC!~y(NUS(x zfn(orY?r~y#(xE5CW1HvS#dNqI{&x5I%+NV6oH(6@YyjBK5yAO8|j3c*IA7 zN4q})tT-_;tEbt^0i#Z*i^QWWFpJkoQqw#97u{}Z- zUhs($Ig&D%1Oi~jB2l6tvI36BzPGG#aLh%<(<~(N!luY7elS@8@6tmDLo6Ol}mwgU7s)B`zDO_xE#g|ZGg(_64rgF8_RbNAm zO{mtWnSaL3HrIR$El$)9RMiJ&PvpL%1{Z1qm^v^sGHIYDX6J?r=yJjxGeHau2;#0I zAcV$_nf71|cH~sYOb3*zV3a7igHxa*CJ34e$PFfT3%LhwO6vYkal;)s)uHH%`5)WbRy( zFE^r##$LuTh=R6}Pqwz5J#SpVvny(>&JNVldWXAOttGLHVL_u?g%!8AbLr?Q0)Kf0 zYmayg65A0Onh|cX^)lu-Y}-7wCZ;<4V7(G0+#0rQ9@!H;zxJBM9H^xT*F?>(< zmVe}#>;=$c=;5QgKsBO^<;dBVvJ4ZQ{Ihrp9zZx=hv49qw2LCt}zrOs?EHXeLjDr(*c>)yy|7>jwkf7Z;(aj29^8#~X?9{0c|yK8W#eY|q? zp_{9G;zO#pBR?)E^?}#Awchl7B7d?jfn2`)8u^sapKr2{@-C|Va4~Lc{WDj0YI0B$ zmias4r38Mc9{KSX)PF3BtFM0{FY*8Y0h>ugK~y-)ZBsFh<1h>y3fDNTq|!*az`emx z89#!5F!B^bUpVLy*-}WkMVj43%EOknTdU+%6cpp!*(N!|nIWY=NdO?^yeNaB?5ryI?40v3Dci@!+MkkJ!QO3(C`JSmi_i)}}T~#|nF+xv|GU|Tj=Z)>p*>d*bl5Xw0VfR|E17j!YjYTav;wKX-Km4Ran#4OyDN$clv1KF1W_i;T=mg4O^XzUAdinn z{mIOt3>1}_CC-ub-6&GK=i}pnV-^5ZSCpmm4n~uwR_dVtWuXO&b7~~(E$H+6^F?uG z(I!sq9516B17)6HPdM+Y4lNr+(TJD5R7MIwIcL$LqyMe#uUk+IYOPsb00000NkvXXu0mjfq0u7% diff --git a/src/main/resources/assets/unicopia/textures/block/sour_apple_leaves.png b/src/main/resources/assets/unicopia/textures/block/sour_apple_leaves.png index 5a8900de7d20a01cb4e0f8d782599c5fa0d0d215..e3769ea5de386a33d50010975124a408258494e9 100644 GIT binary patch literal 6578 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 DzkR|* diff --git a/src/main/resources/assets/unicopia/textures/block/sweet_apple_leaves.png b/src/main/resources/assets/unicopia/textures/block/sweet_apple_leaves.png index 46bad15f8f6f64c0f642471141859960ec4bddb3..a3fa6b3a476ee8e5a81843a38d56e19309a092e9 100644 GIT binary patch delta 2891 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 OYL#+K`qtFRv;Ph8V(#_; delta 229 zcmV=G=Kt-BYyzLNkl~pOAjZO_es6(G==3bYzcEZL?M4&xUF}tlX zL(*{;`#3I_Jv-n6@kfvPw1k@i84(erJ_~mp5_(pm)TiQ3fnKVr7~$A6lY{Lef-L2v zT?uv93w)G`m(DYlf4wkEnTlrs%ekn}4kUuCb0wyIV`hdsG^E7}ObQ8?2-pMVN203B f2PrC&v~>3a&RxzAxtDP`00000NkvXXu0mjfSB7Yq From 3606c5b0f2690723fc1fb4403bc1b65e32422ad6 Mon Sep 17 00:00:00 2001 From: Sollace Date: Sat, 24 Feb 2024 13:06:32 +0000 Subject: [PATCH 14/14] Fixed mobs not being able to wear the amulets when trinkets is present --- .../java/com/minelittlepony/unicopia/Unicopia.java | 2 +- .../unicopia/compat/trinkets/TrinketsDelegate.java | 12 +++++++----- .../unicopia/container/SpellbookScreenHandler.java | 8 ++++---- .../com/minelittlepony/unicopia/entity/Living.java | 4 ++-- .../entity/effect/SunBlindnessStatusEffect.java | 2 +- .../minelittlepony/unicopia/entity/player/Pony.java | 2 +- .../com/minelittlepony/unicopia/item/AmuletItem.java | 2 +- .../unicopia/item/FriendshipBraceletItem.java | 7 ++++--- .../minelittlepony/unicopia/item/GlassesItem.java | 2 +- .../minelittlepony/unicopia/item/WearableItem.java | 10 +++++----- .../unicopia/mixin/trinkets/MixinScreenHandler.java | 6 +++--- 11 files changed, 30 insertions(+), 27 deletions(-) diff --git a/src/main/java/com/minelittlepony/unicopia/Unicopia.java b/src/main/java/com/minelittlepony/unicopia/Unicopia.java index 03e48838..4758e13f 100644 --- a/src/main/java/com/minelittlepony/unicopia/Unicopia.java +++ b/src/main/java/com/minelittlepony/unicopia/Unicopia.java @@ -69,7 +69,7 @@ public class Unicopia implements ModInitializer { UCriteria.bootstrap(); UEntities.bootstrap(); Commands.bootstrap(); - TrinketsDelegate.getInstance().bootstrap(); + TrinketsDelegate.getInstance(null).bootstrap(); ServerTickEvents.END_WORLD_TICK.register(w -> { ((BlockDestructionManager.Source)w).getDestructionManager().tick(); diff --git a/src/main/java/com/minelittlepony/unicopia/compat/trinkets/TrinketsDelegate.java b/src/main/java/com/minelittlepony/unicopia/compat/trinkets/TrinketsDelegate.java index dfa184dc..6c896cf4 100644 --- a/src/main/java/com/minelittlepony/unicopia/compat/trinkets/TrinketsDelegate.java +++ b/src/main/java/com/minelittlepony/unicopia/compat/trinkets/TrinketsDelegate.java @@ -4,6 +4,8 @@ import java.util.*; import java.util.stream.Collectors; import java.util.stream.Stream; +import org.jetbrains.annotations.Nullable; + import com.minelittlepony.unicopia.EntityConvertable; import com.minelittlepony.unicopia.container.SpellbookScreenHandler; @@ -11,6 +13,7 @@ import net.fabricmc.loader.api.FabricLoader; import net.minecraft.entity.EquipmentSlot; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.mob.MobEntity; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.screen.slot.Slot; @@ -26,11 +29,10 @@ public interface TrinketsDelegate { TrinketsDelegate EMPTY = new TrinketsDelegate() {}; - static TrinketsDelegate getInstance() { - if (!hasTrinkets()) { + static TrinketsDelegate getInstance(@Nullable LivingEntity entity) { + if (!(entity instanceof PlayerEntity && hasTrinkets())) { return EMPTY; } - return TrinketsDelegateImpl.INSTANCE; } @@ -101,7 +103,7 @@ public interface TrinketsDelegate { interface Inventory extends EntityConvertable { default Stream getEquippedStacks(Identifier slot) { - return TrinketsDelegate.getInstance().getEquipped(asEntity(), slot); + return TrinketsDelegate.getInstance(asEntity()).getEquipped(asEntity(), slot); } default ItemStack getEquippedStack(Identifier slot) { @@ -109,7 +111,7 @@ public interface TrinketsDelegate { } default void equipStack(Identifier slot, ItemStack stack) { - TrinketsDelegate.getInstance().setEquippedStack(asEntity(), slot, stack); + TrinketsDelegate.getInstance(asEntity()).setEquippedStack(asEntity(), slot, stack); } } } diff --git a/src/main/java/com/minelittlepony/unicopia/container/SpellbookScreenHandler.java b/src/main/java/com/minelittlepony/unicopia/container/SpellbookScreenHandler.java index 0bed725f..5f675f85 100644 --- a/src/main/java/com/minelittlepony/unicopia/container/SpellbookScreenHandler.java +++ b/src/main/java/com/minelittlepony/unicopia/container/SpellbookScreenHandler.java @@ -149,10 +149,10 @@ public class SpellbookScreenHandler extends ScreenHandler { } }); - TrinketsDelegate.getInstance().createSlot(this, inv.player, TrinketsDelegate.FACE, 0, rightHandX, inventoryY + slotSpacing * 6).ifPresent(this::addSlot); - TrinketsDelegate.getInstance().createSlot(this, inv.player, TrinketsDelegate.NECKLACE, 0, leftHandX, equipmentY + slotSpacing).ifPresent(this::addSlot); - TrinketsDelegate.getInstance().createSlot(this, inv.player, TrinketsDelegate.MAINHAND, 0, leftHandX, equipmentY).ifPresent(this::addSlot); - TrinketsDelegate.getInstance().createSlot(this, inv.player, TrinketsDelegate.OFFHAND, 0, rightHandX, equipmentY).ifPresent(this::addSlot); + TrinketsDelegate.getInstance(inv.player).createSlot(this, inv.player, TrinketsDelegate.FACE, 0, rightHandX, inventoryY + slotSpacing * 6).ifPresent(this::addSlot); + TrinketsDelegate.getInstance(inv.player).createSlot(this, inv.player, TrinketsDelegate.NECKLACE, 0, leftHandX, equipmentY + slotSpacing).ifPresent(this::addSlot); + TrinketsDelegate.getInstance(inv.player).createSlot(this, inv.player, TrinketsDelegate.MAINHAND, 0, leftHandX, equipmentY).ifPresent(this::addSlot); + TrinketsDelegate.getInstance(inv.player).createSlot(this, inv.player, TrinketsDelegate.OFFHAND, 0, rightHandX, equipmentY).ifPresent(this::addSlot); addSlot(outputSlot = new OutputSlot(this, inventory.player, input, result, 0, gemPos.get(0))); diff --git a/src/main/java/com/minelittlepony/unicopia/entity/Living.java b/src/main/java/com/minelittlepony/unicopia/entity/Living.java index 53384423..40d6ee7f 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/Living.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/Living.java @@ -512,7 +512,7 @@ public abstract class Living implements Equine, Caste if (glasses.getItem() == UItems.SUNGLASSES) { ItemStack broken = UItems.BROKEN_SUNGLASSES.getDefaultStack(); broken.setNbt(glasses.getNbt()); - TrinketsDelegate.getInstance().setEquippedStack(entity, TrinketsDelegate.FACE, broken); + TrinketsDelegate.getInstance(entity).setEquippedStack(entity, TrinketsDelegate.FACE, broken); playSound(USounds.ITEM_SUNGLASSES_SHATTER, 1, 1); } } @@ -550,7 +550,7 @@ public abstract class Living implements Equine, Caste return StreamSupport.stream(entity.getArmorItems().spliterator(), false); } return Stream.concat( - TrinketsDelegate.getInstance().getEquipped(entity, TrinketsDelegate.NECKLACE), + TrinketsDelegate.getInstance(entity).getEquipped(entity, TrinketsDelegate.NECKLACE), StreamSupport.stream(entity.getArmorItems().spliterator(), false) ); } diff --git a/src/main/java/com/minelittlepony/unicopia/entity/effect/SunBlindnessStatusEffect.java b/src/main/java/com/minelittlepony/unicopia/entity/effect/SunBlindnessStatusEffect.java index 0361d84b..c9f679c6 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/effect/SunBlindnessStatusEffect.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/effect/SunBlindnessStatusEffect.java @@ -73,7 +73,7 @@ public class SunBlindnessStatusEffect extends StatusEffect { } if (entity.getEquippedStack(EquipmentSlot.HEAD).isIn(UTags.SHADES) - || TrinketsDelegate.getInstance().getEquipped(entity, TrinketsDelegate.FACE).anyMatch(i -> i.isIn(UTags.SHADES)) + || TrinketsDelegate.getInstance(entity).getEquipped(entity, TrinketsDelegate.FACE).anyMatch(i -> i.isIn(UTags.SHADES)) || entity.isSubmergedInWater()) { return false; } 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 072cee98..67a93b73 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java @@ -530,7 +530,7 @@ public class Pony extends Living implements Copyable, Update } if (getObservedSpecies() == Race.BAT && !entity.hasPortalCooldown()) { - boolean hasShades = TrinketsDelegate.getInstance().getEquipped(entity, TrinketsDelegate.FACE).anyMatch(s -> s.isIn(UTags.SHADES)); + boolean hasShades = TrinketsDelegate.getInstance(entity).getEquipped(entity, TrinketsDelegate.FACE).anyMatch(s -> s.isIn(UTags.SHADES)); if (!this.hasShades && hasShades && getObservedSpecies() == Race.BAT) { UCriteria.WEAR_SHADES.trigger(entity); } diff --git a/src/main/java/com/minelittlepony/unicopia/item/AmuletItem.java b/src/main/java/com/minelittlepony/unicopia/item/AmuletItem.java index a8c34938..b59a878e 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/AmuletItem.java +++ b/src/main/java/com/minelittlepony/unicopia/item/AmuletItem.java @@ -95,7 +95,7 @@ public class AmuletItem extends WearableItem implements ChargeableItem { } public static ItemStack getForEntity(LivingEntity entity) { - return TrinketsDelegate.getInstance().getEquipped(entity, TrinketsDelegate.NECKLACE) + return TrinketsDelegate.getInstance(entity).getEquipped(entity, TrinketsDelegate.NECKLACE) .filter(stack -> stack.getItem() instanceof AmuletItem) .findFirst() .orElse(ItemStack.EMPTY); diff --git a/src/main/java/com/minelittlepony/unicopia/item/FriendshipBraceletItem.java b/src/main/java/com/minelittlepony/unicopia/item/FriendshipBraceletItem.java index 4062ae4a..f48e9867 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/FriendshipBraceletItem.java +++ b/src/main/java/com/minelittlepony/unicopia/item/FriendshipBraceletItem.java @@ -126,13 +126,14 @@ public class FriendshipBraceletItem extends WearableItem implements DyeableItem, public static Stream getWornBangles(LivingEntity entity) { return Stream.concat( - TrinketsDelegate.getInstance().getEquipped(entity, TrinketsDelegate.MAINHAND), - TrinketsDelegate.getInstance().getEquipped(entity, TrinketsDelegate.OFFHAND) + TrinketsDelegate.getInstance(entity).getEquipped(entity, TrinketsDelegate.MAINHAND), + TrinketsDelegate.getInstance(entity).getEquipped(entity, TrinketsDelegate.OFFHAND) ).filter(stack -> stack.getItem() == UItems.FRIENDSHIP_BRACELET); } public static Stream getWornBangles(LivingEntity entity, Identifier slot) { - return TrinketsDelegate.getInstance().getEquipped(entity, slot) + return TrinketsDelegate.getInstance(entity) + .getEquipped(entity, slot) .filter(stack -> stack.getItem() == UItems.FRIENDSHIP_BRACELET); } } diff --git a/src/main/java/com/minelittlepony/unicopia/item/GlassesItem.java b/src/main/java/com/minelittlepony/unicopia/item/GlassesItem.java index f915d1bf..3c49931e 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/GlassesItem.java +++ b/src/main/java/com/minelittlepony/unicopia/item/GlassesItem.java @@ -29,7 +29,7 @@ public class GlassesItem extends WearableItem { } public static ItemStack getForEntity(LivingEntity entity) { - return TrinketsDelegate.getInstance().getEquipped(entity, TrinketsDelegate.FACE) + return TrinketsDelegate.getInstance(entity).getEquipped(entity, TrinketsDelegate.FACE) .filter(stack -> stack.getItem() instanceof GlassesItem) .findFirst() .orElse(ItemStack.EMPTY); diff --git a/src/main/java/com/minelittlepony/unicopia/item/WearableItem.java b/src/main/java/com/minelittlepony/unicopia/item/WearableItem.java index 1b7067da..fcdf7d9f 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/WearableItem.java +++ b/src/main/java/com/minelittlepony/unicopia/item/WearableItem.java @@ -24,7 +24,7 @@ public abstract class WearableItem extends Item implements Equipment { public WearableItem(FabricItemSettings settings) { super(configureEquipmentSlotSupplier(settings)); DispenserBlock.registerBehavior(this, DISPENSER_BEHAVIOR); - TrinketsDelegate.getInstance().registerTrinket(this); + TrinketsDelegate.getInstance(null).registerTrinket(this); } private static FabricItemSettings configureEquipmentSlotSupplier(FabricItemSettings settings) { @@ -37,8 +37,8 @@ public abstract class WearableItem extends Item implements Equipment { @Override public TypedActionResult use(World world, PlayerEntity player, Hand hand) { ItemStack stack = player.getStackInHand(hand); - return TrinketsDelegate.getInstance().getAvailableTrinketSlots(player, TrinketsDelegate.ALL).stream() - .filter(slotId -> TrinketsDelegate.getInstance().equipStack(player, slotId, stack)) + return TrinketsDelegate.getInstance(player).getAvailableTrinketSlots(player, TrinketsDelegate.ALL).stream() + .filter(slotId -> TrinketsDelegate.getInstance(player).equipStack(player, slotId, stack)) .findAny() .map(slotId -> TypedActionResult.success(stack, world.isClient())) .orElseGet(() -> TypedActionResult.fail(stack)); @@ -66,10 +66,10 @@ public abstract class WearableItem extends Item implements Equipment { EntityPredicates.EXCEPT_SPECTATOR ) .stream() - .flatMap(entity -> TrinketsDelegate.getInstance() + .flatMap(entity -> TrinketsDelegate.getInstance(entity) .getAvailableTrinketSlots(entity, TrinketsDelegate.ALL) .stream() - .filter(slotId -> TrinketsDelegate.getInstance().equipStack(entity, slotId, armor))) + .filter(slotId -> TrinketsDelegate.getInstance(entity).equipStack(entity, slotId, armor))) .findFirst() .isPresent(); } diff --git a/src/main/java/com/minelittlepony/unicopia/mixin/trinkets/MixinScreenHandler.java b/src/main/java/com/minelittlepony/unicopia/mixin/trinkets/MixinScreenHandler.java index f716263d..32484ca0 100644 --- a/src/main/java/com/minelittlepony/unicopia/mixin/trinkets/MixinScreenHandler.java +++ b/src/main/java/com/minelittlepony/unicopia/mixin/trinkets/MixinScreenHandler.java @@ -38,7 +38,7 @@ abstract class MixinScreenHandler { ) // redirect slot.getMaxItemCount() to stack aware version protected int onGetMaxItemCount(Slot sender, ItemStack stack) { - return TrinketsDelegate.getInstance().isTrinketSlot(sender) ? sender.getMaxItemCount(stack) : sender.getMaxItemCount(); + return TrinketsDelegate.getInstance(null).isTrinketSlot(sender) ? sender.getMaxItemCount(stack) : sender.getMaxItemCount(); } @Redirect(method = "insertItem", @@ -50,7 +50,7 @@ abstract class MixinScreenHandler { ) // redirect "if (!itemStack.isEmpty() && ItemStack.canCombine(stack, itemStack))" -> "if (!canNotInsert(itemStack, slot) && ItemStack.canCombine(stack, itemStack))" protected boolean canNotInsert(ItemStack sender) { - return sender.isEmpty() || (TrinketsDelegate.getInstance().isTrinketSlot(currentSlot) && (currentSlot.getStack().getCount() + sender.getCount()) <= currentSlot.getMaxItemCount(sender)); + return sender.isEmpty() || (TrinketsDelegate.getInstance(null).isTrinketSlot(currentSlot) && (currentSlot.getStack().getCount() + sender.getCount()) <= currentSlot.getMaxItemCount(sender)); } @Redirect(method = "canInsertItemIntoSlot", @@ -60,6 +60,6 @@ abstract class MixinScreenHandler { ) ) private static int onGetMaxCount(ItemStack sender, @Nullable Slot slot) { - return TrinketsDelegate.getInstance().isTrinketSlot(slot) ? slot.getMaxItemCount(sender) : sender.getMaxCount(); + return TrinketsDelegate.getInstance(null).isTrinketSlot(slot) ? slot.getMaxItemCount(sender) : sender.getMaxCount(); } }