From 28e698de1fce5f70ad497e44cc5d56c350c868e5 Mon Sep 17 00:00:00 2001 From: warmthdawn Date: Sat, 9 Jan 2021 14:20:28 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E4=BA=86=E4=B8=80=E7=82=B9bug=20?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BA=86=E8=8C=83=E5=9B=B4=E6=A8=A1=E5=9D=97?= =?UTF-8?q?=E5=8C=96=E9=80=89=E6=8B=A9=E5=B7=A5=E5=85=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 4 +- build.properties | 2 +- .../warmthdawn/mod/gugu_utils/GuGuUtils.java | 4 +- .../warmthdawn/mod/gugu_utils/ModItems.java | 7 + .../botania/lens/LensTransform.java | 2 +- .../mod/gugu_utils/common/Constants.java | 7 + .../crafttweaker/CraftTweakerCompact.java | 2 +- .../jei/components/JEIComponentAura.java | 2 +- .../components/JEIComponentEnvironment.java | 2 +- .../jei/components/JEIComponentMana.java | 2 +- .../jei/components/JEIComponentStarlight.java | 8 +- .../gugu_utils/jei/renders/RendererAura.java | 6 +- .../gugu_utils/jei/renders/RendererEmber.java | 5 + .../jei/renders/RendererStarlight.java | 23 +- .../embers/BlockEmberInputHatch.java | 5 + .../embers/EmbersHatchVariant.java | 7 +- .../mana/TileSparkManaHatch.java | 3 +- .../starlight/GuiStarlightInputHatch.java | 6 +- .../tools/ItemRangedConstructTool.java | 90 +++++ .../gugu_utils/proxy/ClientEventHandler.java | 1 - .../mod/gugu_utils/proxy/CommonProxy.java | 4 +- .../gugu_utils/proxy/MiscEventHandler.java | 44 +++ .../mod/gugu_utils/tools/OpenGlDebugging.java | 353 ++++++++++++++++++ .../mod/gugu_utils/tools/RenderTools.java | 101 +++++ .../gugu_utils/tools/RenderToolsInternal.java | 124 ++++++ .../mod/gugu_utils/tools/RenderUtils.java | 9 +- .../assets/gugu-utils/lang/en_us.lang | 2 + .../assets/gugu-utils/lang/zh_cn.lang | 2 + .../models/item/constructionranged.json | 6 + .../gugu-utils/textures/gui/recipes_ui.png | Bin 17175 -> 15599 bytes .../textures/items/rangedwrench.png | Bin 0 -> 3564 bytes 31 files changed, 792 insertions(+), 41 deletions(-) create mode 100644 src/main/java/com/warmthdawn/mod/gugu_utils/modularmachenary/tools/ItemRangedConstructTool.java create mode 100644 src/main/java/com/warmthdawn/mod/gugu_utils/tools/OpenGlDebugging.java create mode 100644 src/main/java/com/warmthdawn/mod/gugu_utils/tools/RenderTools.java create mode 100644 src/main/java/com/warmthdawn/mod/gugu_utils/tools/RenderToolsInternal.java create mode 100644 src/main/resources/assets/gugu-utils/models/item/constructionranged.json create mode 100644 src/main/resources/assets/gugu-utils/textures/items/rangedwrench.png diff --git a/build.gradle b/build.gradle index a1817a4..43877fd 100644 --- a/build.gradle +++ b/build.gradle @@ -11,7 +11,7 @@ apply plugin: 'net.minecraftforge.gradle.forge' //Only edit below this line, the above code adds and enables the necessary things for Forge to be setup. -version = '0.2.1' +version = '0.5.2' group = 'com.warmthdawn.mod.gugu-utils' // http://maven.apache.org/guides/mini/guide-naming-conventions.html archivesBaseName = 'gugu-utils' @@ -102,7 +102,7 @@ dependencies { runtime "curse.maven:guideapi-${guideapi_version}" // deobfCompile "curse.maven:embersrekindled-${embers_version}" - deobfProvided "curse.maven:embersrekindled-${embers_version}" + deobfCompile "curse.maven:embersrekindled-${embers_version}" deobfCompile "curse.maven:bloodmagic-${bloodmagic_version_curse}" diff --git a/build.properties b/build.properties index cb0a4ae..a9591b9 100644 --- a/build.properties +++ b/build.properties @@ -1,2 +1,2 @@ -version=0.5.0 +version=0.5.2 mcversion=1.12.2 \ No newline at end of file diff --git a/src/main/java/com/warmthdawn/mod/gugu_utils/GuGuUtils.java b/src/main/java/com/warmthdawn/mod/gugu_utils/GuGuUtils.java index 2a489e6..561f3e5 100644 --- a/src/main/java/com/warmthdawn/mod/gugu_utils/GuGuUtils.java +++ b/src/main/java/com/warmthdawn/mod/gugu_utils/GuGuUtils.java @@ -27,9 +27,9 @@ @Mod(modid = GuGuUtils.MODID, name = GuGuUtils.NAME, version = GuGuUtils.VERSION, dependencies = GuGuUtils.DEPENDENCY) public class GuGuUtils { public static final String MODID = "gugu-utils"; - public static final String DEPENDENCY = "after:modularmachinery"; + public static final String DEPENDENCY = "required-after:codechickenlib@[3.2.2,);required-after:mcjtylib_ng@[3.5.4,);after:modularmachinery;"; public static final String NAME = "GuGu Utils"; - public static final String VERSION = "0.1"; + public static final String VERSION = "0.5.2"; public static final CreativeTabs creativeTab = new CreativeTabs(GuGuUtils.MODID) { @Override @Nonnull diff --git a/src/main/java/com/warmthdawn/mod/gugu_utils/ModItems.java b/src/main/java/com/warmthdawn/mod/gugu_utils/ModItems.java index c22661a..181435c 100644 --- a/src/main/java/com/warmthdawn/mod/gugu_utils/ModItems.java +++ b/src/main/java/com/warmthdawn/mod/gugu_utils/ModItems.java @@ -10,6 +10,7 @@ import com.warmthdawn.mod.gugu_utils.modularmachenary.mana.ItemManaBlock; import com.warmthdawn.mod.gugu_utils.modularmachenary.mana.TileSparkManaHatch; import com.warmthdawn.mod.gugu_utils.modularmachenary.starlight.BlockStarightInputHatch; +import com.warmthdawn.mod.gugu_utils.modularmachenary.tools.ItemRangedConstructTool; import net.minecraft.item.Item; import net.minecraft.item.ItemBlock; import net.minecraftforge.fml.common.registry.GameRegistry; @@ -27,15 +28,20 @@ public class ModItems { @GameRegistry.ObjectHolder(STRING_RESOURCE_LENS_TRANSFORM) public static Item lensTransform; + @GameRegistry.ObjectHolder(STRING_RANGED_CONSTRUCTION_TOOL) + public static Item constructionTool; + @SideOnly(Side.CLIENT) public static void initModels() { if (Loads.BOTANIA) { ((ItemLensAddition) lensOverclocking).initModel(); ((ItemLensAddition) lensTransform).initModel(); + ((ItemRangedConstructTool) constructionTool).initModel(); } } public static void register(IForgeRegistry registry) { + if (Loads.BOTANIA) { registry.register(new ItemLensOverclocking().setRegistryName(RESOURCE_LENS_OVERCLOCKING)); registry.register(new ItemLensTransform().setRegistryName(RESOURCE_LENS_TRANSFORM)); @@ -44,6 +50,7 @@ public static void register(IForgeRegistry registry) { registry.register(new ItemBlock(ModBlocks.blockEnvironmentHatch).setRegistryName(RESOURCE_ENVIRONMENTHATCH)); registry.register(new ItemBlock(ModBlocks.blockEnergyOutputPort).setRegistryName(RESOURCE_ENERGYPORT_OUTPUT)); + registry.register(new ItemRangedConstructTool().setRegistryName(RESOURCE_RANGED_CONSTRUCTION_TOOL)); if (Loads.BOTANIA) { registry.register(new ItemManaBlock((BlockSparkManaHatch) ModBlocks.blockSparkManaHatch, TileSparkManaHatch.MAX_MANA).setRegistryName(RESOURCE_MANAHATCH)); } diff --git a/src/main/java/com/warmthdawn/mod/gugu_utils/botania/lens/LensTransform.java b/src/main/java/com/warmthdawn/mod/gugu_utils/botania/lens/LensTransform.java index 2d7a148..0e3110e 100644 --- a/src/main/java/com/warmthdawn/mod/gugu_utils/botania/lens/LensTransform.java +++ b/src/main/java/com/warmthdawn/mod/gugu_utils/botania/lens/LensTransform.java @@ -62,7 +62,7 @@ public void updateBurst(IManaBurst burst, EntityThrowable entity, ItemStack stac int maxStack = recipe.getOutput().getMaxStackSize(); while (outputCount > 0) { ItemStack out = recipe.getOutput().copy(); - out.setCount(Math.max(maxStack, outputCount)); + out.setCount(Math.min(maxStack, outputCount)); entity.world.spawnEntity( new EntityItem(entity.world, entity.posX, entity.posY, entity.posZ, out)); diff --git a/src/main/java/com/warmthdawn/mod/gugu_utils/common/Constants.java b/src/main/java/com/warmthdawn/mod/gugu_utils/common/Constants.java index 52e6cda..58b09cc 100644 --- a/src/main/java/com/warmthdawn/mod/gugu_utils/common/Constants.java +++ b/src/main/java/com/warmthdawn/mod/gugu_utils/common/Constants.java @@ -66,4 +66,11 @@ public class Constants { public static final ResourceLocation RESOURCE_LENS_TRANSFORM = new ResourceLocation(GuGuUtils.MODID, NAME_LENS_TRANSFORM); public static final String STRING_RESOURCE_LENS_TRANSFORM = GuGuUtils.MODID + ":" + NAME_LENS_TRANSFORM; + + //物品 + public static final String NAME_RANGED_CONSTRUCTION_TOOL = "constructionranged"; + public static final ResourceLocation RESOURCE_RANGED_CONSTRUCTION_TOOL = new ResourceLocation(GuGuUtils.MODID, NAME_RANGED_CONSTRUCTION_TOOL); + public static final String STRING_RANGED_CONSTRUCTION_TOOL = GuGuUtils.MODID + ":" + NAME_RANGED_CONSTRUCTION_TOOL; + + } diff --git a/src/main/java/com/warmthdawn/mod/gugu_utils/crafttweaker/CraftTweakerCompact.java b/src/main/java/com/warmthdawn/mod/gugu_utils/crafttweaker/CraftTweakerCompact.java index 288424d..ecde0e5 100644 --- a/src/main/java/com/warmthdawn/mod/gugu_utils/crafttweaker/CraftTweakerCompact.java +++ b/src/main/java/com/warmthdawn/mod/gugu_utils/crafttweaker/CraftTweakerCompact.java @@ -11,7 +11,7 @@ public class CraftTweakerCompact { public static final List LATE_ADDITIONS = new ArrayList<>(); public static final List LATE_REMOVALS = new ArrayList<>(); - public static void init() { + public static void preInit() { if(Loads.MODULAR_MACHIENARY) CraftTweakerAPI.registerClass(RecipePrimerExt.class); diff --git a/src/main/java/com/warmthdawn/mod/gugu_utils/jei/components/JEIComponentAura.java b/src/main/java/com/warmthdawn/mod/gugu_utils/jei/components/JEIComponentAura.java index 3c11bcc..27997a5 100644 --- a/src/main/java/com/warmthdawn/mod/gugu_utils/jei/components/JEIComponentAura.java +++ b/src/main/java/com/warmthdawn/mod/gugu_utils/jei/components/JEIComponentAura.java @@ -46,7 +46,7 @@ public void onJEIHoverTooltip(int slotIndex, boolean input, IngredientAura ingre public static class LayoutPart extends LayoutWapper { public LayoutPart(Point offset) { - super(offset, 6, 80, 6, 100, 0, 10, 8, 4, 2, 100); + super(offset, 6, 80, 6, 100, 0, 10, 8, 4, 2, 200); } @Override diff --git a/src/main/java/com/warmthdawn/mod/gugu_utils/jei/components/JEIComponentEnvironment.java b/src/main/java/com/warmthdawn/mod/gugu_utils/jei/components/JEIComponentEnvironment.java index c0ad9a0..21e50b5 100644 --- a/src/main/java/com/warmthdawn/mod/gugu_utils/jei/components/JEIComponentEnvironment.java +++ b/src/main/java/com/warmthdawn/mod/gugu_utils/jei/components/JEIComponentEnvironment.java @@ -48,7 +48,7 @@ public void onJEIHoverTooltip(int slotIndex, boolean input, IngredientEnvironmen public static class LayoutPart extends LayoutWapper { public LayoutPart(Point offset) { - super(offset, 16, 16, 0, 0, 4, 4, 3, 200); + super(offset, 16, 16, 0, 0, 4, 4, 3, 50); } @Override diff --git a/src/main/java/com/warmthdawn/mod/gugu_utils/jei/components/JEIComponentMana.java b/src/main/java/com/warmthdawn/mod/gugu_utils/jei/components/JEIComponentMana.java index 8762a92..d643b67 100644 --- a/src/main/java/com/warmthdawn/mod/gugu_utils/jei/components/JEIComponentMana.java +++ b/src/main/java/com/warmthdawn/mod/gugu_utils/jei/components/JEIComponentMana.java @@ -61,7 +61,7 @@ public static class LayoutPart extends LayoutWapper { public LayoutPart(Point offset) { // super(offset, 5, 118, 0, 0, 16, 16, 5, 900); - super(offset, 5, 102, 5, 118, 0, 0, 8, 8, 3, 900); + super(offset, 5, 102, 5, 118, 0, 0, 8, 8, 3, 200); } @Override diff --git a/src/main/java/com/warmthdawn/mod/gugu_utils/jei/components/JEIComponentStarlight.java b/src/main/java/com/warmthdawn/mod/gugu_utils/jei/components/JEIComponentStarlight.java index 4bb4ab4..d499413 100644 --- a/src/main/java/com/warmthdawn/mod/gugu_utils/jei/components/JEIComponentStarlight.java +++ b/src/main/java/com/warmthdawn/mod/gugu_utils/jei/components/JEIComponentStarlight.java @@ -3,13 +3,11 @@ import com.warmthdawn.mod.gugu_utils.jei.LayoutWapper; import com.warmthdawn.mod.gugu_utils.jei.ingedients.IngredientStarlight; import com.warmthdawn.mod.gugu_utils.jei.renders.RendererStarlight; -import hellfirepvp.astralsorcery.client.util.RenderConstellation; import hellfirepvp.astralsorcery.common.constellation.IConstellation; import hellfirepvp.modularmachinery.common.crafting.helper.ComponentRequirement; import hellfirepvp.modularmachinery.common.integration.recipe.RecipeLayoutPart; import mezz.jei.api.ingredients.IIngredientRenderer; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.GlStateManager; import net.minecraft.util.ResourceLocation; import java.awt.*; @@ -37,7 +35,7 @@ public List getJEIIORequirements() { @Override public RecipeLayoutPart getLayoutPart(Point offset) { - return new LayoutPart(offset); + return new LayoutPart(offset, constellation != null); } @Override @@ -47,9 +45,9 @@ public void onJEIHoverTooltip(int slotIndex, boolean input, IngredientStarlight public static class LayoutPart extends LayoutWapper { - public LayoutPart(Point offset) { + public LayoutPart(Point offset, boolean showConstellation) { // super(new Point(offset.x, offset.y - 32), 16, 80, 0, 32, 16, 16, 1, 100000); - super(offset, 16, 16, 16, 80, 0, 16, 8, 8, 2, 100000); + super(offset, 16, 16, 24, 80, 8, 16, 8, 8, 1, 80); } @Override diff --git a/src/main/java/com/warmthdawn/mod/gugu_utils/jei/renders/RendererAura.java b/src/main/java/com/warmthdawn/mod/gugu_utils/jei/renders/RendererAura.java index b72f608..0e79560 100644 --- a/src/main/java/com/warmthdawn/mod/gugu_utils/jei/renders/RendererAura.java +++ b/src/main/java/com/warmthdawn/mod/gugu_utils/jei/renders/RendererAura.java @@ -25,7 +25,7 @@ private RendererAura() { @Override public void render(Minecraft minecraft, int xPosition, int yPosition, @Nullable IngredientAura ingredient) { - renderAuraBar(minecraft, xPosition, yPosition, (int) ingredient.getValue() * ingredient.getTicks(), TileAuraHatch.MAX_AURA); + renderAuraBar(minecraft, xPosition, yPosition, (int) ingredient.getValue() * ingredient.getTicks(), TileAuraHatch.MAX_AURA / 3); } private void renderAuraBar(Minecraft mc, int offX, int offY, int totalAmount, int max) { @@ -41,8 +41,8 @@ private void renderAuraBar(Minecraft mc, int offX, int offY, int totalAmount, in tHeight = 80; } int offset = 80 - tHeight; - RenderUtils.drawTexturedModalRect(offX, offY, 0, 0, 102, 6, offset); - RenderUtils.drawTexturedModalRect(offX, offY + offset, 0, 6, 102 + offset, 6, tHeight); + RenderUtils.drawTexturedModalRect(offX, offY, 0, 0, 104, 6, offset); + RenderUtils.drawTexturedModalRect(offX, offY + offset, 0, 6, 104 + offset, 6, tHeight); int color = 0x53a008; if (totalPercentage > 1F) mc.fontRenderer.drawString("+", offX + 4, offY - 0.5F, color, true); diff --git a/src/main/java/com/warmthdawn/mod/gugu_utils/jei/renders/RendererEmber.java b/src/main/java/com/warmthdawn/mod/gugu_utils/jei/renders/RendererEmber.java index a73bbea..eac817d 100644 --- a/src/main/java/com/warmthdawn/mod/gugu_utils/jei/renders/RendererEmber.java +++ b/src/main/java/com/warmthdawn/mod/gugu_utils/jei/renders/RendererEmber.java @@ -7,6 +7,7 @@ import com.warmthdawn.mod.gugu_utils.tools.RenderUtils; import mezz.jei.api.ingredients.IIngredientRenderer; import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.resources.I18n; import net.minecraft.client.util.ITooltipFlag; import net.minecraft.item.ItemStack; @@ -38,7 +39,11 @@ public EmbersHatchVariant getHatchLevel(double ember) { public void render(Minecraft minecraft, int xPosition, int yPosition, @Nullable IngredientEmber ingredient) { int maxEmber = Math.max(800, getHatchLevel((double) ingredient.getValue()).getEmberMaxStorage()); + GlStateManager.pushMatrix(); + GlStateManager.enableAlpha(); RenderUtils.renderEmberBarVertical(xPosition, yPosition, 0.7f, (float) (double) ingredient.getValue() / maxEmber); + GlStateManager.disableAlpha(); + GlStateManager.popMatrix(); } @Override diff --git a/src/main/java/com/warmthdawn/mod/gugu_utils/jei/renders/RendererStarlight.java b/src/main/java/com/warmthdawn/mod/gugu_utils/jei/renders/RendererStarlight.java index 92dad24..ccdb7db 100644 --- a/src/main/java/com/warmthdawn/mod/gugu_utils/jei/renders/RendererStarlight.java +++ b/src/main/java/com/warmthdawn/mod/gugu_utils/jei/renders/RendererStarlight.java @@ -1,5 +1,6 @@ package com.warmthdawn.mod.gugu_utils.jei.renders; +import codechicken.lib.render.state.GlStateTracker; import com.google.common.collect.Lists; import com.warmthdawn.mod.gugu_utils.ModBlocks; import com.warmthdawn.mod.gugu_utils.jei.ingedients.IngredientStarlight; @@ -38,18 +39,21 @@ public class RendererStarlight implements IIngredientRenderer tooltip, I double emberCapacity = tagCompound.getDouble("emberCapacity"); DecimalFormat emberFormat = Embers.proxy.getDecimalFormat("embers.decimal_format.ember"); addInformationLocalized(tooltip, emberFormat.format(ember), emberFormat.format(emberCapacity)); + } else if (stack.getMetadata() < EmbersHatchVariant.VAULES.length) { + EmbersHatchVariant variant = EmbersHatchVariant.VAULES[stack.getMetadata()]; + double emberCapacity = variant.getEmberMaxStorage(); + DecimalFormat emberFormat = Embers.proxy.getDecimalFormat("embers.decimal_format.ember"); + addInformationLocalized(tooltip, emberFormat.format(0), emberFormat.format(emberCapacity)); } } diff --git a/src/main/java/com/warmthdawn/mod/gugu_utils/modularmachenary/embers/EmbersHatchVariant.java b/src/main/java/com/warmthdawn/mod/gugu_utils/modularmachenary/embers/EmbersHatchVariant.java index 39e049a..73bfd19 100644 --- a/src/main/java/com/warmthdawn/mod/gugu_utils/modularmachenary/embers/EmbersHatchVariant.java +++ b/src/main/java/com/warmthdawn/mod/gugu_utils/modularmachenary/embers/EmbersHatchVariant.java @@ -12,8 +12,9 @@ public enum EmbersHatchVariant implements IStringSerializable { BIG, HUGE, LUDICROUS, - EXTREME - ; + EXTREME; + + public static final EmbersHatchVariant[] VAULES = EmbersHatchVariant.values(); @Override public String getName() { @@ -21,7 +22,7 @@ public String getName() { } public int getEmberMaxStorage() { - switch (this){ + switch (this) { case TINY: default: return 400; diff --git a/src/main/java/com/warmthdawn/mod/gugu_utils/modularmachenary/mana/TileSparkManaHatch.java b/src/main/java/com/warmthdawn/mod/gugu_utils/modularmachenary/mana/TileSparkManaHatch.java index 35eae03..7cae987 100644 --- a/src/main/java/com/warmthdawn/mod/gugu_utils/modularmachenary/mana/TileSparkManaHatch.java +++ b/src/main/java/com/warmthdawn/mod/gugu_utils/modularmachenary/mana/TileSparkManaHatch.java @@ -4,7 +4,6 @@ import com.warmthdawn.mod.gugu_utils.ModBlocks; import com.warmthdawn.mod.gugu_utils.common.IRestorableTileEntity; import com.warmthdawn.mod.gugu_utils.modularmachenary.IColorableTileEntity; -import com.warmthdawn.mod.gugu_utils.modularmachenary.starlight.BlockStarightInputHatch; import com.warmthdawn.mod.gugu_utils.network.Messages; import com.warmthdawn.mod.gugu_utils.network.PacketMana; import com.warmthdawn.mod.gugu_utils.tools.CIELab; @@ -132,7 +131,7 @@ public NBTTagCompound getUpdateTag() { // client. In contrast getUpdatePacket() is called when the tile entity // itself wants to sync to the client. In many cases you want to send // over the same information in getUpdateTag() as in getUpdatePacket(). - return writeNetworkNBT(new NBTTagCompound()); + return writeNetworkNBT(super.getUpdateTag()); } @Override diff --git a/src/main/java/com/warmthdawn/mod/gugu_utils/modularmachenary/starlight/GuiStarlightInputHatch.java b/src/main/java/com/warmthdawn/mod/gugu_utils/modularmachenary/starlight/GuiStarlightInputHatch.java index b1e93fe..907f6c1 100644 --- a/src/main/java/com/warmthdawn/mod/gugu_utils/modularmachenary/starlight/GuiStarlightInputHatch.java +++ b/src/main/java/com/warmthdawn/mod/gugu_utils/modularmachenary/starlight/GuiStarlightInputHatch.java @@ -3,7 +3,6 @@ import com.warmthdawn.mod.gugu_utils.GuGuUtils; import com.warmthdawn.mod.gugu_utils.tools.RenderUtils; import com.warmthdawn.mod.gugu_utils.tools.ResourceUtils; -import crafttweaker.annotations.ModOnly; import hellfirepvp.astralsorcery.client.ClientScheduler; import hellfirepvp.astralsorcery.client.sky.RenderAstralSkybox; import hellfirepvp.astralsorcery.client.util.Blending; @@ -19,9 +18,6 @@ import hellfirepvp.astralsorcery.common.util.data.Tuple; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.inventory.GuiContainer; -import net.minecraft.client.renderer.BufferBuilder; -import net.minecraft.client.renderer.Tessellator; -import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.client.resources.I18n; import net.minecraft.util.ResourceLocation; import org.lwjgl.opengl.GL11; @@ -80,6 +76,8 @@ protected void drawGuiContainerBackgroundLayer(float partialTicks, int mouseX, i int has = hatch.getClientStarlightStored(); if (has < req) { int max = hatch.getMaxStarlightStorage(); + req = Math.min(max, req); + has = Math.min(max, has); float percReq = (float) (req - has) / (float) max; int from = (int) (165 * percFilled); int to = (int) (165 * percReq); diff --git a/src/main/java/com/warmthdawn/mod/gugu_utils/modularmachenary/tools/ItemRangedConstructTool.java b/src/main/java/com/warmthdawn/mod/gugu_utils/modularmachenary/tools/ItemRangedConstructTool.java new file mode 100644 index 0000000..fcf7b87 --- /dev/null +++ b/src/main/java/com/warmthdawn/mod/gugu_utils/modularmachenary/tools/ItemRangedConstructTool.java @@ -0,0 +1,90 @@ +package com.warmthdawn.mod.gugu_utils.modularmachenary.tools; + +import com.warmthdawn.mod.gugu_utils.GuGuUtils; +import hellfirepvp.modularmachinery.common.selection.PlayerStructureSelectionHelper; +import net.minecraft.block.Block; +import net.minecraft.block.state.IBlockState; +import net.minecraft.client.renderer.block.model.ModelResourceLocation; +import net.minecraft.client.resources.I18n; +import net.minecraft.client.util.ITooltipFlag; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumActionResult; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.EnumHand; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import net.minecraftforge.client.model.ModelLoader; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; +import vazkii.botania.common.core.helper.ItemNBTHelper; + +import javax.annotation.Nullable; +import java.util.List; + +import static com.warmthdawn.mod.gugu_utils.common.Constants.NAME_RANGED_CONSTRUCTION_TOOL; +import static com.warmthdawn.mod.gugu_utils.tools.ResourceUtils.j; + +public class ItemRangedConstructTool extends Item { + private static final String TAG_X = "startX"; + private static final String TAG_Y = "startY"; + private static final String TAG_Z = "startZ"; + + public ItemRangedConstructTool() { + + setCreativeTab(GuGuUtils.creativeTab); + setUnlocalizedName(j(GuGuUtils.MODID, NAME_RANGED_CONSTRUCTION_TOOL)); + } + + public static BlockPos getNbtPos(ItemStack stack) { + int x = ItemNBTHelper.getInt(stack, TAG_X, 0); + int y = ItemNBTHelper.getInt(stack, TAG_Y, -1); + int z = ItemNBTHelper.getInt(stack, TAG_Z, 0); + return new BlockPos(x, y, z); + } + + public static void setNbtPos(ItemStack stack, BlockPos pos) { + + ItemNBTHelper.setInt(stack, TAG_X, pos.getX()); + ItemNBTHelper.setInt(stack, TAG_Y, pos.getY()); + ItemNBTHelper.setInt(stack, TAG_Z, pos.getZ()); + } + + @Override + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack stack, @Nullable World worldIn, List tooltip, ITooltipFlag flagIn) { + tooltip.add(I18n.format("message.gugu-utils.rangedconstructtool.creative")); + } + + @Override + public EnumActionResult onItemUse(EntityPlayer player, World worldIn, BlockPos pos, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) { + if (!worldIn.isRemote && player.isCreative() && worldIn.getMinecraftServer().getPlayerList().canSendCommands(player.getGameProfile())) { + ItemStack held = player.getHeldItemMainhand(); + if (held.isEmpty()) + held = player.getHeldItemOffhand(); + BlockPos first = getNbtPos(held); + if (first.getY() > 0) { + setNbtPos(held, new BlockPos(0, -1, 0)); + PlayerStructureSelectionHelper.purgeSelection(player); + for (BlockPos blockPos : BlockPos.getAllInBoxMutable(first, pos)) { + if (worldIn.getBlockState(blockPos).getBlock() != Blocks.AIR) { + PlayerStructureSelectionHelper.toggleInSelection(player, blockPos.toImmutable()); + } + } + PlayerStructureSelectionHelper.sendSelection(player); + } else { + setNbtPos(held, pos); + } + + + } + return EnumActionResult.SUCCESS; + } + + @SideOnly(Side.CLIENT) + public void initModel() { + ModelLoader.setCustomModelResourceLocation(this, 0, new ModelResourceLocation(getRegistryName(), "inventory")); + } +} diff --git a/src/main/java/com/warmthdawn/mod/gugu_utils/proxy/ClientEventHandler.java b/src/main/java/com/warmthdawn/mod/gugu_utils/proxy/ClientEventHandler.java index 85349d8..b0b5f0b 100644 --- a/src/main/java/com/warmthdawn/mod/gugu_utils/proxy/ClientEventHandler.java +++ b/src/main/java/com/warmthdawn/mod/gugu_utils/proxy/ClientEventHandler.java @@ -17,7 +17,6 @@ public static void tickEnd(TickEvent.ClientTickEvent event) { elapsedTicks++; - } diff --git a/src/main/java/com/warmthdawn/mod/gugu_utils/proxy/CommonProxy.java b/src/main/java/com/warmthdawn/mod/gugu_utils/proxy/CommonProxy.java index c23a1f3..8c81bf3 100644 --- a/src/main/java/com/warmthdawn/mod/gugu_utils/proxy/CommonProxy.java +++ b/src/main/java/com/warmthdawn/mod/gugu_utils/proxy/CommonProxy.java @@ -75,14 +75,14 @@ public void preInit(FMLPreInitializationEvent event) { PsiCompact.initSpell(); if (Loads.ASTRAL_SORCERY) MinecraftForge.EVENT_BUS.register(new StarlightHandler()); + if (Loads.CRAFT_TWEAKER) + CraftTweakerCompact.preInit(); } public void init(FMLInitializationEvent event) { NetworkRegistry.INSTANCE.registerGuiHandler(GuGuUtils.instance, new GuiHandler()); ModIndependentGuis.init(); - if (Loads.CRAFT_TWEAKER) - CraftTweakerCompact.init(); if (Loads.BOTANIA) { SubtileRegisterOverride override = new SubtileRegisterOverride(); if (override.successInject) diff --git a/src/main/java/com/warmthdawn/mod/gugu_utils/proxy/MiscEventHandler.java b/src/main/java/com/warmthdawn/mod/gugu_utils/proxy/MiscEventHandler.java index 0954fec..d6cd92f 100644 --- a/src/main/java/com/warmthdawn/mod/gugu_utils/proxy/MiscEventHandler.java +++ b/src/main/java/com/warmthdawn/mod/gugu_utils/proxy/MiscEventHandler.java @@ -1,12 +1,17 @@ package com.warmthdawn.mod.gugu_utils.proxy; import WayofTime.bloodmagic.core.RegistrarBloodMagic; +import com.warmthdawn.mod.gugu_utils.GuGuUtils; import com.warmthdawn.mod.gugu_utils.botania.subtitle.SubTileEntropinnyumModified; import com.warmthdawn.mod.gugu_utils.botania.subtitle.SubTileShulkMeNotModified; import com.warmthdawn.mod.gugu_utils.common.Loads; +import com.warmthdawn.mod.gugu_utils.modularmachenary.tools.ItemRangedConstructTool; +import com.warmthdawn.mod.gugu_utils.tools.RenderTools; +import hellfirepvp.modularmachinery.common.selection.PlayerStructureSelectionHelper; import net.minecraft.block.BlockRailDetector; import net.minecraft.block.BlockSlime; import net.minecraft.block.state.IBlockState; +import net.minecraft.client.Minecraft; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.SharedMonsterAttributes; @@ -14,15 +19,19 @@ import net.minecraft.entity.monster.EntityShulker; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntityPiston; import net.minecraft.util.math.BlockPos; +import net.minecraftforge.client.event.RenderWorldLastEvent; import net.minecraftforge.event.entity.EntityJoinWorldEvent; import net.minecraftforge.event.entity.living.LivingAttackEvent; import net.minecraftforge.event.entity.living.LivingEvent; import net.minecraftforge.event.entity.living.LivingSpawnEvent; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.gameevent.PlayerEvent; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; import vazkii.botania.common.entity.EntityDoppleganger; import java.lang.reflect.Field; @@ -30,6 +39,7 @@ import java.util.List; import java.util.Set; import java.util.UUID; +import java.util.stream.Collectors; public class MiscEventHandler { public static final Set playersWithBMFlight = new HashSet<>(); @@ -160,6 +170,40 @@ public void onLivingAttack(LivingAttackEvent event) { } + @SubscribeEvent + @SideOnly(Side.CLIENT) + public void onRenderLast(RenderWorldLastEvent event) { + if (Minecraft.getMinecraft().player == null) return; + + ItemStack held = Minecraft.getMinecraft().player.getHeldItemMainhand(); + if (held.isEmpty()) { + held = Minecraft.getMinecraft().player.getHeldItemOffhand(); + } + if (!held.isEmpty() && held.getItem() instanceof ItemRangedConstructTool) { + BlockPos firstBind = ItemRangedConstructTool.getNbtPos(held); + if (firstBind.getY() >= 0) { + RenderTools.renderBlockOutline(firstBind, event.getPartialTicks()); + } else { + + PlayerStructureSelectionHelper.StructureSelection sel = PlayerStructureSelectionHelper.clientSelection; + if (sel != null) { + List toRender = sel.getSelectedPositions().stream() + .filter((pos) -> pos.distanceSq(Minecraft.getMinecraft().player.getPosition()) <= 1024) + .collect(Collectors.toList()); +// RenderingUtils.drawWhiteOutlineCubes(toRender, event.getPartialTicks()); + if (GuGuUtils.proxy.getClientPlayer().isSneaking()) { + RenderTools.renderBlocksOutline(toRender, event.getPartialTicks(), true); + } else { + RenderTools.renderBlocksOutline(toRender, event.getPartialTicks()); + } + + } + } + + } + + } + @SubscribeEvent public void playerLoggedOut(PlayerEvent.PlayerLoggedOutEvent event) { UUID uuid = event.player.getUniqueID(); diff --git a/src/main/java/com/warmthdawn/mod/gugu_utils/tools/OpenGlDebugging.java b/src/main/java/com/warmthdawn/mod/gugu_utils/tools/OpenGlDebugging.java new file mode 100644 index 0000000..a303ab3 --- /dev/null +++ b/src/main/java/com/warmthdawn/mod/gugu_utils/tools/OpenGlDebugging.java @@ -0,0 +1,353 @@ +package com.warmthdawn.mod.gugu_utils.tools; + +import com.warmthdawn.mod.gugu_utils.GuGuUtils; +import org.lwjgl.BufferUtils; +import org.lwjgl.opengl.GL11; + +import java.nio.ByteBuffer; + +public class OpenGlDebugging { + public class GLproperty + { + public GLproperty(int init_gLconstant, String init_name, String init_description, String init_category, String init_fetchCommand) { + gLconstant = init_gLconstant; + name = init_name; + description = init_description; + category = init_category; + fetchCommand = init_fetchCommand; + } + + public int gLconstant; + public String name; + public String description; + public String category; + public String fetchCommand; + } + + public static OpenGlDebugging instance = new OpenGlDebugging(); + + public GLproperty[] propertyList = { + new GLproperty(GL11.GL_CURRENT_COLOR, "GL_CURRENT_COLOR", "Current color", "current", "glGetFloatv()"), + new GLproperty(GL11.GL_CURRENT_INDEX, "GL_CURRENT_INDEX", "Current color index", "current", "glGetFloatv()"), + new GLproperty(GL11.GL_CURRENT_TEXTURE_COORDS, "GL_CURRENT_TEXTURE_COORDS", "Current texture coordinates", "current", "glGetFloatv()"), + new GLproperty(GL11.GL_CURRENT_NORMAL, "GL_CURRENT_NORMAL", "Current normal", "current", "glGetFloatv()"), + new GLproperty(GL11.GL_CURRENT_RASTER_POSITION, "GL_CURRENT_RASTER_POSITION", "Current raster position", "current", "glGetFloatv()"), + new GLproperty(GL11.GL_CURRENT_RASTER_DISTANCE, "GL_CURRENT_RASTER_DISTANCE", "Current raster distance", "current", "glGetFloatv()"), + new GLproperty(GL11.GL_CURRENT_RASTER_COLOR, "GL_CURRENT_RASTER_COLOR", "Color associated with raster position", "current", "glGetFloatv()"), + new GLproperty(GL11.GL_CURRENT_RASTER_INDEX, "GL_CURRENT_RASTER_INDEX", "Color index associated with raster position", "current", "glGetFloatv()"), + new GLproperty(GL11.GL_CURRENT_RASTER_TEXTURE_COORDS, "GL_CURRENT_RASTER_TEXTURE_COORDS", "Texture coordinates associated with raster position", "current", "glGetFloatv()"), + new GLproperty(GL11.GL_CURRENT_RASTER_POSITION_VALID, "GL_CURRENT_RASTER_POSITION_VALID", "Raster position valid bit", "current", "glGetBooleanv()"), + new GLproperty(GL11.GL_EDGE_FLAG, "GL_EDGE_FLAG", "Edge flag", "current", "glGetBooleanv()"), + new GLproperty(GL11.GL_VERTEX_ARRAY, "GL_VERTEX_ARRAY", "Vertex array enable", "vertex-array", "glIsEnabled()"), + new GLproperty(GL11.GL_VERTEX_ARRAY_SIZE, "GL_VERTEX_ARRAY_SIZE", "Coordinates per vertex", "vertex-array", "glGetIntegerv()"), + new GLproperty(GL11.GL_VERTEX_ARRAY_TYPE, "GL_VERTEX_ARRAY_TYPE", "Type of vertex coordinates", "vertex-array", "glGetIntegerv()"), + new GLproperty(GL11.GL_VERTEX_ARRAY_STRIDE, "GL_VERTEX_ARRAY_STRIDE", "Stride between vertices", "vertex-array", "glGetIntegerv()"), + new GLproperty(GL11.GL_VERTEX_ARRAY_POINTER, "GL_VERTEX_ARRAY_POINTER", "Pointer to the vertex array", "vertex-array", "glGetPointerv()"), + new GLproperty(GL11.GL_NORMAL_ARRAY, "GL_NORMAL_ARRAY", "Normal array enable", "vertex-array", "glIsEnabled()"), + new GLproperty(GL11.GL_NORMAL_ARRAY_TYPE, "GL_NORMAL_ARRAY_TYPE", "Type of normal coordinates", "vertex-array", "glGetIntegerv()"), + new GLproperty(GL11.GL_NORMAL_ARRAY_STRIDE, "GL_NORMAL_ARRAY_STRIDE", "Stride between normals", "vertex-array", "glGetIntegerv()"), + new GLproperty(GL11.GL_NORMAL_ARRAY_POINTER, "GL_NORMAL_ARRAY_POINTER", "Pointer to the normal array", "vertex-array", "glGetPointerv()"), + new GLproperty(GL11.GL_COLOR_ARRAY, "GL_COLOR_ARRAY", "RGBA color array enable", "vertex-array", "glIsEnabled()"), + new GLproperty(GL11.GL_COLOR_ARRAY_SIZE, "GL_COLOR_ARRAY_SIZE", "Colors per vertex", "vertex-array", "glGetIntegerv()"), + new GLproperty(GL11.GL_COLOR_ARRAY_TYPE, "GL_COLOR_ARRAY_TYPE", "Type of color components", "vertex-array", "glGetIntegerv()"), + new GLproperty(GL11.GL_COLOR_ARRAY_STRIDE, "GL_COLOR_ARRAY_STRIDE", "Stride between colors", "vertex-array", "glGetIntegerv()"), + new GLproperty(GL11.GL_COLOR_ARRAY_POINTER, "GL_COLOR_ARRAY_POINTER", "Pointer to the color array", "vertex-array", "glGetPointerv()"), + new GLproperty(GL11.GL_INDEX_ARRAY, "GL_INDEX_ARRAY", "Color-index array enable", "vertex-array", "glIsEnabled()"), + new GLproperty(GL11.GL_INDEX_ARRAY_TYPE, "GL_INDEX_ARRAY_TYPE", "Type of color indices", "vertex-array", "glGetIntegerv()"), + new GLproperty(GL11.GL_INDEX_ARRAY_STRIDE, "GL_INDEX_ARRAY_STRIDE", "Stride between color indices", "vertex-array", "glGetIntegerv()"), + new GLproperty(GL11.GL_INDEX_ARRAY_POINTER, "GL_INDEX_ARRAY_POINTER", "Pointer to the index array", "vertex-array", "glGetPointerv()"), + new GLproperty(GL11.GL_TEXTURE_COORD_ARRAY, "GL_TEXTURE_COORD_ARRAY", "Texture coordinate array enable", "vertex-array", "glIsEnabled()"), + new GLproperty(GL11.GL_TEXTURE_COORD_ARRAY_SIZE, "GL_TEXTURE_COORD_ARRAY_SIZE", "Texture coordinates per element", "vertex-array", "glGetIntegerv()"), + new GLproperty(GL11.GL_TEXTURE_COORD_ARRAY_TYPE, "GL_TEXTURE_COORD_ARRAY_TYPE", "Type of texture coordinates", "vertex-array", "glGetIntegerv()"), + new GLproperty(GL11.GL_TEXTURE_COORD_ARRAY_STRIDE, "GL_TEXTURE_COORD_ARRAY_STRIDE", "Stride between texture coordinates", "vertex-array", "glGetIntegerv()"), + new GLproperty(GL11.GL_TEXTURE_COORD_ARRAY_POINTER, "GL_TEXTURE_COORD_ARRAY_POINTER", "Pointer to the texture coordinate array", "vertex-array", "glGetPointerv()"), + new GLproperty(GL11.GL_EDGE_FLAG_ARRAY, "GL_EDGE_FLAG_ARRAY", "Edge flag array enable", "vertex-array", "glIsEnabled()"), + new GLproperty(GL11.GL_EDGE_FLAG_ARRAY_STRIDE, "GL_EDGE_FLAG_ARRAY_STRIDE", "Stride between edge flags", "vertex-array", "glGetIntegerv()"), + new GLproperty(GL11.GL_EDGE_FLAG_ARRAY_POINTER, "GL_EDGE_FLAG_ARRAY_POINTER", "Pointer to the edge flag array", "vertex-array", "glGetPointerv()"), + new GLproperty(GL11.GL_MODELVIEW_MATRIX, "GL_MODELVIEW_MATRIX", "Modelview matrix stack", "matrix", "glGetFloatv()"), + new GLproperty(GL11.GL_PROJECTION_MATRIX, "GL_PROJECTION_MATRIX", "Projection matrix stack", "matrix", "glGetFloatv()"), + new GLproperty(GL11.GL_TEXTURE_MATRIX, "GL_TEXTURE_MATRIX", "Texture matrix stack", "matrix", "glGetFloatv()"), + new GLproperty(GL11.GL_VIEWPORT, "GL_VIEWPORT", "Viewport origin and extent", "viewport", "glGetIntegerv()"), + new GLproperty(GL11.GL_DEPTH_RANGE, "GL_DEPTH_RANGE", "Depth range near and far", "viewport", "glGetFloatv()"), + new GLproperty(GL11.GL_MODELVIEW_STACK_DEPTH, "GL_MODELVIEW_STACK_DEPTH", "Modelview matrix stack pointer", "matrix", "glGetIntegerv()"), + new GLproperty(GL11.GL_PROJECTION_STACK_DEPTH, "GL_PROJECTION_STACK_DEPTH", "Projection matrix stack pointer", "matrix", "glGetIntegerv()"), + new GLproperty(GL11.GL_TEXTURE_STACK_DEPTH, "GL_TEXTURE_STACK_DEPTH", "Texture matrix stack pointer", "matrix", "glGetIntegerv()"), + new GLproperty(GL11.GL_MATRIX_MODE, "GL_MATRIX_MODE", "Current matrix mode", "transform", "glGetIntegerv()"), + new GLproperty(GL11.GL_NORMALIZE, "GL_NORMALIZE", "Current normal normalization on/off", "transform/ enable", "glIsEnabled()"), +// new GLproperty(GL11.GL_CLIP_PLANEi, "GL_CLIP_PLANEi", "User clipping plane coefficients", "transform", "glGetClipPlane()"), +// new GLproperty(GL11.GL_CLIP_PLANEi, "GL_CLIP_PLANEi", "ith user clipping plane enabled", "transform/ enable", "glIsEnabled()"), + new GLproperty(GL11.GL_FOG_COLOR, "GL_FOG_COLOR", "Fog color", "fog", "glGetFloatv()"), + new GLproperty(GL11.GL_FOG_INDEX, "GL_FOG_INDEX", "Fog index", "fog", "glGetFloatv()"), + new GLproperty(GL11.GL_FOG_DENSITY, "GL_FOG_DENSITY", "Exponential fog density", "fog", "glGetFloatv()"), + new GLproperty(GL11.GL_FOG_START, "GL_FOG_START", "Linear fog start", "fog", "glGetFloatv()"), + new GLproperty(GL11.GL_FOG_END, "GL_FOG_END", "Linear fog end", "fog", "glGetFloatv()"), + new GLproperty(GL11.GL_FOG_MODE, "GL_FOG_MODE", "Fog mode", "fog", "glGetIntegerv()"), + new GLproperty(GL11.GL_FOG, "GL_FOG", "True if fog enabled", "fog/enable", "glIsEnabled()"), + new GLproperty(GL11.GL_SHADE_MODEL, "GL_SHADE_MODEL", "glShadeModel() setting", "lighting", "glGetIntegerv()"), + new GLproperty(GL11.GL_LIGHTING, "GL_LIGHTING", "True if lighting is enabled", "lighting/e nable", "glIsEnabled()"), + new GLproperty(GL11.GL_COLOR_MATERIAL, "GL_COLOR_MATERIAL", "True if color tracking is enabled", "lighting", "glIsEnabled()"), + new GLproperty(GL11.GL_COLOR_MATERIAL_PARAMETER, "GL_COLOR_MATERIAL_PARAMETER", "Material properties tracking current color", "lighting", "glGetIntegerv()"), + new GLproperty(GL11.GL_COLOR_MATERIAL_FACE, "GL_COLOR_MATERIAL_FACE", "Face(s) affected by color tracking", "lighting", "glGetIntegerv()"), + new GLproperty(GL11.GL_AMBIENT, "GL_AMBIENT", "Ambient material color", "lighting", "glGetMaterialfv()"), + new GLproperty(GL11.GL_DIFFUSE, "GL_DIFFUSE", "Diffuse material color", "lighting", "glGetMaterialfv()"), + new GLproperty(GL11.GL_SPECULAR, "GL_SPECULAR", "Specular material color", "lighting", "glGetMaterialfv()"), + new GLproperty(GL11.GL_EMISSION, "GL_EMISSION", "Emissive material color", "lighting", "glGetMaterialfv()"), + new GLproperty(GL11.GL_SHININESS, "GL_SHININESS", "Specular exponent of material", "lighting", "glGetMaterialfv()"), + new GLproperty(GL11.GL_LIGHT_MODEL_AMBIENT, "GL_LIGHT_MODEL_AMBIENT", "Ambient scene color", "lighting", "glGetFloatv()"), + new GLproperty(GL11.GL_LIGHT_MODEL_LOCAL_VIEWER, "GL_LIGHT_MODEL_LOCAL_VIEWER", "Viewer is local", "lighting", "glGetBooleanv()"), + new GLproperty(GL11.GL_LIGHT_MODEL_TWO_SIDE, "GL_LIGHT_MODEL_TWO_SIDE", "Use two-sided lighting", "lighting", "glGetBooleanv()"), + new GLproperty(GL11.GL_AMBIENT, "GL_AMBIENT", "Ambient intensity of light i", "lighting", "glGetLightfv()"), + new GLproperty(GL11.GL_DIFFUSE, "GL_DIFFUSE", "Diffuse intensity of light i", "lighting", "glGetLightfv()"), + new GLproperty(GL11.GL_SPECULAR, "GL_SPECULAR", "Specular intensity of light i", "lighting", "glGetLightfv()"), + new GLproperty(GL11.GL_POSITION, "GL_POSITION", "Position of light i", "lighting", "glGetLightfv()"), + new GLproperty(GL11.GL_CONSTANT_ATTENUATION, "GL_CONSTANT_ATTENUATION", "Constant attenuation factor", "lighting", "glGetLightfv()"), + new GLproperty(GL11.GL_LINEAR_ATTENUATION, "GL_LINEAR_ATTENUATION", "Linear attenuation factor", "lighting", "glGetLightfv()"), + new GLproperty(GL11.GL_QUADRATIC_ATTENUATION, "GL_QUADRATIC_ATTENUATION", "Quadratic attenuation factor", "lighting", "glGetLightfv()"), + new GLproperty(GL11.GL_SPOT_DIRECTION, "GL_SPOT_DIRECTION", "Spotlight direction of light i", "lighting", "glGetLightfv()"), + new GLproperty(GL11.GL_SPOT_EXPONENT, "GL_SPOT_EXPONENT", "Spotlight exponent of light i", "lighting", "glGetLightfv()"), + new GLproperty(GL11.GL_SPOT_CUTOFF, "GL_SPOT_CUTOFF", "Spotlight angle of light i", "lighting", "glGetLightfv()"), + new GLproperty(GL11.GL_LIGHT0, "GL_LIGHT0", "True if light 0 enabled", "lighting/enable", "glIsEnabled()"), + new GLproperty(GL11.GL_LIGHT1, "GL_LIGHT1", "True if light 1 enabled", "lighting/enable", "glIsEnabled()"), + new GLproperty(GL11.GL_LIGHT2, "GL_LIGHT2", "True if light 2 enabled", "lighting/enable", "glIsEnabled()"), + new GLproperty(GL11.GL_LIGHT3, "GL_LIGHT3", "True if light 3 enabled", "lighting/enable", "glIsEnabled()"), + new GLproperty(GL11.GL_LIGHT4, "GL_LIGHT4", "True if light 4 enabled", "lighting/enable", "glIsEnabled()"), + new GLproperty(GL11.GL_LIGHT5, "GL_LIGHT5", "True if light 5 enabled", "lighting/enable", "glIsEnabled()"), + new GLproperty(GL11.GL_LIGHT6, "GL_LIGHT6", "True if light 6 enabled", "lighting/enable", "glIsEnabled()"), + new GLproperty(GL11.GL_LIGHT7, "GL_LIGHT7", "True if light 7 enabled", "lighting/enable", "glIsEnabled()"), + new GLproperty(GL11.GL_COLOR_INDEXES, "GL_COLOR_INDEXES", "ca, cd, and cs for color-index lighting", "lighting/e nable", "glGetMaterialfv()"), + new GLproperty(GL11.GL_POINT_SIZE, "GL_POINT_SIZE", "Point size", "point", "glGetFloatv()"), + new GLproperty(GL11.GL_POINT_SMOOTH, "GL_POINT_SMOOTH", "Point antialiasing on", "point/enable", "glIsEnabled()"), + new GLproperty(GL11.GL_LINE_WIDTH, "GL_LINE_WIDTH", "Line width", "line", "glGetFloatv()"), + new GLproperty(GL11.GL_LINE_SMOOTH, "GL_LINE_SMOOTH", "Line antialiasing on", "line/enable", "glIsEnabled()"), + new GLproperty(GL11.GL_LINE_STIPPLE_PATTERN, "GL_LINE_STIPPLE_PATTERN", "Line stipple", "line", "glGetIntegerv()"), + new GLproperty(GL11.GL_LINE_STIPPLE_REPEAT, "GL_LINE_STIPPLE_REPEAT", "Line stipple repeat", "line", "glGetIntegerv()"), + new GLproperty(GL11.GL_LINE_STIPPLE, "GL_LINE_STIPPLE", "Line stipple enable", "line/enable", "glIsEnabled()"), + new GLproperty(GL11.GL_CULL_FACE, "GL_CULL_FACE", "Polygon culling enabled", "polygon/enable", "glIsEnabled()"), + new GLproperty(GL11.GL_CULL_FACE_MODE, "GL_CULL_FACE_MODE", "Cull front-/back-facing polygons", "polygon", "glGetIntegerv()"), + new GLproperty(GL11.GL_FRONT_FACE, "GL_FRONT_FACE", "Polygon front-face CW/CCW indicator", "polygon", "glGetIntegerv()"), + new GLproperty(GL11.GL_POLYGON_SMOOTH, "GL_POLYGON_SMOOTH", "Polygon antialiasing on", "polygon/enable", "glIsEnabled()"), + new GLproperty(GL11.GL_POLYGON_MODE, "GL_POLYGON_MODE", "Polygon rasterization mode (front and back)", "polygon", "glGetIntegerv()"), + new GLproperty(GL11.GL_POLYGON_OFFSET_FACTOR, "GL_POLYGON_OFFSET_FACTOR", "Polygon offset factor", "polygon", "glGetFloatv()"), +// new GLproperty(GL11.GL_POLYGON_OFFSET_BIAS, "GL_POLYGON_OFFSET_BIAS", "Polygon offset bias", "polygon", "glGetFloatv()"), + new GLproperty(GL11.GL_POLYGON_OFFSET_POINT, "GL_POLYGON_OFFSET_POINT", "Polygon offset enable for GL_POINT mode rasterization", "polygon/enable", "glIsEnabled()"), + new GLproperty(GL11.GL_POLYGON_OFFSET_LINE, "GL_POLYGON_OFFSET_LINE", "Polygon offset enable for GL_LINE mode rasterization", "polygon/enable", "glIsEnabled()"), + new GLproperty(GL11.GL_POLYGON_OFFSET_FILL, "GL_POLYGON_OFFSET_FILL", "Polygon offset enable for GL_FILL mode rasterization", "polygon/enable", "glIsEnabled()"), + new GLproperty(GL11.GL_POLYGON_STIPPLE, "GL_POLYGON_STIPPLE", "Polygon stipple enable", "polygon/enable", "glIsEnabled()"), + new GLproperty(GL11.GL_TEXTURE_1D, "GL_TEXTURE_1D", "True if 1-D texturing enabled ", "texture/enable", "glIsEnabled()"), + new GLproperty(GL11.GL_TEXTURE_2D, "GL_TEXTURE_2D", "True if 2-D texturing enabled ", "texture/enable", "glIsEnabled()"), + new GLproperty(GL11.GL_TEXTURE_BINDING_1D, "GL_TEXTURE_BINDING_1D", "Texture object bound to GL_TEXTURE_1D", "texture", "glGetIntegerv()"), + new GLproperty(GL11.GL_TEXTURE_BINDING_2D, "GL_TEXTURE_BINDING_2D", "Texture object bound to GL_TEXTURE_2D", "texture", "glGetIntegerv()"), + new GLproperty(GL11.GL_TEXTURE, "GL_TEXTURE", "x-D texture image at level of detail i", "UNUSED", "glGetTexImage()"), + new GLproperty(GL11.GL_TEXTURE_WIDTH, "GL_TEXTURE_WIDTH", "x-D texture image i's width", "UNUSED", "glGetTexLevelParameter*()"), + new GLproperty(GL11.GL_TEXTURE_HEIGHT, "GL_TEXTURE_HEIGHT", "x-D texture image i's height", "UNUSED", "glGetTexLevelParameter*()"), + new GLproperty(GL11.GL_TEXTURE_BORDER, "GL_TEXTURE_BORDER", "x-D texture image i's border width", "UNUSED", "glGetTexLevelParameter*()"), +// new GLproperty(GL11.GL_TEXTURE_INTERNAL, "GL_TEXTURE_INTERNAL", "x-D texture image i's internal image format", "UNUSED", "glGetTexLevelParameter*()"), + new GLproperty(GL11.GL_TEXTURE_RED_SIZE, "GL_TEXTURE_RED_SIZE", "x-D texture image i's red resolution", "UNUSED", "glGetTexLevelParameter*()"), + new GLproperty(GL11.GL_TEXTURE_GREEN_SIZE, "GL_TEXTURE_GREEN_SIZE", "x-D texture image i's green resolution", "UNUSED", "glGetTexLevelParameter*()"), + new GLproperty(GL11.GL_TEXTURE_BLUE_SIZE, "GL_TEXTURE_BLUE_SIZE", "x-D texture image i's blue resolution", "UNUSED", "glGetTexLevelParameter*()"), + new GLproperty(GL11.GL_TEXTURE_ALPHA_SIZE, "GL_TEXTURE_ALPHA_SIZE", "x-D texture image i's alpha resolution", "UNUSED", "glGetTexLevelParameter*()"), + new GLproperty(GL11.GL_TEXTURE_LUMINANCE_SIZE, "GL_TEXTURE_LUMINANCE_SIZE", "x-D texture image i's luminance resolution", "UNUSED", "glGetTexLevelParameter*()"), + new GLproperty(GL11.GL_TEXTURE_INTENSITY_SIZE, "GL_TEXTURE_INTENSITY_SIZE", "x-D texture image i's intensity resolution", "UNUSED", "glGetTexLevelParameter*()"), + new GLproperty(GL11.GL_TEXTURE_BORDER_COLOR, "GL_TEXTURE_BORDER_COLOR", "Texture border color", "texture", "glGetTexParameter*()"), + new GLproperty(GL11.GL_TEXTURE_MIN_FILTER, "GL_TEXTURE_MIN_FILTER", "Texture minification function", "texture", "glGetTexParameter*()"), + new GLproperty(GL11.GL_TEXTURE_MAG_FILTER, "GL_TEXTURE_MAG_FILTER", "Texture magnification function", "texture", "glGetTexParameter*()"), + new GLproperty(GL11.GL_TEXTURE_WRAP_S, "GL_TEXTURE_WRAP_S", "Texture wrap mode (x is S or T)", "texture", "glGetTexParameter*()"), + new GLproperty(GL11.GL_TEXTURE_WRAP_T, "GL_TEXTURE_WRAP_T", "Texture wrap mode (x is S or T)", "texture", "glGetTexParameter*()"), + new GLproperty(GL11.GL_TEXTURE_PRIORITY, "GL_TEXTURE_PRIORITY", "Texture object priority", "texture", "glGetTexParameter*()"), +// new GLproperty(GL11.GL_TEXTURE_RESIDENCY, "GL_TEXTURE_RESIDENCY", "Texture residency", "texture", "glGetTexParameteriv()"), + new GLproperty(GL11.GL_TEXTURE_ENV_MODE, "GL_TEXTURE_ENV_MODE", "Texture application function", "texture", "glGetTexEnviv()"), + new GLproperty(GL11.GL_TEXTURE_ENV_COLOR, "GL_TEXTURE_ENV_COLOR", "Texture environment color", "texture", "glGetTexEnvfv()"), + new GLproperty(GL11.GL_TEXTURE_GEN_S, "GL_TEXTURE_GEN_S", "Texgen enabled (x is S, T, R, or Q)", "texture/enable", "glIsEnabled()"), + new GLproperty(GL11.GL_TEXTURE_GEN_T, "GL_TEXTURE_GEN_T", "Texgen enabled (x is S, T, R, or Q)", "texture/enable", "glIsEnabled()"), + new GLproperty(GL11.GL_TEXTURE_GEN_R, "GL_TEXTURE_GEN_R", "Texgen enabled (x is S, T, R, or Q)", "texture/enable", "glIsEnabled()"), + new GLproperty(GL11.GL_TEXTURE_GEN_Q, "GL_TEXTURE_GEN_Q", "Texgen enabled (x is S, T, R, or Q)", "texture/enable", "glIsEnabled()"), + new GLproperty(GL11.GL_EYE_PLANE, "GL_EYE_PLANE", "Texgen plane equation coefficients", "texture", "glGetTexGenfv()"), + new GLproperty(GL11.GL_OBJECT_PLANE, "GL_OBJECT_PLANE", "Texgen object linear coefficients", "texture", "glGetTexGenfv()"), + new GLproperty(GL11.GL_TEXTURE_GEN_MODE, "GL_TEXTURE_GEN_MODE", "Function used for texgen", "texture", "glGetTexGeniv()"), + new GLproperty(GL11.GL_SCISSOR_TEST, "GL_SCISSOR_TEST", "Scissoring enabled", "scissor/enable", "glIsEnabled()"), + new GLproperty(GL11.GL_SCISSOR_BOX, "GL_SCISSOR_BOX", "Scissor box", "scissor", "glGetIntegerv()"), + new GLproperty(GL11.GL_ALPHA_TEST, "GL_ALPHA_TEST", "Alpha test enabled", "color-buffer/enable", "glIsEnabled()"), + new GLproperty(GL11.GL_ALPHA_TEST_FUNC, "GL_ALPHA_TEST_FUNC", "Alpha test function", "color-buffer", "glGetIntegerv()"), + new GLproperty(GL11.GL_ALPHA_TEST_REF, "GL_ALPHA_TEST_REF", "Alpha test reference value", "color-buffer", "glGetIntegerv()"), + new GLproperty(GL11.GL_STENCIL_TEST, "GL_STENCIL_TEST", "Stenciling enabled", "stencil-buffer/enable", "glIsEnabled()"), + new GLproperty(GL11.GL_STENCIL_FUNC, "GL_STENCIL_FUNC", "Stencil function", "stencil-buffer", "glGetIntegerv()"), + new GLproperty(GL11.GL_STENCIL_VALUE_MASK, "GL_STENCIL_VALUE_MASK", "Stencil mask", "stencil-buffer", "glGetIntegerv()"), + new GLproperty(GL11.GL_STENCIL_REF, "GL_STENCIL_REF", "Stencil reference value", "stencil-buffer", "glGetIntegerv()"), + new GLproperty(GL11.GL_STENCIL_FAIL, "GL_STENCIL_FAIL", "Stencil fail action", "stencil-buffer", "glGetIntegerv()"), + new GLproperty(GL11.GL_STENCIL_PASS_DEPTH_FAIL, "GL_STENCIL_PASS_DEPTH_FAIL", "Stencil depth buffer fail action", "stencil-buffer", "glGetIntegerv()"), + new GLproperty(GL11.GL_STENCIL_PASS_DEPTH_PASS, "GL_STENCIL_PASS_DEPTH_PASS", "Stencil depth buffer pass action", "stencil-buffer", "glGetIntegerv()"), + new GLproperty(GL11.GL_DEPTH_TEST, "GL_DEPTH_TEST", "Depth buffer enabled", "depth-buffer/ena ble", "glIsEnabled()"), + new GLproperty(GL11.GL_DEPTH_FUNC, "GL_DEPTH_FUNC", "Depth buffer test function", "depth-buffer", "glGetIntegerv()"), + new GLproperty(GL11.GL_BLEND, "GL_BLEND", "Blending enabled", "color-buffer/enable", "glIsEnabled()"), + new GLproperty(GL11.GL_BLEND_SRC, "GL_BLEND_SRC", "Blending source function", "color-buffer", "glGetIntegerv()"), + new GLproperty(GL11.GL_BLEND_DST, "GL_BLEND_DST", "Blending destination function", "color-buffer", "glGetIntegerv()"), + new GLproperty(GL11.GL_DITHER, "GL_DITHER", "Dithering enabled", "color-buffer/enable", "glIsEnabled()"), + new GLproperty(GL11.GL_INDEX_LOGIC_OP, "GL_INDEX_LOGIC_OP", "Color index logical operation enabled", "color-buffer/enable", "glIsEnabled()"), + new GLproperty(GL11.GL_COLOR_LOGIC_OP, "GL_COLOR_LOGIC_OP", "RGBA color logical operation enabled", "color-buffer/enable", "glIsEnabled()"), + new GLproperty(GL11.GL_LOGIC_OP_MODE, "GL_LOGIC_OP_MODE", "Logical operation function", "color-buffer", "glGetIntegerv()"), + new GLproperty(GL11.GL_DRAW_BUFFER, "GL_DRAW_BUFFER", "Buffers selected for drawing", "color-buffer", "glGetIntegerv()"), + new GLproperty(GL11.GL_INDEX_WRITEMASK, "GL_INDEX_WRITEMASK", "Color-index writemask", "color-buffer", "glGetIntegerv()"), + new GLproperty(GL11.GL_COLOR_WRITEMASK, "GL_COLOR_WRITEMASK", "Color write enables; R, G, B, or A", "color-buffer", "glGetBooleanv()"), + new GLproperty(GL11.GL_DEPTH_WRITEMASK, "GL_DEPTH_WRITEMASK", "Depth buffer enabled for writing", "depth-buffer", "glGetBooleanv()"), + new GLproperty(GL11.GL_STENCIL_WRITEMASK, "GL_STENCIL_WRITEMASK", "Stencil-buffer writemask", "stencil-buffer", "glGetIntegerv()"), + new GLproperty(GL11.GL_COLOR_CLEAR_VALUE, "GL_COLOR_CLEAR_VALUE", "Color-buffer clear value (RGBA mode)", "color-buffer", "glGetFloatv()"), + new GLproperty(GL11.GL_INDEX_CLEAR_VALUE, "GL_INDEX_CLEAR_VALUE", "Color-buffer clear value (color-index mode)", "color-buffer", "glGetFloatv()"), + new GLproperty(GL11.GL_DEPTH_CLEAR_VALUE, "GL_DEPTH_CLEAR_VALUE", "Depth-buffer clear value", "depth-buffer", "glGetIntegerv()"), + new GLproperty(GL11.GL_STENCIL_CLEAR_VALUE, "GL_STENCIL_CLEAR_VALUE", "Stencil-buffer clear value", "stencil-buffer", "glGetIntegerv()"), + new GLproperty(GL11.GL_ACCUM_CLEAR_VALUE, "GL_ACCUM_CLEAR_VALUE", "Accumulation-buffer clear value", "accum-buffer", "glGetFloatv()"), + new GLproperty(GL11.GL_UNPACK_SWAP_BYTES, "GL_UNPACK_SWAP_BYTES", "Value of GL_UNPACK_SWAP_BYTES", "pixel-store", "glGetBooleanv()"), + new GLproperty(GL11.GL_UNPACK_LSB_FIRST, "GL_UNPACK_LSB_FIRST", "Value of GL_UNPACK_LSB_FIRST", "pixel-store", "glGetBooleanv()"), + new GLproperty(GL11.GL_UNPACK_ROW_LENGTH, "GL_UNPACK_ROW_LENGTH", "Value of GL_UNPACK_ROW_LENGTH", "pixel-store", "glGetIntegerv()"), + new GLproperty(GL11.GL_UNPACK_SKIP_ROWS, "GL_UNPACK_SKIP_ROWS", "Value of GL_UNPACK_SKIP_ROWS", "pixel-store", "glGetIntegerv()"), + new GLproperty(GL11.GL_UNPACK_SKIP_PIXELS, "GL_UNPACK_SKIP_PIXELS", "Value of GL_UNPACK_SKIP_PIXELS", "pixel-store", "glGetIntegerv()"), + new GLproperty(GL11.GL_UNPACK_ALIGNMENT, "GL_UNPACK_ALIGNMENT", "Value of GL_UNPACK_ALIGNMENT", "pixel-store", "glGetIntegerv()"), + new GLproperty(GL11.GL_PACK_SWAP_BYTES, "GL_PACK_SWAP_BYTES", "Value of GL_PACK_SWAP_BYTES", "pixel-store", "glGetBooleanv()"), + new GLproperty(GL11.GL_PACK_LSB_FIRST, "GL_PACK_LSB_FIRST", "Value of GL_PACK_LSB_FIRST", "pixel-store", "glGetBooleanv()"), + new GLproperty(GL11.GL_PACK_ROW_LENGTH, "GL_PACK_ROW_LENGTH", "Value of GL_PACK_ROW_LENGTH", "pixel-store", "glGetIntegerv()"), + new GLproperty(GL11.GL_PACK_SKIP_ROWS, "GL_PACK_SKIP_ROWS", "Value of GL_PACK_SKIP_ROWS", "pixel-store", "glGetIntegerv()"), + new GLproperty(GL11.GL_PACK_SKIP_PIXELS, "GL_PACK_SKIP_PIXELS", "Value of GL_PACK_SKIP_PIXELS", "pixel-store", "glGetIntegerv()"), + new GLproperty(GL11.GL_PACK_ALIGNMENT, "GL_PACK_ALIGNMENT", "Value of GL_PACK_ALIGNMENT", "pixel-store", "glGetIntegerv()"), + new GLproperty(GL11.GL_MAP_COLOR, "GL_MAP_COLOR", "True if colors are mapped", "pixel", "glGetBooleanv()"), + new GLproperty(GL11.GL_MAP_STENCIL, "GL_MAP_STENCIL", "True if stencil values are mapped", "pixel", "glGetBooleanv()"), + new GLproperty(GL11.GL_INDEX_SHIFT, "GL_INDEX_SHIFT", "Value of GL_INDEX_SHIFT", "pixel", "glGetIntegerv()"), + new GLproperty(GL11.GL_INDEX_OFFSET, "GL_INDEX_OFFSET", "Value of GL_INDEX_OFFSET", "pixel", "glGetIntegerv()"), +// new GLproperty(GL11.GL_RED_SCALE, "GL_x_SCALE", "Value of GL_x_SCALE; x is GL_RED, GL_GREEN, GL_BLUE, GL_ALPHA, or GL_DEPTH", "pixel", "glGetFloatv()"), +// new GLproperty(GL11.GL_x_BIAS, "GL_x_BIAS", "Value of GL_x_BIAS; x is one of GL_RED, GL_GREEN, GL_BLUE, GL_ALPHA, or GL_DEPTH", "pixel", "glGetFloatv()"), + new GLproperty(GL11.GL_ZOOM_X, "GL_ZOOM_X", "x zoom factor", "pixel", "glGetFloatv()"), + new GLproperty(GL11.GL_ZOOM_Y, "GL_ZOOM_Y", "y zoom factor", "pixel", "glGetFloatv()"), +// new GLproperty(GL11.GL_x, "GL_x", "glPixelMap() translation tables; x is a map name from Table 8-1", "UNUSED", "glGetPixelMap*()"), +// new GLproperty(GL11.GL_x_SIZE, "GL_x_SIZE", "Size of table x", "UNUSED", "glGetIntegerv()"), + new GLproperty(GL11.GL_READ_BUFFER, "GL_READ_BUFFER", "Read source buffer", "pixel", "glGetIntegerv()"), + new GLproperty(GL11.GL_ORDER, "GL_ORDER", "1D map order", "capability", "glGetMapiv()"), + new GLproperty(GL11.GL_ORDER, "GL_ORDER", "2D map orders", "capability", "glGetMapiv()"), + new GLproperty(GL11.GL_COEFF, "GL_COEFF", "1D control points", "capability", "glGetMapfv()"), + new GLproperty(GL11.GL_COEFF, "GL_COEFF", "2D control points", "capability", "glGetMapfv()"), + new GLproperty(GL11.GL_DOMAIN, "GL_DOMAIN", "1D domain endpoints", "capability", "glGetMapfv()"), + new GLproperty(GL11.GL_DOMAIN, "GL_DOMAIN", "2D domain endpoints", "capability", "glGetMapfv()"), +// new GLproperty(GL11.GL_MAP1_x, "GL_MAP1_x", "1D map enables: x is map type", "eval/enable", "glIsEnabled()"), +// new GLproperty(GL11.GL_MAP2_x, "GL_MAP2_x", "2D map enables: x is map type", "eval/enable", "glIsEnabled()"), + new GLproperty(GL11.GL_MAP1_GRID_DOMAIN, "GL_MAP1_GRID_DOMAIN", "1D grid endpoints", "eval", "glGetFloatv()"), + new GLproperty(GL11.GL_MAP2_GRID_DOMAIN, "GL_MAP2_GRID_DOMAIN", "2D grid endpoints", "eval", "glGetFloatv()"), + new GLproperty(GL11.GL_MAP1_GRID_SEGMENTS, "GL_MAP1_GRID_SEGMENTS", "1D grid divisions", "eval", "glGetFloatv()"), + new GLproperty(GL11.GL_MAP2_GRID_SEGMENTS, "GL_MAP2_GRID_SEGMENTS", "2D grid divisions", "eval", "glGetFloatv()"), + new GLproperty(GL11.GL_AUTO_NORMAL, "GL_AUTO_NORMAL", "True if automatic normal generation enabled", "eval", "glIsEnabled()"), + new GLproperty(GL11.GL_PERSPECTIVE_CORRECTION_HINT, "GL_PERSPECTIVE_CORRECTION_HINT", "Perspective correction hint", "hint", "glGetIntegerv()"), + new GLproperty(GL11.GL_POINT_SMOOTH_HINT, "GL_POINT_SMOOTH_HINT", "Point smooth hint", "hint", "glGetIntegerv()"), + new GLproperty(GL11.GL_LINE_SMOOTH_HINT, "GL_LINE_SMOOTH_HINT", "Line smooth hint", "hint", "glGetIntegerv()"), + new GLproperty(GL11.GL_POLYGON_SMOOTH_HINT, "GL_POLYGON_SMOOTH_HINT", "Polygon smooth hint", "hint", "glGetIntegerv()"), + new GLproperty(GL11.GL_FOG_HINT, "GL_FOG_HINT", "Fog hint", "hint", "glGetIntegerv()"), + new GLproperty(GL11.GL_MAX_LIGHTS, "GL_MAX_LIGHTS", "Maximum number of lights", "capability", "glGetIntegerv()"), + new GLproperty(GL11.GL_MAX_CLIP_PLANES, "GL_MAX_CLIP_PLANES", "Maximum number of user clipping planes", "capability", "glGetIntegerv()"), + new GLproperty(GL11.GL_MAX_MODELVIEW_STACK_DEPTH, "GL_MAX_MODELVIEW_STACK_DEPTH", "Maximum modelview-matrix stack depth", "capability", "glGetIntegerv()"), + new GLproperty(GL11.GL_MAX_PROJECTION_STACK_DEPTH, "GL_MAX_PROJECTION_STACK_DEPTH", "Maximum projection-matrix stack depth", "capability", "glGetIntegerv()"), + new GLproperty(GL11.GL_MAX_TEXTURE_STACK_DEPTH, "GL_MAX_TEXTURE_STACK_DEPTH", "Maximum depth of texture matrix stack", "capability", "glGetIntegerv()"), + new GLproperty(GL11.GL_SUBPIXEL_BITS, "GL_SUBPIXEL_BITS", "Number of bits of subpixel precision in x and y", "capability", "glGetIntegerv()"), + new GLproperty(GL11.GL_MAX_TEXTURE_SIZE, "GL_MAX_TEXTURE_SIZE", "See discussion in Texture Proxy in Chapter 9", "capability", "glGetIntegerv()"), + new GLproperty(GL11.GL_MAX_PIXEL_MAP_TABLE, "GL_MAX_PIXEL_MAP_TABLE", "Maximum size of a glPixelMap() translation table", "capability", "glGetIntegerv()"), + new GLproperty(GL11.GL_MAX_NAME_STACK_DEPTH, "GL_MAX_NAME_STACK_DEPTH", "Maximum selection-name stack depth", "capability", "glGetIntegerv()"), + new GLproperty(GL11.GL_MAX_LIST_NESTING, "GL_MAX_LIST_NESTING", "Maximum display-list call nesting", "capability", "glGetIntegerv()"), + new GLproperty(GL11.GL_MAX_EVAL_ORDER, "GL_MAX_EVAL_ORDER", "Maximum evaluator polynomial order", "capability", "glGetIntegerv()"), + new GLproperty(GL11.GL_MAX_VIEWPORT_DIMS, "GL_MAX_VIEWPORT_DIMS", "Maximum viewport dimensions", "capability", "glGetIntegerv()"), + new GLproperty(GL11.GL_MAX_ATTRIB_STACK_DEPTH, "GL_MAX_ATTRIB_STACK_DEPTH", "Maximum depth of the attribute stack", "capability", "glGetIntegerv()"), + new GLproperty(GL11.GL_MAX_CLIENT_ATTRIB_STACK_DEPTH, "GL_MAX_CLIENT_ATTRIB_STACK_DEPTH", "Maximum depth of the client attribute stack", "capability", "glGetIntegerv()"), + new GLproperty(GL11.GL_AUX_BUFFERS, "GL_AUX_BUFFERS", "Number of auxiliary buffers", "capability", "glGetBooleanv()"), + new GLproperty(GL11.GL_RGBA_MODE, "GL_RGBA_MODE", "True if color buffers store RGBA", "capability", "glGetBooleanv()"), + new GLproperty(GL11.GL_INDEX_MODE, "GL_INDEX_MODE", "True if color buffers store indices", "capability", "glGetBooleanv()"), + new GLproperty(GL11.GL_DOUBLEBUFFER, "GL_DOUBLEBUFFER", "True if front and back buffers exist", "capability", "glGetBooleanv()"), + new GLproperty(GL11.GL_STEREO, "GL_STEREO", "True if left and right buffers exist", "capability", "glGetBooleanv()"), + new GLproperty(GL11.GL_POINT_SIZE_RANGE, "GL_POINT_SIZE_RANGE", "Range (low to high) of antialiased point sizes", "capability", "glGetFloatv()"), + new GLproperty(GL11.GL_POINT_SIZE_GRANULARITY, "GL_POINT_SIZE_GRANULARITY", "Antialiased point-size granularity", "capability", "glGetFloatv()"), + new GLproperty(GL11.GL_LINE_WIDTH_RANGE, "GL_LINE_WIDTH_RANGE", "Range (low to high) of antialiased line widths", "capability", "glGetFloatv()"), + new GLproperty(GL11.GL_LINE_WIDTH_GRANULARITY, "GL_LINE_WIDTH_GRANULARITY", "Antialiased line-width granularity", "capability", "glGetFloatv()"), + new GLproperty(GL11.GL_RED_BITS, "GL_RED_BITS", "Number of bits per red component in color buffers", "capability", "glGetIntegerv()"), + new GLproperty(GL11.GL_GREEN_BITS, "GL_GREEN_BITS", "Number of bits per green component in color buffers", "capability", "glGetIntegerv()"), + new GLproperty(GL11.GL_BLUE_BITS, "GL_BLUE_BITS", "Number of bits per blue component in color buffers", "capability", "glGetIntegerv()"), + new GLproperty(GL11.GL_ALPHA_BITS, "GL_ALPHA_BITS", "Number of bits per alpha component in color buffers", "capability", "glGetIntegerv()"), + new GLproperty(GL11.GL_INDEX_BITS, "GL_INDEX_BITS", "Number of bits per index in color buffers", "capability", "glGetIntegerv()"), + new GLproperty(GL11.GL_DEPTH_BITS, "GL_DEPTH_BITS", "Number of depth-buffer bitplanes", "capability", "glGetIntegerv()"), + new GLproperty(GL11.GL_STENCIL_BITS, "GL_STENCIL_BITS", "Number of stencil bitplanes", "capability", "glGetIntegerv()"), + new GLproperty(GL11.GL_ACCUM_RED_BITS, "GL_ACCUM_RED_BITS", "Number of bits per red component in the accumulation buffer", "capability", "glGetIntegerv()"), + new GLproperty(GL11.GL_ACCUM_GREEN_BITS, "GL_ACCUM_GREEN_BITS", "Number of bits per green component in the accumulation buffer", "capability", "glGetIntegerv()"), + new GLproperty(GL11.GL_ACCUM_BLUE_BITS, "GL_ACCUM_BLUE_BITS", "Number of bits per blue component in the accumulation buffer", "capability", "glGetIntegerv()"), + new GLproperty(GL11.GL_ACCUM_ALPHA_BITS, "GL_ACCUM_ALPHA_BITS", "Number of bits per alpha component in the accumulation buffer", "capability", "glGetIntegerv()"), + new GLproperty(GL11.GL_LIST_BASE, "GL_LIST_BASE", "Setting of glListBase()", "list", "glGetIntegerv()"), + new GLproperty(GL11.GL_LIST_INDEX, "GL_LIST_INDEX", "Number of display list under construction; 0 if none", "current", "glGetIntegerv()"), + new GLproperty(GL11.GL_LIST_MODE, "GL_LIST_MODE", "Mode of display list under construction; undefined if none", "current", "glGetIntegerv()"), + new GLproperty(GL11.GL_ATTRIB_STACK_DEPTH, "GL_ATTRIB_STACK_DEPTH", "Attribute stack pointer", "current", "glGetIntegerv()"), + new GLproperty(GL11.GL_CLIENT_ATTRIB_STACK_DEPTH, "GL_CLIENT_ATTRIB_STACK_DEPTH", "Client attribute stack pointer", "current", "glGetIntegerv()"), + new GLproperty(GL11.GL_NAME_STACK_DEPTH, "GL_NAME_STACK_DEPTH", "Name stack depth", "current", "glGetIntegerv()"), + new GLproperty(GL11.GL_RENDER_MODE, "GL_RENDER_MODE", "glRenderMode() setting", "current", "glGetIntegerv()"), + new GLproperty(GL11.GL_SELECTION_BUFFER_POINTER, "GL_SELECTION_BUFFER_POINTER", "Pointer to selection buffer", "select", "glGetPointerv()"), + new GLproperty(GL11.GL_SELECTION_BUFFER_SIZE, "GL_SELECTION_BUFFER_SIZE", "Size of selection buffer", "select", "glGetIntegerv()"), + new GLproperty(GL11.GL_FEEDBACK_BUFFER_POINTER, "GL_FEEDBACK_BUFFER_POINTER", "Pointer to feedback buffer", "feedback", "glGetPointerv()"), + new GLproperty(GL11.GL_FEEDBACK_BUFFER_SIZE, "GL_FEEDBACK_BUFFER_SIZE", "Size of feedback buffer", "feedback", "glGetIntegerv()"), + new GLproperty(GL11.GL_FEEDBACK_BUFFER_TYPE, "GL_FEEDBACK_BUFFER_TYPE", "Type of feedback buffer", "feedback", "glGetIntegerv()"), + }; + + + + public static void dumpOpenGLstate() + { + } + + public static void dumpAllIsEnabled() + { + for (int i = 0; i < instance.propertyList.length; ++i) { + if (instance.propertyList[i].fetchCommand.equals("glIsEnabled()")) { + GuGuUtils.logger.info(instance.propertyList[i].name + ":" + + GL11.glIsEnabled(instance.propertyList[i].gLconstant) + + " (" + instance.propertyList[i].description + ")"); + } + } + } + + public static void dumpAllType(String type) { + for (int i = 0; i < instance.propertyList.length; ++i) { + if (instance.propertyList[i].category.equals(type)) { + GuGuUtils.logger.info(instance.propertyList[i].name + ":" + getPropertyAsString(i)); + GuGuUtils.logger.info(" (" + instance.propertyList[i].description + ")"); + } + } + } + + private static String getPropertyAsString(int propertyListIndex) + { + int gLconstant = instance.propertyList[propertyListIndex].gLconstant; + if (instance.propertyList[propertyListIndex].fetchCommand.equals("glIsEnabled()")) { + return "" + GL11.glIsEnabled(gLconstant); + } + + if (instance.propertyList[propertyListIndex].fetchCommand.equals("glGetBooleanv()")) { + ByteBuffer params = BufferUtils.createByteBuffer(16); + + GL11.glGetBoolean(gLconstant, params); + String out = ""; + for (int i = 0; i < params.capacity(); ++i) { + out += (i == 0 ? "" : ", ") + params.get(i); + } + return out; + } + + return ""; +// switch(instance.propertyList[propertyListIndex].fetchCommand) { +/* + case "glGetBooleanv()": { System.out.println(GL11.glGetBooleanv()); break;} + case "glGetFloatv()": { System.out.println(GL11.glGetFloatv()); break;} + case "glGetIntegerv()": { System.out.println(GL11.glGetIntegerv()); break;} + case "glGetLightfv()": { System.out.println(GL11.glGetLightfv()); break;} + case "glGetMapfv()": { System.out.println(GL11.glGetMapfv()); break;} + case "glGetMapiv()": { System.out.println(GL11.glGetMapiv()); break;} + case "glGetMaterialfv()": { System.out.println(GL11.glGetMaterialfv()); break;} + case "glGetPixelMap*()": { System.out.println(GL11.glGetPixelMap*()); break;} + case "glGetPointerv()": { System.out.println(GL11.glGetPointerv()); break;} + case "glGetTexEnvfv()": { System.out.println(GL11.glGetTexEnvfv()); break;} + case "glGetTexEnviv()": { System.out.println(GL11.glGetTexEnviv()); break;} + case "glGetTexGenfv()": { System.out.println(GL11.glGetTexGenfv()); break;} + case "glGetTexGeniv()": { System.out.println(GL11.glGetTexGeniv()); break;} + case "glGetTexImage()": { System.out.println(GL11.glGetTexImage()); break;} + case "glGetTexLevelParameter*()": { System.out.println(GL11.glGetTexLevelParameter*()); break;} + case "glGetTexParameter*()": { System.out.println(GL11.glGetTexParameter*()); break;} + case "glGetTexParameteriv()": { System.out.println(GL11.glGetTexParameteriv()); break;} +*/ + } +} diff --git a/src/main/java/com/warmthdawn/mod/gugu_utils/tools/RenderTools.java b/src/main/java/com/warmthdawn/mod/gugu_utils/tools/RenderTools.java new file mode 100644 index 0000000..3223bd8 --- /dev/null +++ b/src/main/java/com/warmthdawn/mod/gugu_utils/tools/RenderTools.java @@ -0,0 +1,101 @@ +package com.warmthdawn.mod.gugu_utils.tools; + +import com.warmthdawn.mod.gugu_utils.proxy.ClientEventHandler; +import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; +import org.lwjgl.opengl.GL11; + +import java.awt.*; +import java.util.List; + +public class RenderTools { + + + public static void renderBlockOutline(BlockPos pos, double partialTicks) { + renderOutline(new Vec3d(pos), new Vec3d(pos.add(1, 1, 1)), partialTicks); + } + + public static void renderBlockOutline(BlockPos pos, double partialTicks, boolean renderMasked) { + renderOutline(new Vec3d(pos), new Vec3d(pos.add(1, 1, 1)), partialTicks, renderMasked); + } + + public static void renderBlocksOutline(List posList, double partialTicks) { + renderBlocksOutline(posList, partialTicks, false); + } + + public static void renderBlocksOutline(List posList, double partialTicks, boolean renderMasked) { + int minX, minY, minZ, maxX, maxY, maxZ; + if (posList.isEmpty()) { + return; + } + BlockPos first = posList.get(0); + minX = maxX = first.getX(); + minY = maxY = first.getY(); + minZ = maxZ = first.getZ(); + for (BlockPos pos : posList) { + if (minX > pos.getX()) + minX = pos.getX(); + if (maxX < pos.getX()) + maxX = pos.getX(); + + if (minY > pos.getY()) + minY = pos.getY(); + if (maxY < pos.getY()) + maxY = pos.getY(); + + if (minZ > pos.getZ()) + minZ = pos.getZ(); + if (maxZ < pos.getZ()) + maxZ = pos.getZ(); + } + + renderOutline(new Vec3d(minX, minY, minZ), new Vec3d(maxX + 1, maxY + 1, maxZ + 1), partialTicks, renderMasked); + } + + public static void renderOutline(Vec3d begin, Vec3d end, double partialTicks) { + renderOutline(begin, end, partialTicks, false); + } + + public static void renderOutline(Vec3d begin, Vec3d end, double partialTicks, boolean renderMasked) { + + GlStateManager.pushMatrix(); + GL11.glPushAttrib(GL11.GL_LIGHTING_BIT); + GlStateManager.disableTexture2D(); + GlStateManager.enableBlend(); + + RenderToolsInternal.glColor(Color.HSBtoRGB((float) getTimeGradient(1, 200, partialTicks), 0.7f, 1.0f)); + + + RenderToolsInternal.translateGlToWorldCord(partialTicks); + + //遮住的部分再来一个细一点的线 + if (renderMasked) { + GlStateManager.disableDepth(); + GlStateManager.glLineWidth(2); + RenderToolsInternal.renderOutline(begin, end); + GlStateManager.enableDepth(); + } + GlStateManager.glLineWidth(5); + RenderToolsInternal.renderOutline(begin, end); + + GlStateManager.enableTexture2D(); + GlStateManager.disableBlend(); + GL11.glPopAttrib(); + GlStateManager.popMatrix(); + + } + + + public static double getTimeGradient(double min, double max, double period, double partialTicks) { + double length = max - min; + double proportion = (ClientEventHandler.elapsedTicks + partialTicks) % period / period; + return min + length * proportion; + } + + public static double getTimeGradient(double max, double period, double partialTicks) { + return getTimeGradient(0, max, period, partialTicks); + } + + +} diff --git a/src/main/java/com/warmthdawn/mod/gugu_utils/tools/RenderToolsInternal.java b/src/main/java/com/warmthdawn/mod/gugu_utils/tools/RenderToolsInternal.java new file mode 100644 index 0000000..5031a8d --- /dev/null +++ b/src/main/java/com/warmthdawn/mod/gugu_utils/tools/RenderToolsInternal.java @@ -0,0 +1,124 @@ +package com.warmthdawn.mod.gugu_utils.tools; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.entity.EntityPlayerSP; +import net.minecraft.client.renderer.BufferBuilder; +import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.vertex.DefaultVertexFormats; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.math.Vec3d; +import net.minecraft.util.math.Vec3i; +import org.lwjgl.opengl.GL11; + +import java.awt.*; + +public class RenderToolsInternal { + private static void line(BufferBuilder buffer, double aX, double aY, double aZ, double bX, double bY, double bZ) { + buffer.pos(aX, aY, aZ).endVertex(); + buffer.pos(bX, bY, bZ).endVertex(); + } + + private static void lineX(BufferBuilder buffer, double aX, double bX, double Y, double Z) { + buffer.pos(aX, Y, Z).endVertex(); + buffer.pos(bX, Y, Z).endVertex(); + } + + private static void lineY(BufferBuilder buffer, double aY, double bY, double X, double Z) { + buffer.pos(X, aY, Z).endVertex(); + buffer.pos(X, bY, Z).endVertex(); + } + + private static void lineZ(BufferBuilder buffer, double aZ, double bZ, double X, double Y) { + buffer.pos(X, Y, aZ).endVertex(); + buffer.pos(X, Y, bZ).endVertex(); + } + + + public static void glTranslate(Vec3d vec) { + GL11.glTranslated(vec.x, vec.y, vec.z); + } + + public static void glTranslate(Vec3i vec) { + GL11.glTranslated(vec.getX(), vec.getY(), vec.getZ()); + } + + public static void glColor(Color colorRGB) { + GL11.glColor4ub((byte) colorRGB.getRed(), (byte) colorRGB.getGreen(), (byte) colorRGB.getBlue(), (byte) colorRGB.getAlpha()); + } + + public static void glColor(int color) { + Color colorRGB = new Color(color); + GL11.glColor4ub((byte) colorRGB.getRed(), (byte) colorRGB.getGreen(), (byte) colorRGB.getBlue(), (byte) colorRGB.getAlpha()); + } + + + public static void translateGlToWorldCord(double partialTicks) { + Minecraft mc = Minecraft.getMinecraft(); + + EntityPlayerSP p = mc.player; + double doubleX = p.lastTickPosX + (p.posX - p.lastTickPosX) * partialTicks; + double doubleY = p.lastTickPosY + (p.posY - p.lastTickPosY) * partialTicks; + double doubleZ = p.lastTickPosZ + (p.posZ - p.lastTickPosZ) * partialTicks; + + GlStateManager.translate(-doubleX, -doubleY, -doubleZ); + } + + public static Vec3d getPlayerRenderPos(double partialTicks) { + Minecraft mc = Minecraft.getMinecraft(); + + EntityPlayerSP p = mc.player; + double doubleX = p.lastTickPosX + (p.posX - p.lastTickPosX) * partialTicks; + double doubleY = p.lastTickPosY + (p.posY - p.lastTickPosY) * partialTicks; + double doubleZ = p.lastTickPosZ + (p.posZ - p.lastTickPosZ) * partialTicks; + + return new Vec3d(doubleX, doubleY, doubleZ); + } + + + public static void renderOutline(Vec3d begin, Vec3d end) { + renderOutline(begin.x, begin.y, begin.z, end.x, end.y, end.z); + } + + public static void renderOutline(Vec3d begin, Vec3d end, double offset) { +// renderOutline(begin.x, begin.y, begin.z, end.x, end.y, end.z); + renderOutline( + Math.min(begin.x, end.x) - offset, + Math.min(begin.y, end.y) - offset, + Math.min(begin.z, end.z) - offset, + Math.max(begin.x, end.x) + offset, + Math.max(begin.y, end.y) + offset, + Math.max(begin.z, end.z) + offset); + } + + public static void renderOutline(AxisAlignedBB aabb) { + renderOutline(aabb.minX, aabb.minY, aabb.minZ, aabb.maxX, aabb.maxY, aabb.maxZ); + } + + //画出方块边框 + public static void renderOutline(double aX, double aY, double aZ, double bX, double bY, double bZ) { + + //初始化渲染模式 + Tessellator tessellator = Tessellator.getInstance(); + BufferBuilder buf = tessellator.getBuffer(); + buf.begin(GL11.GL_LINES, DefaultVertexFormats.POSITION); + + //一个正方体有12条边 + lineX(buf, aX, bX, aY, aZ); + lineX(buf, aX, bX, bY, bZ); + lineX(buf, aX, bX, aY, bZ); + lineX(buf, aX, bX, bY, aZ); + + lineY(buf, aY, bY, aX, aZ); + lineY(buf, aY, bY, bX, bZ); + lineY(buf, aY, bY, aX, bZ); + lineY(buf, aY, bY, bX, aZ); + + lineZ(buf, aZ, bZ, aX, aY); + lineZ(buf, aZ, bZ, bX, bY); + lineZ(buf, aZ, bZ, aX, bY); + lineZ(buf, aZ, bZ, bX, aY); + + tessellator.draw(); + } +} diff --git a/src/main/java/com/warmthdawn/mod/gugu_utils/tools/RenderUtils.java b/src/main/java/com/warmthdawn/mod/gugu_utils/tools/RenderUtils.java index eb9163b..90c8d8d 100644 --- a/src/main/java/com/warmthdawn/mod/gugu_utils/tools/RenderUtils.java +++ b/src/main/java/com/warmthdawn/mod/gugu_utils/tools/RenderUtils.java @@ -84,12 +84,12 @@ private static void drawFluidTexture(double xCoord, double yCoord, TextureAtlasS public static void renderEmberBarVertical(int x, int y, float alpha, float percentage) { Minecraft mc = Minecraft.getMinecraft(); - + double particalTicks = mc.getRenderPartialTicks(); GlStateManager.color(1F, 1F, 1F, alpha); mc.renderEngine.bindTexture(RECIPES_UI); drawTexturedModalRect(x, y, 0, 8, 0, 5, 102); - int voffset = (ClientEventHandler.elapsedTicks % 30) * 3; + int voffset = ((int) ((ClientEventHandler.elapsedTicks + particalTicks) * 3)) % 87; drawTexturedModalRect(x + 1, y + 1, 0, 13, 0, 3, 100); @@ -97,8 +97,9 @@ public static void renderEmberBarVertical(int x, int y, float alpha, float perce if (percentage > 0 && emberPercentage == 0) { emberPercentage = 1; } + emberPercentage = Math.min(100, emberPercentage); int offset = 100 - emberPercentage; - drawTexturedModalRect(x + 1, y + 1 + offset, 0, 16 + voffset, offset, 3, Math.min(100, emberPercentage)); + drawTexturedModalRect(x + 1, y + 1 + offset, 0, 16 + voffset, offset, 3, emberPercentage); GL11.glColor4ub((byte) 255, (byte) 255, (byte) 255, (byte) 255); } @@ -114,7 +115,7 @@ public static void renderManaBarVertical(int x, int y, int color, float alpha, i if (manaPercentage == 0 && mana > 0) manaPercentage = 1; - drawTexturedModalRect(x + 1, y + 1, 0, 5, 0, 3, 102); + drawTexturedModalRect(x + 1, y + 1, 0, 5, 0, 3, 100); Color color_ = new Color(color); GL11.glColor4ub((byte) color_.getRed(), (byte) color_.getGreen(), (byte) color_.getBlue(), (byte) (255F * alpha)); diff --git a/src/main/resources/assets/gugu-utils/lang/en_us.lang b/src/main/resources/assets/gugu-utils/lang/en_us.lang index d4d36f9..d896937 100644 --- a/src/main/resources/assets/gugu-utils/lang/en_us.lang +++ b/src/main/resources/assets/gugu-utils/lang/en_us.lang @@ -1,6 +1,7 @@ item.gugu-utils.lensOverclocking.name=Overlclocking Lens item.gugu-utils.lensTransform.name=Transform Lens item.gugu-utils.lensTransform.short.name=Transform +item.gugu-utils.constructionranged.name=Ranged Construction Selection Tool tile.gugu-utils.sparkmanahatch.input.name=Spark Mana Input Hatch tile.gugu-utils.sparkmanahatch.output.name=Spark Mana Output Hatch @@ -32,6 +33,7 @@ message.gugu-utils.starlightinputhatch.ext.basic=Same as %s message.gugu-utils.starlightinputhatch.ext.trait=Same as %s message.gugu-utils.starlightinputhatch.ext.brilliant=Four times as %s message.gugu-utils.starlightinputhatch=Maximum Staright: %s +message.gugu-utils.rangedconstructtool.creative=Ranged Construction Tool, use together with default tool! tooltips.gugu-utils.mana_amount=Mana: %s Mana diff --git a/src/main/resources/assets/gugu-utils/lang/zh_cn.lang b/src/main/resources/assets/gugu-utils/lang/zh_cn.lang index fc7dae4..08fa9d0 100644 --- a/src/main/resources/assets/gugu-utils/lang/zh_cn.lang +++ b/src/main/resources/assets/gugu-utils/lang/zh_cn.lang @@ -1,6 +1,7 @@ item.gugu-utils.lensOverclocking.name=魔力透镜: 超频 item.gugu-utils.lensTransform.name=魔力透镜: 转变 item.gugu-utils.lensTransform.short.name=转变 +item.gugu-utils.constructionranged.name=范围建造选择工具 tile.gugu-utils.sparkmanahatch.input.name=火花魔力输入仓 tile.gugu-utils.sparkmanahatch.output.name=火花魔力输出仓 @@ -31,6 +32,7 @@ message.gugu-utils.starlightinputhatch.ext.basic=相当于 %s 的容量 message.gugu-utils.starlightinputhatch.ext.trait=相当于 %s 的容量 message.gugu-utils.starlightinputhatch.ext.brilliant=四倍于 %s 的容量 message.gugu-utils.starlightinputhatch=最大星能: %s +message.gugu-utils.rangedconstructtool.creative=范围建造工具,配合默认工具使用 diff --git a/src/main/resources/assets/gugu-utils/models/item/constructionranged.json b/src/main/resources/assets/gugu-utils/models/item/constructionranged.json new file mode 100644 index 0000000..f0a7c46 --- /dev/null +++ b/src/main/resources/assets/gugu-utils/models/item/constructionranged.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "gugu-utils:items/rangedwrench" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gugu-utils/textures/gui/recipes_ui.png b/src/main/resources/assets/gugu-utils/textures/gui/recipes_ui.png index fe6bcbd2cff2054a50cc535289e3514311f48167..6ab8f8e8e386a674fb362fe7b2d9f495d30c53f0 100644 GIT binary patch literal 15599 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 literal 17175 zcmeIacT^PJwlCV`oFqyX{E#3y$0maT$w^5~Msm*3Ac!JC6eI~vP>|RlnFbnAf}{qK zoHIzy4RpgT_ul6l=iG75eP^8U-uvq^3c9*#)mm%LHPiadS-jSJqD4W=n68C3Qq}ywn_=U9>}d91KIA z7}+#UQNoI&nx9=>uxid_HbR}MJ;b6J>+^B+z8Tot)g{tU=z zrlZHH=IP_WDJdi+XeTNm$tf)>Bq}8?AuD^IQ%pouMp#5fSX5k4R7y@lL{3bM^Itz) zz-T`9j&cU-n*SOL_@>C^?C0ktCoCKo7$_7dF68OsBrGZ`D=RD_CM+f<2(%FN4fgPZ z1POZha{pTo>JGkkJ}zEZS7yw|c zj?Uj>{HJqqcmI0`Uq6iifQ)}J*?=f=b#Y)Oq2T$HC}RRJ`NB+ zPah*sPq%+tD7}B1GN+o_pM{a-72`Tzq1vlIXK*B_{<>G^m%y0`&1d=0czIUi`K zNr}ozNePMxiT-1{Iy!O>Jbe8i9(E27)D^h^{s_6a*vmn9n&4u$H z5+et(`=bepTy}p%z`>sDUzc6}GYDEMc$fzA#wGc6Tq$i zj_3*hSM&FU1pJ?8?+QaCPfUm-Npsr#R^l>*Q zG=Xg*d;#g?xM#OO<-ua_$%lH=i2yPp&@G&blW90bw zSjKOYS_$1jRZ4X;xf0^P2f9%v#?Z_eDy3uSZ7Ug1nA;l!!rS zC*(m52wIYf1wkXPA0bVG=ioQLg>gY`2Nz%*kVV+()3so0OkZr@_N(2>oAw3tOj=I^ zB1y&v-TndY+4E%oCI{8V0;*~bV}V{>gdZWp!uq$_BUbr9?T1>q_@EZdG8qVpyc&(< z038G>p`+MZg|WGt=fSI!+#o0{X#bgU*BU(A*(F#5e6dQ)zwcSPF@K#JvR+Mex{?e| zx|bV-yB~3mIIIC*zGA=MrZ$-9`22L*{4}2@zgX)YDEVs(!HlpZdS8jCzB@gsD;b` z7v%9)(&vVEG3Jh7)kZOe>-7d)F9EQMfT?znVug%{#zKfj(YCcf?bo)GWz+gF7-V+) zLcWf5HvCN_xT04+)+8d@xaRncifdA{!Wv&0C=D__^&h%u!)A)G*} zw;Osc&n<`zK(e(%c|LrO^fIe?fB_f7Ym_=5yERH>G-jp+kH2K%XLq2Pkf7D@>urG zbJZB7$RI`0oy$2MxvQVDZu4{P-?eGy_ISpnL(HtK>hD>!hS0z005J+#v|nDzN$t&R z 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 literal 0 HcmV?d00001