Replace all ATs with Mixin on 1.13+ in preparation for Fabric

This commit is contained in:
Jonas Herzig
2019-04-26 11:20:31 +02:00
parent d5b9e60c4d
commit 17fe5b345f
67 changed files with 1035 additions and 399 deletions

View File

@@ -3,6 +3,8 @@ package com.replaymod.replay;
import com.google.common.base.Preconditions;
import com.google.common.io.Files;
import com.replaymod.core.ReplayMod;
import com.replaymod.core.mixin.MinecraftAccessor;
import com.replaymod.core.mixin.TimerAccessor;
import com.replaymod.core.utils.Restrictions;
import com.replaymod.replay.camera.CameraEntity;
import com.replaymod.replaystudio.io.ReplayInputStream;
@@ -26,6 +28,7 @@ import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.network.*;
import net.minecraft.network.login.server.SPacketLoginSuccess;
import net.minecraft.network.play.server.*;
import net.minecraft.util.Timer;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.text.ITextComponent;
import net.minecraft.world.EnumDifficulty;
@@ -515,7 +518,7 @@ public class FullReplaySender extends ChannelDuplexHandler implements ReplaySend
//#endif
EnumDifficulty difficulty = packet.getDifficulty();
//#if MC>=11300
int maxPlayers = packet.maxPlayers;
int maxPlayers = 0; // literally never used by vanilla (i.e. no accessor)
//#else
//$$ int maxPlayers = packet.getMaxPlayers();
//#endif
@@ -694,10 +697,11 @@ public class FullReplaySender extends ChannelDuplexHandler implements ReplaySend
@Override
public void setReplaySpeed(final double d) {
if(d != 0) this.replaySpeed = d;
TimerAccessor timer = (TimerAccessor) ((MinecraftAccessor) mc).getTimer();
//#if MC>=11200
mc.timer.tickLength = WrappedTimer.DEFAULT_MS_PER_TICK / (float) d;
timer.setTickLength(WrappedTimer.DEFAULT_MS_PER_TICK / (float) d);
//#else
//$$ mc.timer.timerSpeed = (float) d;
//$$ timer.setTimerSpeed((float) d);
//#endif
}

View File

