From a80a20c37a55dd2b269a9e101e017ea3657795ef Mon Sep 17 00:00:00 2001 From: johni0702 Date: Thu, 15 Sep 2016 16:34:56 +0200 Subject: [PATCH] Update to Minecraft 1.9.4 --- ReplayStudio | 2 +- build.gradle | 11 +- jGui | 2 +- .../replaymod/core/KeyBindingRegistry.java | 15 +- .../com/replaymod/core/LoadingPlugin.java | 10 +- .../java/com/replaymod/core/ReplayMod.java | 170 +------------ .../core/handler/MainMenuHandler.java | 14 +- .../com/replaymod/core/utils/OpenGLUtils.java | 15 +- .../replaymod/core/utils/Restrictions.java | 4 +- .../java/com/replaymod/core/utils/Utils.java | 2 +- .../replaymod/core/utils/WrappedTimer.java | 2 +- .../replaymod/extras/LocalizationExtra.java | 6 +- .../com/replaymod/extras/VersionChecker.java | 10 +- .../playeroverview/PlayerOverviewGui.java | 11 +- .../playeroverview/PlayerRenderHook.java | 4 +- .../extras/youtube/YoutubeUpload.java | 4 +- .../api/replay/holders/MinecraftVersion.java | 3 +- .../replaymod/online/gui/GuiReplayCenter.java | 13 +- .../replaymod/online/handler/GuiHandler.java | 21 +- .../recording/gui/GuiRecordingOverlay.java | 2 +- .../handler/ConnectionEventHandler.java | 14 +- .../handler/RecordingEventHandler.java | 229 +++++------------- .../mixin/MixinNetHandlerPlayClient.java | 20 +- .../recording/mixin/MixinRenderGlobal.java | 2 +- .../recording/packet/PacketListener.java | 59 +++-- .../packet/ResourcePackRecorder.java | 56 ++--- .../render/capturer/ODSFrameCapturer.java | 6 +- .../hooks/ChunkLoadingRenderGlobal.java | 13 +- .../render/mixin/MixinEffectRenderer.java | 47 ---- .../render/mixin/MixinEntityRenderer.java | 8 +- .../render/mixin/MixinParticleManager.java | 47 ++++ .../render/mixin/MixinRenderGlobal.java | 12 +- ...vingEntity.java => MixinRenderLiving.java} | 10 +- .../render/mixin/MixinRenderManager.java | 4 +- .../render/rendering/VideoRenderer.java | 20 +- .../replaymod/render/utils/JailingQueue.java | 17 +- .../replaymod/replay/InputReplayTimer.java | 1 + .../com/replaymod/replay/NoGuiScreenshot.java | 8 +- .../com/replaymod/replay/ReplayHandler.java | 13 +- .../com/replaymod/replay/ReplaySender.java | 211 +++++++--------- .../replaymod/replay/camera/CameraEntity.java | 76 ++++-- .../camera/ClassicCameraController.java | 16 +- .../camera/SpectatorCameraController.java | 5 +- .../replay/gui/overlay/GuiMarkerTimeline.java | 4 +- .../replaymod/replay/handler/GuiHandler.java | 31 +-- .../replay/mixin/MixinGuiSpectator.java | 6 +- .../replay/mixin/MixinPlayerControllerMP.java | 12 +- ...nderer.java => MixinRenderArmorStand.java} | 8 +- .../replay/mixin/MixinRenderArrow.java | 1 + .../replay/mixin/MixinRenderItem.java | 2 +- ...Entity.java => MixinRenderLivingBase.java} | 6 +- .../MixinTileEntityEndPortalRenderer.java | 2 +- .../replay/mixin/MixinViewFrustum.java | 17 +- .../preview/PathPreviewRenderer.java | 104 ++++---- src/main/resources/META-INF/replaymod_at.cfg | 47 ++-- src/main/resources/mcmod.info | 4 +- .../resources/mixins.recording.replaymod.json | 1 + .../resources/mixins.render.replaymod.json | 5 +- .../resources/mixins.replay.replaymod.json | 5 +- 59 files changed, 609 insertions(+), 861 deletions(-) delete mode 100644 src/main/java/com/replaymod/render/mixin/MixinEffectRenderer.java create mode 100644 src/main/java/com/replaymod/render/mixin/MixinParticleManager.java rename src/main/java/com/replaymod/render/mixin/{MixinRendererLivingEntity.java => MixinRenderLiving.java} (70%) rename src/main/java/com/replaymod/replay/mixin/{MixinArmorStandRenderer.java => MixinRenderArmorStand.java} (78%) rename src/main/java/com/replaymod/replay/mixin/{MixinRendererLivingEntity.java => MixinRenderLivingBase.java} (89%) diff --git a/ReplayStudio b/ReplayStudio index f98b781f..ebdef6fc 160000 --- a/ReplayStudio +++ b/ReplayStudio @@ -1 +1 @@ -Subproject commit f98b781f3053696fbc0496115c5a1c45a10ace49 +Subproject commit ebdef6fc1b6f62cab6b06b0f37f11565a6bc9d04 diff --git a/build.gradle b/build.gradle index 3ed543b1..cdf1e8f4 100755 --- a/build.gradle +++ b/build.gradle @@ -17,8 +17,8 @@ buildscript { } } dependencies { - classpath 'net.minecraftforge.gradle:ForgeGradle:2.0-SNAPSHOT' - classpath 'org.spongepowered:mixingradle:0.3-SNAPSHOT' + classpath 'net.minecraftforge.gradle:ForgeGradle:2.2-SNAPSHOT' + classpath 'org.spongepowered:mixingradle:0.4-SNAPSHOT' } } @@ -34,9 +34,9 @@ archivesBaseName = "replaymod" minecraft { coreMod = 'com.replaymod.core.LoadingPlugin' - version = '1.8-11.14.4.1563' + version = '1.9.4-12.17.0.1976' runDir = "eclipse" - mappings = "snapshot_nodoc_20141130" + mappings = "snapshot_20160518" } repositories { @@ -57,7 +57,7 @@ configurations { dependencies { compile 'org.projectlombok:lombok:1.16.4' - compile 'org.spongepowered:mixin:0.4.3' + compile 'org.spongepowered:mixin:0.5.9-SNAPSHOT' shade 'com.googlecode.mp4parser:isoparser:1.1.7' shade 'org.apache.commons:commons-exec:1.3' shade 'com.google.apis:google-api-services-youtube:v3-rev178-1.22.0' @@ -134,6 +134,7 @@ jar { manifest { attributes 'TweakClass': 'org.spongepowered.asm.launch.MixinTweaker', 'TweakOrder': '0', + 'FMLCorePluginContainsFMLMod': 'true', 'FMLAT': 'replaymod_at.cfg' } } diff --git a/jGui b/jGui index aa68206b..f7270bb5 160000 --- a/jGui +++ b/jGui @@ -1 +1 @@ -Subproject commit aa68206b5e3cfc4919820c732d167d8185b4991f +Subproject commit f7270bb5f960a75eeaa1164592684e99b3a5ac12 diff --git a/src/main/java/com/replaymod/core/KeyBindingRegistry.java b/src/main/java/com/replaymod/core/KeyBindingRegistry.java index 65acb418..3537ca21 100644 --- a/src/main/java/com/replaymod/core/KeyBindingRegistry.java +++ b/src/main/java/com/replaymod/core/KeyBindingRegistry.java @@ -15,7 +15,6 @@ import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.Map; -import java.util.concurrent.Callable; public class KeyBindingRegistry { private Map keyBindings = new HashMap(); @@ -56,12 +55,7 @@ public class KeyBindingRegistry { CrashReport crashReport = CrashReport.makeCrashReport(cause, "Handling Key Binding"); CrashReportCategory category = crashReport.makeCategory("Key Binding"); category.addCrashSection("Key Binding", entry.getKey()); - category.addCrashSectionCallable("Handler", new Callable() { - @Override - public Object call() throws Exception { - return runnable; - } - }); + category.setDetail("Handler", runnable::toString); throw new ReportedException(crashReport); } } @@ -78,12 +72,7 @@ public class KeyBindingRegistry { CrashReport crashReport = CrashReport.makeCrashReport(cause, "Handling Raw Key Binding"); CrashReportCategory category = crashReport.makeCategory("Key Binding"); category.addCrashSection("Key Code", keyCode); - category.addCrashSectionCallable("Handler", new Callable() { - @Override - public Object call() throws Exception { - return runnable; - } - }); + category.setDetail("Handler", runnable::toString); throw new ReportedException(crashReport); } } diff --git a/src/main/java/com/replaymod/core/LoadingPlugin.java b/src/main/java/com/replaymod/core/LoadingPlugin.java index af86c1ee..a4badbe0 100755 --- a/src/main/java/com/replaymod/core/LoadingPlugin.java +++ b/src/main/java/com/replaymod/core/LoadingPlugin.java @@ -4,7 +4,7 @@ import net.minecraftforge.fml.relauncher.CoreModManager; import net.minecraftforge.fml.relauncher.IFMLLoadingPlugin; import org.apache.logging.log4j.LogManager; import org.spongepowered.asm.launch.MixinBootstrap; -import org.spongepowered.asm.mixin.MixinEnvironment; +import org.spongepowered.asm.mixin.Mixins; import java.io.File; import java.net.URISyntaxException; @@ -16,9 +16,9 @@ public class LoadingPlugin implements IFMLLoadingPlugin { public LoadingPlugin() { MixinBootstrap.init(); - MixinEnvironment.getDefaultEnvironment().addConfiguration("mixins.recording.replaymod.json"); - MixinEnvironment.getDefaultEnvironment().addConfiguration("mixins.render.replaymod.json"); - MixinEnvironment.getDefaultEnvironment().addConfiguration("mixins.replay.replaymod.json"); + Mixins.addConfiguration("mixins.recording.replaymod.json"); + Mixins.addConfiguration("mixins.render.replaymod.json"); + Mixins.addConfiguration("mixins.replay.replaymod.json"); CodeSource codeSource = getClass().getProtectionDomain().getCodeSource(); if (codeSource != null) { @@ -28,7 +28,7 @@ public class LoadingPlugin implements IFMLLoadingPlugin { if (file.isFile()) { // This forces forge to reexamine the jar file for FML mods // Should eventually be handled by Mixin itself, maybe? - CoreModManager.getLoadedCoremods().remove(file.getName()); + CoreModManager.getIgnoredMods().remove(file.getName()); } } catch (URISyntaxException e) { e.printStackTrace(); diff --git a/src/main/java/com/replaymod/core/ReplayMod.java b/src/main/java/com/replaymod/core/ReplayMod.java index eeb8778e..1e068f8d 100755 --- a/src/main/java/com/replaymod/core/ReplayMod.java +++ b/src/main/java/com/replaymod/core/ReplayMod.java @@ -6,7 +6,6 @@ import com.replaymod.core.gui.GuiReplaySettings; import com.replaymod.core.gui.RestoreReplayGui; import com.replaymod.core.handler.MainMenuHandler; import com.replaymod.core.utils.OpenGLUtils; -import com.replaymod.render.utils.SoundHandler; import com.replaymod.replaystudio.util.I18n; import de.johni0702.minecraft.gui.container.GuiScreen; import lombok.Getter; @@ -14,7 +13,8 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.settings.GameSettings; import net.minecraft.crash.CrashReport; import net.minecraft.crash.CrashReportCategory; -import net.minecraft.util.*; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.text.*; import net.minecraftforge.common.config.Configuration; import net.minecraftforge.fml.client.FMLClientHandler; import net.minecraftforge.fml.common.FMLCommonHandler; @@ -31,7 +31,6 @@ import org.apache.commons.io.FileUtils; import java.io.File; import java.io.IOException; import java.util.List; -import java.util.Queue; @Mod(modid = ReplayMod.MOD_ID, useMetadata = true, @@ -65,8 +64,6 @@ public class ReplayMod { @Deprecated public static Configuration config; - @Deprecated - public static SoundHandler soundHandler = new SoundHandler(); private final KeyBindingRegistry keyBindingRegistry = new KeyBindingRegistry(); private final SettingsRegistry settingsRegistry = new SettingsRegistry(); @@ -122,150 +119,7 @@ public class ReplayMod { if(!FMLClientHandler.instance().hasOptifine()) GameSettings.Options.RENDER_DISTANCE.setValueMax(64f); - if (System.getProperty("replaymod.render.file") != null) { - final File file = new File(System.getProperty("replaymod.render.file")); - if (!file.exists()) { - throw new IOException("File \"" + file.getPath() + "\" not found."); - } - - final String path = System.getProperty("replaymod.render.path"); - String type = System.getProperty("replaymod.render.type"); - String bitrate = System.getProperty("replaymod.render.bitrate"); - String fps = System.getProperty("replaymod.render.fps"); - String waitForChunks = System.getProperty("replaymod.render.waitforchunks"); - String linearMovement = System.getProperty("replaymod.render.linearmovement"); - String skyColor = System.getProperty("replaymod.render.skycolor"); - String width = System.getProperty("replaymod.render.width"); - String height = System.getProperty("replaymod.render.height"); - String exportCommand = System.getProperty("replaymod.render.exportcommand"); - String exportCommandArgs = System.getProperty("replaymod.render.exportcommandargs"); - /* - final RenderOptions options = new RenderOptions(); - if (bitrate != null) { - options.setBitrate(bitrate); - } - if (fps != null) { - options.setFps(Integer.parseInt(fps)); - } - if (waitForChunks != null) { - options.setWaitForChunks(Boolean.parseBoolean(waitForChunks)); - } - if (linearMovement != null) { - options.setLinearMovement(Boolean.parseBoolean(linearMovement)); - } - if (skyColor != null) { - if (skyColor.startsWith("0x")) { - options.setSkyColor(Integer.parseInt(skyColor.substring(2), 16)); - } else { - options.setSkyColor(Integer.parseInt(skyColor)); - } - } - if (width != null) { - options.setWidth(Integer.parseInt(width)); - } - if (height != null) { - options.setHeight(Integer.parseInt(height)); - } - - if (exportCommand != null) { - options.setExportCommand(exportCommand); - } - if (exportCommandArgs != null) { - options.setExportCommandArgs(exportCommandArgs); - } else { - options.setExportCommandArgs(EncodingPreset.MP4DEFAULT.getCommandLineArgs()); - } - - options.setOutputFile(new File(String.valueOf(System.currentTimeMillis()))); - - Pipelines.Preset pipelinePreset = Pipelines.Preset.DEFAULT; - if (type != null) { - String[] parts = type.split(":"); - type = parts[0].toUpperCase(); - if ("NORMAL".equals(type) || "DEFAULT".equals(type)) { - pipelinePreset = Pipelines.Preset.DEFAULT; - } else if ("STEREO".equals(type) || "STEREOSCOPIC".equals(type)) { - pipelinePreset = Pipelines.Preset.STEREOSCOPIC; - } else if ("CUBIC".equals(type)) { - if (parts.length < 2) { - throw new IllegalArgumentException("Cubic renderer requires boolean for whether it's stable."); - } - pipelinePreset = Pipelines.Preset.CUBIC; - } else if ("EQUIRECTANGULAR".equals(type)) { - if (parts.length < 2) { - throw new IllegalArgumentException("Equirectangular renderer requires boolean for whether it's stable."); - } - pipelinePreset = Pipelines.Preset.EQUIRECTANGULAR; - } else if ("ODS".equals(type)) { - if (parts.length < 2) { - throw new IllegalArgumentException("ODS renderer requires boolean for whether it's stable."); - } - pipelinePreset = Pipelines.Preset.ODS; - } else { - throw new IllegalArgumentException("Unknown type: " + parts[0]); - } - } - options.setMode(pipelinePreset); - */ - - @SuppressWarnings("unchecked") - Queue tasks = mc.scheduledTasks; - synchronized (mc.scheduledTasks) { - tasks.add(ListenableFutureTask.create(new Runnable() { - @Override - public void run() { - String renderDistance = System.getProperty("replaymod.render.mc.renderdistance"); - String clouds = System.getProperty("replaymod.render.mc.clouds"); - if (renderDistance != null) { - mc.gameSettings.renderDistanceChunks = Integer.parseInt(renderDistance); - } - if (clouds != null) { - mc.gameSettings.clouds = Boolean.parseBoolean(clouds); - } - - System.out.println("Loading replay..."); - // TODO -// try { -// ReplayHandler.startReplay(file, false); -// } catch (Throwable t) { -// t.printStackTrace(); -// FMLCommonHandler.instance().exitJava(1, false); -// } -// -// int index = 0; -// if (path != null) { -// for (KeyframeSet set : ReplayHandler.getKeyframeRepository()) { -// if (set.getName().equals(path)) { -// break; -// } -// index++; -// } -// if (index >= ReplayHandler.getKeyframeRepository().length) { -// throw new IllegalArgumentException("No path named \"" + path + "\"."); -// } -// } else if (ReplayHandler.getKeyframeRepository().length == 0) { -// throw new IllegalArgumentException("Replay file has no paths defined."); -// } -// ReplayHandler.useKeyframePresetFromRepository(index); -// -// System.out.println("Rendering started..."); -// try { -// ReplayProcess.startReplayProcess(options, true); -// } catch (Throwable t) { -// t.printStackTrace(); -// FMLCommonHandler.instance().exitJava(1, false); -// } -// if (mc.hasCrashed) { -// System.out.println(mc.crashReporter.getCompleteReport()); -// } -// System.out.println("Rendering done. Shutting down..."); -// mc.shutdown(); - } - }, null)); - } - - testIfMoeshAndExitMinecraft(); - } + testIfMoeshAndExitMinecraft(); runLater(() -> { // Restore corrupted replays @@ -286,10 +140,8 @@ public class ReplayMod { } public void runLater(Runnable runnable) { - @SuppressWarnings("unchecked") - Queue tasks = mc.scheduledTasks; synchronized (mc.scheduledTasks) { - tasks.add(ListenableFutureTask.create(runnable, null)); + mc.scheduledTasks.add(ListenableFutureTask.create(runnable, null)); } } @@ -318,13 +170,13 @@ public class ReplayMod { private void printToChat(boolean warning, String message, Object... args) { if (getSettingsRegistry().get(Setting.NOTIFICATIONS)) { // Some nostalgia: "§8[§6Replay Mod§8]§r Your message goes here" - ChatStyle coloredDarkGray = new ChatStyle().setColor(EnumChatFormatting.DARK_GRAY); - ChatStyle coloredGold = new ChatStyle().setColor(EnumChatFormatting.GOLD); - IChatComponent text = new ChatComponentText("[").setChatStyle(coloredDarkGray) - .appendSibling(new ChatComponentTranslation("replaymod.title").setChatStyle(coloredGold)) - .appendSibling(new ChatComponentText("] ")) - .appendSibling(new ChatComponentTranslation(message, args).setChatStyle(new ChatStyle() - .setColor(warning ? EnumChatFormatting.RED : EnumChatFormatting.DARK_GREEN))); + Style coloredDarkGray = new Style().setColor(TextFormatting.DARK_GRAY); + Style coloredGold = new Style().setColor(TextFormatting.GOLD); + ITextComponent text = new TextComponentString("[").setStyle(coloredDarkGray) + .appendSibling(new TextComponentTranslation("replaymod.title").setStyle(coloredGold)) + .appendSibling(new TextComponentString("] ")) + .appendSibling(new TextComponentTranslation(message, args).setStyle(new Style() + .setColor(warning ? TextFormatting.RED : TextFormatting.DARK_GREEN))); // Send message to chat GUI // The ingame GUI is initialized at startup, therefore this is possible before the client is connected mc.ingameGUI.getChatGUI().printChatMessage(text); diff --git a/src/main/java/com/replaymod/core/handler/MainMenuHandler.java b/src/main/java/com/replaymod/core/handler/MainMenuHandler.java index d12bbeaa..475f02ea 100644 --- a/src/main/java/com/replaymod/core/handler/MainMenuHandler.java +++ b/src/main/java/com/replaymod/core/handler/MainMenuHandler.java @@ -6,8 +6,6 @@ import net.minecraftforge.client.event.GuiScreenEvent; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; -import java.util.List; - /** * Moves certain buttons on the main menu upwards so we can inject our own. */ @@ -18,14 +16,12 @@ public class MainMenuHandler { @SubscribeEvent public void onInit(GuiScreenEvent.InitGuiEvent.Post event) { - if (event.gui instanceof GuiMainMenu) { - @SuppressWarnings("unchecked") - List buttonList = event.buttonList; - for (GuiButton button : buttonList) { + if (event.getGui() instanceof GuiMainMenu) { + for (GuiButton button : event.getButtonList()) { // Buttons that aren't in a rectangle directly above our space don't need moving - if (button.xPosition + button.width < event.gui.width / 2 - 100 - || button.xPosition > event.gui.width / 2 + 100 - || button.yPosition > event.gui.height / 4 + 10 + 4 * 24) continue; + if (button.xPosition + button.width < event.getGui().width / 2 - 100 + || button.xPosition > event.getGui().width / 2 + 100 + || button.yPosition > event.getGui().height / 4 + 10 + 4 * 24) continue; // Move button up to make space for two rows of buttons // and then move back down by 10 to compensate for the space to the exit button that was already there button.yPosition -= 2 * 24 - 10; diff --git a/src/main/java/com/replaymod/core/utils/OpenGLUtils.java b/src/main/java/com/replaymod/core/utils/OpenGLUtils.java index 6ee4886b..b7260b7a 100644 --- a/src/main/java/com/replaymod/core/utils/OpenGLUtils.java +++ b/src/main/java/com/replaymod/core/utils/OpenGLUtils.java @@ -2,7 +2,8 @@ package com.replaymod.core.utils; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.Tessellator; -import net.minecraft.client.renderer.WorldRenderer; +import net.minecraft.client.renderer.VertexBuffer; +import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import org.lwjgl.BufferUtils; import org.lwjgl.opengl.GL11; @@ -34,14 +35,14 @@ public class OpenGLUtils { float f5 = 1.0F / textureHeight; Tessellator tessellator = Tessellator.getInstance(); - WorldRenderer worldrenderer = tessellator.getWorldRenderer(); + VertexBuffer vertexBuffer = tessellator.getBuffer(); GlStateManager.translate(x+(width/2), y+(width/2), 0); GlStateManager.rotate(rotation, 0, 0, 1); - worldrenderer.startDrawingQuads(); - worldrenderer.addVertexWithUV(-width / 2, height / 2, 0.0D, (double) (u * f4), (double) ((v + (float) height) * f5)); - worldrenderer.addVertexWithUV(width/2, height/2, 0.0D, (double)((u + (float)width) * f4), (double)((v + (float)height) * f5)); - worldrenderer.addVertexWithUV(width/2, -height/2, 0.0D, (double)((u + (float)width) * f4), (double)(v * f5)); - worldrenderer.addVertexWithUV(-width/2, -height/2, 0.0D, (double)(u * f4), (double)(v * f5)); + vertexBuffer.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_TEX); + vertexBuffer.pos(-width / 2, height / 2, 0.0D).tex((double) (u * f4), (double) ((v + (float) height) * f5)).endVertex(); + vertexBuffer.pos(width/2, height/2, 0.0D).tex((double)((u + (float)width) * f4), (double)((v + (float)height) * f5)).endVertex(); + vertexBuffer.pos(width/2, -height/2, 0.0D).tex((double)((u + (float)width) * f4), (double)(v * f5)).endVertex(); + vertexBuffer.pos(-width/2, -height/2, 0.0D).tex((double)(u * f4), (double)(v * f5)).endVertex(); tessellator.draw(); GlStateManager.popMatrix(); diff --git a/src/main/java/com/replaymod/core/utils/Restrictions.java b/src/main/java/com/replaymod/core/utils/Restrictions.java index 06248597..f3f0f437 100644 --- a/src/main/java/com/replaymod/core/utils/Restrictions.java +++ b/src/main/java/com/replaymod/core/utils/Restrictions.java @@ -1,7 +1,7 @@ package com.replaymod.core.utils; import net.minecraft.network.PacketBuffer; -import net.minecraft.network.play.server.S3FPacketCustomPayload; +import net.minecraft.network.play.server.SPacketCustomPayload; /** * Restrictions set by the server, @@ -14,7 +14,7 @@ public class Restrictions { private boolean onlyFirstPerson; private boolean onlyRecordingPlayer; - public String handle(S3FPacketCustomPayload packet) { + public String handle(SPacketCustomPayload packet) { PacketBuffer buffer = packet.getBufferData(); while (buffer.isReadable()) { String name = buffer.readStringFromBuffer(64); diff --git a/src/main/java/com/replaymod/core/utils/Utils.java b/src/main/java/com/replaymod/core/utils/Utils.java index 3a088a83..e9a618ea 100644 --- a/src/main/java/com/replaymod/core/utils/Utils.java +++ b/src/main/java/com/replaymod/core/utils/Utils.java @@ -63,7 +63,7 @@ public class Utils { } public static ResourceLocation getResourceLocationForPlayerUUID(UUID uuid) { - NetworkPlayerInfo info = Minecraft.getMinecraft().getNetHandler().getPlayerInfo(uuid); + NetworkPlayerInfo info = Minecraft.getMinecraft().getConnection().getPlayerInfo(uuid); ResourceLocation skinLocation; if (info != null && info.hasLocationSkin()) { skinLocation = info.getLocationSkin(); diff --git a/src/main/java/com/replaymod/core/utils/WrappedTimer.java b/src/main/java/com/replaymod/core/utils/WrappedTimer.java index f058eb8c..93d2bebf 100644 --- a/src/main/java/com/replaymod/core/utils/WrappedTimer.java +++ b/src/main/java/com/replaymod/core/utils/WrappedTimer.java @@ -27,7 +27,7 @@ public class WrappedTimer extends Timer { to.elapsedPartialTicks = from.elapsedPartialTicks; to.lastSyncSysClock = from.lastSyncSysClock; to.lastSyncHRClock = from.lastSyncHRClock; - to.field_74285_i = from.field_74285_i; + to.counter = from.counter; to.timeSyncAdjustment = from.timeSyncAdjustment; } } diff --git a/src/main/java/com/replaymod/extras/LocalizationExtra.java b/src/main/java/com/replaymod/extras/LocalizationExtra.java index a94e2c68..7ddb6dff 100644 --- a/src/main/java/com/replaymod/extras/LocalizationExtra.java +++ b/src/main/java/com/replaymod/extras/LocalizationExtra.java @@ -10,7 +10,7 @@ import lombok.RequiredArgsConstructor; import net.minecraft.client.Minecraft; import net.minecraft.client.resources.IResourcePack; import net.minecraft.client.resources.data.IMetadataSection; -import net.minecraft.client.resources.data.IMetadataSerializer; +import net.minecraft.client.resources.data.MetadataSerializer; import net.minecraft.util.ResourceLocation; import net.minecraftforge.fml.common.Mod; import org.apache.commons.lang3.StringEscapeUtils; @@ -95,12 +95,12 @@ public class LocalizationExtra implements Extra { } @Override - public Set getResourceDomains() { + public Set getResourceDomains() { return ImmutableSet.of("minecraft", "replaymod"); } @Override - public IMetadataSection getPackMetadata(IMetadataSerializer p_135058_1_, String p_135058_2_) throws IOException { + public T getPackMetadata(MetadataSerializer metadataSerializer, String metadataSectionName) throws IOException { return null; } diff --git a/src/main/java/com/replaymod/extras/VersionChecker.java b/src/main/java/com/replaymod/extras/VersionChecker.java index 017fbe81..8c0fd12f 100644 --- a/src/main/java/com/replaymod/extras/VersionChecker.java +++ b/src/main/java/com/replaymod/extras/VersionChecker.java @@ -38,18 +38,18 @@ public class VersionChecker implements Extra { @SubscribeEvent public void onDrawScreen(GuiScreenEvent.DrawScreenEvent.Post event) { - if (!(event.gui instanceof GuiMainMenu)) { + if (!(event.getGui() instanceof GuiMainMenu)) { return; } - int width = Math.max(100, event.gui.width / 2 - 100 - 10); + int width = Math.max(100, event.getGui().width / 2 - 100 - 10); @SuppressWarnings("unchecked") List lines = - event.gui.mc.fontRendererObj.listFormattedStringToWidth(I18n.format("replaymod.gui.outdated"), width); + event.getGui().mc.fontRendererObj.listFormattedStringToWidth(I18n.format("replaymod.gui.outdated"), width); int maxLineWidth = 0; for(String line : lines) { - int lineWidth = event.gui.mc.fontRendererObj.getStringWidth(line); + int lineWidth = event.getGui().mc.fontRendererObj.getStringWidth(line); if(lineWidth > maxLineWidth) { maxLineWidth = lineWidth; } @@ -59,7 +59,7 @@ public class VersionChecker implements Extra { int i = 0; for(String line : lines) { - event.gui.mc.fontRendererObj.drawStringWithShadow(line, 5, 80 + (i * 10), Color.WHITE.getRGB()); + event.getGui().mc.fontRendererObj.drawStringWithShadow(line, 5, 80 + (i * 10), Color.WHITE.getRGB()); i++; } } diff --git a/src/main/java/com/replaymod/extras/playeroverview/PlayerOverviewGui.java b/src/main/java/com/replaymod/extras/playeroverview/PlayerOverviewGui.java index a979e841..c99bfc6f 100644 --- a/src/main/java/com/replaymod/extras/playeroverview/PlayerOverviewGui.java +++ b/src/main/java/com/replaymod/extras/playeroverview/PlayerOverviewGui.java @@ -16,7 +16,8 @@ import de.johni0702.minecraft.gui.utils.Colors; import net.minecraft.client.audio.PositionedSoundRecord; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EnumPlayerModelParts; -import net.minecraft.potion.Potion; +import net.minecraft.init.MobEffects; +import net.minecraft.init.SoundEvents; import net.minecraft.util.ResourceLocation; import org.lwjgl.util.Dimension; import org.lwjgl.util.ReadableDimension; @@ -40,14 +41,14 @@ public class PlayerOverviewGui extends GuiScreen implements Closeable { public final GuiCheckbox checkAll = new GuiCheckbox(contentPanel){ @Override public void onClick() { - getMinecraft().getSoundHandler().playSound(PositionedSoundRecord.create(BUTTON_SOUND, 1.0F)); + getMinecraft().getSoundHandler().playSound(PositionedSoundRecord.getMasterRecord(SoundEvents.UI_BUTTON_CLICK, 1.0F)); playersScrollable.forEach(IGuiCheckbox.class).setChecked(true); } }.setLabel("").setChecked(true); public final GuiCheckbox uncheckAll = new GuiCheckbox(contentPanel){ @Override public void onClick() { - getMinecraft().getSoundHandler().playSound(PositionedSoundRecord.create(BUTTON_SOUND, 1.0F)); + getMinecraft().getSoundHandler().playSound(PositionedSoundRecord.getMasterRecord(SoundEvents.UI_BUTTON_CLICK, 1.0F)); playersScrollable.forEach(IGuiCheckbox.class).setChecked(false); } }.setLabel("").setChecked(false); @@ -90,7 +91,7 @@ public class PlayerOverviewGui extends GuiScreen implements Closeable { public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo renderInfo) { renderer.bindTexture(texture); renderer.drawTexturedRect(0, 0, 8, 8, 16, 16, 8, 8, 64, 64); - if (p.func_175148_a(EnumPlayerModelParts.HAT)) { + if (p.isWearing(EnumPlayerModelParts.HAT)) { renderer.drawTexturedRect(0, 0, 40, 8, size.getWidth(), size.getHeight(), 8, 8, 64, 64); } } @@ -139,7 +140,7 @@ public class PlayerOverviewGui extends GuiScreen implements Closeable { } private static boolean isSpectator(EntityPlayer e) { - return e.isInvisible() && e.getActivePotionEffect(Potion.invisibility) == null; + return e.isInvisible() && e.getActivePotionEffect(MobEffects.INVISIBILITY) == null; } private static final class PlayerComparator implements Comparator { diff --git a/src/main/java/com/replaymod/extras/playeroverview/PlayerRenderHook.java b/src/main/java/com/replaymod/extras/playeroverview/PlayerRenderHook.java index 66c7eb42..1548960c 100644 --- a/src/main/java/com/replaymod/extras/playeroverview/PlayerRenderHook.java +++ b/src/main/java/com/replaymod/extras/playeroverview/PlayerRenderHook.java @@ -1,9 +1,9 @@ package com.replaymod.extras.playeroverview; +import net.minecraft.client.entity.AbstractClientPlayer; import net.minecraft.client.renderer.culling.ICamera; import net.minecraft.client.renderer.entity.RenderManager; import net.minecraft.client.renderer.entity.RenderPlayer; -import net.minecraft.entity.Entity; public class PlayerRenderHook extends RenderPlayer { private final PlayerOverview extra; @@ -14,7 +14,7 @@ public class PlayerRenderHook extends RenderPlayer { } @Override - public boolean shouldRender(Entity entity, ICamera camera, double camX, double camY, double camZ) { + public boolean shouldRender(AbstractClientPlayer entity, ICamera camera, double camX, double camY, double camZ) { return !extra.isHidden(entity.getUniqueID()) && super.shouldRender(entity, camera, camX, camY, camZ); } } diff --git a/src/main/java/com/replaymod/extras/youtube/YoutubeUpload.java b/src/main/java/com/replaymod/extras/youtube/YoutubeUpload.java index bd740632..6e695f17 100644 --- a/src/main/java/com/replaymod/extras/youtube/YoutubeUpload.java +++ b/src/main/java/com/replaymod/extras/youtube/YoutubeUpload.java @@ -17,8 +17,8 @@ public class YoutubeUpload implements Extra { @SubscribeEvent public void onGuiOpen(GuiScreenEvent.InitGuiEvent.Post event) { - if (GuiScreen.from(event.gui) instanceof GuiRenderingDone) { - GuiRenderingDone gui = (GuiRenderingDone) GuiScreen.from(event.gui); + if (GuiScreen.from(event.getGui()) instanceof GuiRenderingDone) { + GuiRenderingDone gui = (GuiRenderingDone) GuiScreen.from(event.getGui()); // Check if there already is a youtube button if (gui.actionsPanel.getChildren().stream().anyMatch(it -> it instanceof YoutubeButton)) { return; // Button already added diff --git a/src/main/java/com/replaymod/online/api/replay/holders/MinecraftVersion.java b/src/main/java/com/replaymod/online/api/replay/holders/MinecraftVersion.java index a6ed8b22..de5d2285 100644 --- a/src/main/java/com/replaymod/online/api/replay/holders/MinecraftVersion.java +++ b/src/main/java/com/replaymod/online/api/replay/holders/MinecraftVersion.java @@ -2,7 +2,8 @@ package com.replaymod.online.api.replay.holders; public enum MinecraftVersion { - MC_1_8("Minecraft 1.8", "1.8"); + MC_1_8("Minecraft 1.8", "1.8"), + MC_1_9_4("Minecraft 1.9.4", "1.9.4"); private String niceName, apiName; diff --git a/src/main/java/com/replaymod/online/gui/GuiReplayCenter.java b/src/main/java/com/replaymod/online/gui/GuiReplayCenter.java index e1054c96..c7e375fe 100644 --- a/src/main/java/com/replaymod/online/gui/GuiReplayCenter.java +++ b/src/main/java/com/replaymod/online/gui/GuiReplayCenter.java @@ -20,6 +20,7 @@ import com.replaymod.online.api.replay.pagination.FavoritedFilePagination; import com.replaymod.online.api.replay.pagination.Pagination; import com.replaymod.online.api.replay.pagination.SearchPagination; import com.replaymod.replaystudio.replay.ReplayMetaData; +import com.replaymod.replaystudio.studio.ReplayStudio; import de.johni0702.minecraft.gui.container.AbstractGuiContainer; import de.johni0702.minecraft.gui.container.GuiContainer; import de.johni0702.minecraft.gui.container.GuiPanel; @@ -115,6 +116,9 @@ public class GuiReplayCenter extends GuiScreen { boolean disliked = dislikedReplays.contains(replayId); loadButton.setI18nLabel(selected.downloaded ? "replaymod.gui.load" : "replaymod.gui.download"); + if (selected.incompatible) { + loadButton.setDisabled(); + } favoriteButton.setI18nLabel("replaymod.gui.center." + (favorited ? "unfavorite" : "favorite")); // Only allow button usage for either unfavorite or favorite after they've actually downloaded it @@ -339,6 +343,7 @@ public class GuiReplayCenter extends GuiScreen { public final GuiLabel author = new GuiLabel(); public final GuiLabel date = new GuiLabel().setColor(Colors.LIGHT_GRAY); public final GuiLabel server = new GuiLabel().setColor(Colors.LIGHT_GRAY); + public final GuiLabel version = new GuiLabel().setColor(Colors.RED); public final GuiLabel category = new GuiLabel().setColor(Colors.GREY); public final GuiPanel stats = new GuiPanel().setLayout(new HorizontalLayout().setSpacing(3)); public final GuiLabel favorites = new GuiLabel(stats).setColor(Colors.ORANGE); @@ -353,9 +358,10 @@ public class GuiReplayCenter extends GuiScreen { pos(category, 0, y(server) + height(server) + 3); pos(date, width - width(date), y(author)); + pos(version, width - width(version), y(server)); pos(stats, width - width(stats), y(category)); } - }).addElements(null, name, author, date, server, category, stats); + }).addElements(null, name, author, date, server, version, category, stats); public final GuiImage thumbnail; public final GuiLabel duration = new GuiLabel(); public final GuiPanel durationPanel = new GuiPanel().setBackgroundColor(Colors.HALF_TRANSPARENT) @@ -389,6 +395,7 @@ public class GuiReplayCenter extends GuiScreen { private final long dateMillis; private final int sortId; private final boolean downloaded; + private final boolean incompatible; public GuiReplayEntry(FileInfo fileInfo, BufferedImage thumbImage, int sortId, boolean downloaded) { this.fileInfo = fileInfo; @@ -404,6 +411,10 @@ public class GuiReplayCenter extends GuiScreen { } else { server.setText(metaData.getServerName()); } + incompatible = !new ReplayStudio().isCompatible(fileInfo.getMetadata().getFileFormatVersion()); + if (incompatible) { + version.setText("Minecraft " + fileInfo.getMetadata().getMcVersion()); + } dateMillis = metaData.getDate(); date.setText(new SimpleDateFormat().format(new Date(dateMillis))); if (thumbImage == null) { diff --git a/src/main/java/com/replaymod/online/handler/GuiHandler.java b/src/main/java/com/replaymod/online/handler/GuiHandler.java index bf631767..043d0b73 100644 --- a/src/main/java/com/replaymod/online/handler/GuiHandler.java +++ b/src/main/java/com/replaymod/online/handler/GuiHandler.java @@ -18,7 +18,6 @@ import net.minecraftforge.fml.common.FMLCommonHandler; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import java.io.File; -import java.util.List; public class GuiHandler { private static final int BUTTON_REPLAY_CENTER = 17890236; @@ -36,20 +35,18 @@ public class GuiHandler { @SubscribeEvent public void injectIntoMainMenu(GuiScreenEvent.InitGuiEvent event) { - if (!(event.gui instanceof GuiMainMenu)) { + if (!(event.getGui() instanceof GuiMainMenu)) { return; } - @SuppressWarnings("unchecked") - List buttonList = event.buttonList; - GuiButton button = new GuiButton(BUTTON_REPLAY_CENTER, event.gui.width / 2 - 100, - event.gui.height / 4 + 10 + 4 * 24, I18n.format("replaymod.gui.replaycenter")); - buttonList.add(button); + GuiButton button = new GuiButton(BUTTON_REPLAY_CENTER, event.getGui().width / 2 - 100, + event.getGui().height / 4 + 10 + 4 * 24, I18n.format("replaymod.gui.replaycenter")); + event.getButtonList().add(button); } @SubscribeEvent public void injectIntoReplayViewer(GuiScreenEvent.InitGuiEvent.Post event) { - AbstractGuiScreen guiScreen = GuiScreen.from(event.gui); + AbstractGuiScreen guiScreen = GuiScreen.from(event.getGui()); if (!(guiScreen instanceof GuiReplayViewer)) { return; } @@ -75,15 +72,15 @@ public class GuiHandler { @SubscribeEvent public void onButton(GuiScreenEvent.ActionPerformedEvent.Pre event) { - if(!event.button.enabled) return; + if(!event.getButton().enabled) return; - if (event.gui instanceof GuiMainMenu) { - if (event.button.id == BUTTON_REPLAY_CENTER) { + if (event.getGui() instanceof GuiMainMenu) { + if (event.getButton().id == BUTTON_REPLAY_CENTER) { GuiReplayCenter replayCenter = new GuiReplayCenter(mod); if (mod.isLoggedIn()) { replayCenter.display(); } else { - new GuiLoginPrompt(mod.getApiClient(), GuiScreen.wrap(event.gui), replayCenter, true).display(); + new GuiLoginPrompt(mod.getApiClient(), GuiScreen.wrap(event.getGui()), replayCenter, true).display(); } } } diff --git a/src/main/java/com/replaymod/recording/gui/GuiRecordingOverlay.java b/src/main/java/com/replaymod/recording/gui/GuiRecordingOverlay.java index 775276f8..9a5a5e41 100644 --- a/src/main/java/com/replaymod/recording/gui/GuiRecordingOverlay.java +++ b/src/main/java/com/replaymod/recording/gui/GuiRecordingOverlay.java @@ -40,7 +40,7 @@ public class GuiRecordingOverlay { */ @SubscribeEvent public void renderRecordingIndicator(RenderGameOverlayEvent.Post event) { - if (event.type != RenderGameOverlayEvent.ElementType.ALL) return; + if (event.getType() != RenderGameOverlayEvent.ElementType.ALL) return; if (settingsRegistry.get(Setting.INDICATOR)) { FontRenderer fontRenderer = mc.fontRendererObj; fontRenderer.drawString(I18n.format("replaymod.gui.recording").toUpperCase(), 30, 18 - (fontRenderer.FONT_HEIGHT / 2), 0xffffffff); diff --git a/src/main/java/com/replaymod/recording/handler/ConnectionEventHandler.java b/src/main/java/com/replaymod/recording/handler/ConnectionEventHandler.java index ad9d7b46..5fef55b2 100755 --- a/src/main/java/com/replaymod/recording/handler/ConnectionEventHandler.java +++ b/src/main/java/com/replaymod/recording/handler/ConnectionEventHandler.java @@ -13,7 +13,6 @@ import io.netty.channel.Channel; import io.netty.channel.ChannelPipeline; import net.minecraft.client.Minecraft; import net.minecraft.network.NetworkManager; -import net.minecraft.server.MinecraftServer; import net.minecraft.world.WorldType; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.network.FMLNetworkEvent.ClientConnectedToServerEvent; @@ -49,8 +48,8 @@ public class ConnectionEventHandler { @SubscribeEvent public void onConnectedToServerEvent(ClientConnectedToServerEvent event) { try { - if(event.isLocal) { - if (MinecraftServer.getServer().getEntityWorld().getWorldType() == WorldType.DEBUG_WORLD) { + if(event.isLocal()) { + if (mc.getIntegratedServer().getEntityWorld().getWorldType() == WorldType.DEBUG_WORLD) { logger.info("Debug World recording is not supported."); return; } @@ -65,16 +64,17 @@ public class ConnectionEventHandler { } } - NetworkManager nm = event.manager; + NetworkManager nm = event.getManager(); String worldName; - if(event.isLocal) { - worldName = MinecraftServer.getServer().getWorldName(); + if(event.isLocal()) { + worldName = mc.getIntegratedServer().getWorldName(); } else if (Minecraft.getMinecraft().getCurrentServerData() != null) { worldName = Minecraft.getMinecraft().getCurrentServerData().serverIP; } else { logger.info("Recording not started as the world is neither local nor remote (probably a replay)."); return; } + Channel channel = nm.channel(); ChannelPipeline pipeline = channel.pipeline(); @@ -87,7 +87,7 @@ public class ConnectionEventHandler { replayFile.writeModInfo(ModCompat.getInstalledNetworkMods()); ReplayMetaData metaData = new ReplayMetaData(); - metaData.setSingleplayer(event.isLocal); + metaData.setSingleplayer(event.isLocal()); metaData.setServerName(worldName); metaData.setGenerator("ReplayMod v" + ReplayMod.getContainer().getVersion()); metaData.setDate(System.currentTimeMillis()); diff --git a/src/main/java/com/replaymod/recording/handler/RecordingEventHandler.java b/src/main/java/com/replaymod/recording/handler/RecordingEventHandler.java index 9dfb6f55..8b509218 100755 --- a/src/main/java/com/replaymod/recording/handler/RecordingEventHandler.java +++ b/src/main/java/com/replaymod/recording/handler/RecordingEventHandler.java @@ -1,23 +1,20 @@ package com.replaymod.recording.handler; import com.replaymod.recording.packet.PacketListener; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.Unpooled; import net.minecraft.client.Minecraft; +import net.minecraft.entity.EntityLiving; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.Item; +import net.minecraft.inventory.EntityEquipmentSlot; import net.minecraft.item.ItemStack; import net.minecraft.network.Packet; -import net.minecraft.network.PacketBuffer; +import net.minecraft.network.datasync.EntityDataManager; import net.minecraft.network.play.server.*; -import net.minecraft.network.play.server.S14PacketEntity.S17PacketEntityLookMove; import net.minecraft.server.integrated.IntegratedServer; -import net.minecraft.util.BlockPos; -import net.minecraft.util.MathHelper; +import net.minecraft.util.EnumHand; +import net.minecraft.util.math.BlockPos; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.entity.minecart.MinecartInteractEvent; import net.minecraftforge.event.entity.player.PlayerSleepInBedEvent; -import net.minecraftforge.event.entity.player.PlayerUseItemEvent; import net.minecraftforge.fml.common.FMLCommonHandler; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.gameevent.PlayerEvent.ItemPickupEvent; @@ -32,11 +29,13 @@ public class RecordingEventHandler { private final PacketListener packetListener; private Double lastX, lastY, lastZ; - private ItemStack[] playerItems = new ItemStack[5]; + private ItemStack[] playerItems = new ItemStack[6]; private int ticksSinceLastCorrection; private boolean wasSleeping; private int lastRiding = -1; private Integer rotationYawHeadBefore; + private boolean wasHandActive; + private EnumHand lastActiveHand; public RecordingEventHandler(PacketListener packetListener) { this.packetListener = packetListener; @@ -59,7 +58,7 @@ public class RecordingEventHandler { public void onPlayerJoin() { try { - packetListener.save(spawnPlayer(mc.thePlayer)); + packetListener.save(new SPacketSpawnPlayer(mc.thePlayer)); } catch(Exception e1) { e1.printStackTrace(); } @@ -67,42 +66,12 @@ public class RecordingEventHandler { public void onPlayerRespawn() { try { - packetListener.save(spawnPlayer(mc.thePlayer)); + packetListener.save(new SPacketSpawnPlayer(mc.thePlayer)); } catch(Exception e) { e.printStackTrace(); } } - private S0CPacketSpawnPlayer spawnPlayer(EntityPlayer player) { - try { - S0CPacketSpawnPlayer packet = new S0CPacketSpawnPlayer(); - - ByteBuf bb = Unpooled.buffer(); - PacketBuffer pb = new PacketBuffer(bb); - - pb.writeVarIntToBuffer(player.getEntityId()); - pb.writeUuid(EntityPlayer.getUUID(player.getGameProfile())); - - pb.writeInt(MathHelper.floor_double(player.posX * 32.0D)); - pb.writeInt(MathHelper.floor_double(player.posY * 32.0D)); - pb.writeInt(MathHelper.floor_double(player.posZ * 32.0D)); - pb.writeByte((byte) ((int) (player.rotationYaw * 256.0F / 360.0F))); - pb.writeByte((byte) ((int) (player.rotationPitch * 256.0F / 360.0F))); - - ItemStack itemstack = player.inventory.getCurrentItem(); - pb.writeShort(itemstack == null ? 0 : Item.getIdFromItem(itemstack.getItem())); - - player.getDataWatcher().writeTo(pb); - - packet.readPacketData(pb); - - return packet; - } catch(Exception e) { - e.printStackTrace(); - return null; - } - } - @SubscribeEvent public void onPlayerTick(PlayerTickEvent e) { try { @@ -131,19 +100,14 @@ public class RecordingEventHandler { lastZ = e.player.posZ; Packet packet; - if(force || Math.abs(dx) > 4.0 || Math.abs(dy) > 4.0 || Math.abs(dz) > 4.0) { - int x = MathHelper.floor_double(e.player.posX * 32.0D); - int y = MathHelper.floor_double(e.player.posY * 32.0D); - int z = MathHelper.floor_double(e.player.posZ * 32.0D); - byte yaw = (byte) ((int) (e.player.rotationYaw * 256.0F / 360.0F)); - byte pitch = (byte) ((int) (e.player.rotationPitch * 256.0F / 360.0F)); - packet = new S18PacketEntityTeleport(e.player.getEntityId(), x, y, z, yaw, pitch, e.player.onGround); + if (force || Math.abs(dx) > 8.0 || Math.abs(dy) > 8.0 || Math.abs(dz) > 8.0) { + packet = new SPacketEntityTeleport(e.player); } else { byte newYaw = (byte) ((int) (e.player.rotationYaw * 256.0F / 360.0F)); byte newPitch = (byte) ((int) (e.player.rotationPitch * 256.0F / 360.0F)); - packet = new S17PacketEntityLookMove(e.player.getEntityId(), - (byte) Math.round(dx * 32), (byte) Math.round(dy * 32), (byte) Math.round(dz * 32), + packet = new SPacketEntity.S17PacketEntityLookMove(e.player.getEntityId(), + (short) Math.round(dx * 4096), (short) Math.round(dy * 4096), (short) Math.round(dz * 4096), newYaw, newPitch, e.player.onGround); } @@ -153,37 +117,16 @@ public class RecordingEventHandler { int rotationYawHead = ((int)(e.player.rotationYawHead * 256.0F / 360.0F)); if(!Objects.equals(rotationYawHead, rotationYawHeadBefore)) { - S19PacketEntityHeadLook head = new S19PacketEntityHeadLook(); - ByteBuf bb1 = Unpooled.buffer(); - PacketBuffer pb1 = new PacketBuffer(bb1); - - pb1.writeVarIntToBuffer(e.player.getEntityId()); - pb1.writeByte(rotationYawHead); - - head.readPacketData(pb1); - - packetListener.save(head); - + packetListener.save(new SPacketEntityHeadLook(e.player, (byte) rotationYawHead)); rotationYawHeadBefore = rotationYawHead; } - S12PacketEntityVelocity vel = new S12PacketEntityVelocity(e.player.getEntityId(), e.player.motionX, e.player.motionY, e.player.motionZ); - packetListener.save(vel); + packetListener.save(new SPacketEntityVelocity(e.player.getEntityId(), e.player.motionX, e.player.motionY, e.player.motionZ)); //Animation Packets //Swing Animation - if(e.player.swingProgressInt == 1) { - S0BPacketAnimation pac = new S0BPacketAnimation(); - - ByteBuf bb = Unpooled.buffer(); - PacketBuffer pb = new PacketBuffer(bb); - - pb.writeVarIntToBuffer(e.player.getEntityId()); - pb.writeByte(0); - - pac.readPacketData(pb); - - packetListener.save(pac); + if (e.player.isSwingInProgress && e.player.swingProgressInt == -1) { + packetListener.save(new SPacketAnimation(e.player, e.player.swingingHand == EnumHand.MAIN_HAND ? 0 : 3)); } /* @@ -207,77 +150,64 @@ public class RecordingEventHandler { */ //Inventory Handling - if(playerItems[0] != mc.thePlayer.getHeldItem()) { - playerItems[0] = mc.thePlayer.getHeldItem(); - S04PacketEntityEquipment pee = new S04PacketEntityEquipment(e.player.getEntityId(), 0, playerItems[0]); - packetListener.save(pee); + if (playerItems[0] != mc.thePlayer.getHeldItem(EnumHand.MAIN_HAND)) { + playerItems[0] = mc.thePlayer.getHeldItem(EnumHand.MAIN_HAND); + packetListener.save(new SPacketEntityEquipment(e.player.getEntityId(), EntityEquipmentSlot.MAINHAND, playerItems[0])); } - 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]); - packetListener.save(pee); + if (playerItems[1] != mc.thePlayer.getHeldItem(EnumHand.OFF_HAND)) { + playerItems[1] = mc.thePlayer.getHeldItem(EnumHand.OFF_HAND); + packetListener.save(new SPacketEntityEquipment(e.player.getEntityId(), EntityEquipmentSlot.OFFHAND, playerItems[1])); } - 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]); - packetListener.save(pee); + if (playerItems[2] != mc.thePlayer.inventory.armorInventory[0]) { + playerItems[2] = mc.thePlayer.inventory.armorInventory[0]; + packetListener.save(new SPacketEntityEquipment(e.player.getEntityId(), EntityEquipmentSlot.FEET, playerItems[2])); } - 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]); - packetListener.save(pee); + if (playerItems[3] != mc.thePlayer.inventory.armorInventory[1]) { + playerItems[3] = mc.thePlayer.inventory.armorInventory[1]; + packetListener.save(new SPacketEntityEquipment(e.player.getEntityId(), EntityEquipmentSlot.LEGS, playerItems[3])); } - 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]); - packetListener.save(pee); + if (playerItems[4] != mc.thePlayer.inventory.armorInventory[2]) { + playerItems[4] = mc.thePlayer.inventory.armorInventory[2]; + packetListener.save(new SPacketEntityEquipment(e.player.getEntityId(), EntityEquipmentSlot.CHEST, playerItems[4])); + } + + if (playerItems[5] != mc.thePlayer.inventory.armorInventory[3]) { + playerItems[5] = mc.thePlayer.inventory.armorInventory[3]; + packetListener.save(new SPacketEntityEquipment(e.player.getEntityId(), EntityEquipmentSlot.HEAD, playerItems[5])); } //Leaving Ride if((!mc.thePlayer.isRiding() && lastRiding != -1) || - (mc.thePlayer.isRiding() && lastRiding != mc.thePlayer.ridingEntity.getEntityId())) { + (mc.thePlayer.isRiding() && lastRiding != mc.thePlayer.getRidingEntity().getEntityId())) { if(!mc.thePlayer.isRiding()) { lastRiding = -1; } else { - lastRiding = mc.thePlayer.ridingEntity.getEntityId(); + lastRiding = mc.thePlayer.getRidingEntity().getEntityId(); } - - S1BPacketEntityAttach pea = new S1BPacketEntityAttach(); - - ByteBuf buf = Unpooled.buffer(); - PacketBuffer pbuf = new PacketBuffer(buf); - - pbuf.writeInt(e.player.getEntityId()); - pbuf.writeInt(lastRiding); - pbuf.writeBoolean(false); - - pea.readPacketData(pbuf); - - packetListener.save(pea); + packetListener.save(new SPacketEntityAttach(e.player, e.player.getRidingEntity())); } //Sleeping if(!mc.thePlayer.isPlayerSleeping() && wasSleeping) { - S0BPacketAnimation pac = new S0BPacketAnimation(); - - ByteBuf bb = Unpooled.buffer(); - PacketBuffer pb = new PacketBuffer(bb); - - pb.writeVarIntToBuffer(e.player.getEntityId()); - pb.writeByte(2); - - pac.readPacketData(pb); - - packetListener.save(pac); - + packetListener.save(new SPacketAnimation(e.player, 2)); wasSleeping = false; } + // Active hand (e.g. eating, drinking, blocking) + if (mc.thePlayer.isHandActive() ^ wasHandActive || mc.thePlayer.getActiveHand() != lastActiveHand) { + wasHandActive = mc.thePlayer.isHandActive(); + lastActiveHand = mc.thePlayer.getActiveHand(); + EntityDataManager dataManager = new EntityDataManager(null); + int state = (wasHandActive ? 1 : 0) | (lastActiveHand == EnumHand.OFF_HAND ? 2 : 0); + dataManager.register(EntityLiving.HAND_STATES, (byte) state); + packetListener.save(new SPacketEntityMetadata(mc.thePlayer.getEntityId(), dataManager, true)); + } + } catch(Exception e1) { e1.printStackTrace(); } @@ -286,27 +216,7 @@ public class RecordingEventHandler { @SubscribeEvent public void onPickupItem(ItemPickupEvent event) { try { - packetListener.save(new S0DPacketCollectItem(event.pickedUp.getEntityId(), event.player.getEntityId())); - } catch(Exception e) { - e.printStackTrace(); - } - } - - @SubscribeEvent - public void onStartEating(PlayerUseItemEvent.Start event) { - try { - if(!event.entityPlayer.isEating()) return; - S0BPacketAnimation packet = new S0BPacketAnimation(); - - ByteBuf bb = Unpooled.buffer(); - PacketBuffer pb = new PacketBuffer(bb); - - pb.writeVarIntToBuffer(event.entityPlayer.getEntityId()); - pb.writeByte(3); - - packet.readPacketData(pb); - - packetListener.save(packet); + packetListener.save(new SPacketCollectItem(event.pickedUp.getEntityId(), event.player.getEntityId())); } catch(Exception e) { e.printStackTrace(); } @@ -315,21 +225,11 @@ public class RecordingEventHandler { @SubscribeEvent public void onSleep(PlayerSleepInBedEvent event) { try { - if(event.entityPlayer != mc.thePlayer) { + if (event.getEntityPlayer() != mc.thePlayer) { return; } - S0APacketUseBed pub = new S0APacketUseBed(); - - ByteBuf buf = Unpooled.buffer(); - PacketBuffer pbuf = new PacketBuffer(buf); - - pbuf.writeVarIntToBuffer(event.entityPlayer.getEntityId()); - pbuf.writeBlockPos(event.pos); - - pub.readPacketData(pbuf); - - packetListener.save(pub); + packetListener.save(new SPacketUseBed(event.getEntityPlayer(), event.getPos())); wasSleeping = true; @@ -341,24 +241,13 @@ public class RecordingEventHandler { @SubscribeEvent public void enterMinecart(MinecartInteractEvent event) { try { - if(event.player != mc.thePlayer) { + if(event.getEntity() != mc.thePlayer) { return; } - S1BPacketEntityAttach pea = new S1BPacketEntityAttach(); + packetListener.save(new SPacketEntityAttach(event.getPlayer(), event.getMinecart())); - ByteBuf buf = Unpooled.buffer(); - PacketBuffer pbuf = new PacketBuffer(buf); - - pbuf.writeInt(event.player.getEntityId()); - pbuf.writeInt(event.minecart.getEntityId()); - pbuf.writeBoolean(false); - - pea.readPacketData(pbuf); - - packetListener.save(pea); - - lastRiding = event.minecart.getEntityId(); + lastRiding = event.getMinecart().getEntityId(); } catch(Exception e) { e.printStackTrace(); } @@ -367,7 +256,7 @@ public class RecordingEventHandler { public void onBlockBreakAnim(int breakerId, BlockPos pos, int progress) { EntityPlayer thePlayer = mc.thePlayer; if (thePlayer != null && breakerId == thePlayer.getEntityId()) { - packetListener.save(new S25PacketBlockBreakAnim(breakerId, pos, progress)); + packetListener.save(new SPacketBlockBreakAnim(breakerId, pos, progress)); } } diff --git a/src/main/java/com/replaymod/recording/mixin/MixinNetHandlerPlayClient.java b/src/main/java/com/replaymod/recording/mixin/MixinNetHandlerPlayClient.java index baf316ed..8cdc8b5c 100644 --- a/src/main/java/com/replaymod/recording/mixin/MixinNetHandlerPlayClient.java +++ b/src/main/java/com/replaymod/recording/mixin/MixinNetHandlerPlayClient.java @@ -3,16 +3,14 @@ package com.replaymod.recording.mixin; import com.replaymod.recording.handler.RecordingEventHandler; import net.minecraft.client.Minecraft; import net.minecraft.client.network.NetHandlerPlayClient; -import net.minecraft.network.play.server.S07PacketRespawn; -import net.minecraft.network.play.server.S38PacketPlayerListItem; +import net.minecraft.network.play.server.SPacketPlayerListItem; +import net.minecraft.network.play.server.SPacketRespawn; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import java.util.List; - @Mixin(NetHandlerPlayClient.class) public abstract class MixinNetHandlerPlayClient { @@ -31,13 +29,11 @@ public abstract class MixinNetHandlerPlayClient { * @param ci Callback info */ @Inject(method = "handlePlayerListItem", at=@At("RETURN")) - public void recordOwnJoin(S38PacketPlayerListItem packet, CallbackInfo ci) { + public void recordOwnJoin(SPacketPlayerListItem packet, CallbackInfo ci) { RecordingEventHandler handler = getRecordingEventHandler(); - if (handler != null && packet.func_179768_b() == S38PacketPlayerListItem.Action.ADD_PLAYER) { - @SuppressWarnings("unchecked") - List dataList = packet.func_179767_a(); - for (S38PacketPlayerListItem.AddPlayerData data : dataList) { - if (data.func_179962_a().getId().equals(Minecraft.getMinecraft().thePlayer.getGameProfile().getId())) { + if (handler != null && packet.getAction() == SPacketPlayerListItem.Action.ADD_PLAYER) { + for (SPacketPlayerListItem.AddPlayerData data : packet.getEntries()) { + if (data.getProfile().getId().equals(gameController.thePlayer.getGameProfile().getId())) { handler.onPlayerJoin(); } } @@ -47,12 +43,12 @@ public abstract class MixinNetHandlerPlayClient { /** * Record the own player entity respawning. * We cannot use the {@link net.minecraftforge.event.entity.EntityJoinWorldEvent} because that would also include - * the first spawn which is already handled by {@link #recordOwnJoin(S38PacketPlayerListItem, CallbackInfo)}. + * the first spawn which is already handled by {@link #recordOwnJoin(SPacketPlayerListItem, CallbackInfo)}. * @param packet The packet * @param ci Callback info */ @Inject(method = "handleRespawn", at=@At("RETURN")) - public void recordOwnRespawn(S07PacketRespawn packet, CallbackInfo ci) { + public void recordOwnRespawn(SPacketRespawn packet, CallbackInfo ci) { RecordingEventHandler handler = getRecordingEventHandler(); if (handler != null) { handler.onPlayerRespawn(); diff --git a/src/main/java/com/replaymod/recording/mixin/MixinRenderGlobal.java b/src/main/java/com/replaymod/recording/mixin/MixinRenderGlobal.java index d9e11de1..a27cbf0c 100644 --- a/src/main/java/com/replaymod/recording/mixin/MixinRenderGlobal.java +++ b/src/main/java/com/replaymod/recording/mixin/MixinRenderGlobal.java @@ -2,7 +2,7 @@ package com.replaymod.recording.mixin; import com.replaymod.recording.handler.RecordingEventHandler; import net.minecraft.client.renderer.RenderGlobal; -import net.minecraft.util.BlockPos; +import net.minecraft.util.math.BlockPos; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; diff --git a/src/main/java/com/replaymod/recording/packet/PacketListener.java b/src/main/java/com/replaymod/recording/packet/PacketListener.java index 89c75c90..ca213b29 100755 --- a/src/main/java/com/replaymod/recording/packet/PacketListener.java +++ b/src/main/java/com/replaymod/recording/packet/PacketListener.java @@ -9,21 +9,24 @@ import io.netty.buffer.Unpooled; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelInboundHandlerAdapter; import net.minecraft.client.Minecraft; -import net.minecraft.entity.DataWatcher; import net.minecraft.entity.Entity; import net.minecraft.network.EnumConnectionState; import net.minecraft.network.EnumPacketDirection; import net.minecraft.network.Packet; import net.minecraft.network.PacketBuffer; +import net.minecraft.network.datasync.EntityDataManager; import net.minecraft.network.play.server.*; -import net.minecraft.util.ChatComponentText; +import net.minecraft.util.text.TextComponentString; import net.minecraftforge.fml.common.network.internal.FMLProxyPacket; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import java.io.DataOutputStream; import java.io.IOException; -import java.util.*; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; +import java.util.UUID; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; @@ -84,8 +87,8 @@ public class PacketListener extends ChannelInboundHandlerAdapter { public void save(Packet packet) { try { - if(packet instanceof S0CPacketSpawnPlayer) { - UUID uuid = ((S0CPacketSpawnPlayer) packet).func_179819_c(); + if(packet instanceof SPacketSpawnPlayer) { + UUID uuid = ((SPacketSpawnPlayer) packet).getUniqueId(); Set uuids = new HashSet<>(Arrays.asList(metaData.getPlayers())); uuids.add(uuid.toString()); metaData.setPlayers(uuids.toArray(new String[uuids.size()])); @@ -150,16 +153,16 @@ public class PacketListener extends ChannelInboundHandlerAdapter { try { Packet packet = (Packet) msg; - if(packet instanceof S0DPacketCollectItem) { + if(packet instanceof SPacketCollectItem) { if(mc.thePlayer != null || - ((S0DPacketCollectItem) packet).func_149353_d() == mc.thePlayer.getEntityId()) { + ((SPacketCollectItem) packet).getEntityID() == mc.thePlayer.getEntityId()) { super.channelRead(ctx, msg); return; } } - if (packet instanceof S48PacketResourcePackSend) { - save(resourcePackRecorder.handleResourcePack((S48PacketResourcePackSend) packet)); + if (packet instanceof SPacketResourcePackSend) { + save(resourcePackRecorder.handleResourcePack((SPacketResourcePackSend) packet)); return; } @@ -172,10 +175,10 @@ public class PacketListener extends ChannelInboundHandlerAdapter { save(packet); - if (packet instanceof S3FPacketCustomPayload) { - S3FPacketCustomPayload p = (S3FPacketCustomPayload) packet; + if (packet instanceof SPacketCustomPayload) { + SPacketCustomPayload p = (SPacketCustomPayload) packet; if (Restrictions.PLUGIN_CHANNEL.equals(p.getChannelName())) { - packet = new S40PacketDisconnect(new ChatComponentText("Please update to view this replay.")); + packet = new SPacketDisconnect(new TextComponentString("Please update to view this replay.")); save(packet); } } @@ -188,27 +191,31 @@ public class PacketListener extends ChannelInboundHandlerAdapter { super.channelRead(ctx, msg); } + private void DataManager_set(EntityDataManager dataManager, EntityDataManager.DataEntry entry) { + dataManager.register(entry.getKey(), entry.getValue()); + } + @SuppressWarnings("unchecked") private byte[] getPacketData(Packet packet) throws IOException { - if(packet instanceof S0FPacketSpawnMob) { - S0FPacketSpawnMob p = (S0FPacketSpawnMob) packet; - if (p.field_149043_l == null) { - p.field_149043_l = new DataWatcher(null); - if(p.func_149027_c() != null) { - for(DataWatcher.WatchableObject wo : (List) p.func_149027_c()) { - p.field_149043_l.addObject(wo.getDataValueId(), wo.getObject()); + if (packet instanceof SPacketSpawnMob) { + SPacketSpawnMob p = (SPacketSpawnMob) packet; + if (p.dataManager == null) { + p.dataManager = new EntityDataManager(null); + if (p.getDataManagerEntries() != null) { + for (EntityDataManager.DataEntry entry : p.getDataManagerEntries()) { + DataManager_set(p.dataManager, entry); } } } } - if(packet instanceof S0CPacketSpawnPlayer) { - S0CPacketSpawnPlayer p = (S0CPacketSpawnPlayer) packet; - if (p.field_148960_i == null) { - p.field_148960_i = new DataWatcher(null); - if(p.func_148944_c() != null) { - for(DataWatcher.WatchableObject wo : (List) p.func_148944_c()) { - p.field_148960_i.addObject(wo.getDataValueId(), wo.getObject()); + if (packet instanceof SPacketSpawnPlayer) { + SPacketSpawnPlayer p = (SPacketSpawnPlayer) packet; + if (p.watcher == null) { + p.watcher = new EntityDataManager(null); + if (p.getDataManagerEntries() != null) { + for (EntityDataManager.DataEntry entry : p.getDataManagerEntries()) { + DataManager_set(p.watcher, entry); } } } diff --git a/src/main/java/com/replaymod/recording/packet/ResourcePackRecorder.java b/src/main/java/com/replaymod/recording/packet/ResourcePackRecorder.java index a00ff274..4bc59356 100644 --- a/src/main/java/com/replaymod/recording/packet/ResourcePackRecorder.java +++ b/src/main/java/com/replaymod/recording/packet/ResourcePackRecorder.java @@ -15,8 +15,8 @@ import net.minecraft.client.network.NetHandlerPlayClient; import net.minecraft.client.resources.I18n; import net.minecraft.client.resources.ResourcePackRepository; import net.minecraft.network.NetworkManager; -import net.minecraft.network.play.client.C19PacketResourcePackStatus; -import net.minecraft.network.play.server.S48PacketResourcePackSend; +import net.minecraft.network.play.client.CPacketResourcePackStatus; +import net.minecraft.network.play.server.SPacketResourcePackSend; import net.minecraft.util.HttpUtil; import org.apache.commons.io.FileUtils; import org.apache.logging.log4j.LogManager; @@ -70,12 +70,12 @@ public class ResourcePackRecorder { } } - public synchronized S48PacketResourcePackSend handleResourcePack(S48PacketResourcePackSend packet) { + public synchronized SPacketResourcePackSend handleResourcePack(SPacketResourcePackSend packet) { final int requestId = nextRequestId++; - final NetHandlerPlayClient netHandler = mc.getNetHandler(); + final NetHandlerPlayClient netHandler = mc.getConnection(); final NetworkManager netManager = netHandler.getNetworkManager(); - final String url = packet.func_179783_a(); - final String hash = packet.func_179784_b(); + final String url = packet.getURL(); + final String hash = packet.getHash(); if (url.startsWith("level://")) { String levelName = url.substring("level://".length()); @@ -83,60 +83,60 @@ public class ResourcePackRecorder { final File levelDir = new File(savesDir, levelName); if (levelDir.isFile()) { - netManager.sendPacket(new C19PacketResourcePackStatus(hash, C19PacketResourcePackStatus.Action.ACCEPTED)); - Futures.addCallback(mc.getResourcePackRepository().func_177319_a(levelDir), new FutureCallback() { + netManager.sendPacket(new CPacketResourcePackStatus(hash, CPacketResourcePackStatus.Action.ACCEPTED)); + Futures.addCallback(mc.getResourcePackRepository().setResourcePackInstance(levelDir), new FutureCallback() { @Override public void onSuccess(Object result) { recordResourcePack(levelDir, requestId); - netManager.sendPacket(new C19PacketResourcePackStatus(hash, C19PacketResourcePackStatus.Action.SUCCESSFULLY_LOADED)); + netManager.sendPacket(new CPacketResourcePackStatus(hash, CPacketResourcePackStatus.Action.SUCCESSFULLY_LOADED)); } @Override public void onFailure(@Nonnull Throwable throwable) { - netManager.sendPacket(new C19PacketResourcePackStatus(hash, C19PacketResourcePackStatus.Action.FAILED_DOWNLOAD)); + netManager.sendPacket(new CPacketResourcePackStatus(hash, CPacketResourcePackStatus.Action.FAILED_DOWNLOAD)); } }); } else { - netManager.sendPacket(new C19PacketResourcePackStatus(hash, C19PacketResourcePackStatus.Action.FAILED_DOWNLOAD)); + netManager.sendPacket(new CPacketResourcePackStatus(hash, CPacketResourcePackStatus.Action.FAILED_DOWNLOAD)); } } else { final ServerData serverData = mc.getCurrentServerData(); if (serverData != null && serverData.getResourceMode() == ServerData.ServerResourceMode.ENABLED) { - netManager.sendPacket(new C19PacketResourcePackStatus(hash, C19PacketResourcePackStatus.Action.ACCEPTED)); + netManager.sendPacket(new CPacketResourcePackStatus(hash, CPacketResourcePackStatus.Action.ACCEPTED)); downloadResourcePackFuture(requestId, url, hash); } else if (serverData != null && serverData.getResourceMode() != ServerData.ServerResourceMode.PROMPT) { - netManager.sendPacket(new C19PacketResourcePackStatus(hash, C19PacketResourcePackStatus.Action.DECLINED)); + netManager.sendPacket(new CPacketResourcePackStatus(hash, CPacketResourcePackStatus.Action.DECLINED)); } else { mc.addScheduledTask(() -> mc.displayGuiScreen(new GuiYesNo((result, id) -> { if (serverData != null) { serverData.setResourceMode(result ? ServerData.ServerResourceMode.ENABLED : ServerData.ServerResourceMode.DISABLED); } if (result) { - netManager.sendPacket(new C19PacketResourcePackStatus(hash, C19PacketResourcePackStatus.Action.ACCEPTED)); + netManager.sendPacket(new CPacketResourcePackStatus(hash, CPacketResourcePackStatus.Action.ACCEPTED)); downloadResourcePackFuture(requestId, url, hash); } else { - netManager.sendPacket(new C19PacketResourcePackStatus(hash, C19PacketResourcePackStatus.Action.DECLINED)); + netManager.sendPacket(new CPacketResourcePackStatus(hash, CPacketResourcePackStatus.Action.DECLINED)); } - ServerList.func_147414_b(serverData); + ServerList.saveSingleServer(serverData); mc.displayGuiScreen(null); }, I18n.format("multiplayer.texturePrompt.line1"), I18n.format("multiplayer.texturePrompt.line2"), 0))); } } - return new S48PacketResourcePackSend("replay://" + requestId, ""); + return new SPacketResourcePackSend("replay://" + requestId, ""); } 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.getNetHandler().addToSendQueue(new C19PacketResourcePackStatus(hash, C19PacketResourcePackStatus.Action.SUCCESSFULLY_LOADED)); + mc.getConnection().sendPacket(new CPacketResourcePackStatus(hash, CPacketResourcePackStatus.Action.SUCCESSFULLY_LOADED)); } @Override public void onFailure(@Nonnull Throwable throwable) { - mc.getNetHandler().addToSendQueue(new C19PacketResourcePackStatus(hash, C19PacketResourcePackStatus.Action.FAILED_DOWNLOAD)); + mc.getConnection().sendPacket(new CPacketResourcePackStatus(hash, CPacketResourcePackStatus.Action.FAILED_DOWNLOAD)); } }); } @@ -161,16 +161,16 @@ public class ResourcePackRecorder { } final File file = new File(repo.dirServerResourcepacks, fileName); - repo.field_177321_h.lock(); + repo.lock.lock(); try { - repo.func_148529_f(); + repo.clearResourcePack(); if (file.exists() && hash.length() == 40) { try { String fileHash = Hashing.sha1().hashBytes(Files.toByteArray(file)).toString(); if (fileHash.equals(hash)) { recordResourcePack(file, requestId); - return repo.func_177319_a(file); + return repo.setResourcePackInstance(file); } logger.warn("File " + file + " had wrong hash (expected " + hash + ", found " + fileHash + "). Deleting it."); @@ -186,13 +186,13 @@ public class ResourcePackRecorder { Futures.getUnchecked(mc.addScheduledTask(() -> mc.displayGuiScreen(guiScreen))); - Map sessionInfo = Minecraft.getSessionInfo(); - repo.field_177322_i = HttpUtil.func_180192_a(file, url, sessionInfo, 50 * 1024 * 1024, guiScreen, mc.getProxy()); - Futures.addCallback(repo.field_177322_i, new FutureCallback() { + Map sessionInfo = Minecraft.getSessionInfo(); + repo.downloadingPacks = HttpUtil.downloadResourcePack(file, url, sessionInfo, 50 * 1024 * 1024, guiScreen, mc.getProxy()); + Futures.addCallback(repo.downloadingPacks, new FutureCallback() { @Override public void onSuccess(Object value) { recordResourcePack(file, requestId); - repo.func_177319_a(file); + repo.setResourcePackInstance(file); } @Override @@ -200,9 +200,9 @@ public class ResourcePackRecorder { throwable.printStackTrace(); } }); - return repo.field_177322_i; + return repo.downloadingPacks; } finally { - repo.field_177321_h.unlock(); + repo.lock.unlock(); } } diff --git a/src/main/java/com/replaymod/render/capturer/ODSFrameCapturer.java b/src/main/java/com/replaymod/render/capturer/ODSFrameCapturer.java index 33c9ae7a..54cab003 100644 --- a/src/main/java/com/replaymod/render/capturer/ODSFrameCapturer.java +++ b/src/main/java/com/replaymod/render/capturer/ODSFrameCapturer.java @@ -73,9 +73,9 @@ public class ODSFrameCapturer implements FrameCapturer { linkState(1, "lightMapEnabled"); linkState(2, "hurtTextureEnabled"); final Program.Uniform uniform = shaderProgram.getUniformVariable("fogEnabled"); - previousFogState = GlStateManager.fogState.field_179049_a; + previousFogState = GlStateManager.fogState.fog; uniform.set(previousFogState.currentState); - GlStateManager.fogState.field_179049_a = new BooleanState(previousFogState.capability) { + GlStateManager.fogState.fog = new BooleanState(previousFogState.capability) { @Override public void setState(boolean state) { super.setState(state); @@ -133,7 +133,7 @@ public class ODSFrameCapturer implements FrameCapturer { for (int i = 0; i < 3; i++) { GlStateManager.textureState[i].texture2DState = previousStates[i]; } - GlStateManager.fogState.field_179049_a = previousFogState; + GlStateManager.fogState.fog = previousFogState; } private class CubicStereoFrameCapturer extends CubicPboOpenGlFrameCapturer { diff --git a/src/main/java/com/replaymod/render/hooks/ChunkLoadingRenderGlobal.java b/src/main/java/com/replaymod/render/hooks/ChunkLoadingRenderGlobal.java index 35599bf7..8e7b5711 100644 --- a/src/main/java/com/replaymod/render/hooks/ChunkLoadingRenderGlobal.java +++ b/src/main/java/com/replaymod/render/hooks/ChunkLoadingRenderGlobal.java @@ -10,13 +10,13 @@ import net.minecraft.client.renderer.chunk.RenderChunk; import java.lang.reflect.Field; import java.util.Iterator; -import java.util.concurrent.BlockingQueue; +import java.util.concurrent.PriorityBlockingQueue; public class ChunkLoadingRenderGlobal { private final RenderGlobal hooked; private final ChunkRenderDispatcher renderDispatcher; - private final JailingQueue workerJailingQueue; + private final JailingQueue workerJailingQueue; private final CustomChunkRenderWorker renderWorker; private int frame; @@ -27,10 +27,10 @@ public class ChunkLoadingRenderGlobal { this.renderWorker = new CustomChunkRenderWorker(renderDispatcher, new RegionRenderCacheBuilder()); int workerThreads = renderDispatcher.listThreadedWorkers.size(); - BlockingQueue queueChunkUpdates = renderDispatcher.queueChunkUpdates; + PriorityBlockingQueue queueChunkUpdates = renderDispatcher.queueChunkUpdates; workerJailingQueue = new JailingQueue<>(queueChunkUpdates); renderDispatcher.queueChunkUpdates = workerJailingQueue; - ChunkCompileTaskGenerator element = new ChunkCompileTaskGenerator(null, null); + ChunkCompileTaskGenerator element = new ChunkCompileTaskGenerator(null, null, 0); element.finish(); for (int i = 0; i < workerThreads; i++) { queueChunkUpdates.add(element); @@ -51,7 +51,6 @@ public class ChunkLoadingRenderGlobal { } } - @SuppressWarnings("unchecked") public void updateChunks() { while (renderDispatcher.runChunkUploads(0)) { hooked.displayListEntitiesDirty = true; @@ -59,7 +58,7 @@ public class ChunkLoadingRenderGlobal { while (!renderDispatcher.queueChunkUpdates.isEmpty()) { try { - renderWorker.processTask((ChunkCompileTaskGenerator) renderDispatcher.queueChunkUpdates.poll()); + renderWorker.processTask(renderDispatcher.queueChunkUpdates.poll()); } catch (InterruptedException ignored) { } } @@ -69,7 +68,7 @@ public class ChunkLoadingRenderGlobal { renderDispatcher.updateChunkNow(renderchunk); - renderchunk.setNeedsUpdate(false); + renderchunk.clearNeedsUpdate(); iterator.remove(); } } diff --git a/src/main/java/com/replaymod/render/mixin/MixinEffectRenderer.java b/src/main/java/com/replaymod/render/mixin/MixinEffectRenderer.java deleted file mode 100644 index eb9deb08..00000000 --- a/src/main/java/com/replaymod/render/mixin/MixinEffectRenderer.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.replaymod.render.mixin; - -import com.replaymod.render.hooks.EntityRendererHandler; -import net.minecraft.client.Minecraft; -import net.minecraft.client.particle.EffectRenderer; -import net.minecraft.client.particle.EntityFX; -import net.minecraft.client.renderer.WorldRenderer; -import net.minecraft.entity.Entity; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Redirect; - -@Mixin(EffectRenderer.class) -public abstract class MixinEffectRenderer { - @Redirect(method = "renderParticles", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/particle/EntityFX;func_180434_a(Lnet/minecraft/client/renderer/WorldRenderer;Lnet/minecraft/entity/Entity;FFFFFF)V")) - private void renderNormalParticle(EntityFX fx, WorldRenderer worldRenderer, Entity view, float partialTicks, - float rotX, float rotXZ, float rotZ, float rotYZ, float rotXY) { - renderParticle(fx, worldRenderer, view, partialTicks, rotX, rotXZ, rotZ, rotYZ, rotXY); - } - - @Redirect(method = "renderLitParticles", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/particle/EntityFX;func_180434_a(Lnet/minecraft/client/renderer/WorldRenderer;Lnet/minecraft/entity/Entity;FFFFFF)V")) - private void renderLitParticle(EntityFX fx, WorldRenderer worldRenderer, Entity view, float partialTicks, - float rotX, float rotXZ, float rotZ, float rotYZ, float rotXY) { - renderParticle(fx, worldRenderer, view, partialTicks, rotX, rotXZ, rotZ, rotYZ, rotXY); - } - - private void renderParticle(EntityFX fx, WorldRenderer worldRenderer, Entity view, float partialTicks, - float rotX, float rotXZ, float rotZ, float rotYZ, float rotXY) { - EntityRendererHandler handler = ((EntityRendererHandler.IEntityRenderer) Minecraft.getMinecraft().entityRenderer).replayModRender_getHandler(); - if (handler != null && handler.omnidirectional) { - // Align all particles towards the camera - double dx = fx.prevPosX + (fx.posX - fx.prevPosX) * partialTicks - view.posX; - double dy = fx.prevPosY + (fx.posY - fx.prevPosY) * partialTicks - view.posY; - double dz = fx.prevPosZ + (fx.posZ - fx.prevPosZ) * partialTicks - view.posZ; - double pitch = -Math.atan2(dy, Math.sqrt(dx * dx + dz * dz)); - double yaw = -Math.atan2(dx, dz); - - rotX = (float) Math.cos(yaw); - rotZ = (float) Math.sin(yaw); - rotXZ = (float) Math.cos(pitch); - - rotYZ = (float) (-rotZ * Math.sin(pitch)); - rotXY = (float) (rotX * Math.sin(pitch)); - } - fx.func_180434_a(worldRenderer, view, partialTicks, rotX, rotXZ, rotZ, rotYZ, rotXY); - } -} diff --git a/src/main/java/com/replaymod/render/mixin/MixinEntityRenderer.java b/src/main/java/com/replaymod/render/mixin/MixinEntityRenderer.java index dace69cb..5ca6dd0f 100644 --- a/src/main/java/com/replaymod/render/mixin/MixinEntityRenderer.java +++ b/src/main/java/com/replaymod/render/mixin/MixinEntityRenderer.java @@ -13,7 +13,7 @@ import net.minecraft.client.renderer.culling.Frustum; import net.minecraft.client.settings.GameSettings; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.math.RayTraceResult; import org.lwjgl.opengl.GL11; import org.lwjgl.util.ReadableColor; import org.lwjgl.util.glu.Project; @@ -127,10 +127,10 @@ public abstract class MixinEntityRenderer implements EntityRendererHandler.IEnti @Shadow public abstract void renderHand(float partialTicks, int renderPass); - @Redirect(method = "renderWorldPass", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/RenderGlobal;drawSelectionBox(Lnet/minecraft/entity/player/EntityPlayer;Lnet/minecraft/util/MovingObjectPosition;IF)V")) - private void replayModRender_drawSelectionBox(RenderGlobal instance, EntityPlayer player, MovingObjectPosition mop, int alwaysZero, float partialTicks) { + @Redirect(method = "renderWorldPass", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/RenderGlobal;drawSelectionBox(Lnet/minecraft/entity/player/EntityPlayer;Lnet/minecraft/util/math/RayTraceResult;IF)V")) + private void replayModRender_drawSelectionBox(RenderGlobal instance, EntityPlayer player, RayTraceResult rtr, int alwaysZero, float partialTicks) { if (replayModRender_handler == null) { - instance.drawSelectionBox(player, mop, alwaysZero, partialTicks); + instance.drawSelectionBox(player, rtr, alwaysZero, partialTicks); } } diff --git a/src/main/java/com/replaymod/render/mixin/MixinParticleManager.java b/src/main/java/com/replaymod/render/mixin/MixinParticleManager.java new file mode 100644 index 00000000..867cf624 --- /dev/null +++ b/src/main/java/com/replaymod/render/mixin/MixinParticleManager.java @@ -0,0 +1,47 @@ +package com.replaymod.render.mixin; + +import com.replaymod.render.hooks.EntityRendererHandler; +import net.minecraft.client.Minecraft; +import net.minecraft.client.particle.Particle; +import net.minecraft.client.particle.ParticleManager; +import net.minecraft.client.renderer.VertexBuffer; +import net.minecraft.entity.Entity; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +@Mixin(ParticleManager.class) +public abstract class MixinParticleManager { + @Redirect(method = "renderParticles", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/particle/Particle;renderParticle(Lnet/minecraft/client/renderer/VertexBuffer;Lnet/minecraft/entity/Entity;FFFFFF)V")) + private void renderNormalParticle(Particle particle, VertexBuffer vertexBuffer, Entity view, float partialTicks, + float rotX, float rotXZ, float rotZ, float rotYZ, float rotXY) { + renderParticle(particle, vertexBuffer, view, partialTicks, rotX, rotXZ, rotZ, rotYZ, rotXY); + } + + @Redirect(method = "renderLitParticles", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/particle/Particle;renderParticle(Lnet/minecraft/client/renderer/VertexBuffer;Lnet/minecraft/entity/Entity;FFFFFF)V")) + private void renderLitParticle(Particle particle, VertexBuffer vertexBuffer, Entity view, float partialTicks, + float rotX, float rotXZ, float rotZ, float rotYZ, float rotXY) { + renderParticle(particle, vertexBuffer, view, partialTicks, rotX, rotXZ, rotZ, rotYZ, rotXY); + } + + private void renderParticle(Particle particle, VertexBuffer vertexBuffer, Entity view, float partialTicks, + float rotX, float rotXZ, float rotZ, float rotYZ, float rotXY) { + EntityRendererHandler handler = ((EntityRendererHandler.IEntityRenderer) Minecraft.getMinecraft().entityRenderer).replayModRender_getHandler(); + if (handler != null && handler.omnidirectional) { + // Align all particles towards the camera + double dx = particle.prevPosX + (particle.posX - particle.prevPosX) * partialTicks - view.posX; + double dy = particle.prevPosY + (particle.posY - particle.prevPosY) * partialTicks - view.posY; + double dz = particle.prevPosZ + (particle.posZ - particle.prevPosZ) * partialTicks - view.posZ; + double pitch = -Math.atan2(dy, Math.sqrt(dx * dx + dz * dz)); + double yaw = -Math.atan2(dx, dz); + + rotX = (float) Math.cos(yaw); + rotZ = (float) Math.sin(yaw); + rotXZ = (float) Math.cos(pitch); + + rotYZ = (float) (-rotZ * Math.sin(pitch)); + rotXY = (float) (rotX * Math.sin(pitch)); + } + particle.renderParticle(vertexBuffer, view, partialTicks, rotX, rotXZ, rotZ, rotYZ, rotXY); + } +} diff --git a/src/main/java/com/replaymod/render/mixin/MixinRenderGlobal.java b/src/main/java/com/replaymod/render/mixin/MixinRenderGlobal.java index 34ee45e0..7319adb7 100644 --- a/src/main/java/com/replaymod/render/mixin/MixinRenderGlobal.java +++ b/src/main/java/com/replaymod/render/mixin/MixinRenderGlobal.java @@ -3,16 +3,13 @@ package com.replaymod.render.mixin; import com.replaymod.render.hooks.ChunkLoadingRenderGlobal; import net.minecraft.client.renderer.RenderGlobal; import net.minecraft.client.renderer.chunk.ChunkRenderDispatcher; -import net.minecraft.client.renderer.chunk.RenderChunk; import net.minecraft.client.renderer.culling.ICamera; import net.minecraft.entity.Entity; -import net.minecraft.util.BlockPos; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(RenderGlobal.class) public abstract class MixinRenderGlobal { @@ -37,6 +34,8 @@ public abstract class MixinRenderGlobal { do { setupTerrain(viewEntity, partialTicks, camera, replayModRender_hook.nextFrameId(), playerSpectator); + + replayModRender_hook.updateChunks(); } while (displayListEntitiesDirty); replayModRender_passThroughSetupTerrain = false; @@ -44,13 +43,6 @@ public abstract class MixinRenderGlobal { } } - @Inject(method = "isPositionInRenderChunk", at = @At("HEAD"), cancellable = true) - public void replayModRender_isPositionInRenderChunk(BlockPos pos, RenderChunk chunk, CallbackInfoReturnable ci) { - if (replayModRender_hook != null) { - ci.setReturnValue(true); - } - } - @Inject(method = "updateChunks", at = @At("HEAD"), cancellable = true) public void replayModRender_updateChunks(long finishTimeNano, CallbackInfo ci) { if (replayModRender_hook != null) { diff --git a/src/main/java/com/replaymod/render/mixin/MixinRendererLivingEntity.java b/src/main/java/com/replaymod/render/mixin/MixinRenderLiving.java similarity index 70% rename from src/main/java/com/replaymod/render/mixin/MixinRendererLivingEntity.java rename to src/main/java/com/replaymod/render/mixin/MixinRenderLiving.java index 38cbe2ae..d8a0917d 100644 --- a/src/main/java/com/replaymod/render/mixin/MixinRendererLivingEntity.java +++ b/src/main/java/com/replaymod/render/mixin/MixinRenderLiving.java @@ -2,17 +2,17 @@ package com.replaymod.render.mixin; import com.replaymod.render.hooks.EntityRendererHandler; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.entity.RendererLivingEntity; -import net.minecraft.entity.EntityLivingBase; +import net.minecraft.client.renderer.entity.RenderLiving; +import net.minecraft.entity.EntityLiving; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -@Mixin(RendererLivingEntity.class) -public abstract class MixinRendererLivingEntity { +@Mixin(RenderLiving.class) +public abstract class MixinRenderLiving { @Inject(method = "canRenderName", at = @At("HEAD"), cancellable = true) - private void replayModRender_areAllNamesHidden(EntityLivingBase entity, CallbackInfoReturnable ci) { + private void replayModRender_areAllNamesHidden(EntityLiving entity, CallbackInfoReturnable ci) { EntityRendererHandler handler = ((EntityRendererHandler.IEntityRenderer) Minecraft.getMinecraft().entityRenderer).replayModRender_getHandler(); if (handler != null && !handler.getSettings().isRenderNameTags()) { ci.setReturnValue(false); //this calls the cancel method diff --git a/src/main/java/com/replaymod/render/mixin/MixinRenderManager.java b/src/main/java/com/replaymod/render/mixin/MixinRenderManager.java index f12637f5..beb90680 100644 --- a/src/main/java/com/replaymod/render/mixin/MixinRenderManager.java +++ b/src/main/java/com/replaymod/render/mixin/MixinRenderManager.java @@ -8,7 +8,7 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(RenderManager.class) public abstract class MixinRenderManager { @@ -19,7 +19,7 @@ public abstract class MixinRenderManager { private float playerViewY; @Inject(method = "doRenderEntity", at = @At("HEAD")) - private void replayModRender_reorientForCubicRendering(Entity entity, double dx, double dy, double dz, float iDoNotKnow, float partialTicks, boolean iDoNotCare, CallbackInfoReturnable ci) { + private void replayModRender_reorientForCubicRendering(Entity entity, double dx, double dy, double dz, float iDoNotKnow, float partialTicks, boolean iDoNotCare, CallbackInfo ci) { EntityRendererHandler handler = ((EntityRendererHandler.IEntityRenderer) Minecraft.getMinecraft().entityRenderer).replayModRender_getHandler(); if (handler != null && handler.omnidirectional) { double pitch = -Math.atan2(dy, Math.sqrt(dx * dx + dz * dz)); diff --git a/src/main/java/com/replaymod/render/rendering/VideoRenderer.java b/src/main/java/com/replaymod/render/rendering/VideoRenderer.java index 05a5a3d2..0cccb448 100644 --- a/src/main/java/com/replaymod/render/rendering/VideoRenderer.java +++ b/src/main/java/com/replaymod/render/rendering/VideoRenderer.java @@ -1,6 +1,5 @@ package com.replaymod.render.rendering; -import com.replaymod.core.ReplayMod; import com.replaymod.pathing.player.AbstractTimelinePlayer; import com.replaymod.pathing.properties.TimestampProperty; import com.replaymod.render.RenderSettings; @@ -12,14 +11,15 @@ import com.replaymod.render.gui.GuiRenderingDone; import com.replaymod.render.gui.GuiVideoRenderer; import com.replaymod.render.hooks.ChunkLoadingRenderGlobal; import com.replaymod.render.metadata.MetadataInjector; +import com.replaymod.render.utils.SoundHandler; import com.replaymod.replay.ReplayHandler; import com.replaymod.replaystudio.pathing.path.Keyframe; import com.replaymod.replaystudio.pathing.path.Path; import com.replaymod.replaystudio.pathing.path.Timeline; import net.minecraft.client.Minecraft; -import net.minecraft.client.audio.SoundCategory; import net.minecraft.client.gui.ScaledResolution; import net.minecraft.client.renderer.OpenGlHelper; +import net.minecraft.util.SoundCategory; import net.minecraft.util.Timer; import org.lwjgl.input.Mouse; import org.lwjgl.opengl.Display; @@ -50,7 +50,7 @@ public class VideoRenderer implements RenderInfo { private int fps; private boolean mouseWasGrabbed; private boolean debugInfoWasShown; - private Map originalSoundLevels; + private Map originalSoundLevels; private Future timelinePlayerFuture; private ChunkLoadingRenderGlobal chunkLoadingRenderGlobal; @@ -171,9 +171,9 @@ public class VideoRenderer implements RenderInfo { for (SoundCategory category : SoundCategory.values()) { mutedSounds.put(category, 0f); } - originalSoundLevels = mc.gameSettings.mapSoundLevels; - mutedSounds.put(SoundCategory.MASTER, (Float) originalSoundLevels.get(SoundCategory.MASTER)); - mc.gameSettings.mapSoundLevels = mutedSounds; + originalSoundLevels = mc.gameSettings.soundLevels; + mutedSounds.put(SoundCategory.MASTER, originalSoundLevels.get(SoundCategory.MASTER)); + mc.gameSettings.soundLevels = mutedSounds; fps = settings.getFramesPerSecond(); @@ -192,7 +192,7 @@ public class VideoRenderer implements RenderInfo { totalFrames = (int) (duration*fps/1000); - ScaledResolution scaled = new ScaledResolution(mc, mc.displayWidth, mc.displayHeight); + ScaledResolution scaled = new ScaledResolution(mc); gui.toMinecraft().setWorldAndResolution(mc, scaled.getScaledWidth(), scaled.getScaledHeight()); chunkLoadingRenderGlobal = new ChunkLoadingRenderGlobal(mc.renderGlobal); @@ -210,13 +210,13 @@ public class VideoRenderer implements RenderInfo { if (mouseWasGrabbed) { mc.mouseHelper.grabMouseCursor(); } - mc.gameSettings.mapSoundLevels = originalSoundLevels; + mc.gameSettings.soundLevels = originalSoundLevels; mc.displayGuiScreen(null); if (chunkLoadingRenderGlobal != null) { chunkLoadingRenderGlobal.uninstall(); } - ReplayMod.soundHandler.playRenderSuccessSound(); + new SoundHandler().playRenderSuccessSound(); new GuiRenderingDone(ReplayModRender.instance, videoWriter.getVideoFile(), totalFrames, settings).display(); } @@ -252,7 +252,7 @@ public class VideoRenderer implements RenderInfo { throw new RuntimeException(e); } - ScaledResolution scaled = new ScaledResolution(mc, mc.displayWidth, mc.displayHeight); + ScaledResolution scaled = new ScaledResolution(mc); int mouseX = Mouse.getX() * scaled.getScaledWidth() / mc.displayWidth; int mouseY = scaled.getScaledHeight() - Mouse.getY() * scaled.getScaledHeight() / mc.displayHeight - 1; gui.toMinecraft().drawScreen(mouseX, mouseY, 0); diff --git a/src/main/java/com/replaymod/render/utils/JailingQueue.java b/src/main/java/com/replaymod/render/utils/JailingQueue.java index ccf702c8..0a7f6ab2 100644 --- a/src/main/java/com/replaymod/render/utils/JailingQueue.java +++ b/src/main/java/com/replaymod/render/utils/JailingQueue.java @@ -2,15 +2,18 @@ package com.replaymod.render.utils; import com.google.common.base.Preconditions; -import java.util.*; -import java.util.concurrent.BlockingQueue; +import java.util.Collection; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Set; +import java.util.concurrent.PriorityBlockingQueue; import java.util.concurrent.TimeUnit; -public class JailingQueue extends AbstractQueue implements BlockingQueue { - private final BlockingQueue delegate; +public class JailingQueue extends PriorityBlockingQueue { + private final PriorityBlockingQueue delegate; private final Set jailed = new HashSet(); - public JailingQueue(BlockingQueue delegate) { + public JailingQueue(PriorityBlockingQueue delegate) { this.delegate = delegate; } @@ -59,13 +62,13 @@ public class JailingQueue extends AbstractQueue implements BlockingQueue queue = mc.scheduledTasks; - queue.add(ListenableFutureTask.create(runnable, null)); + mc.scheduledTasks.add(ListenableFutureTask.create(runnable, null)); } return future; } diff --git a/src/main/java/com/replaymod/replay/ReplayHandler.java b/src/main/java/com/replaymod/replay/ReplayHandler.java index b01fdc66..ec2290e6 100755 --- a/src/main/java/com/replaymod/replay/ReplayHandler.java +++ b/src/main/java/com/replaymod/replay/ReplayHandler.java @@ -29,7 +29,10 @@ import net.minecraftforge.fml.common.network.handshake.NetworkDispatcher; import org.lwjgl.opengl.Display; import java.io.IOException; -import java.util.*; +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; +import java.util.UUID; import static net.minecraft.client.renderer.GlStateManager.*; import static org.lwjgl.opengl.GL11.GL_COLOR_BUFFER_BIT; @@ -311,7 +314,7 @@ public class ReplayHandler { mc.getFramebuffer().bindFramebuffer(true); mc.entityRenderer.setupOverlayRendering(); - ScaledResolution resolution = new ScaledResolution(mc, mc.displayWidth, mc.displayHeight); + ScaledResolution resolution = new ScaledResolution(mc); guiScreen.setWorldAndResolution(mc, resolution.getScaledWidth(), resolution.getScaledHeight()); guiScreen.drawScreen(0, 0, 0); @@ -328,10 +331,8 @@ public class ReplayHandler { replaySender.setAsyncMode(true); replaySender.setReplaySpeed(0); - mc.getNetHandler().getNetworkManager().processReceivedPackets(); - @SuppressWarnings("unchecked") - List entities = (List) mc.theWorld.loadedEntityList; - for (Entity entity : entities) { + mc.getConnection().getNetworkManager().processReceivedPackets(); + for (Entity entity : mc.theWorld.loadedEntityList) { if (entity instanceof EntityOtherPlayerMP) { EntityOtherPlayerMP e = (EntityOtherPlayerMP) entity; e.setPosition(e.otherPlayerMPX, e.otherPlayerMPY, e.otherPlayerMPZ); diff --git a/src/main/java/com/replaymod/replay/ReplaySender.java b/src/main/java/com/replaymod/replay/ReplaySender.java index 6be29efc..cccc2877 100755 --- a/src/main/java/com/replaymod/replay/ReplaySender.java +++ b/src/main/java/com/replaymod/replay/ReplaySender.java @@ -12,17 +12,22 @@ import io.netty.channel.ChannelHandler.Sharable; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelInboundHandlerAdapter; import net.minecraft.client.Minecraft; +import net.minecraft.client.entity.EntityOtherPlayerMP; import net.minecraft.client.gui.GuiDownloadTerrain; import net.minecraft.client.gui.GuiErrorScreen; import net.minecraft.client.resources.I18n; import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.network.*; import net.minecraft.network.play.server.*; -import net.minecraft.util.IChatComponent; +import net.minecraft.util.text.ITextComponent; import net.minecraft.world.EnumDifficulty; import net.minecraft.world.World; import net.minecraft.world.WorldSettings.GameType; import net.minecraft.world.WorldType; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import net.minecraftforge.fml.common.gameevent.TickEvent; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; @@ -39,30 +44,22 @@ import java.util.concurrent.Callable; */ @Sharable public class ReplaySender extends ChannelInboundHandlerAdapter { - - /** - * Previously packets for the client player were inserted using one fixed entity id (this one). - * This is no longer the case however to provide backwards compatibility, we have to convert - * these old packets to use the normal entity id. - * Need to punch someone? -> CrushedPixel - */ - public static final int LEGACY_ENTITY_ID = Integer.MIN_VALUE + 9001; - /** * These packets are ignored completely during replay. */ private static final List BAD_PACKETS = Arrays.asList( - S06PacketUpdateHealth.class, - S2DPacketOpenWindow.class, - S2EPacketCloseWindow.class, - S2FPacketSetSlot.class, - S30PacketWindowItems.class, - S36PacketSignEditorOpen.class, - S37PacketStatistics.class, - S1FPacketSetExperience.class, - S43PacketCamera.class, - S39PacketPlayerAbilities.class, - S45PacketTitle.class); + // TODO Update possibly more? + SPacketUpdateHealth.class, + SPacketOpenWindow.class, + SPacketCloseWindow.class, + SPacketSetSlot.class, + SPacketWindowItems.class, + SPacketSignEditorOpen.class, + SPacketStatistics.class, + SPacketSetExperience.class, + SPacketCamera.class, + SPacketPlayerAbilities.class, + SPacketTitle.class); private static int TP_DISTANCE_LIMIT = 128; @@ -171,6 +168,8 @@ public class ReplaySender extends ChannelInboundHandlerAdapter { this.asyncMode = asyncMode; this.replayLength = file.getMetaData().getDuration(); + MinecraftForge.EVENT_BUS.register(this); + if (asyncMode) { new Thread(asyncSender, "replaymod-async-sender").start(); } @@ -239,6 +238,7 @@ public class ReplaySender extends ChannelInboundHandlerAdapter { */ public void terminateReplay() { terminate = true; + MinecraftForge.EVENT_BUS.unregister(this); try { channelInactive(ctx); ctx.channel().pipeline().close(); @@ -247,6 +247,25 @@ public class ReplaySender extends ChannelInboundHandlerAdapter { } } + @SubscribeEvent + public void onWorldTick(TickEvent.ClientTickEvent event) { + // Unfortunately the WorldTickEvent doesn't seem to be emitted on the CLIENT side + if (event.phase != TickEvent.Phase.START) return; + + // Spawning a player into an empty chunk (which we might do with the recording player) + // prevents it from being moved by teleport packets (it essentially gets stuck) because + // Entity#addedToChunk is not set and it is therefore not updated every tick. + // To counteract this, we need to manually update it's position if it hasn't been added + // to any chunk yet. + if (mc.theWorld != null) { + for (EntityPlayer playerEntity : mc.theWorld.playerEntities) { + if (!playerEntity.addedToChunk && playerEntity instanceof EntityOtherPlayerMP) { + playerEntity.onLivingUpdate(); + } + } + } + } + @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { @@ -274,21 +293,21 @@ public class ReplaySender extends ChannelInboundHandlerAdapter { // Therefore we have to remove all loaded, dead entities manually if we are in sync mode. // We do this after every SpawnX packet and after the destroy entities packet. if (!asyncMode && mc.theWorld != null) { - if (p instanceof S0CPacketSpawnPlayer - || p instanceof S0EPacketSpawnObject - || p instanceof S0FPacketSpawnMob - || p instanceof S2CPacketSpawnGlobalEntity - || p instanceof S10PacketSpawnPainting - || p instanceof S11PacketSpawnExperienceOrb - || p instanceof S13PacketDestroyEntities) { + if (p instanceof SPacketSpawnPlayer + || p instanceof SPacketSpawnObject + || p instanceof SPacketSpawnMob + || p instanceof SPacketSpawnGlobalEntity + || p instanceof SPacketSpawnPainting + || p instanceof SPacketSpawnExperienceOrb + || p instanceof SPacketDestroyEntities) { World world = mc.theWorld; for (int i = 0; i < world.loadedEntityList.size(); ++i) { - Entity entity = (Entity) world.loadedEntityList.get(i); + Entity entity = world.loadedEntityList.get(i); if (entity.isDead) { int chunkX = entity.chunkCoordX; int chunkY = entity.chunkCoordZ; - if (entity.addedToChunk && world.getChunkProvider().chunkExists(chunkX, chunkY)) { + if (entity.addedToChunk && world.getChunkProvider().getLoadedChunk(chunkX, chunkY) != null) { world.getChunkFromChunkCoords(chunkX, chunkY).removeEntity(entity); } @@ -326,8 +345,8 @@ public class ReplaySender extends ChannelInboundHandlerAdapter { * @return The processed packet or {@code null} if no packet shall be sent */ protected Packet processPacket(Packet p) throws Exception { - if (p instanceof S3FPacketCustomPayload) { - S3FPacketCustomPayload packet = (S3FPacketCustomPayload) p; + if (p instanceof SPacketCustomPayload) { + SPacketCustomPayload packet = (SPacketCustomPayload) p; if (Restrictions.PLUGIN_CHANNEL.equals(packet.getChannelName())) { final String unknown = replayHandler.getRestrictions().handle(packet); if (unknown == null) { @@ -353,8 +372,8 @@ public class ReplaySender extends ChannelInboundHandlerAdapter { } } } - if (p instanceof S40PacketDisconnect) { - IChatComponent reason = ((S40PacketDisconnect) p).func_149165_c(); + if (p instanceof SPacketDisconnect) { + ITextComponent reason = ((SPacketDisconnect) p).getReason(); if ("Please update to view this replay.".equals(reason.getUnformattedText())) { // This version of the mod supports replay restrictions so we are allowed // to remove this packet. @@ -364,11 +383,9 @@ public class ReplaySender extends ChannelInboundHandlerAdapter { if(BAD_PACKETS.contains(p.getClass())) return null; - convertLegacyEntityIds(p); - - if(p instanceof S48PacketResourcePackSend) { - S48PacketResourcePackSend packet = (S48PacketResourcePackSend) p; - String url = packet.func_179783_a(); + if(p instanceof SPacketResourcePackSend) { + SPacketResourcePackSend packet = (SPacketResourcePackSend) p; + String url = packet.getURL(); if (url.startsWith("replay://")) { int id = Integer.parseInt(url.substring("replay://".length())); Map index = replayFile.getResourcePackIndex(); @@ -379,17 +396,17 @@ public class ReplaySender extends ChannelInboundHandlerAdapter { if (!file.exists()) { IOUtils.copy(replayFile.getResourcePack(hash).get(), new FileOutputStream(file)); } - mc.getResourcePackRepository().func_177319_a(file); + mc.getResourcePackRepository().setResourcePackInstance(file); } } return null; } } - if(p instanceof S01PacketJoinGame) { - S01PacketJoinGame packet = (S01PacketJoinGame) p; + if(p instanceof SPacketJoinGame) { + SPacketJoinGame packet = (SPacketJoinGame) p; allowMovement = true; - int entId = packet.getEntityId(); + int entId = packet.getPlayerId(); actualID = entId; entId = -1789435; // Camera entity id should be negative which is an invalid id and can't be used by servers int dimension = packet.getDimension(); @@ -397,21 +414,21 @@ public class ReplaySender extends ChannelInboundHandlerAdapter { int maxPlayers = packet.getMaxPlayers(); WorldType worldType = packet.getWorldType(); - p = new S01PacketJoinGame(entId, GameType.SPECTATOR, false, dimension, + p = new SPacketJoinGame(entId, GameType.SPECTATOR, false, dimension, difficulty, maxPlayers, worldType, false); } - if(p instanceof S07PacketRespawn) { - S07PacketRespawn respawn = (S07PacketRespawn) p; - p = new S07PacketRespawn(respawn.func_149082_c(), - respawn.func_149081_d(), respawn.func_149080_f(), GameType.SPECTATOR); + if(p instanceof SPacketRespawn) { + SPacketRespawn respawn = (SPacketRespawn) p; + p = new SPacketRespawn(respawn.getDimensionID(), + respawn.getDifficulty(), respawn.getWorldType(), GameType.SPECTATOR); allowMovement = true; } - if(p instanceof S08PacketPlayerPosLook) { + if(p instanceof SPacketPlayerPosLook) { if(!hasWorldLoaded) hasWorldLoaded = true; - final S08PacketPlayerPosLook ppl = (S08PacketPlayerPosLook) p; + final SPacketPlayerPosLook ppl = (SPacketPlayerPosLook) p; if (mc.currentScreen instanceof GuiDownloadTerrain) { // Close the world loading screen manually in case we swallow the packet @@ -422,17 +439,17 @@ public class ReplaySender extends ChannelInboundHandlerAdapter { CameraEntity cent = replayHandler.getCameraEntity(); - for (Object relative : ppl.func_179834_f()) { - if (relative == S08PacketPlayerPosLook.EnumFlags.X - || relative == S08PacketPlayerPosLook.EnumFlags.Y - || relative == S08PacketPlayerPosLook.EnumFlags.Z) { + for (SPacketPlayerPosLook.EnumFlags relative : ppl.getFlags()) { + if (relative == SPacketPlayerPosLook.EnumFlags.X + || relative == SPacketPlayerPosLook.EnumFlags.Y + || relative == SPacketPlayerPosLook.EnumFlags.Z) { return null; // At least one of the coordinates is relative, so we don't care } } if(cent != null) { - if(!allowMovement && !((Math.abs(cent.posX - ppl.func_148932_c()) > TP_DISTANCE_LIMIT) || - (Math.abs(cent.posZ - ppl.func_148933_e()) > TP_DISTANCE_LIMIT))) { + if(!allowMovement && !((Math.abs(cent.posX - ppl.getX()) > TP_DISTANCE_LIMIT) || + (Math.abs(cent.posZ - ppl.getZ()) > TP_DISTANCE_LIMIT))) { return null; } else { allowMovement = false; @@ -451,15 +468,15 @@ public class ReplaySender extends ChannelInboundHandlerAdapter { } CameraEntity cent = replayHandler.getCameraEntity(); - cent.setCameraPosition(ppl.func_148932_c(), ppl.func_148928_d(), ppl.func_148933_e()); + cent.setCameraPosition(ppl.getX(), ppl.getY(), ppl.getZ()); return null; } }.call(); } - if(p instanceof S2BPacketChangeGameState) { - S2BPacketChangeGameState pg = (S2BPacketChangeGameState)p; - int reason = pg.func_149138_c(); + if(p instanceof SPacketChangeGameState) { + SPacketChangeGameState pg = (SPacketChangeGameState)p; + int reason = pg.getGameState(); // only allow the following packets: // 1 - End raining @@ -473,7 +490,7 @@ public class ReplaySender extends ChannelInboundHandlerAdapter { } } - if (p instanceof S02PacketChat) { + if (p instanceof SPacketChat) { if (!ReplayModReplay.instance.getCore().getSettingsRegistry().get(Setting.SHOW_CHAT)) { return null; } @@ -486,7 +503,7 @@ public class ReplaySender extends ChannelInboundHandlerAdapter { @SuppressWarnings("unchecked") public void channelActive(ChannelHandlerContext ctx) throws Exception { this.ctx = ctx; - ctx.attr(NetworkManager.attrKeyConnectionState).set(EnumConnectionState.PLAY); + ctx.attr(NetworkManager.PROTOCOL_ATTRIBUTE_KEY).set(EnumConnectionState.PLAY); super.channelActive(ctx); } @@ -691,11 +708,11 @@ public class ReplaySender extends ChannelInboundHandlerAdapter { protected Packet processPacketAsync(Packet p) { //If hurrying, ignore some packets, except for short durations if(desiredTimeStamp - lastTimeStamp > 1000) { - if(p instanceof S2APacketParticles) return null; + if(p instanceof SPacketParticles) return null; - if(p instanceof S0EPacketSpawnObject) { - S0EPacketSpawnObject pso = (S0EPacketSpawnObject)p; - int type = pso.func_148993_l(); + if(p instanceof SPacketSpawnObject) { + SPacketSpawnObject pso = (SPacketSpawnObject)p; + int type = pso.getType(); if(type == 76) { // Firework rocket return null; } @@ -781,68 +798,6 @@ public class ReplaySender extends ChannelInboundHandlerAdapter { return p; // During synchronous playback everything is sent normally } - /** - * This is necessary to convert packets from old replays to new replays. - * @param packet The packet to be transformed. - * @see #LEGACY_ENTITY_ID - */ - private void convertLegacyEntityIds(Packet packet) { - if (packet instanceof S0CPacketSpawnPlayer) { - S0CPacketSpawnPlayer p = (S0CPacketSpawnPlayer) packet; - if (p.field_148957_a == LEGACY_ENTITY_ID) { - p.field_148957_a = actualID; - } - } else if (packet instanceof S18PacketEntityTeleport) { - S18PacketEntityTeleport p = (S18PacketEntityTeleport) packet; - if (p.field_149458_a == LEGACY_ENTITY_ID) { - p.field_149458_a = actualID; - } - } else if (packet instanceof S14PacketEntity.S17PacketEntityLookMove) { - S14PacketEntity.S17PacketEntityLookMove p = (S14PacketEntity.S17PacketEntityLookMove) packet; - if (p.field_149074_a == LEGACY_ENTITY_ID) { - p.field_149074_a = actualID; - } - } else if (packet instanceof S19PacketEntityHeadLook) { - S19PacketEntityHeadLook p = (S19PacketEntityHeadLook) packet; - if (p.field_149384_a == LEGACY_ENTITY_ID) { - p.field_149384_a = actualID; - } - } else if (packet instanceof S12PacketEntityVelocity) { - S12PacketEntityVelocity p = (S12PacketEntityVelocity) packet; - if (p.field_149417_a == LEGACY_ENTITY_ID) { - p.field_149417_a = actualID; - } - } else if (packet instanceof S0BPacketAnimation) { - S0BPacketAnimation p = (S0BPacketAnimation) packet; - if (p.entityId == LEGACY_ENTITY_ID) { - p.entityId = actualID; - } - } else if (packet instanceof S04PacketEntityEquipment) { - S04PacketEntityEquipment p = (S04PacketEntityEquipment) packet; - if (p.field_149394_a == LEGACY_ENTITY_ID) { - p.field_149394_a = actualID; - } - } else if (packet instanceof S1BPacketEntityAttach) { - S1BPacketEntityAttach p = (S1BPacketEntityAttach) packet; - if (p.field_149408_a == LEGACY_ENTITY_ID) { - p.field_149408_a = actualID; - } - if (p.field_149406_b == LEGACY_ENTITY_ID) { - p.field_149406_b = actualID; - } - } else if (packet instanceof S0DPacketCollectItem) { - S0DPacketCollectItem p = (S0DPacketCollectItem) packet; - if (p.field_149356_b == LEGACY_ENTITY_ID) { - p.field_149356_b = actualID; - } - } else if (packet instanceof S13PacketDestroyEntities) { - S13PacketDestroyEntities p = (S13PacketDestroyEntities) packet; - if (p.field_149100_a.length == 1 && p.field_149100_a[0] == LEGACY_ENTITY_ID) { - p.field_149100_a[0] = actualID; - } - } - } - private static final class PacketData { private final int timestamp; private final byte[] bytes; diff --git a/src/main/java/com/replaymod/replay/camera/CameraEntity.java b/src/main/java/com/replaymod/replay/camera/CameraEntity.java index 4674c4c9..6efe45ed 100755 --- a/src/main/java/com/replaymod/replay/camera/CameraEntity.java +++ b/src/main/java/com/replaymod/replay/camera/CameraEntity.java @@ -17,10 +17,12 @@ import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLiving; import net.minecraft.entity.item.EntityItemFrame; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.stats.StatFileWriter; -import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.MovingObjectPosition; +import net.minecraft.inventory.EntityEquipmentSlot; +import net.minecraft.stats.StatisticsManager; +import net.minecraft.util.EnumHand; import net.minecraft.util.ResourceLocation; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.math.RayTraceResult; import net.minecraft.world.World; import net.minecraftforge.client.event.EntityViewRenderEvent; import net.minecraftforge.client.event.RenderGameOverlayEvent; @@ -64,8 +66,8 @@ public class CameraEntity extends EntityPlayerSP { */ private final EventHandler eventHandler = new EventHandler(); - public CameraEntity(Minecraft mcIn, World worldIn, NetHandlerPlayClient netHandlerPlayClient, StatFileWriter statFileWriter) { - super(mcIn, worldIn, netHandlerPlayClient, statFileWriter); + public CameraEntity(Minecraft mcIn, World worldIn, NetHandlerPlayClient netHandlerPlayClient, StatisticsManager statisticsManager) { + super(mcIn, worldIn, netHandlerPlayClient, statisticsManager); FMLCommonHandler.instance().bus().register(eventHandler); MinecraftForge.EVENT_BUS.register(eventHandler); cameraController = ReplayModReplay.instance.createCameraController(this); @@ -256,12 +258,49 @@ public class CameraEntity extends EntityPlayerSP { } @Override - public MovingObjectPosition rayTrace(double p_174822_1_, float p_174822_3_) { - MovingObjectPosition pos = super.rayTrace(p_174822_1_, 1f); + public float getCooldownPeriod() { + Entity view = mc.getRenderViewEntity(); + if (view != this && view instanceof EntityPlayer) { + return ((EntityPlayer) view).getCooldownPeriod(); + } + return 1; + } + + @Override + public float getCooledAttackStrength(float adjustTicks) { + Entity view = mc.getRenderViewEntity(); + if (view != this && view instanceof EntityPlayer) { + return ((EntityPlayer) view).getCooledAttackStrength(adjustTicks); + } + // Default to 1 as to not render the cooldown indicator (renders for < 1) + return 1; + } + + @Override + public EnumHand getActiveHand() { + Entity view = mc.getRenderViewEntity(); + if (view != this && view instanceof EntityPlayer) { + return ((EntityPlayer) view).getActiveHand(); + } + return super.getActiveHand(); + } + + @Override + public boolean isHandActive() { + Entity view = mc.getRenderViewEntity(); + if (view != this && view instanceof EntityPlayer) { + return ((EntityPlayer) view).isHandActive(); + } + return super.isHandActive(); + } + + @Override + public RayTraceResult rayTrace(double p_174822_1_, float p_174822_3_) { + RayTraceResult pos = super.rayTrace(p_174822_1_, 1f); // Make sure we can never look at blocks (-> no outline) - if(pos != null && pos.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) { - pos.typeOfHit = MovingObjectPosition.MovingObjectType.MISS; + if(pos != null && pos.typeOfHit == RayTraceResult.Type.BLOCK) { + pos.typeOfHit = RayTraceResult.Type.MISS; } return pos; @@ -328,9 +367,13 @@ public class CameraEntity extends EntityPlayerSP { @SubscribeEvent public void preCrosshairRender(RenderGameOverlayEvent.Pre event) { // The crosshair should only render if targeted entity can actually be spectated - if (event.type == RenderGameOverlayEvent.ElementType.CROSSHAIRS) { + if (event.getType() == RenderGameOverlayEvent.ElementType.CROSSHAIRS) { event.setCanceled(!canSpectate(mc.pointedEntity)); } + // Hotbar should never be rendered + if (event.getType() == RenderGameOverlayEvent.ElementType.HOTBAR) { + event.setCanceled(true); + } } @SubscribeEvent @@ -357,10 +400,13 @@ public class CameraEntity extends EntityPlayerSP { if (lastHandRendered != player) { lastHandRendered = player; - mc.entityRenderer.itemRenderer.prevEquippedProgress = 1; - mc.entityRenderer.itemRenderer.equippedProgress = 1; - mc.entityRenderer.itemRenderer.itemToRender = player.inventory.getCurrentItem(); - mc.entityRenderer.itemRenderer.equippedItemSlot = player.inventory.currentItem; + 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); + mc.thePlayer.renderArmYaw = mc.thePlayer.prevRenderArmYaw = player.rotationYaw; mc.thePlayer.renderArmPitch = mc.thePlayer.prevRenderArmPitch = player.rotationPitch; @@ -371,7 +417,7 @@ public class CameraEntity extends EntityPlayerSP { @SubscribeEvent public void onEntityViewRenderEvent(EntityViewRenderEvent.CameraSetup event) { if (mc.getRenderViewEntity() == CameraEntity.this) { - event.roll = roll; + event.setRoll(roll); } } } diff --git a/src/main/java/com/replaymod/replay/camera/ClassicCameraController.java b/src/main/java/com/replaymod/replay/camera/ClassicCameraController.java index 797776ee..57bfa770 100644 --- a/src/main/java/com/replaymod/replay/camera/ClassicCameraController.java +++ b/src/main/java/com/replaymod/replay/camera/ClassicCameraController.java @@ -2,8 +2,8 @@ package com.replaymod.replay.camera; import net.minecraft.client.Minecraft; import net.minecraft.client.settings.KeyBinding; -import net.minecraft.util.MathHelper; -import net.minecraft.util.Vec3; +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.Vec3d; import org.lwjgl.Sys; // TODO: Marius is responsible for this. Please, someone clean it up. @@ -18,8 +18,8 @@ public class ClassicCameraController implements CameraController { private double THRESHOLD = MAX_SPEED / 20; private double DECAY = MAX_SPEED/3; - private Vec3 direction; - private Vec3 dirBefore; + private Vec3d direction; + private Vec3d dirBefore; private double motion; private long lastCall = Sys.getTime(); @@ -129,7 +129,7 @@ public class ClassicCameraController implements CameraController { return; } - Vec3 movement = direction.normalize(); + Vec3d movement = direction.normalize(); double factor = motion * (frac / 1000D); camera.moveCamera(movement.xCoord * factor, movement.yCoord * factor, movement.zCoord * factor); @@ -158,7 +158,7 @@ public class ClassicCameraController implements CameraController { break; } - Vec3 dbf = direction; + Vec3d dbf = direction; if(dirBefore != null) { direction = dirBefore.normalize().add(direction); @@ -169,12 +169,12 @@ public class ClassicCameraController implements CameraController { updateMovement(); } - private Vec3 getVectorForRotation(float pitch, float yaw) { + private Vec3d getVectorForRotation(float pitch, float yaw) { float f2 = MathHelper.cos(-yaw * 0.017453292F - (float) Math.PI); float f3 = MathHelper.sin(-yaw * 0.017453292F - (float)Math.PI); float f4 = -MathHelper.cos(-pitch * 0.017453292F); float f5 = MathHelper.sin(-pitch * 0.017453292F); - return new Vec3((double)(f3 * f4), (double)f5, (double)(f2 * f4)); + return new Vec3d((double)(f3 * f4), (double)f5, (double)(f2 * f4)); } public enum MoveDirection { diff --git a/src/main/java/com/replaymod/replay/camera/SpectatorCameraController.java b/src/main/java/com/replaymod/replay/camera/SpectatorCameraController.java index 3bab138f..85c8a833 100644 --- a/src/main/java/com/replaymod/replay/camera/SpectatorCameraController.java +++ b/src/main/java/com/replaymod/replay/camera/SpectatorCameraController.java @@ -41,8 +41,9 @@ public class SpectatorCameraController implements CameraController { if (view instanceof EntityPlayer) { EntityPlayer viewPlayer = (EntityPlayer) view; camera.inventory = viewPlayer.inventory; - camera.itemInUse = viewPlayer.itemInUse; - camera.itemInUseCount = viewPlayer.itemInUseCount; + camera.itemStackMainHand = viewPlayer.itemStackMainHand; + camera.swingingHand = viewPlayer.swingingHand; + camera.activeItemStackUseCount = viewPlayer.activeItemStackUseCount; } } } diff --git a/src/main/java/com/replaymod/replay/gui/overlay/GuiMarkerTimeline.java b/src/main/java/com/replaymod/replay/gui/overlay/GuiMarkerTimeline.java index 2ad67f89..229237f0 100644 --- a/src/main/java/com/replaymod/replay/gui/overlay/GuiMarkerTimeline.java +++ b/src/main/java/com/replaymod/replay/gui/overlay/GuiMarkerTimeline.java @@ -2,14 +2,14 @@ package com.replaymod.replay.gui.overlay; import com.replaymod.core.ReplayMod; import com.replaymod.replay.ReplayHandler; +import com.replaymod.replaystudio.data.Marker; import com.replaymod.replaystudio.util.Location; import de.johni0702.minecraft.gui.GuiRenderer; import de.johni0702.minecraft.gui.RenderInfo; import de.johni0702.minecraft.gui.element.advanced.AbstractGuiTimeline; import de.johni0702.minecraft.gui.function.Draggable; -import com.replaymod.replaystudio.data.Marker; import net.minecraft.client.resources.I18n; -import net.minecraft.util.MathHelper; +import net.minecraft.util.math.MathHelper; import org.lwjgl.util.Point; import org.lwjgl.util.ReadableDimension; import org.lwjgl.util.ReadablePoint; diff --git a/src/main/java/com/replaymod/replay/handler/GuiHandler.java b/src/main/java/com/replaymod/replay/handler/GuiHandler.java index 23e9b657..2a7abeea 100644 --- a/src/main/java/com/replaymod/replay/handler/GuiHandler.java +++ b/src/main/java/com/replaymod/replay/handler/GuiHandler.java @@ -14,7 +14,6 @@ import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import java.io.IOException; import java.util.ArrayList; -import java.util.List; public class GuiHandler { private static final int BUTTON_EXIT_SERVER = 1; @@ -41,7 +40,7 @@ public class GuiHandler { @SubscribeEvent public void injectIntoIngameMenu(GuiScreenEvent.InitGuiEvent.Post event) { - if (!(event.gui instanceof GuiIngameMenu)) { + if (!(event.getGui() instanceof GuiIngameMenu)) { return; } @@ -49,9 +48,7 @@ public class GuiHandler { // Pause replay when menu is opened mod.getReplayHandler().getReplaySender().setReplaySpeed(0); - @SuppressWarnings("unchecked") - List buttonList = event.buttonList; - for(GuiButton b : new ArrayList<>(buttonList)) { + for(GuiButton b : new ArrayList<>(event.getButtonList())) { switch (b.id) { // Replace "Exit Server" button with "Exit Replay" button case BUTTON_EXIT_SERVER: @@ -62,7 +59,7 @@ public class GuiHandler { case BUTTON_ACHIEVEMENTS: case BUTTON_STATS: case BUTTON_OPEN_TO_LAN: - buttonList.remove(b); + event.getButtonList().remove(b); } // Move all buttons except the "Return to game" button upwards if (b.id != BUTTON_RETURN_TO_GAME) { @@ -74,31 +71,29 @@ public class GuiHandler { @SubscribeEvent public void injectIntoMainMenu(GuiScreenEvent.InitGuiEvent event) { - if (!(event.gui instanceof GuiMainMenu)) { + if (!(event.getGui() instanceof GuiMainMenu)) { return; } - @SuppressWarnings("unchecked") - List buttonList = event.buttonList; - GuiButton button = new GuiButton(BUTTON_REPLAY_VIEWER, event.gui.width / 2 - 100, - event.gui.height / 4 + 10 + 3 * 24, I18n.format("replaymod.gui.replayviewer")); + GuiButton button = new GuiButton(BUTTON_REPLAY_VIEWER, event.getGui().width / 2 - 100, + event.getGui().height / 4 + 10 + 3 * 24, I18n.format("replaymod.gui.replayviewer")); button.width = button.width / 2 - 2; - buttonList.add(button); + event.getButtonList().add(button); } @SubscribeEvent public void onButton(GuiScreenEvent.ActionPerformedEvent.Pre event) { - if(!event.button.enabled) return; + if(!event.getButton().enabled) return; - if (event.gui instanceof GuiMainMenu) { - if (event.button.id == BUTTON_REPLAY_VIEWER) { + if (event.getGui() instanceof GuiMainMenu) { + if (event.getButton().id == BUTTON_REPLAY_VIEWER) { new GuiReplayViewer(mod).display(); } } - if (event.gui instanceof GuiIngameMenu && mod.getReplayHandler() != null) { - if (event.button.id == BUTTON_EXIT_REPLAY) { - event.button.enabled = false; + if (event.getGui() instanceof GuiIngameMenu && mod.getReplayHandler() != null) { + if (event.getButton().id == BUTTON_EXIT_REPLAY) { + event.getButton().enabled = false; mc.displayGuiScreen(new GuiMainMenu()); try { mod.getReplayHandler().endReplay(); diff --git a/src/main/java/com/replaymod/replay/mixin/MixinGuiSpectator.java b/src/main/java/com/replaymod/replay/mixin/MixinGuiSpectator.java index 081c702c..4525ddd8 100644 --- a/src/main/java/com/replaymod/replay/mixin/MixinGuiSpectator.java +++ b/src/main/java/com/replaymod/replay/mixin/MixinGuiSpectator.java @@ -12,12 +12,12 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(GuiSpectator.class) public abstract class MixinGuiSpectator { @Shadow - private Minecraft field_175268_g; + private Minecraft mc; - @Inject(method = "func_175260_a", at = @At("HEAD"), cancellable = true) + @Inject(method = "onHotbarSelected", at = @At("HEAD"), cancellable = true) public void isInReplay(int i, CallbackInfo ci) { // Prevent spectator gui from opening while in a replay - if (field_175268_g.thePlayer instanceof CameraEntity) { + if (mc.thePlayer instanceof CameraEntity) { ci.cancel(); } } diff --git a/src/main/java/com/replaymod/replay/mixin/MixinPlayerControllerMP.java b/src/main/java/com/replaymod/replay/mixin/MixinPlayerControllerMP.java index 2998fec5..e70bb184 100644 --- a/src/main/java/com/replaymod/replay/mixin/MixinPlayerControllerMP.java +++ b/src/main/java/com/replaymod/replay/mixin/MixinPlayerControllerMP.java @@ -1,12 +1,12 @@ package com.replaymod.replay.mixin; -import com.replaymod.replay.camera.CameraEntity; import com.replaymod.replay.ReplayModReplay; +import com.replaymod.replay.camera.CameraEntity; import net.minecraft.client.Minecraft; import net.minecraft.client.entity.EntityPlayerSP; import net.minecraft.client.multiplayer.PlayerControllerMP; import net.minecraft.client.network.NetHandlerPlayClient; -import net.minecraft.stats.StatFileWriter; +import net.minecraft.stats.StatisticsManager; import net.minecraft.world.World; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -21,12 +21,12 @@ public abstract class MixinPlayerControllerMP { private Minecraft mc; @Shadow - private NetHandlerPlayClient netClientHandler; + private NetHandlerPlayClient connection; - @Inject(method = "func_178892_a", at=@At("HEAD"), cancellable = true) - private void replayModReplay_createReplayCamera(World worldIn, StatFileWriter statFileWriter, CallbackInfoReturnable ci) { + @Inject(method = "createClientPlayer", at=@At("HEAD"), cancellable = true) + private void replayModReplay_createReplayCamera(World worldIn, StatisticsManager statisticsManager, CallbackInfoReturnable ci) { if (ReplayModReplay.instance.getReplayHandler() != null) { - ci.setReturnValue(new CameraEntity(mc, worldIn, netClientHandler, statFileWriter)); + ci.setReturnValue(new CameraEntity(mc, worldIn, connection, statisticsManager)); ci.cancel(); } } diff --git a/src/main/java/com/replaymod/replay/mixin/MixinArmorStandRenderer.java b/src/main/java/com/replaymod/replay/mixin/MixinRenderArmorStand.java similarity index 78% rename from src/main/java/com/replaymod/replay/mixin/MixinArmorStandRenderer.java rename to src/main/java/com/replaymod/replay/mixin/MixinRenderArmorStand.java index 71c8f6d5..d181599b 100644 --- a/src/main/java/com/replaymod/replay/mixin/MixinArmorStandRenderer.java +++ b/src/main/java/com/replaymod/replay/mixin/MixinRenderArmorStand.java @@ -2,7 +2,7 @@ package com.replaymod.replay.mixin; import com.replaymod.replay.camera.CameraEntity; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.entity.ArmorStandRenderer; +import net.minecraft.client.renderer.entity.RenderArmorStand; import net.minecraft.entity.item.EntityArmorStand; import net.minecraft.entity.player.EntityPlayer; import org.spongepowered.asm.mixin.Mixin; @@ -10,9 +10,9 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -@Mixin(ArmorStandRenderer.class) -public abstract class MixinArmorStandRenderer { - @Inject(method = "func_177099_b", at = @At("HEAD"), cancellable = true) +@Mixin(RenderArmorStand.class) +public abstract class MixinRenderArmorStand { + @Inject(method = "canRenderName", at = @At("HEAD"), cancellable = true) private void replayModReplay_canRenderInvisibleName(EntityArmorStand entity, CallbackInfoReturnable ci) { EntityPlayer thePlayer = Minecraft.getMinecraft().thePlayer; if (thePlayer instanceof CameraEntity && entity.isInvisible()) { diff --git a/src/main/java/com/replaymod/replay/mixin/MixinRenderArrow.java b/src/main/java/com/replaymod/replay/mixin/MixinRenderArrow.java index 03787d5d..301df383 100644 --- a/src/main/java/com/replaymod/replay/mixin/MixinRenderArrow.java +++ b/src/main/java/com/replaymod/replay/mixin/MixinRenderArrow.java @@ -14,6 +14,7 @@ public abstract class MixinRenderArrow extends Render { super(renderManager); } + @SuppressWarnings("unchecked") @Override public boolean shouldRender(Entity entity, ICamera camera, double camX, double camY, double camZ) { // Force arrows to always render, otherwise they stop rendering when you get close to them diff --git a/src/main/java/com/replaymod/replay/mixin/MixinRenderItem.java b/src/main/java/com/replaymod/replay/mixin/MixinRenderItem.java index 3439c689..542aa978 100644 --- a/src/main/java/com/replaymod/replay/mixin/MixinRenderItem.java +++ b/src/main/java/com/replaymod/replay/mixin/MixinRenderItem.java @@ -3,7 +3,7 @@ package com.replaymod.replay.mixin; import com.replaymod.replay.ReplayHandler; import com.replaymod.replay.ReplayModReplay; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.entity.RenderItem; +import net.minecraft.client.renderer.RenderItem; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Redirect; diff --git a/src/main/java/com/replaymod/replay/mixin/MixinRendererLivingEntity.java b/src/main/java/com/replaymod/replay/mixin/MixinRenderLivingBase.java similarity index 89% rename from src/main/java/com/replaymod/replay/mixin/MixinRendererLivingEntity.java rename to src/main/java/com/replaymod/replay/mixin/MixinRenderLivingBase.java index 14f86443..fe497cc4 100644 --- a/src/main/java/com/replaymod/replay/mixin/MixinRendererLivingEntity.java +++ b/src/main/java/com/replaymod/replay/mixin/MixinRenderLivingBase.java @@ -2,7 +2,7 @@ package com.replaymod.replay.mixin; import com.replaymod.replay.camera.CameraEntity; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.entity.RendererLivingEntity; +import net.minecraft.client.renderer.entity.RenderLivingBase; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import org.spongepowered.asm.mixin.Mixin; @@ -11,8 +11,8 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -@Mixin(RendererLivingEntity.class) -public abstract class MixinRendererLivingEntity { +@Mixin(RenderLivingBase.class) +public abstract class MixinRenderLivingBase { @Inject(method = "canRenderName", at = @At("HEAD"), cancellable = true) private void replayModReplay_canRenderInvisibleName(EntityLivingBase entity, CallbackInfoReturnable ci) { EntityPlayer thePlayer = Minecraft.getMinecraft().thePlayer; diff --git a/src/main/java/com/replaymod/replay/mixin/MixinTileEntityEndPortalRenderer.java b/src/main/java/com/replaymod/replay/mixin/MixinTileEntityEndPortalRenderer.java index f6cca14a..aa824ec9 100644 --- a/src/main/java/com/replaymod/replay/mixin/MixinTileEntityEndPortalRenderer.java +++ b/src/main/java/com/replaymod/replay/mixin/MixinTileEntityEndPortalRenderer.java @@ -10,7 +10,7 @@ import org.spongepowered.asm.mixin.injection.Redirect; @Mixin(TileEntityEndPortalRenderer.class) public class MixinTileEntityEndPortalRenderer { - @Redirect(method = "func_180544_a", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/Minecraft;getSystemTime()J")) + @Redirect(method = "renderTileEntityAt", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/Minecraft;getSystemTime()J")) private long replayModReplay_getEnchantmentTime() { ReplayHandler replayHandler = ReplayModReplay.instance.getReplayHandler(); if (replayHandler != null) { diff --git a/src/main/java/com/replaymod/replay/mixin/MixinViewFrustum.java b/src/main/java/com/replaymod/replay/mixin/MixinViewFrustum.java index 94e44a58..35773daa 100644 --- a/src/main/java/com/replaymod/replay/mixin/MixinViewFrustum.java +++ b/src/main/java/com/replaymod/replay/mixin/MixinViewFrustum.java @@ -5,8 +5,8 @@ import net.minecraft.client.renderer.RenderGlobal; import net.minecraft.client.renderer.ViewFrustum; import net.minecraft.client.renderer.chunk.IRenderChunkFactory; import net.minecraft.client.renderer.chunk.RenderChunk; -import net.minecraft.util.BlockPos; -import net.minecraft.util.MathHelper; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MathHelper; import net.minecraft.world.World; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -31,7 +31,7 @@ public abstract class MixinViewFrustum { } /** - * Instead of calling {@link RenderChunk#setPosition(BlockPos)} we recreate the render chunk + * Instead of calling {@link RenderChunk#setOrigin(int, int, int)} we recreate the render chunk * which seems to solve the problem that chunks are invisible when you leave an area and return * to it. * Any better fixes are welcome. @@ -48,17 +48,18 @@ public abstract class MixinViewFrustum { int k = this.countChunksX * 16; for (int l = 0; l < this.countChunksX; ++l) { - int i1 = this.func_178157_a(i, k, l); + int i1 = this.getBaseCoordinate(i, k, l); for (int j1 = 0; j1 < this.countChunksZ; ++j1) { - int k1 = this.func_178157_a(j, k, j1); + int k1 = this.getBaseCoordinate(j, k, j1); for (int l1 = 0; l1 < this.countChunksY; ++l1) { int i2 = l1 * 16; RenderChunk renderchunk = this.renderChunks[(j1 * this.countChunksY + l1) * this.countChunksX + l]; BlockPos blockpos = new BlockPos(i1, i2, k1); if (!blockpos.equals(renderchunk.getPosition())) { // Recreate render chunk instead of setting its position - renderChunks[(j1 * this.countChunksY + l1) * this.countChunksX + l] = - renderChunkFactory.makeRenderChunk(world, renderGlobal, blockpos, 0); + (renderChunks[(j1 * this.countChunksY + l1) * this.countChunksX + l] = + renderChunkFactory.create(world, renderGlobal, 0) + ).setOrigin(blockpos.getX(), blockpos.getY(), blockpos.getZ()); } } } @@ -66,5 +67,5 @@ public abstract class MixinViewFrustum { ci.cancel(); } - @Shadow abstract int func_178157_a(int p_178157_1_, int p_178157_2_, int p_178157_3_); + @Shadow abstract int getBaseCoordinate(int p_178157_1_, int p_178157_2_, int p_178157_3_); } diff --git a/src/main/java/com/replaymod/simplepathing/preview/PathPreviewRenderer.java b/src/main/java/com/replaymod/simplepathing/preview/PathPreviewRenderer.java index 8c12a07b..ecb61234 100644 --- a/src/main/java/com/replaymod/simplepathing/preview/PathPreviewRenderer.java +++ b/src/main/java/com/replaymod/simplepathing/preview/PathPreviewRenderer.java @@ -17,7 +17,8 @@ import com.replaymod.simplepathing.gui.GuiPathing; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.Tessellator; -import net.minecraft.client.renderer.WorldRenderer; +import net.minecraft.client.renderer.VertexBuffer; +import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.entity.Entity; import net.minecraft.util.ResourceLocation; import net.minecraftforge.client.event.RenderWorldLastEvent; @@ -203,26 +204,35 @@ public class PathPreviewRenderer { if (distanceSquared(view, pos2) > renderDistanceSquared) return; Tessellator tessellator = Tessellator.getInstance(); - WorldRenderer renderer = tessellator.getWorldRenderer(); - renderer.setTranslation(-view.getLeft(), -view.getMiddle(), -view.getRight()); + VertexBuffer vertexBuffer = tessellator.getBuffer(); + vertexBuffer.setTranslation(-view.getLeft(), -view.getMiddle(), -view.getRight()); - renderer.startDrawing(GL11.GL_LINES); - renderer.setColorRGBA_I(color, 255); + vertexBuffer.begin(GL11.GL_LINES, DefaultVertexFormats.POSITION_COLOR); - renderer.addVertex(pos1.getLeft(), pos1.getMiddle(), pos1.getRight()); - renderer.addVertex(pos2.getLeft(), pos2.getMiddle(), pos2.getRight()); + vertexBuffer.pos(pos1.getLeft(), pos1.getMiddle(), pos1.getRight()).color( + color >> 16 & 0xff, + color >> 8 & 0xff, + color & 0xff, + 255 + ).endVertex(); + vertexBuffer.pos(pos2.getLeft(), pos2.getMiddle(), pos2.getRight()).color( + color >> 16 & 0xff, + color >> 8 & 0xff, + color & 0xff, + 255 + ).endVertex(); GL11.glLineWidth(3); tessellator.draw(); - renderer.setTranslation(0, 0, 0); + vertexBuffer.setTranslation(0, 0, 0); } private void drawPoint(Triple view, Triple pos, Keyframe keyframe) { Tessellator tessellator = Tessellator.getInstance(); - WorldRenderer renderer = tessellator.getWorldRenderer(); - renderer.setTranslation(0, 0, 0); + VertexBuffer vertexBuffer = tessellator.getBuffer(); + vertexBuffer.setTranslation(0, 0, 0); mc.renderEngine.bindTexture(TEXTURE); @@ -243,12 +253,12 @@ public class PathPreviewRenderer { float maxX = 0.5f; float maxY = 0.5f; - renderer.startDrawingQuads(); + vertexBuffer.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_TEX); - renderer.addVertexWithUV(minX, minY, 0, posX + size, posY + size); - renderer.addVertexWithUV(minX, maxY, 0, posX + size, posY); - renderer.addVertexWithUV(maxX, maxY, 0, posX, posY); - renderer.addVertexWithUV(maxX, minY, 0, posX, posY + size); + vertexBuffer.pos(minX, minY, 0).tex(posX + size, posY + size).endVertex(); + vertexBuffer.pos(minX, maxY, 0).tex(posX + size, posY).endVertex(); + vertexBuffer.pos(maxX, maxY, 0).tex(posX, posY).endVertex(); + vertexBuffer.pos(maxX, minY, 0).tex(posX, posY + size).endVertex(); GL11.glPushMatrix(); @@ -270,8 +280,8 @@ public class PathPreviewRenderer { Triple pos, Triple rot) { Tessellator tessellator = Tessellator.getInstance(); - WorldRenderer renderer = tessellator.getWorldRenderer(); - renderer.setTranslation(0, 0, 0); + VertexBuffer vertexBuffer = tessellator.getBuffer(); + vertexBuffer.setTranslation(0, 0, 0); mc.renderEngine.bindTexture(CAMERA_HEAD); @@ -289,12 +299,10 @@ public class PathPreviewRenderer { //draw the position line GL11.glDisable(GL11.GL_TEXTURE_2D); - renderer.startDrawing(GL11.GL_LINES); + vertexBuffer.begin(GL11.GL_LINES, DefaultVertexFormats.POSITION_COLOR); - renderer.setColorRGBA_I(0x00ff00, 170); - - renderer.addVertex(0, 0, 0); - renderer.addVertex(0, 0, 2); + vertexBuffer.pos(0, 0, 0).color(0, 255, 0, 170).endVertex(); + vertexBuffer.pos(0, 0, 2).color(0, 255, 0, 170).endVertex(); tessellator.draw(); @@ -305,45 +313,43 @@ public class PathPreviewRenderer { double r = -cubeSize/2; - renderer.startDrawingQuads(); - - renderer.setColorRGBA_I(0xffffff, 200); + vertexBuffer.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_TEX_COLOR); //back - renderer.addVertexWithUV(r, r + cubeSize, r, 3 * 8 / 64f, 8 / 64f); - renderer.addVertexWithUV(r + cubeSize, r + cubeSize, r, 4*8/64f, 8/64f); - renderer.addVertexWithUV(r + cubeSize, r, r, 4*8/64f, 2*8/64f); - renderer.addVertexWithUV(r, r, r, 3*8/64f, 2*8/64f); + vertexBuffer.pos(r, r + cubeSize, r).tex(3 * 8 / 64f, 8 / 64f).color(255, 255, 255, 200).endVertex(); + vertexBuffer.pos(r + cubeSize, r + cubeSize, r).tex(4*8/64f, 8/64f).color(255, 255, 255, 200).endVertex(); + vertexBuffer.pos(r + cubeSize, r, r).tex(4*8/64f, 2*8/64f).color(255, 255, 255, 200).endVertex(); + vertexBuffer.pos(r, r, r).tex(3*8/64f, 2*8/64f).color(255, 255, 255, 200).endVertex(); //front - renderer.addVertexWithUV(r + cubeSize, r, r + cubeSize, 2 * 8 / 64f, 2*8/64f); - renderer.addVertexWithUV(r + cubeSize, r + cubeSize, r + cubeSize, 2 * 8 / 64f, 8/64f); - renderer.addVertexWithUV(r, r + cubeSize, r + cubeSize, 8 / 64f, 8 / 64f); - renderer.addVertexWithUV(r, r, r + cubeSize, 8 / 64f, 2*8/64f); + vertexBuffer.pos(r + cubeSize, r, r + cubeSize).tex(2 * 8 / 64f, 2*8/64f).color(255, 255, 255, 200).endVertex(); + vertexBuffer.pos(r + cubeSize, r + cubeSize, r + cubeSize).tex(2 * 8 / 64f, 8/64f).color(255, 255, 255, 200).endVertex(); + vertexBuffer.pos(r, r + cubeSize, r + cubeSize).tex(8 / 64f, 8 / 64f).color(255, 255, 255, 200).endVertex(); + vertexBuffer.pos(r, r, r + cubeSize).tex(8 / 64f, 2*8/64f).color(255, 255, 255, 200).endVertex(); //left - renderer.addVertexWithUV(r + cubeSize, r + cubeSize, r, 0, 8/64f); - renderer.addVertexWithUV(r + cubeSize, r + cubeSize, r + cubeSize, 8/64f, 8/64f); - renderer.addVertexWithUV(r + cubeSize, r, r + cubeSize, 8/64f, 2*8/64f); - renderer.addVertexWithUV(r+cubeSize, r, r, 0, 2*8/64f); + vertexBuffer.pos(r + cubeSize, r + cubeSize, r).tex(0, 8/64f).color(255, 255, 255, 200).endVertex(); + vertexBuffer.pos(r + cubeSize, r + cubeSize, r + cubeSize).tex(8/64f, 8/64f).color(255, 255, 255, 200).endVertex(); + vertexBuffer.pos(r + cubeSize, r, r + cubeSize).tex(8/64f, 2*8/64f).color(255, 255, 255, 200).endVertex(); + vertexBuffer.pos(r+cubeSize, r, r).tex(0, 2*8/64f).color(255, 255, 255, 200).endVertex(); //right - renderer.addVertexWithUV(r, r + cubeSize, r + cubeSize, 2*8/64f, 8/64f); - renderer.addVertexWithUV(r, r + cubeSize, r, 3*8/64f, 8/64f); - renderer.addVertexWithUV(r, r, r, 3*8/64f, 2*8/64f); - renderer.addVertexWithUV(r, r, r + cubeSize, 2 * 8 / 64f, 2 * 8 / 64f); + vertexBuffer.pos(r, r + cubeSize, r + cubeSize).tex(2*8/64f, 8/64f).color(255, 255, 255, 200).endVertex(); + vertexBuffer.pos(r, r + cubeSize, r).tex(3*8/64f, 8/64f).color(255, 255, 255, 200).endVertex(); + vertexBuffer.pos(r, r, r).tex(3*8/64f, 2*8/64f).color(255, 255, 255, 200).endVertex(); + vertexBuffer.pos(r, r, r + cubeSize).tex(2 * 8 / 64f, 2 * 8 / 64f).color(255, 255, 255, 200).endVertex(); //bottom - renderer.addVertexWithUV(r + cubeSize, r, r, 3*8/64f, 0); - renderer.addVertexWithUV(r + cubeSize, r, r + cubeSize, 3*8/64f, 8/64f); - renderer.addVertexWithUV(r, r, r + cubeSize, 2*8/64f, 8/64f); - renderer.addVertexWithUV(r, r, r, 2 * 8 / 64f, 0); + vertexBuffer.pos(r + cubeSize, r, r).tex(3*8/64f, 0).color(255, 255, 255, 200).endVertex(); + vertexBuffer.pos(r + cubeSize, r, r + cubeSize).tex(3*8/64f, 8/64f).color(255, 255, 255, 200).endVertex(); + vertexBuffer.pos(r, r, r + cubeSize).tex(2*8/64f, 8/64f).color(255, 255, 255, 200).endVertex(); + vertexBuffer.pos(r, r, r).tex(2 * 8 / 64f, 0).color(255, 255, 255, 200).endVertex(); //top - renderer.addVertexWithUV(r, r + cubeSize, r, 8/64f, 0); - renderer.addVertexWithUV(r, r + cubeSize, r + cubeSize, 8/64f, 8/64f); - renderer.addVertexWithUV(r + cubeSize, r + cubeSize, r + cubeSize, 2*8/64f, 8/64f); - renderer.addVertexWithUV(r + cubeSize, r + cubeSize, r, 2 * 8 / 64f, 0); + vertexBuffer.pos(r, r + cubeSize, r).tex(8/64f, 0).color(255, 255, 255, 200).endVertex(); + vertexBuffer.pos(r, r + cubeSize, r + cubeSize).tex(8/64f, 8/64f).color(255, 255, 255, 200).endVertex(); + vertexBuffer.pos(r + cubeSize, r + cubeSize, r + cubeSize).tex(2*8/64f, 8/64f).color(255, 255, 255, 200).endVertex(); + vertexBuffer.pos(r + cubeSize, r + cubeSize, r).tex(2 * 8 / 64f, 0).color(255, 255, 255, 200).endVertex(); tessellator.draw(); diff --git a/src/main/resources/META-INF/replaymod_at.cfg b/src/main/resources/META-INF/replaymod_at.cfg index 59d3b95e..51605cc5 100644 --- a/src/main/resources/META-INF/replaymod_at.cfg +++ b/src/main/resources/META-INF/replaymod_at.cfg @@ -21,23 +21,23 @@ public net.minecraft.client.Minecraft func_147112_ai()V # middleClickMouse public net.minecraft.client.Minecraft func_147115_a(Z)V # sendClickBlockToController # Packets -public net.minecraft.network.play.server.S0FPacketSpawnMob field_149043_l # dataWatcher +public net.minecraft.network.play.server.SPacketSpawnMob field_149043_l # dataManager +public net.minecraft.network.play.server.SPacketSpawnPlayer field_148960_i # watcher #public net.minecraft.network.play.server.S38PacketPlayerListItem field_179964_d # profile -public net.minecraft.network.play.server.S1DPacketEntityEffect field_149434_a # entityId -public net.minecraft.network.play.server.S1CPacketEntityMetadata field_149379_a # entityId -public net.minecraft.network.play.server.S1CPacketEntityMetadata field_149378_b # list -public net.minecraft.network.play.server.S0BPacketAnimation field_148981_a # entityId -public net.minecraft.network.play.server.S02PacketChat field_179842_b # position -public net.minecraft.network.play.server.S19PacketEntityStatus field_149164_a # entityId -public net.minecraft.network.play.server.S0CPacketSpawnPlayer * -public net.minecraft.network.play.server.S18PacketEntityTeleport * -public net.minecraft.network.play.server.S14PacketEntity * -public net.minecraft.network.play.server.S19PacketEntityHeadLook * -public net.minecraft.network.play.server.S12PacketEntityVelocity * -public net.minecraft.network.play.server.S04PacketEntityEquipment * -public net.minecraft.network.play.server.S1BPacketEntityAttach * -public net.minecraft.network.play.server.S0DPacketCollectItem * -public net.minecraft.network.play.server.S13PacketDestroyEntities * +# public net.minecraft.network.play.server.S1DPacketEntityEffect field_149434_a # entityId +# public net.minecraft.network.play.server.S1CPacketEntityMetadata field_149379_a # entityId +# public net.minecraft.network.play.server.S1CPacketEntityMetadata field_149378_b # list +# public net.minecraft.network.play.server.S0BPacketAnimation field_148981_a # entityId +# public net.minecraft.network.play.server.S02PacketChat field_179842_b # position +# public net.minecraft.network.play.server.S19PacketEntityStatus field_149164_a # entityId +# public net.minecraft.network.play.server.S18PacketEntityTeleport * +# public net.minecraft.network.play.server.S14PacketEntity * +# public net.minecraft.network.play.server.S19PacketEntityHeadLook * +# public net.minecraft.network.play.server.S12PacketEntityVelocity * +# public net.minecraft.network.play.server.S04PacketEntityEquipment * +# public net.minecraft.network.play.server.S1BPacketEntityAttach * +# public net.minecraft.network.play.server.S0DPacketCollectItem * +# public net.minecraft.network.play.server.S13PacketDestroyEntities * # GuiTextField public net.minecraft.client.gui.GuiTextField field_146216_j # text @@ -61,7 +61,7 @@ public net.minecraft.client.renderer.RenderGlobal field_175009_l # chunksToUpdat public net.minecraft.client.renderer.RenderGlobal field_72755_R # renderInfos public net.minecraft.client.renderer.RenderGlobal field_175009_l # chunksToUpdate public net.minecraft.client.renderer.RenderGlobal field_72740_G # renderEntitiesStartupCounter -public net.minecraft.client.renderer.RenderGlobal func_174983_a(Lnet.minecraft.util.BlockPos;Lnet.minecraft.client.renderer.chunk.RenderChunk;)Z # isPositionInRenderChunk +# public net.minecraft.client.renderer.RenderGlobal func_174983_a(Lnet.minecraft.util.BlockPos;Lnet.minecraft.client.renderer.chunk.RenderChunk;)Z # isPositionInRenderChunk public net.minecraft.client.renderer.RenderGlobal$ContainerLocalRenderInformation #public net.minecraft.client.renderer.RenderGlobal$ContainerLocalRenderInformation field_178553_a # renderChunk @@ -88,14 +88,14 @@ public net.minecraft.entity.player.EntityPlayer * public net.minecraft.client.entity.EntityOtherPlayerMP * # EffectRenderer -public net.minecraft.client.particle.EffectRenderer field_110737_b # particleTextures -public net.minecraft.client.particle.EffectRenderer field_78876_b # fxLayers +# public net.minecraft.client.particle.EffectRenderer field_110737_b # particleTextures +# public net.minecraft.client.particle.EffectRenderer field_78876_b # fxLayers # IntegratedServer public net.minecraft.server.integrated.IntegratedServer field_71348_o # isGamePaused # GameSettings -public net.minecraft.client.settings.GameSettings field_151446_aD # mapSoundLevels +public net.minecraft.client.settings.GameSettings field_186714_aM # soundLevels # Frustum public net.minecraft.client.renderer.culling.Frustum field_78552_a # clippingHelper @@ -117,5 +117,12 @@ public net.minecraft.client.renderer.GlStateManager$FogState public net.minecraft.client.renderer.GlStateManager$BooleanState public net.minecraft.client.renderer.GlStateManager$BooleanState * +# EntityLivingBase +public net.minecraft.entity.EntityLivingBase field_184621_as # HAND_STATES +public net.minecraft.entity.EntityLivingBase field_184628_bn # activeItemStackUseCount + +# EntityLivingBase +public net.minecraft.client.particle.Particle * + # Example # public net.minecraft.package.ClassName func_some_id(Ljava/lang/Class;IZS)V # methodName diff --git a/src/main/resources/mcmod.info b/src/main/resources/mcmod.info index bf81b322..144f7a72 100755 --- a/src/main/resources/mcmod.info +++ b/src/main/resources/mcmod.info @@ -48,7 +48,7 @@ "parent": "replaymod", "screenshots": [], "dependencies": [] - }, + }/*, { "modid": "replaymod-online", "name": "Replay Mod - Online", @@ -116,5 +116,5 @@ "parent": "replaymod", "screenshots": [], "dependencies": [] - } + }*/ ] diff --git a/src/main/resources/mixins.recording.replaymod.json b/src/main/resources/mixins.recording.replaymod.json index 272114ff..a67ec80b 100644 --- a/src/main/resources/mixins.recording.replaymod.json +++ b/src/main/resources/mixins.recording.replaymod.json @@ -7,5 +7,6 @@ "MixinNetHandlerPlayClient", "MixinRenderGlobal" ], + "compatibilityLevel": "JAVA_8", "refmap": "mixins.replaymod.refmap.json" } \ No newline at end of file diff --git a/src/main/resources/mixins.render.replaymod.json b/src/main/resources/mixins.render.replaymod.json index 164a61d2..203a07cb 100644 --- a/src/main/resources/mixins.render.replaymod.json +++ b/src/main/resources/mixins.render.replaymod.json @@ -2,14 +2,15 @@ "required": true, "package": "com.replaymod.render.mixin", "mixins": [ - "MixinEffectRenderer", "MixinEntityRenderer", + "MixinParticleManager", "MixinRender", - "MixinRendererLivingEntity", "MixinRenderGlobal", + "MixinRenderLiving", "MixinRenderManager" ], "server": [], "client": [], + "compatibilityLevel": "JAVA_8", "refmap": "mixins.replaymod.refmap.json" } \ No newline at end of file diff --git a/src/main/resources/mixins.replay.replaymod.json b/src/main/resources/mixins.replay.replaymod.json index b18e7b9f..94ef40e6 100644 --- a/src/main/resources/mixins.replay.replaymod.json +++ b/src/main/resources/mixins.replay.replaymod.json @@ -2,17 +2,18 @@ "required": true, "package": "com.replaymod.replay.mixin", "mixins": [ - "MixinArmorStandRenderer", "MixinGuiSpectator", "MixinPlayerControllerMP", + "MixinRenderArmorStand", "MixinRenderArrow", - "MixinRendererLivingEntity", "MixinRenderItem", + "MixinRenderLivingBase", "MixinRenderManager", "MixinTileEntityEndPortalRenderer", "MixinViewFrustum" ], "server": [], "client": [], + "compatibilityLevel": "JAVA_8", "refmap": "mixins.replaymod.refmap.json" } \ No newline at end of file