Inspired by 2020's April Fools' 20w14infinite Snapshot, this mod brings endless randomly generated dimensions into Minecraft.

adding new amendments; amendment version updating

Lera 6f7c6db5 4fe7c101

+79 -52
+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 + 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 + import net.minecraft.nbt.NbtElement; 17 19 import net.minecraft.nbt.NbtList; 18 20 import net.minecraft.nbt.NbtString; 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 - numAmendments = AmendmentBuilder.addNew(builder, amendmentElement, numAmendments, amendmentCategory); 34 + amendmentCategory.addEntry(AmendmentBuilder.getNew(builder, amendmentElement, numAmendments)); 35 + numAmendments++; 34 36 } 35 - // todo new amendments 36 - // addAmendment(builder, null, i, amendmentCategory); 37 - amendmentCategory.addEntry(builder.entryBuilder().startTextDescription(Text.literal("To add new entries, edit amendments.json.").setStyle(Style.EMPTY)).build()); 37 + 38 + var moreAmendments = builder.entryBuilder().startIntField(Text.literal("Add more amendments:"), 0).setMax(10).build(); 39 + amendmentCategory.addEntry(moreAmendments); 40 + for (int i = 0; i < 10; i++) { 41 + amendmentCategory.addEntry(AmendmentBuilder.getShadow(builder, numAmendments, moreAmendments, i)); 42 + numAmendments++; 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 - // TODO Check if an amendment should be changed before writing 70 - return true; 75 + var list = NbtUtils.getList(amendment, key, NbtElement.STRING_TYPE); 76 + StringBuilder a = new StringBuilder(); 77 + StringBuilder b = new StringBuilder(); 78 + for (NbtElement s: list) a.append(s.asString()); 79 + for (String s: value) b.append(s); 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 - record StaticStringValueHolder(String s) implements ValueHolder<String> { 80 - @Override 81 - public String getValue() { 82 - return s; 83 - } 84 - } 85 - static ValueHolder<String> hold(String s) { 86 - return new StaticStringValueHolder(s); 89 + static Requirement always = () -> true; 90 + static Requirement matches(ValueHolder<String> holder, String m) { 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 - static Requirement always = () -> true; 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 - addListOption("matching", 112 - Requirement.matches(selector, hold("matching_any"))); 113 - addStringOption("matching", 114 - Requirement.matches(selector, hold("matching"))); 115 - addStringOption("matching", 116 - Requirement.matches(selector, hold("matching_block_tag"))); 114 + addListOption("matching_any", matches(selector, "matching_any")); 115 + addStringOption("matching", matches(selector, "matching")); 116 + addStringOption("containing", matches(selector, "containing")); 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 - addDoubleOption("value", 121 - Requirement.matches(results, hold("set_value"))); 121 + addDoubleOption("value", matches(results, "set_value")); 122 122 addStringDropdownOption("field_name", 123 - Requirement.all(Requirement.matches(area, hold("blocks")), Requirement.matches(results, hold("set_field"))), 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 - NbtCompound elements = readNbt(configPath()+("/amendments.json")); 173 - NbtCompound amendmentNbt = elements.getList("elements", 10).getCompound(amendmentIndex); 172 + NbtCompound elements = readNbt(configPath()+"/amendments.json"); 173 + NbtList list = elements.getList("elements", 10); 174 + NbtCompound amendmentNbt = list.getCompound(amendmentIndex); 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 + updateAmendmentVersion(elements); 177 180 CommonIO.write(elements, configPath(), "amendments.json"); 178 - amendment = readJson(configPath()+("/amendments.json")) 179 - .getAsJsonObject() 180 - .getAsJsonArray("elements") 181 - .get(amendmentIndex) 182 - .getAsJsonObject(); 183 181 } 184 182 } 185 183 186 - static int addNew(ConfigBuilder builder, JsonElement amendmentElement, int i, ConfigCategory amendmentCategory) { 187 - JsonObject amendment; 188 - SubCategoryBuilder subCategory; 189 - if (amendmentElement != null) { 190 - subCategory = builder.entryBuilder().startSubCategory(Text.translatable("config.infinity.amendment", String.valueOf(i))); 191 - amendment = amendmentElement.getAsJsonObject(); 192 - } else { 193 - subCategory = builder.entryBuilder().startSubCategory(Text.translatable("config.infinity.amendment.new")); 194 - amendment = new JsonObject(); 184 + static SubCategoryListEntry getNew(ConfigBuilder builder, JsonElement amendmentElement, int i) { 185 + JsonObject amendment = amendmentElement.getAsJsonObject();; 186 + SubCategoryBuilder subCategory = builder.entryBuilder().startSubCategory(Text.translatable("config.infinity.amendment", String.valueOf(i))); 187 + 188 + (new AmendmentBuilder(builder, subCategory, i, amendment)).build(); 189 + return subCategory.build(); 190 + } 191 + 192 + static SubCategoryListEntry getShadow(ConfigBuilder builder, int i, ValueHolder<Integer> shadowAmount, int shadowI) { 193 + SubCategoryBuilder subCategory = builder.entryBuilder() 194 + .startSubCategory(Text.translatable("config.infinity.amendment.new")) 195 + .setDisplayRequirement(() -> shadowAmount.getValue() > shadowI); 196 + 197 + (new NewAmendmentBuilder(builder, subCategory, i)).build(); 198 + return subCategory.build(); 199 + } 200 + 201 + static void updateAmendmentVersion(NbtCompound elements) { 202 + elements.putInt("amendment_version", (int)((System.currentTimeMillis() - 1754769333185L)/1000)); 203 + } 204 + } 205 + 206 + static class NewAmendmentBuilder extends AmendmentBuilder { 207 + NewAmendmentBuilder(ConfigBuilder builder, SubCategoryBuilder subCategory, int i) { 208 + super(builder, subCategory, i, new JsonObject()); 209 + } 210 + 211 + @Override 212 + <T> void amendmentSetter(String name, T newValue, int amendmentIndex, AmendmentUpdater<T> updater) { 213 + NbtCompound elements = readNbt(configPath()+"/amendments.json"); 214 + NbtList list = elements.getList("elements", 10); 215 + if (amendmentIndex < list.size()) { 216 + super.amendmentSetter(name, newValue, amendmentIndex, updater); 217 + return; 195 218 } 219 + NbtCompound amendmentNbt = new NbtCompound(); 196 220 197 - (new AmendmentBuilder(builder, subCategory, i, amendment)).build(); 198 - amendmentCategory.addEntry(subCategory.build()); 199 - i++; 200 - return i; 221 + // Check if an amendment should be changed before writing 222 + if (updater.check(amendmentNbt, name, newValue)) { 223 + updater.update(amendmentNbt, name, newValue); 224 + list.add(amendmentNbt); 225 + updateAmendmentVersion(elements); 226 + CommonIO.write(elements, configPath(), "amendments.json"); 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 - String mod = NbtUtils.getString(data, "mod"); 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 - case "matching_block_tag" -> new MatchingBlockTagSelector(NbtUtils.getString(data, "matching")); 47 - case "matching_any" -> new MatchingAnySelector(NbtUtils.getList(data, "matching", NbtElement.STRING_TYPE) 46 + case "matching_block_tag" -> new MatchingBlockTagSelector(NbtUtils.getString(data, "matching_block_tag")); 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 - String resultType = NbtUtils.getString(data, "results"); 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 - "amendment_version": 0, 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 - "matching": [ 24 + "matching_any": [ 25 25 "minecraft:slime_block", 26 26 "minecraft:honey_block", 27 27 "minecraft:mangrove_roots"