package eu.crushedpixel.replaymod.gui; import java.awt.Color; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import org.lwjgl.input.Mouse; import net.minecraft.client.entity.AbstractClientPlayer; import net.minecraft.client.gui.Gui; import net.minecraft.client.gui.GuiScreen; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EnumPlayerModelParts; import net.minecraft.potion.Potion; import net.minecraft.util.ResourceLocation; import com.mojang.realmsclient.util.Pair; import eu.crushedpixel.replaymod.replay.ReplayHandler; public class GuiSpectateSelection extends GuiScreen { private List> players; private int playerCount; private int upperPlayer = 0; private int upperBound = 30; private int lowerBound; private double prevSpeed; private class PlayerComparator implements Comparator { @Override public int compare(EntityPlayer o1, EntityPlayer o2) { if(isSpectator(o1) && !isSpectator(o2)) { return 1; } else if(isSpectator(o2) && !isSpectator(o1)) { return -1; } else { return o1.getName().compareToIgnoreCase(o2.getName()); } } } private boolean isSpectator(EntityPlayer e) { return e.isInvisible() && e.getActivePotionEffect(Potion.invisibility) == null; } public GuiSpectateSelection(List players) { this.prevSpeed = ReplayHandler.getSpeed(); Collections.sort(players, new PlayerComparator()); this.players = new ArrayList>(); for(EntityPlayer p : players) { ResourceLocation loc = new ResourceLocation("/temp-skins/"+p.getGameProfile().getName()); AbstractClientPlayer.getDownloadImageSkin(loc, p.getName()); this.players.add(Pair.of(p, loc)); } playerCount = players.size(); ReplayHandler.setSpeed(0); } private boolean drag = false; @Override protected void mouseClicked(int mouseX, int mouseY, int mouseButton) throws IOException { if(fitting < playerCount) { float visiblePerc = (float)fitting/(float)playerCount; int h = this.height-32-32; int offset = Math.round((upperPlayer/(fitting))*visiblePerc*h); int lower = Math.round(32+offset+(h*visiblePerc))-2; int k2 = (int)(this.width*0.4); if(mouseX >= k2-16 && mouseX <= k2-12 && mouseY >= 32-2+offset && mouseY <= lower) { lastY = mouseY; drag = true; return; } } int k2 = (int)(this.width*0.4); int l2 = 30; if(mouseX >= k2 && mouseX <= (this.width*0.6) && mouseY >= 30 && mouseY <= lowerBound) { int off = mouseY-30; int p = (off/21) + upperPlayer; ReplayHandler.spectateEntity(players.get(p).first()); ReplayHandler.setSpeed(prevSpeed); mc.displayGuiScreen(null); } } private int lastY = 0; @Override protected void mouseClickMove(int mouseX, int mouseY, int clickedMouseButton, long timeSinceLastClick) { if(drag) { float step = 1f/(float)playerCount; int diff = mouseY-lastY; int h = this.height-32-32; float percDiff = (float)diff/(float)h; if(Math.abs(percDiff) > Math.abs(step)) { int s = (int)(percDiff/step); lastY = mouseY; upperPlayer += s; if(upperPlayer > playerCount-fitting) { upperPlayer = playerCount-fitting; } else if(upperPlayer < 0) { upperPlayer = 0; } } } super.mouseClickMove(mouseX, mouseY, clickedMouseButton, timeSinceLastClick); } @Override public void onGuiClosed() { ReplayHandler.setSpeed(prevSpeed); } @Override protected void mouseReleased(int mouseX, int mouseY, int state) { drag = false; super.mouseReleased(mouseX, mouseY, state); } @Override public void initGui() { upperPlayer = 0; lowerBound = this.height-10; } private int fitting = 0; @Override public void drawScreen(int mouseX, int mouseY, float partialTicks) { this.drawCenteredString(fontRendererObj, "Spectate Player", this.width/2, 5, Color.WHITE.getRGB()); int k2 = (int)(this.width*0.4); int l2 = 30; drawGradientRect(k2-10, l2-10, (int)(this.width*0.6)+20, this.height-30-2+10, -1072689136, -804253680); fitting = 0; int sk = 0; for(Pair p : players) { if(sk < upperPlayer) { sk++; continue; } boolean spec = isSpectator(p.first()); this.drawString(fontRendererObj, p.first().getName(), k2+16+5, l2+8-(fontRendererObj.FONT_HEIGHT/2), spec ? Color.DARK_GRAY.getRGB() : Color.WHITE.getRGB()); mc.getTextureManager().bindTexture(p.second()); this.drawScaledCustomSizeModalRect(k2, l2, 8.0F, 8.0F, 8, 8, 16, 16, 64.0F, 64.0F); if(p.first().func_175148_a(EnumPlayerModelParts.HAT)) Gui.drawScaledCustomSizeModalRect(k2, l2, 40.0F, 8.0F, 8, 8, 16, 16, 64.0F, 64.0F); GlStateManager.resetColor(); l2 += 16+5; fitting++; if(l2+32 > lowerBound) { break; } } int dw = Mouse.getDWheel(); if(dw > 0) { dw = -1; } else if(dw < 0) { dw = 1; } upperPlayer = Math.max(Math.min(upperPlayer+dw, playerCount-fitting), 0); if(fitting < playerCount) { float visiblePerc = ((float)fitting)/playerCount; int barHeight = (int)(visiblePerc*(height-32-32)); float posPerc = ((float)upperPlayer)/playerCount; int barY = (int)(posPerc*(height-32-32)); this.drawRect(k2-18, 30-2, k2-10, this.height-30-2, Color.BLACK.getRGB()); this.drawRect(k2-16, 32-2+barY, k2-12, 32-1+barY+barHeight, Color.LIGHT_GRAY.getRGB()); } else { } super.drawScreen(mouseX, mouseY, partialTicks); } }