@@ -7,6 +7,7 @@ import net.minecraft.client.Minecraft;
import net.minecraft.util.Timer;
//#if MC>=11300
import com.replaymod.core.versions.MCVer;
import org.lwjgl.glfw.GLFW;
//#else
//$$ import com.replaymod.replay.events.ReplayDispatchKeypressesEvent;
@@ -60,7 +61,7 @@ public class InputReplayTimer extends WrappedTimer {
//#if MC>=11300
if (mc.currentScreen == null || mc.currentScreen.allowUserInput) {
GLFW.glfwPollEvents();
mc.processKeyBinds();
MCVer.processKeyBinds();
}
mc.keyboardListener.tick();
//#else

View File

@@ -4,6 +4,8 @@ import com.google.common.io.Files;
import com.google.common.util.concurrent.ListenableFuture;
import com.google.common.util.concurrent.ListenableFutureTask;
import com.google.common.util.concurrent.SettableFuture;
import com.replaymod.core.mixin.MinecraftAccessor;
import com.replaymod.core.versions.MCVer;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
@@ -16,6 +18,8 @@ import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.Queue;
import java.util.concurrent.FutureTask;
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
@Getter
@@ -50,7 +54,7 @@ public class NoGuiScreenshot {
GlStateManager.enableTexture2D();
//#if MC>=11300
mc.entityRenderer.renderWorld(mc.timer.renderPartialTicks, System.nanoTime());
mc.entityRenderer.renderWorld(MCVer.getRenderPartialTicks(), System.nanoTime());
//#else
//#if MC>=10809
//$$ mc.entityRenderer.updateCameraAndRender(mc.timer.renderPartialTicks, System.nanoTime());
@@ -117,8 +121,10 @@ public class NoGuiScreenshot {
// Make sure we are not somewhere in the middle of the rendering process but always at the beginning
// of the game loop. We cannot use the addScheduledTask method as it'll run the task if called
// from the minecraft thread which is exactly what we want to avoid.
synchronized (mc.scheduledTasks) {
mc.scheduledTasks.add(ListenableFutureTask.create(runnable, null));
Queue<FutureTask<?>> scheduledTasks = ((MinecraftAccessor) mc).getScheduledTasks();
//noinspection SynchronizationOnLocalVariableOrMethodParameter
synchronized (scheduledTasks) {
scheduledTasks.add(ListenableFutureTask.create(runnable, null));
}
return future;
}

View File

@@ -1,7 +1,6 @@
//#if MC>=10904
package com.replaymod.replay;
import com.github.steveice10.mc.auth.data.GameProfile;
import com.github.steveice10.mc.protocol.data.game.PlayerListEntry;
import com.github.steveice10.mc.protocol.data.game.PlayerListEntryAction;
import com.github.steveice10.mc.protocol.data.game.chunk.BlockStorage;
@@ -29,7 +28,6 @@ import com.github.steveice10.mc.protocol.packet.ingame.server.world.ServerMultiB
import com.github.steveice10.mc.protocol.packet.ingame.server.world.ServerNotifyClientPacket;
import com.github.steveice10.mc.protocol.packet.ingame.server.world.ServerUnloadChunkPacket;
import com.github.steveice10.mc.protocol.packet.ingame.server.world.ServerUpdateTimePacket;
import com.github.steveice10.mc.protocol.packet.login.server.LoginSuccessPacket;
import com.github.steveice10.mc.protocol.util.NetUtil;
import com.github.steveice10.packetlib.io.NetInput;
import com.github.steveice10.packetlib.io.NetOutput;
@@ -44,6 +42,8 @@ import com.google.common.util.concurrent.FutureCallback;
import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture;
import com.google.common.util.concurrent.SettableFuture;
import com.replaymod.core.mixin.MinecraftAccessor;
import com.replaymod.core.mixin.TimerAccessor;
import com.replaymod.core.utils.Utils;
import com.replaymod.replaystudio.PacketData;
import com.replaymod.replaystudio.io.ReplayInputStream;
@@ -222,10 +222,11 @@ public class QuickReplaySender extends ChannelHandlerAdapter implements ReplaySe
}
this.replaySpeed = factor;
}
TimerAccessor timer = (TimerAccessor) ((MinecraftAccessor) mc).getTimer();
//#if MC>=11200
mc.timer.tickLength = WrappedTimer.DEFAULT_MS_PER_TICK / (float) factor;
timer.setTickLength(WrappedTimer.DEFAULT_MS_PER_TICK / (float) factor);
//#else
//$$ mc.timer.timerSpeed = (float) factor;
//$$ timer.setTimerSpeed((float) factor);
//#endif
}

View File

@@ -4,6 +4,8 @@ import com.google.common.base.Preconditions;
import com.google.common.util.concurrent.FutureCallback;
import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture;
import com.replaymod.core.mixin.MinecraftAccessor;
import com.replaymod.core.mixin.TimerAccessor;
import com.replaymod.core.utils.Restrictions;
import com.replaymod.core.utils.Utils;
import com.replaymod.core.utils.WrappedTimer;
@@ -12,6 +14,7 @@ import com.replaymod.replay.camera.SpectatorCameraController;
import com.replaymod.replay.events.ReplayCloseEvent;
import com.replaymod.replay.events.ReplayOpenEvent;
import com.replaymod.replay.gui.overlay.GuiReplayOverlay;
import com.replaymod.replay.mixin.EntityLivingBaseAccessor;
import com.replaymod.replaystudio.data.Marker;
import com.replaymod.replaystudio.replay.ReplayFile;
import com.replaymod.replaystudio.util.Location;
@@ -194,10 +197,11 @@ public class ReplayHandler {
mc.loadWorld(null);
}
TimerAccessor timer = (TimerAccessor) ((MinecraftAccessor) mc).getTimer();
//#if MC>=11200
mc.timer.tickLength = WrappedTimer.DEFAULT_MS_PER_TICK;
timer.setTickLength(WrappedTimer.DEFAULT_MS_PER_TICK);
//#else
//$$ mc.timer.timerSpeed = 1;
//$$ timer.setTimerSpeed(1);
//#endif
overlay.setVisible(false);
@@ -666,9 +670,10 @@ public class ReplayHandler {
//#if MC>=11300
if (entity instanceof EntityLivingBase && !(entity instanceof CameraEntity)) {
EntityLivingBase e = (EntityLivingBase) entity;
e.setPosition(e.interpTargetX, e.interpTargetY, e.interpTargetZ);
e.rotationYaw = (float) e.interpTargetYaw;
e.rotationPitch = (float) e.interpTargetPitch;
EntityLivingBaseAccessor ea = (EntityLivingBaseAccessor) e;
e.setPosition(ea.getInterpTargetX(), ea.getInterpTargetY(), ea.getInterpTargetZ());
e.rotationYaw = (float) ea.getInterpTargetYaw();
e.rotationPitch = (float) ea.getInterpTargetPitch();
}
//#else
//$$ if (entity instanceof EntityOtherPlayerMP) {

View File

@@ -7,6 +7,7 @@ import com.google.common.util.concurrent.ListenableFuture;
import com.replaymod.core.KeyBindingRegistry;
import com.replaymod.core.Module;
import com.replaymod.core.ReplayMod;
import com.replaymod.core.mixin.MinecraftAccessor;
import com.replaymod.core.utils.ModCompat;
import com.replaymod.core.versions.MCVer;
import com.replaymod.core.versions.MCVer.Keyboard;
@@ -153,8 +154,8 @@ public class ReplayModReplay implements Module {
}
});
Minecraft mc = core.getMinecraft();
mc.timer = new InputReplayTimer(mc.timer, this);
MinecraftAccessor mc = (MinecraftAccessor) core.getMinecraft();
mc.setTimer(new InputReplayTimer(mc.getTimer(), this));
new GuiHandler(this).register();
}

