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.6.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
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ No client mod required. No macros. No external dependencies beyond Fabric API.

## Installation

1. Drop `guiapi-1.0.5.jar` into your `mods/` folder.
1. Drop `guiapi-1.0.6.jar` into your `mods/` folder.
2. Drop your datapack into `world/datapacks/`.
3. Run `/reload` or `/guiapi reload`.

Expand Down Expand Up @@ -220,7 +220,7 @@ Please refer to the updated `example-datapack` directory in the repository sourc
```bash
chmod +x gradlew
./gradlew build
# Output: build/libs/guiapi-1.0.5.jar
# Output: build/libs/guiapi-1.0.6.jar
```

Requires **Java 21**.
Expand Down
34 changes: 17 additions & 17 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,6 @@ dependencies {
modImplementation "net.fabricmc:fabric-loader:${project.loader_version}"
modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}"

// Optional Mod Menu integration. The classes are compiled against Mod Menu,
// but Mod Menu is only suggested at runtime in fabric.mod.json.
modCompileOnly "maven.modrinth:modmenu:${project.modmenu_version}"
modApi "me.shedaniel.cloth:cloth-config-fabric:19.0.147"

Expand All @@ -38,16 +36,16 @@ test {
}

processResources {
inputs.property "version", project.version
inputs.property "minecraft_version", project.minecraft_version
inputs.property "loader_version", project.loader_version
def props = [
version: version,
minecraft_version: project.minecraft_version,
loader_version: project.loader_version
]

inputs.properties(props)

filesMatching("fabric.mod.json") {
expand(
"version": project.version,
"minecraft_version": project.minecraft_version,
"loader_version": project.loader_version
)
expand(props)
}
}

