Use component like system for gui overlay

Add missing abort path replay button
This commit is contained in:
johni0702
2015-05-31 20:48:04 +02:00
parent 53bb338d1b
commit b3451ed7fd
11 changed files with 443 additions and 183 deletions

View File

@@ -47,7 +47,7 @@ public class ReplayMod {
public static final ApiClient apiClient = new ApiClient(); public static final ApiClient apiClient = new ApiClient();
private static final Minecraft mc = Minecraft.getMinecraft(); private static final Minecraft mc = Minecraft.getMinecraft();
public static GuiEventHandler guiEventHandler; public static GuiEventHandler guiEventHandler;
public static GuiReplayOverlay overlay = new GuiReplayOverlay(); public static GuiReplayOverlay overlay;
public static ReplaySettings replaySettings; public static ReplaySettings replaySettings;
public static Configuration config; public static Configuration config;
public static boolean firstMainMenu = true; public static boolean firstMainMenu = true;
@@ -89,6 +89,8 @@ public class ReplayMod {
@EventHandler @EventHandler
public void init(FMLInitializationEvent event) { public void init(FMLInitializationEvent event) {
overlay = new GuiReplayOverlay();
FMLCommonHandler.instance().bus().register(new ConnectionEventHandler()); FMLCommonHandler.instance().bus().register(new ConnectionEventHandler());
MinecraftForge.EVENT_BUS.register(guiEventHandler = new GuiEventHandler()); MinecraftForge.EVENT_BUS.register(guiEventHandler = new GuiEventHandler());

View File

@@ -18,17 +18,17 @@ public class GuiMouseInput extends GuiScreen {
@Override @Override
protected void mouseClicked(int mouseX, int mouseY, int mouseButton) throws IOException { protected void mouseClicked(int mouseX, int mouseY, int mouseButton) throws IOException {
overlay.mouseClicked(mouseX, mouseY); overlay.mouseClicked(mouseX, mouseY, mouseButton);
} }
@Override @Override
protected void mouseReleased(int mouseX, int mouseY, int state) { protected void mouseReleased(int mouseX, int mouseY, int state) {
overlay.mouseReleased(mouseX, mouseY); overlay.mouseReleased(mouseX, mouseY, state);
} }
@Override @Override
protected void mouseClickMove(int mouseX, int mouseY, int clickedMouseButton, long timeSinceLastClick) { protected void mouseClickMove(int mouseX, int mouseY, int clickedMouseButton, long timeSinceLastClick) {
overlay.mouseDrag(mouseX, mouseY); overlay.mouseDrag(mouseX, mouseY, clickedMouseButton);
} }
@Override @Override

View File

@@ -1,6 +1,7 @@
package eu.crushedpixel.replaymod.gui; package eu.crushedpixel.replaymod.gui;
import eu.crushedpixel.replaymod.ReplayMod; import eu.crushedpixel.replaymod.ReplayMod;
import eu.crushedpixel.replaymod.gui.elements.GuiElement;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.gui.FontRenderer;
import net.minecraft.client.gui.GuiButton; import net.minecraft.client.gui.GuiButton;
@@ -8,7 +9,7 @@ import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.util.MathHelper; import net.minecraft.util.MathHelper;
import net.minecraftforge.fml.client.FMLClientHandler; import net.minecraftforge.fml.client.FMLClientHandler;
public class GuiReplaySpeedSlider extends GuiButton { public class GuiReplaySpeedSlider extends GuiButton implements GuiElement {
private float sliderValue; private float sliderValue;
@@ -18,7 +19,6 @@ public class GuiReplaySpeedSlider extends GuiButton {
public GuiReplaySpeedSlider(int buttonId, int p_i45017_2_, int p_i45017_3_, String displayKey) { public GuiReplaySpeedSlider(int buttonId, int p_i45017_2_, int p_i45017_3_, String displayKey) {
super(buttonId, p_i45017_2_, p_i45017_3_, 150, 20, ""); super(buttonId, p_i45017_2_, p_i45017_3_, 150, 20, "");
sliderValue = (9f / 38f);
this.width = 100; this.width = 100;
this.valueMin = 1; this.valueMin = 1;
@@ -26,6 +26,16 @@ public class GuiReplaySpeedSlider extends GuiButton {
this.valueStep = 1; this.valueStep = 1;
this.displayString = displayKey + ": 1x"; this.displayString = displayKey + ": 1x";
this.displayKey = displayKey; this.displayKey = displayKey;
reset();
}
public void copyValueFrom(GuiReplaySpeedSlider other) {
sliderValue = other.sliderValue;
}
public void reset() {
sliderValue = 9f / 38f;
} }
public static float convertScaleRet(float value) { public static float convertScaleRet(float value) {
@@ -58,7 +68,7 @@ public class GuiReplaySpeedSlider extends GuiButton {
FontRenderer fontrenderer = mc.fontRendererObj; FontRenderer fontrenderer = mc.fontRendererObj;
mc.getTextureManager().bindTexture(buttonTextures); mc.getTextureManager().bindTexture(buttonTextures);
GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F); GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F);
this.hovered = mouseX >= this.xPosition && mouseY >= this.yPosition && mouseX < this.xPosition + this.width && mouseY < this.yPosition + this.height; this.hovered = isHovering(mouseX, mouseY);
int k = this.getHoverState(this.hovered); int k = this.getHoverState(this.hovered);
GlStateManager.enableBlend(); GlStateManager.enableBlend();
GlStateManager.tryBlendFuncSeparate(770, 771, 1, 0); GlStateManager.tryBlendFuncSeparate(770, 771, 1, 0);
@@ -162,4 +172,36 @@ public class GuiReplaySpeedSlider extends GuiButton {
this.dragging = false; this.dragging = false;
} }
@Override
public void draw(Minecraft mc, int mouseX, int mouseY) {
drawButton(mc, mouseX, mouseY);
}
@Override
public void drawOverlay(Minecraft mc, int mouseX, int mouseY) {
}
@Override
public boolean isHovering(int mouseX, int mouseY) {
return mouseX >= this.xPosition
&& mouseY >= this.yPosition
&& mouseX < this.xPosition + this.width
&& mouseY < this.yPosition + this.height;
}
@Override
public void mouseClick(Minecraft mc, int mouseX, int mouseY, int button) {
mousePressed(mc, mouseX, mouseY);
}
@Override
public void mouseDrag(Minecraft mc, int mouseX, int mouseY, int button) {
mouseDragged(mc, mouseX, mouseY);
}
@Override
public void mouseRelease(Minecraft mc, int mouseX, int mouseY, int button) {
mouseReleased(mouseX, mouseY);
}
} }

View File

@@ -0,0 +1,56 @@
package eu.crushedpixel.replaymod.gui.elements;
import net.minecraft.client.Minecraft;
public class ComposedElement implements GuiElement {
private final GuiElement[] parts;
public ComposedElement(GuiElement...parts) {
this.parts = parts;
}
@Override
public void draw(Minecraft mc, int mouseX, int mouseY) {
for (GuiElement part : parts) {
part.draw(mc, mouseX, mouseY);
}
}
@Override
public void drawOverlay(Minecraft mc, int mouseX, int mouseY) {
for (GuiElement part : parts) {
part.drawOverlay(mc, mouseX, mouseY);
}
}
@Override
public boolean isHovering(int mouseX, int mouseY) {
for (GuiElement part : parts) {
if (part.isHovering(mouseX, mouseY)) {
return true;
}
}
return false;
}
@Override
public void mouseClick(Minecraft mc, int mouseX, int mouseY, int button) {
for (GuiElement part : parts) {
part.mouseClick(mc, mouseX, mouseY, button);
}
}
@Override
public void mouseDrag(Minecraft mc, int mouseX, int mouseY, int button) {
for (GuiElement part : parts) {
part.mouseDrag(mc, mouseX, mouseY, button);
}
}
@Override
public void mouseRelease(Minecraft mc, int mouseX, int mouseY, int button) {
for (GuiElement part : parts) {
part.mouseRelease(mc, mouseX, mouseY, button);
}
}
}

View File

@@ -0,0 +1,46 @@
package eu.crushedpixel.replaymod.gui.elements;
import net.minecraft.client.Minecraft;
public abstract class DelegatingElement implements GuiElement {
public static DelegatingElement of(final GuiElement element) {
return new DelegatingElement() {
@Override
public GuiElement delegate() {
return element;
}
};
}
public abstract GuiElement delegate();
@Override
public void draw(Minecraft mc, int mouseX, int mouseY) {
delegate().draw(mc, mouseX, mouseY);
}
@Override
public void drawOverlay(Minecraft mc, int mouseX, int mouseY) {
delegate().drawOverlay(mc, mouseX, mouseY);
}
@Override
public boolean isHovering(int mouseX, int mouseY) {
return delegate().isHovering(mouseX, mouseY);
}
@Override
public void mouseClick(Minecraft mc, int mouseX, int mouseY, int button) {
delegate().mouseClick(mc, mouseX, mouseY, button);
}
@Override
public void mouseDrag(Minecraft mc, int mouseX, int mouseY, int button) {
delegate().mouseDrag(mc, mouseX, mouseY, button);
}
@Override
public void mouseRelease(Minecraft mc, int mouseX, int mouseY, int button) {
delegate().mouseRelease(mc, mouseX, mouseY, button);
}
}

View File

@@ -0,0 +1,16 @@
package eu.crushedpixel.replaymod.gui.elements;
import net.minecraft.client.Minecraft;
public interface GuiElement {
void draw(Minecraft mc, int mouseX, int mouseY);
void drawOverlay(Minecraft mc, int mouseX, int mouseY);
boolean isHovering(int mouseX, int mouseY);
void mouseClick(Minecraft mc, int mouseX, int mouseY, int button);
void mouseDrag(Minecraft mc, int mouseX, int mouseY, int button);
void mouseRelease(Minecraft mc, int mouseX, int mouseY, int button);
}

View File

@@ -22,7 +22,8 @@ public class GuiKeyframeTimeline extends GuiTimeline {
showMarkers = true; showMarkers = true;
} }
public void mouseClicked(Minecraft mc, int mouseX, int mouseY) { @Override
public void mouseClick(Minecraft mc, int mouseX, int mouseY, int button) {
long time = getTimeAt(mouseX, mouseY); long time = getTimeAt(mouseX, mouseY);
if (time == -1) { if (time == -1) {
return; return;
@@ -58,7 +59,8 @@ public class GuiKeyframeTimeline extends GuiTimeline {
this.clickTime = currentTime; this.clickTime = currentTime;
} }
public void mouseDrag(int mouseX, int mouseY) { @Override
public void mouseDrag(Minecraft mc, int mouseX, int mouseY, int button) {
long time = getTimeAt(mouseX, mouseY); long time = getTimeAt(mouseX, mouseY);
if (time != -1) { if (time != -1) {
if (clickedKeyFrame != null) { if (clickedKeyFrame != null) {
@@ -75,8 +77,9 @@ public class GuiKeyframeTimeline extends GuiTimeline {
} }
} }
public void mouseRelease(int mouseX, int mouseY) { @Override
mouseDrag(mouseX, mouseY); public void mouseRelease(Minecraft mc, int mouseX, int mouseY, int button) {
mouseDrag(mc, mouseX, mouseY, button);
clickedKeyFrame = null; clickedKeyFrame = null;
dragging = false; dragging = false;
} }

View File

@@ -9,7 +9,7 @@ import static eu.crushedpixel.replaymod.gui.overlay.GuiReplayOverlay.replay_gui;
import static org.lwjgl.opengl.GL11.GL_BLEND; import static org.lwjgl.opengl.GL11.GL_BLEND;
import static org.lwjgl.opengl.GL11.glEnable; import static org.lwjgl.opengl.GL11.glEnable;
public class GuiScrollbar extends Gui { public class GuiScrollbar extends Gui implements GuiElement {
protected static final int BORDER_LEFT = 1; protected static final int BORDER_LEFT = 1;
protected static final int BORDER_RIGHT = 2; protected static final int BORDER_RIGHT = 2;
@@ -56,34 +56,31 @@ public class GuiScrollbar extends Gui {
return (int) Math.round((width - BORDER_LEFT - BORDER_RIGHT) * sliderPosition) + BORDER_LEFT; return (int) Math.round((width - BORDER_LEFT - BORDER_RIGHT) * sliderPosition) + BORDER_LEFT;
} }
public boolean startDragging(int mouseX, int mouseY) { @Override
int offsetX = getSliderOffsetX(); public void mouseClick(Minecraft mc, int mouseX, int mouseY, int button) {
int minX = positionX + offsetX; if (isHovering(mouseX, mouseY)) {
int maxX = positionX + offsetX + (int) (width * size);
int minY = positionY + BORDER_TOP;
int maxY = minY + SLIDER_HEIGHT;
if (mouseX >= minX && mouseY >= minY && mouseX < maxX && mouseY < maxY) {
draggingStart = mouseX; draggingStart = mouseX;
draggingStartPosition = sliderPosition; draggingStartPosition = sliderPosition;
return true;
} else {
return false;
} }
} }
public void doDragging(int mouseX) { @Override
public void mouseDrag(Minecraft mc, int mouseX, int mouseY, int button) {
if (draggingStart != -1) { if (draggingStart != -1) {
double delta = (double) (mouseX - draggingStart) / (width - BORDER_LEFT - BORDER_RIGHT); double delta = (double) (mouseX - draggingStart) / (width - BORDER_LEFT - BORDER_RIGHT);
sliderPosition = Math.max(0, Math.min(1 - size, draggingStartPosition + delta)); sliderPosition = Math.max(0, Math.min(1 - size, draggingStartPosition + delta));
dragged();
} }
} }
public void endDragging(int mouseX) { @Override
doDragging(mouseX); public void mouseRelease(Minecraft mc, int mouseX, int mouseY, int button) {
mouseDrag(mc, mouseX, mouseY, button);
draggingStart = -1; draggingStart = -1;
} }
public void draw(Minecraft mc) { @Override
public void draw(Minecraft mc, int mouseX, int mouseY) {
GlStateManager.resetColor(); GlStateManager.resetColor();
mc.renderEngine.bindTexture(replay_gui); mc.renderEngine.bindTexture(replay_gui);
glEnable(GL_BLEND); glEnable(GL_BLEND);
@@ -139,4 +136,23 @@ public class GuiScrollbar extends Gui {
drawModalRectWithCustomSizedTexture(x, y, u, v, width, height, TEXTURE_SIZE, TEXTURE_SIZE); drawModalRectWithCustomSizedTexture(x, y, u, v, width, height, TEXTURE_SIZE, TEXTURE_SIZE);
} }
@Override
public void drawOverlay(Minecraft mc, int mouseX, int mouseY) {
}
@Override
public boolean isHovering(int mouseX, int mouseY) {
int offsetX = getSliderOffsetX();
int minX = positionX + offsetX;
int maxX = positionX + offsetX + (int) (width * size);
int minY = positionY + BORDER_TOP;
int maxY = minY + SLIDER_HEIGHT;
return mouseX >= minX && mouseY >= minY && mouseX < maxX && mouseY < maxY;
}
public void dragged() {
}
} }

View File

@@ -5,50 +5,85 @@ import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.Gui; import net.minecraft.client.gui.Gui;
import net.minecraft.client.gui.GuiButton; import net.minecraft.client.gui.GuiButton;
import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.client.resources.I18n;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
import java.awt.*; public class GuiTexturedButton extends GuiButton implements GuiElement {
public class GuiTexturedButton extends GuiButton {
private final ResourceLocation texture; private final ResourceLocation texture;
private final int u, v; private final int u, v;
private final int textureWidth, textureHeight; private final int textureWidth, textureHeight;
private final String hoverKey; private final Runnable action;
private final String hoverText;
public GuiTexturedButton(int buttonId, int x, int y, int width, int height, ResourceLocation texture, public GuiTexturedButton(int buttonId, int x, int y, int width, int height, ResourceLocation texture,
int u, int v, int textureWidth, int textureHeight) { int u, int v, int textureWidth, int textureHeight, Runnable action) {
this(buttonId, x, y, width, height, texture, u, v, textureWidth, textureHeight, null); this(buttonId, x, y, width, height, texture, u, v, textureWidth, textureHeight, action, null);
} }
public GuiTexturedButton(int buttonId, int x, int y, int width, int height, ResourceLocation texture, public GuiTexturedButton(int buttonId, int x, int y, int width, int height, ResourceLocation texture,
int u, int v, int textureWidth, int textureHeight, String hoverKey) { int u, int v, int textureWidth, int textureHeight, Runnable action, String hoverText) {
super(buttonId, x, y, width, height, ""); super(buttonId, x, y, width, height, "");
this.texture = texture; this.texture = texture;
this.u = u; this.u = u;
this.v = v; this.v = v;
this.textureWidth = textureWidth; this.textureWidth = textureWidth;
this.textureHeight = textureHeight; this.textureHeight = textureHeight;
this.hoverKey = hoverKey; this.action = action;
this.hoverText = hoverText;
}
@Override
public boolean isHovering(int mouseX, int mouseY) {
return enabled && visible
&& mouseX >= xPosition
&& mouseY >= yPosition
&& mouseX < xPosition + width
&& mouseY < yPosition + height;
} }
@Override @Override
public void drawButton(Minecraft mc, int mouseX, int mouseY) { public void drawButton(Minecraft mc, int mouseX, int mouseY) {
if (visible) { if (visible) {
hovered = mouseX >= xPosition hovered = isHovering(mouseX, mouseY);
&& mouseY >= yPosition
&& mouseX < xPosition + width
&& mouseY < yPosition + height;
mc.renderEngine.bindTexture(texture); mc.renderEngine.bindTexture(texture);
GlStateManager.color(1, 1, 1); GlStateManager.color(1, 1, 1);
int u = this.u + (hovered ? width : 0); int u = this.u + (hovered ? width : 0);
Gui.drawModalRectWithCustomSizedTexture(xPosition, yPosition, u, v, width, height, textureWidth, textureHeight); Gui.drawModalRectWithCustomSizedTexture(xPosition, yPosition, u, v, width, height, textureWidth, textureHeight);
if(hovered && hoverKey != null) {
ReplayMod.tooltipRenderer.drawTooltip(mouseX, mouseY, I18n.format(hoverKey), null, Color.WHITE.getRGB());
}
} }
} }
@Override
public void draw(Minecraft mc, int mouseX, int mouseY) {
drawButton(mc, mouseX, mouseY);
}
@Override
public void drawOverlay(Minecraft mc, int mouseX, int mouseY) {
hovered = isHovering(mouseX, mouseY);
if(hovered && hoverText != null) {
ReplayMod.tooltipRenderer.drawTooltip(mouseX, mouseY, hoverText, null, 0xffffffff);
}
}
@Override
public void mouseClick(Minecraft mc, int mouseX, int mouseY, int button) {
if (isHovering(mouseX, mouseY)) {
performAction();
}
}
@Override
public void mouseDrag(Minecraft mc, int mouseX, int mouseY, int button) {
}
@Override
public void mouseRelease(Minecraft mc, int mouseX, int mouseY, int button) {
}
public void performAction() {
action.run();
}
} }

View File

@@ -11,7 +11,7 @@ import static eu.crushedpixel.replaymod.gui.overlay.GuiReplayOverlay.replay_gui;
import static org.lwjgl.opengl.GL11.GL_BLEND; import static org.lwjgl.opengl.GL11.GL_BLEND;
import static org.lwjgl.opengl.GL11.glEnable; import static org.lwjgl.opengl.GL11.glEnable;
public class GuiTimeline extends Gui { public class GuiTimeline extends Gui implements GuiElement {
protected static final int TEXTURE_WIDTH = 64; protected static final int TEXTURE_WIDTH = 64;
protected static final int BORDER_TOP = 4; protected static final int BORDER_TOP = 4;
@@ -146,7 +146,10 @@ public class GuiTimeline extends Gui {
rect(cursorX - 2, positionY + BORDER_TOP, 84, 20, 5, 16); rect(cursorX - 2, positionY + BORDER_TOP, 84, 20, 5, 16);
} }
}
@Override
public void drawOverlay(Minecraft mc, int mouseX, int mouseY) {
// Draw time under cursor if the mouse is on the timeline // Draw time under cursor if the mouse is on the timeline
long mouseTime = getTimeAt(mouseX, mouseY); long mouseTime = getTimeAt(mouseX, mouseY);
if (mouseTime != -1) { if (mouseTime != -1) {
@@ -156,6 +159,26 @@ public class GuiTimeline extends Gui {
} }
} }
@Override
public boolean isHovering(int mouseX, int mouseY) {
return getTimeAt(mouseX, mouseY) != -1;
}
@Override
public void mouseClick(Minecraft mc, int mouseX, int mouseY, int button) {
}
@Override
public void mouseDrag(Minecraft mc, int mouseX, int mouseY, int button) {
}
@Override
public void mouseRelease(Minecraft mc, int mouseX, int mouseY, int button) {
}
protected void rect(int x, int y, int u, int v, int width, int height) { protected void rect(int x, int y, int u, int v, int width, int height) {
Minecraft.getMinecraft().renderEngine.bindTexture(replay_gui); Minecraft.getMinecraft().renderEngine.bindTexture(replay_gui);
glEnable(GL_BLEND); glEnable(GL_BLEND);

View File

@@ -5,11 +5,7 @@ import eu.crushedpixel.replaymod.entities.CameraEntity;
import eu.crushedpixel.replaymod.gui.GuiMouseInput; import eu.crushedpixel.replaymod.gui.GuiMouseInput;
import eu.crushedpixel.replaymod.gui.GuiRenderSettings; import eu.crushedpixel.replaymod.gui.GuiRenderSettings;
import eu.crushedpixel.replaymod.gui.GuiReplaySpeedSlider; import eu.crushedpixel.replaymod.gui.GuiReplaySpeedSlider;
import eu.crushedpixel.replaymod.gui.elements.GuiKeyframeTimeline; import eu.crushedpixel.replaymod.gui.elements.*;
import eu.crushedpixel.replaymod.gui.elements.GuiScrollbar;
import eu.crushedpixel.replaymod.gui.elements.GuiTexturedButton;
import eu.crushedpixel.replaymod.gui.elements.GuiTimeline;
import eu.crushedpixel.replaymod.holders.Keyframe;
import eu.crushedpixel.replaymod.holders.Position; import eu.crushedpixel.replaymod.holders.Position;
import eu.crushedpixel.replaymod.holders.PositionKeyframe; import eu.crushedpixel.replaymod.holders.PositionKeyframe;
import eu.crushedpixel.replaymod.holders.TimeKeyframe; import eu.crushedpixel.replaymod.holders.TimeKeyframe;
@@ -18,7 +14,6 @@ import eu.crushedpixel.replaymod.replay.ReplayHandler;
import eu.crushedpixel.replaymod.utils.MouseUtils; import eu.crushedpixel.replaymod.utils.MouseUtils;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.Gui; import net.minecraft.client.gui.Gui;
import net.minecraft.client.gui.GuiButton;
import net.minecraft.client.gui.GuiChat; import net.minecraft.client.gui.GuiChat;
import net.minecraft.client.gui.GuiScreen; import net.minecraft.client.gui.GuiScreen;
import net.minecraft.client.gui.inventory.GuiInventory; import net.minecraft.client.gui.inventory.GuiInventory;
@@ -46,8 +41,8 @@ public class GuiReplayOverlay extends Gui {
public static final int TEXTURE_SIZE = 128; public static final int TEXTURE_SIZE = 128;
private static final float ZOOM_STEPS = 0.05f; private static final float ZOOM_STEPS = 0.05f;
private static GuiTexturedButton texturedButton(int x, int y, int u, int v, int size, String hoverKey) { private static GuiTexturedButton texturedButton(int x, int y, int u, int v, int size, Runnable action, String hoverText) {
return new GuiTexturedButton(0, x, y, size, size, replay_gui, u, v, TEXTURE_SIZE, TEXTURE_SIZE, hoverKey); return new GuiTexturedButton(0, x, y, size, size, replay_gui, u, v, TEXTURE_SIZE, TEXTURE_SIZE, action, I18n.format(hoverText));
} }
private final int displayWidth = mc.displayWidth; private final int displayWidth = mc.displayWidth;
@@ -73,25 +68,150 @@ public class GuiReplayOverlay extends Gui {
private final int TIMELINE_REAL_X = BUTTON_TIME_X + 25; private final int TIMELINE_REAL_X = BUTTON_TIME_X + 25;
private final int TIMELINE_REAL_WIDTH = WIDTH - 14 - 11 - TIMELINE_REAL_X; private final int TIMELINE_REAL_WIDTH = WIDTH - 14 - 11 - TIMELINE_REAL_X;
private final GuiButton buttonPlay = texturedButton(BUTTON_PLAY_PAUSE_X, TOP_ROW, 0, 0, 20, "replaymod.gui.ingame.menu.unpause"); private final GuiElement buttonPlayPause = new DelegatingElement() {
private final GuiButton buttonPause = texturedButton(BUTTON_PLAY_PAUSE_X, TOP_ROW, 0, 20, 20, "replaymod.gui.ingame.menu.pause");
private final GuiButton buttonExport = texturedButton(BUTTON_EXPORT_X, BOTTOM_ROW, 40, 0, 20, "replaymod.gui.ingame.menu.renderpath"); private final GuiElement buttonPlay = texturedButton(BUTTON_PLAY_PAUSE_X, TOP_ROW, 0, 0, 20, new Runnable() {
private final GuiButton buttonPlayPath = texturedButton(BUTTON_PLAY_PATH_X, BOTTOM_ROW, 0, 0, 20, "replaymod.gui.ingame.menu.playpath"); @Override
private final GuiButton buttonPlace = texturedButton(BUTTON_PLACE_X, BOTTOM_ROW, 0, 40, 20, "replaymod.gui.ingame.menu.addposkeyframe"); public void run() {
private final GuiButton buttonPlaceSelected = texturedButton(BUTTON_PLACE_X, BOTTOM_ROW, 0, 60, 20, "replaymod.gui.ingame.menu.removeposkeyframe"); ReplayMod.replaySender.setReplaySpeed(speedSlider.getSliderValue());
private final GuiButton buttonTime = texturedButton(BUTTON_TIME_X, BOTTOM_ROW, 0, 80, 20, "replaymod.gui.ingame.menu.addtimekeyframe"); }
private final GuiButton buttonTimeSelected = texturedButton(BUTTON_TIME_X, BOTTOM_ROW, 0, 100, 20, "replaymod.gui.ingame.menu.removetimekeyframe"); }, "replaymod.gui.ingame.menu.unpause");
private final GuiButton buttonZoomIn = texturedButton(WIDTH - 14 - 9, BOTTOM_ROW, 40, 20, 9, "replaymod.gui.ingame.menu.zoomin");
private final GuiButton buttonZoomOut = texturedButton(WIDTH - 14 - 9, BOTTOM_ROW + 11, 40, 30, 9, "replaymod.gui.ingame.menu.zoomout"); private final GuiElement buttonPause = texturedButton(BUTTON_PLAY_PAUSE_X, TOP_ROW, 0, 20, 20, new Runnable() {
@Override
public void run() {
ReplayMod.replaySender.setReplaySpeed(0);
}
}, "replaymod.gui.ingame.menu.pause");
@Override
public GuiElement delegate() {
return ReplayMod.replaySender.paused() ? buttonPlay : buttonPause;
}
};
private final GuiElement buttonExport = texturedButton(BUTTON_EXPORT_X, BOTTOM_ROW, 40, 0, 20, new Runnable() {
@Override
public void run() {
mc.displayGuiScreen(new GuiRenderSettings());
}
}, "replaymod.gui.ingame.menu.renderpath");
private final GuiElement buttonPlayPausePath = new DelegatingElement() {
private final GuiElement buttonPlay = texturedButton(BUTTON_PLAY_PATH_X, BOTTOM_ROW, 0, 0, 20, new Runnable() {
@Override
public void run() {
ReplayHandler.startPath(null);
}
}, "replaymod.gui.ingame.menu.playpath");
private final GuiElement buttonPause = texturedButton(BUTTON_PLAY_PATH_X, BOTTOM_ROW, 0, 0, 20, new Runnable() {
@Override
public void run() {
ReplayHandler.interruptReplay();
}
}, "replaymod.gui.ingame.menu.pausepath");
@Override
public GuiElement delegate() {
return ReplayHandler.isInPath() ? buttonPause : buttonPlay;
}
};
private final GuiElement buttonPlace = new DelegatingElement() {
private final GuiElement buttonNotSelected = texturedButton(BUTTON_PLACE_X, BOTTOM_ROW, 0, 40, 20, new Runnable() {
@Override
public void run() {
Entity cam = mc.getRenderViewEntity();
if (cam != null) {
Position position = new Position(cam.posX, cam.posY, cam.posZ, cam.rotationPitch,
cam.rotationYaw % 360, ReplayHandler.getCameraTilt());
if (ReplayHandler.isCamera())
ReplayHandler.addKeyframe(new PositionKeyframe(ReplayHandler.getRealTimelineCursor(), position));
else
ReplayHandler.addKeyframe(new PositionKeyframe(ReplayHandler.getRealTimelineCursor(), cam.getEntityId()));
}
}
}, "replaymod.gui.ingame.menu.addposkeyframe");
private final GuiElement buttonSelected = texturedButton(BUTTON_PLACE_X, BOTTOM_ROW, 0, 60, 20, new Runnable() {
@Override
public void run() {
ReplayHandler.removeKeyframe(ReplayHandler.getSelectedKeyframe());
}
}, "replaymod.gui.ingame.menu.removeposkeyframe");
@Override
public GuiElement delegate() {
return ReplayHandler.getSelectedKeyframe() instanceof PositionKeyframe ? buttonSelected : buttonNotSelected;
}
};
private final GuiElement buttonTime = new DelegatingElement() {
private final GuiElement buttonNotSelected = texturedButton(BUTTON_TIME_X, BOTTOM_ROW, 0, 80, 20, new Runnable() {
@Override
public void run() {
ReplayHandler.addKeyframe(new TimeKeyframe(ReplayHandler.getRealTimelineCursor(), ReplayMod.replaySender.currentTimeStamp()));
}
}, "replaymod.gui.ingame.menu.addtimekeyframe");
private final GuiElement buttonSelected = texturedButton(BUTTON_TIME_X, BOTTOM_ROW, 0, 100, 20, new Runnable() {
@Override
public void run() {
ReplayHandler.removeKeyframe(ReplayHandler.getSelectedKeyframe());
}
}, "replaymod.gui.ingame.menu.removetimekeyframe");
@Override
public GuiElement delegate() {
return ReplayHandler.getSelectedKeyframe() instanceof TimeKeyframe ? buttonSelected : buttonNotSelected;
}
};
private final GuiElement buttonZoomIn = texturedButton(WIDTH - 14 - 9, BOTTOM_ROW, 40, 20, 9, new Runnable() {
@Override
public void run() {
zoom_scale = Math.max(0.025f, zoom_scale - ZOOM_STEPS);
}
}, "replaymod.gui.ingame.menu.zoomin");
private final GuiElement buttonZoomOut = texturedButton(WIDTH - 14 - 9, BOTTOM_ROW + 11, 40, 30, 9, new Runnable() {
@Override
public void run() {
zoom_scale = Math.min(1f, zoom_scale + ZOOM_STEPS);
pos_left = Math.min(pos_left, 1f - zoom_scale);
}
}, "replaymod.gui.ingame.menu.zoomout");
private final GuiTimeline timeline = new GuiTimeline(TIMELINE_X, TOP_ROW - 1, WIDTH - 14 - TIMELINE_X) {
@Override
public void mouseClick(Minecraft mc, int mouseX, int mouseY, int button) {
performJump(timeline.getTimeAt(mouseX, mouseY));
}
};
private final GuiTimeline timeline = new GuiTimeline(TIMELINE_X, TOP_ROW - 1, WIDTH - 14 - TIMELINE_X);
private final GuiKeyframeTimeline timelineReal = new GuiKeyframeTimeline(TIMELINE_REAL_X, BOTTOM_ROW - 1, TIMELINE_REAL_WIDTH); private final GuiKeyframeTimeline timelineReal = new GuiKeyframeTimeline(TIMELINE_REAL_X, BOTTOM_ROW - 1, TIMELINE_REAL_WIDTH);
{ {
timelineReal.timelineLength = 10 * 60 * 1000; timelineReal.timelineLength = 10 * 60 * 1000;
} }
private final GuiScrollbar scrollbar = new GuiScrollbar(TIMELINE_REAL_X, BOTTOM_ROW + 22, TIMELINE_REAL_WIDTH);
private GuiReplaySpeedSlider speedSlider = new GuiReplaySpeedSlider(1, SPEED_X, TOP_ROW, I18n.format("replaymod.gui.speed")); private final GuiScrollbar scrollbar = new GuiScrollbar(TIMELINE_REAL_X, BOTTOM_ROW + 22, TIMELINE_REAL_WIDTH) {
@Override
public void dragged() {
pos_left = scrollbar.sliderPosition;
}
};
private final GuiReplaySpeedSlider speedSlider = new GuiReplaySpeedSlider(1, SPEED_X, TOP_ROW, I18n.format("replaymod.gui.speed"));
private final GuiElement content = new ComposedElement(buttonPlayPause, buttonExport, buttonPlace, buttonTime,
buttonPlayPausePath, buttonZoomIn, buttonZoomOut, timeline, timelineReal, scrollbar, speedSlider);
private float zoom_scale = 0.1f; //can see 1/10th of the timeline private float zoom_scale = 0.1f; //can see 1/10th of the timeline
private double pos_left = 0f; //left border of timeline is at 0% private double pos_left = 0f; //left border of timeline is at 0%
@@ -109,8 +229,9 @@ public class GuiReplayOverlay extends Gui {
mc.displayGuiScreen(null); mc.displayGuiScreen(null);
} }
ReplayHandler.setRealTimelineCursor(0); ReplayHandler.setRealTimelineCursor(0);
if(slider) if (slider) {
speedSlider = new GuiReplaySpeedSlider(1, SPEED_X, TOP_ROW, I18n.format("replaymod.gui.speed")); speedSlider.reset();
}
} }
public void register() { public void register() {
@@ -128,7 +249,7 @@ public class GuiReplayOverlay extends Gui {
GuiReplayOverlay other = new GuiReplayOverlay(); GuiReplayOverlay other = new GuiReplayOverlay();
other.zoom_scale = this.zoom_scale; other.zoom_scale = this.zoom_scale;
other.pos_left = this.pos_left; other.pos_left = this.pos_left;
other.speedSlider = this.speedSlider; other.speedSlider.copyValueFrom(this.speedSlider);
this.unregister(); this.unregister();
other.register(); other.register();
@@ -159,90 +280,23 @@ public class GuiReplayOverlay extends Gui {
checkResize(); checkResize();
} }
public void mouseDrag(int mouseX, int mouseY) { public void mouseDrag(int mouseX, int mouseY, int button) {
speedSlider.mousePressed(mc, mouseX, mouseY); content.mouseDrag(mc, mouseX, mouseY, button);
scrollbar.doDragging(mouseX);
pos_left = scrollbar.sliderPosition;
timelineReal.mouseDrag(mouseX, mouseY);
} }
public void mouseReleased(int mouseX, int mouseY) { public void mouseReleased(int mouseX, int mouseY, int button) {
speedSlider.mouseReleased(mouseX, mouseY); content.mouseRelease(mc, mouseX, mouseY, button);
scrollbar.endDragging(mouseX);
pos_left = scrollbar.sliderPosition;
timelineReal.mouseRelease(mouseX, mouseY);
} }
public void mouseClicked(int mouseX, int mouseY) { public void mouseClicked(int mouseX, int mouseY, int button) {
if (buttonPlayPath.mousePressed(mc, mouseX, mouseY)) { if (ReplayHandler.isInPath()) { // Only allow clicking of cancel button during path replay
if (ReplayHandler.isInPath()) { buttonPlayPausePath.mouseClick(mc, mouseX, mouseY, button);
ReplayHandler.interruptReplay();
} else {
ReplayHandler.startPath(null);
}
}
if (ReplayHandler.isInPath()) {
return; // Only allow clicking of cancel button during path replay
}
if (ReplayMod.replaySender.paused()) {
if (buttonPlay.mousePressed(mc, mouseX, mouseY)) {
ReplayMod.replaySender.setReplaySpeed(speedSlider.getSliderValue());
}
} else { } else {
if (buttonPause.mousePressed(mc, mouseX, mouseY)) { content.mouseClick(mc, mouseX, mouseY, button);
ReplayMod.replaySender.setReplaySpeed(0);
}
} }
}
speedSlider.mousePressed(mc, mouseX, mouseY); private void performJump(long timelineTime) {
scrollbar.startDragging(mouseX, mouseY);
timelineReal.mouseClicked(mc, mouseX, mouseY);
if (buttonExport.mousePressed(mc, mouseX, mouseY)) {
mc.displayGuiScreen(new GuiRenderSettings());
}
Keyframe keyframe = ReplayHandler.getSelectedKeyframe();
if (buttonPlace.mousePressed(mc, mouseX, mouseY)) {
if (keyframe instanceof PositionKeyframe) {
ReplayHandler.removeKeyframe(keyframe);
} else {
Entity cam = mc.getRenderViewEntity();
if(cam != null) {
Position position = new Position(cam.posX, cam.posY, cam.posZ, cam.rotationPitch,
cam.rotationYaw % 360, ReplayHandler.getCameraTilt());
if(ReplayHandler.isCamera()) ReplayHandler.addKeyframe(new PositionKeyframe(ReplayHandler.getRealTimelineCursor(), position));
else ReplayHandler.addKeyframe(new PositionKeyframe(ReplayHandler.getRealTimelineCursor(), cam.getEntityId()));
}
}
}
if (buttonTime.mousePressed(mc, mouseX, mouseY)) {
if (keyframe instanceof TimeKeyframe) {
ReplayHandler.removeKeyframe(keyframe);
} else {
ReplayHandler.addKeyframe(new TimeKeyframe(ReplayHandler.getRealTimelineCursor(), ReplayMod.replaySender.currentTimeStamp()));
}
}
if (buttonZoomIn.mousePressed(mc, mouseX, mouseY)) {
zoom_scale = Math.max(0.025f, zoom_scale - ZOOM_STEPS);
}
if (buttonZoomOut.mousePressed(mc, mouseX, mouseY)) {
zoom_scale = Math.min(1f, zoom_scale + ZOOM_STEPS);
pos_left = Math.min(pos_left, 1f - zoom_scale);
}
long timelineTime = timeline.getTimeAt(mouseX, mouseY);
if (timelineTime != -1) { // Click on timeline if (timelineTime != -1) { // Click on timeline
//When hurrying, no Timeline jumping etc. is possible //When hurrying, no Timeline jumping etc. is possible
if(!ReplayMod.replaySender.isHurrying()) { if(!ReplayMod.replaySender.isHurrying()) {
@@ -342,8 +396,6 @@ public class GuiReplayOverlay extends Gui {
GlStateManager.resetColor(); GlStateManager.resetColor();
Keyframe keyframe = ReplayHandler.getSelectedKeyframe();
Point mousePoint = MouseUtils.getMousePos(); Point mousePoint = MouseUtils.getMousePos();
int mouseX = mousePoint.getX(); int mouseX = mousePoint.getX();
int mouseY = mousePoint.getY(); int mouseY = mousePoint.getY();
@@ -354,51 +406,20 @@ public class GuiReplayOverlay extends Gui {
mouseX = mouseY = -1000; mouseX = mouseY = -1000;
} }
// Draw speed slider // Setup scrollbar and timelines
speedSlider.drawButton(mc, mouseX, mouseY);
// Draw buttons
buttonExport.drawButton(mc, mouseX, mouseY);
// Draw play/pause button
if (ReplayMod.replaySender.paused()) {
buttonPlay.drawButton(mc, mouseX, mouseY);
} else {
buttonPause.drawButton(mc, mouseX, mouseY);
}
buttonPlayPath.drawButton(mc, mouseX, mouseY);
// Keyframe buttons
if (keyframe instanceof PositionKeyframe) {
buttonPlaceSelected.drawButton(mc, mouseX, mouseY);
} else {
buttonPlace.drawButton(mc, mouseX, mouseY);
}
if (keyframe instanceof TimeKeyframe) {
buttonTimeSelected.drawButton(mc, mouseX, mouseY);
} else {
buttonTime.drawButton(mc, mouseX, mouseY);
}
buttonZoomIn.drawButton(mc, mouseX, mouseY);
buttonZoomOut.drawButton(mc, mouseX, mouseY);
// Draw scrollbar for real timeline
scrollbar.size = zoom_scale; scrollbar.size = zoom_scale;
scrollbar.sliderPosition = pos_left; scrollbar.sliderPosition = pos_left;
scrollbar.draw(mc);
// Finally draw timelines so that no other GUI elements overlap the mouse-position strings
timeline.cursorPosition = ReplayMod.replaySender.currentTimeStamp(); timeline.cursorPosition = ReplayMod.replaySender.currentTimeStamp();
timeline.timelineLength = ReplayMod.replaySender.replayLength(); timeline.timelineLength = ReplayMod.replaySender.replayLength();
timeline.draw(mc, mouseX, mouseY);
timelineReal.cursorPosition = ReplayHandler.getRealTimelineCursor(); timelineReal.cursorPosition = ReplayHandler.getRealTimelineCursor();
timelineReal.zoom = zoom_scale; timelineReal.zoom = zoom_scale;
timelineReal.timeStart = pos_left; timelineReal.timeStart = pos_left;
timelineReal.draw(mc, mouseX, mouseY);
// Draw all elements
content.draw(mc, mouseX, mouseY);
content.drawOverlay(mc, mouseX, mouseY);
GlStateManager.enableBlend(); GlStateManager.enableBlend();
} }