From c652025fed33f91692bfe8392d8f61551c58588b Mon Sep 17 00:00:00 2001 From: IzzelAliz Date: Mon, 1 Jun 2020 18:33:33 +0800 Subject: [PATCH] All the blocks --- .../common/bridge/world/WorldBridge.java | 4 + .../core/block/AbstractButtonBlockMixin.java | 27 ---- .../common/mixin/core/block/BlockMixin.java | 9 +- .../mixin/core/block/CactusBlockMixin.java | 13 -- .../core/block/ChorusFlowerBlockMixin.java | 116 ---------------- .../ComposterBlock_FullInventoryMixin.java | 26 ++++ .../mixin/core/block/CropsBlockMixin.java | 5 - .../mixin/core/block/FarmlandBlockMixin.java | 6 - .../mixin/core/block/FenceGateBlockMixin.java | 39 ++++++ .../mixin/core/block/FireBlockMixin.java | 19 --- .../mixin/core/block/JukeBoxBlockMixin.java | 19 +++ .../mixin/core/block/LecternBlockMixin.java | 31 +++++ .../core/block/NetherPortalBlockMixin.java | 13 -- .../mixin/core/block/NoteBlockMixin.java | 8 +- .../mixin/core/block/PistonBlockMixin.java | 58 -------- .../core/block/RedstoneWireBlockMixin.java | 2 +- .../mixin/core/block/SaplingBlockMixin.java | 25 +--- .../common/mixin/core/world/WorldMixin.java | 9 ++ .../core/world/server/ServerWorldMixin.java | 11 +- .../block/AbstractButtonBlockMixin_1_15.java | 32 +++++ .../v1_15/block/CactusBlockMixin_1_15.java | 19 +++ .../v1_15/block/CakeBlockMixin_1_15.java | 28 ++++ .../v1_15/block/CauldronBlockMixin_1_15.java | 103 ++++++++++++++ .../v1_15/block/ChestBlock2Mixin_1_15.java | 24 ++++ .../block/ChorusFlowerBlockMixin_1_15.java | 118 ++++++++++++++++ .../v1_15/block/CocoaBlockMixin_1_15.java | 19 +++ .../v1_15/block/CoralBlockMixin_1_15.java | 31 +++++ .../v1_15/block/CoralFinBlockMixin_1_15.java | 32 +++++ .../block/CoralPlantBlockMixin_1_15.java | 32 +++++ .../block/CoralWallFanBlockMixin_1_15.java | 35 +++++ .../v1_15/block/CropsBlockMixin_1_15.java | 19 +++ .../v1_15/block/FarmlandBlockMixin_1_15.java | 19 +++ .../v1_15/block/FireBlockMixin_1_15.java | 34 +++++ .../v1_15/block/GrassBlockMixin_1_15.java | 19 +++ .../v1_15/block/KelpTopBlockMixin_1_15.java | 19 +++ .../v1_15/block/LeavesBlockMixin_1_15.java | 28 ++++ .../v1_15/block/LeverBlockMixin_1_15.java | 38 ++++++ .../v1_15/block/MushroomBlockMixin_1_15.java | 20 +++ .../block/NetherPortalBlockMixin_1_15.java | 25 ++++ .../block/NetherWartBlockMixin_1_15.java | 19 +++ .../v1_15/block/ObserverBlockMixin_1_15.java | 31 +++++ .../v1_15/block/PistonBlockMixin_1_15.java | 76 +++++++++++ .../block/RedstoneDiodeBlockMixin_1_15.java | 31 +++++ .../block/RedstoneLampBlockMixin_1_15.java | 24 ++++ .../block/RedstoneOreBlockMixin_1_15.java | 85 ++++++++++++ .../block/ScaffoldingBlockMixin_1_15.java | 32 +++++ .../v1_15/block/SnowBlockMixin_1_15.java | 25 ++++ .../SpreadableSnowyDirtBlockMixin_1_15.java | 32 +++++ .../v1_15/block/StemBlockMixin_1_15.java | 43 ++++++ .../v1_15/block/SugarCaneBlockMixin_1_15.java | 19 +++ .../block/SweetBerryBushBlockMixin_1_15.java | 34 +++++ .../v1_15/block/TurtleEggBlockMixin_1_15.java | 49 +++++++ .../v1_15/block/VineBlockMixin_1_15.java | 126 ++++++++++++++++++ .../v1_15/block/WitherRoseBlockMixin.java | 22 +++ .../resources/META-INF/accesstransformer.cfg | 2 + .../resources/mixins.arclight.core.1_15.json | 36 +++++ .../main/resources/mixins.arclight.core.json | 22 +-- arclight-forge-1.14/build.gradle | 6 +- .../block/AbstractButtonBlockMixin_1_14.java | 32 +++++ .../v1_14/block/CactusBlockMixin_1_14.java | 19 +++ .../v1_14/block/CakeBlockMixin_1_14.java | 6 +- .../v1_14/block/CauldronBlockMixin_1_14.java | 4 +- .../v1_14/block/ChestBlock2Mixin_1_14.java | 22 +++ .../block/ChorusFlowerBlockMixin_1_14.java | 120 +++++++++++++++++ .../v1_14/block/CocoaBlockMixin_1_14.java | 4 +- .../v1_14/block/CoralBlockMixin_1_14.java | 4 +- .../v1_14/block/CoralFinBlockMixin_1_14.java | 4 +- .../block/CoralPlantBlockMixin_1_14.java | 4 +- .../block/CoralWallFanBlockMixin_1_14.java | 4 +- .../v1_14/block/CropsBlockMixin_1_14.java | 19 +++ .../v1_14/block/FarmlandBlockMixin_1_14.java | 19 +++ .../v1_14/block/FireBlockMixin_1_14.java | 34 +++++ .../v1_14/block/GrassBlockMixin_1_14.java | 4 +- .../v1_14/block/KelpTopBlockMixin_1_14.java | 4 +- .../v1_14/block/LeavesBlockMixin_1_14.java | 4 +- .../v1_14/block/LeverBlockMixin_1_14.java | 4 +- .../v1_14/block/MushroomBlockMixin_1_14.java | 4 +- .../block/NetherPortalBlockMixin_1_14.java | 25 ++++ .../block/NetherWartBlockMixin_1_14.java | 4 +- .../v1_14/block/ObserverBlockMixin_1_14.java | 4 +- .../v1_14/block/PistonBlockMixin_1_14.java | 76 +++++++++++ .../block/RedstoneDiodeBlockMixin_1_14.java | 4 +- .../block/RedstoneLampBlockMixin_1_14.java | 24 ++++ .../block/RedstoneOreBlockMixin_1_14.java | 4 +- .../block/ScaffoldingBlockMixin_1_14.java | 4 +- .../v1_14/block/SnowBlockMixin_1_14.java | 4 +- .../SpreadableSnowyDirtBlockMixin_1_14.java | 4 +- .../v1_14/block/StemBlockMixin_1_14.java | 4 +- .../v1_14/block/SugarCaneBlockMixin_1_14.java | 4 +- .../block/SweetBerryBushBlockMixin_1_14.java | 4 +- .../v1_14/block/TurtleEggBlockMixin_1_14.java | 51 +++++++ .../v1_14/block/VineBlockMixin_1_14.java | 5 +- .../resources/mixins.arclight.core.1_14.json | 49 +++++++ 93 files changed, 2078 insertions(+), 355 deletions(-) delete mode 100644 arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/ChorusFlowerBlockMixin.java create mode 100644 arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/FenceGateBlockMixin.java create mode 100644 arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/JukeBoxBlockMixin.java create mode 100644 arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/LecternBlockMixin.java create mode 100644 arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/AbstractButtonBlockMixin_1_15.java create mode 100644 arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/CactusBlockMixin_1_15.java create mode 100644 arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/CakeBlockMixin_1_15.java create mode 100644 arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/CauldronBlockMixin_1_15.java create mode 100644 arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/ChestBlock2Mixin_1_15.java create mode 100644 arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/ChorusFlowerBlockMixin_1_15.java create mode 100644 arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/CocoaBlockMixin_1_15.java create mode 100644 arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/CoralBlockMixin_1_15.java create mode 100644 arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/CoralFinBlockMixin_1_15.java create mode 100644 arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/CoralPlantBlockMixin_1_15.java create mode 100644 arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/CoralWallFanBlockMixin_1_15.java create mode 100644 arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/CropsBlockMixin_1_15.java create mode 100644 arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/FarmlandBlockMixin_1_15.java create mode 100644 arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/FireBlockMixin_1_15.java create mode 100644 arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/GrassBlockMixin_1_15.java create mode 100644 arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/KelpTopBlockMixin_1_15.java create mode 100644 arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/LeavesBlockMixin_1_15.java create mode 100644 arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/LeverBlockMixin_1_15.java create mode 100644 arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/MushroomBlockMixin_1_15.java create mode 100644 arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/NetherPortalBlockMixin_1_15.java create mode 100644 arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/NetherWartBlockMixin_1_15.java create mode 100644 arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/ObserverBlockMixin_1_15.java create mode 100644 arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/PistonBlockMixin_1_15.java create mode 100644 arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/RedstoneDiodeBlockMixin_1_15.java create mode 100644 arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/RedstoneLampBlockMixin_1_15.java create mode 100644 arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/RedstoneOreBlockMixin_1_15.java create mode 100644 arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/ScaffoldingBlockMixin_1_15.java create mode 100644 arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/SnowBlockMixin_1_15.java create mode 100644 arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/SpreadableSnowyDirtBlockMixin_1_15.java create mode 100644 arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/StemBlockMixin_1_15.java create mode 100644 arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/SugarCaneBlockMixin_1_15.java create mode 100644 arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/SweetBerryBushBlockMixin_1_15.java create mode 100644 arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/TurtleEggBlockMixin_1_15.java create mode 100644 arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/VineBlockMixin_1_15.java create mode 100644 arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/WitherRoseBlockMixin.java create mode 100644 arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/AbstractButtonBlockMixin_1_14.java create mode 100644 arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/CactusBlockMixin_1_14.java rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/CakeBlockMixin.java => arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/CakeBlockMixin_1_14.java (80%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/CauldronBlockMixin.java => arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/CauldronBlockMixin_1_14.java (98%) create mode 100644 arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/ChestBlock2Mixin_1_14.java create mode 100644 arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/ChorusFlowerBlockMixin_1_14.java rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/CocoaBlockMixin.java => arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/CocoaBlockMixin_1_14.java (89%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/CoralBlockMixin.java => arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/CoralBlockMixin_1_14.java (93%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/CoralFinBlockMixin.java => arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/CoralFinBlockMixin_1_14.java (93%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/CoralPlantBlockMixin.java => arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/CoralPlantBlockMixin_1_14.java (93%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/CoralWallFanBlockMixin.java => arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/CoralWallFanBlockMixin_1_14.java (93%) create mode 100644 arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/CropsBlockMixin_1_14.java create mode 100644 arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/FarmlandBlockMixin_1_14.java create mode 100644 arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/FireBlockMixin_1_14.java rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/GrassBlockMixin.java => arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/GrassBlockMixin_1_14.java (89%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/KelpTopBlockMixin.java => arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/KelpTopBlockMixin_1_14.java (89%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/LeavesBlockMixin.java => arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/LeavesBlockMixin_1_14.java (93%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/LeverBlockMixin.java => arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/LeverBlockMixin_1_14.java (95%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/MushroomBlockMixin.java => arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/MushroomBlockMixin_1_14.java (90%) create mode 100644 arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/NetherPortalBlockMixin_1_14.java rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/NetherWartBlockMixin.java => arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/NetherWartBlockMixin_1_14.java (89%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/ObserverBlockMixin.java => arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/ObserverBlockMixin_1_14.java (94%) create mode 100644 arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/PistonBlockMixin_1_14.java rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/RedstoneDiodeBlockMixin.java => arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/RedstoneDiodeBlockMixin_1_14.java (93%) create mode 100644 arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/RedstoneLampBlockMixin_1_14.java rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/RedstoneOreBlockMixin.java => arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/RedstoneOreBlockMixin_1_14.java (97%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/ScaffoldingBlockMixin.java => arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/ScaffoldingBlockMixin_1_14.java (92%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/SnowBlockMixin.java => arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/SnowBlockMixin_1_14.java (92%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/SpreadableSnowyDirtBlockMixin.java => arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/SpreadableSnowyDirtBlockMixin_1_14.java (93%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/StemBlockMixin.java => arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/StemBlockMixin_1_14.java (96%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/SugarCaneBlockMixin.java => arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/SugarCaneBlockMixin_1_14.java (89%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/SweetBerryBushBlockMixin.java => arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/SweetBerryBushBlockMixin_1_14.java (94%) create mode 100644 arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/TurtleEggBlockMixin_1_14.java rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/VineBlockMixin.java => arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/VineBlockMixin_1_14.java (97%) create mode 100644 arclight-forge-1.14/src/main/resources/mixins.arclight.core.1_14.json diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/bridge/world/WorldBridge.java b/arclight-common/src/main/java/io/izzel/arclight/common/bridge/world/WorldBridge.java index 048dc295..6f3c061d 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/bridge/world/WorldBridge.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/bridge/world/WorldBridge.java @@ -1,5 +1,7 @@ package io.izzel.arclight.common.bridge.world; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.math.BlockPos; import org.bukkit.craftbukkit.v.CraftServer; import org.bukkit.craftbukkit.v.CraftWorld; import org.bukkit.generator.ChunkGenerator; @@ -19,4 +21,6 @@ public interface WorldBridge extends IWorldWriterBridge { void bridge$setPopulating(boolean populating); ChunkGenerator bridge$getGenerator(); + + TileEntity bridge$getTileEntity(BlockPos pos, boolean validate); } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/AbstractButtonBlockMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/AbstractButtonBlockMixin.java index fa2a82a2..63cc5dd0 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/AbstractButtonBlockMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/AbstractButtonBlockMixin.java @@ -10,7 +10,6 @@ import net.minecraft.util.Hand; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockRayTraceResult; import net.minecraft.world.World; -import net.minecraft.world.server.ServerWorld; import org.bukkit.Bukkit; import org.bukkit.block.Block; import org.bukkit.craftbukkit.v.block.CraftBlock; @@ -26,7 +25,6 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import org.spongepowered.asm.mixin.injection.callback.LocalCapture; import java.util.List; -import java.util.Random; @Mixin(AbstractButtonBlock.class) public class AbstractButtonBlockMixin { @@ -52,31 +50,6 @@ public class AbstractButtonBlockMixin { } } - @SuppressWarnings({"UnresolvedMixinReference", "UnnecessaryQualifiedMemberReference"}) - @Inject(method = "Lnet/minecraft/block/AbstractButtonBlock;func_196267_b(Lnet/minecraft/block/BlockState;Lnet/minecraft/world/World;Lnet/minecraft/util/math/BlockPos;Ljava/util/Random;)V", cancellable = true, at = @At(value = "INVOKE", target = "Lnet/minecraft/world/World;func_180501_a(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;I)Z"), require = 0) - public void arclight$blockRedstone2_1_14(BlockState state, World worldIn, BlockPos pos, Random random, CallbackInfo ci) { - Block block = CraftBlock.at(worldIn, pos); - - BlockRedstoneEvent event = new BlockRedstoneEvent(block, 15, 0); - Bukkit.getPluginManager().callEvent(event); - - if (event.getNewCurrent() > 0) { - ci.cancel(); - } - } - - @Inject(method = "tick", cancellable = true, at = @At(value = "INVOKE", target = "Lnet/minecraft/world/server/ServerWorld;setBlockState(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;I)Z"), require = 0) - private void arclight$blockRedstone2_1_15(BlockState state, ServerWorld worldIn, BlockPos pos, Random rand, CallbackInfo ci) { - Block block = CraftBlock.at(worldIn, pos); - - BlockRedstoneEvent event = new BlockRedstoneEvent(block, 15, 0); - Bukkit.getPluginManager().callEvent(event); - - if (event.getNewCurrent() > 0) { - ci.cancel(); - } - } - @Inject(method = "checkPressed", cancellable = true, locals = LocalCapture.CAPTURE_FAILHARD, at = @At(value = "INVOKE", target = "Lnet/minecraft/block/BlockState;get(Lnet/minecraft/state/IProperty;)Ljava/lang/Comparable;")) public void arclight$entityInteract(BlockState state, World worldIn, BlockPos pos, CallbackInfo ci, diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/BlockMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/BlockMixin.java index c0a4ec82..630f97af 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/BlockMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/BlockMixin.java @@ -3,6 +3,8 @@ package io.izzel.arclight.common.mixin.core.block; import io.izzel.arclight.common.bridge.block.BlockBridge; import net.minecraft.block.Block; import net.minecraft.block.BlockState; +import net.minecraft.enchantment.EnchantmentHelper; +import net.minecraft.enchantment.Enchantments; import net.minecraft.entity.Entity; import net.minecraft.entity.item.ItemEntity; import net.minecraft.item.BlockItemUseContext; @@ -17,6 +19,7 @@ import net.minecraft.world.World; import net.minecraft.world.server.ServerWorld; import net.minecraft.world.storage.loot.LootContext; import net.minecraft.world.storage.loot.LootParameters; +import net.minecraftforge.common.extensions.IForgeBlock; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Overwrite; import org.spongepowered.asm.mixin.Shadow; @@ -61,14 +64,16 @@ public abstract class BlockMixin implements BlockBridge { * @author IzzelAliz * @reason */ - @Overwrite(aliases = {"func_220077_a"}) + @Overwrite public static List getDrops(BlockState state, ServerWorld worldIn, BlockPos pos, @Nullable TileEntity tileEntityIn, Entity entityIn, ItemStack stack) { LootContext.Builder lootcontext$builder = (new LootContext.Builder(worldIn)).withRandom(worldIn.rand).withParameter(LootParameters.POSITION, pos).withParameter(LootParameters.TOOL, stack).withNullableParameter(LootParameters.THIS_ENTITY, entityIn).withNullableParameter(LootParameters.BLOCK_ENTITY, tileEntityIn); return state.getDrops(lootcontext$builder); } public int getExpDrop(BlockState blockState, World world, BlockPos blockPos, ItemStack itemStack) { - return 0; + int silkTouch = EnchantmentHelper.getEnchantmentLevel(Enchantments.SILK_TOUCH, itemStack); + int fortune = EnchantmentHelper.getEnchantmentLevel(Enchantments.FORTUNE, itemStack); + return ((IForgeBlock) this).getExpDrop(blockState, world, blockPos, fortune, silkTouch); } @Override diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/CactusBlockMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/CactusBlockMixin.java index 0d29019f..2085b1e6 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/CactusBlockMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/CactusBlockMixin.java @@ -5,29 +5,16 @@ import net.minecraft.block.CactusBlock; import net.minecraft.entity.Entity; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -import net.minecraft.world.server.ServerWorld; import org.bukkit.craftbukkit.v.block.CraftBlock; import org.bukkit.craftbukkit.v.event.CraftEventFactory; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(CactusBlock.class) public class CactusBlockMixin { - @SuppressWarnings({"UnresolvedMixinReference", "UnnecessaryQualifiedMemberReference"}) - @Redirect(method = "Lnet/minecraft/block/CactusBlock;func_196267_b(Lnet/minecraft/block/BlockState;Lnet/minecraft/world/World;Lnet/minecraft/util/math/BlockPos;Ljava/util/Random;)V", at = @At(value = "INVOKE", ordinal = 0, target = "Lnet/minecraft/world/World;func_175656_a(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;)Z"), require = 0) - public boolean arclight$blockGrow_1_14(World world, BlockPos pos, BlockState state) { - return CraftEventFactory.handleBlockGrowEvent(world, pos, state); - } - - @Redirect(method = "tick", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/server/ServerWorld;setBlockState(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;)Z"), require = 0) - private boolean arclight$blockGrow_1_15(ServerWorld serverWorld, BlockPos pos, BlockState state) { - return CraftEventFactory.handleBlockGrowEvent(serverWorld, pos, state); - } - @Inject(method = "onEntityCollision", at = @At("HEAD")) private void arclight$cactusDamage1(BlockState state, World worldIn, BlockPos pos, Entity entityIn, CallbackInfo ci) { CraftEventFactory.blockDamage = CraftBlock.at(worldIn, pos); diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/ChorusFlowerBlockMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/ChorusFlowerBlockMixin.java deleted file mode 100644 index 1c04a8c6..00000000 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/ChorusFlowerBlockMixin.java +++ /dev/null @@ -1,116 +0,0 @@ -package io.izzel.arclight.common.mixin.core.block; - -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.ChorusFlowerBlock; -import net.minecraft.block.ChorusPlantBlock; -import net.minecraft.state.IntegerProperty; -import net.minecraft.util.Direction; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.IWorldReader; -import net.minecraft.world.World; -import net.minecraftforge.common.ForgeHooks; -import org.bukkit.craftbukkit.v.event.CraftEventFactory; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Overwrite; -import org.spongepowered.asm.mixin.Shadow; - -import javax.annotation.Nullable; -import java.util.Random; - -@Mixin(ChorusFlowerBlock.class) -public abstract class ChorusFlowerBlockMixin extends BlockMixin { - - // @formatter:off - @Shadow @Final public static IntegerProperty AGE; - @Shadow @Final private ChorusPlantBlock field_196405_b; - @Shadow private static boolean areAllNeighborsEmpty(IWorldReader worldIn, BlockPos pos, @Nullable Direction excludingSide) { return false; } - @Shadow protected abstract void placeGrownFlower(World worldIn, BlockPos pos, int age); - @Shadow protected abstract void placeDeadFlower(World worldIn, BlockPos pos); - // @formatter:on - - /** - * @author IzzelAliz - * @reason - */ - @Overwrite - public void tick(BlockState state, World worldIn, BlockPos pos, Random random) { - if (!state.isValidPosition(worldIn, pos)) { - worldIn.destroyBlock(pos, true); - } else { - BlockPos blockpos = pos.up(); - if (worldIn.isAirBlock(blockpos) && blockpos.getY() < worldIn.getDimension().getHeight()) { - int i = state.get(AGE); - if (i < 5 && ForgeHooks.onCropsGrowPre(worldIn, blockpos, state, true)) { - boolean flag = false; - boolean flag1 = false; - BlockState blockstate = worldIn.getBlockState(pos.down()); - Block block = blockstate.getBlock(); - if (block == Blocks.END_STONE) { - flag = true; - } else if (block == this.field_196405_b) { - int j = 1; - - for (int k = 0; k < 4; ++k) { - Block block1 = worldIn.getBlockState(pos.down(j + 1)).getBlock(); - if (block1 != this.field_196405_b) { - if (block1 == Blocks.END_STONE) { - flag1 = true; - } - break; - } - - ++j; - } - - if (j < 2 || j <= random.nextInt(flag1 ? 5 : 4)) { - flag = true; - } - } else if (blockstate.isAir(worldIn, pos.down())) { - flag = true; - } - - if (flag && areAllNeighborsEmpty(worldIn, blockpos, (Direction) null) && worldIn.isAirBlock(pos.up(2))) { - if (CraftEventFactory.handleBlockSpreadEvent(worldIn, pos, pos.up(), state.with(ChorusFlowerBlock.AGE, i), 2)) { - worldIn.setBlockState(pos, this.field_196405_b.makeConnections(worldIn, pos), 2); - this.placeGrownFlower(worldIn, blockpos, i); - } - } else if (i < 4) { - int l = random.nextInt(4); - if (flag1) { - ++l; - } - - boolean flag2 = false; - - for (int i1 = 0; i1 < l; ++i1) { - Direction direction = Direction.Plane.HORIZONTAL.random(random); - BlockPos blockpos1 = pos.offset(direction); - if (worldIn.isAirBlock(blockpos1) && worldIn.isAirBlock(blockpos1.down()) && areAllNeighborsEmpty(worldIn, blockpos1, direction.getOpposite())) { - if (CraftEventFactory.handleBlockSpreadEvent(worldIn, pos, blockpos1, state.with(ChorusFlowerBlock.AGE, i + 1), 2)) { - this.placeGrownFlower(worldIn, blockpos1, i + 1); - flag2 = true; - } - } - } - - if (flag2) { - worldIn.setBlockState(pos, this.field_196405_b.makeConnections(worldIn, pos), 2); - } else { - if (CraftEventFactory.handleBlockGrowEvent(worldIn, pos, this.getDefaultState().with(ChorusFlowerBlock.AGE, 5), 2)) { - this.placeDeadFlower(worldIn, pos); - } - } - } else { - if (CraftEventFactory.handleBlockGrowEvent(worldIn, pos, this.getDefaultState().with(ChorusFlowerBlock.AGE, 5), 2)) { - this.placeDeadFlower(worldIn, pos); - } - } - ForgeHooks.onCropsGrowPost(worldIn, pos, state); - } - } - } - } -} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/ComposterBlock_FullInventoryMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/ComposterBlock_FullInventoryMixin.java index 877bfcda..58d30b5e 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/ComposterBlock_FullInventoryMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/ComposterBlock_FullInventoryMixin.java @@ -2,11 +2,15 @@ package io.izzel.arclight.common.mixin.core.block; import io.izzel.arclight.common.mixin.core.inventory.InventoryMixin; import net.minecraft.block.BlockState; +import net.minecraft.block.ComposterBlock; import net.minecraft.item.ItemStack; import net.minecraft.util.math.BlockPos; import net.minecraft.world.IWorld; import org.bukkit.craftbukkit.v.inventory.CraftBlockInventoryHolder; +import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; +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,8 +18,30 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(targets = "net.minecraft.block.ComposterBlock$FullInventory") public abstract class ComposterBlock_FullInventoryMixin extends InventoryMixin { + // @formatter:off + @Shadow @Final private BlockState state; + @Shadow @Final private IWorld world; + @Shadow @Final private BlockPos pos; + @Shadow private boolean extracted; + // @formatter:on + @Inject(method = "(Lnet/minecraft/block/BlockState;Lnet/minecraft/world/IWorld;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/item/ItemStack;)V", at = @At("RETURN")) public void arclight$setOwner(BlockState blockState, IWorld world, BlockPos blockPos, ItemStack itemStack, CallbackInfo ci) { this.setOwner(new CraftBlockInventoryHolder(world, blockPos, this)); } + + /** + * @author IzzelAliz + * @reason + */ + @Overwrite + public void markDirty() { + if (this.isEmpty()) { + ComposterBlock.clear(this.state, this.world, this.pos); + this.extracted = true; + } else { + this.world.setBlockState(this.pos, this.state, 3); + this.extracted = false; + } + } } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/CropsBlockMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/CropsBlockMixin.java index 67ae337d..a2c377f2 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/CropsBlockMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/CropsBlockMixin.java @@ -15,11 +15,6 @@ import org.spongepowered.asm.mixin.injection.Redirect; @Mixin(CropsBlock.class) public class CropsBlockMixin { - @Redirect(method = "tick", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/World;setBlockState(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;I)Z")) - public boolean arclight$blockGrowTick(World world, BlockPos pos, BlockState newState, int flags) { - return CraftEventFactory.handleBlockGrowEvent(world, pos, newState, flags); - } - @Redirect(method = "grow(Lnet/minecraft/world/World;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/World;setBlockState(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;I)Z")) public boolean arclight$blockGrowGrow(World world, BlockPos pos, BlockState newState, int flags) { diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/FarmlandBlockMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/FarmlandBlockMixin.java index 9a2cd3f9..eb37b70e 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/FarmlandBlockMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/FarmlandBlockMixin.java @@ -9,17 +9,11 @@ import org.bukkit.craftbukkit.v.event.CraftEventFactory; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(FarmlandBlock.class) public abstract class FarmlandBlockMixin extends BlockMixin { - @Redirect(method = "tick", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/World;setBlockState(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;I)Z")) - public boolean arclight$moistureChange(World world, BlockPos pos, BlockState newState, int flags) { - return CraftEventFactory.handleMoistureChangeEvent(world, pos, newState, flags); - } - @Inject(method = "turnToDirt", cancellable = true, at = @At("HEAD")) private static void arclight$blockFade(BlockState state, World worldIn, BlockPos pos, CallbackInfo ci) { if (CraftEventFactory.callBlockFadeEvent(worldIn, pos, Blocks.DIRT.getDefaultState()).isCancelled()) { diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/FenceGateBlockMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/FenceGateBlockMixin.java new file mode 100644 index 00000000..379dd88b --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/FenceGateBlockMixin.java @@ -0,0 +1,39 @@ +package io.izzel.arclight.common.mixin.core.block; + +import net.minecraft.block.BlockState; +import net.minecraft.block.FenceGateBlock; +import net.minecraft.state.BooleanProperty; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import org.bukkit.Bukkit; +import org.bukkit.block.Block; +import org.bukkit.craftbukkit.v.block.CraftBlock; +import org.bukkit.event.block.BlockRedstoneEvent; +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.Redirect; + +@Mixin(FenceGateBlock.class) +public class FenceGateBlockMixin { + + // @formatter:off + @Shadow @Final public static BooleanProperty POWERED; + // @formatter:on + + @Redirect(method = "neighborChanged", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/World;isBlockPowered(Lnet/minecraft/util/math/BlockPos;)Z")) + private boolean arclight$blockRedstone(World world, BlockPos pos, BlockState state) { + boolean powered = world.isBlockPowered(pos); + boolean oldPowered = state.get(POWERED); + if (oldPowered != powered) { + int newPower = powered ? 15 : 0; + int oldPower = oldPowered ? 15 : 0; + Block bukkitBlock = CraftBlock.at(world, pos); + BlockRedstoneEvent eventRedstone = new BlockRedstoneEvent(bukkitBlock, oldPower, newPower); + Bukkit.getPluginManager().callEvent(eventRedstone); + return eventRedstone.getNewCurrent() > 0; + } + return powered; + } +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/FireBlockMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/FireBlockMixin.java index 94799142..c2e25908 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/FireBlockMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/FireBlockMixin.java @@ -55,25 +55,6 @@ public abstract class FireBlockMixin { } } - @Redirect(method = "tick", at = @At(value = "INVOKE", ordinal = 1, target = "Lnet/minecraft/world/World;setBlockState(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;I)Z")) - public boolean arclight$fireSpread(World world, BlockPos mutablePos, BlockState newState, int flags, - BlockState state, World worldIn, BlockPos pos) { - if (world.getBlockState(mutablePos).getBlock() != Blocks.FIRE) { - if (!CraftEventFactory.callBlockIgniteEvent(world, mutablePos, pos).isCancelled()) { - return CraftEventFactory.handleBlockSpreadEvent(world, pos, mutablePos, newState, flags); - } - } - return false; - } - - @Redirect(method = "tick", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/World;removeBlock(Lnet/minecraft/util/math/BlockPos;Z)Z")) - public boolean arclight$extinguish1(World world, BlockPos pos, boolean isMoving) { - if (!CraftEventFactory.callBlockFadeEvent(world, pos, Blocks.AIR.getDefaultState()).isCancelled()) { - world.removeBlock(pos, isMoving); - } - return false; - } - @Redirect(method = "onBlockAdded", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/World;removeBlock(Lnet/minecraft/util/math/BlockPos;Z)Z")) public boolean arclight$extinguish2(World world, BlockPos pos, boolean isMoving) { if (!CraftEventFactory.callBlockFadeEvent(world, pos, Blocks.AIR.getDefaultState()).isCancelled()) { diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/JukeBoxBlockMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/JukeBoxBlockMixin.java new file mode 100644 index 00000000..18921a91 --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/JukeBoxBlockMixin.java @@ -0,0 +1,19 @@ +package io.izzel.arclight.common.mixin.core.block; + +import net.minecraft.block.JukeboxBlock; +import net.minecraft.item.ItemStack; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyArg; + +@Mixin(JukeboxBlock.class) +public class JukeBoxBlockMixin { + + @ModifyArg(method = "insertRecord", index = 1, at = @At(value = "INVOKE", target = "Lnet/minecraft/tileentity/JukeboxTileEntity;setRecord(Lnet/minecraft/item/ItemStack;)V")) + private ItemStack arclight$oneItem(ItemStack stack) { + if (!stack.isEmpty()) { + stack.setCount(1); + } + return stack; + } +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/LecternBlockMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/LecternBlockMixin.java new file mode 100644 index 00000000..7c953b27 --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/LecternBlockMixin.java @@ -0,0 +1,31 @@ +package io.izzel.arclight.common.mixin.core.block; + +import io.izzel.arclight.common.bridge.world.WorldBridge; +import net.minecraft.block.BlockState; +import net.minecraft.block.LecternBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.LecternTileEntity; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.Redirect; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.LocalCapture; + +@Mixin(LecternBlock.class) +public class LecternBlockMixin { + + @Redirect(method = "dropBook", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/World;getTileEntity(Lnet/minecraft/util/math/BlockPos;)Lnet/minecraft/tileentity/TileEntity;")) + private TileEntity arclight$noValidate(World world, BlockPos pos) { + return ((WorldBridge) world).bridge$getTileEntity(pos, false); + } + + @Inject(method = "dropBook", cancellable = true, locals = LocalCapture.CAPTURE_FAILHARD, at = @At(value = "INVOKE", target = "Lnet/minecraft/util/Direction;getXOffset()I")) + private void arclight$returnIfEmpty(BlockState state, World worldIn, BlockPos pos, CallbackInfo ci, TileEntity tileEntity, LecternTileEntity lecternTileEntity, Direction direction, ItemStack itemStack) { + if (itemStack.isEmpty()) ci.cancel(); + } +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/NetherPortalBlockMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/NetherPortalBlockMixin.java index 272e6cb7..1ca19d68 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/NetherPortalBlockMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/NetherPortalBlockMixin.java @@ -2,27 +2,19 @@ package io.izzel.arclight.common.mixin.core.block; import io.izzel.arclight.common.bridge.block.NetherPortalBlockBridge; import io.izzel.arclight.common.bridge.entity.EntityBridge; -import io.izzel.arclight.common.bridge.entity.EntityTypeBridge; import io.izzel.arclight.common.bridge.world.WorldBridge; import net.minecraft.block.BlockState; import net.minecraft.block.NetherPortalBlock; import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.SpawnReason; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.nbt.CompoundNBT; import net.minecraft.util.math.BlockPos; -import net.minecraft.util.text.ITextComponent; import net.minecraft.world.IWorld; import net.minecraft.world.World; import org.bukkit.Bukkit; import org.bukkit.Location; -import org.bukkit.event.entity.CreatureSpawnEvent; import org.bukkit.event.entity.EntityPortalEnterEvent; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import org.spongepowered.asm.mixin.injection.callback.LocalCapture; @@ -30,11 +22,6 @@ import org.spongepowered.asm.mixin.injection.callback.LocalCapture; @Mixin(NetherPortalBlock.class) public class NetherPortalBlockMixin { - @Redirect(method = "tick", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/EntityType;spawn(Lnet/minecraft/world/World;Lnet/minecraft/nbt/CompoundNBT;Lnet/minecraft/util/text/ITextComponent;Lnet/minecraft/entity/player/PlayerEntity;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/entity/SpawnReason;ZZ)Lnet/minecraft/entity/Entity;")) - public Entity arclight$spawn(EntityType entityType, World worldIn, CompoundNBT compound, ITextComponent customName, PlayerEntity playerIn, BlockPos pos, SpawnReason reason, boolean flag, boolean flag1) { - return ((EntityTypeBridge) entityType).bridge$spawnCreature(worldIn, compound, customName, playerIn, pos, reason, flag, flag1, CreatureSpawnEvent.SpawnReason.NETHER_PORTAL); - } - @Inject(method = "trySpawnPortal", cancellable = true, locals = LocalCapture.CAPTURE_FAILHARD, at = @At(value = "INVOKE", target = "Lnet/minecraft/block/NetherPortalBlock$Size;placePortalBlocks()V")) public void arclight$spawnPortal(IWorld worldIn, BlockPos pos, CallbackInfoReturnable cir, NetherPortalBlock.Size size) { diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/NoteBlockMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/NoteBlockMixin.java index e16e8815..d55b1af2 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/NoteBlockMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/NoteBlockMixin.java @@ -22,22 +22,22 @@ public abstract class NoteBlockMixin { @Redirect(method = "neighborChanged", at = @At(value = "INVOKE", target = "Lnet/minecraft/block/NoteBlock;triggerNote(Lnet/minecraft/world/World;Lnet/minecraft/util/math/BlockPos;)V")) public void arclight$callNote1(NoteBlock noteBlock, World worldIn, BlockPos pos, BlockState blockState) { - this.triggerNote(worldIn, pos, blockState); + this.play(worldIn, pos, blockState); } @Redirect(method = "onBlockActivated", at = @At(value = "INVOKE", target = "Lnet/minecraft/block/NoteBlock;triggerNote(Lnet/minecraft/world/World;Lnet/minecraft/util/math/BlockPos;)V")) public void arclight$callNote2(NoteBlock noteBlock, World worldIn, BlockPos pos, BlockState blockState) { - this.triggerNote(worldIn, pos, blockState); + this.play(worldIn, pos, blockState); } @Redirect(method = "onBlockClicked", at = @At(value = "INVOKE", target = "Lnet/minecraft/block/NoteBlock;triggerNote(Lnet/minecraft/world/World;Lnet/minecraft/util/math/BlockPos;)V")) public void arclight$callNote3(NoteBlock noteBlock, World worldIn, BlockPos pos, BlockState blockState) { - this.triggerNote(worldIn, pos, blockState); + this.play(worldIn, pos, blockState); } private transient BlockState arclight$state; - private void triggerNote(World worldIn, BlockPos pos, BlockState state) { + private void play(World worldIn, BlockPos pos, BlockState state) { arclight$state = state; this.triggerNote(worldIn, pos); arclight$state = null; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/PistonBlockMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/PistonBlockMixin.java index cdc8bb35..55b05334 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/PistonBlockMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/PistonBlockMixin.java @@ -2,17 +2,13 @@ package io.izzel.arclight.common.mixin.core.block; import com.google.common.collect.ImmutableList; import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; import net.minecraft.block.PistonBlock; -import net.minecraft.block.state.PistonBlockStructureHelper; import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import org.bukkit.Bukkit; import org.bukkit.block.Block; import org.bukkit.craftbukkit.v.block.CraftBlock; -import org.bukkit.event.block.BlockPistonEvent; -import org.bukkit.event.block.BlockPistonExtendEvent; import org.bukkit.event.block.BlockPistonRetractEvent; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; @@ -20,12 +16,8 @@ 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; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import org.spongepowered.asm.mixin.injection.callback.LocalCapture; -import java.util.AbstractList; -import java.util.List; - @Mixin(PistonBlock.class) public class PistonBlockMixin { @@ -44,54 +36,4 @@ public class PistonBlockMixin { } } } - - @Inject(method = "doMove", cancellable = true, locals = LocalCapture.CAPTURE_FAILHARD, - at = @At(value = "INVOKE_ASSIGN", remap = false, target = "Lcom/google/common/collect/Sets;newHashSet(Ljava/lang/Iterable;)Ljava/util/HashSet;")) - public void arclight$pistonAction(World worldIn, BlockPos pos, Direction directionIn, boolean extending, CallbackInfoReturnable cir, - BlockPos blockPos, PistonBlockStructureHelper helper) { - final Block craftBlock = CraftBlock.at(worldIn, pos); - - final List moved = helper.getBlocksToMove(); - final List broken = helper.getBlocksToDestroy(); - - class BlockList extends AbstractList { - - @Override - public int size() { - return moved.size() + broken.size(); - } - - @Override - public org.bukkit.block.Block get(int index) { - if (index >= size() || index < 0) { - throw new ArrayIndexOutOfBoundsException(index); - } - BlockPos pos = index < moved.size() ? moved.get(index) : broken.get(index - moved.size()); - return craftBlock.getWorld().getBlockAt(pos.getX(), pos.getY(), pos.getZ()); - } - } - - List blocks = new BlockList(); - - Direction direction = extending ? directionIn : directionIn.getOpposite(); - BlockPistonEvent event; - if (extending) { - event = new BlockPistonExtendEvent(craftBlock, blocks, CraftBlock.notchToBlockFace(direction)); - } else { - event = new BlockPistonRetractEvent(craftBlock, blocks, CraftBlock.notchToBlockFace(direction)); - } - Bukkit.getPluginManager().callEvent(event); - - if (event.isCancelled()) { - for (BlockPos b : broken) { - worldIn.notifyBlockUpdate(b, Blocks.AIR.getDefaultState(), worldIn.getBlockState(b), 3); - } - for (BlockPos b : moved) { - worldIn.notifyBlockUpdate(b, Blocks.AIR.getDefaultState(), worldIn.getBlockState(b), 3); - b = b.offset(direction); - worldIn.notifyBlockUpdate(b, Blocks.AIR.getDefaultState(), worldIn.getBlockState(b), 3); - } - cir.setReturnValue(false); - } - } } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/RedstoneWireBlockMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/RedstoneWireBlockMixin.java index 17110011..cdf7cad0 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/RedstoneWireBlockMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/RedstoneWireBlockMixin.java @@ -15,7 +15,7 @@ import org.spongepowered.asm.mixin.injection.ModifyVariable; @Mixin(RedstoneWireBlock.class) public class RedstoneWireBlockMixin { - @ModifyVariable(method = "func_212568_b", name = "l", index = 8, at = @At(value = "JUMP", ordinal = 0, opcode = Opcodes.IF_ICMPEQ)) + @ModifyVariable(method = "updatePower", name = "l", index = 8, at = @At(value = "JUMP", ordinal = 0, opcode = Opcodes.IF_ICMPEQ)) public int arclight$blockRedstone(int l, World world, BlockPos pos, BlockState state) { int i = state.get(RedstoneWireBlock.POWER); if (i != l) { diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/SaplingBlockMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/SaplingBlockMixin.java index e3889868..8f7381a1 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/SaplingBlockMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/SaplingBlockMixin.java @@ -1,33 +1,18 @@ package io.izzel.arclight.common.mixin.core.block; -import net.minecraft.block.BlockState; import net.minecraft.block.SaplingBlock; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.IWorld; -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.TreeType; -import org.bukkit.craftbukkit.v.block.CraftBlock; -import org.bukkit.craftbukkit.v.util.BlockStateListPopulator; -import org.bukkit.event.world.StructureGrowEvent; 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.Redirect; -import io.izzel.arclight.common.mod.util.ArclightBlockPopulator; -import io.izzel.arclight.common.mod.util.ArclightCaptures; - -import java.util.List; -import java.util.Random; +// todo Re-implement this @Mixin(SaplingBlock.class) public abstract class SaplingBlockMixin { // @formatter:off - @Shadow public abstract void grow(IWorld worldIn, BlockPos pos, BlockState state, Random rand); + //@Shadow public abstract void grow(IWorld worldIn, BlockPos pos, BlockState state, Random rand); // @formatter:on - @SuppressWarnings("unchecked") + // @SuppressWarnings("unchecked") + /* @Redirect(method = "tick", at = @At(value = "INVOKE", target = "Lnet/minecraft/block/SaplingBlock;grow(Lnet/minecraft/world/IWorld;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;Ljava/util/Random;)V")) public void arclight$treeGrow(SaplingBlock saplingBlock, IWorld worldIn, BlockPos pos, BlockState state, Random rand) { BlockStateListPopulator populator = new ArclightBlockPopulator(worldIn.getWorld()); @@ -41,5 +26,5 @@ public abstract class SaplingBlockMixin { populator.updateList(); } } - } + }*/ } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/WorldMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/WorldMixin.java index 0c1d949e..01fe3a00 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/WorldMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/WorldMixin.java @@ -147,6 +147,15 @@ public abstract class WorldMixin implements WorldBridge { return this.world; } + public TileEntity getTileEntity(BlockPos pos, boolean validate) { + return getTileEntity(pos); + } + + @Override + public TileEntity bridge$getTileEntity(BlockPos pos, boolean validate) { + return getTileEntity(pos, validate); + } + @Override public CraftServer bridge$getServer() { return (CraftServer) Bukkit.getServer(); diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/server/ServerWorldMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/server/ServerWorldMixin.java index 2545c919..acebe6c3 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/server/ServerWorldMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/server/ServerWorldMixin.java @@ -153,7 +153,7 @@ public abstract class ServerWorldMixin extends WorldMixin implements ServerWorld @Overwrite @Nullable public MapData getMapData(String mapName) { - return this.shadow$getServer().func_71218_a(DimensionType.OVERWORLD).getSavedData().get(() -> { + return this.shadow$getServer().getWorld(DimensionType.OVERWORLD).getSavedData().get(() -> { MapData newMap = new MapData(mapName); MapInitializeEvent event = new MapInitializeEvent(((MapDataBridge) newMap).bridge$getMapView()); Bukkit.getServer().getPluginManager().callEvent(event); @@ -273,8 +273,13 @@ public abstract class ServerWorldMixin extends WorldMixin implements ServerWorld @Override public TileEntity getTileEntity(BlockPos pos) { + return getTileEntity(pos, true); + } + + @Override + public TileEntity getTileEntity(BlockPos pos, boolean validate) { TileEntity result = super.getTileEntity(pos); - if (Thread.currentThread() != arclight$getMainThread()) { + if (!validate || Thread.currentThread() != arclight$getMainThread()) { return result; } @@ -301,7 +306,7 @@ public abstract class ServerWorldMixin extends WorldMixin implements ServerWorld if (type.hasTileEntity(state)) { TileEntity replacement = type.createTileEntity(state, (IBlockReader) this); if (replacement == null) return found; - replacement.setWorld((World) (Object) this); + replacement.world = ((World) (Object) this); this.setTileEntity(pos, replacement); return replacement; } else { diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/AbstractButtonBlockMixin_1_15.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/AbstractButtonBlockMixin_1_15.java new file mode 100644 index 00000000..41dd28f7 --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/AbstractButtonBlockMixin_1_15.java @@ -0,0 +1,32 @@ +package io.izzel.arclight.common.mixin.v1_15.block; + +import net.minecraft.block.AbstractButtonBlock; +import net.minecraft.block.BlockState; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.server.ServerWorld; +import org.bukkit.Bukkit; +import org.bukkit.block.Block; +import org.bukkit.craftbukkit.v.block.CraftBlock; +import org.bukkit.event.block.BlockRedstoneEvent; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import java.util.Random; + +@Mixin(AbstractButtonBlock.class) +public class AbstractButtonBlockMixin_1_15 { + + @Inject(method = "tick", cancellable = true, at = @At(value = "INVOKE", target = "Lnet/minecraft/world/server/ServerWorld;setBlockState(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;I)Z")) + private void arclight$blockRedstone2(BlockState state, ServerWorld worldIn, BlockPos pos, Random rand, CallbackInfo ci) { + Block block = CraftBlock.at(worldIn, pos); + + BlockRedstoneEvent event = new BlockRedstoneEvent(block, 15, 0); + Bukkit.getPluginManager().callEvent(event); + + if (event.getNewCurrent() > 0) { + ci.cancel(); + } + } +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/CactusBlockMixin_1_15.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/CactusBlockMixin_1_15.java new file mode 100644 index 00000000..8d84a76a --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/CactusBlockMixin_1_15.java @@ -0,0 +1,19 @@ +package io.izzel.arclight.common.mixin.v1_15.block; + +import net.minecraft.block.BlockState; +import net.minecraft.block.CactusBlock; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.server.ServerWorld; +import org.bukkit.craftbukkit.v.event.CraftEventFactory; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +@Mixin(CactusBlock.class) +public class CactusBlockMixin_1_15 { + + @Redirect(method = "tick", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/server/ServerWorld;setBlockState(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;)Z")) + private boolean arclight$blockGrow(ServerWorld serverWorld, BlockPos pos, BlockState state) { + return CraftEventFactory.handleBlockGrowEvent(serverWorld, pos, state); + } +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/CakeBlockMixin_1_15.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/CakeBlockMixin_1_15.java new file mode 100644 index 00000000..360ffb5f --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/CakeBlockMixin_1_15.java @@ -0,0 +1,28 @@ +package io.izzel.arclight.common.mixin.v1_15.block; + +import io.izzel.arclight.common.bridge.entity.player.ServerPlayerEntityBridge; +import net.minecraft.block.BlockState; +import net.minecraft.block.CakeBlock; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.util.FoodStats; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.IWorld; +import org.bukkit.craftbukkit.v.event.CraftEventFactory; +import org.bukkit.event.entity.FoodLevelChangeEvent; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +@Mixin(CakeBlock.class) +public class CakeBlockMixin_1_15 { + + @Redirect(method = "func_226911_a_", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/FoodStats;addStats(IF)V")) + private void arclight$eatCake(FoodStats foodStats, int foodLevelIn, float foodSaturationModifier, IWorld worldIn, BlockPos pos, BlockState state, PlayerEntity player) { + int old = foodStats.getFoodLevel(); + FoodLevelChangeEvent event = CraftEventFactory.callFoodLevelChangeEvent(player, old + foodLevelIn); + if (!event.isCancelled()) { + foodStats.addStats(event.getFoodLevel() - old, foodSaturationModifier); + } + ((ServerPlayerEntityBridge) player).bridge$getBukkitEntity().sendHealthUpdate(); + } +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/CauldronBlockMixin_1_15.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/CauldronBlockMixin_1_15.java new file mode 100644 index 00000000..62052c38 --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/CauldronBlockMixin_1_15.java @@ -0,0 +1,103 @@ +package io.izzel.arclight.common.mixin.v1_15.block; + +import io.izzel.arclight.common.bridge.entity.EntityBridge; +import net.minecraft.block.BlockState; +import net.minecraft.block.CauldronBlock; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.potion.PotionUtils; +import net.minecraft.potion.Potions; +import net.minecraft.util.ActionResultType; +import net.minecraft.util.Hand; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.BlockRayTraceResult; +import net.minecraft.util.math.MathHelper; +import net.minecraft.world.World; +import org.bukkit.Bukkit; +import org.bukkit.craftbukkit.v.block.CraftBlock; +import org.bukkit.event.block.CauldronLevelChangeEvent; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(CauldronBlock.class) +public class CauldronBlockMixin_1_15 { + + @Inject(method = "onEntityCollision", cancellable = true, at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/Entity;extinguish()V")) + public void arclight$extinguish(BlockState state, World worldIn, BlockPos pos, Entity entityIn, CallbackInfo ci) { + int i = state.get(CauldronBlock.LEVEL); + if (!changeLevel(worldIn, pos, state, i - 1, entityIn, CauldronLevelChangeEvent.ChangeReason.EXTINGUISH)) { + ci.cancel(); + } + } + + @Inject(method = "onBlockActivated", cancellable = true, at = @At(value = "FIELD", target = "Lnet/minecraft/entity/player/PlayerEntity;abilities:Lnet/minecraft/entity/player/PlayerAbilities;")) + public void arclight$levelChange(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand handIn, BlockRayTraceResult hit, CallbackInfoReturnable cir) { + ItemStack itemStack = player.getHeldItem(handIn); + Item item = itemStack.getItem(); + int i = state.get(CauldronBlock.LEVEL); + int newLevel; + CauldronLevelChangeEvent.ChangeReason reason; + if (item == Items.WATER_BUCKET) { + reason = CauldronLevelChangeEvent.ChangeReason.BUCKET_EMPTY; + newLevel = 3; + } else if (item == Items.BUCKET) { + reason = CauldronLevelChangeEvent.ChangeReason.BUCKET_FILL; + newLevel = 0; + } else if (item == Items.GLASS_BOTTLE) { + reason = CauldronLevelChangeEvent.ChangeReason.BOTTLE_FILL; + newLevel = i - 1; + } else if (item == Items.POTION && PotionUtils.getPotionFromItem(itemStack) == Potions.WATER) { + reason = CauldronLevelChangeEvent.ChangeReason.BOTTLE_EMPTY; + newLevel = i + 1; + } else { + reason = null; + newLevel = 0; + } + if (reason != null && !changeLevel(worldIn, pos, state, newLevel, player, reason)) { + cir.setReturnValue(ActionResultType.SUCCESS); + } + } + + @Inject(method = "onBlockActivated", cancellable = true, at = @At(value = "INVOKE", target = "Lnet/minecraft/item/IDyeableArmorItem;removeColor(Lnet/minecraft/item/ItemStack;)V")) + public void arclight$removeColor(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand handIn, BlockRayTraceResult hit, CallbackInfoReturnable cir) { + int i = state.get(CauldronBlock.LEVEL); + if (!changeLevel(worldIn, pos, state, i - 1, player, CauldronLevelChangeEvent.ChangeReason.ARMOR_WASH)) { + cir.setReturnValue(ActionResultType.SUCCESS); + } + } + + @Inject(method = "onBlockActivated", cancellable = true, at = @At(value = "INVOKE", target = "Lnet/minecraft/tileentity/BannerTileEntity;removeBannerData(Lnet/minecraft/item/ItemStack;)V")) + public void arclight$removeBanner(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand handIn, BlockRayTraceResult hit, CallbackInfoReturnable cir) { + int i = state.get(CauldronBlock.LEVEL); + if (!changeLevel(worldIn, pos, state, i - 1, player, CauldronLevelChangeEvent.ChangeReason.BANNER_WASH)) { + cir.setReturnValue(ActionResultType.SUCCESS); + } + } + + @Inject(method = "fillWithRain", cancellable = true, at = @At(value = "INVOKE", target = "Lnet/minecraft/world/World;setBlockState(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;I)Z")) + public void arclight$fillRain(World worldIn, BlockPos pos, CallbackInfo ci) { + BlockState state = worldIn.getBlockState(pos); + BlockState cycle = state.cycle(CauldronBlock.LEVEL); + int newLevel = cycle.get(CauldronBlock.LEVEL); + if (!changeLevel(worldIn, pos, state, newLevel, null, CauldronLevelChangeEvent.ChangeReason.UNKNOWN)) { + ci.cancel(); + } + } + + private boolean changeLevel(World world, BlockPos pos, BlockState state, int i, Entity entity, CauldronLevelChangeEvent.ChangeReason reason) { + int newLevel = MathHelper.clamp(i, 0, 3); + CauldronLevelChangeEvent event = new CauldronLevelChangeEvent( + CraftBlock.at(world, pos), + (entity == null) ? null : ((EntityBridge) entity).bridge$getBukkitEntity(), + reason, state.get(CauldronBlock.LEVEL), newLevel + ); + Bukkit.getPluginManager().callEvent(event); + return !event.isCancelled(); + } +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/ChestBlock2Mixin_1_15.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/ChestBlock2Mixin_1_15.java new file mode 100644 index 00000000..cf5ddb58 --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/ChestBlock2Mixin_1_15.java @@ -0,0 +1,24 @@ +package io.izzel.arclight.common.mixin.v1_15.block; + +import io.izzel.arclight.common.mod.util.ChestBlockDoubleInventoryHacks; +import net.minecraft.inventory.DoubleSidedInventory; +import net.minecraft.inventory.container.INamedContainerProvider; +import net.minecraft.tileentity.ChestTileEntity; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; + +import java.util.Optional; + +@Mixin(targets = "net/minecraft/block/ChestBlock$2") +public class ChestBlock2Mixin_1_15 { + + /** + * @author IzzelAliz + * @reason + */ + @Overwrite + public Optional func_225539_a_(final ChestTileEntity p_225539_1_, final ChestTileEntity p_225539_2_) { + final DoubleSidedInventory iinventory = new DoubleSidedInventory(p_225539_1_, p_225539_2_); + return Optional.ofNullable(ChestBlockDoubleInventoryHacks.create(p_225539_1_, p_225539_2_, iinventory)); + } +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/ChorusFlowerBlockMixin_1_15.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/ChorusFlowerBlockMixin_1_15.java new file mode 100644 index 00000000..4e90c895 --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/ChorusFlowerBlockMixin_1_15.java @@ -0,0 +1,118 @@ +package io.izzel.arclight.common.mixin.v1_15.block; + +import io.izzel.arclight.common.mixin.core.block.BlockMixin; +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.block.ChorusFlowerBlock; +import net.minecraft.block.ChorusPlantBlock; +import net.minecraft.state.IntegerProperty; +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.IWorldReader; +import net.minecraft.world.World; +import net.minecraft.world.server.ServerWorld; +import net.minecraftforge.common.ForgeHooks; +import org.bukkit.craftbukkit.v.event.CraftEventFactory; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; +import org.spongepowered.asm.mixin.Shadow; + +import javax.annotation.Nullable; +import java.util.Random; + +@Mixin(ChorusFlowerBlock.class) +public abstract class ChorusFlowerBlockMixin_1_15 extends BlockMixin { + + // @formatter:off + @Shadow @Final public static IntegerProperty AGE; + @Shadow @Final private ChorusPlantBlock field_196405_b; + @Shadow private static boolean areAllNeighborsEmpty(IWorldReader worldIn, BlockPos pos, @Nullable Direction excludingSide) { return false; } + @Shadow protected abstract void placeGrownFlower(World worldIn, BlockPos pos, int age); + @Shadow protected abstract void placeDeadFlower(World worldIn, BlockPos pos); + // @formatter:on + + /** + * @author IzzelAliz + * @reason + */ + @Overwrite + public void tick(BlockState state, ServerWorld worldIn, BlockPos pos, Random random) { + if (!state.isValidPosition(worldIn, pos)) { + worldIn.destroyBlock(pos, true); + } else { + BlockPos blockpos = pos.up(); + if (worldIn.isAirBlock(blockpos) && blockpos.getY() < worldIn.getDimension().getHeight()) { + int i = state.get(AGE); + if (i < 5 && ForgeHooks.onCropsGrowPre(worldIn, blockpos, state, true)) { + boolean flag = false; + boolean flag1 = false; + BlockState blockstate = worldIn.getBlockState(pos.down()); + Block block = blockstate.getBlock(); + if (block == Blocks.END_STONE) { + flag = true; + } else if (block == this.field_196405_b) { + int j = 1; + + for (int k = 0; k < 4; ++k) { + Block block1 = worldIn.getBlockState(pos.down(j + 1)).getBlock(); + if (block1 != this.field_196405_b) { + if (block1 == Blocks.END_STONE) { + flag1 = true; + } + break; + } + + ++j; + } + + if (j < 2 || j <= random.nextInt(flag1 ? 5 : 4)) { + flag = true; + } + } else if (blockstate.isAir(worldIn, pos.down())) { + flag = true; + } + + if (flag && areAllNeighborsEmpty(worldIn, blockpos, (Direction) null) && worldIn.isAirBlock(pos.up(2))) { + if (CraftEventFactory.handleBlockSpreadEvent(worldIn, pos, pos.up(), state.with(ChorusFlowerBlock.AGE, i), 2)) { + worldIn.setBlockState(pos, this.field_196405_b.makeConnections(worldIn, pos), 2); + this.placeGrownFlower(worldIn, blockpos, i); + } + } else if (i < 4) { + int l = random.nextInt(4); + if (flag1) { + ++l; + } + + boolean flag2 = false; + + for (int i1 = 0; i1 < l; ++i1) { + Direction direction = Direction.Plane.HORIZONTAL.random(random); + BlockPos blockpos1 = pos.offset(direction); + if (worldIn.isAirBlock(blockpos1) && worldIn.isAirBlock(blockpos1.down()) && areAllNeighborsEmpty(worldIn, blockpos1, direction.getOpposite())) { + if (CraftEventFactory.handleBlockSpreadEvent(worldIn, pos, blockpos1, state.with(ChorusFlowerBlock.AGE, i + 1), 2)) { + this.placeGrownFlower(worldIn, blockpos1, i + 1); + flag2 = true; + } + } + } + + if (flag2) { + worldIn.setBlockState(pos, this.field_196405_b.makeConnections(worldIn, pos), 2); + } else { + if (CraftEventFactory.handleBlockGrowEvent(worldIn, pos, this.getDefaultState().with(ChorusFlowerBlock.AGE, 5), 2)) { + this.placeDeadFlower(worldIn, pos); + } + } + } else { + if (CraftEventFactory.handleBlockGrowEvent(worldIn, pos, this.getDefaultState().with(ChorusFlowerBlock.AGE, 5), 2)) { + this.placeDeadFlower(worldIn, pos); + } + } + ForgeHooks.onCropsGrowPost(worldIn, pos, state); + } + } + } + } +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/CocoaBlockMixin_1_15.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/CocoaBlockMixin_1_15.java new file mode 100644 index 00000000..216589a6 --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/CocoaBlockMixin_1_15.java @@ -0,0 +1,19 @@ +package io.izzel.arclight.common.mixin.v1_15.block; + +import net.minecraft.block.BlockState; +import net.minecraft.block.CocoaBlock; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.server.ServerWorld; +import org.bukkit.craftbukkit.v.event.CraftEventFactory; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +@Mixin(CocoaBlock.class) +public class CocoaBlockMixin_1_15 { + + @Redirect(method = "tick", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/server/ServerWorld;setBlockState(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;I)Z")) + public boolean arclight$blockGrow(ServerWorld world, BlockPos pos, BlockState newState, int flags) { + return CraftEventFactory.handleBlockGrowEvent(world, pos, newState, flags); + } +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/CoralBlockMixin_1_15.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/CoralBlockMixin_1_15.java new file mode 100644 index 00000000..46f98f6d --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/CoralBlockMixin_1_15.java @@ -0,0 +1,31 @@ +package io.izzel.arclight.common.mixin.v1_15.block; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.CoralBlock; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.server.ServerWorld; +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; + +import java.util.Random; + +@Mixin(CoralBlock.class) +public class CoralBlockMixin_1_15 { + + // @formatter:off + @Shadow @Final private Block deadBlock; + // @formatter:on + + @Inject(method = "tick", cancellable = true, at = @At(value = "INVOKE", target = "Lnet/minecraft/world/server/ServerWorld;setBlockState(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;I)Z")) + public void arclight$blockFade(BlockState state, ServerWorld worldIn, BlockPos pos, Random random, CallbackInfo ci) { + if (CraftEventFactory.callBlockFadeEvent(worldIn, pos, this.deadBlock.getDefaultState()).isCancelled()) { + ci.cancel(); + } + } +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/CoralFinBlockMixin_1_15.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/CoralFinBlockMixin_1_15.java new file mode 100644 index 00000000..b719b5fd --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/CoralFinBlockMixin_1_15.java @@ -0,0 +1,32 @@ +package io.izzel.arclight.common.mixin.v1_15.block; + +import net.minecraft.block.AbstractCoralPlantBlock; +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.CoralFinBlock; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.server.ServerWorld; +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; + +import java.util.Random; + +@Mixin(CoralFinBlock.class) +public class CoralFinBlockMixin_1_15 { + + // @formatter:off + @Shadow @Final private Block deadBlock; + // @formatter:on + + @Inject(method = "tick", cancellable = true, at = @At(value = "INVOKE", target = "Lnet/minecraft/world/server/ServerWorld;setBlockState(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;I)Z")) + public void arclight$blockFade(BlockState state, ServerWorld worldIn, BlockPos pos, Random random, CallbackInfo ci) { + if (CraftEventFactory.callBlockFadeEvent(worldIn, pos, this.deadBlock.getDefaultState().with(AbstractCoralPlantBlock.WATERLOGGED, false)).isCancelled()) { + ci.cancel(); + } + } +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/CoralPlantBlockMixin_1_15.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/CoralPlantBlockMixin_1_15.java new file mode 100644 index 00000000..f169d858 --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/CoralPlantBlockMixin_1_15.java @@ -0,0 +1,32 @@ +package io.izzel.arclight.common.mixin.v1_15.block; + +import net.minecraft.block.AbstractCoralPlantBlock; +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.CoralPlantBlock; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.server.ServerWorld; +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; + +import java.util.Random; + +@Mixin(CoralPlantBlock.class) +public class CoralPlantBlockMixin_1_15 { + + // @formatter:off + @Shadow @Final private Block deadBlock; + // @formatter:on + + @Inject(method = "tick", cancellable = true, at = @At(value = "INVOKE", target = "Lnet/minecraft/world/server/ServerWorld;setBlockState(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;I)Z")) + public void arclight$blockFade(BlockState state, ServerWorld worldIn, BlockPos pos, Random random, CallbackInfo ci) { + if (CraftEventFactory.callBlockFadeEvent(worldIn, pos, this.deadBlock.getDefaultState().with(AbstractCoralPlantBlock.WATERLOGGED, false)).isCancelled()) { + ci.cancel(); + } + } +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/CoralWallFanBlockMixin_1_15.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/CoralWallFanBlockMixin_1_15.java new file mode 100644 index 00000000..5eceb859 --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/CoralWallFanBlockMixin_1_15.java @@ -0,0 +1,35 @@ +package io.izzel.arclight.common.mixin.v1_15.block; + +import net.minecraft.block.AbstractCoralPlantBlock; +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.CoralWallFanBlock; +import net.minecraft.block.DeadCoralWallFanBlock; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.server.ServerWorld; +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; + +import java.util.Random; + +@Mixin(CoralWallFanBlock.class) +public class CoralWallFanBlockMixin_1_15 { + + // @formatter:off + @Shadow @Final private Block deadBlock; + // @formatter:on + + @Inject(method = "tick", cancellable = true, at = @At(value = "INVOKE", target = "Lnet/minecraft/world/server/ServerWorld;setBlockState(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;I)Z")) + public void arclight$blockFade(BlockState state, ServerWorld worldIn, BlockPos pos, Random random, CallbackInfo ci) { + if (CraftEventFactory.callBlockFadeEvent(worldIn, pos, this.deadBlock.getDefaultState() + .with(AbstractCoralPlantBlock.WATERLOGGED, Boolean.FALSE) + .with(DeadCoralWallFanBlock.FACING, state.get(DeadCoralWallFanBlock.FACING))).isCancelled()) { + ci.cancel(); + } + } +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/CropsBlockMixin_1_15.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/CropsBlockMixin_1_15.java new file mode 100644 index 00000000..3fe86b64 --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/CropsBlockMixin_1_15.java @@ -0,0 +1,19 @@ +package io.izzel.arclight.common.mixin.v1_15.block; + +import net.minecraft.block.BlockState; +import net.minecraft.block.CropsBlock; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.server.ServerWorld; +import org.bukkit.craftbukkit.v.event.CraftEventFactory; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +@Mixin(CropsBlock.class) +public class CropsBlockMixin_1_15 { + + @Redirect(method = "tick", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/server/ServerWorld;setBlockState(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;I)Z")) + public boolean arclight$blockGrowTick(ServerWorld world, BlockPos pos, BlockState newState, int flags) { + return CraftEventFactory.handleBlockGrowEvent(world, pos, newState, flags); + } +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/FarmlandBlockMixin_1_15.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/FarmlandBlockMixin_1_15.java new file mode 100644 index 00000000..7ca0f9ba --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/FarmlandBlockMixin_1_15.java @@ -0,0 +1,19 @@ +package io.izzel.arclight.common.mixin.v1_15.block; + +import net.minecraft.block.BlockState; +import net.minecraft.block.FarmlandBlock; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.server.ServerWorld; +import org.bukkit.craftbukkit.v.event.CraftEventFactory; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +@Mixin(FarmlandBlock.class) +public class FarmlandBlockMixin_1_15 { + + @Redirect(method = "tick", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/server/ServerWorld;setBlockState(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;I)Z")) + public boolean arclight$moistureChange(ServerWorld world, BlockPos pos, BlockState newState, int flags) { + return CraftEventFactory.handleMoistureChangeEvent(world, pos, newState, flags); + } +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/FireBlockMixin_1_15.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/FireBlockMixin_1_15.java new file mode 100644 index 00000000..5208f372 --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/FireBlockMixin_1_15.java @@ -0,0 +1,34 @@ +package io.izzel.arclight.common.mixin.v1_15.block; + +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.block.FireBlock; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.server.ServerWorld; +import org.bukkit.craftbukkit.v.event.CraftEventFactory; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +@Mixin(FireBlock.class) +public class FireBlockMixin_1_15 { + + @Redirect(method = "tick", at = @At(value = "INVOKE", ordinal = 1, target = "Lnet/minecraft/world/server/ServerWorld;setBlockState(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;I)Z")) + public boolean arclight$fireSpread(ServerWorld world, BlockPos mutablePos, BlockState newState, int flags, + BlockState state, ServerWorld worldIn, BlockPos pos) { + if (world.getBlockState(mutablePos).getBlock() != Blocks.FIRE) { + if (!CraftEventFactory.callBlockIgniteEvent(world, mutablePos, pos).isCancelled()) { + return CraftEventFactory.handleBlockSpreadEvent(world, pos, mutablePos, newState, flags); + } + } + return false; + } + + @Redirect(method = "tick", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/server/ServerWorld;removeBlock(Lnet/minecraft/util/math/BlockPos;Z)Z")) + public boolean arclight$extinguish1(ServerWorld world, BlockPos pos, boolean isMoving) { + if (!CraftEventFactory.callBlockFadeEvent(world, pos, Blocks.AIR.getDefaultState()).isCancelled()) { + world.removeBlock(pos, isMoving); + } + return false; + } +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/GrassBlockMixin_1_15.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/GrassBlockMixin_1_15.java new file mode 100644 index 00000000..cf211075 --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/GrassBlockMixin_1_15.java @@ -0,0 +1,19 @@ +package io.izzel.arclight.common.mixin.v1_15.block; + +import net.minecraft.block.BlockState; +import net.minecraft.block.GrassBlock; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.server.ServerWorld; +import org.bukkit.craftbukkit.v.event.CraftEventFactory; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +@Mixin(GrassBlock.class) +public class GrassBlockMixin_1_15 { + + @Redirect(method = "grow", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/server/ServerWorld;setBlockState(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;I)Z")) + public boolean arclight$blockGrow(ServerWorld world, BlockPos pos, BlockState newState, int flags) { + return CraftEventFactory.handleBlockGrowEvent(world, pos, newState, flags); + } +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/KelpTopBlockMixin_1_15.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/KelpTopBlockMixin_1_15.java new file mode 100644 index 00000000..3d6b32a1 --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/KelpTopBlockMixin_1_15.java @@ -0,0 +1,19 @@ +package io.izzel.arclight.common.mixin.v1_15.block; + +import net.minecraft.block.BlockState; +import net.minecraft.block.KelpTopBlock; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.server.ServerWorld; +import org.bukkit.craftbukkit.v.event.CraftEventFactory; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +@Mixin(KelpTopBlock.class) +public class KelpTopBlockMixin_1_15 { + + @Redirect(method = "tick", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/server/ServerWorld;setBlockState(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;)Z")) + public boolean arclight$blockGrow(ServerWorld world, BlockPos pos, BlockState state) { + return CraftEventFactory.handleBlockGrowEvent(world, pos, state); + } +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/LeavesBlockMixin_1_15.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/LeavesBlockMixin_1_15.java new file mode 100644 index 00000000..503929e4 --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/LeavesBlockMixin_1_15.java @@ -0,0 +1,28 @@ +package io.izzel.arclight.common.mixin.v1_15.block; + +import net.minecraft.block.BlockState; +import net.minecraft.block.LeavesBlock; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.server.ServerWorld; +import org.bukkit.Bukkit; +import org.bukkit.craftbukkit.v.block.CraftBlock; +import org.bukkit.event.block.LeavesDecayEvent; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import java.util.Random; + +@Mixin(LeavesBlock.class) +public class LeavesBlockMixin_1_15 { + + @Inject(method = "randomTick", cancellable = true, at = @At(value = "INVOKE", target = "Lnet/minecraft/block/LeavesBlock;spawnDrops(Lnet/minecraft/block/BlockState;Lnet/minecraft/world/World;Lnet/minecraft/util/math/BlockPos;)V")) + public void arclight$leavesDecay(BlockState state, ServerWorld worldIn, BlockPos pos, Random random, CallbackInfo ci) { + LeavesDecayEvent event = new LeavesDecayEvent(CraftBlock.at(worldIn, pos)); + Bukkit.getPluginManager().callEvent(event); + if (event.isCancelled() || worldIn.getBlockState(pos).getBlock() != (Object) this) { + ci.cancel(); + } + } +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/LeverBlockMixin_1_15.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/LeverBlockMixin_1_15.java new file mode 100644 index 00000000..c5a96d3e --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/LeverBlockMixin_1_15.java @@ -0,0 +1,38 @@ +package io.izzel.arclight.common.mixin.v1_15.block; + +import net.minecraft.block.BlockState; +import net.minecraft.block.LeverBlock; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.util.Hand; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.BlockRayTraceResult; +import net.minecraft.world.World; +import org.bukkit.Bukkit; +import org.bukkit.block.Block; +import org.bukkit.craftbukkit.v.block.CraftBlock; +import org.bukkit.event.block.BlockRedstoneEvent; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import org.spongepowered.asm.mixin.injection.callback.LocalCapture; + +@Mixin(LeverBlock.class) +public class LeverBlockMixin_1_15 { + + @Inject(method = "onBlockActivated", cancellable = true, locals = LocalCapture.CAPTURE_FAILHARD + , at = @At(value = "INVOKE", target = "Lnet/minecraft/block/LeverBlock;setPowered(Lnet/minecraft/block/BlockState;Lnet/minecraft/world/World;Lnet/minecraft/util/math/BlockPos;)Lnet/minecraft/block/BlockState;")) + public void arclight$blockRedstone(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand handIn, BlockRayTraceResult hit, CallbackInfoReturnable cir, + boolean flag) { + Block block = CraftBlock.at(worldIn, pos); + int old = (flag) ? 15 : 0; + int current = (!flag) ? 15 : 0; + + BlockRedstoneEvent eventRedstone = new BlockRedstoneEvent(block, old, current); + Bukkit.getPluginManager().callEvent(eventRedstone); + + if ((eventRedstone.getNewCurrent() > 0) == flag) { + cir.setReturnValue(true); + } + } +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/MushroomBlockMixin_1_15.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/MushroomBlockMixin_1_15.java new file mode 100644 index 00000000..5f41aa56 --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/MushroomBlockMixin_1_15.java @@ -0,0 +1,20 @@ +package io.izzel.arclight.common.mixin.v1_15.block; + +import net.minecraft.block.BlockState; +import net.minecraft.block.MushroomBlock; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import net.minecraft.world.server.ServerWorld; +import org.bukkit.craftbukkit.v.event.CraftEventFactory; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +@Mixin(MushroomBlock.class) +public class MushroomBlockMixin_1_15 { + + @Redirect(method = "tick", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/server/ServerWorld;setBlockState(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;I)Z")) + public boolean arclight$blockSpread(ServerWorld world, BlockPos toPos, BlockState newState, int flags, BlockState state, World worldIn, BlockPos fromPos) { + return CraftEventFactory.handleBlockSpreadEvent(world, fromPos, toPos, newState, flags); + } +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/NetherPortalBlockMixin_1_15.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/NetherPortalBlockMixin_1_15.java new file mode 100644 index 00000000..58d87342 --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/NetherPortalBlockMixin_1_15.java @@ -0,0 +1,25 @@ +package io.izzel.arclight.common.mixin.v1_15.block; + +import io.izzel.arclight.common.bridge.entity.EntityTypeBridge; +import net.minecraft.block.NetherPortalBlock; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityType; +import net.minecraft.entity.SpawnReason; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.world.World; +import org.bukkit.event.entity.CreatureSpawnEvent; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +@Mixin(NetherPortalBlock.class) +public class NetherPortalBlockMixin_1_15 { + + @Redirect(method = "tick", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/EntityType;spawn(Lnet/minecraft/world/World;Lnet/minecraft/nbt/CompoundNBT;Lnet/minecraft/util/text/ITextComponent;Lnet/minecraft/entity/player/PlayerEntity;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/entity/SpawnReason;ZZ)Lnet/minecraft/entity/Entity;")) + public Entity arclight$spawn(EntityType entityType, World worldIn, CompoundNBT compound, ITextComponent customName, PlayerEntity playerIn, BlockPos pos, SpawnReason reason, boolean flag, boolean flag1) { + return ((EntityTypeBridge) entityType).bridge$spawnCreature(worldIn, compound, customName, playerIn, pos, reason, flag, flag1, CreatureSpawnEvent.SpawnReason.NETHER_PORTAL); + } +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/NetherWartBlockMixin_1_15.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/NetherWartBlockMixin_1_15.java new file mode 100644 index 00000000..65bc7a02 --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/NetherWartBlockMixin_1_15.java @@ -0,0 +1,19 @@ +package io.izzel.arclight.common.mixin.v1_15.block; + +import net.minecraft.block.BlockState; +import net.minecraft.block.NetherWartBlock; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.server.ServerWorld; +import org.bukkit.craftbukkit.v.event.CraftEventFactory; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +@Mixin(NetherWartBlock.class) +public class NetherWartBlockMixin_1_15 { + + @Redirect(method = "tick", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/server/ServerWorld;setBlockState(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;I)Z")) + public boolean arclight$cropGrow(ServerWorld world, BlockPos pos, BlockState newState, int flags) { + return CraftEventFactory.handleBlockGrowEvent(world, pos, newState, flags); + } +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/ObserverBlockMixin_1_15.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/ObserverBlockMixin_1_15.java new file mode 100644 index 00000000..ab34eca8 --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/ObserverBlockMixin_1_15.java @@ -0,0 +1,31 @@ +package io.izzel.arclight.common.mixin.v1_15.block; + +import net.minecraft.block.BlockState; +import net.minecraft.block.ObserverBlock; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.server.ServerWorld; +import org.bukkit.craftbukkit.v.event.CraftEventFactory; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import java.util.Random; + +@Mixin(ObserverBlock.class) +public class ObserverBlockMixin_1_15 { + + @Inject(method = "tick", cancellable = true, at = @At(value = "INVOKE", ordinal = 0, target = "Lnet/minecraft/world/server/ServerWorld;setBlockState(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;I)Z")) + public void arclight$redstoneChange1(BlockState state, ServerWorld worldIn, BlockPos pos, Random random, CallbackInfo ci) { + if (CraftEventFactory.callRedstoneChange(worldIn, pos, 15, 0).getNewCurrent() != 0) { + ci.cancel(); + } + } + + @Inject(method = "tick", cancellable = true, at = @At(value = "INVOKE", ordinal = 1, target = "Lnet/minecraft/world/server/ServerWorld;setBlockState(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;I)Z")) + public void arclight$redstoneChange2(BlockState state, ServerWorld worldIn, BlockPos pos, Random random, CallbackInfo ci) { + if (CraftEventFactory.callRedstoneChange(worldIn, pos, 0, 15).getNewCurrent() != 15) { + ci.cancel(); + } + } +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/PistonBlockMixin_1_15.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/PistonBlockMixin_1_15.java new file mode 100644 index 00000000..8505657f --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/PistonBlockMixin_1_15.java @@ -0,0 +1,76 @@ +package io.izzel.arclight.common.mixin.v1_15.block; + +import net.minecraft.block.Blocks; +import net.minecraft.block.PistonBlock; +import net.minecraft.block.PistonBlockStructureHelper; +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import org.bukkit.Bukkit; +import org.bukkit.block.Block; +import org.bukkit.craftbukkit.v.block.CraftBlock; +import org.bukkit.event.block.BlockPistonEvent; +import org.bukkit.event.block.BlockPistonExtendEvent; +import org.bukkit.event.block.BlockPistonRetractEvent; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import org.spongepowered.asm.mixin.injection.callback.LocalCapture; + +import java.util.AbstractList; +import java.util.List; + +@Mixin(PistonBlock.class) +public class PistonBlockMixin_1_15 { + + @Inject(method = "doMove", cancellable = true, locals = LocalCapture.CAPTURE_FAILHARD, + at = @At(value = "INVOKE_ASSIGN", target = "Lnet/minecraft/block/PistonBlockStructureHelper;getBlocksToDestroy()Ljava/util/List;")) + public void arclight$pistonAction(World worldIn, BlockPos pos, Direction directionIn, boolean extending, CallbackInfoReturnable cir, + BlockPos blockPos, PistonBlockStructureHelper helper) { + final Block craftBlock = CraftBlock.at(worldIn, pos); + + final List moved = helper.getBlocksToMove(); + final List broken = helper.getBlocksToDestroy(); + + class BlockList extends AbstractList { + + @Override + public int size() { + return moved.size() + broken.size(); + } + + @Override + public org.bukkit.block.Block get(int index) { + if (index >= size() || index < 0) { + throw new ArrayIndexOutOfBoundsException(index); + } + BlockPos pos = index < moved.size() ? moved.get(index) : broken.get(index - moved.size()); + return craftBlock.getWorld().getBlockAt(pos.getX(), pos.getY(), pos.getZ()); + } + } + + List blocks = new BlockList(); + + Direction direction = extending ? directionIn : directionIn.getOpposite(); + BlockPistonEvent event; + if (extending) { + event = new BlockPistonExtendEvent(craftBlock, blocks, CraftBlock.notchToBlockFace(direction)); + } else { + event = new BlockPistonRetractEvent(craftBlock, blocks, CraftBlock.notchToBlockFace(direction)); + } + Bukkit.getPluginManager().callEvent(event); + + if (event.isCancelled()) { + for (BlockPos b : broken) { + worldIn.notifyBlockUpdate(b, Blocks.AIR.getDefaultState(), worldIn.getBlockState(b), 3); + } + for (BlockPos b : moved) { + worldIn.notifyBlockUpdate(b, Blocks.AIR.getDefaultState(), worldIn.getBlockState(b), 3); + b = b.offset(direction); + worldIn.notifyBlockUpdate(b, Blocks.AIR.getDefaultState(), worldIn.getBlockState(b), 3); + } + cir.setReturnValue(false); + } + } +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/RedstoneDiodeBlockMixin_1_15.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/RedstoneDiodeBlockMixin_1_15.java new file mode 100644 index 00000000..7b1a96bd --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/RedstoneDiodeBlockMixin_1_15.java @@ -0,0 +1,31 @@ +package io.izzel.arclight.common.mixin.v1_15.block; + +import net.minecraft.block.BlockState; +import net.minecraft.block.RedstoneDiodeBlock; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.server.ServerWorld; +import org.bukkit.craftbukkit.v.event.CraftEventFactory; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import java.util.Random; + +@Mixin(RedstoneDiodeBlock.class) +public class RedstoneDiodeBlockMixin_1_15 { + + @Inject(method = "tick", cancellable = true, at = @At(value = "INVOKE", ordinal = 0, target = "Lnet/minecraft/world/server/ServerWorld;setBlockState(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;I)Z")) + public void arclight$turnOff(BlockState state, ServerWorld worldIn, BlockPos pos, Random random, CallbackInfo ci) { + if (CraftEventFactory.callRedstoneChange(worldIn, pos, 15, 0).getNewCurrent() != 0) { + ci.cancel(); + } + } + + @Inject(method = "tick", cancellable = true, at = @At(value = "INVOKE", ordinal = 1, target = "Lnet/minecraft/world/server/ServerWorld;setBlockState(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;I)Z")) + public void arclight$turnOn(BlockState state, ServerWorld worldIn, BlockPos pos, Random random, CallbackInfo ci) { + if (CraftEventFactory.callRedstoneChange(worldIn, pos, 0, 15).getNewCurrent() != 15) { + ci.cancel(); + } + } +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/RedstoneLampBlockMixin_1_15.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/RedstoneLampBlockMixin_1_15.java new file mode 100644 index 00000000..3c09a930 --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/RedstoneLampBlockMixin_1_15.java @@ -0,0 +1,24 @@ +package io.izzel.arclight.common.mixin.v1_15.block; + +import net.minecraft.block.BlockState; +import net.minecraft.block.RedstoneLampBlock; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.server.ServerWorld; +import org.bukkit.craftbukkit.v.event.CraftEventFactory; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import java.util.Random; + +@Mixin(RedstoneLampBlock.class) +public class RedstoneLampBlockMixin_1_15 { + + @Inject(method = "tick", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/server/ServerWorld;setBlockState(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;I)Z")) + private void arclight$redstoneChange(BlockState state, ServerWorld worldIn, BlockPos pos, Random rand, CallbackInfo ci) { + if (CraftEventFactory.callRedstoneChange(worldIn, pos, 15, 0).getNewCurrent() != 0) { + ci.cancel(); + } + } +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/RedstoneOreBlockMixin_1_15.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/RedstoneOreBlockMixin_1_15.java new file mode 100644 index 00000000..baeb1e0b --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/RedstoneOreBlockMixin_1_15.java @@ -0,0 +1,85 @@ +package io.izzel.arclight.common.mixin.v1_15.block; + +import io.izzel.arclight.common.bridge.entity.EntityBridge; +import net.minecraft.block.BlockState; +import net.minecraft.block.RedstoneOreBlock; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.util.Hand; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.BlockRayTraceResult; +import net.minecraft.world.World; +import net.minecraft.world.server.ServerWorld; +import org.bukkit.Bukkit; +import org.bukkit.craftbukkit.v.block.CraftBlock; +import org.bukkit.craftbukkit.v.event.CraftEventFactory; +import org.bukkit.event.block.Action; +import org.bukkit.event.entity.EntityInteractEvent; +import org.bukkit.event.player.PlayerInteractEvent; +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; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import java.util.Random; + +@Mixin(RedstoneOreBlock.class) +public abstract class RedstoneOreBlockMixin_1_15 { + + // @formatter:off + @Shadow private static void activate(BlockState p_196500_0_, World p_196500_1_, BlockPos p_196500_2_) { } + // @formatter:on + + private static transient Entity arclight$entity; + + @Inject(method = "onBlockClicked", at = @At(value = "HEAD")) + public void arclight$interact1(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, CallbackInfo ci) { + arclight$entity = player; + } + + @Inject(method = "onEntityWalk", at = @At(value = "HEAD")) + public void arclight$entityInteract(World worldIn, BlockPos pos, Entity entityIn, CallbackInfo ci) { + if (entityIn instanceof PlayerEntity) { + PlayerInteractEvent event = CraftEventFactory.callPlayerInteractEvent(((PlayerEntity) entityIn), Action.PHYSICAL, pos, null, null, null); + if (event.isCancelled()) { + ci.cancel(); + return; + } + } else { + EntityInteractEvent event = new EntityInteractEvent(((EntityBridge) entityIn).bridge$getBukkitEntity(), CraftBlock.at(worldIn, pos)); + Bukkit.getPluginManager().callEvent(event); + if (event.isCancelled()) { + ci.cancel(); + return; + } + } + arclight$entity = entityIn; + } + + @Inject(method = "onBlockActivated", at = @At(value = "HEAD")) + public void arclight$interact3(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand handIn, BlockRayTraceResult hit, CallbackInfoReturnable cir) { + arclight$entity = player; + } + + @Inject(method = "tick", cancellable = true, at = @At(value = "INVOKE", target = "Lnet/minecraft/world/server/ServerWorld;setBlockState(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;I)Z")) + private void arclight$blockFade(BlockState state, ServerWorld worldIn, BlockPos pos, Random random, CallbackInfo ci) { + if (CraftEventFactory.callBlockFadeEvent(worldIn, pos, state.with(RedstoneOreBlock.LIT, false)).isCancelled()) { + ci.cancel(); + } + } + + private static void interact(BlockState blockState, World world, BlockPos blockPos, Entity entity) { + arclight$entity = entity; + activate(blockState, world, blockPos); + } + + @Inject(method = "activate", cancellable = true, at = @At(value = "INVOKE", target = "Lnet/minecraft/world/World;setBlockState(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;I)Z")) + private static void arclight$entityChangeBlock(BlockState blockState, World world, BlockPos blockPos, CallbackInfo ci) { + if (CraftEventFactory.callEntityChangeBlockEvent(arclight$entity, blockPos, blockState.with(RedstoneOreBlock.LIT, true)).isCancelled()) { + ci.cancel(); + } + arclight$entity = null; + } +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/ScaffoldingBlockMixin_1_15.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/ScaffoldingBlockMixin_1_15.java new file mode 100644 index 00000000..82852e1e --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/ScaffoldingBlockMixin_1_15.java @@ -0,0 +1,32 @@ +package io.izzel.arclight.common.mixin.v1_15.block; + +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.block.ScaffoldingBlock; +import net.minecraft.state.IProperty; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.server.ServerWorld; +import org.bukkit.craftbukkit.v.event.CraftEventFactory; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +import java.util.Random; + +@Mixin(ScaffoldingBlock.class) +public class ScaffoldingBlockMixin_1_15 { + + @Redirect(method = "tick", at = @At(value = "INVOKE", ordinal = 0, target = "Lnet/minecraft/block/BlockState;get(Lnet/minecraft/state/IProperty;)Ljava/lang/Comparable;")) + public Comparable arclight$blockFade(BlockState state, IProperty property, BlockState blockState, ServerWorld worldIn, BlockPos pos, Random random) { + Integer integer = state.get(property); + if (integer == 7) { + if (CraftEventFactory.callBlockFadeEvent(worldIn, pos, Blocks.AIR.getDefaultState()).isCancelled()) { + return 6; + } else { + return integer; + } + } else { + return integer; + } + } +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/SnowBlockMixin_1_15.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/SnowBlockMixin_1_15.java new file mode 100644 index 00000000..7a689444 --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/SnowBlockMixin_1_15.java @@ -0,0 +1,25 @@ +package io.izzel.arclight.common.mixin.v1_15.block; + +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.block.SnowBlock; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.server.ServerWorld; +import org.bukkit.craftbukkit.v.event.CraftEventFactory; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import java.util.Random; + +@Mixin(SnowBlock.class) +public class SnowBlockMixin_1_15 { + + @Inject(method = "tick", cancellable = true, at = @At(value = "INVOKE", target = "Lnet/minecraft/block/SnowBlock;spawnDrops(Lnet/minecraft/block/BlockState;Lnet/minecraft/world/World;Lnet/minecraft/util/math/BlockPos;)V")) + public void arclight$blockFade(BlockState state, ServerWorld worldIn, BlockPos pos, Random random, CallbackInfo ci) { + if (CraftEventFactory.callBlockFadeEvent(worldIn, pos, Blocks.AIR.getDefaultState()).isCancelled()) { + ci.cancel(); + } + } +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/SpreadableSnowyDirtBlockMixin_1_15.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/SpreadableSnowyDirtBlockMixin_1_15.java new file mode 100644 index 00000000..08919f26 --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/SpreadableSnowyDirtBlockMixin_1_15.java @@ -0,0 +1,32 @@ +package io.izzel.arclight.common.mixin.v1_15.block; + +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.block.SpreadableSnowyDirtBlock; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import net.minecraft.world.server.ServerWorld; +import org.bukkit.craftbukkit.v.event.CraftEventFactory; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.Redirect; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import java.util.Random; + +@Mixin(SpreadableSnowyDirtBlock.class) +public class SpreadableSnowyDirtBlockMixin_1_15 { + + @Inject(method = "tick", cancellable = true, at = @At(value = "INVOKE", ordinal = 0, target = "Lnet/minecraft/world/server/ServerWorld;setBlockState(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;)Z")) + public void arclight$blockFade(BlockState state, ServerWorld worldIn, BlockPos pos, Random random, CallbackInfo ci) { + if (CraftEventFactory.callBlockFadeEvent(worldIn, pos, Blocks.DIRT.getDefaultState()).isCancelled()) { + ci.cancel(); + } + } + + @Redirect(method = "tick", at = @At(value = "INVOKE", ordinal = 1, target = "Lnet/minecraft/world/server/ServerWorld;setBlockState(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;)Z")) + public boolean arclight$blockSpread(ServerWorld world, BlockPos to, BlockState state, BlockState state1, World worldIn, BlockPos from) { + return CraftEventFactory.handleBlockSpreadEvent(world, from, to, state); + } +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/StemBlockMixin_1_15.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/StemBlockMixin_1_15.java new file mode 100644 index 00000000..60d468d9 --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/StemBlockMixin_1_15.java @@ -0,0 +1,43 @@ +package io.izzel.arclight.common.mixin.v1_15.block; + +import net.minecraft.block.BlockState; +import net.minecraft.block.StemBlock; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.server.ServerWorld; +import org.bukkit.craftbukkit.v.event.CraftEventFactory; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.Redirect; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import java.util.Random; + +@Mixin(StemBlock.class) +public class StemBlockMixin_1_15 { + + private transient boolean arclight$success = false; + + @Redirect(method = "tick", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/server/ServerWorld;setBlockState(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;I)Z")) + public boolean arclight$cropGrow1(ServerWorld world, BlockPos pos, BlockState newState, int flags) { + return CraftEventFactory.handleBlockGrowEvent(world, pos, newState, flags); + } + + @Inject(method = "tick", cancellable = true, at = @At(value = "INVOKE", ordinal = 1, target = "Lnet/minecraft/world/server/ServerWorld;setBlockState(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;)Z")) + public void arclight$returnIfFail(BlockState state, ServerWorld worldIn, BlockPos pos, Random random, CallbackInfo ci) { + if (!arclight$success) { + ci.cancel(); + } + arclight$success = false; + } + + @Redirect(method = "tick", at = @At(value = "INVOKE", ordinal = 0, target = "Lnet/minecraft/world/server/ServerWorld;setBlockState(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;)Z")) + public boolean arclight$cropGrow2(ServerWorld world, BlockPos pos, BlockState state) { + return arclight$success = CraftEventFactory.handleBlockGrowEvent(world, pos, state); + } + + @Redirect(method = "grow", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/server/ServerWorld;setBlockState(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;I)Z")) + public boolean arclight$cropGrow3(ServerWorld world, BlockPos pos, BlockState newState, int flags) { + return CraftEventFactory.handleBlockGrowEvent(world, pos, newState, flags); + } +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/SugarCaneBlockMixin_1_15.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/SugarCaneBlockMixin_1_15.java new file mode 100644 index 00000000..65cb0355 --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/SugarCaneBlockMixin_1_15.java @@ -0,0 +1,19 @@ +package io.izzel.arclight.common.mixin.v1_15.block; + +import net.minecraft.block.BlockState; +import net.minecraft.block.SugarCaneBlock; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.server.ServerWorld; +import org.bukkit.craftbukkit.v.event.CraftEventFactory; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +@Mixin(SugarCaneBlock.class) +public class SugarCaneBlockMixin_1_15 { + + @Redirect(method = "tick", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/server/ServerWorld;setBlockState(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;)Z")) + public boolean arclight$cropGrow(ServerWorld world, BlockPos pos, BlockState state) { + return CraftEventFactory.handleBlockGrowEvent(world, pos, state); + } +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/SweetBerryBushBlockMixin_1_15.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/SweetBerryBushBlockMixin_1_15.java new file mode 100644 index 00000000..358894fd --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/SweetBerryBushBlockMixin_1_15.java @@ -0,0 +1,34 @@ +package io.izzel.arclight.common.mixin.v1_15.block; + +import net.minecraft.block.BlockState; +import net.minecraft.block.SweetBerryBushBlock; +import net.minecraft.entity.Entity; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import net.minecraft.world.server.ServerWorld; +import org.bukkit.craftbukkit.v.block.CraftBlock; +import org.bukkit.craftbukkit.v.event.CraftEventFactory; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.Redirect; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(SweetBerryBushBlock.class) +public class SweetBerryBushBlockMixin_1_15 { + + @Redirect(method = "tick", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/server/ServerWorld;setBlockState(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;I)Z")) + public boolean arclight$cropGrow(ServerWorld world, BlockPos pos, BlockState newState, int flags) { + return CraftEventFactory.handleBlockGrowEvent(world, pos, newState, flags); + } + + @Inject(method = "onEntityCollision", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/Entity;attackEntityFrom(Lnet/minecraft/util/DamageSource;F)Z")) + public void arclight$damagePre(BlockState state, World worldIn, BlockPos pos, Entity entityIn, CallbackInfo ci) { + CraftEventFactory.blockDamage = CraftBlock.at(worldIn, pos); + } + + @Inject(method = "onEntityCollision", at = @At(value = "INVOKE", shift = At.Shift.AFTER, target = "Lnet/minecraft/entity/Entity;attackEntityFrom(Lnet/minecraft/util/DamageSource;F)Z")) + public void arclight$damagePost(BlockState state, World worldIn, BlockPos pos, Entity entityIn, CallbackInfo ci) { + CraftEventFactory.blockDamage = null; + } +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/TurtleEggBlockMixin_1_15.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/TurtleEggBlockMixin_1_15.java new file mode 100644 index 00000000..02e41f35 --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/TurtleEggBlockMixin_1_15.java @@ -0,0 +1,49 @@ +package io.izzel.arclight.common.mixin.v1_15.block; + +import io.izzel.arclight.common.bridge.world.WorldBridge; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.block.TurtleEggBlock; +import net.minecraft.state.IntegerProperty; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.server.ServerWorld; +import org.bukkit.craftbukkit.v.event.CraftEventFactory; +import org.bukkit.event.entity.CreatureSpawnEvent; +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.Redirect; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.LocalCapture; + +import java.util.Random; + +@Mixin(TurtleEggBlock.class) +public class TurtleEggBlockMixin_1_15 { + + @Shadow @Final public static IntegerProperty HATCH; + + @Inject(method = "tick", cancellable = true, locals = LocalCapture.CAPTURE_FAILHARD, + at = @At(value = "INVOKE", ordinal = 0, target = "Lnet/minecraft/world/server/ServerWorld;playSound(Lnet/minecraft/entity/player/PlayerEntity;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/util/SoundEvent;Lnet/minecraft/util/SoundCategory;FF)V")) + private void arclight$hatch(BlockState state, ServerWorld worldIn, BlockPos pos, Random random, CallbackInfo ci, int i) { + if (!CraftEventFactory.handleBlockGrowEvent(worldIn, pos, state.with(HATCH, i + 1), 2)) { + ci.cancel(); + } + } + + @Redirect(method = "tick", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/server/ServerWorld;setBlockState(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;I)Z")) + private boolean arclight$handledHatch(ServerWorld world, BlockPos pos, BlockState newState, int flags) { + return true; + } + + @Inject(method = "tick", cancellable = true, at = @At(value = "INVOKE", ordinal = 1, target = "Lnet/minecraft/world/server/ServerWorld;playSound(Lnet/minecraft/entity/player/PlayerEntity;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/util/SoundEvent;Lnet/minecraft/util/SoundCategory;FF)V")) + private void arclight$born(BlockState state, ServerWorld worldIn, BlockPos pos, Random random, CallbackInfo ci) { + if (CraftEventFactory.callBlockFadeEvent(worldIn, pos, Blocks.AIR.getDefaultState()).isCancelled()) { + ci.cancel(); + } else { + ((WorldBridge) worldIn).bridge$pushAddEntityReason(CreatureSpawnEvent.SpawnReason.EGG); + } + } +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/VineBlockMixin_1_15.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/VineBlockMixin_1_15.java new file mode 100644 index 00000000..ee1dc504 --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/VineBlockMixin_1_15.java @@ -0,0 +1,126 @@ +package io.izzel.arclight.common.mixin.v1_15.block; + +import io.izzel.arclight.common.mixin.core.block.BlockMixin; +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.VineBlock; +import net.minecraft.state.BooleanProperty; +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.IBlockReader; +import net.minecraft.world.server.ServerWorld; +import org.bukkit.craftbukkit.v.event.CraftEventFactory; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; +import org.spongepowered.asm.mixin.Shadow; + +import java.util.Random; + +@Mixin(VineBlock.class) +public abstract class VineBlockMixin_1_15 extends BlockMixin { + + // @formatter:off + @Shadow protected abstract BlockState func_196545_h(BlockState p_196545_1_, IBlockReader p_196545_2_, BlockPos p_196545_3_); + @Shadow protected abstract boolean func_196543_i(BlockState p_196543_1_); + @Shadow public static BooleanProperty getPropertyFor(Direction side) { return null; } + @Shadow protected abstract boolean func_196539_a(IBlockReader p_196539_1_, BlockPos p_196539_2_); + @Shadow public static boolean canAttachTo(IBlockReader p_196542_0_, BlockPos worldIn, Direction neighborPos) { return false; } + @Shadow @Final public static BooleanProperty UP; + @Shadow protected abstract boolean func_196541_a(IBlockReader p_196541_1_, BlockPos p_196541_2_, Direction p_196541_3_); + @Shadow protected abstract boolean func_196540_x(BlockState p_196540_1_); + @Shadow protected abstract BlockState func_196544_a(BlockState p_196544_1_, BlockState p_196544_2_, Random p_196544_3_); + // @formatter:on + + /** + * @author IzzelAliz + * @reason + */ + @SuppressWarnings("ConstantConditions") + @Overwrite + public void tick(BlockState state, ServerWorld worldIn, BlockPos pos, Random random) { + BlockState blockstate = this.func_196545_h(state, worldIn, pos); + if (blockstate != state) { + if (this.func_196543_i(blockstate)) { + worldIn.setBlockState(pos, blockstate, 2); + } else { + Block.spawnDrops(state, worldIn, pos); + worldIn.removeBlock(pos, false); + } + + } else if (worldIn.rand.nextInt(4) == 0 && worldIn.isAreaLoaded(pos, 4)) { // Forge: check area to prevent loading unloaded chunks + Direction direction = Direction.random(random); + BlockPos blockpos = pos.up(); + if (direction.getAxis().isHorizontal() && !state.get(getPropertyFor(direction))) { + if (this.func_196539_a(worldIn, pos)) { + BlockPos blockpos4 = pos.offset(direction); + BlockState blockstate5 = worldIn.getBlockState(blockpos4); + if (blockstate5.isAir()) { + Direction direction3 = direction.rotateY(); + Direction direction4 = direction.rotateYCCW(); + boolean flag = state.get(getPropertyFor(direction3)); + boolean flag1 = state.get(getPropertyFor(direction4)); + BlockPos blockpos2 = blockpos4.offset(direction3); + BlockPos blockpos3 = blockpos4.offset(direction4); + if (flag && canAttachTo(worldIn, blockpos2, direction3)) { + CraftEventFactory.handleBlockSpreadEvent(worldIn, pos, blockpos4, this.getDefaultState().with(getPropertyFor(direction3), true), 2); + } else if (flag1 && canAttachTo(worldIn, blockpos3, direction4)) { + CraftEventFactory.handleBlockSpreadEvent(worldIn, pos, blockpos4, this.getDefaultState().with(getPropertyFor(direction4), true), 2); + } else { + Direction direction1 = direction.getOpposite(); + if (flag && worldIn.isAirBlock(blockpos2) && canAttachTo(worldIn, pos.offset(direction3), direction1)) { + CraftEventFactory.handleBlockSpreadEvent(worldIn, pos, blockpos2, this.getDefaultState().with(getPropertyFor(direction1), true), 2); + } else if (flag1 && worldIn.isAirBlock(blockpos3) && canAttachTo(worldIn, pos.offset(direction4), direction1)) { + CraftEventFactory.handleBlockSpreadEvent(worldIn, pos, blockpos3, this.getDefaultState().with(getPropertyFor(direction1), true), 2); + } else if ((double) worldIn.rand.nextFloat() < 0.05D && canAttachTo(worldIn, blockpos4.up(), Direction.UP)) { + CraftEventFactory.handleBlockSpreadEvent(worldIn, pos, blockpos4, this.getDefaultState().with(UP, true), 2); + } + } + } else if (canAttachTo(worldIn, blockpos4, direction)) { + worldIn.setBlockState(pos, state.with(getPropertyFor(direction), true), 2); + } + + } + } else { + if (direction == Direction.UP && pos.getY() < 255) { + if (this.func_196541_a(worldIn, pos, direction)) { + worldIn.setBlockState(pos, state.with(UP, true), 2); + return; + } + + if (worldIn.isAirBlock(blockpos)) { + if (!this.func_196539_a(worldIn, pos)) { + return; + } + + BlockState blockstate4 = state; + + for (Direction direction2 : Direction.Plane.HORIZONTAL) { + if (random.nextBoolean() || !canAttachTo(worldIn, blockpos.offset(direction2), Direction.UP)) { + blockstate4 = blockstate4.with(getPropertyFor(direction2), false); + } + } + + if (this.func_196540_x(blockstate4)) { + CraftEventFactory.handleBlockSpreadEvent(worldIn, pos, blockpos, blockstate4, 2); + } + + return; + } + } + + if (pos.getY() > 0) { + BlockPos blockpos1 = pos.down(); + BlockState blockstate1 = worldIn.getBlockState(blockpos1); + if (blockstate1.isAir() || blockstate1.getBlock() == (Object) this) { + BlockState blockstate2 = blockstate1.isAir() ? this.getDefaultState() : blockstate1; + BlockState blockstate3 = this.func_196544_a(state, blockstate2, random); + if (blockstate2 != blockstate3 && this.func_196540_x(blockstate3)) { + CraftEventFactory.handleBlockSpreadEvent(worldIn, pos, blockpos1, blockstate3, 2); + } + } + } + } + } + } +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/WitherRoseBlockMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/WitherRoseBlockMixin.java new file mode 100644 index 00000000..0f6bd962 --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/block/WitherRoseBlockMixin.java @@ -0,0 +1,22 @@ +package io.izzel.arclight.common.mixin.v1_15.block; + +import io.izzel.arclight.common.bridge.entity.LivingEntityBridge; +import net.minecraft.block.BlockState; +import net.minecraft.block.WitherRoseBlock; +import net.minecraft.entity.Entity; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import org.bukkit.event.entity.EntityPotionEffectEvent; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(WitherRoseBlock.class) +public class WitherRoseBlockMixin { + + @Inject(method = "onEntityCollision", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/LivingEntity;addPotionEffect(Lnet/minecraft/potion/EffectInstance;)Z")) + private void arclight$cause(BlockState state, World worldIn, BlockPos pos, Entity entityIn, CallbackInfo ci) { + ((LivingEntityBridge) entityIn).bridge$pushEffectCause(EntityPotionEffectEvent.Cause.WITHER_ROSE); + } +} diff --git a/arclight-common/src/main/resources/META-INF/accesstransformer.cfg b/arclight-common/src/main/resources/META-INF/accesstransformer.cfg index cdfe88eb..d482ddf3 100644 --- a/arclight-common/src/main/resources/META-INF/accesstransformer.cfg +++ b/arclight-common/src/main/resources/META-INF/accesstransformer.cfg @@ -22,6 +22,8 @@ public net.minecraft.item.crafting.Ingredient (Ljava/util/stream/Stream;)V public net.minecraft.entity.Entity field_70165_t #posX public net.minecraft.entity.Entity field_70163_u #posY public net.minecraft.entity.Entity field_70161_v #posZ +public net.minecraft.block.ComposterBlock func_220294_d(Lnet/minecraft/block/BlockState;Lnet/minecraft/world/IWorld;Lnet/minecraft/util/math/BlockPos;)V #clear +public net.minecraft.tileentity.TileEntity field_145850_b #world # Bukkit public net.minecraft.entity.player.PlayerEntity func_190531_bD()I public net.minecraft.entity.item.ItemFrameEntity func_174859_a(Lnet/minecraft/util/Direction;)V diff --git a/arclight-common/src/main/resources/mixins.arclight.core.1_15.json b/arclight-common/src/main/resources/mixins.arclight.core.1_15.json index 64e6e064..a434f51b 100644 --- a/arclight-common/src/main/resources/mixins.arclight.core.1_15.json +++ b/arclight-common/src/main/resources/mixins.arclight.core.1_15.json @@ -10,6 +10,42 @@ "maxShiftBy": 2 }, "mixins": [ + "block.AbstractButtonBlockMixin_1_15", + "block.CactusBlockMixin_1_15", + "block.CakeBlockMixin_1_15", + "block.CauldronBlockMixin_1_15", + "block.ChestBlock2Mixin_1_15", + "block.ChorusFlowerBlockMixin_1_15", + "block.CocoaBlockMixin_1_15", + "block.CoralBlockMixin_1_15", + "block.CoralFinBlockMixin_1_15", + "block.CoralPlantBlockMixin_1_15", + "block.CoralWallFanBlockMixin_1_15", + "block.CropsBlockMixin_1_15", + "block.FarmlandBlockMixin_1_15", + "block.FireBlockMixin_1_15", + "block.GrassBlockMixin_1_15", + "block.KelpTopBlockMixin_1_15", + "block.LeavesBlockMixin_1_15", + "block.LeverBlockMixin_1_15", + "block.MushroomBlockMixin_1_15", + "block.NetherPortalBlockMixin_1_15", + "block.NetherWartBlockMixin_1_15", + "block.ObserverBlockMixin_1_15", + "block.PistonBlockMixin_1_15", + "block.RedstoneDiodeBlockMixin_1_15", + "block.RedstoneLampBlockMixin_1_15", + "block.RedstoneOreBlockMixin_1_15", + "block.ScaffoldingBlockMixin_1_15", + "block.SnowBlockMixin_1_15", + "block.SpreadableSnowyDirtBlockMixin_1_15", + "block.StemBlockMixin_1_15", + "block.SugarCaneBlockMixin_1_15", + "block.SweetBerryBushBlockMixin_1_15", + "block.TurtleEggBlockMixin_1_15", + "block.VineBlockMixin_1_15", + "block.WitherRoseBlockMixin", + "io.izzel.arclight.impl.mixin.v1_14.block.FarmlandBlockMixin_1_14", "world.biome.BiomeContainerMixin" ] } \ No newline at end of file diff --git a/arclight-common/src/main/resources/mixins.arclight.core.json b/arclight-common/src/main/resources/mixins.arclight.core.json index 7fe0baa2..63af36ee 100644 --- a/arclight-common/src/main/resources/mixins.arclight.core.json +++ b/arclight-common/src/main/resources/mixins.arclight.core.json @@ -21,13 +21,9 @@ "block.BlockStateMixin", "block.BushBlockMixin", "block.CactusBlockMixin", - "block.CakeBlockMixin", "block.CampfireBlockMixin", "block.CarvedPumpkinBlockMixin", - "block.CauldronBlockMixin", "block.ChestBlock2Mixin", - "block.ChorusFlowerBlockMixin", - "block.CocoaBlockMixin", "block.CommandBlockBlockMixin", "block.ComparatorBlockMixin", "block.ComposterBlock_EmptyInventoryMixin", @@ -35,10 +31,6 @@ "block.ComposterBlock_PartialInventoryMixin", "block.ComposterBlockMixin", "block.ConcretePowderBlockMixin", - "block.CoralBlockMixin", - "block.CoralFinBlockMixin", - "block.CoralPlantBlockMixin", - "block.CoralWallFanBlockMixin", "block.CropsBlockMixin", "block.DaylightDetectorBlockMixin", "block.DetectorRailBlockMixin", @@ -50,27 +42,21 @@ "block.EndPortalBlockMixin", "block.FallingBlockMixin", "block.FarmlandBlockMixin", + "block.FenceGateBlockMixin", "block.FireBlockMixin", "block.FlowingFluidBlockMixin", - "block.GrassBlockMixin", "block.IceBlockMixin", - "block.KelpTopBlockMixin", - "block.LeavesBlockMixin", - "block.LeverBlockMixin", + "block.JukeBoxBlockMixin", + "block.LecternBlockMixin", "block.LilyPadBlockMixin", "block.MagmaBlockMixin", - "block.MushroomBlockMixin", "block.NetherPortalBlock_SizeMixin", "block.NetherPortalBlockMixin", - "block.NetherWartBlockMixin", "block.NoteBlockMixin", - "block.ObserverBlockMixin", "block.PistonBlockMixin", "block.PoweredRailBlockMixin", "block.PressurePlateBlockMixin", - "block.RedstoneDiodeBlockMixin", "block.RedstoneLampBlockMixin", - "block.RedstoneOreBlockMixin", "block.RedstoneTorchBlockMixin", "block.RedstoneWireBlockMixin", "block.SaplingBlockMixin", @@ -78,9 +64,7 @@ "block.SilverfishBlockMixin", "block.SnowBlockMixin", "block.SpongeBlockMixin", - "block.SpreadableSnowyDirtBlockMixin", "block.StemBlockMixin", - "block.SugarCaneBlockMixin", "block.SweetBerryBushBlockMixin", "block.TNTBlockMixin", "block.TrapDoorBlockMixin", diff --git a/arclight-forge-1.14/build.gradle b/arclight-forge-1.14/build.gradle index 18b94e59..9e832401 100644 --- a/arclight-forge-1.14/build.gradle +++ b/arclight-forge-1.14/build.gradle @@ -68,7 +68,9 @@ def embedLibs = ['org.spongepowered:mixin:0.8', 'org.ow2.asm:asm-util:6.2', dependencies { minecraft "net.minecraftforge:forge:$minecraftVersion-$forgeVersion" compile group: 'org.jetbrains', name: 'annotations', version: '19.0.0' - compile project(':arclight-common') + compile(project(':arclight-common')) { + exclude module: 'forge' + } embed project(':forge-installer') for (def lib : embedLibs) { arclight lib @@ -113,7 +115,7 @@ remapSpigotJar { } mixin { - //add sourceSets.main, 'mixins.arclight.refmap.json' + add sourceSets.main, 'mixins.arclight.impl.refmap.json' } compileJava { diff --git a/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/AbstractButtonBlockMixin_1_14.java b/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/AbstractButtonBlockMixin_1_14.java new file mode 100644 index 00000000..7f34cc87 --- /dev/null +++ b/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/AbstractButtonBlockMixin_1_14.java @@ -0,0 +1,32 @@ +package io.izzel.arclight.impl.mixin.v1_14.block; + +import net.minecraft.block.AbstractButtonBlock; +import net.minecraft.block.BlockState; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import org.bukkit.Bukkit; +import org.bukkit.block.Block; +import org.bukkit.craftbukkit.v.block.CraftBlock; +import org.bukkit.event.block.BlockRedstoneEvent; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import java.util.Random; + +@Mixin(AbstractButtonBlock.class) +public class AbstractButtonBlockMixin_1_14 { + + @Inject(method = "tick", cancellable = true, at = @At(value = "INVOKE", target = "Lnet/minecraft/world/World;setBlockState(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;I)Z")) + private void arclight$blockRedstone2(BlockState state, World worldIn, BlockPos pos, Random random, CallbackInfo ci) { + Block block = CraftBlock.at(worldIn, pos); + + BlockRedstoneEvent event = new BlockRedstoneEvent(block, 15, 0); + Bukkit.getPluginManager().callEvent(event); + + if (event.getNewCurrent() > 0) { + ci.cancel(); + } + } +} diff --git a/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/CactusBlockMixin_1_14.java b/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/CactusBlockMixin_1_14.java new file mode 100644 index 00000000..84ad4bf2 --- /dev/null +++ b/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/CactusBlockMixin_1_14.java @@ -0,0 +1,19 @@ +package io.izzel.arclight.impl.mixin.v1_14.block; + +import net.minecraft.block.BlockState; +import net.minecraft.block.CactusBlock; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import org.bukkit.craftbukkit.v.event.CraftEventFactory; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +@Mixin(CactusBlock.class) +public class CactusBlockMixin_1_14 { + + @Redirect(method = "tick", at = @At(value = "INVOKE", ordinal = 0, target = "Lnet/minecraft/world/World;setBlockState(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;)Z")) + public boolean arclight$blockGrow_1_14(World world, BlockPos pos, BlockState state) { + return CraftEventFactory.handleBlockGrowEvent(world, pos, state); + } +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/CakeBlockMixin.java b/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/CakeBlockMixin_1_14.java similarity index 80% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/CakeBlockMixin.java rename to arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/CakeBlockMixin_1_14.java index fd1334a1..5afdb92c 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/CakeBlockMixin.java +++ b/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/CakeBlockMixin_1_14.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.block; +package io.izzel.arclight.impl.mixin.v1_14.block; import io.izzel.arclight.common.bridge.entity.player.ServerPlayerEntityBridge; import net.minecraft.block.BlockState; @@ -14,10 +14,10 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Redirect; @Mixin(CakeBlock.class) -public class CakeBlockMixin { +public class CakeBlockMixin_1_14 { @Redirect(method = "eatCake", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/FoodStats;addStats(IF)V")) - public void arclight$eatCake(FoodStats foodStats, int foodLevelIn, float foodSaturationModifier, IWorld worldIn, BlockPos pos, BlockState state, PlayerEntity player) { + private void arclight$eatCake(FoodStats foodStats, int foodLevelIn, float foodSaturationModifier, IWorld worldIn, BlockPos pos, BlockState state, PlayerEntity player) { int old = foodStats.getFoodLevel(); FoodLevelChangeEvent event = CraftEventFactory.callFoodLevelChangeEvent(player, old + foodLevelIn); if (!event.isCancelled()) { diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/CauldronBlockMixin.java b/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/CauldronBlockMixin_1_14.java similarity index 98% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/CauldronBlockMixin.java rename to arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/CauldronBlockMixin_1_14.java index 4369a19b..f43dfe4d 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/CauldronBlockMixin.java +++ b/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/CauldronBlockMixin_1_14.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.block; +package io.izzel.arclight.impl.mixin.v1_14.block; import io.izzel.arclight.common.bridge.entity.EntityBridge; import net.minecraft.block.BlockState; @@ -25,7 +25,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(CauldronBlock.class) -public class CauldronBlockMixin { +public class CauldronBlockMixin_1_14 { @Inject(method = "onEntityCollision", cancellable = true, at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/Entity;extinguish()V")) public void arclight$extinguish(BlockState state, World worldIn, BlockPos pos, Entity entityIn, CallbackInfo ci) { diff --git a/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/ChestBlock2Mixin_1_14.java b/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/ChestBlock2Mixin_1_14.java new file mode 100644 index 00000000..0d4de879 --- /dev/null +++ b/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/ChestBlock2Mixin_1_14.java @@ -0,0 +1,22 @@ +package io.izzel.arclight.impl.mixin.v1_14.block; + +import io.izzel.arclight.common.mod.util.ChestBlockDoubleInventoryHacks; +import net.minecraft.inventory.DoubleSidedInventory; +import net.minecraft.inventory.container.INamedContainerProvider; +import net.minecraft.tileentity.ChestTileEntity; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; + +@Mixin(targets = "net/minecraft/block/ChestBlock$2") +public class ChestBlock2Mixin_1_14 { + + /** + * @author IzzelAliz + * @reason + */ + @Overwrite + public INamedContainerProvider forDouble(ChestTileEntity p_212855_1_, ChestTileEntity p_212855_2_) { + final DoubleSidedInventory iinventory = new DoubleSidedInventory(p_212855_1_, p_212855_2_); + return ChestBlockDoubleInventoryHacks.create(p_212855_1_, p_212855_2_, iinventory); + } +} diff --git a/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/ChorusFlowerBlockMixin_1_14.java b/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/ChorusFlowerBlockMixin_1_14.java new file mode 100644 index 00000000..dc1cec0a --- /dev/null +++ b/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/ChorusFlowerBlockMixin_1_14.java @@ -0,0 +1,120 @@ +package io.izzel.arclight.impl.mixin.v1_14.block; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.block.ChorusFlowerBlock; +import net.minecraft.block.ChorusPlantBlock; +import net.minecraft.state.IntegerProperty; +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.IWorldReader; +import net.minecraft.world.World; +import net.minecraftforge.common.ForgeHooks; +import org.bukkit.craftbukkit.v.event.CraftEventFactory; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; +import org.spongepowered.asm.mixin.Shadow; + +import javax.annotation.Nullable; +import java.util.Random; + +@Mixin(ChorusFlowerBlock.class) +public abstract class ChorusFlowerBlockMixin_1_14 extends Block { + + // @formatter:off + @Shadow @Final public static IntegerProperty AGE; + @Shadow @Final private ChorusPlantBlock field_196405_b; + @Shadow private static boolean areAllNeighborsEmpty(IWorldReader worldIn, BlockPos pos, @Nullable Direction excludingSide) { return false; } + @Shadow protected abstract void placeGrownFlower(World worldIn, BlockPos pos, int age); + @Shadow protected abstract void placeDeadFlower(World worldIn, BlockPos pos); + // @formatter:on + + public ChorusFlowerBlockMixin_1_14(Properties properties) { + super(properties); + } + + /** + * @author IzzelAliz + * @reason + */ + @Overwrite + public void tick(BlockState state, World worldIn, BlockPos pos, Random random) { + if (!state.isValidPosition(worldIn, pos)) { + worldIn.destroyBlock(pos, true); + } else { + BlockPos blockpos = pos.up(); + if (worldIn.isAirBlock(blockpos) && blockpos.getY() < worldIn.getDimension().getHeight()) { + int i = state.get(AGE); + if (i < 5 && ForgeHooks.onCropsGrowPre(worldIn, blockpos, state, true)) { + boolean flag = false; + boolean flag1 = false; + BlockState blockstate = worldIn.getBlockState(pos.down()); + Block block = blockstate.getBlock(); + if (block == Blocks.END_STONE) { + flag = true; + } else if (block == this.field_196405_b) { + int j = 1; + + for (int k = 0; k < 4; ++k) { + Block block1 = worldIn.getBlockState(pos.down(j + 1)).getBlock(); + if (block1 != this.field_196405_b) { + if (block1 == Blocks.END_STONE) { + flag1 = true; + } + break; + } + + ++j; + } + + if (j < 2 || j <= random.nextInt(flag1 ? 5 : 4)) { + flag = true; + } + } else if (blockstate.isAir(worldIn, pos.down())) { + flag = true; + } + + if (flag && areAllNeighborsEmpty(worldIn, blockpos, (Direction) null) && worldIn.isAirBlock(pos.up(2))) { + if (CraftEventFactory.handleBlockSpreadEvent(worldIn, pos, pos.up(), state.with(ChorusFlowerBlock.AGE, i), 2)) { + worldIn.setBlockState(pos, this.field_196405_b.makeConnections(worldIn, pos), 2); + this.placeGrownFlower(worldIn, blockpos, i); + } + } else if (i < 4) { + int l = random.nextInt(4); + if (flag1) { + ++l; + } + + boolean flag2 = false; + + for (int i1 = 0; i1 < l; ++i1) { + Direction direction = Direction.Plane.HORIZONTAL.random(random); + BlockPos blockpos1 = pos.offset(direction); + if (worldIn.isAirBlock(blockpos1) && worldIn.isAirBlock(blockpos1.down()) && areAllNeighborsEmpty(worldIn, blockpos1, direction.getOpposite())) { + if (CraftEventFactory.handleBlockSpreadEvent(worldIn, pos, blockpos1, state.with(ChorusFlowerBlock.AGE, i + 1), 2)) { + this.placeGrownFlower(worldIn, blockpos1, i + 1); + flag2 = true; + } + } + } + + if (flag2) { + worldIn.setBlockState(pos, this.field_196405_b.makeConnections(worldIn, pos), 2); + } else { + if (CraftEventFactory.handleBlockGrowEvent(worldIn, pos, this.getDefaultState().with(ChorusFlowerBlock.AGE, 5), 2)) { + this.placeDeadFlower(worldIn, pos); + } + } + } else { + if (CraftEventFactory.handleBlockGrowEvent(worldIn, pos, this.getDefaultState().with(ChorusFlowerBlock.AGE, 5), 2)) { + this.placeDeadFlower(worldIn, pos); + } + } + ForgeHooks.onCropsGrowPost(worldIn, pos, state); + } + } + } + } +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/CocoaBlockMixin.java b/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/CocoaBlockMixin_1_14.java similarity index 89% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/CocoaBlockMixin.java rename to arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/CocoaBlockMixin_1_14.java index 029a220f..949ae597 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/CocoaBlockMixin.java +++ b/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/CocoaBlockMixin_1_14.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.block; +package io.izzel.arclight.impl.mixin.v1_14.block; import net.minecraft.block.BlockState; import net.minecraft.block.CocoaBlock; @@ -10,7 +10,7 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Redirect; @Mixin(CocoaBlock.class) -public class CocoaBlockMixin { +public class CocoaBlockMixin_1_14 { @Redirect(method = "tick", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/World;setBlockState(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;I)Z")) public boolean arclight$blockGrow(World world, BlockPos pos, BlockState newState, int flags) { diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/CoralBlockMixin.java b/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/CoralBlockMixin_1_14.java similarity index 93% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/CoralBlockMixin.java rename to arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/CoralBlockMixin_1_14.java index 5054aa0e..d9673106 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/CoralBlockMixin.java +++ b/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/CoralBlockMixin_1_14.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.block; +package io.izzel.arclight.impl.mixin.v1_14.block; import net.minecraft.block.Block; import net.minecraft.block.BlockState; @@ -16,7 +16,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import java.util.Random; @Mixin(CoralBlock.class) -public class CoralBlockMixin { +public class CoralBlockMixin_1_14 { // @formatter:off @Shadow @Final private Block deadBlock; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/CoralFinBlockMixin.java b/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/CoralFinBlockMixin_1_14.java similarity index 93% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/CoralFinBlockMixin.java rename to arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/CoralFinBlockMixin_1_14.java index 3ca5ac81..d03592e5 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/CoralFinBlockMixin.java +++ b/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/CoralFinBlockMixin_1_14.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.block; +package io.izzel.arclight.impl.mixin.v1_14.block; import net.minecraft.block.AbstractCoralPlantBlock; import net.minecraft.block.Block; @@ -17,7 +17,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import java.util.Random; @Mixin(CoralFinBlock.class) -public class CoralFinBlockMixin { +public class CoralFinBlockMixin_1_14 { // @formatter:off @Shadow @Final private Block deadBlock; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/CoralPlantBlockMixin.java b/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/CoralPlantBlockMixin_1_14.java similarity index 93% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/CoralPlantBlockMixin.java rename to arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/CoralPlantBlockMixin_1_14.java index acd69d69..71c2f3ef 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/CoralPlantBlockMixin.java +++ b/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/CoralPlantBlockMixin_1_14.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.block; +package io.izzel.arclight.impl.mixin.v1_14.block; import net.minecraft.block.AbstractCoralPlantBlock; import net.minecraft.block.Block; @@ -17,7 +17,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import java.util.Random; @Mixin(CoralPlantBlock.class) -public class CoralPlantBlockMixin { +public class CoralPlantBlockMixin_1_14 { // @formatter:off @Shadow @Final private Block deadBlock; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/CoralWallFanBlockMixin.java b/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/CoralWallFanBlockMixin_1_14.java similarity index 93% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/CoralWallFanBlockMixin.java rename to arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/CoralWallFanBlockMixin_1_14.java index de3a7758..701b64c3 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/CoralWallFanBlockMixin.java +++ b/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/CoralWallFanBlockMixin_1_14.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.block; +package io.izzel.arclight.impl.mixin.v1_14.block; import net.minecraft.block.AbstractCoralPlantBlock; import net.minecraft.block.Block; @@ -18,7 +18,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import java.util.Random; @Mixin(CoralWallFanBlock.class) -public class CoralWallFanBlockMixin { +public class CoralWallFanBlockMixin_1_14 { // @formatter:off @Shadow @Final private Block deadBlock; diff --git a/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/CropsBlockMixin_1_14.java b/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/CropsBlockMixin_1_14.java new file mode 100644 index 00000000..37ea250a --- /dev/null +++ b/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/CropsBlockMixin_1_14.java @@ -0,0 +1,19 @@ +package io.izzel.arclight.impl.mixin.v1_14.block; + +import net.minecraft.block.BlockState; +import net.minecraft.block.CropsBlock; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import org.bukkit.craftbukkit.v.event.CraftEventFactory; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +@Mixin(CropsBlock.class) +public class CropsBlockMixin_1_14 { + + @Redirect(method = "tick", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/World;setBlockState(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;I)Z")) + public boolean arclight$blockGrowTick(World world, BlockPos pos, BlockState newState, int flags) { + return CraftEventFactory.handleBlockGrowEvent(world, pos, newState, flags); + } +} diff --git a/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/FarmlandBlockMixin_1_14.java b/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/FarmlandBlockMixin_1_14.java new file mode 100644 index 00000000..624d659e --- /dev/null +++ b/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/FarmlandBlockMixin_1_14.java @@ -0,0 +1,19 @@ +package io.izzel.arclight.impl.mixin.v1_14.block; + +import net.minecraft.block.BlockState; +import net.minecraft.block.FarmlandBlock; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import org.bukkit.craftbukkit.v.event.CraftEventFactory; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +@Mixin(FarmlandBlock.class) +public class FarmlandBlockMixin_1_14 { + + @Redirect(method = "tick", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/World;setBlockState(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;I)Z")) + public boolean arclight$moistureChange(World world, BlockPos pos, BlockState newState, int flags) { + return CraftEventFactory.handleMoistureChangeEvent(world, pos, newState, flags); + } +} diff --git a/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/FireBlockMixin_1_14.java b/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/FireBlockMixin_1_14.java new file mode 100644 index 00000000..f4c4fec8 --- /dev/null +++ b/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/FireBlockMixin_1_14.java @@ -0,0 +1,34 @@ +package io.izzel.arclight.impl.mixin.v1_14.block; + +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.block.FireBlock; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import org.bukkit.craftbukkit.v.event.CraftEventFactory; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +@Mixin(FireBlock.class) +public class FireBlockMixin_1_14 { + + @Redirect(method = "tick", at = @At(value = "INVOKE", ordinal = 1, target = "Lnet/minecraft/world/World;setBlockState(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;I)Z")) + public boolean arclight$fireSpread(World world, BlockPos mutablePos, BlockState newState, int flags, + BlockState state, World worldIn, BlockPos pos) { + if (world.getBlockState(mutablePos).getBlock() != Blocks.FIRE) { + if (!CraftEventFactory.callBlockIgniteEvent(world, mutablePos, pos).isCancelled()) { + return CraftEventFactory.handleBlockSpreadEvent(world, pos, mutablePos, newState, flags); + } + } + return false; + } + + @Redirect(method = "tick", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/World;removeBlock(Lnet/minecraft/util/math/BlockPos;Z)Z")) + public boolean arclight$extinguish1(World world, BlockPos pos, boolean isMoving) { + if (!CraftEventFactory.callBlockFadeEvent(world, pos, Blocks.AIR.getDefaultState()).isCancelled()) { + world.removeBlock(pos, isMoving); + } + return false; + } +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/GrassBlockMixin.java b/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/GrassBlockMixin_1_14.java similarity index 89% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/GrassBlockMixin.java rename to arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/GrassBlockMixin_1_14.java index 9070f9c3..27596890 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/GrassBlockMixin.java +++ b/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/GrassBlockMixin_1_14.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.block; +package io.izzel.arclight.impl.mixin.v1_14.block; import net.minecraft.block.BlockState; import net.minecraft.block.GrassBlock; @@ -10,7 +10,7 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Redirect; @Mixin(GrassBlock.class) -public class GrassBlockMixin { +public class GrassBlockMixin_1_14 { @Redirect(method = "grow", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/World;setBlockState(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;I)Z")) public boolean arclight$blockGrow(World world, BlockPos pos, BlockState newState, int flags) { diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/KelpTopBlockMixin.java b/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/KelpTopBlockMixin_1_14.java similarity index 89% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/KelpTopBlockMixin.java rename to arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/KelpTopBlockMixin_1_14.java index 51b9d165..0c87cc1c 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/KelpTopBlockMixin.java +++ b/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/KelpTopBlockMixin_1_14.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.block; +package io.izzel.arclight.impl.mixin.v1_14.block; import net.minecraft.block.BlockState; import net.minecraft.block.KelpTopBlock; @@ -10,7 +10,7 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Redirect; @Mixin(KelpTopBlock.class) -public class KelpTopBlockMixin { +public class KelpTopBlockMixin_1_14 { @Redirect(method = "tick", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/World;setBlockState(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;)Z")) public boolean arclight$blockGrow(World world, BlockPos pos, BlockState state) { diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/LeavesBlockMixin.java b/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/LeavesBlockMixin_1_14.java similarity index 93% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/LeavesBlockMixin.java rename to arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/LeavesBlockMixin_1_14.java index cc042da4..2e0e0b61 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/LeavesBlockMixin.java +++ b/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/LeavesBlockMixin_1_14.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.block; +package io.izzel.arclight.impl.mixin.v1_14.block; import net.minecraft.block.BlockState; import net.minecraft.block.LeavesBlock; @@ -15,7 +15,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import java.util.Random; @Mixin(LeavesBlock.class) -public class LeavesBlockMixin { +public class LeavesBlockMixin_1_14 { @Inject(method = "randomTick", cancellable = true, at = @At(value = "INVOKE", target = "Lnet/minecraft/block/LeavesBlock;spawnDrops(Lnet/minecraft/block/BlockState;Lnet/minecraft/world/World;Lnet/minecraft/util/math/BlockPos;)V")) public void arclight$leavesDecay(BlockState state, World worldIn, BlockPos pos, Random random, CallbackInfo ci) { diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/LeverBlockMixin.java b/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/LeverBlockMixin_1_14.java similarity index 95% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/LeverBlockMixin.java rename to arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/LeverBlockMixin_1_14.java index 8621380e..645bac36 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/LeverBlockMixin.java +++ b/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/LeverBlockMixin_1_14.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.block; +package io.izzel.arclight.impl.mixin.v1_14.block; import net.minecraft.block.BlockState; import net.minecraft.block.LeverBlock; @@ -18,7 +18,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import org.spongepowered.asm.mixin.injection.callback.LocalCapture; @Mixin(LeverBlock.class) -public class LeverBlockMixin { +public class LeverBlockMixin_1_14 { @Inject(method = "onBlockActivated", cancellable = true, locals = LocalCapture.CAPTURE_FAILHARD , at = @At(value = "INVOKE", target = "Lnet/minecraft/world/World;setBlockState(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;I)Z")) diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/MushroomBlockMixin.java b/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/MushroomBlockMixin_1_14.java similarity index 90% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/MushroomBlockMixin.java rename to arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/MushroomBlockMixin_1_14.java index 21967757..c99badcf 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/MushroomBlockMixin.java +++ b/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/MushroomBlockMixin_1_14.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.block; +package io.izzel.arclight.impl.mixin.v1_14.block; import net.minecraft.block.BlockState; import net.minecraft.block.MushroomBlock; @@ -10,7 +10,7 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Redirect; @Mixin(MushroomBlock.class) -public class MushroomBlockMixin { +public class MushroomBlockMixin_1_14 { @Redirect(method = "tick", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/World;setBlockState(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;I)Z")) public boolean arclight$blockSpread(World world, BlockPos toPos, BlockState newState, int flags, BlockState state, World worldIn, BlockPos fromPos) { diff --git a/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/NetherPortalBlockMixin_1_14.java b/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/NetherPortalBlockMixin_1_14.java new file mode 100644 index 00000000..9ce04974 --- /dev/null +++ b/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/NetherPortalBlockMixin_1_14.java @@ -0,0 +1,25 @@ +package io.izzel.arclight.impl.mixin.v1_14.block; + +import io.izzel.arclight.common.bridge.entity.EntityTypeBridge; +import net.minecraft.block.NetherPortalBlock; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityType; +import net.minecraft.entity.SpawnReason; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.world.World; +import org.bukkit.event.entity.CreatureSpawnEvent; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +@Mixin(NetherPortalBlock.class) +public class NetherPortalBlockMixin_1_14 { + + @Redirect(method = "tick", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/EntityType;spawn(Lnet/minecraft/world/World;Lnet/minecraft/nbt/CompoundNBT;Lnet/minecraft/util/text/ITextComponent;Lnet/minecraft/entity/player/PlayerEntity;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/entity/SpawnReason;ZZ)Lnet/minecraft/entity/Entity;")) + public Entity arclight$spawn(EntityType entityType, World worldIn, CompoundNBT compound, ITextComponent customName, PlayerEntity playerIn, BlockPos pos, SpawnReason reason, boolean flag, boolean flag1) { + return ((EntityTypeBridge) entityType).bridge$spawnCreature(worldIn, compound, customName, playerIn, pos, reason, flag, flag1, CreatureSpawnEvent.SpawnReason.NETHER_PORTAL); + } +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/NetherWartBlockMixin.java b/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/NetherWartBlockMixin_1_14.java similarity index 89% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/NetherWartBlockMixin.java rename to arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/NetherWartBlockMixin_1_14.java index e4014581..abc70325 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/NetherWartBlockMixin.java +++ b/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/NetherWartBlockMixin_1_14.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.block; +package io.izzel.arclight.impl.mixin.v1_14.block; import net.minecraft.block.BlockState; import net.minecraft.block.NetherWartBlock; @@ -10,7 +10,7 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Redirect; @Mixin(NetherWartBlock.class) -public class NetherWartBlockMixin { +public class NetherWartBlockMixin_1_14 { @Redirect(method = "tick", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/World;setBlockState(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;I)Z")) public boolean arclight$cropGrow(World world, BlockPos pos, BlockState newState, int flags) { diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/ObserverBlockMixin.java b/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/ObserverBlockMixin_1_14.java similarity index 94% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/ObserverBlockMixin.java rename to arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/ObserverBlockMixin_1_14.java index b3207d0d..93980c10 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/ObserverBlockMixin.java +++ b/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/ObserverBlockMixin_1_14.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.block; +package io.izzel.arclight.impl.mixin.v1_14.block; import net.minecraft.block.BlockState; import net.minecraft.block.ObserverBlock; @@ -13,7 +13,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import java.util.Random; @Mixin(ObserverBlock.class) -public class ObserverBlockMixin { +public class ObserverBlockMixin_1_14 { @Inject(method = "tick", cancellable = true, at = @At(value = "INVOKE", ordinal = 0, target = "Lnet/minecraft/world/World;setBlockState(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;I)Z")) public void arclight$redstoneChange1(BlockState state, World worldIn, BlockPos pos, Random random, CallbackInfo ci) { diff --git a/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/PistonBlockMixin_1_14.java b/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/PistonBlockMixin_1_14.java new file mode 100644 index 00000000..51609c44 --- /dev/null +++ b/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/PistonBlockMixin_1_14.java @@ -0,0 +1,76 @@ +package io.izzel.arclight.impl.mixin.v1_14.block; + +import net.minecraft.block.Blocks; +import net.minecraft.block.PistonBlock; +import net.minecraft.block.state.PistonBlockStructureHelper; +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import org.bukkit.Bukkit; +import org.bukkit.block.Block; +import org.bukkit.craftbukkit.v.block.CraftBlock; +import org.bukkit.event.block.BlockPistonEvent; +import org.bukkit.event.block.BlockPistonExtendEvent; +import org.bukkit.event.block.BlockPistonRetractEvent; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import org.spongepowered.asm.mixin.injection.callback.LocalCapture; + +import java.util.AbstractList; +import java.util.List; + +@Mixin(PistonBlock.class) +public class PistonBlockMixin_1_14 { + + @Inject(method = "doMove", cancellable = true, locals = LocalCapture.CAPTURE_FAILHARD, + at = @At(value = "INVOKE_ASSIGN", remap = false, target = "Lcom/google/common/collect/Sets;newHashSet(Ljava/lang/Iterable;)Ljava/util/HashSet;")) + public void arclight$pistonAction(World worldIn, BlockPos pos, Direction directionIn, boolean extending, CallbackInfoReturnable cir, + BlockPos blockPos, PistonBlockStructureHelper helper) { + final Block craftBlock = CraftBlock.at(worldIn, pos); + + final List moved = helper.getBlocksToMove(); + final List broken = helper.getBlocksToDestroy(); + + class BlockList extends AbstractList { + + @Override + public int size() { + return moved.size() + broken.size(); + } + + @Override + public org.bukkit.block.Block get(int index) { + if (index >= size() || index < 0) { + throw new ArrayIndexOutOfBoundsException(index); + } + BlockPos pos = index < moved.size() ? moved.get(index) : broken.get(index - moved.size()); + return craftBlock.getWorld().getBlockAt(pos.getX(), pos.getY(), pos.getZ()); + } + } + + List blocks = new BlockList(); + + Direction direction = extending ? directionIn : directionIn.getOpposite(); + BlockPistonEvent event; + if (extending) { + event = new BlockPistonExtendEvent(craftBlock, blocks, CraftBlock.notchToBlockFace(direction)); + } else { + event = new BlockPistonRetractEvent(craftBlock, blocks, CraftBlock.notchToBlockFace(direction)); + } + Bukkit.getPluginManager().callEvent(event); + + if (event.isCancelled()) { + for (BlockPos b : broken) { + worldIn.notifyBlockUpdate(b, Blocks.AIR.getDefaultState(), worldIn.getBlockState(b), 3); + } + for (BlockPos b : moved) { + worldIn.notifyBlockUpdate(b, Blocks.AIR.getDefaultState(), worldIn.getBlockState(b), 3); + b = b.offset(direction); + worldIn.notifyBlockUpdate(b, Blocks.AIR.getDefaultState(), worldIn.getBlockState(b), 3); + } + cir.setReturnValue(false); + } + } +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/RedstoneDiodeBlockMixin.java b/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/RedstoneDiodeBlockMixin_1_14.java similarity index 93% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/RedstoneDiodeBlockMixin.java rename to arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/RedstoneDiodeBlockMixin_1_14.java index 446ecbc1..fe28a2d3 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/RedstoneDiodeBlockMixin.java +++ b/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/RedstoneDiodeBlockMixin_1_14.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.block; +package io.izzel.arclight.impl.mixin.v1_14.block; import net.minecraft.block.BlockState; import net.minecraft.block.RedstoneDiodeBlock; @@ -13,7 +13,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import java.util.Random; @Mixin(RedstoneDiodeBlock.class) -public class RedstoneDiodeBlockMixin { +public class RedstoneDiodeBlockMixin_1_14 { @Inject(method = "tick", cancellable = true, at = @At(value = "INVOKE", ordinal = 0, target = "Lnet/minecraft/world/World;setBlockState(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;I)Z")) public void arclight$turnOff(BlockState state, World worldIn, BlockPos pos, Random random, CallbackInfo ci) { diff --git a/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/RedstoneLampBlockMixin_1_14.java b/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/RedstoneLampBlockMixin_1_14.java new file mode 100644 index 00000000..68eff1b7 --- /dev/null +++ b/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/RedstoneLampBlockMixin_1_14.java @@ -0,0 +1,24 @@ +package io.izzel.arclight.impl.mixin.v1_14.block; + +import net.minecraft.block.BlockState; +import net.minecraft.block.RedstoneLampBlock; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import org.bukkit.craftbukkit.v.event.CraftEventFactory; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import java.util.Random; + +@Mixin(RedstoneLampBlock.class) +public class RedstoneLampBlockMixin_1_14 { + + @Inject(method = "tick", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/World;setBlockState(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;I)Z")) + private void arclight$redstoneChange(BlockState state, World worldIn, BlockPos pos, Random rand, CallbackInfo ci) { + if (CraftEventFactory.callRedstoneChange(worldIn, pos, 15, 0).getNewCurrent() != 0) { + ci.cancel(); + } + } +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/RedstoneOreBlockMixin.java b/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/RedstoneOreBlockMixin_1_14.java similarity index 97% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/RedstoneOreBlockMixin.java rename to arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/RedstoneOreBlockMixin_1_14.java index e5f5aee8..f9e64367 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/RedstoneOreBlockMixin.java +++ b/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/RedstoneOreBlockMixin_1_14.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.block; +package io.izzel.arclight.impl.mixin.v1_14.block; import io.izzel.arclight.common.bridge.entity.EntityBridge; import net.minecraft.block.BlockState; @@ -25,7 +25,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import java.util.Random; @Mixin(RedstoneOreBlock.class) -public abstract class RedstoneOreBlockMixin { +public abstract class RedstoneOreBlockMixin_1_14 { // @formatter:off @Shadow private static void activate(BlockState p_196500_0_, World p_196500_1_, BlockPos p_196500_2_) { } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/ScaffoldingBlockMixin.java b/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/ScaffoldingBlockMixin_1_14.java similarity index 92% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/ScaffoldingBlockMixin.java rename to arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/ScaffoldingBlockMixin_1_14.java index f6ec6bc0..77d1f15a 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/ScaffoldingBlockMixin.java +++ b/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/ScaffoldingBlockMixin_1_14.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.block; +package io.izzel.arclight.impl.mixin.v1_14.block; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; @@ -14,7 +14,7 @@ import org.spongepowered.asm.mixin.injection.Redirect; import java.util.Random; @Mixin(ScaffoldingBlock.class) -public class ScaffoldingBlockMixin { +public class ScaffoldingBlockMixin_1_14 { @Redirect(method = "tick", at = @At(value = "INVOKE", ordinal = 0, target = "Lnet/minecraft/block/BlockState;get(Lnet/minecraft/state/IProperty;)Ljava/lang/Comparable;")) public Comparable arclight$blockFade(BlockState state, IProperty property, BlockState blockState, World worldIn, BlockPos pos, Random random) { diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/SnowBlockMixin.java b/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/SnowBlockMixin_1_14.java similarity index 92% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/SnowBlockMixin.java rename to arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/SnowBlockMixin_1_14.java index 5128605e..bf7e8a1a 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/SnowBlockMixin.java +++ b/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/SnowBlockMixin_1_14.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.block; +package io.izzel.arclight.impl.mixin.v1_14.block; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; @@ -14,7 +14,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import java.util.Random; @Mixin(SnowBlock.class) -public class SnowBlockMixin { +public class SnowBlockMixin_1_14 { @Inject(method = "tick", cancellable = true, at = @At(value = "INVOKE", target = "Lnet/minecraft/block/SnowBlock;spawnDrops(Lnet/minecraft/block/BlockState;Lnet/minecraft/world/World;Lnet/minecraft/util/math/BlockPos;)V")) public void arclight$blockFade(BlockState state, World worldIn, BlockPos pos, Random random, CallbackInfo ci) { diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/SpreadableSnowyDirtBlockMixin.java b/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/SpreadableSnowyDirtBlockMixin_1_14.java similarity index 93% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/SpreadableSnowyDirtBlockMixin.java rename to arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/SpreadableSnowyDirtBlockMixin_1_14.java index f4881f3a..0f683596 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/SpreadableSnowyDirtBlockMixin.java +++ b/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/SpreadableSnowyDirtBlockMixin_1_14.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.block; +package io.izzel.arclight.impl.mixin.v1_14.block; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; @@ -15,7 +15,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import java.util.Random; @Mixin(SpreadableSnowyDirtBlock.class) -public class SpreadableSnowyDirtBlockMixin { +public class SpreadableSnowyDirtBlockMixin_1_14 { @Inject(method = "tick", cancellable = true, at = @At(value = "INVOKE", ordinal = 0, target = "Lnet/minecraft/world/World;setBlockState(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;)Z")) public void arclight$blockFade(BlockState state, World worldIn, BlockPos pos, Random random, CallbackInfo ci) { diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/StemBlockMixin.java b/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/StemBlockMixin_1_14.java similarity index 96% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/StemBlockMixin.java rename to arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/StemBlockMixin_1_14.java index e8d4fbde..9174a34c 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/StemBlockMixin.java +++ b/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/StemBlockMixin_1_14.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.block; +package io.izzel.arclight.impl.mixin.v1_14.block; import net.minecraft.block.BlockState; import net.minecraft.block.StemBlock; @@ -14,7 +14,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import java.util.Random; @Mixin(StemBlock.class) -public class StemBlockMixin { +public class StemBlockMixin_1_14 { private transient boolean arclight$success = false; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/SugarCaneBlockMixin.java b/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/SugarCaneBlockMixin_1_14.java similarity index 89% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/SugarCaneBlockMixin.java rename to arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/SugarCaneBlockMixin_1_14.java index 2e50f298..748f2b94 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/SugarCaneBlockMixin.java +++ b/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/SugarCaneBlockMixin_1_14.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.block; +package io.izzel.arclight.impl.mixin.v1_14.block; import net.minecraft.block.BlockState; import net.minecraft.block.SugarCaneBlock; @@ -10,7 +10,7 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Redirect; @Mixin(SugarCaneBlock.class) -public class SugarCaneBlockMixin { +public class SugarCaneBlockMixin_1_14 { @Redirect(method = "tick", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/World;setBlockState(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;)Z")) public boolean arclight$cropGrow(World world, BlockPos pos, BlockState state) { diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/SweetBerryBushBlockMixin.java b/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/SweetBerryBushBlockMixin_1_14.java similarity index 94% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/SweetBerryBushBlockMixin.java rename to arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/SweetBerryBushBlockMixin_1_14.java index 207b79e8..d12a139e 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/SweetBerryBushBlockMixin.java +++ b/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/SweetBerryBushBlockMixin_1_14.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.block; +package io.izzel.arclight.impl.mixin.v1_14.block; import net.minecraft.block.BlockState; import net.minecraft.block.SweetBerryBushBlock; @@ -14,7 +14,7 @@ import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(SweetBerryBushBlock.class) -public class SweetBerryBushBlockMixin { +public class SweetBerryBushBlockMixin_1_14 { @Redirect(method = "tick", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/World;setBlockState(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;I)Z")) public boolean arclight$cropGrow(World world, BlockPos pos, BlockState newState, int flags) { diff --git a/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/TurtleEggBlockMixin_1_14.java b/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/TurtleEggBlockMixin_1_14.java new file mode 100644 index 00000000..0063451d --- /dev/null +++ b/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/TurtleEggBlockMixin_1_14.java @@ -0,0 +1,51 @@ +package io.izzel.arclight.impl.mixin.v1_14.block; + +import io.izzel.arclight.common.bridge.world.WorldBridge; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.block.TurtleEggBlock; +import net.minecraft.state.IntegerProperty; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import org.bukkit.craftbukkit.v.event.CraftEventFactory; +import org.bukkit.event.entity.CreatureSpawnEvent; +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.Redirect; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.LocalCapture; + +import java.util.Random; + +@Mixin(TurtleEggBlock.class) +public class TurtleEggBlockMixin_1_14 { + + @Shadow @Final public static IntegerProperty HATCH; + + @Inject(method = "tick", cancellable = true, locals = LocalCapture.CAPTURE_FAILHARD, + at = @At(value = "INVOKE", ordinal = 0, target = "Lnet/minecraft/world/World;playSound(Lnet/minecraft/entity/player/PlayerEntity;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/util/SoundEvent;Lnet/minecraft/util/SoundCategory;FF)V")) + private void arclight$hatch(BlockState state, World worldIn, BlockPos pos, Random random, CallbackInfo ci, int i) { + if (!CraftEventFactory.handleBlockGrowEvent(worldIn, pos, state.with(HATCH, i + 1), 2)) { + ci.cancel(); + } + } + + @Redirect(method = "tick", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/World;setBlockState(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;I)Z")) + private boolean arclight$handledHatch(World world, BlockPos pos, BlockState newState, int flags) { + return true; + } + + @Inject(method = "tick", cancellable = true, at = @At(value = "INVOKE", ordinal = 1, target = "Lnet/minecraft/world/World;playSound(Lnet/minecraft/entity/player/PlayerEntity;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/util/SoundEvent;Lnet/minecraft/util/SoundCategory;FF)V")) + private void arclight$born(BlockState state, World worldIn, BlockPos pos, Random random, CallbackInfo ci) { + if (CraftEventFactory.callBlockFadeEvent(worldIn, pos, Blocks.AIR.getDefaultState()).isCancelled()) { + ci.cancel(); + } else { + if (!worldIn.isRemote) { + ((WorldBridge) worldIn).bridge$pushAddEntityReason(CreatureSpawnEvent.SpawnReason.EGG); + } + } + } +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/VineBlockMixin.java b/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/VineBlockMixin_1_14.java similarity index 97% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/VineBlockMixin.java rename to arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/VineBlockMixin_1_14.java index 325b5086..1d297d90 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/block/VineBlockMixin.java +++ b/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/block/VineBlockMixin_1_14.java @@ -1,5 +1,6 @@ -package io.izzel.arclight.common.mixin.core.block; +package io.izzel.arclight.impl.mixin.v1_14.block; +import io.izzel.arclight.common.mixin.core.block.BlockMixin; import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.block.VineBlock; @@ -17,7 +18,7 @@ import org.spongepowered.asm.mixin.Shadow; import java.util.Random; @Mixin(VineBlock.class) -public abstract class VineBlockMixin extends BlockMixin { +public abstract class VineBlockMixin_1_14 extends BlockMixin { // @formatter:off @Shadow protected abstract BlockState func_196545_h(BlockState p_196545_1_, IBlockReader p_196545_2_, BlockPos p_196545_3_); diff --git a/arclight-forge-1.14/src/main/resources/mixins.arclight.core.1_14.json b/arclight-forge-1.14/src/main/resources/mixins.arclight.core.1_14.json new file mode 100644 index 00000000..3a16bc89 --- /dev/null +++ b/arclight-forge-1.14/src/main/resources/mixins.arclight.core.1_14.json @@ -0,0 +1,49 @@ +{ + "required": true, + "minVersion": "0.8", + "package": "io.izzel.arclight.impl.mixin.v1_14", + "target": "@env(DEFAULT)", + "refmap": "mixins.arclight.impl.refmap.json", + "setSourceFile": true, + "plugin": "io.izzel.arclight.common.mod.ArclightMixinPlugin", + "injectors": { + "maxShiftBy": 2, + "defaultRequire": 1 + }, + "mixins": [ + "block.AbstractButtonBlockMixin_1_14", + "block.CactusBlockMixin_1_14", + "block.CakeBlockMixin_1_14", + "block.CauldronBlockMixin_1_14", + "block.ChestBlock2Mixin_1_14", + "block.ChorusFlowerBlockMixin_1_14", + "block.CocoaBlockMixin_1_14", + "block.CoralBlockMixin_1_14", + "block.CoralFinBlockMixin_1_14", + "block.CoralPlantBlockMixin_1_14", + "block.CoralWallFanBlockMixin_1_14", + "block.CropsBlockMixin_1_14", + "block.FarmlandBlockMixin_1_14", + "block.FireBlockMixin_1_14", + "block.GrassBlockMixin_1_14", + "block.KelpTopBlockMixin_1_14", + "block.LeavesBlockMixin_1_14", + "block.LeverBlockMixin_1_14", + "block.MushroomBlockMixin_1_14", + "block.NetherPortalBlockMixin_1_14", + "block.NetherWartBlockMixin_1_14", + "block.ObserverBlockMixin_1_14", + "block.PistonBlockMixin_1_14", + "block.RedstoneDiodeBlockMixin_1_14", + "block.RedstoneLampBlockMixin_1_14", + "block.RedstoneOreBlockMixin_1_14", + "block.ScaffoldingBlockMixin_1_14", + "block.SnowBlockMixin_1_14", + "block.SpreadableSnowyDirtBlockMixin_1_14", + "block.StemBlockMixin_1_14", + "block.SugarCaneBlockMixin_1_14", + "block.SweetBerryBushBlockMixin_1_14", + "block.TurtleEggBlockMixin_1_14", + "block.VineBlockMixin_1_14" + ] +} \ No newline at end of file