From f7bf687d4e44088ea4f5f67958e314b516a934be Mon Sep 17 00:00:00 2001 From: IzzelAliz Date: Sun, 17 Sep 2023 11:25:27 +0800 Subject: [PATCH] Update upstream --- .../core/block/SculkSpreaderBridge.java | 8 ++++ .../SculkCatalystListenerBridge.java | 8 ++++ .../world/level/block/SculkSpreaderMixin.java | 41 +++++++++++++++++++ .../level/block/entity/BlockEntityMixin.java | 1 + .../entity/SculkCatalystBlockEntityMixin.java | 11 +++++ ...lystBlockEntity_CatalystListenerMixin.java | 21 ++++++++++ .../resources/META-INF/accesstransformer.cfg | 3 ++ .../main/resources/mixins.arclight.core.json | 2 + 8 files changed, 95 insertions(+) create mode 100644 arclight-common/src/main/java/io/izzel/arclight/common/bridge/core/block/SculkSpreaderBridge.java create mode 100644 arclight-common/src/main/java/io/izzel/arclight/common/bridge/core/tileentity/SculkCatalystListenerBridge.java create mode 100644 arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/block/SculkSpreaderMixin.java create mode 100644 arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/block/entity/SculkCatalystBlockEntity_CatalystListenerMixin.java diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/bridge/core/block/SculkSpreaderBridge.java b/arclight-common/src/main/java/io/izzel/arclight/common/bridge/core/block/SculkSpreaderBridge.java new file mode 100644 index 00000000..7261bc32 --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/bridge/core/block/SculkSpreaderBridge.java @@ -0,0 +1,8 @@ +package io.izzel.arclight.common.bridge.core.block; + +import net.minecraft.world.level.Level; + +public interface SculkSpreaderBridge { + + void bridge$setLevel(Level level); +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/bridge/core/tileentity/SculkCatalystListenerBridge.java b/arclight-common/src/main/java/io/izzel/arclight/common/bridge/core/tileentity/SculkCatalystListenerBridge.java new file mode 100644 index 00000000..fed11d00 --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/bridge/core/tileentity/SculkCatalystListenerBridge.java @@ -0,0 +1,8 @@ +package io.izzel.arclight.common.bridge.core.tileentity; + +import net.minecraft.world.level.Level; + +public interface SculkCatalystListenerBridge { + + void bridge$setLevel(Level level); +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/block/SculkSpreaderMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/block/SculkSpreaderMixin.java new file mode 100644 index 00000000..873b710c --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/block/SculkSpreaderMixin.java @@ -0,0 +1,41 @@ +package io.izzel.arclight.common.mixin.core.world.level.block; + +import io.izzel.arclight.common.bridge.core.block.SculkSpreaderBridge; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.SculkSpreader; +import org.bukkit.Bukkit; +import org.bukkit.craftbukkit.v.block.CraftBlock; +import org.bukkit.event.block.SculkBloomEvent; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(SculkSpreader.class) +public abstract class SculkSpreaderMixin implements SculkSpreaderBridge { + + // @formatter:off + @Shadow public abstract boolean isWorldGeneration(); + // @formatter:on + + private transient Level arclight$level; + + @Override + public void bridge$setLevel(Level level) { + this.arclight$level = level; + } + + @Inject(method = "addCursor", cancellable = true, at = @At(value = "INVOKE", remap = false, target = "Ljava/util/List;add(Ljava/lang/Object;)Z")) + private void arclight$bloomEvent(SculkSpreader.ChargeCursor cursor, CallbackInfo ci) { + if (!isWorldGeneration() && arclight$level != null) { + var bukkitBlock = CraftBlock.at(arclight$level, cursor.pos); + var event = new SculkBloomEvent(bukkitBlock, cursor.getCharge()); + Bukkit.getPluginManager().callEvent(event); + if (event.isCancelled()) { + ci.cancel(); + } + cursor.charge = event.getCharge(); + } + } +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/block/entity/BlockEntityMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/block/entity/BlockEntityMixin.java index f2b5be3d..864bac1d 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/block/entity/BlockEntityMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/block/entity/BlockEntityMixin.java @@ -37,6 +37,7 @@ public abstract class BlockEntityMixin implements TileEntityBridge { @Shadow protected static void setChanged(Level p_155233_, BlockPos p_155234_, BlockState p_155235_) { } @Shadow public abstract BlockEntityType getType(); @Shadow public void load(CompoundTag p_155245_) {} + @Shadow public void setLevel(Level p_155231_) {} // @formatter:on @Inject(method = "load", at = @At("RETURN")) diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/block/entity/SculkCatalystBlockEntityMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/block/entity/SculkCatalystBlockEntityMixin.java index 3a6e049f..1431b74a 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/block/entity/SculkCatalystBlockEntityMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/block/entity/SculkCatalystBlockEntityMixin.java @@ -1,12 +1,15 @@ package io.izzel.arclight.common.mixin.core.world.level.block.entity; +import io.izzel.arclight.common.bridge.core.tileentity.SculkCatalystListenerBridge; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.SculkCatalystBlockEntity; import net.minecraft.world.level.block.state.BlockState; import org.bukkit.craftbukkit.v.event.CraftEventFactory; +import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @@ -14,6 +17,14 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(SculkCatalystBlockEntity.class) public abstract class SculkCatalystBlockEntityMixin extends BlockEntityMixin { + @Shadow @Final private SculkCatalystBlockEntity.CatalystListener catalystListener; + + @Override + public void setLevel(Level p_155231_) { + super.setLevel(p_155231_); + ((SculkCatalystListenerBridge) this.catalystListener).bridge$setLevel(p_155231_); + } + @Inject(method = "serverTick", at = @At("HEAD")) private static void arclight$overrideSource(Level p_222780_, BlockPos p_222781_, BlockState p_222782_, SculkCatalystBlockEntity blockEntity, CallbackInfo ci) { CraftEventFactory.sourceBlockOverride = blockEntity.getBlockPos(); diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/block/entity/SculkCatalystBlockEntity_CatalystListenerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/block/entity/SculkCatalystBlockEntity_CatalystListenerMixin.java new file mode 100644 index 00000000..f0471b80 --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/block/entity/SculkCatalystBlockEntity_CatalystListenerMixin.java @@ -0,0 +1,21 @@ +package io.izzel.arclight.common.mixin.core.world.level.block.entity; + +import io.izzel.arclight.common.bridge.core.block.SculkSpreaderBridge; +import io.izzel.arclight.common.bridge.core.tileentity.SculkCatalystListenerBridge; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.SculkSpreader; +import net.minecraft.world.level.block.entity.SculkCatalystBlockEntity; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +@Mixin(SculkCatalystBlockEntity.CatalystListener.class) +public class SculkCatalystBlockEntity_CatalystListenerMixin implements SculkCatalystListenerBridge { + + @Shadow @Final SculkSpreader sculkSpreader; + + @Override + public void bridge$setLevel(Level level) { + ((SculkSpreaderBridge) this.sculkSpreader).bridge$setLevel(level); + } +} diff --git a/arclight-common/src/main/resources/META-INF/accesstransformer.cfg b/arclight-common/src/main/resources/META-INF/accesstransformer.cfg index bfd5df64..9e020713 100644 --- a/arclight-common/src/main/resources/META-INF/accesstransformer.cfg +++ b/arclight-common/src/main/resources/META-INF/accesstransformer.cfg @@ -4,6 +4,9 @@ public net.minecraft.server.dedicated.DedicatedServerProperties$WorldDimensionDa public net.minecraft.world.entity.projectile.Arrow f_36855_ # potion public net.minecraft.world.entity.Display$TextDisplay f_268476_ # DATA_LINE_WIDTH_ID public net.minecraft.world.entity.Display$TextDisplay f_268494_ # DATA_BACKGROUND_COLOR_ID +public net.minecraft.world.level.block.entity.SculkCatalystBlockEntity$CatalystListener m_280309_(Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/util/RandomSource;)V # bloom +public net.minecraft.world.level.block.SculkSpreader$ChargeCursor f_222288_ # pos +public net.minecraft.world.level.block.SculkSpreader$ChargeCursor f_222289_ # charge # Arclight 1.19.4 public net.minecraft.world.item.DebugStickItem m_150802_(Lnet/minecraft/world/entity/player/Player;Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/LevelAccessor;Lnet/minecraft/core/BlockPos;ZLnet/minecraft/world/item/ItemStack;)Z # handleInteraction public net.minecraft.world.level.block.ComposterBlock m_269590_(Lnet/minecraft/world/entity/Entity;Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/LevelAccessor;Lnet/minecraft/core/BlockPos;)Lnet/minecraft/world/level/block/state/BlockState; # empty diff --git a/arclight-common/src/main/resources/mixins.arclight.core.json b/arclight-common/src/main/resources/mixins.arclight.core.json index 338d46f4..86569a23 100644 --- a/arclight-common/src/main/resources/mixins.arclight.core.json +++ b/arclight-common/src/main/resources/mixins.arclight.core.json @@ -417,6 +417,7 @@ "world.level.block.SculkBlockMixin", "world.level.block.SculkSensorBlockMixin", "world.level.block.SculkShriekerBlockMixin", + "world.level.block.SculkSpreaderMixin", "world.level.block.SculkVeinBlockMixin", "world.level.block.SignBlockMixin", "world.level.block.SnowBlockMixin", @@ -457,6 +458,7 @@ "world.level.block.entity.LecternBlockEntityMixin", "world.level.block.entity.LecternTileEntity1Mixin", "world.level.block.entity.LockableBlockEntityMixin", + "world.level.block.entity.SculkCatalystBlockEntity_CatalystListenerMixin", "world.level.block.entity.SculkCatalystBlockEntityMixin", "world.level.block.entity.ShulkerBoxBlockEntityMixin", "world.level.block.entity.SignBlockEntityMixin",