package com.xray.gui.manage; import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.systems.RenderSystem; import com.xray.XRay; import com.xray.gui.GuiSelectionScreen; import com.xray.gui.utils.GuiBase; import com.xray.utils.BlockData; import com.xray.xray.Controller; import net.minecraft.block.Block; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.widget.TextFieldWidget; import net.minecraft.client.gui.widget.button.Button; import net.minecraft.client.renderer.BufferBuilder; import net.minecraft.client.renderer.RenderHelper; import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.client.resources.I18n; import net.minecraft.item.ItemStack; import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.StringTextComponent; import net.minecraft.util.text.TranslationTextComponent; import net.minecraftforge.fml.client.gui.GuiUtils; import net.minecraftforge.fml.client.gui.widget.Slider; import java.util.ArrayList; import java.util.Objects; public class GuiAddBlock extends GuiBase { private TextFieldWidget oreName; private Button addBtn; private CustomSlider redSlider; private CustomSlider greenSlider; private CustomSlider blueSlider; private Block selectBlock; private ItemStack itemStack; private boolean oreNameCleared = false; public GuiAddBlock(Block selectedBlock) { super(false); this.selectBlock = selectedBlock; this.itemStack = new ItemStack(selectBlock, 1); } @Override public void func_231160_c_() {// @mcp: func_231160_c_ = init // Called when the gui should be (re)created addButton(addBtn = new Button(getWidth() / 2 - 100, getHeight() / 2 + 85, 128, 20, new TranslationTextComponent("xray.single.add"), b -> { this.onClose(); if (selectBlock.getRegistryName() == null) return; // Push the block to the render stack Controller.getBlockStore().put( new BlockData( oreName.getText(), selectBlock.getRegistryName().toString(), (((int) (redSlider.getValue() * 255) << 16) + ((int) (greenSlider.getValue() * 255) << 8) + (int) (blueSlider.getValue() * 255)), this.itemStack, true, Controller.getBlockStore().getStore().size() + 1 ) ); XRay.blockStore.write(new ArrayList<>(Controller.getBlockStore().getStore().values())); getMinecraft().displayGuiScreen(new GuiSelectionScreen()); })); addButton(new Button(getWidth() / 2 + 30, getHeight() / 2 + 85, 72, 20, new TranslationTextComponent("xray.single.cancel"), b -> this.onClose())); addButton(redSlider = new CustomSlider(getWidth() / 2 - 100, getHeight() / 2 + 7, new TranslationTextComponent("xray.color.red"), 0, 255, 0, (e) -> {}, (e) -> {})); addButton(greenSlider = new CustomSlider(getWidth() / 2 - 100, getHeight() / 2 + 30, new TranslationTextComponent("xray.color.green"), 0, 255, 165, (e) -> {}, (e) -> {})); addButton(blueSlider = new CustomSlider(getWidth() / 2 - 100, getHeight() / 2 + 53, new TranslationTextComponent("xray.color.blue"), 0, 255, 255, (e) -> {}, (e) -> {})); oreName = new TextFieldWidget(getMinecraft().fontRenderer, getWidth() / 2 - 100, getHeight() / 2 - 70, 202, 20, StringTextComponent.field_240750_d_); // @mcp: field_240750_d_ = empty oreName.setText(this.selectBlock.func_235333_g_().getString()); // @mcp: func_235333_g_ = getNameTextComponent this.field_230705_e_.add(oreName);// @mcp: field_230705_e_ = children } @Override // @mcp: func_231023_e_ = tick public void func_231023_e_() { super.func_231023_e_(); oreName.tick(); } @Override public void renderExtra(MatrixStack stack, int x, int y, float partialTicks) { // @mcp: func_238405_a_ = drawStringWithShadow // @mcp: func_235333_g_ = getNameTextComponent getFontRender().func_238405_a_(stack, selectBlock.func_235333_g_().getString(), getWidth() / 2f - 100, getHeight() / 2f - 90, 0xffffff); oreName.func_230430_a_(stack, x, y, partialTicks); // @mcp: func_230430_a_ = render renderPreview(getWidth() / 2 - 100, getHeight() / 2 - 40, (float) redSlider.getValue(), (float) greenSlider.getValue(), (float) blueSlider.getValue()); RenderHelper.enableStandardItemLighting(); this.field_230707_j_.renderItemAndEffectIntoGUI(this.itemStack, getWidth() / 2 + 85, getHeight() / 2 - 105); // @mcp: field_230707_j_ = itemRender RenderHelper.disableStandardItemLighting(); } // FIXME: 28/06/2020 replace with matrix system instead of the tess static void renderPreview(int x, int y, float r, float g, float b) { Tessellator tessellator = Tessellator.getInstance(); BufferBuilder tessellate = tessellator.getBuffer(); RenderSystem.enableBlend(); RenderSystem.disableTexture(); RenderSystem.blendFuncSeparate(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA, GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ZERO); RenderSystem.color4f(r/255, g/255, b/255, 1); tessellate.begin(7, DefaultVertexFormats.POSITION); tessellate.pos(x, y, 0.0D).endVertex(); tessellate.pos(x, y + 45, 0.0D).endVertex(); tessellate.pos(x + 202, y + 45, 0.0D).endVertex(); tessellate.pos(x + 202, y, 0.0D).endVertex(); tessellator.draw(); RenderSystem.enableTexture(); RenderSystem.disableBlend(); } @Override // @mcp: func_231044_a_ = mouseClicked public boolean func_231044_a_(double x, double y, int mouse) { if (oreName.func_231044_a_(x, y, mouse)) this.func_231035_a_(oreName); // @mcp: func_231035_a_ = setFocused if (oreName.func_230999_j_() && !oreNameCleared) { // @mcp: func_230999_j_ = isFocused oreName.setText(""); oreNameCleared = true; } if (!oreName.func_230999_j_() && oreNameCleared && Objects.equals(oreName.getText(), "")) { // @mcp: func_230999_j_ = isFocused oreNameCleared = false; oreName.setText(I18n.format("xray.input.gui")); } return super.func_231044_a_(x, y, mouse); } @Override // @mcp: func_231048_c_ = mouseReleased public boolean func_231048_c_(double x, double y, int mouse) { if (redSlider.dragging && !redSlider.func_230999_j_()) redSlider.dragging = false; if (greenSlider.dragging && !greenSlider.func_230999_j_()) greenSlider.dragging = false; if (blueSlider.dragging && !blueSlider.func_230999_j_()) blueSlider.dragging = false; return super.func_231048_c_(x, y, mouse); } @Override public boolean hasTitle() { return true; } @Override public String title() { return I18n.format("xray.title.config"); } public static class CustomSlider extends Slider { public CustomSlider(int xPos, int yPos, ITextComponent displayStr, double minVal, double maxVal, double currentVal, IPressable handler, ISlider par) { super(xPos, yPos, 202, 20, displayStr, new StringTextComponent(""), minVal, maxVal, currentVal, false, true, handler, par); } // note: overriding this because the forge one has a bug in it causing the title to have %s button after it... @Override public void func_230431_b_(MatrixStack mStack, int mouseX, int mouseY, float partial) { if (this.field_230694_p_) { Minecraft mc = Minecraft.getInstance(); this.field_230692_n_ = mouseX >= this.field_230690_l_ && mouseY >= this.field_230691_m_ && mouseX < this.field_230690_l_ + this.field_230688_j_ && mouseY < this.field_230691_m_ + this.field_230689_k_; int k = this.func_230989_a_(this.func_230449_g_()); GuiUtils.drawContinuousTexturedBox(field_230687_i_, this.field_230690_l_, this.field_230691_m_, 0, 46 + k * 20, this.field_230688_j_, this.field_230689_k_, 200, 20, 2, 3, 2, 2, this.func_230927_p_()); this.func_230441_a_(mStack, mc, mouseX, mouseY); ITextComponent buttonText = this.func_230458_i_(); int strWidth = mc.fontRenderer.func_238414_a_(buttonText); int ellipsisWidth = mc.fontRenderer.getStringWidth("..."); if (strWidth > field_230688_j_ - 6 && strWidth > ellipsisWidth) //TODO, srg names make it hard to figure out how to append to an ITextProperties from this trim operation, wraping this in StringTextComponent is kinda dirty. buttonText = new StringTextComponent(mc.fontRenderer.func_238417_a_(buttonText, field_230688_j_ - 6 - ellipsisWidth).getString() + "..."); this.func_238472_a_(mStack, mc.fontRenderer, buttonText, this.field_230690_l_ + this.field_230688_j_ / 2, this.field_230691_m_ + (this.field_230689_k_ - 8) / 2, getFGColor()); } } } }