mirror of
https://github.com/Sollace/Unicopia.git
synced 2024-11-23 21:38:00 +01:00
Show a complete list of items with the applicable trait, but as a mystery for items that haven't yet been discovered
This commit is contained in:
parent
f923f7e872
commit
5595468c4b
5 changed files with 128 additions and 24 deletions
|
@ -1,5 +1,7 @@
|
||||||
package com.minelittlepony.unicopia.ability.magic.spell.crafting;
|
package com.minelittlepony.unicopia.ability.magic.spell.crafting;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
import com.minelittlepony.unicopia.ability.magic.spell.trait.Trait;
|
import com.minelittlepony.unicopia.ability.magic.spell.trait.Trait;
|
||||||
import com.minelittlepony.unicopia.container.SpellbookScreenHandler.SpellbookInventory;
|
import com.minelittlepony.unicopia.container.SpellbookScreenHandler.SpellbookInventory;
|
||||||
import com.minelittlepony.unicopia.item.UItems;
|
import com.minelittlepony.unicopia.item.UItems;
|
||||||
|
@ -34,6 +36,16 @@ public interface SpellbookRecipe extends Recipe<SpellbookInventory> {
|
||||||
|
|
||||||
void input(Trait trait, float value);
|
void input(Trait trait, float value);
|
||||||
|
|
||||||
|
void mystery(ItemStack...stacks);
|
||||||
|
|
||||||
void result(ItemStack...stack);
|
void result(ItemStack...stack);
|
||||||
|
|
||||||
|
default void input(List<ItemStack> stacks) {
|
||||||
|
input(stacks.toArray(ItemStack[]::new));
|
||||||
|
}
|
||||||
|
|
||||||
|
default void mystery(List<ItemStack> stacks) {
|
||||||
|
mystery(stacks.toArray(ItemStack[]::new));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,13 +9,19 @@ import com.minelittlepony.common.client.gui.element.Button;
|
||||||
import com.minelittlepony.unicopia.ability.magic.spell.crafting.SpellbookRecipe;
|
import com.minelittlepony.unicopia.ability.magic.spell.crafting.SpellbookRecipe;
|
||||||
import com.minelittlepony.unicopia.ability.magic.spell.trait.Trait;
|
import com.minelittlepony.unicopia.ability.magic.spell.trait.Trait;
|
||||||
import com.minelittlepony.unicopia.client.gui.ItemTraitsTooltipRenderer;
|
import com.minelittlepony.unicopia.client.gui.ItemTraitsTooltipRenderer;
|
||||||
|
import com.mojang.blaze3d.platform.GlStateManager;
|
||||||
import com.mojang.blaze3d.systems.RenderSystem;
|
import com.mojang.blaze3d.systems.RenderSystem;
|
||||||
|
|
||||||
import net.minecraft.client.MinecraftClient;
|
import net.minecraft.client.MinecraftClient;
|
||||||
|
import net.minecraft.client.gui.screen.Screen;
|
||||||
import net.minecraft.client.item.TooltipContext;
|
import net.minecraft.client.item.TooltipContext;
|
||||||
|
import net.minecraft.client.render.*;
|
||||||
import net.minecraft.client.render.item.ItemRenderer;
|
import net.minecraft.client.render.item.ItemRenderer;
|
||||||
|
import net.minecraft.client.render.model.json.ModelTransformation;
|
||||||
import net.minecraft.client.util.math.MatrixStack;
|
import net.minecraft.client.util.math.MatrixStack;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
|
import net.minecraft.screen.PlayerScreenHandler;
|
||||||
|
import net.minecraft.text.Text;
|
||||||
import net.minecraft.util.math.Vector4f;
|
import net.minecraft.util.math.Vector4f;
|
||||||
|
|
||||||
class IngredientTree implements SpellbookRecipe.CraftingTreeBuilder {
|
class IngredientTree implements SpellbookRecipe.CraftingTreeBuilder {
|
||||||
|
@ -53,6 +59,13 @@ class IngredientTree implements SpellbookRecipe.CraftingTreeBuilder {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void mystery(ItemStack... stacks) {
|
||||||
|
if (stacks.length > 0) {
|
||||||
|
entries.add(new HiddenStacks(stacks));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void result(ItemStack...stacks) {
|
public void result(ItemStack...stacks) {
|
||||||
if (stacks.length > 0) {
|
if (stacks.length > 0) {
|
||||||
|
@ -80,7 +93,7 @@ class IngredientTree implements SpellbookRecipe.CraftingTreeBuilder {
|
||||||
int column = ii % cols;
|
int column = ii % cols;
|
||||||
int row = ii / cols;
|
int row = ii / cols;
|
||||||
|
|
||||||
int left = x + column * colWidth + 3 + (row > 0 ? colWidth : 0);
|
int left = x + column * colWidth + 3 + (addLabels && row > 0 ? colWidth : 0);
|
||||||
int top = y + row * rowHeight + 3;
|
int top = y + row * rowHeight + 3;
|
||||||
|
|
||||||
container.addButton(new IngredientButton(left, top, colWidth, rowHeight, entry, !addLabels || ii == 0 ? "" : "+"));
|
container.addButton(new IngredientButton(left, top, colWidth, rowHeight, entry, !addLabels || ii == 0 ? "" : "+"));
|
||||||
|
@ -101,13 +114,14 @@ class IngredientTree implements SpellbookRecipe.CraftingTreeBuilder {
|
||||||
super(x, y, width, height);
|
super(x, y, width, height);
|
||||||
this.entry = entry;
|
this.entry = entry;
|
||||||
this.label = label;
|
this.label = label;
|
||||||
this.getStyle().setTooltip(entry.getTooltip());
|
Tooltip tooltip = entry.getTooltip();
|
||||||
|
if (tooltip != null) {
|
||||||
|
this.getStyle().setTooltip(tooltip);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void renderButton(MatrixStack matrices, int mouseX, int mouseY, float tickDelta) {
|
public void renderButton(MatrixStack matrices, int mouseX, int mouseY, float tickDelta) {
|
||||||
|
|
||||||
RenderSystem.setShaderColor(1, 1, 1, 1);
|
RenderSystem.setShaderColor(1, 1, 1, 1);
|
||||||
RenderSystem.setShaderTexture(0, SpellbookScreen.SLOT);
|
RenderSystem.setShaderTexture(0, SpellbookScreen.SLOT);
|
||||||
RenderSystem.enableBlend();
|
RenderSystem.enableBlend();
|
||||||
|
@ -124,6 +138,18 @@ class IngredientTree implements SpellbookRecipe.CraftingTreeBuilder {
|
||||||
);
|
);
|
||||||
entry.render(matrices, x, y, tickDelta);
|
entry.render(matrices, x, y, tickDelta);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void renderToolTip(MatrixStack matrices, Screen parent, int mouseX, int mouseY) {
|
||||||
|
if (visible) {
|
||||||
|
getStyle().getTooltip().ifPresent(tooltip -> {
|
||||||
|
List<Text> lines = tooltip.getLines();
|
||||||
|
if (!lines.isEmpty()) {
|
||||||
|
parent.renderTooltip(matrices, tooltip.getLines(), mouseX + getStyle().toolTipX, mouseY + getStyle().toolTipY);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
interface Entry {
|
interface Entry {
|
||||||
|
@ -134,10 +160,10 @@ class IngredientTree implements SpellbookRecipe.CraftingTreeBuilder {
|
||||||
|
|
||||||
class Stacks implements IngredientTree.Entry {
|
class Stacks implements IngredientTree.Entry {
|
||||||
private int ticker;
|
private int ticker;
|
||||||
private int index;
|
protected int index;
|
||||||
private final ItemStack[] stacks;
|
protected final ItemStack[] stacks;
|
||||||
|
|
||||||
private final ItemRenderer itemRenderer = MinecraftClient.getInstance().getItemRenderer();
|
protected final ItemRenderer itemRenderer = MinecraftClient.getInstance().getItemRenderer();
|
||||||
|
|
||||||
Stacks(ItemStack[] stacks) {
|
Stacks(ItemStack[] stacks) {
|
||||||
this.stacks = stacks;
|
this.stacks = stacks;
|
||||||
|
@ -150,19 +176,68 @@ class IngredientTree implements SpellbookRecipe.CraftingTreeBuilder {
|
||||||
if (ticker++ % 500 == 0) {
|
if (ticker++ % 500 == 0) {
|
||||||
index = (index + 1) % stacks.length;
|
index = (index + 1) % stacks.length;
|
||||||
}
|
}
|
||||||
float z = itemRenderer.zOffset;
|
|
||||||
itemRenderer.zOffset = -100;
|
|
||||||
|
|
||||||
Vector4f vector4f = new Vector4f(x, y, z, 1);
|
Vector4f pos = new Vector4f(x, y, 0, 1);
|
||||||
vector4f.transform(matrices.peek().getPositionMatrix());
|
pos.transform(matrices.peek().getPositionMatrix());
|
||||||
|
drawItem((int)pos.getX(), (int)pos.getY());
|
||||||
|
}
|
||||||
|
|
||||||
itemRenderer.renderInGui(stacks[index], (int)vector4f.getX(), (int)vector4f.getY());
|
protected void drawItem(int x, int y) {
|
||||||
itemRenderer.zOffset = z;
|
itemRenderer.renderInGui(stacks[index], x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Tooltip getTooltip() {
|
public Tooltip getTooltip() {
|
||||||
return () -> stacks[index].getTooltip(MinecraftClient.getInstance().player, TooltipContext.Default.NORMAL);
|
return () -> {
|
||||||
|
if (stacks[index].isEmpty()) {
|
||||||
|
return List.of();
|
||||||
|
}
|
||||||
|
return stacks[index].getTooltip(MinecraftClient.getInstance().player, TooltipContext.Default.NORMAL);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class HiddenStacks extends Stacks {
|
||||||
|
HiddenStacks(ItemStack[] stacks) {
|
||||||
|
super(stacks);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void drawItem(int x, int y) {
|
||||||
|
var model = itemRenderer.getModel(stacks[index], null, null, 0);
|
||||||
|
|
||||||
|
MinecraftClient.getInstance().getTextureManager().getTexture(PlayerScreenHandler.BLOCK_ATLAS_TEXTURE).setFilter(false, false);
|
||||||
|
RenderSystem.setShaderTexture(0, PlayerScreenHandler.BLOCK_ATLAS_TEXTURE);
|
||||||
|
RenderSystem.enableBlend();
|
||||||
|
RenderSystem.blendFunc(GlStateManager.SrcFactor.SRC_ALPHA, GlStateManager.DstFactor.ONE_MINUS_SRC_ALPHA);
|
||||||
|
RenderSystem.setShaderColor(1, 1, 1, 0.2F);
|
||||||
|
MatrixStack matrixStack = RenderSystem.getModelViewStack();
|
||||||
|
matrixStack.push();
|
||||||
|
matrixStack.translate(x, y, 100 + itemRenderer.zOffset);
|
||||||
|
matrixStack.translate(8, 8, 0);
|
||||||
|
matrixStack.scale(1, -1, 1);
|
||||||
|
matrixStack.scale(8, 8, 8);
|
||||||
|
RenderSystem.applyModelViewMatrix();
|
||||||
|
VertexConsumerProvider.Immediate immediate = MinecraftClient.getInstance().getBufferBuilders().getEntityVertexConsumers();
|
||||||
|
boolean bl = !model.isSideLit();
|
||||||
|
if (bl) {
|
||||||
|
DiffuseLighting.disableGuiDepthLighting();
|
||||||
|
}
|
||||||
|
itemRenderer.renderItem(stacks[index], ModelTransformation.Mode.GUI, false, new MatrixStack(), immediate, 0, OverlayTexture.DEFAULT_UV, model);
|
||||||
|
immediate.draw();
|
||||||
|
RenderSystem.enableDepthTest();
|
||||||
|
if (bl) {
|
||||||
|
DiffuseLighting.enableGuiDepthLighting();
|
||||||
|
}
|
||||||
|
matrixStack.pop();
|
||||||
|
RenderSystem.applyModelViewMatrix();
|
||||||
|
|
||||||
|
RenderSystem.setShaderColor(1, 1, 1, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Tooltip getTooltip() {
|
||||||
|
return List::of;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -104,7 +104,7 @@ public class SpellbookCraftingPageContent extends ScrollContainer implements Spe
|
||||||
public void drawOverlays(MatrixStack matrices, int mouseX, int mouseY, float tickDelta) {
|
public void drawOverlays(MatrixStack matrices, int mouseX, int mouseY, float tickDelta) {
|
||||||
matrices.push();
|
matrices.push();
|
||||||
matrices.translate(margin.left, margin.top, 0);
|
matrices.translate(margin.left, margin.top, 0);
|
||||||
matrices.translate(-2, -2, 0);
|
matrices.translate(-2, -2, 200);
|
||||||
RenderSystem.enableBlend();
|
RenderSystem.enableBlend();
|
||||||
RenderSystem.setShaderTexture(0, SpellbookScreen.TEXTURE);
|
RenderSystem.setShaderTexture(0, SpellbookScreen.TEXTURE);
|
||||||
int tileSize = 25;
|
int tileSize = 25;
|
||||||
|
|
|
@ -132,8 +132,6 @@ public class SpellbookScreen extends HandledScreen<SpellbookScreenHandler> imple
|
||||||
|
|
||||||
drawTexture(matrices, x, y, 0, 0, backgroundWidth, backgroundHeight, 512, 256);
|
drawTexture(matrices, x, y, 0, 0, backgroundWidth, backgroundHeight, 512, 256);
|
||||||
|
|
||||||
this.clearAndInit();
|
|
||||||
|
|
||||||
tabs.getAllTabs().forEach(tab -> {
|
tabs.getAllTabs().forEach(tab -> {
|
||||||
Bounds bounds = tab.bounds();
|
Bounds bounds = tab.bounds();
|
||||||
chapters.getCurrentChapter();
|
chapters.getCurrentChapter();
|
||||||
|
|
|
@ -1,8 +1,12 @@
|
||||||
package com.minelittlepony.unicopia.container;
|
package com.minelittlepony.unicopia.container;
|
||||||
|
|
||||||
|
import java.util.Comparator;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
import com.minelittlepony.common.client.gui.IViewRoot;
|
import com.minelittlepony.common.client.gui.IViewRoot;
|
||||||
import com.minelittlepony.common.client.gui.ScrollContainer;
|
import com.minelittlepony.common.client.gui.ScrollContainer;
|
||||||
import com.minelittlepony.common.client.gui.element.Label;
|
import com.minelittlepony.common.client.gui.element.Label;
|
||||||
|
import com.minelittlepony.unicopia.ability.magic.spell.trait.SpellTraits;
|
||||||
import com.minelittlepony.unicopia.ability.magic.spell.trait.Trait;
|
import com.minelittlepony.unicopia.ability.magic.spell.trait.Trait;
|
||||||
import com.minelittlepony.unicopia.entity.player.Pony;
|
import com.minelittlepony.unicopia.entity.player.Pony;
|
||||||
import com.mojang.blaze3d.systems.RenderSystem;
|
import com.mojang.blaze3d.systems.RenderSystem;
|
||||||
|
@ -10,12 +14,14 @@ import com.mojang.blaze3d.systems.RenderSystem;
|
||||||
import net.minecraft.client.MinecraftClient;
|
import net.minecraft.client.MinecraftClient;
|
||||||
import net.minecraft.client.gui.DrawableHelper;
|
import net.minecraft.client.gui.DrawableHelper;
|
||||||
import net.minecraft.client.util.math.MatrixStack;
|
import net.minecraft.client.util.math.MatrixStack;
|
||||||
|
import net.minecraft.item.*;
|
||||||
import net.minecraft.text.Text;
|
import net.minecraft.text.Text;
|
||||||
|
import net.minecraft.util.collection.DefaultedList;
|
||||||
import net.minecraft.util.math.MathHelper;
|
import net.minecraft.util.math.MathHelper;
|
||||||
|
|
||||||
public class SpellbookTraitDexPageContent extends DrawableHelper implements SpellbookChapterList.Content, SpellbookScreen.RecipesChangedListener {
|
public class SpellbookTraitDexPageContent extends DrawableHelper implements SpellbookChapterList.Content, SpellbookScreen.RecipesChangedListener {
|
||||||
|
|
||||||
private final Trait[] traits = Trait.all().toArray(Trait[]::new);
|
private final Trait[] traits = Trait.values();
|
||||||
private int offset;
|
private int offset;
|
||||||
|
|
||||||
private final DexPage leftPage = new DexPage();
|
private final DexPage leftPage = new DexPage();
|
||||||
|
@ -51,6 +57,7 @@ public class SpellbookTraitDexPageContent extends DrawableHelper implements Spel
|
||||||
public DexPage() {
|
public DexPage() {
|
||||||
scrollbar.layoutToEnd = true;
|
scrollbar.layoutToEnd = true;
|
||||||
backgroundColor = 0xFFf9efd3;
|
backgroundColor = 0xFFf9efd3;
|
||||||
|
getContentPadding().setVertical(10);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void init(SpellbookScreen screen, int page) {
|
public void init(SpellbookScreen screen, int page) {
|
||||||
|
@ -80,8 +87,20 @@ public class SpellbookTraitDexPageContent extends DrawableHelper implements Spel
|
||||||
.setText(known ? Text.translatable("gui.unicopia.trait.label",
|
.setText(known ? Text.translatable("gui.unicopia.trait.label",
|
||||||
Text.translatable("trait." + trait.getId().getNamespace() + "." + trait.getId().getPath() + ".name")
|
Text.translatable("trait." + trait.getId().getNamespace() + "." + trait.getId().getPath() + ".name")
|
||||||
) : Text.literal("???"));
|
) : Text.literal("???"));
|
||||||
IngredientTree tree = new IngredientTree(0, 50, width).noLabels();
|
IngredientTree tree = new IngredientTree(0, 50, width + 18).noLabels();
|
||||||
Pony.of(MinecraftClient.getInstance().player).getDiscoveries().getKnownItems(trait).forEach(i -> tree.input(i.getDefaultStack()));
|
|
||||||
|
List<Item> knownItems = Pony.of(MinecraftClient.getInstance().player).getDiscoveries().getKnownItems(trait).toList();
|
||||||
|
SpellTraits.getItems(trait)
|
||||||
|
.sorted(Comparator.comparing(u -> knownItems.contains(u) ? 0 : 1))
|
||||||
|
.forEach(i -> {
|
||||||
|
DefaultedList<ItemStack> stacks = DefaultedList.of();
|
||||||
|
i.appendStacks(ItemGroup.SEARCH, stacks);
|
||||||
|
if (knownItems.contains(i)) {
|
||||||
|
tree.input(stacks);
|
||||||
|
} else {
|
||||||
|
tree.mystery(stacks);
|
||||||
|
}
|
||||||
|
});
|
||||||
tree.build(this);
|
tree.build(this);
|
||||||
});
|
});
|
||||||
screen.addDrawable(this);
|
screen.addDrawable(this);
|
||||||
|
@ -93,7 +112,7 @@ public class SpellbookTraitDexPageContent extends DrawableHelper implements Spel
|
||||||
public void drawOverlays(MatrixStack matrices, int mouseX, int mouseY, float tickDelta) {
|
public void drawOverlays(MatrixStack matrices, int mouseX, int mouseY, float tickDelta) {
|
||||||
matrices.push();
|
matrices.push();
|
||||||
matrices.translate(margin.left, margin.top, 0);
|
matrices.translate(margin.left, margin.top, 0);
|
||||||
matrices.translate(-2, -2, 0);
|
matrices.translate(-2, -2, 200);
|
||||||
RenderSystem.enableBlend();
|
RenderSystem.enableBlend();
|
||||||
RenderSystem.setShaderTexture(0, SpellbookScreen.TEXTURE);
|
RenderSystem.setShaderTexture(0, SpellbookScreen.TEXTURE);
|
||||||
int tileSize = 25;
|
int tileSize = 25;
|
||||||
|
@ -102,10 +121,7 @@ public class SpellbookTraitDexPageContent extends DrawableHelper implements Spel
|
||||||
final int right = width - tileSize + 9;
|
final int right = width - tileSize + 9;
|
||||||
|
|
||||||
drawTexture(matrices, 0, 0, 405, 62, tileSize, tileSize, 512, 256);
|
drawTexture(matrices, 0, 0, 405, 62, tileSize, tileSize, 512, 256);
|
||||||
drawTexture(matrices, right, 0, 425, 62, tileSize, tileSize, 512, 256);
|
|
||||||
|
|
||||||
drawTexture(matrices, 0, bottom, 405, 72, tileSize, tileSize, 512, 256);
|
drawTexture(matrices, 0, bottom, 405, 72, tileSize, tileSize, 512, 256);
|
||||||
drawTexture(matrices, right, bottom, 425, 72, tileSize, tileSize, 512, 256);
|
|
||||||
|
|
||||||
for (int i = tileSize; i < right; i += tileSize) {
|
for (int i = tileSize; i < right; i += tileSize) {
|
||||||
drawTexture(matrices, i, 0, 415, 62, tileSize, tileSize, 512, 256);
|
drawTexture(matrices, i, 0, 415, 62, tileSize, tileSize, 512, 256);
|
||||||
|
@ -116,6 +132,9 @@ public class SpellbookTraitDexPageContent extends DrawableHelper implements Spel
|
||||||
drawTexture(matrices, 0, i, 405, 67, tileSize, tileSize, 512, 256);
|
drawTexture(matrices, 0, i, 405, 67, tileSize, tileSize, 512, 256);
|
||||||
drawTexture(matrices, right, i, 425, 67, tileSize, tileSize, 512, 256);
|
drawTexture(matrices, right, i, 425, 67, tileSize, tileSize, 512, 256);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
drawTexture(matrices, right, 0, 425, 62, tileSize, tileSize, 512, 256);
|
||||||
|
drawTexture(matrices, right, bottom, 425, 72, tileSize, tileSize, 512, 256);
|
||||||
matrices.pop();
|
matrices.pop();
|
||||||
|
|
||||||
if (this == rightPage) {
|
if (this == rightPage) {
|
||||||
|
|
Loading…
Reference in a new issue