View File

@@ -1,5 +1,7 @@
package com.replaymod.replay;
import com.replaymod.core.mixin.MinecraftAccessor;
import com.replaymod.core.mixin.TimerAccessor;
import net.minecraft.client.Minecraft;
import static com.replaymod.core.versions.MCVer.getMinecraft;
@@ -13,10 +15,11 @@ public interface ReplaySender {
*/
public default boolean paused() {
Minecraft mc = getMinecraft();
TimerAccessor timer = (TimerAccessor) ((MinecraftAccessor) mc).getTimer();
//#if MC>=11200
return mc.timer.tickLength == Float.POSITIVE_INFINITY;
return timer.getTickLength() == Float.POSITIVE_INFINITY;
//#else
//$$ return mc.timer.timerSpeed == 0;
//$$ return timer.getTimerSpeed() == 0;
//#endif
}

View File

@@ -7,6 +7,7 @@ import com.replaymod.core.versions.MCVer;
import com.replaymod.replay.ReplayModReplay;
import com.replaymod.replay.Setting;
import com.replaymod.replay.events.ReplayChatMessageEvent;
import com.replaymod.replay.mixin.FirstPersonRendererAccessor;
import com.replaymod.replaystudio.util.Location;
import lombok.Getter;
import lombok.Setter;
@@ -71,6 +72,7 @@ import static com.replaymod.core.versions.MCVer.*;
* During a replay the player should be an instance of this class.
* Camera movement is controlled by a separate {@link CameraController}.
*/
@SuppressWarnings("EntityConstructor")
public class CameraEntity
//#if MC>=10800
extends EntityPlayerSP
@@ -497,7 +499,8 @@ public class CameraEntity
//#endif
mc.pointedEntity);
// Make sure we don't exit right away
mc.gameSettings.keyBindSneak.pressTime = 0;
//noinspection StatementWithEmptyBody
while (mc.gameSettings.keyBindSneak.isPressed());
}
}
@@ -604,12 +607,13 @@ public class CameraEntity
lastHandRendered = player;
//#if MC>=10904
mc.entityRenderer.itemRenderer.prevEquippedProgressMainHand = 1;
mc.entityRenderer.itemRenderer.prevEquippedProgressOffHand = 1;
mc.entityRenderer.itemRenderer.equippedProgressMainHand = 1;
mc.entityRenderer.itemRenderer.equippedProgressOffHand = 1;
mc.entityRenderer.itemRenderer.itemStackMainHand = player.getItemStackFromSlot(EntityEquipmentSlot.MAINHAND);
mc.entityRenderer.itemRenderer.itemStackOffHand = player.getItemStackFromSlot(EntityEquipmentSlot.OFFHAND);
FirstPersonRendererAccessor acc = (FirstPersonRendererAccessor) mc.entityRenderer.itemRenderer;
acc.setPrevEquippedProgressMainHand(1);
acc.setPrevEquippedProgressOffHand(1);
acc.setEquippedProgressMainHand(1);
acc.setEquippedProgressOffHand(1);
acc.setItemStackMainHand(player.getItemStackFromSlot(EntityEquipmentSlot.MAINHAND));
acc.setItemStackOffHand(player.getItemStackFromSlot(EntityEquipmentSlot.OFFHAND));
//#else
//$$ mc.entityRenderer.itemRenderer.prevEquippedProgress = 1;
//$$ mc.entityRenderer.itemRenderer.equippedProgress = 1;

