From ca23b4b8541ec33167a86f53ea30e44d5fcf74c7 Mon Sep 17 00:00:00 2001 From: IzzelAliz Date: Wed, 26 Aug 2020 18:02:44 +0800 Subject: [PATCH] 1.16: loots and more --- .../util/text/ITextComponentBridge.java | 13 + .../world/storage/loot/LootTableBridge.java | 2 +- .../mixin/core/fluid/FlowingFluidMixin.java | 12 +- .../mixin/core/fluid/LavaFluidMixin.java | 27 +- .../core/loot/LootEntry_SerializerMixin.java | 25 ++ .../loot/LootParametersMixin.java | 6 +- .../loot/LootTableManagerMixin.java | 6 +- .../storage => }/loot/LootTableMixin.java | 21 +- .../RandomChanceWithLootingMixin.java | 6 +- .../conditions/SurvivesExplosionMixin.java | 8 +- .../functions/LootingEnchantBonusMixin.java | 10 +- .../ServerHandshakeNetHandlerMixin.java | 12 +- .../common/mixin/core/server/MainMixin.java | 21 ++ .../core/server/MinecraftServerMixin.java | 245 +++++++++--------- .../core/util/text/ITextComponentMixin.java | 39 +++ .../mixin/core/world/ExplosionMixin.java | 67 ++--- .../mixin/core/world/IBlockReaderMixin.java | 14 +- .../world/chunk/storage/ChunkLoaderMixin.java | 17 -- .../common/mod/ArclightConstants.java | 2 +- .../common/mod/util/ArclightCaptures.java | 15 ++ .../main/resources/mixins.arclight.core.json | 28 +- 21 files changed, 348 insertions(+), 248 deletions(-) create mode 100644 arclight-common/src/main/java/io/izzel/arclight/common/bridge/util/text/ITextComponentBridge.java create mode 100644 arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/loot/LootEntry_SerializerMixin.java rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{world/storage => }/loot/LootParametersMixin.java (59%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{world/storage => }/loot/LootTableManagerMixin.java (87%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{world/storage => }/loot/LootTableMixin.java (69%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{world/storage => }/loot/conditions/RandomChanceWithLootingMixin.java (79%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{world/storage => }/loot/conditions/SurvivesExplosionMixin.java (69%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{world/storage => }/loot/functions/LootingEnchantBonusMixin.java (82%) create mode 100644 arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/MainMixin.java create mode 100644 arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/util/text/ITextComponentMixin.java delete mode 100644 arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/chunk/storage/ChunkLoaderMixin.java diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/bridge/util/text/ITextComponentBridge.java b/arclight-common/src/main/java/io/izzel/arclight/common/bridge/util/text/ITextComponentBridge.java new file mode 100644 index 00000000..72ed973c --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/bridge/util/text/ITextComponentBridge.java @@ -0,0 +1,13 @@ +package io.izzel.arclight.common.bridge.util.text; + +import net.minecraft.util.text.ITextComponent; + +import java.util.Iterator; +import java.util.stream.Stream; + +public interface ITextComponentBridge { + + Stream bridge$stream(); + + Iterator bridge$iterator(); +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/bridge/world/storage/loot/LootTableBridge.java b/arclight-common/src/main/java/io/izzel/arclight/common/bridge/world/storage/loot/LootTableBridge.java index 08c8471e..a6c1478d 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/bridge/world/storage/loot/LootTableBridge.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/bridge/world/storage/loot/LootTableBridge.java @@ -1,7 +1,7 @@ package io.izzel.arclight.common.bridge.world.storage.loot; import net.minecraft.inventory.IInventory; -import net.minecraft.world.storage.loot.LootContext; +import net.minecraft.loot.LootContext; public interface LootTableBridge { diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/fluid/FlowingFluidMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/fluid/FlowingFluidMixin.java index 9666d2c6..eebce2c0 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/fluid/FlowingFluidMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/fluid/FlowingFluidMixin.java @@ -3,7 +3,7 @@ package io.izzel.arclight.common.mixin.core.fluid; import net.minecraft.block.BlockState; import net.minecraft.fluid.FlowingFluid; import net.minecraft.fluid.Fluid; -import net.minecraft.fluid.IFluidState; +import net.minecraft.fluid.FluidState; import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; import net.minecraft.world.IBlockReader; @@ -28,11 +28,11 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; public abstract class FlowingFluidMixin { // @formatter:off - @Shadow protected abstract boolean canFlow(IBlockReader worldIn, BlockPos fromPos, BlockState fromBlockState, Direction direction, BlockPos toPos, BlockState toBlockState, IFluidState toFluidState, Fluid fluidIn); + @Shadow protected abstract boolean canFlow(IBlockReader worldIn, BlockPos fromPos, BlockState fromBlockState, Direction direction, BlockPos toPos, BlockState toBlockState, FluidState toFluidState, Fluid fluidIn); // @formatter:on - @Inject(method = "flowAround", cancellable = true, at = @At(value = "INVOKE", target = "Lnet/minecraft/fluid/FlowingFluid;flowInto(Lnet/minecraft/world/IWorld;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;Lnet/minecraft/util/Direction;Lnet/minecraft/fluid/IFluidState;)V")) - public void arclight$flowInto(IWorld worldIn, BlockPos pos, IFluidState stateIn, CallbackInfo ci) { + @Inject(method = "flowAround", cancellable = true, at = @At(value = "INVOKE", target = "Lnet/minecraft/fluid/FlowingFluid;flowInto(Lnet/minecraft/world/IWorld;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;Lnet/minecraft/util/Direction;Lnet/minecraft/fluid/FluidState;)V")) + public void arclight$flowInto(IWorld worldIn, BlockPos pos, FluidState stateIn, CallbackInfo ci) { Block source = CraftBlock.at(worldIn, pos); BlockFromToEvent event = new BlockFromToEvent(source, BlockFace.DOWN); Bukkit.getPluginManager().callEvent(event); @@ -41,8 +41,8 @@ public abstract class FlowingFluidMixin { } } - @Redirect(method = "func_207937_a", at = @At(value = "INVOKE", target = "Lnet/minecraft/fluid/FlowingFluid;canFlow(Lnet/minecraft/world/IBlockReader;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;Lnet/minecraft/util/Direction;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;Lnet/minecraft/fluid/IFluidState;Lnet/minecraft/fluid/Fluid;)Z")) - public boolean arclight$flowInto(FlowingFluid flowingFluid, IBlockReader worldIn, BlockPos fromPos, BlockState fromBlockState, Direction direction, BlockPos toPos, BlockState toBlockState, IFluidState toFluidState, Fluid fluidIn) { + @Redirect(method = "func_207937_a", at = @At(value = "INVOKE", target = "Lnet/minecraft/fluid/FlowingFluid;canFlow(Lnet/minecraft/world/IBlockReader;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;Lnet/minecraft/util/Direction;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;Lnet/minecraft/fluid/FluidState;Lnet/minecraft/fluid/Fluid;)Z")) + public boolean arclight$flowInto(FlowingFluid flowingFluid, IBlockReader worldIn, BlockPos fromPos, BlockState fromBlockState, Direction direction, BlockPos toPos, BlockState toBlockState, FluidState toFluidState, Fluid fluidIn) { if (this.canFlow(worldIn, fromPos, fromBlockState, direction, toPos, toBlockState, toFluidState, fluidIn)) { Block source = CraftBlock.at(((World) worldIn), fromPos); BlockFromToEvent event = new BlockFromToEvent(source, CraftBlock.notchToBlockFace(direction)); diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/fluid/LavaFluidMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/fluid/LavaFluidMixin.java index b9a46f2d..f88e5c26 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/fluid/LavaFluidMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/fluid/LavaFluidMixin.java @@ -1,10 +1,11 @@ package io.izzel.arclight.common.mixin.core.fluid; +import io.izzel.arclight.common.bridge.world.IWorldBridge; +import io.izzel.arclight.mixin.Eject; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; -import net.minecraft.fluid.IFluidState; +import net.minecraft.fluid.FluidState; import net.minecraft.fluid.LavaFluid; -import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; import net.minecraft.world.GameRules; import net.minecraft.world.IWorld; @@ -16,8 +17,6 @@ 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 java.util.Random; @@ -35,7 +34,7 @@ public abstract class LavaFluidMixin { * @reason */ @Overwrite - public void randomTick(World world, BlockPos pos, IFluidState state, Random random) { + public void randomTick(World world, BlockPos pos, FluidState state, Random random) { if (world.getGameRules().getBoolean(GameRules.DO_FIRE_TICK)) { int i = random.nextInt(3); if (i > 0) { @@ -84,15 +83,13 @@ public abstract class LavaFluidMixin { } } - @Inject(method = "flowInto", cancellable = true, at = @At(value = "INVOKE", shift = At.Shift.AFTER, target = "Lnet/minecraft/world/IWorld;setBlockState(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;I)Z")) - private void arclight$returnIfFail(IWorld worldIn, BlockPos pos, BlockState blockStateIn, Direction direction, IFluidState fluidStateIn, CallbackInfo ci) { - if (!arclight$success) ci.cancel(); - } - - private transient boolean arclight$success; - - @Redirect(method = "flowInto", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/IWorld;setBlockState(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;I)Z")) - private boolean arclight$blockFromTo(IWorld iWorld, BlockPos pos, BlockState newState, int flags) { - return arclight$success = CraftEventFactory.handleBlockFormEvent(iWorld.getWorld(), pos, newState, flags); + @Eject(method = "flowInto", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/IWorld;setBlockState(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;I)Z")) + private boolean arclight$blockFromTo(IWorld world, BlockPos pos, BlockState newState, int flags, CallbackInfo ci) { + if (!CraftEventFactory.handleBlockFormEvent(((IWorldBridge) world).bridge$getMinecraftWorld(), pos, newState, flags)) { + ci.cancel(); + return false; + } else { + return true; + } } } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/loot/LootEntry_SerializerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/loot/LootEntry_SerializerMixin.java new file mode 100644 index 00000000..b6cf583a --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/loot/LootEntry_SerializerMixin.java @@ -0,0 +1,25 @@ +package io.izzel.arclight.common.mixin.core.loot; + +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonObject; +import com.google.gson.JsonSerializationContext; +import net.minecraft.loot.LootEntry; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +@Mixin(LootEntry.Serializer.class) +public abstract class LootEntry_SerializerMixin { + + // @formatter:off + @Shadow public abstract void func_230424_a_(JsonObject p_230424_1_, T p_230424_2_, JsonSerializationContext p_230424_3_); + @Shadow public abstract T func_230423_a_(JsonObject p_230423_1_, JsonDeserializationContext p_230423_2_); + // @formatter:on + + public final void a(JsonObject object, T t0, JsonSerializationContext context) { + this.func_230424_a_(object, t0, context); + } + + public final T a(JsonObject object, JsonDeserializationContext context) { + return this.func_230423_a_(object, context); + } +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/storage/loot/LootParametersMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/loot/LootParametersMixin.java similarity index 59% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/storage/loot/LootParametersMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/loot/LootParametersMixin.java index b37b6973..0ecc93e2 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/storage/loot/LootParametersMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/loot/LootParametersMixin.java @@ -1,8 +1,8 @@ -package io.izzel.arclight.common.mixin.core.world.storage.loot; +package io.izzel.arclight.common.mixin.core.loot; import io.izzel.arclight.common.mod.ArclightConstants; -import net.minecraft.world.storage.loot.LootParameter; -import net.minecraft.world.storage.loot.LootParameters; +import net.minecraft.loot.LootParameter; +import net.minecraft.loot.LootParameters; import org.spongepowered.asm.mixin.Mixin; @Mixin(LootParameters.class) diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/storage/loot/LootTableManagerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/loot/LootTableManagerMixin.java similarity index 87% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/storage/loot/LootTableManagerMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/loot/LootTableManagerMixin.java index eb8d0cff..5dcdebf6 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/storage/loot/LootTableManagerMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/loot/LootTableManagerMixin.java @@ -1,12 +1,12 @@ -package io.izzel.arclight.common.mixin.core.world.storage.loot; +package io.izzel.arclight.common.mixin.core.loot; import com.google.common.collect.ImmutableMap; import com.google.gson.JsonObject; import net.minecraft.profiler.IProfiler; import net.minecraft.resources.IResourceManager; import net.minecraft.util.ResourceLocation; -import net.minecraft.world.storage.loot.LootTable; -import net.minecraft.world.storage.loot.LootTableManager; +import net.minecraft.loot.LootTable; +import net.minecraft.loot.LootTableManager; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/storage/loot/LootTableMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/loot/LootTableMixin.java similarity index 69% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/storage/loot/LootTableMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/loot/LootTableMixin.java index 4acb9bad..bfadcbde 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/storage/loot/LootTableMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/loot/LootTableMixin.java @@ -1,10 +1,11 @@ -package io.izzel.arclight.common.mixin.core.world.storage.loot; +package io.izzel.arclight.common.mixin.core.loot; import io.izzel.arclight.common.bridge.world.storage.loot.LootTableBridge; +import io.izzel.arclight.mixin.Eject; import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; -import net.minecraft.world.storage.loot.LootContext; -import net.minecraft.world.storage.loot.LootTable; +import net.minecraft.loot.LootContext; +import net.minecraft.loot.LootTable; import org.apache.logging.log4j.Logger; import org.bukkit.craftbukkit.v.event.CraftEventFactory; import org.bukkit.craftbukkit.v.inventory.CraftItemStack; @@ -12,6 +13,8 @@ import org.bukkit.event.world.LootGenerateEvent; 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.callback.CallbackInfo; import java.util.List; import java.util.Random; @@ -27,6 +30,18 @@ public abstract class LootTableMixin implements LootTableBridge { @Shadow protected abstract void shuffleItems(List stacks, int p_186463_2_, Random rand); // @formatter:on + @Eject(method = "fillInventory", at = @At(value = "INVOKE", target = "Lnet/minecraft/loot/LootTable;generate(Lnet/minecraft/loot/LootContext;)Ljava/util/List;")) + private List arclight$nonPluginEvent(LootTable lootTable, LootContext context, CallbackInfo ci, IInventory inv) { + List list = lootTable.generate(context); + LootGenerateEvent event = CraftEventFactory.callLootGenerateEvent(inv, (LootTable) (Object) this, context, list, false); + if (event.isCancelled()) { + ci.cancel(); + return null; + } else { + return event.getLoot().stream().map(CraftItemStack::asNMSCopy).collect(Collectors.toList()); + } + } + public void fillInventory(IInventory inv, LootContext context, boolean plugin) { List list = this.generate(context); Random random = context.getRandom(); diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/storage/loot/conditions/RandomChanceWithLootingMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/loot/conditions/RandomChanceWithLootingMixin.java similarity index 79% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/storage/loot/conditions/RandomChanceWithLootingMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/loot/conditions/RandomChanceWithLootingMixin.java index e56492a5..9613bbc5 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/storage/loot/conditions/RandomChanceWithLootingMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/loot/conditions/RandomChanceWithLootingMixin.java @@ -1,8 +1,8 @@ -package io.izzel.arclight.common.mixin.core.world.storage.loot.conditions; +package io.izzel.arclight.common.mixin.core.loot.conditions; import io.izzel.arclight.common.mod.ArclightConstants; -import net.minecraft.world.storage.loot.LootContext; -import net.minecraft.world.storage.loot.conditions.RandomChanceWithLooting; +import net.minecraft.loot.LootContext; +import net.minecraft.loot.conditions.RandomChanceWithLooting; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Overwrite; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/storage/loot/conditions/SurvivesExplosionMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/loot/conditions/SurvivesExplosionMixin.java similarity index 69% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/storage/loot/conditions/SurvivesExplosionMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/loot/conditions/SurvivesExplosionMixin.java index 5ec0ffe7..806e6f56 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/storage/loot/conditions/SurvivesExplosionMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/loot/conditions/SurvivesExplosionMixin.java @@ -1,8 +1,8 @@ -package io.izzel.arclight.common.mixin.core.world.storage.loot.conditions; +package io.izzel.arclight.common.mixin.core.loot.conditions; -import net.minecraft.world.storage.loot.LootContext; -import net.minecraft.world.storage.loot.LootParameters; -import net.minecraft.world.storage.loot.conditions.SurvivesExplosion; +import net.minecraft.loot.LootContext; +import net.minecraft.loot.LootParameters; +import net.minecraft.loot.conditions.SurvivesExplosion; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Overwrite; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/storage/loot/functions/LootingEnchantBonusMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/loot/functions/LootingEnchantBonusMixin.java similarity index 82% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/storage/loot/functions/LootingEnchantBonusMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/loot/functions/LootingEnchantBonusMixin.java index 6af83669..b26ea3e4 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/storage/loot/functions/LootingEnchantBonusMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/loot/functions/LootingEnchantBonusMixin.java @@ -1,12 +1,12 @@ -package io.izzel.arclight.common.mixin.core.world.storage.loot.functions; +package io.izzel.arclight.common.mixin.core.loot.functions; import net.minecraft.entity.Entity; import net.minecraft.entity.LivingEntity; import net.minecraft.item.ItemStack; -import net.minecraft.world.storage.loot.LootContext; -import net.minecraft.world.storage.loot.LootParameters; -import net.minecraft.world.storage.loot.RandomValueRange; -import net.minecraft.world.storage.loot.functions.LootingEnchantBonus; +import net.minecraft.loot.LootContext; +import net.minecraft.loot.LootParameters; +import net.minecraft.loot.RandomValueRange; +import net.minecraft.loot.functions.LootingEnchantBonus; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Overwrite; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/handshake/ServerHandshakeNetHandlerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/handshake/ServerHandshakeNetHandlerMixin.java index 849ec255..7591ce18 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/handshake/ServerHandshakeNetHandlerMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/handshake/ServerHandshakeNetHandlerMixin.java @@ -14,6 +14,7 @@ import net.minecraft.network.login.server.SDisconnectLoginPacket; import net.minecraft.network.status.ServerStatusNetHandler; import net.minecraft.server.MinecraftServer; import net.minecraft.util.SharedConstants; +import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TranslationTextComponent; import net.minecraftforge.fml.server.ServerLifecycleHooks; import org.apache.logging.log4j.LogManager; @@ -36,8 +37,11 @@ public class ServerHandshakeNetHandlerMixin { private static final HashMap throttleTracker = new HashMap<>(); private static int throttleCounter = 0; + // @formatter:off @Shadow @Final private NetworkManager networkManager; @Shadow @Final private MinecraftServer server; + @Shadow @Final private static ITextComponent field_241169_a_; + // @formatter:on /** * @author IzzelAliz @@ -112,8 +116,12 @@ public class ServerHandshakeNetHandlerMixin { break; } case STATUS: { - this.networkManager.setConnectionState(ProtocolType.STATUS); - this.networkManager.setNetHandler(new ServerStatusNetHandler(this.server, this.networkManager)); + if (this.server.func_230541_aj_()) { + this.networkManager.setConnectionState(ProtocolType.STATUS); + this.networkManager.setNetHandler(new ServerStatusNetHandler(this.server, this.networkManager)); + } else { + this.networkManager.closeChannel(field_241169_a_); + } break; } default: { diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/MainMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/MainMixin.java new file mode 100644 index 00000000..1037ea6b --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/MainMixin.java @@ -0,0 +1,21 @@ +package io.izzel.arclight.common.mixin.core.server; + +import io.izzel.arclight.common.mod.util.ArclightCaptures; +import net.minecraft.resources.ResourcePackList; +import net.minecraft.server.Main; +import net.minecraft.server.MinecraftServer; +import net.minecraft.util.datafix.codec.DatapackCodec; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +@Mixin(Main.class) +public class MainMixin { + + @Redirect(method = "main", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/MinecraftServer;func_240772_a_(Lnet/minecraft/resources/ResourcePackList;Lnet/minecraft/util/datafix/codec/DatapackCodec;Z)Lnet/minecraft/util/datafix/codec/DatapackCodec;")) + private static DatapackCodec arclight$captureDatapackCodec(ResourcePackList p_240772_0_, DatapackCodec p_240772_1_, boolean p_240772_2_) { + DatapackCodec datapackCodec = MinecraftServer.func_240772_a_(p_240772_0_, p_240772_1_, p_240772_2_); + ArclightCaptures.captureDatapackConfig(datapackCodec); + return datapackCodec; + } +} 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 e8ccd7e5..35d8ce60 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 @@ -1,17 +1,14 @@ package io.izzel.arclight.common.mixin.core.server; -import com.google.common.io.Files; -import com.google.gson.JsonElement; import com.mojang.authlib.GameProfileRepository; import com.mojang.authlib.minecraft.MinecraftSessionService; -import com.mojang.authlib.yggdrasil.YggdrasilAuthenticationService; import com.mojang.datafixers.DataFixer; import io.izzel.arclight.common.bridge.command.ICommandSourceBridge; import io.izzel.arclight.common.bridge.server.MinecraftServerBridge; import io.izzel.arclight.common.bridge.world.WorldBridge; -import io.izzel.arclight.common.bridge.world.dimension.DimensionTypeBridge; import io.izzel.arclight.common.mod.ArclightConstants; import io.izzel.arclight.common.mod.server.BukkitRegistry; +import io.izzel.arclight.common.mod.util.ArclightCaptures; import io.izzel.arclight.common.mod.util.BukkitOptionParser; import it.unimi.dsi.fastutil.longs.LongIterator; import joptsimple.OptionParser; @@ -21,31 +18,37 @@ import net.minecraft.command.Commands; import net.minecraft.crash.CrashReport; import net.minecraft.crash.ReportedException; import net.minecraft.network.ServerStatusResponse; -import net.minecraft.profiler.DebugProfiler; +import net.minecraft.profiler.IProfiler; +import net.minecraft.profiler.LongTickDetector; +import net.minecraft.resources.DataPackRegistries; +import net.minecraft.resources.ResourcePackList; import net.minecraft.server.MinecraftServer; import net.minecraft.server.management.PlayerProfileCache; +import net.minecraft.util.RegistryKey; import net.minecraft.util.SharedConstants; import net.minecraft.util.Unit; import net.minecraft.util.Util; import net.minecraft.util.concurrent.RecursiveEventLoop; import net.minecraft.util.concurrent.TickDelayedTask; +import net.minecraft.util.datafix.codec.DatapackCodec; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.ChunkPos; -import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.registry.DynamicRegistries; import net.minecraft.util.text.StringTextComponent; -import net.minecraft.util.text.TranslationTextComponent; import net.minecraft.world.ForcedChunksSaveData; -import net.minecraft.world.WorldSettings; -import net.minecraft.world.WorldType; +import net.minecraft.world.World; +import net.minecraft.world.border.WorldBorder; import net.minecraft.world.chunk.listener.IChunkStatusListener; import net.minecraft.world.chunk.listener.IChunkStatusListenerFactory; -import net.minecraft.world.dimension.DimensionType; +import net.minecraft.world.gen.settings.DimensionGeneratorSettings; import net.minecraft.world.server.ServerChunkProvider; import net.minecraft.world.server.ServerWorld; import net.minecraft.world.server.TicketType; -import net.minecraft.world.storage.SaveHandler; -import net.minecraft.world.storage.WorldInfo; -import net.minecraftforge.fml.StartupQuery; +import net.minecraft.world.storage.IServerConfiguration; +import net.minecraft.world.storage.IServerWorldInfo; +import net.minecraft.world.storage.SaveFormat; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.fml.BrandingControl; import net.minecraftforge.fml.server.ServerLifecycleHooks; import org.apache.logging.log4j.Logger; import org.bukkit.Bukkit; @@ -58,6 +61,7 @@ import org.bukkit.event.server.ServerLoadEvent; import org.bukkit.event.world.WorldInitEvent; import org.bukkit.event.world.WorldLoadEvent; import org.bukkit.plugin.PluginLoadOrder; +import org.spigotmc.WatchdogThread; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Overwrite; @@ -67,14 +71,12 @@ 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; import javax.annotation.Nullable; import java.io.File; import java.io.IOException; import java.lang.management.ManagementFactory; import java.net.Proxy; -import java.nio.charset.StandardCharsets; import java.text.SimpleDateFormat; import java.util.Arrays; import java.util.Date; @@ -90,12 +92,11 @@ public abstract class MinecraftServerMixin extends RecursiveEventLoop, ServerWorld> worlds; + @Shadow protected abstract void func_240778_a_(IServerConfiguration p_240778_1_); + @Shadow protected IServerConfiguration field_240768_i_; + @Shadow private static void func_240786_a_(ServerWorld p_240786_0_, IServerWorldInfo p_240786_1_, boolean hasBonusChest, boolean p_240786_3_, boolean p_240786_4_) { } // @formatter:on public MinecraftServerMixin(String name) { super(name); } + public DatapackCodec datapackconfiguration; private boolean forceTicks; public CraftServer server; public OptionSet options; @@ -125,7 +133,6 @@ public abstract class MinecraftServerMixin extends RecursiveEventLoop processQueue = new java.util.concurrent.ConcurrentLinkedQueue<>(); public int autosavePeriod; - public File bukkitDataPackFolder; private boolean hasStopped = false; private final Object stopLock = new Object(); @@ -147,7 +154,7 @@ public abstract class MinecraftServerMixin extends RecursiveEventLoop map, Object key, Object value) { Object ret = map.put(key, value); ServerWorld serverWorld = (ServerWorld) value; + if (((CraftServer) Bukkit.getServer()).scoreboardManager == null) { + ((CraftServer) Bukkit.getServer()).scoreboardManager = new CraftScoreboardManager((MinecraftServer) (Object) this, serverWorld.getScoreboard()); + } if (((WorldBridge) serverWorld).bridge$getGenerator() != null) { ((WorldBridge) serverWorld).bridge$getWorld().getPopulators().addAll( ((WorldBridge) serverWorld).bridge$getGenerator().getDefaultPopulators( @@ -384,10 +330,9 @@ public abstract class MinecraftServerMixin extends RecursiveEventLoop { + + // @formatter:off + @Shadow List getSiblings(); + // @formatter:on + + default Stream stream() { + return Streams.concat(Stream.of((ITextComponent) this), this.getSiblings().stream().flatMap(it -> ((ITextComponentBridge) it).bridge$stream())); + } + + @Override + default @NotNull Iterator iterator() { + return this.stream().iterator(); + } + + @Override + default Stream bridge$stream() { + return stream(); + } + + @Override + default Iterator bridge$iterator() { + return iterator(); + } +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/ExplosionMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/ExplosionMixin.java index 0a8d34be..242ff761 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/ExplosionMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/ExplosionMixin.java @@ -7,18 +7,19 @@ import io.izzel.arclight.common.bridge.entity.EntityBridge; import io.izzel.arclight.common.bridge.world.ExplosionBridge; import io.izzel.arclight.common.bridge.world.WorldBridge; import it.unimi.dsi.fastutil.objects.ObjectArrayList; +import net.minecraft.block.AbstractFireBlock; import net.minecraft.block.Block; import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; import net.minecraft.enchantment.ProtectionEnchantment; import net.minecraft.entity.Entity; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.item.FallingBlockEntity; import net.minecraft.entity.item.TNTEntity; import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.projectile.DamagingProjectileEntity; -import net.minecraft.fluid.IFluidState; +import net.minecraft.fluid.FluidState; import net.minecraft.item.ItemStack; +import net.minecraft.loot.LootContext; +import net.minecraft.loot.LootParameters; import net.minecraft.particles.ParticleTypes; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.DamageSource; @@ -27,12 +28,11 @@ import net.minecraft.util.SoundEvents; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; -import net.minecraft.util.math.Vec3d; +import net.minecraft.util.math.vector.Vector3d; import net.minecraft.world.Explosion; +import net.minecraft.world.ExplosionContext; 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 org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.craftbukkit.v.event.CraftEventFactory; @@ -49,10 +49,10 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import javax.annotation.Nullable; import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.Random; import java.util.Set; @@ -69,7 +69,7 @@ public abstract class ExplosionMixin implements ExplosionBridge { @Shadow @Final private double z; @Shadow @Final public Entity exploder; @Shadow public abstract DamageSource getDamageSource(); - @Shadow @Final private Map playerKnockbackMap; + @Shadow @Final private Map playerKnockbackMap; @Accessor("exploder") public abstract Entity bridge$getExploder(); @Accessor("size") public abstract float bridge$getSize(); @Accessor("size") public abstract void bridge$setSize(float size); @@ -79,6 +79,8 @@ public abstract class ExplosionMixin implements ExplosionBridge { @Shadow private static void func_229976_a_(ObjectArrayList> p_229976_0_, ItemStack p_229976_1_, BlockPos p_229976_2_) { } // @formatter:on + @Shadow @Final private ExplosionContext field_234893_k_; + @Inject(method = "(Lnet/minecraft/world/World;Lnet/minecraft/entity/Entity;DDDFZLnet/minecraft/world/Explosion$Mode;)V", at = @At("RETURN")) public void arclight$adjustSize(World worldIn, Entity exploderIn, double xIn, double yIn, double zIn, float sizeIn, boolean causesFireIn, Explosion.Mode modeIn, CallbackInfo ci) { @@ -91,6 +93,9 @@ public abstract class ExplosionMixin implements ExplosionBridge { */ @Overwrite public void doExplosionA() { + if (this.size < 0.1F) { + return; + } Set set = Sets.newHashSet(); int i = 16; @@ -113,17 +118,13 @@ public abstract class ExplosionMixin implements ExplosionBridge { for (float f1 = 0.3F; f > 0.0F; f -= 0.22500001F) { BlockPos blockpos = new BlockPos(d4, d6, d8); BlockState blockstate = this.world.getBlockState(blockpos); - IFluidState ifluidstate = this.world.getFluidState(blockpos); - if (!blockstate.isAir(this.world, blockpos) || !ifluidstate.isEmpty()) { - float f2 = Math.max(blockstate.getExplosionResistance(this.world, blockpos, exploder, (Explosion) (Object) this), ifluidstate.getExplosionResistance(this.world, blockpos, exploder, (Explosion) (Object) this)); - if (this.exploder != null) { - f2 = this.exploder.getExplosionResistance((Explosion) (Object) this, this.world, blockpos, blockstate, ifluidstate, f2); - } - - f -= (f2 + 0.3F) * 0.3F; + FluidState fluidstate = this.world.getFluidState(blockpos); + Optional optional = this.field_234893_k_.getExplosionResistance((Explosion) (Object) this, this.world, blockpos, blockstate, fluidstate); + if (optional.isPresent()) { + f -= (optional.get() + 0.3F) * 0.3F; } - if (f > 0.0F && (this.exploder == null || this.exploder.canExplosionDestroyBlock((Explosion) (Object) this, this.world, blockpos, blockstate, f))) { + if (f > 0.0F && this.field_234893_k_.canExplosionDestroyBlock((Explosion) (Object) this, this.world, blockpos, blockstate, f)) { set.add(blockpos); } @@ -146,15 +147,15 @@ public abstract class ExplosionMixin implements ExplosionBridge { int j1 = MathHelper.floor(this.z + (double) f3 + 1.0D); List list = this.world.getEntitiesWithinAABBExcludingEntity(this.exploder, new AxisAlignedBB(k1, i2, j2, l1, i1, j1)); net.minecraftforge.event.ForgeEventFactory.onExplosionDetonate(this.world, (Explosion) (Object) this, list, f3); - Vec3d vec3d = new Vec3d(this.x, this.y, this.z); + Vector3d vec3d = new Vector3d(this.x, this.y, this.z); for (Entity entity : list) { if (!entity.isImmuneToExplosions()) { double d12 = MathHelper.sqrt(entity.getDistanceSq(vec3d)) / f3; if (d12 <= 1.0D) { - double d5 = entity.posX - this.x; + double d5 = entity.getPosX() - this.x; double d7 = entity.getPosYEye() - this.y; - double d9 = entity.posZ - this.z; + double d9 = entity.getPosZ() - this.z; double d13 = MathHelper.sqrt(d5 * d5 + d7 * d7 + d9 * d9); if (d13 != 0.0D) { d5 = d5 / d13; @@ -180,7 +181,7 @@ public abstract class ExplosionMixin implements ExplosionBridge { if (entity instanceof PlayerEntity) { PlayerEntity playerentity = (PlayerEntity) entity; if (!playerentity.isSpectator() && (!playerentity.isCreative() || !playerentity.abilities.isFlying)) { - this.playerKnockbackMap.put(playerentity, new Vec3d(d5 * d10, d7 * d10, d9 * d10)); + this.playerKnockbackMap.put(playerentity, new Vector3d(d5 * d10, d7 * d10, d9 * d10)); } } } @@ -235,7 +236,7 @@ public abstract class ExplosionMixin implements ExplosionBridge { this.world.getProfiler().startSection("explosion_blocks"); if (blockstate.canDropFromExplosion(this.world, blockpos, (Explosion) (Object) this) && this.world instanceof ServerWorld) { TileEntity tileentity = blockstate.hasTileEntity() ? this.world.getTileEntity(blockpos) : null; - LootContext.Builder lootcontext$builder = (new LootContext.Builder((ServerWorld) this.world)).withRandom(this.world.rand).withParameter(LootParameters.POSITION, blockpos).withParameter(LootParameters.TOOL, ItemStack.EMPTY).withNullableParameter(LootParameters.BLOCK_ENTITY, tileentity).withNullableParameter(LootParameters.THIS_ENTITY, this.exploder); + LootContext.Builder lootcontext$builder = (new LootContext.Builder((ServerWorld)this.world)).withRandom(this.world.rand).withParameter(LootParameters.field_237457_g_, Vector3d.copyCentered(blockpos)).withParameter(LootParameters.TOOL, ItemStack.EMPTY).withNullableParameter(LootParameters.BLOCK_ENTITY, tileentity).withNullableParameter(LootParameters.THIS_ENTITY, this.exploder); if (this.mode == Explosion.Mode.DESTROY || yield < 1.0F) { lootcontext$builder.withParameter(LootParameters.EXPLOSION_RADIUS, 1.0F / yield); } @@ -260,7 +261,7 @@ public abstract class ExplosionMixin implements ExplosionBridge { if (this.random.nextInt(3) == 0 && this.world.getBlockState(blockpos2).isAir() && this.world.getBlockState(blockpos2.down()).isOpaqueCube(this.world, blockpos2.down())) { BlockIgniteEvent event = CraftEventFactory.callBlockIgniteEvent(this.world, blockpos2.getX(), blockpos2.getY(), blockpos2.getZ(), (Explosion) (Object) this); if (!event.isCancelled()) { - this.world.setBlockState(blockpos2, Blocks.FIRE.getDefaultState()); + this.world.setBlockState(blockpos2, AbstractFireBlock.getFireForPlacement(this.world, blockpos2)); } } } @@ -311,24 +312,4 @@ public abstract class ExplosionMixin implements ExplosionBridge { } return cancelled ? Float.NaN : yield; } - - /** - * @author IzzelAliz - * @reason add shooting entity track - */ - @Nullable - @Overwrite - public LivingEntity getExplosivePlacedBy() { - if (this.exploder == null) { - return null; - } else if (this.exploder instanceof TNTEntity) { - return ((TNTEntity) this.exploder).getTntPlacedBy(); - } else if (this.exploder instanceof LivingEntity) { - return (LivingEntity) this.exploder; - } else if (this.exploder instanceof DamagingProjectileEntity) { - return ((DamagingProjectileEntity) this.exploder).shootingEntity; - } else { - return null; - } - } } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/IBlockReaderMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/IBlockReaderMixin.java index baff2349..3a69e1a9 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/IBlockReaderMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/IBlockReaderMixin.java @@ -2,12 +2,12 @@ package io.izzel.arclight.common.mixin.core.world; import io.izzel.arclight.common.bridge.world.IBlockReaderBridge; import net.minecraft.block.BlockState; -import net.minecraft.fluid.IFluidState; +import net.minecraft.fluid.FluidState; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockRayTraceResult; import net.minecraft.util.math.RayTraceContext; -import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.shapes.VoxelShape; +import net.minecraft.util.math.vector.Vector3d; import net.minecraft.world.IBlockReader; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -19,15 +19,15 @@ public interface IBlockReaderMixin extends IBlockReaderBridge { // @formatter:off @Shadow BlockState getBlockState(BlockPos pos); - @Shadow IFluidState getFluidState(BlockPos pos); - @Shadow @Nullable BlockRayTraceResult rayTraceBlocks(Vec3d p_217296_1_, Vec3d p_217296_2_, BlockPos p_217296_3_, VoxelShape p_217296_4_, BlockState p_217296_5_); + @Shadow FluidState getFluidState(BlockPos pos); + @Shadow @Nullable BlockRayTraceResult rayTraceBlocks(Vector3d p_217296_1_, Vector3d p_217296_2_, BlockPos p_217296_3_, VoxelShape p_217296_4_, BlockState p_217296_5_); // @formatter:on default BlockRayTraceResult rayTraceBlock(RayTraceContext context, BlockPos pos) { BlockState blockstate = this.getBlockState(pos); - IFluidState ifluidstate = this.getFluidState(pos); - Vec3d vec3d = context.getStartVec(); - Vec3d vec3d1 = context.getStartVec(); + FluidState ifluidstate = this.getFluidState(pos); + Vector3d vec3d = context.getStartVec(); + Vector3d vec3d1 = context.getStartVec(); VoxelShape voxelshape = context.getBlockShape(blockstate, (IBlockReader) this, pos); BlockRayTraceResult blockraytraceresult = this.rayTraceBlocks(vec3d, vec3d1, pos, voxelshape, blockstate); VoxelShape voxelshape1 = context.getFluidShape(ifluidstate, (IBlockReader) this, pos); diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/chunk/storage/ChunkLoaderMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/chunk/storage/ChunkLoaderMixin.java deleted file mode 100644 index f23f2867..00000000 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/chunk/storage/ChunkLoaderMixin.java +++ /dev/null @@ -1,17 +0,0 @@ -package io.izzel.arclight.common.mixin.core.world.chunk.storage; - -import io.izzel.arclight.common.bridge.world.dimension.DimensionTypeBridge; -import net.minecraft.world.chunk.storage.ChunkLoader; -import net.minecraft.world.dimension.DimensionType; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.ModifyArg; - -@Mixin(ChunkLoader.class) -public class ChunkLoaderMixin { - - @ModifyArg(method = "updateChunkData", index = 0, at = @At(value = "INVOKE", target = "Lnet/minecraft/world/gen/feature/structure/LegacyStructureDataUtil;func_215130_a(Lnet/minecraft/world/dimension/DimensionType;Lnet/minecraft/world/storage/DimensionSavedDataManager;)Lnet/minecraft/world/gen/feature/structure/LegacyStructureDataUtil;")) - private DimensionType arclight$dimType(DimensionType dim) { - return ((DimensionTypeBridge) dim).bridge$getType(); - } -} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mod/ArclightConstants.java b/arclight-common/src/main/java/io/izzel/arclight/common/mod/ArclightConstants.java index 64cb06b3..ed43efd1 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mod/ArclightConstants.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mod/ArclightConstants.java @@ -5,7 +5,7 @@ import io.izzel.arclight.api.EnumHelper; import net.minecraft.util.ResourceLocation; import net.minecraft.util.Unit; import net.minecraft.world.server.TicketType; -import net.minecraft.world.storage.loot.LootParameter; +import net.minecraft.loot.LootParameter; import org.bukkit.TreeType; import org.bukkit.plugin.Plugin; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/ArclightCaptures.java b/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/ArclightCaptures.java index df2daa7c..e783470e 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/ArclightCaptures.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/ArclightCaptures.java @@ -7,6 +7,7 @@ import net.minecraft.entity.player.PlayerEntity; import net.minecraft.inventory.container.Container; import net.minecraft.util.Direction; import net.minecraft.util.Hand; +import net.minecraft.util.datafix.codec.DatapackCodec; import net.minecraft.util.math.BlockPos; import org.bukkit.TreeType; import org.bukkit.block.BlockState; @@ -219,6 +220,20 @@ public class ArclightCaptures { } } + private static transient DatapackCodec datapackCodec; + + public static void captureDatapackConfig(DatapackCodec codec) { + datapackCodec = codec; + } + + public static DatapackCodec getDatapackConfig() { + try { + return datapackCodec; + } finally { + datapackCodec = null; + } + } + private static void recapture(String type) { throw new IllegalStateException("Recapturing " + type); } diff --git a/arclight-common/src/main/resources/mixins.arclight.core.json b/arclight-common/src/main/resources/mixins.arclight.core.json index bd01e854..76754b76 100644 --- a/arclight-common/src/main/resources/mixins.arclight.core.json +++ b/arclight-common/src/main/resources/mixins.arclight.core.json @@ -132,7 +132,6 @@ "entity.ai.brain.task.InteractWithDoorTaskMixin", "entity.ai.goal.BreakBlockGoalMixin", "entity.ai.goal.BreakDoorGoalMixin", - "entity.ai.goal.BreedGoalMixin", "entity.ai.goal.DefendVillageTargetGoalMixin", "entity.ai.goal.EatGrassGoalMixin", "entity.ai.goal.FollowOwnerGoalMixin", @@ -154,7 +153,6 @@ "entity.item.ExperienceBottleEntityMixin", "entity.item.ExperienceOrbEntityMixin", "entity.item.FallingBlockEntityMixin", - "entity.item.FireworkRocketEntityMixin", "entity.item.HangingEntityMixin", "entity.item.ItemEntityMixin", "entity.item.ItemFrameEntityMixin", @@ -162,8 +160,8 @@ "entity.item.PaintingEntityMixin", "entity.item.TNTEntityMixin", "entity.item.minecart.AbstractMinecartEntityMixin", - "entity.item.minecart.ContainerMinecartEntityMixin", "entity.item.minecart.CommandBlockMinecartEntity_MinecartCommandLogicMixin", + "entity.item.minecart.ContainerMinecartEntityMixin", "entity.merchant.IMerchantMixin", "entity.merchant.villager.AbstractVillagerEntityMixin", "entity.merchant.villager.VillagerEntityMixin", @@ -188,21 +186,18 @@ "entity.monster.SilverfishEntity_SummonSilverfishGoalMixin", "entity.monster.SlimeEntityMixin", "entity.monster.SpellcastingIllagerEntity_UseSpellGoalMixin", - "entity.monster.SpellcastingIllagerEntityMixin", "entity.monster.SpiderEntityMixin", "entity.monster.VexEntity_CopyOwnerTargetGoalMixin", "entity.monster.WitchEntityMixin", "entity.monster.WitherSkeletonEntityMixin", "entity.monster.ZombieEntityMixin", - "entity.monster.ZombiePigmanEntity_HurtByAggressorGoalMixin", - "entity.monster.ZombifiedPiglinEntityMixin", "entity.monster.ZombieVillagerEntityMixin", + "entity.monster.ZombifiedPiglinEntityMixin", "entity.passive.AnimalEntityMixin", "entity.passive.BatEntityMixin", "entity.passive.BeeEntity_AngerGoalMixin", "entity.passive.BeeEntity_FindPollinationTargetGoalMixin", "entity.passive.BeeEntityMixin", - "entity.passive.CatEntityMixin", "entity.passive.ChickenEntityMixin", "entity.passive.CowEntityMixin", "entity.passive.DolphinEntity_SwimWithPlayerGoalMixin", @@ -243,7 +238,6 @@ "entity.projectile.FireballEntityMixin", "entity.projectile.FireworkRocketEntityMixin", "entity.projectile.FishingBobberEntityMixin", - "entity.projectile.LlamaSpitEntityMixin", "entity.projectile.PotionEntityMixin", "entity.projectile.ProjectileEntityMixin", "entity.projectile.ProjectileItemEntityMixin", @@ -331,6 +325,13 @@ "item.crafting.SmokingRecipeMixin", "item.crafting.SpecialRecipeMixin", "item.crafting.StonecuttingRecipeMixin", + "loot.LootEntry_SerializerMixin", + "loot.LootParametersMixin", + "loot.LootTableManagerMixin", + "loot.LootTableMixin", + "loot.conditions.RandomChanceWithLootingMixin", + "loot.conditions.SurvivesExplosionMixin", + "loot.functions.LootingEnchantBonusMixin", "network.NetworkManagerMixin", "network.PacketThreadUtilMixin", "network.datasync.EntityDataManagerMixin", @@ -348,6 +349,7 @@ "network.status.ServerStatusNetHandlerMixin", "potion.EffectMixin", "server.CustomServerBossInfoMixin", + "server.MainMixin", "server.MinecraftServerMixin", "server.dedicated.DedicatedServerMixin", "server.management.BanEntryMixin", @@ -383,6 +385,7 @@ "util.IndirectEntityDamageSourceMixin", "util.IWorldPosCallableMixin", "util.text.ColorMixin", + "util.text.ITextComponentMixin", "util.text.StyleMixin", "village.VillageSiegeMixin", "world.ExplosionMixin", @@ -395,7 +398,6 @@ "world.biome.BiomeContainerMixin", "world.border.WorldBorderMixin", "world.chunk.ChunkMixin", - "world.chunk.storage.ChunkLoaderMixin", "world.chunk.storage.RegionFileCacheMixin", "world.dimension.DimensionMixin", "world.dimension.DimensionTypeMixin", @@ -422,12 +424,6 @@ "world.storage.MapDataMixin", "world.storage.SaveFormatMixin", "world.storage.SaveHandlerMixin", - "world.storage.WorldInfoMixin", - "world.storage.loot.LootParametersMixin", - "world.storage.loot.LootTableManagerMixin", - "world.storage.loot.LootTableMixin", - "world.storage.loot.conditions.RandomChanceWithLootingMixin", - "world.storage.loot.conditions.SurvivesExplosionMixin", - "world.storage.loot.functions.LootingEnchantBonusMixin" + "world.storage.WorldInfoMixin" ] } \ No newline at end of file