The great screen refactor

- Use vanilla's widget lists instead of custom ones
- Use press callback instead of overriding mouseClicked
- Switch old container classes to extend ContainerBase or
GhostItemContainer
- Organize foundation.gui package
- Remove deprecated methods in Color
- Various other changes
This commit is contained in:
PepperBell 2021-11-14 16:11:14 -08:00
parent 1e90f84875
commit ad350507c9
148 changed files with 1454 additions and 1853 deletions

View file

@ -25,7 +25,6 @@ import com.simibubi.create.foundation.utility.outliner.Outliner;
import net.minecraft.ChatFormatting; import net.minecraft.ChatFormatting;
import net.minecraft.client.GraphicsStatus; import net.minecraft.client.GraphicsStatus;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.screens.Screen;
import net.minecraft.network.chat.ChatType; import net.minecraft.network.chat.ChatType;
import net.minecraft.network.chat.ClickEvent; import net.minecraft.network.chat.ClickEvent;
import net.minecraft.network.chat.ComponentUtils; import net.minecraft.network.chat.ComponentUtils;
@ -40,7 +39,6 @@ public class CreateClient {
public static final SuperByteBufferCache BUFFER_CACHE = new SuperByteBufferCache(); public static final SuperByteBufferCache BUFFER_CACHE = new SuperByteBufferCache();
public static final Outliner OUTLINER = new Outliner(); public static final Outliner OUTLINER = new Outliner();
public static final GhostBlocks GHOST_BLOCKS = new GhostBlocks(); public static final GhostBlocks GHOST_BLOCKS = new GhostBlocks();
public static final Screen EMPTY_SCREEN = new Screen(new TextComponent("")) {};
public static final ModelSwapper MODEL_SWAPPER = new ModelSwapper(); public static final ModelSwapper MODEL_SWAPPER = new ModelSwapper();
public static final CasingConnectivity CASING_CONNECTIVITY = new CasingConnectivity(); public static final CasingConnectivity CASING_CONNECTIVITY = new CasingConnectivity();

View file

@ -40,18 +40,13 @@ import com.simibubi.create.content.contraptions.components.press.MechanicalPress
import com.simibubi.create.content.contraptions.components.saw.SawTileEntity; import com.simibubi.create.content.contraptions.components.saw.SawTileEntity;
import com.simibubi.create.content.contraptions.fluids.recipe.PotionMixingRecipeManager; import com.simibubi.create.content.contraptions.fluids.recipe.PotionMixingRecipeManager;
import com.simibubi.create.content.contraptions.processing.BasinRecipe; import com.simibubi.create.content.contraptions.processing.BasinRecipe;
import com.simibubi.create.content.curiosities.toolbox.ToolboxScreen;
import com.simibubi.create.content.curiosities.tools.BlueprintScreen; import com.simibubi.create.content.curiosities.tools.BlueprintScreen;
import com.simibubi.create.content.logistics.block.inventories.AdjustableCrateScreen;
import com.simibubi.create.content.logistics.item.LinkedControllerScreen; import com.simibubi.create.content.logistics.item.LinkedControllerScreen;
import com.simibubi.create.content.logistics.item.filter.AbstractFilterScreen; import com.simibubi.create.content.logistics.item.filter.AbstractFilterScreen;
import com.simibubi.create.content.logistics.item.filter.AttributeFilterScreen;
import com.simibubi.create.content.logistics.item.filter.FilterScreen;
import com.simibubi.create.content.schematics.block.SchematicTableScreen;
import com.simibubi.create.content.schematics.block.SchematicannonScreen;
import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.config.AllConfigs;
import com.simibubi.create.foundation.config.CRecipes; import com.simibubi.create.foundation.config.CRecipes;
import com.simibubi.create.foundation.config.ConfigBase.ConfigBool; import com.simibubi.create.foundation.config.ConfigBase.ConfigBool;
import com.simibubi.create.foundation.gui.container.AbstractSimiContainerScreen;
import com.simibubi.create.foundation.utility.recipe.IRecipeTypeInfo; import com.simibubi.create.foundation.utility.recipe.IRecipeTypeInfo;
import mezz.jei.api.IModPlugin; import mezz.jei.api.IModPlugin;
@ -247,18 +242,11 @@ public class CreateJEI implements IModPlugin {
@SuppressWarnings({ "unchecked", "rawtypes" }) @SuppressWarnings({ "unchecked", "rawtypes" })
@Override @Override
public void registerGuiHandlers(IGuiHandlerRegistration registration) { public void registerGuiHandlers(IGuiHandlerRegistration registration) {
SlotMover slotMover = new SlotMover(); registration.addGenericGuiContainerHandler(AbstractSimiContainerScreen.class, new SlotMover());
registration.addGuiContainerHandler(SchematicTableScreen.class, slotMover);
registration.addGuiContainerHandler(SchematicannonScreen.class, slotMover);
registration.addGuiContainerHandler(AdjustableCrateScreen.class, slotMover);
registration.addGuiContainerHandler(FilterScreen.class, slotMover);
registration.addGuiContainerHandler(AttributeFilterScreen.class, slotMover);
registration.addGuiContainerHandler(BlueprintScreen.class, slotMover);
registration.addGuiContainerHandler(LinkedControllerScreen.class, slotMover);
registration.addGuiContainerHandler(ToolboxScreen.class, slotMover);
registration.addGhostIngredientHandler(AbstractFilterScreen.class, new GhostIngredientHandler()); registration.addGhostIngredientHandler(AbstractFilterScreen.class, new GhostIngredientHandler());
registration.addGhostIngredientHandler(BlueprintScreen.class, new GhostIngredientHandler()); registration.addGhostIngredientHandler(BlueprintScreen.class, new GhostIngredientHandler());
registration.addGhostIngredientHandler(LinkedControllerScreen.class, new GhostIngredientHandler());
} }
private class CategoryBuilder<T extends Recipe<?>> { private class CategoryBuilder<T extends Recipe<?>> {

View file

@ -4,7 +4,7 @@ import java.util.function.Supplier;
import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.systems.RenderSystem;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.PoseStack;
import com.simibubi.create.foundation.gui.GuiGameElement; import com.simibubi.create.foundation.gui.element.GuiGameElement;
import mezz.jei.api.gui.drawable.IDrawable; import mezz.jei.api.gui.drawable.IDrawable;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;

View file

@ -6,9 +6,9 @@ import java.util.List;
import javax.annotation.ParametersAreNonnullByDefault; import javax.annotation.ParametersAreNonnullByDefault;
import com.simibubi.create.content.logistics.item.filter.AttributeFilterScreen; import com.simibubi.create.content.logistics.item.filter.AttributeFilterScreen;
import com.simibubi.create.foundation.gui.AbstractSimiContainerScreen; import com.simibubi.create.foundation.gui.container.AbstractSimiContainerScreen;
import com.simibubi.create.foundation.gui.GhostItemContainer; import com.simibubi.create.foundation.gui.container.GhostItemContainer;
import com.simibubi.create.foundation.gui.GhostItemSubmitPacket; import com.simibubi.create.foundation.gui.container.GhostItemSubmitPacket;
import com.simibubi.create.foundation.networking.AllPackets; import com.simibubi.create.foundation.networking.AllPackets;
import mezz.jei.api.gui.handlers.IGhostIngredientHandler; import mezz.jei.api.gui.handlers.IGhostIngredientHandler;

View file

@ -2,7 +2,7 @@ package com.simibubi.create.compat.jei;
import java.util.List; import java.util.List;
import com.simibubi.create.foundation.gui.AbstractSimiContainerScreen; import com.simibubi.create.foundation.gui.container.AbstractSimiContainerScreen;
import mezz.jei.api.gui.handlers.IGuiContainerHandler; import mezz.jei.api.gui.handlers.IGuiContainerHandler;
import net.minecraft.client.renderer.Rect2i; import net.minecraft.client.renderer.Rect2i;
@ -18,4 +18,5 @@ public class SlotMover implements IGuiContainerHandler<AbstractSimiContainerScre
public List<Rect2i> getGuiExtraAreas(AbstractSimiContainerScreen<?> containerScreen) { public List<Rect2i> getGuiExtraAreas(AbstractSimiContainerScreen<?> containerScreen) {
return containerScreen.getExtraAreas(); return containerScreen.getExtraAreas();
} }
} }

View file

@ -158,25 +158,25 @@ public class BasinCategory extends CreateRecipeCategory<BasinRecipe> {
int yOffset = 0; int yOffset = 0;
for (int i = 0; i < size; i++) for (int i = 0; i < size; i++)
AllGuiTextures.JEI_SLOT.draw(matrixStack, 16 + xOffset + (i % 3) * 19, 50 - (i / 3) * 19 + yOffset); AllGuiTextures.JEI_SLOT.render(matrixStack, 16 + xOffset + (i % 3) * 19, 50 - (i / 3) * 19 + yOffset);
boolean noHeat = requiredHeat == HeatCondition.NONE; boolean noHeat = requiredHeat == HeatCondition.NONE;
int vRows = (1 + outSize) / 2; int vRows = (1 + outSize) / 2;
for (int i = 0; i < outSize; i++) for (int i = 0; i < outSize; i++)
AllGuiTextures.JEI_SLOT.draw(matrixStack, AllGuiTextures.JEI_SLOT.render(matrixStack,
141 - (outSize % 2 != 0 && i == outSize - 1 ? 0 : i % 2 == 0 ? 10 : -9), -19 * (i / 2) + 50 + yOffset); 141 - (outSize % 2 != 0 && i == outSize - 1 ? 0 : i % 2 == 0 ? 10 : -9), -19 * (i / 2) + 50 + yOffset);
if (vRows <= 2) if (vRows <= 2)
AllGuiTextures.JEI_DOWN_ARROW.draw(matrixStack, 136, -19 * (vRows - 1) + 32 + yOffset); AllGuiTextures.JEI_DOWN_ARROW.render(matrixStack, 136, -19 * (vRows - 1) + 32 + yOffset);
AllGuiTextures shadow = noHeat ? AllGuiTextures.JEI_SHADOW : AllGuiTextures.JEI_LIGHT; AllGuiTextures shadow = noHeat ? AllGuiTextures.JEI_SHADOW : AllGuiTextures.JEI_LIGHT;
shadow.draw(matrixStack, 81, 58 + (noHeat ? 10 : 30)); shadow.render(matrixStack, 81, 58 + (noHeat ? 10 : 30));
if (!needsHeating) if (!needsHeating)
return; return;
AllGuiTextures heatBar = noHeat ? AllGuiTextures.JEI_NO_HEAT_BAR : AllGuiTextures.JEI_HEAT_BAR; AllGuiTextures heatBar = noHeat ? AllGuiTextures.JEI_NO_HEAT_BAR : AllGuiTextures.JEI_HEAT_BAR;
heatBar.draw(matrixStack, 4, 80); heatBar.render(matrixStack, 4, 80);
Minecraft.getInstance().font.draw(matrixStack, Lang.translate(requiredHeat.getTranslationKey()), 9, Minecraft.getInstance().font.draw(matrixStack, Lang.translate(requiredHeat.getTranslationKey()), 9,
86, requiredHeat.getColor()); 86, requiredHeat.getColor());
} }

View file

@ -59,15 +59,15 @@ public class BlockCuttingCategory extends CreateRecipeCategory<CondensedBlockCut
@Override @Override
public void draw(CondensedBlockCuttingRecipe recipe, PoseStack matrixStack, double mouseX, double mouseY) { public void draw(CondensedBlockCuttingRecipe recipe, PoseStack matrixStack, double mouseX, double mouseY) {
AllGuiTextures.JEI_SLOT.draw(matrixStack, 4, 4); AllGuiTextures.JEI_SLOT.render(matrixStack, 4, 4);
int size = Math.min(recipe.getOutputs().size(), 15); int size = Math.min(recipe.getOutputs().size(), 15);
for (int i = 0; i < size; i++) { for (int i = 0; i < size; i++) {
int xOffset = (i % 5) * 19; int xOffset = (i % 5) * 19;
int yOffset = (i / 5) * -19; int yOffset = (i / 5) * -19;
AllGuiTextures.JEI_SLOT.draw(matrixStack, 77 + xOffset, 47 + yOffset); AllGuiTextures.JEI_SLOT.render(matrixStack, 77 + xOffset, 47 + yOffset);
} }
AllGuiTextures.JEI_DOWN_ARROW.draw(matrixStack, 31, 6); AllGuiTextures.JEI_DOWN_ARROW.render(matrixStack, 31, 6);
AllGuiTextures.JEI_SHADOW.draw(matrixStack, 33 - 17, 37 + 13); AllGuiTextures.JEI_SHADOW.render(matrixStack, 33 - 17, 37 + 13);
saw.draw(matrixStack, 33, 37); saw.draw(matrixStack, 33, 37);
} }

View file

@ -58,13 +58,13 @@ public class CrushingCategory extends CreateRecipeCategory<AbstractCrushingRecip
@Override @Override
public void draw(AbstractCrushingRecipe recipe, PoseStack matrixStack, double mouseX, double mouseY) { public void draw(AbstractCrushingRecipe recipe, PoseStack matrixStack, double mouseX, double mouseY) {
List<ProcessingOutput> results = recipe.getRollableResults(); List<ProcessingOutput> results = recipe.getRollableResults();
AllGuiTextures.JEI_SLOT.draw(matrixStack, 50, 2); AllGuiTextures.JEI_SLOT.render(matrixStack, 50, 2);
AllGuiTextures.JEI_DOWN_ARROW.draw(matrixStack, 72, 7); AllGuiTextures.JEI_DOWN_ARROW.render(matrixStack, 72, 7);
int size = results.size(); int size = results.size();
int offset = -size * 19 / 2; int offset = -size * 19 / 2;
for (int outputIndex = 0; outputIndex < results.size(); outputIndex++) for (int outputIndex = 0; outputIndex < results.size(); outputIndex++)
getRenderedSlot(recipe, outputIndex).draw(matrixStack, getBackground().getWidth() / 2 + offset + 19 * outputIndex, 78); getRenderedSlot(recipe, outputIndex).render(matrixStack, getBackground().getWidth() / 2 + offset + 19 * outputIndex, 78);
crushingWheels.draw(matrixStack, 62, 59); crushingWheels.draw(matrixStack, 62, 59);
} }

View file

@ -72,11 +72,11 @@ public class DeployingCategory extends CreateRecipeCategory<DeployerApplicationR
@Override @Override
public void draw(DeployerApplicationRecipe recipe, PoseStack matrixStack, double mouseX, double mouseY) { public void draw(DeployerApplicationRecipe recipe, PoseStack matrixStack, double mouseX, double mouseY) {
AllGuiTextures.JEI_SLOT.draw(matrixStack, 50, 4); AllGuiTextures.JEI_SLOT.render(matrixStack, 50, 4);
AllGuiTextures.JEI_SLOT.draw(matrixStack, 26, 50); AllGuiTextures.JEI_SLOT.render(matrixStack, 26, 50);
getRenderedSlot(recipe, 0).draw(matrixStack, 131, 50); getRenderedSlot(recipe, 0).render(matrixStack, 131, 50);
AllGuiTextures.JEI_SHADOW.draw(matrixStack, 62, 57); AllGuiTextures.JEI_SHADOW.render(matrixStack, 62, 57);
AllGuiTextures.JEI_DOWN_ARROW.draw(matrixStack, 126, 29); AllGuiTextures.JEI_DOWN_ARROW.render(matrixStack, 126, 29);
deployer.draw(matrixStack, getBackground().getWidth() / 2 - 13, 22); deployer.draw(matrixStack, getBackground().getWidth() / 2 - 13, 22);
} }

View file

@ -3,7 +3,7 @@ package com.simibubi.create.compat.jei.category;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.PoseStack;
import com.simibubi.create.AllItems; import com.simibubi.create.AllItems;
import com.simibubi.create.compat.jei.category.animations.AnimatedKinetics; import com.simibubi.create.compat.jei.category.animations.AnimatedKinetics;
import com.simibubi.create.foundation.gui.GuiGameElement; import com.simibubi.create.foundation.gui.element.GuiGameElement;
import net.minecraft.world.item.Items; import net.minecraft.world.item.Items;
import net.minecraft.world.item.crafting.AbstractCookingRecipe; import net.minecraft.world.item.crafting.AbstractCookingRecipe;

View file

@ -2,7 +2,7 @@ package com.simibubi.create.compat.jei.category;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.PoseStack;
import com.simibubi.create.AllItems; import com.simibubi.create.AllItems;
import com.simibubi.create.foundation.gui.GuiGameElement; import com.simibubi.create.foundation.gui.element.GuiGameElement;
import net.minecraft.world.item.Items; import net.minecraft.world.item.Items;
import net.minecraft.world.item.crafting.SmokingRecipe; import net.minecraft.world.item.crafting.SmokingRecipe;

View file

@ -9,7 +9,7 @@ import com.simibubi.create.compat.jei.category.animations.AnimatedKinetics;
import com.simibubi.create.content.contraptions.components.fan.SplashingRecipe; import com.simibubi.create.content.contraptions.components.fan.SplashingRecipe;
import com.simibubi.create.content.contraptions.processing.ProcessingOutput; import com.simibubi.create.content.contraptions.processing.ProcessingOutput;
import com.simibubi.create.foundation.gui.AllGuiTextures; import com.simibubi.create.foundation.gui.AllGuiTextures;
import com.simibubi.create.foundation.gui.GuiGameElement; import com.simibubi.create.foundation.gui.element.GuiGameElement;
import mezz.jei.api.constants.VanillaTypes; import mezz.jei.api.constants.VanillaTypes;
import mezz.jei.api.gui.IRecipeLayout; import mezz.jei.api.gui.IRecipeLayout;
@ -63,20 +63,20 @@ public class FanWashingCategory extends ProcessingViaFanCategory<SplashingRecipe
int size = recipe.getRollableResultsAsItemStacks() int size = recipe.getRollableResultsAsItemStacks()
.size(); .size();
AllGuiTextures.JEI_SLOT.draw(matrixStack, 12, 47); AllGuiTextures.JEI_SLOT.render(matrixStack, 12, 47);
AllGuiTextures.JEI_SHADOW.draw(matrixStack, 47 + 4, 29); AllGuiTextures.JEI_SHADOW.render(matrixStack, 47 + 4, 29);
AllGuiTextures.JEI_SHADOW.draw(matrixStack, 66 + 4, 39); AllGuiTextures.JEI_SHADOW.render(matrixStack, 66 + 4, 39);
AllGuiTextures.JEI_LONG_ARROW.draw(matrixStack, 42, 51); AllGuiTextures.JEI_LONG_ARROW.render(matrixStack, 42, 51);
if (size == 1) { if (size == 1) {
getRenderedSlot(recipe, 0).draw(matrixStack, 126, 47); getRenderedSlot(recipe, 0).render(matrixStack, 126, 47);
return; return;
} }
for (int i = 0; i < size; i++) { for (int i = 0; i < size; i++) {
int xOffset = (i % 3) * 19; int xOffset = (i % 3) * 19;
int yOffset = (i / 3) * -19 + (size > 9 ? 8 : 0); int yOffset = (i / 3) * -19 + (size > 9 ? 8 : 0);
getRenderedSlot(recipe, i).draw(matrixStack, 126 + xOffset, 47 + yOffset); getRenderedSlot(recipe, i).render(matrixStack, 126 + xOffset, 47 + yOffset);
} }
} }

View file

@ -128,11 +128,11 @@ public class ItemDrainCategory extends CreateRecipeCategory<EmptyingRecipe> {
@Override @Override
public void draw(EmptyingRecipe recipe, PoseStack matrixStack, double mouseX, double mouseY) { public void draw(EmptyingRecipe recipe, PoseStack matrixStack, double mouseX, double mouseY) {
AllGuiTextures.JEI_SLOT.draw(matrixStack, 131, 7); AllGuiTextures.JEI_SLOT.render(matrixStack, 131, 7);
AllGuiTextures.JEI_SLOT.draw(matrixStack, 26, 7); AllGuiTextures.JEI_SLOT.render(matrixStack, 26, 7);
getRenderedSlot(recipe, 0).draw(matrixStack, 131, 26); getRenderedSlot(recipe, 0).render(matrixStack, 131, 26);
AllGuiTextures.JEI_SHADOW.draw(matrixStack, 62, 37); AllGuiTextures.JEI_SHADOW.render(matrixStack, 62, 37);
AllGuiTextures.JEI_DOWN_ARROW.draw(matrixStack, 73, 4); AllGuiTextures.JEI_DOWN_ARROW.render(matrixStack, 73, 4);
drain.withFluid(recipe.getResultingFluid()) drain.withFluid(recipe.getResultingFluid())
.draw(matrixStack, getBackground().getWidth() / 2 - 13, 40); .draw(matrixStack, getBackground().getWidth() / 2 - 13, 40);
} }

View file

@ -107,14 +107,14 @@ public class MechanicalCraftingCategory extends CreateRecipeCategory<CraftingRec
matrixStack.pushPose(); matrixStack.pushPose();
matrixStack.translate(col * 19 * scale, row * 19 * scale, 0); matrixStack.translate(col * 19 * scale, row * 19 * scale, 0);
matrixStack.scale(scale, scale, scale); matrixStack.scale(scale, scale, scale);
AllGuiTextures.JEI_SLOT.draw(matrixStack, 0, 0); AllGuiTextures.JEI_SLOT.render(matrixStack, 0, 0);
matrixStack.popPose(); matrixStack.popPose();
} }
matrixStack.popPose(); matrixStack.popPose();
AllGuiTextures.JEI_SLOT.draw(matrixStack, 133, 80); AllGuiTextures.JEI_SLOT.render(matrixStack, 133, 80);
AllGuiTextures.JEI_DOWN_ARROW.draw(matrixStack, 128, 59); AllGuiTextures.JEI_DOWN_ARROW.render(matrixStack, 128, 59);
crafter.draw(matrixStack, 129, 25); crafter.draw(matrixStack, 129, 25);
matrixStack.pushPose(); matrixStack.pushPose();

View file

@ -62,20 +62,20 @@ public class MillingCategory extends CreateRecipeCategory<AbstractCrushingRecipe
int size = recipe.getRollableResultsAsItemStacks() int size = recipe.getRollableResultsAsItemStacks()
.size(); .size();
AllGuiTextures.JEI_SLOT.draw(matrixStack, 14, 8); AllGuiTextures.JEI_SLOT.render(matrixStack, 14, 8);
AllGuiTextures.JEI_ARROW.draw(matrixStack, 85, 32); AllGuiTextures.JEI_ARROW.render(matrixStack, 85, 32);
AllGuiTextures.JEI_DOWN_ARROW.draw(matrixStack, 43, 4); AllGuiTextures.JEI_DOWN_ARROW.render(matrixStack, 43, 4);
millstone.draw(matrixStack, 48, 27); millstone.draw(matrixStack, 48, 27);
if (size == 1) { if (size == 1) {
getRenderedSlot(recipe, 0).draw(matrixStack, 139, 27); getRenderedSlot(recipe, 0).render(matrixStack, 139, 27);
return; return;
} }
for (int i = 0; i < size; i++) { for (int i = 0; i < size; i++) {
int xOffset = i % 2 == 0 ? 0 : 19; int xOffset = i % 2 == 0 ? 0 : 19;
int yOffset = (i / 2) * -19; int yOffset = (i / 2) * -19;
getRenderedSlot(recipe, i).draw(matrixStack, 133 + xOffset, 27 + yOffset); getRenderedSlot(recipe, i).render(matrixStack, 133 + xOffset, 27 + yOffset);
} }
} }

View file

@ -54,10 +54,10 @@ public class MysteriousItemConversionCategory extends CreateRecipeCategory<Conve
@Override @Override
public void draw(ConversionRecipe recipe, PoseStack matrixStack, double mouseX, double mouseY) { public void draw(ConversionRecipe recipe, PoseStack matrixStack, double mouseX, double mouseY) {
AllGuiTextures.JEI_SLOT.draw(matrixStack, 26, 16); AllGuiTextures.JEI_SLOT.render(matrixStack, 26, 16);
AllGuiTextures.JEI_SLOT.draw(matrixStack, 131, 16); AllGuiTextures.JEI_SLOT.render(matrixStack, 131, 16);
AllGuiTextures.JEI_LONG_ARROW.draw(matrixStack, 52, 20); AllGuiTextures.JEI_LONG_ARROW.render(matrixStack, 52, 20);
AllGuiTextures.JEI_QUESTION_MARK.draw(matrixStack, 77, 5); AllGuiTextures.JEI_QUESTION_MARK.render(matrixStack, 77, 5);
} }
} }

View file

@ -76,11 +76,11 @@ public class PackingCategory extends BasinCategory {
int size = ingredients2.size(); int size = ingredients2.size();
int rows = size == 4 ? 2 : 3; int rows = size == 4 ? 2 : 3;
for (int i = 0; i < size; i++) for (int i = 0; i < size; i++)
AllGuiTextures.JEI_SLOT.draw(matrixStack, (rows == 2 ? 26 : 17) + (i % rows) * 19, AllGuiTextures.JEI_SLOT.render(matrixStack, (rows == 2 ? 26 : 17) + (i % rows) * 19,
50 - (i / rows) * 19); 50 - (i / rows) * 19);
AllGuiTextures.JEI_SLOT.draw(matrixStack, 141, 50); AllGuiTextures.JEI_SLOT.render(matrixStack, 141, 50);
AllGuiTextures.JEI_DOWN_ARROW.draw(matrixStack, 136, 32); AllGuiTextures.JEI_DOWN_ARROW.render(matrixStack, 136, 32);
AllGuiTextures.JEI_SHADOW.draw(matrixStack, 81, 68); AllGuiTextures.JEI_SHADOW.render(matrixStack, 81, 68);
} }
HeatCondition requiredHeat = recipe.getRequiredHeat(); HeatCondition requiredHeat = recipe.getRequiredHeat();

View file