Expand All @@ -57,15 +55,17 @@ tasks.withType(JavaCompile).configureEach {

java {
withSourcesJar()
sourceCompatibility = JavaVersion.VERSION_21
targetCompatibility = JavaVersion.VERSION_21
toolchain {
languageVersion = JavaLanguageVersion.of(21)
}
}

jar {
inputs.property "archivesName", project.base.archivesName
from("LICENSE") {
rename { "${it}_${inputs.properties.archivesName}" }
}
// LICENSE dosyası ekleme kaldırıldı (deprecated hatası buradan kaynaklanıyordu)
}

tasks.named('build') {
dependsOn 'clean'
}

publishing {
Expand All @@ -91,4 +91,4 @@ publishing {
repositories {
mavenLocal()
}
}
}
9 changes: 8 additions & 1 deletion example-datapack/data/example/gui/macro_and_input_demo.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,14 @@
"§7Saves to {input} and {var:myVar}"
],
"actions": [
{ "type": "anvil_input", "var": "myVar", "value": "Enter Name|{var:myVar}" }
{
"type": "anvil_input",
"var": "myVar",
"value": "Enter Name|{var:myVar}",
"actions": [
{ "type": "message", "value": "§aSaved input: §f{input}" }
]
}
]
},
{
Expand Down
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ org.gradle.workers.max=1
org.gradle.daemon=false

# Project
mod_version=1.0.5+1.21.8
mod_version=1.0.6+1.21.8
maven_group=dev.toolkitmc
archives_base_name=guiapi

Expand Down
8 changes: 7 additions & 1 deletion src/main/java/dev/toolkitmc/guiapi/gui/BarrelGuiHandler.java
Original file line number Diff line number Diff line change
Expand Up @@ -703,12 +703,18 @@ static boolean executeAction(ServerPlayerEntity player, GuiDefinition def,
}
final Identifier previousGuiId = def.getId();
final int previousPage = currentPage;
final java.util.List<GuiDefinition.ButtonAction> afterInputActions = action.actions();

AnvilGuiHandler.openInput(player, anvilTitle, defaultText, (sp, text) -> {
GuiVarStore.INSTANCE.set(sp.getUuid(), varKey, text);
GuiInputStore.INSTANCE.set(sp.getUuid(), text);
dev.toolkitmc.guiapi.loader.GuiRegistry.INSTANCE.get(previousGuiId)
.ifPresent(target -> open(sp, target, previousPage));
.ifPresent(target -> {
if (!afterInputActions.isEmpty()) {
executeDelayedActionChain(sp, target, previousPage, afterInputActions, 0, false);
}
open(sp, target, previousPage);
});
});
}
case RUN_FUNCTION -> {
Expand Down
21 changes: 17 additions & 4 deletions src/main/java/dev/toolkitmc/guiapi/gui/GuiDefinition.java
Original file line number Diff line number Diff line change
Expand Up @@ -131,12 +131,15 @@ public static ConditionType fromString(String s) {
* @param var Variable key for set_var / add_var / sub_var / reset_var actions
* @param delay Action execution delay in ticks
*/
public record ButtonAction(ActionType type, String value, RunWith runWith, String var, int delay) {
public record ButtonAction(ActionType type, String value, RunWith runWith, String var, int delay, List<ButtonAction> actions) {
public ButtonAction(ActionType type, String value) {
this(type, value, RunWith.PLAYER, "", 0);
this(type, value, RunWith.PLAYER, "", 0, List.of());
}
public ButtonAction(ActionType type, String value, RunWith runWith) {
this(type, value, runWith, "", 0);
this(type, value, runWith, "", 0, List.of());
}
public ButtonAction(ActionType type, String value, RunWith runWith, String var, int delay) {
this(type, value, runWith, var, delay, List.of());
}
}

Expand Down Expand Up @@ -527,7 +530,17 @@ private static ButtonAction parseAction(JsonObject a) {
? RunWith.fromString(a.get("run_with").getAsString())
: RunWith.PLAYER;
int delay = a.has("delay") ? Math.max(0, a.get("delay").getAsInt()) : 0;
return new ButtonAction(type, value, runWith, var, delay);

List<ButtonAction> nestedActions = new ArrayList<>();
if (a.has("actions") && a.get("actions").isJsonArray()) {
for (JsonElement el : a.getAsJsonArray("actions")) {
if (el.isJsonObject()) {
nestedActions.add(parseAction(el.getAsJsonObject()));
}
}
}

return new ButtonAction(type, value, runWith, var, delay, nestedActions);
}

// ── Getters ──────────────────────────────────────────────────────────────
Expand Down
35 changes: 20 additions & 15 deletions src/main/java/dev/toolkitmc/guiapi/loader/GuiRegistry.java
Original file line number Diff line number Diff line change
Expand Up @@ -198,33 +198,21 @@ private static String serializeDefinition(GuiDefinition def) {

com.google.gson.JsonArray actionsOnArr = new com.google.gson.JsonArray();
for (GuiDefinition.ButtonAction act : tgl.actionsOn()) {
JsonObject aObj = new JsonObject();
aObj.addProperty("type", act.type().name().toLowerCase());
aObj.addProperty("value", act.value());
if (!act.var().isEmpty()) aObj.addProperty("var", act.var());
actionsOnArr.add(aObj);
actionsOnArr.add(serializeAction(act));
}
tObj.add("actions_on", actionsOnArr);

com.google.gson.JsonArray actionsOffArr = new com.google.gson.JsonArray();
for (GuiDefinition.ButtonAction act : tgl.actionsOff()) {
JsonObject aObj = new JsonObject();
aObj.addProperty("type", act.type().name().toLowerCase());
aObj.addProperty("value", act.value());
if (!act.var().isEmpty()) aObj.addProperty("var", act.var());
actionsOffArr.add(aObj);
actionsOffArr.add(serializeAction(act));
}
tObj.add("actions_off", actionsOffArr);

bObj.add("toggle", tObj);
} else {
com.google.gson.JsonArray actionsArr = new com.google.gson.JsonArray();
for (GuiDefinition.ButtonAction act : b.actions()) {
JsonObject aObj = new JsonObject();
aObj.addProperty("type", act.type().name().toLowerCase());
aObj.addProperty("value", act.value());
if (!act.var().isEmpty()) aObj.addProperty("var", act.var());
actionsArr.add(aObj);
actionsArr.add(serializeAction(act));
}
bObj.add("actions", actionsArr);
}
Expand All @@ -236,6 +224,23 @@ private static String serializeDefinition(GuiDefinition def) {
return GSON.toJson(obj);
}

private static JsonObject serializeAction(GuiDefinition.ButtonAction act) {
JsonObject aObj = new JsonObject();
aObj.addProperty("type", act.type().name().toLowerCase());
if (!act.value().isEmpty()) aObj.addProperty("value", act.value());
if (act.runWith() != GuiDefinition.RunWith.PLAYER) aObj.addProperty("run_with", act.runWith().name().toLowerCase());
if (!act.var().isEmpty()) aObj.addProperty("var", act.var());
if (act.delay() > 0) aObj.addProperty("delay", act.delay());
if (!act.actions().isEmpty()) {
com.google.gson.JsonArray nested = new com.google.gson.JsonArray();
for (GuiDefinition.ButtonAction nestedAction : act.actions()) {
nested.add(serializeAction(nestedAction));
}
aObj.add("actions", nested);
}
return aObj;
}

/** Addon API — register a GUI definition from Java code */
public void registerAddon(GuiDefinition definition) {
Identifier id = definition.getId();
Expand Down
Loading
Loading