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/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/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/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/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/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/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/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/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 d482ddf3..0c5cbac9 100644 --- a/arclight-common/src/main/resources/META-INF/accesstransformer.cfg +++ b/arclight-common/src/main/resources/META-INF/accesstransformer.cfg @@ -24,6 +24,12 @@ 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 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 index a434f51b..be8d7415 100644 --- a/arclight-common/src/main/resources/mixins.arclight.core.1_15.json +++ b/arclight-common/src/main/resources/mixins.arclight.core.1_15.json @@ -45,7 +45,13 @@ "block.TurtleEggBlockMixin_1_15", "block.VineBlockMixin_1_15", "block.WitherRoseBlockMixin", - "io.izzel.arclight.impl.mixin.v1_14.block.FarmlandBlockMixin_1_14", - "world.biome.BiomeContainerMixin" + "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 63af36ee..d974b658 100644 --- a/arclight-common/src/main/resources/mixins.arclight.core.json +++ b/arclight-common/src/main/resources/mixins.arclight.core.json @@ -60,20 +60,17 @@ "block.RedstoneTorchBlockMixin", "block.RedstoneWireBlockMixin", "block.SaplingBlockMixin", - "block.ScaffoldingBlockMixin", "block.SilverfishBlockMixin", - "block.SnowBlockMixin", "block.SpongeBlockMixin", - "block.StemBlockMixin", - "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", @@ -247,6 +244,7 @@ "inventory.container.PlayerContainerMixin", "inventory.container.RepairContainerMixin", "inventory.container.ShulkerBoxContainerMixin", + "inventory.container.SlotMixin", "inventory.container.StonecutterContainerMixin", "inventory.container.WorkbenchContainerMixin", "item.ArmorStandItemMixin", @@ -357,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-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 index 3a16bc89..08899b3a 100644 --- 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 @@ -44,6 +44,12 @@ "block.SugarCaneBlockMixin_1_14", "block.SweetBerryBushBlockMixin_1_14", "block.TurtleEggBlockMixin_1_14", - "block.VineBlockMixin_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