@ -8,7 +8,7 @@ import com.simibubi.create.AllItems;
import com.simibubi.create.content.contraptions.processing.ProcessingOutput; import com.simibubi.create.content.contraptions.processing.ProcessingOutput;
import com.simibubi.create.content.curiosities.tools.SandPaperPolishingRecipe; import com.simibubi.create.content.curiosities.tools.SandPaperPolishingRecipe;
import com.simibubi.create.foundation.gui.AllGuiTextures; import com.simibubi.create.foundation.gui.AllGuiTextures;
import com.simibubi.create.foundation.gui.GuiGameElement; import com.simibubi.create.foundation.gui.element.GuiGameElement;
import mezz.jei.api.constants.VanillaTypes; import mezz.jei.api.constants.VanillaTypes;
import mezz.jei.api.gui.IRecipeLayout; import mezz.jei.api.gui.IRecipeLayout;
@ -57,10 +57,10 @@ public class PolishingCategory extends CreateRecipeCategory<SandPaperPolishingRe
@Override @Override
public void draw(SandPaperPolishingRecipe recipe, PoseStack matrixStack, double mouseX, double mouseY) { public void draw(SandPaperPolishingRecipe recipe, PoseStack matrixStack, double mouseX, double mouseY) {
AllGuiTextures.JEI_SLOT.draw(matrixStack, 26, 28); AllGuiTextures.JEI_SLOT.render(matrixStack, 26, 28);
getRenderedSlot(recipe, 0).draw(matrixStack, 131, 28); getRenderedSlot(recipe, 0).render(matrixStack, 131, 28);
AllGuiTextures.JEI_SHADOW.draw(matrixStack, 61, 21); AllGuiTextures.JEI_SHADOW.render(matrixStack, 61, 21);
AllGuiTextures.JEI_LONG_ARROW.draw(matrixStack, 52, 32); AllGuiTextures.JEI_LONG_ARROW.render(matrixStack, 52, 32);
NonNullList<Ingredient> ingredients = recipe.getIngredients(); NonNullList<Ingredient> ingredients = recipe.getIngredients();
ItemStack[] matchingStacks = ingredients.get(0) ItemStack[] matchingStacks = ingredients.get(0)

View file

@ -55,13 +55,13 @@ public class PressingCategory extends CreateRecipeCategory<PressingRecipe> {
@Override @Override
public void draw(PressingRecipe recipe, PoseStack matrixStack, double mouseX, double mouseY) { public void draw(PressingRecipe recipe, PoseStack matrixStack, double mouseX, double mouseY) {
AllGuiTextures.JEI_SLOT.draw(matrixStack, 26, 50); AllGuiTextures.JEI_SLOT.render(matrixStack, 26, 50);
getRenderedSlot(recipe, 0).draw(matrixStack, 131, 50); getRenderedSlot(recipe, 0).render(matrixStack, 131, 50);
if (recipe.getRollableResults() if (recipe.getRollableResults()
.size() > 1) .size() > 1)
getRenderedSlot(recipe, 1).draw(matrixStack, 131 + 19, 50); getRenderedSlot(recipe, 1).render(matrixStack, 131 + 19, 50);
AllGuiTextures.JEI_SHADOW.draw(matrixStack, 61, 41); AllGuiTextures.JEI_SHADOW.render(matrixStack, 61, 41);
AllGuiTextures.JEI_LONG_ARROW.draw(matrixStack, 52, 54); AllGuiTextures.JEI_LONG_ARROW.render(matrixStack, 52, 54);
press.draw(matrixStack, getBackground().getWidth() / 2 - 17, 22); press.draw(matrixStack, getBackground().getWidth() / 2 - 17, 22);
} }

View file

@ -55,11 +55,11 @@ public abstract class ProcessingViaFanCategory<T extends Recipe<?>> extends Crea
} }
protected void renderWidgets(PoseStack matrixStack, T recipe, double mouseX, double mouseY) { protected void renderWidgets(PoseStack matrixStack, T recipe, double mouseX, double mouseY) {
AllGuiTextures.JEI_SLOT.draw(matrixStack, 20, 47); AllGuiTextures.JEI_SLOT.render(matrixStack, 20, 47);
AllGuiTextures.JEI_SLOT.draw(matrixStack, 139, 47); AllGuiTextures.JEI_SLOT.render(matrixStack, 139, 47);
AllGuiTextures.JEI_SHADOW.draw(matrixStack, 47, 29); AllGuiTextures.JEI_SHADOW.render(matrixStack, 47, 29);
AllGuiTextures.JEI_LIGHT.draw(matrixStack, 66, 39); AllGuiTextures.JEI_LIGHT.render(matrixStack, 66, 39);
AllGuiTextures.JEI_LONG_ARROW.draw(matrixStack, 53, 51); AllGuiTextures.JEI_LONG_ARROW.render(matrixStack, 53, 51);
} }
@Override @Override

View file

@ -58,16 +58,16 @@ public class SawingCategory extends CreateRecipeCategory<CuttingRecipe> {
@Override @Override
public void draw(CuttingRecipe recipe, PoseStack matrixStack, double mouseX, double mouseY) { public void draw(CuttingRecipe recipe, PoseStack matrixStack, double mouseX, double mouseY) {
AllGuiTextures.JEI_SLOT.draw(matrixStack, 43, 4); AllGuiTextures.JEI_SLOT.render(matrixStack, 43, 4);
int size = recipe.getRollableResults() int size = recipe.getRollableResults()
.size(); .size();
for (int i = 0; i < size; i++) { for (int i = 0; i < size; i++) {
int xOffset = i % 2 == 0 ? 0 : 19; int xOffset = i % 2 == 0 ? 0 : 19;
int yOffset = (i / 2) * -19; int yOffset = (i / 2) * -19;
getRenderedSlot(recipe, i).draw(matrixStack, 117 + xOffset, 47 + yOffset); getRenderedSlot(recipe, i).render(matrixStack, 117 + xOffset, 47 + yOffset);
} }
AllGuiTextures.JEI_DOWN_ARROW.draw(matrixStack, 70, 6); AllGuiTextures.JEI_DOWN_ARROW.render(matrixStack, 70, 6);
AllGuiTextures.JEI_SHADOW.draw(matrixStack, 72 - 17, 42 + 13); AllGuiTextures.JEI_SHADOW.render(matrixStack, 72 - 17, 42 + 13);
saw.draw(matrixStack, 72, 42); saw.draw(matrixStack, 72, 42);
} }

View file

@ -131,11 +131,11 @@ public class SequencedAssemblyCategory extends CreateRecipeCategory<SequencedAss
matrixStack.translate(0, 15, 0); matrixStack.translate(0, 15, 0);
boolean singleOutput = recipe.getOutputChance() == 1; boolean singleOutput = recipe.getOutputChance() == 1;
int xOffset = singleOutput ? 0 : -7; int xOffset = singleOutput ? 0 : -7;
AllGuiTextures.JEI_SLOT.draw(matrixStack, 26 + xOffset, 75); AllGuiTextures.JEI_SLOT.render(matrixStack, 26 + xOffset, 75);
(singleOutput ? AllGuiTextures.JEI_SLOT : AllGuiTextures.JEI_CHANCE_SLOT).draw(matrixStack, 131 + xOffset, 75); (singleOutput ? AllGuiTextures.JEI_SLOT : AllGuiTextures.JEI_CHANCE_SLOT).render(matrixStack, 131 + xOffset, 75);
AllGuiTextures.JEI_LONG_ARROW.draw(matrixStack, 52 + xOffset, 79); AllGuiTextures.JEI_LONG_ARROW.render(matrixStack, 52 + xOffset, 79);
if (!singleOutput) { if (!singleOutput) {
AllGuiTextures.JEI_CHANCE_SLOT.draw(matrixStack, 150 + xOffset, 75); AllGuiTextures.JEI_CHANCE_SLOT.render(matrixStack, 150 + xOffset, 75);
Component component = new TextComponent("?").withStyle(ChatFormatting.BOLD); Component component = new TextComponent("?").withStyle(ChatFormatting.BOLD);
font.drawShadow(matrixStack, component, font.width(component) / -2 + 8 + 150 + xOffset, 2 + 78, font.drawShadow(matrixStack, component, font.width(component) / -2 + 8 + 150 + xOffset, 2 + 78,
0xefefef); 0xefefef);
@ -144,7 +144,7 @@ public class SequencedAssemblyCategory extends CreateRecipeCategory<SequencedAss
if (recipe.getLoops() > 1) { if (recipe.getLoops() > 1) {
matrixStack.pushPose(); matrixStack.pushPose();
matrixStack.translate(15, 9, 0); matrixStack.translate(15, 9, 0);
AllIcons.I_SEQ_REPEAT.draw(matrixStack, 50 + xOffset, 75); AllIcons.I_SEQ_REPEAT.render(matrixStack, 50 + xOffset, 75);
Component repeat = new TextComponent("x" + recipe.getLoops()); Component repeat = new TextComponent("x" + recipe.getLoops());
font.draw(matrixStack, repeat, 66 + xOffset, 80, 0x888888); font.draw(matrixStack, repeat, 66 + xOffset, 80, 0x888888);
matrixStack.popPose(); matrixStack.popPose();

View file

@ -144,11 +144,11 @@ public class SpoutCategory extends CreateRecipeCategory<FillingRecipe> {
@Override @Override
public void draw(FillingRecipe recipe, PoseStack matrixStack, double mouseX, double mouseY) { public void draw(FillingRecipe recipe, PoseStack matrixStack, double mouseX, double mouseY) {
AllGuiTextures.JEI_SLOT.draw(matrixStack, 26, 31); AllGuiTextures.JEI_SLOT.render(matrixStack, 26, 31);
AllGuiTextures.JEI_SLOT.draw(matrixStack, 26, 50); AllGuiTextures.JEI_SLOT.render(matrixStack, 26, 50);
getRenderedSlot(recipe, 0).draw(matrixStack, 131, 50); getRenderedSlot(recipe, 0).render(matrixStack, 131, 50);
AllGuiTextures.JEI_SHADOW.draw(matrixStack, 62, 57); AllGuiTextures.JEI_SHADOW.render(matrixStack, 62, 57);
AllGuiTextures.JEI_DOWN_ARROW.draw(matrixStack, 126, 29); AllGuiTextures.JEI_DOWN_ARROW.render(matrixStack, 126, 29);
spout.withFluids(recipe.getRequiredFluid() spout.withFluids(recipe.getRequiredFluid()
.getMatchingFluidStacks()) .getMatchingFluidStacks())
.draw(matrixStack, getBackground().getWidth() / 2 - 13, 22); .draw(matrixStack, getBackground().getWidth() / 2 - 13, 22);

View file

@ -11,7 +11,7 @@ public class AnimatedCrafter extends AnimatedKinetics {
public void draw(PoseStack matrixStack, int xOffset, int yOffset) { public void draw(PoseStack matrixStack, int xOffset, int yOffset) {
matrixStack.pushPose(); matrixStack.pushPose();
matrixStack.translate(xOffset, yOffset, 0); matrixStack.translate(xOffset, yOffset, 0);
AllGuiTextures.JEI_SHADOW.draw(matrixStack, -16, 13); AllGuiTextures.JEI_SHADOW.render(matrixStack, -16, 13);
matrixStack.translate(3, 16, 0); matrixStack.translate(3, 16, 0);
MatrixTransformStack.of(matrixStack) MatrixTransformStack.of(matrixStack)

View file

@ -4,8 +4,8 @@ import com.jozufozu.flywheel.core.PartialModel;
import com.simibubi.create.AllBlockPartials; import com.simibubi.create.AllBlockPartials;
import com.simibubi.create.AllBlocks; import com.simibubi.create.AllBlocks;
import com.simibubi.create.foundation.gui.CustomLightingSettings; import com.simibubi.create.foundation.gui.CustomLightingSettings;
import com.simibubi.create.foundation.gui.GuiGameElement;
import com.simibubi.create.foundation.gui.ILightingSettings; import com.simibubi.create.foundation.gui.ILightingSettings;
import com.simibubi.create.foundation.gui.element.GuiGameElement;
import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.AnimationTickHolder;
import mezz.jei.api.gui.drawable.IDrawable; import mezz.jei.api.gui.drawable.IDrawable;

View file

@ -11,7 +11,7 @@ public class AnimatedMillstone extends AnimatedKinetics {
public void draw(PoseStack matrixStack, int xOffset, int yOffset) { public void draw(PoseStack matrixStack, int xOffset, int yOffset) {
matrixStack.pushPose(); matrixStack.pushPose();
matrixStack.translate(xOffset, yOffset, 0); matrixStack.translate(xOffset, yOffset, 0);
AllGuiTextures.JEI_SHADOW.draw(matrixStack, -16, 13); AllGuiTextures.JEI_SHADOW.render(matrixStack, -16, 13);
matrixStack.translate(-2, 18, 0); matrixStack.translate(-2, 18, 0);
int scale = 22; int scale = 22;

View file

@ -89,7 +89,7 @@ public abstract class SequencedAssemblySubCategory {
@Override @Override
public void draw(SequencedRecipe<?> recipe, PoseStack ms, double mouseX, double mouseY, int index) { public void draw(SequencedRecipe<?> recipe, PoseStack ms, double mouseX, double mouseY, int index) {
spout.offset = index; spout.offset = index;
AllGuiTextures.JEI_SLOT.draw(ms, 3, 14); AllGuiTextures.JEI_SLOT.render(ms, 3, 14);
ms.pushPose(); ms.pushPose();
ms.translate(-7, 50, 0); ms.translate(-7, 50, 0);
ms.scale(.75f, .75f, .75f); ms.scale(.75f, .75f, .75f);
@ -143,7 +143,7 @@ public abstract class SequencedAssemblySubCategory {
ms.scale(.75f, .75f, .75f); ms.scale(.75f, .75f, .75f);
deployer.draw(ms, getWidth() / 2, 0); deployer.draw(ms, getWidth() / 2, 0);
ms.popPose(); ms.popPose();
AllGuiTextures.JEI_SLOT.draw(ms, 3, 14); AllGuiTextures.JEI_SLOT.render(ms, 3, 14);
} }
} }

View file

@ -6,11 +6,11 @@ import static com.simibubi.create.foundation.utility.AngleHelper.rad;
import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntity;
import com.simibubi.create.foundation.advancement.AllTriggers; import com.simibubi.create.foundation.advancement.AllTriggers;
import com.simibubi.create.foundation.gui.widgets.InterpolatedChasingValue;
import com.simibubi.create.foundation.gui.widgets.InterpolatedValue;
import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.AnimationTickHolder;
import com.simibubi.create.foundation.utility.NBTHelper; import com.simibubi.create.foundation.utility.NBTHelper;
import com.simibubi.create.foundation.utility.VecHelper; import com.simibubi.create.foundation.utility.VecHelper;
import com.simibubi.create.foundation.utility.animation.InterpolatedChasingValue;
import com.simibubi.create.foundation.utility.animation.InterpolatedValue;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.core.particles.ParticleTypes; import net.minecraft.core.particles.ParticleTypes;

View file

@ -11,7 +11,7 @@ import net.minecraft.world.item.ItemStack;
public class MechanicalCraftingInventory extends CraftingContainer { public class MechanicalCraftingInventory extends CraftingContainer {
private static AbstractContainerMenu dummyContainer = new AbstractContainerMenu(null, -1) { private static final AbstractContainerMenu dummyContainer = new AbstractContainerMenu(null, -1) {
public boolean stillValid(Player playerIn) { public boolean stillValid(Player playerIn) {
return false; return false;
} }

View file

@ -1,7 +1,7 @@
package com.simibubi.create.content.contraptions.components.flywheel; package com.simibubi.create.content.contraptions.components.flywheel;
import com.simibubi.create.content.contraptions.base.GeneratingKineticTileEntity; import com.simibubi.create.content.contraptions.base.GeneratingKineticTileEntity;
import com.simibubi.create.foundation.gui.widgets.InterpolatedChasingValue; import com.simibubi.create.foundation.utility.animation.InterpolatedChasingValue;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.CompoundTag;

View file

@ -5,9 +5,9 @@ import com.simibubi.create.content.contraptions.fluids.tank.CreativeFluidTankTil
import com.simibubi.create.content.contraptions.fluids.tank.CreativeFluidTankTileEntity.CreativeSmartFluidTank; import com.simibubi.create.content.contraptions.fluids.tank.CreativeFluidTankTileEntity.CreativeSmartFluidTank;
import com.simibubi.create.content.contraptions.fluids.tank.FluidTankTileEntity; import com.simibubi.create.content.contraptions.fluids.tank.FluidTankTileEntity;
import com.simibubi.create.foundation.fluid.SmartFluidTank; import com.simibubi.create.foundation.fluid.SmartFluidTank;
import com.simibubi.create.foundation.gui.widgets.InterpolatedChasingValue;
import com.simibubi.create.foundation.networking.AllPackets; import com.simibubi.create.foundation.networking.AllPackets;
import com.simibubi.create.foundation.utility.NBTHelper; import com.simibubi.create.foundation.utility.NBTHelper;
import com.simibubi.create.foundation.utility.animation.InterpolatedChasingValue;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.CompoundTag;

View file

@ -11,7 +11,6 @@ import net.minecraft.client.particle.TextureSheetParticle;
import net.minecraft.core.particles.ParticleType; import net.minecraft.core.particles.ParticleType;
import net.minecraft.core.particles.ParticleTypes; import net.minecraft.core.particles.ParticleTypes;
import net.minecraft.world.inventory.InventoryMenu; import net.minecraft.world.inventory.InventoryMenu;
import net.minecraft.world.phys.Vec3;
import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidStack;
public class FluidStackParticle extends TextureSheetParticle { public class FluidStackParticle extends TextureSheetParticle {
@ -98,10 +97,10 @@ public class FluidStackParticle extends TextureSheetParticle {
if (!onGround && level.random.nextFloat() < 1 / 8f) if (!onGround && level.random.nextFloat() < 1 / 8f)
return; return;
Vec3 rgb = Color.vectorFromRGB(fluid.getFluid() Color color = new Color(fluid.getFluid()
.getAttributes() .getAttributes()
.getColor(fluid)); .getColor(fluid));
level.addParticle(ParticleTypes.ENTITY_EFFECT, x, y, z, rgb.x, rgb.y, rgb.z); level.addParticle(ParticleTypes.ENTITY_EFFECT, x, y, z, color.getRedAsFloat(), color.getGreenAsFloat(), color.getBlueAsFloat());
} }
protected boolean canEvaporate() { protected boolean canEvaporate() {

View file

@ -2,8 +2,8 @@ package com.simibubi.create.content.contraptions.fluids.tank;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.PoseStack;
import com.simibubi.create.foundation.fluid.FluidRenderer; import com.simibubi.create.foundation.fluid.FluidRenderer;
import com.simibubi.create.foundation.gui.widgets.InterpolatedChasingValue;
import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer;
import com.simibubi.create.foundation.utility.animation.InterpolatedChasingValue;
import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider;

View file

@ -11,9 +11,9 @@ import com.simibubi.create.content.contraptions.fluids.tank.FluidTankBlock.Shape
import com.simibubi.create.content.contraptions.goggles.IHaveGoggleInformation; import com.simibubi.create.content.contraptions.goggles.IHaveGoggleInformation;
import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.config.AllConfigs;
import com.simibubi.create.foundation.fluid.SmartFluidTank; import com.simibubi.create.foundation.fluid.SmartFluidTank;
import com.simibubi.create.foundation.gui.widgets.InterpolatedChasingValue;
import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.SmartTileEntity;
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
import com.simibubi.create.foundation.utility.animation.InterpolatedChasingValue;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction; import net.minecraft.core.Direction;

View file

@ -7,7 +7,7 @@ import com.mojang.blaze3d.vertex.PoseStack;
import com.simibubi.create.AllItems; import com.simibubi.create.AllItems;
import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.config.AllConfigs;
import com.simibubi.create.foundation.gui.AbstractSimiScreen; import com.simibubi.create.foundation.gui.AbstractSimiScreen;
import com.simibubi.create.foundation.gui.GuiGameElement; import com.simibubi.create.foundation.gui.element.GuiGameElement;
import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.foundation.utility.Lang;
import net.minecraft.ChatFormatting; import net.minecraft.ChatFormatting;

View file

@ -15,8 +15,8 @@ import com.simibubi.create.content.contraptions.components.structureMovement.pis
import com.simibubi.create.content.contraptions.components.structureMovement.piston.PistonExtensionPoleBlock; import com.simibubi.create.content.contraptions.components.structureMovement.piston.PistonExtensionPoleBlock;
import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.config.AllConfigs;
import com.simibubi.create.foundation.config.CClient; import com.simibubi.create.foundation.config.CClient;
import com.simibubi.create.foundation.gui.GuiGameElement;
import com.simibubi.create.foundation.gui.Theme; import com.simibubi.create.foundation.gui.Theme;
import com.simibubi.create.foundation.gui.element.GuiGameElement;
import com.simibubi.create.foundation.tileEntity.behaviour.ValueBox; import com.simibubi.create.foundation.tileEntity.behaviour.ValueBox;
import com.simibubi.create.foundation.utility.Color; import com.simibubi.create.foundation.utility.Color;
import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.Iterate;

View file

@ -310,7 +310,7 @@ public class InWorldProcessing {
world.addParticle(ParticleTypes.POOF, vec.x, vec.y + .25f, vec.z, 0, 1 / 16f, 0); world.addParticle(ParticleTypes.POOF, vec.x, vec.y + .25f, vec.z, 0, 1 / 16f, 0);
break; break;
case SPLASHING: case SPLASHING:
Vector3f color = new Vector3f(Color.vectorFromRGB(0x0055FF)); Vector3f color = new Color(0x0055FF).asVectorF();
world.addParticle(new DustParticleOptions(color, 1), vec.x + (world.random.nextFloat() - .5f) * .5f, world.addParticle(new DustParticleOptions(color, 1), vec.x + (world.random.nextFloat() - .5f) * .5f,
vec.y + .5f, vec.z + (world.random.nextFloat() - .5f) * .5f, 0, 1 / 8f, 0); vec.y + .5f, vec.z + (world.random.nextFloat() - .5f) * .5f, 0, 1 / 8f, 0);
world.addParticle(ParticleTypes.SPIT, vec.x + (world.random.nextFloat() - .5f) * .5f, vec.y + .5f, world.addParticle(ParticleTypes.SPIT, vec.x + (world.random.nextFloat() - .5f) * .5f, vec.y + .5f,

View file

@ -7,10 +7,10 @@ import com.simibubi.create.AllBlocks;
import com.simibubi.create.foundation.gui.AbstractSimiScreen; import com.simibubi.create.foundation.gui.AbstractSimiScreen;
import com.simibubi.create.foundation.gui.AllGuiTextures; import com.simibubi.create.foundation.gui.AllGuiTextures;
import com.simibubi.create.foundation.gui.AllIcons; import com.simibubi.create.foundation.gui.AllIcons;
import com.simibubi.create.foundation.gui.GuiGameElement; import com.simibubi.create.foundation.gui.element.GuiGameElement;
import com.simibubi.create.foundation.gui.widgets.IconButton; import com.simibubi.create.foundation.gui.widget.IconButton;
import com.simibubi.create.foundation.gui.widgets.ScrollInput; import com.simibubi.create.foundation.gui.widget.ScrollInput;
import com.simibubi.create.foundation.gui.widgets.SelectionScrollInput; import com.simibubi.create.foundation.gui.widget.SelectionScrollInput;
import com.simibubi.create.foundation.networking.AllPackets; import com.simibubi.create.foundation.networking.AllPackets;
import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.foundation.utility.Lang;
@ -44,7 +44,6 @@ public class SequencedGearshiftScreen extends AbstractSimiScreen {
setWindowSize(background.width, background.height); setWindowSize(background.width, background.height);
setWindowOffset(-20, 0); setWindowOffset(-20, 0);
super.init(); super.init();
widgets.clear();
int x = guiLeft; int x = guiLeft;
int y = guiTop; int y = guiTop;
@ -58,7 +57,10 @@ public class SequencedGearshiftScreen extends AbstractSimiScreen {
confirmButton = confirmButton =
new IconButton(x + background.width - 33, y + background.height - 24, AllIcons.I_CONFIRM); new IconButton(x + background.width - 33, y + background.height - 24, AllIcons.I_CONFIRM);
widgets.add(confirmButton); confirmButton.withCallback(() -> {
onClose();
});
addRenderableWidget(confirmButton);
} }
public void initInputsOfRow(int row, int backgroundX, int backgroundY) { public void initInputsOfRow(int row, int backgroundX, int backgroundY) {
@ -67,7 +69,7 @@ public class SequencedGearshiftScreen extends AbstractSimiScreen {
int rowHeight = 22; int rowHeight = 22;
Vector<ScrollInput> rowInputs = inputs.get(row); Vector<ScrollInput> rowInputs = inputs.get(row);
rowInputs.forEach(widgets::remove); removeWidgets(rowInputs);
rowInputs.clear(); rowInputs.clear();
int index = row; int index = row;
Instruction instruction = instructions.get(row); Instruction instruction = instructions.get(row);
@ -88,7 +90,7 @@ public class SequencedGearshiftScreen extends AbstractSimiScreen {
rowInputs.add(value); rowInputs.add(value);
rowInputs.add(direction); rowInputs.add(direction);
widgets.addAll(rowInputs); addRenderableWidgets(rowInputs);
updateParamsOfRow(row); updateParamsOfRow(row);
} }
@ -130,19 +132,19 @@ public class SequencedGearshiftScreen extends AbstractSimiScreen {
int x = guiLeft; int x = guiLeft;
int y = guiTop; int y = guiTop;
background.draw(ms, this, x, y); background.render(ms, x, y, this);
for (int row = 0; row < instructions.capacity(); row++) { for (int row = 0; row < instructions.capacity(); row++) {
AllGuiTextures toDraw = AllGuiTextures.SEQUENCER_EMPTY; AllGuiTextures toDraw = AllGuiTextures.SEQUENCER_EMPTY;
int yOffset = toDraw.height * row; int yOffset = toDraw.height * row;
if (row >= instructions.size()) { if (row >= instructions.size()) {
toDraw.draw(ms, x, y + 14 + yOffset); toDraw.render(ms, x, y + 14 + yOffset, this);
continue; continue;
} }
Instruction instruction = instructions.get(row); Instruction instruction = instructions.get(row);
SequencerInstructions def = instruction.instruction; SequencerInstructions def = instruction.instruction;
def.background.draw(ms, x, y + 14 + yOffset); def.background.render(ms, x, y + 14 + yOffset, this);
label(ms, 36, yOffset - 3, Lang.translate(def.translationKey)); label(ms, 36, yOffset - 3, Lang.translate(def.translationKey));
if (def.hasValueParameter) { if (def.hasValueParameter) {
@ -187,7 +189,7 @@ public class SequencedGearshiftScreen extends AbstractSimiScreen {
for (int i = instructions.size() - 1; i > index; i--) { for (int i = instructions.size() - 1; i > index; i--) {
instructions.remove(i); instructions.remove(i);
Vector<ScrollInput> rowInputs = inputs.get(i); Vector<ScrollInput> rowInputs = inputs.get(i);
rowInputs.forEach(widgets::remove); removeWidgets(rowInputs);
rowInputs.clear(); rowInputs.clear();
} }
} else { } else {
@ -198,14 +200,4 @@ public class SequencedGearshiftScreen extends AbstractSimiScreen {
} }
} }
@Override
public boolean mouseClicked(double x, double y, int button) {
if (confirmButton.isHovered()) {
minecraft.player.closeContainer();
return true;
}
return super.mouseClicked(x, y, button);
}
} }

View file

@ -132,7 +132,7 @@ public class GaugeBlock extends DirectionalAxisKineticBlock implements ITE<Gauge
if (!shouldRenderHeadOnFace(worldIn, pos, stateIn, face)) if (!shouldRenderHeadOnFace(worldIn, pos, stateIn, face))
continue; continue;
Vector3f rgb = new Vector3f(Color.vectorFromRGB(color)); Vector3f rgb = new Color(color).asVectorF();
Vec3 faceVec = Vec3.atLowerCornerOf(face.getNormal()); Vec3 faceVec = Vec3.atLowerCornerOf(face.getNormal());
Direction positiveFacing = Direction.get(AxisDirection.POSITIVE, face.getAxis()); Direction positiveFacing = Direction.get(AxisDirection.POSITIVE, face.getAxis());
Vec3 positiveFaceVec = Vec3.atLowerCornerOf(positiveFacing.getNormal()); Vec3 positiveFaceVec = Vec3.atLowerCornerOf(positiveFacing.getNormal());

View file

@ -6,7 +6,7 @@ import com.simibubi.create.AllBlockPartials;
import com.simibubi.create.AllBlocks; import com.simibubi.create.AllBlocks;
import com.simibubi.create.AllItems; import com.simibubi.create.AllItems;
import com.simibubi.create.CreateClient; import com.simibubi.create.CreateClient;
import com.simibubi.create.foundation.gui.GuiGameElement; import com.simibubi.create.foundation.gui.element.GuiGameElement;
import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.render.SuperByteBuffer;
import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.AngleHelper;
import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.AnimationTickHolder;

View file

@ -10,11 +10,11 @@ import com.simibubi.create.content.curiosities.symmetry.mirror.TriplePlaneMirror
import com.simibubi.create.foundation.gui.AbstractSimiScreen; import com.simibubi.create.foundation.gui.AbstractSimiScreen;
import com.simibubi.create.foundation.gui.AllGuiTextures; import com.simibubi.create.foundation.gui.AllGuiTextures;
import com.simibubi.create.foundation.gui.AllIcons; import com.simibubi.create.foundation.gui.AllIcons;
import com.simibubi.create.foundation.gui.GuiGameElement; import com.simibubi.create.foundation.gui.element.GuiGameElement;
import com.simibubi.create.foundation.gui.widgets.IconButton; import com.simibubi.create.foundation.gui.widget.IconButton;
import com.simibubi.create.foundation.gui.widgets.Label; import com.simibubi.create.foundation.gui.widget.Label;
import com.simibubi.create.foundation.gui.widgets.ScrollInput; import com.simibubi.create.foundation.gui.widget.ScrollInput;
import com.simibubi.create.foundation.gui.widgets.SelectionScrollInput; import com.simibubi.create.foundation.gui.widget.SelectionScrollInput;
import com.simibubi.create.foundation.networking.AllPackets; import com.simibubi.create.foundation.networking.AllPackets;
import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.foundation.utility.Lang;
@ -57,7 +57,6 @@ public class SymmetryWandScreen extends AbstractSimiScreen {
setWindowSize(background.width, background.height); setWindowSize(background.width, background.height);
setWindowOffset(-20, 0); setWindowOffset(-20, 0);
super.init(); super.init();
widgets.clear();
int x = guiLeft; int x = guiLeft;
int y = guiTop; int y = guiTop;
@ -93,17 +92,20 @@ public class SymmetryWandScreen extends AbstractSimiScreen {
initAlign(currentElement, x, y); initAlign(currentElement, x, y);
widgets.add(labelAlign); addRenderableWidget(labelAlign);
widgets.add(areaType); addRenderableWidget(areaType);
widgets.add(labelType); addRenderableWidget(labelType);
confirmButton = new IconButton(x + background.width - 33, y + background.height - 24, AllIcons.I_CONFIRM); confirmButton = new IconButton(x + background.width - 33, y + background.height - 24, AllIcons.I_CONFIRM);
widgets.add(confirmButton); confirmButton.withCallback(() -> {
onClose();
});
addRenderableWidget(confirmButton);
} }
private void initAlign(SymmetryMirror element, int x, int y) { private void initAlign(SymmetryMirror element, int x, int y) {
if (areaAlign != null) if (areaAlign != null)
widgets.remove(areaAlign); removeWidget(areaAlign);
areaAlign = new SelectionScrollInput(x + 45, y + 43, 109, 18).forOptions(element.getAlignToolTips()) areaAlign = new SelectionScrollInput(x + 45, y + 43, 109, 18).forOptions(element.getAlignToolTips())
.titled(orientation.plainCopy()) .titled(orientation.plainCopy())
@ -111,7 +113,7 @@ public class SymmetryWandScreen extends AbstractSimiScreen {
.setState(element.getOrientationIndex()) .setState(element.getOrientationIndex())
.calling(element::setOrientation); .calling(element::setOrientation);
widgets.add(areaAlign); addRenderableWidget(areaAlign);
} }
@Override @Override
@ -119,7 +121,7 @@ public class SymmetryWandScreen extends AbstractSimiScreen {
int x = guiLeft; int x = guiLeft;
int y = guiTop; int y = guiTop;
background.draw(ms, this, x, y); background.render(ms, x, y, this);
font.draw(ms, wand.getHoverName(), x + 11, y + 4, 0x6B3802); font.draw(ms, wand.getHoverName(), x + 11, y + 4, 0x6B3802);
renderBlock(ms, x, y); renderBlock(ms, x, y);
@ -149,14 +151,4 @@ public class SymmetryWandScreen extends AbstractSimiScreen {
AllPackets.channel.sendToServer(new ConfigureSymmetryWandPacket(hand, currentElement)); AllPackets.channel.sendToServer(new ConfigureSymmetryWandPacket(hand, currentElement));
} }
@Override
public boolean mouseClicked(double x, double y, int button) {
if (confirmButton.isHovered()) {
onClose();
return true;
}
return super.mouseClicked(x, y, button);
}
} }

View file

@ -12,7 +12,7 @@ import com.simibubi.create.AllKeys;
import com.simibubi.create.foundation.gui.AbstractSimiScreen; import com.simibubi.create.foundation.gui.AbstractSimiScreen;
import com.simibubi.create.foundation.gui.AllGuiTextures; import com.simibubi.create.foundation.gui.AllGuiTextures;
import com.simibubi.create.foundation.gui.AllIcons; import com.simibubi.create.foundation.gui.AllIcons;
import com.simibubi.create.foundation.gui.GuiGameElement; import com.simibubi.create.foundation.gui.element.GuiGameElement;
import com.simibubi.create.foundation.networking.AllPackets; import com.simibubi.create.foundation.networking.AllPackets;
import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.AngleHelper;
import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.AnimationTickHolder;
@ -86,19 +86,19 @@ public class RadialToolboxMenu extends AbstractSimiScreen {
hoveredSlot = UNEQUIP; hoveredSlot = UNEQUIP;
ms.pushPose(); ms.pushPose();
AllGuiTextures.TOOLBELT_INACTIVE_SLOT.draw(ms, this, -12, -12); AllGuiTextures.TOOLBELT_INACTIVE_SLOT.render(ms, -12, -12, this);
GuiGameElement.of(AllBlocks.TOOLBOXES.get(DyeColor.BROWN) GuiGameElement.of(AllBlocks.TOOLBOXES.get(DyeColor.BROWN)
.asStack()) .asStack())
.at(-9, -9) .at(-9, -9)
.render(ms); .render(ms);
ms.translate(0, -40 + (10 * (1 - fade) * (1 - fade)), 0); ms.translate(0, -40 + (10 * (1 - fade) * (1 - fade)), 0);
AllGuiTextures.TOOLBELT_SLOT.draw(ms, this, -12, -12); AllGuiTextures.TOOLBELT_SLOT.render(ms, -12, -12, this);
ms.translate(-0.5, 0.5, 0); ms.translate(-0.5, 0.5, 0);
AllIcons.I_DISABLE.draw(ms, this, -9, -9); AllIcons.I_DISABLE.render(ms, -9, -9, this);
ms.translate(0.5, -0.5, 0); ms.translate(0.5, -0.5, 0);
if (!scrollMode && hoveredSlot == UNEQUIP) { if (!scrollMode && hoveredSlot == UNEQUIP) {
AllGuiTextures.TOOLBELT_SLOT_HIGHLIGHT.draw(ms, this, -13, -13); AllGuiTextures.TOOLBELT_SLOT_HIGHLIGHT.render(ms, -13, -13, this);
tip = Lang.translate("toolbox.detach") tip = Lang.translate("toolbox.detach")
.withStyle(ChatFormatting.GOLD); .withStyle(ChatFormatting.GOLD);
} }
@ -111,12 +111,12 @@ public class RadialToolboxMenu extends AbstractSimiScreen {
ms.pushPose(); ms.pushPose();
ms.translate(80 + (-5 * (1 - fade) * (1 - fade)), 0, 0); ms.translate(80 + (-5 * (1 - fade) * (1 - fade)), 0, 0);
AllGuiTextures.TOOLBELT_SLOT.draw(ms, this, -12, -12); AllGuiTextures.TOOLBELT_SLOT.render(ms, -12, -12, this);
ms.translate(-0.5, 0.5, 0); ms.translate(-0.5, 0.5, 0);
AllIcons.I_TOOLBOX.draw(ms, this, -9, -9); AllIcons.I_TOOLBOX.render(ms, -9, -9, this);
ms.translate(0.5, -0.5, 0); ms.translate(0.5, -0.5, 0);
if (!scrollMode && hoveredSlot == DEPOSIT) { if (!scrollMode && hoveredSlot == DEPOSIT) {
AllGuiTextures.TOOLBELT_SLOT_HIGHLIGHT.draw(ms, this, -13, -13); AllGuiTextures.TOOLBELT_SLOT_HIGHLIGHT.render(ms, -13, -13, this);
tip = Lang.translate(state == State.SELECT_BOX ? "toolbox.depositAll" : "toolbox.depositBox") tip = Lang.translate(state == State.SELECT_BOX ? "toolbox.depositAll" : "toolbox.depositBox")
.withStyle(ChatFormatting.GOLD); .withStyle(ChatFormatting.GOLD);
} }
@ -138,23 +138,23 @@ public class RadialToolboxMenu extends AbstractSimiScreen {
boolean empty = inv.getStackInSlot(slot * ToolboxInventory.STACKS_PER_COMPARTMENT) boolean empty = inv.getStackInSlot(slot * ToolboxInventory.STACKS_PER_COMPARTMENT)
.isEmpty(); .isEmpty();
(empty ? AllGuiTextures.TOOLBELT_INACTIVE_SLOT : AllGuiTextures.TOOLBELT_SLOT).draw(ms, this, 0, (empty ? AllGuiTextures.TOOLBELT_INACTIVE_SLOT : AllGuiTextures.TOOLBELT_SLOT)
0); .render(ms, 0, 0, this);
GuiGameElement.of(stackInSlot) GuiGameElement.of(stackInSlot)
.at(3, 3) .at(3, 3)
.render(ms); .render(ms);
if (slot == (scrollMode ? scrollSlot : hoveredSlot) && !empty) { if (slot == (scrollMode ? scrollSlot : hoveredSlot) && !empty) {
AllGuiTextures.TOOLBELT_SLOT_HIGHLIGHT.draw(ms, this, -1, -1); AllGuiTextures.TOOLBELT_SLOT_HIGHLIGHT.render(ms, -1, -1, this);
tip = stackInSlot.getHoverName(); tip = stackInSlot.getHoverName();
} }
} else } else
AllGuiTextures.TOOLBELT_EMPTY_SLOT.draw(ms, this, 0, 0); AllGuiTextures.TOOLBELT_EMPTY_SLOT.render(ms, 0, 0, this);
} else if (state == State.SELECT_BOX) { } else if (state == State.SELECT_BOX) {
if (slot < toolboxes.size()) { if (slot < toolboxes.size()) {
AllGuiTextures.TOOLBELT_SLOT.draw(ms, this, 0, 0); AllGuiTextures.TOOLBELT_SLOT.render(ms, 0, 0, this);
ToolboxTileEntity toolboxTileEntity = toolboxes.get(slot); ToolboxTileEntity toolboxTileEntity = toolboxes.get(slot);
GuiGameElement.of(AllBlocks.TOOLBOXES.get(toolboxTileEntity.getColor()) GuiGameElement.of(AllBlocks.TOOLBOXES.get(toolboxTileEntity.getColor())
.asStack()) .asStack())
@ -162,11 +162,11 @@ public class RadialToolboxMenu extends AbstractSimiScreen {
.render(ms); .render(ms);
if (slot == (scrollMode ? scrollSlot : hoveredSlot)) { if (slot == (scrollMode ? scrollSlot : hoveredSlot)) {
AllGuiTextures.TOOLBELT_SLOT_HIGHLIGHT.draw(ms, this, -1, -1); AllGuiTextures.TOOLBELT_SLOT_HIGHLIGHT.render(ms, -1, -1, this);
tip = toolboxTileEntity.getDisplayName(); tip = toolboxTileEntity.getDisplayName();
} }
} else } else
AllGuiTextures.TOOLBELT_EMPTY_SLOT.draw(ms, this, 0, 0); AllGuiTextures.TOOLBELT_EMPTY_SLOT.render(ms, 0, 0, this);
} }
@ -175,10 +175,10 @@ public class RadialToolboxMenu extends AbstractSimiScreen {
if (renderCenterSlot) { if (renderCenterSlot) {
ms.pushPose(); ms.pushPose();
AllGuiTextures.TOOLBELT_SLOT.draw(ms, this, -12, -12); AllGuiTextures.TOOLBELT_SLOT.render(ms, -12, -12, this);
(scrollMode ? AllIcons.I_REFRESH : AllIcons.I_FLIP).draw(ms, this, -9, -9); (scrollMode ? AllIcons.I_REFRESH : AllIcons.I_FLIP).render(ms, -9, -9, this);
if (!scrollMode && UNEQUIP == hoveredSlot) { if (!scrollMode && UNEQUIP == hoveredSlot) {
AllGuiTextures.TOOLBELT_SLOT_HIGHLIGHT.draw(ms, this, -13, -13); AllGuiTextures.TOOLBELT_SLOT_HIGHLIGHT.render(ms, -13, -13, this);
tip = Lang.translate("toolbox.unequip", minecraft.player.getMainHandItem() tip = Lang.translate("toolbox.unequip", minecraft.player.getMainHandItem()
.getHoverName()) .getHoverName())
.withStyle(ChatFormatting.GOLD); .withStyle(ChatFormatting.GOLD);

View file

@ -3,7 +3,7 @@ package com.simibubi.create.content.curiosities.toolbox;
import static com.simibubi.create.content.curiosities.toolbox.ToolboxInventory.STACKS_PER_COMPARTMENT; import static com.simibubi.create.content.curiosities.toolbox.ToolboxInventory.STACKS_PER_COMPARTMENT;
import com.simibubi.create.AllContainerTypes; import com.simibubi.create.AllContainerTypes;
import com.simibubi.create.foundation.gui.ContainerBase; import com.simibubi.create.foundation.gui.container.ContainerBase;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.multiplayer.ClientLevel;
@ -21,10 +21,6 @@ import net.minecraftforge.items.SlotItemHandler;
public class ToolboxContainer extends ContainerBase<ToolboxTileEntity> { public class ToolboxContainer extends ContainerBase<ToolboxTileEntity> {
public static ToolboxContainer create(int id, Inventory inv, ToolboxTileEntity te) {
return new ToolboxContainer(AllContainerTypes.TOOLBOX.get(), id, inv, te);
}
public ToolboxContainer(MenuType<?> type, int id, Inventory inv, FriendlyByteBuf extraData) { public ToolboxContainer(MenuType<?> type, int id, Inventory inv, FriendlyByteBuf extraData) {
super(type, id, inv, extraData); super(type, id, inv, extraData);
} }
@ -34,6 +30,10 @@ public class ToolboxContainer extends ContainerBase<ToolboxTileEntity> {
te.startOpen(player); te.startOpen(player);
} }
public static ToolboxContainer create(int id, Inventory inv, ToolboxTileEntity te) {
return new ToolboxContainer(AllContainerTypes.TOOLBOX.get(), id, inv, te);
}
@Override @Override
protected ToolboxTileEntity createOnClient(FriendlyByteBuf extraData) { protected ToolboxTileEntity createOnClient(FriendlyByteBuf extraData) {
BlockPos readBlockPos = extraData.readBlockPos(); BlockPos readBlockPos = extraData.readBlockPos();
@ -121,7 +121,7 @@ public class ToolboxContainer extends ContainerBase<ToolboxTileEntity> {
protected void addSlots() { protected void addSlots() {
ToolboxInventory inventory = contentHolder.inventory; ToolboxInventory inventory = contentHolder.inventory;
int x = 59; int x = 79;
int y = 37; int y = 37;
int[] xOffsets = { x, x + 33, x + 66, x + 66 + 6, x + 66, x + 33, x, x - 6 }; int[] xOffsets = { x, x + 33, x + 66, x + 66 + 6, x + 66, x + 33, x, x - 6 };
@ -138,7 +138,7 @@ public class ToolboxContainer extends ContainerBase<ToolboxTileEntity> {
addSlot(new SlotItemHandler(inventory, baseIndex + i, -100, -100)); addSlot(new SlotItemHandler(inventory, baseIndex + i, -100, -100));
} }
addPlayerSlots(-12, 166); addPlayerSlots(8, 165);
} }
@Override @Override

View file

@ -177,7 +177,7 @@ public class ToolboxHandlerClient {
AllGuiTextures texture = ToolboxHandler.distance(player.position(), pos) < max * max AllGuiTextures texture = ToolboxHandler.distance(player.position(), pos) < max * max
? selected ? TOOLBELT_SELECTED_ON : TOOLBELT_HOTBAR_ON ? selected ? TOOLBELT_SELECTED_ON : TOOLBELT_HOTBAR_ON
: selected ? TOOLBELT_SELECTED_OFF : TOOLBELT_HOTBAR_OFF; : selected ? TOOLBELT_SELECTED_OFF : TOOLBELT_HOTBAR_OFF;
texture.draw(ms, x + 20 * slot - offset, y + offset); texture.render(ms, x + 20 * slot - offset, y + offset);
} }
ms.popPose(); ms.popPose();
} }

View file

@ -9,11 +9,11 @@ import com.mojang.blaze3d.systems.RenderSystem;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.PoseStack;
import com.simibubi.create.AllBlockPartials; import com.simibubi.create.AllBlockPartials;
import com.simibubi.create.AllBlocks; import com.simibubi.create.AllBlocks;
import com.simibubi.create.foundation.gui.AbstractSimiContainerScreen;
import com.simibubi.create.foundation.gui.AllGuiTextures; import com.simibubi.create.foundation.gui.AllGuiTextures;
import com.simibubi.create.foundation.gui.AllIcons; import com.simibubi.create.foundation.gui.AllIcons;
import com.simibubi.create.foundation.gui.GuiGameElement; import com.simibubi.create.foundation.gui.container.AbstractSimiContainerScreen;
import com.simibubi.create.foundation.gui.widgets.IconButton; import com.simibubi.create.foundation.gui.element.GuiGameElement;
import com.simibubi.create.foundation.gui.widget.IconButton;
import com.simibubi.create.foundation.networking.AllPackets; import com.simibubi.create.foundation.networking.AllPackets;
import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.Iterate;
import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.foundation.utility.Lang;
@ -27,8 +27,9 @@ import net.minecraft.world.item.ItemStack;
public class ToolboxScreen extends AbstractSimiContainerScreen<ToolboxContainer> { public class ToolboxScreen extends AbstractSimiContainerScreen<ToolboxContainer> {
AllGuiTextures BG = AllGuiTextures.TOOLBOX; protected static final AllGuiTextures BG = AllGuiTextures.TOOLBOX;
AllGuiTextures PLAYER = AllGuiTextures.PLAYER_INVENTORY; protected static final AllGuiTextures PLAYER = AllGuiTextures.PLAYER_INVENTORY;
protected Slot hoveredToolboxSlot; protected Slot hoveredToolboxSlot;
private IconButton confirmButton; private IconButton confirmButton;
private IconButton disposeButton; private IconButton disposeButton;
@ -43,18 +44,28 @@ public class ToolboxScreen extends AbstractSimiContainerScreen<ToolboxContainer>
@Override @Override
protected void init() { protected void init() {
setWindowSize(30 + BG.width, BG.height + PLAYER.height - 24);
setWindowOffset(-11, 0);
super.init(); super.init();
widgets.clear();
setWindowSize(BG.width, 256);
confirmButton = new IconButton(getGuiLeft() + BG.width - 23, getGuiTop() + BG.height - 24, AllIcons.I_CONFIRM);
disposeButton = new IconButton(getGuiLeft() + 91, getGuiTop() + 69, AllIcons.I_TOOLBOX);
disposeButton.setToolTip(Lang.translate("toolbox.depositBox"));
widgets.add(confirmButton);
widgets.add(disposeButton);
color = menu.contentHolder.getColor(); color = menu.contentHolder.getColor();
extraAreas = ImmutableList.of(new Rect2i(getGuiLeft() + -28, getGuiTop() + 141, 80, 100), confirmButton = new IconButton(leftPos + 30 + BG.width - 33, topPos + BG.height - 24, AllIcons.I_CONFIRM);
new Rect2i(getGuiLeft() + 162, getGuiTop() + 111, 100, 70)); confirmButton.withCallback(() -> {
minecraft.player.closeContainer();
});
addRenderableWidget(confirmButton);
disposeButton = new IconButton(leftPos + 30 + 81, topPos + 69, AllIcons.I_TOOLBOX);
disposeButton.withCallback(() -> {
AllPackets.channel.sendToServer(new ToolboxDisposeAllPacket(menu.contentHolder.getBlockPos()));
});
disposeButton.setToolTip(Lang.translate("toolbox.depositBox"));
addRenderableWidget(disposeButton);
extraAreas = ImmutableList.of(
new Rect2i(leftPos + 30 + BG.width, topPos + BG.height - 15 - 34 - 6, 72, 68)
);
} }
@Override @Override
@ -65,18 +76,18 @@ public class ToolboxScreen extends AbstractSimiContainerScreen<ToolboxContainer>
} }
@Override @Override
public void setBlitOffset(int p_230926_1_) { protected void renderBg(PoseStack ms, float partialTicks, int mouseX, int mouseY) {
super.setBlitOffset(p_230926_1_); int x = leftPos + imageWidth - BG.width;
} int y = topPos;
@Override BG.render(ms, x, y, this);
protected void renderWindow(PoseStack ms, int mouseX, int mouseY, float partialTicks) { font.draw(ms, title, x + 15, y + 4, 0x442000);
BG.draw(ms, this, leftPos + 10, topPos);
PLAYER.draw(ms, this, leftPos + (BG.width - PLAYER.width) / 2 - 26, topPos + imageHeight - PLAYER.height);
font.draw(ms, title, leftPos + 24, topPos + 4, 0x442000);
font.draw(ms, playerInventoryTitle, leftPos - 13, topPos + 154, 0x404040);
renderToolbox(ms, mouseX, mouseY, partialTicks); int invX = leftPos;
int invY = topPos + imageHeight - PLAYER.height;
renderPlayerInventory(ms, invX, invY);
renderToolbox(ms, x + BG.width + 50, y + BG.height + 12, partialTicks);
hoveredToolboxSlot = null; hoveredToolboxSlot = null;
for (int compartment = 0; compartment < 8; compartment++) { for (int compartment = 0; compartment < 8; compartment++) {
@ -91,7 +102,7 @@ public class ToolboxScreen extends AbstractSimiContainerScreen<ToolboxContainer>
if (!itemstack.isEmpty()) { if (!itemstack.isEmpty()) {
int count = menu.totalCountInCompartment(compartment); int count = menu.totalCountInCompartment(compartment);
String s = count + ""; String s = String.valueOf(count);
setBlitOffset(100); setBlitOffset(100);
itemRenderer.blitOffset = 100.0F; itemRenderer.blitOffset = 100.0F;
RenderSystem.enableDepthTest(); RenderSystem.enableDepthTest();
@ -113,9 +124,9 @@ public class ToolboxScreen extends AbstractSimiContainerScreen<ToolboxContainer>
} }
} }
private void renderToolbox(PoseStack ms, int mouseX, int mouseY, float partialTicks) { private void renderToolbox(PoseStack ms, int x, int y, float partialTicks) {
ms.pushPose(); ms.pushPose();
ms.translate(leftPos + 247, topPos + 180, 100); ms.translate(x, y, 100);
MatrixTransformStack.of(ms) MatrixTransformStack.of(ms)
.scale(50) .scale(50)
.rotateX(-22) .rotateX(-22)
@ -146,28 +157,10 @@ public class ToolboxScreen extends AbstractSimiContainerScreen<ToolboxContainer>
} }
@Override @Override
protected void renderWindowForeground(PoseStack matrixStack, int mouseX, int mouseY, float partialTicks) { protected void renderForeground(PoseStack matrixStack, int mouseX, int mouseY, float partialTicks) {
if (hoveredToolboxSlot != null) if (hoveredToolboxSlot != null)
hoveredSlot = hoveredToolboxSlot; hoveredSlot = hoveredToolboxSlot;
super.renderWindowForeground(matrixStack, mouseX, mouseY, partialTicks); super.renderForeground(matrixStack, mouseX, mouseY, partialTicks);
}
@Override
public boolean mouseClicked(double x, double y, int button) {
boolean mouseClicked = super.mouseClicked(x, y, button);
if (button == 0) {
if (confirmButton.isHovered()) {
minecraft.player.closeContainer();
return true;
}
if (disposeButton.isHovered()) {
AllPackets.channel.sendToServer(new ToolboxDisposeAllPacket(menu.contentHolder.getBlockPos()));
return true;
}
}
return mouseClicked;
} }
@Override @Override

View file

@ -4,7 +4,7 @@ import java.util.Optional;
import com.simibubi.create.AllContainerTypes; import com.simibubi.create.AllContainerTypes;
import com.simibubi.create.content.curiosities.tools.BlueprintEntity.BlueprintSection; import com.simibubi.create.content.curiosities.tools.BlueprintEntity.BlueprintSection;
import com.simibubi.create.foundation.gui.GhostItemContainer; import com.simibubi.create.foundation.gui.container.GhostItemContainer;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.FriendlyByteBuf;

View file

@ -16,9 +16,9 @@ import com.simibubi.create.content.logistics.item.filter.FilterItem;
import com.simibubi.create.content.schematics.ISpecialEntityItemRequirement; import com.simibubi.create.content.schematics.ISpecialEntityItemRequirement;
import com.simibubi.create.content.schematics.ItemRequirement; import com.simibubi.create.content.schematics.ItemRequirement;
import com.simibubi.create.content.schematics.ItemRequirement.ItemUseType; import com.simibubi.create.content.schematics.ItemRequirement.ItemUseType;
import com.simibubi.create.foundation.gui.IInteractionChecker;
import com.simibubi.create.foundation.networking.ISyncPersistentData; import com.simibubi.create.foundation.networking.ISyncPersistentData;
import com.simibubi.create.foundation.utility.Couple; import com.simibubi.create.foundation.utility.Couple;
import com.simibubi.create.foundation.utility.IInteractionChecker;
import com.simibubi.create.foundation.utility.VecHelper; import com.simibubi.create.foundation.utility.VecHelper;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
@ -456,7 +456,7 @@ public class BlueprintEntity extends HangingEntity
static class BlueprintCraftingInventory extends CraftingContainer { static class BlueprintCraftingInventory extends CraftingContainer {
private static AbstractContainerMenu dummyContainer = new AbstractContainerMenu(null, -1) { private static final AbstractContainerMenu dummyContainer = new AbstractContainerMenu(null, -1) {
public boolean stillValid(Player playerIn) { public boolean stillValid(Player playerIn) {
return false; return false;
} }

View file

@ -16,7 +16,7 @@ import com.simibubi.create.content.logistics.item.filter.AttributeFilterContaine
import com.simibubi.create.content.logistics.item.filter.FilterItem; import com.simibubi.create.content.logistics.item.filter.FilterItem;
import com.simibubi.create.content.logistics.item.filter.ItemAttribute; import com.simibubi.create.content.logistics.item.filter.ItemAttribute;
import com.simibubi.create.foundation.gui.AllGuiTextures; import com.simibubi.create.foundation.gui.AllGuiTextures;
import com.simibubi.create.foundation.gui.GuiGameElement; import com.simibubi.create.foundation.gui.element.GuiGameElement;
import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.AnimationTickHolder;
import com.simibubi.create.foundation.utility.Pair; import com.simibubi.create.foundation.utility.Pair;
@ -219,7 +219,7 @@ public class BlueprintOverlayRenderer {
for (Pair<ItemStack, Boolean> pair : ingredients) { for (Pair<ItemStack, Boolean> pair : ingredients) {
RenderSystem.enableBlend(); RenderSystem.enableBlend();
(pair.getSecond() ? AllGuiTextures.HOTSLOT_ACTIVE : AllGuiTextures.HOTSLOT).draw(ms, x, y); (pair.getSecond() ? AllGuiTextures.HOTSLOT_ACTIVE : AllGuiTextures.HOTSLOT).render(ms, x, y);
ItemStack itemStack = pair.getFirst(); ItemStack itemStack = pair.getFirst();
String count = pair.getSecond() ? null : ChatFormatting.GOLD.toString() + itemStack.getCount(); String count = pair.getSecond() ? null : ChatFormatting.GOLD.toString() + itemStack.getCount();
drawItemStack(ms, mc, x, y, itemStack, count); drawItemStack(ms, mc, x, y, itemStack, count);
@ -228,16 +228,16 @@ public class BlueprintOverlayRenderer {
x += 5; x += 5;
RenderSystem.enableBlend(); RenderSystem.enableBlend();
AllGuiTextures.HOTSLOT_ARROW.draw(ms, x, y + 4); AllGuiTextures.HOTSLOT_ARROW.render(ms, x, y + 4);
x += 25; x += 25;
if (result.isEmpty()) { if (result.isEmpty()) {
AllGuiTextures.HOTSLOT.draw(ms, x, y); AllGuiTextures.HOTSLOT.render(ms, x, y);
GuiGameElement.of(Items.BARRIER) GuiGameElement.of(Items.BARRIER)
.at(x + 3, y + 3) .at(x + 3, y + 3)
.render(ms); .render(ms);
} else { } else {
(resultCraftable ? AllGuiTextures.HOTSLOT_SUPER_ACTIVE : AllGuiTextures.HOTSLOT).draw(ms, (resultCraftable ? AllGuiTextures.HOTSLOT_SUPER_ACTIVE : AllGuiTextures.HOTSLOT).render(ms,
resultCraftable ? x - 1 : x, resultCraftable ? y - 1 : y); resultCraftable ? x - 1 : x, resultCraftable ? y - 1 : y);
drawItemStack(ms, mc, x, y, result, null); drawItemStack(ms, mc, x, y, result, null);
} }

View file

@ -11,11 +11,11 @@ import com.mojang.blaze3d.vertex.PoseStack;
import com.simibubi.create.AllBlockPartials; import com.simibubi.create.AllBlockPartials;
import com.simibubi.create.content.logistics.item.filter.FilterScreenPacket; import com.simibubi.create.content.logistics.item.filter.FilterScreenPacket;
import com.simibubi.create.content.logistics.item.filter.FilterScreenPacket.Option; import com.simibubi.create.content.logistics.item.filter.FilterScreenPacket.Option;
import com.simibubi.create.foundation.gui.AbstractSimiContainerScreen;
import com.simibubi.create.foundation.gui.AllGuiTextures; import com.simibubi.create.foundation.gui.AllGuiTextures;
import com.simibubi.create.foundation.gui.AllIcons; import com.simibubi.create.foundation.gui.AllIcons;
import com.simibubi.create.foundation.gui.GuiGameElement; import com.simibubi.create.foundation.gui.container.AbstractSimiContainerScreen;
import com.simibubi.create.foundation.gui.widgets.IconButton; import com.simibubi.create.foundation.gui.element.GuiGameElement;
import com.simibubi.create.foundation.gui.widget.IconButton;
import com.simibubi.create.foundation.networking.AllPackets; import com.simibubi.create.foundation.networking.AllPackets;
import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.foundation.utility.Lang;
@ -41,18 +41,25 @@ public class BlueprintScreen extends AbstractSimiContainerScreen<BlueprintContai
@Override @Override
protected void init() { protected void init() {
setWindowSize(background.width, background.height + 4 + PLAYER_INVENTORY.height); setWindowSize(background.width, background.height + 4 + PLAYER_INVENTORY.height);
setWindowOffset(2 + (width % 2 == 0 ? 0 : -1), 0); setWindowOffset(1, 0);
super.init(); super.init();
widgets.clear();
int x = leftPos; int x = leftPos;
int y = topPos; int y = topPos;
resetButton = new IconButton(x + background.width - 62, y + background.height - 24, AllIcons.I_TRASH); resetButton = new IconButton(x + background.width - 62, y + background.height - 24, AllIcons.I_TRASH);
resetButton.withCallback(() -> {
menu.clearContents();
contentsCleared();
menu.sendClearPacket();
});
confirmButton = new IconButton(x + background.width - 33, y + background.height - 24, AllIcons.I_CONFIRM); confirmButton = new IconButton(x + background.width - 33, y + background.height - 24, AllIcons.I_CONFIRM);
confirmButton.withCallback(() -> {
minecraft.player.closeContainer();
});
widgets.add(resetButton); addRenderableWidget(resetButton);
widgets.add(confirmButton); addRenderableWidget(confirmButton);
extraAreas = ImmutableList.of( extraAreas = ImmutableList.of(
new Rect2i(x + background.width, y + background.height - 36, 56, 44) new Rect2i(x + background.width, y + background.height - 36, 56, 44)
@ -60,7 +67,7 @@ public class BlueprintScreen extends AbstractSimiContainerScreen<BlueprintContai
} }
@Override @Override
protected void renderWindow(PoseStack ms, int mouseX, int mouseY, float partialTicks) { protected void renderBg(PoseStack ms, float partialTicks, int mouseX, int mouseY) {
int invX = getLeftOfCentered(PLAYER_INVENTORY.width); int invX = getLeftOfCentered(PLAYER_INVENTORY.width);
int invY = topPos + background.height + 4; int invY = topPos + background.height + 4;
renderPlayerInventory(ms, invX, invY); renderPlayerInventory(ms, invX, invY);
@ -68,7 +75,7 @@ public class BlueprintScreen extends AbstractSimiContainerScreen<BlueprintContai
int x = leftPos; int x = leftPos;
int y = topPos; int y = topPos;
background.draw(ms, this, x, y); background.render(ms, x, y, this);
font.draw(ms, title, x + 15, y + 4, 0xFFFFFF); font.draw(ms, title, x + 15, y + 4, 0xFFFFFF);
GuiGameElement.of(AllBlockPartials.CRAFTING_BLUEPRINT_1x1) GuiGameElement.of(AllBlockPartials.CRAFTING_BLUEPRINT_1x1)
@ -131,10 +138,12 @@ public class BlueprintScreen extends AbstractSimiContainerScreen<BlueprintContai
@Override @Override
protected void containerTick() { protected void containerTick() {
// handleTooltips();
if (!menu.contentHolder.isEntityAlive()) if (!menu.contentHolder.isEntityAlive())
minecraft.player.closeContainer(); menu.player.closeContainer();
super.containerTick();
// handleTooltips();
} }
// protected void handleTooltips() { // protected void handleTooltips() {
@ -157,26 +166,6 @@ public class BlueprintScreen extends AbstractSimiContainerScreen<BlueprintContai
// } // }
// } // }
@Override
public boolean mouseClicked(double x, double y, int button) {
boolean mouseClicked = super.mouseClicked(x, y, button);
if (button == 0) {
if (confirmButton.isHovered()) {
minecraft.player.closeContainer();
return true;
}
if (resetButton.isHovered()) {
menu.clearContents();
contentsCleared();
menu.sendClearPacket();
return true;
}
}
return mouseClicked;
}
protected void contentsCleared() {} protected void contentsCleared() {}
protected void sendOptionUpdate(Option option) { protected void sendOptionUpdate(Option option) {

View file

@ -7,8 +7,8 @@ import com.mojang.math.Vector3f;
import com.simibubi.create.foundation.gui.AbstractSimiScreen; import com.simibubi.create.foundation.gui.AbstractSimiScreen;
import com.simibubi.create.foundation.gui.AllGuiTextures; import com.simibubi.create.foundation.gui.AllGuiTextures;
import com.simibubi.create.foundation.gui.AllIcons; import com.simibubi.create.foundation.gui.AllIcons;
import com.simibubi.create.foundation.gui.GuiGameElement; import com.simibubi.create.foundation.gui.element.GuiGameElement;
import com.simibubi.create.foundation.gui.widgets.IconButton; import com.simibubi.create.foundation.gui.widget.IconButton;
import com.simibubi.create.foundation.networking.AllPackets; import com.simibubi.create.foundation.networking.AllPackets;
import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.foundation.utility.Lang;
import com.simibubi.create.foundation.utility.NBTHelper; import com.simibubi.create.foundation.utility.NBTHelper;
@ -57,7 +57,6 @@ public abstract class ZapperScreen extends AbstractSimiScreen {
setWindowSize(background.width, background.height); setWindowSize(background.width, background.height);
setWindowOffset(-10, 0); setWindowOffset(-10, 0);
super.init(); super.init();
widgets.clear();
animationProgress = 0; animationProgress = 0;
@ -66,23 +65,30 @@ public abstract class ZapperScreen extends AbstractSimiScreen {
confirmButton = confirmButton =
new IconButton(x + background.width - 33, y + background.height - 24, AllIcons.I_CONFIRM); new IconButton(x + background.width - 33, y + background.height - 24, AllIcons.I_CONFIRM);
widgets.add(confirmButton); confirmButton.withCallback(() -> {
onClose();
});
addRenderableWidget(confirmButton);
patternButtons.clear(); patternButtons.clear();
for (int row = 0; row <= 1; row++) { for (int row = 0; row <= 1; row++) {
for (int col = 0; col <= 2; col++) { for (int col = 0; col <= 2; col++) {
int id = patternButtons.size(); int id = patternButtons.size();
PlacementPatterns pattern = PlacementPatterns.values()[id]; PlacementPatterns pattern = PlacementPatterns.values()[id];
patternButtons IconButton patternButton = new IconButton(x + background.width - 76 + col * 18, y + 21 + row * 18, pattern.icon);
.add(new IconButton(x + background.width - 76 + col * 18, y + 21 + row * 18, pattern.icon)); patternButton.withCallback(() -> {
patternButtons.get(id) patternButtons.forEach(b -> b.active = true);
.setToolTip(Lang.translate("gui.terrainzapper.pattern." + pattern.translationKey)); patternButton.active = false;
currentPattern = pattern;
});
patternButton.setToolTip(Lang.translate("gui.terrainzapper.pattern." + pattern.translationKey));
patternButtons.add(patternButton);
} }
} }
patternButtons.get(currentPattern.ordinal()).active = false; patternButtons.get(currentPattern.ordinal()).active = false;
widgets.addAll(patternButtons); addRenderableWidgets(patternButtons);
} }
@Override @Override
@ -90,7 +96,7 @@ public abstract class ZapperScreen extends AbstractSimiScreen {
int x = guiLeft; int x = guiLeft;
int y = guiTop; int y = guiTop;
background.draw(ms, this, x, y); background.render(ms, x, y, this);
drawOnBackground(ms, x, y); drawOnBackground(ms, x, y);
renderBlock(ms, x, y); renderBlock(ms, x, y);
@ -114,25 +120,6 @@ public abstract class ZapperScreen extends AbstractSimiScreen {
AllPackets.channel.sendToServer(packet); AllPackets.channel.sendToServer(packet);
} }
@Override
public boolean mouseClicked(double x, double y, int button) {
for (IconButton patternButton : patternButtons) {
if (patternButton.isHovered()) {
patternButtons.forEach(b -> b.active = true);
patternButton.active = false;
patternButton.playDownSound(minecraft.getSoundManager());
currentPattern = PlacementPatterns.values()[patternButtons.indexOf(patternButton)];
}
}
if (confirmButton.isHovered()) {
onClose();
return true;
}
return super.mouseClicked(x, y, button);
}
protected void renderZapper(PoseStack ms, int x, int y) { protected void renderZapper(PoseStack ms, int x, int y) {
GuiGameElement.of(zapper) GuiGameElement.of(zapper)
.scale(4) .scale(4)

View file

@ -8,12 +8,12 @@ import com.simibubi.create.content.curiosities.zapper.ConfigureZapperPacket;
import com.simibubi.create.content.curiosities.zapper.ZapperScreen; import com.simibubi.create.content.curiosities.zapper.ZapperScreen;
import com.simibubi.create.foundation.gui.AllGuiTextures; import com.simibubi.create.foundation.gui.AllGuiTextures;
import com.simibubi.create.foundation.gui.AllIcons; import com.simibubi.create.foundation.gui.AllIcons;
import com.simibubi.create.foundation.gui.widgets.IconButton; import com.simibubi.create.foundation.gui.widget.IconButton;
import com.simibubi.create.foundation.gui.widgets.Indicator; import com.simibubi.create.foundation.gui.widget.Indicator;
import com.simibubi.create.foundation.gui.widgets.Indicator.State; import com.simibubi.create.foundation.gui.widget.Indicator.State;
import com.simibubi.create.foundation.gui.widgets.Label; import com.simibubi.create.foundation.gui.widget.Label;
import com.simibubi.create.foundation.gui.widgets.ScrollInput; import com.simibubi.create.foundation.gui.widget.ScrollInput;
import com.simibubi.create.foundation.gui.widgets.SelectionScrollInput; import com.simibubi.create.foundation.gui.widget.SelectionScrollInput;
import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.foundation.utility.Lang;
import com.simibubi.create.foundation.utility.NBTHelper; import com.simibubi.create.foundation.utility.NBTHelper;
@ -93,8 +93,8 @@ public class WorldshaperScreen extends ZapperScreen {
brushInput.setState(currentBrush.ordinal()); brushInput.setState(currentBrush.ordinal());
widgets.add(brushLabel); addRenderableWidget(brushLabel);
widgets.add(brushInput); addRenderableWidget(brushInput);
initBrushParams(x, y); initBrushParams(x, y);
} }
@ -104,8 +104,8 @@ public class WorldshaperScreen extends ZapperScreen {
// Brush Params // Brush Params
widgets.removeAll(brushParamLabels); removeWidgets(brushParamLabels);
widgets.removeAll(brushParams); removeWidgets(brushParams);
brushParamLabels.clear(); brushParamLabels.clear();
brushParams.clear(); brushParams.clear();
@ -136,16 +136,16 @@ public class WorldshaperScreen extends ZapperScreen {
brushParams.add(input); brushParams.add(input);
} }
widgets.addAll(brushParamLabels); addRenderableWidgets(brushParamLabels);
widgets.addAll(brushParams); addRenderableWidgets(brushParams);
// Connectivity Options // Connectivity Options
if (followDiagonals != null) { if (followDiagonals != null) {
widgets.remove(followDiagonals); removeWidget(followDiagonals);
widgets.remove(followDiagonalsIndicator); removeWidget(followDiagonalsIndicator);
widgets.remove(acrossMaterials); removeWidget(acrossMaterials);
widgets.remove(acrossMaterialsIndicator); removeWidget(acrossMaterialsIndicator);
followDiagonals = null; followDiagonals = null;
followDiagonalsIndicator = null; followDiagonalsIndicator = null;
acrossMaterials = null; acrossMaterials = null;
@ -161,12 +161,20 @@ public class WorldshaperScreen extends ZapperScreen {
acrossMaterialsIndicator = new Indicator(x1, y1 - 6, TextComponent.EMPTY); acrossMaterialsIndicator = new Indicator(x1, y1 - 6, TextComponent.EMPTY);
acrossMaterials = new IconButton(x1, y1, AllIcons.I_FOLLOW_MATERIAL); acrossMaterials = new IconButton(x1, y1, AllIcons.I_FOLLOW_MATERIAL);
followDiagonals.withCallback(() -> {
followDiagonalsIndicator.state = followDiagonalsIndicator.state == State.OFF ? State.ON : State.OFF;
currentFollowDiagonals = !currentFollowDiagonals;
});
followDiagonals.setToolTip(Lang.translate("gui.terrainzapper.searchDiagonal")); followDiagonals.setToolTip(Lang.translate("gui.terrainzapper.searchDiagonal"));
acrossMaterials.withCallback(() -> {
acrossMaterialsIndicator.state = acrossMaterialsIndicator.state == State.OFF ? State.ON : State.OFF;
currentAcrossMaterials = !currentAcrossMaterials;
});
acrossMaterials.setToolTip(Lang.translate("gui.terrainzapper.searchFuzzy")); acrossMaterials.setToolTip(Lang.translate("gui.terrainzapper.searchFuzzy"));
widgets.add(followDiagonals); addRenderableWidget(followDiagonals);
widgets.add(followDiagonalsIndicator); addRenderableWidget(followDiagonalsIndicator);
widgets.add(acrossMaterials); addRenderableWidget(acrossMaterials);
widgets.add(acrossMaterialsIndicator); addRenderableWidget(acrossMaterialsIndicator);
if (currentFollowDiagonals) if (currentFollowDiagonals)
followDiagonalsIndicator.state = State.ON; followDiagonalsIndicator.state = State.ON;
if (currentAcrossMaterials) if (currentAcrossMaterials)
@ -176,15 +184,20 @@ public class WorldshaperScreen extends ZapperScreen {
// Tools // Tools
if (toolButtons != null) if (toolButtons != null)
widgets.removeAll(toolButtons); removeWidgets(toolButtons);
TerrainTools[] toolValues = currentBrush.getSupportedTools(); TerrainTools[] toolValues = currentBrush.getSupportedTools();
toolButtons = new Vector<>(toolValues.length); toolButtons = new Vector<>(toolValues.length);
for (int id = 0; id < toolValues.length; id++) { for (int id = 0; id < toolValues.length; id++) {
TerrainTools tool = toolValues[id]; TerrainTools tool = toolValues[id];
toolButtons.add(new IconButton(x + 7 + id * 18, y + 79, tool.icon)); IconButton toolButton = new IconButton(x + 7 + id * 18, y + 79, tool.icon);
toolButtons.get(id) toolButton.withCallback(() -> {
.setToolTip(Lang.translate("gui.terrainzapper.tool." + tool.translationKey)); toolButtons.forEach(b -> b.active = true);
toolButton.active = false;
currentTool = tool;
});
toolButton.setToolTip(Lang.translate("gui.terrainzapper.tool." + tool.translationKey));
toolButtons.add(toolButton);
} }
int toolIndex = -1; int toolIndex = -1;
@ -197,72 +210,41 @@ public class WorldshaperScreen extends ZapperScreen {
} }
toolButtons.get(toolIndex).active = false; toolButtons.get(toolIndex).active = false;
widgets.addAll(toolButtons); addRenderableWidgets(toolButtons);
// Placement Options // Placement Options
if (placementButtons != null) if (placementButtons != null)
widgets.removeAll(placementButtons); removeWidgets(placementButtons);
if (currentBrush.hasPlacementOptions()) { if (currentBrush.hasPlacementOptions()) {
PlacementOptions[] placementValues = PlacementOptions.values(); PlacementOptions[] placementValues = PlacementOptions.values();
placementButtons = new Vector<>(placementValues.length); placementButtons = new Vector<>(placementValues.length);
for (int id = 0; id < placementValues.length; id++) { for (int id = 0; id < placementValues.length; id++) {
PlacementOptions option = placementValues[id]; PlacementOptions option = placementValues[id];
placementButtons.add(new IconButton(x + 136 + id * 18, y + 79, option.icon)); IconButton placementButton = new IconButton(x + 136 + id * 18, y + 79, option.icon);
placementButtons.get(id) placementButton.withCallback(() -> {
.setToolTip(Lang.translate("gui.terrainzapper.placement." + option.translationKey)); placementButtons.forEach(b -> b.active = true);
placementButton.active = false;
currentPlacement = option;
});
placementButton.setToolTip(Lang.translate("gui.terrainzapper.placement." + option.translationKey));
placementButtons.add(placementButton);
} }
placementButtons.get(currentPlacement.ordinal()).active = false; placementButtons.get(currentPlacement.ordinal()).active = false;
widgets.addAll(placementButtons); addRenderableWidgets(placementButtons);
} }
} }
@Override
public boolean mouseClicked(double x, double y, int button) {
TerrainTools[] supportedTools = currentBrush.get()
.getSupportedTools();
for (IconButton toolButton : toolButtons) {
if (toolButton.isHovered()) {
toolButtons.forEach(b -> b.active = true);
toolButton.active = false;
toolButton.playDownSound(minecraft.getSoundManager());
currentTool = supportedTools[toolButtons.indexOf(toolButton)];
}
}
if (placementButtons != null) {
for (IconButton placementButton : placementButtons) {
if (placementButton.isHovered()) {
placementButtons.forEach(b -> b.active = true);
placementButton.active = false;
placementButton.playDownSound(minecraft.getSoundManager());
currentPlacement = PlacementOptions.values()[placementButtons.indexOf(placementButton)];
}
}
}
if (followDiagonals != null && followDiagonals.isHovered()) {
followDiagonalsIndicator.state = followDiagonalsIndicator.state == State.OFF ? State.ON : State.OFF;
currentFollowDiagonals = !currentFollowDiagonals;
}
if (acrossMaterials != null && acrossMaterials.isHovered()) {
acrossMaterialsIndicator.state = acrossMaterialsIndicator.state == State.OFF ? State.ON : State.OFF;
currentAcrossMaterials = !currentAcrossMaterials;
}
return super.mouseClicked(x, y, button);
}
@Override @Override
protected void drawOnBackground(PoseStack matrixStack, int x, int y) { protected void drawOnBackground(PoseStack matrixStack, int x, int y) {
super.drawOnBackground(matrixStack, x, y); super.drawOnBackground(matrixStack, x, y);
Brush currentBrush = this.currentBrush.get(); Brush currentBrush = this.currentBrush.get();
for (int index = 2; index >= currentBrush.amtParams; index--) for (int index = 2; index >= currentBrush.amtParams; index--)
AllGuiTextures.TERRAINZAPPER_INACTIVE_PARAM.draw(matrixStack, x + 56 + 20 * index, y + 40); AllGuiTextures.TERRAINZAPPER_INACTIVE_PARAM.render(matrixStack, x + 56 + 20 * index, y + 40, this);
font.draw(matrixStack, toolSection, x + 7, y + 69, fontColor); font.draw(matrixStack, toolSection, x + 7, y + 69, fontColor);
if (currentBrush.hasPlacementOptions()) if (currentBrush.hasPlacementOptions())

View file

@ -12,9 +12,9 @@ import com.jozufozu.flywheel.backend.instancing.tile.TileEntityInstance;
import com.jozufozu.flywheel.backend.material.MaterialManager; import com.jozufozu.flywheel.backend.material.MaterialManager;
import com.simibubi.create.AllBlockPartials; import com.simibubi.create.AllBlockPartials;
import com.simibubi.create.content.logistics.block.FlapData; import com.simibubi.create.content.logistics.block.FlapData;
import com.simibubi.create.foundation.gui.widgets.InterpolatedValue;
import com.simibubi.create.foundation.render.AllMaterialSpecs; import com.simibubi.create.foundation.render.AllMaterialSpecs;
import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.AnimationTickHolder;
import com.simibubi.create.foundation.utility.animation.InterpolatedValue;
import net.minecraft.core.Direction; import net.minecraft.core.Direction;
import net.minecraft.world.level.LightLayer; import net.minecraft.world.level.LightLayer;

View file

@ -15,11 +15,11 @@ import com.simibubi.create.AllBlocks;
import com.simibubi.create.content.logistics.block.belts.tunnel.BeltTunnelBlock.Shape; import com.simibubi.create.content.logistics.block.belts.tunnel.BeltTunnelBlock.Shape;
import com.simibubi.create.content.logistics.block.funnel.BeltFunnelBlock; import com.simibubi.create.content.logistics.block.funnel.BeltFunnelBlock;
import com.simibubi.create.content.logistics.packet.TunnelFlapPacket; import com.simibubi.create.content.logistics.packet.TunnelFlapPacket;
import com.simibubi.create.foundation.gui.widgets.InterpolatedChasingValue;
import com.simibubi.create.foundation.networking.AllPackets; import com.simibubi.create.foundation.networking.AllPackets;
import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.SmartTileEntity;
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.Iterate;
import com.simibubi.create.foundation.utility.animation.InterpolatedChasingValue;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction; import net.minecraft.core.Direction;

View file

@ -17,7 +17,6 @@ import com.simibubi.create.content.contraptions.particle.AirParticleData;
import com.simibubi.create.content.logistics.block.funnel.FunnelBlock; import com.simibubi.create.content.logistics.block.funnel.FunnelBlock;
import com.simibubi.create.foundation.advancement.AllTriggers; import com.simibubi.create.foundation.advancement.AllTriggers;
import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.config.AllConfigs;
import com.simibubi.create.foundation.gui.widgets.InterpolatedValue;
import com.simibubi.create.foundation.item.ItemHelper; import com.simibubi.create.foundation.item.ItemHelper;
import com.simibubi.create.foundation.item.ItemHelper.ExtractionCountMode; import com.simibubi.create.foundation.item.ItemHelper.ExtractionCountMode;
import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.SmartTileEntity;
@ -29,6 +28,7 @@ import com.simibubi.create.foundation.utility.BlockHelper;
import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.Iterate;
import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.foundation.utility.Lang;
import com.simibubi.create.foundation.utility.VecHelper; import com.simibubi.create.foundation.utility.VecHelper;
import com.simibubi.create.foundation.utility.animation.InterpolatedValue;
import net.minecraft.ChatFormatting; import net.minecraft.ChatFormatting;
import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.MethodsReturnNonnullByDefault;

View file

@ -208,7 +208,7 @@ public class EjectorTargetHandler {
double tickOffset = totalFlyingTicks / segments; double tickOffset = totalFlyingTicks / segments;
boolean valid = xDiff == validX && zDiff == validZ; boolean valid = xDiff == validX && zDiff == validZ;
int intColor = valid ? 0x9ede73 : 0xff7171; int intColor = valid ? 0x9ede73 : 0xff7171;
Vector3f color = new Vector3f(Color.vectorFromRGB(intColor)); Vector3f color = new Color(intColor).asVectorF();
DustParticleOptions data = new DustParticleOptions(color, 1); DustParticleOptions data = new DustParticleOptions(color, 1);
ClientLevel world = mc.level; ClientLevel world = mc.level;

View file

@ -14,7 +14,6 @@ import com.simibubi.create.content.contraptions.relays.belt.transport.Transporte
import com.simibubi.create.content.logistics.block.funnel.BeltFunnelBlock.Shape; import com.simibubi.create.content.logistics.block.funnel.BeltFunnelBlock.Shape;
import com.simibubi.create.content.logistics.packet.FunnelFlapPacket; import com.simibubi.create.content.logistics.packet.FunnelFlapPacket;
import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.config.AllConfigs;
import com.simibubi.create.foundation.gui.widgets.InterpolatedChasingValue;
import com.simibubi.create.foundation.networking.AllPackets; import com.simibubi.create.foundation.networking.AllPackets;
import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.SmartTileEntity;
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
@ -23,6 +22,7 @@ import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBe
import com.simibubi.create.foundation.tileEntity.behaviour.inventory.InvManipulationBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.inventory.InvManipulationBehaviour;
import com.simibubi.create.foundation.utility.BlockFace; import com.simibubi.create.foundation.utility.BlockFace;
import com.simibubi.create.foundation.utility.VecHelper; import com.simibubi.create.foundation.utility.VecHelper;
import com.simibubi.create.foundation.utility.animation.InterpolatedChasingValue;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction; import net.minecraft.core.Direction;

View file

@ -1,72 +1,72 @@
package com.simibubi.create.content.logistics.block.inventories; package com.simibubi.create.content.logistics.block.inventories;
import com.simibubi.create.AllContainerTypes; import com.simibubi.create.AllContainerTypes;
import com.simibubi.create.foundation.gui.container.ContainerBase;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.multiplayer.ClientLevel;
import net.minecraft.core.BlockPos;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Inventory;
import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.player.Player;
import net.minecraft.world.inventory.AbstractContainerMenu;
import net.minecraft.world.inventory.MenuType; import net.minecraft.world.inventory.MenuType;
import net.minecraft.world.inventory.Slot; import net.minecraft.world.inventory.Slot;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraftforge.items.SlotItemHandler; import net.minecraftforge.items.SlotItemHandler;
public class AdjustableCrateContainer extends AbstractContainerMenu { public class AdjustableCrateContainer extends ContainerBase<AdjustableCrateTileEntity> {
public AdjustableCrateTileEntity te; protected boolean doubleCrate;
public Inventory playerInventory;
public boolean doubleCrate;
public AdjustableCrateContainer(MenuType<?> type, int id, Inventory inv, FriendlyByteBuf extraData) { public AdjustableCrateContainer(MenuType<?> type, int id, Inventory inv, FriendlyByteBuf extraData) {
super(type, id); super(type, id, inv, extraData);
ClientLevel world = Minecraft.getInstance().level;
BlockEntity tileEntity = world.getBlockEntity(extraData.readBlockPos());
this.playerInventory = inv;
if (tileEntity instanceof AdjustableCrateTileEntity) {
this.te = (AdjustableCrateTileEntity) tileEntity;
this.te.handleUpdateTag(extraData.readNbt());
init();
}
} }
public AdjustableCrateContainer(MenuType<?> type, int id, Inventory inv, AdjustableCrateTileEntity te) { public AdjustableCrateContainer(MenuType<?> type, int id, Inventory inv, AdjustableCrateTileEntity te) {
super(type, id); super(type, id, inv, te);
this.te = te;
this.playerInventory = inv;
init();
} }
public static AdjustableCrateContainer create(int id, Inventory inv, AdjustableCrateTileEntity te) { public static AdjustableCrateContainer create(int id, Inventory inv, AdjustableCrateTileEntity te) {
return new AdjustableCrateContainer(AllContainerTypes.FLEXCRATE.get(), id, inv, te); return new AdjustableCrateContainer(AllContainerTypes.FLEXCRATE.get(), id, inv, te);
} }
private void init() { @Override
doubleCrate = te.isDoubleCrate(); protected AdjustableCrateTileEntity createOnClient(FriendlyByteBuf extraData) {
BlockPos readBlockPos = extraData.readBlockPos();
CompoundTag readNbt = extraData.readNbt();
ClientLevel world = Minecraft.getInstance().level;
BlockEntity tileEntity = world.getBlockEntity(readBlockPos);
if (tileEntity instanceof AdjustableCrateTileEntity crate) {
crate.handleUpdateTag(readNbt);
return crate;
}
return null;
}
@Override
protected void initAndReadInventory(AdjustableCrateTileEntity contentHolder) {
doubleCrate = contentHolder.isDoubleCrate();
}
@Override
protected void addSlots() {
int x = doubleCrate ? 23 : 53; int x = doubleCrate ? 23 : 53;
int maxCol = doubleCrate ? 8 : 4; int maxCol = doubleCrate ? 8 : 4;
for (int row = 0; row < 4; ++row) { for (int row = 0; row < 4; ++row) {
for (int col = 0; col < maxCol; ++col) { for (int col = 0; col < maxCol; ++col) {
this.addSlot(new SlotItemHandler(te.inventory, col + row * maxCol, x + col * 18, 20 + row * 18)); this.addSlot(new SlotItemHandler(contentHolder.inventory, col + row * maxCol, x + col * 18, 20 + row * 18));
} }
} }
// player Slots addPlayerSlots(doubleCrate ? 20 : 8, 149);
int xOffset = doubleCrate ? 20 : 8; }
int yOffset = 149;
for (int row = 0; row < 3; ++row) {
for (int col = 0; col < 9; ++col) {
this.addSlot(new Slot(playerInventory, col + row * 9 + 9, xOffset + col * 18, yOffset + row * 18));
}
}
for (int hotbarSlot = 0; hotbarSlot < 9; ++hotbarSlot) { @Override
this.addSlot(new Slot(playerInventory, hotbarSlot, xOffset + hotbarSlot * 18, yOffset + 58)); protected void saveData(AdjustableCrateTileEntity contentHolder) {
}
broadcastChanges();
} }
@Override @Override
@ -79,16 +79,11 @@ public class AdjustableCrateContainer extends AbstractContainerMenu {
int crateSize = doubleCrate ? 32 : 16; int crateSize = doubleCrate ? 32 : 16;
if (index < crateSize) { if (index < crateSize) {
moveItemStackTo(stack, crateSize, slots.size(), false); moveItemStackTo(stack, crateSize, slots.size(), false);
te.inventory.onContentsChanged(index); contentHolder.inventory.onContentsChanged(index);
} else } else
moveItemStackTo(stack, 0, crateSize - 1, false); moveItemStackTo(stack, 0, crateSize - 1, false);
return ItemStack.EMPTY; return ItemStack.EMPTY;
} }
@Override
public boolean stillValid(Player player) {
return te != null && te.canPlayerUse(player);
}
} }

View file

@ -11,11 +11,11 @@ import com.google.common.collect.ImmutableList;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.PoseStack;
import com.simibubi.create.AllBlocks; import com.simibubi.create.AllBlocks;
import com.simibubi.create.content.logistics.packet.ConfigureFlexcratePacket; import com.simibubi.create.content.logistics.packet.ConfigureFlexcratePacket;
import com.simibubi.create.foundation.gui.AbstractSimiContainerScreen;
import com.simibubi.create.foundation.gui.AllGuiTextures; import com.simibubi.create.foundation.gui.AllGuiTextures;
import com.simibubi.create.foundation.gui.GuiGameElement; import com.simibubi.create.foundation.gui.container.AbstractSimiContainerScreen;
import com.simibubi.create.foundation.gui.widgets.Label; import com.simibubi.create.foundation.gui.element.GuiGameElement;
import com.simibubi.create.foundation.gui.widgets.ScrollInput; import com.simibubi.create.foundation.gui.widget.Label;
import com.simibubi.create.foundation.gui.widget.ScrollInput;
import com.simibubi.create.foundation.networking.AllPackets; import com.simibubi.create.foundation.networking.AllPackets;
import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.foundation.utility.Lang;
@ -44,7 +44,7 @@ public class AdjustableCrateScreen extends AbstractSimiContainerScreen<Adjustabl
public AdjustableCrateScreen(AdjustableCrateContainer container, Inventory inv, Component title) { public AdjustableCrateScreen(AdjustableCrateContainer container, Inventory inv, Component title) {
super(container, inv, title); super(container, inv, title);
te = container.te; te = container.contentHolder;
lastModification = -1; lastModification = -1;
background = container.doubleCrate ? ADJUSTABLE_DOUBLE_CRATE : ADJUSTABLE_CRATE; background = container.doubleCrate ? ADJUSTABLE_DOUBLE_CRATE : ADJUSTABLE_CRATE;
} }
@ -54,7 +54,6 @@ public class AdjustableCrateScreen extends AbstractSimiContainerScreen<Adjustabl
setWindowSize(Math.max(background.width, PLAYER_INVENTORY.width), background.height + 4 + PLAYER_INVENTORY.height); setWindowSize(Math.max(background.width, PLAYER_INVENTORY.width), background.height + 4 + PLAYER_INVENTORY.height);
setWindowOffset(menu.doubleCrate ? -2 : 0, 0); setWindowOffset(menu.doubleCrate ? -2 : 0, 0);
super.init(); super.init();
widgets.clear();
itemLabelOffset = menu.doubleCrate ? 137 : 65; itemLabelOffset = menu.doubleCrate ? 137 : 65;
textureXShift = menu.doubleCrate ? 0 : (imageWidth - (background.width - 8)) / 2; textureXShift = menu.doubleCrate ? 0 : (imageWidth - (background.width - 8)) / 2;
@ -72,8 +71,8 @@ public class AdjustableCrateScreen extends AbstractSimiContainerScreen<Adjustabl
.setState(te.allowedAmount) .setState(te.allowedAmount)
.calling(s -> lastModification = 0); .calling(s -> lastModification = 0);
allowedItems.onChanged(); allowedItems.onChanged();
widgets.add(allowedItemsLabel); addRenderableWidget(allowedItemsLabel);
widgets.add(allowedItems); addRenderableWidget(allowedItems);
extraAreas = ImmutableList.of( extraAreas = ImmutableList.of(
new Rect2i(x + background.width, y + background.height - 56 + itemYShift, 80, 80) new Rect2i(x + background.width, y + background.height - 56 + itemYShift, 80, 80)
@ -81,7 +80,7 @@ public class AdjustableCrateScreen extends AbstractSimiContainerScreen<Adjustabl
} }
@Override @Override
protected void renderWindow(PoseStack ms, int mouseX, int mouseY, float partialTicks) { protected void renderBg(PoseStack ms, float partialTicks, int mouseX, int mouseY) {
int invX = getLeftOfCentered(PLAYER_INVENTORY.width); int invX = getLeftOfCentered(PLAYER_INVENTORY.width);
int invY = topPos + background.height + 4; int invY = topPos + background.height + 4;
renderPlayerInventory(ms, invX, invY); renderPlayerInventory(ms, invX, invY);
@ -89,7 +88,7 @@ public class AdjustableCrateScreen extends AbstractSimiContainerScreen<Adjustabl
int x = leftPos + textureXShift; int x = leftPos + textureXShift;
int y = topPos; int y = topPos;
background.draw(ms, this, x, y); background.render(ms, x, y, this);
drawCenteredString(ms, font, title, x + (background.width - 8) / 2, y + 3, 0xFFFFFF); drawCenteredString(ms, font, title, x + (background.width - 8) / 2, y + 3, 0xFFFFFF);
String itemCount = String.valueOf(te.itemCount); String itemCount = String.valueOf(te.itemCount);
@ -101,7 +100,7 @@ public class AdjustableCrateScreen extends AbstractSimiContainerScreen<Adjustabl
int slotsPerRow = (menu.doubleCrate ? 8 : 4); int slotsPerRow = (menu.doubleCrate ? 8 : 4);
int slotX = x + 22 + (slot % slotsPerRow) * 18; int slotX = x + 22 + (slot % slotsPerRow) * 18;
int slotY = y + 19 + (slot / slotsPerRow) * 18; int slotY = y + 19 + (slot / slotsPerRow) * 18;
AllGuiTextures.ADJUSTABLE_CRATE_LOCKED_SLOT.draw(ms, this, slotX, slotY); AllGuiTextures.ADJUSTABLE_CRATE_LOCKED_SLOT.render(ms, slotX, slotY, this);
} }
GuiGameElement.of(renderedItem) GuiGameElement.of(renderedItem)
@ -120,6 +119,8 @@ public class AdjustableCrateScreen extends AbstractSimiContainerScreen<Adjustabl
if (!AllBlocks.ADJUSTABLE_CRATE.has(minecraft.level.getBlockState(te.getBlockPos()))) if (!AllBlocks.ADJUSTABLE_CRATE.has(minecraft.level.getBlockState(te.getBlockPos())))
minecraft.setScreen(null); minecraft.setScreen(null);
super.containerTick();
if (lastModification >= 0) if (lastModification >= 0)
lastModification++; lastModification++;

View file

@ -14,7 +14,6 @@ import com.simibubi.create.content.logistics.block.mechanicalArm.ArmInteractionP
import com.simibubi.create.foundation.advancement.AllTriggers; import com.simibubi.create.foundation.advancement.AllTriggers;
import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.config.AllConfigs;
import com.simibubi.create.foundation.gui.AllIcons; import com.simibubi.create.foundation.gui.AllIcons;
import com.simibubi.create.foundation.gui.widgets.InterpolatedAngle;
import com.simibubi.create.foundation.item.TooltipHelper; import com.simibubi.create.foundation.item.TooltipHelper;
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
import com.simibubi.create.foundation.tileEntity.behaviour.CenteredSideValueBoxTransform; import com.simibubi.create.foundation.tileEntity.behaviour.CenteredSideValueBoxTransform;
@ -24,6 +23,7 @@ import com.simibubi.create.foundation.utility.AngleHelper;
import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.foundation.utility.Lang;
import com.simibubi.create.foundation.utility.NBTHelper; import com.simibubi.create.foundation.utility.NBTHelper;
import com.simibubi.create.foundation.utility.VecHelper; import com.simibubi.create.foundation.utility.VecHelper;
import com.simibubi.create.foundation.utility.animation.InterpolatedAngle;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction; import net.minecraft.core.Direction;

View file

@ -4,10 +4,10 @@ import java.util.List;
import com.jozufozu.flywheel.backend.instancing.IInstanceRendered; import com.jozufozu.flywheel.backend.instancing.IInstanceRendered;
import com.simibubi.create.content.contraptions.goggles.IHaveGoggleInformation; import com.simibubi.create.content.contraptions.goggles.IHaveGoggleInformation;
import com.simibubi.create.foundation.gui.widgets.InterpolatedChasingValue;
import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.SmartTileEntity;
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.foundation.utility.Lang;
import com.simibubi.create.foundation.utility.animation.InterpolatedChasingValue;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.CompoundTag;

View file

@ -6,9 +6,9 @@ import com.simibubi.create.content.logistics.packet.ConfigureStockswitchPacket;
import com.simibubi.create.foundation.gui.AbstractSimiScreen; import com.simibubi.create.foundation.gui.AbstractSimiScreen;
import com.simibubi.create.foundation.gui.AllGuiTextures; import com.simibubi.create.foundation.gui.AllGuiTextures;
import com.simibubi.create.foundation.gui.AllIcons; import com.simibubi.create.foundation.gui.AllIcons;
import com.simibubi.create.foundation.gui.GuiGameElement; import com.simibubi.create.foundation.gui.element.GuiGameElement;
import com.simibubi.create.foundation.gui.widgets.IconButton; import com.simibubi.create.foundation.gui.widget.IconButton;
import com.simibubi.create.foundation.gui.widgets.ScrollInput; import com.simibubi.create.foundation.gui.widget.ScrollInput;
import com.simibubi.create.foundation.networking.AllPackets; import com.simibubi.create.foundation.networking.AllPackets;
import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.foundation.utility.Lang;
import com.simibubi.create.foundation.utility.animation.LerpedFloat; import com.simibubi.create.foundation.utility.animation.LerpedFloat;
@ -47,7 +47,6 @@ public class StockpileSwitchScreen extends AbstractSimiScreen {
setWindowSize(background.width, background.height); setWindowSize(background.width, background.height);
setWindowOffset(-20, 0); setWindowOffset(-20, 0);
super.init(); super.init();
widgets.clear();
int x = guiLeft; int x = guiLeft;
int y = guiTop; int y = guiTop;
@ -84,16 +83,22 @@ public class StockpileSwitchScreen extends AbstractSimiScreen {
onAbove.onChanged(); onAbove.onChanged();
offBelow.onChanged(); offBelow.onChanged();
widgets.add(onAbove); addRenderableWidget(onAbove);
widgets.add(offBelow); addRenderableWidget(offBelow);
confirmButton = confirmButton =
new IconButton(x + background.width - 33, y + background.height - 24, AllIcons.I_CONFIRM); new IconButton(x + background.width - 33, y + background.height - 24, AllIcons.I_CONFIRM);
widgets.add(confirmButton); confirmButton.withCallback(() -> {
onClose();
});
addRenderableWidget(confirmButton);
flipSignals = new IconButton(x + 14, y + 40, AllIcons.I_FLIP); flipSignals = new IconButton(x + 14, y + 40, AllIcons.I_FLIP);
flipSignals.withCallback(() -> {
send(!te.isInverted());
});
flipSignals.setToolTip(invertSignal); flipSignals.setToolTip(invertSignal);
widgets.add(flipSignals); addRenderableWidget(flipSignals);
} }
@Override @Override
@ -101,10 +106,10 @@ public class StockpileSwitchScreen extends AbstractSimiScreen {
int x = guiLeft; int x = guiLeft;
int y = guiTop; int y = guiTop;
background.draw(ms, this, x, y); background.render(ms, x, y, this);
AllGuiTextures.STOCKSWITCH_POWERED_LANE.draw(ms, this, x + 36, y + (te.isInverted() ? 18 : 40)); AllGuiTextures.STOCKSWITCH_POWERED_LANE.render(ms, x + 36, y + (te.isInverted() ? 18 : 40), this);
AllGuiTextures.STOCKSWITCH_UNPOWERED_LANE.draw(ms, this, x + 36, y + (te.isInverted() ? 40 : 18)); AllGuiTextures.STOCKSWITCH_UNPOWERED_LANE.render(ms, x + 36, y + (te.isInverted() ? 40 : 18), this);
drawCenteredString(ms, font, title, x + (background.width - 8) / 2, y + 3, 0xFFFFFF); drawCenteredString(ms, font, title, x + (background.width - 8) / 2, y + 3, 0xFFFFFF);
AllGuiTextures sprite = AllGuiTextures.STOCKSWITCH_INTERVAL; AllGuiTextures sprite = AllGuiTextures.STOCKSWITCH_INTERVAL;
@ -116,15 +121,15 @@ public class StockpileSwitchScreen extends AbstractSimiScreen {
(int) (sprite.width - upperBound), sprite.height); (int) (sprite.width - upperBound), sprite.height);
blit(ms, x + 37, y + 40, sprite.startX, sprite.startY, (int) (lowerBound), sprite.height); blit(ms, x + 37, y + 40, sprite.startX, sprite.startY, (int) (lowerBound), sprite.height);
AllGuiTextures.STOCKSWITCH_ARROW_UP.draw(ms, this, (int) (x + lowerBound + 36) - 2, y + 35); AllGuiTextures.STOCKSWITCH_ARROW_UP.render(ms, (int) (x + lowerBound + 36) - 2, y + 35, this);
AllGuiTextures.STOCKSWITCH_ARROW_DOWN.draw(ms, this, (int) (x + upperBound + 36) - 3, y + 17); AllGuiTextures.STOCKSWITCH_ARROW_DOWN.render(ms, (int) (x + upperBound + 36) - 3, y + 17, this);
if (te.currentLevel != -1) { if (te.currentLevel != -1) {
AllGuiTextures cursor = AllGuiTextures.STOCKSWITCH_CURSOR; AllGuiTextures cursor = AllGuiTextures.STOCKSWITCH_CURSOR;
ms.pushPose(); ms.pushPose();
ms.translate(Math.min(99, this.cursor.getValue(partialTicks) * sprite.width), ms.translate(Math.min(99, this.cursor.getValue(partialTicks) * sprite.width),
cursorLane.getValue(partialTicks) * 22, 0); cursorLane.getValue(partialTicks) * 22, 0);
cursor.draw(ms, this, x + 34, y + 19); cursor.render(ms, x + 34, y + 19, this);
ms.popPose(); ms.popPose();
} }
@ -162,15 +167,4 @@ public class StockpileSwitchScreen extends AbstractSimiScreen {
onAbove.getState() / 100f, invert)); onAbove.getState() / 100f, invert));
} }
@Override
public boolean mouseClicked(double x, double y, int button) {
if (flipSignals.isHovered())
send(!te.isInverted());
if (confirmButton.isHovered()) {
minecraft.player.closeContainer();
return true;
}
return super.mouseClicked(x, y, button);
}
} }

View file

@ -1,69 +1,52 @@
package com.simibubi.create.content.logistics.item; package com.simibubi.create.content.logistics.item;
import com.simibubi.create.AllContainerTypes; import com.simibubi.create.AllContainerTypes;
import com.simibubi.create.foundation.gui.IClearableContainer; import com.simibubi.create.foundation.gui.container.GhostItemContainer;
import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Inventory;
import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.player.Player;
import net.minecraft.world.inventory.AbstractContainerMenu;
import net.minecraft.world.inventory.ClickType; import net.minecraft.world.inventory.ClickType;
import net.minecraft.world.inventory.MenuType; import net.minecraft.world.inventory.MenuType;
import net.minecraft.world.inventory.Slot;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import net.minecraftforge.items.ItemStackHandler; import net.minecraftforge.items.ItemStackHandler;
import net.minecraftforge.items.SlotItemHandler; import net.minecraftforge.items.SlotItemHandler;
public class LinkedControllerContainer extends AbstractContainerMenu implements IClearableContainer { public class LinkedControllerContainer extends GhostItemContainer<ItemStack> {
public Player player;
protected Inventory playerInventory;
public ItemStack mainItem;
public ItemStackHandler filterInventory;
public LinkedControllerContainer(MenuType<?> type, int id, Inventory inv, FriendlyByteBuf extraData) { public LinkedControllerContainer(MenuType<?> type, int id, Inventory inv, FriendlyByteBuf extraData) {
this(type, id, inv, extraData.readItem()); super(type, id, inv, extraData);
} }
public LinkedControllerContainer(MenuType<?> type, int id, Inventory inv, ItemStack filterItem) { public LinkedControllerContainer(MenuType<?> type, int id, Inventory inv, ItemStack filterItem) {
super(type, id); super(type, id, inv, filterItem);
player = inv.player;
playerInventory = inv;
this.mainItem = filterItem;
init();
} }
public static LinkedControllerContainer create(int id, Inventory inv, ItemStack filterItem) { public static LinkedControllerContainer create(int id, Inventory inv, ItemStack filterItem) {
return new LinkedControllerContainer(AllContainerTypes.LINKED_CONTROLLER.get(), id, inv, filterItem); return new LinkedControllerContainer(AllContainerTypes.LINKED_CONTROLLER.get(), id, inv, filterItem);
} }
protected void init() { @Override
this.filterInventory = createFilterInventory(); protected ItemStack createOnClient(FriendlyByteBuf extraData) {
// readData(mainItem); return extraData.readItem();
addPlayerSlots();
addLinkSlots();
broadcastChanges();
} }
protected void addPlayerSlots() { @Override
int x = 8; protected ItemStackHandler createGhostInventory() {
int y = 131; return LinkedControllerItem.getFrequencyItems(contentHolder);
for (int hotbarSlot = 0; hotbarSlot < 9; ++hotbarSlot)
this.addSlot(new Slot(playerInventory, hotbarSlot, x + hotbarSlot * 18, y + 58));
for (int row = 0; row < 3; ++row)
for (int col = 0; col < 9; ++col)
this.addSlot(new Slot(playerInventory, col + row * 9 + 9, x + col * 18, y + row * 18));
} }
protected void addLinkSlots() { @Override
protected void addSlots() {
addPlayerSlots(8, 131);
int x = 12; int x = 12;
int y = 34; int y = 34;
int slot = 0; int slot = 0;
for (int column = 0; column < 6; column++) { for (int column = 0; column < 6; column++) {
for (int row = 0; row < 2; ++row) for (int row = 0; row < 2; ++row)
addSlot(new SlotItemHandler(filterInventory, slot++, x, y + row * 18)); addSlot(new SlotItemHandler(ghostInventory, slot++, x, y + row * 18));
x += 24; x += 24;
if (column == 3) if (column == 3)
x += 11; x += 11;
@ -71,89 +54,26 @@ public class LinkedControllerContainer extends AbstractContainerMenu implements
} }
@Override @Override
public void clearContents() { protected void saveData(ItemStack contentHolder) {
for (int i = 0; i < filterInventory.getSlots(); i++) contentHolder.getOrCreateTag()
filterInventory.setStackInSlot(i, ItemStack.EMPTY); .put("Items", ghostInventory.serializeNBT());
} }
@Override @Override
public boolean canTakeItemForPickAll(ItemStack stack, Slot slotIn) { protected boolean allowRepeats() {
return canDragTo(slotIn); return true;
}
@Override
public boolean canDragTo(Slot slotIn) {
return slotIn.container == playerInventory;
}
@Override
public boolean stillValid(Player playerIn) {
return playerInventory.getSelected() == mainItem;
} }
@Override @Override
public void clicked(int slotId, int dragType, ClickType clickTypeIn, Player player) { public void clicked(int slotId, int dragType, ClickType clickTypeIn, Player player) {
if (slotId == playerInventory.selected && clickTypeIn != ClickType.THROW) if (slotId == playerInventory.selected && clickTypeIn != ClickType.THROW)
return; return;
super.clicked(slotId, dragType, clickTypeIn, player);
ItemStack held = getCarried();
if (slotId < 36) {
super.clicked(slotId, dragType, clickTypeIn, player);
return;
}
if (clickTypeIn == ClickType.THROW)
return;
int slot = slotId - 36;
if (clickTypeIn == ClickType.CLONE) {
if (player.isCreative() && held.isEmpty()) {
ItemStack stackInSlot = filterInventory.getStackInSlot(slot)
.copy();
stackInSlot.setCount(64);
setCarried(stackInSlot);
return;
}
return;
}
if (held.isEmpty()) {
filterInventory.setStackInSlot(slot, ItemStack.EMPTY);
return;
}
ItemStack insert = held.copy();
insert.setCount(1);
filterInventory.setStackInSlot(slot, insert);
}
protected ItemStackHandler createFilterInventory() {
return LinkedControllerItem.getFrequencyItems(mainItem);
} }
@Override @Override
public ItemStack quickMoveStack(Player playerIn, int index) { public boolean stillValid(Player playerIn) {
if (index < 36) { return playerInventory.getSelected() == contentHolder;
ItemStack stackToInsert = playerInventory.getItem(index);
for (int i = 0; i < filterInventory.getSlots(); i++) {
ItemStack stack = filterInventory.getStackInSlot(i);
if (stack.isEmpty()) {
ItemStack copy = stackToInsert.copy();
copy.setCount(1);
filterInventory.insertItem(i, copy, false);
break;
}
}
} else
filterInventory.extractItem(index - 36, 1, false);
return ItemStack.EMPTY;
}
@Override
public void removed(Player playerIn) {
super.removed(playerIn);
mainItem.getOrCreateTag()
.put("Items", filterInventory.serializeNBT());
// saveData(filterItem);
} }
} }

View file

@ -8,11 +8,11 @@ import java.util.List;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.PoseStack;
import com.simibubi.create.foundation.gui.AbstractSimiContainerScreen;
import com.simibubi.create.foundation.gui.AllGuiTextures; import com.simibubi.create.foundation.gui.AllGuiTextures;
import com.simibubi.create.foundation.gui.AllIcons; import com.simibubi.create.foundation.gui.AllIcons;
import com.simibubi.create.foundation.gui.GuiGameElement; import com.simibubi.create.foundation.gui.container.AbstractSimiContainerScreen;
import com.simibubi.create.foundation.gui.widgets.IconButton; import com.simibubi.create.foundation.gui.element.GuiGameElement;
import com.simibubi.create.foundation.gui.widget.IconButton;
import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.foundation.utility.Lang;
import net.minecraft.ChatFormatting; import net.minecraft.ChatFormatting;
@ -37,18 +37,24 @@ public class LinkedControllerScreen extends AbstractSimiContainerScreen<LinkedCo
@Override @Override
protected void init() { protected void init() {
setWindowSize(background.width, background.height + 4 + PLAYER_INVENTORY.height); setWindowSize(background.width, background.height + 4 + PLAYER_INVENTORY.height);
setWindowOffset(2 + (width % 2 == 0 ? 0 : -1), 0); setWindowOffset(1, 0);
super.init(); super.init();
widgets.clear();
int x = leftPos; int x = leftPos;
int y = topPos; int y = topPos;
resetButton = new IconButton(x + background.width - 62, y + background.height - 24, AllIcons.I_TRASH); resetButton = new IconButton(x + background.width - 62, y + background.height - 24, AllIcons.I_TRASH);
resetButton.withCallback(() -> {
menu.clearContents();
menu.sendClearPacket();
});
confirmButton = new IconButton(x + background.width - 33, y + background.height - 24, AllIcons.I_CONFIRM); confirmButton = new IconButton(x + background.width - 33, y + background.height - 24, AllIcons.I_CONFIRM);
confirmButton.withCallback(() -> {
minecraft.player.closeContainer();
});
widgets.add(resetButton); addRenderableWidget(resetButton);
widgets.add(confirmButton); addRenderableWidget(confirmButton);
extraAreas = ImmutableList.of( extraAreas = ImmutableList.of(
new Rect2i(x + background.width + 4, y + background.height - 44, 64, 56) new Rect2i(x + background.width + 4, y + background.height - 44, 64, 56)
@ -56,7 +62,7 @@ public class LinkedControllerScreen extends AbstractSimiContainerScreen<LinkedCo
} }
@Override @Override
protected void renderWindow(PoseStack ms, int mouseX, int mouseY, float partialTicks) { protected void renderBg(PoseStack ms, float partialTicks, int mouseX, int mouseY) {
int invX = getLeftOfCentered(PLAYER_INVENTORY.width); int invX = getLeftOfCentered(PLAYER_INVENTORY.width);
int invY = topPos + background.height + 4; int invY = topPos + background.height + 4;
renderPlayerInventory(ms, invX, invY); renderPlayerInventory(ms, invX, invY);
@ -64,10 +70,10 @@ public class LinkedControllerScreen extends AbstractSimiContainerScreen<LinkedCo
int x = leftPos; int x = leftPos;
int y = topPos; int y = topPos;
background.draw(ms, this, x, y); background.render(ms, x, y, this);
font.draw(ms, title, x + 15, y + 4, 0x442000); font.draw(ms, title, x + 15, y + 4, 0x442000);
GuiGameElement.of(menu.mainItem) GuiGameElement.of(menu.contentHolder)
.<GuiGameElement.GuiRenderBuilder>at(x + background.width - 4, y + background.height - 56, -200) .<GuiGameElement.GuiRenderBuilder>at(x + background.width - 4, y + background.height - 56, -200)
.scale(5) .scale(5)
.render(ms); .render(ms);
@ -76,27 +82,10 @@ public class LinkedControllerScreen extends AbstractSimiContainerScreen<LinkedCo
@Override @Override
protected void containerTick() { protected void containerTick() {
if (!menu.player.getMainHandItem() if (!menu.player.getMainHandItem()
.equals(menu.mainItem, false)) .equals(menu.contentHolder, false))
minecraft.player.closeContainer(); menu.player.closeContainer();
}
@Override super.containerTick();
public boolean mouseClicked(double x, double y, int button) {
boolean mouseClicked = super.mouseClicked(x, y, button);
if (button == 0) {
if (confirmButton.isHovered()) {
minecraft.player.closeContainer();
return true;
}
if (resetButton.isHovered()) {
menu.clearContents();
menu.sendClearPacket();
return true;
}
}
return mouseClicked;
} }
@Override @Override

View file

@ -1,6 +1,6 @@
package com.simibubi.create.content.logistics.item.filter; package com.simibubi.create.content.logistics.item.filter;
import com.simibubi.create.foundation.gui.GhostItemContainer; import com.simibubi.create.foundation.gui.container.GhostItemContainer;
import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Inventory;

View file

@ -9,18 +9,17 @@ import java.util.List;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.PoseStack;
import com.simibubi.create.content.logistics.item.filter.FilterScreenPacket.Option; import com.simibubi.create.content.logistics.item.filter.FilterScreenPacket.Option;
import com.simibubi.create.foundation.gui.AbstractSimiContainerScreen;
import com.simibubi.create.foundation.gui.AllGuiTextures; import com.simibubi.create.foundation.gui.AllGuiTextures;
import com.simibubi.create.foundation.gui.AllIcons; import com.simibubi.create.foundation.gui.AllIcons;
import com.simibubi.create.foundation.gui.GuiGameElement; import com.simibubi.create.foundation.gui.container.AbstractSimiContainerScreen;
import com.simibubi.create.foundation.gui.widgets.IconButton; import com.simibubi.create.foundation.gui.element.GuiGameElement;
import com.simibubi.create.foundation.gui.widgets.Indicator; import com.simibubi.create.foundation.gui.widget.IconButton;
import com.simibubi.create.foundation.gui.widgets.Indicator.State; import com.simibubi.create.foundation.gui.widget.Indicator;
import com.simibubi.create.foundation.gui.widget.Indicator.State;
import com.simibubi.create.foundation.item.ItemDescription.Palette; import com.simibubi.create.foundation.item.ItemDescription.Palette;
import com.simibubi.create.foundation.item.TooltipHelper; import com.simibubi.create.foundation.item.TooltipHelper;
import com.simibubi.create.foundation.networking.AllPackets; import com.simibubi.create.foundation.networking.AllPackets;
import net.minecraft.client.gui.components.AbstractWidget;
import net.minecraft.client.renderer.Rect2i; import net.minecraft.client.renderer.Rect2i;
import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.MutableComponent; import net.minecraft.network.chat.MutableComponent;
@ -43,16 +42,23 @@ public abstract class AbstractFilterScreen<F extends AbstractFilterContainer> ex
protected void init() { protected void init() {
setWindowSize(Math.max(background.width, PLAYER_INVENTORY.width), background.height + 4 + PLAYER_INVENTORY.height); setWindowSize(Math.max(background.width, PLAYER_INVENTORY.width), background.height + 4 + PLAYER_INVENTORY.height);
super.init(); super.init();
widgets.clear();
int x = leftPos; int x = leftPos;
int y = topPos; int y = topPos;
resetButton = new IconButton(x + background.width - 62, y + background.height - 24, AllIcons.I_TRASH); resetButton = new IconButton(x + background.width - 62, y + background.height - 24, AllIcons.I_TRASH);
resetButton.withCallback(() -> {
menu.clearContents();
contentsCleared();
menu.sendClearPacket();
});
confirmButton = new IconButton(x + background.width - 33, y + background.height - 24, AllIcons.I_CONFIRM); confirmButton = new IconButton(x + background.width - 33, y + background.height - 24, AllIcons.I_CONFIRM);
confirmButton.withCallback(() -> {
minecraft.player.closeContainer();
});
widgets.add(resetButton); addRenderableWidget(resetButton);
widgets.add(confirmButton); addRenderableWidget(confirmButton);
extraAreas = ImmutableList.of( extraAreas = ImmutableList.of(
new Rect2i(x + background.width, y + background.height - 40, 80, 48) new Rect2i(x + background.width, y + background.height - 40, 80, 48)
@ -60,7 +66,7 @@ public abstract class AbstractFilterScreen<F extends AbstractFilterContainer> ex
} }
@Override @Override
protected void renderWindow(PoseStack ms, int mouseX, int mouseY, float partialTicks) { protected void renderBg(PoseStack ms, float partialTicks, int mouseX, int mouseY) {
int invX = getLeftOfCentered(PLAYER_INVENTORY.width); int invX = getLeftOfCentered(PLAYER_INVENTORY.width);
int invY = topPos + background.height + 4; int invY = topPos + background.height + 4;
renderPlayerInventory(ms, invX, invY); renderPlayerInventory(ms, invX, invY);
@ -68,7 +74,7 @@ public abstract class AbstractFilterScreen<F extends AbstractFilterContainer> ex
int x = leftPos; int x = leftPos;
int y = topPos; int y = topPos;
background.draw(ms, this, x, y); background.render(ms, x, y, this);
drawCenteredString(ms, font, title, x + (background.width - 8) / 2, y + 3, 0xFFFFFF); drawCenteredString(ms, font, title, x + (background.width - 8) / 2, y + 3, 0xFFFFFF);
GuiGameElement.of(menu.contentHolder) GuiGameElement.of(menu.contentHolder)
@ -79,27 +85,16 @@ public abstract class AbstractFilterScreen<F extends AbstractFilterContainer> ex
@Override @Override
protected void containerTick() { protected void containerTick() {
handleTooltips();
handleIndicators();
if (!menu.player.getMainHandItem() if (!menu.player.getMainHandItem()
.equals(menu.contentHolder, false)) .equals(menu.contentHolder, false))
minecraft.player.closeContainer(); menu.player.closeContainer();
super.containerTick();
handleTooltips();
handleIndicators();
} }
public void handleIndicators() {
List<IconButton> tooltipButtons = getTooltipButtons();
for (IconButton button : tooltipButtons)
button.active = isButtonEnabled(button);
for (AbstractWidget w : widgets)
if (w instanceof Indicator)
((Indicator) w).state = isIndicatorOn((Indicator) w) ? State.ON : State.OFF;
}
protected abstract boolean isButtonEnabled(IconButton button);
protected abstract boolean isIndicatorOn(Indicator indicator);
protected void handleTooltips() { protected void handleTooltips() {
List<IconButton> tooltipButtons = getTooltipButtons(); List<IconButton> tooltipButtons = getTooltipButtons();
@ -120,6 +115,17 @@ public abstract class AbstractFilterScreen<F extends AbstractFilterContainer> ex
} }
} }
public void handleIndicators() {
for (IconButton button : getTooltipButtons())
button.active = isButtonEnabled(button);
for (Indicator indicator : getIndicators())
indicator.state = isIndicatorOn(indicator) ? State.ON : State.OFF;
}
protected abstract boolean isButtonEnabled(IconButton button);
protected abstract boolean isIndicatorOn(Indicator indicator);
protected List<IconButton> getTooltipButtons() { protected List<IconButton> getTooltipButtons() {
return Collections.emptyList(); return Collections.emptyList();
} }
@ -128,6 +134,10 @@ public abstract class AbstractFilterScreen<F extends AbstractFilterContainer> ex
return Collections.emptyList(); return Collections.emptyList();
} }
protected List<Indicator> getIndicators() {
return Collections.emptyList();
}
private void fillToolTip(IconButton button, Component tooltip) { private void fillToolTip(IconButton button, Component tooltip) {
if (!button.isHovered()) if (!button.isHovered())
return; return;
@ -135,26 +145,6 @@ public abstract class AbstractFilterScreen<F extends AbstractFilterContainer> ex
tip.addAll(TooltipHelper.cutTextComponent(tooltip, GRAY, GRAY)); tip.addAll(TooltipHelper.cutTextComponent(tooltip, GRAY, GRAY));
} }
@Override
public boolean mouseClicked(double x, double y, int button) {
boolean mouseClicked = super.mouseClicked(x, y, button);
if (button == 0) {
if (confirmButton.isHovered()) {
minecraft.player.closeContainer();
return true;
}
if (resetButton.isHovered()) {
menu.clearContents();
contentsCleared();
menu.sendClearPacket();
return true;
}
}
return mouseClicked;
}
protected void contentsCleared() {} protected void contentsCleared() {}
protected void sendOptionUpdate(Option option) { protected void sendOptionUpdate(Option option) {

View file

@ -10,10 +10,10 @@ import com.simibubi.create.content.logistics.item.filter.AttributeFilterContaine
import com.simibubi.create.content.logistics.item.filter.FilterScreenPacket.Option; import com.simibubi.create.content.logistics.item.filter.FilterScreenPacket.Option;
import com.simibubi.create.foundation.gui.AllGuiTextures; import com.simibubi.create.foundation.gui.AllGuiTextures;
import com.simibubi.create.foundation.gui.AllIcons; import com.simibubi.create.foundation.gui.AllIcons;
import com.simibubi.create.foundation.gui.widgets.IconButton; import com.simibubi.create.foundation.gui.widget.IconButton;
import com.simibubi.create.foundation.gui.widgets.Indicator; import com.simibubi.create.foundation.gui.widget.Indicator;
import com.simibubi.create.foundation.gui.widgets.Label; import com.simibubi.create.foundation.gui.widget.Label;
import com.simibubi.create.foundation.gui.widgets.SelectionScrollInput; import com.simibubi.create.foundation.gui.widget.SelectionScrollInput;
import com.simibubi.create.foundation.networking.AllPackets; import com.simibubi.create.foundation.networking.AllPackets;
import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.foundation.utility.Lang;
import com.simibubi.create.foundation.utility.Pair; import com.simibubi.create.foundation.utility.Pair;
@ -30,11 +30,6 @@ public class AttributeFilterScreen extends AbstractFilterScreen<AttributeFilterC
private static final String PREFIX = "gui.attribute_filter."; private static final String PREFIX = "gui.attribute_filter.";
private IconButton whitelistDis, whitelistCon, blacklist;
private Indicator whitelistDisIndicator, whitelistConIndicator, blacklistIndicator;
private IconButton add;
private IconButton addInverted;
private Component addDESC = Lang.translate(PREFIX + "add_attribute"); private Component addDESC = Lang.translate(PREFIX + "add_attribute");
private Component addInvertedDESC = Lang.translate(PREFIX + "add_inverted_attribute"); private Component addInvertedDESC = Lang.translate(PREFIX + "add_inverted_attribute");
@ -49,6 +44,11 @@ public class AttributeFilterScreen extends AbstractFilterScreen<AttributeFilterC
private Component noSelectedT = Lang.translate(PREFIX + "no_selected_attributes"); private Component noSelectedT = Lang.translate(PREFIX + "no_selected_attributes");
private Component selectedT = Lang.translate(PREFIX + "selected_attributes"); private Component selectedT = Lang.translate(PREFIX + "selected_attributes");
private IconButton whitelistDis, whitelistCon, blacklist;
private Indicator whitelistDisIndicator, whitelistConIndicator, blacklistIndicator;
private IconButton add;
private IconButton addInverted;
private ItemStack lastItemScanned = ItemStack.EMPTY; private ItemStack lastItemScanned = ItemStack.EMPTY;
private List<ItemAttribute> attributesOfItem = new ArrayList<>(); private List<ItemAttribute> attributesOfItem = new ArrayList<>();
private List<Component> selectedAttributes = new ArrayList<>(); private List<Component> selectedAttributes = new ArrayList<>();
@ -61,29 +61,47 @@ public class AttributeFilterScreen extends AbstractFilterScreen<AttributeFilterC
@Override @Override
protected void init() { protected void init() {
setWindowOffset(-11 + (width % 2 == 0 ? 1 : 0), 7); setWindowOffset(-11, 7);
super.init(); super.init();
int x = leftPos; int x = leftPos;
int y = topPos; int y = topPos;
whitelistDis = new IconButton(x + 47, y + 59, AllIcons.I_WHITELIST_OR); whitelistDis = new IconButton(x + 47, y + 59, AllIcons.I_WHITELIST_OR);
whitelistDis.withCallback(() -> {
menu.whitelistMode = WhitelistMode.WHITELIST_DISJ;
sendOptionUpdate(Option.WHITELIST);
});
whitelistDis.setToolTip(allowDisN); whitelistDis.setToolTip(allowDisN);
whitelistCon = new IconButton(x + 65, y + 59, AllIcons.I_WHITELIST_AND); whitelistCon = new IconButton(x + 65, y + 59, AllIcons.I_WHITELIST_AND);
whitelistCon.withCallback(() -> {
menu.whitelistMode = WhitelistMode.WHITELIST_CONJ;
sendOptionUpdate(Option.WHITELIST2);
});
whitelistCon.setToolTip(allowConN); whitelistCon.setToolTip(allowConN);
blacklist = new IconButton(x + 83, y + 59, AllIcons.I_WHITELIST_NOT); blacklist = new IconButton(x + 83, y + 59, AllIcons.I_WHITELIST_NOT);
blacklist.withCallback(() -> {
menu.whitelistMode = WhitelistMode.BLACKLIST;
sendOptionUpdate(Option.BLACKLIST);
});
blacklist.setToolTip(denyN); blacklist.setToolTip(denyN);
whitelistDisIndicator = new Indicator(x + 47, y + 53, TextComponent.EMPTY); whitelistDisIndicator = new Indicator(x + 47, y + 53, TextComponent.EMPTY);
whitelistConIndicator = new Indicator(x + 65, y + 53, TextComponent.EMPTY); whitelistConIndicator = new Indicator(x + 65, y + 53, TextComponent.EMPTY);
blacklistIndicator = new Indicator(x + 83, y + 53, TextComponent.EMPTY); blacklistIndicator = new Indicator(x + 83, y + 53, TextComponent.EMPTY);
widgets.addAll(Arrays.asList(blacklist, whitelistCon, whitelistDis, blacklistIndicator, whitelistConIndicator, addRenderableWidgets(blacklist, whitelistCon, whitelistDis, blacklistIndicator, whitelistConIndicator,
whitelistDisIndicator)); whitelistDisIndicator);
widgets.add(add = new IconButton(x + 182, y + 21, AllIcons.I_ADD)); addRenderableWidget(add = new IconButton(x + 182, y + 21, AllIcons.I_ADD));
widgets.add(addInverted = new IconButton(x + 200, y + 21, AllIcons.I_ADD_INVERTED_ATTRIBUTE)); addRenderableWidget(addInverted = new IconButton(x + 200, y + 21, AllIcons.I_ADD_INVERTED_ATTRIBUTE));
add.withCallback(() -> {
handleAddedAttibute(false);
});
add.setToolTip(addDESC); add.setToolTip(addDESC);
addInverted.withCallback(() -> {
handleAddedAttibute(true);
});
addInverted.setToolTip(addInvertedDESC); addInverted.setToolTip(addInvertedDESC);
handleIndicators(); handleIndicators();
@ -95,8 +113,8 @@ public class AttributeFilterScreen extends AbstractFilterScreen<AttributeFilterC
attributeSelector.removeCallback(); attributeSelector.removeCallback();
referenceItemChanged(menu.ghostInventory.getStackInSlot(0)); referenceItemChanged(menu.ghostInventory.getStackInSlot(0));
widgets.add(attributeSelector); addRenderableWidget(attributeSelector);
widgets.add(attributeSelectorLabel); addRenderableWidget(attributeSelectorLabel);
selectedAttributes.clear(); selectedAttributes.clear();
selectedAttributes.add((menu.selectedAttributes.isEmpty() ? noSelectedT : selectedT).plainCopy() selectedAttributes.add((menu.selectedAttributes.isEmpty() ? noSelectedT : selectedT).plainCopy()
@ -160,7 +178,7 @@ public class AttributeFilterScreen extends AbstractFilterScreen<AttributeFilterC
} }
@Override @Override
public void renderWindowForeground(PoseStack matrixStack, int mouseX, int mouseY, float partialTicks) { public void renderForeground(PoseStack matrixStack, int mouseX, int mouseY, float partialTicks) {
ItemStack stack = menu.ghostInventory.getStackInSlot(1); ItemStack stack = menu.ghostInventory.getStackInSlot(1);
matrixStack.pushPose(); matrixStack.pushPose();
matrixStack.translate(0.0F, 0.0F, 32.0F); matrixStack.translate(0.0F, 0.0F, 32.0F);
@ -172,11 +190,12 @@ public class AttributeFilterScreen extends AbstractFilterScreen<AttributeFilterC
this.itemRenderer.blitOffset = 0.0F; this.itemRenderer.blitOffset = 0.0F;
matrixStack.popPose(); matrixStack.popPose();
super.renderWindowForeground(matrixStack, mouseX, mouseY, partialTicks); super.renderForeground(matrixStack, mouseX, mouseY, partialTicks);
} }
@Override @Override
protected void containerTick() { protected void containerTick() {
super.containerTick();
ItemStack stackInSlot = menu.ghostInventory.getStackInSlot(0); ItemStack stackInSlot = menu.ghostInventory.getStackInSlot(0);
if (!stackInSlot.equals(lastItemScanned, false)) if (!stackInSlot.equals(lastItemScanned, false))
referenceItemChanged(stackInSlot); referenceItemChanged(stackInSlot);
@ -205,36 +224,8 @@ public class AttributeFilterScreen extends AbstractFilterScreen<AttributeFilterC
} }
@Override @Override
public boolean mouseClicked(double x, double y, int button) { protected List<Indicator> getIndicators() {
boolean mouseClicked = super.mouseClicked(x, y, button); return Arrays.asList(blacklistIndicator, whitelistConIndicator, whitelistDisIndicator);
if (button != 0)
return mouseClicked;
if (blacklist.isHovered()) {
menu.whitelistMode = WhitelistMode.BLACKLIST;
sendOptionUpdate(Option.BLACKLIST);
return true;
}
if (whitelistCon.isHovered()) {
menu.whitelistMode = WhitelistMode.WHITELIST_CONJ;
sendOptionUpdate(Option.WHITELIST2);
return true;
}
if (whitelistDis.isHovered()) {
menu.whitelistMode = WhitelistMode.WHITELIST_DISJ;
sendOptionUpdate(Option.WHITELIST);
return true;
}
if (add.isHovered() && add.active)
return handleAddedAttibute(false);
if (addInverted.isHovered() && addInverted.active)
return handleAddedAttibute(true);
return mouseClicked;
} }
protected boolean handleAddedAttibute(boolean inverted) { protected boolean handleAddedAttibute(boolean inverted) {

View file

@ -6,8 +6,8 @@ import java.util.List;
import com.simibubi.create.content.logistics.item.filter.FilterScreenPacket.Option; import com.simibubi.create.content.logistics.item.filter.FilterScreenPacket.Option;
import com.simibubi.create.foundation.gui.AllGuiTextures; import com.simibubi.create.foundation.gui.AllGuiTextures;
import com.simibubi.create.foundation.gui.AllIcons; import com.simibubi.create.foundation.gui.AllIcons;
import com.simibubi.create.foundation.gui.widgets.IconButton; import com.simibubi.create.foundation.gui.widget.IconButton;
import com.simibubi.create.foundation.gui.widgets.Indicator; import com.simibubi.create.foundation.gui.widget.Indicator;
import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.foundation.utility.Lang;
import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Component;
@ -47,58 +47,40 @@ public class FilterScreen extends AbstractFilterScreen<FilterContainer> {
int y = topPos; int y = topPos;
blacklist = new IconButton(x + 18, y + 73, AllIcons.I_BLACKLIST); blacklist = new IconButton(x + 18, y + 73, AllIcons.I_BLACKLIST);
blacklist.withCallback(() -> {
menu.blacklist = true;
sendOptionUpdate(Option.BLACKLIST);
});
blacklist.setToolTip(denyN); blacklist.setToolTip(denyN);
whitelist = new IconButton(x + 36, y + 73, AllIcons.I_WHITELIST); whitelist = new IconButton(x + 36, y + 73, AllIcons.I_WHITELIST);
whitelist.withCallback(() -> {
menu.blacklist = false;
sendOptionUpdate(Option.WHITELIST);
});
whitelist.setToolTip(allowN); whitelist.setToolTip(allowN);
blacklistIndicator = new Indicator(x + 18, y + 67, TextComponent.EMPTY); blacklistIndicator = new Indicator(x + 18, y + 67, TextComponent.EMPTY);
whitelistIndicator = new Indicator(x + 36, y + 67, TextComponent.EMPTY); whitelistIndicator = new Indicator(x + 36, y + 67, TextComponent.EMPTY);
widgets.addAll(Arrays.asList(blacklist, whitelist, blacklistIndicator, whitelistIndicator)); addRenderableWidgets(blacklist, whitelist, blacklistIndicator, whitelistIndicator);
respectNBT = new IconButton(x + 60, y + 73, AllIcons.I_RESPECT_NBT); respectNBT = new IconButton(x + 60, y + 73, AllIcons.I_RESPECT_NBT);
respectNBT.withCallback(() -> {
menu.respectNBT = true;
sendOptionUpdate(Option.RESPECT_DATA);
});
respectNBT.setToolTip(respectDataN); respectNBT.setToolTip(respectDataN);
ignoreNBT = new IconButton(x + 78, y + 73, AllIcons.I_IGNORE_NBT); ignoreNBT = new IconButton(x + 78, y + 73, AllIcons.I_IGNORE_NBT);
ignoreNBT.withCallback(() -> {
menu.respectNBT = false;
sendOptionUpdate(Option.IGNORE_DATA);
});
ignoreNBT.setToolTip(ignoreDataN); ignoreNBT.setToolTip(ignoreDataN);
respectNBTIndicator = new Indicator(x + 60, y + 67, TextComponent.EMPTY); respectNBTIndicator = new Indicator(x + 60, y + 67, TextComponent.EMPTY);
ignoreNBTIndicator = new Indicator(x + 78, y + 67, TextComponent.EMPTY); ignoreNBTIndicator = new Indicator(x + 78, y + 67, TextComponent.EMPTY);
widgets.addAll(Arrays.asList(respectNBT, ignoreNBT, respectNBTIndicator, ignoreNBTIndicator)); addRenderableWidgets(respectNBT, ignoreNBT, respectNBTIndicator, ignoreNBTIndicator);
handleIndicators(); handleIndicators();
} }
@Override
public boolean mouseClicked(double x, double y, int button) {
boolean mouseClicked = super.mouseClicked(x, y, button);
if (button != 0)
return mouseClicked;
if (blacklist.isHovered()) {
menu.blacklist = true;
sendOptionUpdate(Option.BLACKLIST);
return true;
}
if (whitelist.isHovered()) {
menu.blacklist = false;
sendOptionUpdate(Option.WHITELIST);
return true;
}
if (respectNBT.isHovered()) {
menu.respectNBT = true;
sendOptionUpdate(Option.RESPECT_DATA);
return true;
}
if (ignoreNBT.isHovered()) {
menu.respectNBT = false;
sendOptionUpdate(Option.IGNORE_DATA);
return true;
}
return mouseClicked;
}
@Override @Override
protected List<IconButton> getTooltipButtons() { protected List<IconButton> getTooltipButtons() {
return Arrays.asList(blacklist, whitelist, respectNBT, ignoreNBT); return Arrays.asList(blacklist, whitelist, respectNBT, ignoreNBT);
@ -109,6 +91,11 @@ public class FilterScreen extends AbstractFilterScreen<FilterContainer> {
return Arrays.asList(denyDESC.plainCopy(), allowDESC.plainCopy(), respectDataDESC.plainCopy(), ignoreDataDESC.plainCopy()); return Arrays.asList(denyDESC.plainCopy(), allowDESC.plainCopy(), respectDataDESC.plainCopy(), ignoreDataDESC.plainCopy());
} }
@Override
protected List<Indicator> getIndicators() {
return Arrays.asList(blacklistIndicator, whitelistIndicator, respectNBTIndicator, ignoreNBTIndicator);
}
@Override @Override
protected boolean isButtonEnabled(IconButton button) { protected boolean isButtonEnabled(IconButton button) {
if (button == blacklist) if (button == blacklist)

View file

@ -2,51 +2,73 @@ package com.simibubi.create.content.schematics.block;
import com.simibubi.create.AllContainerTypes; import com.simibubi.create.AllContainerTypes;
import com.simibubi.create.AllItems; import com.simibubi.create.AllItems;
import com.simibubi.create.foundation.gui.container.ContainerBase;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.multiplayer.ClientLevel;
import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Inventory;
import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.player.Player;
import net.minecraft.world.inventory.AbstractContainerMenu;
import net.minecraft.world.inventory.MenuType; import net.minecraft.world.inventory.MenuType;
import net.minecraft.world.inventory.Slot; import net.minecraft.world.inventory.Slot;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraftforge.items.SlotItemHandler; import net.minecraftforge.items.SlotItemHandler;
public class SchematicTableContainer extends AbstractContainerMenu { public class SchematicTableContainer extends ContainerBase<SchematicTableTileEntity> {
private SchematicTableTileEntity te;
private Slot inputSlot; private Slot inputSlot;
private Slot outputSlot; private Slot outputSlot;
private Player player;
public SchematicTableContainer(MenuType<?> type, int id, Inventory inv, FriendlyByteBuf extraData) { public SchematicTableContainer(MenuType<?> type, int id, Inventory inv, FriendlyByteBuf extraData) {
super(type, id); super(type, id, inv, extraData);
player = inv.player;
ClientLevel world = Minecraft.getInstance().level;
BlockEntity tileEntity = world.getBlockEntity(extraData.readBlockPos());
if (tileEntity instanceof SchematicTableTileEntity) {
this.te = (SchematicTableTileEntity) tileEntity;
this.te.handleUpdateTag(extraData.readNbt());
init();
}
} }
public SchematicTableContainer(MenuType<?> type, int id, Inventory inv, SchematicTableTileEntity te) { public SchematicTableContainer(MenuType<?> type, int id, Inventory inv, SchematicTableTileEntity te) {
super(type, id); super(type, id, inv, te);
this.player = inv.player;
this.te = te;
init();
} }
public static SchematicTableContainer create(int id, Inventory inv, SchematicTableTileEntity te) { public static SchematicTableContainer create(int id, Inventory inv, SchematicTableTileEntity te) {
return new SchematicTableContainer(AllContainerTypes.SCHEMATIC_TABLE.get(), id, inv, te); return new SchematicTableContainer(AllContainerTypes.SCHEMATIC_TABLE.get(), id, inv, te);
} }
protected void init() { public boolean canWrite() {
inputSlot = new SlotItemHandler(te.inventory, 0, 21, 57) { return inputSlot.hasItem() && !outputSlot.hasItem();
}
@Override
public ItemStack quickMoveStack(Player playerIn, int index) {
Slot clickedSlot = getSlot(index);
if (!clickedSlot.hasItem())
return ItemStack.EMPTY;
ItemStack stack = clickedSlot.getItem();
if (index < 2)
moveItemStackTo(stack, 2, slots.size(), false);
else
moveItemStackTo(stack, 0, 1, false);
return ItemStack.EMPTY;
}
@Override
protected SchematicTableTileEntity createOnClient(FriendlyByteBuf extraData) {
ClientLevel world = Minecraft.getInstance().level;
BlockEntity tileEntity = world.getBlockEntity(extraData.readBlockPos());
if (tileEntity instanceof SchematicTableTileEntity schematicTable) {
schematicTable.handleUpdateTag(extraData.readNbt());
return schematicTable;
}
return null;
}
@Override
protected void initAndReadInventory(SchematicTableTileEntity contentHolder) {
}
@Override
protected void addSlots() {
inputSlot = new SlotItemHandler(contentHolder.inventory, 0, 21, 57) {
@Override @Override
public boolean mayPlace(ItemStack stack) { public boolean mayPlace(ItemStack stack) {
return AllItems.EMPTY_SCHEMATIC.isIn(stack) || AllItems.SCHEMATIC_AND_QUILL.isIn(stack) return AllItems.EMPTY_SCHEMATIC.isIn(stack) || AllItems.SCHEMATIC_AND_QUILL.isIn(stack)
@ -54,7 +76,7 @@ public class SchematicTableContainer extends AbstractContainerMenu {
} }
}; };
outputSlot = new SlotItemHandler(te.inventory, 1, 166, 57) { outputSlot = new SlotItemHandler(contentHolder.inventory, 1, 166, 57) {
@Override @Override
public boolean mayPlace(ItemStack stack) { public boolean mayPlace(ItemStack stack) {
return false; return false;
@ -74,36 +96,10 @@ public class SchematicTableContainer extends AbstractContainerMenu {
for (int hotbarSlot = 0; hotbarSlot < 9; ++hotbarSlot) { for (int hotbarSlot = 0; hotbarSlot < 9; ++hotbarSlot) {
this.addSlot(new Slot(player.getInventory(), hotbarSlot, 38 + hotbarSlot * 18, 163)); this.addSlot(new Slot(player.getInventory(), hotbarSlot, 38 + hotbarSlot * 18, 163));
} }
broadcastChanges();
}
public boolean canWrite() {
return inputSlot.hasItem() && !outputSlot.hasItem();
} }
@Override @Override
public boolean stillValid(Player player) { protected void saveData(SchematicTableTileEntity contentHolder) {
return te != null && te.canPlayerUse(player);
}
@Override
public ItemStack quickMoveStack(Player playerIn, int index) {
Slot clickedSlot = getSlot(index);
if (!clickedSlot.hasItem())
return ItemStack.EMPTY;
ItemStack stack = clickedSlot.getItem();
if (index < 2)
moveItemStackTo(stack, 2, slots.size(), false);
else
moveItemStackTo(stack, 0, 1, false);
return ItemStack.EMPTY;
}
public SchematicTableTileEntity getTileEntity() {
return te;
} }
} }

View file

@ -12,14 +12,14 @@ import com.mojang.blaze3d.vertex.PoseStack;
import com.simibubi.create.AllBlocks; import com.simibubi.create.AllBlocks;
import com.simibubi.create.CreateClient; import com.simibubi.create.CreateClient;
import com.simibubi.create.content.schematics.ClientSchematicLoader; import com.simibubi.create.content.schematics.ClientSchematicLoader;
import com.simibubi.create.foundation.gui.AbstractSimiContainerScreen;
import com.simibubi.create.foundation.gui.AllGuiTextures; import com.simibubi.create.foundation.gui.AllGuiTextures;
import com.simibubi.create.foundation.gui.AllIcons; import com.simibubi.create.foundation.gui.AllIcons;
import com.simibubi.create.foundation.gui.GuiGameElement; import com.simibubi.create.foundation.gui.container.AbstractSimiContainerScreen;
import com.simibubi.create.foundation.gui.widgets.IconButton; import com.simibubi.create.foundation.gui.element.GuiGameElement;
import com.simibubi.create.foundation.gui.widgets.Label; import com.simibubi.create.foundation.gui.widget.IconButton;
import com.simibubi.create.foundation.gui.widgets.ScrollInput; import com.simibubi.create.foundation.gui.widget.Label;
import com.simibubi.create.foundation.gui.widgets.SelectionScrollInput; import com.simibubi.create.foundation.gui.widget.ScrollInput;
import com.simibubi.create.foundation.gui.widget.SelectionScrollInput;
import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.foundation.utility.Lang;
import net.minecraft.Util; import net.minecraft.Util;
@ -32,8 +32,14 @@ import net.minecraft.world.item.ItemStack;
public class SchematicTableScreen extends AbstractSimiContainerScreen<SchematicTableContainer> { public class SchematicTableScreen extends AbstractSimiContainerScreen<SchematicTableContainer> {
private final Component uploading = Lang.translate("gui.schematicTable.uploading");
private final Component finished = Lang.translate("gui.schematicTable.finished");
private final Component refresh = Lang.translate("gui.schematicTable.refresh");
private final Component folder = Lang.translate("gui.schematicTable.open_folder");
private final Component noSchematics = Lang.translate("gui.schematicTable.noSchematics");
private final Component availableSchematicsTitle = Lang.translate("gui.schematicTable.availableSchematics");
protected AllGuiTextures background; protected AllGuiTextures background;
private List<Rect2i> extraAreas = Collections.emptyList();
private ScrollInput schematicsArea; private ScrollInput schematicsArea;
private IconButton confirmButton; private IconButton confirmButton;
@ -41,18 +47,14 @@ public class SchematicTableScreen extends AbstractSimiContainerScreen<SchematicT
private IconButton refreshButton; private IconButton refreshButton;
private Label schematicsLabel; private Label schematicsLabel;
private final Component uploading = Lang.translate("gui.schematicTable.uploading");
private final Component finished = Lang.translate("gui.schematicTable.finished");
private final Component refresh = Lang.translate("gui.schematicTable.refresh");
private final Component folder = Lang.translate("gui.schematicTable.open_folder");
private final Component noSchematics = Lang.translate("gui.schematicTable.noSchematics");
private final Component availableSchematicsTitle = Lang.translate("gui.schematicTable.availableSchematics");
private final ItemStack renderedItem = AllBlocks.SCHEMATIC_TABLE.asStack();
private float progress; private float progress;
private float chasingProgress; private float chasingProgress;
private float lastChasingProgress; private float lastChasingProgress;
private final ItemStack renderedItem = AllBlocks.SCHEMATIC_TABLE.asStack();
private List<Rect2i> extraAreas = Collections.emptyList();
public SchematicTableScreen(SchematicTableContainer container, Inventory playerInventory, public SchematicTableScreen(SchematicTableContainer container, Inventory playerInventory,
Component title) { Component title) {
super(container, playerInventory, title); super(container, playerInventory, title);
@ -64,7 +66,6 @@ public class SchematicTableScreen extends AbstractSimiContainerScreen<SchematicT
setWindowSize(background.width, background.height + 4 + AllGuiTextures.PLAYER_INVENTORY.height); setWindowSize(background.width, background.height + 4 + AllGuiTextures.PLAYER_INVENTORY.height);
setWindowOffset(-11, 8); setWindowOffset(-11, 8);
super.init(); super.init();
widgets.clear();
CreateClient.SCHEMATIC_SENDER.refresh(); CreateClient.SCHEMATIC_SENDER.refresh();
List<Component> availableSchematics = CreateClient.SCHEMATIC_SENDER.getAvailableSchematics(); List<Component> availableSchematics = CreateClient.SCHEMATIC_SENDER.getAvailableSchematics();
@ -79,20 +80,52 @@ public class SchematicTableScreen extends AbstractSimiContainerScreen<SchematicT
new SelectionScrollInput(x + 45, y + 21, 139, 18).forOptions(availableSchematics) new SelectionScrollInput(x + 45, y + 21, 139, 18).forOptions(availableSchematics)
.titled(availableSchematicsTitle.plainCopy()) .titled(availableSchematicsTitle.plainCopy())
.writingTo(schematicsLabel); .writingTo(schematicsLabel);
widgets.add(schematicsArea); addRenderableWidget(schematicsArea);
widgets.add(schematicsLabel); addRenderableWidget(schematicsLabel);
} }
confirmButton = new IconButton(x + 44, y + 56, AllIcons.I_CONFIRM); confirmButton = new IconButton(x + 44, y + 56, AllIcons.I_CONFIRM);
confirmButton.withCallback(() -> {
if (menu.canWrite() && schematicsArea != null) {
ClientSchematicLoader schematicSender = CreateClient.SCHEMATIC_SENDER;
lastChasingProgress = chasingProgress = progress = 0;
List<Component> availableSchematics1 = schematicSender.getAvailableSchematics();
Component schematic = availableSchematics1.get(schematicsArea.getState());
schematicSender.startNewUpload(schematic.getContents());
}
});
folderButton = new IconButton(x + 21, y + 21, AllIcons.I_OPEN_FOLDER); folderButton = new IconButton(x + 21, y + 21, AllIcons.I_OPEN_FOLDER);
folderButton.withCallback(() -> {
Util.getPlatform()
.openFile(Paths.get("schematics/")
.toFile());
});
folderButton.setToolTip(folder); folderButton.setToolTip(folder);
refreshButton = new IconButton(x + 207, y + 21, AllIcons.I_REFRESH); refreshButton = new IconButton(x + 207, y + 21, AllIcons.I_REFRESH);
refreshButton.withCallback(() -> {
ClientSchematicLoader schematicSender = CreateClient.SCHEMATIC_SENDER;
schematicSender.refresh();
List<Component> availableSchematics1 = schematicSender.getAvailableSchematics();
removeWidget(schematicsArea);
if (!availableSchematics1.isEmpty()) {
schematicsArea = new SelectionScrollInput(leftPos + 45, topPos + 21, 139, 18)
.forOptions(availableSchematics1)
.titled(availableSchematicsTitle.plainCopy())
.writingTo(schematicsLabel);
schematicsArea.onChanged();
addRenderableWidget(schematicsArea);
} else {
schematicsArea = null;
schematicsLabel.text = TextComponent.EMPTY;
}
});
refreshButton.setToolTip(refresh); refreshButton.setToolTip(refresh);
widgets.add(confirmButton); addRenderableWidget(confirmButton);
widgets.add(folderButton); addRenderableWidget(folderButton);
widgets.add(refreshButton); addRenderableWidget(refreshButton);
extraAreas = ImmutableList.of( extraAreas = ImmutableList.of(
new Rect2i(x + background.width, y + background.height - 40, 48, 48), new Rect2i(x + background.width, y + background.height - 40, 48, 48),
@ -101,7 +134,7 @@ public class SchematicTableScreen extends AbstractSimiContainerScreen<SchematicT
} }
@Override @Override
protected void renderWindow(PoseStack ms, int mouseX, int mouseY, float partialTicks) { protected void renderBg(PoseStack ms, float partialTicks, int mouseX, int mouseY) {
int invX = getLeftOfCentered(PLAYER_INVENTORY.width); int invX = getLeftOfCentered(PLAYER_INVENTORY.width);
int invY = topPos + background.height + 4; int invY = topPos + background.height + 4;
renderPlayerInventory(ms, invX, invY); renderPlayerInventory(ms, invX, invY);
@ -109,10 +142,10 @@ public class SchematicTableScreen extends AbstractSimiContainerScreen<SchematicT
int x = leftPos; int x = leftPos;
int y = topPos; int y = topPos;
background.draw(ms, this, x, y); background.render(ms, x, y, this);
Component titleText; Component titleText;
if (menu.getTileEntity().isUploading) if (menu.contentHolder.isUploading)
titleText = uploading; titleText = uploading;
else if (menu.getSlot(1) else if (menu.getSlot(1)
.hasItem()) .hasItem())
@ -139,22 +172,24 @@ public class SchematicTableScreen extends AbstractSimiContainerScreen<SchematicT
@Override @Override
protected void containerTick() { protected void containerTick() {
super.containerTick();
boolean finished = menu.getSlot(1) boolean finished = menu.getSlot(1)
.hasItem(); .hasItem();
if (menu.getTileEntity().isUploading || finished) { if (menu.contentHolder.isUploading || finished) {
if (finished) { if (finished) {
chasingProgress = lastChasingProgress = progress = 1; chasingProgress = lastChasingProgress = progress = 1;
} else { } else {
lastChasingProgress = chasingProgress; lastChasingProgress = chasingProgress;
progress = menu.getTileEntity().uploadingProgress; progress = menu.contentHolder.uploadingProgress;
chasingProgress += (progress - chasingProgress) * .5f; chasingProgress += (progress - chasingProgress) * .5f;
} }
confirmButton.active = false; confirmButton.active = false;
if (schematicsLabel != null) { if (schematicsLabel != null) {
schematicsLabel.colored(0xCCDDFF); schematicsLabel.colored(0xCCDDFF);
String uploadingSchematic = menu.getTileEntity().uploadingSchematic; String uploadingSchematic = menu.contentHolder.uploadingSchematic;
schematicsLabel.text = uploadingSchematic == null ? null : new TextComponent(uploadingSchematic); schematicsLabel.text = uploadingSchematic == null ? null : new TextComponent(uploadingSchematic);
} }
if (schematicsArea != null) if (schematicsArea != null)
@ -174,46 +209,6 @@ public class SchematicTableScreen extends AbstractSimiContainerScreen<SchematicT
} }
} }
@Override
public boolean mouseClicked(double p_mouseClicked_1_, double p_mouseClicked_3_, int p_mouseClicked_5_) {
ClientSchematicLoader schematicSender = CreateClient.SCHEMATIC_SENDER;
if (confirmButton.active && confirmButton.isHovered() && ((SchematicTableContainer) menu).canWrite()
&& schematicsArea != null) {
lastChasingProgress = chasingProgress = progress = 0;
List<Component> availableSchematics = schematicSender.getAvailableSchematics();
Component schematic = availableSchematics.get(schematicsArea.getState());
schematicSender.startNewUpload(schematic.getContents());
}
if (folderButton.isHovered()) {
Util.getPlatform()
.openFile(Paths.get("schematics/")
.toFile());
}
if (refreshButton.isHovered()) {
schematicSender.refresh();
List<Component> availableSchematics = schematicSender.getAvailableSchematics();
widgets.remove(schematicsArea);
if (!availableSchematics.isEmpty()) {
schematicsArea = new SelectionScrollInput(leftPos + 45, topPos + 21, 139, 18)
.forOptions(availableSchematics)
.titled(availableSchematicsTitle.plainCopy())
.writingTo(schematicsLabel);
schematicsArea.onChanged();
widgets.add(schematicsArea);
} else {
schematicsArea = null;
schematicsLabel.text = TextComponent.EMPTY;
}
}
return super.mouseClicked(p_mouseClicked_1_, p_mouseClicked_3_, p_mouseClicked_5_);
}
@Override @Override
public List<Rect2i> getExtraAreas() { public List<Rect2i> getExtraAreas() {
return extraAreas; return extraAreas;

View file

@ -2,9 +2,9 @@ package com.simibubi.create.content.schematics.block;
import java.util.List; import java.util.List;
import com.simibubi.create.foundation.gui.IInteractionChecker;
import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.SmartTileEntity;
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
import com.simibubi.create.foundation.utility.IInteractionChecker;
import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.foundation.utility.Lang;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;

View file

@ -1,82 +1,64 @@
package com.simibubi.create.content.schematics.block; package com.simibubi.create.content.schematics.block;
import com.simibubi.create.AllContainerTypes; import com.simibubi.create.AllContainerTypes;
import com.simibubi.create.foundation.gui.container.ContainerBase;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.multiplayer.ClientLevel;
import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Inventory;
import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.player.Player;
import net.minecraft.world.inventory.AbstractContainerMenu;
import net.minecraft.world.inventory.MenuType; import net.minecraft.world.inventory.MenuType;
import net.minecraft.world.inventory.Slot; import net.minecraft.world.inventory.Slot;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraftforge.items.SlotItemHandler; import net.minecraftforge.items.SlotItemHandler;
public class SchematicannonContainer extends AbstractContainerMenu { public class SchematicannonContainer extends ContainerBase<SchematicannonTileEntity> {
private SchematicannonTileEntity te;
private Player player;
public SchematicannonContainer(MenuType<?> type, int id, Inventory inv, FriendlyByteBuf buffer) { public SchematicannonContainer(MenuType<?> type, int id, Inventory inv, FriendlyByteBuf buffer) {
super(type, id); super(type, id, inv, buffer);
player = inv.player;
ClientLevel world = Minecraft.getInstance().level;
BlockEntity tileEntity = world.getBlockEntity(buffer.readBlockPos());
if (tileEntity instanceof SchematicannonTileEntity) {
this.te = (SchematicannonTileEntity) tileEntity;
this.te.handleUpdateTag(buffer.readNbt());
init();
}
} }
public SchematicannonContainer(MenuType<?> type, int id, Inventory inv, SchematicannonTileEntity te) { public SchematicannonContainer(MenuType<?> type, int id, Inventory inv, SchematicannonTileEntity te) {
super(type, id); super(type, id, inv, te);
player = inv.player;
this.te = te;
init();
} }
public static SchematicannonContainer create(int id, Inventory inv, SchematicannonTileEntity te) { public static SchematicannonContainer create(int id, Inventory inv, SchematicannonTileEntity te) {
return new SchematicannonContainer(AllContainerTypes.SCHEMATICANNON.get(), id, inv, te); return new SchematicannonContainer(AllContainerTypes.SCHEMATICANNON.get(), id, inv, te);
} }
protected void init() { @Override
protected SchematicannonTileEntity createOnClient(FriendlyByteBuf extraData) {
ClientLevel world = Minecraft.getInstance().level;
BlockEntity tileEntity = world.getBlockEntity(extraData.readBlockPos());
if (tileEntity instanceof SchematicannonTileEntity schematicannon) {
schematicannon.handleUpdateTag(extraData.readNbt());
return schematicannon;
}
return null;
}
@Override
protected void initAndReadInventory(SchematicannonTileEntity contentHolder) {
}
@Override
protected void addSlots() {
int x = 0; int x = 0;
int y = 0; int y = 0;
addSlot(new SlotItemHandler(te.inventory, 0, x + 15, y + 65)); addSlot(new SlotItemHandler(contentHolder.inventory, 0, x + 15, y + 65));
addSlot(new SlotItemHandler(te.inventory, 1, x + 171, y + 65)); addSlot(new SlotItemHandler(contentHolder.inventory, 1, x + 171, y + 65));
addSlot(new SlotItemHandler(te.inventory, 2, x + 134, y + 19)); addSlot(new SlotItemHandler(contentHolder.inventory, 2, x + 134, y + 19));
addSlot(new SlotItemHandler(te.inventory, 3, x + 174, y + 19)); addSlot(new SlotItemHandler(contentHolder.inventory, 3, x + 174, y + 19));
addSlot(new SlotItemHandler(te.inventory, 4, x + 15, y + 19)); addSlot(new SlotItemHandler(contentHolder.inventory, 4, x + 15, y + 19));
int invX = 37; addPlayerSlots(37, 161);
int invY = 161;
// player Slots
for (int row = 0; row < 3; ++row)
for (int col = 0; col < 9; ++col)
addSlot(new Slot(player.getInventory(), col + row * 9 + 9, invX + col * 18, invY + row * 18));
for (int hotbarSlot = 0; hotbarSlot < 9; ++hotbarSlot)
addSlot(new Slot(player.getInventory(), hotbarSlot, invX + hotbarSlot * 18, invY + 58));
broadcastChanges();
} }
@Override @Override
public boolean stillValid(Player player) { protected void saveData(SchematicannonTileEntity contentHolder) {
return te != null && te.canPlayerUse(player);
}
@Override
public void removed(Player playerIn) {
super.removed(playerIn);
}
public SchematicannonTileEntity getTileEntity() {
return te;
} }
@Override @Override

View file

@ -14,13 +14,13 @@ import com.mojang.blaze3d.vertex.PoseStack;
import com.simibubi.create.AllBlocks; import com.simibubi.create.AllBlocks;
import com.simibubi.create.content.schematics.packet.ConfigureSchematicannonPacket; import com.simibubi.create.content.schematics.packet.ConfigureSchematicannonPacket;
import com.simibubi.create.content.schematics.packet.ConfigureSchematicannonPacket.Option; import com.simibubi.create.content.schematics.packet.ConfigureSchematicannonPacket.Option;
import com.simibubi.create.foundation.gui.AbstractSimiContainerScreen;
import com.simibubi.create.foundation.gui.AllGuiTextures; import com.simibubi.create.foundation.gui.AllGuiTextures;
import com.simibubi.create.foundation.gui.AllIcons; import com.simibubi.create.foundation.gui.AllIcons;
import com.simibubi.create.foundation.gui.GuiGameElement; import com.simibubi.create.foundation.gui.container.AbstractSimiContainerScreen;
import com.simibubi.create.foundation.gui.widgets.IconButton; import com.simibubi.create.foundation.gui.element.GuiGameElement;
import com.simibubi.create.foundation.gui.widgets.Indicator; import com.simibubi.create.foundation.gui.widget.IconButton;
import com.simibubi.create.foundation.gui.widgets.Indicator.State; import com.simibubi.create.foundation.gui.widget.Indicator;
import com.simibubi.create.foundation.gui.widget.Indicator.State;
import com.simibubi.create.foundation.item.ItemDescription.Palette; import com.simibubi.create.foundation.item.ItemDescription.Palette;
import com.simibubi.create.foundation.item.TooltipHelper; import com.simibubi.create.foundation.item.TooltipHelper;
import com.simibubi.create.foundation.networking.AllPackets; import com.simibubi.create.foundation.networking.AllPackets;
@ -39,6 +39,19 @@ public class SchematicannonScreen extends AbstractSimiContainerScreen<Schematica
private static final AllGuiTextures BG_BOTTOM = AllGuiTextures.SCHEMATICANNON_BOTTOM; private static final AllGuiTextures BG_BOTTOM = AllGuiTextures.SCHEMATICANNON_BOTTOM;
private static final AllGuiTextures BG_TOP = AllGuiTextures.SCHEMATICANNON_TOP; private static final AllGuiTextures BG_TOP = AllGuiTextures.SCHEMATICANNON_TOP;
private final Component listPrinter = Lang.translate("gui.schematicannon.listPrinter");
private final String _gunpowderLevel = "gui.schematicannon.gunpowderLevel";
private final String _shotsRemaining = "gui.schematicannon.shotsRemaining";
private final String _showSettings = "gui.schematicannon.showOptions";
private final String _shotsRemainingWithBackup = "gui.schematicannon.shotsRemainingWithBackup";
private final String _slotGunpowder = "gui.schematicannon.slot.gunpowder";
private final String _slotListPrinter = "gui.schematicannon.slot.listPrinter";
private final String _slotSchematic = "gui.schematicannon.slot.schematic";
private final Component optionEnabled = Lang.translate("gui.schematicannon.optionEnabled");
private final Component optionDisabled = Lang.translate("gui.schematicannon.optionDisabled");
protected Vector<Indicator> replaceLevelIndicators; protected Vector<Indicator> replaceLevelIndicators;
protected Vector<IconButton> replaceLevelButtons; protected Vector<IconButton> replaceLevelButtons;
@ -54,28 +67,16 @@ public class SchematicannonScreen extends AbstractSimiContainerScreen<Schematica
protected IconButton resetButton; protected IconButton resetButton;
protected Indicator resetIndicator; protected Indicator resetIndicator;
private List<Rect2i> extraAreas = Collections.emptyList();
protected List<AbstractWidget> placementSettingWidgets;
private final Component listPrinter = Lang.translate("gui.schematicannon.listPrinter");
private final String _gunpowderLevel = "gui.schematicannon.gunpowderLevel";
private final String _shotsRemaining = "gui.schematicannon.shotsRemaining";
private final String _showSettings = "gui.schematicannon.showOptions";
private final String _shotsRemainingWithBackup = "gui.schematicannon.shotsRemainingWithBackup";
private final String _slotGunpowder = "gui.schematicannon.slot.gunpowder";
private final String _slotListPrinter = "gui.schematicannon.slot.listPrinter";
private final String _slotSchematic = "gui.schematicannon.slot.schematic";
private final Component optionEnabled = Lang.translate("gui.schematicannon.optionEnabled");
private final Component optionDisabled = Lang.translate("gui.schematicannon.optionDisabled");
private final ItemStack renderedItem = AllBlocks.SCHEMATICANNON.asStack();
private IconButton confirmButton; private IconButton confirmButton;
private IconButton showSettingsButton; private IconButton showSettingsButton;
private Indicator showSettingsIndicator; private Indicator showSettingsIndicator;
protected List<AbstractWidget> placementSettingWidgets;
private final ItemStack renderedItem = AllBlocks.SCHEMATICANNON.asStack();
private List<Rect2i> extraAreas = Collections.emptyList();
public SchematicannonScreen(SchematicannonContainer container, Inventory inventory, Component title) { public SchematicannonScreen(SchematicannonContainer container, Inventory inventory, Component title) {
super(container, inventory, title); super(container, inventory, title);
placementSettingWidgets = new ArrayList<>(); placementSettingWidgets = new ArrayList<>();
@ -84,31 +85,46 @@ public class SchematicannonScreen extends AbstractSimiContainerScreen<Schematica
@Override @Override
protected void init() { protected void init() {
setWindowSize(BG_TOP.width, BG_TOP.height + BG_BOTTOM.height + 2 + AllGuiTextures.PLAYER_INVENTORY.height); setWindowSize(BG_TOP.width, BG_TOP.height + BG_BOTTOM.height + 2 + AllGuiTextures.PLAYER_INVENTORY.height);
setWindowOffset(-10 + (width % 2 == 0 ? 0 : -1), 0); setWindowOffset(-11, 0);
super.init(); super.init();
widgets.clear();
int x = leftPos; int x = leftPos;
int y = topPos; int y = topPos;
// Play Pause Stop // Play Pause Stop
playButton = new IconButton(x + 75, y + 86, AllIcons.I_PLAY); playButton = new IconButton(x + 75, y + 86, AllIcons.I_PLAY);
playButton.withCallback(() -> {
sendOptionUpdate(Option.PLAY, true);
});
playIndicator = new Indicator(x + 75, y + 79, TextComponent.EMPTY); playIndicator = new Indicator(x + 75, y + 79, TextComponent.EMPTY);
pauseButton = new IconButton(x + 93, y + 86, AllIcons.I_PAUSE); pauseButton = new IconButton(x + 93, y + 86, AllIcons.I_PAUSE);
pauseButton.withCallback(() -> {
sendOptionUpdate(Option.PAUSE, true);
});
pauseIndicator = new Indicator(x + 93, y + 79, TextComponent.EMPTY); pauseIndicator = new Indicator(x + 93, y + 79, TextComponent.EMPTY);
resetButton = new IconButton(x + 111, y + 86, AllIcons.I_STOP); resetButton = new IconButton(x + 111, y + 86, AllIcons.I_STOP);
resetButton.withCallback(() -> {
sendOptionUpdate(Option.STOP, true);
});
resetIndicator = new Indicator(x + 111, y + 79, TextComponent.EMPTY); resetIndicator = new Indicator(x + 111, y + 79, TextComponent.EMPTY);
resetIndicator.state = State.RED; resetIndicator.state = State.RED;
Collections.addAll(widgets, playButton, playIndicator, pauseButton, pauseIndicator, resetButton, addRenderableWidgets(playButton, playIndicator, pauseButton, pauseIndicator, resetButton,
resetIndicator); resetIndicator);
confirmButton = new IconButton(x + 180, y + 117, AllIcons.I_CONFIRM); confirmButton = new IconButton(x + 180, y + 117, AllIcons.I_CONFIRM);
widgets.add(confirmButton); confirmButton.withCallback(() -> {
minecraft.player.closeContainer();
});
addRenderableWidget(confirmButton);
showSettingsButton = new IconButton(x + 9, y + 117, AllIcons.I_PLACEMENT_SETTINGS); showSettingsButton = new IconButton(x + 9, y + 117, AllIcons.I_PLACEMENT_SETTINGS);
showSettingsButton.withCallback(() -> {
showSettingsIndicator.state = placementSettingsHidden() ? State.GREEN : State.OFF;
initPlacementSettings();
});
showSettingsButton.setToolTip(Lang.translate(_showSettings)); showSettingsButton.setToolTip(Lang.translate(_showSettings));
widgets.add(showSettingsButton); addRenderableWidget(showSettingsButton);
showSettingsIndicator = new Indicator(x + 9, y + 111, TextComponent.EMPTY); showSettingsIndicator = new Indicator(x + 9, y + 111, TextComponent.EMPTY);
widgets.add(showSettingsIndicator); addRenderableWidget(showSettingsIndicator);
extraAreas = ImmutableList.of(new Rect2i(x + BG_TOP.width, y + BG_TOP.height + BG_BOTTOM.height - 62, 84, 92)); extraAreas = ImmutableList.of(new Rect2i(x + BG_TOP.width, y + BG_TOP.height + BG_BOTTOM.height - 62, 84, 92));
@ -116,7 +132,7 @@ public class SchematicannonScreen extends AbstractSimiContainerScreen<Schematica
} }
private void initPlacementSettings() { private void initPlacementSettings() {
widgets.removeAll(placementSettingWidgets); removeWidgets(placementSettingWidgets);
placementSettingWidgets.clear(); placementSettingWidgets.clear();
if (placementSettingsHidden()) if (placementSettingsHidden())
@ -137,25 +153,36 @@ public class SchematicannonScreen extends AbstractSimiContainerScreen<Schematica
for (int i = 0; i < 4; i++) { for (int i = 0; i < 4; i++) {
replaceLevelIndicators.add(new Indicator(x + 33 + i * 18, y + 111, TextComponent.EMPTY)); replaceLevelIndicators.add(new Indicator(x + 33 + i * 18, y + 111, TextComponent.EMPTY));
replaceLevelButtons.add(new IconButton(x + 33 + i * 18, y + 117, icons.get(i))); IconButton replaceLevelButton = new IconButton(x + 33 + i * 18, y + 117, icons.get(i));
replaceLevelButtons.get(i) int replaceMode = i;
.setToolTip(toolTips.get(i)); replaceLevelButton.withCallback(() -> {
if (menu.contentHolder.replaceMode != replaceMode)
sendOptionUpdate(Option.values()[replaceMode], true);
});
replaceLevelButton.setToolTip(toolTips.get(i));
replaceLevelButtons.add(replaceLevelButton);
} }
placementSettingWidgets.addAll(replaceLevelButtons); placementSettingWidgets.addAll(replaceLevelButtons);
placementSettingWidgets.addAll(replaceLevelIndicators); placementSettingWidgets.addAll(replaceLevelIndicators);
// Other Settings // Other Settings
skipMissingButton = new IconButton(x + 111, y + 117, AllIcons.I_SKIP_MISSING); skipMissingButton = new IconButton(x + 111, y + 117, AllIcons.I_SKIP_MISSING);
skipMissingButton.withCallback(() -> {
sendOptionUpdate(Option.SKIP_MISSING, !menu.contentHolder.skipMissing);
});
skipMissingButton.setToolTip(Lang.translate("gui.schematicannon.option.skipMissing")); skipMissingButton.setToolTip(Lang.translate("gui.schematicannon.option.skipMissing"));
skipMissingIndicator = new Indicator(x + 111, y + 111, TextComponent.EMPTY); skipMissingIndicator = new Indicator(x + 111, y + 111, TextComponent.EMPTY);
Collections.addAll(placementSettingWidgets, skipMissingButton, skipMissingIndicator); Collections.addAll(placementSettingWidgets, skipMissingButton, skipMissingIndicator);
skipTilesButton = new IconButton(x + 129, y + 117, AllIcons.I_SKIP_TILES); skipTilesButton = new IconButton(x + 129, y + 117, AllIcons.I_SKIP_TILES);
skipTilesButton.withCallback(() -> {
sendOptionUpdate(Option.SKIP_TILES, !menu.contentHolder.replaceTileEntities);
});
skipTilesButton.setToolTip(Lang.translate("gui.schematicannon.option.skipTileEntities")); skipTilesButton.setToolTip(Lang.translate("gui.schematicannon.option.skipTileEntities"));
skipTilesIndicator = new Indicator(x + 129, y + 111, TextComponent.EMPTY); skipTilesIndicator = new Indicator(x + 129, y + 111, TextComponent.EMPTY);
Collections.addAll(placementSettingWidgets, skipTilesButton, skipTilesIndicator); Collections.addAll(placementSettingWidgets, skipTilesButton, skipTilesIndicator);
widgets.addAll(placementSettingWidgets); addRenderableWidgets(placementSettingWidgets);
} }
protected boolean placementSettingsHidden() { protected boolean placementSettingsHidden() {
@ -164,11 +191,15 @@ public class SchematicannonScreen extends AbstractSimiContainerScreen<Schematica
@Override @Override
protected void containerTick() { protected void containerTick() {
SchematicannonTileEntity te = menu.getTileEntity(); super.containerTick();
SchematicannonTileEntity te = menu.contentHolder;
if (!placementSettingsHidden()) { if (!placementSettingsHidden()) {
for (int replaceMode = 0; replaceMode < replaceLevelButtons.size(); replaceMode++) for (int replaceMode = 0; replaceMode < replaceLevelButtons.size(); replaceMode++) {
replaceLevelButtons.get(replaceMode).active = replaceMode != te.replaceMode;
replaceLevelIndicators.get(replaceMode).state = replaceMode == te.replaceMode ? State.ON : State.OFF; replaceLevelIndicators.get(replaceMode).state = replaceMode == te.replaceMode ? State.ON : State.OFF;
}
skipMissingIndicator.state = te.skipMissing ? State.ON : State.OFF; skipMissingIndicator.state = te.skipMissing ? State.ON : State.OFF;
skipTilesIndicator.state = !te.replaceTileEntities ? State.ON : State.OFF; skipTilesIndicator.state = !te.replaceTileEntities ? State.ON : State.OFF;
} }
@ -241,7 +272,7 @@ public class SchematicannonScreen extends AbstractSimiContainerScreen<Schematica
} }
@Override @Override
protected void renderWindow(PoseStack ms, int mouseX, int mouseY, float partialTicks) { protected void renderBg(PoseStack ms, float partialTicks, int mouseX, int mouseY) {
int invX = getLeftOfCentered(AllGuiTextures.PLAYER_INVENTORY.width); int invX = getLeftOfCentered(AllGuiTextures.PLAYER_INVENTORY.width);
int invY = topPos + BG_TOP.height + BG_BOTTOM.height + 2; int invY = topPos + BG_TOP.height + BG_BOTTOM.height + 2;
renderPlayerInventory(ms, invX, invY); renderPlayerInventory(ms, invX, invY);
@ -249,10 +280,10 @@ public class SchematicannonScreen extends AbstractSimiContainerScreen<Schematica
int x = leftPos; int x = leftPos;
int y = topPos; int y = topPos;
BG_TOP.draw(ms, this, x, y); BG_TOP.render(ms, x, y, this);
BG_BOTTOM.draw(ms, this, x, y + BG_TOP.height); BG_BOTTOM.render(ms, x, y + BG_TOP.height, this);
SchematicannonTileEntity te = menu.getTileEntity(); SchematicannonTileEntity te = menu.contentHolder;
renderPrintingProgress(ms, x, y, te.schematicProgress); renderPrintingProgress(ms, x, y, te.schematicProgress);
renderFuelBar(ms, x, y, te.fuelLevel); renderFuelBar(ms, x, y, te.fuelLevel);
renderChecklistPrinterProgress(ms, x, y, te.bookPrintingProgress); renderChecklistPrinterProgress(ms, x, y, te.bookPrintingProgress);
@ -283,7 +314,7 @@ public class SchematicannonScreen extends AbstractSimiContainerScreen<Schematica
} }
protected void renderBlueprintHighlight(PoseStack matrixStack, int x, int y) { protected void renderBlueprintHighlight(PoseStack matrixStack, int x, int y) {
AllGuiTextures.SCHEMATICANNON_HIGHLIGHT.draw(matrixStack, this, x + 10, y + 60); AllGuiTextures.SCHEMATICANNON_HIGHLIGHT.render(matrixStack, x + 10, y + 60, this);
} }
protected void renderPrintingProgress(PoseStack matrixStack, int x, int y, float progress) { protected void renderPrintingProgress(PoseStack matrixStack, int x, int y, float progress) {
@ -302,8 +333,8 @@ public class SchematicannonScreen extends AbstractSimiContainerScreen<Schematica
protected void renderFuelBar(PoseStack matrixStack, int x, int y, float amount) { protected void renderFuelBar(PoseStack matrixStack, int x, int y, float amount) {
AllGuiTextures sprite = AllGuiTextures.SCHEMATICANNON_FUEL; AllGuiTextures sprite = AllGuiTextures.SCHEMATICANNON_FUEL;
if (menu.getTileEntity().hasCreativeCrate) { if (menu.contentHolder.hasCreativeCrate) {
AllGuiTextures.SCHEMATICANNON_FUEL_CREATIVE.draw(matrixStack, this, x + 36, y + 19); AllGuiTextures.SCHEMATICANNON_FUEL_CREATIVE.render(matrixStack, x + 36, y + 19, this);
return; return;
} }
sprite.bind(); sprite.bind();
@ -311,8 +342,8 @@ public class SchematicannonScreen extends AbstractSimiContainerScreen<Schematica
} }
@Override @Override
protected void renderWindowForeground(PoseStack matrixStack, int mouseX, int mouseY, float partialTicks) { protected void renderForeground(PoseStack matrixStack, int mouseX, int mouseY, float partialTicks) {
SchematicannonTileEntity te = menu.getTileEntity(); SchematicannonTileEntity te = menu.contentHolder;
int x = leftPos; int x = leftPos;
int y = topPos; int y = topPos;
@ -348,7 +379,7 @@ public class SchematicannonScreen extends AbstractSimiContainerScreen<Schematica
if (mouseX >= paperX && mouseY >= paperY && mouseX <= paperX + 16 && mouseY <= paperY + 16) if (mouseX >= paperX && mouseY >= paperY && mouseX <= paperX + 16 && mouseY <= paperY + 16)
renderTooltip(matrixStack, listPrinter, mouseX, mouseY); renderTooltip(matrixStack, listPrinter, mouseX, mouseY);
super.renderWindowForeground(matrixStack, mouseX, mouseY, partialTicks); super.renderForeground(matrixStack, mouseX, mouseY, partialTicks);
} }
protected List<Component> getFuelLevelTooltip(SchematicannonTileEntity te) { protected List<Component> getFuelLevelTooltip(SchematicannonTileEntity te) {
@ -380,41 +411,8 @@ public class SchematicannonScreen extends AbstractSimiContainerScreen<Schematica
return tooltip; return tooltip;
} }
@Override protected void sendOptionUpdate(Option option, boolean set) {
public boolean mouseClicked(double x, double y, int button) { AllPackets.channel.sendToServer(new ConfigureSchematicannonPacket(option, set));
if (showSettingsButton.isHovered()) {
showSettingsIndicator.state = placementSettingsHidden() ? State.GREEN : State.OFF;
initPlacementSettings();
}
if (confirmButton.isHovered()) {
minecraft.player.closeContainer();
return true;
}
if (!placementSettingsHidden()) {
for (int replaceMode = 0; replaceMode < replaceLevelButtons.size(); replaceMode++) {
if (!replaceLevelButtons.get(replaceMode)
.isHovered())
continue;
if (menu.getTileEntity().replaceMode == replaceMode)
continue;
sendOptionUpdate(Option.values()[replaceMode], true);
}
if (skipMissingButton.isHovered())
sendOptionUpdate(Option.SKIP_MISSING, !menu.getTileEntity().skipMissing);
if (skipTilesButton.isHovered())
sendOptionUpdate(Option.SKIP_TILES, !menu.getTileEntity().replaceTileEntities);
}
if (playButton.isHovered() && playButton.active)
sendOptionUpdate(Option.PLAY, true);
if (pauseButton.isHovered() && pauseButton.active)
sendOptionUpdate(Option.PAUSE, true);
if (resetButton.isHovered() && resetButton.active)
sendOptionUpdate(Option.STOP, true);
return super.mouseClicked(x, y, button);
} }
@Override @Override
@ -422,8 +420,4 @@ public class SchematicannonScreen extends AbstractSimiContainerScreen<Schematica
return extraAreas; return extraAreas;
} }
protected void sendOptionUpdate(Option option, boolean set) {
AllPackets.channel.sendToServer(new ConfigureSchematicannonPacket(option, set));
}
} }

View file

@ -1,6 +1,5 @@
package com.simibubi.create.content.schematics.client; package com.simibubi.create.content.schematics.client;
import java.util.Collections;
import java.util.List; import java.util.List;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.PoseStack;
@ -9,11 +8,11 @@ import com.simibubi.create.CreateClient;
import com.simibubi.create.foundation.gui.AbstractSimiScreen; import com.simibubi.create.foundation.gui.AbstractSimiScreen;
import com.simibubi.create.foundation.gui.AllGuiTextures; import com.simibubi.create.foundation.gui.AllGuiTextures;
import com.simibubi.create.foundation.gui.AllIcons; import com.simibubi.create.foundation.gui.AllIcons;
import com.simibubi.create.foundation.gui.GuiGameElement; import com.simibubi.create.foundation.gui.element.GuiGameElement;
import com.simibubi.create.foundation.gui.widgets.IconButton; import com.simibubi.create.foundation.gui.widget.IconButton;
import com.simibubi.create.foundation.gui.widgets.Label; import com.simibubi.create.foundation.gui.widget.Label;
import com.simibubi.create.foundation.gui.widgets.ScrollInput; import com.simibubi.create.foundation.gui.widget.ScrollInput;
import com.simibubi.create.foundation.gui.widgets.SelectionScrollInput; import com.simibubi.create.foundation.gui.widget.SelectionScrollInput;
import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.foundation.utility.Lang;
import net.minecraft.client.gui.components.EditBox; import net.minecraft.client.gui.components.EditBox;
@ -28,13 +27,6 @@ import net.minecraft.world.level.levelgen.structure.templatesystem.StructurePlac
public class SchematicEditScreen extends AbstractSimiScreen { public class SchematicEditScreen extends AbstractSimiScreen {
private AllGuiTextures background;
private EditBox xInput;
private EditBox yInput;
private EditBox zInput;
private IconButton confirmButton;
private final List<Component> rotationOptions = private final List<Component> rotationOptions =
Lang.translatedOptions("schematic.rotation", "none", "cw90", "cw180", "cw270"); Lang.translatedOptions("schematic.rotation", "none", "cw90", "cw180", "cw270");
private final List<Component> mirrorOptions = private final List<Component> mirrorOptions =
@ -42,12 +34,18 @@ public class SchematicEditScreen extends AbstractSimiScreen {
private final Component rotationLabel = Lang.translate("schematic.rotation"); private final Component rotationLabel = Lang.translate("schematic.rotation");
private final Component mirrorLabel = Lang.translate("schematic.mirror"); private final Component mirrorLabel = Lang.translate("schematic.mirror");
private AllGuiTextures background;
private EditBox xInput;
private EditBox yInput;
private EditBox zInput;
private IconButton confirmButton;
private ScrollInput rotationArea; private ScrollInput rotationArea;
private ScrollInput mirrorArea; private ScrollInput mirrorArea;
private SchematicHandler handler; private SchematicHandler handler;
public SchematicEditScreen() { public SchematicEditScreen() {
super();
background = AllGuiTextures.SCHEMATIC; background = AllGuiTextures.SCHEMATIC;
handler = CreateClient.SCHEMATIC_HANDLER; handler = CreateClient.SCHEMATIC_HANDLER;
} }
@ -57,7 +55,6 @@ public class SchematicEditScreen extends AbstractSimiScreen {
setWindowSize(background.width, background.height); setWindowSize(background.width, background.height);
setWindowOffset(-6, 0); setWindowOffset(-6, 0);
super.init(); super.init();
widgets.clear();
int x = guiLeft; int x = guiLeft;
int y = guiTop; int y = guiTop;
@ -113,12 +110,15 @@ public class SchematicEditScreen extends AbstractSimiScreen {
.ordinal()) .ordinal())
.writingTo(labelM); .writingTo(labelM);
Collections.addAll(widgets, xInput, yInput, zInput); addRenderableWidgets(xInput, yInput, zInput);
Collections.addAll(widgets, labelR, labelM, rotationArea, mirrorArea); addRenderableWidgets(labelR, labelM, rotationArea, mirrorArea);
confirmButton = confirmButton =
new IconButton(x + background.width - 33, y + background.height - 24, AllIcons.I_CONFIRM); new IconButton(x + background.width - 33, y + background.height - 24, AllIcons.I_CONFIRM);
widgets.add(confirmButton); confirmButton.withCallback(() -> {
onClose();
});
addRenderableWidget(confirmButton);
} }
@Override @Override
@ -155,7 +155,7 @@ public class SchematicEditScreen extends AbstractSimiScreen {
int x = guiLeft; int x = guiLeft;
int y = guiTop; int y = guiTop;
background.draw(ms, this, x, y); background.render(ms, x, y, this);
String title = handler.getCurrentSchematicName(); String title = handler.getCurrentSchematicName();
drawCenteredString(ms, font, title, x + (background.width - 8) / 2, y + 3, 0xFFFFFF); drawCenteredString(ms, font, title, x + (background.width - 8) / 2, y + 3, 0xFFFFFF);
@ -196,14 +196,4 @@ public class SchematicEditScreen extends AbstractSimiScreen {
} }
} }
@Override
public boolean mouseClicked(double x, double y, int button) {
if (confirmButton.isHovered()) {
onClose();
return true;
}
return super.mouseClicked(x, y, button);
}
} }

View file

@ -16,7 +16,7 @@ public class SchematicHotbarSlotOverlay extends GuiComponent {
int y = mainWindow.getGuiScaledHeight() - 19; int y = mainWindow.getGuiScaledHeight() - 19;
RenderSystem.enableDepthTest(); RenderSystem.enableDepthTest();
matrixStack.pushPose(); matrixStack.pushPose();
AllGuiTextures.SCHEMATIC_SLOT.draw(matrixStack, this, x + 20 * slot, y); AllGuiTextures.SCHEMATIC_SLOT.render(matrixStack, x + 20 * slot, y, this);
matrixStack.popPose(); matrixStack.popPose();
} }

View file

@ -8,8 +8,8 @@ import com.simibubi.create.CreateClient;
import com.simibubi.create.foundation.gui.AbstractSimiScreen; import com.simibubi.create.foundation.gui.AbstractSimiScreen;
import com.simibubi.create.foundation.gui.AllGuiTextures; import com.simibubi.create.foundation.gui.AllGuiTextures;
import com.simibubi.create.foundation.gui.AllIcons; import com.simibubi.create.foundation.gui.AllIcons;
import com.simibubi.create.foundation.gui.GuiGameElement; import com.simibubi.create.foundation.gui.element.GuiGameElement;
import com.simibubi.create.foundation.gui.widgets.IconButton; import com.simibubi.create.foundation.gui.widget.IconButton;
import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.foundation.utility.Lang;
import net.minecraft.client.gui.components.EditBox; import net.minecraft.client.gui.components.EditBox;
@ -38,7 +38,6 @@ public class SchematicPromptScreen extends AbstractSimiScreen {
public void init() { public void init() {
setWindowSize(background.width, background.height); setWindowSize(background.width, background.height);
super.init(); super.init();
widgets.clear();
int x = guiLeft; int x = guiLeft;
int y = guiTop; int y = guiTop;
@ -49,23 +48,29 @@ public class SchematicPromptScreen extends AbstractSimiScreen {
nameField.setBordered(false); nameField.setBordered(false);
nameField.setMaxLength(35); nameField.setMaxLength(35);
nameField.changeFocus(true); nameField.changeFocus(true);
addRenderableWidget(nameField);
abort = new IconButton(x + 7, y + 53, AllIcons.I_TRASH); abort = new IconButton(x + 7, y + 53, AllIcons.I_TRASH);
abort.withCallback(() -> {
CreateClient.SCHEMATIC_AND_QUILL_HANDLER.discard();
onClose();
});
abort.setToolTip(abortLabel); abort.setToolTip(abortLabel);
widgets.add(abort); addRenderableWidget(abort);
confirm = new IconButton(x + 158, y + 53, AllIcons.I_CONFIRM); confirm = new IconButton(x + 158, y + 53, AllIcons.I_CONFIRM);
confirm.withCallback(() -> {
confirm(false);
});
confirm.setToolTip(confirmLabel); confirm.setToolTip(confirmLabel);
widgets.add(confirm); addRenderableWidget(confirm);
convert = new IconButton(x + 180, y + 53, AllIcons.I_SCHEMATIC); convert = new IconButton(x + 180, y + 53, AllIcons.I_SCHEMATIC);
convert.withCallback(() -> {
confirm(true);
});
convert.setToolTip(convertLabel); convert.setToolTip(convertLabel);
widgets.add(convert); addRenderableWidget(convert);
widgets.add(confirm);
widgets.add(convert);
widgets.add(abort);
widgets.add(nameField);
} }
@Override @Override
@ -73,8 +78,9 @@ public class SchematicPromptScreen extends AbstractSimiScreen {
int x = guiLeft; int x = guiLeft;
int y = guiTop; int y = guiTop;
background.draw(ms, this, x, y); background.render(ms, x, y, this);
drawCenteredString(ms, font, title, x + (background.width - 8) / 2, y + 3, 0xFFFFFF); drawCenteredString(ms, font, title, x + (background.width - 8) / 2, y + 3, 0xFFFFFF);
GuiGameElement.of(AllItems.SCHEMATIC.asStack()) GuiGameElement.of(AllItems.SCHEMATIC.asStack())
.at(x + 22, y + 23, 0) .at(x + 22, y + 23, 0)
.render(ms); .render(ms);
@ -98,27 +104,9 @@ public class SchematicPromptScreen extends AbstractSimiScreen {
return nameField.keyPressed(keyCode, p_keyPressed_2_, p_keyPressed_3_); return nameField.keyPressed(keyCode, p_keyPressed_2_, p_keyPressed_3_);
} }
@Override
public boolean mouseClicked(double x, double y, int button) {
if (confirm.isHovered()) {
confirm(false);
return true;
}
if (abort.isHovered()) {
CreateClient.SCHEMATIC_AND_QUILL_HANDLER.discard();
minecraft.player.closeContainer();
return true;
}
if (convert.isHovered()) {
confirm(true);
return true;
}
return super.mouseClicked(x, y, button);
}
private void confirm(boolean convertImmediately) { private void confirm(boolean convertImmediately) {
CreateClient.SCHEMATIC_AND_QUILL_HANDLER.saveSchematic(nameField.getValue(), convertImmediately); CreateClient.SCHEMATIC_AND_QUILL_HANDLER.saveSchematic(nameField.getValue(), convertImmediately);
minecraft.player.closeContainer(); onClose();
} }
} }

View file

@ -4,10 +4,10 @@ import static java.lang.Math.abs;
import com.jozufozu.flywheel.util.transform.MatrixTransformStack; import com.jozufozu.flywheel.util.transform.MatrixTransformStack;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.PoseStack;
import com.simibubi.create.foundation.gui.widgets.InterpolatedChasingAngle;
import com.simibubi.create.foundation.gui.widgets.InterpolatedChasingValue;
import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.AnimationTickHolder;
import com.simibubi.create.foundation.utility.VecHelper; import com.simibubi.create.foundation.utility.VecHelper;
import com.simibubi.create.foundation.utility.animation.InterpolatedChasingAngle;
import com.simibubi.create.foundation.utility.animation.InterpolatedChasingValue;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction.Axis; import net.minecraft.core.Direction.Axis;

View file

@ -40,7 +40,7 @@ public class ConfigureSchematicannonPacket extends SimplePacketBase {
if (player == null || !(player.containerMenu instanceof SchematicannonContainer)) if (player == null || !(player.containerMenu instanceof SchematicannonContainer))
return; return;
SchematicannonTileEntity te = ((SchematicannonContainer) player.containerMenu).getTileEntity(); SchematicannonTileEntity te = ((SchematicannonContainer) player.containerMenu).contentHolder;
switch (option) { switch (option) {
case DONT_REPLACE: case DONT_REPLACE:
case REPLACE_ANY: case REPLACE_ANY:

View file

@ -71,7 +71,7 @@ public class SchematicUploadPacket extends SimplePacketBase {
if (player == null) if (player == null)
return; return;
if (code == BEGIN) { if (code == BEGIN) {
BlockPos pos = ((SchematicTableContainer) player.containerMenu).getTileEntity() BlockPos pos = ((SchematicTableContainer) player.containerMenu).contentHolder
.getBlockPos(); .getBlockPos();
Create.SCHEMATIC_RECEIVER.handleNewUpload(player, schematic, size, pos); Create.SCHEMATIC_RECEIVER.handleNewUpload(player, schematic, size, pos);
} }

View file

@ -12,16 +12,15 @@ import com.mojang.blaze3d.vertex.PoseStack;
import com.simibubi.create.Create; import com.simibubi.create.Create;
import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.config.AllConfigs;
import com.simibubi.create.foundation.gui.AllIcons; import com.simibubi.create.foundation.gui.AllIcons;
import com.simibubi.create.foundation.gui.DelegatedStencilElement;
import com.simibubi.create.foundation.gui.ScreenOpener; import com.simibubi.create.foundation.gui.ScreenOpener;
import com.simibubi.create.foundation.gui.TextStencilElement;
import com.simibubi.create.foundation.gui.Theme; import com.simibubi.create.foundation.gui.Theme;
import com.simibubi.create.foundation.gui.UIRenderHelper; import com.simibubi.create.foundation.gui.UIRenderHelper;
import com.simibubi.create.foundation.gui.widgets.BoxWidget; import com.simibubi.create.foundation.gui.element.DelegatedStencilElement;
import com.simibubi.create.foundation.gui.element.TextStencilElement;
import com.simibubi.create.foundation.gui.widget.BoxWidget;
import com.simibubi.create.foundation.item.TooltipHelper; import com.simibubi.create.foundation.item.TooltipHelper;
import net.minecraft.ChatFormatting; import net.minecraft.ChatFormatting;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.gui.screens.Screen;
import net.minecraft.network.chat.TextComponent; import net.minecraft.network.chat.TextComponent;
import net.minecraftforge.common.ForgeConfigSpec; import net.minecraftforge.common.ForgeConfigSpec;
@ -142,12 +141,11 @@ public class BaseConfigScreen extends ConfigScreen {
@Override @Override
protected void init() { protected void init() {
widgets.clear();
super.init(); super.init();
returnOnClose = true; returnOnClose = true;
TextStencilElement clientText = new TextStencilElement(minecraft.font, new TextComponent(clientTile)).centered(true, true); TextStencilElement clientText = new TextStencilElement(minecraft.font, new TextComponent(clientTile)).centered(true, true);
widgets.add(clientConfigWidget = new BoxWidget(width / 2 - 100, height / 2 - 15 - 30, 200, 16).showingElement(clientText)); addRenderableWidget(clientConfigWidget = new BoxWidget(width / 2 - 100, height / 2 - 15 - 30, 200, 16).showingElement(clientText));
if (clientSpec != null) { if (clientSpec != null) {
clientConfigWidget.withCallback(() -> linkTo(new SubMenuConfigScreen(this, ModConfig.Type.CLIENT, clientSpec))); clientConfigWidget.withCallback(() -> linkTo(new SubMenuConfigScreen(this, ModConfig.Type.CLIENT, clientSpec)));
@ -159,7 +157,7 @@ public class BaseConfigScreen extends ConfigScreen {
} }
TextStencilElement commonText = new TextStencilElement(minecraft.font, new TextComponent(commonTile)).centered(true, true); TextStencilElement commonText = new TextStencilElement(minecraft.font, new TextComponent(commonTile)).centered(true, true);
widgets.add(commonConfigWidget = new BoxWidget(width / 2 - 100, height / 2 - 15, 200, 16).showingElement(commonText)); addRenderableWidget(commonConfigWidget = new BoxWidget(width / 2 - 100, height / 2 - 15, 200, 16).showingElement(commonText));
if (commonSpec != null) { if (commonSpec != null) {
commonConfigWidget.withCallback(() -> linkTo(new SubMenuConfigScreen(this, ModConfig.Type.COMMON, commonSpec))); commonConfigWidget.withCallback(() -> linkTo(new SubMenuConfigScreen(this, ModConfig.Type.COMMON, commonSpec)));
@ -171,13 +169,13 @@ public class BaseConfigScreen extends ConfigScreen {
} }
TextStencilElement serverText = new TextStencilElement(minecraft.font, new TextComponent(serverTile)).centered(true, true); TextStencilElement serverText = new TextStencilElement(minecraft.font, new TextComponent(serverTile)).centered(true, true);
widgets.add(serverConfigWidget = new BoxWidget(width / 2 - 100, height / 2 - 15 + 30, 200, 16).showingElement(serverText)); addRenderableWidget(serverConfigWidget = new BoxWidget(width / 2 - 100, height / 2 - 15 + 30, 200, 16).showingElement(serverText));
if (serverSpec == null) { if (serverSpec == null) {
serverConfigWidget.active = false; serverConfigWidget.active = false;
serverConfigWidget.updateColorsFromState(); serverConfigWidget.updateColorsFromState();
serverText.withElementRenderer(DISABLED_RENDERER); serverText.withElementRenderer(DISABLED_RENDERER);
} else if (Minecraft.getInstance().level == null) { } else if (minecraft.level == null) {
serverText.withElementRenderer(DISABLED_RENDERER); serverText.withElementRenderer(DISABLED_RENDERER);
serverConfigWidget.getToolTip() serverConfigWidget.getToolTip()
.add(new TextComponent("Stored individually per World")); .add(new TextComponent("Stored individually per World"));
@ -208,7 +206,7 @@ public class BaseConfigScreen extends ConfigScreen {
.showingElement(titleText.at(0, 7)); .showingElement(titleText.at(0, 7));
title.active = false; title.active = false;
widgets.add(title); addRenderableWidget(title);
ConfigScreen.modID = this.modID; ConfigScreen.modID = this.modID;
@ -219,13 +217,13 @@ public class BaseConfigScreen extends ConfigScreen {
.withElementRenderer(BoxWidget.gradientFactory.apply(goBack))); .withElementRenderer(BoxWidget.gradientFactory.apply(goBack)));
goBack.getToolTip() goBack.getToolTip()
.add(new TextComponent("Go Back")); .add(new TextComponent("Go Back"));
widgets.add(goBack); addRenderableWidget(goBack);
TextStencilElement othersText = new TextStencilElement(minecraft.font, new TextComponent("Access Configs of other Mods")).centered(true, true); TextStencilElement othersText = new TextStencilElement(minecraft.font, new TextComponent("Access Configs of other Mods")).centered(true, true);
others = new BoxWidget(width / 2 - 100, height / 2 - 15 + 90, 200, 16).showingElement(othersText); others = new BoxWidget(width / 2 - 100, height / 2 - 15 + 90, 200, 16).showingElement(othersText);
othersText.withElementRenderer(BoxWidget.gradientFactory.apply(others)); othersText.withElementRenderer(BoxWidget.gradientFactory.apply(others));
others.withCallback(() -> linkTo(new ConfigModListScreen(this))); others.withCallback(() -> linkTo(new ConfigModListScreen(this)));
widgets.add(others); addRenderableWidget(others);
} }

View file

@ -6,10 +6,10 @@ import java.util.Locale;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.PoseStack;
import com.simibubi.create.foundation.gui.AllIcons; import com.simibubi.create.foundation.gui.AllIcons;
import com.simibubi.create.foundation.gui.DelegatedStencilElement;
import com.simibubi.create.foundation.gui.ScreenOpener; import com.simibubi.create.foundation.gui.ScreenOpener;
import com.simibubi.create.foundation.gui.Theme; import com.simibubi.create.foundation.gui.Theme;
import com.simibubi.create.foundation.gui.widgets.BoxWidget; import com.simibubi.create.foundation.gui.element.DelegatedStencilElement;
import com.simibubi.create.foundation.gui.widget.BoxWidget;
import com.simibubi.create.foundation.item.TooltipHelper; import com.simibubi.create.foundation.item.TooltipHelper;
import net.minecraft.ChatFormatting; import net.minecraft.ChatFormatting;
@ -29,22 +29,15 @@ public class ConfigModListScreen extends ConfigScreen {
super(parent); super(parent);
} }
@Override
public void tick() {
super.tick();
list.tick();
}
@Override @Override
protected void init() { protected void init() {
widgets.clear();
super.init(); super.init();
int listWidth = Math.min(width - 80, 300); int listWidth = Math.min(width - 80, 300);
list = new ConfigScreenList(minecraft, listWidth, height - 60, 15, height - 45, 40); list = new ConfigScreenList(minecraft, listWidth, height - 60, 15, height - 45, 40);
list.setLeftPos(this.width / 2 - list.getWidth() / 2); list.setLeftPos(this.width / 2 - list.getWidth() / 2);
addWidget(list); addRenderableWidget(list);
allEntries = new ArrayList<>(); allEntries = new ArrayList<>();
ModList.get().getMods().stream().map(IModInfo::getModId).forEach(id -> allEntries.add(new ModEntry(id, this))); ModList.get().getMods().stream().map(IModInfo::getModId).forEach(id -> allEntries.add(new ModEntry(id, this)));
@ -64,20 +57,13 @@ public class ConfigModListScreen extends ConfigScreen {
.withElementRenderer(BoxWidget.gradientFactory.apply(goBack))); .withElementRenderer(BoxWidget.gradientFactory.apply(goBack)));
goBack.getToolTip() goBack.getToolTip()
.add(new TextComponent("Go Back")); .add(new TextComponent("Go Back"));
widgets.add(goBack); addRenderableWidget(goBack);
search = new HintableTextFieldWidget(font, width / 2 - listWidth / 2, height - 35, listWidth, 20); search = new HintableTextFieldWidget(font, width / 2 - listWidth / 2, height - 35, listWidth, 20);
search.setResponder(this::updateFilter); search.setResponder(this::updateFilter);
search.setHint("Search.."); search.setHint("Search..");
search.moveCursorToStart(); search.moveCursorToStart();
widgets.add(search); addRenderableWidget(search);
}
@Override
protected void renderWindow(PoseStack ms, int mouseX, int mouseY, float partialTicks) {
list.render(ms, mouseX, mouseY, partialTicks);
} }

View file

@ -9,7 +9,6 @@ import javax.annotation.Nonnull;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.apache.logging.log4j.util.TriConsumer; import org.apache.logging.log4j.util.TriConsumer;
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL20; import org.lwjgl.opengl.GL20;
import org.lwjgl.opengl.GL30; import org.lwjgl.opengl.GL30;
@ -23,10 +22,10 @@ import com.mojang.blaze3d.vertex.PoseStack;
import com.simibubi.create.AllBlocks; import com.simibubi.create.AllBlocks;
import com.simibubi.create.content.contraptions.relays.elementary.CogWheelBlock; import com.simibubi.create.content.contraptions.relays.elementary.CogWheelBlock;
import com.simibubi.create.foundation.gui.AbstractSimiScreen; import com.simibubi.create.foundation.gui.AbstractSimiScreen;
import com.simibubi.create.foundation.gui.GuiGameElement; import com.simibubi.create.foundation.gui.CreateMainMenuScreen;
import com.simibubi.create.foundation.gui.StencilElement;
import com.simibubi.create.foundation.gui.UIRenderHelper; import com.simibubi.create.foundation.gui.UIRenderHelper;
import com.simibubi.create.foundation.gui.mainMenu.CreateMainMenuScreen; import com.simibubi.create.foundation.gui.element.GuiGameElement;
import com.simibubi.create.foundation.gui.element.StencilElement;
import com.simibubi.create.foundation.utility.animation.Force; import com.simibubi.create.foundation.utility.animation.Force;
import com.simibubi.create.foundation.utility.animation.PhysicalFloat; import com.simibubi.create.foundation.utility.animation.PhysicalFloat;
@ -99,7 +98,7 @@ public abstract class ConfigScreen extends AbstractSimiScreen {
@Override @Override
protected void prepareFrame() { protected void prepareFrame() {
RenderTarget thisBuffer = UIRenderHelper.framebuffer; RenderTarget thisBuffer = UIRenderHelper.framebuffer;
RenderTarget mainBuffer = Minecraft.getInstance().getMainRenderTarget(); RenderTarget mainBuffer = minecraft.getMainRenderTarget();
GlCompat functions = Backend.getInstance().compat; GlCompat functions = Backend.getInstance().compat;
functions.fbo.bindFramebuffer(GL30.GL_READ_FRAMEBUFFER, mainBuffer.frameBufferId); functions.fbo.bindFramebuffer(GL30.GL_READ_FRAMEBUFFER, mainBuffer.frameBufferId);
@ -107,15 +106,13 @@ public abstract class ConfigScreen extends AbstractSimiScreen {
functions.blit.blitFramebuffer(0, 0, mainBuffer.viewWidth, mainBuffer.viewHeight, 0, 0, mainBuffer.viewWidth, mainBuffer.viewHeight, GL30.GL_COLOR_BUFFER_BIT, GL20.GL_LINEAR); functions.blit.blitFramebuffer(0, 0, mainBuffer.viewWidth, mainBuffer.viewHeight, 0, 0, mainBuffer.viewWidth, mainBuffer.viewHeight, GL30.GL_COLOR_BUFFER_BIT, GL20.GL_LINEAR);
functions.fbo.bindFramebuffer(GlConst.GL_FRAMEBUFFER, thisBuffer.frameBufferId); functions.fbo.bindFramebuffer(GlConst.GL_FRAMEBUFFER, thisBuffer.frameBufferId);
GL11.glClear(GL30.GL_STENCIL_BUFFER_BIT | GL30.GL_DEPTH_BUFFER_BIT); RenderSystem.clear(GL30.GL_STENCIL_BUFFER_BIT | GL30.GL_DEPTH_BUFFER_BIT, Minecraft.ON_OSX);
} }
@Override @Override
protected void endFrame() { protected void endFrame() {
RenderTarget thisBuffer = UIRenderHelper.framebuffer; RenderTarget thisBuffer = UIRenderHelper.framebuffer;
RenderTarget mainBuffer = Minecraft.getInstance().getMainRenderTarget(); RenderTarget mainBuffer = minecraft.getMainRenderTarget();
GlCompat functions = Backend.getInstance().compat; GlCompat functions = Backend.getInstance().compat;
functions.fbo.bindFramebuffer(GL30.GL_READ_FRAMEBUFFER, thisBuffer.frameBufferId); functions.fbo.bindFramebuffer(GL30.GL_READ_FRAMEBUFFER, thisBuffer.frameBufferId);

View file

@ -7,15 +7,15 @@ import java.util.Locale;
import java.util.Map; import java.util.Map;
import java.util.Optional; import java.util.Optional;
import org.lwjgl.opengl.GL11; import com.mojang.blaze3d.platform.GlStateManager;
import com.mojang.blaze3d.platform.Window; import com.mojang.blaze3d.platform.Window;
import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.systems.RenderSystem;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.PoseStack;
import com.simibubi.create.foundation.config.ui.entries.NumberEntry; import com.simibubi.create.foundation.config.ui.entries.NumberEntry;
import com.simibubi.create.foundation.gui.TextStencilElement;
import com.simibubi.create.foundation.gui.Theme; import com.simibubi.create.foundation.gui.Theme;
import com.simibubi.create.foundation.gui.TickableGuiEventListener;
import com.simibubi.create.foundation.gui.UIRenderHelper; import com.simibubi.create.foundation.gui.UIRenderHelper;
import com.simibubi.create.foundation.gui.element.TextStencilElement;
import com.simibubi.create.foundation.utility.Color; import com.simibubi.create.foundation.utility.Color;
import com.simibubi.create.foundation.utility.animation.LerpedFloat; import com.simibubi.create.foundation.utility.animation.LerpedFloat;
@ -30,7 +30,7 @@ import net.minecraft.network.chat.MutableComponent;
import net.minecraft.network.chat.TextComponent; import net.minecraft.network.chat.TextComponent;
import net.minecraftforge.fmlclient.gui.GuiUtils; import net.minecraftforge.fmlclient.gui.GuiUtils;
public class ConfigScreenList extends ObjectSelectionList<ConfigScreenList.Entry> { public class ConfigScreenList extends ObjectSelectionList<ConfigScreenList.Entry> implements TickableGuiEventListener {
public static EditBox currentText; public static EditBox currentText;
@ -56,7 +56,7 @@ public class ConfigScreenList extends ObjectSelectionList<ConfigScreenList.Entry
@Override @Override
protected void renderList(PoseStack p_238478_1_, int p_238478_2_, int p_238478_3_, int p_238478_4_, int p_238478_5_, float p_238478_6_) { protected void renderList(PoseStack p_238478_1_, int p_238478_2_, int p_238478_3_, int p_238478_4_, int p_238478_5_, float p_238478_6_) {
Window window = Minecraft.getInstance().getWindow(); Window window = minecraft.getWindow();
double d0 = window.getGuiScale(); double d0 = window.getGuiScale();
RenderSystem.enableScissor((int) (this.x0 * d0), (int) (window.getHeight() - (this.y1 * d0)), (int) (this.width * d0), (int) (this.height * d0)); RenderSystem.enableScissor((int) (this.x0 * d0), (int) (window.getHeight() - (this.y1 * d0)), (int) (this.width * d0), (int) (this.height * d0));
super.renderList(p_238478_1_, p_238478_2_, p_238478_3_, p_238478_4_, p_238478_5_, p_238478_6_); super.renderList(p_238478_1_, p_238478_2_, p_238478_3_, p_238478_4_, p_238478_5_, p_238478_6_);
@ -80,6 +80,7 @@ public class ConfigScreenList extends ObjectSelectionList<ConfigScreenList.Entry
return x0 + this.width - 6; return x0 + this.width - 6;
} }
@Override
public void tick() { public void tick() {
/*for(int i = 0; i < getItemCount(); ++i) { /*for(int i = 0; i < getItemCount(); ++i) {
int top = this.getRowTop(i); int top = this.getRowTop(i);
@ -122,7 +123,7 @@ public class ConfigScreenList extends ObjectSelectionList<ConfigScreenList.Entry
ConfigScreen.cogSpin.bump(3, force); ConfigScreen.cogSpin.bump(3, force);
} }
public static abstract class Entry extends ObjectSelectionList.Entry<Entry> { public static abstract class Entry extends ObjectSelectionList.Entry<Entry> implements TickableGuiEventListener {
protected List<GuiEventListener> listeners; protected List<GuiEventListener> listeners;
protected Map<String, String> annotations; protected Map<String, String> annotations;
protected String path; protected String path;
@ -147,6 +148,7 @@ public class ConfigScreenList extends ObjectSelectionList<ConfigScreenList.Entry
return getGuiListeners().stream().anyMatch(l -> l.charTyped(ch, code)); return getGuiListeners().stream().anyMatch(l -> l.charTyped(ch, code));
} }
@Override
public void tick() {} public void tick() {}
public List<GuiEventListener> getGuiListeners() { public List<GuiEventListener> getGuiListeners() {
@ -249,13 +251,13 @@ public class ConfigScreenList extends ObjectSelectionList<ConfigScreenList.Entry
if (tooltip.isEmpty()) if (tooltip.isEmpty())
return; return;
GL11.glDisable(GL11.GL_SCISSOR_TEST); RenderSystem.disableScissor();
Screen screen = Minecraft.getInstance().screen; Screen screen = Minecraft.getInstance().screen;
ms.pushPose(); ms.pushPose();
ms.translate(0, 0, 400); ms.translate(0, 0, 400);
GuiUtils.drawHoveringText(ms, tooltip, mouseX, mouseY, screen.width, screen.height, 300, font); GuiUtils.drawHoveringText(ms, tooltip, mouseX, mouseY, screen.width, screen.height, 300, font);
ms.popPose(); ms.popPose();
GL11.glEnable(GL11.GL_SCISSOR_TEST); GlStateManager._enableScissorTest();
} }
} }

View file

@ -7,8 +7,8 @@ import java.util.stream.Collectors;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.PoseStack;
import com.simibubi.create.AllItems; import com.simibubi.create.AllItems;
import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.config.AllConfigs;
import com.simibubi.create.foundation.gui.CreateMainMenuScreen;
import com.simibubi.create.foundation.gui.ScreenOpener; import com.simibubi.create.foundation.gui.ScreenOpener;
import com.simibubi.create.foundation.gui.mainMenu.CreateMainMenuScreen;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.components.AbstractWidget; import net.minecraft.client.gui.components.AbstractWidget;

View file

@ -29,11 +29,11 @@ import com.simibubi.create.foundation.config.ui.entries.ValueEntry;
import com.simibubi.create.foundation.gui.AllIcons; import com.simibubi.create.foundation.gui.AllIcons;
import com.simibubi.create.foundation.gui.ConfirmationScreen; import com.simibubi.create.foundation.gui.ConfirmationScreen;
import com.simibubi.create.foundation.gui.ConfirmationScreen.Response; import com.simibubi.create.foundation.gui.ConfirmationScreen.Response;
import com.simibubi.create.foundation.gui.DelegatedStencilElement;
import com.simibubi.create.foundation.gui.ScreenOpener; import com.simibubi.create.foundation.gui.ScreenOpener;
import com.simibubi.create.foundation.gui.Theme; import com.simibubi.create.foundation.gui.Theme;
import com.simibubi.create.foundation.gui.UIRenderHelper; import com.simibubi.create.foundation.gui.UIRenderHelper;
import com.simibubi.create.foundation.gui.widgets.BoxWidget; import com.simibubi.create.foundation.gui.element.DelegatedStencilElement;
import com.simibubi.create.foundation.gui.widget.BoxWidget;
import com.simibubi.create.foundation.item.TooltipHelper; import com.simibubi.create.foundation.item.TooltipHelper;
import com.simibubi.create.foundation.networking.AllPackets; import com.simibubi.create.foundation.networking.AllPackets;
import com.simibubi.create.foundation.utility.Color; import com.simibubi.create.foundation.utility.Color;
@ -135,8 +135,8 @@ public class SubMenuConfigScreen extends ConfigScreen {
} }
String command = change.annotations.get("Execute"); String command = change.annotations.get("Execute");
if (Minecraft.getInstance().player != null && command != null && command.startsWith("/")) { if (minecraft.player != null && command != null && command.startsWith("/")) {
Minecraft.getInstance().player.chat(command); minecraft.player.chat(command);
//AllPackets.channel.sendToServer(new CChatMessagePacket(command)); //AllPackets.channel.sendToServer(new CChatMessagePacket(command));
} }
}); });
@ -163,15 +163,8 @@ public class SubMenuConfigScreen extends ConfigScreen {
.forEach(e -> ((ValueEntry<?>) e).onValueChange()); .forEach(e -> ((ValueEntry<?>) e).onValueChange());
} }
@Override
public void tick() {
super.tick();
list.tick();
}
@Override @Override
protected void init() { protected void init() {
widgets.clear();
super.init(); super.init();
listWidth = Math.min(width - 80, 300); listWidth = Math.min(width - 80, 300);
@ -242,21 +235,21 @@ public class SubMenuConfigScreen extends ConfigScreen {
goBack.showingElement(AllIcons.I_CONFIG_BACK.asStencil().withElementRenderer(BoxWidget.gradientFactory.apply(goBack))); goBack.showingElement(AllIcons.I_CONFIG_BACK.asStencil().withElementRenderer(BoxWidget.gradientFactory.apply(goBack)));
goBack.getToolTip().add(new TextComponent("Go Back")); goBack.getToolTip().add(new TextComponent("Go Back"));
widgets.add(resetAll); addRenderableWidget(resetAll);
widgets.add(saveChanges); addRenderableWidget(saveChanges);
widgets.add(discardChanges); addRenderableWidget(discardChanges);
widgets.add(goBack); addRenderableWidget(goBack);
list = new ConfigScreenList(minecraft, listWidth, height - 80, 35, height - 45, 40); list = new ConfigScreenList(minecraft, listWidth, height - 80, 35, height - 45, 40);
list.setLeftPos(this.width / 2 - list.getWidth() / 2); list.setLeftPos(this.width / 2 - list.getWidth() / 2);
addWidget(list); addRenderableWidget(list);
search = new ConfigTextField(font, width / 2 - listWidth / 2, height - 35, listWidth, 20); search = new ConfigTextField(font, width / 2 - listWidth / 2, height - 35, listWidth, 20);
search.setResponder(this::updateFilter); search.setResponder(this::updateFilter);
search.setHint("Search.."); search.setHint("Search..");
search.moveCursorToStart(); search.moveCursorToStart();
widgets.add(search); addRenderableWidget(search);
configGroup.valueMap().forEach((key, obj) -> { configGroup.valueMap().forEach((key, obj) -> {
String humanKey = toHumanReadable(key); String humanKey = toHumanReadable(key);
@ -331,20 +324,20 @@ public class SubMenuConfigScreen extends ConfigScreen {
if (!canEdit) { if (!canEdit) {
list.children().forEach(e -> e.setEditable(false)); list.children().forEach(e -> e.setEditable(false));
resetAll.active = false; resetAll.active = false;
stencil.withStencilRenderer((ms, w, h, alpha) -> AllIcons.I_CONFIG_LOCKED.draw(ms, 0, 0)); stencil.withStencilRenderer((ms, w, h, alpha) -> AllIcons.I_CONFIG_LOCKED.render(ms, 0, 0));
stencil.withElementRenderer((ms, w, h, alpha) -> UIRenderHelper.angledGradient(ms, 90, 8, 0, 16, 16, red)); stencil.withElementRenderer((ms, w, h, alpha) -> UIRenderHelper.angledGradient(ms, 90, 8, 0, 16, 16, red));
serverLocked.withBorderColors(red); serverLocked.withBorderColors(red);
serverLocked.getToolTip().add(new TextComponent("Locked").withStyle(ChatFormatting.BOLD)); serverLocked.getToolTip().add(new TextComponent("Locked").withStyle(ChatFormatting.BOLD));
serverLocked.getToolTip().addAll(TooltipHelper.cutStringTextComponent("You do not have enough permissions to edit the server config. You can still look at the current values here though.", ChatFormatting.GRAY, ChatFormatting.GRAY)); serverLocked.getToolTip().addAll(TooltipHelper.cutStringTextComponent("You do not have enough permissions to edit the server config. You can still look at the current values here though.", ChatFormatting.GRAY, ChatFormatting.GRAY));
} else { } else {
stencil.withStencilRenderer((ms, w, h, alpha) -> AllIcons.I_CONFIG_UNLOCKED.draw(ms, 0, 0)); stencil.withStencilRenderer((ms, w, h, alpha) -> AllIcons.I_CONFIG_UNLOCKED.render(ms, 0, 0));
stencil.withElementRenderer((ms, w, h, alpha) -> UIRenderHelper.angledGradient(ms, 90, 8, 0, 16, 16, green)); stencil.withElementRenderer((ms, w, h, alpha) -> UIRenderHelper.angledGradient(ms, 90, 8, 0, 16, 16, green));
serverLocked.withBorderColors(green); serverLocked.withBorderColors(green);
serverLocked.getToolTip().add(new TextComponent("Unlocked").withStyle(ChatFormatting.BOLD)); serverLocked.getToolTip().add(new TextComponent("Unlocked").withStyle(ChatFormatting.BOLD));
serverLocked.getToolTip().addAll(TooltipHelper.cutStringTextComponent("You have enough permissions to edit the server config. Changes you make here will be synced with the server when you save them.", ChatFormatting.GRAY, ChatFormatting.GRAY)); serverLocked.getToolTip().addAll(TooltipHelper.cutStringTextComponent("You have enough permissions to edit the server config. Changes you make here will be synced with the server when you save them.", ChatFormatting.GRAY, ChatFormatting.GRAY));
} }
widgets.add(serverLocked); addRenderableWidget(serverLocked);
} }
@Override @Override
@ -353,8 +346,6 @@ public class SubMenuConfigScreen extends ConfigScreen {
int x = width / 2; int x = width / 2;
drawCenteredString(ms, minecraft.font, ConfigScreen.modID + " > " + type.toString().toLowerCase(Locale.ROOT) + " > " + title, x, 15, Theme.i(Theme.Key.TEXT)); drawCenteredString(ms, minecraft.font, ConfigScreen.modID + " > " + type.toString().toLowerCase(Locale.ROOT) + " > " + title, x, 15, Theme.i(Theme.Key.TEXT));
list.render(ms, mouseX, mouseY, partialTicks);
} }
@Override @Override

View file

@ -2,10 +2,10 @@ package com.simibubi.create.foundation.config.ui.entries;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.PoseStack;
import com.simibubi.create.foundation.gui.AllIcons; import com.simibubi.create.foundation.gui.AllIcons;
import com.simibubi.create.foundation.gui.RenderElement;
import com.simibubi.create.foundation.gui.Theme; import com.simibubi.create.foundation.gui.Theme;
import com.simibubi.create.foundation.gui.UIRenderHelper; import com.simibubi.create.foundation.gui.UIRenderHelper;
import com.simibubi.create.foundation.gui.widgets.BoxWidget; import com.simibubi.create.foundation.gui.element.RenderElement;
import com.simibubi.create.foundation.gui.widget.BoxWidget;
import net.minecraftforge.common.ForgeConfigSpec; import net.minecraftforge.common.ForgeConfigSpec;

View file

@ -5,12 +5,12 @@ import java.util.Locale;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.PoseStack;
import com.simibubi.create.foundation.config.ui.ConfigScreen; import com.simibubi.create.foundation.config.ui.ConfigScreen;
import com.simibubi.create.foundation.gui.AllIcons; import com.simibubi.create.foundation.gui.AllIcons;
import com.simibubi.create.foundation.gui.BoxElement;
import com.simibubi.create.foundation.gui.DelegatedStencilElement;
import com.simibubi.create.foundation.gui.TextStencilElement;
import com.simibubi.create.foundation.gui.Theme; import com.simibubi.create.foundation.gui.Theme;
import com.simibubi.create.foundation.gui.UIRenderHelper; import com.simibubi.create.foundation.gui.UIRenderHelper;
import com.simibubi.create.foundation.gui.widgets.BoxWidget; import com.simibubi.create.foundation.gui.element.BoxElement;
import com.simibubi.create.foundation.gui.element.DelegatedStencilElement;
import com.simibubi.create.foundation.gui.element.TextStencilElement;
import com.simibubi.create.foundation.gui.widget.BoxWidget;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraftforge.common.ForgeConfigSpec; import net.minecraftforge.common.ForgeConfigSpec;

View file

@ -8,9 +8,9 @@ import javax.annotation.Nullable;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.PoseStack;
import com.simibubi.create.foundation.config.ui.ConfigTextField; import com.simibubi.create.foundation.config.ui.ConfigTextField;
import com.simibubi.create.foundation.gui.TextStencilElement;
import com.simibubi.create.foundation.gui.Theme; import com.simibubi.create.foundation.gui.Theme;
import com.simibubi.create.foundation.gui.UIRenderHelper; import com.simibubi.create.foundation.gui.UIRenderHelper;
import com.simibubi.create.foundation.gui.element.TextStencilElement;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.Font; import net.minecraft.client.gui.Font;

View file

@ -5,9 +5,9 @@ import com.mojang.blaze3d.vertex.PoseStack;
import com.simibubi.create.foundation.config.ui.ConfigScreenList; import com.simibubi.create.foundation.config.ui.ConfigScreenList;
import com.simibubi.create.foundation.config.ui.SubMenuConfigScreen; import com.simibubi.create.foundation.config.ui.SubMenuConfigScreen;
import com.simibubi.create.foundation.gui.AllIcons; import com.simibubi.create.foundation.gui.AllIcons;
import com.simibubi.create.foundation.gui.DelegatedStencilElement;
import com.simibubi.create.foundation.gui.ScreenOpener; import com.simibubi.create.foundation.gui.ScreenOpener;
import com.simibubi.create.foundation.gui.widgets.BoxWidget; import com.simibubi.create.foundation.gui.element.DelegatedStencilElement;
import com.simibubi.create.foundation.gui.widget.BoxWidget;
import net.minecraftforge.common.ForgeConfigSpec; import net.minecraftforge.common.ForgeConfigSpec;

View file

@ -15,8 +15,8 @@ import com.simibubi.create.foundation.config.ui.ConfigHelper;
import com.simibubi.create.foundation.config.ui.ConfigScreen; import com.simibubi.create.foundation.config.ui.ConfigScreen;
import com.simibubi.create.foundation.config.ui.ConfigScreenList; import com.simibubi.create.foundation.config.ui.ConfigScreenList;
import com.simibubi.create.foundation.gui.AllIcons; import com.simibubi.create.foundation.gui.AllIcons;
import com.simibubi.create.foundation.gui.DelegatedStencilElement; import com.simibubi.create.foundation.gui.element.DelegatedStencilElement;
import com.simibubi.create.foundation.gui.widgets.BoxWidget; import com.simibubi.create.foundation.gui.widget.BoxWidget;
import com.simibubi.create.foundation.item.TooltipHelper; import com.simibubi.create.foundation.item.TooltipHelper;
import com.simibubi.create.foundation.utility.Pair; import com.simibubi.create.foundation.utility.Pair;

View file

@ -34,7 +34,7 @@ public class CreateEntityBuilder<T extends Entity, P> extends EntityBuilder<T, P
public CreateEntityBuilder<T, P> instance(NonNullSupplier<IEntityInstanceFactory<? super T>> instanceFactory) { public CreateEntityBuilder<T, P> instance(NonNullSupplier<IEntityInstanceFactory<? super T>> instanceFactory) {
if (this.instanceFactory == null) { if (this.instanceFactory == null) {
DistExecutor.runWhenOn(Dist.CLIENT, () -> this::registerInstance); DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> this::registerInstance);
} }
this.instanceFactory = instanceFactory; this.instanceFactory = instanceFactory;
@ -46,7 +46,9 @@ public class CreateEntityBuilder<T extends Entity, P> extends EntityBuilder<T, P
OneTimeEventReceiver.addModListener(FMLClientSetupEvent.class, $ -> { OneTimeEventReceiver.addModListener(FMLClientSetupEvent.class, $ -> {
NonNullSupplier<IEntityInstanceFactory<? super T>> instanceFactory = this.instanceFactory; NonNullSupplier<IEntityInstanceFactory<? super T>> instanceFactory = this.instanceFactory;
if (instanceFactory != null) { if (instanceFactory != null) {
InstancedRenderRegistry.getInstance().register(getEntry(), instanceFactory.get()); InstancedRenderRegistry.getInstance()
.entity(getEntry())
.factory(instanceFactory.get());
} }
}); });

View file

@ -32,7 +32,7 @@ public class CreateTileEntityBuilder<T extends BlockEntity, P> extends TileEntit
public CreateTileEntityBuilder<T, P> instance(NonNullSupplier<ITileInstanceFactory<? super T>> instanceFactory) { public CreateTileEntityBuilder<T, P> instance(NonNullSupplier<ITileInstanceFactory<? super T>> instanceFactory) {
if (this.instanceFactory == null) { if (this.instanceFactory == null) {
DistExecutor.runWhenOn(Dist.CLIENT, () -> this::registerInstance); DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> this::registerInstance);
} }
this.instanceFactory = instanceFactory; this.instanceFactory = instanceFactory;
@ -45,7 +45,8 @@ public class CreateTileEntityBuilder<T extends BlockEntity, P> extends TileEntit
NonNullSupplier<ITileInstanceFactory<? super T>> instanceFactory = this.instanceFactory; NonNullSupplier<ITileInstanceFactory<? super T>> instanceFactory = this.instanceFactory;
if (instanceFactory != null) { if (instanceFactory != null) {
InstancedRenderRegistry.getInstance() InstancedRenderRegistry.getInstance()
.register(getEntry(), instanceFactory.get()); .tile(getEntry())
.factory(instanceFactory.get());
} }
}); });
} }

View file

@ -1,208 +0,0 @@
package com.simibubi.create.foundation.gui;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.annotation.ParametersAreNonnullByDefault;
import com.mojang.blaze3d.platform.InputConstants;
import com.mojang.blaze3d.vertex.PoseStack;
import com.simibubi.create.foundation.gui.widgets.AbstractSimiWidget;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.components.AbstractWidget;
import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen;
import net.minecraft.client.gui.screens.inventory.ContainerScreen;
import net.minecraft.client.renderer.Rect2i;
import net.minecraft.network.chat.Component;
import net.minecraft.world.entity.player.Inventory;
import net.minecraft.world.inventory.AbstractContainerMenu;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
@OnlyIn(Dist.CLIENT)
@ParametersAreNonnullByDefault
public abstract class AbstractSimiContainerScreen<T extends AbstractContainerMenu> extends AbstractContainerScreen<T> {
protected List<AbstractWidget> widgets;
protected int windowXOffset;
protected int windowYOffset;
public AbstractSimiContainerScreen(T container, Inventory inv, Component title) {
super(container, inv, title);
widgets = new ArrayList<>();
}
protected void setWindowSize(int width, int height) {
this.imageWidth = width;
this.imageHeight = height;
}
protected void setWindowOffset(int xOffset, int yOffset) {
windowXOffset = xOffset;
windowYOffset = yOffset;
}
@Override
protected void init() {
super.init();
leftPos += windowXOffset;
topPos += windowYOffset;
}
@Override
protected void renderLabels(PoseStack p_230451_1_, int p_230451_2_, int p_230451_3_) {
// no-op to prevent screen- and inventory-title from being rendered at incorrect location
// could also set this.titleX/Y and this.playerInventoryTitleX/Y to the proper values instead
}
@Override
public void render(PoseStack matrixStack, int mouseX, int mouseY, float partialTicks) {
partialTicks = Minecraft.getInstance()
.getFrameTime();
renderBackground(matrixStack);
renderWindow(matrixStack, mouseX, mouseY, partialTicks);
for (AbstractWidget widget : widgets)
widget.render(matrixStack, mouseX, mouseY, partialTicks);
super.render(matrixStack, mouseX, mouseY, partialTicks);
renderWindowForeground(matrixStack, mouseX, mouseY, partialTicks);
}
@Override
public boolean mouseClicked(double x, double y, int button) {
boolean result = false;
for (AbstractWidget widget : widgets) {
if (widget.mouseClicked(x, y, button))
result = true;
}
return result || super.mouseClicked(x, y, button);
}
@Override
public boolean keyPressed(int code, int p_keyPressed_2_, int p_keyPressed_3_) {
for (AbstractWidget widget : widgets) {
if (widget.keyPressed(code, p_keyPressed_2_, p_keyPressed_3_))
return true;
}
if (super.keyPressed(code, p_keyPressed_2_, p_keyPressed_3_))
return true;
InputConstants.Key mouseKey = InputConstants.getKey(code, p_keyPressed_2_);
if (this.minecraft.options.keyInventory.isActiveAndMatches(mouseKey)) {
this.onClose();
return true;
}
return false;
}
@Override
public boolean charTyped(char character, int code) {
for (AbstractWidget widget : widgets) {
if (widget.charTyped(character, code))
return true;
}
return super.charTyped(character, code);
}
@Override
public boolean mouseScrolled(double mouseX, double mouseY, double delta) {
for (AbstractWidget widget : widgets) {
if (widget.mouseScrolled(mouseX, mouseY, delta))
return true;
}
return super.mouseScrolled(mouseX, mouseY, delta);
}
@Override
public boolean mouseReleased(double x, double y, int button) {
boolean result = false;
for (AbstractWidget widget : widgets) {
if (widget.mouseReleased(x, y, button))
result = true;
}
return result | super.mouseReleased(x, y, button);
}
protected abstract void renderWindow(PoseStack ms, int mouseX, int mouseY, float partialTicks);
@Override
protected void renderBg(PoseStack p_230450_1_, float p_230450_2_, int p_230450_3_, int p_230450_4_) {
}
protected void renderWindowForeground(PoseStack matrixStack, int mouseX, int mouseY, float partialTicks) {
renderTooltip(matrixStack, mouseX, mouseY);
for (AbstractWidget widget : widgets) {
if (!widget.isHovered())
continue;
if (widget instanceof AbstractSimiWidget) {
if (!((AbstractSimiWidget) widget).getToolTip().isEmpty())
renderComponentTooltip(matrixStack, ((AbstractSimiWidget) widget).getToolTip(), mouseX, mouseY);
} else {
widget.renderToolTip(matrixStack, mouseX, mouseY);
}
}
}
public double getItemCountTextScale() {
int guiScaleFactor = (int) minecraft.getWindow()
.getGuiScale();
double scale = 1;
switch (guiScaleFactor) {
case 1:
scale = 2060 / 2048d;
break;
case 2:
scale = .5;
break;
case 3:
scale = .675;
break;
case 4:
scale = .75;
break;
default:
scale = ((float) guiScaleFactor - 1) / guiScaleFactor;
}
return scale;
}
public int getLeftOfCentered(int textureWidth) {
return (width - textureWidth) / 2;
}
public void renderPlayerInventory(PoseStack ms, int x, int y) {
AllGuiTextures.PLAYER_INVENTORY.draw(ms, this, x, y);
font.draw(ms, playerInventoryTitle, x + 8, y + 6, 0x404040);
}
/**
* Used for moving JEI out of the way of extra things like Flexcrate renders.
*
* <p>This screen class must be bound to a SlotMover instance for this method to work.
*
* @return the space that the gui takes up besides the normal rectangle defined by {@link ContainerScreen}.
*/
public List<Rect2i> getExtraAreas() {
return Collections.emptyList();
}
@Deprecated
protected void debugWindowArea(PoseStack matrixStack) {
fill(matrixStack, leftPos + imageWidth, topPos + imageHeight, leftPos, topPos, 0xD3D3D3D3);
}
@Deprecated
protected void debugExtraAreas(PoseStack matrixStack) {
for (Rect2i area : getExtraAreas()) {
fill(matrixStack, area.getX() + area.getWidth(), area.getY() + area.getHeight(), area.getX(), area.getY(), 0xd3d3d3d3);
}
}
}

View file

@ -1,14 +1,14 @@
package com.simibubi.create.foundation.gui; package com.simibubi.create.foundation.gui;
import java.util.ArrayList; import java.util.Collection;
import java.util.List; import java.util.List;
import com.mojang.blaze3d.platform.InputConstants;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.PoseStack;
import com.simibubi.create.foundation.gui.widgets.AbstractSimiWidget; import com.simibubi.create.foundation.gui.widget.AbstractSimiWidget;
import net.minecraft.client.Minecraft; import net.minecraft.client.gui.components.Widget;
import net.minecraft.client.gui.components.AbstractWidget; import net.minecraft.client.gui.components.events.GuiEventListener;
import net.minecraft.client.gui.narration.NarratableEntry;
import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.gui.screens.Screen;
import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.TextComponent; import net.minecraft.network.chat.TextComponent;
@ -21,22 +21,26 @@ public abstract class AbstractSimiScreen extends Screen {
protected int windowWidth, windowHeight; protected int windowWidth, windowHeight;
protected int windowXOffset, windowYOffset; protected int windowXOffset, windowYOffset;
protected int guiLeft, guiTop; protected int guiLeft, guiTop;
protected List<AbstractWidget> widgets;
protected AbstractSimiScreen(Component title) { protected AbstractSimiScreen(Component title) {
super(title); super(title);
widgets = new ArrayList<>();
} }
protected AbstractSimiScreen() { protected AbstractSimiScreen() {
this(new TextComponent("")); this(TextComponent.EMPTY);
} }
/**
* This method must be called before {@code super.init()}!
*/
protected void setWindowSize(int width, int height) { protected void setWindowSize(int width, int height) {
windowWidth = width; windowWidth = width;
windowHeight = height; windowHeight = height;
} }
/**
* This method must be called before {@code super.init()}!
*/
protected void setWindowOffset(int xOffset, int yOffset) { protected void setWindowOffset(int xOffset, int yOffset) {
windowXOffset = xOffset; windowXOffset = xOffset;
windowYOffset = yOffset; windowYOffset = yOffset;
@ -44,7 +48,6 @@ public abstract class AbstractSimiScreen extends Screen {
@Override @Override
protected void init() { protected void init() {
super.init();
guiLeft = (width - windowWidth) / 2; guiLeft = (width - windowWidth) / 2;
guiTop = (height - windowHeight) / 2; guiTop = (height - windowHeight) / 2;
guiLeft += windowXOffset; guiLeft += windowXOffset;
@ -53,16 +56,46 @@ public abstract class AbstractSimiScreen extends Screen {
@Override @Override
public void tick() { public void tick() {
super.tick(); for (GuiEventListener listener : children()) {
if (listener instanceof TickableGuiEventListener tickable) {
tickable.tick();
}
}
}
widgets.stream().filter(w -> w instanceof AbstractSimiWidget).forEach(w -> ((AbstractSimiWidget) w).tick()); @Override
public boolean isPauseScreen() {
return false;
}
@SuppressWarnings("unchecked")
protected <W extends GuiEventListener & Widget & NarratableEntry> void addRenderableWidgets(W... widgets) {
for (W widget : widgets) {
addRenderableWidget(widget);
}
}
protected <W extends GuiEventListener & Widget & NarratableEntry> void addRenderableWidgets(Collection<W> widgets) {
for (W widget : widgets) {
addRenderableWidget(widget);
}
}
protected void removeWidgets(GuiEventListener... widgets) {
for (GuiEventListener widget : widgets) {
removeWidget(widget);
}
}
protected void removeWidgets(Collection<? extends GuiEventListener> widgets) {
for (GuiEventListener widget : widgets) {
removeWidget(widget);
}
} }
@Override @Override
public void render(PoseStack ms, int mouseX, int mouseY, float partialTicks) { public void render(PoseStack ms, int mouseX, int mouseY, float partialTicks) {
partialTicks = partialTicks == 10 ? 0 partialTicks = minecraft.getFrameTime();
: Minecraft.getInstance()
.getFrameTime();
ms.pushPose(); ms.pushPose();
@ -70,8 +103,7 @@ public abstract class AbstractSimiScreen extends Screen {
renderWindowBackground(ms, mouseX, mouseY, partialTicks); renderWindowBackground(ms, mouseX, mouseY, partialTicks);
renderWindow(ms, mouseX, mouseY, partialTicks); renderWindow(ms, mouseX, mouseY, partialTicks);
for (AbstractWidget widget : widgets) super.render(ms, mouseX, mouseY, partialTicks);
widget.render(ms, mouseX, mouseY, partialTicks);
renderWindowForeground(ms, mouseX, mouseY, partialTicks); renderWindowForeground(ms, mouseX, mouseY, partialTicks);
endFrame(); endFrame();
@ -82,105 +114,28 @@ public abstract class AbstractSimiScreen extends Screen {
protected void prepareFrame() { protected void prepareFrame() {
} }
protected void endFrame() {
}
protected void renderWindowBackground(PoseStack ms, int mouseX, int mouseY, float partialTicks) { protected void renderWindowBackground(PoseStack ms, int mouseX, int mouseY, float partialTicks) {
renderBackground(ms); renderBackground(ms);
} }
@Override
public boolean mouseClicked(double x, double y, int button) {
boolean result = false;
for (AbstractWidget widget : widgets)
if (widget.mouseClicked(x, y, button))
result = true;
if (!result) {
result = super.mouseClicked(x, y, button);
}
return result;
}
@Override
public boolean keyPressed(int code, int p_keyPressed_2_, int p_keyPressed_3_) {
for (AbstractWidget widget : widgets)
if (widget.keyPressed(code, p_keyPressed_2_, p_keyPressed_3_))
return true;
if (super.keyPressed(code, p_keyPressed_2_, p_keyPressed_3_))
return true;
InputConstants.Key mouseKey = InputConstants.getKey(code, p_keyPressed_2_);
if (this.minecraft.options.keyInventory.isActiveAndMatches(mouseKey)) {
this.onClose();
return true;
}
return false;
}
@Override
public boolean charTyped(char character, int code) {
for (AbstractWidget widget : widgets) {
if (widget.charTyped(character, code))
return true;
}
return super.charTyped(character, code);
}
@Override
public boolean mouseScrolled(double mouseX, double mouseY, double delta) {
for (AbstractWidget widget : widgets) {
if (widget.mouseScrolled(mouseX, mouseY, delta))
return true;
}
return super.mouseScrolled(mouseX, mouseY, delta);
}
@Override
public boolean mouseReleased(double x, double y, int button) {
boolean result = false;
for (AbstractWidget widget : widgets) {
if (widget.mouseReleased(x, y, button))
result = true;
}
return result | super.mouseReleased(x, y, button);
}
@Override
public boolean shouldCloseOnEsc() {
return true;
}
@Override
public boolean isPauseScreen() {
return false;
}
protected abstract void renderWindow(PoseStack ms, int mouseX, int mouseY, float partialTicks); protected abstract void renderWindow(PoseStack ms, int mouseX, int mouseY, float partialTicks);
protected void renderWindowForeground(PoseStack ms, int mouseX, int mouseY, float partialTicks) { protected void renderWindowForeground(PoseStack ms, int mouseX, int mouseY, float partialTicks) {
for (AbstractWidget widget : widgets) { for (Widget widget : renderables) {
if (!widget.isHovered()) if (widget instanceof AbstractSimiWidget simiWidget && simiWidget.isHovered()) {
continue; List<Component> tooltip = simiWidget.getToolTip();
if (!tooltip.isEmpty())
if (widget instanceof AbstractSimiWidget) { renderComponentTooltip(ms, tooltip, mouseX, mouseY);
if (!((AbstractSimiWidget) widget).getToolTip().isEmpty())
renderComponentTooltip(ms, ((AbstractSimiWidget) widget).getToolTip(), mouseX, mouseY);
} else {
widget.renderToolTip(ms, mouseX, mouseY);
} }
} }
} }
protected void endFrame() {
}
@Deprecated @Deprecated
protected void debugWindowArea(PoseStack matrixStack) { protected void debugWindowArea(PoseStack matrixStack) {
fill(matrixStack, guiLeft + windowWidth, guiTop + windowHeight, guiLeft, guiTop, 0xD3D3D3D3); fill(matrixStack, guiLeft + windowWidth, guiTop + windowHeight, guiLeft, guiTop, 0xD3D3D3D3);
} }
public List<AbstractWidget> getWidgets() {
return widgets;
}
} }

View file

@ -3,6 +3,7 @@ package com.simibubi.create.foundation.gui;
import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.systems.RenderSystem;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.PoseStack;
import com.simibubi.create.Create; import com.simibubi.create.Create;
import com.simibubi.create.foundation.gui.element.ScreenElement;
import com.simibubi.create.foundation.utility.Color; import com.simibubi.create.foundation.utility.Color;
import net.minecraft.client.gui.GuiComponent; import net.minecraft.client.gui.GuiComponent;
@ -10,110 +11,110 @@ import net.minecraft.resources.ResourceLocation;
import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.api.distmarker.OnlyIn;
public enum AllGuiTextures implements IScreenRenderable { public enum AllGuiTextures implements ScreenElement {
// Inventories // Inventories
PLAYER_INVENTORY("player_inventory.png", 176, 108), PLAYER_INVENTORY("player_inventory", 176, 108),
WAND_OF_SYMMETRY("curiosities.png", 0, 131, 188, 101), WAND_OF_SYMMETRY("curiosities", 0, 131, 188, 101),
BLOCKZAPPER("curiosities.png", 0, 99, 214, 97), BLOCKZAPPER("curiosities", 0, 99, 214, 97),
TERRAINZAPPER("curiosities.png", 234, 103), TERRAINZAPPER("curiosities", 234, 103),
TERRAINZAPPER_INACTIVE_PARAM("curiosities.png", 238, 0, 18, 18), TERRAINZAPPER_INACTIVE_PARAM("curiosities", 238, 0, 18, 18),
LOGO("logo.png", 256, 256), LOGO("logo", 256, 256),
SCHEMATIC("schematics.png", 192, 121), SCHEMATIC("schematics", 192, 121),
SCHEMATIC_SLOT("widgets.png", 54, 0, 16, 16), SCHEMATIC_SLOT("widgets", 54, 0, 16, 16),
SCHEMATIC_PROMPT("schematics_2.png", 213, 77), SCHEMATIC_PROMPT("schematics_2", 213, 77),
HUD_BACKGROUND("overlay.png", 0, 0, 16, 16), HUD_BACKGROUND("overlay", 0, 0, 16, 16),
SCHEMATIC_TABLE("schematics.png", 0, 121, 214, 83), SCHEMATIC_TABLE("schematics", 0, 121, 214, 83),
SCHEMATIC_TABLE_PROGRESS("schematics.png", 0, 204, 84, 16), SCHEMATIC_TABLE_PROGRESS("schematics", 0, 204, 84, 16),
SCHEMATICANNON_TOP("schematics_2.png", 0, 77, 213, 42), SCHEMATICANNON_TOP("schematics_2", 0, 77, 213, 42),
SCHEMATICANNON_BOTTOM("schematics_2.png", 0, 119, 213, 99), SCHEMATICANNON_BOTTOM("schematics_2", 0, 119, 213, 99),
SCHEMATICANNON_PROGRESS("schematics_2.png", 76, 239, 114, 16), SCHEMATICANNON_PROGRESS("schematics_2", 76, 239, 114, 16),
SCHEMATICANNON_CHECKLIST_PROGRESS("schematics_2.png", 191, 240, 16, 14), SCHEMATICANNON_CHECKLIST_PROGRESS("schematics_2", 191, 240, 16, 14),
SCHEMATICANNON_HIGHLIGHT("schematics_2.png", 1, 229, 26, 26), SCHEMATICANNON_HIGHLIGHT("schematics_2", 1, 229, 26, 26),
SCHEMATICANNON_FUEL("schematics_2.png", 28, 222, 47, 16), SCHEMATICANNON_FUEL("schematics_2", 28, 222, 47, 16),
SCHEMATICANNON_FUEL_CREATIVE("schematics_2.png", 28, 239, 47, 16), SCHEMATICANNON_FUEL_CREATIVE("schematics_2", 28, 239, 47, 16),
STOCKSWITCH("logistics.png", 182, 93), STOCKSWITCH("logistics", 182, 93),
STOCKSWITCH_ARROW_UP("logistics.png", 191, 0, 7, 24), STOCKSWITCH_ARROW_UP("logistics", 191, 0, 7, 24),
STOCKSWITCH_ARROW_DOWN("logistics.png", 198, 0, 7, 24), STOCKSWITCH_ARROW_DOWN("logistics", 198, 0, 7, 24),
STOCKSWITCH_CURSOR("logistics.png", 206, 0, 7, 16), STOCKSWITCH_CURSOR("logistics", 206, 0, 7, 16),
STOCKSWITCH_INTERVAL("logistics.png", 0, 93, 100, 18), STOCKSWITCH_INTERVAL("logistics", 0, 93, 100, 18),
STOCKSWITCH_UNPOWERED_LANE("logistics.png", 36, 18, 102, 18), STOCKSWITCH_UNPOWERED_LANE("logistics", 36, 18, 102, 18),
STOCKSWITCH_POWERED_LANE("logistics.png", 36, 40, 102, 18), STOCKSWITCH_POWERED_LANE("logistics", 36, 40, 102, 18),
ADJUSTABLE_CRATE("logistics_2.png", 124, 127), ADJUSTABLE_CRATE("logistics_2", 124, 127),
ADJUSTABLE_DOUBLE_CRATE("logistics_2.png", 0, 127, 196, 127), ADJUSTABLE_DOUBLE_CRATE("logistics_2", 0, 127, 196, 127),
ADJUSTABLE_CRATE_LOCKED_SLOT("logistics_2.png", 125, 109, 18, 18), ADJUSTABLE_CRATE_LOCKED_SLOT("logistics_2", 125, 109, 18, 18),
FILTER("filters.png", 214, 97), FILTER("filters", 214, 97),
ATTRIBUTE_FILTER("filters.png", 0, 97, 241, 83), ATTRIBUTE_FILTER("filters", 0, 97, 241, 83),
TOOLBOX("toolbox.png", 188, 171), TOOLBOX("toolbox", 188, 171),
TOOLBELT_SLOT("minecraft", "widgets.png", 24, 23, 22, 22), TOOLBELT_SLOT("minecraft", "widgets", 24, 23, 22, 22),
TOOLBELT_SLOT_HIGHLIGHT("minecraft", "widgets.png", 0, 22, 24, 24), TOOLBELT_SLOT_HIGHLIGHT("minecraft", "widgets", 0, 22, 24, 24),
TOOLBELT_MAIN_SLOT("widgets.png", 0, 97, 24, 24), TOOLBELT_MAIN_SLOT("widgets", 0, 97, 24, 24),
TOOLBELT_EMPTY_SLOT("widgets.png", 27, 98, 22, 22), TOOLBELT_EMPTY_SLOT("widgets", 27, 98, 22, 22),
TOOLBELT_INACTIVE_SLOT("widgets.png", 52, 98, 22, 22), TOOLBELT_INACTIVE_SLOT("widgets", 52, 98, 22, 22),
TOOLBELT_HOTBAR_OFF("widgets.png", 0, 130, 20, 24), TOOLBELT_HOTBAR_OFF("widgets", 0, 130, 20, 24),
TOOLBELT_HOTBAR_ON("widgets.png", 20, 130, 20, 24), TOOLBELT_HOTBAR_ON("widgets", 20, 130, 20, 24),
TOOLBELT_SELECTED_OFF("widgets.png", 0, 155, 22, 22), TOOLBELT_SELECTED_OFF("widgets", 0, 155, 22, 22),
TOOLBELT_SELECTED_ON("widgets.png", 22, 155, 22, 22), TOOLBELT_SELECTED_ON("widgets", 22, 155, 22, 22),
SEQUENCER("sequencer.png", 173, 159), SEQUENCER("sequencer", 173, 159),
SEQUENCER_INSTRUCTION("sequencer.png", 0, 14, 162, 22), SEQUENCER_INSTRUCTION("sequencer", 0, 14, 162, 22),
SEQUENCER_DELAY("sequencer.png", 0, 58, 162, 22), SEQUENCER_DELAY("sequencer", 0, 58, 162, 22),
SEQUENCER_END("sequencer.png", 0, 80, 162, 22), SEQUENCER_END("sequencer", 0, 80, 162, 22),
SEQUENCER_EMPTY("sequencer.png", 0, 102, 162, 22), SEQUENCER_EMPTY("sequencer", 0, 102, 162, 22),
SEQUENCER_AWAIT("sequencer.png", 0, 160, 162, 22), SEQUENCER_AWAIT("sequencer", 0, 160, 162, 22),
LINKED_CONTROLLER("curiosities_2.png", 179, 109), LINKED_CONTROLLER("curiosities_2", 179, 109),
BLUEPRINT("curiosities_2.png", 0, 109, 179, 109), BLUEPRINT("curiosities_2", 0, 109, 179, 109),
PROJECTOR("projector.png", 235, 185), PROJECTOR("projector", 235, 185),
PROJECTOR_FILTER_STRENGTH("projector.png", 0, 14, 162, 22), PROJECTOR_FILTER_STRENGTH("projector", 0, 14, 162, 22),
PROJECTOR_FILTER("projector.png", 0, 36, 162, 22), PROJECTOR_FILTER("projector", 0, 36, 162, 22),
PROJECTOR_END("projector.png", 0, 58, 162, 22), PROJECTOR_END("projector", 0, 58, 162, 22),
PROJECTOR_EMPTY("projector.png", 0, 80, 162, 22), PROJECTOR_EMPTY("projector", 0, 80, 162, 22),
// JEI // JEI
JEI_SLOT("jei/widgets.png", 18, 18), JEI_SLOT("jei/widgets", 18, 18),
JEI_CHANCE_SLOT("jei/widgets.png", 20, 156, 18, 18), JEI_CHANCE_SLOT("jei/widgets", 20, 156, 18, 18),
JEI_CATALYST_SLOT("jei/widgets.png", 0, 156, 18, 18), JEI_CATALYST_SLOT("jei/widgets", 0, 156, 18, 18),
JEI_ARROW("jei/widgets.png", 19, 10, 42, 10), JEI_ARROW("jei/widgets", 19, 10, 42, 10),
JEI_LONG_ARROW("jei/widgets.png", 19, 0, 71, 10), JEI_LONG_ARROW("jei/widgets", 19, 0, 71, 10),
JEI_DOWN_ARROW("jei/widgets.png", 0, 21, 18, 14), JEI_DOWN_ARROW("jei/widgets", 0, 21, 18, 14),
JEI_LIGHT("jei/widgets.png", 0, 42, 52, 11), JEI_LIGHT("jei/widgets", 0, 42, 52, 11),
JEI_QUESTION_MARK("jei/widgets.png", 0, 178, 12, 16), JEI_QUESTION_MARK("jei/widgets", 0, 178, 12, 16),
JEI_SHADOW("jei/widgets.png", 0, 56, 52, 11), JEI_SHADOW("jei/widgets", 0, 56, 52, 11),
BLOCKZAPPER_UPGRADE_RECIPE("jei/widgets.png", 0, 75, 144, 66), BLOCKZAPPER_UPGRADE_RECIPE("jei/widgets", 0, 75, 144, 66),
JEI_HEAT_BAR("jei/widgets.png", 0, 201, 169, 19), JEI_HEAT_BAR("jei/widgets", 0, 201, 169, 19),
JEI_NO_HEAT_BAR("jei/widgets.png", 0, 221, 169, 19), JEI_NO_HEAT_BAR("jei/widgets", 0, 221, 169, 19),
// Widgets // Widgets
BUTTON("widgets.png", 18, 18), BUTTON("widgets", 18, 18),
BUTTON_HOVER("widgets.png", 18, 0, 18, 18), BUTTON_HOVER("widgets", 18, 0, 18, 18),
BUTTON_DOWN("widgets.png", 36, 0, 18, 18), BUTTON_DOWN("widgets", 36, 0, 18, 18),
INDICATOR("widgets.png", 0, 18, 18, 6), INDICATOR("widgets", 0, 18, 18, 6),
INDICATOR_WHITE("widgets.png", 18, 18, 18, 6), INDICATOR_WHITE("widgets", 18, 18, 18, 6),
INDICATOR_GREEN("widgets.png", 36, 18, 18, 6), INDICATOR_GREEN("widgets", 36, 18, 18, 6),
INDICATOR_YELLOW("widgets.png", 54, 18, 18, 6), INDICATOR_YELLOW("widgets", 54, 18, 18, 6),
INDICATOR_RED("widgets.png", 72, 18, 18, 6), INDICATOR_RED("widgets", 72, 18, 18, 6),
HOTSLOT_ARROW("widgets.png", 24, 51, 20, 12), HOTSLOT_ARROW("widgets", 24, 51, 20, 12),
HOTSLOT("widgets.png", 0, 68, 22, 22), HOTSLOT("widgets", 0, 68, 22, 22),
HOTSLOT_ACTIVE("widgets.png", 0, 46, 22, 22), HOTSLOT_ACTIVE("widgets", 0, 46, 22, 22),
HOTSLOT_SUPER_ACTIVE("widgets.png", 27, 67, 24, 24), HOTSLOT_SUPER_ACTIVE("widgets", 27, 67, 24, 24),
SPEECH_TOOLTIP_BACKGROUND("widgets.png", 0, 24, 8, 8), SPEECH_TOOLTIP_BACKGROUND("widgets", 0, 24, 8, 8),
SPEECH_TOOLTIP_COLOR("widgets.png", 8, 24, 8, 8), SPEECH_TOOLTIP_COLOR("widgets", 8, 24, 8, 8),
// PlacementIndicator // PlacementIndicator
PLACEMENT_INDICATOR_SHEET("placement_indicator.png", 0, 0, 16, 256); PLACEMENT_INDICATOR_SHEET("placement_indicator", 0, 0, 16, 256);
; ;
@ -128,7 +129,7 @@ public enum AllGuiTextures implements IScreenRenderable {
} }
private AllGuiTextures(int startX, int startY) { private AllGuiTextures(int startX, int startY) {
this("icons.png", startX * 16, startY * 16, 16, 16); this("icons", startX * 16, startY * 16, 16, 16);
} }
private AllGuiTextures(String location, int startX, int startY, int width, int height) { private AllGuiTextures(String location, int startX, int startY, int width, int height) {
@ -136,7 +137,7 @@ public enum AllGuiTextures implements IScreenRenderable {
} }
private AllGuiTextures(String namespace, String location, int startX, int startY, int width, int height) { private AllGuiTextures(String namespace, String location, int startX, int startY, int width, int height) {
this.location = new ResourceLocation(namespace, "textures/gui/" + location); this.location = new ResourceLocation(namespace, "textures/gui/" + location + ".png");
this.width = width; this.width = width;
this.height = height; this.height = height;
this.startX = startX; this.startX = startX;
@ -148,14 +149,21 @@ public enum AllGuiTextures implements IScreenRenderable {
RenderSystem.setShaderTexture(0, location); RenderSystem.setShaderTexture(0, location);
} }
@Override
@OnlyIn(Dist.CLIENT) @OnlyIn(Dist.CLIENT)
public void draw(PoseStack ms, GuiComponent screen, int x, int y) { @Override
public void render(PoseStack ms, int x, int y) {
bind(); bind();
screen.blit(ms, x, y, startX, startY, width, height); GuiComponent.blit(ms, x, y, 0, startX, startY, width, height, 256, 256);
} }
public void draw(PoseStack ms, int x, int y, Color c) { @OnlyIn(Dist.CLIENT)
public void render(PoseStack ms, int x, int y, GuiComponent component) {
bind();
component.blit(ms, x, y, startX, startY, width, height);
}
@OnlyIn(Dist.CLIENT)
public void render(PoseStack ms, int x, int y, Color c) {
bind(); bind();
UIRenderHelper.drawColoredTexture(ms, c, x, y, startX, startY, width, height); UIRenderHelper.drawColoredTexture(ms, c, x, y, startX, startY, width, height);
} }

View file

@ -2,12 +2,15 @@ package com.simibubi.create.foundation.gui;
import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.systems.RenderSystem;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.blaze3d.vertex.PoseStack.Pose;
import com.mojang.blaze3d.vertex.VertexConsumer; import com.mojang.blaze3d.vertex.VertexConsumer;
import com.mojang.math.Matrix4f;
import com.simibubi.create.Create; import com.simibubi.create.Create;
import com.simibubi.create.foundation.gui.element.DelegatedStencilElement;
import com.simibubi.create.foundation.gui.element.ScreenElement;
import com.simibubi.create.foundation.utility.Color; import com.simibubi.create.foundation.utility.Color;
import net.minecraft.client.gui.GuiComponent; import net.minecraft.client.gui.GuiComponent;
import net.minecraft.client.renderer.LightTexture;
import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.RenderType;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
@ -15,9 +18,11 @@ import net.minecraft.world.phys.Vec3;
import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.api.distmarker.OnlyIn;
public class AllIcons implements IScreenRenderable { public class AllIcons implements ScreenElement {
public static final ResourceLocation ICON_ATLAS = Create.asResource("textures/gui/icons.png"); public static final ResourceLocation ICON_ATLAS = Create.asResource("textures/gui/icons.png");
public static final int ICON_ATLAS_SIZE = 256;
private static int x = 0, y = -1; private static int x = 0, y = -1;
private int iconX; private int iconX;
private int iconY; private int iconY;
@ -166,51 +171,54 @@ public class AllIcons implements IScreenRenderable {
RenderSystem.setShaderTexture(0, ICON_ATLAS); RenderSystem.setShaderTexture(0, ICON_ATLAS);
} }
@Override
@OnlyIn(Dist.CLIENT) @OnlyIn(Dist.CLIENT)
public void draw(PoseStack matrixStack, GuiComponent screen, int x, int y) { @Override
public void render(PoseStack matrixStack, int x, int y) {
bind(); bind();
screen.blit(matrixStack, x, y, iconX, iconY, 16, 16); GuiComponent.blit(matrixStack, x, y, 0, iconX, iconY, 16, 16, 256, 256);
} }
@OnlyIn(Dist.CLIENT) @OnlyIn(Dist.CLIENT)
public void draw(PoseStack ms, MultiBufferSource buffer, int color) { public void render(PoseStack matrixStack, int x, int y, GuiComponent component) {
bind();
component.blit(matrixStack, x, y, iconX, iconY, 16, 16);
}
@OnlyIn(Dist.CLIENT)
public void render(PoseStack ms, MultiBufferSource buffer, int color) {
VertexConsumer builder = buffer.getBuffer(RenderType.textSeeThrough(ICON_ATLAS)); VertexConsumer builder = buffer.getBuffer(RenderType.textSeeThrough(ICON_ATLAS));
float sheetSize = 256; Matrix4f matrix = ms.last().pose();
int i = 15 << 20 | 15 << 4; Color rgb = new Color(color);
int j = i >> 16 & '\uffff'; int light = LightTexture.FULL_BRIGHT;
int k = i & '\uffff';
Pose peek = ms.last();
Vec3 rgb = Color.vectorFromRGB(color);
Vec3 vec4 = new Vec3(1, 1, 0); Vec3 vec1 = new Vec3(0, 0, 0);
Vec3 vec3 = new Vec3(0, 1, 0); Vec3 vec2 = new Vec3(0, 1, 0);
Vec3 vec2 = new Vec3(0, 0, 0); Vec3 vec3 = new Vec3(1, 1, 0);
Vec3 vec1 = new Vec3(1, 0, 0); Vec3 vec4 = new Vec3(1, 0, 0);
float u1 = (iconX + 16) / sheetSize; float u1 = iconX / ICON_ATLAS_SIZE;
float u2 = iconX / sheetSize; float u2 = (iconX + 16) / ICON_ATLAS_SIZE;
float v1 = iconY / sheetSize; float v1 = iconY / ICON_ATLAS_SIZE;
float v2 = (iconY + 16) / sheetSize; float v2 = (iconY + 16) / ICON_ATLAS_SIZE;
vertex(peek, builder, j, k, rgb, vec1, u1, v1); vertex(builder, matrix, vec1, rgb, u1, v1, light);
vertex(peek, builder, j, k, rgb, vec2, u2, v1); vertex(builder, matrix, vec2, rgb, u1, v2, light);
vertex(peek, builder, j, k, rgb, vec3, u2, v2); vertex(builder, matrix, vec3, rgb, u2, v2, light);
vertex(peek, builder, j, k, rgb, vec4, u1, v2); vertex(builder, matrix, vec4, rgb, u2, v1, light);
}
@OnlyIn(Dist.CLIENT)
private void vertex(VertexConsumer builder, Matrix4f matrix, Vec3 vec, Color rgb, float u, float v, int light) {
builder.vertex(matrix, (float) vec.x, (float) vec.y, (float) vec.z)
.color(rgb.getRed(), rgb.getGreen(), rgb.getBlue(), 255)
.uv(u, v)
.uv2(light)
.endVertex();
} }
@OnlyIn(Dist.CLIENT) @OnlyIn(Dist.CLIENT)
public DelegatedStencilElement asStencil() { public DelegatedStencilElement asStencil() {
return new DelegatedStencilElement().withStencilRenderer((ms, w, h, alpha) -> this.draw(ms, 0, 0)).withBounds(16, 16); return new DelegatedStencilElement().withStencilRenderer((ms, w, h, alpha) -> this.render(ms, 0, 0)).withBounds(16, 16);
}
@OnlyIn(Dist.CLIENT)
private void vertex(Pose peek, VertexConsumer builder, int j, int k, Vec3 rgb, Vec3 vec, float u, float v) {
builder.vertex(peek.pose(), (float) vec.x, (float) vec.y, (float) vec.z)
.color((float) rgb.x, (float) rgb.y, (float) rgb.z, 1)
.uv(u, v)
.uv2(j, k)
.endVertex();
} }
} }

View file

@ -6,7 +6,6 @@ import java.util.function.Consumer;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL20; import org.lwjgl.opengl.GL20;
import org.lwjgl.opengl.GL30; import org.lwjgl.opengl.GL30;
@ -14,8 +13,11 @@ import com.jozufozu.flywheel.backend.Backend;
import com.jozufozu.flywheel.backend.gl.versioned.GlCompat; import com.jozufozu.flywheel.backend.gl.versioned.GlCompat;
import com.mojang.blaze3d.pipeline.RenderTarget; import com.mojang.blaze3d.pipeline.RenderTarget;
import com.mojang.blaze3d.platform.GlConst; import com.mojang.blaze3d.platform.GlConst;
import com.mojang.blaze3d.systems.RenderSystem;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.PoseStack;
import com.simibubi.create.foundation.gui.widgets.BoxWidget; import com.simibubi.create.foundation.gui.element.BoxElement;
import com.simibubi.create.foundation.gui.element.TextStencilElement;
import com.simibubi.create.foundation.gui.widget.BoxWidget;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.gui.screens.Screen;
@ -108,7 +110,7 @@ public class ConfirmationScreen extends AbstractSimiScreen {
@Override @Override
protected void init() { protected void init() {
widgets.clear(); super.init();
ArrayList<FormattedText> copy = new ArrayList<>(text); ArrayList<FormattedText> copy = new ArrayList<>(text);
text.clear(); text.clear();
@ -139,7 +141,7 @@ public class ConfirmationScreen extends AbstractSimiScreen {
new TextStencilElement(minecraft.font, tristate ? "Save" : "Confirm").centered(true, true); new TextStencilElement(minecraft.font, tristate ? "Save" : "Confirm").centered(true, true);
confirm = new BoxWidget(buttonX, y + textHeight + 6, 70, 16).withCallback(() -> accept(Response.Confirm)); confirm = new BoxWidget(buttonX, y + textHeight + 6, 70, 16).withCallback(() -> accept(Response.Confirm));
confirm.showingElement(confirmText.withElementRenderer(BoxWidget.gradientFactory.apply(confirm))); confirm.showingElement(confirmText.withElementRenderer(BoxWidget.gradientFactory.apply(confirm)));
widgets.add(confirm); addRenderableWidget(confirm);
buttonX += 12 + 70; buttonX += 12 + 70;
@ -150,7 +152,7 @@ public class ConfirmationScreen extends AbstractSimiScreen {
new BoxWidget(buttonX, y + textHeight + 6, 70, 16).withCallback(() -> accept(Response.ConfirmDontSave)); new BoxWidget(buttonX, y + textHeight + 6, 70, 16).withCallback(() -> accept(Response.ConfirmDontSave));
confirmDontSave.showingElement( confirmDontSave.showingElement(
confirmDontSaveText.withElementRenderer(BoxWidget.gradientFactory.apply(confirmDontSave))); confirmDontSaveText.withElementRenderer(BoxWidget.gradientFactory.apply(confirmDontSave)));
widgets.add(confirmDontSave); addRenderableWidget(confirmDontSave);
buttonX += 12 + 70; buttonX += 12 + 70;
} }
@ -158,7 +160,7 @@ public class ConfirmationScreen extends AbstractSimiScreen {
cancel = new BoxWidget(buttonX, y + textHeight + 6, 70, 16) cancel = new BoxWidget(buttonX, y + textHeight + 6, 70, 16)
.withCallback(() -> accept(Response.Cancel)); .withCallback(() -> accept(Response.Cancel));
cancel.showingElement(cancelText.withElementRenderer(BoxWidget.gradientFactory.apply(cancel))); cancel.showingElement(cancelText.withElementRenderer(BoxWidget.gradientFactory.apply(cancel)));
widgets.add(cancel); addRenderableWidget(cancel);
textBackground = new BoxElement() textBackground = new BoxElement()
.gradientBorder(Theme.p(Theme.Key.BUTTON_DISABLE)) .gradientBorder(Theme.p(Theme.Key.BUTTON_DISABLE))
@ -215,7 +217,7 @@ public class ConfirmationScreen extends AbstractSimiScreen {
@Override @Override
protected void prepareFrame() { protected void prepareFrame() {
RenderTarget thisBuffer = UIRenderHelper.framebuffer; RenderTarget thisBuffer = UIRenderHelper.framebuffer;
RenderTarget mainBuffer = Minecraft.getInstance().getMainRenderTarget(); RenderTarget mainBuffer = minecraft.getMainRenderTarget();
GlCompat functions = Backend.getInstance().compat; GlCompat functions = Backend.getInstance().compat;
functions.fbo.bindFramebuffer(GL30.GL_READ_FRAMEBUFFER, mainBuffer.frameBufferId); functions.fbo.bindFramebuffer(GL30.GL_READ_FRAMEBUFFER, mainBuffer.frameBufferId);
@ -223,15 +225,13 @@ public class ConfirmationScreen extends AbstractSimiScreen {
functions.blit.blitFramebuffer(0, 0, mainBuffer.viewWidth, mainBuffer.viewHeight, 0, 0, mainBuffer.viewWidth, mainBuffer.viewHeight, GL30.GL_COLOR_BUFFER_BIT, GL20.GL_LINEAR); functions.blit.blitFramebuffer(0, 0, mainBuffer.viewWidth, mainBuffer.viewHeight, 0, 0, mainBuffer.viewWidth, mainBuffer.viewHeight, GL30.GL_COLOR_BUFFER_BIT, GL20.GL_LINEAR);
functions.fbo.bindFramebuffer(GlConst.GL_FRAMEBUFFER, thisBuffer.frameBufferId); functions.fbo.bindFramebuffer(GlConst.GL_FRAMEBUFFER, thisBuffer.frameBufferId);
GL11.glClear(GL30.GL_STENCIL_BUFFER_BIT | GL30.GL_DEPTH_BUFFER_BIT); RenderSystem.clear(GL30.GL_STENCIL_BUFFER_BIT | GL30.GL_DEPTH_BUFFER_BIT, Minecraft.ON_OSX);
} }
@Override @Override
protected void endFrame() { protected void endFrame() {
RenderTarget thisBuffer = UIRenderHelper.framebuffer; RenderTarget thisBuffer = UIRenderHelper.framebuffer;
RenderTarget mainBuffer = Minecraft.getInstance().getMainRenderTarget(); RenderTarget mainBuffer = minecraft.getMainRenderTarget();
GlCompat functions = Backend.getInstance().compat; GlCompat functions = Backend.getInstance().compat;
functions.fbo.bindFramebuffer(GL30.GL_READ_FRAMEBUFFER, thisBuffer.frameBufferId); functions.fbo.bindFramebuffer(GL30.GL_READ_FRAMEBUFFER, thisBuffer.frameBufferId);

View file

@ -1,4 +1,4 @@
package com.simibubi.create.foundation.gui.mainMenu; package com.simibubi.create.foundation.gui;
import com.jozufozu.flywheel.util.transform.MatrixTransformStack; import com.jozufozu.flywheel.util.transform.MatrixTransformStack;
import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.platform.GlStateManager;
@ -7,11 +7,8 @@ import com.mojang.blaze3d.vertex.PoseStack;
import com.simibubi.create.AllBlocks; import com.simibubi.create.AllBlocks;
import com.simibubi.create.Create; import com.simibubi.create.Create;
import com.simibubi.create.foundation.config.ui.BaseConfigScreen; import com.simibubi.create.foundation.config.ui.BaseConfigScreen;
import com.simibubi.create.foundation.gui.AbstractSimiScreen; import com.simibubi.create.foundation.gui.element.BoxElement;
import com.simibubi.create.foundation.gui.AllGuiTextures; import com.simibubi.create.foundation.gui.element.GuiGameElement;
import com.simibubi.create.foundation.gui.BoxElement;
import com.simibubi.create.foundation.gui.GuiGameElement;
import com.simibubi.create.foundation.gui.ScreenOpener;
import com.simibubi.create.foundation.item.TooltipHelper; import com.simibubi.create.foundation.item.TooltipHelper;
import com.simibubi.create.foundation.ponder.content.PonderTagIndexScreen; import com.simibubi.create.foundation.ponder.content.PonderTagIndexScreen;
import com.simibubi.create.foundation.utility.Color; import com.simibubi.create.foundation.utility.Color;
@ -104,7 +101,7 @@ public class CreateMainMenuScreen extends AbstractSimiScreen {
ms.translate(width / 2 - 32, 32, -10); ms.translate(width / 2 - 32, 32, -10);
ms.pushPose(); ms.pushPose();
ms.scale(0.25f, 0.25f, 0.25f); ms.scale(0.25f, 0.25f, 0.25f);
AllGuiTextures.LOGO.draw(ms, 0, 0); AllGuiTextures.LOGO.render(ms, 0, 0, this);
ms.popPose(); ms.popPose();
new BoxElement().withBackground(0x88_000000) new BoxElement().withBackground(0x88_000000)
.flatBorder(new Color(0x01_000000)) .flatBorder(new Color(0x01_000000))

View file

@ -1,20 +0,0 @@
package com.simibubi.create.foundation.gui;
import com.mojang.blaze3d.vertex.PoseStack;
import com.simibubi.create.CreateClient;
import net.minecraft.client.gui.GuiComponent;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
public interface IScreenRenderable {
@OnlyIn(Dist.CLIENT)
void draw(PoseStack ms, GuiComponent screen, int x, int y);
@OnlyIn(Dist.CLIENT)
default void draw(PoseStack ms, int x, int y) {
draw(ms, CreateClient.EMPTY_SCREEN, x, y);
}
}

View file

@ -15,25 +15,25 @@ import com.simibubi.create.foundation.utility.Couple;
public class Theme { public class Theme {
private static final List<Theme> themes = new ArrayList<>(); private static final List<Theme> THEMES = new ArrayList<>();
private static final Theme base = addTheme(new Theme()); private static final Theme BASE = addTheme(new Theme());
public static Theme addTheme(@Nonnull Theme theme) { public static Theme addTheme(@Nonnull Theme theme) {
themes.add(theme); THEMES.add(theme);
themes.sort(Comparator.comparingInt(Theme::getPriority).reversed()); THEMES.sort(Comparator.comparingInt(Theme::getPriority).reversed());
return theme; return theme;
} }
public static void removeTheme(Theme theme) { public static void removeTheme(Theme theme) {
themes.remove(theme); THEMES.remove(theme);
} }
public static void reload() { public static void reload() {
themes.forEach(Theme::init); THEMES.forEach(Theme::init);
} }
private static ColorHolder resolve(String key) { private static ColorHolder resolve(String key) {
return themes return THEMES
.stream() .stream()
.map(theme -> theme.get(key)) .map(theme -> theme.get(key))
.filter(Objects::nonNull) .filter(Objects::nonNull)

View file

@ -0,0 +1,7 @@
package com.simibubi.create.foundation.gui;
import net.minecraft.client.gui.components.events.GuiEventListener;
public interface TickableGuiEventListener extends GuiEventListener {
void tick();
}

Some files were not shown because too many files have changed in this diff Show more