From 6cefcdeca29d157843ad8e5daf22837e5d006eac Mon Sep 17 00:00:00 2001 From: TRMMax <48479483+TRMMax@users.noreply.github.com> Date: Tue, 25 Oct 2022 17:56:56 +0200 Subject: [PATCH 1/3] argument highlighter fix Fixed text arguments not being recognised as block arguments. --- .../homchom/recode/mod/mixin/render/MContainerScreen.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/io/github/homchom/recode/mod/mixin/render/MContainerScreen.java b/src/main/java/io/github/homchom/recode/mod/mixin/render/MContainerScreen.java index 50c0582f..bb87b37b 100644 --- a/src/main/java/io/github/homchom/recode/mod/mixin/render/MContainerScreen.java +++ b/src/main/java/io/github/homchom/recode/mod/mixin/render/MContainerScreen.java @@ -306,6 +306,10 @@ private boolean typeCheck(String type, ItemStack item) { } break; case "BLOCK": + if (item.getItem() != Items.AIR && varitemtype.matches("") || Objects.equals(varitemtype, "txt")) { + return true; + } + break; case "PROJECTILE": case "VEHICLE": case "SPAWN_EGG": From d896bb4cd53e583f629b39a12f0e00965fc66638 Mon Sep 17 00:00:00 2001 From: TRMMax <48479483+TRMMax@users.noreply.github.com> Date: Wed, 26 Oct 2022 17:53:14 +0200 Subject: [PATCH 2/3] Replaced argument error checking system Replaced the large switch statement with a dedicated enum type with all possible value types for an argument. --- .../mod/mixin/render/MContainerScreen.java | 174 +++--------------- .../sys/hypercube/codeaction/Argument.java | 123 ++++++++++++- .../sys/hypercube/codeaction/DisplayItem.java | 6 +- 3 files changed, 153 insertions(+), 150 deletions(-) diff --git a/src/main/java/io/github/homchom/recode/mod/mixin/render/MContainerScreen.java b/src/main/java/io/github/homchom/recode/mod/mixin/render/MContainerScreen.java index bb87b37b..1b4e7169 100644 --- a/src/main/java/io/github/homchom/recode/mod/mixin/render/MContainerScreen.java +++ b/src/main/java/io/github/homchom/recode/mod/mixin/render/MContainerScreen.java @@ -1,13 +1,11 @@ package io.github.homchom.recode.mod.mixin.render; -import com.google.gson.*; import com.mojang.blaze3d.vertex.PoseStack; import io.github.homchom.recode.LegacyRecode; import io.github.homchom.recode.mod.config.Config; import io.github.homchom.recode.sys.hypercube.codeaction.*; import io.github.homchom.recode.sys.util.TextUtil; import net.minecraft.client.gui.screens.inventory.*; -import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.inventory.ChestMenu; @@ -75,22 +73,22 @@ private void argCheck(Action a, PoseStack matrices) { List> currentOptions = new ArrayList<>(); List optionList = new ArrayList<>(); Argument lastChecked = null; - Boolean checkingOR = false; - Boolean valid = false; - Boolean passedAll = true; - Boolean startsOR = false; - Integer current = 0; - Integer slot = 0; - Integer checkSlot = 0; + boolean checkingOR = false; + boolean valid = false; + boolean passedAll = true; + boolean startsOR = false; + int current = 0; + int slot = 0; + int checkSlot = 0; // Check if the first argument is an OR while (current < rawArgs.size()) { Argument rarg = rawArgs.get(current); - if (rarg.getType() == null && rarg.getText().matches("OR")) { + if (!rarg.isValueArgument() && rarg.getText().equals("OR")) { checkingOR = true; startsOR = true; } - if (rarg.getType() == null) { + if (!rarg.isValueArgument()) { break; } current ++; @@ -100,17 +98,17 @@ private void argCheck(Action a, PoseStack matrices) { // Check for any errors while (current < rawArgs.size()) { Argument rarg = rawArgs.get(current); - if (rarg.getType() != null) { optionList.add(current); } + if (rarg.isValueArgument()) optionList.add(current); if (!checkingOR) { if (optionList.size() != 0) { currentOptions.add(optionList); } List expected = new ArrayList<>(); - for (List options : currentOptions) { + for (List options : currentOptions) { checkSlot = slot; valid = true; - for (Object checkOption : options) { - Argument checkArgument = rawArgs.get((Integer) checkOption); + for (int checkOption : options) { + Argument checkArgument = rawArgs.get(checkOption); if (lastChecked != null && lastChecked.isPlural() && typeCheck(lastChecked.getType(), items.get(checkSlot))) { checkSlot ++; continue; @@ -128,14 +126,14 @@ private void argCheck(Action a, PoseStack matrices) { checkSlot ++; } if (!valid) { - expected.add(lastChecked.getType()); + expected.add(lastChecked.getType().getName()); } else { expected = new ArrayList<>(); break; } } if (expected.size() == 1) { - errors.add("§cExpected §6" + expected.get(0) + " §cin slot " + (checkSlot + 1) + " but got §6" + getType(items.get(checkSlot))); + errors.add("§cExpected §6" + expected.get(0) + " §cin slot " + (checkSlot + 1) + " but got §6" + Argument.ValueType.fromItemStack(items.get(checkSlot)).getName()); slot = checkSlot; passedAll = false; break; @@ -143,7 +141,7 @@ private void argCheck(Action a, PoseStack matrices) { currentOptions = new ArrayList<>(); optionList = new ArrayList<>(); } - if (rarg.getType() == null) { + if (!rarg.isValueArgument()) { if (rarg.getText().equals("OR")) { currentOptions.add(optionList); optionList = new ArrayList<>(); @@ -153,11 +151,11 @@ private void argCheck(Action a, PoseStack matrices) { currentOptions.add(optionList); } List expected = new ArrayList<>(); - for (List options : currentOptions) { + for (List options : currentOptions) { checkSlot = slot; valid = true; - for (Object checkOption : options) { - Argument checkArgument = rawArgs.get((Integer) checkOption); + for (int checkOption : options) { + Argument checkArgument = rawArgs.get(checkOption); if (lastChecked != null && lastChecked.isPlural() && typeCheck(lastChecked.getType(), items.get(checkSlot))) { checkSlot ++; continue; @@ -175,14 +173,14 @@ private void argCheck(Action a, PoseStack matrices) { checkSlot ++; } if (!valid) { - expected.add(lastChecked.getType()); + expected.add(lastChecked.getType().getName()); } else { expected = new ArrayList<>(); break; } } if (expected.size() != 0) { - errors.add("§cExpected one of §6" + expected + " §cin slot " + (checkSlot + 1) + " but got §6" + getType(items.get(checkSlot))); + errors.add("§cExpected one of §6" + expected + " §cin slot " + (checkSlot + 1) + " but got §6" + Argument.ValueType.fromItemStack(items.get(checkSlot)).getName()); slot = checkSlot; passedAll = false; break; @@ -202,11 +200,11 @@ private void argCheck(Action a, PoseStack matrices) { currentOptions.add(optionList); } List expected = new ArrayList<>(); - for (List options : currentOptions) { + for (List options : currentOptions) { checkSlot = slot; valid = true; - for (Object checkOption : options) { - Argument checkArgument = rawArgs.get((Integer) checkOption); + for (int checkOption : options) { + Argument checkArgument = rawArgs.get(checkOption); if (lastChecked != null && lastChecked.isPlural() && typeCheck(lastChecked.getType(), items.get(checkSlot))) { checkSlot ++; continue; @@ -224,21 +222,21 @@ private void argCheck(Action a, PoseStack matrices) { checkSlot ++; } if (!valid) { - expected.add(lastChecked.getType()); + expected.add(lastChecked.getType().getName()); } else { expected = new ArrayList<>(); break; } } if (expected.size() != 0) { - errors.add("§cExpected one of §6" + expected + " §cin slot " + (checkSlot + 1) + " but got §6" + getType(items.get(checkSlot))); + errors.add("§cExpected one of §6" + expected + " §cin slot " + (checkSlot + 1) + " but got §6" + Argument.ValueType.fromItemStack(items.get(checkSlot)).getName()); slot = checkSlot; passedAll = false; }else { slot = checkSlot; } } // Check for extra data not requested by arguments. - Integer slotCheckIndex = 0; + int slotCheckIndex = 0; if (passedAll && startsOR) { slot --; } for (ItemStack slotCheck : items) { if (slotCheckIndex >= 25-ditem.getTags()) { break; } @@ -247,7 +245,7 @@ private void argCheck(Action a, PoseStack matrices) { continue; } if (slotCheckIndex >= slot + 1 && !slotCheck.isEmpty()) { - errors.add("§cExpected §6NONE §cin slot " + (slotCheckIndex + 1) + " but got §6" + getType(slotCheck)); + errors.add("§cExpected §6None §cin slot " + (slotCheckIndex + 1) + " but got §6" + Argument.ValueType.fromItemStack(slotCheck).getName()); } slotCheckIndex ++; } @@ -275,120 +273,8 @@ protected List> genPossible(List args, int i) { return p; } - private boolean typeCheck(String type, ItemStack item) { - CompoundTag pbv = item.getTagElement("PublicBukkitValues"); - String varitemtype = ""; - if (pbv != null) { - String t = pbv.getString("hypercube:varitem"); - if (t != null) { - try { - JsonObject o = JsonParser.parseString(t).getAsJsonObject(); - varitemtype = o.get("id").getAsString(); - if (Objects.equals(varitemtype, "var") || Objects.equals(varitemtype, "g_val")) { - return true; - } - } catch (Exception ignored) { - } - } - } - - switch (varitemtype) { - case "var": - return true; - case "g_val": - return true; - } - - switch (type) { - case "NONE": - if (item.getItem() == Items.AIR) { - return true; - } - break; - case "BLOCK": - if (item.getItem() != Items.AIR && varitemtype.matches("") || Objects.equals(varitemtype, "txt")) { - return true; - } - break; - case "PROJECTILE": - case "VEHICLE": - case "SPAWN_EGG": - case "ENTITY_TYPE": - case "ITEM": - if (item.getItem() != Items.AIR && varitemtype.matches("")) { - return true; - } - break; - case "NUMBER": - if (Objects.equals(varitemtype, "num")) { - return true; - } - break; - case "TEXT": - case "BLOCK_TAG": - if (Objects.equals(varitemtype, "txt")) { - return true; - } - break; - case "PARTICLE": - if (Objects.equals(varitemtype, "part")) { - return true; - } - break; - case "LOCATION": - if (Objects.equals(varitemtype, "loc")) { - return true; - } - break; - case "VECTOR": - if (Objects.equals(varitemtype, "vec")) { - return true; - } - break; - case "SOUND": - if (Objects.equals(varitemtype, "snd")) { - return true; - } - break; - case "POTION": - if (Objects.equals(varitemtype, "pot")) { - return true; - } - break; - case "LIST": - case "ANY_TYPE": - return true; - } - return false; - } - - private String getType (ItemStack item) { - CompoundTag pbv = item.getTagElement("PublicBukkitValues"); - String varitemtype = ""; - Map convert = new HashMap(); - convert.put("num", "Number"); - convert.put("txt", "Text"); - convert.put("loc", "Location"); - convert.put("vec", "Vector"); - convert.put("snd", "Sound"); - convert.put("part", "Particle"); - convert.put("pot", "Potion"); - convert.put("var", "Variable"); - convert.put("g_val", "Game Value"); - if (pbv != null) { - String t = pbv.getString("hypercube:varitem"); - if (t != null) { - try { - JsonObject o = JsonParser.parseString(t).getAsJsonObject(); - varitemtype = o.get("id").getAsString(); - return convert.get(varitemtype); - } catch (Exception ignored) {} - } - }else { - if (item.getItem() != Items.AIR) { return "Item"; } - return "None"; - } - return "UNKNOWN"; + private boolean typeCheck(Argument.ValueType type, ItemStack item) { + return type.isCompatibleWith(Argument.ValueType.fromItemStack(item)); } private void showDesc(Action a, PoseStack matrices) { diff --git a/src/main/java/io/github/homchom/recode/sys/hypercube/codeaction/Argument.java b/src/main/java/io/github/homchom/recode/sys/hypercube/codeaction/Argument.java index e1b759fa..6989d2fc 100644 --- a/src/main/java/io/github/homchom/recode/sys/hypercube/codeaction/Argument.java +++ b/src/main/java/io/github/homchom/recode/sys/hypercube/codeaction/Argument.java @@ -1,12 +1,18 @@ package io.github.homchom.recode.sys.hypercube.codeaction; import com.google.gson.JsonObject; +import com.google.gson.JsonParser; import io.github.homchom.recode.sys.util.StringUtil; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; import java.util.*; public class Argument { - private final String type; + private final boolean valueArgument; + private final ValueType type; private final boolean plural; private final boolean optional; private final String[] description; @@ -15,6 +21,7 @@ public class Argument { Argument(JsonObject jsonObject){ if (jsonObject.has("text")){ + this.valueArgument = false; this.type = null; this.text = jsonObject.get("text").getAsString(); this.plural = false; @@ -22,7 +29,8 @@ public class Argument { this.description = null; this.notes = null; }else{ - this.type = jsonObject.get("type").getAsString(); + this.valueArgument = true; + this.type = ValueType.fromID(jsonObject.get("type").getAsString()); this.plural = jsonObject.get("plural").getAsBoolean(); this.optional = jsonObject.get("optional").getAsBoolean(); this.description = StringUtil.toStringArray(jsonObject.get("description").getAsJsonArray()); @@ -35,7 +43,7 @@ public String[] getDescription() { return description; } - public String getType() { + public ValueType getType() { return type; } @@ -47,6 +55,10 @@ public boolean isOptional() { return optional; } + public boolean isValueArgument() { + return valueArgument; + } + public boolean isPlural() { return plural; } @@ -66,5 +78,110 @@ public String toString() { ", text='" + text + '\'' + '}'; } + + public enum ValueType { + NONE("NONE"), + VARIABLE("VARIABLE", "var"), + GAME_VALUE("GAME_VALUE", "g_val"), + NUMBER("NUMBER", "num"), + TEXT("TEXT", "txt"), + PARTICLE("PARTICLE", "part"), + LOCATION("LOCATION", "loc"), + VECTOR("VECTOR", "vec"), + SOUND("SOUND", "snd"), + POTION("POTION", "pot"), + BLOCK_TAG("BLOCK_TAG"), + BLOCK("BLOCK"), + PROJECTILE("PROJECTILE"), + VEHICLE("VEHICLE"), + SPAWN_EGG("SPAWN_EGG"), + ENTITY_TYPE("ENTITY_TYPE"), + ITEM("ITEM"), + LIST("LIST"), + ANY_TYPE("ANY_TYPE"), + UNKNOWN("UNKNOWN"); + + + private final String id; + private final List aliases; + private final List compatibleValueTypes = new ArrayList<>(); + + ValueType(String id, String... aliases) { + this.id = id; + this.aliases = Arrays.asList(aliases); + } + + static { + BLOCK_TAG.addCompatibleValueTypes(TEXT); + BLOCK.addCompatibleValueTypes(ITEM, TEXT); + PROJECTILE.addCompatibleValueTypes(ITEM, TEXT); + VEHICLE.addCompatibleValueTypes(ITEM, TEXT); + SPAWN_EGG.addCompatibleValueTypes(ITEM, TEXT); + ENTITY_TYPE.addCompatibleValueTypes(ITEM, PROJECTILE, VEHICLE, SPAWN_EGG, TEXT); + ITEM.addCompatibleValueTypes(BLOCK, PROJECTILE, VEHICLE, SPAWN_EGG, ENTITY_TYPE); + } + + private void addCompatibleValueTypes(ValueType... compatibleValueTypes) { + this.compatibleValueTypes.addAll(List.of(compatibleValueTypes)); + } + + public String getID() { + return id; + } + + public String getName() { + StringBuilder sb = new StringBuilder(); + String[] words = id.split("_"); + for (String word : words) { + sb.append(word.substring(0, 1).toUpperCase(Locale.ROOT)).append(word.substring(1).toLowerCase(Locale.ROOT)).append(' '); + } + return sb.toString().trim(); + } + + public boolean isCompatibleWith(ValueType valueType) { + if (this == NONE && valueType != NONE) { + return false; + } + if (this != VARIABLE && valueType == GAME_VALUE) { + return true; + } + + return this == ANY_TYPE || this == valueType || valueType == VARIABLE || this.compatibleValueTypes.contains(valueType); + } + + public static ValueType fromID(String id) { + for (ValueType valueType : values()) { + if (valueType.id.equals(id) || valueType.aliases.contains(id)) { + return valueType; + } + } + + return UNKNOWN; + } + + public static ValueType fromItemStack(ItemStack item) { + CompoundTag pbv = item.getTagElement("PublicBukkitValues"); + if (pbv != null) { + String t = pbv.getString("hypercube:varitem"); + if (t != null) { + try { + JsonObject o = JsonParser.parseString(t).getAsJsonObject(); + return fromID(o.get("id").getAsString()); + } catch (Exception ignored) {} + } + } + + Item itemType = item.getItem(); + if (itemType == Items.AIR) { + return NONE; + } + return ITEM; + } + + @Override + public String toString() { + return id; + } + } } diff --git a/src/main/java/io/github/homchom/recode/sys/hypercube/codeaction/DisplayItem.java b/src/main/java/io/github/homchom/recode/sys/hypercube/codeaction/DisplayItem.java index 2b3e9e93..32f8adeb 100644 --- a/src/main/java/io/github/homchom/recode/sys/hypercube/codeaction/DisplayItem.java +++ b/src/main/java/io/github/homchom/recode/sys/hypercube/codeaction/DisplayItem.java @@ -138,9 +138,9 @@ public ItemStack toItemStack(){ if (this.arguments != null) { for (Argument arg : this.arguments) { String[] desc = arg.getDescription(); - String firstdesc = arg.getText() == null ? (desc.length > 0 ? desc[0] : "") : ""; - firstdesc = arg.getText() == null ? (desc.length > 0 ? (arg.getType().equals("NONE") ? (firstdesc.endsWith(")") ? " §7(" + firstdesc : " §7(" + firstdesc + "§7)") : (" §8- §7" + firstdesc)) : "") : ""; - String arglore = arg.getText() == null ? (ActionDump.valueOf(arg.getType()).getColor() + ActionDump.valueOf(arg.getType()).getName() + (arg.isPlural() ? "(s)" : "") + (arg.isOptional() ? "§f*" : "") + firstdesc) : (arg.getText().equals("") ? "" : arg.getText()); + String firstdesc = arg.isValueArgument() ? (desc.length > 0 ? desc[0] : "") : ""; + firstdesc = arg.isValueArgument() ? (desc.length > 0 ? (arg.getType() == Argument.ValueType.NONE ? (firstdesc.endsWith(")") ? " §7(" + firstdesc : " §7(" + firstdesc + "§7)") : (" §8- §7" + firstdesc)) : "") : ""; + String arglore = arg.isValueArgument() ? (ActionDump.valueOf(arg.getType().getID()).getColor() + ActionDump.valueOf(arg.getType().getID()).getName() + (arg.isPlural() ? "(s)" : "") + (arg.isOptional() ? "§f*" : "") + firstdesc) : arg.getText(); if (arg.isOptional()) optional = true; From 24560eb677b384037c89c2e22d77be6db7c90180 Mon Sep 17 00:00:00 2001 From: TRMMax <48479483+TRMMax@users.noreply.github.com> Date: Wed, 26 Oct 2022 18:05:17 +0200 Subject: [PATCH 3/3] small argument type compatibility fix --- .../homchom/recode/sys/hypercube/codeaction/Argument.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/io/github/homchom/recode/sys/hypercube/codeaction/Argument.java b/src/main/java/io/github/homchom/recode/sys/hypercube/codeaction/Argument.java index 6989d2fc..163b94e1 100644 --- a/src/main/java/io/github/homchom/recode/sys/hypercube/codeaction/Argument.java +++ b/src/main/java/io/github/homchom/recode/sys/hypercube/codeaction/Argument.java @@ -114,10 +114,10 @@ public enum ValueType { static { BLOCK_TAG.addCompatibleValueTypes(TEXT); BLOCK.addCompatibleValueTypes(ITEM, TEXT); - PROJECTILE.addCompatibleValueTypes(ITEM, TEXT); - VEHICLE.addCompatibleValueTypes(ITEM, TEXT); - SPAWN_EGG.addCompatibleValueTypes(ITEM, TEXT); - ENTITY_TYPE.addCompatibleValueTypes(ITEM, PROJECTILE, VEHICLE, SPAWN_EGG, TEXT); + PROJECTILE.addCompatibleValueTypes(ITEM); + VEHICLE.addCompatibleValueTypes(ITEM); + SPAWN_EGG.addCompatibleValueTypes(ITEM); + ENTITY_TYPE.addCompatibleValueTypes(ITEM, PROJECTILE, VEHICLE, SPAWN_EGG); ITEM.addCompatibleValueTypes(BLOCK, PROJECTILE, VEHICLE, SPAWN_EGG, ENTITY_TYPE); }