From 3f86e881074dc4220aab23cae69f002c62f0b25a Mon Sep 17 00:00:00 2001 From: Moulberry Date: Sun, 25 Oct 2020 09:39:40 +1100 Subject: 1.4.5 --- .../notenoughupdates/AccessoryBagOverlay.java | 9 +- .../notenoughupdates/BetterContainers.java | 86 +++- .../notenoughupdates/CustomItemEffects.java | 382 ++++++++++++++- .../moulberry/notenoughupdates/DungeonBlocks.java | 18 +- .../moulberry/notenoughupdates/DungeonMap.java | 543 +++++++++++++++------ .../notenoughupdates/GuiEnchantColour.java | 4 +- .../moulberry/notenoughupdates/GuiTextures.java | 2 + .../notenoughupdates/NEUEventListener.java | 176 ++++++- .../moulberry/notenoughupdates/NEUManager.java | 3 +- .../moulberry/notenoughupdates/NEUOverlay.java | 172 ++++--- .../notenoughupdates/NotEnoughUpdates.java | 50 +- .../notenoughupdates/auction/APIManager.java | 9 +- .../notenoughupdates/auction/CustomAH.java | 9 + .../infopanes/SettingsInfoPane.java | 259 +++++++--- .../itemeditor/GuiElementTextField.java | 4 + .../notenoughupdates/mixins/MixinGuiContainer.java | 70 ++- .../notenoughupdates/options/Options.java | 205 +++++--- .../profileviewer/GuiProfileViewer.java | 9 +- .../profileviewer/PlayerStats.java | 9 +- .../profileviewer/ProfileViewer.java | 3 +- .../moulberry/notenoughupdates/util/Constants.java | 15 + .../moulberry/notenoughupdates/util/Utils.java | 95 +++- 22 files changed, 1691 insertions(+), 441 deletions(-) create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/util/Constants.java (limited to 'src/main/java') diff --git a/src/main/java/io/github/moulberry/notenoughupdates/AccessoryBagOverlay.java b/src/main/java/io/github/moulberry/notenoughupdates/AccessoryBagOverlay.java index 1011f3cc..d8d84144 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/AccessoryBagOverlay.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/AccessoryBagOverlay.java @@ -4,6 +4,7 @@ import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import io.github.moulberry.notenoughupdates.profileviewer.PlayerStats; +import io.github.moulberry.notenoughupdates.util.Constants; import io.github.moulberry.notenoughupdates.util.Utils; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.FontRenderer; @@ -226,7 +227,7 @@ public class AccessoryBagOverlay { private static Set duplicates = null; public static void renderDuplicatesOverlay(int x, int y) { if(duplicates == null) { - JsonObject misc = Utils.getConstant("misc"); + JsonObject misc = Constants.MISC; if(misc == null) { Utils.drawStringCenteredScaledMaxWidth("Duplicates: ERROR", Minecraft.getMinecraft().fontRendererObj, x+40, y+12, false, 70, new Color(80, 80, 80).getRGB()); @@ -297,7 +298,7 @@ public class AccessoryBagOverlay { private static List missing = null; public static void renderMissingOverlay(int x, int y) { if(missing == null) { - JsonObject misc = Utils.getConstant("misc"); + JsonObject misc = Constants.MISC; if(misc == null) { Utils.drawStringCenteredScaledMaxWidth("Duplicates: ERROR", Minecraft.getMinecraft().fontRendererObj, x+40, y+12, false, 70, new Color(80, 80, 80).getRGB()); @@ -788,7 +789,7 @@ public class AccessoryBagOverlay { } public static boolean isAccessory(ItemStack stack) { - return checkItemType(stack, false, "ACCESSORY", "HATCCESSORY") >= 0; + return checkItemType(stack, true, "ACCESSORY", "HATCCESSORY") >= 0; } public static int getRarity(ItemStack stack) { @@ -800,7 +801,7 @@ public class AccessoryBagOverlay { for (int i = list.tagCount(); i >= 0; i--) { String line = list.getStringTagAt(i); for(int j=0; j itemCache = new HashMap<>(); + public static boolean lastUsingCached = false; + public static boolean usingCached = false; public static void clickSlot(int slot) { - clickedSlot = slot; clickedSlotMillis = System.currentTimeMillis(); + clickedSlot = slot; } public static int getClickedSlot() { - if(clickedSlotMillis - System.currentTimeMillis() < 200) { + if(System.currentTimeMillis() - clickedSlotMillis < 500) { return clickedSlot; } return -1; @@ -58,11 +64,32 @@ public class BetterContainers { public static void bindHook(TextureManager textureManager, ResourceLocation location) { if(isChestOpen()) { - if(lastClickedSlot != getClickedSlot() || (texture == null && !loaded)) { + Container container = ((GuiChest)Minecraft.getMinecraft().currentScreen).inventorySlots; + if(container instanceof ContainerChest) { + usingCached = true; + IInventory lower = ((ContainerChest)container).getLowerChestInventory(); + int size = lower.getSizeInventory(); + for(int index=0; index candidatesOld = new HashSet<>(); + TreeMap> candidatesOldSorted = new TreeMap<>(); + + IBlockState match = Minecraft.getMinecraft().theWorld.getBlockState(Minecraft.getMinecraft().objectMouseOver.getBlockPos()); + Item matchItem = Item.getItemFromBlock(match.getBlock()); + if(matchItem != null) { + ItemStack matchStack = new ItemStack(matchItem, 1, + match.getBlock().getDamageValue(Minecraft.getMinecraft().theWorld, Minecraft.getMinecraft().objectMouseOver.getBlockPos())); + int itemCount = countItemsInInventoryAndStorage(matchStack); + + getBuildersWandCandidates(Minecraft.getMinecraft().thePlayer, Minecraft.getMinecraft().objectMouseOver, event.partialTicks, + candidatesOld, candidatesOldSorted, 999-MAX_BUILDERS_BLOCKS); + + if(candidatesOld.size() > MAX_BUILDERS_BLOCKS) { + Utils.drawStringCentered(EnumChatFormatting.RED.toString()+candidatesOld.size()+"/"+MAX_BUILDERS_BLOCKS, + Minecraft.getMinecraft().fontRendererObj, + scaledResolution.getScaledWidth()/2f, scaledResolution.getScaledHeight()/2f+10, true, 0); + } else { + String pre = EnumChatFormatting.GREEN.toString(); + if(itemCount < candidatesOld.size()) { + pre = EnumChatFormatting.RED.toString(); + } + Utils.drawStringCentered(pre+Math.min(candidatesOld.size(), itemCount)+"/"+ + Math.min(candidatesOld.size(), MAX_BUILDERS_BLOCKS), + Minecraft.getMinecraft().fontRendererObj, + scaledResolution.getScaledWidth()/2f, scaledResolution.getScaledHeight()/2f+10, true, 0); + } + + String itemCountS = EnumChatFormatting.DARK_GRAY+"x"+EnumChatFormatting.RESET+countItemsInInventoryAndStorage(matchStack); + int itemCountLen = Minecraft.getMinecraft().fontRendererObj.getStringWidth(itemCountS); + + if(NotEnoughUpdates.INSTANCE.manager.config.wandBlockCount.value) { + Utils.drawItemStack(matchStack, scaledResolution.getScaledWidth()/2 - (itemCountLen+16)/2, scaledResolution.getScaledHeight()/2+10+4); + Minecraft.getMinecraft().fontRendererObj.drawString(itemCountS, + scaledResolution.getScaledWidth()/2f - (itemCountLen+16)/2f+16, scaledResolution.getScaledHeight()/2f+10+8, + -1, + true); + } + + GlStateManager.color(1, 1, 1, 1); + } + + } + } + } + } + + public int countItemsInInventoryAndStorage(ItemStack match) { + int count = 0; + + for(ItemStack stack : Minecraft.getMinecraft().thePlayer.inventory.mainInventory) { + if(match.isItemEqual(stack)) { + count += stack.stackSize; + } + } + + ItemStack held = Minecraft.getMinecraft().thePlayer.getHeldItem(); + String heldInternal = NotEnoughUpdates.INSTANCE.manager.getInternalNameForItem(held); + + if(heldInternal != null && heldInternal.equals("BUILDERS_WAND")) { + //System.out.println("1"); + if(held.hasTagCompound() && held.getTagCompound().hasKey("ExtraAttributes", 10) && + held.getTagCompound().getCompoundTag("ExtraAttributes").hasKey("builder's_wand_data", 7)) { + //System.out.println("2"); + byte[] bytes = held.getTagCompound().getCompoundTag("ExtraAttributes").getByteArray("builder's_wand_data"); + try { + NBTTagCompound contents_nbt = CompressedStreamTools.readCompressed(new ByteArrayInputStream(bytes)); + NBTTagList items = contents_nbt.getTagList("i", 10); + for(int j=0; j 0) { + if(buildersItem.getInteger("id") == Item.getIdFromItem(match.getItem())) { + count += items.getCompoundTagAt(j).getByte("Count"); + } + } + } + } catch(Exception e) { + return count; + } + } + } + + return count; + } + @SubscribeEvent public void renderBlockOverlay(DrawBlockHighlightEvent event) { if(aoteTeleportationCurr != null && aoteTeleportationMillis > 0) { event.setCanceled(true); } - if(NotEnoughUpdates.INSTANCE.manager.config.disableTreecapOverlay.value) return; ItemStack held = Minecraft.getMinecraft().thePlayer.getHeldItem(); String heldInternal = NotEnoughUpdates.INSTANCE.manager.getInternalNameForItem(held); if(heldInternal != null) { - if(heldInternal.equals("JUNGLE_AXE") || heldInternal.equals("TREECAPITATOR_AXE")) { + if(!NotEnoughUpdates.INSTANCE.manager.config.disableTreecapOverlay.value && + (heldInternal.equals("JUNGLE_AXE") || heldInternal.equals("TREECAPITATOR_AXE"))) { int maxWood = 10; if(heldInternal.equals("TREECAPITATOR_AXE")) maxWood = 35; @@ -185,9 +305,9 @@ public class CustomItemEffects { double d1 = player.lastTickPosY + (player.posY - player.lastTickPosY) * (double)event.partialTicks; double d2 = player.lastTickPosZ + (player.posZ - player.lastTickPosZ) * (double)event.partialTicks; - drawSelectionBoundingBox(block.getSelectedBoundingBox(Minecraft.getMinecraft().theWorld, candidate) + drawFilledBoundingBox(block.getSelectedBoundingBox(Minecraft.getMinecraft().theWorld, candidate) .expand(0.001D, 0.001D, 0.001D).offset(-d0, -d1, -d2), - random ? 0.5f : 1f); + random ? 0.5f : 1f, NotEnoughUpdates.INSTANCE.manager.config.treecapOverlayColour.value); } } } @@ -196,14 +316,205 @@ public class CustomItemEffects { GlStateManager.enableTexture2D(); GlStateManager.disableBlend(); } + } else if(!NotEnoughUpdates.INSTANCE.manager.config.disableWandOverlay.value && heldInternal.equals("BUILDERS_WAND")) { + int maxBlocks = 164; + if (event.target.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) { + IBlockState hover = Minecraft.getMinecraft().theWorld.getBlockState(event.target.getBlockPos().offset(event.target.sideHit, 1)); + if(hover.getBlock() == Blocks.air) { + EntityPlayer player = event.player; + + IBlockState match = Minecraft.getMinecraft().theWorld.getBlockState(event.target.getBlockPos()); + Item matchItem = Item.getItemFromBlock(match.getBlock()); + if(matchItem != null) { + GlStateManager.enableBlend(); + GlStateManager.tryBlendFuncSeparate(770, 771, 1, 0); + GlStateManager.disableTexture2D(); + GlStateManager.depthMask(false); + + ItemStack matchStack = new ItemStack(matchItem, 1, match.getBlock().getMetaFromState(match)); + int itemCount = countItemsInInventoryAndStorage(matchStack); + + HashSet candidatesOld = new HashSet<>(); + TreeMap> candidatesOldSorted = new TreeMap<>(); + + getBuildersWandCandidates(player, event.target, event.partialTicks, candidatesOld, candidatesOldSorted, 10); + + String special = (candidatesOld.size() <= itemCount) ? NotEnoughUpdates.INSTANCE.manager.config.wandOverlayColour.value : + "0:255:255:0:0"; + + if(candidatesOld.size() <= maxBlocks) { + double d0 = player.lastTickPosX + (player.posX - player.lastTickPosX) * (double)event.partialTicks; + double d1 = player.lastTickPosY + (player.posY - player.lastTickPosY) * (double)event.partialTicks; + double d2 = player.lastTickPosZ + (player.posZ - player.lastTickPosZ) * (double)event.partialTicks; + + for(Set candidatesSorted : candidatesOldSorted.values()) { + for(BlockPos candidate : candidatesSorted) { + match.getBlock().setBlockBoundsBasedOnState(Minecraft.getMinecraft().theWorld, candidate); + AxisAlignedBB bb = match.getBlock().getSelectedBoundingBox(Minecraft.getMinecraft().theWorld, candidate) + .offset(event.target.sideHit.getFrontOffsetX(), event.target.sideHit.getFrontOffsetY(), + event.target.sideHit.getFrontOffsetZ()); + + drawBlock((int)bb.minX, (int)bb.minY, (int)bb.minZ+1, match, event.partialTicks, 0.75f); + } + } + + for(BlockPos candidate : candidatesOld) { + match.getBlock().setBlockBoundsBasedOnState(Minecraft.getMinecraft().theWorld, candidate); + AxisAlignedBB bb = match.getBlock().getSelectedBoundingBox(Minecraft.getMinecraft().theWorld, candidate) + .expand(0.001D, 0.001D, 0.001D).offset(-d0, -d1, -d2) + .offset(event.target.sideHit.getFrontOffsetX(), event.target.sideHit.getFrontOffsetY(), + event.target.sideHit.getFrontOffsetZ()); + + drawOutlineBoundingBox(bb, 1f, special); + } + } + + GlStateManager.depthMask(true); + GlStateManager.enableTexture2D(); + GlStateManager.disableBlend(); + } + } + } } } } - public static void drawSelectionBoundingBox(AxisAlignedBB p_181561_0_, float alpha) { - Color c = new Color(SpecialColour.specialToChromaRGB(NotEnoughUpdates.INSTANCE.manager.config.treecapOverlayColour.value), true); + public void getBuildersWandCandidates(EntityPlayer player, MovingObjectPosition target, float partialTicks, + HashSet candidatesOld, TreeMap> candidatesOldSorted, int extraMax) { + IBlockState match = Minecraft.getMinecraft().theWorld.getBlockState(target.getBlockPos()); + + candidatesOld.clear(); + candidatesOldSorted.clear(); + LinkedList candidates = new LinkedList<>(); + LinkedList candidatesNew = new LinkedList<>(); + + candidatesNew.add(target.getBlockPos()); + + double d0 = player.lastTickPosX + (player.posX - player.lastTickPosX) * (double)partialTicks; + double d1 = player.lastTickPosY + (player.posY - player.lastTickPosY) * (double)partialTicks; + double d2 = player.lastTickPosZ + (player.posZ - player.lastTickPosZ) * (double)partialTicks; + + while(candidatesOld.size() <= MAX_BUILDERS_BLOCKS+extraMax) { + if(candidatesNew.isEmpty()) { + break; + } + + candidates.addAll(candidatesNew); + candidatesNew.clear(); + + while(!candidates.isEmpty()) { + if(candidatesOld.size() > MAX_BUILDERS_BLOCKS+extraMax) break; + + BlockPos candidate = candidates.pop(); + + float distSq = (float)((candidate.getX()+0.5f-d0)*(candidate.getX()+0.5f-d0) + + (candidate.getY()+0.5f-d1-player.getEyeHeight())*(candidate.getY()+0.5f-d1-player.getEyeHeight()) + + (candidate.getZ()+0.5f-d2)*(candidate.getZ()+0.5f-d2)); + candidatesOldSorted.computeIfAbsent(distSq, k->new HashSet<>()).add(candidate); + + candidatesOld.add(candidate); + + for(int x = -1; x <= 1; x++) { + for(int y = -1; y <= 1; y++) { + for(int z = -1; z <= 1; z++) { + if(x*x+y*y+z*z == 1) { + if(((x == 0) && (target.sideHit.getAxis() == EnumFacing.Axis.X)) || + ((y == 0) && (target.sideHit.getAxis() == EnumFacing.Axis.Y)) || + ((z == 0) && (target.sideHit.getAxis() == EnumFacing.Axis.Z))) { + if(Minecraft.getMinecraft().theWorld.getBlockState(candidate.add( + x+target.sideHit.getFrontOffsetX(), + y+target.sideHit.getFrontOffsetY(), + z+target.sideHit.getFrontOffsetZ())).getBlock() == Blocks.air) { + BlockPos posNew = candidate.add(x, y, z); + if(!candidatesOld.contains(posNew) && !candidates.contains(posNew) && !candidatesNew.contains(posNew)) { + IBlockState blockNew = Minecraft.getMinecraft().theWorld.getBlockState(posNew); + if(blockNew == match) { + candidatesNew.add(posNew); + } + } + } + } + } + } + } + } + } + } + } + + public static void drawBlock(int x, int y, int z, IBlockState state, float partialTicks, float brightness) { + EntityPlayerSP player = Minecraft.getMinecraft().thePlayer; + double d0 = player.lastTickPosX + (player.posX - player.lastTickPosX) * (double)partialTicks; + double d1 = player.lastTickPosY + (player.posY - player.lastTickPosY) * (double)partialTicks; + double d2 = player.lastTickPosZ + (player.posZ - player.lastTickPosZ) * (double)partialTicks; + + BlockRendererDispatcher blockrendererdispatcher = Minecraft.getMinecraft().getBlockRendererDispatcher(); + + GlStateManager.enableTexture2D(); + GlStateManager.disableLighting(); + GlStateManager.enableBlend(); + GlStateManager.blendFunc(770, 771); + + GlStateManager.enableDepth(); + GlStateManager.depthMask(true); + GlStateManager.enableCull(); + GlStateManager.cullFace(GL11.GL_BACK); + + GlStateManager.pushMatrix(); + GlStateManager.translate(x-d0, y-d1, z-d2); + + int i = state.getBlock().getRenderType(); + if(i == 3) { + IBakedModel ibakedmodel = blockrendererdispatcher.getModelFromBlockState(state, Minecraft.getMinecraft().theWorld, null); + + Block block = state.getBlock(); + block.setBlockBoundsForItemRender(); + GlStateManager.rotate(90.0F, 0.0F, 1.0F, 0.0F); + int colour = block.getRenderColor(block.getStateForEntityRender(state)); + + if (EntityRenderer.anaglyphEnable) { + colour = TextureUtil.anaglyphColor(i); + } + + colour = (colour & 0x00FFFFFF) | (100 << 24); //Set alpha to 100 + + for (EnumFacing enumfacing : EnumFacing.values()) { + renderModelBrightnessColorQuads(colour, ibakedmodel.getFaceQuads(enumfacing)); + } + + renderModelBrightnessColorQuads(colour, ibakedmodel.getGeneralQuads()); + } + + GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F); + GlStateManager.translate(-x+d0, -y+d1, -z+d2); + GlStateManager.popMatrix(); + } + + private static void renderModelBrightnessColorQuads(int c, List listQuads) { + Tessellator tessellator = Tessellator.getInstance(); + WorldRenderer worldrenderer = tessellator.getWorldRenderer(); + + for (BakedQuad bakedquad : listQuads) { + worldrenderer.begin(7, DefaultVertexFormats.ITEM); + worldrenderer.addVertexData(bakedquad.getVertexData()); + + worldrenderer.putColor4(c); + + Vec3i vec3i = bakedquad.getFace().getDirectionVec(); + worldrenderer.putNormal((float)vec3i.getX(), (float)vec3i.getY(), (float)vec3i.getZ()); + tessellator.draw(); + } + } + + public static void drawFilledBoundingBox(AxisAlignedBB p_181561_0_, float alpha, String special) { + Color c = new Color(SpecialColour.specialToChromaRGB(special), true); GlStateManager.color(c.getRed()/255f, c.getGreen()/255f, c.getBlue()/255f, c.getAlpha()/255f*alpha); + GlStateManager.enableBlend(); + GlStateManager.tryBlendFuncSeparate(770, 771, 1, 0); + GlStateManager.disableTexture2D(); + GlStateManager.depthMask(false); + Tessellator tessellator = Tessellator.getInstance(); WorldRenderer worldrenderer = tessellator.getWorldRenderer(); //vertical @@ -250,4 +561,45 @@ public class CustomItemEffects { } + public static void drawOutlineBoundingBox(AxisAlignedBB p_181561_0_, float alpha, String special) { + Color c = new Color(SpecialColour.specialToChromaRGB(special), true); + GlStateManager.color(c.getRed()/255f, c.getGreen()/255f, c.getBlue()/255f, c.getAlpha()/255f*alpha); + + GlStateManager.enableBlend(); + GlStateManager.tryBlendFuncSeparate(770, 771, 1, 0); + GlStateManager.disableTexture2D(); + GlStateManager.depthMask(false); + + GL11.glLineWidth(3); + + Tessellator tessellator = Tessellator.getInstance(); + WorldRenderer worldrenderer = tessellator.getWorldRenderer(); + worldrenderer.begin(3, DefaultVertexFormats.POSITION); + worldrenderer.pos(p_181561_0_.minX, p_181561_0_.minY, p_181561_0_.minZ).endVertex(); + worldrenderer.pos(p_181561_0_.maxX, p_181561_0_.minY, p_181561_0_.minZ).endVertex(); + worldrenderer.pos(p_181561_0_.maxX, p_181561_0_.minY, p_181561_0_.maxZ).endVertex(); + worldrenderer.pos(p_181561_0_.minX, p_181561_0_.minY, p_181561_0_.maxZ).endVertex(); + worldrenderer.pos(p_181561_0_.minX, p_181561_0_.minY, p_181561_0_.minZ).endVertex(); + tessellator.draw(); + worldrenderer.begin(3, DefaultVertexFormats.POSITION); + worldrenderer.pos(p_181561_0_.minX, p_181561_0_.maxY, p_181561_0_.minZ).endVertex(); + worldrenderer.pos(p_181561_0_.maxX, p_181561_0_.maxY, p_181561_0_.minZ).endVertex(); + worldrenderer.pos(p_181561_0_.maxX, p_181561_0_.maxY, p_181561_0_.maxZ).endVertex(); + worldrenderer.pos(p_181561_0_.minX, p_181561_0_.maxY, p_181561_0_.maxZ).endVertex(); + worldrenderer.pos(p_181561_0_.minX, p_181561_0_.maxY, p_181561_0_.minZ).endVertex(); + tessellator.draw(); + worldrenderer.begin(1, DefaultVertexFormats.POSITION); + worldrenderer.pos(p_181561_0_.minX, p_181561_0_.minY, p_181561_0_.minZ).endVertex(); + worldrenderer.pos(p_181561_0_.minX, p_181561_0_.maxY, p_181561_0_.minZ).endVertex(); + worldrenderer.pos(p_181561_0_.maxX, p_181561_0_.minY, p_181561_0_.minZ).endVertex(); + worldrenderer.pos(p_181561_0_.maxX, p_181561_0_.maxY, p_181561_0_.minZ).endVertex(); + worldrenderer.pos(p_181561_0_.maxX, p_181561_0_.minY, p_181561_0_.maxZ).endVertex(); + worldrenderer.pos(p_181561_0_.maxX, p_181561_0_.maxY, p_181561_0_.maxZ).endVertex(); + worldrenderer.pos(p_181561_0_.minX, p_181561_0_.minY, p_181561_0_.maxZ).endVertex(); + worldrenderer.pos(p_181561_0_.minX, p_181561_0_.maxY, p_181561_0_.maxZ).endVertex(); + tessellator.draw(); + + GL11.glLineWidth(1); + } + } diff --git a/src/main/java/io/github/moulberry/notenoughupdates/DungeonBlocks.java b/src/main/java/io/github/moulberry/notenoughupdates/DungeonBlocks.java index a97032c4..f0b92c6a 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/DungeonBlocks.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/DungeonBlocks.java @@ -84,7 +84,7 @@ public class DungeonBlocks implements IResourceManagerReloadListener { } for (int i = 0; i <= mipmapLevels; ++i) { - GL11.glTexImage2D(GL11.GL_TEXTURE_2D, i, GL11.GL_RGBA, w >> i, h >> i, 0, GL12.GL_BGRA, GL12.GL_UNSIGNED_INT_8_8_8_8_REV, (IntBuffer)((IntBuffer)null)); + GL11.glTexImage2D(GL11.GL_TEXTURE_2D, i, GL11.GL_RGBA, w >> i, h >> i, 0, GL12.GL_BGRA, GL12.GL_UNSIGNED_INT_8_8_8_8_REV, ((IntBuffer)null)); } GlStateManager.bindTexture(textureId); @@ -159,7 +159,7 @@ public class DungeonBlocks implements IResourceManagerReloadListener { } for (int i = 0; i <= mipmapLevels; ++i) { - GL11.glTexImage2D(GL11.GL_TEXTURE_2D, i, GL11.GL_RGBA, w >> i, h >> i, 0, GL12.GL_BGRA, GL12.GL_UNSIGNED_INT_8_8_8_8_REV, (IntBuffer)((IntBuffer)null)); + GL11.glTexImage2D(GL11.GL_TEXTURE_2D, i, GL11.GL_RGBA, w >> i, h >> i, 0, GL12.GL_BGRA, GL12.GL_UNSIGNED_INT_8_8_8_8_REV, ((IntBuffer)null)); } } GlStateManager.bindTexture(textureId); @@ -193,20 +193,6 @@ public class DungeonBlocks implements IResourceManagerReloadListener { int index = x+y*w2; int newCol = entry.getValue(); - /*float newAlpha = ((newCol >> 24) & 0xFF)/255f; - float newRed = ((newCol >> 16) & 0xFF)/255f; - float newGreen = ((newCol >> 8) & 0xFF)/255f; - float newBlue = (newCol & 0xFF)/255f;*/ - - /*int oldCol = intbuffer.get(index); - int oldAlpha = (oldCol >> 24) & 0xFF; - float oldRed = ((oldCol >> 16) & 0xFF)/255f; - float oldGreen = ((oldCol >> 8) & 0xFF)/255f; - float oldBlue = (oldCol & 0xFF)/255f; - - int r = (int)((newRed*newAlpha + oldRed*(1-newAlpha))*255); - int g = (int)((newGreen*newAlpha + oldGreen*(1-newAlpha))*255); - int b = (int)((newBlue*newAlpha + oldBlue*(1-newAlpha))*255);*/ intbuffer.put(index, newCol); } diff --git a/src/main/java/io/github/moulberry/notenoughupdates/DungeonMap.java b/src/main/java/io/github/moulberry/notenoughupdates/DungeonMap.java index b32e3452..c9be3dab 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/DungeonMap.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/DungeonMap.java @@ -2,6 +2,7 @@ package io.github.moulberry.notenoughupdates; import io.github.moulberry.notenoughupdates.util.Utils; import net.minecraft.block.material.MapColor; +import net.minecraft.block.state.IBlockState; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Gui; import net.minecraft.client.gui.MapItemRenderer; @@ -10,30 +11,57 @@ import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.WorldRenderer; import net.minecraft.client.renderer.texture.DynamicTexture; import net.minecraft.client.renderer.vertex.DefaultVertexFormats; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; import net.minecraft.item.ItemMap; import net.minecraft.item.ItemStack; +import net.minecraft.scoreboard.ScorePlayerTeam; +import net.minecraft.util.BlockPos; import net.minecraft.util.ResourceLocation; import net.minecraft.util.Vec4b; import net.minecraft.world.storage.MapData; import net.minecraftforge.client.event.RenderGameOverlayEvent; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import org.lwjgl.input.Keyboard; import org.lwjgl.opengl.GL11; import java.awt.*; import java.awt.image.BufferedImage; import java.util.*; +import java.util.List; public class DungeonMap { - private int[] mapTextureData = null; - private DynamicTexture dynamicTexture = new DynamicTexture(128, 128); - private ResourceLocation dynamicRL = new ResourceLocation("notenoughupdates:dynamic_dungeonmap.png"); + private static final ResourceLocation GREEN_CHECK = new ResourceLocation("notenoughupdates:dungeon_map/green_check.png"); + private static final ResourceLocation WHITE_CHECK = new ResourceLocation("notenoughupdates:dungeon_map/white_check.png"); + private static final ResourceLocation QUESTION = new ResourceLocation("notenoughupdates:dungeon_map/question.png"); - private void setMapRGB(int x, int y, int rgb) { - if(mapTextureData != null) { - mapTextureData[x+y*128] = rgb; - } - } + private static final ResourceLocation ROOM_RED = new ResourceLocation("notenoughupdates:dungeon_map/rooms_default/red_room.png"); + private static final ResourceLocation ROOM_BROWN = new ResourceLocation("notenoughupdates:dungeon_map/rooms_default/brown_room.png"); + private static final ResourceLocation ROOM_GRAY = new ResourceLocation("notenoughupdates:dungeon_map/rooms_default/gray_room.png"); + private static final ResourceLocation ROOM_GREEN = new ResourceLocation("notenoughupdates:dungeon_map/rooms_default/green_room.png"); + private static final ResourceLocation ROOM_PINK = new ResourceLocation("notenoughupdates:dungeon_map/rooms_default/pink_room.png"); + private static final ResourceLocation ROOM_PURPLE = new ResourceLocation("notenoughupdates:dungeon_map/rooms_default/purple_room.png"); + private static final ResourceLocation ROOM_YELLOW = new ResourceLocation("notenoughupdates:dungeon_map/rooms_default/yellow_room.png"); + + private static final int RENDER_ROOM_SIZE = 16; + private static final int RENDER_CONN_SIZE = 4; + + private final HashMap roomMap = new HashMap<>(); + private Color[][] colourMap = new Color[128][128]; + private int startRoomX = -1; + private int startRoomY = -1; + private int connectorSize = 5; + private int roomSize = 0; + + private int roomSizeBlocks = 7; + + private final List decorations = new ArrayList<>(); + private final List lastDecorations = new ArrayList<>(); + private long lastDecorationsMillis = -1; + private long lastLastDecorationsMillis = -1; + + private Map playerMapPositions = new HashMap<>(); private class RoomOffset { int x; @@ -117,7 +145,30 @@ public class DungeonMap { RoomConnection down = new RoomConnection(RoomConnectionType.NONE, new Color(0, true)); public void render(int roomSize, int connectorSize) { - Gui.drawRect(0, 0, roomSize, roomSize, colour.getRGB()); + ResourceLocation roomTex = null; + if(colour.getRed() == 114 && colour.getGreen() == 67 && colour.getBlue() == 27) { + roomTex = ROOM_BROWN; + } else if(colour.getRed() == 65 && colour.getGreen() == 65 && colour.getBlue() == 65) { + roomTex = ROOM_GRAY; + } else if(colour.getRed() == 0 && colour.getGreen() == 124 && colour.getBlue() == 0) { + roomTex = ROOM_GREEN; + } else if(colour.getRed() == 242 && colour.getGreen() == 127 && colour.getBlue() == 165) { + roomTex = ROOM_PINK; + } else if(colour.getRed() == 178 && colour.getGreen() == 76 && colour.getBlue() == 216) { + roomTex = ROOM_PURPLE; + } else if(colour.getRed() == 255 && colour.getGreen() == 0 && colour.getBlue() == 0) { + roomTex = ROOM_RED; + } else if(colour.getRed() == 229 && colour.getGreen() == 229 && colour.getBlue() == 51) { + roomTex = ROOM_YELLOW; + } + + if(roomTex != null) { + Minecraft.getMinecraft().getTextureManager().bindTexture(roomTex); + GlStateManager.color(1, 1, 1, 1); + Utils.drawTexturedRect(0, 0, roomSize, roomSize, GL11.GL_LINEAR); + } + + //Gui.drawRect(0, 0, roomSize, roomSize, colour.getRGB()); if(tickColour != 0) { Gui.drawRect(roomSize/2-4, roomSize/2-4, roomSize/2+4, roomSize/2+4, tickColour); } @@ -181,13 +232,6 @@ public class DungeonMap { } } } - - public void render(int[] renderTo, int x, int y, int rgb) { - int i = x+y*128; - if(i >= 0 && i < renderTo.length) { - renderTo[i] = rgb; - } - } private static final ResourceLocation mapIcons = new ResourceLocation("textures/map/map_icons.png"); @@ -203,23 +247,42 @@ public class DungeonMap { maxRoomY = Math.max(offset.y, maxRoomY); } - int roomSize = 16; - int connSize = 4; - - Gui.drawRect(8, 8, 8+(maxRoomX-minRoomX+1)*(roomSize+connSize), 8+(maxRoomY-minRoomY+1)*(roomSize+connSize), + /*Set uniques = new HashSet<>(); + for(Color[] cs : colourMap) { + for(Color c : cs) { + uniques.add(c); + } + } + System.out.println("Unique colours:"); + for(Color c : uniques) { + System.out.println(c + "" + c.getAlpha()); + }*/ + + int centerX = 80; + int centerY = 80; + int rotation = (int)Minecraft.getMinecraft().thePlayer.rotationYawHead; + + GlStateManager.pushMatrix(); + GlStateManager.translate(centerX, centerY, 0); + GlStateManager.rotate(-rotation+180, 0, 0, 1); + GlStateManager.translate(-(maxRoomX-minRoomX+1)*(RENDER_ROOM_SIZE+RENDER_CONN_SIZE)/2f, + -(maxRoomY-minRoomY+1)*(RENDER_ROOM_SIZE+RENDER_CONN_SIZE)/2f, 0); + + Gui.drawRect(-10, -10, (maxRoomX-minRoomX)*(RENDER_ROOM_SIZE+RENDER_CONN_SIZE)+RENDER_ROOM_SIZE+10, + (maxRoomY-minRoomY)*(RENDER_ROOM_SIZE+RENDER_CONN_SIZE)+RENDER_ROOM_SIZE+10, new Color(200, 200, 200).getRGB()); for(Map.Entry entry : roomMap.entrySet()) { RoomOffset roomOffset = entry.getKey(); Room room = entry.getValue(); - int x = (roomOffset.x-minRoomX)*(roomSize+connSize); - int y = (roomOffset.y-minRoomY)*(roomSize+connSize); + int x = (roomOffset.x-minRoomX)*(RENDER_ROOM_SIZE+RENDER_CONN_SIZE); + int y = (roomOffset.y-minRoomY)*(RENDER_ROOM_SIZE+RENDER_CONN_SIZE); GlStateManager.pushMatrix(); - GlStateManager.translate(x+10, y+10, 0); - room.render(roomSize, connSize); - GlStateManager.translate(-(x+10), -(y+10), 0); + GlStateManager.translate(x, y, 0); + room.render(RENDER_ROOM_SIZE, RENDER_CONN_SIZE); + GlStateManager.translate(-x, -y, 0); GlStateManager.popMatrix(); } @@ -228,39 +291,89 @@ public class DungeonMap { GlStateManager.color(1, 1, 1, 1); Minecraft.getMinecraft().getTextureManager().bindTexture(mapIcons); int k = 0; - for(MapDecoration decoration : decorations) { - float x = (decoration.roomsOffsetX+decoration.roomInPercentX)*roomSize + - (decoration.connOffsetX+decoration.connInPercentX)*connectorSize; - float y = (decoration.roomsOffsetY+decoration.roomInPercentY)*roomSize + - (decoration.connOffsetY+decoration.connInPercentY)*connectorSize; + for(int i=0; i 180 && angleLast < 180) angleLast += 360; + if(angleLast > 180 && angle < 180) angle += 360; + + float interpFactor = Math.round((System.currentTimeMillis() - lastDecorationsMillis)*100f)/100f/(lastDecorationsMillis - lastLastDecorationsMillis); + interpFactor = Math.max(0, Math.min(1, interpFactor)); + + x = xLast+(x - xLast)*interpFactor; + y = yLast+(y - yLast)*interpFactor; + angle = angleLast+(angle - angleLast)*interpFactor; + angle %= 360; + } + } + } - x -= minRoomX*(roomSize+connSize); - y -= minRoomY*(roomSize+connSize); + if(decoration.id == 3 || decoration.id == 1) { + float closestDistSq = RENDER_ROOM_SIZE*RENDER_ROOM_SIZE; + EntityPlayer closestPlayer = null; + for(Map.Entry entry : playerMapPositions.entrySet()) { + if(Minecraft.getMinecraft().thePlayer.getName().equalsIgnoreCase(entry.getKey().getName()) != (decoration.id == 1)) { + continue; + } + + float playerX = entry.getValue().getRenderX(); + float playerY = entry.getValue().getRenderY(); + + float distSq = (playerX-x)*(playerX-x) + (playerY-y)*(playerY-y); + + if(distSq < closestDistSq) { + closestDistSq = distSq; + closestPlayer = entry.getKey(); + } + } + + if(closestPlayer != null) { + x = playerMapPositions.get(closestPlayer).getRenderX(); + y = playerMapPositions.get(closestPlayer).getRenderY(); + angle = closestPlayer.rotationYawHead; + } + } - //System.out.println(decoration.angle); + x -= minRoomX*(RENDER_ROOM_SIZE+RENDER_CONN_SIZE); + y -= minRoomY*(RENDER_ROOM_SIZE+RENDER_CONN_SIZE); GlStateManager.pushMatrix(); - GlStateManager.translate(x+10, y+10, -0.02F); - GlStateManager.rotate(decoration.angle, 0.0F, 0.0F, 1.0F); + GlStateManager.translate(x, y, -0.02F); + GlStateManager.rotate(angle, 0.0F, 0.0F, 1.0F); GlStateManager.scale(4.0F, 4.0F, 3.0F); GlStateManager.translate(-0.125F, 0.125F, 0.0F); worldrenderer.begin(7, DefaultVertexFormats.POSITION_TEX); - worldrenderer.pos(-1.0D, 1.0D, 10+((float)k * -0.001F)).tex(decoration.minU, decoration.minV).endVertex(); - worldrenderer.pos(1.0D, 1.0D, 10+((float)k * -0.001F)).tex(decoration.minU+1/4f, decoration.minV).endVertex(); - worldrenderer.pos(1.0D, -1.0D, 10+((float)k * -0.001F)).tex(decoration.minU+1/4f, decoration.minV+1/4f).endVertex(); - worldrenderer.pos(-1.0D, -1.0D, 10+((float)k * -0.001F)).tex(decoration.minU, decoration.minV+1/4f).endVertex(); + worldrenderer.pos(-1.0D, 1.0D, 10+((float)k * -0.001F)).tex(minU, minV).endVertex(); + worldrenderer.pos(1.0D, 1.0D, 10+((float)k * -0.001F)).tex(minU+1/4f, minV).endVertex(); + worldrenderer.pos(1.0D, -1.0D, 10+((float)k * -0.001F)).tex(minU+1/4f, minV+1/4f).endVertex(); + worldrenderer.pos(-1.0D, -1.0D, 10+((float)k * -0.001F)).tex(minU, minV+1/4f).endVertex(); tessellator.draw(); GlStateManager.popMatrix(); k--; } + + GlStateManager.rotate(rotation-180, 0, 0, 1); + GlStateManager.translate(-centerX, -centerY, 0); + GlStateManager.popMatrix(); } - private HashMap roomMap = new HashMap<>(); - private Color[][] colourMap = new Color[128][128]; - private int startRoomX = -1; - private int startRoomY = -1; - private int connectorSize = 5; - private int roomSize = 0; public void updateRoomConnections(RoomOffset roomOffset) { if(roomMap.containsKey(roomOffset)) { @@ -273,7 +386,7 @@ public class DungeonMap { int x = startRoomX + roomOffset.x*(roomSize+connectorSize) + xOff; int y = startRoomY + roomOffset.y*(roomSize+connectorSize) + yOff; - if(x < colourMap.length && y < colourMap[x].length) { + if(x > 0 && y > 0 && x < colourMap.length && y < colourMap[x].length) { Color c = colourMap[x][y]; if(!c.equals(room.colour)) { if(otherPixelColour == c.getRGB()) { @@ -317,7 +430,7 @@ public class DungeonMap { y += i; } - if(x < colourMap.length && y < colourMap[x].length) { + if(x > 0 && y > 0 && x < colourMap.length && y < colourMap[x].length) { if(colourMap[x][y].equals(room.colour)) { totalFilled++; } @@ -343,6 +456,7 @@ public class DungeonMap { } } + room.fillCorner = false; if(room.left.type == RoomConnectionType.ROOM_DIVIDER && room.up.type == RoomConnectionType.ROOM_DIVIDER) { RoomOffset upleft = new RoomOffset(roomOffset.x-1, roomOffset.y-1); if(roomMap.containsKey(upleft)) { @@ -365,8 +479,10 @@ public class DungeonMap { int y = startRoomY + neighbor.y*(roomSize+connectorSize); if(x > 0 && y > 0 && x+roomSize < colourMap.length && y+roomSize < colourMap[x].length) { - roomMap.put(neighbor, new Room()); - loadNeighbors(neighbor); + if(colourMap[x][y].getAlpha() > 100) { + roomMap.put(neighbor, new Room()); + loadNeighbors(neighbor); + } } } } @@ -383,48 +499,77 @@ public class DungeonMap { } } - private Set decorations = new HashSet<>(); class MapDecoration { - float roomInPercentX; - float connInPercentX; - float roomsOffsetX; - float connOffsetX; - float roomInPercentY; - float connInPercentY; - float roomsOffsetY; - float connOffsetY; - - float minU; - float minV; - + MapPosition position; + int id; float angle; - public MapDecoration(float roomInPercentX, float connInPercentX, float roomsOffsetX, float connOffsetX, - float roomInPercentY, float connInPercentY, float roomsOffsetY, float connOffsetY, float minU, float minV, float angle) { - this.roomInPercentX = roomInPercentX; - this.connInPercentX = connInPercentX; - this.roomsOffsetX = roomsOffsetX; + public MapDecoration(MapPosition position, int id, float angle) { + this.position = position; + this.id = id; + this.angle = angle; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + MapDecoration that = (MapDecoration) o; + return id == that.id && + Float.compare(that.angle, angle) == 0 && + Objects.equals(position, that.position); + } + + @Override + public int hashCode() { + return Objects.hash(position, id, angle); + } + } + + private class MapPosition { + public float roomOffsetX; + public float connOffsetX; + + public float roomOffsetY; + public float connOffsetY; + + public MapPosition(float roomOffsetX, float connOffsetX, float roomOffsetY, float connOffsetY) { + this.roomOffsetX = roomOffsetX; this.connOffsetX = connOffsetX; - this.roomInPercentY = roomInPercentY; - this.connInPercentY = connInPercentY; - this.roomsOffsetY = roomsOffsetY; + this.roomOffsetY = roomOffsetY; this.connOffsetY = connOffsetY; - this.minU = minU; - this.minV = minV; - this.angle = angle; + } + + public float getRenderX() { + return roomOffsetX*RENDER_ROOM_SIZE + connOffsetX*RENDER_CONN_SIZE; + } + + public float getRenderY() { + return roomOffsetY*RENDER_ROOM_SIZE + connOffsetY*RENDER_CONN_SIZE; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + MapPosition that = (MapPosition) o; + return Float.compare(that.roomOffsetX, roomOffsetX) == 0 && + Float.compare(that.connOffsetX, connOffsetX) == 0 && + Float.compare(that.roomOffsetY, roomOffsetY) == 0 && + Float.compare(that.connOffsetY, connOffsetY) == 0; + } + + @Override + public int hashCode() { + return Objects.hash(roomOffsetX, connOffsetX, roomOffsetY, connOffsetY); } } @SubscribeEvent public void onRenderOverlay(RenderGameOverlayEvent event) { - //System.out.println("render overlayw"); if(event.type == RenderGameOverlayEvent.ElementType.ALL) { ItemStack stack = Minecraft.getMinecraft().thePlayer.inventory.mainInventory[8]; - if(NotEnoughUpdates.INSTANCE.colourMap != null || stack != null && stack.getItem() instanceof ItemMap) { - if(mapTextureData == null) { - mapTextureData = dynamicTexture.getTextureData(); - } - + if(NotEnoughUpdates.INSTANCE.colourMap != null || (stack != null && stack.getItem() instanceof ItemMap)) { if(NotEnoughUpdates.INSTANCE.colourMap != null) { colourMap = NotEnoughUpdates.INSTANCE.colourMap; } else { @@ -452,6 +597,12 @@ public class DungeonMap { //mapData. } + roomMap.clear(); + startRoomX = -1; + startRoomY = -1; + connectorSize = 5; + roomSize = 0; + for(int x=0; x 0 && y > 0 && x < colourMap.length && y < colourMap[x].length) { if(colourMap[x][y].getAlpha() > 80) { if(j == 1) { break; @@ -515,6 +666,92 @@ public class DungeonMap { } } + List dists = new ArrayList<>(); + int currentBlockCount = 0; + for(int i=0; i<300; i++) { + IBlockState state = Minecraft.getMinecraft().theWorld.getBlockState(new BlockPos(0, 99, i)); + if(state == null || state.getBlock() == Blocks.air) { + if(currentBlockCount > 0) dists.add(currentBlockCount); + currentBlockCount = 0; + } else { + currentBlockCount++; + } + } + //roomSizeBlocks = 7; + currentBlockCount = 0; + for(int i=0; i<300; i++) { + IBlockState state = Minecraft.getMinecraft().theWorld.getBlockState(new BlockPos(i, 99, 0)); + if(state == null || state.getBlock() == Blocks.air) { + if(currentBlockCount > 0) dists.add(currentBlockCount); + currentBlockCount = 0; + } else { + currentBlockCount++; + } + } + int count = 0; + int mostCommonDist = -1; + for(int dist : dists) { + if(dist == mostCommonDist) { + count++; + } else { + if(--count < 0) { + count = 1; + mostCommonDist = dist; + } + } + } + if(mostCommonDist != -1) roomSizeBlocks = Math.max(31, mostCommonDist); + if(Keyboard.isKeyDown(Keyboard.KEY_N)) System.out.println(roomSizeBlocks + ":" + dists.size()); + + Set actualPlayers = new HashSet<>(); + for(ScorePlayerTeam team : Minecraft.getMinecraft().thePlayer.getWorldScoreboard().getTeams()) { + if(team.getTeamName().startsWith("a")) { + for(String player : team.getMembershipCollection()) { + actualPlayers.add(player.toLowerCase()); + } + } + } + + playerMapPositions.clear