Skip to content

Commit 5fedd63

Browse files
committed
Added a way to change the icon of a function
1 parent e33cda2 commit 5fedd63

File tree

10 files changed

+256
-11
lines changed

10 files changed

+256
-11
lines changed
Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
package io.github.techstreet.dfscript.screen.misc;
2+
3+
import io.github.techstreet.dfscript.DFScript;
4+
import io.github.techstreet.dfscript.screen.CScreen;
5+
import io.github.techstreet.dfscript.screen.script.ScriptListScreen;
6+
import io.github.techstreet.dfscript.screen.widget.CItem;
7+
import io.github.techstreet.dfscript.screen.widget.CScrollPanel;
8+
import io.github.techstreet.dfscript.screen.widget.CTextField;
9+
import io.github.techstreet.dfscript.screen.widget.CTexturedButton;
10+
import net.minecraft.client.gui.DrawableHelper;
11+
import net.minecraft.client.util.math.MatrixStack;
12+
import net.minecraft.item.Item;
13+
import net.minecraft.item.ItemStack;
14+
import net.minecraft.item.Items;
15+
import net.minecraft.util.registry.Registry;
16+
17+
import java.awt.*;
18+
import java.util.Objects;
19+
import java.util.function.Consumer;
20+
21+
public class ItemMaterialSelectionScreen extends CScreen {
22+
23+
static int WIDTH = 104;
24+
static int HEIGHT = 100;
25+
final CScrollPanel panel;
26+
CItem selectedItem;
27+
CTextField field;
28+
final Consumer<String> save;
29+
String current;
30+
31+
public ItemMaterialSelectionScreen(Consumer<String> save) {
32+
this(save, "");
33+
}
34+
35+
public ItemMaterialSelectionScreen(Consumer<String> save, String current) {
36+
super(WIDTH, HEIGHT);
37+
38+
this.save = save;
39+
this.current = current;
40+
41+
panel = new CScrollPanel(2,12, WIDTH-4,HEIGHT-12);
42+
widgets.add(panel);
43+
44+
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);
45+
46+
field = new CTextField("", 16, 4, WIDTH - 16 - 10, 8, true);
47+
field.setChangedListener(
48+
() -> DFScript.MC.send(this::refreshItems)
49+
);
50+
51+
widgets.add(button);
52+
widgets.add(field);
53+
54+
refreshItems();
55+
}
56+
57+
public void refreshItems()
58+
{
59+
widgets.remove(selectedItem);
60+
61+
panel.clear();
62+
63+
int x = 2;
64+
int y = 2;
65+
66+
for (Item item : Registry.ITEM) {
67+
if(Objects.equals(item, Items.AIR)) {
68+
continue;
69+
}
70+
71+
String name = String.valueOf(item.getName());
72+
73+
if(current.equals(item.toString())) {
74+
selectedItem = new CItem(4, 4, new ItemStack(item));
75+
widgets.add(selectedItem);
76+
}
77+
78+
if(!name.contains(field.getText())) {
79+
continue;
80+
}
81+
82+
ItemStack itemStack = new ItemStack(item);
83+
84+
CItem citem;
85+
86+
if(current.equals(item.toString())) {
87+
citem = new CItem(x, y, itemStack) {
88+
@Override
89+
public void render(MatrixStack stack, int mouseX, int mouseY, float tickDelta) {
90+
super.render(stack, mouseX, mouseY, tickDelta);
91+
Rectangle b = getBounds();
92+
DrawableHelper.fill(stack, b.x, b.y, b.x + b.width, b.y + b.height, 0x3300ff00);
93+
}
94+
};
95+
} else {
96+
citem = new CItem(x, y, itemStack);
97+
}
98+
99+
citem.setClickListener((mouse) -> {
100+
current = item.toString();
101+
refreshItems();
102+
});
103+
104+
panel.add(citem);
105+
106+
x += 10;
107+
if(x >= WIDTH-4) {
108+
y += 10;
109+
x = 2;
110+
}
111+
}
112+
}
113+
114+
@Override
115+
public void close() {
116+
save.accept(current);
117+
}
118+
}

