Last active
October 26, 2016 09:09
-
-
Save Daomephsta/611041105828421eac897828a9324514 to your computer and use it in GitHub Desktop.
Fix goof with segment number
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package com.leviathan143.dogwhistle.client.handlers; | |
import java.util.List; | |
import java.util.Map; | |
import org.lwjgl.input.Mouse; | |
import org.lwjgl.opengl.GL11; | |
import com.google.common.collect.Maps; | |
import com.leviathan143.dogwhistle.api.whistle.Whistle; | |
import com.leviathan143.dogwhistle.api.whistle.WhistleRegistry; | |
import com.leviathan143.dogwhistle.api.whistle.WhistleRegistry.WhistleType; | |
import com.leviathan143.dogwhistle.client.GuiParameters; | |
import com.leviathan143.dogwhistle.common.packets.PacketHandler; | |
import com.leviathan143.dogwhistle.common.packets.PacketWhistleAction; | |
import net.minecraft.client.Minecraft; | |
import net.minecraft.client.gui.ScaledResolution; | |
import net.minecraft.client.renderer.GlStateManager; | |
import net.minecraft.client.renderer.Tessellator; | |
import net.minecraft.client.renderer.VertexBuffer; | |
import net.minecraft.client.renderer.vertex.DefaultVertexFormats; | |
import net.minecraftforge.client.event.MouseEvent; | |
import net.minecraftforge.client.event.RenderGameOverlayEvent; | |
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; | |
public class WhistleGui | |
{ | |
private static final double SEGMENT_OFFSET = 2.5; | |
private static final Map<Integer, GuiParameters> parameterMap = Maps.newHashMap(); | |
static | |
{ | |
parameterMap.put(1, new GuiParameters(24, 15)); | |
parameterMap.put(2, new GuiParameters(12, 15)); | |
parameterMap.put(3, new GuiParameters(8, 15)); | |
parameterMap.put(4, new GuiParameters(6, 15)); | |
parameterMap.put(5, new GuiParameters(4, 18)); | |
parameterMap.put(6, new GuiParameters(4, 15)); | |
parameterMap.put(7, new GuiParameters(3, 17.1428F)); | |
parameterMap.put(8, new GuiParameters(3, 15)); | |
parameterMap.put(9, new GuiParameters(2, 20)); | |
parameterMap.put(10, new GuiParameters(2, 18)); | |
} | |
private static Minecraft mc = Minecraft.getMinecraft(); | |
private static WhistleType whistleType; | |
private static Object additionalParam; | |
private static boolean isActive; | |
private static int segments, subsegments, hoveredSegment = -1; | |
private static float radius = 50.0F, segmentAngle; | |
@SubscribeEvent | |
public static void onRenderGameOverlay(RenderGameOverlayEvent.Pre event) | |
{ | |
if(!isActive || whistleType == WhistleType.NONE) return; | |
if(event.getType() == RenderGameOverlayEvent.ElementType.CROSSHAIRS) | |
{ | |
renderWhistleGui(whistleType, event.getResolution().getScaledWidth() / 2, event.getResolution().getScaledHeight() / 2); | |
event.setCanceled(true); | |
} | |
} | |
private static void renderWhistleGui(WhistleType type, int x, int y) | |
{ | |
List<Whistle> whistles = WhistleRegistry.getWhistlesByType(type); | |
segments = whistles.size(); | |
if(!parameterMap.containsKey(segments)) return; | |
subsegments = parameterMap.get(segments).getSubsegments(); | |
float subsegmentAngle = parameterMap.get(segments).getAngle(); | |
segmentAngle = subsegmentAngle * subsegments; | |
Tessellator tess = Tessellator.getInstance(); | |
VertexBuffer vtxBuf = tess.getBuffer(); | |
GlStateManager.pushMatrix(); | |
GlStateManager.translate(x, y, 0.0F); | |
//Dark mathgic to rotate segment 0 to 0 degrees | |
GlStateManager.rotate((segments / -2.0F + 1.0F) * segmentAngle, 0, 0, 1); | |
for(int segment = 0; segment < segments; segment++) | |
{ | |
GlStateManager.pushMatrix(); | |
GlStateManager.translate(SEGMENT_OFFSET * Math.cos(Math.toRadians(90 - segmentAngle / 2)), SEGMENT_OFFSET * Math.cos(Math.toRadians(segmentAngle / 2)), 0); | |
for(int subsegment = 0; subsegment < subsegments; subsegment++) | |
{ | |
vtxBuf.begin(segment == hoveredSegment ? GL11.GL_TRIANGLE_FAN : GL11.GL_LINE_LOOP, DefaultVertexFormats.POSITION); | |
vtxBuf.pos(0, 0 , 0).endVertex(); | |
vtxBuf.pos(0, radius, 0).endVertex(); | |
vtxBuf.pos(radius * Math.cos(Math.toRadians(90 - subsegmentAngle)), radius * Math.cos(Math.toRadians(subsegmentAngle)), 0).endVertex(); | |
tess.draw(); | |
GlStateManager.rotate(-subsegmentAngle, 0, 0, 1); | |
} | |
GlStateManager.popMatrix(); | |
GlStateManager.rotate(segmentAngle, 0, 0, 1); | |
} | |
for(int segment = 0; segment < segments; segment++) | |
{ | |
renderWhistleIcon(whistles.get(segment),(float) ((radius / 2.0F) * Math.cos(Math.toRadians(90 - segmentAngle / 2))), (float) ((radius / 2.0F) * Math.cos(Math.toRadians(segmentAngle / 2))), segment); | |
GlStateManager.rotate(segmentAngle, 0.0F, 0.0F, 1.0F); | |
} | |
GlStateManager.popMatrix(); | |
} | |
private static void renderWhistleIcon(Whistle whistle, float x, float y, int segment) | |
{ | |
GlStateManager.pushMatrix(); | |
GlStateManager.enableAlpha(); | |
GlStateManager.translate(x, y, 0); | |
//Reverse the dark mathgic | |
GlStateManager.rotate(-segmentAngle * segment + (segments / 2.0F - 1.0F) * segmentAngle, 0, 0, 1); | |
Tessellator tess = Tessellator.getInstance(); | |
VertexBuffer vtxBuf = tess.getBuffer(); | |
mc.getTextureManager().bindTexture(whistle.getResource()); | |
vtxBuf.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_TEX); | |
vtxBuf.pos(-8, -8, 1).tex(0.0D, 0.0D).endVertex(); | |
vtxBuf.pos(-8, 8, 1).tex(0.0D, 1.0D).endVertex(); | |
vtxBuf.pos(8, 8, 1).tex(1.0D, 1.0D).endVertex(); | |
vtxBuf.pos(8, -8, 1).tex(1.0D, 0.0D).endVertex(); | |
tess.draw(); | |
GlStateManager.disableAlpha(); | |
GlStateManager.popMatrix(); | |
} | |
@SubscribeEvent | |
public static void handleMouseInput(MouseEvent event) | |
{ | |
if(!isActive) return; | |
int mouseX = transformMouseX() - mc.displayWidth / 4; | |
int mouseY = transformMouseY() - mc.displayHeight / 4; | |
handleMovement(event, mouseX, mouseY); | |
if(event.getButton() != -1) handleClicks(event, mouseX, mouseY); | |
} | |
public static void handleMovement(MouseEvent event, int mouseX, int mouseY) | |
{ | |
if((mouseX <= radius && mouseX >= -radius ) && (mouseY <= radius && mouseY >= -radius )) | |
{ | |
double mouseAngle = calcMouseAngle(mouseX, mouseY); | |
for(int segment = 0; segment < segments; segment++) | |
{ | |
//All hail inverse modulus! | |
hoveredSegment = (int) ((mouseAngle - mouseAngle % segmentAngle) / segmentAngle); | |
} | |
} | |
else | |
{ | |
hoveredSegment = -1; | |
} | |
} | |
public static void handleClicks(MouseEvent event, int mouseX, int mouseY) | |
{ | |
if(hoveredSegment == -1) | |
{ | |
toggleState(); | |
} | |
else if(event.getButton() == 0 && event.isButtonstate()) | |
{ | |
System.out.println(whistleType); | |
PacketHandler.CHANNEL.sendToServer(new PacketWhistleAction(mc.theWorld, mc.thePlayer, additionalParam, WhistleRegistry.getWhistlesByType(whistleType).get(hoveredSegment))); | |
toggleState(); | |
} | |
} | |
private static double calcMouseAngle(double mouseX, double mouseY) | |
{ | |
//The + 90.0D moves 0 degrees to the top of the gui | |
return wrapD(Math.toDegrees(Math.atan2(mouseY, mouseX)) + 90.0D, 0.0D, 360.0D); | |
} | |
/*private static float wrapF(float in, float min, float max) | |
{ | |
if(in < min) | |
in = max + in - min; | |
if(in > max) | |
in = in - max + min; | |
return in; | |
}*/ | |
private static double wrapD(double in, double min, double max) | |
{ | |
if(in < min) | |
in = max + in - min; | |
if(in > max) | |
in = in - max + min; | |
return in; | |
} | |
/*private static double wrapI(double in, double min, double max) | |
{ | |
if(in < min) | |
in = max + in - min; | |
if(in > max) | |
in = in - max + min; | |
return in; | |
}*/ | |
private static int transformMouseX() | |
{ | |
ScaledResolution scaledresolution = new ScaledResolution(mc); | |
int scaledWidth = scaledresolution.getScaledWidth(); | |
return Mouse.getX() * scaledWidth / mc.displayWidth; | |
} | |
private static int transformMouseY() | |
{ | |
ScaledResolution scaledresolution = new ScaledResolution(mc); | |
int scaledHeight = scaledresolution.getScaledHeight(); | |
return scaledHeight - Mouse.getY() * scaledHeight / mc.displayHeight - 1; | |
} | |
public static boolean toggleState() | |
{ | |
isActive = !isActive; | |
if (isActive) mc.setIngameNotInFocus(); | |
else mc.setIngameFocus(); | |
hoveredSegment = -1; | |
return isActive; | |
} | |
public static void initialise(WhistleType type, Object addParam) | |
{ | |
whistleType = type; | |
additionalParam = addParam; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment