diff --git a/arclight-api/src/main/java/io/izzel/arclight/api/ArclightVersion.java b/arclight-api/src/main/java/io/izzel/arclight/api/ArclightVersion.java new file mode 100644 index 00000000..7403b1c0 --- /dev/null +++ b/arclight-api/src/main/java/io/izzel/arclight/api/ArclightVersion.java @@ -0,0 +1,59 @@ +package io.izzel.arclight.api; + +import java.util.Objects; + +public class ArclightVersion { + + public static final ArclightVersion v1_14 = new ArclightVersion("1.14.4", 1140); + public static final ArclightVersion v1_15 = new ArclightVersion("1.15.2", 1152); + + private final String name; + private final int num; + + public ArclightVersion(String name, int num) { + this.name = name; + this.num = num; + } + + public String getName() { + return name; + } + + @Override + public String toString() { + return "ArclightVersion{" + + "name='" + name + '\'' + + ", num=" + num + + '}'; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + ArclightVersion that = (ArclightVersion) o; + return num == that.num && + Objects.equals(name, that.name); + } + + @Override + public int hashCode() { + return Objects.hash(name, num); + } + + private static ArclightVersion version; + + public static void setVersion(ArclightVersion version) { + if (ArclightVersion.version != null) throw new IllegalStateException("Version is already set!"); + if (version == null) throw new IllegalArgumentException("Version cannot be null!"); + ArclightVersion.version = version; + } + + public static boolean atLeast(ArclightVersion v) { + return v.num <= version.num; + } + + public static boolean lesserThan(ArclightVersion v) { + return v.num > version.num; + } +} diff --git a/arclight-common/build.gradle b/arclight-common/build.gradle index b1134ea9..7ae2070e 100644 --- a/arclight-common/build.gradle +++ b/arclight-common/build.gradle @@ -20,14 +20,14 @@ apply plugin: 'idea' apply plugin: 'io.izzel.arclight' ext { - minecraftVersion = '1.14.4' - forgeVersion = '28.2.0' + minecraftVersion = '1.15.2' + forgeVersion = '31.2.0' } arclight { mcVersion = minecraftVersion forgeVersion = project.ext.forgeVersion - bukkitVersion = 'v1_14_R1' + bukkitVersion = 'v1_15_R1' wipeVersion = true reobfVersion = false } @@ -35,7 +35,7 @@ arclight { sourceCompatibility = targetCompatibility = compileJava.sourceCompatibility = compileJava.targetCompatibility = '1.8' minecraft { - mappings channel: 'stable', version: "58-$minecraftVersion" + mappings channel: 'snapshot', version: "20200530-1.15.1" accessTransformer = project.file('src/main/resources/META-INF/accesstransformer.cfg') } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/bridge/command/CommandNodeBridge.java b/arclight-common/src/main/java/io/izzel/arclight/common/bridge/command/CommandNodeBridge.java new file mode 100644 index 00000000..c4c93209 --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/bridge/command/CommandNodeBridge.java @@ -0,0 +1,6 @@ +package io.izzel.arclight.common.bridge.command; + +public interface CommandNodeBridge { + + void bridge$removeCommand(String name); +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/bridge/command/CommandSourceBridge.java b/arclight-common/src/main/java/io/izzel/arclight/common/bridge/command/CommandSourceBridge.java index 2598d1d1..a40e8381 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/bridge/command/CommandSourceBridge.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/bridge/command/CommandSourceBridge.java @@ -1,6 +1,7 @@ package io.izzel.arclight.common.bridge.command; import com.mojang.brigadier.tree.CommandNode; +import org.bukkit.command.CommandSender; public interface CommandSourceBridge { @@ -9,4 +10,6 @@ public interface CommandSourceBridge { void bridge$setCurrentCommand(CommandNode node); boolean bridge$hasPermission(int i, String bukkitPermission); + + CommandSender bridge$getBukkitSender(); } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/bridge/entity/InternalEntityBridge.java b/arclight-common/src/main/java/io/izzel/arclight/common/bridge/entity/InternalEntityBridge.java index eba37e72..982a4fb9 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/bridge/entity/InternalEntityBridge.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/bridge/entity/InternalEntityBridge.java @@ -1,8 +1,11 @@ package io.izzel.arclight.common.bridge.entity; +import net.minecraft.util.math.BlockPos; import org.bukkit.craftbukkit.v.entity.CraftEntity; public interface InternalEntityBridge { CraftEntity internal$getBukkitEntity(); + + BlockPos internal$capturedPos(); } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/bridge/inventory/container/SlotBridge.java b/arclight-common/src/main/java/io/izzel/arclight/common/bridge/inventory/container/SlotBridge.java new file mode 100644 index 00000000..9e601aea --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/bridge/inventory/container/SlotBridge.java @@ -0,0 +1,6 @@ +package io.izzel.arclight.common.bridge.inventory.container; + +public interface SlotBridge { + + void bridge$onSwapCraft(int numItemsCrafted); +} 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/bridge/world/chunk/ChunkBridge.java b/arclight-common/src/main/java/io/izzel/arclight/common/bridge/world/chunk/ChunkBridge.java index a6967dfe..991d8000 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/bridge/world/chunk/ChunkBridge.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/bridge/world/chunk/ChunkBridge.java @@ -8,6 +8,8 @@ public interface ChunkBridge { Chunk bridge$getBukkitChunk(); + void bridge$setBukkitChunk(Chunk chunk); + BlockState bridge$setType(BlockPos pos, BlockState state, boolean isMoving, boolean doPlace); boolean bridge$isMustNotSave(); diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/bridge/world/server/TicketManagerBridge.java b/arclight-common/src/main/java/io/izzel/arclight/common/bridge/world/server/TicketManagerBridge.java index 24f50142..627ce03c 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/bridge/world/server/TicketManagerBridge.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/bridge/world/server/TicketManagerBridge.java @@ -1,7 +1,5 @@ package io.izzel.arclight.common.bridge.world.server; -import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap; -import it.unimi.dsi.fastutil.objects.ObjectSortedSet; import net.minecraft.util.math.ChunkPos; import net.minecraft.world.server.Ticket; import net.minecraft.world.server.TicketType; @@ -18,7 +16,5 @@ public interface TicketManagerBridge { void bridge$tick(); - Long2ObjectOpenHashMap>> bridge$getTickets(); - void bridge$removeAllTicketsFor(TicketType ticketType, int ticketLevel, T ticketIdentifier); } 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 c9312421..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 @@ -5,6 +5,7 @@ import net.minecraft.block.AbstractButtonBlock; import net.minecraft.block.BlockState; import net.minecraft.entity.Entity; import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.state.BooleanProperty; import net.minecraft.util.Hand; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockRayTraceResult; @@ -14,7 +15,9 @@ import org.bukkit.block.Block; import org.bukkit.craftbukkit.v.block.CraftBlock; import org.bukkit.event.block.BlockRedstoneEvent; import org.bukkit.event.entity.EntityInteractEvent; +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; @@ -22,35 +25,28 @@ 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 { - @Inject(method = "onBlockActivated", cancellable = true, at = @At(value = "INVOKE", target = "Lnet/minecraft/world/World;setBlockState(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;I)Z")) + // @formatter:off + @Shadow @Final public static BooleanProperty POWERED; + // @formatter:on + + @Inject(method = "onBlockActivated", cancellable = true, at = @At(value = "HEAD")) public void arclight$blockRedstone1(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand handIn, BlockRayTraceResult hit, CallbackInfoReturnable cir) { - boolean powered = state.get(AbstractButtonBlock.POWERED); - Block block = CraftBlock.at(worldIn, pos); - int old = (powered) ? 15 : 0; - int current = (!powered) ? 15 : 0; + if (!state.get(POWERED)) { + boolean powered = state.get(POWERED); + Block block = CraftBlock.at(worldIn, pos); + int old = (powered) ? 15 : 0; + int current = (!powered) ? 15 : 0; - BlockRedstoneEvent event = new BlockRedstoneEvent(block, old, current); - Bukkit.getPluginManager().callEvent(event); + BlockRedstoneEvent event = new BlockRedstoneEvent(block, old, current); + Bukkit.getPluginManager().callEvent(event); - if ((event.getNewCurrent() > 0) == (powered)) { - cir.setReturnValue(true); - } - } - - @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")) - public 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(); + if ((event.getNewCurrent() > 0) == (powered)) { + cir.setReturnValue(true); + } } } 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 e9af160a..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; @@ -62,13 +65,15 @@ public abstract class BlockMixin implements BlockBridge { * @reason */ @Overwrite - public static List func_220077_a(BlockState state, ServerWorld worldIn, BlockPos pos, @Nullable TileEntity tileEntityIn, Entity entityIn, ItemStack stack) { + 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 f6b59a2b..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 @@ -10,17 +10,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(CactusBlock.class) public class CactusBlockMixin { - @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(World world, BlockPos pos, BlockState state) { - return CraftEventFactory.handleBlockGrowEvent(world, 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/bukkit/CommandNodeMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/command/CommandNodeMixin.java similarity index 66% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/CommandNodeMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/command/CommandNodeMixin.java index 0eb4242d..35d26849 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/CommandNodeMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/command/CommandNodeMixin.java @@ -1,8 +1,9 @@ -package io.izzel.arclight.common.mixin.bukkit; +package io.izzel.arclight.common.mixin.core.command; import com.mojang.brigadier.tree.ArgumentCommandNode; import com.mojang.brigadier.tree.CommandNode; import com.mojang.brigadier.tree.LiteralCommandNode; +import io.izzel.arclight.common.bridge.command.CommandNodeBridge; import io.izzel.arclight.common.bridge.command.CommandSourceBridge; import net.minecraft.command.CommandSource; import org.spongepowered.asm.mixin.Final; @@ -15,14 +16,14 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import java.util.Map; import java.util.function.Predicate; -@Mixin(CommandNode.class) -public class CommandNodeMixin { +@Mixin(value = CommandNode.class, remap = false) +public class CommandNodeMixin implements CommandNodeBridge { // @formatter:off - @Shadow(remap = false) private Map> children; - @Shadow(remap = false) private Map> literals; - @Shadow(remap = false) private Map> arguments; - @Shadow(remap = false) @Final private Predicate requirement; + @Shadow private Map> children; + @Shadow private Map> literals; + @Shadow private Map> arguments; + @Shadow @Final private Predicate requirement; // @formatter:on public void removeCommand(String name) { @@ -31,7 +32,12 @@ public class CommandNodeMixin { arguments.remove(name); } - @Inject(method = "canUse", remap = false, cancellable = true, at = @At("HEAD")) + @Override + public void bridge$removeCommand(String name) { + removeCommand(name); + } + + @Inject(method = "canUse", cancellable = true, at = @At("HEAD")) public void on(S source, CallbackInfoReturnable cir) { if (source instanceof CommandSource) { try { diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/command/CommandSourceMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/command/CommandSourceMixin.java index ced6d0d3..3b855937 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/command/CommandSourceMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/command/CommandSourceMixin.java @@ -22,7 +22,7 @@ public abstract class CommandSourceMixin implements CommandSourceBridge { // @formatter:off @Shadow @Final public ICommandSource source; - @Shadow public abstract ServerWorld func_197023_e(); + @Shadow public abstract ServerWorld getWorld(); @Shadow @Final private int permissionLevel; // @formatter:on @@ -37,7 +37,7 @@ public abstract class CommandSourceMixin implements CommandSourceBridge { public boolean hasPermission(int i, String bukkitPermission) { // World is null when loading functions - return ((func_197023_e() == null || !((CraftServer) Bukkit.getServer()).ignoreVanillaPermissions) && this.permissionLevel >= i) || getBukkitSender().hasPermission(bukkitPermission); + return ((getWorld() == null || !((CraftServer) Bukkit.getServer()).ignoreVanillaPermissions) && this.permissionLevel >= i) || getBukkitSender().hasPermission(bukkitPermission); } @Override @@ -58,4 +58,9 @@ public abstract class CommandSourceMixin implements CommandSourceBridge { public CommandSender getBukkitSender() { return ((ICommandSourceBridge) this.source).bridge$getBukkitSender((CommandSource) (Object) this); } + + @Override + public CommandSender bridge$getBukkitSender() { + return getBukkitSender(); + } } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/command/CommandsMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/command/CommandsMixin.java new file mode 100644 index 00000000..ce03e42c --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/command/CommandsMixin.java @@ -0,0 +1,39 @@ +package io.izzel.arclight.common.mixin.core.command; + +import com.mojang.brigadier.tree.CommandNode; +import com.mojang.brigadier.tree.RootCommandNode; +import io.izzel.arclight.common.bridge.command.CommandNodeBridge; +import io.izzel.arclight.common.bridge.entity.player.ServerPlayerEntityBridge; +import net.minecraft.command.CommandSource; +import net.minecraft.command.Commands; +import net.minecraft.command.ISuggestionProvider; +import net.minecraft.entity.player.ServerPlayerEntity; +import org.bukkit.Bukkit; +import org.bukkit.event.player.PlayerCommandSendEvent; +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.LocalCapture; + +import java.util.LinkedHashSet; +import java.util.Map; + +@Mixin(Commands.class) +public class CommandsMixin { + + @Inject(method = "send", locals = LocalCapture.CAPTURE_FAILHARD, at = @At(value = "INVOKE", shift = At.Shift.AFTER, target = "Lnet/minecraft/command/Commands;commandSourceNodesToSuggestionNodes(Lcom/mojang/brigadier/tree/CommandNode;Lcom/mojang/brigadier/tree/CommandNode;Lnet/minecraft/command/CommandSource;Ljava/util/Map;)V")) + private void arclight$playerCommandSend(ServerPlayerEntity player, CallbackInfo ci, Map, CommandNode> map , RootCommandNode node) { + LinkedHashSet set = new LinkedHashSet<>(); + for (CommandNode child : node.getChildren()) { + set.add(child.getName()); + } + PlayerCommandSendEvent event = new PlayerCommandSendEvent(((ServerPlayerEntityBridge) player).bridge$getBukkitEntity(), new LinkedHashSet<>(set)); + Bukkit.getPluginManager().callEvent(event); + for (String s : set) { + if (!event.getCommands().contains(s)) { + ((CommandNodeBridge) node).bridge$removeCommand(s); + } + } + } +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/command/arguments/BlockStateParserMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/command/arguments/BlockStateParserMixin.java new file mode 100644 index 00000000..9bff3b26 --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/command/arguments/BlockStateParserMixin.java @@ -0,0 +1,28 @@ +package io.izzel.arclight.common.mixin.core.command.arguments; + +import com.mojang.brigadier.StringReader; +import net.minecraft.command.arguments.BlockStateParser; +import net.minecraft.state.IProperty; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Mutable; +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.LinkedHashMap; +import java.util.Map; + +@Mixin(BlockStateParser.class) +public class BlockStateParserMixin { + + // @formatter:off + @Shadow @Final @Mutable private Map, Comparable> properties; + // @formatter:on + + @Inject(method = "", at = @At("RETURN")) + private void arclight$init(StringReader readerIn, boolean allowTags, CallbackInfo ci) { + this.properties = new LinkedHashMap<>(properties); + } +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/command/impl/SummonCommandMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/command/impl/SummonCommandMixin.java index 1f05a84f..51e183ea 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/command/impl/SummonCommandMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/command/impl/SummonCommandMixin.java @@ -17,6 +17,6 @@ public class SummonCommandMixin { @Inject(method = "summonEntity", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/server/ServerWorld;addLightningBolt(Lnet/minecraft/entity/effect/LightningBoltEntity;)V")) private static void arclight$strikeReason(CommandSource source, ResourceLocation type, Vec3d pos, CompoundNBT nbt, boolean randomizeProperties, CallbackInfoReturnable cir) { - ((ServerWorldBridge) source.func_197023_e()).bridge$pushStrikeLightningCause(LightningStrikeEvent.Cause.COMMAND); + ((ServerWorldBridge) source.getWorld()).bridge$pushStrikeLightningCause(LightningStrikeEvent.Cause.COMMAND); } } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/EntityMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/EntityMixin.java index a319bf8e..986bef01 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/EntityMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/EntityMixin.java @@ -7,10 +7,8 @@ import io.izzel.arclight.common.bridge.entity.LivingEntityBridge; import io.izzel.arclight.common.bridge.entity.MobEntityBridge; import io.izzel.arclight.common.bridge.entity.player.ServerPlayerEntityBridge; import io.izzel.arclight.common.bridge.world.WorldBridge; -import io.izzel.arclight.common.bridge.world.server.ServerWorldBridge; import io.izzel.arclight.common.bridge.world.storage.SaveHandlerBridge; import io.izzel.arclight.common.mod.util.ArclightCaptures; -import net.minecraft.block.pattern.BlockPattern; import net.minecraft.command.CommandSource; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityType; @@ -29,7 +27,6 @@ import net.minecraft.network.datasync.EntityDataManager; import net.minecraft.scoreboard.Team; import net.minecraft.server.MinecraftServer; import net.minecraft.util.DamageSource; -import net.minecraft.util.Direction; import net.minecraft.util.SoundEvent; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; @@ -38,11 +35,8 @@ import net.minecraft.util.math.Vec3d; import net.minecraft.util.text.ITextComponent; import net.minecraft.world.World; import net.minecraft.world.dimension.DimensionType; -import net.minecraft.world.gen.Heightmap; import net.minecraft.world.server.ServerWorld; -import net.minecraftforge.common.ForgeHooks; import org.bukkit.Bukkit; -import org.bukkit.Location; import org.bukkit.Server; import org.bukkit.block.BlockFace; import org.bukkit.command.CommandSender; @@ -58,7 +52,6 @@ import org.bukkit.event.entity.EntityCombustByBlockEvent; import org.bukkit.event.entity.EntityCombustByEntityEvent; import org.bukkit.event.entity.EntityCombustEvent; import org.bukkit.event.entity.EntityDropItemEvent; -import org.bukkit.event.entity.EntityPortalEvent; import org.bukkit.event.entity.EntityPoseChangeEvent; import org.bukkit.event.hanging.HangingBreakByEntityEvent; import org.bukkit.event.player.PlayerTeleportEvent; @@ -69,7 +62,6 @@ import org.bukkit.plugin.PluginManager; import org.bukkit.projectiles.ProjectileSource; 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; @@ -121,8 +113,6 @@ public abstract class EntityMixin implements InternalEntityBridge, EntityBridge, @Shadow @Deprecated public boolean removed; @Shadow @Nullable public abstract MinecraftServer getServer(); @Shadow public abstract Vec3d getMotion(); - @Shadow public abstract Vec3d getLastPortalVec(); - @Shadow public abstract Direction getTeleportDirection(); @Shadow public abstract EntityType getType(); @Shadow public abstract void remove(boolean keepData); @Shadow @Final protected Random rand; @@ -176,11 +166,10 @@ public abstract class EntityMixin implements InternalEntityBridge, EntityBridge, @Shadow public abstract int getEntityId(); @Shadow @Nullable public abstract ITextComponent getCustomName(); @Shadow protected abstract void applyEnchantments(LivingEntity entityLivingBaseIn, Entity entityIn); + @Shadow public abstract float getEyeHeight(); + @Shadow @Nullable public abstract Entity changeDimension(DimensionType destination); // @formatter:on - @Shadow - public abstract float getEyeHeight(); - private static final int CURRENT_LEVEL = 2; public boolean persist; public boolean valid; @@ -452,6 +441,11 @@ public abstract class EntityMixin implements InternalEntityBridge, EntityBridge, } } + @Inject(method = "setPositionAndRotation", at = @At("RETURN")) + private void arclight$loadChunk(double x, double y, double z, float yaw, float pitch, CallbackInfo ci) { + this.world.getChunk((int)Math.floor(this.posX) >> 4, (int)Math.floor(this.posZ) >> 4); + } + @Inject(method = "writeUnlessRemoved", cancellable = true, at = @At(value = "INVOKE_ASSIGN", target = "Lnet/minecraft/entity/Entity;getEntityString()Ljava/lang/String;")) public void arclight$writeUnlessRemoved$persistCheck(CompoundNBT compound, CallbackInfoReturnable cir) { if (!this.persist) @@ -520,7 +514,7 @@ public abstract class EntityMixin implements InternalEntityBridge, EntityBridge, } if (bworld == null) { - bworld = ((WorldBridge) ((CraftServer) server).getServer().func_71218_a(DimensionType.OVERWORLD)).bridge$getWorld(); + bworld = ((WorldBridge) ((CraftServer) server).getServer().getWorld(DimensionType.OVERWORLD)).bridge$getWorld(); } setWorld(bworld == null ? null : ((CraftWorld) bworld).getHandle()); @@ -741,6 +735,15 @@ public abstract class EntityMixin implements InternalEntityBridge, EntityBridge, private transient BlockPos arclight$tpPos; + @Override + public BlockPos internal$capturedPos() { + try { + return arclight$tpPos; + } finally { + arclight$tpPos = null; + } + } + public Entity teleportTo(DimensionType type, BlockPos blockPos) { arclight$tpPos = blockPos; return changeDimension(type); @@ -751,101 +754,4 @@ public abstract class EntityMixin implements InternalEntityBridge, EntityBridge, return teleportTo(type, blockPos); } - /** - * @author IzzelAliz - * @reason - */ - @Overwrite - @Nullable - public Entity changeDimension(DimensionType destination) { - BlockPos location = arclight$tpPos; - arclight$tpPos = null; - if (!ForgeHooks.onTravelToDimension((Entity) (Object) this, destination)) return null; - if (!this.world.isRemote && !this.removed) { - this.world.getProfiler().startSection("changeDimension"); - MinecraftServer minecraftserver = this.getServer(); - DimensionType dimensiontype = this.dimension; - ServerWorld serverworld = minecraftserver.func_71218_a(dimensiontype); - ServerWorld serverworld1 = minecraftserver.func_71218_a(destination); - if (serverworld1 == null) { - return null; - } - // this.dimension = destination; - // this.detach(); - this.world.getProfiler().startSection("reposition"); - Vec3d vec3d = this.getMotion(); - float f = 0.0F; - BlockPos blockpos = location; - if (blockpos == null) { - if (dimensiontype == DimensionType.THE_END && destination == DimensionType.OVERWORLD) { - blockpos = serverworld1.getHeight(Heightmap.Type.MOTION_BLOCKING_NO_LEAVES, serverworld1.getSpawnPoint()); - } else if (destination == DimensionType.THE_END) { - blockpos = serverworld1.getSpawnCoordinate(); - } else { - double movementFactor = serverworld.getDimension().getMovementFactor() / serverworld1.getDimension().getMovementFactor(); - double d0 = this.posX * movementFactor; - double d1 = this.posZ * movementFactor; - - double d3 = Math.min(-2.9999872E7D, serverworld1.getWorldBorder().minX() + 16.0D); - double d4 = Math.min(-2.9999872E7D, serverworld1.getWorldBorder().minZ() + 16.0D); - double d5 = Math.min(2.9999872E7D, serverworld1.getWorldBorder().maxX() - 16.0D); - double d6 = Math.min(2.9999872E7D, serverworld1.getWorldBorder().maxZ() - 16.0D); - d0 = MathHelper.clamp(d0, d3, d5); - d1 = MathHelper.clamp(d1, d4, d6); - Vec3d vec3d1 = this.getLastPortalVec(); - blockpos = new BlockPos(d0, this.posY, d1); - BlockPattern.PortalInfo blockpattern$portalinfo = serverworld1.getDefaultTeleporter().placeInExistingPortal(blockpos, vec3d, this.getTeleportDirection(), vec3d1.x, vec3d1.y, (Object) this instanceof PlayerEntity); - if (blockpattern$portalinfo == null) { - return null; - } - - blockpos = new BlockPos(blockpattern$portalinfo.pos); - vec3d = blockpattern$portalinfo.motion; - f = (float) blockpattern$portalinfo.rotation; - } - } - - if (location == null) { - Location enter = this.getBukkitEntity().getLocation(); - Location exit = new Location(((ServerWorldBridge) serverworld1).bridge$getWorld(), blockpos.getX(), blockpos.getY(), blockpos.getZ()); - - EntityPortalEvent event = new EntityPortalEvent(this.getBukkitEntity(), enter, exit); - event.getEntity().getServer().getPluginManager().callEvent(event); - if (event.isCancelled() || event.getTo() == null || event.getTo().getWorld() == null || !this.isAlive()) { - return null; - } - - exit = event.getTo(); - serverworld1 = ((CraftWorld) exit.getWorld()).getHandle(); - blockpos = new BlockPos(exit.getX(), exit.getY(), exit.getZ()); - } - - this.dimension = destination; - this.detach(); - - this.world.getProfiler().endStartSection("reloading"); - Entity entity = this.getType().create(serverworld1); - if (entity != null) { - entity.copyDataFromOld((Entity) (Object) this); - entity.moveToBlockPosAndAngles(blockpos, entity.rotationYaw + f, entity.rotationPitch); - entity.setMotion(vec3d); - serverworld1.func_217460_e(entity); - - this.getBukkitEntity().setHandle(entity); - ((EntityBridge) entity).bridge$setBukkitEntity(getBukkitEntity()); - if ((Object) this instanceof MobEntity) { - ((MobEntity) (Object) this).clearLeashed(true, false); - } - } - - this.remove(false); - this.world.getProfiler().endSection(); - serverworld.resetUpdateEntityTick(); - serverworld1.resetUpdateEntityTick(); - this.world.getProfiler().endSection(); - return entity; - } else { - return null; - } - } } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/ai/attributes/RangedAttributeMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/ai/attributes/RangedAttributeMixin.java new file mode 100644 index 00000000..07d4fa45 --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/ai/attributes/RangedAttributeMixin.java @@ -0,0 +1,32 @@ +package io.izzel.arclight.common.mixin.core.entity.ai.attributes; + +import io.izzel.arclight.common.bridge.entity.ai.attributes.RangedAttributeBridge; +import net.minecraft.entity.ai.attributes.Attribute; +import net.minecraft.entity.ai.attributes.IAttribute; +import net.minecraft.entity.ai.attributes.RangedAttribute; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import javax.annotation.Nullable; + +@Mixin(RangedAttribute.class) +public abstract class RangedAttributeMixin extends Attribute implements RangedAttributeBridge { + + protected RangedAttributeMixin(@Nullable IAttribute parentIn, String unlocalizedNameIn, double defaultValueIn) { + super(parentIn, unlocalizedNameIn, defaultValueIn); + } + + // @formatter:off + @Override @Accessor("maximumValue") public abstract void bridge$setMaximumValue(double maximumValue); + // @formatter:on + + @Inject(method = "clampValue", cancellable = true, at = @At("HEAD")) + private void arclight$notNan(double value, CallbackInfoReturnable cir) { + if (Double.isNaN(value)) { + cir.setReturnValue(this.getDefaultValue()); + } + } +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/ai/attributes/RangedAttributeMixin_Accessor.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/ai/attributes/RangedAttributeMixin_Accessor.java deleted file mode 100644 index faf5f5d4..00000000 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/ai/attributes/RangedAttributeMixin_Accessor.java +++ /dev/null @@ -1,13 +0,0 @@ -package io.izzel.arclight.common.mixin.core.entity.ai.attributes; - -import io.izzel.arclight.common.bridge.entity.ai.attributes.RangedAttributeBridge; -import net.minecraft.entity.ai.attributes.RangedAttribute; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -@Mixin(RangedAttribute.class) -public abstract class RangedAttributeMixin_Accessor implements RangedAttributeBridge { - - @Override @Accessor("maximumValue") - public abstract void bridge$setMaximumValue(double maximumValue); -} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/ai/brain/BrainUtilMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/ai/brain/BrainUtilMixin.java new file mode 100644 index 00000000..709e87ac --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/ai/brain/BrainUtilMixin.java @@ -0,0 +1,18 @@ +package io.izzel.arclight.common.mixin.core.entity.ai.brain; + +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.ai.brain.BrainUtil; +import net.minecraft.item.ItemStack; +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(BrainUtil.class) +public class BrainUtilMixin { + + @Inject(method = "throwItemAt", cancellable = true, at = @At("HEAD")) + private static void arclight$noEmptyLoot(LivingEntity from, ItemStack stack, LivingEntity to, CallbackInfo ci) { + if (stack.isEmpty()) ci.cancel(); + } +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/ai/brain/task/AssignProfessionTaskMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/ai/brain/task/AssignProfessionTaskMixin.java index a4843bb4..28c21712 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/ai/brain/task/AssignProfessionTaskMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/ai/brain/task/AssignProfessionTaskMixin.java @@ -14,7 +14,7 @@ import org.spongepowered.asm.mixin.injection.Redirect; @Mixin(AssignProfessionTask.class) public class AssignProfessionTaskMixin { - @Redirect(method = "func_212831_a_", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/merchant/villager/VillagerEntity;setVillagerData(Lnet/minecraft/entity/merchant/villager/VillagerData;)V")) + @Redirect(method = "startExecuting", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/merchant/villager/VillagerEntity;setVillagerData(Lnet/minecraft/entity/merchant/villager/VillagerData;)V")) private void arclight$careerChangeHook(VillagerEntity villagerEntity, VillagerData villagerData) { VillagerProfession profession = villagerData.getProfession(); VillagerCareerChangeEvent event = CraftEventFactory.callVillagerCareerChangeEvent(villagerEntity, CraftVillager.nmsToBukkitProfession(profession), VillagerCareerChangeEvent.ChangeReason.EMPLOYED); @@ -22,6 +22,5 @@ public class AssignProfessionTaskMixin { VillagerData newData = villagerEntity.getVillagerData().withProfession(CraftVillager.bukkitToNmsProfession(event.getProfession())); villagerEntity.setVillagerData(newData); } - } } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/ai/brain/task/ChangeJobTaskMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/ai/brain/task/ChangeJobTaskMixin.java index c8c26301..17dbd68e 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/ai/brain/task/ChangeJobTaskMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/ai/brain/task/ChangeJobTaskMixin.java @@ -14,7 +14,7 @@ import org.spongepowered.asm.mixin.injection.Redirect; @Mixin(ChangeJobTask.class) public class ChangeJobTaskMixin { - @Redirect(method = "func_212831_a_", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/merchant/villager/VillagerEntity;setVillagerData(Lnet/minecraft/entity/merchant/villager/VillagerData;)V")) + @Redirect(method = "startExecuting", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/merchant/villager/VillagerEntity;setVillagerData(Lnet/minecraft/entity/merchant/villager/VillagerData;)V")) private void arclight$careerChangeHook(VillagerEntity villagerEntity, VillagerData villagerData) { VillagerCareerChangeEvent event = CraftEventFactory.callVillagerCareerChangeEvent(villagerEntity, CraftVillager.nmsToBukkitProfession(VillagerProfession.NONE), diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/ai/brain/task/CreateBabyVillagerTaskMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/ai/brain/task/CreateBabyVillagerTaskMixin.java index 4704d8af..864cb2c7 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/ai/brain/task/CreateBabyVillagerTaskMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/ai/brain/task/CreateBabyVillagerTaskMixin.java @@ -1,38 +1,29 @@ package io.izzel.arclight.common.mixin.core.entity.ai.brain.task; +import io.izzel.arclight.common.bridge.world.WorldBridge; import net.minecraft.entity.ai.brain.task.CreateBabyVillagerTask; import net.minecraft.entity.merchant.villager.VillagerEntity; import org.bukkit.craftbukkit.v.event.CraftEventFactory; +import org.bukkit.event.entity.CreatureSpawnEvent; +import org.objectweb.asm.Opcodes; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Overwrite; +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.Optional; @Mixin(CreateBabyVillagerTask.class) public class CreateBabyVillagerTaskMixin { - /** - * @author IzzelAliz - * @reason - */ - @Overwrite - private Optional func_220480_a(VillagerEntity lona, VillagerEntity anonymous) { - VillagerEntity villager = lona.createChild(anonymous); - - if (CraftEventFactory.callEntityBreedEvent(villager, lona, anonymous, null, null, 0).isCancelled()) { - return Optional.empty(); - } - - if (villager == null) { - return Optional.empty(); - } else { - lona.setGrowingAge(6000); - anonymous.setGrowingAge(6000); - villager.setGrowingAge(-24000); - villager.setLocationAndAngles(lona.posX, lona.posY, lona.posZ, 0.0F, 0.0F); - lona.world.addEntity(villager); - lona.world.setEntityState(villager, (byte) 12); - return Optional.of(villager); + @Inject(method = "func_220480_a", cancellable = true, locals = LocalCapture.CAPTURE_FAILHARD, + at = @At(value = "JUMP", ordinal = 0, opcode = Opcodes.IFNONNULL)) + private void arclight$entityBreed(VillagerEntity lona, VillagerEntity anonymous, CallbackInfoReturnable> cir, VillagerEntity child) { + if (CraftEventFactory.callEntityBreedEvent(child, lona, anonymous, null, null, 0).isCancelled()) { + cir.setReturnValue(Optional.empty()); + } else if (child != null) { + ((WorldBridge) lona.world).bridge$pushAddEntityReason(CreatureSpawnEvent.SpawnReason.BREEDING); } } } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/ai/brain/task/FarmTaskMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/ai/brain/task/FarmTaskMixin.java index 2043663d..49ec8ae6 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/ai/brain/task/FarmTaskMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/ai/brain/task/FarmTaskMixin.java @@ -12,7 +12,7 @@ import io.izzel.arclight.common.mod.util.ArclightCaptures; @Mixin(FarmTask.class) public abstract class FarmTaskMixin { - @Inject(method = "func_212833_d_", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/server/ServerWorld;setBlockState(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;I)Z")) + @Inject(method = "updateTask", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/server/ServerWorld;setBlockState(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;I)Z")) private void on(ServerWorld worldIn, VillagerEntity owner, long gameTime, CallbackInfo ci) { ArclightCaptures.captureEntityChangeBlock(owner); } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/item/minecart/MinecartCommandBlockEntity_MinecartCommandLogicMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/item/minecart/MinecartCommandBlockEntity_MinecartCommandLogicMixin.java index bda7fbc5..bb9163ee 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/item/minecart/MinecartCommandBlockEntity_MinecartCommandLogicMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/item/minecart/MinecartCommandBlockEntity_MinecartCommandLogicMixin.java @@ -13,8 +13,12 @@ public abstract class MinecartCommandBlockEntity_MinecartCommandLogicMixin imple @Shadow(aliases = {"this$0", "field_210168_a"}) private MinecartCommandBlockEntity outerThis; - @Override - public CommandSender bridge$getBukkitSender(CommandSource wrapper) { + public CommandSender getBukkitSender(CommandSource wrapper) { return ((EntityBridge) outerThis).bridge$getBukkitEntity(); } + + @Override + public CommandSender bridge$getBukkitSender(CommandSource wrapper) { + return getBukkitSender(wrapper); + } } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/AbstractFurnaceContainerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/AbstractFurnaceContainerMixin.java index 96a65084..d20c3442 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/AbstractFurnaceContainerMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/AbstractFurnaceContainerMixin.java @@ -22,7 +22,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(AbstractFurnaceContainer.class) -public class AbstractFurnaceContainerMixin extends ContainerMixin { +public abstract class AbstractFurnaceContainerMixin extends ContainerMixin { // @formatter:off @Shadow @Final private IInventory furnaceInventory; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/BeaconContainerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/BeaconContainerMixin.java index d429dc62..363f3c51 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/BeaconContainerMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/BeaconContainerMixin.java @@ -20,7 +20,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(BeaconContainer.class) -public class BeaconContainerMixin extends ContainerMixin { +public abstract class BeaconContainerMixin extends ContainerMixin { // @formatter:off @Shadow @Final private IInventory tileBeacon; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/BrewingStandContainerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/BrewingStandContainerMixin.java index f6ed071c..8b6be9b9 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/BrewingStandContainerMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/BrewingStandContainerMixin.java @@ -18,7 +18,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(BrewingStandContainer.class) -public class BrewingStandContainerMixin extends ContainerMixin { +public abstract class BrewingStandContainerMixin extends ContainerMixin { // @formatter:off @Shadow @Final private IInventory tileBrewingStand; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/CartographyContainerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/CartographyContainerMixin.java index 59e424c6..8e398092 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/CartographyContainerMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/CartographyContainerMixin.java @@ -21,11 +21,11 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(CartographyContainer.class) -public class CartographyContainerMixin extends ContainerMixin implements CartographyContainerBridge { +public abstract class CartographyContainerMixin extends ContainerMixin implements CartographyContainerBridge { // @formatter:off - @Shadow @Final private IWorldPosCallable field_216999_d; - @Shadow @Final public IInventory field_216998_c; + @Shadow @Final private IWorldPosCallable worldPosCallable; + @Shadow @Final public IInventory tableInventory; @Shadow @Final private CraftResultInventory field_217001_f; // @formatter:on @@ -48,13 +48,13 @@ public class CartographyContainerMixin extends ContainerMixin implements Cartogr return bukkitEntity; } - CraftInventoryCartography inventory = new CraftInventoryCartography(this.field_216998_c, this.field_217001_f); + CraftInventoryCartography inventory = new CraftInventoryCartography(this.tableInventory, this.field_217001_f); bukkitEntity = new CraftInventoryView(this.player, inventory, (Container) (Object) this); return bukkitEntity; } @Override public IWorldPosCallable bridge$getContainerAccess() { - return this.field_216999_d; + return this.worldPosCallable; } } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/ChestContainerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/ChestContainerMixin.java index 9331308c..48c0bcef 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/ChestContainerMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/ChestContainerMixin.java @@ -21,7 +21,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(ChestContainer.class) -public class ChestContainerMixin extends ContainerMixin { +public abstract class ChestContainerMixin extends ContainerMixin { // @formatter:off @Shadow @Final private IInventory lowerChestInventory; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/ContainerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/ContainerMixin.java index 1e934be6..beae3037 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/ContainerMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/ContainerMixin.java @@ -3,19 +3,54 @@ package io.izzel.arclight.common.mixin.core.inventory.container; import com.google.common.base.Preconditions; import io.izzel.arclight.common.bridge.inventory.IInventoryBridge; import io.izzel.arclight.common.bridge.inventory.container.ContainerBridge; +import io.izzel.arclight.common.bridge.inventory.container.SlotBridge; +import net.minecraft.entity.item.ItemEntity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.entity.player.ServerPlayerEntity; +import net.minecraft.inventory.container.ClickType; import net.minecraft.inventory.container.Container; +import net.minecraft.inventory.container.Slot; +import net.minecraft.item.ItemStack; +import net.minecraft.network.play.server.SSetSlotPacket; import net.minecraft.util.text.ITextComponent; +import org.bukkit.Bukkit; +import org.bukkit.Material; import org.bukkit.craftbukkit.v.entity.CraftHumanEntity; import org.bukkit.craftbukkit.v.inventory.CraftInventory; +import org.bukkit.craftbukkit.v.inventory.CraftItemStack; +import org.bukkit.event.Event; +import org.bukkit.event.inventory.InventoryDragEvent; +import org.bukkit.event.inventory.InventoryType; import org.bukkit.inventory.InventoryView; +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.Redirect; + +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; @Mixin(Container.class) public abstract class ContainerMixin implements ContainerBridge { // @formatter:off @Shadow public void detectAndSendChanges() {} + @Shadow private int dragEvent; + @Shadow protected abstract void resetDrag(); + @Shadow private int dragMode; + @Shadow @Final private Set dragSlots; + @Shadow public List inventorySlots; + @Shadow public abstract boolean canDragIntoSlot(Slot slotIn); + @Shadow public abstract ItemStack transferStackInSlot(PlayerEntity playerIn, int index); + @Shadow public abstract boolean canMergeSlot(ItemStack stack, Slot slotIn); + @Shadow @Final public int windowId; + @Shadow public abstract Slot getSlot(int slotId); // @formatter:on public boolean checkReachable = true; @@ -43,6 +78,269 @@ public abstract class ContainerMixin implements ContainerBridge { this.title = title; } + @Redirect(method = "onContainerClosed", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/player/PlayerEntity;dropItem(Lnet/minecraft/item/ItemStack;Z)Lnet/minecraft/entity/item/ItemEntity;")) + private ItemEntity arclight$cleanBeforeDrop(PlayerEntity playerEntity, ItemStack itemStackIn, boolean unused) { + playerEntity.inventory.setItemStack(ItemStack.EMPTY); + return playerEntity.dropItem(itemStackIn, unused); + } + + /** + * @author IzzelAliz + * @reason + */ + @Overwrite + public ItemStack slotClick(int i, int j, ClickType clickType, PlayerEntity entity) { + ItemStack itemstack = ItemStack.EMPTY; + PlayerInventory playerinventory = entity.inventory; + if (clickType == ClickType.QUICK_CRAFT) { + int i2 = this.dragEvent; + this.dragEvent = Container.getDragEvent(j); + if ((i2 != 1 || this.dragEvent != 2) && i2 != this.dragEvent) { + this.resetDrag(); + } else if (playerinventory.getItemStack().isEmpty()) { + this.resetDrag(); + } else if (this.dragEvent == 0) { + this.dragMode = Container.extractDragMode(j); + if (Container.isValidDragMode(this.dragMode, entity)) { + this.dragEvent = 1; + this.dragSlots.clear(); + } else { + this.resetDrag(); + } + } else if (this.dragEvent == 1) { + Slot slot = this.inventorySlots.get(i); + ItemStack itemstack2 = playerinventory.getItemStack(); + if (slot != null && Container.canAddItemToSlot(slot, itemstack2, true) && slot.isItemValid(itemstack2) && (this.dragMode == 2 || itemstack2.getCount() > this.dragSlots.size()) && this.canDragIntoSlot(slot)) { + this.dragSlots.add(slot); + } + } else if (this.dragEvent == 2) { + if (!this.dragSlots.isEmpty()) { + ItemStack itemstack3 = playerinventory.getItemStack().copy(); + int k = playerinventory.getItemStack().getCount(); + Iterator iterator = this.dragSlots.iterator(); + Map draggedSlots = new HashMap<>(); + while (iterator.hasNext()) { + Slot slot2 = iterator.next(); + ItemStack itemstack4 = playerinventory.getItemStack(); + if (slot2 != null && Container.canAddItemToSlot(slot2, itemstack4, true) && slot2.isItemValid(itemstack4) && (this.dragMode == 2 || itemstack4.getCount() >= this.dragSlots.size()) && this.canDragIntoSlot(slot2)) { + ItemStack itemstack5 = itemstack3.copy(); + int j2 = slot2.getHasStack() ? slot2.getStack().getCount() : 0; + Container.computeStackSize(this.dragSlots, this.dragMode, itemstack5, j2); + int l = Math.min(itemstack5.getMaxStackSize(), slot2.getItemStackLimit(itemstack5)); + if (itemstack5.getCount() > l) { + itemstack5.setCount(l); + } + k -= itemstack5.getCount() - j2; + draggedSlots.put(slot2.slotNumber, itemstack5); + } + } + InventoryView view = this.getBukkitView(); + org.bukkit.inventory.ItemStack newcursor = CraftItemStack.asCraftMirror(itemstack3); + newcursor.setAmount(k); + Map eventmap = new HashMap<>(); + for (Map.Entry ditem : draggedSlots.entrySet()) { + eventmap.put(ditem.getKey(), CraftItemStack.asBukkitCopy(ditem.getValue())); + } + ItemStack oldCursor = playerinventory.getItemStack(); + playerinventory.setItemStack(CraftItemStack.asNMSCopy(newcursor)); + InventoryDragEvent event = new InventoryDragEvent(view, (newcursor.getType() != Material.AIR) ? newcursor : null, CraftItemStack.asBukkitCopy(oldCursor), this.dragMode == 1, eventmap); + Bukkit.getPluginManager().callEvent(event); + boolean needsUpdate = event.getResult() != Event.Result.DEFAULT; + if (event.getResult() != Event.Result.DENY) { + for (Map.Entry dslot : draggedSlots.entrySet()) { + view.setItem(dslot.getKey(), CraftItemStack.asBukkitCopy(dslot.getValue())); + } + if (playerinventory.getItemStack() != null) { + playerinventory.setItemStack(CraftItemStack.asNMSCopy(event.getCursor())); + needsUpdate = true; + } + } else { + playerinventory.setItemStack(oldCursor); + } + if (needsUpdate && entity instanceof ServerPlayerEntity) { + ((ServerPlayerEntity) entity).sendContainerToPlayer((Container) (Object) this); + } + } + this.resetDrag(); + } else { + this.resetDrag(); + } + } else if (this.dragEvent != 0) { + this.resetDrag(); + } else if ((clickType == ClickType.PICKUP || clickType == ClickType.QUICK_MOVE) && (j == 0 || j == 1)) { + if (i == -999) { + if (!playerinventory.getItemStack().isEmpty()) { + if (j == 0) { + ItemStack carried = playerinventory.getItemStack(); + playerinventory.setItemStack(ItemStack.EMPTY); + entity.dropItem(carried, true); + } + if (j == 1) { + entity.dropItem(playerinventory.getItemStack().split(1), true); + } + } + } else if (clickType == ClickType.QUICK_MOVE) { + if (i < 0) { + return ItemStack.EMPTY; + } + Slot slot3 = this.inventorySlots.get(i); + if (slot3 == null || !slot3.canTakeStack(entity)) { + return ItemStack.EMPTY; + } + for (ItemStack itemstack3 = this.transferStackInSlot(entity, i); !itemstack3.isEmpty(); itemstack3 = this.transferStackInSlot(entity, i)) { + if (!ItemStack.areItemsEqual(slot3.getStack(), itemstack3)) { + break; + } + itemstack = itemstack3.copy(); + } + } else { + if (i < 0) { + return ItemStack.EMPTY; + } + Slot slot3 = this.inventorySlots.get(i); + if (slot3 != null) { + ItemStack itemstack3 = slot3.getStack(); + ItemStack itemstack2 = playerinventory.getItemStack(); + if (!itemstack3.isEmpty()) { + itemstack = itemstack3.copy(); + } + if (itemstack3.isEmpty()) { + if (!itemstack2.isEmpty() && slot3.isItemValid(itemstack2)) { + int k2 = (j == 0) ? itemstack2.getCount() : 1; + if (k2 > slot3.getItemStackLimit(itemstack2)) { + k2 = slot3.getItemStackLimit(itemstack2); + } + slot3.putStack(itemstack2.split(k2)); + } + } else if (slot3.canTakeStack(entity)) { + if (itemstack2.isEmpty()) { + if (itemstack3.isEmpty()) { + slot3.putStack(ItemStack.EMPTY); + playerinventory.setItemStack(ItemStack.EMPTY); + } else { + int k2 = (j == 0) ? itemstack3.getCount() : ((itemstack3.getCount() + 1) / 2); + playerinventory.setItemStack(slot3.decrStackSize(k2)); + if (itemstack3.isEmpty()) { + slot3.putStack(ItemStack.EMPTY); + } + slot3.onTake(entity, playerinventory.getItemStack()); + } + } else if (slot3.isItemValid(itemstack2)) { + if (Container.areItemsAndTagsEqual(itemstack3, itemstack2)) { + int k2 = (j == 0) ? itemstack2.getCount() : 1; + if (k2 > slot3.getItemStackLimit(itemstack2) - itemstack3.getCount()) { + k2 = slot3.getItemStackLimit(itemstack2) - itemstack3.getCount(); + } + if (k2 > itemstack2.getMaxStackSize() - itemstack3.getCount()) { + k2 = itemstack2.getMaxStackSize() - itemstack3.getCount(); + } + itemstack2.shrink(k2); + itemstack3.grow(k2); + } else if (itemstack2.getCount() <= slot3.getItemStackLimit(itemstack2)) { + slot3.putStack(itemstack2); + playerinventory.setItemStack(itemstack3); + } + } else if (itemstack2.getMaxStackSize() > 1 && Container.areItemsAndTagsEqual(itemstack3, itemstack2) && !itemstack3.isEmpty()) { + int k2 = itemstack3.getCount(); + if (k2 + itemstack2.getCount() <= itemstack2.getMaxStackSize()) { + itemstack2.grow(k2); + itemstack3 = slot3.decrStackSize(k2); + if (itemstack3.isEmpty()) { + slot3.putStack(ItemStack.EMPTY); + } + slot3.onTake(entity, playerinventory.getItemStack()); + } + } + } + slot3.onSlotChanged(); + if (entity instanceof ServerPlayerEntity && slot3.getSlotStackLimit() != 64) { + ((ServerPlayerEntity) entity).connection.sendPacket(new SSetSlotPacket(this.windowId, slot3.slotNumber, slot3.getStack())); + if (this.getBukkitView().getType() == InventoryType.WORKBENCH || this.getBukkitView().getType() == InventoryType.CRAFTING) { + ((ServerPlayerEntity) entity).connection.sendPacket(new SSetSlotPacket(this.windowId, 0, this.getSlot(0).getStack())); + } + } + } + } + } else if (clickType == ClickType.SWAP && j >= 0 && j < 9) { + Slot slot3 = this.inventorySlots.get(i); + ItemStack itemstack3 = playerinventory.getStackInSlot(j); + ItemStack itemstack2 = slot3.getStack(); + if (!itemstack3.isEmpty() || !itemstack2.isEmpty()) { + if (itemstack3.isEmpty()) { + if (slot3.canTakeStack(entity)) { + playerinventory.setInventorySlotContents(j, itemstack2); + ((SlotBridge) slot3).bridge$onSwapCraft(itemstack2.getCount()); + slot3.putStack(ItemStack.EMPTY); + slot3.onTake(entity, itemstack2); + } + } else if (itemstack2.isEmpty()) { + if (slot3.isItemValid(itemstack3)) { + int k2 = slot3.getItemStackLimit(itemstack3); + if (itemstack3.getCount() > k2) { + slot3.putStack(itemstack3.split(k2)); + } else { + slot3.putStack(itemstack3); + playerinventory.setInventorySlotContents(j, ItemStack.EMPTY); + } + } + } else if (slot3.canTakeStack(entity) && slot3.isItemValid(itemstack3)) { + int k2 = slot3.getItemStackLimit(itemstack3); + if (itemstack3.getCount() > k2) { + slot3.putStack(itemstack3.split(k2)); + slot3.onTake(entity, itemstack2); + if (!playerinventory.addItemStackToInventory(itemstack2)) { + entity.dropItem(itemstack2, true); + } + } else { + slot3.putStack(itemstack3); + playerinventory.setInventorySlotContents(j, itemstack2); + slot3.onTake(entity, itemstack2); + } + } + } + } else if (clickType == ClickType.CLONE && entity.abilities.isCreativeMode && playerinventory.getItemStack().isEmpty() && i >= 0) { + Slot slot3 = this.inventorySlots.get(i); + if (slot3 != null && slot3.getHasStack()) { + ItemStack itemstack3 = slot3.getStack().copy(); + itemstack3.setCount(itemstack3.getMaxStackSize()); + playerinventory.setItemStack(itemstack3); + } + } else if (clickType == ClickType.THROW && playerinventory.getItemStack().isEmpty() && i >= 0) { + Slot slot3 = this.inventorySlots.get(i); + if (slot3 != null && slot3.getHasStack() && slot3.canTakeStack(entity)) { + ItemStack itemstack3 = slot3.decrStackSize((j == 0) ? 1 : slot3.getStack().getCount()); + slot3.onTake(entity, itemstack3); + entity.dropItem(itemstack3, true); + } + } else if (clickType == ClickType.PICKUP_ALL && i >= 0) { + Slot slot3 = this.inventorySlots.get(i); + ItemStack itemstack3 = playerinventory.getItemStack(); + if (!itemstack3.isEmpty() && (slot3 == null || !slot3.getHasStack() || !slot3.canTakeStack(entity))) { + int k = (j == 0) ? 0 : (this.inventorySlots.size() - 1); + int k2 = (j == 0) ? 1 : -1; + for (int l2 = 0; l2 < 2; ++l2) { + for (int i3 = k; i3 >= 0 && i3 < this.inventorySlots.size() && itemstack3.getCount() < itemstack3.getMaxStackSize(); i3 += k2) { + Slot slot4 = this.inventorySlots.get(i3); + if (slot4.getHasStack() && Container.canAddItemToSlot(slot4, itemstack3, true) && slot4.canTakeStack(entity) && this.canMergeSlot(itemstack3, slot4)) { + ItemStack itemstack6 = slot4.getStack(); + if (l2 != 0 || itemstack6.getCount() != itemstack6.getMaxStackSize()) { + int l = Math.min(itemstack3.getMaxStackSize() - itemstack3.getCount(), itemstack6.getCount()); + ItemStack itemstack7 = slot4.decrStackSize(l); + itemstack3.grow(l); + if (itemstack7.isEmpty()) { + slot4.putStack(ItemStack.EMPTY); + } + slot4.onTake(entity, itemstack7); + } + } + } + } + } + this.detectAndSendChanges(); + } + return itemstack; + } + @Override public boolean bridge$isCheckReachable() { return checkReachable; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/DispenserContainerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/DispenserContainerMixin.java index 6a67054b..27a340c0 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/DispenserContainerMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/DispenserContainerMixin.java @@ -17,7 +17,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(DispenserContainer.class) -public class DispenserContainerMixin extends ContainerMixin { +public abstract class DispenserContainerMixin extends ContainerMixin { // @formatter:off @Shadow @Final public IInventory dispenserInventory; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/EnchantmentContainerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/EnchantmentContainerMixin.java index 26e3d364..35098d53 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/EnchantmentContainerMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/EnchantmentContainerMixin.java @@ -54,7 +54,7 @@ public abstract class EnchantmentContainerMixin extends ContainerMixin implement // @formatter:off @Shadow @Final private IInventory tableInventory; - @Shadow @Final private IWorldPosCallable field_217006_g; + @Shadow @Final private IWorldPosCallable worldPosCallable; @Shadow protected abstract float getPower(World world, BlockPos pos); @Shadow @Final private Random rand; @Shadow @Final private IntReferenceHolder xpSeed; @@ -86,7 +86,7 @@ public abstract class EnchantmentContainerMixin extends ContainerMixin implement if (inventoryIn == this.tableInventory) { ItemStack itemstack = inventoryIn.getStackInSlot(0); if (!itemstack.isEmpty()) { - this.field_217006_g.consume((p_217002_2_, p_217002_3_) -> { + this.worldPosCallable.consume((p_217002_2_, p_217002_3_) -> { float power = 0; for (int k = -1; k <= 1; ++k) { @@ -136,7 +136,7 @@ public abstract class EnchantmentContainerMixin extends ContainerMixin implement offers[j] = (enchantment != null) ? new EnchantmentOffer(enchantment, this.worldClue[j], this.enchantLevels[j]) : null; } - PrepareItemEnchantEvent event = new PrepareItemEnchantEvent(player, this.getBukkitView(), ((IWorldPosCallableBridge) this.field_217006_g).bridge$getLocation().getBlock(), item, offers, (int) power); + PrepareItemEnchantEvent event = new PrepareItemEnchantEvent(player, this.getBukkitView(), ((IWorldPosCallableBridge) this.worldPosCallable).bridge$getLocation().getBlock(), item, offers, (int) power); event.setCancelled(!itemstack.isEnchantable()); Bukkit.getPluginManager().callEvent(event); @@ -189,7 +189,7 @@ public abstract class EnchantmentContainerMixin extends ContainerMixin implement } else if (this.enchantLevels[id] <= 0 || itemstack.isEmpty() || (playerIn.experienceLevel < i || playerIn.experienceLevel < this.enchantLevels[id]) && !playerIn.abilities.isCreativeMode) { return false; } else { - this.field_217006_g.consume((p_217003_6_, p_217003_7_) -> { + this.worldPosCallable.consume((p_217003_6_, p_217003_7_) -> { ItemStack itemstack2 = itemstack; List list = this.getEnchantmentList(itemstack, id, this.enchantLevels[id]); if (true || !list.isEmpty()) { @@ -202,7 +202,7 @@ public abstract class EnchantmentContainerMixin extends ContainerMixin implement } CraftItemStack item = CraftItemStack.asCraftMirror(itemstack2); - EnchantItemEvent event = new EnchantItemEvent(((Player) ((PlayerEntityBridge) playerIn).bridge$getBukkitEntity()), this.getBukkitView(), ((IWorldPosCallableBridge) this.field_217006_g).bridge$getLocation().getBlock(), item, this.enchantLevels[i], enchants, i); + EnchantItemEvent event = new EnchantItemEvent(((Player) ((PlayerEntityBridge) playerIn).bridge$getBukkitEntity()), this.getBukkitView(), ((IWorldPosCallableBridge) this.worldPosCallable).bridge$getLocation().getBlock(), item, this.enchantLevels[i], enchants, i); Bukkit.getPluginManager().callEvent(event); int level = event.getExpLevelCost(); @@ -271,6 +271,6 @@ public abstract class EnchantmentContainerMixin extends ContainerMixin implement @Override public IWorldPosCallable bridge$getContainerAccess() { - return this.field_217006_g; + return this.worldPosCallable; } } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/GrindstoneContainerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/GrindstoneContainerMixin.java index b3695d59..8a4b694f 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/GrindstoneContainerMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/GrindstoneContainerMixin.java @@ -18,7 +18,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import io.izzel.arclight.common.bridge.inventory.container.GrindstoneContainerBridge; @Mixin(GrindstoneContainer.class) -public class GrindstoneContainerMixin extends ContainerMixin implements GrindstoneContainerBridge { +public abstract class GrindstoneContainerMixin extends ContainerMixin implements GrindstoneContainerBridge { @Shadow @Final private IInventory inputInventory; @Shadow @Final private IInventory outputInventory; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/HopperContainerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/HopperContainerMixin.java index dae46828..a4d67072 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/HopperContainerMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/HopperContainerMixin.java @@ -17,7 +17,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(HopperContainer.class) -public class HopperContainerMixin extends ContainerMixin { +public abstract class HopperContainerMixin extends ContainerMixin { // @formatter:off @Shadow @Final private IInventory hopperInventory; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/HorseInventoryContainerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/HorseInventoryContainerMixin.java index 44651113..4ada07f6 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/HorseInventoryContainerMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/HorseInventoryContainerMixin.java @@ -17,7 +17,7 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(HorseInventoryContainer.class) -public class HorseInventoryContainerMixin extends ContainerMixin { +public abstract class HorseInventoryContainerMixin extends ContainerMixin { // @formatter:off @Shadow @Final private IInventory horseInventory; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/LecternContainerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/LecternContainerMixin.java index 5d5e9e7b..ece9a5e5 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/LecternContainerMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/LecternContainerMixin.java @@ -21,10 +21,10 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(LecternContainer.class) -public class LecternContainerMixin extends ContainerMixin implements LecternContainerBridge { +public abstract class LecternContainerMixin extends ContainerMixin implements LecternContainerBridge { // @formatter:off - @Shadow @Final private IInventory field_217018_c; + @Shadow @Final private IInventory lecternInventory; // @formatter:on private CraftInventoryView bukkitEntity; @@ -67,7 +67,7 @@ public class LecternContainerMixin extends ContainerMixin implements LecternCont if (bukkitEntity != null) { return bukkitEntity; } - CraftInventoryLectern inventory = new CraftInventoryLectern(this.field_217018_c); + CraftInventoryLectern inventory = new CraftInventoryLectern(this.lecternInventory); bukkitEntity = new CraftInventoryView(this.player, inventory, (Container) (Object) this); return bukkitEntity; } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/LoomContainerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/LoomContainerMixin.java index 730d1c51..c8dfcc2a 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/LoomContainerMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/LoomContainerMixin.java @@ -21,11 +21,11 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import io.izzel.arclight.common.bridge.inventory.container.LoomContainerBridge; @Mixin(LoomContainer.class) -public class LoomContainerMixin extends ContainerMixin implements LoomContainerBridge { +public abstract class LoomContainerMixin extends ContainerMixin implements LoomContainerBridge { // @formatter:off - @Shadow @Final private IInventory field_217040_j; // crafting - @Shadow @Final private IInventory field_217041_k; // result + @Shadow @Final private IInventory inputInventory; + @Shadow @Final private IInventory outputInventory; @Shadow @Final private IWorldPosCallable worldPos; // @formatter:on @@ -50,7 +50,7 @@ public class LoomContainerMixin extends ContainerMixin implements LoomContainerB return bukkitEntity; } - CraftInventoryLoom inventory = new CraftInventoryLoom(this.field_217040_j, this.field_217041_k); + CraftInventoryLoom inventory = new CraftInventoryLoom(this.inputInventory, this.outputInventory); bukkitEntity = new CraftInventoryView(this.player, inventory, (Container) (Object) this); return bukkitEntity; } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/MerchantContainerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/MerchantContainerMixin.java index a891179f..ff9bdbdc 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/MerchantContainerMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/MerchantContainerMixin.java @@ -18,7 +18,7 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(MerchantContainer.class) -public class MerchantContainerMixin extends ContainerMixin { +public abstract class MerchantContainerMixin extends ContainerMixin { // @formatter:off @Shadow @Final private IMerchant merchant; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/PlayerContainerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/PlayerContainerMixin.java index a02d6209..125c45cc 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/PlayerContainerMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/PlayerContainerMixin.java @@ -22,11 +22,11 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(PlayerContainer.class) -public class PlayerContainerMixin extends ContainerMixin { +public abstract class PlayerContainerMixin extends ContainerMixin { // @formatter:off - @Shadow @Final private CraftingInventory field_75181_e; - @Shadow @Final private CraftResultInventory field_75179_f; + @Shadow @Final private CraftingInventory craftMatrix; + @Shadow @Final private CraftResultInventory craftResult; // @formatter:on private CraftInventoryView bukkitEntity; @@ -35,8 +35,8 @@ public class PlayerContainerMixin extends ContainerMixin { @Inject(method = "", at = @At("RETURN")) public void arclight$init(PlayerInventory playerInventory, boolean localWorld, PlayerEntity playerIn, CallbackInfo ci) { this.player = playerInventory; - ((CraftingInventoryBridge) this.field_75181_e).bridge$setOwner(playerInventory.player); - ((CraftingInventoryBridge) this.field_75181_e).bridge$setResultInventory(this.field_75179_f); + ((CraftingInventoryBridge) this.craftMatrix).bridge$setOwner(playerInventory.player); + ((CraftingInventoryBridge) this.craftMatrix).bridge$setResultInventory(this.craftResult); this.setTitle(new TranslationTextComponent("container.crafting")); } @@ -51,7 +51,7 @@ public class PlayerContainerMixin extends ContainerMixin { return bukkitEntity; } - CraftInventoryCrafting inventory = new CraftInventoryCrafting(this.field_75181_e, this.field_75179_f); + CraftInventoryCrafting inventory = new CraftInventoryCrafting(this.craftMatrix, this.craftResult); bukkitEntity = new CraftInventoryView(((PlayerEntityBridge) this.player.player).bridge$getBukkitEntity(), inventory, (Container) (Object) this); return bukkitEntity; } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/RepairContainerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/RepairContainerMixin.java index 93a64a31..e74640ad 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/RepairContainerMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/RepairContainerMixin.java @@ -36,7 +36,7 @@ import java.util.Map; public abstract class RepairContainerMixin extends ContainerMixin { // @formatter:off - @Shadow @Final private IWorldPosCallable field_216980_g; + @Shadow @Final private IWorldPosCallable worldPosCallable; @Shadow @Final private IInventory inputSlots; @Shadow @Final private IInventory outputSlot; @Shadow @Final private PlayerEntity player; @@ -249,7 +249,7 @@ public abstract class RepairContainerMixin extends ContainerMixin { } CraftInventory inventory = new CraftInventoryAnvil( - ((IWorldPosCallableBridge) this.field_216980_g).bridge$getLocation(), this.inputSlots, this.outputSlot, (RepairContainer) (Object) this); + ((IWorldPosCallableBridge) this.worldPosCallable).bridge$getLocation(), this.inputSlots, this.outputSlot, (RepairContainer) (Object) this); bukkitEntity = new CraftInventoryView(((PlayerEntityBridge) this.player).bridge$getBukkitEntity(), inventory, (Container) (Object) this); return bukkitEntity; } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/ShulkerBoxContainerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/ShulkerBoxContainerMixin.java index d8cae61c..e634f345 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/ShulkerBoxContainerMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/ShulkerBoxContainerMixin.java @@ -16,7 +16,7 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(ShulkerBoxContainer.class) -public class ShulkerBoxContainerMixin extends ContainerMixin { +public abstract class ShulkerBoxContainerMixin extends ContainerMixin { // @formatter:off @Shadow @Final private IInventory inventory; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/SlotMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/SlotMixin.java new file mode 100644 index 00000000..c532eb3f --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/SlotMixin.java @@ -0,0 +1,19 @@ +package io.izzel.arclight.common.mixin.core.inventory.container; + +import io.izzel.arclight.common.bridge.inventory.container.SlotBridge; +import net.minecraft.inventory.container.Slot; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +@Mixin(Slot.class) +public abstract class SlotMixin implements SlotBridge { + + // @formatter:off + @Shadow protected abstract void onSwapCraft(int numItemsCrafted); + // @formatter:on + + @Override + public void bridge$onSwapCraft(int numItemsCrafted) { + onSwapCraft(numItemsCrafted); + } +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/StonecutterContainerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/StonecutterContainerMixin.java index aad9050e..12da5884 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/StonecutterContainerMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/StonecutterContainerMixin.java @@ -19,7 +19,7 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(StonecutterContainer.class) -public class StonecutterContainerMixin extends ContainerMixin { +public abstract class StonecutterContainerMixin extends ContainerMixin { // @formatter:off @Shadow @Final public IInventory inputInventory; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/WorkbenchContainerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/WorkbenchContainerMixin.java index fee27096..001443bb 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/WorkbenchContainerMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/WorkbenchContainerMixin.java @@ -40,9 +40,9 @@ import java.util.Optional; public abstract class WorkbenchContainerMixin extends ContainerMixin implements WorkbenchContainerBridge { // @formatter:off - @Mutable @Shadow @Final private CraftingInventory field_75162_e; - @Shadow @Final private CraftResultInventory field_75160_f; - @Accessor("field_217070_e") public abstract IWorldPosCallable bridge$getContainerAccess(); + @Mutable @Shadow @Final private CraftingInventory craftMatrix; + @Shadow @Final private CraftResultInventory craftResult; + @Accessor("worldPosCallable") public abstract IWorldPosCallable bridge$getContainerAccess(); // @formatter:on private CraftInventoryView bukkitEntity; @@ -55,7 +55,7 @@ public abstract class WorkbenchContainerMixin extends ContainerMixin implements private static void a(int p_217066_0_, World p_217066_1_, PlayerEntity p_217066_2_, CraftingInventory p_217066_3_, CraftResultInventory p_217066_4_, Container container) { ArclightCaptures.captureWorkbenchContainer(container); - func_217066_a(p_217066_0_, p_217066_1_, p_217066_2_, p_217066_3_, p_217066_4_); + updateCraftingResult(p_217066_0_, p_217066_1_, p_217066_2_, p_217066_3_, p_217066_4_); } @Inject(method = "onCraftMatrixChanged", at = @At("HEAD")) @@ -68,7 +68,7 @@ public abstract class WorkbenchContainerMixin extends ContainerMixin implements * @reason */ @Overwrite - protected static void func_217066_a(int i, World world, PlayerEntity playerEntity, CraftingInventory inventory, CraftResultInventory resultInventory) { + protected static void updateCraftingResult(int i, World world, PlayerEntity playerEntity, CraftingInventory inventory, CraftResultInventory resultInventory) { Container container = ArclightCaptures.getWorkbenchContainer(); if (!world.isRemote) { ServerPlayerEntity serverplayerentity = (ServerPlayerEntity) playerEntity; @@ -90,8 +90,8 @@ public abstract class WorkbenchContainerMixin extends ContainerMixin implements @Inject(method = "(ILnet/minecraft/entity/player/PlayerInventory;Lnet/minecraft/util/IWorldPosCallable;)V", at = @At("RETURN")) public void arclight$init(int i, PlayerInventory playerInventory, IWorldPosCallable callable, CallbackInfo ci) { - ((CraftingInventoryBridge) this.field_75162_e).bridge$setOwner(playerInventory.player); - ((CraftingInventoryBridge) this.field_75162_e).bridge$setResultInventory(this.field_75160_f); + ((CraftingInventoryBridge) this.craftMatrix).bridge$setOwner(playerInventory.player); + ((CraftingInventoryBridge) this.craftMatrix).bridge$setResultInventory(this.craftResult); this.player = playerInventory; } @@ -101,7 +101,7 @@ public abstract class WorkbenchContainerMixin extends ContainerMixin implements return bukkitEntity; } - CraftInventoryCrafting inventory = new CraftInventoryCrafting(this.field_75162_e, this.field_75160_f); + CraftInventoryCrafting inventory = new CraftInventoryCrafting(this.craftMatrix, this.craftResult); bukkitEntity = new CraftInventoryView(((PlayerEntityBridge) this.player.player).bridge$getBukkitEntity(), inventory, (Container) (Object) this); return bukkitEntity; } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/crafting/RecipeManagerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/crafting/RecipeManagerMixin.java index 7b7a80b1..6eb2adc8 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/crafting/RecipeManagerMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/crafting/RecipeManagerMixin.java @@ -49,6 +49,10 @@ public abstract class RecipeManagerMixin implements RecipeManagerBridge { this.someRecipesErrored = false; Map, Object2ObjectLinkedOpenHashMap>> map = Maps.newHashMap(); + for (IRecipeType type : Registry.RECIPE_TYPE) { + map.put(type, new Object2ObjectLinkedOpenHashMap<>()); + } + for (Map.Entry entry : splashList.entrySet()) { ResourceLocation resourcelocation = entry.getKey(); if (resourcelocation.getPath().startsWith("_")) diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/MinecraftServerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/MinecraftServerMixin.java index 038358fd..1f65f58e 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/MinecraftServerMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/MinecraftServerMixin.java @@ -24,6 +24,8 @@ import net.minecraft.server.MinecraftServer; import net.minecraft.server.management.PlayerProfileCache; import net.minecraft.util.SharedConstants; import net.minecraft.util.Util; +import net.minecraft.util.concurrent.RecursiveEventLoop; +import net.minecraft.util.concurrent.TickDelayedTask; import net.minecraft.util.text.StringTextComponent; import net.minecraft.world.WorldSettings; import net.minecraft.world.WorldType; @@ -65,7 +67,7 @@ import java.util.Date; import java.util.function.BooleanSupplier; @Mixin(MinecraftServer.class) -public abstract class MinecraftServerMixin implements MinecraftServerBridge, ICommandSourceBridge { +public abstract class MinecraftServerMixin extends RecursiveEventLoop implements MinecraftServerBridge, ICommandSourceBridge { // @formatter:off @Shadow private int tickCounter; @@ -91,8 +93,13 @@ public abstract class MinecraftServerMixin implements MinecraftServerBridge, ICo @Shadow private boolean serverStopped; @Shadow protected abstract void stopServer(); @Shadow protected abstract void systemExitNow(); + @Shadow public abstract Commands getCommandManager(); // @formatter:on + public MinecraftServerMixin(String name) { + super(name); + } + public CraftServer server; public OptionSet options; public ConsoleCommandSender console; @@ -169,7 +176,7 @@ public abstract class MinecraftServerMixin implements MinecraftServerBridge, ICo this.serverTime += 50L; if (this.startProfiling) { this.startProfiling = false; - this.profiler.func_219899_d().func_219939_d(); + this.profiler.getFixedProfiler().enable(); } this.profiler.startTick(); @@ -319,9 +326,13 @@ public abstract class MinecraftServerMixin implements MinecraftServerBridge, ICo processQueue.add(runnable); } + public CommandSender getBukkitSender(CommandSource wrapper) { + return console; + } + @Override public CommandSender bridge$getBukkitSender(CommandSource wrapper) { - return console; + return getBukkitSender(wrapper); } private static MinecraftServer getServer() { diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/dedicated/DedicatedServerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/dedicated/DedicatedServerMixin.java index f87d5bdf..38d46bd2 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/dedicated/DedicatedServerMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/dedicated/DedicatedServerMixin.java @@ -2,18 +2,23 @@ package io.izzel.arclight.common.mixin.core.server.dedicated; import io.izzel.arclight.common.mixin.core.server.MinecraftServerMixin; import io.izzel.arclight.common.mod.server.BukkitRegistry; +import net.minecraft.command.CommandSource; +import net.minecraft.command.Commands; import net.minecraft.network.rcon.RConConsoleSource; import net.minecraft.server.dedicated.DedicatedServer; -import net.minecraft.util.text.ITextComponent; import org.bukkit.Bukkit; import org.bukkit.craftbukkit.v.CraftServer; import org.bukkit.craftbukkit.v.command.CraftRemoteConsoleCommandSender; +import org.bukkit.event.server.RemoteServerCommandEvent; +import org.bukkit.event.server.ServerCommandEvent; import org.bukkit.plugin.PluginLoadOrder; 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.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @@ -24,6 +29,10 @@ public abstract class DedicatedServerMixin extends MinecraftServerMixin { @Shadow @Final public RConConsoleSource rconConsoleSource; // @formatter:on + public DedicatedServerMixin(String name) { + super(name); + } + @Inject(method = "init", at = @At(value = "INVOKE", shift = At.Shift.AFTER, target = "Lnet/minecraft/server/dedicated/DedicatedServer;setPlayerList(Lnet/minecraft/server/management/PlayerList;)V")) public void arclight$loadPlugins(CallbackInfoReturnable cir) { BukkitRegistry.unlockRegistries(); @@ -37,10 +46,37 @@ public abstract class DedicatedServerMixin extends MinecraftServerMixin { this.remoteConsole = new CraftRemoteConsoleCommandSender(this.rconConsoleSource); } - @Inject(method = "sendMessage", cancellable = true, at = @At("HEAD")) - public void arclight$consoleLog(ITextComponent message, CallbackInfo ci) { - Bukkit.getConsoleSender().sendMessage(message.getFormattedText()); - ci.cancel(); + @Redirect(method = "executePendingCommands", at = @At(value = "INVOKE", target = "Lnet/minecraft/command/Commands;handleCommand(Lnet/minecraft/command/CommandSource;Ljava/lang/String;)I")) + private int arclight$serverCommandEvent(Commands commands, CommandSource source, String command) { + ServerCommandEvent event = new ServerCommandEvent(console, command); + Bukkit.getPluginManager().callEvent(event); + if (!event.isCancelled()) { + return commands.handleCommand(source, event.getCommand()); + } + return 0; + } + + /** + * @author IzzelAliz + * @reason + */ + @Overwrite + public String handleRConCommand(String command) { + this.rconConsoleSource.resetLog(); + this.runImmediately(() -> { + RemoteServerCommandEvent event = new RemoteServerCommandEvent(remoteConsole, command); + Bukkit.getPluginManager().callEvent(event); + if (event.isCancelled()) { + return; + } + ServerCommandEvent event2 = new ServerCommandEvent(console, event.getCommand()); + Bukkit.getPluginManager().callEvent(event2); + if (event2.isCancelled()) { + return; + } + this.getCommandManager().handleCommand(this.rconConsoleSource.getCommandSource(), event2.getCommand()); + }); + return this.rconConsoleSource.getLogContents(); } @Inject(method = "systemExitNow", at = @At("RETURN")) diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/tileentity/CommandBlockLogicMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/tileentity/CommandBlockLogicMixin.java index 03b7c583..c182c6d0 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/tileentity/CommandBlockLogicMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/tileentity/CommandBlockLogicMixin.java @@ -1,12 +1,20 @@ package io.izzel.arclight.common.mixin.core.tileentity; +import com.google.common.base.Joiner; +import io.izzel.arclight.common.bridge.command.CommandSourceBridge; +import net.minecraft.command.CommandSource; +import net.minecraft.command.Commands; import net.minecraft.tileentity.CommandBlockLogic; import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.StringTextComponent; +import org.bukkit.Bukkit; +import org.bukkit.craftbukkit.v.CraftServer; +import org.bukkit.event.server.ServerCommandEvent; 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; @Mixin(CommandBlockLogic.class) @@ -16,11 +24,43 @@ public class CommandBlockLogicMixin { @Shadow private ITextComponent customName; // @formatter:on - @Inject(method = "setName", cancellable = true, at = @At("HEAD")) + @Redirect(method = "trigger", at = @At(value = "INVOKE", target = "Lnet/minecraft/command/Commands;handleCommand(Lnet/minecraft/command/CommandSource;Ljava/lang/String;)I")) + private int arclight$serverCommand(Commands commands, CommandSource sender, String command) { + Joiner joiner = Joiner.on(" "); + if (command.startsWith("/")) { + command = command.substring(1); + } + + ServerCommandEvent event = new ServerCommandEvent(((CommandSourceBridge) sender).bridge$getBukkitSender(), command); + Bukkit.getPluginManager().callEvent(event); + if (event.isCancelled()) { + return 0; + } + command = event.getCommand(); + + String[] args = command.split(" "); + + String cmd = args[0]; + if (cmd.startsWith("minecraft:")) cmd = cmd.substring("minecraft:".length()); + if (cmd.startsWith("bukkit:")) cmd = cmd.substring("bukkit:".length()); + + if (cmd.equalsIgnoreCase("stop") || cmd.equalsIgnoreCase("kick") || cmd.equalsIgnoreCase("op") + || cmd.equalsIgnoreCase("deop") || cmd.equalsIgnoreCase("ban") || cmd.equalsIgnoreCase("ban-ip") + || cmd.equalsIgnoreCase("pardon") || cmd.equalsIgnoreCase("pardon-ip") || cmd.equalsIgnoreCase("reload")) { + return 0; + } + + if (((CraftServer) Bukkit.getServer()).getCommandBlockOverride(args[0])) { + args[0] = "minecraft:" + args[0]; + } + + return commands.handleCommand(sender, joiner.join(args)); + } + + @Inject(method = "setName", at = @At("RETURN")) public void arclight$setName(ITextComponent nameIn, CallbackInfo ci) { - if (nameIn == null) { + if (this.customName == null) { this.customName = new StringTextComponent("@"); - ci.cancel(); } } } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/tileentity/CommandBlockTileEntity1Mixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/tileentity/CommandBlockTileEntity1Mixin.java index 86736306..7b231369 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/tileentity/CommandBlockTileEntity1Mixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/tileentity/CommandBlockTileEntity1Mixin.java @@ -13,8 +13,12 @@ public class CommandBlockTileEntity1Mixin implements ICommandSourceBridge { @Shadow(aliases = {"this$0", "field_145767_a"}, remap = false) private CommandBlockTileEntity outerThis; - @Override - public CommandSender bridge$getBukkitSender(CommandSource wrapper) { + public CommandSender getBukkitSender(CommandSource wrapper) { return new CraftBlockCommandSender(wrapper, outerThis); } + + @Override + public CommandSender bridge$getBukkitSender(CommandSource wrapper) { + return getBukkitSender(wrapper); + } } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/tileentity/LecternTileEntityMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/tileentity/LecternTileEntityMixin.java index 84be7792..874f4359 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/tileentity/LecternTileEntityMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/tileentity/LecternTileEntityMixin.java @@ -73,8 +73,12 @@ public abstract class LecternTileEntityMixin extends TileEntityMixin implements return false; } - @Override - public CommandSender bridge$getBukkitSender(CommandSource wrapper) { + public CommandSender getBukkitSender(CommandSource wrapper) { return wrapper.getEntity() != null ? ((EntityBridge) wrapper.getEntity()).bridge$getBukkitSender(wrapper) : new CraftBlockCommandSender(wrapper, (TileEntity) (Object) this); } + + @Override + public CommandSender bridge$getBukkitSender(CommandSource wrapper) { + return getBukkitSender(wrapper); + } } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/tileentity/SignTileEntityMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/tileentity/SignTileEntityMixin.java index c2f97dc0..19e8d083 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/tileentity/SignTileEntityMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/tileentity/SignTileEntityMixin.java @@ -63,8 +63,12 @@ public abstract class SignTileEntityMixin extends TileEntityMixin implements Sig return false; } - @Override - public CommandSender bridge$getBukkitSender(CommandSource wrapper) { + public CommandSender getBukkitSender(CommandSource wrapper) { return wrapper.getEntity() != null ? ((EntityBridge) wrapper.getEntity()).bridge$getBukkitSender(wrapper) : new CraftBlockCommandSender(wrapper, (TileEntity) (Object) this); } + + @Override + public CommandSender bridge$getBukkitSender(CommandSource wrapper) { + return getBukkitSender(wrapper); + } } 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/chunk/ChunkMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/chunk/ChunkMixin.java index 181f0e63..c303df30 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/chunk/ChunkMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/chunk/ChunkMixin.java @@ -2,20 +2,13 @@ package io.izzel.arclight.common.mixin.core.world.chunk; import io.izzel.arclight.common.bridge.world.WorldBridge; import io.izzel.arclight.common.bridge.world.chunk.ChunkBridge; -import net.minecraft.block.Block; import net.minecraft.block.BlockState; -import net.minecraft.fluid.Fluid; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.ChunkPos; -import net.minecraft.world.ITickList; import net.minecraft.world.World; -import net.minecraft.world.biome.Biome; import net.minecraft.world.chunk.Chunk; import net.minecraft.world.chunk.ChunkPrimer; -import net.minecraft.world.chunk.ChunkSection; -import net.minecraft.world.chunk.UpgradeData; import org.bukkit.Bukkit; -import org.bukkit.craftbukkit.v.CraftChunk; import org.bukkit.event.world.ChunkLoadEvent; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; @@ -27,7 +20,6 @@ import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import javax.annotation.Nullable; -import java.util.function.Consumer; @Mixin(Chunk.class) public abstract class ChunkMixin implements ChunkBridge { @@ -136,12 +128,6 @@ public abstract class ChunkMixin implements ChunkBridge { this.mustNotSave = !unloadEvent.isSaveChunk(); } - @Inject(method = "(Lnet/minecraft/world/World;Lnet/minecraft/util/math/ChunkPos;[Lnet/minecraft/world/biome/Biome;Lnet/minecraft/world/chunk/UpgradeData;Lnet/minecraft/world/ITickList;Lnet/minecraft/world/ITickList;J[Lnet/minecraft/world/chunk/ChunkSection;Ljava/util/function/Consumer;)V", - at = @At("RETURN")) - public void arclight$setBukkitChunk(World worldIn, ChunkPos p_i49946_2_, Biome[] p_i49946_3_, UpgradeData p_i49946_4_, ITickList p_i49946_5_, ITickList p_i49946_6_, long p_i49946_7_, ChunkSection[] p_i49946_9_, Consumer p_i49946_10_, CallbackInfo ci) { - this.bukkitChunk = new CraftChunk((Chunk) (Object) this); - } - @Inject(method = "(Lnet/minecraft/world/World;Lnet/minecraft/world/chunk/ChunkPrimer;)V", at = @At("RETURN")) public void arclight$setNeedsDecoration(World worldIn, ChunkPrimer p_i49947_2_, CallbackInfo ci) { diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/server/ServerChunkProviderMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/server/ServerChunkProviderMixin.java index 2dc42ce1..192642c0 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/server/ServerChunkProviderMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/server/ServerChunkProviderMixin.java @@ -41,6 +41,7 @@ public abstract class ServerChunkProviderMixin implements ServerChunkProviderBri @Shadow protected abstract void invalidateCaches(); @Shadow @Nullable protected abstract ChunkHolder func_217213_a(long chunkPosIn); @Shadow protected abstract boolean func_217235_l(); + @Shadow protected abstract boolean func_217224_a(@Nullable ChunkHolder chunkHolderIn, int p_217224_2_); @Invoker("func_217235_l") public abstract boolean bridge$tickDistanceManager(); @Accessor("lightManager") public abstract ServerWorldLightManager bridge$getLightManager(); // @formatter:on @@ -57,12 +58,12 @@ public abstract class ServerChunkProviderMixin implements ServerChunkProviderBri ChunkHolder chunkholder = this.func_217213_a(i); boolean unloading = false; if (chunkholder != null) { - ChunkHolder.LocationType chunkStatus = ChunkHolder.func_219286_c(((ChunkHolderBridge) chunkholder).bridge$getOldTicketLevel()); - ChunkHolder.LocationType currentStatus = ChunkHolder.func_219286_c(chunkholder.func_219299_i()); - unloading = chunkStatus.func_219065_a(ChunkHolder.LocationType.BORDER) && !currentStatus.func_219065_a(ChunkHolder.LocationType.BORDER); + ChunkHolder.LocationType chunkStatus = ChunkHolder.getLocationTypeFromLevel(((ChunkHolderBridge) chunkholder).bridge$getOldTicketLevel()); + ChunkHolder.LocationType currentStatus = ChunkHolder.getLocationTypeFromLevel(chunkholder.getChunkLevel()); + unloading = chunkStatus.isAtLeast(ChunkHolder.LocationType.BORDER) && !currentStatus.isAtLeast(ChunkHolder.LocationType.BORDER); } if (load && !unloading) { - this.ticketManager.func_219356_a(TicketType.UNKNOWN, chunkpos, j, chunkpos); + this.ticketManager.registerWithLevel(TicketType.UNKNOWN, chunkpos, j, chunkpos); if (this.func_217224_a(chunkholder, j)) { IProfiler iprofiler = this.world.getProfiler(); iprofiler.startSection("chunkLoad"); @@ -78,15 +79,6 @@ public abstract class ServerChunkProviderMixin implements ServerChunkProviderBri return this.func_217224_a(chunkholder, j) ? ChunkHolder.MISSING_CHUNK_FUTURE : chunkholder.func_219276_a(requiredStatus, this.chunkManager); } - /** - * @author IzzelAliz - * @reason - */ - @Overwrite - private boolean func_217224_a(@Nullable ChunkHolder chunkHolderIn, int p_217224_2_) { - return chunkHolderIn == null || ((ChunkHolderBridge) chunkHolderIn).bridge$getOldTicketLevel() > p_217224_2_; - } - public void close(boolean save) throws IOException { if (save) { this.save(true); @@ -115,7 +107,7 @@ public abstract class ServerChunkProviderMixin implements ServerChunkProviderBri this.purgeUnload(); } - @Redirect(method = "func_217224_a", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/server/ChunkHolder;func_219299_i()I")) + @Redirect(method = "func_217224_a", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/server/ChunkHolder;getChunkLevel()I")) public int arclight$useOldTicketLevel(ChunkHolder chunkHolder) { return ((ChunkHolderBridge) chunkHolder).bridge$getOldTicketLevel(); } 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/java/io/izzel/arclight/common/mixin/v1_15/command/impl/TeleportCommandMixin_1_15.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/command/impl/TeleportCommandMixin_1_15.java new file mode 100644 index 00000000..1fd6f5f5 --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/command/impl/TeleportCommandMixin_1_15.java @@ -0,0 +1,102 @@ +package io.izzel.arclight.common.mixin.v1_15.command.impl; + +import io.izzel.arclight.common.bridge.entity.EntityBridge; +import io.izzel.arclight.common.bridge.network.play.ServerPlayNetHandlerBridge; +import io.izzel.arclight.common.bridge.world.server.ServerWorldBridge; +import net.minecraft.command.CommandSource; +import net.minecraft.command.impl.TeleportCommand; +import net.minecraft.entity.Entity; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.player.ServerPlayerEntity; +import net.minecraft.network.play.server.SPlayerPositionLookPacket; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.ChunkPos; +import net.minecraft.util.math.MathHelper; +import net.minecraft.world.server.ServerWorld; +import net.minecraft.world.server.TicketType; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.craftbukkit.v.CraftWorld; +import org.bukkit.event.entity.EntityTeleportEvent; +import org.bukkit.event.player.PlayerTeleportEvent; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; + +import javax.annotation.Nullable; +import java.util.Set; + +@Mixin(TeleportCommand.class) +public class TeleportCommandMixin_1_15 { + + /** + * @author IzzelAliz + * @reason + */ + @Overwrite + private static void teleport(CommandSource source, Entity entityIn, ServerWorld worldIn, double x, double y, double z, Set relativeList, float yaw, float pitch, @Nullable TeleportCommand.Facing facing) { + if (entityIn instanceof ServerPlayerEntity) { + ChunkPos chunkpos = new ChunkPos(new BlockPos(x, y, z)); + worldIn.getChunkProvider().registerTicket(TicketType.POST_TELEPORT, chunkpos, 1, entityIn.getEntityId()); + entityIn.stopRiding(); + if (((ServerPlayerEntity) entityIn).isSleeping()) { + ((ServerPlayerEntity) entityIn).stopSleepInBed(true, true); + } + + ((ServerPlayNetHandlerBridge) ((ServerPlayerEntity) entityIn).connection).bridge$pushTeleportCause(PlayerTeleportEvent.TeleportCause.COMMAND); + if (worldIn == entityIn.world) { + ((ServerPlayerEntity) entityIn).connection.setPlayerLocation(x, y, z, yaw, pitch, relativeList); + } else { + ((ServerPlayerEntity) entityIn).teleport(worldIn, x, y, z, yaw, pitch); + } + + entityIn.setRotationYawHead(yaw); + } else { + float f1 = MathHelper.wrapDegrees(yaw); + float f = MathHelper.wrapDegrees(pitch); + f = MathHelper.clamp(f, -90.0F, 90.0F); + + Location to = new Location(((ServerWorldBridge) worldIn).bridge$getWorld(), x, y, z, f1, f); + EntityTeleportEvent event = new EntityTeleportEvent(((EntityBridge) entityIn).bridge$getBukkitEntity(), ((EntityBridge) entityIn).bridge$getBukkitEntity().getLocation(), to); + Bukkit.getPluginManager().callEvent(event); + if (event.isCancelled()) { + return; + } + to = event.getTo(); + x = to.getX(); + y = to.getY(); + z = to.getZ(); + f1 = to.getYaw(); + f = to.getPitch(); + worldIn = ((CraftWorld) to.getWorld()).getHandle(); + + if (worldIn == entityIn.world) { + entityIn.setLocationAndAngles(x, y, z, f1, f); + entityIn.setRotationYawHead(f1); + } else { + entityIn.detach(); + entityIn.dimension = worldIn.dimension.getType(); + Entity entity = entityIn; + entityIn = entityIn.getType().create(worldIn); + if (entityIn == null) { + return; + } + + entityIn.copyDataFromOld(entity); + entityIn.setLocationAndAngles(x, y, z, f1, f); + entityIn.setRotationYawHead(f1); + worldIn.addFromAnotherDimension(entityIn); + entity.removed = true; + } + } + + if (facing != null) { + facing.updateLook(source, entityIn); + } + + if (!(entityIn instanceof LivingEntity) || !((LivingEntity) entityIn).isElytraFlying()) { + entityIn.setMotion(entityIn.getMotion().mul(1.0D, 0.0D, 1.0D)); + entityIn.onGround = true; + } + + } +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/command/impl/TimeCommandMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/command/impl/TimeCommandMixin.java new file mode 100644 index 00000000..2831c2dc --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/command/impl/TimeCommandMixin.java @@ -0,0 +1,32 @@ +package io.izzel.arclight.common.mixin.v1_15.command.impl; + +import io.izzel.arclight.common.bridge.world.server.ServerWorldBridge; +import net.minecraft.command.impl.TimeCommand; +import net.minecraft.world.server.ServerWorld; +import org.bukkit.Bukkit; +import org.bukkit.event.world.TimeSkipEvent; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +@Mixin(TimeCommand.class) +public class TimeCommandMixin { + + @Redirect(method = "addTime", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/server/ServerWorld;setDayTime(J)V")) + private static void arclight$addTimeEvent(ServerWorld serverWorld, long time) { + TimeSkipEvent event = new TimeSkipEvent(((ServerWorldBridge) serverWorld).bridge$getWorld(), TimeSkipEvent.SkipReason.COMMAND, time - serverWorld.getDayTime()); + Bukkit.getPluginManager().callEvent(event); + if (!event.isCancelled()) { + serverWorld.setDayTime(serverWorld.getDayTime() + event.getSkipAmount()); + } + } + + @Redirect(method = "setTime", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/server/ServerWorld;setDayTime(J)V")) + private static void arclight$setTimeEvent(ServerWorld serverWorld, long time) { + TimeSkipEvent event = new TimeSkipEvent(((ServerWorldBridge) serverWorld).bridge$getWorld(), TimeSkipEvent.SkipReason.COMMAND, time - serverWorld.getDayTime()); + Bukkit.getPluginManager().callEvent(event); + if (!event.isCancelled()) { + serverWorld.setDayTime(serverWorld.getDayTime() + event.getSkipAmount()); + } + } +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/enchantment/FrostWalkerEnchantmentMixin_1_15.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/enchantment/FrostWalkerEnchantmentMixin_1_15.java new file mode 100644 index 00000000..c1816219 --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/enchantment/FrostWalkerEnchantmentMixin_1_15.java @@ -0,0 +1,52 @@ +package io.izzel.arclight.common.mixin.v1_15.enchantment; + +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.block.FlowingFluidBlock; +import net.minecraft.block.material.Material; +import net.minecraft.enchantment.FrostWalkerEnchantment; +import net.minecraft.entity.LivingEntity; +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.shapes.ISelectionContext; +import net.minecraft.world.World; +import net.minecraftforge.common.util.BlockSnapshot; +import net.minecraftforge.event.ForgeEventFactory; +import org.bukkit.craftbukkit.v.event.CraftEventFactory; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; + +@Mixin(FrostWalkerEnchantment.class) +public class FrostWalkerEnchantmentMixin_1_15 { + + /** + * @author IzzelAliz + * @reason + */ + @Overwrite + public static void freezeNearby(LivingEntity living, World worldIn, BlockPos pos, int level) { + if (living.onGround) { + BlockState blockstate = Blocks.FROSTED_ICE.getDefaultState(); + float f = (float) Math.min(16, 2 + level); + BlockPos.Mutable blockpos$mutable = new BlockPos.Mutable(); + + for (BlockPos blockpos : BlockPos.getAllInBoxMutable(pos.add(-f, -1.0D, -f), pos.add(f, -1.0D, f))) { + if (blockpos.withinDistance(living.getPositionVec(), f)) { + blockpos$mutable.setPos(blockpos.getX(), blockpos.getY() + 1, blockpos.getZ()); + BlockState blockstate1 = worldIn.getBlockState(blockpos$mutable); + if (blockstate1.isAir(worldIn, blockpos$mutable)) { + BlockState blockstate2 = worldIn.getBlockState(blockpos); + boolean isFull = blockstate2.getBlock() == Blocks.WATER && blockstate2.get(FlowingFluidBlock.LEVEL) == 0; //TODO: Forge, modded waters? + if (blockstate2.getMaterial() == Material.WATER && isFull && blockstate.isValidPosition(worldIn, blockpos) && worldIn.func_226663_a_(blockstate, blockpos, ISelectionContext.dummy()) && !ForgeEventFactory.onBlockPlace(living, new BlockSnapshot(worldIn, blockpos, blockstate2), Direction.UP)) { + worldIn.setBlockState(blockpos, blockstate); + if (CraftEventFactory.handleBlockFormEvent(worldIn, blockpos, blockstate, living)) { + worldIn.getPendingBlockTicks().scheduleTick(blockpos, Blocks.FROSTED_ICE, MathHelper.nextInt(living.getRNG(), 60, 120)); + } + } + } + } + } + } + } +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/entity/EntityMixin_1_15.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/entity/EntityMixin_1_15.java new file mode 100644 index 00000000..54401f09 --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/entity/EntityMixin_1_15.java @@ -0,0 +1,159 @@ +package io.izzel.arclight.common.mixin.v1_15.entity; + +import io.izzel.arclight.common.bridge.entity.EntityBridge; +import io.izzel.arclight.common.bridge.entity.InternalEntityBridge; +import net.minecraft.block.pattern.BlockPattern; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityType; +import net.minecraft.entity.MobEntity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.server.MinecraftServer; +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.World; +import net.minecraft.world.dimension.DimensionType; +import net.minecraft.world.gen.Heightmap; +import net.minecraft.world.server.ServerWorld; +import net.minecraftforge.common.ForgeHooks; +import net.minecraftforge.common.util.ITeleporter; +import org.bukkit.craftbukkit.v.CraftWorld; +import org.bukkit.craftbukkit.v.event.CraftEventFactory; +import org.bukkit.event.entity.EntityPortalEvent; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; +import org.spongepowered.asm.mixin.Shadow; + +import javax.annotation.Nullable; + +@Mixin(Entity.class) +public abstract class EntityMixin_1_15 { + + // @formatter:off + @Shadow public World world; + @Shadow @Deprecated public boolean removed; + @Shadow @Nullable public abstract MinecraftServer getServer(); + @Shadow public DimensionType dimension; + @Shadow public abstract void detach(); + @Shadow public float rotationYaw; + @Shadow public float rotationPitch; + @Shadow public abstract void setMotion(Vec3d motionIn); + @Shadow public abstract void remove(boolean keepData); + @Shadow public abstract Vec3d getMotion(); + @Shadow public abstract double getPosX(); + @Shadow public abstract double getPosZ(); + @Shadow public abstract Vec3d getLastPortalVec(); + @Shadow public abstract double getPosY(); + @Shadow public abstract Direction getTeleportDirection(); + @Shadow public abstract EntityType getType(); + // @formatter:on + + /** + * @author IzzelAliz + * @reason + */ + @Overwrite + @Nullable + public Entity changeDimension(DimensionType destination, ITeleporter teleporter) { + BlockPos location = ((InternalEntityBridge) this).internal$capturedPos(); + if (!ForgeHooks.onTravelToDimension((Entity) (Object) this, destination)) return null; + if (!this.world.isRemote && !this.removed) { + this.world.getProfiler().startSection("changeDimension"); + MinecraftServer minecraftserver = this.getServer(); + DimensionType dimensiontype = this.dimension; + ServerWorld serverworld = minecraftserver.getWorld(dimensiontype); + ServerWorld[] serverworld1 = new ServerWorld[]{minecraftserver.getWorld(destination)}; + + if (serverworld1 == null) { + return null; + } + //this.dimension = destination; + //this.detach(); + this.world.getProfiler().startSection("reposition"); + Entity transportedEntity = teleporter.placeEntity((Entity) (Object) this, serverworld, serverworld1[0], this.rotationYaw, spawnPortal -> { //Forge: Start vanilla logic + Vec3d vec3d = this.getMotion(); + float f = 0.0F; + BlockPos blockpos; + if (dimensiontype == DimensionType.THE_END && destination == DimensionType.OVERWORLD) { + EntityPortalEvent event = CraftEventFactory.callEntityPortalEvent((Entity) (Object) this, serverworld1[0], serverworld1[0].getHeight(Heightmap.Type.MOTION_BLOCKING_NO_LEAVES, serverworld1[0].getSpawnPoint()), 0); + if (event == null) { + return null; + } + serverworld1[0] = ((CraftWorld) event.getTo().getWorld()).getHandle(); + blockpos = new BlockPos(event.getTo().getX(), event.getTo().getY(), event.getTo().getZ()); + //blockpos = serverworld1[0].getHeight(Heightmap.Type.MOTION_BLOCKING_NO_LEAVES, serverworld1[0].getSpawnPoint()); + } else if (destination == DimensionType.THE_END) { + EntityPortalEvent event = CraftEventFactory.callEntityPortalEvent((Entity) (Object) this, serverworld1[0], (serverworld1[0].getSpawnCoordinate() != null) ? serverworld1[0].getSpawnCoordinate() : serverworld1[0].getSpawnPoint(), 0); + if (event == null) { + return null; + } + serverworld1[0] = ((CraftWorld) event.getTo().getWorld()).getHandle(); + blockpos = new BlockPos(event.getTo().getX(), event.getTo().getY(), event.getTo().getZ()); + //blockpos = serverworld1[0].getSpawnCoordinate(); + } else { + double movementFactor = serverworld.getDimension().getMovementFactor() / serverworld1[0].getDimension().getMovementFactor(); + double d0 = this.getPosX() * movementFactor; + double d1 = this.getPosZ() * movementFactor; + + double d3 = Math.min(-2.9999872E7D, serverworld1[0].getWorldBorder().minX() + 16.0D); + double d4 = Math.min(-2.9999872E7D, serverworld1[0].getWorldBorder().minZ() + 16.0D); + double d5 = Math.min(2.9999872E7D, serverworld1[0].getWorldBorder().maxX() - 16.0D); + double d6 = Math.min(2.9999872E7D, serverworld1[0].getWorldBorder().maxZ() - 16.0D); + d0 = MathHelper.clamp(d0, d3, d5); + d1 = MathHelper.clamp(d1, d4, d6); + Vec3d vec3d1 = this.getLastPortalVec(); + blockpos = new BlockPos(d0, this.getPosY(), d1); + + EntityPortalEvent event2 = CraftEventFactory.callEntityPortalEvent((Entity) (Object) this, serverworld1[0], blockpos, 128); + if (event2 == null) { + return null; + } + serverworld1[0] = ((CraftWorld) event2.getTo().getWorld()).getHandle(); + blockpos = new BlockPos(event2.getTo().getX(), event2.getTo().getY(), event2.getTo().getZ()); + int searchRadius = event2.getSearchRadius(); + // todo 实现 radius + + if (spawnPortal) { + BlockPattern.PortalInfo blockpattern$portalinfo = serverworld1[0].getDefaultTeleporter().placeInExistingPortal(blockpos, vec3d, this.getTeleportDirection(), vec3d1.x, vec3d1.y, (Object) this instanceof PlayerEntity); + if (blockpattern$portalinfo == null) { + return null; + } + + blockpos = new BlockPos(blockpattern$portalinfo.pos); + vec3d = blockpattern$portalinfo.motion; + f = (float) blockpattern$portalinfo.rotation; + } + } + + this.dimension = destination; + this.detach(); + + this.world.getProfiler().endStartSection("reloading"); + Entity entity = this.getType().create(serverworld1[0]); + if (entity != null) { + entity.copyDataFromOld((Entity) (Object) this); + entity.moveToBlockPosAndAngles(blockpos, entity.rotationYaw + f, entity.rotationPitch); + entity.setMotion(vec3d); + serverworld1[0].addFromAnotherDimension(entity); + + ((InternalEntityBridge) this).internal$getBukkitEntity().setHandle(entity); + ((EntityBridge) entity).bridge$setBukkitEntity(((InternalEntityBridge) this).internal$getBukkitEntity()); + if ((Object) this instanceof MobEntity) { + ((MobEntity) (Object) this).clearLeashed(true, false); + } + } + return entity; + });//Forge: End vanilla logic + + this.remove(false); + this.world.getProfiler().endSection(); + serverworld.resetUpdateEntityTick(); + serverworld1[0].resetUpdateEntityTick(); + this.world.getProfiler().endSection(); + return transportedEntity; + } else { + return null; + } + } +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/world/biome/BiomeContainerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/world/biome/BiomeContainerMixin.java new file mode 100644 index 00000000..8377a5e7 --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/world/biome/BiomeContainerMixin.java @@ -0,0 +1,24 @@ +package io.izzel.arclight.common.mixin.v1_15.world.biome; + +import net.minecraft.util.math.MathHelper; +import net.minecraft.world.biome.Biome; +import net.minecraft.world.biome.BiomeContainer; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +@Mixin(BiomeContainer.class) +public class BiomeContainerMixin { + + // @formatter:off + @Shadow @Final private Biome[] biomes; + @Shadow @Final private static int WIDTH_BITS; + // @formatter:on + + public void setBiome(int i, int j, int k, Biome biome) { + int l = i & BiomeContainer.HORIZONTAL_MASK; + int i2 = MathHelper.clamp(j, 0, BiomeContainer.VERTICAL_MASK); + int j2 = k & BiomeContainer.HORIZONTAL_MASK; + this.biomes[i2 << WIDTH_BITS + WIDTH_BITS | j2 << WIDTH_BITS | l] = biome; + } +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/world/chunk/ChunkMixin_1_15.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/world/chunk/ChunkMixin_1_15.java new file mode 100644 index 00000000..e94e59b6 --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/world/chunk/ChunkMixin_1_15.java @@ -0,0 +1,28 @@ +package io.izzel.arclight.common.mixin.v1_15.world.chunk; + +import io.izzel.arclight.common.bridge.world.chunk.ChunkBridge; +import net.minecraft.block.Block; +import net.minecraft.fluid.Fluid; +import net.minecraft.util.math.ChunkPos; +import net.minecraft.util.palette.UpgradeData; +import net.minecraft.world.ITickList; +import net.minecraft.world.World; +import net.minecraft.world.biome.BiomeContainer; +import net.minecraft.world.chunk.Chunk; +import net.minecraft.world.chunk.ChunkSection; +import org.bukkit.craftbukkit.v.CraftChunk; +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.function.Consumer; + +@Mixin(Chunk.class) +public abstract class ChunkMixin_1_15 implements ChunkBridge { + + @Inject(method = "(Lnet/minecraft/world/World;Lnet/minecraft/util/math/ChunkPos;Lnet/minecraft/world/biome/BiomeContainer;Lnet/minecraft/util/palette/UpgradeData;Lnet/minecraft/world/ITickList;Lnet/minecraft/world/ITickList;J[Lnet/minecraft/world/chunk/ChunkSection;Ljava/util/function/Consumer;)V", at = @At("RETURN")) + private void arclight$init(World worldIn, ChunkPos chunkPosIn, BiomeContainer biomeContainerIn, UpgradeData upgradeDataIn, ITickList tickBlocksIn, ITickList tickFluidsIn, long inhabitedTimeIn, ChunkSection[] sectionsIn, Consumer postLoadConsumerIn, CallbackInfo ci) { + bridge$setBukkitChunk(new CraftChunk((Chunk) (Object) this)); + } +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/world/dimension/DimensionTypeMixin_1_15.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/world/dimension/DimensionTypeMixin_1_15.java new file mode 100644 index 00000000..e93447b8 --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/world/dimension/DimensionTypeMixin_1_15.java @@ -0,0 +1,28 @@ +package io.izzel.arclight.common.mixin.v1_15.world.dimension; + +import net.minecraft.world.World; +import net.minecraft.world.biome.IBiomeMagnifier; +import net.minecraft.world.dimension.Dimension; +import net.minecraft.world.dimension.DimensionType; +import org.spongepowered.asm.mixin.Mixin; + +import java.util.function.BiFunction; + +@Mixin(DimensionType.class) +public class DimensionTypeMixin_1_15 { + + protected void arclight$constructor(int idIn, String suffixIn, String directoryIn, BiFunction p_i49935_4_, boolean p_i49935_5_, IBiomeMagnifier p_i225789_6_) { + throw new RuntimeException(); + } + + public void arclight$constructor(int idIn, String suffixIn, String directoryIn, BiFunction p_i49935_4_, boolean p_i49935_5_, IBiomeMagnifier p_i225789_6_, DimensionType type) { + arclight$constructor(idIn, suffixIn, directoryIn, p_i49935_4_, p_i49935_5_, p_i225789_6_); + this.type = type; + } + + private DimensionType type; + + public DimensionType getType() { + return (type == null) ? (DimensionType) (Object) this : type; + } +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/world/server/TicketManagerMixin_1_15.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/world/server/TicketManagerMixin_1_15.java new file mode 100644 index 00000000..bb95c407 --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/v1_15/world/server/TicketManagerMixin_1_15.java @@ -0,0 +1,123 @@ +package io.izzel.arclight.common.mixin.v1_15.world.server; + +import io.izzel.arclight.common.bridge.world.server.TicketManagerBridge; +import it.unimi.dsi.fastutil.longs.Long2ObjectMap; +import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap; +import net.minecraft.util.SortedArraySet; +import net.minecraft.util.math.ChunkPos; +import net.minecraft.world.server.Ticket; +import net.minecraft.world.server.TicketManager; +import net.minecraft.world.server.TicketType; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.gen.Invoker; + +import java.util.Iterator; + +@Mixin(TicketManager.class) +public abstract class TicketManagerMixin_1_15 implements TicketManagerBridge { + + // @formatter:off + @Shadow private long currentTime; + @Shadow @Final private TicketManager.ChunkTicketTracker ticketTracker; + @Shadow protected abstract SortedArraySet> getTicketSet(long p_229848_1_); + @Shadow private static int getLevel(SortedArraySet> p_229844_0_) { return 0; } + @Shadow @Final public Long2ObjectOpenHashMap>> tickets; + @Invoker("tick") public abstract void bridge$tick(); + // @formatter:on + + @SuppressWarnings("unused") // mock + public boolean func_219356_a(TicketType type, ChunkPos pos, int level, T value) { + return addTicketAtLevel(type, pos, level, value); + } + + @SuppressWarnings("unused") // mock + public boolean func_219345_b(TicketType type, ChunkPos pos, int level, T value) { + return removeTicketAtLevel(type, pos, level, value); + } + + public boolean addTicketAtLevel(TicketType type, ChunkPos pos, int level, T value) { + Ticket ticket = new Ticket<>(type, level, value); + return this.addTicket(pos.asLong(), ticket); + } + + public boolean removeTicketAtLevel(TicketType type, ChunkPos pos, int level, T value) { + Ticket ticket = new Ticket<>(type, level, value); + return this.removeTicket(pos.asLong(), ticket); + } + + @Override + public boolean bridge$addTicketAtLevel(TicketType type, ChunkPos pos, int level, T value) { + return addTicketAtLevel(type, pos, level, value); + } + + @Override + public boolean bridge$removeTicketAtLevel(TicketType type, ChunkPos pos, int level, T value) { + return removeTicketAtLevel(type, pos, level, value); + } + + @SuppressWarnings("unused") // mock + private boolean func_219349_b(long chunkPosIn, Ticket ticketIn) { + return removeTicket(chunkPosIn, ticketIn); + } + + private boolean removeTicket(long chunkPosIn, Ticket ticketIn) { + SortedArraySet> ticketSet = this.getTicketSet(chunkPosIn); + boolean removed = false; + if (ticketSet.remove(ticketIn)) { + removed = true; + } + if (ticketSet.isEmpty()) { + this.tickets.remove(chunkPosIn); + } + this.ticketTracker.updateSourceLevel(chunkPosIn, getLevel(ticketSet), false); + return removed; + } + + @Override + public boolean bridge$removeTicket(long chunkPos, Ticket ticket) { + return removeTicket(chunkPos, ticket); + } + + @SuppressWarnings("unused") // mock + private boolean func_219347_a(long chunkPosIn, Ticket ticketIn) { + return addTicket(chunkPosIn, ticketIn); + } + + private boolean addTicket(long chunkPosIn, Ticket ticketIn) { + SortedArraySet> ticketSet = this.getTicketSet(chunkPosIn); + int level = getLevel(ticketSet); + Ticket ticket = ticketSet.func_226175_a_(ticketIn); + ticket.setTimestamp(this.currentTime); + if (ticketIn.getLevel() < level) { + this.ticketTracker.updateSourceLevel(chunkPosIn, ticketIn.getLevel(), true); + } + return ticketIn == ticket; + } + + @Override + public boolean bridge$addTicket(long chunkPos, Ticket ticket) { + return addTicket(chunkPos, ticket); + } + + public void removeAllTicketsFor(TicketType ticketType, int ticketLevel, T ticketIdentifier) { + Ticket target = new Ticket<>(ticketType, ticketLevel, ticketIdentifier); + Iterator>>> iterator = this.tickets.long2ObjectEntrySet().fastIterator(); + while (iterator.hasNext()) { + Long2ObjectMap.Entry>> entry = iterator.next(); + SortedArraySet> tickets = entry.getValue(); + if (tickets.remove(target)) { + this.ticketTracker.updateSourceLevel(entry.getLongKey(), getLevel(tickets), false); + if (tickets.isEmpty()) { + iterator.remove(); + } + } + } + } + + @Override + public void bridge$removeAllTicketsFor(TicketType ticketType, int ticketLevel, T ticketIdentifier) { + removeAllTicketsFor(ticketType, ticketLevel, ticketIdentifier); + } +} diff --git a/arclight-common/src/main/resources/META-INF/accesstransformer.cfg b/arclight-common/src/main/resources/META-INF/accesstransformer.cfg index 32e342b3..0c5cbac9 100644 --- a/arclight-common/src/main/resources/META-INF/accesstransformer.cfg +++ b/arclight-common/src/main/resources/META-INF/accesstransformer.cfg @@ -1,4 +1,4 @@ -# Arclight +# Arclight 1.14 public net.minecraft.command.impl.TeleportCommand$Facing public net.minecraft.world.server.TicketManager$ChunkTicketTracker public net.minecraft.world.server.Ticket (Lnet/minecraft/world/server/TicketType;ILjava/lang/Object;J)V @@ -18,6 +18,18 @@ public net.minecraft.util.math.shapes.DoubleCubeMergingList (II)V public net.minecraft.block.ComposterBlock$EmptyInventory public net.minecraft.tileentity.SkullTileEntity field_184299_k #sessionService public net.minecraft.item.crafting.Ingredient (Ljava/util/stream/Stream;)V +# Arclight 1.15 +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 +public net.minecraft.world.server.Ticket (Lnet/minecraft/world/server/TicketType;ILjava/lang/Object;)V +public net.minecraft.world.server.Ticket func_229861_a_(J)V #setTimestamp +public net.minecraft.world.end.DragonFightManager func_186095_a(Lnet/minecraft/world/end/DragonSpawnState;)V #setRespawnState +public net.minecraft.world.end.DragonFightManager field_186119_m #dragonUniqueId +public net.minecraft.world.end.DragonFightManager field_186121_o #exitPortalLocation +public net.minecraft.world.end.DragonFightManager field_186122_p #respawnState # 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 @@ -300,3 +312,34 @@ private-f net.minecraft.server.MinecraftServer field_147144_o public-f net.minecraft.server.MinecraftServer field_71308_o public-f net.minecraft.world.server.TicketType field_223186_k public-f net.minecraft.world.World field_73011_w +public net.minecraft.entity.monster.GuardianEntity func_110147_ax()V +public net.minecraft.entity.monster.ElderGuardianEntity func_110147_ax()V +public net.minecraft.world.server.ServerBossInfo func_186759_a(Lnet/minecraft/network/play/server/SUpdateBossInfoPacket$Operation;)V +public net.minecraft.world.server.ServerBossInfo field_186764_j +public net.minecraft.world.server.TicketManager field_219377_e +public net.minecraft.util.datafix.fixes.BlockStateFlatteningMap func_199194_a(ILjava/lang/String;[Ljava/lang/String;)V +public net.minecraft.world.dimension.DimensionType (ILjava/lang/String;Ljava/lang/String;Ljava/util/function/BiFunction;ZLnet/minecraft/world/biome/IBiomeMagnifier;)V +public net.minecraft.entity.passive.BeeEntity func_226418_eL_()I +public net.minecraft.entity.passive.BeeEntity field_226369_bI_ +public net.minecraft.entity.passive.BeeEntity func_226453_u_(I)V +public net.minecraft.entity.passive.BeeEntity func_226447_r_(Z)V +public net.minecraft.entity.passive.BeeEntity func_226449_s_(Z)V +public net.minecraft.entity.boss.dragon.EnderDragonEntity field_70977_g +public net.minecraft.entity.item.FireworkRocketEntity field_213895_d +public net.minecraft.entity.passive.FoxEntity field_213509_bB +public net.minecraft.entity.passive.FoxEntity field_213510_bD +public net.minecraft.entity.passive.MooshroomEntity func_213446_a(Lnet/minecraft/entity/passive/MooshroomEntity$Type;)V +public net.minecraft.entity.monster.PillagerEntity field_213677_bz +public net.minecraft.entity.player.ServerPlayerEntity func_213846_b(Lnet/minecraft/world/server/ServerWorld;)V +public net.minecraft.entity.monster.ZombieVillagerEntity func_191991_a(Ljava/util/UUID;I)V +public net.minecraft.item.BucketItem field_77876_a +public net.minecraft.world.raid.RaidManager field_215175_a +public net.minecraft.world.raid.Raid field_221352_p +public net.minecraft.world.raid.Raid field_221345_i +public net.minecraft.world.raid.Raid field_221359_w +public net.minecraft.world.raid.Raid field_221346_j +public net.minecraft.world.raid.Raid field_221351_o +public net.minecraft.item.crafting.Ingredient$SingleItemList (Lnet/minecraft/item/ItemStack;)V +public net.minecraft.tileentity.BeehiveTileEntity field_226959_b_ +public net.minecraft.tileentity.StructureBlockTileEntity field_184427_l +public net.minecraft.world.World field_217407_c diff --git a/arclight-common/src/main/resources/mixins.arclight.bukkit.json b/arclight-common/src/main/resources/mixins.arclight.bukkit.json index f32bceba..518b0859 100644 --- a/arclight-common/src/main/resources/mixins.arclight.bukkit.json +++ b/arclight-common/src/main/resources/mixins.arclight.bukkit.json @@ -8,7 +8,6 @@ "mixins": [ "BukkitCommandWrapperMixin", "ColouredConsoleSenderMixin", - "CommandNodeMixin", "CraftBlockStateMixin", "CraftChunkMixin", "CraftConsoleCommandSenderMixin", 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 new file mode 100644 index 00000000..be8d7415 --- /dev/null +++ b/arclight-common/src/main/resources/mixins.arclight.core.1_15.json @@ -0,0 +1,57 @@ +{ + "required": true, + "minVersion": "0.8", + "package": "io.izzel.arclight.common.mixin.v1_15", + "target": "@env(DEFAULT)", + "refmap": "mixins.arclight.refmap.json", + "setSourceFile": true, + "plugin": "io.izzel.arclight.common.mod.ArclightMixinPlugin", + "injectors": { + "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", + "command.impl.TeleportCommandMixin_1_15", + "command.impl.TimeCommandMixin", + "enchantment.FrostWalkerEnchantmentMixin_1_15", + "entity.EntityMixin_1_15", + "world.biome.BiomeContainerMixin", + "world.chunk.ChunkMixin_1_15", + "world.dimension.DimensionTypeMixin_1_15", + "world.server.TicketManagerMixin_1_15" + ] +} \ 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 81c909d9..d974b658 100644 --- a/arclight-common/src/main/resources/mixins.arclight.core.json +++ b/arclight-common/src/main/resources/mixins.arclight.core.json @@ -7,7 +7,8 @@ "setSourceFile": true, "plugin": "io.izzel.arclight.common.mod.ArclightMixinPlugin", "injectors": { - "maxShiftBy": 2 + "maxShiftBy": 2, + "defaultRequire": 1 }, "mixins": [ "advancements.AdvancementMixin", @@ -20,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", @@ -34,10 +31,6 @@ "block.ComposterBlock_PartialInventoryMixin", "block.ComposterBlockMixin", "block.ConcretePowderBlockMixin", - "block.CoralBlockMixin", - "block.CoralFinBlockMixin", - "block.CoralPlantBlockMixin", - "block.CoralWallFanBlockMixin", "block.CropsBlockMixin", "block.DaylightDetectorBlockMixin", "block.DetectorRailBlockMixin", @@ -49,48 +42,38 @@ "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", - "block.ScaffoldingBlockMixin", "block.SilverfishBlockMixin", - "block.SnowBlockMixin", "block.SpongeBlockMixin", - "block.SpreadableSnowyDirtBlockMixin", - "block.StemBlockMixin", - "block.SugarCaneBlockMixin", - "block.SweetBerryBushBlockMixin", "block.TNTBlockMixin", "block.TrapDoorBlockMixin", "block.TripWireBlockMixin", "block.TripWireHookBlockMixin", "block.TurtleEggBlockMixin", - "block.VineBlockMixin", "block.WeightedPressurePlateBlockMixin", "block.WitherSkeletonSkullBlockMixin", + "command.CommandNodeMixin", + "command.CommandsMixin", "command.CommandSourceMixin", "command.ICommandSourceMixin", + "command.arguments.BlockStateParserMixin", "command.arguments.EntityArgumentMixin", "command.arguments.EntitySelectorMixin", "command.arguments.EntitySelectorParserMixin", @@ -106,7 +89,8 @@ "entity.EntityTypeMixin", "entity.LivingEntityMixin", "entity.MobEntityMixin", - "entity.ai.attributes.RangedAttributeMixin_Accessor", + "entity.ai.attributes.RangedAttributeMixin", + "entity.ai.brain.BrainUtilMixin", "entity.ai.brain.task.AssignProfessionTaskMixin", "entity.ai.brain.task.ChangeJobTaskMixin", "entity.ai.brain.task.CreateBabyVillagerTaskMixin", @@ -260,6 +244,7 @@ "inventory.container.PlayerContainerMixin", "inventory.container.RepairContainerMixin", "inventory.container.ShulkerBoxContainerMixin", + "inventory.container.SlotMixin", "inventory.container.StonecutterContainerMixin", "inventory.container.WorkbenchContainerMixin", "item.ArmorStandItemMixin", @@ -370,7 +355,6 @@ "world.server.ServerChunkProvider_ChunkExecutorMixin", "world.server.ServerChunkProviderMixin", "world.server.ServerWorldMixin", - "world.server.TicketManagerMixin", "world.server.TicketTypeMixin", "world.spawner.AbstractSpawnerMixin", "world.spawner.PatrolSpawnerMixin", 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-common/src/main/java/io/izzel/arclight/common/mixin/core/command/impl/TeleportCommandMixin.java b/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/command/impl/TeleportCommandMixin_1_14.java similarity index 96% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/command/impl/TeleportCommandMixin.java rename to arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/command/impl/TeleportCommandMixin_1_14.java index b2b70c38..7e6a778c 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/command/impl/TeleportCommandMixin.java +++ b/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/command/impl/TeleportCommandMixin_1_14.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.command.impl; +package io.izzel.arclight.impl.mixin.v1_14.command.impl; import io.izzel.arclight.common.bridge.entity.EntityBridge; import io.izzel.arclight.common.bridge.network.play.ServerPlayNetHandlerBridge; @@ -26,7 +26,7 @@ import javax.annotation.Nullable; import java.util.Set; @Mixin(TeleportCommand.class) -public class TeleportCommandMixin { +public class TeleportCommandMixin_1_14 { /** * @author IzzelAliz @@ -85,6 +85,7 @@ public class TeleportCommandMixin { entityIn.setLocationAndAngles(x, y, z, f1, f); entityIn.setRotationYawHead(f1); worldIn.func_217460_e(entityIn); + entity.removed = true; } } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/enchantment/FrostWalkerEnchantmentMixin.java b/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/enchantment/FrostWalkerEnchantmentMixin_1_14.java similarity index 96% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/enchantment/FrostWalkerEnchantmentMixin.java rename to arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/enchantment/FrostWalkerEnchantmentMixin_1_14.java index f177c092..3c948172 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/enchantment/FrostWalkerEnchantmentMixin.java +++ b/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/enchantment/FrostWalkerEnchantmentMixin_1_14.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.enchantment; +package io.izzel.arclight.impl.mixin.v1_14.enchantment; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; @@ -18,7 +18,7 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Overwrite; @Mixin(FrostWalkerEnchantment.class) -public class FrostWalkerEnchantmentMixin { +public class FrostWalkerEnchantmentMixin_1_14 { /** * @author IzzelAliz diff --git a/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/entity/EntityMixin_1_14.java b/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/entity/EntityMixin_1_14.java new file mode 100644 index 00000000..48164e53 --- /dev/null +++ b/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/entity/EntityMixin_1_14.java @@ -0,0 +1,146 @@ +package io.izzel.arclight.impl.mixin.v1_14.entity; + +import io.izzel.arclight.common.bridge.entity.EntityBridge; +import io.izzel.arclight.common.bridge.entity.InternalEntityBridge; +import io.izzel.arclight.common.bridge.world.server.ServerWorldBridge; +import net.minecraft.block.pattern.BlockPattern; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityType; +import net.minecraft.entity.MobEntity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.server.MinecraftServer; +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.World; +import net.minecraft.world.dimension.DimensionType; +import net.minecraft.world.gen.Heightmap; +import net.minecraft.world.server.ServerWorld; +import net.minecraftforge.common.ForgeHooks; +import org.bukkit.Location; +import org.bukkit.craftbukkit.v.CraftWorld; +import org.bukkit.event.entity.EntityPortalEvent; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; +import org.spongepowered.asm.mixin.Shadow; + +import javax.annotation.Nullable; + +@Mixin(Entity.class) +public abstract class EntityMixin_1_14 { + + // @formatter:off + @Shadow public World world; + @Shadow @Deprecated public boolean removed; + @Shadow public DimensionType dimension; + @Shadow public double posX; + @Shadow public double posZ; + @Shadow public double posY; + @Shadow @Nullable public abstract MinecraftServer getServer(); + @Shadow public abstract Vec3d getMotion(); + @Shadow public abstract Vec3d getLastPortalVec(); + @Shadow public abstract boolean isAlive(); + @Shadow public abstract Direction getTeleportDirection(); + @Shadow public abstract void detach(); + @Shadow public abstract EntityType getType(); + @Shadow public abstract void remove(boolean keepData); + // @formatter:on + + /** + * @author IzzelAliz + * @reason + */ + @Overwrite + @Nullable + public Entity changeDimension(DimensionType destination) { + BlockPos location = ((InternalEntityBridge) this).internal$capturedPos(); + if (!ForgeHooks.onTravelToDimension((Entity) (Object) this, destination)) return null; + if (!this.world.isRemote && !this.removed) { + this.world.getProfiler().startSection("changeDimension"); + MinecraftServer minecraftserver = this.getServer(); + DimensionType dimensiontype = this.dimension; + ServerWorld serverworld = minecraftserver.func_71218_a(dimensiontype); + ServerWorld serverworld1 = minecraftserver.func_71218_a(destination); + if (serverworld1 == null) { + return null; + } + // this.dimension = destination; + // this.detach(); + this.world.getProfiler().startSection("reposition"); + Vec3d vec3d = this.getMotion(); + float f = 0.0F; + BlockPos blockpos = location; + if (blockpos == null) { + if (dimensiontype == DimensionType.THE_END && destination == DimensionType.OVERWORLD) { + blockpos = serverworld1.getHeight(Heightmap.Type.MOTION_BLOCKING_NO_LEAVES, serverworld1.getSpawnPoint()); + } else if (destination == DimensionType.THE_END) { + blockpos = serverworld1.getSpawnCoordinate(); + } else { + double movementFactor = serverworld.getDimension().getMovementFactor() / serverworld1.getDimension().getMovementFactor(); + double d0 = this.posX * movementFactor; + double d1 = this.posZ * movementFactor; + + double d3 = Math.min(-2.9999872E7D, serverworld1.getWorldBorder().minX() + 16.0D); + double d4 = Math.min(-2.9999872E7D, serverworld1.getWorldBorder().minZ() + 16.0D); + double d5 = Math.min(2.9999872E7D, serverworld1.getWorldBorder().maxX() - 16.0D); + double d6 = Math.min(2.9999872E7D, serverworld1.getWorldBorder().maxZ() - 16.0D); + d0 = MathHelper.clamp(d0, d3, d5); + d1 = MathHelper.clamp(d1, d4, d6); + Vec3d vec3d1 = this.getLastPortalVec(); + blockpos = new BlockPos(d0, this.posY, d1); + BlockPattern.PortalInfo blockpattern$portalinfo = serverworld1.getDefaultTeleporter().placeInExistingPortal(blockpos, vec3d, this.getTeleportDirection(), vec3d1.x, vec3d1.y, (Object) this instanceof PlayerEntity); + if (blockpattern$portalinfo == null) { + return null; + } + + blockpos = new BlockPos(blockpattern$portalinfo.pos); + vec3d = blockpattern$portalinfo.motion; + f = (float) blockpattern$portalinfo.rotation; + } + } + + if (location == null) { + Location enter = ((InternalEntityBridge) this).internal$getBukkitEntity().getLocation(); + Location exit = new Location(((ServerWorldBridge) serverworld1).bridge$getWorld(), blockpos.getX(), blockpos.getY(), blockpos.getZ()); + + EntityPortalEvent event = new EntityPortalEvent(((InternalEntityBridge) this).internal$getBukkitEntity(), enter, exit); + event.getEntity().getServer().getPluginManager().callEvent(event); + if (event.isCancelled() || event.getTo() == null || event.getTo().getWorld() == null || !this.isAlive()) { + return null; + } + + exit = event.getTo(); + serverworld1 = ((CraftWorld) exit.getWorld()).getHandle(); + blockpos = new BlockPos(exit.getX(), exit.getY(), exit.getZ()); + } + + this.dimension = destination; + this.detach(); + + this.world.getProfiler().endStartSection("reloading"); + Entity entity = this.getType().create(serverworld1); + if (entity != null) { + entity.copyDataFromOld((Entity) (Object) this); + entity.moveToBlockPosAndAngles(blockpos, entity.rotationYaw + f, entity.rotationPitch); + entity.setMotion(vec3d); + serverworld1.func_217460_e(entity); + + ((InternalEntityBridge) this).internal$getBukkitEntity().setHandle(entity); + ((EntityBridge) entity).bridge$setBukkitEntity(((InternalEntityBridge) this).internal$getBukkitEntity()); + if ((Object) this instanceof MobEntity) { + ((MobEntity) (Object) this).clearLeashed(true, false); + } + } + + this.remove(false); + this.world.getProfiler().endSection(); + serverworld.resetUpdateEntityTick(); + serverworld1.resetUpdateEntityTick(); + this.world.getProfiler().endSection(); + return entity; + } else { + return null; + } + } +} diff --git a/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/world/chunk/ChunkMixin_1_14.java b/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/world/chunk/ChunkMixin_1_14.java new file mode 100644 index 00000000..92bb847c --- /dev/null +++ b/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/world/chunk/ChunkMixin_1_14.java @@ -0,0 +1,29 @@ +package io.izzel.arclight.impl.mixin.v1_14.world.chunk; + +import io.izzel.arclight.common.bridge.world.chunk.ChunkBridge; +import net.minecraft.block.Block; +import net.minecraft.fluid.Fluid; +import net.minecraft.util.math.ChunkPos; +import net.minecraft.world.ITickList; +import net.minecraft.world.World; +import net.minecraft.world.biome.Biome; +import net.minecraft.world.chunk.Chunk; +import net.minecraft.world.chunk.ChunkSection; +import net.minecraft.world.chunk.UpgradeData; +import org.bukkit.craftbukkit.v.CraftChunk; +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.function.Consumer; + +@Mixin(Chunk.class) +public abstract class ChunkMixin_1_14 implements ChunkBridge { + + @Inject(method = "(Lnet/minecraft/world/World;Lnet/minecraft/util/math/ChunkPos;[Lnet/minecraft/world/biome/Biome;Lnet/minecraft/world/chunk/UpgradeData;Lnet/minecraft/world/ITickList;Lnet/minecraft/world/ITickList;J[Lnet/minecraft/world/chunk/ChunkSection;Ljava/util/function/Consumer;)V", + at = @At("RETURN")) + private void arclight$init(World worldIn, ChunkPos p_i49946_2_, Biome[] p_i49946_3_, UpgradeData p_i49946_4_, ITickList p_i49946_5_, ITickList p_i49946_6_, long p_i49946_7_, ChunkSection[] p_i49946_9_, Consumer p_i49946_10_, CallbackInfo ci) { + bridge$setBukkitChunk(new CraftChunk((Chunk) (Object) this)); + } +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/dimension/DimensionTypeMixin.java b/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/world/dimension/DimensionTypeMixin_1_14.java similarity index 90% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/dimension/DimensionTypeMixin.java rename to arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/world/dimension/DimensionTypeMixin_1_14.java index 340be523..bb3d16ea 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/dimension/DimensionTypeMixin.java +++ b/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/world/dimension/DimensionTypeMixin_1_14.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.world.dimension; +package io.izzel.arclight.impl.mixin.v1_14.world.dimension; import net.minecraft.world.World; import net.minecraft.world.dimension.Dimension; @@ -8,7 +8,7 @@ import org.spongepowered.asm.mixin.Mixin; import java.util.function.BiFunction; @Mixin(DimensionType.class) -public class DimensionTypeMixin { +public class DimensionTypeMixin_1_14 { protected void arclight$constructor(int idIn, String suffixIn, String directoryIn, BiFunction p_i49935_4_, boolean p_i49935_5_) { throw new RuntimeException(); diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/server/TicketManagerMixin.java b/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/world/server/TicketManagerMixin_1_14.java similarity index 92% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/server/TicketManagerMixin.java rename to arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/world/server/TicketManagerMixin_1_14.java index b368994f..4ac87705 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/server/TicketManagerMixin.java +++ b/arclight-forge-1.14/src/main/java/io/izzel/arclight/impl/mixin/v1_14/world/server/TicketManagerMixin_1_14.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.world.server; +package io.izzel.arclight.impl.mixin.v1_14.world.server; import io.izzel.arclight.common.bridge.world.server.TicketManagerBridge; import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap; @@ -12,22 +12,20 @@ import net.minecraft.world.server.TicketType; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.gen.Accessor; import org.spongepowered.asm.mixin.gen.Invoker; import java.util.Iterator; @Mixin(TicketManager.class) -public abstract class TicketManagerMixin implements TicketManagerBridge { +public abstract class TicketManagerMixin_1_14 implements TicketManagerBridge { // @formatter:off - @Shadow @Final private Long2ObjectOpenHashMap>> tickets; + @Shadow @Final public Long2ObjectOpenHashMap>> tickets; @Shadow private long currentTime; @Shadow protected abstract ObjectSortedSet> getTickets(long chunkPosIn); @Shadow @Final private TicketManager.ChunkTicketTracker ticketTracker; @Shadow protected abstract int getChunkLevel(ObjectSortedSet> ticketsIn); @Invoker("tick") public abstract void bridge$tick(); - @Accessor("tickets") public abstract Long2ObjectOpenHashMap>> bridge$getTickets(); // @formatter:on @SuppressWarnings("unused") // mock 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..08899b3a --- /dev/null +++ b/arclight-forge-1.14/src/main/resources/mixins.arclight.core.1_14.json @@ -0,0 +1,55 @@ +{ + "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", + "command.impl.TeleportCommandMixin_1_14", + "enchantment.FrostWalkerEnchantmentMixin_1_14", + "entity.EntityMixin_1_14", + "world.chunk.ChunkMixin_1_14", + "world.dimension.DimensionTypeMixin_1_14", + "world.server.TicketManagerMixin_1_14" + ] +} \ No newline at end of file