Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Make the crafting UI look like the vanilla crafting table #599

Merged
merged 5 commits into from
Apr 4, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,9 @@ public static class General {
@SerialEntry
public boolean betterPartyFinder = true;

@SerialEntry
public boolean fancyCraftingTable = true;

@SerialEntry
public boolean backpackPreviewWithoutShift = false;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,13 @@ public static ConfigCategory create(SkyblockerConfig defaults, SkyblockerConfig
newValue -> config.general.betterPartyFinder = newValue)
.controller(ConfigUtils::createBooleanController)
.build())
.option(Option.<Boolean>createBuilder()
.name(Text.translatable("text.autoconfig.skyblocker.option.general.fancyCraftingTable"))
.binding(defaults.general.fancyCraftingTable,
() -> config.general.fancyCraftingTable,
newValue -> config.general.fancyCraftingTable = newValue)
.controller(ConfigUtils::createBooleanController)
.build())
.option(Option.<Boolean>createBuilder()
.name(Text.translatable("text.autoconfig.skyblocker.option.general.backpackPreviewWithoutShift"))
.binding(defaults.general.backpackPreviewWithoutShift,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@

import de.hysky.skyblocker.config.SkyblockerConfigManager;
import de.hysky.skyblocker.skyblock.dungeon.partyfinder.PartyFinderScreen;
import de.hysky.skyblocker.skyblock.item.SkyblockCraftingTableScreenHandler;
import de.hysky.skyblocker.skyblock.item.SkyblockCraftingTableScreen;
import de.hysky.skyblocker.utils.Utils;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.screen.ingame.HandledScreens;
import net.minecraft.client.network.ClientPlayerEntity;
Expand All @@ -19,11 +22,11 @@
public interface HandledScreenProviderMixin<T extends ScreenHandler> {
@Inject(method = "open", at = @At("HEAD"), cancellable = true)
default void skyblocker$open(Text name, ScreenHandlerType<T> type, MinecraftClient client, int id, CallbackInfo ci) {
if (!SkyblockerConfigManager.get().general.betterPartyFinder) return;
ClientPlayerEntity player = client.player;
if (player == null) return;
if (!Utils.isOnSkyblock()) return;
T screenHandler = type.create(id, player.getInventory());
if (screenHandler instanceof GenericContainerScreenHandler containerScreenHandler && PartyFinderScreen.possibleInventoryNames.contains(name.getString().toLowerCase())) {
if (SkyblockerConfigManager.get().general.betterPartyFinder && screenHandler instanceof GenericContainerScreenHandler containerScreenHandler && PartyFinderScreen.possibleInventoryNames.contains(name.getString().toLowerCase())) {
if (client.currentScreen != null) {
String lowerCase = client.currentScreen.getTitle().getString().toLowerCase();
if (lowerCase.contains("group builder")) return;
Expand All @@ -41,6 +44,11 @@ public interface HandledScreenProviderMixin<T extends ScreenHandler> {
client.setScreen(new PartyFinderScreen(containerScreenHandler, player.getInventory(), name));
}

ci.cancel();
} else if (SkyblockerConfigManager.get().general.fancyCraftingTable && screenHandler instanceof GenericContainerScreenHandler containerScreenHandler && name.getString().toLowerCase().contains("craft item")) {
SkyblockCraftingTableScreenHandler skyblockCraftingTableScreenHandler = new SkyblockCraftingTableScreenHandler(containerScreenHandler, player.getInventory());
client.player.currentScreenHandler = skyblockCraftingTableScreenHandler;
client.setScreen(new SkyblockCraftingTableScreen(skyblockCraftingTableScreenHandler, player.getInventory(), Text.literal("Craft Item")));
ci.cancel();
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,194 @@
package de.hysky.skyblocker.skyblock.item;

import de.hysky.skyblocker.SkyblockerMod;
import de.hysky.skyblocker.skyblock.itemlist.ItemListWidget;
import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.gui.screen.ButtonTextures;
import net.minecraft.client.gui.screen.ingame.HandledScreen;
import net.minecraft.client.gui.screen.recipebook.RecipeBookWidget;
import net.minecraft.client.gui.tooltip.Tooltip;
import net.minecraft.client.gui.widget.TexturedButtonWidget;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.entity.player.PlayerInventory;
import net.minecraft.inventory.SimpleInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.recipe.Recipe;
import net.minecraft.recipe.RecipeEntry;
import net.minecraft.recipe.RecipeMatcher;
import net.minecraft.recipe.book.RecipeBookCategory;
import net.minecraft.screen.AbstractRecipeScreenHandler;
import net.minecraft.screen.ScreenHandlerType;
import net.minecraft.screen.slot.Slot;
import net.minecraft.screen.slot.SlotActionType;
import net.minecraft.text.Text;
import net.minecraft.util.Identifier;

public class SkyblockCraftingTableScreen extends HandledScreen<SkyblockCraftingTableScreenHandler> {
private static final Identifier TEXTURE = new Identifier("textures/gui/container/crafting_table.png");
protected static final ButtonTextures MORE_CRAFTS_TEXTURES = new ButtonTextures(
new Identifier(SkyblockerMod.NAMESPACE, "quick_craft/more_button"),
new Identifier(SkyblockerMod.NAMESPACE, "quick_craft/more_button_disabled"),
new Identifier(SkyblockerMod.NAMESPACE, "quick_craft/more_button_highlighted")
);

protected static final Identifier QUICK_CRAFT = new Identifier(SkyblockerMod.NAMESPACE, "quick_craft/quick_craft_overlay");
private final ItemListWidget recipeBook = new ItemListWidget();
private boolean narrow;
private TexturedButtonWidget moreCraftsButton;

public SkyblockCraftingTableScreen(SkyblockCraftingTableScreenHandler handler, PlayerInventory inventory, Text title) {
super(handler, inventory, title);
this.backgroundWidth += 22;
}

@Override
protected void init() {
super.init();
this.narrow = this.width < 379;
this.recipeBook.initialize(this.width, this.height, this.client, this.narrow, new DummyRecipeScreenHandler());
this.x = this.recipeBook.findLeftEdge(this.width, this.backgroundWidth) + 11;
this.addDrawableChild(new TexturedButtonWidget(this.x + 5, this.height / 2 - 49, 20, 18, RecipeBookWidget.BUTTON_TEXTURES, button -> {
this.recipeBook.toggleOpen();
this.x = this.recipeBook.findLeftEdge(this.width, this.backgroundWidth) + 11;
button.setPosition(this.x + 5, this.height / 2 - 49);
if (moreCraftsButton != null) moreCraftsButton.setPosition(this.x + 174, this.y + 62);
}));
moreCraftsButton = new TexturedButtonWidget(this.x + 174, y + 62, 16, 16, MORE_CRAFTS_TEXTURES,
button -> this.onMouseClick(handler.slots.get(26), handler.slots.get(26).id, 0, SlotActionType.PICKUP));
moreCraftsButton.setTooltipDelay(250);
moreCraftsButton.setTooltip(Tooltip.of(Text.literal("More Crafts")));
this.addDrawableChild(moreCraftsButton);
assert (client != null ? client.player : null) != null;
client.player.currentScreenHandler = handler; // recipe book replaces it with the Dummy one fucking DUMBASS
this.addSelectableChild(this.recipeBook);
this.setInitialFocus(this.recipeBook);
this.titleX = 29;
}

@Override
public void handledScreenTick() {
super.handledScreenTick();
this.recipeBook.update();
if (moreCraftsButton == null) return;
ItemStack stack = handler.slots.get(26).getStack();
moreCraftsButton.active = stack.isEmpty() || stack.isOf(Items.PLAYER_HEAD);
}

@Override
public void render(DrawContext context, int mouseX, int mouseY, float delta) {
if (this.recipeBook.isOpen() && this.narrow) {
this.renderBackground(context, mouseX, mouseY, delta);
this.recipeBook.render(context, mouseX, mouseY, delta);
} else {
super.render(context, mouseX, mouseY, delta);
this.recipeBook.render(context, mouseX, mouseY, delta);
this.recipeBook.drawGhostSlots(context, this.x, this.y, true, delta);
}
this.drawMouseoverTooltip(context, mouseX, mouseY);
this.recipeBook.drawTooltip(context, this.x, this.y, mouseX, mouseY);
}


@Override
protected void drawSlot(DrawContext context, Slot slot) {
if (slot.id == 23 && slot.getStack().isOf(Items.BARRIER)) return;
super.drawSlot(context, slot);
}

@Override
protected void drawBackground(DrawContext context, float delta, int mouseX, int mouseY) {
int i = this.x;
int j = (this.height - this.backgroundHeight) / 2;
context.drawTexture(TEXTURE, i, j, 0, 0, this.backgroundWidth, this.backgroundHeight);
context.drawGuiTexture(QUICK_CRAFT, i + 173, j, 0, 25, 84);
}

@Override
protected boolean isPointWithinBounds(int x, int y, int width, int height, double pointX, double pointY) {
return (!this.narrow || !this.recipeBook.isOpen()) && super.isPointWithinBounds(x, y, width, height, pointX, pointY);
}

@Override
public boolean mouseClicked(double mouseX, double mouseY, int button) {
if (this.recipeBook.mouseClicked(mouseX, mouseY, button)) {
this.setFocused(this.recipeBook);
return true;
}
if (this.narrow && this.recipeBook.isOpen()) {
return true;
}
return super.mouseClicked(mouseX, mouseY, button);
}

@Override
protected boolean isClickOutsideBounds(double mouseX, double mouseY, int left, int top, int button) {
boolean bl = mouseX < (double) left || mouseY < (double) top || mouseX >= (double) (left + this.backgroundWidth) || mouseY >= (double) (top + this.backgroundHeight);
return this.recipeBook.isClickOutsideBounds(mouseX, mouseY, this.x, this.y, this.backgroundWidth, this.backgroundHeight, button) && bl;
}

@Override
protected void onMouseClick(Slot slot, int slotId, int button, SlotActionType actionType) {
super.onMouseClick(slot, slotId, button, actionType);
this.recipeBook.slotClicked(slot);
}


static class DummyRecipeScreenHandler extends AbstractRecipeScreenHandler<SimpleInventory> {

public DummyRecipeScreenHandler() {
super(ScreenHandlerType.GENERIC_9X6, -69);
}

@Override
public void populateRecipeFinder(RecipeMatcher finder) {}

@Override
public void clearCraftingSlots() {}

@Override
public boolean matches(RecipeEntry<? extends Recipe<SimpleInventory>> recipe) {
return false;
}

@Override
public int getCraftingResultSlotIndex() {
return 0;
}

@Override
public int getCraftingWidth() {
return 0;
}

@Override
public int getCraftingHeight() {
return 0;
}

@Override
public int getCraftingSlotCount() {
return 0;
}

@Override
public RecipeBookCategory getCategory() {
return RecipeBookCategory.CRAFTING;
}

@Override
public boolean canInsertIntoSlot(int index) {
return false;
}

@Override
public ItemStack quickMove(PlayerEntity player, int slot) {
return ItemStack.EMPTY;
}

@Override
public boolean canUse(PlayerEntity player) {
return false;
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
package de.hysky.skyblocker.skyblock.item;

import net.minecraft.entity.player.PlayerInventory;
import net.minecraft.inventory.Inventory;
import net.minecraft.screen.GenericContainerScreenHandler;
import net.minecraft.screen.ScreenHandlerType;
import net.minecraft.screen.slot.Slot;

import java.util.Arrays;

public class SkyblockCraftingTableScreenHandler extends GenericContainerScreenHandler {

private static final int[] normalSlots = new int[]{
10, 11, 12, 16,
19, 20, 21, 23, 25,
28, 29, 30, 34
};

public SkyblockCraftingTableScreenHandler(ScreenHandlerType<?> type, int syncId, PlayerInventory playerInventory, Inventory inventory, int rows) {
super(type, syncId, playerInventory, inventory, rows);
for (int i = 0; i < rows * 9; i++) {
Slot originalSlot = slots.get(i);
if (Arrays.binarySearch(normalSlots, i) >= 0) {
int[] coords = getCoords(i);
Slot slot = new Slot(originalSlot.inventory, originalSlot.getIndex(), coords[0], coords[1]);
slot.id = i;
slots.set(i, slot);
} else {
DisabledSlot slot = new DisabledSlot(originalSlot.inventory, originalSlot.getIndex(), originalSlot.x, originalSlot.y);
slot.id = i;
slots.set(i, slot);
}
}
int yOffset = (rows - 4) * 18 + 19;
for (int i = rows * 9; i < slots.size(); i++) {
Slot originalSlot = slots.get(i);
Slot slot = new Slot(originalSlot.inventory, originalSlot.getIndex(), originalSlot.x, originalSlot.y - yOffset);
slot.id = i;
slots.set(i, slot);
}
}

public SkyblockCraftingTableScreenHandler(GenericContainerScreenHandler handler, PlayerInventory playerInventory) {
this(handler.getType(), handler.syncId, playerInventory, handler.getInventory(), handler.getRows());
}

private int[] getCoords(int slot) {
if (slot == 23) return new int[]{124, 35};
if (slot == 16 || slot == 25 || slot == 34) {
int y = (slot / 9 - 1) * 18 + 8;
return new int[]{174, y};
}
int gridX = slot % 9 - 1;
int gridY = slot / 9 - 1;
return new int[]{30 + gridX * 18, 17 + gridY * 18};
}

public static class DisabledSlot extends Slot {

public DisabledSlot(Inventory inventory, int index, int x, int y) {
super(inventory, index, x, y);
}

@Override
public boolean isEnabled() {
return false;
}
}
}
1 change: 1 addition & 0 deletions src/main/resources/assets/skyblocker/lang/en_us.json
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,7 @@
"text.autoconfig.skyblocker.option.general.searchOverlay.enableCommands.@Tooltip": "Opens the bazaar search with \"/bzs\" and auction house with \"/ahs\". A re-log is required for this setting to be updated.",
"text.autoconfig.skyblocker.option.general.searchOverlay.historyLabel": "History:",
"text.autoconfig.skyblocker.option.general.betterPartyFinder": "Better Party Finder",
"text.autoconfig.skyblocker.option.general.fancyCraftingTable": "Fancy Crafting Table UI",
"skyblocker.itemTooltip.nullMessage": "§cItem price information on tooltip will renew in max 60 seconds. If not, check latest.log",
"skyblocker.itemTooltip.noData": "§cNo Data",

Expand Down
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.