From 40e1d850dac0adc7ea3e2130ded83e7b0ed2abe3 Mon Sep 17 00:00:00 2001 From: johni0702 Date: Fri, 14 Apr 2017 17:12:24 +0200 Subject: [PATCH] Fix crash when saving the last keyframe in the edit gui (fixes #61) --- .../core/ReplayModIntegrationTest.java | 2 ++ .../core/regression/RegressionTest61.java | 35 +++++++++++++++++++ .../simplepathing/gui/GuiEditKeyframe.java | 4 +++ 3 files changed, 41 insertions(+) create mode 100644 src/integration-test/java/com/replaymod/core/regression/RegressionTest61.java diff --git a/src/integration-test/java/com/replaymod/core/ReplayModIntegrationTest.java b/src/integration-test/java/com/replaymod/core/ReplayModIntegrationTest.java index 6dd71cfe..99fd80b0 100644 --- a/src/integration-test/java/com/replaymod/core/ReplayModIntegrationTest.java +++ b/src/integration-test/java/com/replaymod/core/ReplayModIntegrationTest.java @@ -1,6 +1,7 @@ package com.replaymod.core; import com.replaymod.core.regression.RegressionTest60; +import com.replaymod.core.regression.RegressionTest61; import com.replaymod.core.regression.RegressionTest62; import com.replaymod.extra.DownloadOpenEye; import com.replaymod.online.SkipLogin; @@ -45,6 +46,7 @@ public class ReplayModIntegrationTest { new LoadReplay(), new RegressionTest60(), + new RegressionTest61(), new RegressionTest62(), // new AbstractTask() {}, // Uncomment to not exit on success (useful for writing more tests) diff --git a/src/integration-test/java/com/replaymod/core/regression/RegressionTest61.java b/src/integration-test/java/com/replaymod/core/regression/RegressionTest61.java new file mode 100644 index 00000000..5b5b4951 --- /dev/null +++ b/src/integration-test/java/com/replaymod/core/regression/RegressionTest61.java @@ -0,0 +1,35 @@ +package com.replaymod.core.regression; + +import com.replaymod.core.AbstractTask; +import com.replaymod.core.CompositeTask; +import com.replaymod.core.Task; +import com.replaymod.replay.overlay.OverlayGui; +import com.replaymod.simplepathing.GuiPathingTasks; +import com.replaymod.simplepathing.gui.GuiEditKeyframe; + +/** + * Regression test: #61 NPE when saving in edit keyframe gui of last keyframe + */ +public class RegressionTest61 extends CompositeTask { + public RegressionTest61() { + super(new Task[]{ + OverlayGui.whileOpened( + // Place keyframe + Task.click(130, 50), + new GuiPathingTasks.ClickPositionKeyframeButton(), + AbstractTask.create(task -> { + // Double click keyframe + task.click(130, 50); + task.click(130, 50); + task.expectGui(GuiEditKeyframe.Position.class, gui -> { + task.click(gui.saveButton); + task.expectPopupClosed(() -> task.future.set(null)); + }); + }), + // Place second spectator keyframe + new GuiPathingTasks.ClickPositionKeyframeButton() + ), + new GuiPathingTasks.ClearKeyframeTimeline(), + }); + } +} diff --git a/src/main/java/com/replaymod/simplepathing/gui/GuiEditKeyframe.java b/src/main/java/com/replaymod/simplepathing/gui/GuiEditKeyframe.java index 0e74e9f2..4a4747c0 100644 --- a/src/main/java/com/replaymod/simplepathing/gui/GuiEditKeyframe.java +++ b/src/main/java/com/replaymod/simplepathing/gui/GuiEditKeyframe.java @@ -255,6 +255,10 @@ public abstract class GuiEditKeyframe> extends Abst xField.getDouble(), yField.getDouble(), zField.getDouble(), yawField.getFloat(), pitchField.getFloat(), rollField.getFloat() ); + if (interpolationPanel.getSettingsPanel() == null) { + // The last keyframe doesn't have interpolator settings because there is no segment following it + return positionChange; + } Interpolator interpolator = interpolationPanel.getSettingsPanel().createInterpolator(); if (interpolationPanel.getInterpolatorType() == InterpolatorType.DEFAULT) { return CombinedChange.createFromApplied(positionChange, timeline.setInterpolatorToDefault(time),