View File

@@ -1,6 +1,7 @@
package com.replaymod.replay.camera;
import com.replaymod.replay.ReplayModReplay;
import com.replaymod.replay.mixin.EntityPlayerAccessor;
import lombok.RequiredArgsConstructor;
import net.minecraft.client.Minecraft;
import net.minecraft.client.settings.KeyBinding;
@@ -32,7 +33,8 @@ public class SpectatorCameraController implements CameraController {
for (KeyBinding binding : Arrays.asList(mc.gameSettings.keyBindAttack, mc.gameSettings.keyBindUseItem,
mc.gameSettings.keyBindJump, mc.gameSettings.keyBindSneak, mc.gameSettings.keyBindForward,
mc.gameSettings.keyBindBack, mc.gameSettings.keyBindLeft, mc.gameSettings.keyBindRight)) {
binding.pressTime = 0;
//noinspection StatementWithEmptyBody
while (binding.isPressed());
}
// Prevent mouse movement
@@ -53,9 +55,11 @@ public class SpectatorCameraController implements CameraController {
EntityPlayer viewPlayer = (EntityPlayer) view;
camera.inventory = viewPlayer.inventory;
//#if MC>=10904
camera.itemStackMainHand = viewPlayer.itemStackMainHand;
EntityPlayerAccessor cameraA = (EntityPlayerAccessor) camera;
EntityPlayerAccessor viewPlayerA = (EntityPlayerAccessor) camera;
cameraA.setItemStackMainHand(viewPlayerA.getItemStackMainHand());
camera.swingingHand = viewPlayer.swingingHand;
camera.activeItemStackUseCount = viewPlayer.activeItemStackUseCount;
cameraA.setActiveItemStackUseCount(viewPlayerA.getActiveItemStackUseCount());
//#else
//$$ camera.itemInUse = viewPlayer.itemInUse;
//$$ camera.itemInUseCount = viewPlayer.itemInUseCount;

View File

@@ -0,0 +1,28 @@
package com.replaymod.replay.mixin;
import net.minecraft.entity.EntityLivingBase;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;
@Mixin(EntityLivingBase.class)
public interface EntityLivingBaseAccessor {
//#if MC>=11300
@Accessor
double getInterpTargetX();
@Accessor
double getInterpTargetY();
@Accessor
double getInterpTargetZ();
@Accessor
double getInterpTargetYaw();
@Accessor
double getInterpTargetPitch();
//#endif
//#if MC>=10904
@Accessor
int getActiveItemStackUseCount();
@Accessor
void setActiveItemStackUseCount(int value);
//#endif
}

View File

@@ -0,0 +1,16 @@
package com.replaymod.replay.mixin;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;
@Mixin(EntityPlayer.class)
public interface EntityPlayerAccessor extends EntityLivingBaseAccessor {
//#if MC>=10904
@Accessor
ItemStack getItemStackMainHand();
@Accessor
void setItemStackMainHand(ItemStack value);
//#endif
}

View File

@@ -0,0 +1,24 @@
package com.replaymod.replay.mixin;
import net.minecraft.client.renderer.FirstPersonRenderer;
import net.minecraft.item.ItemStack;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;
@Mixin(FirstPersonRenderer.class)
public interface FirstPersonRendererAccessor {
//#if MC>=10904
@Accessor
void setItemStackMainHand(ItemStack value);
@Accessor
void setItemStackOffHand(ItemStack value);
@Accessor
void setEquippedProgressMainHand(float value);
@Accessor
void setPrevEquippedProgressMainHand(float value);
@Accessor
void setEquippedProgressOffHand(float value);
@Accessor
void setPrevEquippedProgressOffHand(float value);
//#endif
}