src/main/java/io/github/techstreet/dfscript/screen/script/ScriptEditFunctionScreen.java

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,24 +2,28 @@
22

33
import io.github.techstreet.dfscript.DFScript;
44
import io.github.techstreet.dfscript.screen.CScreen;
5-
import io.github.techstreet.dfscript.screen.widget.CText;
5+
import io.github.techstreet.dfscript.screen.misc.ItemMaterialSelectionScreen;
6+
import io.github.techstreet.dfscript.screen.widget.CItem;
67
import io.github.techstreet.dfscript.screen.widget.CTextField;
78
import io.github.techstreet.dfscript.script.Script;
89
import io.github.techstreet.dfscript.script.ScriptPart;
910
import io.github.techstreet.dfscript.script.function.ScriptFunction;
1011

12+
import java.util.List;
1113
import java.util.Objects;
1214

1315
public class ScriptEditFunctionScreen extends CScreen {
1416
private final Script script;
1517
private final ScriptFunction function;
1618

19+
CItem functionIcon;
20+
1721
public ScriptEditFunctionScreen(Script script, ScriptFunction function) {
1822
super(90, 100);
1923
this.script = script;
2024
this.function = function;
2125

22-
CTextField nameField = new CTextField(function.getFunctionName(), 5, 5, 80, 20, true);
26+
CTextField nameField = new CTextField(function.getFunctionName(), 15, 5, 70, 20, true);
2327
nameField.setChangedListener(() -> {
2428
for (ScriptPart part : script.getParts()) {
2529
if(part instanceof ScriptFunction f) {
@@ -44,6 +48,25 @@ public ScriptEditFunctionScreen(Script script, ScriptFunction function) {
4448
});
4549

4650
widgets.add(nameField);
51+
52+
refresh();
53+
}
54+
55+
public void refresh() {
56+
widgets.remove(functionIcon);
57+
58+
functionIcon = new CItem(5,5, function.getFullIcon());
59+
functionIcon.setClickListener((mouse) -> {
60+
DFScript.MC.setScreen(new ItemMaterialSelectionScreen(
61+
(mat) -> {
62+
function.setIcon(mat);
63+
DFScript.MC.setScreen(new ScriptEditFunctionScreen(script, function));
64+
},
65+
function.getIcon()
66+
));
67+
});
68+
69+
widgets.add(functionIcon);
4770
}
4871

4972
@Override

src/main/java/io/github/techstreet/dfscript/screen/widget/CPlainPanel.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,12 @@ public void render(MatrixStack stack, int mouseX, int mouseY, float tickDelta) {
3838
(int) (end.getY() - begin.getY())*guiScale
3939
);
4040

41+
if(mouseX < x) mouseX = CWidget.MOUSE_DISABLE;
42+
if(mouseX > x+width) mouseX = CWidget.MOUSE_DISABLE;
43+
44+
if(mouseY < y) mouseY = CWidget.MOUSE_DISABLE;
45+
if(mouseY > y+height) mouseY = CWidget.MOUSE_DISABLE;
46+
4147
for (CWidget child : children) {
4248
child.render(stack, mouseX, mouseY, tickDelta);
4349
}
@@ -48,6 +54,10 @@ public void render(MatrixStack stack, int mouseX, int mouseY, float tickDelta) {
4854

4955
@Override
5056
public boolean mouseClicked(double x, double y, int button) {
57+
if(!getBounds().contains(x, y)) {
58+
return false;
59+
}
60+
5161
for (int i = children.size() - 1; i >= 0; i--) {
5262
if (children.get(i).mouseClicked(x, y, button)) {
5363
return true;
@@ -72,6 +82,10 @@ public void keyPressed(int keyCode, int scanCode, int modifiers) {
7282

7383
@Override
7484
public void mouseScrolled(double mouseX, double mouseY, double amount) {
85+
if(!getBounds().contains(mouseX, mouseY)) {
86+
return;
87+
}
88+
7589
for (CWidget child : children) {
7690
child.mouseScrolled(mouseX, mouseY, amount);
7791
}
@@ -93,6 +107,12 @@ public void add(CWidget child) {
93107

94108
@Override
95109
public void renderOverlay(MatrixStack stack, int mouseX, int mouseY, float tickDelta) {
110+
if(mouseX < x) mouseX = CWidget.MOUSE_DISABLE;
111+
if(mouseX > x+width) mouseX = CWidget.MOUSE_DISABLE;
112+
113+
if(mouseY < y) mouseY = CWidget.MOUSE_DISABLE;
114+
if(mouseY > y+height) mouseY = CWidget.MOUSE_DISABLE;
115+
96116
stack.push();
97117
stack.translate(x, y, 0);
98118
for (CWidget child : children) {

src/main/java/io/github/techstreet/dfscript/screen/widget/CScrollPanel.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,12 @@ public void render(MatrixStack stack, int mouseX, int mouseY, float tickDelta) {
2626
stack.push();
2727
stack.translate(x, y, 0);
2828

29+
if(mouseX < x) mouseX = CWidget.MOUSE_DISABLE;
30+
if(mouseX > x+width) mouseX = CWidget.MOUSE_DISABLE;
31+
32+
if(mouseY < y) mouseY = CWidget.MOUSE_DISABLE;
33+
if(mouseY > y+height) mouseY = CWidget.MOUSE_DISABLE;
34+
2935
mouseX -= x;
3036
mouseY -= y;
3137

@@ -55,6 +61,10 @@ public void render(MatrixStack stack, int mouseX, int mouseY, float tickDelta) {
5561

5662
@Override
5763
public boolean mouseClicked(double x, double y, int button) {
64+
if(!getBounds().contains(x, y)) {
65+
return false;
66+
}
67+
5868
y -= scroll;
5969
x -= this.x;
6070
y -= this.y;
@@ -82,6 +92,10 @@ public void keyPressed(int keyCode, int scanCode, int modifiers) {
8292

8393
@Override
8494
public void mouseScrolled(double mouseX, double mouseY, double amount) {
95+
if(!getBounds().contains(mouseX, mouseY)) {
96+
return;
97+
}
98+
8599
mouseX -= x;
86100
mouseY -= y;
87101
for (CWidget child : children) {
@@ -115,6 +129,12 @@ public void add(CWidget child) {
115129

116130
@Override
117131
public void renderOverlay(MatrixStack stack, int mouseX, int mouseY, float tickDelta) {
132+
if(mouseX < x) mouseX = CWidget.MOUSE_DISABLE;
133+
if(mouseX > x+width) mouseX = CWidget.MOUSE_DISABLE;
134+
135+
if(mouseY < y) mouseY = CWidget.MOUSE_DISABLE;
136+
if(mouseY > y+height) mouseY = CWidget.MOUSE_DISABLE;
137+
118138
mouseY -= scroll;
119139

120140
mouseX -= x;

src/main/java/io/github/techstreet/dfscript/screen/widget/CWidget.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import net.minecraft.client.util.math.MatrixStack;
55

66
public interface CWidget {
7-
7+
int MOUSE_DISABLE = -100000000;
88
void render(MatrixStack stack, int mouseX, int mouseY, float tickDelta);
99

1010
default boolean mouseClicked(double x, double y, int button) {

src/main/java/io/github/techstreet/dfscript/script/Script.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -347,6 +347,8 @@ private void updateScriptReferences() {
347347
for(ScriptPart part : getParts()) {
348348
if(part instanceof ScriptAction a) {
349349
a.updateScriptReferences(this);
350+
} else if (part instanceof ScriptCallFunction f) {
351+
f.setScript(this);
350352
}
351353
}
352354
}

src/main/java/io/github/techstreet/dfscript/script/ScriptPart.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,15 +46,16 @@ public ScriptPart deserialize(JsonElement json, Type typeOfT, JsonDeserializatio
4646
}
4747
case "function" -> {
4848
String name = obj.get("function").getAsString();
49-
return new ScriptFunction(name);
49+
String icon = obj.has("icon") ? obj.get("icon").getAsString() : "lapis_lazuli";
50+
return new ScriptFunction(name, icon);
5051
}
5152
case "callFunction" -> {
5253
String name = obj.get("function").getAsString();
5354
List<ScriptArgument> args = new ArrayList<>();
5455
for (JsonElement arg : obj.get("arguments").getAsJsonArray()) {
5556
args.add(context.deserialize(arg, ScriptArgument.class));
5657
}
57-
return new ScriptCallFunction(name, args);
58+
return new ScriptCallFunction(name, args, null);
5859
}
5960
default -> throw new JsonParseException("Unknown script part type: " + type);
6061
}

src/main/java/io/github/techstreet/dfscript/script/action/ScriptActionCategory.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ public enum ScriptActionCategory {
4040

4141
ItemStack icon = new ItemStack(Items.LAPIS_LAZULI);
4242
icon.setCustomName(Text.literal(func.getFunctionName()).setStyle(Style.EMPTY.withItalic(false)));
43-
extras.add(new ScriptActionCategoryExtra(icon, (Void) -> new ScriptCallFunction(funcName, new ArrayList<>())));
43+
extras.add(new ScriptActionCategoryExtra(icon, (Void) -> new ScriptCallFunction(funcName, new ArrayList<>(), script)));
4444
}
4545

4646
return extras;

src/main/java/io/github/techstreet/dfscript/script/function/ScriptCallFunction.java

Lines changed: 41 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,13 @@
1616
import io.github.techstreet.dfscript.script.execution.ScriptTask;
1717
import net.minecraft.item.ItemStack;
1818
import net.minecraft.item.Items;
19+
import net.minecraft.nbt.NbtList;
20+
import net.minecraft.nbt.NbtString;
1921
import net.minecraft.text.Style;
2022
import net.minecraft.text.Text;
23+
import net.minecraft.util.Formatting;
24+
import net.minecraft.util.Identifier;
25+
import net.minecraft.util.registry.Registry;
2126

2227
import java.lang.reflect.Type;
2328
import java.util.HashMap;
@@ -26,10 +31,12 @@
2631

2732
public class ScriptCallFunction extends ScriptRunnablePart {
2833
String function;
34+
transient Script script;
2935

30-
public ScriptCallFunction(String function, List<ScriptArgument> arguments) {
36+
public ScriptCallFunction(String function, List<ScriptArgument> arguments, Script script) {
3137
super(arguments);
3238
this.function = function;
39+
this.script = script;
3340
}
3441

3542
public String getFunctionName() {
@@ -54,9 +61,39 @@ public void invoke(Event event, ScriptContext context, Consumer<ScriptScopeVaria
5461

5562
@Override
5663
public ItemStack getIcon() {
57-
ItemStack icon = new ItemStack(Items.LAPIS_LAZULI);
58-
icon.setCustomName(Text.literal(getFunctionName()).setStyle(Style.EMPTY.withItalic(false)));
59-
return icon;
64+
ScriptFunction func = getFunction();
65+
66+
if(func == null) {
67+
ItemStack icon = new ItemStack(Items.RED_DYE);
68+
icon.setCustomName(Text.literal(getFunctionName()).setStyle(Style.EMPTY.withItalic(false)));
69+
NbtList lore = new NbtList();
70+
71+
lore.add(NbtString.of(Text.Serializer.toJson(Text.literal("Missing Function Definition")
72+
.fillStyle(Style.EMPTY
73+
.withColor(Formatting.RED)
74+
.withItalic(false)))));
75+
76+
icon.getSubNbt("display")
77+
.put("Lore", lore);
78+
79+
return icon;
80+
}
81+
82+
return func.getFullIcon();
83+
}
84+
85+
public ScriptFunction getFunction() {
86+
if(getScript().getFunctions().containsKey(function))
87+
return getScript().getFunctions().get(function);
88+
return null;
89+
}
90+
91+
public Script getScript() {
92+
return script;
93+
}
94+
95+
public void setScript(Script script) {
96+
this.script = script;
6097
}
6198

6299
@Override

0 commit comments

Comments
 (0)