tangled
alpha
login
or
join now
codexarchonic.nekoweb.org
/
ProjectInfinity
0
fork
atom
Inspired by 2020's April Fools' 20w14infinite Snapshot, this mod brings endless randomly generated dimensions into Minecraft.
0
fork
atom
overview
issues
6
pulls
pipelines
adding new amendments; amendment version updating
Lera
7 months ago
6f7c6db5
4fe7c101
+79
-52
3 changed files
expand all
collapse all
unified
split
common
src
main
java
net
lerariemann
infinity
compat
cloth
AmendmentConfigFactory.java
util
config
Amendment.java
resources
config
amendments.json
+73
-46
common/src/main/java/net/lerariemann/infinity/compat/cloth/AmendmentConfigFactory.java
···
9
9
import me.shedaniel.clothconfig2.api.Requirement;
10
10
import me.shedaniel.clothconfig2.api.ValueHolder;
11
11
import me.shedaniel.clothconfig2.gui.entries.DropdownBoxEntry;
12
12
+
import me.shedaniel.clothconfig2.gui.entries.SubCategoryListEntry;
12
13
import me.shedaniel.clothconfig2.impl.builders.DropdownMenuBuilder;
13
14
import me.shedaniel.clothconfig2.impl.builders.SubCategoryBuilder;
14
15
import net.lerariemann.infinity.util.core.CommonIO;
15
16
import net.lerariemann.infinity.util.core.NbtUtils;
16
17
import net.minecraft.nbt.NbtCompound;
18
18
+
import net.minecraft.nbt.NbtElement;
17
19
import net.minecraft.nbt.NbtList;
18
20
import net.minecraft.nbt.NbtString;
19
19
-
import net.minecraft.text.Style;
20
21
import net.minecraft.text.Text;
21
22
22
23
import java.util.*;
···
30
31
var elements = amendmentList.getAsJsonArray("elements");
31
32
int numAmendments = 0;
32
33
for (JsonElement amendmentElement : elements) {
33
33
-
numAmendments = AmendmentBuilder.addNew(builder, amendmentElement, numAmendments, amendmentCategory);
34
34
+
amendmentCategory.addEntry(AmendmentBuilder.getNew(builder, amendmentElement, numAmendments));
35
35
+
numAmendments++;
34
36
}
35
35
-
// todo new amendments
36
36
-
// addAmendment(builder, null, i, amendmentCategory);
37
37
-
amendmentCategory.addEntry(builder.entryBuilder().startTextDescription(Text.literal("To add new entries, edit amendments.json.").setStyle(Style.EMPTY)).build());
37
37
+
38
38
+
var moreAmendments = builder.entryBuilder().startIntField(Text.literal("Add more amendments:"), 0).setMax(10).build();
39
39
+
amendmentCategory.addEntry(moreAmendments);
40
40
+
for (int i = 0; i < 10; i++) {
41
41
+
amendmentCategory.addEntry(AmendmentBuilder.getShadow(builder, numAmendments, moreAmendments, i));
42
42
+
numAmendments++;
43
43
+
}
38
44
}
39
45
40
46
interface AmendmentUpdater<T> {
···
66
72
AmendmentUpdater<List<String>> ofStringList = new AmendmentUpdater<>() {
67
73
@Override
68
74
public boolean check(NbtCompound amendment, String key, List<String> value) {
69
69
-
// TODO Check if an amendment should be changed before writing
70
70
-
return true;
75
75
+
var list = NbtUtils.getList(amendment, key, NbtElement.STRING_TYPE);
76
76
+
StringBuilder a = new StringBuilder();
77
77
+
StringBuilder b = new StringBuilder();
78
78
+
for (NbtElement s: list) a.append(s.asString());
79
79
+
for (String s: value) b.append(s);
80
80
+
return !Objects.equals(a.toString(), b.toString());
71
81
}
72
82
@Override
73
83
public void update(NbtCompound amendment, String key, List<String> value) {
···
76
86
};
77
87
}
78
88
79
79
-
record StaticStringValueHolder(String s) implements ValueHolder<String> {
80
80
-
@Override
81
81
-
public String getValue() {
82
82
-
return s;
83
83
-
}
84
84
-
}
85
85
-
static ValueHolder<String> hold(String s) {
86
86
-
return new StaticStringValueHolder(s);
89
89
+
static Requirement always = () -> true;
90
90
+
static Requirement matches(ValueHolder<String> holder, String m) {
91
91
+
return () -> Objects.equals(holder.getValue(), m);
87
92
}
88
93
89
94
static class AmendmentBuilder {
···
99
104
this.amendment = amendment;
100
105
}
101
106
102
102
-
static Requirement always = () -> true;
103
103
-
104
107
void build() {
105
108
var area = addStringDropdownOption("area", always,
106
109
Lists.newArrayList("blocks", "fluids", "items", "structures", "trees", "mobs"));
···
108
111
109
112
var selector = addStringDropdownOption("selector", always,
110
113
Lists.newArrayList("all", "matching", "matching_any", "matching_block_tag", "containing"));
111
111
-
addListOption("matching",
112
112
-
Requirement.matches(selector, hold("matching_any")));
113
113
-
addStringOption("matching",
114
114
-
Requirement.matches(selector, hold("matching")));
115
115
-
addStringOption("matching",
116
116
-
Requirement.matches(selector, hold("matching_block_tag")));
114
114
+
addListOption("matching_any", matches(selector, "matching_any"));
115
115
+
addStringOption("matching", matches(selector, "matching"));
116
116
+
addStringOption("containing", matches(selector, "containing"));
117
117
+
addStringOption("matching_block_tag", matches(selector, "matching_block_tag"));
117
118
118
119
var results = addStringDropdownOption("results", always,
119
120
Lists.newArrayList("set_value", "set_field", "erase"));
120
120
-
addDoubleOption("value",
121
121
-
Requirement.matches(results, hold("set_value")));
121
121
+
addDoubleOption("value", matches(results, "set_value"));
122
122
addStringDropdownOption("field_name",
123
123
-
Requirement.all(Requirement.matches(area, hold("blocks")), Requirement.matches(results, hold("set_field"))),
123
123
+
Requirement.all(matches(area, "blocks"), matches(results, "set_field")),
124
124
Lists.newArrayList("full", "float", "top", "laggy"));
125
125
}
126
126
···
169
169
}
170
170
171
171
<T> void amendmentSetter(String name, T newValue, int amendmentIndex, AmendmentUpdater<T> updater) {
172
172
-
NbtCompound elements = readNbt(configPath()+("/amendments.json"));
173
173
-
NbtCompound amendmentNbt = elements.getList("elements", 10).getCompound(amendmentIndex);
172
172
+
NbtCompound elements = readNbt(configPath()+"/amendments.json");
173
173
+
NbtList list = elements.getList("elements", 10);
174
174
+
NbtCompound amendmentNbt = list.getCompound(amendmentIndex);
175
175
+
174
176
// Check if an amendment should be changed before writing
175
177
if (updater.check(amendmentNbt, name, newValue)) {
176
178
updater.update(amendmentNbt, name, newValue);
179
179
+
updateAmendmentVersion(elements);
177
180
CommonIO.write(elements, configPath(), "amendments.json");
178
178
-
amendment = readJson(configPath()+("/amendments.json"))
179
179
-
.getAsJsonObject()
180
180
-
.getAsJsonArray("elements")
181
181
-
.get(amendmentIndex)
182
182
-
.getAsJsonObject();
183
181
}
184
182
}
185
183
186
186
-
static int addNew(ConfigBuilder builder, JsonElement amendmentElement, int i, ConfigCategory amendmentCategory) {
187
187
-
JsonObject amendment;
188
188
-
SubCategoryBuilder subCategory;
189
189
-
if (amendmentElement != null) {
190
190
-
subCategory = builder.entryBuilder().startSubCategory(Text.translatable("config.infinity.amendment", String.valueOf(i)));
191
191
-
amendment = amendmentElement.getAsJsonObject();
192
192
-
} else {
193
193
-
subCategory = builder.entryBuilder().startSubCategory(Text.translatable("config.infinity.amendment.new"));
194
194
-
amendment = new JsonObject();
184
184
+
static SubCategoryListEntry getNew(ConfigBuilder builder, JsonElement amendmentElement, int i) {
185
185
+
JsonObject amendment = amendmentElement.getAsJsonObject();;
186
186
+
SubCategoryBuilder subCategory = builder.entryBuilder().startSubCategory(Text.translatable("config.infinity.amendment", String.valueOf(i)));
187
187
+
188
188
+
(new AmendmentBuilder(builder, subCategory, i, amendment)).build();
189
189
+
return subCategory.build();
190
190
+
}
191
191
+
192
192
+
static SubCategoryListEntry getShadow(ConfigBuilder builder, int i, ValueHolder<Integer> shadowAmount, int shadowI) {
193
193
+
SubCategoryBuilder subCategory = builder.entryBuilder()
194
194
+
.startSubCategory(Text.translatable("config.infinity.amendment.new"))
195
195
+
.setDisplayRequirement(() -> shadowAmount.getValue() > shadowI);
196
196
+
197
197
+
(new NewAmendmentBuilder(builder, subCategory, i)).build();
198
198
+
return subCategory.build();
199
199
+
}
200
200
+
201
201
+
static void updateAmendmentVersion(NbtCompound elements) {
202
202
+
elements.putInt("amendment_version", (int)((System.currentTimeMillis() - 1754769333185L)/1000));
203
203
+
}
204
204
+
}
205
205
+
206
206
+
static class NewAmendmentBuilder extends AmendmentBuilder {
207
207
+
NewAmendmentBuilder(ConfigBuilder builder, SubCategoryBuilder subCategory, int i) {
208
208
+
super(builder, subCategory, i, new JsonObject());
209
209
+
}
210
210
+
211
211
+
@Override
212
212
+
<T> void amendmentSetter(String name, T newValue, int amendmentIndex, AmendmentUpdater<T> updater) {
213
213
+
NbtCompound elements = readNbt(configPath()+"/amendments.json");
214
214
+
NbtList list = elements.getList("elements", 10);
215
215
+
if (amendmentIndex < list.size()) {
216
216
+
super.amendmentSetter(name, newValue, amendmentIndex, updater);
217
217
+
return;
195
218
}
219
219
+
NbtCompound amendmentNbt = new NbtCompound();
196
220
197
197
-
(new AmendmentBuilder(builder, subCategory, i, amendment)).build();
198
198
-
amendmentCategory.addEntry(subCategory.build());
199
199
-
i++;
200
200
-
return i;
221
221
+
// Check if an amendment should be changed before writing
222
222
+
if (updater.check(amendmentNbt, name, newValue)) {
223
223
+
updater.update(amendmentNbt, name, newValue);
224
224
+
list.add(amendmentNbt);
225
225
+
updateAmendmentVersion(elements);
226
226
+
CommonIO.write(elements, configPath(), "amendments.json");
227
227
+
}
201
228
}
202
229
}
203
230
+4
-4
common/src/main/java/net/lerariemann/infinity/util/config/Amendment.java
···
30
30
return null;
31
31
}
32
32
33
33
-
String mod = NbtUtils.getString(data, "mod");
33
33
+
String mod = NbtUtils.getString(data, "mod", "");
34
34
ModSelector modSelector;
35
35
if (mod.equals("all")) {
36
36
modSelector = new UniversalModSelector();
···
43
43
case "all" -> new UniversalSelector();
44
44
case "containing" -> new ContainingSelector(NbtUtils.getString(data, "containing"));
45
45
case "matching" -> new MatchingSelector(NbtUtils.getString(data, "matching"));
46
46
-
case "matching_block_tag" -> new MatchingBlockTagSelector(NbtUtils.getString(data, "matching"));
47
47
-
case "matching_any" -> new MatchingAnySelector(NbtUtils.getList(data, "matching", NbtElement.STRING_TYPE)
46
46
+
case "matching_block_tag" -> new MatchingBlockTagSelector(NbtUtils.getString(data, "matching_block_tag"));
47
47
+
case "matching_any" -> new MatchingAnySelector(NbtUtils.getList(data, "matching_any", NbtElement.STRING_TYPE)
48
48
.stream().map(e->(NbtString)e).map(NbtString::asString).toList());
49
49
default -> {
50
50
InfinityMod.LOGGER.warn("Unknown amendment selector type: {}", selectorType);
···
52
52
}
53
53
};
54
54
55
55
-
String resultType = NbtUtils.getString(data, "results");
55
55
+
String resultType = NbtUtils.getString(data, "results", "");
56
56
Results results = switch (resultType) {
57
57
case "set_value" -> new SetValue(NbtUtils.getInt(data, "value"));
58
58
case "erase" -> new SetValue(0);
+2
-2
common/src/main/resources/config/amendments.json
···
1
1
{
2
2
-
"amendment_version": 0,
2
2
+
"amendment_version": 1,
3
3
"elements": [
4
4
{
5
5
"area": "fluids",
···
21
21
"area": "blocks",
22
22
"mod": "minecraft",
23
23
"selector": "matching_any",
24
24
-
"matching": [
24
24
+
"matching_any": [
25
25
"minecraft:slime_block",
26
26
"minecraft:honey_block",
27
27
"minecraft:mangrove_roots"