From 5fedd637838a383e3080fb5b736698f4110832bc Mon Sep 17 00:00:00 2001 From: XTerPL Date: Tue, 29 Nov 2022 13:49:13 +0100 Subject: [PATCH] Added a way to change the icon of a function --- .../misc/ItemMaterialSelectionScreen.java | 118 ++++++++++++++++++ .../script/ScriptEditFunctionScreen.java | 27 +++- .../dfscript/screen/widget/CPlainPanel.java | 20 +++ .../dfscript/screen/widget/CScrollPanel.java | 20 +++ .../dfscript/screen/widget/CWidget.java | 2 +- .../techstreet/dfscript/script/Script.java | 2 + .../dfscript/script/ScriptPart.java | 5 +- .../script/action/ScriptActionCategory.java | 2 +- .../script/function/ScriptCallFunction.java | 45 ++++++- .../script/function/ScriptFunction.java | 26 +++- 10 files changed, 256 insertions(+), 11 deletions(-) create mode 100644 src/main/java/io/github/techstreet/dfscript/screen/misc/ItemMaterialSelectionScreen.java diff --git a/src/main/java/io/github/techstreet/dfscript/screen/misc/ItemMaterialSelectionScreen.java b/src/main/java/io/github/techstreet/dfscript/screen/misc/ItemMaterialSelectionScreen.java new file mode 100644 index 0000000..55a2966 --- /dev/null +++ b/src/main/java/io/github/techstreet/dfscript/screen/misc/ItemMaterialSelectionScreen.java @@ -0,0 +1,118 @@ +package io.github.techstreet.dfscript.screen.misc; + +import io.github.techstreet.dfscript.DFScript; +import io.github.techstreet.dfscript.screen.CScreen; +import io.github.techstreet.dfscript.screen.script.ScriptListScreen; +import io.github.techstreet.dfscript.screen.widget.CItem; +import io.github.techstreet.dfscript.screen.widget.CScrollPanel; +import io.github.techstreet.dfscript.screen.widget.CTextField; +import io.github.techstreet.dfscript.screen.widget.CTexturedButton; +import net.minecraft.client.gui.DrawableHelper; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.util.registry.Registry; + +import java.awt.*; +import java.util.Objects; +import java.util.function.Consumer; + +public class ItemMaterialSelectionScreen extends CScreen { + + static int WIDTH = 104; + static int HEIGHT = 100; + final CScrollPanel panel; + CItem selectedItem; + CTextField field; + final Consumer save; + String current; + + public ItemMaterialSelectionScreen(Consumer save) { + this(save, ""); + } + + public ItemMaterialSelectionScreen(Consumer save, String current) { + super(WIDTH, HEIGHT); + + this.save = save; + this.current = current; + + panel = new CScrollPanel(2,12, WIDTH-4,HEIGHT-12); + widgets.add(panel); + + CTexturedButton button = new CTexturedButton(WIDTH - 10, 4, 8, 8, DFScript.MOD_ID + ":on_button.png", this::close, 0,0,1,0.5f,0,0.5f); + + field = new CTextField("", 16, 4, WIDTH - 16 - 10, 8, true); + field.setChangedListener( + () -> DFScript.MC.send(this::refreshItems) + ); + + widgets.add(button); + widgets.add(field); + + refreshItems(); + } + + public void refreshItems() + { + widgets.remove(selectedItem); + + panel.clear(); + + int x = 2; + int y = 2; + + for (Item item : Registry.ITEM) { + if(Objects.equals(item, Items.AIR)) { + continue; + } + + String name = String.valueOf(item.getName()); + + if(current.equals(item.toString())) { + selectedItem = new CItem(4, 4, new ItemStack(item)); + widgets.add(selectedItem); + } + + if(!name.contains(field.getText())) { + continue; + } + + ItemStack itemStack = new ItemStack(item); + + CItem citem; + + if(current.equals(item.toString())) { + citem = new CItem(x, y, itemStack) { + @Override + public void render(MatrixStack stack, int mouseX, int mouseY, float tickDelta) { + super.render(stack, mouseX, mouseY, tickDelta); + Rectangle b = getBounds(); + DrawableHelper.fill(stack, b.x, b.y, b.x + b.width, b.y + b.height, 0x3300ff00); + } + }; + } else { + citem = new CItem(x, y, itemStack); + } + + citem.setClickListener((mouse) -> { + current = item.toString(); + refreshItems(); + }); + + panel.add(citem); + + x += 10; + if(x >= WIDTH-4) { + y += 10; + x = 2; + } + } + } + + @Override + public void close() { + save.accept(current); + } +} diff --git a/src/main/java/io/github/techstreet/dfscript/screen/script/ScriptEditFunctionScreen.java b/src/main/java/io/github/techstreet/dfscript/screen/script/ScriptEditFunctionScreen.java index 616bcdd..18cc682 100644 --- a/src/main/java/io/github/techstreet/dfscript/screen/script/ScriptEditFunctionScreen.java +++ b/src/main/java/io/github/techstreet/dfscript/screen/script/ScriptEditFunctionScreen.java @@ -2,24 +2,28 @@ import io.github.techstreet.dfscript.DFScript; import io.github.techstreet.dfscript.screen.CScreen; -import io.github.techstreet.dfscript.screen.widget.CText; +import io.github.techstreet.dfscript.screen.misc.ItemMaterialSelectionScreen; +import io.github.techstreet.dfscript.screen.widget.CItem; import io.github.techstreet.dfscript.screen.widget.CTextField; import io.github.techstreet.dfscript.script.Script; import io.github.techstreet.dfscript.script.ScriptPart; import io.github.techstreet.dfscript.script.function.ScriptFunction; +import java.util.List; import java.util.Objects; public class ScriptEditFunctionScreen extends CScreen { private final Script script; private final ScriptFunction function; + CItem functionIcon; + public ScriptEditFunctionScreen(Script script, ScriptFunction function) { super(90, 100); this.script = script; this.function = function; - CTextField nameField = new CTextField(function.getFunctionName(), 5, 5, 80, 20, true); + CTextField nameField = new CTextField(function.getFunctionName(), 15, 5, 70, 20, true); nameField.setChangedListener(() -> { for (ScriptPart part : script.getParts()) { if(part instanceof ScriptFunction f) { @@ -44,6 +48,25 @@ public ScriptEditFunctionScreen(Script script, ScriptFunction function) { }); widgets.add(nameField); + + refresh(); + } + + public void refresh() { + widgets.remove(functionIcon); + + functionIcon = new CItem(5,5, function.getFullIcon()); + functionIcon.setClickListener((mouse) -> { + DFScript.MC.setScreen(new ItemMaterialSelectionScreen( + (mat) -> { + function.setIcon(mat); + DFScript.MC.setScreen(new ScriptEditFunctionScreen(script, function)); + }, + function.getIcon() + )); + }); + + widgets.add(functionIcon); } @Override diff --git a/src/main/java/io/github/techstreet/dfscript/screen/widget/CPlainPanel.java b/src/main/java/io/github/techstreet/dfscript/screen/widget/CPlainPanel.java index cd43f94..fe43be1 100644 --- a/src/main/java/io/github/techstreet/dfscript/screen/widget/CPlainPanel.java +++ b/src/main/java/io/github/techstreet/dfscript/screen/widget/CPlainPanel.java @@ -38,6 +38,12 @@ public void render(MatrixStack stack, int mouseX, int mouseY, float tickDelta) { (int) (end.getY() - begin.getY())*guiScale ); + if(mouseX < x) mouseX = CWidget.MOUSE_DISABLE; + if(mouseX > x+width) mouseX = CWidget.MOUSE_DISABLE; + + if(mouseY < y) mouseY = CWidget.MOUSE_DISABLE; + if(mouseY > y+height) mouseY = CWidget.MOUSE_DISABLE; + for (CWidget child : children) { child.render(stack, mouseX, mouseY, tickDelta); } @@ -48,6 +54,10 @@ public void render(MatrixStack stack, int mouseX, int mouseY, float tickDelta) { @Override public boolean mouseClicked(double x, double y, int button) { + if(!getBounds().contains(x, y)) { + return false; + } + for (int i = children.size() - 1; i >= 0; i--) { if (children.get(i).mouseClicked(x, y, button)) { return true; @@ -72,6 +82,10 @@ public void keyPressed(int keyCode, int scanCode, int modifiers) { @Override public void mouseScrolled(double mouseX, double mouseY, double amount) { + if(!getBounds().contains(mouseX, mouseY)) { + return; + } + for (CWidget child : children) { child.mouseScrolled(mouseX, mouseY, amount); } @@ -93,6 +107,12 @@ public void add(CWidget child) { @Override public void renderOverlay(MatrixStack stack, int mouseX, int mouseY, float tickDelta) { + if(mouseX < x) mouseX = CWidget.MOUSE_DISABLE; + if(mouseX > x+width) mouseX = CWidget.MOUSE_DISABLE; + + if(mouseY < y) mouseY = CWidget.MOUSE_DISABLE; + if(mouseY > y+height) mouseY = CWidget.MOUSE_DISABLE; + stack.push(); stack.translate(x, y, 0); for (CWidget child : children) { diff --git a/src/main/java/io/github/techstreet/dfscript/screen/widget/CScrollPanel.java b/src/main/java/io/github/techstreet/dfscript/screen/widget/CScrollPanel.java index fe582fb..4fab90c 100644 --- a/src/main/java/io/github/techstreet/dfscript/screen/widget/CScrollPanel.java +++ b/src/main/java/io/github/techstreet/dfscript/screen/widget/CScrollPanel.java @@ -26,6 +26,12 @@ public void render(MatrixStack stack, int mouseX, int mouseY, float tickDelta) { stack.push(); stack.translate(x, y, 0); + if(mouseX < x) mouseX = CWidget.MOUSE_DISABLE; + if(mouseX > x+width) mouseX = CWidget.MOUSE_DISABLE; + + if(mouseY < y) mouseY = CWidget.MOUSE_DISABLE; + if(mouseY > y+height) mouseY = CWidget.MOUSE_DISABLE; + mouseX -= x; mouseY -= y; @@ -55,6 +61,10 @@ public void render(MatrixStack stack, int mouseX, int mouseY, float tickDelta) { @Override public boolean mouseClicked(double x, double y, int button) { + if(!getBounds().contains(x, y)) { + return false; + } + y -= scroll; x -= this.x; y -= this.y; @@ -82,6 +92,10 @@ public void keyPressed(int keyCode, int scanCode, int modifiers) { @Override public void mouseScrolled(double mouseX, double mouseY, double amount) { + if(!getBounds().contains(mouseX, mouseY)) { + return; + } + mouseX -= x; mouseY -= y; for (CWidget child : children) { @@ -115,6 +129,12 @@ public void add(CWidget child) { @Override public void renderOverlay(MatrixStack stack, int mouseX, int mouseY, float tickDelta) { + if(mouseX < x) mouseX = CWidget.MOUSE_DISABLE; + if(mouseX > x+width) mouseX = CWidget.MOUSE_DISABLE; + + if(mouseY < y) mouseY = CWidget.MOUSE_DISABLE; + if(mouseY > y+height) mouseY = CWidget.MOUSE_DISABLE; + mouseY -= scroll; mouseX -= x; diff --git a/src/main/java/io/github/techstreet/dfscript/screen/widget/CWidget.java b/src/main/java/io/github/techstreet/dfscript/screen/widget/CWidget.java index 62655e1..7871f30 100644 --- a/src/main/java/io/github/techstreet/dfscript/screen/widget/CWidget.java +++ b/src/main/java/io/github/techstreet/dfscript/screen/widget/CWidget.java @@ -4,7 +4,7 @@ import net.minecraft.client.util.math.MatrixStack; public interface CWidget { - + int MOUSE_DISABLE = -100000000; void render(MatrixStack stack, int mouseX, int mouseY, float tickDelta); default boolean mouseClicked(double x, double y, int button) { diff --git a/src/main/java/io/github/techstreet/dfscript/script/Script.java b/src/main/java/io/github/techstreet/dfscript/script/Script.java index fef7c2a..8a9d92a 100644 --- a/src/main/java/io/github/techstreet/dfscript/script/Script.java +++ b/src/main/java/io/github/techstreet/dfscript/script/Script.java @@ -347,6 +347,8 @@ private void updateScriptReferences() { for(ScriptPart part : getParts()) { if(part instanceof ScriptAction a) { a.updateScriptReferences(this); + } else if (part instanceof ScriptCallFunction f) { + f.setScript(this); } } } diff --git a/src/main/java/io/github/techstreet/dfscript/script/ScriptPart.java b/src/main/java/io/github/techstreet/dfscript/script/ScriptPart.java index 8098fa9..c784e0d 100644 --- a/src/main/java/io/github/techstreet/dfscript/script/ScriptPart.java +++ b/src/main/java/io/github/techstreet/dfscript/script/ScriptPart.java @@ -46,7 +46,8 @@ public ScriptPart deserialize(JsonElement json, Type typeOfT, JsonDeserializatio } case "function" -> { String name = obj.get("function").getAsString(); - return new ScriptFunction(name); + String icon = obj.has("icon") ? obj.get("icon").getAsString() : "lapis_lazuli"; + return new ScriptFunction(name, icon); } case "callFunction" -> { String name = obj.get("function").getAsString(); @@ -54,7 +55,7 @@ public ScriptPart deserialize(JsonElement json, Type typeOfT, JsonDeserializatio for (JsonElement arg : obj.get("arguments").getAsJsonArray()) { args.add(context.deserialize(arg, ScriptArgument.class)); } - return new ScriptCallFunction(name, args); + return new ScriptCallFunction(name, args, null); } default -> throw new JsonParseException("Unknown script part type: " + type); } diff --git a/src/main/java/io/github/techstreet/dfscript/script/action/ScriptActionCategory.java b/src/main/java/io/github/techstreet/dfscript/script/action/ScriptActionCategory.java index 4e77cdc..408640e 100644 --- a/src/main/java/io/github/techstreet/dfscript/script/action/ScriptActionCategory.java +++ b/src/main/java/io/github/techstreet/dfscript/script/action/ScriptActionCategory.java @@ -40,7 +40,7 @@ public enum ScriptActionCategory { ItemStack icon = new ItemStack(Items.LAPIS_LAZULI); icon.setCustomName(Text.literal(func.getFunctionName()).setStyle(Style.EMPTY.withItalic(false))); - extras.add(new ScriptActionCategoryExtra(icon, (Void) -> new ScriptCallFunction(funcName, new ArrayList<>()))); + extras.add(new ScriptActionCategoryExtra(icon, (Void) -> new ScriptCallFunction(funcName, new ArrayList<>(), script))); } return extras; diff --git a/src/main/java/io/github/techstreet/dfscript/script/function/ScriptCallFunction.java b/src/main/java/io/github/techstreet/dfscript/script/function/ScriptCallFunction.java index 8e16d86..52522a5 100644 --- a/src/main/java/io/github/techstreet/dfscript/script/function/ScriptCallFunction.java +++ b/src/main/java/io/github/techstreet/dfscript/script/function/ScriptCallFunction.java @@ -16,8 +16,13 @@ import io.github.techstreet.dfscript.script.execution.ScriptTask; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; +import net.minecraft.nbt.NbtList; +import net.minecraft.nbt.NbtString; import net.minecraft.text.Style; import net.minecraft.text.Text; +import net.minecraft.util.Formatting; +import net.minecraft.util.Identifier; +import net.minecraft.util.registry.Registry; import java.lang.reflect.Type; import java.util.HashMap; @@ -26,10 +31,12 @@ public class ScriptCallFunction extends ScriptRunnablePart { String function; + transient Script script; - public ScriptCallFunction(String function, List arguments) { + public ScriptCallFunction(String function, List arguments, Script script) { super(arguments); this.function = function; + this.script = script; } public String getFunctionName() { @@ -54,9 +61,39 @@ public void invoke(Event event, ScriptContext context, Consumer { @Override @@ -38,8 +62,8 @@ public JsonElement serialize(ScriptFunction src, Type typeOfSrc, JsonSerializati JsonObject obj = new JsonObject(); obj.addProperty("type", "function"); obj.addProperty("function", src.getFunctionName()); + obj.addProperty("icon", src.getIcon()); return obj; } } - }