From 289aeb0f32ac3025499b5ba3179eb492141dad9d Mon Sep 17 00:00:00 2001 From: pandier Date: Sat, 3 Aug 2024 12:24:36 +0200 Subject: [PATCH 01/12] fix: Issues related to fused explosives --- .../explosives/FusedExplosiveBridge.java | 4 + .../provider/entity/FireworkRocketData.java | 25 ++---- .../provider/entity/FusedExplosiveData.java | 8 +- .../common/data/provider/entity/TNTData.java | 2 - .../common/util/FireworkUtil.java | 81 ++++++++++++++----- .../entity/monster/CreeperMixin_API.java | 1 + .../FireworkRocketEntityMixin_API.java | 1 + .../entity/vehicle/MinecartTNTMixin_API.java | 1 + .../world/entity/item/PrimedTntMixin.java | 10 +++ .../world/entity/monster/CreeperMixin.java | 16 ++++ .../projectile/FireworkRocketEntityMixin.java | 10 +++ .../entity/vehicle/MinecartTNTMixin.java | 16 ++++ 12 files changed, 135 insertions(+), 40 deletions(-) diff --git a/src/main/java/org/spongepowered/common/bridge/explosives/FusedExplosiveBridge.java b/src/main/java/org/spongepowered/common/bridge/explosives/FusedExplosiveBridge.java index 659d4eb9137..734750f8466 100644 --- a/src/main/java/org/spongepowered/common/bridge/explosives/FusedExplosiveBridge.java +++ b/src/main/java/org/spongepowered/common/bridge/explosives/FusedExplosiveBridge.java @@ -34,6 +34,10 @@ public interface FusedExplosiveBridge { + boolean bridge$isPrimed(); + + boolean bridge$setPrimed(boolean primed); + int bridge$getFuseDuration(); void bridge$setFuseDuration(int fuseTicks); diff --git a/src/main/java/org/spongepowered/common/data/provider/entity/FireworkRocketData.java b/src/main/java/org/spongepowered/common/data/provider/entity/FireworkRocketData.java index 840d8545845..1164c43f07e 100644 --- a/src/main/java/org/spongepowered/common/data/provider/entity/FireworkRocketData.java +++ b/src/main/java/org/spongepowered/common/data/provider/entity/FireworkRocketData.java @@ -24,18 +24,14 @@ */ package org.spongepowered.common.data.provider.entity; -import com.google.common.collect.ImmutableList; -import net.minecraft.core.component.DataComponents; import net.minecraft.world.entity.projectile.FireworkRocketEntity; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.component.Fireworks; import org.spongepowered.api.data.Keys; -import org.spongepowered.common.accessor.world.entity.EntityAccessor; -import org.spongepowered.common.accessor.world.entity.projectile.FireworkRocketEntityAccessor; import org.spongepowered.common.data.provider.DataProviderRegistrator; import org.spongepowered.common.util.FireworkUtil; import org.spongepowered.common.util.SpongeTicks; +import java.util.OptionalInt; + public final class FireworkRocketData { private FireworkRocketData() { @@ -47,27 +43,22 @@ public static void register(final DataProviderRegistrator registrator) { .asMutable(FireworkRocketEntity.class) .create(Keys.FIREWORK_EFFECTS) .get(h -> FireworkUtil.getFireworkEffects(h).orElse(null)) - .set(FireworkUtil::setFireworkEffects) - .resetOnDelete(ImmutableList.of()) + .setAnd(FireworkUtil::setFireworkEffects) + .deleteAnd(FireworkUtil::removeFireworkEffects) .create(Keys.FIREWORK_FLIGHT_MODIFIER) .get(h -> { - final ItemStack item = FireworkUtil.getItem(h); - final Fireworks fireworks = item.get(DataComponents.FIREWORKS); - if (fireworks == null) { + final OptionalInt modifier = FireworkUtil.getFlightModifier(h); + if (modifier.isEmpty()) { return null; } - return new SpongeTicks(fireworks.flightDuration()); + return new SpongeTicks(modifier.getAsInt()); }) .setAnd((h, v) -> { final int ticks = SpongeTicks.toSaturatedIntOrInfinite(v); if (v.isInfinite() || ticks < 0 || ticks > Byte.MAX_VALUE) { return false; } - final ItemStack item = FireworkUtil.getItem(h); - final Fireworks fireworks = item.get(DataComponents.FIREWORKS); - item.set(DataComponents.FIREWORKS, new Fireworks((int) v.ticks(), fireworks.explosions())); - ((FireworkRocketEntityAccessor) h).accessor$lifetime(10 * ticks + ((EntityAccessor) h).accessor$random().nextInt(6) + ((EntityAccessor) h).accessor$random().nextInt(7)); - return true; + return FireworkUtil.setFlightModifier(h, ticks); }); } // @formatter:on diff --git a/src/main/java/org/spongepowered/common/data/provider/entity/FusedExplosiveData.java b/src/main/java/org/spongepowered/common/data/provider/entity/FusedExplosiveData.java index a320ae9d0a8..781b998a698 100644 --- a/src/main/java/org/spongepowered/common/data/provider/entity/FusedExplosiveData.java +++ b/src/main/java/org/spongepowered/common/data/provider/entity/FusedExplosiveData.java @@ -39,11 +39,14 @@ private FusedExplosiveData() { public static void register(final DataProviderRegistrator registrator) { registrator .asMutable(FusedExplosive.class) + .create(Keys.IS_PRIMED) + .get(h -> ((FusedExplosiveBridge) h).bridge$isPrimed()) + .setAnd((h, v) -> ((FusedExplosiveBridge) h).bridge$setPrimed(v)) .create(Keys.FUSE_DURATION) .get(h -> new SpongeTicks(((FusedExplosiveBridge) h).bridge$getFuseDuration())) .setAnd((h, v) -> { final int ticks = SpongeTicks.toSaturatedIntOrInfinite(v); - if (!v.isInfinite() || ticks < 0) { + if (v.isInfinite() || ticks < 0) { return false; } ((FusedExplosiveBridge) h).bridge$setFuseDuration(ticks); @@ -56,8 +59,7 @@ public static void register(final DataProviderRegistrator registrator) { if (v.isInfinite() || ticks < 0) { return false; } - // TODO isPrimed on bridge? - if (h.primed().get()) { + if (((FusedExplosiveBridge) h).bridge$isPrimed()) { ((FusedExplosiveBridge) h).bridge$setFuseTicksRemaining(ticks); } return true; diff --git a/src/main/java/org/spongepowered/common/data/provider/entity/TNTData.java b/src/main/java/org/spongepowered/common/data/provider/entity/TNTData.java index f17a33c896b..cac00f141a5 100644 --- a/src/main/java/org/spongepowered/common/data/provider/entity/TNTData.java +++ b/src/main/java/org/spongepowered/common/data/provider/entity/TNTData.java @@ -44,8 +44,6 @@ public static void register(final DataProviderRegistrator registrator) { .create(Keys.DETONATOR) .get(h -> (Living) h.getOwner()) .set((h, v) -> ((PrimedTntAccessor) h).accessor$owner((LivingEntity) v)) - .create(Keys.IS_PRIMED) - .get(h -> !h.isRemoved() && h.getFuse() > 0) .create(Keys.BLOCK_STATE) .get(h -> (BlockState) h.getBlockState()) .set((h, v) -> h.setBlockState((net.minecraft.world.level.block.state.BlockState) v)); diff --git a/src/main/java/org/spongepowered/common/util/FireworkUtil.java b/src/main/java/org/spongepowered/common/util/FireworkUtil.java index 173abfa996c..d144d3f09c4 100644 --- a/src/main/java/org/spongepowered/common/util/FireworkUtil.java +++ b/src/main/java/org/spongepowered/common/util/FireworkUtil.java @@ -32,37 +32,47 @@ import net.minecraft.world.item.component.Fireworks; import org.spongepowered.api.item.FireworkEffect; import org.spongepowered.api.item.ItemTypes; +import org.spongepowered.common.accessor.world.entity.EntityAccessor; import org.spongepowered.common.accessor.world.entity.projectile.FireworkRocketEntityAccessor; import org.spongepowered.common.item.SpongeItemStack; import java.util.Collections; import java.util.List; import java.util.Optional; +import java.util.OptionalInt; +import java.util.function.Function; public final class FireworkUtil { + public static boolean setFireworkEffects(final FireworkRocketEntity firework, final List effects) { + return updateFireworkRocketItem(firework, item -> setFireworkEffects(item, effects)); + } - public static boolean setFireworkEffects(final Object object, final List effects) { + public static boolean setFireworkEffects(final ItemStack item, final List effects) { if (effects.isEmpty()) { - return FireworkUtil.removeFireworkEffects(object); + return FireworkUtil.removeFireworkEffects(item); } - final ItemStack item = FireworkUtil.getItem(object); + if (item.isEmpty()) { return false; } if (item.getItem() == Items.FIREWORK_STAR) { - item.set(DataComponents.FIREWORK_EXPLOSION, (FireworkExplosion) (Object) effects.get(0)); + item.set(DataComponents.FIREWORK_EXPLOSION, (FireworkExplosion) (Object) effects.getFirst()); return true; } else if (item.getItem() == Items.FIREWORK_ROCKET) { final List mcEffects = effects.stream().map(FireworkExplosion.class::cast).toList(); item.update(DataComponents.FIREWORKS, new Fireworks(1, Collections.emptyList()), p -> new Fireworks(p.flightDuration(), mcEffects)); return true; } + return false; } - public static Optional> getFireworkEffects(final Object object) { - final ItemStack item = FireworkUtil.getItem(object); + public static Optional> getFireworkEffects(final FireworkRocketEntity firework) { + return getFireworkEffects(getItem(firework)); + } + + public static Optional> getFireworkEffects(final ItemStack item) { if (item.isEmpty()) { return Optional.empty(); } @@ -83,8 +93,11 @@ public static Optional> getFireworkEffects(final Object obj return Optional.of(List.of((FireworkEffect) (Object) fireworkExplosion)); } - public static boolean removeFireworkEffects(final Object object) { - final ItemStack item = FireworkUtil.getItem(object); + public static boolean removeFireworkEffects(final FireworkRocketEntity firework) { + return updateFireworkRocketItem(firework, FireworkUtil::removeFireworkEffects); + } + + public static boolean removeFireworkEffects(final ItemStack item) { if (item.isEmpty()) { return false; } @@ -103,6 +116,48 @@ public static boolean removeFireworkEffects(final Object object) { return false; } + public static boolean setFlightModifier(final FireworkRocketEntity firework, final int modifier) { + if (updateFireworkRocketItem(firework, item -> setFlightModifier(item, modifier))) { + int lifetime = 10 * modifier + ((EntityAccessor) firework).accessor$random().nextInt(6) + ((EntityAccessor) firework).accessor$random().nextInt(7); + ((FireworkRocketEntityAccessor) firework).accessor$lifetime(lifetime); + return true; + } + return false; + } + + public static boolean setFlightModifier(final ItemStack item, final int modifier) { + if (item.isEmpty()) { + return false; + } + + if (item.getItem() == Items.FIREWORK_ROCKET) { + item.update(DataComponents.FIREWORKS, new Fireworks(1, Collections.emptyList()), p -> new Fireworks(modifier, p.explosions())); + return true; + } + return false; + } + + public static OptionalInt getFlightModifier(final FireworkRocketEntity firework) { + return getFlightModifier(getItem(firework)); + } + + public static OptionalInt getFlightModifier(final ItemStack item) { + final Fireworks fireworks = item.get(DataComponents.FIREWORKS); + if (fireworks == null) { + return OptionalInt.empty(); + } + return OptionalInt.of(fireworks.flightDuration()); + } + + public static boolean updateFireworkRocketItem(final FireworkRocketEntity firework, final Function function) { + final ItemStack item = getItem(firework); + if (function.apply(item)) { + firework.getEntityData().set(FireworkRocketEntityAccessor.accessor$DATA_ID_FIREWORKS_ITEM(), item); + return true; + } + return false; + } + public static ItemStack getItem(final FireworkRocketEntity firework) { ItemStack item = firework.getEntityData().get(FireworkRocketEntityAccessor.accessor$DATA_ID_FIREWORKS_ITEM()); if (item.isEmpty()) { @@ -112,16 +167,6 @@ public static ItemStack getItem(final FireworkRocketEntity firework) { return item; } - private static ItemStack getItem(final Object object) { - if (object instanceof ItemStack) { - return (ItemStack) object; - } - if (object instanceof FireworkRocketEntity) { - return FireworkUtil.getItem((FireworkRocketEntity) object); - } - return ItemStack.EMPTY; - } - private FireworkUtil() { } } diff --git a/src/mixins/java/org/spongepowered/common/mixin/api/minecraft/world/entity/monster/CreeperMixin_API.java b/src/mixins/java/org/spongepowered/common/mixin/api/minecraft/world/entity/monster/CreeperMixin_API.java index 6c9f31e89d2..7d38578ce20 100644 --- a/src/mixins/java/org/spongepowered/common/mixin/api/minecraft/world/entity/monster/CreeperMixin_API.java +++ b/src/mixins/java/org/spongepowered/common/mixin/api/minecraft/world/entity/monster/CreeperMixin_API.java @@ -49,6 +49,7 @@ public void detonate() { final Set> values = super.api$getVanillaValues(); values.add(this.requireValue(Keys.FUSE_DURATION).asImmutable()); + values.add(this.requireValue(Keys.IS_PRIMED).asImmutable()); values.add(this.requireValue(Keys.IS_CHARGED).asImmutable()); values.add(this.requireValue(Keys.TICKS_REMAINING).asImmutable()); diff --git a/src/mixins/java/org/spongepowered/common/mixin/api/minecraft/world/entity/projectile/FireworkRocketEntityMixin_API.java b/src/mixins/java/org/spongepowered/common/mixin/api/minecraft/world/entity/projectile/FireworkRocketEntityMixin_API.java index ac21fff7c71..10eb236b171 100644 --- a/src/mixins/java/org/spongepowered/common/mixin/api/minecraft/world/entity/projectile/FireworkRocketEntityMixin_API.java +++ b/src/mixins/java/org/spongepowered/common/mixin/api/minecraft/world/entity/projectile/FireworkRocketEntityMixin_API.java @@ -53,6 +53,7 @@ public void detonate() { final Set> values = super.api$getVanillaValues(); values.add(this.requireValue(Keys.FUSE_DURATION).asImmutable()); + values.add(this.requireValue(Keys.IS_PRIMED).asImmutable()); values.add(this.requireValue(Keys.TICKS_REMAINING).asImmutable()); this.getValue(Keys.EXPLOSION_RADIUS).map(Value::asImmutable).ifPresent(values::add); diff --git a/src/mixins/java/org/spongepowered/common/mixin/api/minecraft/world/entity/vehicle/MinecartTNTMixin_API.java b/src/mixins/java/org/spongepowered/common/mixin/api/minecraft/world/entity/vehicle/MinecartTNTMixin_API.java index ee926309b45..5ed1652b6e3 100644 --- a/src/mixins/java/org/spongepowered/common/mixin/api/minecraft/world/entity/vehicle/MinecartTNTMixin_API.java +++ b/src/mixins/java/org/spongepowered/common/mixin/api/minecraft/world/entity/vehicle/MinecartTNTMixin_API.java @@ -46,6 +46,7 @@ public void detonate() { final Set> values = super.api$getVanillaValues(); values.add(this.requireValue(Keys.FUSE_DURATION).asImmutable()); + values.add(this.requireValue(Keys.IS_PRIMED).asImmutable()); values.add(this.requireValue(Keys.TICKS_REMAINING).asImmutable()); this.getValue(Keys.EXPLOSION_RADIUS).map(Value::asImmutable).ifPresent(values::add); diff --git a/src/mixins/java/org/spongepowered/common/mixin/core/world/entity/item/PrimedTntMixin.java b/src/mixins/java/org/spongepowered/common/mixin/core/world/entity/item/PrimedTntMixin.java index 7e3354ea434..27903b1d2a7 100644 --- a/src/mixins/java/org/spongepowered/common/mixin/core/world/entity/item/PrimedTntMixin.java +++ b/src/mixins/java/org/spongepowered/common/mixin/core/world/entity/item/PrimedTntMixin.java @@ -84,6 +84,16 @@ public abstract class PrimedTntMixin extends EntityMixin implements PrimedTntBri this.bridge$explosionRadius = radius == null ? Constants.Entity.PrimedTNT.DEFAULT_EXPLOSION_RADIUS : radius; } + @Override + public boolean bridge$isPrimed() { + return true; + } + + @Override + public boolean bridge$setPrimed(boolean primed) { + return false; + } + @Override public int bridge$getFuseDuration() { return this.bridge$fuseDuration; diff --git a/src/mixins/java/org/spongepowered/common/mixin/core/world/entity/monster/CreeperMixin.java b/src/mixins/java/org/spongepowered/common/mixin/core/world/entity/monster/CreeperMixin.java index 76bdff39e87..2db400fb41f 100644 --- a/src/mixins/java/org/spongepowered/common/mixin/core/world/entity/monster/CreeperMixin.java +++ b/src/mixins/java/org/spongepowered/common/mixin/core/world/entity/monster/CreeperMixin.java @@ -77,6 +77,22 @@ public abstract class CreeperMixin extends MonsterMixin implements FusedExplosiv this.explosionRadius = radius == null ? Constants.Entity.Creeper.DEFAULT_EXPLOSION_RADIUS : radius; } + @Override + public boolean bridge$isPrimed() { + return shadow$getSwellDir() > 0; + } + + @Override + public boolean bridge$setPrimed(boolean primed) { + if (primed) { + if (!bridge$isPrimed() && bridge$shouldPrime()) { + shadow$ignite(); + } + return true; + } + return false; + } + @Override public int bridge$getFuseDuration() { return this.impl$fuseDuration; diff --git a/src/mixins/java/org/spongepowered/common/mixin/core/world/entity/projectile/FireworkRocketEntityMixin.java b/src/mixins/java/org/spongepowered/common/mixin/core/world/entity/projectile/FireworkRocketEntityMixin.java index 221f8b7917b..f4c26252ee6 100644 --- a/src/mixins/java/org/spongepowered/common/mixin/core/world/entity/projectile/FireworkRocketEntityMixin.java +++ b/src/mixins/java/org/spongepowered/common/mixin/core/world/entity/projectile/FireworkRocketEntityMixin.java @@ -56,6 +56,16 @@ public abstract class FireworkRocketEntityMixin extends ProjectileMixin implemen private int impl$explosionRadius = Constants.Entity.Firework.DEFAULT_EXPLOSION_RADIUS; + @Override + public boolean bridge$isPrimed() { + return true; + } + + @Override + public boolean bridge$setPrimed(boolean primed) { + return false; + } + @Override public int bridge$getFuseDuration() { return this.lifetime; diff --git a/src/mixins/java/org/spongepowered/common/mixin/core/world/entity/vehicle/MinecartTNTMixin.java b/src/mixins/java/org/spongepowered/common/mixin/core/world/entity/vehicle/MinecartTNTMixin.java index 9a73dfd65c5..0fa760b069a 100644 --- a/src/mixins/java/org/spongepowered/common/mixin/core/world/entity/vehicle/MinecartTNTMixin.java +++ b/src/mixins/java/org/spongepowered/common/mixin/core/world/entity/vehicle/MinecartTNTMixin.java @@ -61,6 +61,8 @@ public abstract class MinecartTNTMixin extends AbstractMinecartMixin implements // @formatter:off @Shadow private int fuse; + @Shadow public abstract boolean shadow$isPrimed(); + @Shadow public abstract void shadow$primeFuse(); // @formatter:on @Nullable private Integer impl$explosionRadius = null; @@ -78,6 +80,20 @@ public abstract class MinecartTNTMixin extends AbstractMinecartMixin implements this.impl$explosionRadius = radius; } + @Override + public boolean bridge$isPrimed() { + return shadow$isPrimed(); + } + + @Override + public boolean bridge$setPrimed(boolean primed) { + if (primed) { + shadow$primeFuse(); + return true; + } + return false; + } + @Override public int bridge$getFuseDuration() { return this.impl$fuseDuration; From 683ee692adfd368de1f918f85d0bfa99cac12181 Mon Sep 17 00:00:00 2001 From: pandier Date: Sat, 3 Aug 2024 12:26:32 +0200 Subject: [PATCH 02/12] fix: Add firework flight modifier value to firework rocket item stacks --- .../item/stack/FireworkItemStackData.java | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/spongepowered/common/data/provider/item/stack/FireworkItemStackData.java b/src/main/java/org/spongepowered/common/data/provider/item/stack/FireworkItemStackData.java index ad70e17c417..1c8fa062d82 100644 --- a/src/main/java/org/spongepowered/common/data/provider/item/stack/FireworkItemStackData.java +++ b/src/main/java/org/spongepowered/common/data/provider/item/stack/FireworkItemStackData.java @@ -29,6 +29,9 @@ import org.spongepowered.api.data.Keys; import org.spongepowered.common.data.provider.DataProviderRegistrator; import org.spongepowered.common.util.FireworkUtil; +import org.spongepowered.common.util.SpongeTicks; + +import java.util.OptionalInt; public final class FireworkItemStackData { @@ -37,14 +40,29 @@ private FireworkItemStackData() { // @formatter:off public static void register(final DataProviderRegistrator registrator) { - // TODO DataComponents.FIREWORKS - flight_duration registrator .asMutable(ItemStack.class) .create(Keys.FIREWORK_EFFECTS) .get(h -> FireworkUtil.getFireworkEffects(h).orElse(null)) - .set(FireworkUtil::setFireworkEffects) - .delete(FireworkUtil::removeFireworkEffects) - .supports(h -> h.getItem() == Items.FIREWORK_ROCKET || h.getItem() == Items.FIREWORK_STAR); + .setAnd(FireworkUtil::setFireworkEffects) + .deleteAnd(FireworkUtil::removeFireworkEffects) + .supports(h -> h.getItem() == Items.FIREWORK_ROCKET || h.getItem() == Items.FIREWORK_STAR) + .create(Keys.FIREWORK_FLIGHT_MODIFIER) + .get(h -> { + final OptionalInt modifier = FireworkUtil.getFlightModifier(h); + if (modifier.isEmpty()) { + return null; + } + return new SpongeTicks(modifier.getAsInt()); + }) + .setAnd((h, v) -> { + final int ticks = SpongeTicks.toSaturatedIntOrInfinite(v); + if (v.isInfinite() || ticks < 0 || ticks > Byte.MAX_VALUE) { + return false; + } + return FireworkUtil.setFlightModifier(h, ticks); + }) + .supports(h -> h.getItem() == Items.FIREWORK_ROCKET); } // @formatter:on } From 83798cb9c06f80a294c1f71eb86e6975fd5fe416 Mon Sep 17 00:00:00 2001 From: pandier Date: Sun, 4 Aug 2024 10:47:42 +0200 Subject: [PATCH 03/12] fix: Firework effects still not synchronizing --- .../java/org/spongepowered/common/util/FireworkUtil.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/spongepowered/common/util/FireworkUtil.java b/src/main/java/org/spongepowered/common/util/FireworkUtil.java index d144d3f09c4..67c5208f172 100644 --- a/src/main/java/org/spongepowered/common/util/FireworkUtil.java +++ b/src/main/java/org/spongepowered/common/util/FireworkUtil.java @@ -150,7 +150,7 @@ public static OptionalInt getFlightModifier(final ItemStack item) { } public static boolean updateFireworkRocketItem(final FireworkRocketEntity firework, final Function function) { - final ItemStack item = getItem(firework); + final ItemStack item = getItem(firework).copy(); if (function.apply(item)) { firework.getEntityData().set(FireworkRocketEntityAccessor.accessor$DATA_ID_FIREWORKS_ITEM(), item); return true; @@ -161,8 +161,7 @@ public static boolean updateFireworkRocketItem(final FireworkRocketEntity firewo public static ItemStack getItem(final FireworkRocketEntity firework) { ItemStack item = firework.getEntityData().get(FireworkRocketEntityAccessor.accessor$DATA_ID_FIREWORKS_ITEM()); if (item.isEmpty()) { - item = (ItemStack) (Object) new SpongeItemStack.BuilderImpl().itemType(ItemTypes.FIREWORK_ROCKET).build(); - firework.getEntityData().set(FireworkRocketEntityAccessor.accessor$DATA_ID_FIREWORKS_ITEM(), item); + return (ItemStack) (Object) new SpongeItemStack.BuilderImpl().itemType(ItemTypes.FIREWORK_ROCKET).build(); } return item; } From 0586746f1b40a548d7c34ba9a2562b01ff833f8c Mon Sep 17 00:00:00 2001 From: pandier Date: Sun, 4 Aug 2024 10:58:51 +0200 Subject: [PATCH 04/12] fix: Some bugs and clean up --- .../world/entity/item/PrimedTntMixin_API.java | 2 +- .../projectile/FireworkRocketEntityMixin_API.java | 3 --- .../mixin/core/world/entity/item/PrimedTntMixin.java | 6 ++++-- .../mixin/core/world/entity/monster/CreeperMixin.java | 11 +++++------ .../core/world/entity/vehicle/MinecartTNTMixin.java | 3 +++ 5 files changed, 13 insertions(+), 12 deletions(-) diff --git a/src/mixins/java/org/spongepowered/common/mixin/api/minecraft/world/entity/item/PrimedTntMixin_API.java b/src/mixins/java/org/spongepowered/common/mixin/api/minecraft/world/entity/item/PrimedTntMixin_API.java index 4c2d9b2b75d..393c3a41755 100644 --- a/src/mixins/java/org/spongepowered/common/mixin/api/minecraft/world/entity/item/PrimedTntMixin_API.java +++ b/src/mixins/java/org/spongepowered/common/mixin/api/minecraft/world/entity/item/PrimedTntMixin_API.java @@ -43,8 +43,8 @@ public abstract class PrimedTntMixin_API extends EntityMixin_API implements Prim @Override public void detonate() { - this.shadow$discard(); this.shadow$explode(); + this.shadow$discard(); } @Override diff --git a/src/mixins/java/org/spongepowered/common/mixin/api/minecraft/world/entity/projectile/FireworkRocketEntityMixin_API.java b/src/mixins/java/org/spongepowered/common/mixin/api/minecraft/world/entity/projectile/FireworkRocketEntityMixin_API.java index 10eb236b171..304d79b2767 100644 --- a/src/mixins/java/org/spongepowered/common/mixin/api/minecraft/world/entity/projectile/FireworkRocketEntityMixin_API.java +++ b/src/mixins/java/org/spongepowered/common/mixin/api/minecraft/world/entity/projectile/FireworkRocketEntityMixin_API.java @@ -37,14 +37,11 @@ public abstract class FireworkRocketEntityMixin_API extends ProjectileMixin_API implements FireworkRocket { // @formatter:off - @Shadow private int life; - @Shadow private int lifetime; @Shadow protected abstract void shadow$explode(); // @formatter:on @Override public void detonate() { - this.life = this.lifetime + 1; this.shadow$explode(); } diff --git a/src/mixins/java/org/spongepowered/common/mixin/core/world/entity/item/PrimedTntMixin.java b/src/mixins/java/org/spongepowered/common/mixin/core/world/entity/item/PrimedTntMixin.java index 27903b1d2a7..7cda7bd1902 100644 --- a/src/mixins/java/org/spongepowered/common/mixin/core/world/entity/item/PrimedTntMixin.java +++ b/src/mixins/java/org/spongepowered/common/mixin/core/world/entity/item/PrimedTntMixin.java @@ -63,6 +63,7 @@ public abstract class PrimedTntMixin extends EntityMixin implements PrimedTntBri @Nullable private LivingEntity impl$detonator; private int bridge$explosionRadius = Constants.Entity.PrimedTNT.DEFAULT_EXPLOSION_RADIUS; private int bridge$fuseDuration = Constants.Entity.PrimedTNT.DEFAULT_FUSE_DURATION; + private boolean impl$postPrimeTriggered = false; @Override public void bridge$setDetonator(final LivingEntity detonator) { @@ -102,6 +103,7 @@ public abstract class PrimedTntMixin extends EntityMixin implements PrimedTntBri @Override public void bridge$setFuseDuration(final int fuseTicks) { this.bridge$fuseDuration = fuseTicks; + this.shadow$setFuse(fuseTicks); } @Override @@ -139,7 +141,8 @@ public abstract class PrimedTntMixin extends EntityMixin implements PrimedTntBri @Inject(method = "tick()V", at = @At("RETURN")) private void impl$updateTNTPushPrime(final CallbackInfo ci) { - if (this.shadow$getFuse() == this.bridge$fuseDuration - 1 && !this.shadow$level().isClientSide) { + if (!impl$postPrimeTriggered && !this.shadow$level().isClientSide) { + impl$postPrimeTriggered = true; try (final CauseStackManager.StackFrame frame = PhaseTracker.getCauseStackManager().pushCauseFrame()) { if (this.impl$detonator != null) { frame.pushCause(this.impl$detonator); @@ -149,5 +152,4 @@ public abstract class PrimedTntMixin extends EntityMixin implements PrimedTntBri } } } - } diff --git a/src/mixins/java/org/spongepowered/common/mixin/core/world/entity/monster/CreeperMixin.java b/src/mixins/java/org/spongepowered/common/mixin/core/world/entity/monster/CreeperMixin.java index 2db400fb41f..6e3373d231d 100644 --- a/src/mixins/java/org/spongepowered/common/mixin/core/world/entity/monster/CreeperMixin.java +++ b/src/mixins/java/org/spongepowered/common/mixin/core/world/entity/monster/CreeperMixin.java @@ -57,10 +57,10 @@ public abstract class CreeperMixin extends MonsterMixin implements FusedExplosiv @Shadow private int explosionRadius; @Shadow public abstract void shadow$ignite(); + @Shadow public abstract boolean shadow$isIgnited(); @Shadow public abstract int shadow$getSwellDir(); // @formatter:on - private int impl$fuseDuration = Constants.Entity.Creeper.FUSE_DURATION; private boolean impl$interactPrimeCancelled; private boolean impl$stateDirty; private boolean impl$detonationCancelled; @@ -79,7 +79,7 @@ public abstract class CreeperMixin extends MonsterMixin implements FusedExplosiv @Override public boolean bridge$isPrimed() { - return shadow$getSwellDir() > 0; + return shadow$isIgnited() || shadow$getSwellDir() == Constants.Entity.Creeper.STATE_PRIMED; } @Override @@ -95,12 +95,12 @@ public abstract class CreeperMixin extends MonsterMixin implements FusedExplosiv @Override public int bridge$getFuseDuration() { - return this.impl$fuseDuration; + return this.maxSwell; } @Override public void bridge$setFuseDuration(final int fuseTicks) { - this.impl$fuseDuration = fuseTicks; + this.maxSwell = fuseTicks; } @Override @@ -123,9 +123,8 @@ public abstract class CreeperMixin extends MonsterMixin implements FusedExplosiv if (this.shadow$level().isClientSide) { return; } - this.bridge$setFuseDuration(this.impl$fuseDuration); - final boolean isPrimed = this.shadow$getSwellDir() == Constants.Entity.Creeper.STATE_PRIMED; + final boolean isPrimed = this.bridge$isPrimed(); if (!isPrimed && state == Constants.Entity.Creeper.STATE_PRIMED && !this.bridge$shouldPrime()) { ci.cancel(); diff --git a/src/mixins/java/org/spongepowered/common/mixin/core/world/entity/vehicle/MinecartTNTMixin.java b/src/mixins/java/org/spongepowered/common/mixin/core/world/entity/vehicle/MinecartTNTMixin.java index 0fa760b069a..a4c798b0459 100644 --- a/src/mixins/java/org/spongepowered/common/mixin/core/world/entity/vehicle/MinecartTNTMixin.java +++ b/src/mixins/java/org/spongepowered/common/mixin/core/world/entity/vehicle/MinecartTNTMixin.java @@ -102,6 +102,9 @@ public abstract class MinecartTNTMixin extends AbstractMinecartMixin implements @Override public void bridge$setFuseDuration(final int fuseTicks) { this.impl$fuseDuration = fuseTicks; + if (shadow$isPrimed()) { + this.fuse = fuseTicks; + } } @Override From 9c791a43fcdc745bc3fcf8b49c7198457ea25668 Mon Sep 17 00:00:00 2001 From: pandier Date: Sun, 4 Aug 2024 11:23:54 +0200 Subject: [PATCH 05/12] fix: Detonate method of creeper only igniting --- .../api/minecraft/world/entity/monster/CreeperMixin_API.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/mixins/java/org/spongepowered/common/mixin/api/minecraft/world/entity/monster/CreeperMixin_API.java b/src/mixins/java/org/spongepowered/common/mixin/api/minecraft/world/entity/monster/CreeperMixin_API.java index 7d38578ce20..35545cd47ed 100644 --- a/src/mixins/java/org/spongepowered/common/mixin/api/minecraft/world/entity/monster/CreeperMixin_API.java +++ b/src/mixins/java/org/spongepowered/common/mixin/api/minecraft/world/entity/monster/CreeperMixin_API.java @@ -36,12 +36,13 @@ public abstract class CreeperMixin_API extends MonsterMixin_API implements Creeper { // @formatter:off - @Shadow public void shadow$ignite() { } // explode + @Shadow protected abstract void shadow$explodeCreeper(); // @formatter:on + @Override public void detonate() { - this.shadow$ignite(); + this.shadow$explodeCreeper(); } @Override From 3d982ba7ab021f70502d88c69c2f6f5ce8d56869 Mon Sep 17 00:00:00 2001 From: pandier Date: Sun, 4 Aug 2024 11:49:58 +0200 Subject: [PATCH 06/12] fix: Remove IS_PRIMED setter (not stable) --- .../bridge/explosives/FusedExplosiveBridge.java | 2 -- .../data/provider/entity/FusedExplosiveData.java | 1 - .../mixin/core/world/entity/item/PrimedTntMixin.java | 5 ----- .../mixin/core/world/entity/monster/CreeperMixin.java | 11 ----------- .../entity/projectile/FireworkRocketEntityMixin.java | 5 ----- .../core/world/entity/vehicle/MinecartTNTMixin.java | 9 --------- 6 files changed, 33 deletions(-) diff --git a/src/main/java/org/spongepowered/common/bridge/explosives/FusedExplosiveBridge.java b/src/main/java/org/spongepowered/common/bridge/explosives/FusedExplosiveBridge.java index 734750f8466..e0625b4da19 100644 --- a/src/main/java/org/spongepowered/common/bridge/explosives/FusedExplosiveBridge.java +++ b/src/main/java/org/spongepowered/common/bridge/explosives/FusedExplosiveBridge.java @@ -36,8 +36,6 @@ public interface FusedExplosiveBridge { boolean bridge$isPrimed(); - boolean bridge$setPrimed(boolean primed); - int bridge$getFuseDuration(); void bridge$setFuseDuration(int fuseTicks); diff --git a/src/main/java/org/spongepowered/common/data/provider/entity/FusedExplosiveData.java b/src/main/java/org/spongepowered/common/data/provider/entity/FusedExplosiveData.java index 781b998a698..0444c5e2d14 100644 --- a/src/main/java/org/spongepowered/common/data/provider/entity/FusedExplosiveData.java +++ b/src/main/java/org/spongepowered/common/data/provider/entity/FusedExplosiveData.java @@ -41,7 +41,6 @@ public static void register(final DataProviderRegistrator registrator) { .asMutable(FusedExplosive.class) .create(Keys.IS_PRIMED) .get(h -> ((FusedExplosiveBridge) h).bridge$isPrimed()) - .setAnd((h, v) -> ((FusedExplosiveBridge) h).bridge$setPrimed(v)) .create(Keys.FUSE_DURATION) .get(h -> new SpongeTicks(((FusedExplosiveBridge) h).bridge$getFuseDuration())) .setAnd((h, v) -> { diff --git a/src/mixins/java/org/spongepowered/common/mixin/core/world/entity/item/PrimedTntMixin.java b/src/mixins/java/org/spongepowered/common/mixin/core/world/entity/item/PrimedTntMixin.java index 7cda7bd1902..e735484880e 100644 --- a/src/mixins/java/org/spongepowered/common/mixin/core/world/entity/item/PrimedTntMixin.java +++ b/src/mixins/java/org/spongepowered/common/mixin/core/world/entity/item/PrimedTntMixin.java @@ -90,11 +90,6 @@ public abstract class PrimedTntMixin extends EntityMixin implements PrimedTntBri return true; } - @Override - public boolean bridge$setPrimed(boolean primed) { - return false; - } - @Override public int bridge$getFuseDuration() { return this.bridge$fuseDuration; diff --git a/src/mixins/java/org/spongepowered/common/mixin/core/world/entity/monster/CreeperMixin.java b/src/mixins/java/org/spongepowered/common/mixin/core/world/entity/monster/CreeperMixin.java index 6e3373d231d..b4c94541afe 100644 --- a/src/mixins/java/org/spongepowered/common/mixin/core/world/entity/monster/CreeperMixin.java +++ b/src/mixins/java/org/spongepowered/common/mixin/core/world/entity/monster/CreeperMixin.java @@ -82,17 +82,6 @@ public abstract class CreeperMixin extends MonsterMixin implements FusedExplosiv return shadow$isIgnited() || shadow$getSwellDir() == Constants.Entity.Creeper.STATE_PRIMED; } - @Override - public boolean bridge$setPrimed(boolean primed) { - if (primed) { - if (!bridge$isPrimed() && bridge$shouldPrime()) { - shadow$ignite(); - } - return true; - } - return false; - } - @Override public int bridge$getFuseDuration() { return this.maxSwell; diff --git a/src/mixins/java/org/spongepowered/common/mixin/core/world/entity/projectile/FireworkRocketEntityMixin.java b/src/mixins/java/org/spongepowered/common/mixin/core/world/entity/projectile/FireworkRocketEntityMixin.java index f4c26252ee6..9fb3c57f3c8 100644 --- a/src/mixins/java/org/spongepowered/common/mixin/core/world/entity/projectile/FireworkRocketEntityMixin.java +++ b/src/mixins/java/org/spongepowered/common/mixin/core/world/entity/projectile/FireworkRocketEntityMixin.java @@ -61,11 +61,6 @@ public abstract class FireworkRocketEntityMixin extends ProjectileMixin implemen return true; } - @Override - public boolean bridge$setPrimed(boolean primed) { - return false; - } - @Override public int bridge$getFuseDuration() { return this.lifetime; diff --git a/src/mixins/java/org/spongepowered/common/mixin/core/world/entity/vehicle/MinecartTNTMixin.java b/src/mixins/java/org/spongepowered/common/mixin/core/world/entity/vehicle/MinecartTNTMixin.java index a4c798b0459..10ed94d1062 100644 --- a/src/mixins/java/org/spongepowered/common/mixin/core/world/entity/vehicle/MinecartTNTMixin.java +++ b/src/mixins/java/org/spongepowered/common/mixin/core/world/entity/vehicle/MinecartTNTMixin.java @@ -85,15 +85,6 @@ public abstract class MinecartTNTMixin extends AbstractMinecartMixin implements return shadow$isPrimed(); } - @Override - public boolean bridge$setPrimed(boolean primed) { - if (primed) { - shadow$primeFuse(); - return true; - } - return false; - } - @Override public int bridge$getFuseDuration() { return this.impl$fuseDuration; From a38195302b046880efbcf7e8d6921d89f8af7673 Mon Sep 17 00:00:00 2001 From: pandier Date: Sat, 24 Aug 2024 12:01:47 +0200 Subject: [PATCH 07/12] refactor: Add type qualifiers --- .../org/spongepowered/common/util/FireworkUtil.java | 12 ++++++------ .../mixin/core/world/entity/item/PrimedTntMixin.java | 4 ++-- .../core/world/entity/vehicle/MinecartTNTMixin.java | 4 ++-- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/main/java/org/spongepowered/common/util/FireworkUtil.java b/src/main/java/org/spongepowered/common/util/FireworkUtil.java index 67c5208f172..b3ddf676954 100644 --- a/src/main/java/org/spongepowered/common/util/FireworkUtil.java +++ b/src/main/java/org/spongepowered/common/util/FireworkUtil.java @@ -44,7 +44,7 @@ public final class FireworkUtil { public static boolean setFireworkEffects(final FireworkRocketEntity firework, final List effects) { - return updateFireworkRocketItem(firework, item -> setFireworkEffects(item, effects)); + return FireworkUtil.updateFireworkRocketItem(firework, item -> FireworkUtil.setFireworkEffects(item, effects)); } public static boolean setFireworkEffects(final ItemStack item, final List effects) { @@ -69,7 +69,7 @@ public static boolean setFireworkEffects(final ItemStack item, final List> getFireworkEffects(final FireworkRocketEntity firework) { - return getFireworkEffects(getItem(firework)); + return FireworkUtil.getFireworkEffects(FireworkUtil.getItem(firework)); } public static Optional> getFireworkEffects(final ItemStack item) { @@ -94,7 +94,7 @@ public static Optional> getFireworkEffects(final ItemStack } public static boolean removeFireworkEffects(final FireworkRocketEntity firework) { - return updateFireworkRocketItem(firework, FireworkUtil::removeFireworkEffects); + return FireworkUtil.updateFireworkRocketItem(firework, FireworkUtil::removeFireworkEffects); } public static boolean removeFireworkEffects(final ItemStack item) { @@ -117,7 +117,7 @@ public static boolean removeFireworkEffects(final ItemStack item) { } public static boolean setFlightModifier(final FireworkRocketEntity firework, final int modifier) { - if (updateFireworkRocketItem(firework, item -> setFlightModifier(item, modifier))) { + if (FireworkUtil.updateFireworkRocketItem(firework, item -> FireworkUtil.setFlightModifier(item, modifier))) { int lifetime = 10 * modifier + ((EntityAccessor) firework).accessor$random().nextInt(6) + ((EntityAccessor) firework).accessor$random().nextInt(7); ((FireworkRocketEntityAccessor) firework).accessor$lifetime(lifetime); return true; @@ -138,7 +138,7 @@ public static boolean setFlightModifier(final ItemStack item, final int modifier } public static OptionalInt getFlightModifier(final FireworkRocketEntity firework) { - return getFlightModifier(getItem(firework)); + return FireworkUtil.getFlightModifier(FireworkUtil.getItem(firework)); } public static OptionalInt getFlightModifier(final ItemStack item) { @@ -150,7 +150,7 @@ public static OptionalInt getFlightModifier(final ItemStack item) { } public static boolean updateFireworkRocketItem(final FireworkRocketEntity firework, final Function function) { - final ItemStack item = getItem(firework).copy(); + final ItemStack item = FireworkUtil.getItem(firework).copy(); if (function.apply(item)) { firework.getEntityData().set(FireworkRocketEntityAccessor.accessor$DATA_ID_FIREWORKS_ITEM(), item); return true; diff --git a/src/mixins/java/org/spongepowered/common/mixin/core/world/entity/item/PrimedTntMixin.java b/src/mixins/java/org/spongepowered/common/mixin/core/world/entity/item/PrimedTntMixin.java index e735484880e..ed921faffd9 100644 --- a/src/mixins/java/org/spongepowered/common/mixin/core/world/entity/item/PrimedTntMixin.java +++ b/src/mixins/java/org/spongepowered/common/mixin/core/world/entity/item/PrimedTntMixin.java @@ -136,8 +136,8 @@ public abstract class PrimedTntMixin extends EntityMixin implements PrimedTntBri @Inject(method = "tick()V", at = @At("RETURN")) private void impl$updateTNTPushPrime(final CallbackInfo ci) { - if (!impl$postPrimeTriggered && !this.shadow$level().isClientSide) { - impl$postPrimeTriggered = true; + if (!this.impl$postPrimeTriggered && !this.shadow$level().isClientSide) { + this.impl$postPrimeTriggered = true; try (final CauseStackManager.StackFrame frame = PhaseTracker.getCauseStackManager().pushCauseFrame()) { if (this.impl$detonator != null) { frame.pushCause(this.impl$detonator); diff --git a/src/mixins/java/org/spongepowered/common/mixin/core/world/entity/vehicle/MinecartTNTMixin.java b/src/mixins/java/org/spongepowered/common/mixin/core/world/entity/vehicle/MinecartTNTMixin.java index 10ed94d1062..8300988befd 100644 --- a/src/mixins/java/org/spongepowered/common/mixin/core/world/entity/vehicle/MinecartTNTMixin.java +++ b/src/mixins/java/org/spongepowered/common/mixin/core/world/entity/vehicle/MinecartTNTMixin.java @@ -82,7 +82,7 @@ public abstract class MinecartTNTMixin extends AbstractMinecartMixin implements @Override public boolean bridge$isPrimed() { - return shadow$isPrimed(); + return this.shadow$isPrimed(); } @Override @@ -93,7 +93,7 @@ public abstract class MinecartTNTMixin extends AbstractMinecartMixin implements @Override public void bridge$setFuseDuration(final int fuseTicks) { this.impl$fuseDuration = fuseTicks; - if (shadow$isPrimed()) { + if (this.shadow$isPrimed()) { this.fuse = fuseTicks; } } From 0b995f3f46873ca53b458f96906e6f1fe6249286 Mon Sep 17 00:00:00 2001 From: pandier Date: Sat, 24 Aug 2024 12:14:06 +0200 Subject: [PATCH 08/12] refactor: Update only lifetime when changing flight modifier of firework entities --- .../java/org/spongepowered/common/util/FireworkUtil.java | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/spongepowered/common/util/FireworkUtil.java b/src/main/java/org/spongepowered/common/util/FireworkUtil.java index b3ddf676954..eaec6d9ee22 100644 --- a/src/main/java/org/spongepowered/common/util/FireworkUtil.java +++ b/src/main/java/org/spongepowered/common/util/FireworkUtil.java @@ -117,12 +117,9 @@ public static boolean removeFireworkEffects(final ItemStack item) { } public static boolean setFlightModifier(final FireworkRocketEntity firework, final int modifier) { - if (FireworkUtil.updateFireworkRocketItem(firework, item -> FireworkUtil.setFlightModifier(item, modifier))) { - int lifetime = 10 * modifier + ((EntityAccessor) firework).accessor$random().nextInt(6) + ((EntityAccessor) firework).accessor$random().nextInt(7); - ((FireworkRocketEntityAccessor) firework).accessor$lifetime(lifetime); - return true; - } - return false; + int lifetime = 10 * modifier + ((EntityAccessor) firework).accessor$random().nextInt(6) + ((EntityAccessor) firework).accessor$random().nextInt(7); + ((FireworkRocketEntityAccessor) firework).accessor$lifetime(lifetime); + return true; } public static boolean setFlightModifier(final ItemStack item, final int modifier) { From f873d9276d3a9a82036cec97aec6f80b699fd137 Mon Sep 17 00:00:00 2001 From: pandier Date: Sat, 24 Aug 2024 12:24:19 +0200 Subject: [PATCH 09/12] Revert "fix: Detonate method of creeper only igniting" This reverts commit 9c791a43fcdc745bc3fcf8b49c7198457ea25668. --- .../api/minecraft/world/entity/monster/CreeperMixin_API.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/mixins/java/org/spongepowered/common/mixin/api/minecraft/world/entity/monster/CreeperMixin_API.java b/src/mixins/java/org/spongepowered/common/mixin/api/minecraft/world/entity/monster/CreeperMixin_API.java index 35545cd47ed..7d38578ce20 100644 --- a/src/mixins/java/org/spongepowered/common/mixin/api/minecraft/world/entity/monster/CreeperMixin_API.java +++ b/src/mixins/java/org/spongepowered/common/mixin/api/minecraft/world/entity/monster/CreeperMixin_API.java @@ -36,13 +36,12 @@ public abstract class CreeperMixin_API extends MonsterMixin_API implements Creeper { // @formatter:off - @Shadow protected abstract void shadow$explodeCreeper(); + @Shadow public void shadow$ignite() { } // explode // @formatter:on - @Override public void detonate() { - this.shadow$explodeCreeper(); + this.shadow$ignite(); } @Override From 0131fedb25590ca8859f9ad3ab44f97653c00e1d Mon Sep 17 00:00:00 2001 From: pandier Date: Sun, 25 Aug 2024 10:14:40 +0200 Subject: [PATCH 10/12] fix: Fuse duration now no longer resets remaining ticks for TNTs --- .../common/mixin/core/world/entity/item/PrimedTntMixin.java | 6 ++---- .../mixin/core/world/entity/vehicle/MinecartTNTMixin.java | 4 ++-- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/mixins/java/org/spongepowered/common/mixin/core/world/entity/item/PrimedTntMixin.java b/src/mixins/java/org/spongepowered/common/mixin/core/world/entity/item/PrimedTntMixin.java index ed921faffd9..a7f3a41906c 100644 --- a/src/mixins/java/org/spongepowered/common/mixin/core/world/entity/item/PrimedTntMixin.java +++ b/src/mixins/java/org/spongepowered/common/mixin/core/world/entity/item/PrimedTntMixin.java @@ -63,7 +63,6 @@ public abstract class PrimedTntMixin extends EntityMixin implements PrimedTntBri @Nullable private LivingEntity impl$detonator; private int bridge$explosionRadius = Constants.Entity.PrimedTNT.DEFAULT_EXPLOSION_RADIUS; private int bridge$fuseDuration = Constants.Entity.PrimedTNT.DEFAULT_FUSE_DURATION; - private boolean impl$postPrimeTriggered = false; @Override public void bridge$setDetonator(final LivingEntity detonator) { @@ -97,8 +96,8 @@ public abstract class PrimedTntMixin extends EntityMixin implements PrimedTntBri @Override public void bridge$setFuseDuration(final int fuseTicks) { + this.shadow$setFuse(Math.max(this.shadow$getFuse() + fuseTicks - this.bridge$fuseDuration, 0)); this.bridge$fuseDuration = fuseTicks; - this.shadow$setFuse(fuseTicks); } @Override @@ -136,8 +135,7 @@ public abstract class PrimedTntMixin extends EntityMixin implements PrimedTntBri @Inject(method = "tick()V", at = @At("RETURN")) private void impl$updateTNTPushPrime(final CallbackInfo ci) { - if (!this.impl$postPrimeTriggered && !this.shadow$level().isClientSide) { - this.impl$postPrimeTriggered = true; + if (this.shadow$getFuse() == this.bridge$fuseDuration - 1 && !this.shadow$level().isClientSide) { try (final CauseStackManager.StackFrame frame = PhaseTracker.getCauseStackManager().pushCauseFrame()) { if (this.impl$detonator != null) { frame.pushCause(this.impl$detonator); diff --git a/src/mixins/java/org/spongepowered/common/mixin/core/world/entity/vehicle/MinecartTNTMixin.java b/src/mixins/java/org/spongepowered/common/mixin/core/world/entity/vehicle/MinecartTNTMixin.java index 8300988befd..6c792215396 100644 --- a/src/mixins/java/org/spongepowered/common/mixin/core/world/entity/vehicle/MinecartTNTMixin.java +++ b/src/mixins/java/org/spongepowered/common/mixin/core/world/entity/vehicle/MinecartTNTMixin.java @@ -92,10 +92,10 @@ public abstract class MinecartTNTMixin extends AbstractMinecartMixin implements @Override public void bridge$setFuseDuration(final int fuseTicks) { - this.impl$fuseDuration = fuseTicks; if (this.shadow$isPrimed()) { - this.fuse = fuseTicks; + this.fuse = Math.max(this.fuse + fuseTicks - this.impl$fuseDuration, 0); } + this.impl$fuseDuration = fuseTicks; } @Override From dd35409c2982e41d8eb9143c0a21ea4ac26bf9aa Mon Sep 17 00:00:00 2001 From: pandier Date: Sun, 25 Aug 2024 13:42:04 +0200 Subject: [PATCH 11/12] fix: Post prime event triggering multiple times for primed TNT --- .../common/mixin/core/world/entity/item/PrimedTntMixin.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/mixins/java/org/spongepowered/common/mixin/core/world/entity/item/PrimedTntMixin.java b/src/mixins/java/org/spongepowered/common/mixin/core/world/entity/item/PrimedTntMixin.java index a7f3a41906c..073e73fdac7 100644 --- a/src/mixins/java/org/spongepowered/common/mixin/core/world/entity/item/PrimedTntMixin.java +++ b/src/mixins/java/org/spongepowered/common/mixin/core/world/entity/item/PrimedTntMixin.java @@ -63,6 +63,7 @@ public abstract class PrimedTntMixin extends EntityMixin implements PrimedTntBri @Nullable private LivingEntity impl$detonator; private int bridge$explosionRadius = Constants.Entity.PrimedTNT.DEFAULT_EXPLOSION_RADIUS; private int bridge$fuseDuration = Constants.Entity.PrimedTNT.DEFAULT_FUSE_DURATION; + private boolean impl$postPrimeTriggered = false; @Override public void bridge$setDetonator(final LivingEntity detonator) { @@ -135,7 +136,8 @@ public abstract class PrimedTntMixin extends EntityMixin implements PrimedTntBri @Inject(method = "tick()V", at = @At("RETURN")) private void impl$updateTNTPushPrime(final CallbackInfo ci) { - if (this.shadow$getFuse() == this.bridge$fuseDuration - 1 && !this.shadow$level().isClientSide) { + if (!this.impl$postPrimeTriggered && !this.shadow$level().isClientSide) { + this.impl$postPrimeTriggered = true; try (final CauseStackManager.StackFrame frame = PhaseTracker.getCauseStackManager().pushCauseFrame()) { if (this.impl$detonator != null) { frame.pushCause(this.impl$detonator); From cb048c8cc054902cb95d43d858362ee2457e5f19 Mon Sep 17 00:00:00 2001 From: pandier Date: Sun, 25 Aug 2024 13:46:57 +0200 Subject: [PATCH 12/12] refactor: Add missing type qualifiers --- .../common/mixin/core/world/entity/monster/CreeperMixin.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mixins/java/org/spongepowered/common/mixin/core/world/entity/monster/CreeperMixin.java b/src/mixins/java/org/spongepowered/common/mixin/core/world/entity/monster/CreeperMixin.java index b4c94541afe..d836d7e70dc 100644 --- a/src/mixins/java/org/spongepowered/common/mixin/core/world/entity/monster/CreeperMixin.java +++ b/src/mixins/java/org/spongepowered/common/mixin/core/world/entity/monster/CreeperMixin.java @@ -79,7 +79,7 @@ public abstract class CreeperMixin extends MonsterMixin implements FusedExplosiv @Override public boolean bridge$isPrimed() { - return shadow$isIgnited() || shadow$getSwellDir() == Constants.Entity.Creeper.STATE_PRIMED; + return this.shadow$isIgnited() || this.shadow$getSwellDir() == Constants.Entity.Creeper.STATE_PRIMED; } @Override