Update to MC 1.14 / Fabric
This commit is contained in:
@@ -7,17 +7,25 @@ import com.replaymod.core.utils.Restrictions;
|
||||
import com.replaymod.core.versions.MCVer.Keyboard;
|
||||
import com.replaymod.recording.handler.ConnectionEventHandler;
|
||||
import com.replaymod.recording.handler.GuiHandler;
|
||||
import com.replaymod.recording.mixin.NetworkManagerAccessor;
|
||||
import com.replaymod.recording.packet.PacketListener;
|
||||
import io.netty.channel.Channel;
|
||||
import io.netty.channel.ChannelDuplexHandler;
|
||||
import io.netty.channel.ChannelHandler;
|
||||
import io.netty.util.AttributeKey;
|
||||
import net.minecraft.network.NetworkManager;
|
||||
import net.minecraftforge.fml.network.NetworkRegistry;
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
|
||||
import static com.replaymod.core.versions.MCVer.*;
|
||||
//#if MC>=11400
|
||||
//$$ import net.fabricmc.fabric.api.network.ClientSidePacketRegistry;
|
||||
//#else
|
||||
import net.minecraftforge.fml.network.NetworkRegistry;
|
||||
//#endif
|
||||
|
||||
//#if MC>=11300
|
||||
//#else
|
||||
//$$ import io.netty.channel.ChannelDuplexHandler;
|
||||
//$$ import io.netty.channel.ChannelHandler;
|
||||
//#endif
|
||||
|
||||
public class ReplayModRecording implements Module {
|
||||
|
||||
@@ -55,22 +63,28 @@ public class ReplayModRecording implements Module {
|
||||
|
||||
@Override
|
||||
public void initClient() {
|
||||
FML_BUS.register(connectionEventHandler = new ConnectionEventHandler(LOGGER, core));
|
||||
connectionEventHandler = new ConnectionEventHandler(LOGGER, core);
|
||||
|
||||
new GuiHandler(core).register();
|
||||
|
||||
//#if MC>=11400
|
||||
//$$ ClientSidePacketRegistry.INSTANCE.register(Restrictions.PLUGIN_CHANNEL, (packetContext, packetByteBuf) -> {});
|
||||
//#else
|
||||
//#if MC>=11300
|
||||
NetworkRegistry.newEventChannel(Restrictions.PLUGIN_CHANNEL, () -> "0", any -> true, any -> true);
|
||||
//#else
|
||||
//$$ NetworkRegistry.INSTANCE.newChannel(Restrictions.PLUGIN_CHANNEL, new RestrictionsChannelHandler());
|
||||
//#endif
|
||||
//#endif
|
||||
}
|
||||
|
||||
@ChannelHandler.Sharable
|
||||
private static class RestrictionsChannelHandler extends ChannelDuplexHandler {}
|
||||
//#if MC<11300
|
||||
//$$ @ChannelHandler.Sharable
|
||||
//$$ private static class RestrictionsChannelHandler extends ChannelDuplexHandler {}
|
||||
//#endif
|
||||
|
||||
public void initiateRecording(NetworkManager networkManager) {
|
||||
Channel channel = networkManager.channel();
|
||||
Channel channel = ((NetworkManagerAccessor) networkManager).getChannel();
|
||||
if (channel.pipeline().get("ReplayModReplay_replaySender") != null) return;
|
||||
//#if MC>=11300
|
||||
if (channel.hasAttr(ATTR_CHECKED)) return;
|
||||
|
||||
@@ -10,14 +10,20 @@ import de.johni0702.minecraft.gui.container.VanillaGuiScreen;
|
||||
import de.johni0702.minecraft.gui.element.GuiButton;
|
||||
import de.johni0702.minecraft.gui.layout.CustomLayout;
|
||||
import de.johni0702.minecraft.gui.layout.HorizontalLayout;
|
||||
import de.johni0702.minecraft.gui.utils.EventRegistrations;
|
||||
import net.minecraft.client.gui.GuiIngameMenu;
|
||||
|
||||
//#if MC>=11400
|
||||
//$$ import de.johni0702.minecraft.gui.versions.callbacks.InitScreenCallback;
|
||||
//#else
|
||||
import net.minecraftforge.client.event.GuiScreenEvent;
|
||||
import net.minecraftforge.common.MinecraftForge;
|
||||
import net.minecraftforge.eventbus.api.SubscribeEvent;
|
||||
|
||||
import static com.replaymod.core.versions.MCVer.getGui;
|
||||
//#endif
|
||||
|
||||
public class GuiRecordingControls {
|
||||
public class GuiRecordingControls extends EventRegistrations {
|
||||
private ReplayMod core;
|
||||
private PacketListener packetListener;
|
||||
private boolean paused;
|
||||
@@ -60,20 +66,20 @@ public class GuiRecordingControls {
|
||||
updateState();
|
||||
}
|
||||
|
||||
public void register() {
|
||||
MinecraftForge.EVENT_BUS.register(this);
|
||||
}
|
||||
|
||||
public void unregister() {
|
||||
MinecraftForge.EVENT_BUS.unregister(this);
|
||||
}
|
||||
|
||||
//#if MC>=11400
|
||||
//$$ { on(InitScreenCallback.EVENT, (screen, buttons) -> {
|
||||
//$$ if (screen instanceof PauseMenuScreen) {
|
||||
//$$ show((PauseMenuScreen) screen);
|
||||
//$$ }
|
||||
//$$ }); }
|
||||
//#else
|
||||
@SubscribeEvent
|
||||
public void onGuiInit(GuiScreenEvent.InitGuiEvent.Post event) {
|
||||
if (getGui(event) instanceof GuiIngameMenu) {
|
||||
show((GuiIngameMenu) getGui(event));
|
||||
}
|
||||
}
|
||||
//#endif
|
||||
|
||||
private void updateState() {
|
||||
buttonPauseResume.setI18nLabel("replaymod.gui.recording." + (paused ? "resume" : "pause"));
|
||||
|
||||
@@ -1,24 +1,35 @@
|
||||
package com.replaymod.recording.gui;
|
||||
|
||||
import com.replaymod.core.SettingsRegistry;
|
||||
import com.replaymod.core.versions.MCVer;
|
||||
import com.replaymod.recording.Setting;
|
||||
import de.johni0702.minecraft.gui.GuiRenderer;
|
||||
import de.johni0702.minecraft.gui.MinecraftGuiRenderer;
|
||||
import de.johni0702.minecraft.gui.utils.EventRegistrations;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.gui.FontRenderer;
|
||||
import net.minecraft.client.gui.Gui;
|
||||
import net.minecraft.client.resources.I18n;
|
||||
|
||||
//#if MC>=11400
|
||||
//$$ import de.johni0702.minecraft.gui.versions.callbacks.PostRenderHudCallback;
|
||||
//#else
|
||||
import net.minecraftforge.client.event.RenderGameOverlayEvent;
|
||||
import net.minecraftforge.common.MinecraftForge;
|
||||
import net.minecraftforge.eventbus.api.SubscribeEvent;
|
||||
//#endif
|
||||
|
||||
import static com.replaymod.core.ReplayMod.TEXTURE;
|
||||
import static com.replaymod.core.ReplayMod.TEXTURE_SIZE;
|
||||
import static com.replaymod.core.versions.MCVer.*;
|
||||
import static net.minecraft.client.renderer.GlStateManager.*;
|
||||
|
||||
//#if MC<11300
|
||||
//$$ import static net.minecraft.client.renderer.GlStateManager.*;
|
||||
//#endif
|
||||
|
||||
/**
|
||||
* Renders overlay during recording.
|
||||
*/
|
||||
public class GuiRecordingOverlay {
|
||||
public class GuiRecordingOverlay extends EventRegistrations {
|
||||
private final Minecraft mc;
|
||||
private final SettingsRegistry settingsRegistry;
|
||||
private final GuiRecordingControls guiControls;
|
||||
@@ -29,30 +40,26 @@ public class GuiRecordingOverlay {
|
||||
this.guiControls = guiControls;
|
||||
}
|
||||
|
||||
public void register() {
|
||||
MinecraftForge.EVENT_BUS.register(this);
|
||||
}
|
||||
|
||||
public void unregister() {
|
||||
MinecraftForge.EVENT_BUS.unregister(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Render the recording icon and text in the top left corner of the screen.
|
||||
* @param event Rendered post game overlay
|
||||
*/
|
||||
//#if MC>=11400
|
||||
//$$ { on(PostRenderHudCallback.EVENT, partialTicks -> renderRecordingIndicator()); }
|
||||
//$$ private void renderRecordingIndicator() {
|
||||
//#else
|
||||
@SubscribeEvent
|
||||
public void renderRecordingIndicator(RenderGameOverlayEvent.Post event) {
|
||||
if (getType(event) != RenderGameOverlayEvent.ElementType.ALL) return;
|
||||
//#endif
|
||||
if (guiControls.isStopped()) return;
|
||||
if (settingsRegistry.get(Setting.INDICATOR)) {
|
||||
FontRenderer fontRenderer = mc.fontRenderer;
|
||||
String text = guiControls.isPaused() ? I18n.format("replaymod.gui.paused") : I18n.format("replaymod.gui.recording");
|
||||
fontRenderer.drawString(text.toUpperCase(), 30, 18 - (fontRenderer.FONT_HEIGHT / 2), 0xffffffff);
|
||||
bindTexture(TEXTURE);
|
||||
resetColor();
|
||||
enableAlpha();
|
||||
Gui.drawModalRectWithCustomSizedTexture(10, 10, 58, 20, 16, 16, TEXTURE_SIZE, TEXTURE_SIZE);
|
||||
GuiRenderer renderer = new MinecraftGuiRenderer(MCVer.newScaledResolution(mc));
|
||||
renderer.drawTexturedRect(10, 10, 58, 20, 16, 16, 16, 16, TEXTURE_SIZE, TEXTURE_SIZE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,11 +7,13 @@ import com.replaymod.editor.gui.MarkerProcessor;
|
||||
import com.replaymod.recording.Setting;
|
||||
import com.replaymod.recording.gui.GuiRecordingControls;
|
||||
import com.replaymod.recording.gui.GuiRecordingOverlay;
|
||||
import com.replaymod.recording.mixin.NetworkManagerAccessor;
|
||||
import com.replaymod.recording.packet.PacketListener;
|
||||
import com.replaymod.replaystudio.replay.ReplayFile;
|
||||
import com.replaymod.replaystudio.replay.ReplayMetaData;
|
||||
import com.replaymod.replaystudio.replay.ZipReplayFile;
|
||||
import com.replaymod.replaystudio.studio.ReplayStudio;
|
||||
import io.netty.channel.Channel;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.network.NetworkManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
@@ -108,7 +110,8 @@ public class ConnectionEventHandler {
|
||||
metaData.setDate(System.currentTimeMillis());
|
||||
metaData.setMcVersion(ReplayMod.getMinecraftVersion());
|
||||
packetListener = new PacketListener(core, currentFile.toPath(), replayFile, metaData);
|
||||
networkManager.channel().pipeline().addBefore(packetHandlerKey, "replay_recorder", packetListener);
|
||||
Channel channel = ((NetworkManagerAccessor) networkManager).getChannel();
|
||||
channel.pipeline().addBefore(packetHandlerKey, "replay_recorder", packetListener);
|
||||
|
||||
recordingEventHandler = new RecordingEventHandler(packetListener);
|
||||
recordingEventHandler.register();
|
||||
|
||||
@@ -7,15 +7,22 @@ import de.johni0702.minecraft.gui.container.GuiScreen;
|
||||
import de.johni0702.minecraft.gui.container.VanillaGuiScreen;
|
||||
import de.johni0702.minecraft.gui.element.GuiCheckbox;
|
||||
import de.johni0702.minecraft.gui.layout.CustomLayout;
|
||||
import de.johni0702.minecraft.gui.utils.EventRegistrations;
|
||||
import net.minecraft.client.gui.GuiMultiplayer;
|
||||
import net.minecraft.client.gui.GuiWorldSelection;
|
||||
|
||||
//#if MC>=11400
|
||||
//$$ import de.johni0702.minecraft.gui.versions.callbacks.InitScreenCallback;
|
||||
//$$ import net.minecraft.client.gui.Screen;
|
||||
//#else
|
||||
import net.minecraftforge.client.event.GuiScreenEvent;
|
||||
import net.minecraftforge.common.MinecraftForge;
|
||||
import net.minecraftforge.eventbus.api.SubscribeEvent;
|
||||
|
||||
import static com.replaymod.core.versions.MCVer.getGui;
|
||||
//#endif
|
||||
|
||||
public class GuiHandler {
|
||||
public class GuiHandler extends EventRegistrations {
|
||||
|
||||
private final ReplayMod mod;
|
||||
|
||||
@@ -23,14 +30,16 @@ public class GuiHandler {
|
||||
this.mod = mod;
|
||||
}
|
||||
|
||||
public void register() {
|
||||
MinecraftForge.EVENT_BUS.register(this);
|
||||
}
|
||||
|
||||
//#if MC>=11400
|
||||
//$$ { on(InitScreenCallback.EVENT, (screen, buttons) -> onGuiInit(screen)); }
|
||||
//$$ private void onGuiInit(Screen gui) {
|
||||
//#else
|
||||
@SubscribeEvent
|
||||
public void onGuiInit(GuiScreenEvent.InitGuiEvent.Post event) {
|
||||
if (getGui(event) instanceof GuiWorldSelection || getGui(event) instanceof GuiMultiplayer) {
|
||||
boolean sp = getGui(event) instanceof GuiWorldSelection;
|
||||
net.minecraft.client.gui.GuiScreen gui = getGui(event);
|
||||
//#endif
|
||||
if (gui instanceof GuiWorldSelection || gui instanceof GuiMultiplayer) {
|
||||
boolean sp = gui instanceof GuiWorldSelection;
|
||||
SettingsRegistry settingsRegistry = mod.getSettingsRegistry();
|
||||
Setting<Boolean> setting = sp ? Setting.RECORD_SINGLEPLAYER : Setting.RECORD_SERVER;
|
||||
|
||||
@@ -42,7 +51,7 @@ public class GuiHandler {
|
||||
settingsRegistry.save();
|
||||
});
|
||||
|
||||
VanillaGuiScreen.setup(getGui(event)).setLayout(new CustomLayout<GuiScreen>() {
|
||||
VanillaGuiScreen.setup(gui).setLayout(new CustomLayout<GuiScreen>() {
|
||||
@Override
|
||||
protected void layout(GuiScreen container, int width, int height) {
|
||||
//size(recordingCheckbox, 200, 20);
|
||||
|
||||
@@ -3,17 +3,25 @@ package com.replaymod.recording.handler;
|
||||
import com.replaymod.recording.mixin.EntityLivingBaseAccessor;
|
||||
import com.replaymod.recording.mixin.IntegratedServerAccessor;
|
||||
import com.replaymod.recording.packet.PacketListener;
|
||||
import de.johni0702.minecraft.gui.utils.EventRegistrations;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.entity.EntityPlayerSP;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.network.Packet;
|
||||
import net.minecraft.network.play.server.*;
|
||||
import net.minecraft.server.integrated.IntegratedServer;
|
||||
// FIXME not (yet?) 1.13 import net.minecraftforge.event.entity.minecart.MinecartInteractEvent;
|
||||
|
||||
//#if MC>=11400
|
||||
//$$ import com.replaymod.core.events.PreRenderCallback;
|
||||
//$$ import de.johni0702.minecraft.gui.versions.callbacks.PreTickCallback;
|
||||
//#else
|
||||
import net.minecraftforge.event.entity.player.PlayerSleepInBedEvent;
|
||||
import net.minecraftforge.eventbus.api.SubscribeEvent;
|
||||
import net.minecraftforge.fml.common.gameevent.PlayerEvent.ItemPickupEvent;
|
||||
import net.minecraftforge.fml.common.gameevent.TickEvent;
|
||||
//#endif
|
||||
|
||||
//#if MC>=10904
|
||||
//#if MC>=11300
|
||||
@@ -37,7 +45,7 @@ import java.util.Objects;
|
||||
|
||||
import static com.replaymod.core.versions.MCVer.*;
|
||||
|
||||
public class RecordingEventHandler {
|
||||
public class RecordingEventHandler extends EventRegistrations {
|
||||
|
||||
private final Minecraft mc = getMinecraft();
|
||||
private final PacketListener packetListener;
|
||||
@@ -57,15 +65,15 @@ public class RecordingEventHandler {
|
||||
this.packetListener = packetListener;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void register() {
|
||||
FML_BUS.register(this);
|
||||
FORGE_BUS.register(this);
|
||||
super.register();
|
||||
((RecordingEventSender) mc.renderGlobal).setRecordingEventHandler(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void unregister() {
|
||||
FML_BUS.unregister(this);
|
||||
FORGE_BUS.unregister(this);
|
||||
super.unregister();
|
||||
RecordingEventSender recordingEventSender = ((RecordingEventSender) mc.renderGlobal);
|
||||
if (recordingEventSender.getRecordingEventHandler() == this) {
|
||||
recordingEventSender.setRecordingEventHandler(null);
|
||||
@@ -116,17 +124,24 @@ public class RecordingEventHandler {
|
||||
}
|
||||
//#endif
|
||||
|
||||
//#if MC>=11400
|
||||
//$$ { on(PreTickCallback.EVENT, this::onPlayerTick); }
|
||||
//$$ private void onPlayerTick() {
|
||||
//$$ if (mc.player == null) return;
|
||||
//#else
|
||||
@SubscribeEvent
|
||||
public void onPlayerTick(TickEvent.PlayerTickEvent e) {
|
||||
if(e.player != mc.player) return;
|
||||
//#endif
|
||||
EntityPlayerSP player = mc.player;
|
||||
try {
|
||||
if(e.player != mc.player) return;
|
||||
|
||||
boolean force = false;
|
||||
if(lastX == null || lastY == null || lastZ == null) {
|
||||
force = true;
|
||||
lastX = e.player.posX;
|
||||
lastY = e.player.posY;
|
||||
lastZ = e.player.posZ;
|
||||
lastX = player.posX;
|
||||
lastY = player.posY;
|
||||
lastZ = player.posZ;
|
||||
}
|
||||
|
||||
ticksSinceLastCorrection++;
|
||||
@@ -135,44 +150,44 @@ public class RecordingEventHandler {
|
||||
force = true;
|
||||
}
|
||||
|
||||
double dx = e.player.posX - lastX;
|
||||
double dy = e.player.posY - lastY;
|
||||
double dz = e.player.posZ - lastZ;
|
||||
double dx = player.posX - lastX;
|
||||
double dy = player.posY - lastY;
|
||||
double dz = player.posZ - lastZ;
|
||||
|
||||
lastX = e.player.posX;
|
||||
lastY = e.player.posY;
|
||||
lastZ = e.player.posZ;
|
||||
lastX = player.posX;
|
||||
lastY = player.posY;
|
||||
lastZ = player.posZ;
|
||||
|
||||
Packet packet;
|
||||
if (force || Math.abs(dx) > 8.0 || Math.abs(dy) > 8.0 || Math.abs(dz) > 8.0) {
|
||||
//#if MC>=10800
|
||||
packet = new SPacketEntityTeleport(e.player);
|
||||
packet = new SPacketEntityTeleport(player);
|
||||
//#else
|
||||
//$$ // In 1.7.10 the client player entity has its posY at eye height
|
||||
//$$ // but for all other entities it's at their feet (as it should be).
|
||||
//$$ // So, to correctly position the player, we teleport them to their feet (i.a. directly after spawn).
|
||||
//$$ // Note: this leaves the lastY value offset by the eye height but because it's only used for relative
|
||||
//$$ // movement, that doesn't matter.
|
||||
//$$ S18PacketEntityTeleport teleportPacket = new S18PacketEntityTeleport(e.player);
|
||||
//$$ teleportPacket.field_149457_c = MathHelper.floor_double(e.player.boundingBox.minY * 32);
|
||||
//$$ S18PacketEntityTeleport teleportPacket = new S18PacketEntityTeleport(player);
|
||||
//$$ teleportPacket.field_149457_c = MathHelper.floor_double(player.boundingBox.minY * 32);
|
||||
//$$ packet = teleportPacket;
|
||||
//#endif
|
||||
} else {
|
||||
byte newYaw = (byte) ((int) (e.player.rotationYaw * 256.0F / 360.0F));
|
||||
byte newPitch = (byte) ((int) (e.player.rotationPitch * 256.0F / 360.0F));
|
||||
byte newYaw = (byte) ((int) (player.rotationYaw * 256.0F / 360.0F));
|
||||
byte newPitch = (byte) ((int) (player.rotationPitch * 256.0F / 360.0F));
|
||||
|
||||
//#if MC>=10904
|
||||
packet = new SPacketEntity.Move(
|
||||
e.player.getEntityId(),
|
||||
player.getEntityId(),
|
||||
(short) Math.round(dx * 4096), (short) Math.round(dy * 4096), (short) Math.round(dz * 4096),
|
||||
newYaw, newPitch, e.player.onGround
|
||||
newYaw, newPitch, player.onGround
|
||||
);
|
||||
//#else
|
||||
//$$ packet = new S14PacketEntity.S17PacketEntityLookMove(e.player.getEntityId(),
|
||||
//$$ packet = new S14PacketEntity.S17PacketEntityLookMove(player.getEntityId(),
|
||||
//$$ (byte) Math.round(dx * 32), (byte) Math.round(dy * 32), (byte) Math.round(dz * 32),
|
||||
//$$ newYaw, newPitch
|
||||
//#if MC>=10800
|
||||
//$$ , e.player.onGround
|
||||
//$$ , player.onGround
|
||||
//#endif
|
||||
//$$ );
|
||||
//#endif
|
||||
@@ -181,22 +196,28 @@ public class RecordingEventHandler {
|
||||
packetListener.save(packet);
|
||||
|
||||
//HEAD POS
|
||||
int rotationYawHead = ((int)(e.player.rotationYawHead * 256.0F / 360.0F));
|
||||
int rotationYawHead = ((int)(player.rotationYawHead * 256.0F / 360.0F));
|
||||
|
||||
if(!Objects.equals(rotationYawHead, rotationYawHeadBefore)) {
|
||||
packetListener.save(new SPacketEntityHeadLook(e.player, (byte) rotationYawHead));
|
||||
packetListener.save(new SPacketEntityHeadLook(player, (byte) rotationYawHead));
|
||||
rotationYawHeadBefore = rotationYawHead;
|
||||
}
|
||||
|
||||
packetListener.save(new SPacketEntityVelocity(e.player.getEntityId(), e.player.motionX, e.player.motionY, e.player.motionZ));
|
||||
packetListener.save(new SPacketEntityVelocity(player.getEntityId(),
|
||||
//#if MC>=11400
|
||||
//$$ player.getVelocity()
|
||||
//#else
|
||||
player.motionX, player.motionY, player.motionZ
|
||||
//#endif
|
||||
));
|
||||
|
||||
//Animation Packets
|
||||
//Swing Animation
|
||||
if (e.player.isSwingInProgress && e.player.swingProgressInt == -1) {
|
||||
if (player.isSwingInProgress && player.swingProgressInt == -1) {
|
||||
packetListener.save(new SPacketAnimation(
|
||||
e.player,
|
||||
player,
|
||||
//#if MC>=10904
|
||||
e.player.swingingHand == EnumHand.MAIN_HAND ? 0 : 3
|
||||
player.swingingHand == EnumHand.MAIN_HAND ? 0 : 3
|
||||
//#else
|
||||
//$$ 0
|
||||
//#endif
|
||||
@@ -206,7 +227,7 @@ public class RecordingEventHandler {
|
||||
/*
|
||||
//Potion Effect Handling
|
||||
List<Integer> found = new ArrayList<Integer>();
|
||||
for(PotionEffect pe : (Collection<PotionEffect>)e.player.getActivePotionEffects()) {
|
||||
for(PotionEffect pe : (Collection<PotionEffect>)player.getActivePotionEffects()) {
|
||||
found.add(pe.getPotionID());
|
||||
if(lastEffects.contains(found)) continue;
|
||||
S1DPacketEntityEffect pee = new S1DPacketEntityEffect(entityID, pe);
|
||||
@@ -225,95 +246,95 @@ public class RecordingEventHandler {
|
||||
|
||||
//Inventory Handling
|
||||
//#if MC>=10904
|
||||
if (playerItems[0] != mc.player.getHeldItem(EnumHand.MAIN_HAND)) {
|
||||
playerItems[0] = mc.player.getHeldItem(EnumHand.MAIN_HAND);
|
||||
packetListener.save(new SPacketEntityEquipment(e.player.getEntityId(), EntityEquipmentSlot.MAINHAND, playerItems[0]));
|
||||
if (playerItems[0] != player.getHeldItem(EnumHand.MAIN_HAND)) {
|
||||
playerItems[0] = player.getHeldItem(EnumHand.MAIN_HAND);
|
||||
packetListener.save(new SPacketEntityEquipment(player.getEntityId(), EntityEquipmentSlot.MAINHAND, playerItems[0]));
|
||||
}
|
||||
|
||||
if (playerItems[1] != mc.player.getHeldItem(EnumHand.OFF_HAND)) {
|
||||
playerItems[1] = mc.player.getHeldItem(EnumHand.OFF_HAND);
|
||||
packetListener.save(new SPacketEntityEquipment(e.player.getEntityId(), EntityEquipmentSlot.OFFHAND, playerItems[1]));
|
||||
if (playerItems[1] != player.getHeldItem(EnumHand.OFF_HAND)) {
|
||||
playerItems[1] = player.getHeldItem(EnumHand.OFF_HAND);
|
||||
packetListener.save(new SPacketEntityEquipment(player.getEntityId(), EntityEquipmentSlot.OFFHAND, playerItems[1]));
|
||||
}
|
||||
|
||||
if (playerItems[2] != mc.player.getItemStackFromSlot(EntityEquipmentSlot.FEET)) {
|
||||
playerItems[2] = mc.player.getItemStackFromSlot(EntityEquipmentSlot.FEET);
|
||||
packetListener.save(new SPacketEntityEquipment(e.player.getEntityId(), EntityEquipmentSlot.FEET, playerItems[2]));
|
||||
if (playerItems[2] != player.getItemStackFromSlot(EntityEquipmentSlot.FEET)) {
|
||||
playerItems[2] = player.getItemStackFromSlot(EntityEquipmentSlot.FEET);
|
||||
packetListener.save(new SPacketEntityEquipment(player.getEntityId(), EntityEquipmentSlot.FEET, playerItems[2]));
|
||||
}
|
||||
|
||||
if (playerItems[3] != mc.player.getItemStackFromSlot(EntityEquipmentSlot.LEGS)) {
|
||||
playerItems[3] = mc.player.getItemStackFromSlot(EntityEquipmentSlot.LEGS);
|
||||
packetListener.save(new SPacketEntityEquipment(e.player.getEntityId(), EntityEquipmentSlot.LEGS, playerItems[3]));
|
||||
if (playerItems[3] != player.getItemStackFromSlot(EntityEquipmentSlot.LEGS)) {
|
||||
playerItems[3] = player.getItemStackFromSlot(EntityEquipmentSlot.LEGS);
|
||||
packetListener.save(new SPacketEntityEquipment(player.getEntityId(), EntityEquipmentSlot.LEGS, playerItems[3]));
|
||||
}
|
||||
|
||||
if (playerItems[4] != mc.player.getItemStackFromSlot(EntityEquipmentSlot.CHEST)) {
|
||||
playerItems[4] = mc.player.getItemStackFromSlot(EntityEquipmentSlot.CHEST);
|
||||
packetListener.save(new SPacketEntityEquipment(e.player.getEntityId(), EntityEquipmentSlot.CHEST, playerItems[4]));
|
||||
if (playerItems[4] != player.getItemStackFromSlot(EntityEquipmentSlot.CHEST)) {
|
||||
playerItems[4] = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST);
|
||||
packetListener.save(new SPacketEntityEquipment(player.getEntityId(), EntityEquipmentSlot.CHEST, playerItems[4]));
|
||||
}
|
||||
|
||||
if (playerItems[5] != mc.player.getItemStackFromSlot(EntityEquipmentSlot.HEAD)) {
|
||||
playerItems[5] = mc.player.getItemStackFromSlot(EntityEquipmentSlot.HEAD);
|
||||
packetListener.save(new SPacketEntityEquipment(e.player.getEntityId(), EntityEquipmentSlot.HEAD, playerItems[5]));
|
||||
if (playerItems[5] != player.getItemStackFromSlot(EntityEquipmentSlot.HEAD)) {
|
||||
playerItems[5] = player.getItemStackFromSlot(EntityEquipmentSlot.HEAD);
|
||||
packetListener.save(new SPacketEntityEquipment(player.getEntityId(), EntityEquipmentSlot.HEAD, playerItems[5]));
|
||||
}
|
||||
//#else
|
||||
//$$ if(playerItems[0] != mc.thePlayer.getHeldItem()) {
|
||||
//$$ playerItems[0] = mc.thePlayer.getHeldItem();
|
||||
//$$ S04PacketEntityEquipment pee = new S04PacketEntityEquipment(e.player.getEntityId(), 0, playerItems[0]);
|
||||
//$$ S04PacketEntityEquipment pee = new S04PacketEntityEquipment(player.getEntityId(), 0, playerItems[0]);
|
||||
//$$ packetListener.save(pee);
|
||||
//$$ }
|
||||
//$$
|
||||
//$$ if(playerItems[1] != mc.thePlayer.inventory.armorInventory[0]) {
|
||||
//$$ playerItems[1] = mc.thePlayer.inventory.armorInventory[0];
|
||||
//$$ S04PacketEntityEquipment pee = new S04PacketEntityEquipment(e.player.getEntityId(), 1, playerItems[1]);
|
||||
//$$ S04PacketEntityEquipment pee = new S04PacketEntityEquipment(player.getEntityId(), 1, playerItems[1]);
|
||||
//$$ packetListener.save(pee);
|
||||
//$$ }
|
||||
//$$
|
||||
//$$ if(playerItems[2] != mc.thePlayer.inventory.armorInventory[1]) {
|
||||
//$$ playerItems[2] = mc.thePlayer.inventory.armorInventory[1];
|
||||
//$$ S04PacketEntityEquipment pee = new S04PacketEntityEquipment(e.player.getEntityId(), 2, playerItems[2]);
|
||||
//$$ S04PacketEntityEquipment pee = new S04PacketEntityEquipment(player.getEntityId(), 2, playerItems[2]);
|
||||
//$$ packetListener.save(pee);
|
||||
//$$ }
|
||||
//$$
|
||||
//$$ if(playerItems[3] != mc.thePlayer.inventory.armorInventory[2]) {
|
||||
//$$ playerItems[3] = mc.thePlayer.inventory.armorInventory[2];
|
||||
//$$ S04PacketEntityEquipment pee = new S04PacketEntityEquipment(e.player.getEntityId(), 3, playerItems[3]);
|
||||
//$$ S04PacketEntityEquipment pee = new S04PacketEntityEquipment(player.getEntityId(), 3, playerItems[3]);
|
||||
//$$ packetListener.save(pee);
|
||||
//$$ }
|
||||
//$$
|
||||
//$$ if(playerItems[4] != mc.thePlayer.inventory.armorInventory[3]) {
|
||||
//$$ playerItems[4] = mc.thePlayer.inventory.armorInventory[3];
|
||||
//$$ S04PacketEntityEquipment pee = new S04PacketEntityEquipment(e.player.getEntityId(), 4, playerItems[4]);
|
||||
//$$ S04PacketEntityEquipment pee = new S04PacketEntityEquipment(player.getEntityId(), 4, playerItems[4]);
|
||||
//$$ packetListener.save(pee);
|
||||
//$$ }
|
||||
//#endif
|
||||
|
||||
//Leaving Ride
|
||||
|
||||
if((!mc.player.isPassenger() && lastRiding != -1) ||
|
||||
(mc.player.isPassenger() && lastRiding != getRidingEntity(mc.player).getEntityId())) {
|
||||
if(!mc.player.isPassenger()) {
|
||||
if((!player.isPassenger() && lastRiding != -1) ||
|
||||
(player.isPassenger() && lastRiding != getRiddenEntity(player).getEntityId())) {
|
||||
if(!player.isPassenger()) {
|
||||
lastRiding = -1;
|
||||
} else {
|
||||
lastRiding = getRidingEntity(mc.player).getEntityId();
|
||||
lastRiding = getRiddenEntity(player).getEntityId();
|
||||
}
|
||||
packetListener.save(new SPacketEntityAttach(
|
||||
//#if MC<10904
|
||||
//$$ 0,
|
||||
//#endif
|
||||
e.player, getRidingEntity(e.player)
|
||||
player, getRiddenEntity(player)
|
||||
));
|
||||
}
|
||||
|
||||
//Sleeping
|
||||
if(!mc.player.isPlayerSleeping() && wasSleeping) {
|
||||
packetListener.save(new SPacketAnimation(e.player, 2));
|
||||
if(!player.isPlayerSleeping() && wasSleeping) {
|
||||
packetListener.save(new SPacketAnimation(player, 2));
|
||||
wasSleeping = false;
|
||||
}
|
||||
|
||||
//#if MC>=10904
|
||||
// Active hand (e.g. eating, drinking, blocking)
|
||||
if (mc.player.isHandActive() ^ wasHandActive || mc.player.getActiveHand() != lastActiveHand) {
|
||||
wasHandActive = mc.player.isHandActive();
|
||||
lastActiveHand = mc.player.getActiveHand();
|
||||
if (player.isHandActive() ^ wasHandActive || player.getActiveHand() != lastActiveHand) {
|
||||
wasHandActive = player.isHandActive();
|
||||
lastActiveHand = player.getActiveHand();
|
||||
EntityDataManager dataManager = new EntityDataManager(null);
|
||||
int state = (wasHandActive ? 1 : 0) | (lastActiveHand == EnumHand.OFF_HAND ? 2 : 0);
|
||||
//#if MC>=11300
|
||||
@@ -321,7 +342,7 @@ public class RecordingEventHandler {
|
||||
//#else
|
||||
//$$ dataManager.register(EntityLiving.HAND_STATES, (byte) state);
|
||||
//#endif
|
||||
packetListener.save(new SPacketEntityMetadata(mc.player.getEntityId(), dataManager, true));
|
||||
packetListener.save(new SPacketEntityMetadata(player.getEntityId(), dataManager, true));
|
||||
}
|
||||
//#endif
|
||||
|
||||
@@ -330,6 +351,9 @@ public class RecordingEventHandler {
|
||||
}
|
||||
}
|
||||
|
||||
//#if MC>=11400
|
||||
//$$ // FIXME fabric
|
||||
//#else
|
||||
@SubscribeEvent
|
||||
public void onPickupItem(ItemPickupEvent event) {
|
||||
try {
|
||||
@@ -357,7 +381,11 @@ public class RecordingEventHandler {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
//#endif
|
||||
|
||||
//#if MC>=11400
|
||||
//$$ // FIXME fabric
|
||||
//#else
|
||||
@SubscribeEvent
|
||||
public void onSleep(PlayerSleepInBedEvent event) {
|
||||
try {
|
||||
@@ -387,6 +415,7 @@ public class RecordingEventHandler {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
//#endif
|
||||
|
||||
/* FIXME event not (yet?) on 1.13
|
||||
@SubscribeEvent
|
||||
@@ -432,9 +461,14 @@ public class RecordingEventHandler {
|
||||
}
|
||||
}
|
||||
|
||||
//#if MC>=11400
|
||||
//$$ { on(PreRenderCallback.EVENT, this::checkForGamePaused); }
|
||||
//$$ private void checkForGamePaused() {
|
||||
//#else
|
||||
@SubscribeEvent
|
||||
public void checkForGamePaused(TickEvent.RenderTickEvent event) {
|
||||
if (event.phase != TickEvent.Phase.START) return;
|
||||
//#endif
|
||||
if (mc.isIntegratedServerRunning()) {
|
||||
IntegratedServer server = mc.getIntegratedServer();
|
||||
if (server != null && ((IntegratedServerAccessor) server).isGamePaused()) {
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
//#if MC>=11300
|
||||
package com.replaymod.recording.mixin;
|
||||
|
||||
import com.google.common.util.concurrent.ListenableFuture;
|
||||
import com.replaymod.recording.packet.ResourcePackRecorder;
|
||||
import de.johni0702.minecraft.gui.utils.Consumer;
|
||||
import net.minecraft.client.resources.DownloadingPackFinder;
|
||||
@@ -12,6 +11,12 @@ import org.spongepowered.asm.mixin.injection.Redirect;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
//#if MC>=11400
|
||||
//$$ import java.util.concurrent.CompletableFuture;
|
||||
//#else
|
||||
import com.google.common.util.concurrent.ListenableFuture;
|
||||
//#endif
|
||||
|
||||
@Mixin(DownloadingPackFinder.class)
|
||||
public abstract class MixinDownloadingPackFinder implements ResourcePackRecorder.IDownloadingPackFinder {
|
||||
private Consumer<File> requestCallback;
|
||||
@@ -22,10 +27,22 @@ public abstract class MixinDownloadingPackFinder implements ResourcePackRecorder
|
||||
}
|
||||
|
||||
@Shadow
|
||||
public abstract ListenableFuture<Object> func_195741_a(File file);
|
||||
public abstract
|
||||
//#if MC>=11400
|
||||
//$$ CompletableFuture<Object>
|
||||
//#else
|
||||
ListenableFuture<Object>
|
||||
//#endif
|
||||
func_195741_a(File file);
|
||||
|
||||
//#if MC>=11400
|
||||
//$$ @Redirect(method = "download", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/resource/ClientResourcePackCreator;loadServerPack(Ljava/io/File;)Ljava/util/concurrent/CompletableFuture;"))
|
||||
//$$ private CompletableFuture<Object>
|
||||
//#else
|
||||
@Redirect(method = "downloadResourcePack", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/resources/DownloadingPackFinder;func_195741_a(Ljava/io/File;)Lcom/google/common/util/concurrent/ListenableFuture;"))
|
||||
private ListenableFuture<Object> recordDownloadedPack(DownloadingPackFinder downloadingPackFinder, File file) {
|
||||
private ListenableFuture<Object>
|
||||
//#endif
|
||||
recordDownloadedPack(DownloadingPackFinder downloadingPackFinder, File file) {
|
||||
if (requestCallback != null) {
|
||||
requestCallback.consume(file);
|
||||
requestCallback = null;
|
||||
|
||||
@@ -1,47 +0,0 @@
|
||||
//#if MC>=11300
|
||||
package com.replaymod.recording.mixin;
|
||||
|
||||
import com.replaymod.core.mixin.KeyBindingAccessor;
|
||||
import com.replaymod.core.versions.MCVer;
|
||||
import com.replaymod.extras.advancedscreenshots.AdvancedScreenshots;
|
||||
import com.replaymod.replay.ReplayModReplay;
|
||||
import net.minecraft.client.KeyboardListener;
|
||||
import net.minecraft.client.settings.KeyBinding;
|
||||
import net.minecraft.client.shader.Framebuffer;
|
||||
import net.minecraft.util.ScreenShotHelper;
|
||||
import net.minecraft.util.text.ITextComponent;
|
||||
import net.minecraftforge.fml.hooks.BasicEventHooks;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
import org.spongepowered.asm.mixin.injection.Inject;
|
||||
import org.spongepowered.asm.mixin.injection.Redirect;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
@Mixin(KeyboardListener.class)
|
||||
public abstract class MixinKeyboardListener {
|
||||
@Inject(method = "onKeyEvent", at = @At("HEAD"), cancellable = true)
|
||||
private void dispatchKeyEvent(long windowPointer, int key, int scanCode, int action, int modifiers, CallbackInfo ci) {
|
||||
// FIXME this is a hack and will hopefully be done properly by forge before its release (MinecraftForge#5481)
|
||||
// (and therefore before RM's release), this code will have to be removed then and handling code updated
|
||||
KeyBinding keyBindChat = MCVer.getMinecraft().gameSettings.keyBindChat;
|
||||
if (action == 1 && keyBindChat.matchesKey(key, scanCode)) {
|
||||
KeyBindingAccessor acc = (KeyBindingAccessor) keyBindChat;
|
||||
acc.setPressTime(acc.getPressTime() + 1);
|
||||
BasicEventHooks.fireKeyInput();
|
||||
ci.cancel();
|
||||
}
|
||||
}
|
||||
|
||||
@Redirect(method = "onKeyEvent", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/ScreenShotHelper;saveScreenshot(Ljava/io/File;IILnet/minecraft/client/shader/Framebuffer;Ljava/util/function/Consumer;)V"))
|
||||
private void takeScreenshot(File p_148260_0_, int p_148260_1_, int p_148260_2_, Framebuffer p_148260_3_, Consumer<ITextComponent> p_148260_4_) {
|
||||
if (ReplayModReplay.instance.getReplayHandler() != null) {
|
||||
AdvancedScreenshots.take();
|
||||
} else {
|
||||
ScreenShotHelper.saveScreenshot(p_148260_0_, p_148260_1_, p_148260_2_, p_148260_3_, p_148260_4_);
|
||||
}
|
||||
}
|
||||
}
|
||||
//#endif
|
||||
@@ -13,7 +13,6 @@ import org.spongepowered.asm.mixin.injection.callback.LocalCapture;
|
||||
|
||||
@Mixin(MouseHelper.class)
|
||||
public abstract class MixinMouseHelper {
|
||||
//#ifdef DEV_ENV
|
||||
@Shadow
|
||||
private boolean mouseGrabbed;
|
||||
|
||||
@@ -21,17 +20,25 @@ public abstract class MixinMouseHelper {
|
||||
private void noGrab(CallbackInfo ci) {
|
||||
// Used to be provided by Forge for 1.12.2 and below
|
||||
if (Boolean.valueOf(System.getProperty("fml.noGrab", "false"))) {
|
||||
mouseGrabbed = true;
|
||||
this.mouseGrabbed = true;
|
||||
ci.cancel();
|
||||
}
|
||||
}
|
||||
//#endif
|
||||
|
||||
@Inject(method = "scrollCallback",
|
||||
at = @At(value = "INVOKE", target = "Lnet/minecraft/client/entity/EntityPlayerSP;isSpectator()Z"),
|
||||
locals = LocalCapture.CAPTURE_FAILHARD,
|
||||
cancellable = true)
|
||||
private void handleReplayModScroll(long _p0, double _p1, double _p2, CallbackInfo ci, double _l1, double yOffsetAccumulated) {
|
||||
private void handleReplayModScroll(
|
||||
long _p0, double _p1, double _p2,
|
||||
CallbackInfo ci,
|
||||
double _l1,
|
||||
//#if MC>=11400
|
||||
//$$ float yOffsetAccumulated
|
||||
//#else
|
||||
double yOffsetAccumulated
|
||||
//#endif
|
||||
) {
|
||||
if (ReplayModReplay.instance.getReplayHandler() != null) {
|
||||
InputReplayTimer.handleScroll((int) yOffsetAccumulated);
|
||||
ci.cancel();
|
||||
|
||||
@@ -12,7 +12,9 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||
//#if MC>=11300
|
||||
import com.replaymod.core.versions.MCVer;
|
||||
import com.replaymod.recording.handler.RecordingEventHandler.RecordingEventSender;
|
||||
import net.minecraft.network.Packet;
|
||||
import net.minecraft.network.login.server.SPacketCustomPayloadLogin;
|
||||
import net.minecraft.network.login.server.SPacketLoginSuccess;
|
||||
//#else
|
||||
//$$ import net.minecraftforge.fml.common.network.FMLNetworkEvent;
|
||||
//#endif
|
||||
@@ -29,12 +31,21 @@ public abstract class MixinNetHandlerLoginClient {
|
||||
|
||||
//#if MC>=11300
|
||||
@Inject(method = "func_209521_a", at=@At("HEAD"))
|
||||
private void replayModRecording_initiateRecording(SPacketCustomPayloadLogin packet, CallbackInfo ci) {
|
||||
private void earlyInitiateRecording(SPacketCustomPayloadLogin packet, CallbackInfo ci) {
|
||||
initiateRecording(packet);
|
||||
}
|
||||
|
||||
@Inject(method = "handleLoginSuccess", at=@At("HEAD"))
|
||||
private void lateInitiateRecording(SPacketLoginSuccess packet, CallbackInfo ci) {
|
||||
initiateRecording(packet);
|
||||
}
|
||||
|
||||
private void initiateRecording(Packet<?> packet) {
|
||||
RecordingEventSender eventSender = (RecordingEventSender) MCVer.getMinecraft().renderGlobal;
|
||||
if (eventSender.getRecordingEventHandler() != null) {
|
||||
return; // already recording
|
||||
}
|
||||
ReplayModRecording.instance.initiateRecording(networkManager);
|
||||
ReplayModRecording.instance.initiateRecording(this.networkManager);
|
||||
if (eventSender.getRecordingEventHandler() != null) {
|
||||
eventSender.getRecordingEventHandler().onPacket(packet);
|
||||
}
|
||||
@@ -48,17 +59,18 @@ public abstract class MixinNetHandlerLoginClient {
|
||||
//$$ @Inject(method = "handleLoginSuccess", at=@At("HEAD"))
|
||||
//$$ public void replayModRecording_initiateRecording(CallbackInfo cb) {
|
||||
//#if MC>=10800
|
||||
//$$ ReplayModRecording.instance.initiateRecording(networkManager);
|
||||
//$$ ReplayModRecording.instance.initiateRecording(this.networkManager);
|
||||
//#else
|
||||
//$$ ReplayModRecording.instance.initiateRecording(field_147393_d);
|
||||
//$$ ReplayModRecording.instance.initiateRecording(this.field_147393_d);
|
||||
//#endif
|
||||
//$$ }
|
||||
//#endif
|
||||
|
||||
//#if MC>=11200
|
||||
// Race condition in Forge's networking (not sure if still present in 1.13)
|
||||
//#if MC>=11200 && MC<11400
|
||||
@Inject(method = "handleLoginSuccess", at=@At("RETURN"))
|
||||
public void replayModRecording_raceConditionWorkAround(CallbackInfo cb) {
|
||||
networkManager.channel().config().setAutoRead(true);
|
||||
((NetworkManagerAccessor) this.networkManager).getChannel().config().setAutoRead(true);
|
||||
}
|
||||
//#endif
|
||||
}
|
||||
|
||||
@@ -58,7 +58,7 @@ public abstract class MixinNetHandlerPlayClient {
|
||||
if (data.getProfile() == null || data.getProfile().getId() == null) continue;
|
||||
// Only add spawn packet for our own player and only if he isn't known yet
|
||||
if (data.getProfile().getId().equals(gameController.player.getGameProfile().getId())
|
||||
&& !playerInfoMap.containsKey(data.getProfile().getId())) {
|
||||
&& !this.playerInfoMap.containsKey(data.getProfile().getId())) {
|
||||
handler.onPlayerJoin();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,7 +10,6 @@ import net.minecraft.util.SoundCategory;
|
||||
import net.minecraft.util.SoundEvent;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraft.world.storage.ISaveHandler;
|
||||
import net.minecraft.world.storage.WorldInfo;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.Shadow;
|
||||
@@ -18,12 +17,20 @@ import org.spongepowered.asm.mixin.injection.At;
|
||||
import org.spongepowered.asm.mixin.injection.Inject;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||
|
||||
//#if MC>=11400
|
||||
//$$ import net.minecraft.world.chunk.ChunkManager;
|
||||
//$$ import net.minecraft.world.dimension.Dimension;
|
||||
//$$ import net.minecraft.world.dimension.DimensionType;
|
||||
//$$ import java.util.function.BiFunction;
|
||||
//#else
|
||||
import net.minecraft.world.storage.ISaveHandler;
|
||||
//#if MC>=11300
|
||||
import net.minecraft.world.dimension.Dimension;
|
||||
import net.minecraft.world.storage.WorldSavedDataStorage;
|
||||
//#else
|
||||
//$$ import net.minecraft.world.WorldProvider;
|
||||
//#endif
|
||||
//#endif
|
||||
|
||||
|
||||
@Mixin(WorldClient.class)
|
||||
@@ -31,6 +38,11 @@ public abstract class MixinWorldClient extends World implements RecordingEventHa
|
||||
@Shadow
|
||||
private Minecraft mc;
|
||||
|
||||
//#if MC>=11400
|
||||
//$$ protected MixinWorldClient(LevelProperties levelProperties_1, DimensionType dimensionType_1, BiFunction<World, Dimension, ChunkManager> biFunction_1, Profiler profiler_1, boolean boolean_1) {
|
||||
//$$ super(levelProperties_1, dimensionType_1, biFunction_1, profiler_1, boolean_1);
|
||||
//$$ }
|
||||
//#else
|
||||
protected MixinWorldClient(ISaveHandler saveHandlerIn,
|
||||
//#if MC>=11300
|
||||
WorldSavedDataStorage mapStorage,
|
||||
@@ -48,6 +60,7 @@ public abstract class MixinWorldClient extends World implements RecordingEventHa
|
||||
//#endif
|
||||
info, providerIn, profilerIn, client);
|
||||
}
|
||||
//#endif
|
||||
|
||||
private RecordingEventHandler replayModRecording_getRecordingEventHandler() {
|
||||
return ((RecordingEventHandler.RecordingEventSender) mc.renderGlobal).getRecordingEventHandler();
|
||||
@@ -57,8 +70,13 @@ public abstract class MixinWorldClient extends World implements RecordingEventHa
|
||||
// but are instead played directly by the client. The server only sends these sounds to
|
||||
// other clients so we have to record them manually.
|
||||
// E.g. Block place sounds
|
||||
//#if MC>=11400
|
||||
//$$ @Inject(method = "playSound(Lnet/minecraft/entity/player/PlayerEntity;DDDLnet/minecraft/sound/SoundEvent;Lnet/minecraft/sound/SoundCategory;FF)V",
|
||||
//$$ at = @At("HEAD"))
|
||||
//#else
|
||||
@Inject(method = "playSound(Lnet/minecraft/entity/player/EntityPlayer;DDDLnet/minecraft/util/SoundEvent;Lnet/minecraft/util/SoundCategory;FF)V",
|
||||
at = @At("HEAD"))
|
||||
//#endif
|
||||
public void replayModRecording_recordClientSound(EntityPlayer player, double x, double y, double z, SoundEvent sound, SoundCategory category,
|
||||
float volume, float pitch, CallbackInfo ci) {
|
||||
if (player == mc.player) {
|
||||
@@ -70,9 +88,14 @@ public abstract class MixinWorldClient extends World implements RecordingEventHa
|
||||
}
|
||||
|
||||
// Same goes for level events (also called effects). E.g. door open, block break, etc.
|
||||
//#if MC>=11400
|
||||
//$$ @Inject(method = "playLevelEvent", at = @At("HEAD"))
|
||||
//$$ private void playLevelEvent (PlayerEntity player, int type, BlockPos pos, int data, CallbackInfo ci) {
|
||||
//#else
|
||||
// These are handled in the World class, so we override the method in WorldClient and add our special handling.
|
||||
@Override
|
||||
public void playEvent(EntityPlayer player, int type, BlockPos pos, int data) {
|
||||
public void playEvent (EntityPlayer player, int type, BlockPos pos, int data) {
|
||||
//#endif
|
||||
if (player == mc.player) {
|
||||
// We caused this event, the server won't send it to us
|
||||
RecordingEventHandler handler = replayModRecording_getRecordingEventHandler();
|
||||
@@ -80,7 +103,9 @@ public abstract class MixinWorldClient extends World implements RecordingEventHa
|
||||
handler.onClientEffect(type, pos, data);
|
||||
}
|
||||
}
|
||||
//#if MC<11400
|
||||
super.playEvent(player, type, pos, data);
|
||||
//#endif
|
||||
}
|
||||
}
|
||||
//#endif
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
package com.replaymod.recording.mixin;
|
||||
|
||||
import io.netty.channel.Channel;
|
||||
import net.minecraft.network.NetworkManager;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.gen.Accessor;
|
||||
|
||||
@Mixin(NetworkManager.class)
|
||||
public interface NetworkManagerAccessor {
|
||||
@Accessor
|
||||
Channel getChannel();
|
||||
}
|
||||
@@ -5,13 +5,18 @@ import com.google.common.io.Files;
|
||||
import com.replaymod.replaystudio.replay.ReplayFile;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.gui.GuiYesNo;
|
||||
import net.minecraft.client.gui.GuiYesNoCallback;
|
||||
import net.minecraft.client.multiplayer.ServerData;
|
||||
import net.minecraft.client.multiplayer.ServerList;
|
||||
import net.minecraft.client.resources.I18n;
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
|
||||
//#if MC>=11400
|
||||
//$$ import net.minecraft.text.TranslatableTextComponent;
|
||||
//#else
|
||||
import net.minecraft.client.gui.GuiYesNoCallback;
|
||||
import net.minecraft.client.resources.I18n;
|
||||
//#endif
|
||||
|
||||
//#if MC>=11300
|
||||
import de.johni0702.minecraft.gui.utils.Consumer;
|
||||
import net.minecraft.client.resources.DownloadingPackFinder;
|
||||
@@ -30,7 +35,11 @@ import net.minecraft.network.play.server.SPacketResourcePackSend;
|
||||
//#if MC>=10800
|
||||
import com.google.common.util.concurrent.FutureCallback;
|
||||
import com.google.common.util.concurrent.Futures;
|
||||
//#if MC>=11400
|
||||
//$$ import java.util.concurrent.CompletableFuture;
|
||||
//#else
|
||||
import com.google.common.util.concurrent.ListenableFuture;
|
||||
//#endif
|
||||
import net.minecraft.client.network.NetHandlerPlayClient;
|
||||
import net.minecraft.network.NetworkManager;
|
||||
//#if MC<11300
|
||||
@@ -123,17 +132,11 @@ public class ResourcePackRecorder {
|
||||
|
||||
if (levelDir.isFile()) {
|
||||
netManager.sendPacket(makeStatusPacket(hash, Action.ACCEPTED));
|
||||
Futures.addCallback(setServerResourcePack(levelDir), new FutureCallback<Object>() {
|
||||
@Override
|
||||
public void onSuccess(Object result) {
|
||||
recordResourcePack(levelDir, requestId);
|
||||
netManager.sendPacket(makeStatusPacket(hash, Action.SUCCESSFULLY_LOADED));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailure(@Nonnull Throwable throwable) {
|
||||
netManager.sendPacket(makeStatusPacket(hash, Action.FAILED_DOWNLOAD));
|
||||
}
|
||||
addCallback(setServerResourcePack(levelDir), result -> {
|
||||
recordResourcePack(levelDir, requestId);
|
||||
netManager.sendPacket(makeStatusPacket(hash, Action.SUCCESSFULLY_LOADED));
|
||||
}, throwable -> {
|
||||
netManager.sendPacket(makeStatusPacket(hash, Action.FAILED_DOWNLOAD));
|
||||
});
|
||||
} else {
|
||||
netManager.sendPacket(makeStatusPacket(hash, Action.FAILED_DOWNLOAD));
|
||||
@@ -147,6 +150,9 @@ public class ResourcePackRecorder {
|
||||
netManager.sendPacket(makeStatusPacket(hash, Action.DECLINED));
|
||||
} else {
|
||||
// Lambdas MUST NOT be used with methods that need re-obfuscation in FG prior to 2.2 (will result in AbstractMethodError)
|
||||
//#if MC>=11400
|
||||
//$$ mc.execute(() -> mc.openScreen(new YesNoScreen(result -> {
|
||||
//#else
|
||||
//noinspection Convert2Lambda
|
||||
mc.addScheduledTask(() -> mc.displayGuiScreen(new GuiYesNo(new GuiYesNoCallback() {
|
||||
@Override
|
||||
@@ -155,6 +161,7 @@ public class ResourcePackRecorder {
|
||||
//#else
|
||||
//$$ public void confirmClicked(boolean result, int id) {
|
||||
//#endif
|
||||
//#endif
|
||||
if (serverData != null) {
|
||||
serverData.setResourceMode(result ? ServerData.ServerResourceMode.ENABLED : ServerData.ServerResourceMode.DISABLED);
|
||||
}
|
||||
@@ -168,7 +175,11 @@ public class ResourcePackRecorder {
|
||||
ServerList.saveSingleServer(serverData);
|
||||
mc.displayGuiScreen(null);
|
||||
}
|
||||
//#if MC>=11400
|
||||
//$$ , new TranslatableTextComponent("multiplayer.texturePrompt.line1"), new TranslatableTextComponent("multiplayer.texturePrompt.line2"))));
|
||||
//#else
|
||||
}, I18n.format("multiplayer.texturePrompt.line1"), I18n.format("multiplayer.texturePrompt.line2"), 0)));
|
||||
//#endif
|
||||
}
|
||||
}
|
||||
|
||||
@@ -176,21 +187,19 @@ public class ResourcePackRecorder {
|
||||
}
|
||||
|
||||
private void downloadResourcePackFuture(int requestId, String url, final String hash) {
|
||||
Futures.addCallback(downloadResourcePack(requestId, url, hash), new FutureCallback() {
|
||||
@Override
|
||||
public void onSuccess(Object result) {
|
||||
mc.getConnection().sendPacket(makeStatusPacket(hash, Action.SUCCESSFULLY_LOADED));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailure(@Nonnull Throwable throwable) {
|
||||
mc.getConnection().sendPacket(makeStatusPacket(hash, Action.FAILED_DOWNLOAD));
|
||||
}
|
||||
});
|
||||
addCallback(downloadResourcePack(requestId, url, hash),
|
||||
result -> mc.getConnection().sendPacket(makeStatusPacket(hash, Action.SUCCESSFULLY_LOADED)),
|
||||
throwable -> mc.getConnection().sendPacket(makeStatusPacket(hash, Action.FAILED_DOWNLOAD)));
|
||||
}
|
||||
|
||||
//#if MC>=11300
|
||||
private ListenableFuture downloadResourcePack(final int requestId, String url, String hash) {
|
||||
private
|
||||
//#if MC>=11400
|
||||
//$$ CompletableFuture<?>
|
||||
//#else
|
||||
ListenableFuture<?>
|
||||
//#endif
|
||||
downloadResourcePack(final int requestId, String url, String hash) {
|
||||
DownloadingPackFinder packFinder = mc.getPackFinder();
|
||||
((IDownloadingPackFinder) packFinder).setRequestCallback(file -> recordResourcePack(file, requestId));
|
||||
return packFinder.downloadResourcePack(url, hash);
|
||||
|
||||
Reference in New Issue
Block a user