Skip to content
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.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ cd guiAPI
./gradlew build
```

The built jar is at `build/libs/guiapi-1.0.5.jar`.
The built jar is at `build/libs/guiapi-1.0.3.jar`.

To run in a local Minecraft instance, use Fabric's `runServer` task or drop the jar into a test server's `mods/` folder.

Expand Down
28 changes: 26 additions & 2 deletions src/main/java/dev/toolkitmc/guiapi/gui/AnvilGuiHandler.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,30 @@ public interface AnvilCallback {
void onInput(ServerPlayerEntity player, String text);
}

private static String getNewItemNameReflected(AnvilScreenHandler handler) {
try {
java.lang.reflect.Field field = AnvilScreenHandler.class.getDeclaredField("newItemName");
field.setAccessible(true);
String val = (String) field.get(handler);
return val != null ? val : "";
} catch (Exception e) {
try {
// Fallback to common Yarn mapping fields for newItemName
java.lang.reflect.Field field = AnvilScreenHandler.class.getDeclaredField("field_30755");
field.setAccessible(true);
String val = (String) field.get(handler);
return val != null ? val : "";
} catch (Exception e2) {
// Ultimate fallback to output slot stack name
ItemStack stack = handler.getSlot(2).getStack();
if (!stack.isEmpty()) {
return stack.getName().getString();
}
return "";
}
}
}

public static void openInput(ServerPlayerEntity player, String title, String defaultText, AnvilCallback callback) {
player.openHandledScreen(new NamedScreenHandlerFactory() {
@Override
Expand All @@ -36,7 +60,7 @@ public boolean canUse(PlayerEntity player) {
@Override
public void onSlotClick(int slotIndex, int button, net.minecraft.screen.slot.SlotActionType actionType, PlayerEntity playerEntity) {
if (slotIndex == 2) { // Output slot
String text = this.getNewItemName();
String text = getNewItemNameReflected(this);
if (playerEntity instanceof ServerPlayerEntity sp) {
sp.closeHandledScreen();
callback.onInput(sp, text);
Expand All @@ -53,7 +77,7 @@ public void updateResult() {
this.input.setStack(0, paper);

ItemStack output = new ItemStack(Items.PAPER);
output.set(net.minecraft.component.DataComponentTypes.CUSTOM_NAME, Text.literal(this.getNewItemName()));
output.set(net.minecraft.component.DataComponentTypes.CUSTOM_NAME, Text.literal(getNewItemNameReflected(this)));
this.output.setStack(0, output);

this.sendContentUpdates();
Expand Down
20 changes: 10 additions & 10 deletions src/main/java/dev/toolkitmc/guiapi/gui/BarrelGuiHandler.java
Original file line number Diff line number Diff line change
Expand Up @@ -85,11 +85,6 @@ public static void open(ServerPlayerEntity player, GuiDefinition def) {
open(player, def, 0);
}

private static boolean hasCustomNbt(net.minecraft.entity.Entity entity, String key) {
NbtCompound nbt = new NbtCompound();
entity.writeNbt(nbt);
return nbt.contains(key) && nbt.getBoolean(key);
}

private static SimpleInventory populateChestMinecart(ServerPlayerEntity player, GuiDefinition def, int page, net.minecraft.entity.vehicle.ChestMinecartEntity cart) {
SimpleInventory inv = buildInventory(player, def, page, 27);
Expand All @@ -113,10 +108,11 @@ public static void open(ServerPlayerEntity player, GuiDefinition def, int page)
int finalRows = rows;
if (def.getContainerType() == GuiDefinition.ContainerType.CHEST_MINECART) {
finalRows = 3;
List<net.minecraft.entity.vehicle.ChestMinecartEntity> minecarts = player.getServerWorld().getEntitiesByClass(
net.minecraft.server.world.ServerWorld world = (net.minecraft.server.world.ServerWorld) player.getWorld();
List<net.minecraft.entity.vehicle.ChestMinecartEntity> minecarts = world.getEntitiesByClass(
net.minecraft.entity.vehicle.ChestMinecartEntity.class,
player.getBoundingBox().expand(8.0),
cart -> cart.getCommandTags().contains("MyGUI") || hasCustomNbt(cart, "MyGUI")
cart -> cart.getCommandTags().contains("MyGUI")
);
if (!minecarts.isEmpty()) {
inv = populateChestMinecart(player, def, page, minecarts.get(0));
Expand Down Expand Up @@ -685,7 +681,9 @@ static boolean executeAction(ServerPlayerEntity player, GuiDefinition def,
server.getCommandManager().executeWithPrefix(player.getCommandSource(), cmd);
}
}
case NONE -> { return true; }
case NONE -> {
return true;
}
case ANVIL_INPUT -> {
String resolved = resolve(action.value(), player, def, currentPage);
String[] parts = resolved.split(":", 2);
Expand All @@ -696,14 +694,16 @@ static boolean executeAction(ServerPlayerEntity player, GuiDefinition def,
final int previousPage = currentPage;

AnvilGuiHandler.openInput(player, anvilTitle, "Type here...", (sp, text) -> {
GuiVarStore.INSTANCE.put(sp.getUuid(), varKey, text);
GuiVarStore.INSTANCE.set(sp.getUuid(), varKey, text);
dev.toolkitmc.guiapi.loader.GuiRegistry.INSTANCE.get(previousGuiId)
.ifPresent(target -> open(sp, target, previousPage));
});
}
}
case NONE -> { return true; }
case CLOSE -> {
player.closeHandledScreen();
return true;
}
case OPEN_GUI -> {
navigateAway(player);
player.closeHandledScreen();
Expand Down
1 change: 1 addition & 0 deletions src/main/java/dev/toolkitmc/guiapi/gui/GuiDefinition.java
Original file line number Diff line number Diff line change
Expand Up @@ -502,6 +502,7 @@ private static ButtonAction parseAction(JsonObject a) {
public Optional<FillerConfig> getFiller() { return filler; }
public int getTickRate() { return tickRate; }
public boolean isCloseOnMove() { return closeOnMove; }
public ContainerType getContainerType() { return containerType; }

/** Returns only buttons belonging to the given page. */
public List<Button> getButtonsForPage(int page) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -305,7 +305,7 @@ protected void init() {

// 1. Add persistent Tab Selectors (Fixed at Top)
ButtonWidget configTabBtn = ButtonWidget.builder(Text.literal("§eSettings Screen"), btn -> {
MinecraftClient.getInstance().setScreen(getModConfigScreenFactory().create(parent));
MinecraftClient.getInstance().setScreen(new GuiApiModMenuEntry().getModConfigScreenFactory().create(parent));
}).dimensions(cx - 125, 22, 80, 18).build();
addDrawableChild(configTabBtn);

Expand Down
45 changes: 0 additions & 45 deletions src/test/java/dev/toolkitmc/guiapi/test/GuiApiParserTest.java

This file was deleted.