Compare commits
13 Commits
1.11.2-2.1
...
1.12.1-2.0
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b1a2826cb4 | ||
|
|
0d6c1caffc | ||
|
|
922c039e43 | ||
|
|
0b462280fc | ||
|
|
cae95d1c8f | ||
|
|
67b7872c4d | ||
|
|
9b04d317c5 | ||
|
|
a6ffae2148 | ||
|
|
6109960d4a | ||
|
|
4dcecc5697 | ||
|
|
bef5e41a8d | ||
|
|
6ecb87e8dd | ||
|
|
921c9e0098 |
Submodule ReplayStudio updated: 078f78bedb...f1d6fbbf8a
13
build.gradle
13
build.gradle
@@ -17,7 +17,7 @@ buildscript {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
dependencies {
|
dependencies {
|
||||||
classpath 'net.minecraftforge.gradle:ForgeGradle:2.2-SNAPSHOT'
|
classpath 'net.minecraftforge.gradle:ForgeGradle:2.3-SNAPSHOT'
|
||||||
classpath 'org.spongepowered:mixingradle:0.4-SNAPSHOT'
|
classpath 'org.spongepowered:mixingradle:0.4-SNAPSHOT'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -34,9 +34,9 @@ archivesBaseName = "replaymod"
|
|||||||
|
|
||||||
minecraft {
|
minecraft {
|
||||||
coreMod = 'com.replaymod.core.LoadingPlugin'
|
coreMod = 'com.replaymod.core.LoadingPlugin'
|
||||||
version = '1.11.2-13.20.0.2216'
|
version = '1.12.1-14.22.0.2444'
|
||||||
runDir = "eclipse"
|
runDir = "eclipse"
|
||||||
mappings = "snapshot_20161220"
|
mappings = "snapshot_20170615"
|
||||||
replace '@MOD_VERSION@', project.version
|
replace '@MOD_VERSION@', project.version
|
||||||
// Includes intentional whitespace to stop Forge from declaring the mod to be compatible with
|
// Includes intentional whitespace to stop Forge from declaring the mod to be compatible with
|
||||||
// a newer srg-compatible MC version (that may be using a different protocol version)
|
// a newer srg-compatible MC version (that may be using a different protocol version)
|
||||||
@@ -48,9 +48,6 @@ repositories {
|
|||||||
name = "SpongePowered Repo"
|
name = "SpongePowered Repo"
|
||||||
url = "http://repo.spongepowered.org/maven/"
|
url = "http://repo.spongepowered.org/maven/"
|
||||||
}
|
}
|
||||||
maven {
|
|
||||||
url 'https://repo.spacehq.org/content/repositories/snapshots/'
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
configurations {
|
configurations {
|
||||||
@@ -61,7 +58,9 @@ configurations {
|
|||||||
dependencies {
|
dependencies {
|
||||||
compile 'org.projectlombok:lombok:1.16.4'
|
compile 'org.projectlombok:lombok:1.16.4'
|
||||||
|
|
||||||
compile 'org.spongepowered:mixin:0.6.8-SNAPSHOT'
|
compile('org.spongepowered:mixin:0.6.11-SNAPSHOT') {
|
||||||
|
exclude group: 'org.apache.logging.log4j'
|
||||||
|
}
|
||||||
shade 'com.googlecode.mp4parser:isoparser:1.1.7'
|
shade 'com.googlecode.mp4parser:isoparser:1.1.7'
|
||||||
shade 'org.apache.commons:commons-exec:1.3'
|
shade 'org.apache.commons:commons-exec:1.3'
|
||||||
shade 'com.google.apis:google-api-services-youtube:v3-rev178-1.22.0'
|
shade 'com.google.apis:google-api-services-youtube:v3-rev178-1.22.0'
|
||||||
|
|||||||
2
jGui
2
jGui
Submodule jGui updated: bd3fa93d7d...e5fcc65032
@@ -299,7 +299,7 @@ public abstract class AbstractTask implements Task {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
clickNow(button.xPosition + 5, button.yPosition + 5);
|
clickNow(button.x + 5, button.y + 5);
|
||||||
} catch (IllegalAccessException | NoSuchFieldException e) {
|
} catch (IllegalAccessException | NoSuchFieldException e) {
|
||||||
future.setException(e);
|
future.setException(e);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,6 +36,11 @@ public class ReplayModIntegrationTest {
|
|||||||
// Make sure the game window doesn't have to remain in focus during the test
|
// Make sure the game window doesn't have to remain in focus during the test
|
||||||
mc.gameSettings.pauseOnLostFocus = false;
|
mc.gameSettings.pauseOnLostFocus = false;
|
||||||
|
|
||||||
|
// Vanilla uses our keys
|
||||||
|
mc.gameSettings.keyBindAdvancements.setKeyCode(0);
|
||||||
|
mc.gameSettings.keyBindLoadToolbar.setKeyCode(0);
|
||||||
|
mc.gameSettings.keyBindSaveToolbar.setKeyCode(0);
|
||||||
|
|
||||||
runTasks(
|
runTasks(
|
||||||
new SkipLogin(),
|
new SkipLogin(),
|
||||||
new DownloadOpenEye(),
|
new DownloadOpenEye(),
|
||||||
|
|||||||
@@ -10,6 +10,10 @@ import java.nio.file.NoSuchFileException;
|
|||||||
public class DownloadOpenEye extends AbstractTask {
|
public class DownloadOpenEye extends AbstractTask {
|
||||||
@Override
|
@Override
|
||||||
protected void init() {
|
protected void init() {
|
||||||
|
if ("1".equals(System.getenv("RM_INTEGRATION_TEST_NO_OPENEYE"))) {
|
||||||
|
runLater(() -> future.set(null));
|
||||||
|
return;
|
||||||
|
}
|
||||||
expectGui(OpenEyeExtra.OfferGui.class, offerGui -> {
|
expectGui(OpenEyeExtra.OfferGui.class, offerGui -> {
|
||||||
click(offerGui.yesButton);
|
click(offerGui.yesButton);
|
||||||
expectGuiClosed(20 * 1000, () -> {
|
expectGuiClosed(20 * 1000, () -> {
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ public class ShaderBeginRender {
|
|||||||
// check if Shaders are enabled
|
// check if Shaders are enabled
|
||||||
if (!(boolean) (ShaderReflection.config_isShaders.invoke(null))) return;
|
if (!(boolean) (ShaderReflection.config_isShaders.invoke(null))) return;
|
||||||
|
|
||||||
ShaderReflection.shaders_beginRender.invoke(null, mc, mc.timer.elapsedPartialTicks, 0);
|
ShaderReflection.shaders_beginRender.invoke(null, mc, mc.timer.renderPartialTicks, 0);
|
||||||
} catch (IllegalAccessException | InvocationTargetException e) {
|
} catch (IllegalAccessException | InvocationTargetException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ public abstract class MixinShaderRenderChunk {
|
|||||||
*/
|
*/
|
||||||
@Inject(method = "isPlayerUpdate", at = @At("HEAD"), cancellable = true)
|
@Inject(method = "isPlayerUpdate", at = @At("HEAD"), cancellable = true)
|
||||||
private void replayModCompat_disableIsPlayerUpdate(CallbackInfoReturnable<Boolean> ci) {
|
private void replayModCompat_disableIsPlayerUpdate(CallbackInfoReturnable<Boolean> ci) {
|
||||||
|
// TODO: Update to 1.12 once optifine is available
|
||||||
if (((EntityRendererHandler.IEntityRenderer) mc.entityRenderer).replayModRender_getHandler() == null) return;
|
if (((EntityRendererHandler.IEntityRenderer) mc.entityRenderer).replayModRender_getHandler() == null) return;
|
||||||
ci.setReturnValue(true);
|
ci.setReturnValue(true);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -85,7 +85,7 @@ public class KeyBindingRegistry {
|
|||||||
CrashReport crashReport = CrashReport.makeCrashReport(cause, "Handling Key Binding");
|
CrashReport crashReport = CrashReport.makeCrashReport(cause, "Handling Key Binding");
|
||||||
CrashReportCategory category = crashReport.makeCategory("Key Binding");
|
CrashReportCategory category = crashReport.makeCategory("Key Binding");
|
||||||
category.addCrashSection("Key Binding", keyBinding);
|
category.addCrashSection("Key Binding", keyBinding);
|
||||||
category.setDetail("Handler", runnable::toString);
|
category.addDetail("Handler", runnable::toString);
|
||||||
throw new ReportedException(crashReport);
|
throw new ReportedException(crashReport);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -100,7 +100,7 @@ public class KeyBindingRegistry {
|
|||||||
CrashReport crashReport = CrashReport.makeCrashReport(cause, "Handling Raw Key Binding");
|
CrashReport crashReport = CrashReport.makeCrashReport(cause, "Handling Raw Key Binding");
|
||||||
CrashReportCategory category = crashReport.makeCategory("Key Binding");
|
CrashReportCategory category = crashReport.makeCategory("Key Binding");
|
||||||
category.addCrashSection("Key Code", keyCode);
|
category.addCrashSection("Key Code", keyCode);
|
||||||
category.setDetail("Handler", runnable::toString);
|
category.addDetail("Handler", runnable::toString);
|
||||||
throw new ReportedException(crashReport);
|
throw new ReportedException(crashReport);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,30 +15,17 @@ public class GuiFactory implements IModGuiFactory {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Class<? extends GuiScreen> mainConfigGuiClass() {
|
public boolean hasConfigGui() {
|
||||||
return ConfigGuiWrapper.class;
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public GuiScreen createConfigGui(GuiScreen parentScreen) {
|
||||||
|
return new GuiReplaySettings(parentScreen, ReplayMod.instance.getSettingsRegistry()).toMinecraft();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Set<RuntimeOptionCategoryElement> runtimeGuiCategories() {
|
public Set<RuntimeOptionCategoryElement> runtimeGuiCategories() {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public RuntimeOptionGuiHandler getHandlerFor(RuntimeOptionCategoryElement element) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static class ConfigGuiWrapper extends GuiScreen {
|
|
||||||
private final GuiScreen parent;
|
|
||||||
|
|
||||||
public ConfigGuiWrapper(GuiScreen parent) {
|
|
||||||
this.parent = parent;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void initGui() {
|
|
||||||
new GuiReplaySettings(parent, ReplayMod.instance.getSettingsRegistry()).display();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,12 +19,12 @@ public class MainMenuHandler {
|
|||||||
if (event.getGui() instanceof GuiMainMenu) {
|
if (event.getGui() instanceof GuiMainMenu) {
|
||||||
for (GuiButton button : event.getButtonList()) {
|
for (GuiButton button : event.getButtonList()) {
|
||||||
// Buttons that aren't in a rectangle directly above our space don't need moving
|
// Buttons that aren't in a rectangle directly above our space don't need moving
|
||||||
if (button.xPosition + button.width < event.getGui().width / 2 - 100
|
if (button.x + button.width < event.getGui().width / 2 - 100
|
||||||
|| button.xPosition > event.getGui().width / 2 + 100
|
|| button.x > event.getGui().width / 2 + 100
|
||||||
|| button.yPosition > event.getGui().height / 4 + 10 + 4 * 24) continue;
|
|| button.y > event.getGui().height / 4 + 10 + 4 * 24) continue;
|
||||||
// Move button up to make space for two rows of buttons
|
// 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
|
// 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;
|
button.y -= 2 * 24 - 10;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,22 +4,22 @@ import com.replaymod.replaystudio.data.ModInfo;
|
|||||||
import net.minecraft.util.ResourceLocation;
|
import net.minecraft.util.ResourceLocation;
|
||||||
import net.minecraftforge.fml.common.Loader;
|
import net.minecraftforge.fml.common.Loader;
|
||||||
import net.minecraftforge.fml.common.ModContainer;
|
import net.minecraftforge.fml.common.ModContainer;
|
||||||
import net.minecraftforge.fml.common.registry.GameData;
|
import net.minecraftforge.registries.ForgeRegistry;
|
||||||
|
import net.minecraftforge.registries.RegistryManager;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
import java.util.stream.Stream;
|
|
||||||
|
|
||||||
public class ModCompat {
|
public class ModCompat {
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
public static Collection<ModInfo> getInstalledNetworkMods() {
|
public static Collection<ModInfo> getInstalledNetworkMods() {
|
||||||
Map<String, ModContainer> ignoreCaseMap = Loader.instance().getModList().stream()
|
Map<String, ModContainer> ignoreCaseMap = Loader.instance().getModList().stream()
|
||||||
.collect(Collectors.toMap(m -> m.getModId().toLowerCase(), Function.identity()));
|
.collect(Collectors.toMap(m -> m.getModId().toLowerCase(), Function.identity()));
|
||||||
return Stream.concat(
|
return RegistryManager.ACTIVE.takeSnapshot(false).keySet().stream()
|
||||||
((Set<ResourceLocation>) GameData.getBlockRegistry().getKeys()).stream(),
|
.map(RegistryManager.ACTIVE::getRegistry)
|
||||||
((Set<ResourceLocation>) GameData.getItemRegistry().getKeys()).stream()
|
.map(ForgeRegistry::getKeys).flatMap(Set::stream)
|
||||||
).map(ResourceLocation::getResourceDomain).filter(s -> !s.equals("minecraft")).distinct()
|
.map(ResourceLocation::getResourceDomain).filter(s -> !s.equals("minecraft")).distinct()
|
||||||
.map(String::toLowerCase).map(ignoreCaseMap::get).filter(mod -> mod != null)
|
.map(String::toLowerCase).map(ignoreCaseMap::get).filter(mod -> mod != null)
|
||||||
.map(mod -> new ModInfo(mod.getModId(), mod.getName(), mod.getVersion()))
|
.map(mod -> new ModInfo(mod.getModId(), mod.getName(), mod.getVersion()))
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
package com.replaymod.core.utils;
|
package com.replaymod.core.utils;
|
||||||
|
|
||||||
|
import net.minecraft.client.renderer.BufferBuilder;
|
||||||
import net.minecraft.client.renderer.GlStateManager;
|
import net.minecraft.client.renderer.GlStateManager;
|
||||||
import net.minecraft.client.renderer.Tessellator;
|
import net.minecraft.client.renderer.Tessellator;
|
||||||
import net.minecraft.client.renderer.VertexBuffer;
|
|
||||||
import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
|
import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
|
||||||
import org.lwjgl.BufferUtils;
|
import org.lwjgl.BufferUtils;
|
||||||
import org.lwjgl.opengl.GL11;
|
import org.lwjgl.opengl.GL11;
|
||||||
@@ -35,7 +35,7 @@ public class OpenGLUtils {
|
|||||||
float f5 = 1.0F / textureHeight;
|
float f5 = 1.0F / textureHeight;
|
||||||
|
|
||||||
Tessellator tessellator = Tessellator.getInstance();
|
Tessellator tessellator = Tessellator.getInstance();
|
||||||
VertexBuffer vertexBuffer = tessellator.getBuffer();
|
BufferBuilder vertexBuffer = tessellator.getBuffer();
|
||||||
GlStateManager.translate(x+(width/2), y+(width/2), 0);
|
GlStateManager.translate(x+(width/2), y+(width/2), 0);
|
||||||
GlStateManager.rotate(rotation, 0, 0, 1);
|
GlStateManager.rotate(rotation, 0, 0, 1);
|
||||||
vertexBuffer.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_TEX);
|
vertexBuffer.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_TEX);
|
||||||
|
|||||||
@@ -3,6 +3,8 @@ package com.replaymod.core.utils;
|
|||||||
import net.minecraft.util.Timer;
|
import net.minecraft.util.Timer;
|
||||||
|
|
||||||
public class WrappedTimer extends Timer {
|
public class WrappedTimer extends Timer {
|
||||||
|
public static final float DEFAULT_MS_PER_TICK = 1000 / 20;
|
||||||
|
|
||||||
protected final Timer wrapped;
|
protected final Timer wrapped;
|
||||||
|
|
||||||
public WrappedTimer(Timer wrapped) {
|
public WrappedTimer(Timer wrapped) {
|
||||||
@@ -19,15 +21,10 @@ public class WrappedTimer extends Timer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected void copy(Timer from, Timer to) {
|
protected void copy(Timer from, Timer to) {
|
||||||
to.ticksPerSecond = from.ticksPerSecond;
|
|
||||||
to.lastHRTime = from.lastHRTime;
|
|
||||||
to.elapsedTicks = from.elapsedTicks;
|
to.elapsedTicks = from.elapsedTicks;
|
||||||
to.renderPartialTicks = from.renderPartialTicks;
|
to.renderPartialTicks = from.renderPartialTicks;
|
||||||
to.timerSpeed = from.timerSpeed;
|
|
||||||
to.elapsedPartialTicks = from.elapsedPartialTicks;
|
|
||||||
to.lastSyncSysClock = from.lastSyncSysClock;
|
to.lastSyncSysClock = from.lastSyncSysClock;
|
||||||
to.lastSyncHRClock = from.lastSyncHRClock;
|
to.elapsedPartialTicks = from.elapsedPartialTicks;
|
||||||
to.counter = from.counter;
|
to.tickLength = from.tickLength;
|
||||||
to.timeSyncAdjustment = from.timeSyncAdjustment;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ import java.nio.channels.FileChannel;
|
|||||||
import java.nio.channels.ReadableByteChannel;
|
import java.nio.channels.ReadableByteChannel;
|
||||||
|
|
||||||
import static com.replaymod.core.utils.Utils.SSL_SOCKET_FACTORY;
|
import static com.replaymod.core.utils.Utils.SSL_SOCKET_FACTORY;
|
||||||
|
import static com.replaymod.extras.ReplayModExtras.LOGGER;
|
||||||
|
|
||||||
public class OpenEyeExtra implements Extra {
|
public class OpenEyeExtra implements Extra {
|
||||||
private static final String DOWNLOAD_URL = "https://www.replaymod.com/dl/openeye/" + Loader.MC_VERSION;
|
private static final String DOWNLOAD_URL = "https://www.replaymod.com/dl/openeye/" + Loader.MC_VERSION;
|
||||||
@@ -39,7 +40,25 @@ public class OpenEyeExtra implements Extra {
|
|||||||
mod.getSettingsRegistry().register(ASK_FOR_OPEN_EYE);
|
mod.getSettingsRegistry().register(ASK_FOR_OPEN_EYE);
|
||||||
|
|
||||||
if (!Loader.isModLoaded("OpenEye") && mod.getSettingsRegistry().get(ASK_FOR_OPEN_EYE)) {
|
if (!Loader.isModLoaded("OpenEye") && mod.getSettingsRegistry().get(ASK_FOR_OPEN_EYE)) {
|
||||||
mod.runLater(() -> new OfferGui(GuiScreen.wrap(mod.getMinecraft().currentScreen)).display());
|
new Thread(() -> {
|
||||||
|
try {
|
||||||
|
LOGGER.trace("Checking for OpenEye availability");
|
||||||
|
HttpsURLConnection connection = (HttpsURLConnection) new URL(DOWNLOAD_URL).openConnection();
|
||||||
|
connection.setSSLSocketFactory(SSL_SOCKET_FACTORY);
|
||||||
|
connection.setRequestMethod("HEAD");
|
||||||
|
connection.connect();
|
||||||
|
LOGGER.trace("Got response code: {}", connection.getResponseCode());
|
||||||
|
if (connection.getResponseCode() == 200) {
|
||||||
|
mod.runLater(() -> new OfferGui(GuiScreen.wrap(mod.getMinecraft().currentScreen)).display());
|
||||||
|
} else {
|
||||||
|
LOGGER.info("Cannot offer OpenEye, server returned: {} {}",
|
||||||
|
connection.getResponseCode(), connection.getResponseMessage());
|
||||||
|
}
|
||||||
|
connection.disconnect();
|
||||||
|
} catch (Throwable e) {
|
||||||
|
LOGGER.error("Failed to check for OpenEye availability:", e);
|
||||||
|
}
|
||||||
|
}).start();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,9 @@ public enum MinecraftVersion {
|
|||||||
MC_1_9_4("Minecraft 1.9.4", "1.9.4"),
|
MC_1_9_4("Minecraft 1.9.4", "1.9.4"),
|
||||||
MC_1_10_2("Minecraft 1.10.2", "1.10.2"),
|
MC_1_10_2("Minecraft 1.10.2", "1.10.2"),
|
||||||
MC_1_11("Minecraft 1.11", "1.11"),
|
MC_1_11("Minecraft 1.11", "1.11"),
|
||||||
MC_1_11_2("Minecraft 1.11.2", "1.11.2");
|
MC_1_11_2("Minecraft 1.11.2", "1.11.2"),
|
||||||
|
MC_1_12("Minecraft 1.12", "1.12"),
|
||||||
|
MC_1_12_1("Minecraft 1.12.1", "1.12.1");
|
||||||
|
|
||||||
private String niceName, apiName;
|
private String niceName, apiName;
|
||||||
|
|
||||||
|
|||||||
@@ -55,7 +55,7 @@ public class GuiRegister extends AbstractGuiScreen<GuiRegister> {
|
|||||||
pos(cancelButton, width / 2 + 2, 170);
|
pos(cancelButton, width / 2 + 2, 170);
|
||||||
pos(statusLabel, width / 2 - statusLabel.getMinSize().getWidth() / 2, 152);
|
pos(statusLabel, width / 2 - statusLabel.getMinSize().getWidth() / 2, 152);
|
||||||
|
|
||||||
FontRenderer font = getMinecraft().fontRendererObj;
|
FontRenderer font = getMinecraft().fontRenderer;
|
||||||
int lineCount = font.listFormattedStringToWidth(disclaimerLabel.getText(), width - 10).size();
|
int lineCount = font.listFormattedStringToWidth(disclaimerLabel.getText(), width - 10).size();
|
||||||
Dimension dim = new Dimension(width - 10, font.FONT_HEIGHT * lineCount);
|
Dimension dim = new Dimension(width - 10, font.FONT_HEIGHT * lineCount);
|
||||||
disclaimerLabel.setSize(dim);
|
disclaimerLabel.setSize(dim);
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ import de.johni0702.minecraft.gui.layout.VerticalLayout;
|
|||||||
import de.johni0702.minecraft.gui.popup.GuiYesNoPopup;
|
import de.johni0702.minecraft.gui.popup.GuiYesNoPopup;
|
||||||
import de.johni0702.minecraft.gui.utils.Colors;
|
import de.johni0702.minecraft.gui.utils.Colors;
|
||||||
import de.johni0702.minecraft.gui.utils.Consumer;
|
import de.johni0702.minecraft.gui.utils.Consumer;
|
||||||
import org.apache.logging.log4j.core.helpers.Strings;
|
import org.apache.logging.log4j.util.Strings;
|
||||||
import org.lwjgl.util.Dimension;
|
import org.lwjgl.util.Dimension;
|
||||||
import org.lwjgl.util.ReadableDimension;
|
import org.lwjgl.util.ReadableDimension;
|
||||||
|
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import com.google.common.collect.Ordering;
|
|||||||
import com.google.common.primitives.Longs;
|
import com.google.common.primitives.Longs;
|
||||||
import com.google.common.util.concurrent.ListenableFuture;
|
import com.google.common.util.concurrent.ListenableFuture;
|
||||||
import com.google.common.util.concurrent.SettableFuture;
|
import com.google.common.util.concurrent.SettableFuture;
|
||||||
|
import com.replaymod.core.utils.WrappedTimer;
|
||||||
import com.replaymod.replay.ReplayHandler;
|
import com.replaymod.replay.ReplayHandler;
|
||||||
import com.replaymod.replaystudio.pathing.path.Keyframe;
|
import com.replaymod.replaystudio.pathing.path.Keyframe;
|
||||||
import com.replaymod.replaystudio.pathing.path.Path;
|
import com.replaymod.replaystudio.pathing.path.Path;
|
||||||
@@ -68,8 +69,8 @@ public abstract class AbstractTimelinePlayer {
|
|||||||
MinecraftForge.EVENT_BUS.register(this);
|
MinecraftForge.EVENT_BUS.register(this);
|
||||||
lastTime = 0;
|
lastTime = 0;
|
||||||
mc.timer = new ReplayTimer(mc.timer);
|
mc.timer = new ReplayTimer(mc.timer);
|
||||||
mc.timer.timerSpeed = 1;
|
mc.timer.tickLength = WrappedTimer.DEFAULT_MS_PER_TICK;
|
||||||
mc.timer.elapsedPartialTicks = mc.timer.elapsedTicks = 0;
|
mc.timer.renderPartialTicks = mc.timer.elapsedTicks = 0;
|
||||||
return future = settableFuture = SettableFuture.create();
|
return future = settableFuture = SettableFuture.create();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -107,10 +108,9 @@ public abstract class AbstractTimelinePlayer {
|
|||||||
float timeInTicks = replayTime / 50f;
|
float timeInTicks = replayTime / 50f;
|
||||||
float previousTimeInTicks = lastTime / 50f;
|
float previousTimeInTicks = lastTime / 50f;
|
||||||
float passedTicks = timeInTicks - previousTimeInTicks;
|
float passedTicks = timeInTicks - previousTimeInTicks;
|
||||||
mc.timer.elapsedPartialTicks += passedTicks;
|
mc.timer.renderPartialTicks += passedTicks;
|
||||||
mc.timer.elapsedTicks = (int) mc.timer.elapsedPartialTicks;
|
mc.timer.elapsedTicks = (int) mc.timer.renderPartialTicks;
|
||||||
mc.timer.elapsedPartialTicks -= mc.timer.elapsedTicks;
|
mc.timer.renderPartialTicks -= mc.timer.elapsedTicks;
|
||||||
mc.timer.renderPartialTicks = mc.timer.elapsedPartialTicks;
|
|
||||||
|
|
||||||
lastTime = replayTime;
|
lastTime = replayTime;
|
||||||
|
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ public class GuiRecordingOverlay {
|
|||||||
public void renderRecordingIndicator(RenderGameOverlayEvent.Post event) {
|
public void renderRecordingIndicator(RenderGameOverlayEvent.Post event) {
|
||||||
if (event.getType() != RenderGameOverlayEvent.ElementType.ALL) return;
|
if (event.getType() != RenderGameOverlayEvent.ElementType.ALL) return;
|
||||||
if (settingsRegistry.get(Setting.INDICATOR)) {
|
if (settingsRegistry.get(Setting.INDICATOR)) {
|
||||||
FontRenderer fontRenderer = mc.fontRendererObj;
|
FontRenderer fontRenderer = mc.fontRenderer;
|
||||||
fontRenderer.drawString(I18n.format("replaymod.gui.recording").toUpperCase(), 30, 18 - (fontRenderer.FONT_HEIGHT / 2), 0xffffffff);
|
fontRenderer.drawString(I18n.format("replaymod.gui.recording").toUpperCase(), 30, 18 - (fontRenderer.FONT_HEIGHT / 2), 0xffffffff);
|
||||||
mc.renderEngine.bindTexture(TEXTURE);
|
mc.renderEngine.bindTexture(TEXTURE);
|
||||||
GlStateManager.resetColor();
|
GlStateManager.resetColor();
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ public class ConnectionEventHandler {
|
|||||||
try {
|
try {
|
||||||
boolean local = networkManager.isLocalChannel();
|
boolean local = networkManager.isLocalChannel();
|
||||||
if (local) {
|
if (local) {
|
||||||
if (mc.getIntegratedServer().getEntityWorld().getWorldType() == WorldType.DEBUG_WORLD) {
|
if (mc.getIntegratedServer().getEntityWorld().getWorldType() == WorldType.DEBUG_ALL_BLOCK_STATES) {
|
||||||
logger.info("Debug World recording is not supported.");
|
logger.info("Debug World recording is not supported.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -235,7 +235,7 @@ public class RecordingEventHandler {
|
|||||||
public void onPickupItem(ItemPickupEvent event) {
|
public void onPickupItem(ItemPickupEvent event) {
|
||||||
try {
|
try {
|
||||||
packetListener.save(new SPacketCollectItem(event.pickedUp.getEntityId(), event.player.getEntityId(),
|
packetListener.save(new SPacketCollectItem(event.pickedUp.getEntityId(), event.player.getEntityId(),
|
||||||
event.pickedUp.getEntityItem().getMaxStackSize()));
|
event.pickedUp.getItem().getMaxStackSize()));
|
||||||
} catch(Exception e) {
|
} catch(Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,4 +24,9 @@ public abstract class MixinNetHandlerLoginClient {
|
|||||||
public void replayModRecording_initiateRecording(CallbackInfo cb) {
|
public void replayModRecording_initiateRecording(CallbackInfo cb) {
|
||||||
ReplayModRecording.instance.initiateRecording(networkManager);
|
ReplayModRecording.instance.initiateRecording(networkManager);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Inject(method = "handleLoginSuccess", at=@At("RETURN"))
|
||||||
|
public void replayModRecording_raceConditionWorkAround(CallbackInfo cb) {
|
||||||
|
networkManager.channel().config().setAutoRead(true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,11 @@
|
|||||||
package com.replaymod.recording.mixin;
|
package com.replaymod.recording.mixin;
|
||||||
|
|
||||||
import com.replaymod.recording.handler.FMLHandshakeFilter;
|
import com.replaymod.recording.handler.FMLHandshakeFilter;
|
||||||
|
import io.netty.channel.ChannelConfig;
|
||||||
import io.netty.channel.ChannelPipeline;
|
import io.netty.channel.ChannelPipeline;
|
||||||
import io.netty.channel.embedded.EmbeddedChannel;
|
import io.netty.channel.embedded.EmbeddedChannel;
|
||||||
|
import net.minecraft.network.EnumConnectionState;
|
||||||
|
import net.minecraft.network.NetworkManager;
|
||||||
import net.minecraftforge.fml.common.network.handshake.FMLHandshakeCodec;
|
import net.minecraftforge.fml.common.network.handshake.FMLHandshakeCodec;
|
||||||
import net.minecraftforge.fml.common.network.handshake.NetworkDispatcher;
|
import net.minecraftforge.fml.common.network.handshake.NetworkDispatcher;
|
||||||
import net.minecraftforge.fml.relauncher.Side;
|
import net.minecraftforge.fml.relauncher.Side;
|
||||||
@@ -10,6 +13,7 @@ import org.spongepowered.asm.mixin.Mixin;
|
|||||||
import org.spongepowered.asm.mixin.Shadow;
|
import org.spongepowered.asm.mixin.Shadow;
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
import org.spongepowered.asm.mixin.injection.Inject;
|
import org.spongepowered.asm.mixin.injection.Inject;
|
||||||
|
import org.spongepowered.asm.mixin.injection.Redirect;
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||||
|
|
||||||
@Mixin(value = NetworkDispatcher.class, remap = false)
|
@Mixin(value = NetworkDispatcher.class, remap = false)
|
||||||
@@ -43,4 +47,17 @@ public abstract class MixinNetworkDispatcher {
|
|||||||
"replaymod_filter", new FMLHandshakeFilter());
|
"replaymod_filter", new FMLHandshakeFilter());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Redirect(method = "clientListenForServerHandshake", at = @At(value = "INVOKE", remap = true, target =
|
||||||
|
"Lnet/minecraft/network/NetworkManager;setConnectionState(Lnet/minecraft/network/EnumConnectionState;)V"))
|
||||||
|
public void replayModRecording_raceConditionWorkAround1(NetworkManager self, EnumConnectionState ignored) { }
|
||||||
|
|
||||||
|
@Redirect(method = "insertIntoChannel", at = @At(value = "INVOKE", target =
|
||||||
|
"Lio/netty/channel/ChannelConfig;setAutoRead(Z)Lio/netty/channel/ChannelConfig;"))
|
||||||
|
public ChannelConfig replayModRecording_raceConditionWorkAround2(ChannelConfig self, boolean autoRead) {
|
||||||
|
if (side == Side.CLIENT) {
|
||||||
|
autoRead = false;
|
||||||
|
}
|
||||||
|
return self.setAutoRead(autoRead);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -202,7 +202,7 @@ public class PacketListener extends ChannelInboundHandlerAdapter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
private byte[] getPacketData(Packet packet) throws IOException {
|
private byte[] getPacketData(Packet packet) throws Exception {
|
||||||
if (packet instanceof SPacketSpawnMob) {
|
if (packet instanceof SPacketSpawnMob) {
|
||||||
SPacketSpawnMob p = (SPacketSpawnMob) packet;
|
SPacketSpawnMob p = (SPacketSpawnMob) packet;
|
||||||
if (p.dataManager == null) {
|
if (p.dataManager == null) {
|
||||||
|
|||||||
@@ -88,7 +88,7 @@ public class ResourcePackRecorder {
|
|||||||
|
|
||||||
if (levelDir.isFile()) {
|
if (levelDir.isFile()) {
|
||||||
netManager.sendPacket(new CPacketResourcePackStatus(CPacketResourcePackStatus.Action.ACCEPTED));
|
netManager.sendPacket(new CPacketResourcePackStatus(CPacketResourcePackStatus.Action.ACCEPTED));
|
||||||
Futures.addCallback(mc.getResourcePackRepository().setResourcePackInstance(levelDir), new FutureCallback<Object>() {
|
Futures.addCallback(mc.getResourcePackRepository().setServerResourcePack(levelDir), new FutureCallback<Object>() {
|
||||||
@Override
|
@Override
|
||||||
public void onSuccess(Object result) {
|
public void onSuccess(Object result) {
|
||||||
recordResourcePack(levelDir, requestId);
|
recordResourcePack(levelDir, requestId);
|
||||||
@@ -174,7 +174,7 @@ public class ResourcePackRecorder {
|
|||||||
String fileHash = Hashing.sha1().hashBytes(Files.toByteArray(file)).toString();
|
String fileHash = Hashing.sha1().hashBytes(Files.toByteArray(file)).toString();
|
||||||
if (fileHash.equals(hash)) {
|
if (fileHash.equals(hash)) {
|
||||||
recordResourcePack(file, requestId);
|
recordResourcePack(file, requestId);
|
||||||
return repo.setResourcePackInstance(file);
|
return repo.setServerResourcePack(file);
|
||||||
}
|
}
|
||||||
|
|
||||||
logger.warn("File " + file + " had wrong hash (expected " + hash + ", found " + fileHash + "). Deleting it.");
|
logger.warn("File " + file + " had wrong hash (expected " + hash + ", found " + fileHash + "). Deleting it.");
|
||||||
@@ -196,7 +196,7 @@ public class ResourcePackRecorder {
|
|||||||
@Override
|
@Override
|
||||||
public void onSuccess(Object value) {
|
public void onSuccess(Object value) {
|
||||||
recordResourcePack(file, requestId);
|
recordResourcePack(file, requestId);
|
||||||
repo.setResourcePackInstance(file);
|
repo.setServerResourcePack(file);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import com.replaymod.render.hooks.EntityRendererHandler;
|
|||||||
import net.minecraft.client.Minecraft;
|
import net.minecraft.client.Minecraft;
|
||||||
import net.minecraft.client.particle.Particle;
|
import net.minecraft.client.particle.Particle;
|
||||||
import net.minecraft.client.particle.ParticleManager;
|
import net.minecraft.client.particle.ParticleManager;
|
||||||
import net.minecraft.client.renderer.VertexBuffer;
|
import net.minecraft.client.renderer.BufferBuilder;
|
||||||
import net.minecraft.entity.Entity;
|
import net.minecraft.entity.Entity;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
@@ -12,19 +12,19 @@ import org.spongepowered.asm.mixin.injection.Redirect;
|
|||||||
|
|
||||||
@Mixin(ParticleManager.class)
|
@Mixin(ParticleManager.class)
|
||||||
public abstract class MixinParticleManager {
|
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"))
|
@Redirect(method = "renderParticles", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/particle/Particle;renderParticle(Lnet/minecraft/client/renderer/BufferBuilder;Lnet/minecraft/entity/Entity;FFFFFF)V"))
|
||||||
private void renderNormalParticle(Particle particle, VertexBuffer vertexBuffer, Entity view, float partialTicks,
|
private void renderNormalParticle(Particle particle, BufferBuilder vertexBuffer, Entity view, float partialTicks,
|
||||||
float rotX, float rotXZ, float rotZ, float rotYZ, float rotXY) {
|
float rotX, float rotXZ, float rotZ, float rotYZ, float rotXY) {
|
||||||
renderParticle(particle, vertexBuffer, view, partialTicks, rotX, rotXZ, rotZ, rotYZ, 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"))
|
@Redirect(method = "renderLitParticles", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/particle/Particle;renderParticle(Lnet/minecraft/client/renderer/BufferBuilder;Lnet/minecraft/entity/Entity;FFFFFF)V"))
|
||||||
private void renderLitParticle(Particle particle, VertexBuffer vertexBuffer, Entity view, float partialTicks,
|
private void renderLitParticle(Particle particle, BufferBuilder vertexBuffer, Entity view, float partialTicks,
|
||||||
float rotX, float rotXZ, float rotZ, float rotYZ, float rotXY) {
|
float rotX, float rotXZ, float rotZ, float rotYZ, float rotXY) {
|
||||||
renderParticle(particle, vertexBuffer, view, partialTicks, rotX, rotXZ, rotZ, rotYZ, rotXY);
|
renderParticle(particle, vertexBuffer, view, partialTicks, rotX, rotXZ, rotZ, rotYZ, rotXY);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void renderParticle(Particle particle, VertexBuffer vertexBuffer, Entity view, float partialTicks,
|
private void renderParticle(Particle particle, BufferBuilder vertexBuffer, Entity view, float partialTicks,
|
||||||
float rotX, float rotXZ, float rotZ, float rotYZ, float rotXY) {
|
float rotX, float rotXZ, float rotZ, float rotYZ, float rotXY) {
|
||||||
EntityRendererHandler handler = ((EntityRendererHandler.IEntityRenderer) Minecraft.getMinecraft().entityRenderer).replayModRender_getHandler();
|
EntityRendererHandler handler = ((EntityRendererHandler.IEntityRenderer) Minecraft.getMinecraft().entityRenderer).replayModRender_getHandler();
|
||||||
if (handler != null && handler.omnidirectional) {
|
if (handler != null && handler.omnidirectional) {
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package com.replaymod.render.rendering;
|
package com.replaymod.render.rendering;
|
||||||
|
|
||||||
|
import com.replaymod.core.utils.WrappedTimer;
|
||||||
import com.replaymod.pathing.player.AbstractTimelinePlayer;
|
import com.replaymod.pathing.player.AbstractTimelinePlayer;
|
||||||
import com.replaymod.pathing.player.ReplayTimer;
|
import com.replaymod.pathing.player.ReplayTimer;
|
||||||
import com.replaymod.pathing.properties.TimestampProperty;
|
import com.replaymod.pathing.properties.TimestampProperty;
|
||||||
@@ -113,8 +114,8 @@ public class VideoRenderer implements RenderInfo {
|
|||||||
|
|
||||||
if (videoStart > 1000) {
|
if (videoStart > 1000) {
|
||||||
int replayTime = videoStart - 1000;
|
int replayTime = videoStart - 1000;
|
||||||
timer.elapsedPartialTicks = timer.renderPartialTicks = 0;
|
timer.renderPartialTicks = 0;
|
||||||
timer.timerSpeed = 1;
|
timer.tickLength = WrappedTimer.DEFAULT_MS_PER_TICK;
|
||||||
while (replayTime < videoStart) {
|
while (replayTime < videoStart) {
|
||||||
timer.elapsedTicks = 1;
|
timer.elapsedTicks = 1;
|
||||||
replayTime += 50;
|
replayTime += 50;
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package com.replaymod.replay;
|
|||||||
import com.google.common.base.Preconditions;
|
import com.google.common.base.Preconditions;
|
||||||
import com.mojang.authlib.GameProfile;
|
import com.mojang.authlib.GameProfile;
|
||||||
import com.replaymod.core.utils.Restrictions;
|
import com.replaymod.core.utils.Restrictions;
|
||||||
|
import com.replaymod.core.utils.WrappedTimer;
|
||||||
import com.replaymod.replay.camera.CameraEntity;
|
import com.replaymod.replay.camera.CameraEntity;
|
||||||
import com.replaymod.replay.camera.SpectatorCameraController;
|
import com.replaymod.replay.camera.SpectatorCameraController;
|
||||||
import com.replaymod.replay.events.ReplayCloseEvent;
|
import com.replaymod.replay.events.ReplayCloseEvent;
|
||||||
@@ -119,7 +120,7 @@ public class ReplayHandler {
|
|||||||
mc.loadWorld(null);
|
mc.loadWorld(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
mc.timer.timerSpeed = 1;
|
mc.timer.tickLength = WrappedTimer.DEFAULT_MS_PER_TICK;
|
||||||
overlay.setVisible(false);
|
overlay.setVisible(false);
|
||||||
|
|
||||||
ReplayModReplay.instance.replayHandler = null;
|
ReplayModReplay.instance.replayHandler = null;
|
||||||
@@ -143,13 +144,14 @@ public class ReplayHandler {
|
|||||||
networkManager.setNetHandler(netHandlerPlayClient);
|
networkManager.setNetHandler(netHandlerPlayClient);
|
||||||
FMLClientHandler.instance().setPlayClient(netHandlerPlayClient);
|
FMLClientHandler.instance().setPlayClient(netHandlerPlayClient);
|
||||||
|
|
||||||
channel = new EmbeddedChannel(networkManager);
|
channel = new EmbeddedChannel();
|
||||||
NetworkDispatcher networkDispatcher = new NetworkDispatcher(networkManager);
|
NetworkDispatcher networkDispatcher = new NetworkDispatcher(networkManager);
|
||||||
channel.attr(NetworkDispatcher.FML_DISPATCHER).set(networkDispatcher);
|
channel.attr(NetworkDispatcher.FML_DISPATCHER).set(networkDispatcher);
|
||||||
|
|
||||||
channel.pipeline().addFirst("ReplayModReplay_replaySender", replaySender);
|
channel.pipeline().addFirst("ReplayModReplay_replaySender", replaySender);
|
||||||
channel.pipeline().addAfter("ReplayModReplay_replaySender", "fml:packet_handler", networkDispatcher);
|
channel.pipeline().addLast("packet_handler", networkManager);
|
||||||
channel.pipeline().fireChannelActive();
|
channel.pipeline().fireChannelActive();
|
||||||
|
networkDispatcher.clientToServerHandshake();
|
||||||
}
|
}
|
||||||
|
|
||||||
public ReplayFile getReplayFile() {
|
public ReplayFile getReplayFile() {
|
||||||
@@ -301,7 +303,7 @@ public class ReplayHandler {
|
|||||||
@Override
|
@Override
|
||||||
public void drawScreen(int mouseX, int mouseY, float partialTicks) {
|
public void drawScreen(int mouseX, int mouseY, float partialTicks) {
|
||||||
drawBackground(0);
|
drawBackground(0);
|
||||||
drawCenteredString(fontRendererObj, I18n.format("replaymod.gui.pleasewait"),
|
drawCenteredString(fontRenderer, I18n.format("replaymod.gui.pleasewait"),
|
||||||
width / 2, height / 2, 0xffffffff);
|
width / 2, height / 2, 0xffffffff);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import com.google.common.base.Preconditions;
|
|||||||
import com.google.common.io.Files;
|
import com.google.common.io.Files;
|
||||||
import com.replaymod.core.ReplayMod;
|
import com.replaymod.core.ReplayMod;
|
||||||
import com.replaymod.core.utils.Restrictions;
|
import com.replaymod.core.utils.Restrictions;
|
||||||
|
import com.replaymod.core.utils.WrappedTimer;
|
||||||
import com.replaymod.replay.camera.CameraEntity;
|
import com.replaymod.replay.camera.CameraEntity;
|
||||||
import com.replaymod.replaystudio.replay.ReplayFile;
|
import com.replaymod.replaystudio.replay.ReplayFile;
|
||||||
import io.netty.buffer.ByteBuf;
|
import io.netty.buffer.ByteBuf;
|
||||||
@@ -49,6 +50,9 @@ public class ReplaySender extends ChannelDuplexHandler {
|
|||||||
*/
|
*/
|
||||||
private static final List<Class> BAD_PACKETS = Arrays.<Class>asList(
|
private static final List<Class> BAD_PACKETS = Arrays.<Class>asList(
|
||||||
// TODO Update possibly more?
|
// TODO Update possibly more?
|
||||||
|
SPacketRecipeBook.class,
|
||||||
|
SPacketAdvancementInfo.class,
|
||||||
|
SPacketSelectAdvancementsTab.class,
|
||||||
SPacketUpdateHealth.class,
|
SPacketUpdateHealth.class,
|
||||||
SPacketOpenWindow.class,
|
SPacketOpenWindow.class,
|
||||||
SPacketCloseWindow.class,
|
SPacketCloseWindow.class,
|
||||||
@@ -404,7 +408,7 @@ public class ReplaySender extends ChannelDuplexHandler {
|
|||||||
if (!file.exists()) {
|
if (!file.exists()) {
|
||||||
IOUtils.copy(replayFile.getResourcePack(hash).get(), new FileOutputStream(file));
|
IOUtils.copy(replayFile.getResourcePack(hash).get(), new FileOutputStream(file));
|
||||||
}
|
}
|
||||||
mc.getResourcePackRepository().setResourcePackInstance(file);
|
mc.getResourcePackRepository().setServerResourcePack(file);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
@@ -508,7 +512,7 @@ public class ReplaySender extends ChannelDuplexHandler {
|
|||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
public void channelActive(ChannelHandlerContext ctx) throws Exception {
|
public void channelActive(ChannelHandlerContext ctx) throws Exception {
|
||||||
this.ctx = ctx;
|
this.ctx = ctx;
|
||||||
ctx.attr(NetworkManager.PROTOCOL_ATTRIBUTE_KEY).set(EnumConnectionState.PLAY);
|
ctx.channel().attr(NetworkManager.PROTOCOL_ATTRIBUTE_KEY).set(EnumConnectionState.PLAY);
|
||||||
super.channelActive(ctx);
|
super.channelActive(ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -536,7 +540,7 @@ public class ReplaySender extends ChannelDuplexHandler {
|
|||||||
* @return {@code true} if it is paused, {@code false} otherwise
|
* @return {@code true} if it is paused, {@code false} otherwise
|
||||||
*/
|
*/
|
||||||
public boolean paused() {
|
public boolean paused() {
|
||||||
return mc.timer.timerSpeed == 0;
|
return mc.timer.tickLength == Float.POSITIVE_INFINITY;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -556,7 +560,7 @@ public class ReplaySender extends ChannelDuplexHandler {
|
|||||||
*/
|
*/
|
||||||
public void setReplaySpeed(final double d) {
|
public void setReplaySpeed(final double d) {
|
||||||
if(d != 0) this.replaySpeed = d;
|
if(d != 0) this.replaySpeed = d;
|
||||||
mc.timer.timerSpeed = (float) d;
|
mc.timer.tickLength = WrappedTimer.DEFAULT_MS_PER_TICK / (float) d;
|
||||||
}
|
}
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ import net.minecraft.entity.EntityLiving;
|
|||||||
import net.minecraft.entity.item.EntityItemFrame;
|
import net.minecraft.entity.item.EntityItemFrame;
|
||||||
import net.minecraft.entity.player.EntityPlayer;
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
import net.minecraft.inventory.EntityEquipmentSlot;
|
import net.minecraft.inventory.EntityEquipmentSlot;
|
||||||
|
import net.minecraft.stats.RecipeBook;
|
||||||
import net.minecraft.stats.StatisticsManager;
|
import net.minecraft.stats.StatisticsManager;
|
||||||
import net.minecraft.util.EnumHand;
|
import net.minecraft.util.EnumHand;
|
||||||
import net.minecraft.util.ResourceLocation;
|
import net.minecraft.util.ResourceLocation;
|
||||||
@@ -68,8 +69,8 @@ public class CameraEntity extends EntityPlayerSP {
|
|||||||
*/
|
*/
|
||||||
private final EventHandler eventHandler = new EventHandler();
|
private final EventHandler eventHandler = new EventHandler();
|
||||||
|
|
||||||
public CameraEntity(Minecraft mcIn, World worldIn, NetHandlerPlayClient netHandlerPlayClient, StatisticsManager statisticsManager) {
|
public CameraEntity(Minecraft mcIn, World worldIn, NetHandlerPlayClient netHandlerPlayClient, StatisticsManager statisticsManager, RecipeBook recipeBook) {
|
||||||
super(mcIn, worldIn, netHandlerPlayClient, statisticsManager);
|
super(mcIn, worldIn, netHandlerPlayClient, statisticsManager, recipeBook);
|
||||||
MinecraftForge.EVENT_BUS.register(eventHandler);
|
MinecraftForge.EVENT_BUS.register(eventHandler);
|
||||||
if (ReplayModReplay.instance.getReplayHandler().getSpectatedUUID() == null) {
|
if (ReplayModReplay.instance.getReplayHandler().getSpectatedUUID() == null) {
|
||||||
cameraController = ReplayModReplay.instance.createCameraController(this);
|
cameraController = ReplayModReplay.instance.createCameraController(this);
|
||||||
|
|||||||
@@ -132,7 +132,7 @@ public class ClassicCameraController implements CameraController {
|
|||||||
Vec3d movement = direction.normalize();
|
Vec3d movement = direction.normalize();
|
||||||
double factor = motion * (frac / 1000D);
|
double factor = motion * (frac / 1000D);
|
||||||
|
|
||||||
camera.moveCamera(movement.xCoord * factor, movement.yCoord * factor, movement.zCoord * factor);
|
camera.moveCamera(movement.x * factor, movement.y * factor, movement.z * factor);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setMovement(MoveDirection dir) {
|
private void setMovement(MoveDirection dir) {
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ import org.apache.commons.io.FileUtils;
|
|||||||
import org.apache.commons.io.IOCase;
|
import org.apache.commons.io.IOCase;
|
||||||
import org.apache.commons.io.filefilter.SuffixFileFilter;
|
import org.apache.commons.io.filefilter.SuffixFileFilter;
|
||||||
import org.apache.logging.log4j.LogManager;
|
import org.apache.logging.log4j.LogManager;
|
||||||
import org.apache.logging.log4j.core.helpers.Strings;
|
import org.apache.logging.log4j.util.Strings;
|
||||||
import org.lwjgl.Sys;
|
import org.lwjgl.Sys;
|
||||||
import org.lwjgl.util.Dimension;
|
import org.lwjgl.util.Dimension;
|
||||||
import org.lwjgl.util.ReadableDimension;
|
import org.lwjgl.util.ReadableDimension;
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ import java.util.List;
|
|||||||
|
|
||||||
public class GuiHandler {
|
public class GuiHandler {
|
||||||
private static final int BUTTON_EXIT_SERVER = 1;
|
private static final int BUTTON_EXIT_SERVER = 1;
|
||||||
private static final int BUTTON_ACHIEVEMENTS = 5;
|
private static final int BUTTON_ADVANCEMENTS = 5;
|
||||||
private static final int BUTTON_STATS = 6;
|
private static final int BUTTON_STATS = 6;
|
||||||
private static final int BUTTON_OPEN_TO_LAN = 7;
|
private static final int BUTTON_OPEN_TO_LAN = 7;
|
||||||
|
|
||||||
@@ -55,8 +55,8 @@ public class GuiHandler {
|
|||||||
b.displayString = I18n.format("replaymod.gui.exit");
|
b.displayString = I18n.format("replaymod.gui.exit");
|
||||||
b.id = BUTTON_EXIT_REPLAY;
|
b.id = BUTTON_EXIT_REPLAY;
|
||||||
break;
|
break;
|
||||||
// Remove "Achievements", "Stats" and "Open to LAN" buttons
|
// Remove "Advancements", "Stats" and "Open to LAN" buttons
|
||||||
case BUTTON_ACHIEVEMENTS:
|
case BUTTON_ADVANCEMENTS:
|
||||||
buttonList.remove(achievements = b);
|
buttonList.remove(achievements = b);
|
||||||
break;
|
break;
|
||||||
case BUTTON_STATS:
|
case BUTTON_STATS:
|
||||||
@@ -68,12 +68,12 @@ public class GuiHandler {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (achievements != null && stats != null) {
|
if (achievements != null && stats != null) {
|
||||||
moveAllButtonsDirectlyBelowUpwards(buttonList, achievements.yPosition,
|
moveAllButtonsDirectlyBelowUpwards(buttonList, achievements.y,
|
||||||
achievements.xPosition, stats.xPosition + stats.width);
|
achievements.x, stats.x + stats.width);
|
||||||
}
|
}
|
||||||
if (openToLan != null) {
|
if (openToLan != null) {
|
||||||
moveAllButtonsDirectlyBelowUpwards(buttonList, openToLan.yPosition,
|
moveAllButtonsDirectlyBelowUpwards(buttonList, openToLan.y,
|
||||||
openToLan.xPosition, openToLan.xPosition + openToLan.width);
|
openToLan.x, openToLan.x + openToLan.width);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -87,8 +87,8 @@ public class GuiHandler {
|
|||||||
*/
|
*/
|
||||||
private void moveAllButtonsDirectlyBelowUpwards(List<GuiButton> buttons, int belowY, int xStart, int xEnd) {
|
private void moveAllButtonsDirectlyBelowUpwards(List<GuiButton> buttons, int belowY, int xStart, int xEnd) {
|
||||||
for (GuiButton button : buttons) {
|
for (GuiButton button : buttons) {
|
||||||
if (button.yPosition >= belowY && button.xPosition <= xEnd && button.xPosition + button.width >= xStart) {
|
if (button.y >= belowY && button.x <= xEnd && button.x + button.width >= xStart) {
|
||||||
button.yPosition -= 24;
|
button.y -= 24;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import net.minecraft.client.Minecraft;
|
|||||||
import net.minecraft.client.entity.EntityPlayerSP;
|
import net.minecraft.client.entity.EntityPlayerSP;
|
||||||
import net.minecraft.client.multiplayer.PlayerControllerMP;
|
import net.minecraft.client.multiplayer.PlayerControllerMP;
|
||||||
import net.minecraft.client.network.NetHandlerPlayClient;
|
import net.minecraft.client.network.NetHandlerPlayClient;
|
||||||
|
import net.minecraft.stats.RecipeBook;
|
||||||
import net.minecraft.stats.StatisticsManager;
|
import net.minecraft.stats.StatisticsManager;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
@@ -23,10 +24,10 @@ public abstract class MixinPlayerControllerMP {
|
|||||||
@Shadow
|
@Shadow
|
||||||
private NetHandlerPlayClient connection;
|
private NetHandlerPlayClient connection;
|
||||||
|
|
||||||
@Inject(method = "createClientPlayer", at=@At("HEAD"), cancellable = true)
|
@Inject(method = "func_192830_a", at=@At("HEAD"), cancellable = true)
|
||||||
private void replayModReplay_createReplayCamera(World worldIn, StatisticsManager statisticsManager, CallbackInfoReturnable<EntityPlayerSP> ci) {
|
private void replayModReplay_createReplayCamera(World worldIn, StatisticsManager statisticsManager, RecipeBook recipeBook, CallbackInfoReturnable<EntityPlayerSP> ci) {
|
||||||
if (ReplayModReplay.instance.getReplayHandler() != null) {
|
if (ReplayModReplay.instance.getReplayHandler() != null) {
|
||||||
ci.setReturnValue(new CameraEntity(mc, worldIn, connection, statisticsManager));
|
ci.setReturnValue(new CameraEntity(mc, worldIn, connection, statisticsManager, recipeBook));
|
||||||
ci.cancel();
|
ci.cancel();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -658,7 +658,7 @@ public class SPTimeline implements PathingRegistry {
|
|||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
CrashReport crash = CrashReport.makeCrashReport(e, "Serializing interpolator");
|
CrashReport crash = CrashReport.makeCrashReport(e, "Serializing interpolator");
|
||||||
CrashReportCategory category = crash.makeCategory("Serializing interpolator");
|
CrashReportCategory category = crash.makeCategory("Serializing interpolator");
|
||||||
category.setDetail("Interpolator", interpolator::toString);
|
category.addDetail("Interpolator", interpolator::toString);
|
||||||
throw new ReportedException(crash);
|
throw new ReportedException(crash);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -15,9 +15,9 @@ import com.replaymod.simplepathing.ReplayModSimplePathing;
|
|||||||
import com.replaymod.simplepathing.SPTimeline;
|
import com.replaymod.simplepathing.SPTimeline;
|
||||||
import com.replaymod.simplepathing.gui.GuiPathing;
|
import com.replaymod.simplepathing.gui.GuiPathing;
|
||||||
import net.minecraft.client.Minecraft;
|
import net.minecraft.client.Minecraft;
|
||||||
|
import net.minecraft.client.renderer.BufferBuilder;
|
||||||
import net.minecraft.client.renderer.GlStateManager;
|
import net.minecraft.client.renderer.GlStateManager;
|
||||||
import net.minecraft.client.renderer.Tessellator;
|
import net.minecraft.client.renderer.Tessellator;
|
||||||
import net.minecraft.client.renderer.VertexBuffer;
|
|
||||||
import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
|
import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
|
||||||
import net.minecraft.entity.Entity;
|
import net.minecraft.entity.Entity;
|
||||||
import net.minecraft.util.ResourceLocation;
|
import net.minecraft.util.ResourceLocation;
|
||||||
@@ -204,7 +204,7 @@ public class PathPreviewRenderer {
|
|||||||
if (distanceSquared(view, pos2) > renderDistanceSquared) return;
|
if (distanceSquared(view, pos2) > renderDistanceSquared) return;
|
||||||
|
|
||||||
Tessellator tessellator = Tessellator.getInstance();
|
Tessellator tessellator = Tessellator.getInstance();
|
||||||
VertexBuffer vertexBuffer = tessellator.getBuffer();
|
BufferBuilder vertexBuffer = tessellator.getBuffer();
|
||||||
vertexBuffer.setTranslation(-view.getLeft(), -view.getMiddle(), -view.getRight());
|
vertexBuffer.setTranslation(-view.getLeft(), -view.getMiddle(), -view.getRight());
|
||||||
|
|
||||||
vertexBuffer.begin(GL11.GL_LINES, DefaultVertexFormats.POSITION_COLOR);
|
vertexBuffer.begin(GL11.GL_LINES, DefaultVertexFormats.POSITION_COLOR);
|
||||||
@@ -231,7 +231,7 @@ public class PathPreviewRenderer {
|
|||||||
Triple<Double, Double, Double> pos,
|
Triple<Double, Double, Double> pos,
|
||||||
Keyframe keyframe) {
|
Keyframe keyframe) {
|
||||||
Tessellator tessellator = Tessellator.getInstance();
|
Tessellator tessellator = Tessellator.getInstance();
|
||||||
VertexBuffer vertexBuffer = tessellator.getBuffer();
|
BufferBuilder vertexBuffer = tessellator.getBuffer();
|
||||||
vertexBuffer.setTranslation(0, 0, 0);
|
vertexBuffer.setTranslation(0, 0, 0);
|
||||||
|
|
||||||
mc.renderEngine.bindTexture(TEXTURE);
|
mc.renderEngine.bindTexture(TEXTURE);
|
||||||
@@ -280,7 +280,7 @@ public class PathPreviewRenderer {
|
|||||||
Triple<Double, Double, Double> pos,
|
Triple<Double, Double, Double> pos,
|
||||||
Triple<Float, Float, Float> rot) {
|
Triple<Float, Float, Float> rot) {
|
||||||
Tessellator tessellator = Tessellator.getInstance();
|
Tessellator tessellator = Tessellator.getInstance();
|
||||||
VertexBuffer vertexBuffer = tessellator.getBuffer();
|
BufferBuilder vertexBuffer = tessellator.getBuffer();
|
||||||
vertexBuffer.setTranslation(0, 0, 0);
|
vertexBuffer.setTranslation(0, 0, 0);
|
||||||
|
|
||||||
mc.renderEngine.bindTexture(CAMERA_HEAD);
|
mc.renderEngine.bindTexture(CAMERA_HEAD);
|
||||||
|
|||||||
Reference in New Issue
Block a user