Skip to content

Commit 92f2de7

Browse files
committed
added DUAL and DICTIONARY option types
also streamlined the creation of new option types
1 parent fa3ca97 commit 92f2de7

13 files changed

Lines changed: 326 additions & 56 deletions

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,12 @@
55
import io.github.techstreet.dfscript.screen.widget.CItem;
66
import io.github.techstreet.dfscript.script.Script;
77
import io.github.techstreet.dfscript.script.options.ScriptNamedOption;
8+
import io.github.techstreet.dfscript.script.options.ScriptOption;
89
import io.github.techstreet.dfscript.script.options.ScriptOptionEnum;
910
import io.github.techstreet.dfscript.util.chat.ChatUtil;
11+
12+
import java.util.ArrayList;
13+
1014
public class ScriptAddSettingScreen extends CScreen {
1115
private static final int size;
1216

@@ -29,7 +33,7 @@ public ScriptAddSettingScreen(Script script, int pos) {
2933
if(option.getExtraTypes() == 0) {
3034
citem.setClickListener((a) -> {
3135
try {
32-
script.addOption(pos, new ScriptNamedOption(option.getOptionType().getConstructor().newInstance(), script.getUnnamedOption()));
36+
script.addOption(pos, new ScriptNamedOption(ScriptOption.instantiate(option, new ArrayList<>()), script.getUnnamedOption()));
3337
} catch (Exception e) {
3438
ChatUtil.error(String.valueOf(e.getCause()));
3539
}

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

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import io.github.techstreet.dfscript.screen.widget.CTexturedButton;
77
import io.github.techstreet.dfscript.script.Script;
88
import io.github.techstreet.dfscript.script.options.ScriptNamedOption;
9+
import io.github.techstreet.dfscript.script.options.ScriptOption;
910
import io.github.techstreet.dfscript.script.options.ScriptOptionEnum;
1011
import io.github.techstreet.dfscript.util.chat.ChatUtil;
1112
import net.minecraft.client.gui.DrawableHelper;
@@ -118,10 +119,7 @@ public void render(MatrixStack stack, int mouseX, int mouseY, float tickDelta) {
118119
if(noNull) {
119120
CTexturedButton button = new CTexturedButton(width - 10, 3, 8, 8, DFScript.MOD_ID + ":on_button.png", () -> {
120121
try {
121-
Class<?>[] argTypes = new Class[option.getExtraTypes()];
122-
Arrays.fill(argTypes, ScriptOptionEnum.class);
123-
124-
script.addOption(pos, new ScriptNamedOption(option.getOptionType().getConstructor(argTypes).newInstance(subtypes.toArray()), script.getUnnamedOption()));
122+
script.addOption(pos, new ScriptNamedOption(ScriptOption.instantiate(option, subtypes), script.getUnnamedOption()));
125123
} catch (Exception e) {
126124
ChatUtil.error(String.valueOf(e.getCause()));
127125
}

src/main/java/io/github/techstreet/dfscript/script/options/ScriptBoolOption.java

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,6 @@ public boolean convertableTo(ScriptActionArgument.ScriptActionArgumentType arg)
3232
return ScriptActionArgument.ScriptActionArgumentType.TEXT.convertableTo(arg);
3333
}
3434

35-
@Override
36-
public String getName() { return "Boolean"; }
37-
3835
@Override
3936
public int create(CScrollPanel panel, int x, int y, int width) {
4037
CTexturedButton button = new CTexturedButton(x, y, 8, 8, getTexture(), null, 0, 0, 1, 0.5f, 0, 0.5f);
@@ -51,11 +48,6 @@ private String getTexture() {
5148
return DFScript.MOD_ID + (value ? ":on_button.png" : ":off_button.png");
5249
}
5350

54-
@Override
55-
public Item getIcon() {
56-
return Items.LEVER;
57-
}
58-
5951
@Override
6052
public JsonElement getJsonElement() {
6153
return new JsonPrimitive(value);
Lines changed: 177 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,177 @@
1+
package io.github.techstreet.dfscript.script.options;
2+
3+
import com.google.gson.JsonArray;
4+
import com.google.gson.JsonElement;
5+
import io.github.techstreet.dfscript.DFScript;
6+
import io.github.techstreet.dfscript.screen.script.ScriptSettingsScreen;
7+
import io.github.techstreet.dfscript.screen.widget.CButton;
8+
import io.github.techstreet.dfscript.screen.widget.CScrollPanel;
9+
import io.github.techstreet.dfscript.script.action.ScriptActionArgument;
10+
import io.github.techstreet.dfscript.script.util.ScriptOptionSubtypeMismatchException;
11+
import io.github.techstreet.dfscript.script.values.ScriptDictionaryValue;
12+
import io.github.techstreet.dfscript.script.values.ScriptListValue;
13+
import io.github.techstreet.dfscript.script.values.ScriptValue;
14+
import io.github.techstreet.dfscript.util.chat.ChatUtil;
15+
import net.minecraft.client.gui.DrawableHelper;
16+
import net.minecraft.client.sound.PositionedSoundInstance;
17+
import net.minecraft.client.util.math.MatrixStack;
18+
import net.minecraft.sound.SoundEvents;
19+
20+
import java.awt.*;
21+
import java.util.ArrayList;
22+
import java.util.Arrays;
23+
import java.util.HashMap;
24+
import java.util.List;
25+
26+
public class ScriptDictionaryOption implements ScriptOption {
27+
28+
List<ScriptDualOption> value = new ArrayList<>();
29+
ScriptOptionEnum[] valueTypes;
30+
31+
public ScriptDictionaryOption(JsonElement value, ScriptOptionEnum type1, ScriptOptionEnum type2) throws ScriptOptionSubtypeMismatchException {
32+
valueTypes = new ScriptOptionEnum[]{type1,type2};
33+
34+
if(!value.isJsonArray())
35+
{
36+
DFScript.LOGGER.error("Not a JSON Array!");
37+
}
38+
39+
for(JsonElement e : value.getAsJsonArray())
40+
{
41+
this.value.add((ScriptDualOption) ScriptOption.fromJson(e, ScriptOptionEnum.DUAL,
42+
List.of(type1, type2)
43+
));
44+
}
45+
46+
checkValidity();
47+
}
48+
49+
public ScriptDictionaryOption(ScriptOptionEnum type1, ScriptOptionEnum type2) throws ScriptOptionSubtypeMismatchException {
50+
valueTypes = new ScriptOptionEnum[]{type1,type2};
51+
52+
checkValidity();
53+
}
54+
55+
private void checkValidity() throws ScriptOptionSubtypeMismatchException {
56+
for(int i = 0; i < 2; i++)
57+
{
58+
if(valueTypes[i].getExtraTypes() != 0)
59+
{
60+
throw new ScriptOptionSubtypeMismatchException("Incorrect amount of extra types");
61+
}
62+
}
63+
64+
for(ScriptDualOption o : value)
65+
{
66+
for(int i = 0; i < 2; i++) {
67+
if (valueTypes[i] != o.getSubtypes().get(i)) {
68+
throw new ScriptOptionSubtypeMismatchException("Incorrect type of an item");
69+
}
70+
}
71+
}
72+
}
73+
74+
@Override
75+
public ScriptValue getValue() {
76+
HashMap<String,ScriptValue> result = new HashMap<>();
77+
78+
for(ScriptOption o : value)
79+
{
80+
List<ScriptValue> s = o.getValue().asList();
81+
82+
result.put(s.get(0).asText(),s.get(1));
83+
}
84+
85+
return new ScriptDictionaryValue(result);
86+
}
87+
88+
@Override
89+
public boolean convertableTo(ScriptActionArgument.ScriptActionArgumentType arg) {
90+
return ScriptActionArgument.ScriptActionArgumentType.DICTIONARY.convertableTo(arg);
91+
}
92+
93+
@Override
94+
public int create(CScrollPanel panel, int x, int y, int width) {
95+
int i = 0;
96+
for(ScriptOption o : value) {
97+
int y1 = y;
98+
y = o.create(panel,x+5,y,width-5);
99+
int finalI = i;
100+
panel.add(new CButton(5, y1, 115, y-y1, "",() -> {}) {
101+
@Override
102+
public void render(MatrixStack stack, int mouseX, int mouseY, float tickDelta) {
103+
Rectangle b = getBounds();
104+
if (b.contains(mouseX, mouseY)) {
105+
DrawableHelper.fill(stack, b.x, b.y, b.x + b.width, b.y + b.height, 0x33000000);
106+
}
107+
}
108+
109+
@Override
110+
public boolean mouseClicked(double x, double y, int button) {
111+
if (getBounds().contains(x, y)) {
112+
if (button != 0) {
113+
DFScript.MC.getSoundManager().play(PositionedSoundInstance.ambient(SoundEvents.UI_BUTTON_CLICK, 1f,1f));
114+
if (DFScript.MC.currentScreen instanceof ScriptSettingsScreen s) {
115+
CButton insertBefore = new CButton((int) x, (int) y, 50, 8, "Insert Item Before", () -> {
116+
try {
117+
value.add(finalI, (ScriptDualOption) ScriptOption.instantiate(ScriptOptionEnum.DUAL, List.of(valueTypes[0],valueTypes[1])));
118+
} catch (Exception e) {
119+
ChatUtil.error(String.valueOf(e.getCause()));
120+
}
121+
s.reloadMenu();
122+
});
123+
CButton insertAfter = new CButton((int) x, (int) y + 8, 50, 8, "Insert Item After", () -> {
124+
try {
125+
value.add(finalI + 1, (ScriptDualOption) ScriptOption.instantiate(ScriptOptionEnum.DUAL, List.of(valueTypes[0],valueTypes[1])));
126+
} catch (Exception e) {
127+
ChatUtil.error(String.valueOf(e.getCause()));
128+
}
129+
s.reloadMenu();
130+
});
131+
CButton delete = new CButton((int) x, (int) y + 16, 50, 8, "Delete Item", () -> {
132+
value.remove(finalI);
133+
s.reloadMenu();
134+
});
135+
s.newContextMenu(new CButton[]{insertBefore, insertAfter, delete});
136+
}
137+
return true;
138+
}
139+
}
140+
return false;
141+
}
142+
});
143+
i++;
144+
}
145+
146+
CButton button = new CButton(x+5, y, width-5, 8, "Add Item", ()->{
147+
try {
148+
value.add((ScriptDualOption) ScriptOption.instantiate(ScriptOptionEnum.DUAL, List.of(valueTypes[0],valueTypes[1])));
149+
} catch (Exception e) {
150+
ChatUtil.error(String.valueOf(e.getCause()));
151+
}
152+
153+
if(DFScript.MC.currentScreen instanceof ScriptSettingsScreen s) {
154+
s.reloadMenu();
155+
}
156+
});
157+
158+
panel.add(button);
159+
160+
return y+10;
161+
}
162+
163+
@Override
164+
public JsonElement getJsonElement() {
165+
JsonArray array = new JsonArray(value.size());
166+
for (ScriptOption o : value) {
167+
array.add(o.getJsonElement());
168+
}
169+
170+
return array;
171+
}
172+
173+
@Override
174+
public List<ScriptOptionEnum> getSubtypes() {
175+
return Arrays.stream(valueTypes).toList();
176+
}
177+
}
Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
package io.github.techstreet.dfscript.script.options;
2+
3+
import com.google.gson.JsonArray;
4+
import com.google.gson.JsonElement;
5+
import com.google.gson.JsonObject;
6+
import io.github.techstreet.dfscript.DFScript;
7+
import io.github.techstreet.dfscript.screen.script.ScriptSettingsScreen;
8+
import io.github.techstreet.dfscript.screen.widget.CButton;
9+
import io.github.techstreet.dfscript.screen.widget.CScrollPanel;
10+
import io.github.techstreet.dfscript.script.action.ScriptActionArgument;
11+
import io.github.techstreet.dfscript.script.util.ScriptOptionSubtypeMismatchException;
12+
import io.github.techstreet.dfscript.script.values.ScriptListValue;
13+
import io.github.techstreet.dfscript.script.values.ScriptValue;
14+
import io.github.techstreet.dfscript.util.chat.ChatUtil;
15+
import net.minecraft.client.gui.DrawableHelper;
16+
import net.minecraft.client.sound.PositionedSoundInstance;
17+
import net.minecraft.client.util.math.MatrixStack;
18+
import net.minecraft.sound.SoundEvents;
19+
20+
import java.awt.*;
21+
import java.lang.reflect.InvocationTargetException;
22+
import java.util.ArrayList;
23+
import java.util.Arrays;
24+
import java.util.List;
25+
26+
public class ScriptDualOption implements ScriptOption {
27+
28+
ScriptOption[] values;
29+
ScriptOptionEnum[] valueTypes;
30+
31+
public ScriptDualOption(JsonElement value, ScriptOptionEnum type1, ScriptOptionEnum type2) throws ScriptOptionSubtypeMismatchException {
32+
valueTypes = new ScriptOptionEnum[]{type1,type2};
33+
34+
values = new ScriptOption[]
35+
{
36+
ScriptOption.fromJson(value.getAsJsonObject().get("first"), type1, new ArrayList<>()),
37+
ScriptOption.fromJson(value.getAsJsonObject().get("second"), type2, new ArrayList<>())
38+
};
39+
40+
checkValidity();
41+
}
42+
43+
public ScriptDualOption(ScriptOptionEnum type1, ScriptOptionEnum type2) throws ScriptOptionSubtypeMismatchException, InvocationTargetException, NoSuchMethodException, InstantiationException, IllegalAccessException {
44+
values = new ScriptOption[]{
45+
ScriptOption.instantiate(type1, new ArrayList<>()),
46+
ScriptOption.instantiate(type2, new ArrayList<>())
47+
};
48+
valueTypes = new ScriptOptionEnum[]{type1,type2};
49+
50+
checkValidity();
51+
}
52+
53+
private void checkValidity() throws ScriptOptionSubtypeMismatchException {
54+
for(int i = 0; i < 2; i++) {
55+
if (valueTypes[i].getExtraTypes() != 0) {
56+
throw new ScriptOptionSubtypeMismatchException("Incorrect amount of extra types");
57+
}
58+
59+
if(!values[i].getClass().equals(valueTypes[i].getOptionType())) {
60+
throw new ScriptOptionSubtypeMismatchException("Incorrect type of a value");
61+
}
62+
}
63+
}
64+
65+
@Override
66+
public ScriptValue getValue() {
67+
List<ScriptValue> result = new ArrayList<>();
68+
69+
for(ScriptOption o : values)
70+
{
71+
result.add(o.getValue());
72+
}
73+
74+
return new ScriptListValue(result);
75+
}
76+
77+
@Override
78+
public boolean convertableTo(ScriptActionArgument.ScriptActionArgumentType arg) {
79+
return ScriptActionArgument.ScriptActionArgumentType.LIST.convertableTo(arg);
80+
}
81+
82+
@Override
83+
public int create(CScrollPanel panel, int x, int y, int width) {
84+
85+
int endY = y;
86+
87+
for(int i = 0; i < 2; i++)
88+
{
89+
int curY = values[i].create(panel, x, y, width/2-1);
90+
if(curY > endY)
91+
{
92+
endY = curY;
93+
}
94+
95+
x += width/2+1;
96+
}
97+
98+
return endY;
99+
}
100+
101+
@Override
102+
public JsonElement getJsonElement() {
103+
JsonObject obj = new JsonObject();
104+
105+
obj.add("first", values[0].getJsonElement());
106+
obj.add("second", values[1].getJsonElement());
107+
108+
return obj;
109+
}
110+
111+
@Override
112+
public List<ScriptOptionEnum> getSubtypes() {
113+
return Arrays.stream(valueTypes).toList();
114+
}
115+
}

src/main/java/io/github/techstreet/dfscript/script/options/ScriptFloatOption.java

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,6 @@ public ScriptValue getValue() {
3030
public boolean convertableTo(ScriptActionArgument.ScriptActionArgumentType arg) {
3131
return ScriptActionArgument.ScriptActionArgumentType.NUMBER.convertableTo(arg);
3232
}
33-
@Override
34-
public String getName() { return "Floating-Point Value"; }
3533

3634
@Override
3735
public int create(CScrollPanel panel, int x, int y, int width) {
@@ -50,11 +48,6 @@ public int create(CScrollPanel panel, int x, int y, int width) {
5048
return y + 12;
5149
}
5250

53-
@Override
54-
public Item getIcon() {
55-
return Items.SLIME_BLOCK;
56-
}
57-
5851
@Override
5952
public JsonElement getJsonElement() {
6053
return new JsonPrimitive(value);

src/main/java/io/github/techstreet/dfscript/script/options/ScriptIntOption.java

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,6 @@ public ScriptValue getValue() {
3030
public boolean convertableTo(ScriptActionArgument.ScriptActionArgumentType arg) {
3131
return ScriptActionArgument.ScriptActionArgumentType.NUMBER.convertableTo(arg);
3232
}
33-
@Override
34-
public String getName() { return "Integer"; }
3533

3634
@Override
3735
public int create(CScrollPanel panel, int x, int y, int width) {
@@ -50,11 +48,6 @@ public int create(CScrollPanel panel, int x, int y, int width) {
5048
return y + 12;
5149
}
5250

53-
@Override
54-
public Item getIcon() {
55-
return Items.SLIME_BALL;
56-
}
57-
5851
@Override
5952
public JsonElement getJsonElement() {
6053
return new JsonPrimitive(value);

0 commit comments

Comments
 (0)