Skip to content

Instantly share code, notes, and snippets.

@Daomephsta
Last active October 26, 2016 09:09
Show Gist options
  • Save Daomephsta/611041105828421eac897828a9324514 to your computer and use it in GitHub Desktop.
Save Daomephsta/611041105828421eac897828a9324514 to your computer and use it in GitHub Desktop.
Fix goof with segment number
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