From 00282c1a174e2f714b13c0f991bf6c26d51cf107 Mon Sep 17 00:00:00 2001 From: JXSnack Date: Wed, 19 Feb 2025 09:54:14 +0100 Subject: [PATCH 01/39] fix incorrect key --- src/main/java/net/snackbag/tt20/config/MainConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/snackbag/tt20/config/MainConfig.java b/src/main/java/net/snackbag/tt20/config/MainConfig.java index fbec57c..6713173 100644 --- a/src/main/java/net/snackbag/tt20/config/MainConfig.java +++ b/src/main/java/net/snackbag/tt20/config/MainConfig.java @@ -51,7 +51,7 @@ public void reload() { this.eatingAcceleration = getAsBooleanOrDefault("eating-acceleration", eatingAcceleration); this.portalAcceleration = getAsBooleanOrDefault("portal-acceleration", portalAcceleration); this.sleepingAcceleration = getAsBooleanOrDefault("sleeping-acceleration", sleepingAcceleration); - this.serverWatchdog = getAsBooleanOrDefault("block-entity-acceleration", serverWatchdog); + this.serverWatchdog = getAsBooleanOrDefault("server-watchdog", serverWatchdog); this.singlePlayerWarning = getAsBooleanOrDefault("singleplayer-warning", singlePlayerWarning); this.timeAcceleration = getAsBooleanOrDefault("time-acceleration", timeAcceleration); this.randomTickSpeedAcceleration = getAsBooleanOrDefault("random-tickspeed-acceleration", randomTickSpeedAcceleration); From fb59883c612ea2f930e209ef34ba71d529806f5c Mon Sep 17 00:00:00 2001 From: lemonnik Date: Sun, 14 Dec 2025 09:50:12 +0100 Subject: [PATCH 02/39] gotta commit it --- src/main/java/net/snackbag/tt20/TT20.java | 11 +- .../tt20/config/BlockEntityMaskConfig.java | 6 +- .../snackbag/tt20/config/impl/TT20Config.java | 46 ++ .../snackbag/tt20/config/rework/CConfig.java | 52 +++ .../tt20/config/rework/CExporter.java | 413 ++++++++++++++++++ .../tt20/config/rework/types/CBoolean.java | 28 ++ .../tt20/config/rework/types/CEnum.java | 42 ++ .../tt20/config/rework/types/CMask.java | 66 +++ .../tt20/config/rework/types/CValue.java | 16 + .../tt20/config/rework/utils/CCategory.java | 36 ++ .../tt20/config/rework/utils/CMap.java | 12 + .../{util => config/rework/utils}/Mask.java | 52 +-- .../rework/utils}/MaskType.java | 2 +- .../rework/utils}/RegistryIndex.java | 2 +- 14 files changed, 748 insertions(+), 36 deletions(-) create mode 100644 src/main/java/net/snackbag/tt20/config/impl/TT20Config.java create mode 100644 src/main/java/net/snackbag/tt20/config/rework/CConfig.java create mode 100644 src/main/java/net/snackbag/tt20/config/rework/CExporter.java create mode 100644 src/main/java/net/snackbag/tt20/config/rework/types/CBoolean.java create mode 100644 src/main/java/net/snackbag/tt20/config/rework/types/CEnum.java create mode 100644 src/main/java/net/snackbag/tt20/config/rework/types/CMask.java create mode 100644 src/main/java/net/snackbag/tt20/config/rework/types/CValue.java create mode 100644 src/main/java/net/snackbag/tt20/config/rework/utils/CCategory.java create mode 100644 src/main/java/net/snackbag/tt20/config/rework/utils/CMap.java rename src/main/java/net/snackbag/tt20/{util => config/rework/utils}/Mask.java (55%) rename src/main/java/net/snackbag/tt20/{util => config/rework/utils}/MaskType.java (88%) rename src/main/java/net/snackbag/tt20/{util => config/rework/utils}/RegistryIndex.java (98%) diff --git a/src/main/java/net/snackbag/tt20/TT20.java b/src/main/java/net/snackbag/tt20/TT20.java index 6aafc76..c506c60 100644 --- a/src/main/java/net/snackbag/tt20/TT20.java +++ b/src/main/java/net/snackbag/tt20/TT20.java @@ -5,6 +5,7 @@ import net.snackbag.tt20.command.CommandRegistry; import net.snackbag.tt20.config.BlockEntityMaskConfig; import net.snackbag.tt20.config.MainConfig; +import net.snackbag.tt20.config.impl.TT20Config; import net.snackbag.tt20.util.TPSCalculator; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -12,10 +13,12 @@ import java.util.concurrent.CompletableFuture; public class TT20 implements ModInitializer { - public static final Logger LOGGER = LoggerFactory.getLogger("tt20"); + public static final String MOD_ID = "tt20"; + public static final Logger LOGGER = LoggerFactory.getLogger(MOD_ID); public static final String VERSION = "0.7.1"; public static final TPSCalculator TPS_CALCULATOR = new TPSCalculator(); public static final MainConfig config = new MainConfig(); + public static final TT20Config Config = new TT20Config(); public static final BlockEntityMaskConfig blockEntityMaskConfig = new BlockEntityMaskConfig(); public static boolean warned = false; @@ -34,5 +37,11 @@ public void onInitialize() { }); CommandRegistry.registerCommands(); + + if (Config.reload()) { + LOGGER.info("Reloaded config."); + } else { + LOGGER.info("No config changes."); + } } } \ No newline at end of file diff --git a/src/main/java/net/snackbag/tt20/config/BlockEntityMaskConfig.java b/src/main/java/net/snackbag/tt20/config/BlockEntityMaskConfig.java index bc287f6..3790475 100644 --- a/src/main/java/net/snackbag/tt20/config/BlockEntityMaskConfig.java +++ b/src/main/java/net/snackbag/tt20/config/BlockEntityMaskConfig.java @@ -2,11 +2,11 @@ //? if >=1.20.1 { import net.minecraft.registry.Registries; +import net.snackbag.tt20.config.rework.utils.Mask; + //?} else { /*import net.minecraft.util.registry.Registry; *///?} -import net.snackbag.tt20.util.Mask; - public class BlockEntityMaskConfig extends JSONConfiguration { private Mask mask; private boolean reloaded = false; @@ -33,7 +33,7 @@ public void reload() { if (reloaded) { //? if >=1.20.1 { - this.mask = new Mask(Registries.BLOCK, this, "blocks"); + //this.mask = new Mask(Registries.BLOCK, this, "blocks"); //?} else { /*this.mask = new Mask(Registry.BLOCK, this, "blocks"); *///?} diff --git a/src/main/java/net/snackbag/tt20/config/impl/TT20Config.java b/src/main/java/net/snackbag/tt20/config/impl/TT20Config.java new file mode 100644 index 0000000..90e0273 --- /dev/null +++ b/src/main/java/net/snackbag/tt20/config/impl/TT20Config.java @@ -0,0 +1,46 @@ +package net.snackbag.tt20.config.impl; + +import net.snackbag.tt20.TT20; +import net.snackbag.tt20.config.rework.CExporter; +import net.snackbag.tt20.config.rework.utils.CCategory; +import net.snackbag.tt20.config.rework.CConfig; +import net.snackbag.tt20.config.rework.types.CBoolean; +import net.snackbag.tt20.config.rework.types.CEnum; +import net.snackbag.tt20.config.rework.types.CMask; +import net.snackbag.tt20.config.rework.utils.MaskType; +import org.jetbrains.annotations.NotNull; + +public class TT20Config extends CConfig { + @Override + public @NotNull String getFileName() { + return TT20.MOD_ID; + } + + @Override + protected @NotNull CExporter.Format getFormat() { + return CExporter.Format.TOML; + } + + private static final CCategory MAIN = CCategory.of("main", "Main TT20 configuration"); + + public final CBoolean enabled = register(MAIN, new CBoolean("enabled", "Controls if TT20 is accelerating anything", true)); + public final CBoolean blockEntity = register(MAIN, new CBoolean("blockEntity", "ex. furnace work speed, this requires Block Entity Mask to be set up! (causes more lag otherwise)", false)); + public final CBoolean blockBreaking = register(MAIN, new CBoolean("blockBreaking", "block breaking acceleration", true)); + public final CBoolean eating = register(MAIN, new CBoolean("eating", "food consumption acceleration", true)); + public final CBoolean potionEffect = register(MAIN, new CBoolean("potionEffect", "effect duration acceleration", true)); + public final CBoolean fluid = register(MAIN, new CBoolean("fluid", "fluid flow acceleration", true)); + public final CBoolean pickup = register(MAIN, new CBoolean("pickup", "item pickup acceleration", true)); + public final CBoolean portal = register(MAIN, new CBoolean("portal", "time in portal acceleration", true)); + public final CBoolean sleeping = register(MAIN, new CBoolean("sleeping", "time laying in bed acceleration", true)); + public final CBoolean time = register(MAIN, new CBoolean("time", "daytime acceleration", true)); + public final CBoolean randomTickSpeed = register(MAIN, new CBoolean("randomTickSpeed", "random tick speed acceleration (ex. crop growth)", true)); + public final CBoolean serverWatchdog = register(MAIN, new CBoolean("serverWatchdog", "server watchdog (vanilla's stop server after 1 minute of freeze behaviour)", true)); + + public final CBoolean singlePlayerWarning = register(MAIN, new CBoolean("singlePlayerWarning","should show warn if loading in a singleplayer?", true)); + public final CBoolean automaticUpdater = register(MAIN, new CBoolean("automaticUpdater", "automatic update checker", true)); + + private static final CCategory BLOCK_ENTITY_MASK = CCategory.of("block_entity_mask", "Block Entity Mask configuration", "Only change this if you know what you're doing!"); + + public final CEnum blockEntityMaskType = register(BLOCK_ENTITY_MASK, new CEnum<>("type", "mask type", MaskType.class, MaskType.WHITELIST)); + public final CMask blockEntityMask = register(BLOCK_ENTITY_MASK, new CMask("blocks", "block entity mask", new String[] {"*:*"}, "type", this)); +} diff --git a/src/main/java/net/snackbag/tt20/config/rework/CConfig.java b/src/main/java/net/snackbag/tt20/config/rework/CConfig.java new file mode 100644 index 0000000..0ba246d --- /dev/null +++ b/src/main/java/net/snackbag/tt20/config/rework/CConfig.java @@ -0,0 +1,52 @@ +package net.snackbag.tt20.config.rework; + +import net.snackbag.tt20.config.rework.types.CValue; +import net.snackbag.tt20.config.rework.utils.CCategory; +import net.snackbag.tt20.config.rework.utils.CMap; +import org.jetbrains.annotations.NotNull; + +import java.util.LinkedHashMap; +import java.util.Map; + +public abstract class CConfig { + private final CMap categories = new CMap(); + + protected > T register(CCategory category, T value) { + categories.map() + .computeIfAbsent(category, k -> new LinkedHashMap<>()) + .put(value.key, value); + return value; + } + + public Map>> getCategories() { + return categories.map(); + } + + public LinkedHashMap> getValues(CCategory category) { + return categories.map().get(category); + } + + public abstract @NotNull String getFileName(); + + protected abstract @NotNull CExporter.Format getFormat(); + + public CValue getValue(String key) { + for (CCategory category : categories.map().keySet()) { + CValue value = categories.map().get(category).get(key); + if (value != null) { + return value; + } + } + return null; + } + + public boolean reload() { + CMap loaded = CExporter.load(categories, getFileName(), getFormat()); + if (!loaded.map().isEmpty()) { + this.categories.map().putAll(loaded.map()); + return CExporter.save(loaded, getFileName(), getFormat()); + } else { + return false; + } + } +} \ No newline at end of file diff --git a/src/main/java/net/snackbag/tt20/config/rework/CExporter.java b/src/main/java/net/snackbag/tt20/config/rework/CExporter.java new file mode 100644 index 0000000..d7cc40b --- /dev/null +++ b/src/main/java/net/snackbag/tt20/config/rework/CExporter.java @@ -0,0 +1,413 @@ +package net.snackbag.tt20.config.rework; + +import net.fabricmc.loader.api.FabricLoader; +import net.snackbag.tt20.config.rework.types.CBoolean; +import net.snackbag.tt20.config.rework.types.CEnum; +import net.snackbag.tt20.config.rework.types.CMask; +import net.snackbag.tt20.config.rework.types.CValue; +import net.snackbag.tt20.config.rework.utils.CCategory; +import net.snackbag.tt20.config.rework.utils.CMap; +import net.snackbag.tt20.config.rework.utils.MaskType; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class CExporter { + public enum Format { + JSON5(".json5"), + TOML(".toml"); + + private final String extension; + + Format(String extension) { + this.extension = extension; + } + + public String extension() { + return extension; + } + } + + private static Path getConfigDir() { + return FabricLoader.getInstance().getConfigDir().toAbsolutePath(); + } + + public static CMap load(CMap defaults, String fileName, Format format) { + String finalFileName = fileName + format.extension(); + Path inputPath = getConfigDir().resolve(finalFileName); + + if (!Files.exists(inputPath)) { + System.out.println("Config file " + finalFileName + " not found, creating new one."); + save(defaults, fileName, format); + return new CMap(); + } + + try { + String content = Files.readString(inputPath); + + if (format == Format.JSON5) { + return parseJson5(content, defaults); + } else if (format == Format.TOML) { + // TODO: return CMap from parsed TOML + } + + return defaults; + } catch (IOException e) { + e.printStackTrace(); + return defaults; + } + } + + public static boolean save(CMap config, String fileName, Format format){ + String finalFileName = fileName + format.extension(); + + Path outputPath = getConfigDir().resolve(finalFileName); + try { + Files.createDirectories(outputPath.getParent()); + } catch (IOException e) { + e.printStackTrace(); + return false; + } + + StringBuilder builder = new StringBuilder(); + + addStart(format, builder); + for (CCategory category : config.map().keySet()) { + for (String descStr : category.description()) { + addComment(format, builder, descStr); + } + addCategory(format, builder, category); + for (Map.Entry> entry : config.map().get(category).entrySet()) { + addValue(entry.getKey(), entry.getValue(), format, builder); + } + addCategoryEnd(format, builder); + } + addEnd(format, builder); + + + try { + Files.writeString(outputPath, builder.toString()); + } catch (IOException e) { + e.printStackTrace(); + return false; + } + + return true; + } + + private static void addStart(Format format, StringBuilder builder) { + if (format == Format.JSON5) { + builder.append("{\n"); + } + } + + private static void addComment(Format format, StringBuilder builder, String comment) { + if (format == Format.JSON5) { + builder.append(" // ").append(comment).append("\n"); + } else if (format == Format.TOML) { + builder.append("# ").append(comment).append("\n"); + } + } + + private static void addCategory(Format format, StringBuilder builder, CCategory category) { + if (format == Format.JSON5) { + builder.append(" \"").append(category.id()).append("\": {\n"); + } else if (format == Format.TOML) { + builder.append("[").append(category.id()).append("]\n"); + } + } + + private static void addCategoryEnd(Format format, StringBuilder builder) { + if (format == Format.JSON5) { + builder.append(" },\n"); + } + } + + private static void addValue(String key, CValue value, Format format, StringBuilder builder) { + if (format == Format.JSON5) { + builder.append(" \"").append(key).append("\": "); + + if (value instanceof CBoolean cBoolean) { + builder.append(cBoolean.get()).append(",").append(" // ").append(value.comment).append("\n"); + } else if (value instanceof CEnum cEnum) { + builder.append("\"").append(cEnum.get().name()).append("\",").append(" // ").append(value.comment); + addEnumComment(builder, cEnum); + } else if (value instanceof CMask cMask) { + builder.append("[ // ").append(value.comment); + for (String maskStr : cMask.getMaskStr()) { + builder.append("\n").append(" \"").append(maskStr).append("\","); + } + builder.append("\n").append(" ]").append("\n"); + } + } else if (format == Format.TOML) { + if (!(value instanceof CMask)) { + builder.append(key).append(" = "); + } + if (value instanceof CBoolean cBoolean) { + builder.append(cBoolean.get()).append(" # ").append(value.comment).append("\n"); + } else if (value instanceof CEnum cEnum) { + builder.append("\"").append(cEnum.get().name()).append("\"").append(" # ").append(value.comment); + addEnumComment(builder, cEnum); + } else if (value instanceof CMask cMask) { + builder.append("# ").append(value.comment).append("\n"); + builder.append(key).append(" = ").append("\"\"\""); + for (String maskStr : cMask.getMaskStr()) { + builder.append("\n ").append(maskStr).append("\n"); + } + builder.append("\"\"\""); + } + } + } + + private static void addEnumComment(StringBuilder builder, CEnum cEnum) { + builder.append(" ["); + for (Enum enumValue : cEnum.getEnumClass().getEnumConstants()) { + builder.append(enumValue.name()).append(" / "); + } + builder.deleteCharAt(builder.length() - 3); + builder.deleteCharAt(builder.length() - 2); + builder.deleteCharAt(builder.length() - 1); + builder.append("]").append("\n"); + } + + private static void addEnd(Format format, StringBuilder builder) { + if (format == Format.JSON5) { + builder.append("}"); + } + } + + private static CMap parseJson5(String json, CMap config) { + String clearJson = clearJson(json); + String[] lines = clearJson.split("\n"); + + CCategory currentCategory = null; + String currentMask = null; + List maskList = new ArrayList<>(); + + for (String line : lines) { + if (line.startsWith("\"") && line.endsWith("{")) { // category line + int quoteStart = line.indexOf('"'); + int quoteEnd = line.indexOf('"', quoteStart + 1); + + if (quoteStart != -1 && quoteEnd != -1) { + String categoryId = line.substring(quoteStart + 1, quoteEnd); + + for (CCategory category : config.map().keySet()) { + if (category.id().equals(categoryId)) { + currentCategory = category; + break; + } + } + } + } + + if (line.startsWith("\"") && line.endsWith(",")) { // value line + line = line.substring(0, line.length() - 1); + int colonIndex = line.indexOf(':'); + + String keyPart = line.substring(0, colonIndex).trim(); + String key = keyPart.replaceAll("^[\"']|[\"']$", ""); + + String valuePart = line.substring(colonIndex + 1).trim(); + String value = valuePart.replaceAll("^[\"']|[\"']$", ""); + Boolean booleanValue = null; + + if (value.equals("true") || value.equals("false")) { + booleanValue = Boolean.parseBoolean(value); + } + + Map> values = config.map().get(currentCategory); + for (String vKey : values.keySet()) { + if (vKey.equals(key)) { + CValue cValue = values.get(vKey); + if (booleanValue != null && cValue instanceof CBoolean cBoolean) { + cBoolean.set(booleanValue); + } else if (value.chars().allMatch(Character::isUpperCase) && cValue instanceof CEnum cEnum) { + cEnum.setEnumStr(value); + } + } + } + } + + if (line.startsWith("\"") && line.endsWith("[")) { // mask line start + int quoteStart = line.indexOf('"'); + int quoteEnd = line.indexOf('"', quoteStart + 1); + + if (quoteStart != -1 && quoteEnd != -1) { + currentMask = line.substring(quoteStart + 1, quoteEnd); + } + } + + if (currentMask != null && line.startsWith("\"") && line.endsWith("\"")) { // in mask array + maskList.add(line.substring(1, line.length() - 1)); + } + + if (currentMask != null && line.equals("]")) { // mask line end + Map> values = config.map().get(currentCategory); + for (CValue cValue : values.values()) { + if (cValue.key.equals(currentMask) && cValue instanceof CMask cMask) { + cMask.setMaskStr(maskList); + String maskTypeKey = cMask.getMaskTypeKey(); + CValue maskTypeValue = values.get(maskTypeKey); + if (maskTypeValue instanceof CEnum cEnum && cEnum.getEnumClass() == MaskType.class) { + cMask.setMaskType((MaskType) cEnum.get()); + } + + currentMask = null; + maskList.clear(); + break; + } + } + } + } + return config; + } + + private static CMap parseToml(String toml, CMap config) { + String clearJson = clearToml(toml); + String[] lines = clearJson.split("\n"); + + CCategory currentCategory = null; + String currentMask = null; + List maskList = new ArrayList<>(); + + for (String line : lines) { + if (line.startsWith("[") && line.endsWith("]")) { // category line + String categoryId = line.substring(1, line.length() - 1); + + for (CCategory category : config.map().keySet()) { + if (category.id().equals(categoryId)) { + currentCategory = category; + break; + } + } + } + + if (line.matches("[A-Za-z]+ = [A-Za-z]+")) { // value line + int equalsIndex = line.indexOf('='); + + String key = line.substring(0, equalsIndex).trim(); + + String valuePart = line.substring(equalsIndex + 1).trim(); + String value = valuePart.replaceAll("^[\"']|[\"']$", ""); + + Boolean booleanValue = null; + + if (value.equals("true") || value.equals("false")) { + booleanValue = Boolean.parseBoolean(value); + } + + Map> values = config.map().get(currentCategory); + for (String vKey : values.keySet()) { + if (vKey.equals(key)) { + CValue cValue = values.get(vKey); + if (booleanValue != null && cValue instanceof CBoolean cBoolean) { + cBoolean.set(booleanValue); + } else if (value.chars().allMatch(Character::isUpperCase) && cValue instanceof CEnum cEnum) { + cEnum.setEnumStr(value); + } + } + } + } + + if (!line.startsWith("\"\"\"") && line.endsWith("\"\"\"")) { // mask line start + currentMask = line.split("=", 2)[0].trim(); + } + + if (currentMask != null) { // in mask array + maskList.add(line); + } + + if (currentMask != null && line.equals("\"\"\"")) { // mask line end + Map> values = config.map().get(currentCategory); + for (CValue cValue : values.values()) { + if (cValue.key.equals(currentMask) && cValue instanceof CMask cMask) { + cMask.setMaskStr(maskList); + String maskTypeKey = cMask.getMaskTypeKey(); + CValue maskTypeValue = values.get(maskTypeKey); + if (maskTypeValue instanceof CEnum cEnum && cEnum.getEnumClass() == MaskType.class) { + cMask.setMaskType((MaskType) cEnum.get()); + } + + currentMask = null; + maskList.clear(); + break; + } + } + } + } + + return config; + } + + private static String clearJson(String json) { + String[] lines = json.split("\n"); + StringBuilder builder = new StringBuilder(); + + for (String line : lines) { + boolean inQuotes = false; + StringBuilder cleanLine = new StringBuilder(); + + line = line.trim(); + if (line.endsWith(",")) line = line.substring(0, line.length() - 1); + if (line.isEmpty()) continue; + if (line.equals("{") || line.equals("}")) continue; + + for (int i = 0; i < line.length(); i++) { + char c = line.charAt(i); + + if (c == '"' || c == '\'') { + inQuotes = !inQuotes; + } + + if (!inQuotes && c == '/' && i + 1 < line.length() && line.charAt(i + 1) == '/') { + break; + } + + cleanLine.append(c); + } + + String trimmed = cleanLine.toString().trim(); + if (!trimmed.isEmpty()) { + builder.append(trimmed).append('\n'); + } + } + + return builder.toString(); + } + + private static String clearToml(String toml) { + String[] lines = toml.split("\n"); + StringBuilder builder = new StringBuilder(); + + for (String line : lines) { + boolean inQuotes = false; + int cutIndex = -1; + + for (int i = 0; i < line.length(); i++) { + char c = line.charAt(i); + + if (c == '"') { + inQuotes = !inQuotes; + } else if (c == '#' && !inQuotes) { + cutIndex = i; + break; + } + } + + String cleaned = (cutIndex != -1) + ? line.substring(0, cutIndex).trim() + : line.trim(); + + if (!cleaned.isEmpty()) { + builder.append(cleaned).append('\n'); + } + } + + return builder.toString(); + } +} \ No newline at end of file diff --git a/src/main/java/net/snackbag/tt20/config/rework/types/CBoolean.java b/src/main/java/net/snackbag/tt20/config/rework/types/CBoolean.java new file mode 100644 index 0000000..3d20708 --- /dev/null +++ b/src/main/java/net/snackbag/tt20/config/rework/types/CBoolean.java @@ -0,0 +1,28 @@ +package net.snackbag.tt20.config.rework.types; + +public class CBoolean extends CValue { + private final boolean defaultValue; + private Boolean value; + + public CBoolean(String key, String comment, boolean value) { + super(key, comment); + + this.value = value; + this.defaultValue = value; + } + + @Override + public Boolean get() { + return value; + } + + @Override + public void set(Boolean value) { + this.value = value; + } + + @Override + public boolean isDefault() { + return value == defaultValue; + } +} diff --git a/src/main/java/net/snackbag/tt20/config/rework/types/CEnum.java b/src/main/java/net/snackbag/tt20/config/rework/types/CEnum.java new file mode 100644 index 0000000..0811617 --- /dev/null +++ b/src/main/java/net/snackbag/tt20/config/rework/types/CEnum.java @@ -0,0 +1,42 @@ +package net.snackbag.tt20.config.rework.types; + +import java.util.Arrays; + +public class CEnum> extends CValue { + private final Class enumClass; + private final T defaultValue; + private T value; + + public CEnum(String key, String comment, Class enumClass, T defaultValue) { + super(key, comment); + this.enumClass = enumClass; + this.defaultValue = defaultValue; + this.value = defaultValue; + } + + @Override + public T get() { + return value; + } + + @Override + public void set(T value) { + this.value = value; + } + + public void setEnumStr(String enumStr) { + this.value = Arrays.stream(enumClass.getEnumConstants()) + .filter(e -> e.name().equalsIgnoreCase(enumStr)) + .findFirst() + .orElse(defaultValue); + } + + @Override + public boolean isDefault() { + return value == defaultValue; + } + + public Class getEnumClass() { + return enumClass; + } +} diff --git a/src/main/java/net/snackbag/tt20/config/rework/types/CMask.java b/src/main/java/net/snackbag/tt20/config/rework/types/CMask.java new file mode 100644 index 0000000..08835f1 --- /dev/null +++ b/src/main/java/net/snackbag/tt20/config/rework/types/CMask.java @@ -0,0 +1,66 @@ +package net.snackbag.tt20.config.rework.types; + +import net.minecraft.registry.Registries; +import net.snackbag.tt20.config.rework.CConfig; +import net.snackbag.tt20.config.rework.utils.Mask; +import net.snackbag.tt20.config.rework.utils.MaskType; + +import java.util.List; + +public class CMask extends CValue { + private final Mask defaultMask; + private final String maskTypeKey; + private String[] maskStr; + private Mask mask; + private MaskType maskType; + + public CMask(String key, String comment, String[] maskStr, String maskTypeKey, CConfig config) { + super(key, comment); + + this.maskStr = maskStr; + CValue cValue = config.getValue(maskTypeKey); + if (cValue instanceof CEnum cEnum && cEnum.getEnumClass() == MaskType.class) { + maskType = (MaskType) cEnum.get(); + } + this.defaultMask = new Mask(Registries.BLOCK, maskType, List.of(maskStr)); + this.maskTypeKey = maskTypeKey; + } + + @Override + public Mask get() { + return mask; + } + + public String[] getMaskStr() { + return maskStr; + } + + public void setMaskStr(String[] maskStr) { + this.maskStr = maskStr; + this.mask = new Mask(Registries.BLOCK, maskType, List.of(maskStr)); + } + + public void setMaskStr(List maskStr) { + this.maskStr = maskStr.toArray(new String[0]); + this.mask = new Mask(Registries.BLOCK, maskType, maskStr); + } + + public void setMaskType(MaskType maskType) { + this.maskType = maskType; + this.mask = new Mask(Registries.BLOCK, maskType, List.of(maskStr)); + } + + public String getMaskTypeKey() { + return maskTypeKey; + } + + @Override + public void set(Mask mask) { + this.mask = mask; + } + + @Override + public boolean isDefault() { + return mask.getEntries().equals(defaultMask.getEntries()); + } +} diff --git a/src/main/java/net/snackbag/tt20/config/rework/types/CValue.java b/src/main/java/net/snackbag/tt20/config/rework/types/CValue.java new file mode 100644 index 0000000..ad09a99 --- /dev/null +++ b/src/main/java/net/snackbag/tt20/config/rework/types/CValue.java @@ -0,0 +1,16 @@ +package net.snackbag.tt20.config.rework.types; + +public abstract class CValue { + public final String key; + public final String comment; + + protected CValue(String key, String comment) { + this.key = key; + this.comment = comment; + } + + public abstract T get(); + public abstract void set(T value); + + public abstract boolean isDefault(); +} \ No newline at end of file diff --git a/src/main/java/net/snackbag/tt20/config/rework/utils/CCategory.java b/src/main/java/net/snackbag/tt20/config/rework/utils/CCategory.java new file mode 100644 index 0000000..925950f --- /dev/null +++ b/src/main/java/net/snackbag/tt20/config/rework/utils/CCategory.java @@ -0,0 +1,36 @@ +package net.snackbag.tt20.config.rework.utils; + +import org.jetbrains.annotations.NotNull; + +public record CCategory(String id, String[] description) { + public CCategory(String id, String[] description) { + this.id = id; + this.description = description.clone(); + } + + public static CCategory of(String id, String... description) { + return new CCategory(id, description); + } + + @Override + public String[] description() { + return description.clone(); + } + + @Override + public @NotNull String toString() { + return id; + } + + @Override + public int hashCode() { + return id.hashCode(); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) return true; + if (!(obj instanceof CCategory)) return false; + return id.equals(((CCategory) obj).id); + } +} diff --git a/src/main/java/net/snackbag/tt20/config/rework/utils/CMap.java b/src/main/java/net/snackbag/tt20/config/rework/utils/CMap.java new file mode 100644 index 0000000..e540dee --- /dev/null +++ b/src/main/java/net/snackbag/tt20/config/rework/utils/CMap.java @@ -0,0 +1,12 @@ +package net.snackbag.tt20.config.rework.utils; + +import net.snackbag.tt20.config.rework.types.CValue; + +import java.util.LinkedHashMap; +import java.util.Map; + +public record CMap(Map>> map) { + public CMap() { + this(new LinkedHashMap<>()); + } +} \ No newline at end of file diff --git a/src/main/java/net/snackbag/tt20/util/Mask.java b/src/main/java/net/snackbag/tt20/config/rework/utils/Mask.java similarity index 55% rename from src/main/java/net/snackbag/tt20/util/Mask.java rename to src/main/java/net/snackbag/tt20/config/rework/utils/Mask.java index 7237ea6..8b51c2d 100644 --- a/src/main/java/net/snackbag/tt20/util/Mask.java +++ b/src/main/java/net/snackbag/tt20/config/rework/utils/Mask.java @@ -1,38 +1,24 @@ -package net.snackbag.tt20.util; +package net.snackbag.tt20.config.rework.utils; -import com.google.gson.JsonElement; -//? if >=1.20.1 { import net.minecraft.registry.Registry; -//?} else { -/*import net.minecraft.util.registry.Registry; -*///?} import net.minecraft.util.Identifier; -import net.snackbag.tt20.TT20; -import net.snackbag.tt20.config.JSONConfiguration; import java.util.*; public class Mask { - private final JSONConfiguration file; private final MaskType maskType; private final Registry registry; private final RegistryIndex index; private final Set entries; - public Mask(Registry registry, JSONConfiguration file, String maskKey) { - this.file = file; - this.maskType = MaskType.fromString(file.getAsString("type")); + public Mask(Registry registry, MaskType maskType, List rawEntries) { this.registry = registry; + this.maskType = maskType; this.index = RegistryIndex.getIndex(this.registry); this.entries = new HashSet<>(); - for (JsonElement element : file.getAsArray(maskKey)) { - if (!(element.isJsonPrimitive() && element.getAsJsonPrimitive().isString())) { - TT20.LOGGER.error("(TT20) Mask element '" + element + "' isn't a string"); - return; - } - - entries.addAll(manageEntry(element.getAsString())); + for (String entry : rawEntries) { + entries.addAll(manageEntry(entry)); } } @@ -41,7 +27,7 @@ public List manageEntry(String entry) { String[] split = entry.split(":"); if (split.length != 2) { - TT20.LOGGER.error("(TT20) '" + entry + "' is not a valid identifier. Correct format is :"); + System.err.println("(TT20) '" + entry + "' is not a valid identifier. Correct format is :"); return new ArrayList<>(); } @@ -52,7 +38,14 @@ public List manageEntry(String entry) { // if : if (!split[0].equals("*") && !split[1].equals("*")) { - return List.of(Identifier.of(split[0], split[1])); + Identifier id = Identifier.of(split[0], split[1]); + if (id == null) { + System.err.println("(TT20) '" + entry + "' is not a valid identifier. Correct format is :"); + return new ArrayList<>(); + } + List result = new ArrayList<>(1); + result.add(id); + return result; } // if *: @@ -60,21 +53,20 @@ public List manageEntry(String entry) { return index.getPathIndex().getOrDefault(split[1], new ArrayList<>()); } - // if :* if (!split[0].equals("*") && split[1].equals("*")) { return index.getNamespaceIndex().getOrDefault(split[0], new ArrayList<>()); } - return null; + return new ArrayList<>(); } public Registry getRegistry() { return registry; } - public JSONConfiguration getFile() { - return file; + public MaskType getMaskType() { + return maskType; } public boolean matches(Identifier identifier) { @@ -82,10 +74,10 @@ public boolean matches(Identifier identifier) { } public boolean isOkay(Identifier identifier) { - if (maskType == MaskType.WHITELIST) { - return entries.contains(identifier); - } else { - return !entries.contains(identifier); - } + return maskType == MaskType.WHITELIST ? entries.contains(identifier) : !entries.contains(identifier); + } + + public Set getEntries() { + return Collections.unmodifiableSet(entries); } } diff --git a/src/main/java/net/snackbag/tt20/util/MaskType.java b/src/main/java/net/snackbag/tt20/config/rework/utils/MaskType.java similarity index 88% rename from src/main/java/net/snackbag/tt20/util/MaskType.java rename to src/main/java/net/snackbag/tt20/config/rework/utils/MaskType.java index ea87fe8..8b8b849 100644 --- a/src/main/java/net/snackbag/tt20/util/MaskType.java +++ b/src/main/java/net/snackbag/tt20/config/rework/utils/MaskType.java @@ -1,4 +1,4 @@ -package net.snackbag.tt20.util; +package net.snackbag.tt20.config.rework.utils; public enum MaskType { WHITELIST, diff --git a/src/main/java/net/snackbag/tt20/util/RegistryIndex.java b/src/main/java/net/snackbag/tt20/config/rework/utils/RegistryIndex.java similarity index 98% rename from src/main/java/net/snackbag/tt20/util/RegistryIndex.java rename to src/main/java/net/snackbag/tt20/config/rework/utils/RegistryIndex.java index bb7da0a..f4efe08 100644 --- a/src/main/java/net/snackbag/tt20/util/RegistryIndex.java +++ b/src/main/java/net/snackbag/tt20/config/rework/utils/RegistryIndex.java @@ -1,4 +1,4 @@ -package net.snackbag.tt20.util; +package net.snackbag.tt20.config.rework.utils; //? if >=1.20.1 { import net.minecraft.registry.Registry; From 99a967af3ac2d39343c675d26051890cbb01dc05 Mon Sep 17 00:00:00 2001 From: tangoethan <28036675+tangoethan@users.noreply.github.com> Date: Tue, 20 Jan 2026 23:05:09 +1300 Subject: [PATCH 03/39] Fix shields and spears Changes the getMaxUseTime Item Mixin to exclude shields and spears. Fixes occasional damage applying through shields and spears acting weird. --- src/main/java/net/snackbag/tt20/mixin/item/ItemMixin.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/snackbag/tt20/mixin/item/ItemMixin.java b/src/main/java/net/snackbag/tt20/mixin/item/ItemMixin.java index b40dc88..bdbece1 100644 --- a/src/main/java/net/snackbag/tt20/mixin/item/ItemMixin.java +++ b/src/main/java/net/snackbag/tt20/mixin/item/ItemMixin.java @@ -9,7 +9,7 @@ @Mixin(Item.class) public abstract class ItemMixin { - @ModifyReturnValue(method = "getMaxUseTime", at = @At("RETURN")) + @ModifyReturnValue(method = "getMaxUseTime", at = @At(value = "RETURN", ordinal = 0)) private int onGetMaxUseTime(int original) { if (!TT20.config.enabled() || !TT20.config.eatingAcceleration() || original == 0) return original; return TPSUtil.tt20(original, true); From 43ed99f98540ee7ba5b8bcbea8cdb7342fc47b9b Mon Sep 17 00:00:00 2001 From: lemonnik Date: Sat, 21 Mar 2026 22:38:19 +0100 Subject: [PATCH 04/39] wtf was that --- gradle.properties | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/gradle.properties b/gradle.properties index 6e44201..3d4ef94 100644 --- a/gradle.properties +++ b/gradle.properties @@ -11,10 +11,8 @@ deps.fabric_loader=0.18.2 loom_version=1.14-SNAPSHOT # Mod Properties -version=0.7.2 - mod.id=tt20 -mod.version=0.7.1 +mod.version=0.7.2 maven_group=net.snackbag archives_base_name=tt20 From fd7f0e982f3c4800e1d85204669981775baf8e83 Mon Sep 17 00:00:00 2001 From: lemonnik Date: Sat, 21 Mar 2026 22:40:17 +0100 Subject: [PATCH 05/39] update stonecutter --- settings.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/settings.gradle b/settings.gradle index 1574102..2fe2107 100644 --- a/settings.gradle +++ b/settings.gradle @@ -16,7 +16,7 @@ pluginManagement { } plugins { - id "dev.kikugie.stonecutter" version "0.7.10" + id "dev.kikugie.stonecutter" version "0.9" } stonecutter { From e81cba55c5e8c70594fde6cf5ddc36b3633a766d Mon Sep 17 00:00:00 2001 From: lemonnik Date: Sat, 21 Mar 2026 22:43:10 +0100 Subject: [PATCH 06/39] update fabric & loom --- gradle.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle.properties b/gradle.properties index 3d4ef94..d0d59f8 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,9 +6,9 @@ org.gradle.parallel=true # check these on https://fabricmc.net/develop deps.minecraft=[VERSIONED] deps.yarn_mappings=[VERSIONED] -deps.fabric_loader=0.18.2 +deps.fabric_loader=0.18.4 -loom_version=1.14-SNAPSHOT +loom_version=1.15-SNAPSHOT # Mod Properties mod.id=tt20 From a2cbaf1042cf86dbb6b67affbd8e6567f035ef54 Mon Sep 17 00:00:00 2001 From: lemonnik Date: Sat, 21 Mar 2026 22:45:21 +0100 Subject: [PATCH 07/39] update wrapper --- gradle/wrapper/gradle-wrapper.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index bad7c24..c61a118 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-9.2.0-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.4.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME From b76100d13cc08d9986d8c258b4d112a949736ca9 Mon Sep 17 00:00:00 2001 From: lemonnik Date: Sun, 22 Mar 2026 00:30:45 +0100 Subject: [PATCH 08/39] update stonecutter.gradle --- stonecutter.gradle | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/stonecutter.gradle b/stonecutter.gradle index 5615358..d3cee38 100644 --- a/stonecutter.gradle +++ b/stonecutter.gradle @@ -1,7 +1,4 @@ plugins { id "dev.kikugie.stonecutter" - id "fabric-loom" version "${loom_version}" apply false } - -plugins.apply "dev.kikugie.stonecutter" -stonecutter.active "1.20.1" /* [SC] DO NOT EDIT */ +stonecutter.active "1.20.1" \ No newline at end of file From 86644c611abe0f0b284e8d0359d247d7c5e74bdb Mon Sep 17 00:00:00 2001 From: lemonnik Date: Sun, 22 Mar 2026 00:32:27 +0100 Subject: [PATCH 09/39] split build scripts & 26.1 properties --- build.fabric.gradle | 103 ++++++++++++++++++++++++++++++++ build.fabric_noremap.gradle | 95 +++++++++++++++++++++++++++++ build.gradle | 7 +-- settings.gradle | 14 ++++- versions/26.1/gradle.properties | 3 + 5 files changed, 215 insertions(+), 7 deletions(-) create mode 100644 build.fabric.gradle create mode 100644 build.fabric_noremap.gradle create mode 100644 versions/26.1/gradle.properties diff --git a/build.fabric.gradle b/build.fabric.gradle new file mode 100644 index 0000000..6e88a93 --- /dev/null +++ b/build.fabric.gradle @@ -0,0 +1,103 @@ +plugins { + id 'net.fabricmc.fabric-loom-remap' version "${loom_version}" + id 'maven-publish' +} + +base { + archivesName = project.archives_base_name +} + +repositories { + maven { url = "https://artifacts.snackbag.net/artifactory/shitlib" } // ShitLib + maven { + name = "Terraformers" + url = "https://maven.terraformersmc.com/" + } +} + +loom { + runConfigs.all { + ideConfigGenerated = true + runDir = "../../run" + accessWidenerPath = file("../../src/main/resources/tt20.accesswidener") + } +} + +fabricApi { + configureDataGeneration() +} + +dependencies { + // To change the versions see the gradle.properties file + minecraft "com.mojang:minecraft:${property('deps.minecraft')}" + mappings "net.fabricmc:yarn:${property('deps.yarn_mappings')}:v2" + + modImplementation "net.fabricmc:fabric-loader:${property('deps.fabric_loader')}" + modImplementation "net.fabricmc.fabric-api:fabric-api:${property('deps.fabric_api')}" + + // ShitLib + implementation "net.snackbag.shit:shit:${project.shitlib_version}" + include "net.snackbag.shit:shit:${project.shitlib_version}" + + // ModMenu + modImplementation("com.terraformersmc:modmenu:${project.modmenu_version}") +} + +processResources { + inputs.property "version", project.version + inputs.property "minecraft", stonecutter.current.version + + def map = ["version": project.version, "minecraft": stonecutter.current.version] + + filesMatching("fabric.mod.json") { + expand map + } +} + +tasks.withType(JavaCompile).configureEach { + it.options.release = 17 +} + +java { + // Loom will automatically attach sourcesJar to a RemapSourcesJar task and to the "build" task + // if it is present. + // If you remove this line, sources will not be generated. + withSourcesJar() + + if (stonecutter.compare(stonecutter.current.version, "1.20.5") >= 0) { + sourceCompatibility = JavaVersion.VERSION_21 + targetCompatibility = JavaVersion.VERSION_21 + } else if (stonecutter.compare(stonecutter.current.version, "1.21") >= 0) { + sourceCompatibility = JavaVersion.VERSION_21 + targetCompatibility = JavaVersion.VERSION_21 + } else { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } +} + +jar { + inputs.property "archivesName", "tt20-${project.version}+mc${stonecutter.current.version}" + + from("LICENSE") { + rename { "${it}_${project.base.archivesName.get()}"} + } +} + +// configure the maven publication +publishing { + publications { + create("mavenJava", MavenPublication) { + artifactId = project.archives_base_name + from components.java + } + } + + // See https://docs.gradle.org/current/userguide/publishing_maven.html for information on how to set up publishing. + repositories { + // Add repositories to publish to here. + // Notice: This block does NOT have the same function as the block in the top level. + // The repositories here will be used for publishing your artifact, not for + // retrieving dependencies. + } +} diff --git a/build.fabric_noremap.gradle b/build.fabric_noremap.gradle new file mode 100644 index 0000000..e36fd31 --- /dev/null +++ b/build.fabric_noremap.gradle @@ -0,0 +1,95 @@ +plugins { + id 'net.fabricmc.fabric-loom' version "${loom_version}" + id 'maven-publish' +} + +base { + archivesName = project.archives_base_name +} + +repositories { + maven { url = "https://artifacts.snackbag.net/artifactory/shitlib" } // ShitLib + maven { + name = "Terraformers" + url = "https://maven.terraformersmc.com/" + } +} + +loom { + runConfigs.all { + ideConfigGenerated = true + runDir = "../../run" + } +} + +fabricApi { + configureDataGeneration() +} + +dependencies { + // To change the versions see the gradle.properties file + minecraft "com.mojang:minecraft:${property('deps.minecraft')}" + + implementation "net.fabricmc:fabric-loader:${property('deps.fabric_loader')}" + implementation "net.fabricmc.fabric-api:fabric-api:${property('deps.fabric_api')}" + + // ShitLib + implementation "net.snackbag.shit:shit:${project.shitlib_version}" + include "net.snackbag.shit:shit:${project.shitlib_version}" + + // ModMenu + compileOnly("com.terraformersmc:modmenu:${project.modmenu_version}") +} + +processResources { + inputs.property "version", project.version + inputs.property "minecraft", stonecutter.current.version + + def map = ["version": project.version, "minecraft": stonecutter.current.version] + + filesMatching("fabric.mod.json") { + expand map + } +} + +tasks.withType(JavaCompile).configureEach { + it.options.release = 25 +} + +java { + // Loom will automatically attach sourcesJar to a RemapSourcesJar task and to the "build" task + // if it is present. + // If you remove this line, sources will not be generated. + withSourcesJar() + toolchain { + languageVersion = JavaLanguageVersion.of(25) + } + sourceCompatibility = JavaVersion.VERSION_25 + targetCompatibility = JavaVersion.VERSION_25 +} + +jar { + inputs.property "archivesName", "tt20-${project.version}+mc${stonecutter.current.version}" + + from("LICENSE") { + rename { "${it}_${project.base.archivesName.get()}"} + } +} + +// configure the maven publication +publishing { + publications { + create("mavenJava", MavenPublication) { + artifactId = project.archives_base_name + from components.java + } + } + + // See https://docs.gradle.org/current/userguide/publishing_maven.html for information on how to set up publishing. + repositories { + // Add repositories to publish to here. + // Notice: This block does NOT have the same function as the block in the top level. + // The repositories here will be used for publishing your artifact, not for + // retrieving dependencies. + } +} diff --git a/build.gradle b/build.gradle index 73c9caf..6e88a93 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,5 @@ plugins { - id 'fabric-loom' version "${loom_version}" + id 'net.fabricmc.fabric-loom-remap' version "${loom_version}" id 'maven-publish' } @@ -31,9 +31,8 @@ dependencies { // To change the versions see the gradle.properties file minecraft "com.mojang:minecraft:${property('deps.minecraft')}" mappings "net.fabricmc:yarn:${property('deps.yarn_mappings')}:v2" - modImplementation "net.fabricmc:fabric-loader:${property('deps.fabric_loader')}" - // Fabric API. This is technically optional, but you probably want it anyway. + modImplementation "net.fabricmc:fabric-loader:${property('deps.fabric_loader')}" modImplementation "net.fabricmc.fabric-api:fabric-api:${property('deps.fabric_api')}" // ShitLib @@ -101,4 +100,4 @@ publishing { // The repositories here will be used for publishing your artifact, not for // retrieving dependencies. } -} \ No newline at end of file +} diff --git a/settings.gradle b/settings.gradle index 2fe2107..9c78c2e 100644 --- a/settings.gradle +++ b/settings.gradle @@ -16,15 +16,23 @@ pluginManagement { } plugins { + id "org.gradle.toolchains.foojay-resolver-convention" version "1.0.0" id "dev.kikugie.stonecutter" version "0.9" } stonecutter { kotlinController = false - centralScript = "build.gradle" + centralScript = "build.fabric.gradle" create(getRootProject()) { - versions "1.19.2", "1.20.1", "1.20.2", "1.20.3", "1.20.5", "1.21", "1.21.2", "1.21.9", "1.21.11" + def remapScript = "build.fabric.gradle" + def noremapScript = "build.fabric_noremap.gradle" + def allVersions = ["1.19.2", "1.20.1", "1.20.2", "1.20.3", "1.20.5", "1.21", "1.21.2", "1.21.9", "1.21.11", "26.1"] + + allVersions.each { ver -> + def script = ver == "26.1" ? noremapScript : remapScript + version(ver, ver).buildscript = script + } vcsVersion = "1.20.1" } -} \ No newline at end of file +} diff --git a/versions/26.1/gradle.properties b/versions/26.1/gradle.properties new file mode 100644 index 0000000..5c3bb04 --- /dev/null +++ b/versions/26.1/gradle.properties @@ -0,0 +1,3 @@ +deps.minecraft=26.1-rc-2 +deps.fabric_api=0.143.15+26.1 +modmenu_version=18.0.0-alpha.6 \ No newline at end of file From b5e500fdf828f22ff794c8a9b1ae0638dde1e3e6 Mon Sep 17 00:00:00 2001 From: lemonnik Date: Sun, 22 Mar 2026 02:37:01 +0100 Subject: [PATCH 10/39] no stonecutter warning --- gradle.properties | 3 +++ 1 file changed, 3 insertions(+) diff --git a/gradle.properties b/gradle.properties index d0d59f8..3901f99 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,6 +2,9 @@ org.gradle.jvmargs=-Xmx4G org.gradle.parallel=true +# Disable stonecutter warning +dev.kikugie.stonecutter.hard_mode=true + # Fabric Properties # check these on https://fabricmc.net/develop deps.minecraft=[VERSIONED] From 31c70780f9e4c229201c0288f27b627ceee200e5 Mon Sep 17 00:00:00 2001 From: lemonnik Date: Sun, 22 Mar 2026 02:45:55 +0100 Subject: [PATCH 11/39] 26.1 versioning --- .../snackbag/tt20/command/MainCommand.java | 96 ++++++++++++++++++- .../tt20/config/BlockEntityMaskConfig.java | 8 +- .../mixin/DedicatedServerWatchdogMixin.java | 12 +++ .../tt20/mixin/LivingEntityMixin.java | 19 +++- .../tt20/mixin/PlayerEntityMixin.java | 17 +++- .../tt20/mixin/PortalManagerMixin.java | 27 +++++- .../tt20/mixin/ServerPlayerEntityMixin.java | 8 ++ .../tt20/mixin/ServerPlayerManagerMixin.java | 34 ++++++- .../tt20/mixin/client/ChatHudMixin.java | 27 +++++- .../mixin/client/IntegratedServerMixin.java | 9 ++ .../tt20/mixin/fluid/LavaFluidMixin.java | 8 ++ .../tt20/mixin/fluid/WaterFluidMixin.java | 8 ++ .../tt20/mixin/item/ItemEntityMixin.java | 7 ++ .../snackbag/tt20/mixin/item/ItemMixin.java | 8 ++ .../tt20/mixin/world/AbstractBlockMixin.java | 18 +++- .../tt20/mixin/world/GameRulesMixin.java | 10 +- .../tt20/mixin/world/ServerWorldMixin.java | 13 +++ .../tt20/mixin/world/WorldChunkMixin.java | 40 ++++++-- .../java/net/snackbag/tt20/util/Mask.java | 18 +++- .../net/snackbag/tt20/util/RegistryIndex.java | 15 ++- src/main/resources/tt20.accesswidener | 3 +- 21 files changed, 379 insertions(+), 26 deletions(-) diff --git a/src/main/java/net/snackbag/tt20/command/MainCommand.java b/src/main/java/net/snackbag/tt20/command/MainCommand.java index 66803cb..526f573 100644 --- a/src/main/java/net/snackbag/tt20/command/MainCommand.java +++ b/src/main/java/net/snackbag/tt20/command/MainCommand.java @@ -2,23 +2,45 @@ import com.mojang.brigadier.CommandDispatcher; import com.mojang.brigadier.context.CommandContext; +//? if >=26.1 { +/*import net.minecraft.commands.CommandBuildContext; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.commands.Commands; +import net.minecraft.network.chat.Component; +*///? } else { import net.minecraft.command.CommandRegistryAccess; import net.minecraft.server.command.CommandManager; import net.minecraft.server.command.ServerCommandSource; import net.minecraft.text.Text; +//? } import net.snackbag.tt20.TT20; import net.snackbag.tt20.util.TPSUtil; public class MainCommand { public static void register( + //? if >=26.1 { + /*CommandDispatcher dispatcher, + CommandBuildContext registryAccess, + Commands.CommandSelection environment) { + *///? } else { CommandDispatcher dispatcher, CommandRegistryAccess registryAccess, CommandManager.RegistrationEnvironment environment) { + //? } dispatcher.register( + //? if >=26.1 { + /*Commands.literal("tt20").executes(MainCommand::executeMain) + .then(Commands.literal("tps").executes(MainCommand::executeTps)) + .then(Commands.literal("status").executes(MainCommand::executeStatus)) + *///? } else { CommandManager.literal("tt20").executes(MainCommand::executeMain) .then(CommandManager.literal("tps").executes(MainCommand::executeTps)) .then(CommandManager.literal("status").executes(MainCommand::executeStatus)) - //? if (>=1.21.11) { + //? } + //? if >=26.1 { + /*.then(Commands.literal("toggle").requires(Commands.hasPermission(Commands.LEVEL_ADMINS)).executes(MainCommand::executeToggle)) + .then(Commands.literal("reload").requires(Commands.hasPermission(Commands.LEVEL_GAMEMASTERS)).executes(MainCommand::executeReload)) + *///? } else if >=1.21.11 { /*.then(CommandManager.literal("toggle").requires(CommandManager.requirePermissionLevel(CommandManager.ADMINS_CHECK)).executes(MainCommand::executeToggle)) .then(CommandManager.literal("reload").requires(CommandManager.requirePermissionLevel(CommandManager.GAMEMASTERS_CHECK)).executes(MainCommand::executeReload)) *///?} else { @@ -28,9 +50,33 @@ public static void register( ); } + //? if >=26.1 { + /*private static int executeStatus(CommandContext context) { + *///? } else { private static int executeStatus(CommandContext context) { + //? } var source = context.getSource(); + //? if >=26.1 { + /*source.sendSystemMessage(Component.literal("§7TT20 enabled: " + (TT20.config.enabled() ? "§aON" : "§cOFF"))); + source.sendSystemMessage(Component.literal("§7Block entity acceleration: " + (TT20.config.blockEntityAcceleration() ? "§aON" : "§cOFF"))); + source.sendSystemMessage(Component.literal("§7Block breaking acceleration: " + (TT20.config.blockBreakingAcceleration() ? "§aON" : "§cOFF"))); + source.sendSystemMessage(Component.literal("§7Potion effect acceleration: " + (TT20.config.potionEffectAcceleration() ? "§aON" : "§cOFF"))); + source.sendSystemMessage(Component.literal("§7Fluid acceleration: " + (TT20.config.fluidAcceleration() ? "§aON" : "§cOFF"))); + source.sendSystemMessage(Component.literal("§7Pickup acceleration: " + (TT20.config.pickupAcceleration() ? "§aON" : "§cOFF"))); + source.sendSystemMessage(Component.literal("§7Eating acceleration: " + (TT20.config.eatingAcceleration() ? "§aON" : "§cOFF"))); + source.sendSystemMessage(Component.literal("§7Portal acceleration: " + (TT20.config.portalAcceleration() ? "§aON" : "§cOFF"))); + source.sendSystemMessage(Component.literal("§7Sleeping acceleration: " + (TT20.config.sleepingAcceleration() ? "§aON" : "§cOFF"))); + source.sendSystemMessage(Component.literal("§7Time acceleration: " + (TT20.config.timeAcceleration() ? "§aON" : "§cOFF"))); + source.sendSystemMessage(Component.literal("§7Random tickspeed acceleration: " + (TT20.config.randomTickSpeedAcceleration() ? "§aON" : "§cOFF"))); + source.sendSystemMessage(Component.literal("§7Singleplayer warning: " + (TT20.config.singlePlayerWarning() ? "§aON" : "§cOFF"))); + source.sendSystemMessage(Component.literal("§7Server watchdog: " + (TT20.config.serverWatchdog() ? "§aON" : "§cOFF"))); + executeTps(context, false); + source.sendSystemMessage(Component.literal("\n§8Version: §7" + TT20.VERSION)); + source.sendSystemMessage(Component.literal("§8MSPT: §7" + TT20.TPS_CALCULATOR.getMSPT())); + source.sendSystemMessage(Component.literal("§8Missed ticks: §7" + TPSUtil.formatMissedTicks(TT20.TPS_CALCULATOR.getAllMissedTicks()))); + source.sendSystemMessage(Component.literal("§8Automatic updater: §7" + (TT20.config.automaticUpdater() ? "§aenabled" : "§cdisabled"))); + *///? } else { source.sendMessage(Text.literal("§7TT20 enabled: " + (TT20.config.enabled() ? "§aON" : "§cOFF"))); source.sendMessage(Text.literal("§7Block entity acceleration: " + (TT20.config.blockEntityAcceleration() ? "§aON" : "§cOFF"))); source.sendMessage(Text.literal("§7Block breaking acceleration: " + (TT20.config.blockBreakingAcceleration() ? "§aON" : "§cOFF"))); @@ -49,57 +95,103 @@ private static int executeStatus(CommandContext context) { source.sendMessage(Text.literal("§8MSPT: §7" + TT20.TPS_CALCULATOR.getMSPT())); source.sendMessage(Text.literal("§8Missed ticks: §7" + TPSUtil.formatMissedTicks(TT20.TPS_CALCULATOR.getAllMissedTicks()))); source.sendMessage(Text.literal("§8Automatic updater: §7" + (TT20.config.automaticUpdater() ? "§aenabled" : "§cdisabled"))); + //? } return 1; } + //? if >=26.1 { + /*private static int executeReload(CommandContext context) { + *///? } else { private static int executeReload(CommandContext context) { + //? } var source = context.getSource(); TT20.config.reload(); + //? if >=26.1 { + /*source.sendSystemMessage(Component.literal("Reloaded config")); + *///? } else { source.sendMessage(Text.literal("Reloaded config")); + //? } TT20.blockEntityMaskConfig.reload(); + //? if >=26.1 { + /*source.sendSystemMessage(Component.literal("Reloaded block entity mask config")); + *///? } else { source.sendMessage(Text.literal("Reloaded block entity mask config")); - + //? } return 1; } + //? if >=26.1 { + /*private static int executeTps(CommandContext context) { + *///? } else { private static int executeTps(CommandContext context) { + //? } return executeTps(context, true); } + //? if >=26.1 { + /*private static int executeTps(CommandContext context, boolean missedTicks) { + *///? } else { private static int executeTps(CommandContext context, boolean missedTicks) { + //? } var source = context.getSource(); + //? if >=26.1 { + /*source.sendSystemMessage(Component.literal( + *///? } else { source.sendMessage(Text.literal( + //? } "§7TPS " + TPSUtil.colorizeTPS(TT20.TPS_CALCULATOR.getTPS(), true) + "§7 with average " + TPSUtil.colorizeTPS(TT20.TPS_CALCULATOR.getAverageTPS(), true) + "§7 accurate " + TPSUtil.colorizeTPS(TT20.TPS_CALCULATOR.getMostAccurateTPS(), true) )); + //? if >=26.1 { + /*if (missedTicks) source.sendSystemMessage(Component.literal("§8Missed ticks: §7" + TPSUtil.formatMissedTicks(TT20.TPS_CALCULATOR.getAllMissedTicks()))); + *///? } else { if (missedTicks) source.sendMessage(Text.literal("§8Missed ticks: §7" + TPSUtil.formatMissedTicks(TT20.TPS_CALCULATOR.getAllMissedTicks()))); + //? } return 1; } + //? if >=26.1 { + /*private static int executeToggle(CommandContext context) { + *///? } else { private static int executeToggle(CommandContext context) { + //? } var source = context.getSource(); TT20.config.enabled(!TT20.config.enabled()); TT20.config.save(); String enabledText = TT20.config.enabled() ? "enabled" : "disabled"; + + //? if >=26.1 { + /*source.sendSystemMessage(Component.literal("TT20 is now " + enabledText)); + *///? } else { source.sendMessage(Text.literal("TT20 is now " + enabledText)); + //? } return 1; } + //? if >=26.1 { + /*private static int executeMain(CommandContext context) { + *///? } else { private static int executeMain(CommandContext context) { + //? } var source = context.getSource(); + //? if >=26.1 { + /*source.sendSystemMessage(Component.literal("Running TT20 version " + TT20.VERSION)); + source.sendSystemMessage(Component.literal("Enabled: " + TT20.config.enabled())); + *///? } else { source.sendMessage(Text.literal("Running TT20 version " + TT20.VERSION)); source.sendMessage(Text.literal("Enabled: " + TT20.config.enabled())); + //? } return 1; } diff --git a/src/main/java/net/snackbag/tt20/config/BlockEntityMaskConfig.java b/src/main/java/net/snackbag/tt20/config/BlockEntityMaskConfig.java index bc287f6..e1035c6 100644 --- a/src/main/java/net/snackbag/tt20/config/BlockEntityMaskConfig.java +++ b/src/main/java/net/snackbag/tt20/config/BlockEntityMaskConfig.java @@ -1,6 +1,8 @@ package net.snackbag.tt20.config; -//? if >=1.20.1 { +//? if >=26.1 { +/*import net.minecraft.core.registries.BuiltInRegistries; +*///?} else if >=1.20.1 { import net.minecraft.registry.Registries; //?} else { /*import net.minecraft.util.registry.Registry; @@ -32,7 +34,9 @@ public void reload() { super.reload(); if (reloaded) { - //? if >=1.20.1 { + //? if >=26.1 { + /*this.mask = new Mask(BuiltInRegistries.BLOCK, this, "blocks"); + *///?} else if >=1.20.1 { this.mask = new Mask(Registries.BLOCK, this, "blocks"); //?} else { /*this.mask = new Mask(Registry.BLOCK, this, "blocks"); diff --git a/src/main/java/net/snackbag/tt20/mixin/DedicatedServerWatchdogMixin.java b/src/main/java/net/snackbag/tt20/mixin/DedicatedServerWatchdogMixin.java index 24d6665..f2490e5 100644 --- a/src/main/java/net/snackbag/tt20/mixin/DedicatedServerWatchdogMixin.java +++ b/src/main/java/net/snackbag/tt20/mixin/DedicatedServerWatchdogMixin.java @@ -1,15 +1,27 @@ package net.snackbag.tt20.mixin; import com.llamalad7.mixinextras.injector.ModifyExpressionValue; +//? if >=26.1 { +/*import net.minecraft.server.dedicated.ServerWatchdog; +*///? } else { import net.minecraft.server.dedicated.DedicatedServerWatchdog; +//? } import net.snackbag.tt20.TT20; import org.objectweb.asm.Opcodes; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; +//? if >=26.1 { +/*@Mixin(ServerWatchdog.class) +*///? } else { @Mixin(DedicatedServerWatchdog.class) +//? } public abstract class DedicatedServerWatchdogMixin { + //? if >=26.1 { + /*@ModifyExpressionValue(method = "run", at = @At(value = "FIELD", target = "Lnet/minecraft/server/dedicated/ServerWatchdog;maxTickTimeNanos:J", opcode = Opcodes.GETFIELD)) + *///? } else { @ModifyExpressionValue(method = "run", at = @At(value = "FIELD", target = "Lnet/minecraft/server/dedicated/DedicatedServerWatchdog;maxTickTime:J", opcode = Opcodes.GETFIELD)) + //? } private long cancelServerWatchdog(long original) { return TT20.config.serverWatchdog() ? original : Long.MAX_VALUE; // using Long.MAX_VALUE, because we can't cancel the if statement } diff --git a/src/main/java/net/snackbag/tt20/mixin/LivingEntityMixin.java b/src/main/java/net/snackbag/tt20/mixin/LivingEntityMixin.java index 10ef6eb..2f3d2ca 100644 --- a/src/main/java/net/snackbag/tt20/mixin/LivingEntityMixin.java +++ b/src/main/java/net/snackbag/tt20/mixin/LivingEntityMixin.java @@ -1,7 +1,12 @@ package net.snackbag.tt20.mixin; +//? if >=26.1 { +/*import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; +*///?} else { import net.minecraft.entity.Entity; import net.minecraft.entity.LivingEntity; +//?} import net.snackbag.tt20.TT20; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -11,18 +16,30 @@ @Mixin(LivingEntity.class) public abstract class LivingEntityMixin { + //? if >=26.1 { + /*@Shadow protected abstract void tickEffects(); + + @Inject(method = "baseTick", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/LivingEntity;tickEffects()V")) + *///?} else { @Shadow protected abstract void tickStatusEffects(); @Inject(method = "baseTick", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/LivingEntity;tickStatusEffects()V")) + //?} private void fixPotionDelayTick(CallbackInfo ci) { if (!TT20.config.enabled() || !TT20.config.potionEffectAcceleration()) return; - //? if >=1.21.9 { + //? if >=26.1 { + /*if (((Entity)(Object)this).level().isClientSide()) return; + *///?} else if >=1.21.9 { /*if (((Entity)(Object)this).getEntityWorld().isClient()) return; *///?} else { if (((Entity)(Object)this).getWorld().isClient()) return; //?} for (int i = 0; i < TT20.TPS_CALCULATOR.applicableMissedTicks(); i++) { + //? if >=26.1 { + /*tickEffects(); + *///?} else { tickStatusEffects(); + //?} } } } diff --git a/src/main/java/net/snackbag/tt20/mixin/PlayerEntityMixin.java b/src/main/java/net/snackbag/tt20/mixin/PlayerEntityMixin.java index efa88a2..e35d24f 100644 --- a/src/main/java/net/snackbag/tt20/mixin/PlayerEntityMixin.java +++ b/src/main/java/net/snackbag/tt20/mixin/PlayerEntityMixin.java @@ -2,15 +2,24 @@ import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import com.llamalad7.mixinextras.injector.ModifyReturnValue; +//? if >=26.1 { +/*import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.player.Player; +*///?} else { import net.minecraft.entity.Entity; import net.minecraft.entity.player.PlayerEntity; +//?} import net.snackbag.tt20.TT20; import net.snackbag.tt20.util.TPSUtil; import org.objectweb.asm.Opcodes; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; +//? if >=26.1 { +/*@Mixin(Player.class) +*///?} else { @Mixin(PlayerEntity.class) +//?} public abstract class PlayerEntityMixin { //? if <=1.20.5 { @ModifyReturnValue(method = "getMaxNetherPortalTime", at = @At("RETURN")) @@ -23,10 +32,16 @@ private int netherPortalTimeTT20(int original) { } //?} + //? if >=26.1 { + /*@ModifyExpressionValue(method = "tick", at = @At(value = "FIELD", target = "Lnet/minecraft/world/entity/player/Player;sleepCounter:I", opcode = Opcodes.GETFIELD)) + *///?} else { @ModifyExpressionValue(method = "tick", at = @At(value = "FIELD", target = "Lnet/minecraft/entity/player/PlayerEntity;sleepTimer:I", opcode = Opcodes.GETFIELD)) + //?} private int tickTT20(int original) { if (!TT20.config.enabled() || !TT20.config.sleepingAcceleration()) return original; - //? if >=1.21.9 { + //? if >=26.1 { + /*if (((Entity)(Object)this).level().isClientSide()) return original; + *///?} else if >=1.21.9 { /*if (((Entity)(Object)this).getEntityWorld().isClient()) return original; *///?} else { if (((Entity)(Object)this).getWorld().isClient()) return original; diff --git a/src/main/java/net/snackbag/tt20/mixin/PortalManagerMixin.java b/src/main/java/net/snackbag/tt20/mixin/PortalManagerMixin.java index 739ad07..23859e3 100644 --- a/src/main/java/net/snackbag/tt20/mixin/PortalManagerMixin.java +++ b/src/main/java/net/snackbag/tt20/mixin/PortalManagerMixin.java @@ -1,6 +1,31 @@ package net.snackbag.tt20.mixin; -//? if >=1.21 { +//? if >=26.1 { +/*import com.llamalad7.mixinextras.injector.ModifyExpressionValue; +import com.llamalad7.mixinextras.sugar.Local; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.PortalProcessor; +import net.snackbag.tt20.TT20; +import org.objectweb.asm.Opcodes; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; + + +@Mixin(PortalProcessor.class) +public abstract class PortalManagerMixin { + @Shadow private int portalTime; + + @ModifyExpressionValue(method = "processPortalTeleportation", at = @At(value = "FIELD", target = "Lnet/minecraft/world/entity/PortalProcessor;portalTime:I", opcode = Opcodes.GETFIELD)) + private int runMissedTicks(int original, @Local ServerLevel world) { + if (!TT20.config.enabled() || !TT20.config.portalAcceleration()) return original; + if (world.isClientSide()) return original; + + portalTime = portalTime + TT20.TPS_CALCULATOR.applicableMissedTicks(); + return portalTime; + } +} +*///?} else if >=1.21 { /*import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import com.llamalad7.mixinextras.sugar.Local; import net.minecraft.server.world.ServerWorld; diff --git a/src/main/java/net/snackbag/tt20/mixin/ServerPlayerEntityMixin.java b/src/main/java/net/snackbag/tt20/mixin/ServerPlayerEntityMixin.java index 5cfe785..9e02a01 100644 --- a/src/main/java/net/snackbag/tt20/mixin/ServerPlayerEntityMixin.java +++ b/src/main/java/net/snackbag/tt20/mixin/ServerPlayerEntityMixin.java @@ -1,11 +1,19 @@ package net.snackbag.tt20.mixin; import net.minecraft.server.MinecraftServer; +//? if >=26.1 { +/*import net.minecraft.server.level.ServerPlayer; +*///?} else { import net.minecraft.server.network.ServerPlayerEntity; +//?} import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; +//? if >=26.1 { +/*@Mixin(ServerPlayer.class) +*///?} else { @Mixin(ServerPlayerEntity.class) + //?} public interface ServerPlayerEntityMixin { @Accessor("server") MinecraftServer getServer(); diff --git a/src/main/java/net/snackbag/tt20/mixin/ServerPlayerManagerMixin.java b/src/main/java/net/snackbag/tt20/mixin/ServerPlayerManagerMixin.java index f48bbfc..aa094f1 100644 --- a/src/main/java/net/snackbag/tt20/mixin/ServerPlayerManagerMixin.java +++ b/src/main/java/net/snackbag/tt20/mixin/ServerPlayerManagerMixin.java @@ -1,11 +1,20 @@ package net.snackbag.tt20.mixin; +//? if >=26.1 { +/*import net.minecraft.network.Connection; +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.server.network.CommonListenerCookie; +import net.minecraft.server.players.PlayerList; +*///?} else { import net.minecraft.network.ClientConnection; import net.minecraft.server.PlayerManager; -//? if >1.20.1 -/*import net.minecraft.server.network.ConnectedClientData;*/ import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.text.Text; +//?} +//? if >1.20.1 && <26.1 { +/*import net.minecraft.server.network.ConnectedClientData; +*///?} import net.snackbag.tt20.ModUpdater; import net.snackbag.tt20.TT20; import org.spongepowered.asm.mixin.Mixin; @@ -13,23 +22,40 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +//? if >=26.1 { +/*@Mixin(PlayerList.class) +*///?} else { @Mixin(PlayerManager.class) +//?} public abstract class ServerPlayerManagerMixin { + //? if >=26.1 { + /*@Inject(method = "placeNewPlayer", at = @At("TAIL")) + *///?} else { @Inject(method = "onPlayerConnect", at = @At("TAIL")) - //? if <=1.20.1 { + //?} + //? if >=26.1 { + /*private void sendPlayerUpdateMessageIfCorrectPermissions(Connection connection, ServerPlayer player, CommonListenerCookie cookie, CallbackInfo ci) { + *///?} else if <=1.20.1 { private void sendPlayerUpdateMessageIfCorrectPermissions(ClientConnection connection, ServerPlayerEntity player, CallbackInfo ci) { //?} else { /*private void sendPlayerUpdateMessageIfCorrectPermissions(ClientConnection connection, ServerPlayerEntity player, ConnectedClientData clientData, CallbackInfo ci) { *///?} if (!TT20.config.automaticUpdater() || !ModUpdater.hasUpdate) return; - //? if >=1.21.9 { + //? if >=26.1 { + /*if (((ServerPlayerEntityMixin) player).getServer().getPlayerList().isOp(player.nameAndId())) { + *///?} else if >=1.21.9 { /*if (((ServerPlayerEntityMixin) player).getServer().getPlayerManager().isOperator(player.getPlayerConfigEntry())) { *///?} else { if (player.getServer().getPlayerManager().isOperator(player.getGameProfile())) { //?} + //? if >=26.1 { + /*player.sendSystemMessage(Component.literal(ModUpdater.updateMessage)); + player.sendSystemMessage(Component.literal("§oOnly operators can see this message")); + *///?} else { player.sendMessage(Text.of(ModUpdater.updateMessage)); player.sendMessage(Text.of("§oOnly operators can see this message")); + //?} } } } diff --git a/src/main/java/net/snackbag/tt20/mixin/client/ChatHudMixin.java b/src/main/java/net/snackbag/tt20/mixin/client/ChatHudMixin.java index 5b0410f..0b28426 100644 --- a/src/main/java/net/snackbag/tt20/mixin/client/ChatHudMixin.java +++ b/src/main/java/net/snackbag/tt20/mixin/client/ChatHudMixin.java @@ -2,14 +2,21 @@ import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -//? if >=1.20.1 { +//? if >=26.1 { +/*import net.minecraft.client.gui.Font; +import net.minecraft.client.gui.GuiGraphicsExtractor; +import net.minecraft.client.gui.components.ChatComponent; +import net.minecraft.network.chat.Component; +*///? } else if >=1.20.1 { import net.minecraft.client.font.TextRenderer; import net.minecraft.client.gui.DrawContext; //?} else { /*import net.minecraft.client.util.math.MatrixStack; *///?} +//? if <26.1 { import net.minecraft.client.gui.hud.ChatHud; import net.minecraft.text.Text; +//? } import net.snackbag.tt20.TT20; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -18,17 +25,27 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Environment(EnvType.CLIENT) +//? if >=26.1 { +/*@Mixin(ChatComponent.class) +*///?} else { @Mixin(ChatHud.class) +//?} public abstract class ChatHudMixin { + //? if >=26.1 { + /*@Shadow public abstract void addClientSystemMessage(Component message); + *///?} else { @Shadow public abstract void addMessage(Text message); - //? if >=1.21.11 { + //?} + //? if >=26.1 { + /*@Inject(method = "extractRenderState(Lnet/minecraft/client/gui/GuiGraphicsExtractor;Lnet/minecraft/client/gui/Font;IIILnet/minecraft/client/gui/components/ChatComponent$DisplayMode;Z)V", at = @At("HEAD")) + *///?} else if >=1.21.11 { /*@Inject(method = "render(Lnet/minecraft/client/gui/DrawContext;Lnet/minecraft/client/font/TextRenderer;IIIZZ)V", at = @At("HEAD")) *///?} else { @Inject(method = "render", at = @At("HEAD")) //?} //? if >=1.21.11 { - /*private void onPlayerConnectWarn(DrawContext context, TextRenderer textRenderer, int currentTick, int mouseX, int mouseY, boolean interactable, boolean bl, CallbackInfo ci) { + /*private void onPlayerConnectWarn(GuiGraphicsExtractor graphics, Font font, int ticks, int mouseX, int mouseY, ChatComponent.DisplayMode displayMode, boolean changeCursorOnInsertions, CallbackInfo ci) { *///?} elif >=1.20.5 && <1.21.11 { /*private void onPlayerConnectWarn(DrawContext context, int currentTick, int mouseX, int mouseY, boolean focused, CallbackInfo ci) { *///?} elif >=1.20.1 && <1.20.5 { @@ -37,7 +54,11 @@ private void onPlayerConnectWarn(DrawContext context, int currentTick, int mouse /*private void onPlayerConnectWarn(MatrixStack matrices, int currentTick, CallbackInfo ci) { *///?} if (TT20.warned || !TT20.config.singlePlayerWarning()) return; + //? if >=1.21.11 { + /*addClientSystemMessage(Component.literal("§c§lCritical incompatibilities found!\n\n§c§6TT20 §cis not stable on singleplayer and you may find yourself having unwanted side effects. You can disable each feature in the config if it gets too annoying.")); + *///?} else { addMessage(Text.literal("§c§lCritical incompatibilities found!\n\n§c§6TT20 §cis not stable on singleplayer and you may find yourself having unwanted side effects. You can disable each feature in the config if it gets too annoying.")); + //?} TT20.warned = true; } } diff --git a/src/main/java/net/snackbag/tt20/mixin/client/IntegratedServerMixin.java b/src/main/java/net/snackbag/tt20/mixin/client/IntegratedServerMixin.java index ed7f50d..1f1e009 100644 --- a/src/main/java/net/snackbag/tt20/mixin/client/IntegratedServerMixin.java +++ b/src/main/java/net/snackbag/tt20/mixin/client/IntegratedServerMixin.java @@ -2,7 +2,11 @@ import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; +//? if >=26.1 { +/*import net.minecraft.client.server.IntegratedServer; +*///? } else { import net.minecraft.server.integrated.IntegratedServer; +//? } import net.snackbag.tt20.TT20; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @@ -12,8 +16,13 @@ @Environment(EnvType.CLIENT) @Mixin(IntegratedServer.class) public abstract class IntegratedServerMixin { + //? if >=26.1 { + /*@Inject(method = "stopServer", at = @At("HEAD")) + private void resetWarn(CallbackInfo ci) { + *///? } else { @Inject(method = "stop", at = @At("HEAD")) private void resetWarn(boolean waitForShutdown, CallbackInfo ci) { + //? } TT20.warned = false; } } diff --git a/src/main/java/net/snackbag/tt20/mixin/fluid/LavaFluidMixin.java b/src/main/java/net/snackbag/tt20/mixin/fluid/LavaFluidMixin.java index d13770c..74b8de9 100644 --- a/src/main/java/net/snackbag/tt20/mixin/fluid/LavaFluidMixin.java +++ b/src/main/java/net/snackbag/tt20/mixin/fluid/LavaFluidMixin.java @@ -1,7 +1,11 @@ package net.snackbag.tt20.mixin.fluid; import com.llamalad7.mixinextras.injector.ModifyReturnValue; +//? if >=26.1 { +/*import net.minecraft.world.level.material.LavaFluid; +*///? } else { import net.minecraft.fluid.LavaFluid; +//? } import net.snackbag.tt20.TT20; import net.snackbag.tt20.util.TPSUtil; import org.spongepowered.asm.mixin.Mixin; @@ -9,7 +13,11 @@ @Mixin(LavaFluid.class) public abstract class LavaFluidMixin { + //? if >=26.1 { + /*@ModifyReturnValue(method = "getTickDelay", at = @At("RETURN")) + *///? } else { @ModifyReturnValue(method = "getTickRate", at = @At("RETURN")) + //? } private int tickRateTT20(int original) { if (!TT20.config.enabled() || !TT20.config.fluidAcceleration()) return original; return TPSUtil.tt20(original, true); diff --git a/src/main/java/net/snackbag/tt20/mixin/fluid/WaterFluidMixin.java b/src/main/java/net/snackbag/tt20/mixin/fluid/WaterFluidMixin.java index d83a590..d096b65 100644 --- a/src/main/java/net/snackbag/tt20/mixin/fluid/WaterFluidMixin.java +++ b/src/main/java/net/snackbag/tt20/mixin/fluid/WaterFluidMixin.java @@ -1,7 +1,11 @@ package net.snackbag.tt20.mixin.fluid; import com.llamalad7.mixinextras.injector.ModifyReturnValue; +//? if >=26.1 { +/*import net.minecraft.world.level.material.WaterFluid; +*///? } else { import net.minecraft.fluid.WaterFluid; +//? } import net.snackbag.tt20.TT20; import net.snackbag.tt20.util.TPSUtil; import org.spongepowered.asm.mixin.Mixin; @@ -9,7 +13,11 @@ @Mixin(WaterFluid.class) public abstract class WaterFluidMixin { + //? if >=26.1 { + /*@ModifyReturnValue(method = "getTickDelay", at = @At("RETURN")) + *///? } else { @ModifyReturnValue(method = "getTickRate", at = @At("RETURN")) + //? } private int tickRateTT20(int original) { if (!TT20.config.enabled() || !TT20.config.fluidAcceleration()) return original; return TPSUtil.tt20(original, true); diff --git a/src/main/java/net/snackbag/tt20/mixin/item/ItemEntityMixin.java b/src/main/java/net/snackbag/tt20/mixin/item/ItemEntityMixin.java index 0c6fe41..32b06c0 100644 --- a/src/main/java/net/snackbag/tt20/mixin/item/ItemEntityMixin.java +++ b/src/main/java/net/snackbag/tt20/mixin/item/ItemEntityMixin.java @@ -1,7 +1,12 @@ package net.snackbag.tt20.mixin.item; +//? if >=26.1 { +/*import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.item.ItemEntity; +*///?} else { import net.minecraft.entity.Entity; import net.minecraft.entity.ItemEntity; +//?} import net.snackbag.tt20.TT20; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -17,6 +22,8 @@ public abstract class ItemEntityMixin { private void pickupDelayTT20(CallbackInfo ci) { if (!TT20.config.enabled() || !TT20.config.pickupAcceleration()) return; //? if >=1.21.9 { + /*if (((Entity)(Object)this).level().isClientSide()) return; + *///?} else if >=1.21.9 { /*if (((Entity)(Object)this).getEntityWorld().isClient()) return; *///?} else { if (((Entity)(Object)this).getWorld().isClient()) return; diff --git a/src/main/java/net/snackbag/tt20/mixin/item/ItemMixin.java b/src/main/java/net/snackbag/tt20/mixin/item/ItemMixin.java index b40dc88..c54dac5 100644 --- a/src/main/java/net/snackbag/tt20/mixin/item/ItemMixin.java +++ b/src/main/java/net/snackbag/tt20/mixin/item/ItemMixin.java @@ -1,7 +1,11 @@ package net.snackbag.tt20.mixin.item; import com.llamalad7.mixinextras.injector.ModifyReturnValue; +//? if >=26.1 { +/*import net.minecraft.world.item.Item; +*///?} else { import net.minecraft.item.Item; +//?} import net.snackbag.tt20.TT20; import net.snackbag.tt20.util.TPSUtil; import org.spongepowered.asm.mixin.Mixin; @@ -9,7 +13,11 @@ @Mixin(Item.class) public abstract class ItemMixin { + //? if >=26.1 { + /*@ModifyReturnValue(method = "getUseDuration", at = @At("RETURN")) + *///?} else { @ModifyReturnValue(method = "getMaxUseTime", at = @At("RETURN")) + //?} private int onGetMaxUseTime(int original) { if (!TT20.config.enabled() || !TT20.config.eatingAcceleration() || original == 0) return original; return TPSUtil.tt20(original, true); diff --git a/src/main/java/net/snackbag/tt20/mixin/world/AbstractBlockMixin.java b/src/main/java/net/snackbag/tt20/mixin/world/AbstractBlockMixin.java index dfd1b05..d245dd3 100644 --- a/src/main/java/net/snackbag/tt20/mixin/world/AbstractBlockMixin.java +++ b/src/main/java/net/snackbag/tt20/mixin/world/AbstractBlockMixin.java @@ -2,19 +2,35 @@ import com.llamalad7.mixinextras.injector.ModifyReturnValue; import com.llamalad7.mixinextras.sugar.Local; +//? if >=26.1 { +/*import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.entity.player.Player; +*///? } else { import net.minecraft.block.AbstractBlock; import net.minecraft.entity.player.PlayerEntity; +//? } import net.snackbag.tt20.TT20; import net.snackbag.tt20.util.TPSCalculator; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; +//? if >=26.1 { +/*@Mixin(BlockBehaviour.class) +*///? } else { @Mixin(AbstractBlock.class) +//? } public abstract class AbstractBlockMixin { + //? if >=26.1 { + /*@ModifyReturnValue(method = "getDestroyProgress", at = @At("RETURN")) + private float onBlockBreakingCalc(float original, @Local Player player) { + *///? } else { @ModifyReturnValue(method = "calcBlockBreakingDelta", at = @At("RETURN")) private float onBlockBreakingCalc(float original, @Local PlayerEntity player) { + //? } if (!TT20.config.enabled() || !TT20.config.blockBreakingAcceleration()) return original; - //? if >=1.21.9 { + //? if >=26.1 { + /*if (player.level().isClientSide()) return original; + *///? } else if >=1.21.9 { /*if (player.getEntityWorld().isClient()) return original; *///?} else { if (player.getWorld().isClient()) return original; diff --git a/src/main/java/net/snackbag/tt20/mixin/world/GameRulesMixin.java b/src/main/java/net/snackbag/tt20/mixin/world/GameRulesMixin.java index 376c278..0876fd4 100644 --- a/src/main/java/net/snackbag/tt20/mixin/world/GameRulesMixin.java +++ b/src/main/java/net/snackbag/tt20/mixin/world/GameRulesMixin.java @@ -2,7 +2,10 @@ import com.llamalad7.mixinextras.injector.ModifyReturnValue; import com.llamalad7.mixinextras.sugar.Local; -//? if (>=1.21.11) { +//? if >=26.1 { +/*import net.minecraft.world.level.gamerules.GameRule; +import net.minecraft.world.level.gamerules.GameRules; +*///? } else if (>=1.21.11) { /*import net.minecraft.world.rule.GameRule; import net.minecraft.world.rule.GameRules; *///?} else { @@ -15,7 +18,10 @@ @Mixin(GameRules.class) public class GameRulesMixin { - //? if (>=1.21.11) { + //? if >=26.1 { + /*@ModifyReturnValue(method = "get", at = @At("RETURN")) + private Object randomTickSpeedAcceleration(Object original, @Local(argsOnly = true) GameRule rule) { + *///? } else if (>=1.21.11) { /*@ModifyReturnValue(method = "getValue", at = @At("RETURN")) private Object randomTickSpeedAcceleration(Object original, @Local(argsOnly = true) GameRule rule) { *///?} else { diff --git a/src/main/java/net/snackbag/tt20/mixin/world/ServerWorldMixin.java b/src/main/java/net/snackbag/tt20/mixin/world/ServerWorldMixin.java index 2d3a385..6b76b3a 100644 --- a/src/main/java/net/snackbag/tt20/mixin/world/ServerWorldMixin.java +++ b/src/main/java/net/snackbag/tt20/mixin/world/ServerWorldMixin.java @@ -1,16 +1,29 @@ package net.snackbag.tt20.mixin.world; import com.llamalad7.mixinextras.injector.ModifyExpressionValue; +//? if >=26.1 { +/*import net.minecraft.server.level.ServerLevel; +*///? } else { import net.minecraft.server.world.ServerWorld; +//? } import net.snackbag.tt20.TT20; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; +//? if >=26.1 { +/*@Mixin(ServerLevel.class) +*///? } else { @Mixin(ServerWorld.class) + //? } public abstract class ServerWorldMixin { @ModifyExpressionValue( + //? if >=26.1 { + /*method = "tickTime", + at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/storage/WritableLevelData;getGameTime()J") + *///? } else { method = "tickTime", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/MutableWorldProperties;getTimeOfDay()J") + //? } ) private long addMissingTicksToTime(long original) { if (!TT20.config.enabled() || !TT20.config.timeAcceleration()) return original; diff --git a/src/main/java/net/snackbag/tt20/mixin/world/WorldChunkMixin.java b/src/main/java/net/snackbag/tt20/mixin/world/WorldChunkMixin.java index 33bd733..e44ac37 100644 --- a/src/main/java/net/snackbag/tt20/mixin/world/WorldChunkMixin.java +++ b/src/main/java/net/snackbag/tt20/mixin/world/WorldChunkMixin.java @@ -2,30 +2,58 @@ import com.llamalad7.mixinextras.injector.wrapoperation.Operation; import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +//? if >=26.1 { +/*import net.minecraft.core.BlockPos; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityTicker; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.LevelChunk; +*///?} else { import net.minecraft.block.BlockState; import net.minecraft.block.entity.BlockEntity; import net.minecraft.block.entity.BlockEntityTicker; -//? if >=1.20.1 { -import net.minecraft.registry.Registries; -//?} else { -/*import net.minecraft.util.registry.Registry; -*///?} import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraft.world.chunk.WorldChunk; +//?} + +//? if >=1.20.1 && <26.1 { +import net.minecraft.registry.Registries; +//?} else if <26.1 { +/*import net.minecraft.util.registry.Registry; +*///?} + import net.snackbag.tt20.TT20; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; +//? if >=26.1 { +/*@Mixin(LevelChunk.BoundTickingBlockEntity.class) +*///?} else { @Mixin(WorldChunk.DirectBlockEntityTickInvoker.class) +//?} public abstract class WorldChunkMixin { + //? if >=26.1 { + /*@WrapOperation(method = "tick", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/block/entity/BlockEntityTicker;tick(Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/block/entity/BlockEntity;)V")) + private void onTick(BlockEntityTicker instance, Level world, BlockPos blockPos, BlockState blockState, BlockEntity blockEntity, Operation original) { + *///?} else { @WrapOperation(method = "tick", at = @At(value = "INVOKE", target = "Lnet/minecraft/block/entity/BlockEntityTicker;tick(Lnet/minecraft/world/World;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;Lnet/minecraft/block/entity/BlockEntity;)V")) private void onTick(BlockEntityTicker instance, World world, BlockPos blockPos, BlockState blockState, BlockEntity blockEntity, Operation original) { + //?} original.call(instance, world, blockPos, blockState, blockEntity); if (!TT20.config.enabled()) return; if (!TT20.config.blockEntityAcceleration()) return; + //? if >=26.1 { + /*if (world.isClientSide()) return; + *///?} else { if (world.isClient()) return; - //? if >=1.20.1 { + //?} + + //? if >=26.1 { + /*if (!TT20.blockEntityMaskConfig.getMask().isOkay(BuiltInRegistries.BLOCK.getKey(blockState.getBlock()))) return; + *///?} else if >=1.20.1 { if (!TT20.blockEntityMaskConfig.getMask().isOkay(Registries.BLOCK.getId(blockState.getBlock()))) return; //?} else { /*if (!TT20.blockEntityMaskConfig.getMask().isOkay(Registry.BLOCK.getId(blockState.getBlock()))) return; diff --git a/src/main/java/net/snackbag/tt20/util/Mask.java b/src/main/java/net/snackbag/tt20/util/Mask.java index 7237ea6..296e402 100644 --- a/src/main/java/net/snackbag/tt20/util/Mask.java +++ b/src/main/java/net/snackbag/tt20/util/Mask.java @@ -1,12 +1,20 @@ package net.snackbag.tt20.util; import com.google.gson.JsonElement; -//? if >=1.20.1 { +//? if >=26.1 { +/*import net.minecraft.core.Registry; +*///? } else if >=1.20.1 { import net.minecraft.registry.Registry; //?} else { /*import net.minecraft.util.registry.Registry; *///?} + +//? if >=26.1 { +/*import net.minecraft.resources.Identifier; +*///? } else { import net.minecraft.util.Identifier; +//? } + import net.snackbag.tt20.TT20; import net.snackbag.tt20.config.JSONConfiguration; @@ -17,7 +25,11 @@ public class Mask { private final MaskType maskType; private final Registry registry; private final RegistryIndex index; + //? if >=26.1 { + /*private final Set entries; + *///? } else { private final Set entries; + //? } public Mask(Registry registry, JSONConfiguration file, String maskKey) { this.file = file; @@ -52,7 +64,11 @@ public List manageEntry(String entry) { // if : if (!split[0].equals("*") && !split[1].equals("*")) { + //? if >=26.1 { + /*return List.of(Identifier.fromNamespaceAndPath(split[0], split[1])); + *///? } else { return List.of(Identifier.of(split[0], split[1])); + //? } } // if *: diff --git a/src/main/java/net/snackbag/tt20/util/RegistryIndex.java b/src/main/java/net/snackbag/tt20/util/RegistryIndex.java index bb7da0a..45b785e 100644 --- a/src/main/java/net/snackbag/tt20/util/RegistryIndex.java +++ b/src/main/java/net/snackbag/tt20/util/RegistryIndex.java @@ -1,13 +1,21 @@ package net.snackbag.tt20.util; -//? if >=1.20.1 { +//? if >=26.1 { +/*import net.minecraft.core.Registry; +*///? } else if >=1.20.1 { import net.minecraft.registry.Registry; import net.minecraft.registry.RegistryKey; //?} else { /*import net.minecraft.util.registry.Registry; import net.minecraft.util.registry.RegistryKey; *///?} + +//? if >=26.1 { +/*import net.minecraft.resources.Identifier; +import net.minecraft.resources.ResourceKey; +*///? } else { import net.minecraft.util.Identifier; + //? } import java.util.ArrayList; import java.util.HashMap; @@ -32,8 +40,13 @@ private RegistryIndex(Registry registry) { this.namespaceIndex = new HashMap<>(); this.pathIndex = new HashMap<>(); + //? if >=26.1 { + /*for (ResourceKey key : registry.registryKeySet()) { + Identifier identifier = key.identifier(); + *///? } else { for (RegistryKey key : registry.getKeys()) { Identifier identifier = key.getValue(); + //? } String namespace = identifier.getNamespace(); String path = identifier.getPath(); diff --git a/src/main/resources/tt20.accesswidener b/src/main/resources/tt20.accesswidener index 1329c95..ac45464 100644 --- a/src/main/resources/tt20.accesswidener +++ b/src/main/resources/tt20.accesswidener @@ -1,3 +1,4 @@ accessWidener v2 named -accessible class net/minecraft/world/chunk/WorldChunk$DirectBlockEntityTickInvoker \ No newline at end of file +accessible class net/minecraft/world/chunk/WorldChunk$DirectBlockEntityTickInvoker +accessible class net/minecraft/world/level/chunk/LevelChunk$BoundTickingBlockEntity \ No newline at end of file From a2cb70975016b5983e1127b96add1a02e6da333a Mon Sep 17 00:00:00 2001 From: lemonnik Date: Sun, 22 Mar 2026 21:58:15 +0100 Subject: [PATCH 12/39] no accesswidener --- .../java/net/snackbag/tt20/mixin/world/WorldChunkMixin.java | 6 ++---- src/main/resources/tt20.accesswidener | 3 --- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/src/main/java/net/snackbag/tt20/mixin/world/WorldChunkMixin.java b/src/main/java/net/snackbag/tt20/mixin/world/WorldChunkMixin.java index e44ac37..58a3e95 100644 --- a/src/main/java/net/snackbag/tt20/mixin/world/WorldChunkMixin.java +++ b/src/main/java/net/snackbag/tt20/mixin/world/WorldChunkMixin.java @@ -9,14 +9,12 @@ import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityTicker; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.LevelChunk; *///?} else { import net.minecraft.block.BlockState; import net.minecraft.block.entity.BlockEntity; import net.minecraft.block.entity.BlockEntityTicker; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -import net.minecraft.world.chunk.WorldChunk; //?} //? if >=1.20.1 && <26.1 { @@ -30,9 +28,9 @@ import org.spongepowered.asm.mixin.injection.At; //? if >=26.1 { -/*@Mixin(LevelChunk.BoundTickingBlockEntity.class) +/*@Mixin(targets = "net.minecraft.world.level.chunk.LevelChunk$BoundTickingBlockEntity") *///?} else { -@Mixin(WorldChunk.DirectBlockEntityTickInvoker.class) +@Mixin(targets = "net.minecraft.world.chunk.WorldChunk$DirectBlockEntityTickInvoker") //?} public abstract class WorldChunkMixin { //? if >=26.1 { diff --git a/src/main/resources/tt20.accesswidener b/src/main/resources/tt20.accesswidener index ac45464..9ab2173 100644 --- a/src/main/resources/tt20.accesswidener +++ b/src/main/resources/tt20.accesswidener @@ -1,4 +1 @@ accessWidener v2 named - -accessible class net/minecraft/world/chunk/WorldChunk$DirectBlockEntityTickInvoker -accessible class net/minecraft/world/level/chunk/LevelChunk$BoundTickingBlockEntity \ No newline at end of file From 397d8a16ddee278ce3f09434355773b008c6231d Mon Sep 17 00:00:00 2001 From: lemonnik Date: Sun, 22 Mar 2026 21:59:27 +0100 Subject: [PATCH 13/39] PortalManagerMixin placeholder --- .../snackbag/tt20/mixin/PortalManagerMixin.java | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/snackbag/tt20/mixin/PortalManagerMixin.java b/src/main/java/net/snackbag/tt20/mixin/PortalManagerMixin.java index 23859e3..60ade8a 100644 --- a/src/main/java/net/snackbag/tt20/mixin/PortalManagerMixin.java +++ b/src/main/java/net/snackbag/tt20/mixin/PortalManagerMixin.java @@ -50,4 +50,19 @@ private int runMissedTicks(int original, @Local ServerWorld world) { return ticksInPortal; } } -*///?} \ No newline at end of file +*///?} else { + +import net.snackbag.tt20.TT20; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(TT20.class) +public class PortalManagerMixin { + @Inject(method = "onInitialize", at = @At("HEAD")) + public void onInitialize(CallbackInfo ci) { + throw new RuntimeException("Tried to load PortalManagerMixin on <21.1"); + } +} +//?} \ No newline at end of file From 2409f3471ba6714e1ed11aaec0544048992788b8 Mon Sep 17 00:00:00 2001 From: lemonnik Date: Sun, 22 Mar 2026 22:02:49 +0100 Subject: [PATCH 14/39] update metadata --- src/main/resources/fabric.mod.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 65958a8..8f3f63d 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -33,8 +33,8 @@ "tt20.mixins.json" ], "depends": { - "fabricloader": ">=0.15.11", - "minecraft": "~${minecraft}", + "fabricloader": ">=0.18.4", + "minecraft": ">=1.19.2", "java": ">=17", "fabric-api": "*" }, From 272b5066adf4222fd50c5ecfe841754513f0fd80 Mon Sep 17 00:00:00 2001 From: lemonnik Date: Sun, 22 Mar 2026 22:10:12 +0100 Subject: [PATCH 15/39] remove all accesswidener related stuff --- build.fabric.gradle | 1 - build.gradle | 1 - src/main/resources/fabric.mod.json | 3 +-- src/main/resources/tt20.accesswidener | 1 - 4 files changed, 1 insertion(+), 5 deletions(-) delete mode 100644 src/main/resources/tt20.accesswidener diff --git a/build.fabric.gradle b/build.fabric.gradle index 6e88a93..b419181 100644 --- a/build.fabric.gradle +++ b/build.fabric.gradle @@ -19,7 +19,6 @@ loom { runConfigs.all { ideConfigGenerated = true runDir = "../../run" - accessWidenerPath = file("../../src/main/resources/tt20.accesswidener") } } diff --git a/build.gradle b/build.gradle index 6e88a93..b419181 100644 --- a/build.gradle +++ b/build.gradle @@ -19,7 +19,6 @@ loom { runConfigs.all { ideConfigGenerated = true runDir = "../../run" - accessWidenerPath = file("../../src/main/resources/tt20.accesswidener") } } diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 8f3f63d..2d1e3c2 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -17,7 +17,6 @@ "license": "PolyForm Shield License 1.0.0", "icon": "assets/tt20/icon.png", "environment": "*", - "accessWidener": "tt20.accesswidener", "entrypoints": { "main": [ "net.snackbag.tt20.TT20" @@ -40,4 +39,4 @@ }, "suggests": { } -} \ No newline at end of file +} diff --git a/src/main/resources/tt20.accesswidener b/src/main/resources/tt20.accesswidener deleted file mode 100644 index 9ab2173..0000000 --- a/src/main/resources/tt20.accesswidener +++ /dev/null @@ -1 +0,0 @@ -accessWidener v2 named From 1e564ff89545c21198176b1dadbe540e827e49ce Mon Sep 17 00:00:00 2001 From: lemonnik Date: Sun, 22 Mar 2026 22:11:57 +0100 Subject: [PATCH 16/39] fix modmenu import --- build.fabric_noremap.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.fabric_noremap.gradle b/build.fabric_noremap.gradle index e36fd31..d273fda 100644 --- a/build.fabric_noremap.gradle +++ b/build.fabric_noremap.gradle @@ -38,7 +38,7 @@ dependencies { include "net.snackbag.shit:shit:${project.shitlib_version}" // ModMenu - compileOnly("com.terraformersmc:modmenu:${project.modmenu_version}") + implementation("com.terraformersmc:modmenu:${project.modmenu_version}") } processResources { From 2a939348a073a89b92dc04cb45177c23028d49f3 Mon Sep 17 00:00:00 2001 From: lemonnik Date: Sun, 22 Mar 2026 22:12:51 +0100 Subject: [PATCH 17/39] fix metadata version --- build.fabric.gradle | 2 ++ build.fabric_noremap.gradle | 2 ++ build.gradle | 2 ++ 3 files changed, 6 insertions(+) diff --git a/build.fabric.gradle b/build.fabric.gradle index b419181..e8a220b 100644 --- a/build.fabric.gradle +++ b/build.fabric.gradle @@ -3,6 +3,8 @@ plugins { id 'maven-publish' } +version = property("mod.version") + base { archivesName = project.archives_base_name } diff --git a/build.fabric_noremap.gradle b/build.fabric_noremap.gradle index d273fda..2c8752c 100644 --- a/build.fabric_noremap.gradle +++ b/build.fabric_noremap.gradle @@ -3,6 +3,8 @@ plugins { id 'maven-publish' } +version = property("mod.version") + base { archivesName = project.archives_base_name } diff --git a/build.gradle b/build.gradle index b419181..e8a220b 100644 --- a/build.gradle +++ b/build.gradle @@ -3,6 +3,8 @@ plugins { id 'maven-publish' } +version = property("mod.version") + base { archivesName = project.archives_base_name } From 2ae5648ea9857e3823cd836732ada30db463356f Mon Sep 17 00:00:00 2001 From: lemonnik Date: Tue, 24 Mar 2026 18:38:17 +0100 Subject: [PATCH 18/39] update properties for 26.1 --- versions/26.1/gradle.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/versions/26.1/gradle.properties b/versions/26.1/gradle.properties index 5c3bb04..dbce5c2 100644 --- a/versions/26.1/gradle.properties +++ b/versions/26.1/gradle.properties @@ -1,3 +1,3 @@ -deps.minecraft=26.1-rc-2 -deps.fabric_api=0.143.15+26.1 +deps.minecraft=26.1 +deps.fabric_api=0.144.0+26.1 modmenu_version=18.0.0-alpha.6 \ No newline at end of file From 6f78118f516fd5aed1898a25c53982e58ae8373d Mon Sep 17 00:00:00 2001 From: Lemonnik6484 <74058717+Lemonnik6484@users.noreply.github.com> Date: Wed, 25 Mar 2026 14:52:49 +0100 Subject: [PATCH 19/39] fabric loader 0.18.5 --- gradle.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle.properties b/gradle.properties index 3901f99..14a0e69 100644 --- a/gradle.properties +++ b/gradle.properties @@ -9,7 +9,7 @@ dev.kikugie.stonecutter.hard_mode=true # check these on https://fabricmc.net/develop deps.minecraft=[VERSIONED] deps.yarn_mappings=[VERSIONED] -deps.fabric_loader=0.18.4 +deps.fabric_loader=0.18.5 loom_version=1.15-SNAPSHOT @@ -26,4 +26,4 @@ deps.fabric_api=[VERSIONED] shitlib_version=1.2.3 # ModMenu -modmenu_version=[VERSIONED] \ No newline at end of file +modmenu_version=[VERSIONED] From c0f81283dcafa8941e0ab8dfcf5c78689e7579e5 Mon Sep 17 00:00:00 2001 From: Lemonnik6484 <74058717+Lemonnik6484@users.noreply.github.com> Date: Wed, 25 Mar 2026 14:55:03 +0100 Subject: [PATCH 20/39] update dependencies --- versions/26.1/gradle.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/versions/26.1/gradle.properties b/versions/26.1/gradle.properties index dbce5c2..75cf93d 100644 --- a/versions/26.1/gradle.properties +++ b/versions/26.1/gradle.properties @@ -1,3 +1,3 @@ deps.minecraft=26.1 -deps.fabric_api=0.144.0+26.1 -modmenu_version=18.0.0-alpha.6 \ No newline at end of file +deps.fabric_api=0.144.1+26.1 +modmenu_version=18.0.0-alpha.7 From 1fe831c6fa252bd1f580d8acd54b37e813ce1188 Mon Sep 17 00:00:00 2001 From: lemonnik Date: Sun, 5 Apr 2026 11:43:48 +0200 Subject: [PATCH 21/39] 26.1 -> 26.1.1 --- gradle.properties | 2 +- settings.gradle | 4 ++-- versions/26.1.1/gradle.properties | 3 +++ versions/26.1/gradle.properties | 3 --- 4 files changed, 6 insertions(+), 6 deletions(-) create mode 100644 versions/26.1.1/gradle.properties delete mode 100644 versions/26.1/gradle.properties diff --git a/gradle.properties b/gradle.properties index 14a0e69..919a1e0 100644 --- a/gradle.properties +++ b/gradle.properties @@ -9,7 +9,7 @@ dev.kikugie.stonecutter.hard_mode=true # check these on https://fabricmc.net/develop deps.minecraft=[VERSIONED] deps.yarn_mappings=[VERSIONED] -deps.fabric_loader=0.18.5 +deps.fabric_loader=0.18.6 loom_version=1.15-SNAPSHOT diff --git a/settings.gradle b/settings.gradle index 9c78c2e..5388de4 100644 --- a/settings.gradle +++ b/settings.gradle @@ -27,10 +27,10 @@ stonecutter { create(getRootProject()) { def remapScript = "build.fabric.gradle" def noremapScript = "build.fabric_noremap.gradle" - def allVersions = ["1.19.2", "1.20.1", "1.20.2", "1.20.3", "1.20.5", "1.21", "1.21.2", "1.21.9", "1.21.11", "26.1"] + def allVersions = ["1.19.2", "1.20.1", "1.20.2", "1.20.3", "1.20.5", "1.21", "1.21.2", "1.21.9", "1.21.11", "26.1.1"] allVersions.each { ver -> - def script = ver == "26.1" ? noremapScript : remapScript + def script = ver.matches("^26\\..*") ? noremapScript : remapScript version(ver, ver).buildscript = script } vcsVersion = "1.20.1" diff --git a/versions/26.1.1/gradle.properties b/versions/26.1.1/gradle.properties new file mode 100644 index 0000000..34dd1b1 --- /dev/null +++ b/versions/26.1.1/gradle.properties @@ -0,0 +1,3 @@ +deps.minecraft=26.1.1 +deps.fabric_api=0.145.3+26.1.1 +modmenu_version=18.0.0-alpha.8 diff --git a/versions/26.1/gradle.properties b/versions/26.1/gradle.properties deleted file mode 100644 index 75cf93d..0000000 --- a/versions/26.1/gradle.properties +++ /dev/null @@ -1,3 +0,0 @@ -deps.minecraft=26.1 -deps.fabric_api=0.144.1+26.1 -modmenu_version=18.0.0-alpha.7 From ce9d7acf52903c51044184d7de117319cf73aefb Mon Sep 17 00:00:00 2001 From: lemonnik Date: Sun, 5 Apr 2026 12:26:33 +0200 Subject: [PATCH 22/39] fix 1.21.9 (?) --- src/main/java/net/snackbag/tt20/mixin/item/ItemEntityMixin.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/snackbag/tt20/mixin/item/ItemEntityMixin.java b/src/main/java/net/snackbag/tt20/mixin/item/ItemEntityMixin.java index 32b06c0..7038773 100644 --- a/src/main/java/net/snackbag/tt20/mixin/item/ItemEntityMixin.java +++ b/src/main/java/net/snackbag/tt20/mixin/item/ItemEntityMixin.java @@ -22,7 +22,7 @@ public abstract class ItemEntityMixin { private void pickupDelayTT20(CallbackInfo ci) { if (!TT20.config.enabled() || !TT20.config.pickupAcceleration()) return; //? if >=1.21.9 { - /*if (((Entity)(Object)this).level().isClientSide()) return; + /*if (((Entity)(Object)this).getEntityWorld().isClient()) return; *///?} else if >=1.21.9 { /*if (((Entity)(Object)this).getEntityWorld().isClient()) return; *///?} else { From e1c8e0d2f57fdea847698fef42f4a4826c678ff7 Mon Sep 17 00:00:00 2001 From: lemonnik Date: Sun, 5 Apr 2026 12:26:44 +0200 Subject: [PATCH 23/39] fix 1.21.11 (??) --- .../java/net/snackbag/tt20/mixin/client/ChatHudMixin.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/snackbag/tt20/mixin/client/ChatHudMixin.java b/src/main/java/net/snackbag/tt20/mixin/client/ChatHudMixin.java index 0b28426..f918aee 100644 --- a/src/main/java/net/snackbag/tt20/mixin/client/ChatHudMixin.java +++ b/src/main/java/net/snackbag/tt20/mixin/client/ChatHudMixin.java @@ -44,8 +44,10 @@ public abstract class ChatHudMixin { @Inject(method = "render", at = @At("HEAD")) //?} - //? if >=1.21.11 { + //?if >= 26.1 { /*private void onPlayerConnectWarn(GuiGraphicsExtractor graphics, Font font, int ticks, int mouseX, int mouseY, ChatComponent.DisplayMode displayMode, boolean changeCursorOnInsertions, CallbackInfo ci) { + *///?} else if >=1.21.11 { + /*private void onPlayerConnectWarn(DrawContext context, TextRenderer textRenderer, int currentTick, int mouseX, int mouseY, boolean interactable, boolean bl, CallbackInfo ci) { *///?} elif >=1.20.5 && <1.21.11 { /*private void onPlayerConnectWarn(DrawContext context, int currentTick, int mouseX, int mouseY, boolean focused, CallbackInfo ci) { *///?} elif >=1.20.1 && <1.20.5 { @@ -54,7 +56,7 @@ private void onPlayerConnectWarn(DrawContext context, int currentTick, int mouse /*private void onPlayerConnectWarn(MatrixStack matrices, int currentTick, CallbackInfo ci) { *///?} if (TT20.warned || !TT20.config.singlePlayerWarning()) return; - //? if >=1.21.11 { + //? if >=26.1 { /*addClientSystemMessage(Component.literal("§c§lCritical incompatibilities found!\n\n§c§6TT20 §cis not stable on singleplayer and you may find yourself having unwanted side effects. You can disable each feature in the config if it gets too annoying.")); *///?} else { addMessage(Text.literal("§c§lCritical incompatibilities found!\n\n§c§6TT20 §cis not stable on singleplayer and you may find yourself having unwanted side effects. You can disable each feature in the config if it gets too annoying.")); From 50a2689348a6c6f610776dd169d3a720d0cf232f Mon Sep 17 00:00:00 2001 From: lemonnik Date: Sun, 5 Apr 2026 12:29:17 +0200 Subject: [PATCH 24/39] oops fix 26.1+ too --- .../java/net/snackbag/tt20/mixin/item/ItemEntityMixin.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/snackbag/tt20/mixin/item/ItemEntityMixin.java b/src/main/java/net/snackbag/tt20/mixin/item/ItemEntityMixin.java index 7038773..6c5b45d 100644 --- a/src/main/java/net/snackbag/tt20/mixin/item/ItemEntityMixin.java +++ b/src/main/java/net/snackbag/tt20/mixin/item/ItemEntityMixin.java @@ -21,7 +21,9 @@ public abstract class ItemEntityMixin { @Inject(method = "tick", at = @At("HEAD")) private void pickupDelayTT20(CallbackInfo ci) { if (!TT20.config.enabled() || !TT20.config.pickupAcceleration()) return; - //? if >=1.21.9 { + //? if >=26.1 { + /*if (((Entity)(Object)this).level().isClientSide()) return; + *///?} else if >=1.21.9 { /*if (((Entity)(Object)this).getEntityWorld().isClient()) return; *///?} else if >=1.21.9 { /*if (((Entity)(Object)this).getEntityWorld().isClient()) return; From 6f263f836f7ddb6871de18c1d8ffb14193a9d2f5 Mon Sep 17 00:00:00 2001 From: lemonnik Date: Mon, 6 Apr 2026 22:46:12 +0200 Subject: [PATCH 25/39] refactor exporter and more --- .../snackbag/tt20/config/impl/TT20Config.java | 2 +- .../snackbag/tt20/config/rework/CConfig.java | 4 + .../tt20/config/rework/CExporter.java | 533 ++++++++---------- .../tt20/config/rework/types/CBoolean.java | 4 + 4 files changed, 258 insertions(+), 285 deletions(-) diff --git a/src/main/java/net/snackbag/tt20/config/impl/TT20Config.java b/src/main/java/net/snackbag/tt20/config/impl/TT20Config.java index 90e0273..0f04b1c 100644 --- a/src/main/java/net/snackbag/tt20/config/impl/TT20Config.java +++ b/src/main/java/net/snackbag/tt20/config/impl/TT20Config.java @@ -18,7 +18,7 @@ public class TT20Config extends CConfig { @Override protected @NotNull CExporter.Format getFormat() { - return CExporter.Format.TOML; + return CExporter.Format.JSON5; } private static final CCategory MAIN = CCategory.of("main", "Main TT20 configuration"); diff --git a/src/main/java/net/snackbag/tt20/config/rework/CConfig.java b/src/main/java/net/snackbag/tt20/config/rework/CConfig.java index 0ba246d..9850551 100644 --- a/src/main/java/net/snackbag/tt20/config/rework/CConfig.java +++ b/src/main/java/net/snackbag/tt20/config/rework/CConfig.java @@ -49,4 +49,8 @@ public boolean reload() { return false; } } + + public boolean save() { + return CExporter.save(categories, getFileName(), getFormat()); + } } \ No newline at end of file diff --git a/src/main/java/net/snackbag/tt20/config/rework/CExporter.java b/src/main/java/net/snackbag/tt20/config/rework/CExporter.java index d7cc40b..fde7c91 100644 --- a/src/main/java/net/snackbag/tt20/config/rework/CExporter.java +++ b/src/main/java/net/snackbag/tt20/config/rework/CExporter.java @@ -15,8 +15,11 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.logging.Logger; public class CExporter { + private static final Logger LOGGER = Logger.getLogger("TT20/Config"); + public enum Format { JSON5(".json5"), TOML(".toml"); @@ -32,382 +35,344 @@ public String extension() { } } - private static Path getConfigDir() { - return FabricLoader.getInstance().getConfigDir().toAbsolutePath(); - } - public static CMap load(CMap defaults, String fileName, Format format) { - String finalFileName = fileName + format.extension(); - Path inputPath = getConfigDir().resolve(finalFileName); + Path path = configPath(fileName, format); - if (!Files.exists(inputPath)) { - System.out.println("Config file " + finalFileName + " not found, creating new one."); + if (!Files.exists(path)) { + LOGGER.info("Config file " + path.getFileName() + " not found - writing defaults."); save(defaults, fileName, format); - return new CMap(); + return defaults; } try { - String content = Files.readString(inputPath); - - if (format == Format.JSON5) { - return parseJson5(content, defaults); - } else if (format == Format.TOML) { - // TODO: return CMap from parsed TOML - } - - return defaults; + String content = Files.readString(path); + return switch (format) { + case JSON5 -> parseJson5(content, defaults); + case TOML -> parseToml(content, defaults); + }; } catch (IOException e) { - e.printStackTrace(); + LOGGER.warning("Failed to read config " + path.getFileName() + ": " + e.getMessage()); return defaults; } } - public static boolean save(CMap config, String fileName, Format format){ - String finalFileName = fileName + format.extension(); + public static boolean save(CMap config, String fileName, Format format) { + Path path = configPath(fileName, format); - Path outputPath = getConfigDir().resolve(finalFileName); try { - Files.createDirectories(outputPath.getParent()); + Files.createDirectories(path.getParent()); } catch (IOException e) { - e.printStackTrace(); + LOGGER.warning("Failed to create config directory: " + e.getMessage()); return false; } - StringBuilder builder = new StringBuilder(); - - addStart(format, builder); - for (CCategory category : config.map().keySet()) { - for (String descStr : category.description()) { - addComment(format, builder, descStr); - } - addCategory(format, builder, category); - for (Map.Entry> entry : config.map().get(category).entrySet()) { - addValue(entry.getKey(), entry.getValue(), format, builder); - } - addCategoryEnd(format, builder); - } - addEnd(format, builder); - + String content = switch (format) { + case JSON5 -> serializeJson5(config); + case TOML -> serializeToml(config); + }; try { - Files.writeString(outputPath, builder.toString()); + Files.writeString(path, content); + return true; } catch (IOException e) { - e.printStackTrace(); + LOGGER.warning("Failed to write config " + path.getFileName() + ": " + e.getMessage()); return false; } - - return true; } - private static void addStart(Format format, StringBuilder builder) { - if (format == Format.JSON5) { - builder.append("{\n"); - } - } + private static String serializeJson5(CMap config) { + StringBuilder sb = new StringBuilder(); + sb.append("{\n"); - private static void addComment(Format format, StringBuilder builder, String comment) { - if (format == Format.JSON5) { - builder.append(" // ").append(comment).append("\n"); - } else if (format == Format.TOML) { - builder.append("# ").append(comment).append("\n"); - } - } + List categories = new ArrayList<>(config.map().keySet()); + for (int ci = 0; ci < categories.size(); ci++) { + CCategory category = categories.get(ci); + boolean lastCategory = (ci == categories.size() - 1); + + for (String desc : category.description()) { + sb.append(" // ").append(desc).append("\n"); + } + + sb.append(" \"").append(category.id()).append("\": {\n"); + + List>> entries = + new ArrayList<>(config.map().get(category).entrySet()); + + for (int vi = 0; vi < entries.size(); vi++) { + boolean lastValue = (vi == entries.size() - 1); + appendJson5Value(sb, entries.get(vi).getKey(), entries.get(vi).getValue(), lastValue); + } - private static void addCategory(Format format, StringBuilder builder, CCategory category) { - if (format == Format.JSON5) { - builder.append(" \"").append(category.id()).append("\": {\n"); - } else if (format == Format.TOML) { - builder.append("[").append(category.id()).append("]\n"); + sb.append(" }"); + if (!lastCategory) sb.append(","); + sb.append("\n"); } + + sb.append("}\n"); + return sb.toString(); } - private static void addCategoryEnd(Format format, StringBuilder builder) { - if (format == Format.JSON5) { - builder.append(" },\n"); + private static void appendJson5Value(StringBuilder sb, String key, CValue value, boolean last) { + String comma = last ? "" : ","; + + if (value instanceof CBoolean cBoolean) { + sb.append(" \"").append(key).append("\": ") + .append(cBoolean.get()) + .append(comma) + .append(" // ").append(value.comment) + .append("\n"); + + } else if (value instanceof CEnum cEnum) { + sb.append(" \"").append(key).append("\": ") + .append("\"").append(cEnum.get().name()).append("\"") + .append(comma) + .append(" // ").append(value.comment) + .append(" [").append(enumOptions(cEnum)).append("]") + .append("\n"); + + } else if (value instanceof CMask cMask) { + sb.append(" \"").append(key).append("\": [ // ").append(value.comment).append("\n"); + List masks = List.of(cMask.getMaskStr()); + for (int i = 0; i < masks.size(); i++) { + sb.append(" \"").append(masks.get(i)).append("\""); + if (i < masks.size() - 1) sb.append(","); + sb.append("\n"); + } + sb.append(" ]").append(comma).append("\n"); } } - private static void addValue(String key, CValue value, Format format, StringBuilder builder) { - if (format == Format.JSON5) { - builder.append(" \"").append(key).append("\": "); - - if (value instanceof CBoolean cBoolean) { - builder.append(cBoolean.get()).append(",").append(" // ").append(value.comment).append("\n"); - } else if (value instanceof CEnum cEnum) { - builder.append("\"").append(cEnum.get().name()).append("\",").append(" // ").append(value.comment); - addEnumComment(builder, cEnum); - } else if (value instanceof CMask cMask) { - builder.append("[ // ").append(value.comment); - for (String maskStr : cMask.getMaskStr()) { - builder.append("\n").append(" \"").append(maskStr).append("\","); - } - builder.append("\n").append(" ]").append("\n"); - } - } else if (format == Format.TOML) { - if (!(value instanceof CMask)) { - builder.append(key).append(" = "); + private static String serializeToml(CMap config) { + StringBuilder sb = new StringBuilder(); + + for (CCategory category : config.map().keySet()) { + for (String desc : category.description()) { + sb.append("# ").append(desc).append("\n"); } - if (value instanceof CBoolean cBoolean) { - builder.append(cBoolean.get()).append(" # ").append(value.comment).append("\n"); - } else if (value instanceof CEnum cEnum) { - builder.append("\"").append(cEnum.get().name()).append("\"").append(" # ").append(value.comment); - addEnumComment(builder, cEnum); - } else if (value instanceof CMask cMask) { - builder.append("# ").append(value.comment).append("\n"); - builder.append(key).append(" = ").append("\"\"\""); - for (String maskStr : cMask.getMaskStr()) { - builder.append("\n ").append(maskStr).append("\n"); - } - builder.append("\"\"\""); + sb.append("[").append(category.id()).append("]\n"); + + for (Map.Entry> entry : config.map().get(category).entrySet()) { + appendTomlValue(sb, entry.getKey(), entry.getValue()); } - } - } - private static void addEnumComment(StringBuilder builder, CEnum cEnum) { - builder.append(" ["); - for (Enum enumValue : cEnum.getEnumClass().getEnumConstants()) { - builder.append(enumValue.name()).append(" / "); + sb.append("\n"); } - builder.deleteCharAt(builder.length() - 3); - builder.deleteCharAt(builder.length() - 2); - builder.deleteCharAt(builder.length() - 1); - builder.append("]").append("\n"); + + return sb.toString(); } - private static void addEnd(Format format, StringBuilder builder) { - if (format == Format.JSON5) { - builder.append("}"); + private static void appendTomlValue(StringBuilder sb, String key, CValue value) { + if (value instanceof CBoolean cBoolean) { + sb.append(key).append(" = ") + .append(cBoolean.get()) + .append(" # ").append(value.comment) + .append("\n"); + + } else if (value instanceof CEnum cEnum) { + sb.append(key).append(" = ") + .append("\"").append(cEnum.get().name()).append("\"") + .append(" # ").append(value.comment) + .append(" [").append(enumOptions(cEnum)).append("]") + .append("\n"); + + } else if (value instanceof CMask cMask) { + sb.append("# ").append(value.comment).append("\n"); + sb.append(key).append(" = ["); + List masks = List.of(cMask.getMaskStr()); + for (int i = 0; i < masks.size(); i++) { + sb.append("\"").append(masks.get(i)).append("\""); + if (i < masks.size() - 1) sb.append(", "); + } + sb.append("]\n"); } } - private static CMap parseJson5(String json, CMap config) { - String clearJson = clearJson(json); - String[] lines = clearJson.split("\n"); + private static CMap parseJson5(String raw, CMap defaults) { + List lines = stripJson5Comments(raw); CCategory currentCategory = null; - String currentMask = null; - List maskList = new ArrayList<>(); + String currentMaskKey = null; + List maskAccum = new ArrayList<>(); for (String line : lines) { - if (line.startsWith("\"") && line.endsWith("{")) { // category line - int quoteStart = line.indexOf('"'); - int quoteEnd = line.indexOf('"', quoteStart + 1); - - if (quoteStart != -1 && quoteEnd != -1) { - String categoryId = line.substring(quoteStart + 1, quoteEnd); - - for (CCategory category : config.map().keySet()) { - if (category.id().equals(categoryId)) { - currentCategory = category; - break; - } - } - } + if (line.matches("\"[^\"]+\"\\s*:\\s*\\{")) { + currentCategory = findCategory(defaults, extractFirstQuoted(line)); + continue; } - if (line.startsWith("\"") && line.endsWith(",")) { // value line - line = line.substring(0, line.length() - 1); - int colonIndex = line.indexOf(':'); - - String keyPart = line.substring(0, colonIndex).trim(); - String key = keyPart.replaceAll("^[\"']|[\"']$", ""); - - String valuePart = line.substring(colonIndex + 1).trim(); - String value = valuePart.replaceAll("^[\"']|[\"']$", ""); - Boolean booleanValue = null; - - if (value.equals("true") || value.equals("false")) { - booleanValue = Boolean.parseBoolean(value); - } - - Map> values = config.map().get(currentCategory); - for (String vKey : values.keySet()) { - if (vKey.equals(key)) { - CValue cValue = values.get(vKey); - if (booleanValue != null && cValue instanceof CBoolean cBoolean) { - cBoolean.set(booleanValue); - } else if (value.chars().allMatch(Character::isUpperCase) && cValue instanceof CEnum cEnum) { - cEnum.setEnumStr(value); - } - } - } + if (line.matches("\"[^\"]+\"\\s*:\\s*\\[")) { + currentMaskKey = extractFirstQuoted(line); + maskAccum.clear(); + continue; } - if (line.startsWith("\"") && line.endsWith("[")) { // mask line start - int quoteStart = line.indexOf('"'); - int quoteEnd = line.indexOf('"', quoteStart + 1); - - if (quoteStart != -1 && quoteEnd != -1) { - currentMask = line.substring(quoteStart + 1, quoteEnd); + if (currentMaskKey != null) { + if (line.equals("]")) { + if (currentCategory != null) { + applyMask(defaults, currentCategory, currentMaskKey, maskAccum); + } + currentMaskKey = null; + maskAccum.clear(); + } else if (line.startsWith("\"") && line.endsWith("\"")) { + maskAccum.add(line.substring(1, line.length() - 1)); } + continue; } - if (currentMask != null && line.startsWith("\"") && line.endsWith("\"")) { // in mask array - maskList.add(line.substring(1, line.length() - 1)); - } - - if (currentMask != null && line.equals("]")) { // mask line end - Map> values = config.map().get(currentCategory); - for (CValue cValue : values.values()) { - if (cValue.key.equals(currentMask) && cValue instanceof CMask cMask) { - cMask.setMaskStr(maskList); - String maskTypeKey = cMask.getMaskTypeKey(); - CValue maskTypeValue = values.get(maskTypeKey); - if (maskTypeValue instanceof CEnum cEnum && cEnum.getEnumClass() == MaskType.class) { - cMask.setMaskType((MaskType) cEnum.get()); - } - - currentMask = null; - maskList.clear(); - break; - } - } + if (currentCategory != null && line.matches("\"[^\"]+\"\\s*:.*")) { + int colon = line.indexOf(':'); + String key = extractFirstQuoted(line.substring(0, colon + 1)); + String rawValue = line.substring(colon + 1).trim(); + String value = rawValue.replaceAll("^\"(.*)\"$", "$1"); + applyValue(defaults, currentCategory, key, value); } } - return config; - } - private static CMap parseToml(String toml, CMap config) { - String clearJson = clearToml(toml); - String[] lines = clearJson.split("\n"); + return defaults; + } - CCategory currentCategory = null; - String currentMask = null; - List maskList = new ArrayList<>(); + private static List stripJson5Comments(String raw) { + List result = new ArrayList<>(); - for (String line : lines) { - if (line.startsWith("[") && line.endsWith("]")) { // category line - String categoryId = line.substring(1, line.length() - 1); + for (String line : raw.split("\n")) { + boolean inQuotes = false; + StringBuilder clean = new StringBuilder(); + line = line.trim(); - for (CCategory category : config.map().keySet()) { - if (category.id().equals(categoryId)) { - currentCategory = category; - break; - } - } + for (int i = 0; i < line.length(); i++) { + char c = line.charAt(i); + if (c == '"') inQuotes = !inQuotes; + if (!inQuotes && c == '/' && i + 1 < line.length() && line.charAt(i + 1) == '/') break; + clean.append(c); } - if (line.matches("[A-Za-z]+ = [A-Za-z]+")) { // value line - int equalsIndex = line.indexOf('='); - - String key = line.substring(0, equalsIndex).trim(); + String trimmed = clean.toString().trim(); + if (trimmed.endsWith(",")) trimmed = trimmed.substring(0, trimmed.length() - 1).trim(); + if (trimmed.isEmpty() || trimmed.equals("{") || trimmed.equals("}")) continue; - String valuePart = line.substring(equalsIndex + 1).trim(); - String value = valuePart.replaceAll("^[\"']|[\"']$", ""); + result.add(trimmed); + } - Boolean booleanValue = null; + return result; + } - if (value.equals("true") || value.equals("false")) { - booleanValue = Boolean.parseBoolean(value); - } + private static CMap parseToml(String raw, CMap defaults) { + List lines = stripTomlComments(raw); + CCategory currentCategory = null; - Map> values = config.map().get(currentCategory); - for (String vKey : values.keySet()) { - if (vKey.equals(key)) { - CValue cValue = values.get(vKey); - if (booleanValue != null && cValue instanceof CBoolean cBoolean) { - cBoolean.set(booleanValue); - } else if (value.chars().allMatch(Character::isUpperCase) && cValue instanceof CEnum cEnum) { - cEnum.setEnumStr(value); - } - } - } + for (String line : lines) { + if (line.matches("\\[[^\\[\\]]+\\]")) { + String id = line.substring(1, line.length() - 1).trim(); + currentCategory = findCategory(defaults, id); + continue; } - if (!line.startsWith("\"\"\"") && line.endsWith("\"\"\"")) { // mask line start - currentMask = line.split("=", 2)[0].trim(); - } + if (currentCategory == null) continue; - if (currentMask != null) { // in mask array - maskList.add(line); - } + int eq = line.indexOf('='); + if (eq < 1) continue; - if (currentMask != null && line.equals("\"\"\"")) { // mask line end - Map> values = config.map().get(currentCategory); - for (CValue cValue : values.values()) { - if (cValue.key.equals(currentMask) && cValue instanceof CMask cMask) { - cMask.setMaskStr(maskList); - String maskTypeKey = cMask.getMaskTypeKey(); - CValue maskTypeValue = values.get(maskTypeKey); - if (maskTypeValue instanceof CEnum cEnum && cEnum.getEnumClass() == MaskType.class) { - cMask.setMaskType((MaskType) cEnum.get()); - } - - currentMask = null; - maskList.clear(); - break; - } + String key = line.substring(0, eq).trim(); + String rawValue = line.substring(eq + 1).trim(); + + if (rawValue.startsWith("[") && rawValue.endsWith("]")) { + String inner = rawValue.substring(1, rawValue.length() - 1); + List items = new ArrayList<>(); + for (String item : inner.split(",")) { + String clean = item.trim().replaceAll("^\"(.*)\"$", "$1"); + if (!clean.isEmpty()) items.add(clean); } + applyMask(defaults, currentCategory, key, items); + continue; } + + String value = rawValue.replaceAll("^\"(.*)\"$", "$1"); + applyValue(defaults, currentCategory, key, value); } - return config; + return defaults; } - private static String clearJson(String json) { - String[] lines = json.split("\n"); - StringBuilder builder = new StringBuilder(); + private static List stripTomlComments(String raw) { + List result = new ArrayList<>(); - for (String line : lines) { + for (String line : raw.split("\n")) { boolean inQuotes = false; - StringBuilder cleanLine = new StringBuilder(); - - line = line.trim(); - if (line.endsWith(",")) line = line.substring(0, line.length() - 1); - if (line.isEmpty()) continue; - if (line.equals("{") || line.equals("}")) continue; + int cutAt = -1; for (int i = 0; i < line.length(); i++) { char c = line.charAt(i); - - if (c == '"' || c == '\'') { - inQuotes = !inQuotes; - } - - if (!inQuotes && c == '/' && i + 1 < line.length() && line.charAt(i + 1) == '/') { - break; - } - - cleanLine.append(c); + if (c == '"') inQuotes = !inQuotes; + if (!inQuotes && c == '#') { cutAt = i; break; } } - String trimmed = cleanLine.toString().trim(); - if (!trimmed.isEmpty()) { - builder.append(trimmed).append('\n'); - } + String trimmed = (cutAt >= 0 ? line.substring(0, cutAt) : line).trim(); + if (!trimmed.isEmpty()) result.add(trimmed); } - return builder.toString(); + return result; } - private static String clearToml(String toml) { - String[] lines = toml.split("\n"); - StringBuilder builder = new StringBuilder(); + private static Path configPath(String fileName, Format format) { + return FabricLoader.getInstance().getConfigDir() + .toAbsolutePath() + .resolve(fileName + format.extension()); + } - for (String line : lines) { - boolean inQuotes = false; - int cutIndex = -1; + private static String extractFirstQuoted(String segment) { + int start = segment.indexOf('"'); + if (start < 0) return ""; + int end = segment.indexOf('"', start + 1); + if (end < 0) return ""; + return segment.substring(start + 1, end); + } - for (int i = 0; i < line.length(); i++) { - char c = line.charAt(i); + private static CCategory findCategory(CMap config, String id) { + for (CCategory cat : config.map().keySet()) { + if (cat.id().equals(id)) return cat; + } + return null; + } - if (c == '"') { - inQuotes = !inQuotes; - } else if (c == '#' && !inQuotes) { - cutIndex = i; - break; - } - } + private static void applyValue(CMap config, CCategory category, String key, String value) { + Map> values = config.map().get(category); + if (values == null) return; - String cleaned = (cutIndex != -1) - ? line.substring(0, cutIndex).trim() - : line.trim(); + CValue target = values.get(key); + if (target == null) return; - if (!cleaned.isEmpty()) { - builder.append(cleaned).append('\n'); + if (target instanceof CBoolean cBoolean) { + if (value.equals("true") || value.equals("false")) { + cBoolean.set(Boolean.parseBoolean(value)); } + } else if (target instanceof CEnum cEnum) { + cEnum.setEnumStr(value.toUpperCase()); + } + } + + private static void applyMask(CMap config, CCategory category, String key, List items) { + Map> values = config.map().get(category); + if (values == null) return; + + CValue target = values.get(key); + if (!(target instanceof CMask cMask)) return; + + cMask.setMaskStr(new ArrayList<>(items)); + + String maskTypeKey = cMask.getMaskTypeKey(); + CValue maskTypeValue = values.get(maskTypeKey); + if (maskTypeValue instanceof CEnum cEnum && cEnum.getEnumClass() == MaskType.class) { + cMask.setMaskType((MaskType) cEnum.get()); } + } - return builder.toString(); + private static String enumOptions(CEnum cEnum) { + StringBuilder sb = new StringBuilder(); + Enum[] constants = cEnum.getEnumClass().getEnumConstants(); + for (int i = 0; i < constants.length; i++) { + sb.append(constants[i].name()); + if (i < constants.length - 1) sb.append(" / "); + } + return sb.toString(); } } \ No newline at end of file diff --git a/src/main/java/net/snackbag/tt20/config/rework/types/CBoolean.java b/src/main/java/net/snackbag/tt20/config/rework/types/CBoolean.java index 3d20708..a4f293a 100644 --- a/src/main/java/net/snackbag/tt20/config/rework/types/CBoolean.java +++ b/src/main/java/net/snackbag/tt20/config/rework/types/CBoolean.java @@ -11,6 +11,10 @@ public CBoolean(String key, String comment, boolean value) { this.defaultValue = value; } + public void toggle() { + this.value = !value; + } + @Override public Boolean get() { return value; From a896b93f0b16b512edf571167787ce69680f3d23 Mon Sep 17 00:00:00 2001 From: lemonnik Date: Thu, 30 Apr 2026 15:06:58 +0200 Subject: [PATCH 26/39] move packages, remove old config, fix logging --- src/main/java/net/snackbag/tt20/TT20.java | 6 +- .../tt20/config/BlockEntityMaskConfig.java | 44 --- .../tt20/config/JSONConfiguration.java | 275 ------------------ .../net/snackbag/tt20/config/MainConfig.java | 172 ----------- .../tt20/config/{impl => }/TT20Config.java | 16 +- .../tt20/config/{rework => lib}/CConfig.java | 8 +- .../config/{rework => lib}/CExporter.java | 29 +- .../{rework => lib}/types/CBoolean.java | 2 +- .../config/{rework => lib}/types/CEnum.java | 2 +- .../config/{rework => lib}/types/CMask.java | 8 +- .../config/{rework => lib}/types/CValue.java | 2 +- .../{rework => lib}/utils/CCategory.java | 2 +- .../config/{rework => lib}/utils/CMap.java | 4 +- .../config/{rework => lib}/utils/Mask.java | 10 +- .../{rework => lib}/utils/MaskType.java | 2 +- .../{rework => lib}/utils/RegistryIndex.java | 2 +- 16 files changed, 46 insertions(+), 538 deletions(-) delete mode 100644 src/main/java/net/snackbag/tt20/config/BlockEntityMaskConfig.java delete mode 100644 src/main/java/net/snackbag/tt20/config/JSONConfiguration.java delete mode 100644 src/main/java/net/snackbag/tt20/config/MainConfig.java rename src/main/java/net/snackbag/tt20/config/{impl => }/TT20Config.java (90%) rename src/main/java/net/snackbag/tt20/config/{rework => lib}/CConfig.java (88%) rename src/main/java/net/snackbag/tt20/config/{rework => lib}/CExporter.java (94%) rename src/main/java/net/snackbag/tt20/config/{rework => lib}/types/CBoolean.java (92%) rename src/main/java/net/snackbag/tt20/config/{rework => lib}/types/CEnum.java (95%) rename src/main/java/net/snackbag/tt20/config/{rework => lib}/types/CMask.java (89%) rename src/main/java/net/snackbag/tt20/config/{rework => lib}/types/CValue.java (87%) rename src/main/java/net/snackbag/tt20/config/{rework => lib}/utils/CCategory.java (94%) rename src/main/java/net/snackbag/tt20/config/{rework => lib}/utils/CMap.java (66%) rename src/main/java/net/snackbag/tt20/config/{rework => lib}/utils/Mask.java (84%) rename src/main/java/net/snackbag/tt20/config/{rework => lib}/utils/MaskType.java (88%) rename src/main/java/net/snackbag/tt20/config/{rework => lib}/utils/RegistryIndex.java (98%) diff --git a/src/main/java/net/snackbag/tt20/TT20.java b/src/main/java/net/snackbag/tt20/TT20.java index c506c60..ad8ae44 100644 --- a/src/main/java/net/snackbag/tt20/TT20.java +++ b/src/main/java/net/snackbag/tt20/TT20.java @@ -3,9 +3,7 @@ import net.fabricmc.api.ModInitializer; import net.snackbag.tt20.command.CommandRegistry; -import net.snackbag.tt20.config.BlockEntityMaskConfig; -import net.snackbag.tt20.config.MainConfig; -import net.snackbag.tt20.config.impl.TT20Config; +import net.snackbag.tt20.config.TT20Config; import net.snackbag.tt20.util.TPSCalculator; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -17,9 +15,7 @@ public class TT20 implements ModInitializer { public static final Logger LOGGER = LoggerFactory.getLogger(MOD_ID); public static final String VERSION = "0.7.1"; public static final TPSCalculator TPS_CALCULATOR = new TPSCalculator(); - public static final MainConfig config = new MainConfig(); public static final TT20Config Config = new TT20Config(); - public static final BlockEntityMaskConfig blockEntityMaskConfig = new BlockEntityMaskConfig(); public static boolean warned = false; diff --git a/src/main/java/net/snackbag/tt20/config/BlockEntityMaskConfig.java b/src/main/java/net/snackbag/tt20/config/BlockEntityMaskConfig.java deleted file mode 100644 index 3790475..0000000 --- a/src/main/java/net/snackbag/tt20/config/BlockEntityMaskConfig.java +++ /dev/null @@ -1,44 +0,0 @@ -package net.snackbag.tt20.config; - -//? if >=1.20.1 { -import net.minecraft.registry.Registries; -import net.snackbag.tt20.config.rework.utils.Mask; - -//?} else { -/*import net.minecraft.util.registry.Registry; -*///?} -public class BlockEntityMaskConfig extends JSONConfiguration { - private Mask mask; - private boolean reloaded = false; - - public BlockEntityMaskConfig() { - super("block_entity_mask.json"); - - String[] defaultMask = {"*:*"}; - - putIfEmpty("type", "whitelist"); - putIfEmpty("blocks", defaultMask); - - save(); - reload(); - } - - public Mask getMask() { - return mask; - } - - @Override - public void reload() { - super.reload(); - - if (reloaded) { - //? if >=1.20.1 { - //this.mask = new Mask(Registries.BLOCK, this, "blocks"); - //?} else { - /*this.mask = new Mask(Registry.BLOCK, this, "blocks"); - *///?} - } else { - reloaded = true; - } - } -} diff --git a/src/main/java/net/snackbag/tt20/config/JSONConfiguration.java b/src/main/java/net/snackbag/tt20/config/JSONConfiguration.java deleted file mode 100644 index 19f520a..0000000 --- a/src/main/java/net/snackbag/tt20/config/JSONConfiguration.java +++ /dev/null @@ -1,275 +0,0 @@ -package net.snackbag.tt20.config; - -import com.google.gson.*; -import net.fabricmc.loader.api.FabricLoader; -import net.snackbag.tt20.TT20; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.io.*; -import java.util.*; - -public class JSONConfiguration { - private final String fileName; - - private JsonObject json; - private final Gson gson; - - public JSONConfiguration(String fileName) { - this.fileName = fileName; - this.gson = new GsonBuilder().setPrettyPrinting().create(); - - // load file into configuration - reload(); - } - - public void save() { - try { - File file = new File(getAbsolutePath() + fileName); - file.getParentFile().mkdirs(); - file.createNewFile(); - - FileWriter writer = new FileWriter(file); - writer.write(gson.toJson(json)); - writer.close(); - - reload(); - } catch (IOException e) { - TT20.LOGGER.error("(TT20) Failed to save JSONConfiguration '" + fileName + "'"); - e.printStackTrace(); - return; - } - } - - public void reload() { - try { - File file = new File(getAbsolutePath() + fileName); - file.getParentFile().mkdirs(); - - // if the file didn't exist before - if (file.createNewFile()) { - FileWriter writer = new FileWriter(file); - writer.write("{}"); - writer.close(); - } - - BufferedReader reader = new BufferedReader(new FileReader(getAbsolutePath() + fileName)); - json = gson.fromJson(reader, JsonObject.class); - } catch (IOException e) { - TT20.LOGGER.error("(TT20) Failed to reload JSONConfiguration '" + fileName + "'"); - e.printStackTrace(); - } - } - - public boolean has(String key) { - // Create a deep copy of the json object - JsonElement element = gson.fromJson(json.toString(), JsonElement.class); - - for (String part : splitKey(key)) { - if (element == null || !element.getAsJsonObject().has(part)) { - return false; - } - element = element.getAsJsonObject().get(part); - } - return element != null; - } - - private @Nullable Object[] preparePut(String key, @Nullable Object value) { - String[] parts = splitKey(key); - JsonObject current = json; - - for (int i = 0; i < parts.length - 1; i++) { - String part = parts[i]; - - if (!current.has(part) || !current.get(part).isJsonObject()) { - current.add(part, new JsonObject()); - } - - current = current.getAsJsonObject(part); - } - - if (value == null) { - current.remove(parts[parts.length - 1]); - return null; - } - - return new Object[]{current, parts[parts.length - 1]}; - } - - public void put(String key, @Nullable String value) { - Object[] values = preparePut(key, value); - if (values == null) return; - - JsonObject current = (JsonObject) values[0]; - current.addProperty((String) values[1], value); - } - - public void put(String key, @Nullable Object[] value) { - Object[] values = preparePut(key, value); - if (values == null) return; - - JsonObject current = (JsonObject) values[0]; - - JsonArray array = new JsonArray(); - for (Object object : value) { - if (object instanceof String) { - array.add((String) object); - } else if (object instanceof Boolean) { - array.add((Boolean) object); - } else if (object instanceof Number) { - array.add((Number) object); - } else { - throw new IllegalArgumentException("Unsupported object type: " + object.getClass().getName()); - } - } - - current.add((String) values[1], array); - } - - public void put(String key, @Nullable Boolean value) { - Object[] values = preparePut(key, value); - if (values == null) return; - - JsonObject current = (JsonObject) values[0]; - current.addProperty((String) values[1], value); - } - - public void putIfEmpty(String key, @NotNull String value) { - Objects.requireNonNull(value); - - if (!has(key)) { - put(key, value); - } - } - - public void putIfEmpty(String key, @NotNull Object[] value) { - Objects.requireNonNull(value); - - if (!has(key)) { - put(key, value); - } - } - - public void putIfEmpty(String key, @NotNull Boolean value) { - Objects.requireNonNull(value); - - if (!has(key)) { - put(key, value); - } - } - - public String getAsString(String key) { - JsonElement element = json; - - for (String part : splitKey(key)) { - if (element == null || !element.getAsJsonObject().has(part)) { - return null; - } - element = element.getAsJsonObject().get(part); - } - - return element != null && element.isJsonPrimitive() && element.getAsJsonPrimitive().isString() - ? element.getAsString() - : null; - } - - public Boolean getAsBoolean(String key) { - JsonElement element = json; - - for (String part : splitKey(key)) { - if (element == null || !element.getAsJsonObject().has(part)) { - return null; - } - element = element.getAsJsonObject().get(part); - } - - return element != null && element.isJsonPrimitive() && element.getAsJsonPrimitive().isBoolean() - ? element.getAsBoolean() - : null; - } - - public JsonArray getAsArray(String key) { - JsonElement element = json; - - for (String part : splitKey(key)) { - if (element == null || !element.getAsJsonObject().has(part)) { - return null; - } - element = element.getAsJsonObject().get(part); - } - - return element != null && element.isJsonArray() - ? element.getAsJsonArray() - : null; - } - - public String getAsStringOrDefault(String key, String def) { - if (!has(key)) { - return def; - } - return getAsString(key); - } - - public Boolean getAsBooleanOrDefault(String key, Boolean def) { - if (!has(key)) { - return def; - } - return getAsBoolean(key); - } - - public String getFileName() { - return fileName; - } - - public String[] keys(String key) { - // If the key is empty, return all string keys in the root JSON object - if (key.isEmpty()) { - Set keys = new HashSet<>(); - collectStringKeys(json, "", keys); - return keys.toArray(new String[0]); - } - - // Traverse the JSON structure to the specified key - JsonElement element = json; - for (String part : splitKey(key)) { - if (element == null || !element.getAsJsonObject().has(part)) { - return new String[0]; - } - element = element.getAsJsonObject().get(part); - } - - // If the element is a JSON object, collect its string keys - if (element != null && element.isJsonObject()) { - Set keys = new HashSet<>(); - collectStringKeys(element.getAsJsonObject(), "", keys); - return keys.toArray(new String[0]); - } else { - return new String[0]; - } - } - - public String[] keys() { - return keys(""); - } - - public String[] splitKey(String key) { - return key.split("\\."); - } - - public String getAbsolutePath() { - return FabricLoader.getInstance().getConfigDir().toAbsolutePath() + "/tt20/"; - } - - private void collectStringKeys(JsonObject jsonObject, String prefix, Set keys) { - for (String key : jsonObject.keySet()) { - JsonElement element = jsonObject.get(key); - String fullKey = prefix.isEmpty() ? key : prefix + "." + key; - - if (element.isJsonPrimitive() && element.getAsJsonPrimitive().isString()) { - keys.add(fullKey); - } else if (element.isJsonObject()) { - collectStringKeys(element.getAsJsonObject(), fullKey, keys); - } - } - } -} \ No newline at end of file diff --git a/src/main/java/net/snackbag/tt20/config/MainConfig.java b/src/main/java/net/snackbag/tt20/config/MainConfig.java deleted file mode 100644 index 6713173..0000000 --- a/src/main/java/net/snackbag/tt20/config/MainConfig.java +++ /dev/null @@ -1,172 +0,0 @@ -package net.snackbag.tt20.config; - -public class MainConfig extends JSONConfiguration { - private boolean enabled = true; - private boolean blockEntityAcceleration = false; - private boolean blockBreakingAcceleration = true; - private boolean eatingAcceleration = true; - private boolean potionEffectAcceleration = true; - private boolean fluidAcceleration = true; - private boolean pickupAcceleration = true; - private boolean portalAcceleration = true; - private boolean sleepingAcceleration = true; - private boolean timeAcceleration = true; - private boolean randomTickSpeedAcceleration = true; - private boolean serverWatchdog = true; - - private boolean singlePlayerWarning = true; - private boolean automaticUpdater = true; - - public MainConfig() { - super("config.json"); - - putIfEmpty("enabled", enabled); - putIfEmpty("block-entity-acceleration", blockEntityAcceleration); - putIfEmpty("block-breaking-acceleration", blockBreakingAcceleration); - putIfEmpty("potion-effect-acceleration", potionEffectAcceleration); - putIfEmpty("fluid-acceleration", fluidAcceleration); - putIfEmpty("pickup-acceleration", pickupAcceleration); - putIfEmpty("eating-acceleration", eatingAcceleration); - putIfEmpty("portal-acceleration", portalAcceleration); - putIfEmpty("sleeping-acceleration", sleepingAcceleration); - putIfEmpty("server-watchdog", serverWatchdog); - putIfEmpty("singleplayer-warning", singlePlayerWarning); - putIfEmpty("time-acceleration", timeAcceleration); - putIfEmpty("random-tickspeed-acceleration", randomTickSpeedAcceleration); - putIfEmpty("automatic-updater", automaticUpdater); - - save(); - } - - @Override - public void reload() { - super.reload(); - - this.enabled = getAsBooleanOrDefault("enabled", enabled); - this.blockEntityAcceleration = getAsBooleanOrDefault("block-entity-acceleration", blockEntityAcceleration); - this.blockBreakingAcceleration = getAsBooleanOrDefault("block-breaking-acceleration", blockBreakingAcceleration); - this.potionEffectAcceleration = getAsBooleanOrDefault("potion-effect-acceleration", potionEffectAcceleration); - this.fluidAcceleration = getAsBooleanOrDefault("fluid-acceleration", fluidAcceleration); - this.pickupAcceleration = getAsBooleanOrDefault("pickup-acceleration", pickupAcceleration); - this.eatingAcceleration = getAsBooleanOrDefault("eating-acceleration", eatingAcceleration); - this.portalAcceleration = getAsBooleanOrDefault("portal-acceleration", portalAcceleration); - this.sleepingAcceleration = getAsBooleanOrDefault("sleeping-acceleration", sleepingAcceleration); - this.serverWatchdog = getAsBooleanOrDefault("server-watchdog", serverWatchdog); - this.singlePlayerWarning = getAsBooleanOrDefault("singleplayer-warning", singlePlayerWarning); - this.timeAcceleration = getAsBooleanOrDefault("time-acceleration", timeAcceleration); - this.randomTickSpeedAcceleration = getAsBooleanOrDefault("random-tickspeed-acceleration", randomTickSpeedAcceleration); - this.automaticUpdater = getAsBooleanOrDefault("automatic-updater", automaticUpdater); - } - - public void enabled(boolean enabled) { - put("enabled", enabled); - } - - public boolean enabled() { - return enabled; - } - - public void serverWatchdog(boolean enabled) { - put("server-watchdog", enabled); - } - - public boolean serverWatchdog() { - return serverWatchdog; - } - - public void blockEntityAcceleration(boolean enabled) { - put("block-entity-acceleration", enabled); - } - - public boolean blockEntityAcceleration() { - return blockEntityAcceleration; - } - - public void blockBreakingAcceleration(boolean enabled) { - put("block-breaking-acceleration", enabled); - } - - public boolean blockBreakingAcceleration() { - return blockBreakingAcceleration; - } - - public void potionEffectAcceleration(boolean enabled) { - put("potion-effect-acceleration", enabled); - } - - public boolean potionEffectAcceleration() { - return potionEffectAcceleration; - } - - public void fluidAcceleration(boolean enabled) { - put("fluid-acceleration", enabled); - } - - public boolean fluidAcceleration() { - return fluidAcceleration; - } - - public void pickupAcceleration(boolean enabled) { - put("pickup-acceleration", enabled); - } - - public boolean pickupAcceleration() { - return pickupAcceleration; - } - - public void eatingAcceleration(boolean enabled) { - put("eating-acceleration", enabled); - } - - public boolean eatingAcceleration() { - return eatingAcceleration; - } - - public void portalAcceleration(boolean enabled) { - put("portal-acceleration", enabled); - } - - public boolean portalAcceleration() { - return portalAcceleration; - } - - public void sleepingAcceleration(boolean enabled) { - put("sleeping-acceleration", enabled); - } - - public boolean sleepingAcceleration() { - return sleepingAcceleration; - } - - public void automaticUpdater(boolean enabled) { - put("automatic-updater", enabled); - } - - public boolean automaticUpdater() { - return automaticUpdater; - } - - public void singlePlayerWarning(boolean enabled) { - put("singleplayer-warning", enabled); - } - - public boolean timeAcceleration() { - return timeAcceleration; - } - - public void timeAcceleration(boolean enabled) { - put("time-acceleration", enabled); - } - - public boolean randomTickSpeedAcceleration() { - return randomTickSpeedAcceleration; - } - - public void randomTickSpeedAcceleration(boolean enabled) { - put("random-tickspeed-acceleration", enabled); - } - - public boolean singlePlayerWarning() { - return singlePlayerWarning; - } -} diff --git a/src/main/java/net/snackbag/tt20/config/impl/TT20Config.java b/src/main/java/net/snackbag/tt20/config/TT20Config.java similarity index 90% rename from src/main/java/net/snackbag/tt20/config/impl/TT20Config.java rename to src/main/java/net/snackbag/tt20/config/TT20Config.java index 0f04b1c..9342613 100644 --- a/src/main/java/net/snackbag/tt20/config/impl/TT20Config.java +++ b/src/main/java/net/snackbag/tt20/config/TT20Config.java @@ -1,13 +1,13 @@ -package net.snackbag.tt20.config.impl; +package net.snackbag.tt20.config; import net.snackbag.tt20.TT20; -import net.snackbag.tt20.config.rework.CExporter; -import net.snackbag.tt20.config.rework.utils.CCategory; -import net.snackbag.tt20.config.rework.CConfig; -import net.snackbag.tt20.config.rework.types.CBoolean; -import net.snackbag.tt20.config.rework.types.CEnum; -import net.snackbag.tt20.config.rework.types.CMask; -import net.snackbag.tt20.config.rework.utils.MaskType; +import net.snackbag.tt20.config.lib.CExporter; +import net.snackbag.tt20.config.lib.utils.CCategory; +import net.snackbag.tt20.config.lib.CConfig; +import net.snackbag.tt20.config.lib.types.CBoolean; +import net.snackbag.tt20.config.lib.types.CEnum; +import net.snackbag.tt20.config.lib.types.CMask; +import net.snackbag.tt20.config.lib.utils.MaskType; import org.jetbrains.annotations.NotNull; public class TT20Config extends CConfig { diff --git a/src/main/java/net/snackbag/tt20/config/rework/CConfig.java b/src/main/java/net/snackbag/tt20/config/lib/CConfig.java similarity index 88% rename from src/main/java/net/snackbag/tt20/config/rework/CConfig.java rename to src/main/java/net/snackbag/tt20/config/lib/CConfig.java index 9850551..cb80d5d 100644 --- a/src/main/java/net/snackbag/tt20/config/rework/CConfig.java +++ b/src/main/java/net/snackbag/tt20/config/lib/CConfig.java @@ -1,8 +1,8 @@ -package net.snackbag.tt20.config.rework; +package net.snackbag.tt20.config.lib; -import net.snackbag.tt20.config.rework.types.CValue; -import net.snackbag.tt20.config.rework.utils.CCategory; -import net.snackbag.tt20.config.rework.utils.CMap; +import net.snackbag.tt20.config.lib.types.CValue; +import net.snackbag.tt20.config.lib.utils.CCategory; +import net.snackbag.tt20.config.lib.utils.CMap; import org.jetbrains.annotations.NotNull; import java.util.LinkedHashMap; diff --git a/src/main/java/net/snackbag/tt20/config/rework/CExporter.java b/src/main/java/net/snackbag/tt20/config/lib/CExporter.java similarity index 94% rename from src/main/java/net/snackbag/tt20/config/rework/CExporter.java rename to src/main/java/net/snackbag/tt20/config/lib/CExporter.java index fde7c91..8f4b50e 100644 --- a/src/main/java/net/snackbag/tt20/config/rework/CExporter.java +++ b/src/main/java/net/snackbag/tt20/config/lib/CExporter.java @@ -1,13 +1,13 @@ -package net.snackbag.tt20.config.rework; +package net.snackbag.tt20.config.lib; import net.fabricmc.loader.api.FabricLoader; -import net.snackbag.tt20.config.rework.types.CBoolean; -import net.snackbag.tt20.config.rework.types.CEnum; -import net.snackbag.tt20.config.rework.types.CMask; -import net.snackbag.tt20.config.rework.types.CValue; -import net.snackbag.tt20.config.rework.utils.CCategory; -import net.snackbag.tt20.config.rework.utils.CMap; -import net.snackbag.tt20.config.rework.utils.MaskType; +import net.snackbag.tt20.config.lib.types.CBoolean; +import net.snackbag.tt20.config.lib.types.CEnum; +import net.snackbag.tt20.config.lib.types.CMask; +import net.snackbag.tt20.config.lib.types.CValue; +import net.snackbag.tt20.config.lib.utils.CCategory; +import net.snackbag.tt20.config.lib.utils.CMap; +import net.snackbag.tt20.config.lib.utils.MaskType; import java.io.IOException; import java.nio.file.Files; @@ -15,11 +15,10 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; -import java.util.logging.Logger; -public class CExporter { - private static final Logger LOGGER = Logger.getLogger("TT20/Config"); +import static net.snackbag.tt20.TT20.LOGGER; +public class CExporter { public enum Format { JSON5(".json5"), TOML(".toml"); @@ -51,7 +50,7 @@ public static CMap load(CMap defaults, String fileName, Format format) { case TOML -> parseToml(content, defaults); }; } catch (IOException e) { - LOGGER.warning("Failed to read config " + path.getFileName() + ": " + e.getMessage()); + LOGGER.warn("Failed to read config " + path.getFileName() + ": " + e.getMessage()); return defaults; } } @@ -62,7 +61,8 @@ public static boolean save(CMap config, String fileName, Format format) { try { Files.createDirectories(path.getParent()); } catch (IOException e) { - LOGGER.warning("Failed to create config directory: " + e.getMessage()); + LOGGER.warn("Failed to create config directory: {}", e.getMessage()); + e.printStackTrace(); return false; } @@ -75,7 +75,8 @@ public static boolean save(CMap config, String fileName, Format format) { Files.writeString(path, content); return true; } catch (IOException e) { - LOGGER.warning("Failed to write config " + path.getFileName() + ": " + e.getMessage()); + LOGGER.warn("Failed to write config {}: {}", path.getFileName(), e.getMessage()); + e.printStackTrace(); return false; } } diff --git a/src/main/java/net/snackbag/tt20/config/rework/types/CBoolean.java b/src/main/java/net/snackbag/tt20/config/lib/types/CBoolean.java similarity index 92% rename from src/main/java/net/snackbag/tt20/config/rework/types/CBoolean.java rename to src/main/java/net/snackbag/tt20/config/lib/types/CBoolean.java index a4f293a..fce9fc3 100644 --- a/src/main/java/net/snackbag/tt20/config/rework/types/CBoolean.java +++ b/src/main/java/net/snackbag/tt20/config/lib/types/CBoolean.java @@ -1,4 +1,4 @@ -package net.snackbag.tt20.config.rework.types; +package net.snackbag.tt20.config.lib.types; public class CBoolean extends CValue { private final boolean defaultValue; diff --git a/src/main/java/net/snackbag/tt20/config/rework/types/CEnum.java b/src/main/java/net/snackbag/tt20/config/lib/types/CEnum.java similarity index 95% rename from src/main/java/net/snackbag/tt20/config/rework/types/CEnum.java rename to src/main/java/net/snackbag/tt20/config/lib/types/CEnum.java index 0811617..6a8cda9 100644 --- a/src/main/java/net/snackbag/tt20/config/rework/types/CEnum.java +++ b/src/main/java/net/snackbag/tt20/config/lib/types/CEnum.java @@ -1,4 +1,4 @@ -package net.snackbag.tt20.config.rework.types; +package net.snackbag.tt20.config.lib.types; import java.util.Arrays; diff --git a/src/main/java/net/snackbag/tt20/config/rework/types/CMask.java b/src/main/java/net/snackbag/tt20/config/lib/types/CMask.java similarity index 89% rename from src/main/java/net/snackbag/tt20/config/rework/types/CMask.java rename to src/main/java/net/snackbag/tt20/config/lib/types/CMask.java index 08835f1..6a1b06c 100644 --- a/src/main/java/net/snackbag/tt20/config/rework/types/CMask.java +++ b/src/main/java/net/snackbag/tt20/config/lib/types/CMask.java @@ -1,9 +1,9 @@ -package net.snackbag.tt20.config.rework.types; +package net.snackbag.tt20.config.lib.types; import net.minecraft.registry.Registries; -import net.snackbag.tt20.config.rework.CConfig; -import net.snackbag.tt20.config.rework.utils.Mask; -import net.snackbag.tt20.config.rework.utils.MaskType; +import net.snackbag.tt20.config.lib.CConfig; +import net.snackbag.tt20.config.lib.utils.Mask; +import net.snackbag.tt20.config.lib.utils.MaskType; import java.util.List; diff --git a/src/main/java/net/snackbag/tt20/config/rework/types/CValue.java b/src/main/java/net/snackbag/tt20/config/lib/types/CValue.java similarity index 87% rename from src/main/java/net/snackbag/tt20/config/rework/types/CValue.java rename to src/main/java/net/snackbag/tt20/config/lib/types/CValue.java index ad09a99..3590cbd 100644 --- a/src/main/java/net/snackbag/tt20/config/rework/types/CValue.java +++ b/src/main/java/net/snackbag/tt20/config/lib/types/CValue.java @@ -1,4 +1,4 @@ -package net.snackbag.tt20.config.rework.types; +package net.snackbag.tt20.config.lib.types; public abstract class CValue { public final String key; diff --git a/src/main/java/net/snackbag/tt20/config/rework/utils/CCategory.java b/src/main/java/net/snackbag/tt20/config/lib/utils/CCategory.java similarity index 94% rename from src/main/java/net/snackbag/tt20/config/rework/utils/CCategory.java rename to src/main/java/net/snackbag/tt20/config/lib/utils/CCategory.java index 925950f..49b72c9 100644 --- a/src/main/java/net/snackbag/tt20/config/rework/utils/CCategory.java +++ b/src/main/java/net/snackbag/tt20/config/lib/utils/CCategory.java @@ -1,4 +1,4 @@ -package net.snackbag.tt20.config.rework.utils; +package net.snackbag.tt20.config.lib.utils; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/net/snackbag/tt20/config/rework/utils/CMap.java b/src/main/java/net/snackbag/tt20/config/lib/utils/CMap.java similarity index 66% rename from src/main/java/net/snackbag/tt20/config/rework/utils/CMap.java rename to src/main/java/net/snackbag/tt20/config/lib/utils/CMap.java index e540dee..0a2e7a1 100644 --- a/src/main/java/net/snackbag/tt20/config/rework/utils/CMap.java +++ b/src/main/java/net/snackbag/tt20/config/lib/utils/CMap.java @@ -1,6 +1,6 @@ -package net.snackbag.tt20.config.rework.utils; +package net.snackbag.tt20.config.lib.utils; -import net.snackbag.tt20.config.rework.types.CValue; +import net.snackbag.tt20.config.lib.types.CValue; import java.util.LinkedHashMap; import java.util.Map; diff --git a/src/main/java/net/snackbag/tt20/config/rework/utils/Mask.java b/src/main/java/net/snackbag/tt20/config/lib/utils/Mask.java similarity index 84% rename from src/main/java/net/snackbag/tt20/config/rework/utils/Mask.java rename to src/main/java/net/snackbag/tt20/config/lib/utils/Mask.java index 8b51c2d..14b9231 100644 --- a/src/main/java/net/snackbag/tt20/config/rework/utils/Mask.java +++ b/src/main/java/net/snackbag/tt20/config/lib/utils/Mask.java @@ -1,10 +1,12 @@ -package net.snackbag.tt20.config.rework.utils; +package net.snackbag.tt20.config.lib.utils; import net.minecraft.registry.Registry; import net.minecraft.util.Identifier; import java.util.*; +import static net.snackbag.tt20.TT20.LOGGER; + public class Mask { private final MaskType maskType; private final Registry registry; @@ -27,7 +29,7 @@ public List manageEntry(String entry) { String[] split = entry.split(":"); if (split.length != 2) { - System.err.println("(TT20) '" + entry + "' is not a valid identifier. Correct format is :"); + LOGGER.error("'{}' is not a valid identifier. Correct format is :", entry); return new ArrayList<>(); } @@ -40,7 +42,7 @@ public List manageEntry(String entry) { if (!split[0].equals("*") && !split[1].equals("*")) { Identifier id = Identifier.of(split[0], split[1]); if (id == null) { - System.err.println("(TT20) '" + entry + "' is not a valid identifier. Correct format is :"); + LOGGER.error("'{}' is not a valid identifier. Correct format is :", entry); return new ArrayList<>(); } List result = new ArrayList<>(1); @@ -74,7 +76,7 @@ public boolean matches(Identifier identifier) { } public boolean isOkay(Identifier identifier) { - return maskType == MaskType.WHITELIST ? entries.contains(identifier) : !entries.contains(identifier); + return (maskType == MaskType.WHITELIST) == entries.contains(identifier); } public Set getEntries() { diff --git a/src/main/java/net/snackbag/tt20/config/rework/utils/MaskType.java b/src/main/java/net/snackbag/tt20/config/lib/utils/MaskType.java similarity index 88% rename from src/main/java/net/snackbag/tt20/config/rework/utils/MaskType.java rename to src/main/java/net/snackbag/tt20/config/lib/utils/MaskType.java index 8b8b849..8e3871a 100644 --- a/src/main/java/net/snackbag/tt20/config/rework/utils/MaskType.java +++ b/src/main/java/net/snackbag/tt20/config/lib/utils/MaskType.java @@ -1,4 +1,4 @@ -package net.snackbag.tt20.config.rework.utils; +package net.snackbag.tt20.config.lib.utils; public enum MaskType { WHITELIST, diff --git a/src/main/java/net/snackbag/tt20/config/rework/utils/RegistryIndex.java b/src/main/java/net/snackbag/tt20/config/lib/utils/RegistryIndex.java similarity index 98% rename from src/main/java/net/snackbag/tt20/config/rework/utils/RegistryIndex.java rename to src/main/java/net/snackbag/tt20/config/lib/utils/RegistryIndex.java index 3c9bda8..069fd93 100644 --- a/src/main/java/net/snackbag/tt20/config/rework/utils/RegistryIndex.java +++ b/src/main/java/net/snackbag/tt20/config/lib/utils/RegistryIndex.java @@ -1,4 +1,4 @@ -package net.snackbag.tt20.config.rework.utils; +package net.snackbag.tt20.config.lib.utils; //? if >=26.1 { /*import net.minecraft.core.Registry; From 149c0947c2706f4970d3c839fca0c263f787a901 Mon Sep 17 00:00:00 2001 From: lemonnik Date: Sun, 31 May 2026 23:38:46 +0200 Subject: [PATCH 27/39] sync config --- src/main/java/net/snackbag/tt20/config/TT20Config.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/net/snackbag/tt20/config/TT20Config.java b/src/main/java/net/snackbag/tt20/config/TT20Config.java index 9342613..1a9314c 100644 --- a/src/main/java/net/snackbag/tt20/config/TT20Config.java +++ b/src/main/java/net/snackbag/tt20/config/TT20Config.java @@ -24,7 +24,7 @@ public class TT20Config extends CConfig { private static final CCategory MAIN = CCategory.of("main", "Main TT20 configuration"); public final CBoolean enabled = register(MAIN, new CBoolean("enabled", "Controls if TT20 is accelerating anything", true)); - public final CBoolean blockEntity = register(MAIN, new CBoolean("blockEntity", "ex. furnace work speed, this requires Block Entity Mask to be set up! (causes more lag otherwise)", false)); + public final CBoolean blockEntity = register(MAIN, new CBoolean("blockEntity", "ex. furnace work speed, this requires Block Entity Mask to be set up! (causes more lag otherwise)",false)); public final CBoolean blockBreaking = register(MAIN, new CBoolean("blockBreaking", "block breaking acceleration", true)); public final CBoolean eating = register(MAIN, new CBoolean("eating", "food consumption acceleration", true)); public final CBoolean potionEffect = register(MAIN, new CBoolean("potionEffect", "effect duration acceleration", true)); @@ -32,11 +32,13 @@ public class TT20Config extends CConfig { public final CBoolean pickup = register(MAIN, new CBoolean("pickup", "item pickup acceleration", true)); public final CBoolean portal = register(MAIN, new CBoolean("portal", "time in portal acceleration", true)); public final CBoolean sleeping = register(MAIN, new CBoolean("sleeping", "time laying in bed acceleration", true)); - public final CBoolean time = register(MAIN, new CBoolean("time", "daytime acceleration", true)); + public final CBoolean time = register(MAIN, new CBoolean("time", "daytime acceleration", true)); public final CBoolean randomTickSpeed = register(MAIN, new CBoolean("randomTickSpeed", "random tick speed acceleration (ex. crop growth)", true)); + public final CBoolean tnt = register(MAIN, new CBoolean("tnt", "tnt timer acceleration", false)); + public final CBoolean lagback = register(MAIN, new CBoolean("lagback", "vanilla player lagback", true)); public final CBoolean serverWatchdog = register(MAIN, new CBoolean("serverWatchdog", "server watchdog (vanilla's stop server after 1 minute of freeze behaviour)", true)); - public final CBoolean singlePlayerWarning = register(MAIN, new CBoolean("singlePlayerWarning","should show warn if loading in a singleplayer?", true)); + public final CBoolean singlePlayerWarning = register(MAIN, new CBoolean("singlePlayerWarning","should show warn if loading in a singleplayer?", true)); public final CBoolean automaticUpdater = register(MAIN, new CBoolean("automaticUpdater", "automatic update checker", true)); private static final CCategory BLOCK_ENTITY_MASK = CCategory.of("block_entity_mask", "Block Entity Mask configuration", "Only change this if you know what you're doing!"); From 5712d53e338c20e7c67d9db130b0846344f274b3 Mon Sep 17 00:00:00 2001 From: lemonnik Date: Sun, 31 May 2026 23:38:53 +0200 Subject: [PATCH 28/39] scrap exporter --- .../snackbag/tt20/config/lib/CExporter.java | 343 +----------------- 1 file changed, 3 insertions(+), 340 deletions(-) diff --git a/src/main/java/net/snackbag/tt20/config/lib/CExporter.java b/src/main/java/net/snackbag/tt20/config/lib/CExporter.java index 8f4b50e..41ddc60 100644 --- a/src/main/java/net/snackbag/tt20/config/lib/CExporter.java +++ b/src/main/java/net/snackbag/tt20/config/lib/CExporter.java @@ -1,24 +1,14 @@ package net.snackbag.tt20.config.lib; +import com.google.gson.*; import net.fabricmc.loader.api.FabricLoader; -import net.snackbag.tt20.config.lib.types.CBoolean; -import net.snackbag.tt20.config.lib.types.CEnum; -import net.snackbag.tt20.config.lib.types.CMask; -import net.snackbag.tt20.config.lib.types.CValue; -import net.snackbag.tt20.config.lib.utils.CCategory; import net.snackbag.tt20.config.lib.utils.CMap; -import net.snackbag.tt20.config.lib.utils.MaskType; -import java.io.IOException; -import java.nio.file.Files; import java.nio.file.Path; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import static net.snackbag.tt20.TT20.LOGGER; public class CExporter { + private static final Gson GSON = new Gson(); + public enum Format { JSON5(".json5"), TOML(".toml"); @@ -37,281 +27,11 @@ public String extension() { public static CMap load(CMap defaults, String fileName, Format format) { Path path = configPath(fileName, format); - if (!Files.exists(path)) { - LOGGER.info("Config file " + path.getFileName() + " not found - writing defaults."); - save(defaults, fileName, format); - return defaults; - } - - try { - String content = Files.readString(path); - return switch (format) { - case JSON5 -> parseJson5(content, defaults); - case TOML -> parseToml(content, defaults); - }; - } catch (IOException e) { - LOGGER.warn("Failed to read config " + path.getFileName() + ": " + e.getMessage()); - return defaults; - } } public static boolean save(CMap config, String fileName, Format format) { Path path = configPath(fileName, format); - try { - Files.createDirectories(path.getParent()); - } catch (IOException e) { - LOGGER.warn("Failed to create config directory: {}", e.getMessage()); - e.printStackTrace(); - return false; - } - - String content = switch (format) { - case JSON5 -> serializeJson5(config); - case TOML -> serializeToml(config); - }; - - try { - Files.writeString(path, content); - return true; - } catch (IOException e) { - LOGGER.warn("Failed to write config {}: {}", path.getFileName(), e.getMessage()); - e.printStackTrace(); - return false; - } - } - - private static String serializeJson5(CMap config) { - StringBuilder sb = new StringBuilder(); - sb.append("{\n"); - - List categories = new ArrayList<>(config.map().keySet()); - for (int ci = 0; ci < categories.size(); ci++) { - CCategory category = categories.get(ci); - boolean lastCategory = (ci == categories.size() - 1); - - for (String desc : category.description()) { - sb.append(" // ").append(desc).append("\n"); - } - - sb.append(" \"").append(category.id()).append("\": {\n"); - - List>> entries = - new ArrayList<>(config.map().get(category).entrySet()); - - for (int vi = 0; vi < entries.size(); vi++) { - boolean lastValue = (vi == entries.size() - 1); - appendJson5Value(sb, entries.get(vi).getKey(), entries.get(vi).getValue(), lastValue); - } - - sb.append(" }"); - if (!lastCategory) sb.append(","); - sb.append("\n"); - } - - sb.append("}\n"); - return sb.toString(); - } - - private static void appendJson5Value(StringBuilder sb, String key, CValue value, boolean last) { - String comma = last ? "" : ","; - - if (value instanceof CBoolean cBoolean) { - sb.append(" \"").append(key).append("\": ") - .append(cBoolean.get()) - .append(comma) - .append(" // ").append(value.comment) - .append("\n"); - - } else if (value instanceof CEnum cEnum) { - sb.append(" \"").append(key).append("\": ") - .append("\"").append(cEnum.get().name()).append("\"") - .append(comma) - .append(" // ").append(value.comment) - .append(" [").append(enumOptions(cEnum)).append("]") - .append("\n"); - - } else if (value instanceof CMask cMask) { - sb.append(" \"").append(key).append("\": [ // ").append(value.comment).append("\n"); - List masks = List.of(cMask.getMaskStr()); - for (int i = 0; i < masks.size(); i++) { - sb.append(" \"").append(masks.get(i)).append("\""); - if (i < masks.size() - 1) sb.append(","); - sb.append("\n"); - } - sb.append(" ]").append(comma).append("\n"); - } - } - - private static String serializeToml(CMap config) { - StringBuilder sb = new StringBuilder(); - - for (CCategory category : config.map().keySet()) { - for (String desc : category.description()) { - sb.append("# ").append(desc).append("\n"); - } - sb.append("[").append(category.id()).append("]\n"); - - for (Map.Entry> entry : config.map().get(category).entrySet()) { - appendTomlValue(sb, entry.getKey(), entry.getValue()); - } - - sb.append("\n"); - } - - return sb.toString(); - } - - private static void appendTomlValue(StringBuilder sb, String key, CValue value) { - if (value instanceof CBoolean cBoolean) { - sb.append(key).append(" = ") - .append(cBoolean.get()) - .append(" # ").append(value.comment) - .append("\n"); - - } else if (value instanceof CEnum cEnum) { - sb.append(key).append(" = ") - .append("\"").append(cEnum.get().name()).append("\"") - .append(" # ").append(value.comment) - .append(" [").append(enumOptions(cEnum)).append("]") - .append("\n"); - - } else if (value instanceof CMask cMask) { - sb.append("# ").append(value.comment).append("\n"); - sb.append(key).append(" = ["); - List masks = List.of(cMask.getMaskStr()); - for (int i = 0; i < masks.size(); i++) { - sb.append("\"").append(masks.get(i)).append("\""); - if (i < masks.size() - 1) sb.append(", "); - } - sb.append("]\n"); - } - } - - private static CMap parseJson5(String raw, CMap defaults) { - List lines = stripJson5Comments(raw); - - CCategory currentCategory = null; - String currentMaskKey = null; - List maskAccum = new ArrayList<>(); - - for (String line : lines) { - if (line.matches("\"[^\"]+\"\\s*:\\s*\\{")) { - currentCategory = findCategory(defaults, extractFirstQuoted(line)); - continue; - } - - if (line.matches("\"[^\"]+\"\\s*:\\s*\\[")) { - currentMaskKey = extractFirstQuoted(line); - maskAccum.clear(); - continue; - } - - if (currentMaskKey != null) { - if (line.equals("]")) { - if (currentCategory != null) { - applyMask(defaults, currentCategory, currentMaskKey, maskAccum); - } - currentMaskKey = null; - maskAccum.clear(); - } else if (line.startsWith("\"") && line.endsWith("\"")) { - maskAccum.add(line.substring(1, line.length() - 1)); - } - continue; - } - - if (currentCategory != null && line.matches("\"[^\"]+\"\\s*:.*")) { - int colon = line.indexOf(':'); - String key = extractFirstQuoted(line.substring(0, colon + 1)); - String rawValue = line.substring(colon + 1).trim(); - String value = rawValue.replaceAll("^\"(.*)\"$", "$1"); - applyValue(defaults, currentCategory, key, value); - } - } - - return defaults; - } - - private static List stripJson5Comments(String raw) { - List result = new ArrayList<>(); - - for (String line : raw.split("\n")) { - boolean inQuotes = false; - StringBuilder clean = new StringBuilder(); - line = line.trim(); - - for (int i = 0; i < line.length(); i++) { - char c = line.charAt(i); - if (c == '"') inQuotes = !inQuotes; - if (!inQuotes && c == '/' && i + 1 < line.length() && line.charAt(i + 1) == '/') break; - clean.append(c); - } - - String trimmed = clean.toString().trim(); - if (trimmed.endsWith(",")) trimmed = trimmed.substring(0, trimmed.length() - 1).trim(); - if (trimmed.isEmpty() || trimmed.equals("{") || trimmed.equals("}")) continue; - - result.add(trimmed); - } - - return result; - } - - private static CMap parseToml(String raw, CMap defaults) { - List lines = stripTomlComments(raw); - CCategory currentCategory = null; - - for (String line : lines) { - if (line.matches("\\[[^\\[\\]]+\\]")) { - String id = line.substring(1, line.length() - 1).trim(); - currentCategory = findCategory(defaults, id); - continue; - } - - if (currentCategory == null) continue; - - int eq = line.indexOf('='); - if (eq < 1) continue; - - String key = line.substring(0, eq).trim(); - String rawValue = line.substring(eq + 1).trim(); - - if (rawValue.startsWith("[") && rawValue.endsWith("]")) { - String inner = rawValue.substring(1, rawValue.length() - 1); - List items = new ArrayList<>(); - for (String item : inner.split(",")) { - String clean = item.trim().replaceAll("^\"(.*)\"$", "$1"); - if (!clean.isEmpty()) items.add(clean); - } - applyMask(defaults, currentCategory, key, items); - continue; - } - - String value = rawValue.replaceAll("^\"(.*)\"$", "$1"); - applyValue(defaults, currentCategory, key, value); - } - - return defaults; - } - - private static List stripTomlComments(String raw) { - List result = new ArrayList<>(); - - for (String line : raw.split("\n")) { - boolean inQuotes = false; - int cutAt = -1; - - for (int i = 0; i < line.length(); i++) { - char c = line.charAt(i); - if (c == '"') inQuotes = !inQuotes; - if (!inQuotes && c == '#') { cutAt = i; break; } - } - - String trimmed = (cutAt >= 0 ? line.substring(0, cutAt) : line).trim(); - if (!trimmed.isEmpty()) result.add(trimmed); - } - - return result; } private static Path configPath(String fileName, Format format) { @@ -319,61 +39,4 @@ private static Path configPath(String fileName, Format format) { .toAbsolutePath() .resolve(fileName + format.extension()); } - - private static String extractFirstQuoted(String segment) { - int start = segment.indexOf('"'); - if (start < 0) return ""; - int end = segment.indexOf('"', start + 1); - if (end < 0) return ""; - return segment.substring(start + 1, end); - } - - private static CCategory findCategory(CMap config, String id) { - for (CCategory cat : config.map().keySet()) { - if (cat.id().equals(id)) return cat; - } - return null; - } - - private static void applyValue(CMap config, CCategory category, String key, String value) { - Map> values = config.map().get(category); - if (values == null) return; - - CValue target = values.get(key); - if (target == null) return; - - if (target instanceof CBoolean cBoolean) { - if (value.equals("true") || value.equals("false")) { - cBoolean.set(Boolean.parseBoolean(value)); - } - } else if (target instanceof CEnum cEnum) { - cEnum.setEnumStr(value.toUpperCase()); - } - } - - private static void applyMask(CMap config, CCategory category, String key, List items) { - Map> values = config.map().get(category); - if (values == null) return; - - CValue target = values.get(key); - if (!(target instanceof CMask cMask)) return; - - cMask.setMaskStr(new ArrayList<>(items)); - - String maskTypeKey = cMask.getMaskTypeKey(); - CValue maskTypeValue = values.get(maskTypeKey); - if (maskTypeValue instanceof CEnum cEnum && cEnum.getEnumClass() == MaskType.class) { - cMask.setMaskType((MaskType) cEnum.get()); - } - } - - private static String enumOptions(CEnum cEnum) { - StringBuilder sb = new StringBuilder(); - Enum[] constants = cEnum.getEnumClass().getEnumConstants(); - for (int i = 0; i < constants.length; i++) { - sb.append(constants[i].name()); - if (i < constants.length - 1) sb.append(" / "); - } - return sb.toString(); - } } \ No newline at end of file From e94db8bbe150bfe60f883853b3815e6992867c2c Mon Sep 17 00:00:00 2001 From: lemonnik Date: Sat, 6 Jun 2026 19:19:32 +0200 Subject: [PATCH 29/39] remove leftovers --- build.fabric.gradle | 104 ------- build.fabric_noremap.gradle | 97 ------ .../tt20/config/BlockEntityMaskConfig.java | 45 --- .../tt20/config/JSONConfiguration.java | 288 ------------------ .../net/snackbag/tt20/config/MainConfig.java | 211 ------------- .../net/snackbag/tt20/config/lib/CConfig.java | 56 ---- .../snackbag/tt20/config/lib/CExporter.java | 42 --- .../tt20/config/lib/types/CBoolean.java | 32 -- .../snackbag/tt20/config/lib/types/CEnum.java | 42 --- .../snackbag/tt20/config/lib/types/CMask.java | 66 ---- .../tt20/config/lib/types/CValue.java | 16 - .../tt20/config/lib/utils/CCategory.java | 36 --- .../snackbag/tt20/config/lib/utils/CMap.java | 12 - .../snackbag/tt20/config/lib/utils/Mask.java | 107 ------- .../tt20/config/lib/utils/MaskType.java | 14 - .../tt20/config/lib/utils/RegistryIndex.java | 114 ------- versions/26.1.1/gradle.properties | 3 - 17 files changed, 1285 deletions(-) delete mode 100644 build.fabric.gradle delete mode 100644 build.fabric_noremap.gradle delete mode 100644 src/main/java/net/snackbag/tt20/config/BlockEntityMaskConfig.java delete mode 100644 src/main/java/net/snackbag/tt20/config/JSONConfiguration.java delete mode 100644 src/main/java/net/snackbag/tt20/config/MainConfig.java delete mode 100644 src/main/java/net/snackbag/tt20/config/lib/CConfig.java delete mode 100644 src/main/java/net/snackbag/tt20/config/lib/CExporter.java delete mode 100644 src/main/java/net/snackbag/tt20/config/lib/types/CBoolean.java delete mode 100644 src/main/java/net/snackbag/tt20/config/lib/types/CEnum.java delete mode 100644 src/main/java/net/snackbag/tt20/config/lib/types/CMask.java delete mode 100644 src/main/java/net/snackbag/tt20/config/lib/types/CValue.java delete mode 100644 src/main/java/net/snackbag/tt20/config/lib/utils/CCategory.java delete mode 100644 src/main/java/net/snackbag/tt20/config/lib/utils/CMap.java delete mode 100644 src/main/java/net/snackbag/tt20/config/lib/utils/Mask.java delete mode 100644 src/main/java/net/snackbag/tt20/config/lib/utils/MaskType.java delete mode 100644 src/main/java/net/snackbag/tt20/config/lib/utils/RegistryIndex.java delete mode 100644 versions/26.1.1/gradle.properties diff --git a/build.fabric.gradle b/build.fabric.gradle deleted file mode 100644 index e8a220b..0000000 --- a/build.fabric.gradle +++ /dev/null @@ -1,104 +0,0 @@ -plugins { - id 'net.fabricmc.fabric-loom-remap' version "${loom_version}" - id 'maven-publish' -} - -version = property("mod.version") - -base { - archivesName = project.archives_base_name -} - -repositories { - maven { url = "https://artifacts.snackbag.net/artifactory/shitlib" } // ShitLib - maven { - name = "Terraformers" - url = "https://maven.terraformersmc.com/" - } -} - -loom { - runConfigs.all { - ideConfigGenerated = true - runDir = "../../run" - } -} - -fabricApi { - configureDataGeneration() -} - -dependencies { - // To change the versions see the gradle.properties file - minecraft "com.mojang:minecraft:${property('deps.minecraft')}" - mappings "net.fabricmc:yarn:${property('deps.yarn_mappings')}:v2" - - modImplementation "net.fabricmc:fabric-loader:${property('deps.fabric_loader')}" - modImplementation "net.fabricmc.fabric-api:fabric-api:${property('deps.fabric_api')}" - - // ShitLib - implementation "net.snackbag.shit:shit:${project.shitlib_version}" - include "net.snackbag.shit:shit:${project.shitlib_version}" - - // ModMenu - modImplementation("com.terraformersmc:modmenu:${project.modmenu_version}") -} - -processResources { - inputs.property "version", project.version - inputs.property "minecraft", stonecutter.current.version - - def map = ["version": project.version, "minecraft": stonecutter.current.version] - - filesMatching("fabric.mod.json") { - expand map - } -} - -tasks.withType(JavaCompile).configureEach { - it.options.release = 17 -} - -java { - // Loom will automatically attach sourcesJar to a RemapSourcesJar task and to the "build" task - // if it is present. - // If you remove this line, sources will not be generated. - withSourcesJar() - - if (stonecutter.compare(stonecutter.current.version, "1.20.5") >= 0) { - sourceCompatibility = JavaVersion.VERSION_21 - targetCompatibility = JavaVersion.VERSION_21 - } else if (stonecutter.compare(stonecutter.current.version, "1.21") >= 0) { - sourceCompatibility = JavaVersion.VERSION_21 - targetCompatibility = JavaVersion.VERSION_21 - } else { - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 - } -} - -jar { - inputs.property "archivesName", "tt20-${project.version}+mc${stonecutter.current.version}" - - from("LICENSE") { - rename { "${it}_${project.base.archivesName.get()}"} - } -} - -// configure the maven publication -publishing { - publications { - create("mavenJava", MavenPublication) { - artifactId = project.archives_base_name - from components.java - } - } - - // See https://docs.gradle.org/current/userguide/publishing_maven.html for information on how to set up publishing. - repositories { - // Add repositories to publish to here. - // Notice: This block does NOT have the same function as the block in the top level. - // The repositories here will be used for publishing your artifact, not for - // retrieving dependencies. - } -} diff --git a/build.fabric_noremap.gradle b/build.fabric_noremap.gradle deleted file mode 100644 index 2c8752c..0000000 --- a/build.fabric_noremap.gradle +++ /dev/null @@ -1,97 +0,0 @@ -plugins { - id 'net.fabricmc.fabric-loom' version "${loom_version}" - id 'maven-publish' -} - -version = property("mod.version") - -base { - archivesName = project.archives_base_name -} - -repositories { - maven { url = "https://artifacts.snackbag.net/artifactory/shitlib" } // ShitLib - maven { - name = "Terraformers" - url = "https://maven.terraformersmc.com/" - } -} - -loom { - runConfigs.all { - ideConfigGenerated = true - runDir = "../../run" - } -} - -fabricApi { - configureDataGeneration() -} - -dependencies { - // To change the versions see the gradle.properties file - minecraft "com.mojang:minecraft:${property('deps.minecraft')}" - - implementation "net.fabricmc:fabric-loader:${property('deps.fabric_loader')}" - implementation "net.fabricmc.fabric-api:fabric-api:${property('deps.fabric_api')}" - - // ShitLib - implementation "net.snackbag.shit:shit:${project.shitlib_version}" - include "net.snackbag.shit:shit:${project.shitlib_version}" - - // ModMenu - implementation("com.terraformersmc:modmenu:${project.modmenu_version}") -} - -processResources { - inputs.property "version", project.version - inputs.property "minecraft", stonecutter.current.version - - def map = ["version": project.version, "minecraft": stonecutter.current.version] - - filesMatching("fabric.mod.json") { - expand map - } -} - -tasks.withType(JavaCompile).configureEach { - it.options.release = 25 -} - -java { - // Loom will automatically attach sourcesJar to a RemapSourcesJar task and to the "build" task - // if it is present. - // If you remove this line, sources will not be generated. - withSourcesJar() - toolchain { - languageVersion = JavaLanguageVersion.of(25) - } - sourceCompatibility = JavaVersion.VERSION_25 - targetCompatibility = JavaVersion.VERSION_25 -} - -jar { - inputs.property "archivesName", "tt20-${project.version}+mc${stonecutter.current.version}" - - from("LICENSE") { - rename { "${it}_${project.base.archivesName.get()}"} - } -} - -// configure the maven publication -publishing { - publications { - create("mavenJava", MavenPublication) { - artifactId = project.archives_base_name - from components.java - } - } - - // See https://docs.gradle.org/current/userguide/publishing_maven.html for information on how to set up publishing. - repositories { - // Add repositories to publish to here. - // Notice: This block does NOT have the same function as the block in the top level. - // The repositories here will be used for publishing your artifact, not for - // retrieving dependencies. - } -} diff --git a/src/main/java/net/snackbag/tt20/config/BlockEntityMaskConfig.java b/src/main/java/net/snackbag/tt20/config/BlockEntityMaskConfig.java deleted file mode 100644 index d45b25b..0000000 --- a/src/main/java/net/snackbag/tt20/config/BlockEntityMaskConfig.java +++ /dev/null @@ -1,45 +0,0 @@ -package net.snackbag.tt20.config; - -//? if >=1.20.1 { -import net.minecraft.core.registries.BuiltInRegistries; -//?} else { -/*import net.minecraft.core.Registry; -*///?} -import net.snackbag.tt20.util.Mask; - -@SuppressWarnings("deprecation") -public class BlockEntityMaskConfig extends JSONConfiguration { - private Mask mask; - private boolean reloaded = false; - - public BlockEntityMaskConfig() { - super("block_entity_mask.json"); - - String[] defaultMask = {"*:*"}; - - putIfEmpty("type", "whitelist"); - putIfEmpty("blocks", defaultMask); - - save(); - reload(); - } - - public Mask getMask() { - return mask; - } - - @Override - public void reload() { - super.reload(); - - if (reloaded) { - //? if >=1.20.1 { - this.mask = new Mask(BuiltInRegistries.BLOCK, this, "blocks"); - //?} else { - /*this.mask = new Mask(Registry.BLOCK, this, "blocks"); - *///?} - } else { - reloaded = true; - } - } -} diff --git a/src/main/java/net/snackbag/tt20/config/JSONConfiguration.java b/src/main/java/net/snackbag/tt20/config/JSONConfiguration.java deleted file mode 100644 index 082a464..0000000 --- a/src/main/java/net/snackbag/tt20/config/JSONConfiguration.java +++ /dev/null @@ -1,288 +0,0 @@ -package net.snackbag.tt20.config; - -import com.google.gson.*; - -//? if fabric -import net.fabricmc.loader.api.FabricLoader; - -//? if forge -//import net.minecraftforge.fml.loading.FMLPaths; - -//? if neoforge -//import net.neoforged.fml.loading.FMLPaths; - -import net.snackbag.tt20.TT20; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.io.*; -import java.util.*; - -public class JSONConfiguration { - private final String fileName; - - private JsonObject json; - private final Gson gson; - - public JSONConfiguration(String fileName) { - this.fileName = fileName; - this.gson = new GsonBuilder().setPrettyPrinting().create(); - - // load file into configuration - reload(); - } - - public void save() { - try { - File file = new File(getAbsolutePath() + fileName); - file.getParentFile().mkdirs(); - file.createNewFile(); - - FileWriter writer = new FileWriter(file); - writer.write(gson.toJson(json)); - writer.close(); - - reload(); - } catch (IOException e) { - TT20.LOGGER.error("(TT20) Failed to save JSONConfiguration '" + fileName + "'"); - e.printStackTrace(); - return; - } - } - - public void reload() { - try { - File file = new File(getAbsolutePath() + fileName); - file.getParentFile().mkdirs(); - - // if the file didn't exist before - if (file.createNewFile()) { - FileWriter writer = new FileWriter(file); - writer.write("{}"); - writer.close(); - } - - BufferedReader reader = new BufferedReader(new FileReader(getAbsolutePath() + fileName)); - json = gson.fromJson(reader, JsonObject.class); - } catch (IOException e) { - TT20.LOGGER.error("(TT20) Failed to reload JSONConfiguration '" + fileName + "'"); - e.printStackTrace(); - } - } - - public boolean has(String key) { - // Create a deep copy of the json object - JsonElement element = gson.fromJson(json.toString(), JsonElement.class); - - for (String part : splitKey(key)) { - if (element == null || !element.getAsJsonObject().has(part)) { - return false; - } - element = element.getAsJsonObject().get(part); - } - return element != null; - } - - private @Nullable Object[] preparePut(String key, @Nullable Object value) { - String[] parts = splitKey(key); - JsonObject current = json; - - for (int i = 0; i < parts.length - 1; i++) { - String part = parts[i]; - - if (!current.has(part) || !current.get(part).isJsonObject()) { - current.add(part, new JsonObject()); - } - - current = current.getAsJsonObject(part); - } - - if (value == null) { - current.remove(parts[parts.length - 1]); - return null; - } - - return new Object[]{current, parts[parts.length - 1]}; - } - - public void put(String key, @Nullable String value) { - Object[] values = preparePut(key, value); - if (values == null) return; - - JsonObject current = (JsonObject) values[0]; - current.addProperty((String) values[1], value); - } - - public void put(String key, @Nullable Object[] value) { - Object[] values = preparePut(key, value); - if (values == null) return; - - JsonObject current = (JsonObject) values[0]; - - JsonArray array = new JsonArray(); - for (Object object : value) { - if (object instanceof String) { - array.add((String) object); - } else if (object instanceof Boolean) { - array.add((Boolean) object); - } else if (object instanceof Number) { - array.add((Number) object); - } else { - throw new IllegalArgumentException("Unsupported object type: " + object.getClass().getName()); - } - } - - current.add((String) values[1], array); - } - - public void put(String key, @Nullable Boolean value) { - Object[] values = preparePut(key, value); - if (values == null) return; - - JsonObject current = (JsonObject) values[0]; - current.addProperty((String) values[1], value); - } - - public void putIfEmpty(String key, @NotNull String value) { - Objects.requireNonNull(value); - - if (!has(key)) { - put(key, value); - } - } - - public void putIfEmpty(String key, @NotNull Object[] value) { - Objects.requireNonNull(value); - - if (!has(key)) { - put(key, value); - } - } - - public void putIfEmpty(String key, @NotNull Boolean value) { - Objects.requireNonNull(value); - - if (!has(key)) { - put(key, value); - } - } - - public String getAsString(String key) { - JsonElement element = json; - - for (String part : splitKey(key)) { - if (element == null || !element.getAsJsonObject().has(part)) { - return null; - } - element = element.getAsJsonObject().get(part); - } - - return element != null && element.isJsonPrimitive() && element.getAsJsonPrimitive().isString() - ? element.getAsString() - : null; - } - - public Boolean getAsBoolean(String key) { - JsonElement element = json; - - for (String part : splitKey(key)) { - if (element == null || !element.getAsJsonObject().has(part)) { - return null; - } - element = element.getAsJsonObject().get(part); - } - - return element != null && element.isJsonPrimitive() && element.getAsJsonPrimitive().isBoolean() - ? element.getAsBoolean() - : null; - } - - public JsonArray getAsArray(String key) { - JsonElement element = json; - - for (String part : splitKey(key)) { - if (element == null || !element.getAsJsonObject().has(part)) { - return null; - } - element = element.getAsJsonObject().get(part); - } - - return element != null && element.isJsonArray() - ? element.getAsJsonArray() - : null; - } - - public String getAsStringOrDefault(String key, String def) { - if (!has(key)) { - return def; - } - return getAsString(key); - } - - public Boolean getAsBooleanOrDefault(String key, Boolean def) { - if (!has(key)) { - return def; - } - return getAsBoolean(key); - } - - public String getFileName() { - return fileName; - } - - public String[] keys(String key) { - // If the key is empty, return all string keys in the root JSON object - if (key.isEmpty()) { - Set keys = new HashSet<>(); - collectStringKeys(json, "", keys); - return keys.toArray(new String[0]); - } - - // Traverse the JSON structure to the specified key - JsonElement element = json; - for (String part : splitKey(key)) { - if (element == null || !element.getAsJsonObject().has(part)) { - return new String[0]; - } - element = element.getAsJsonObject().get(part); - } - - // If the element is a JSON object, collect its string keys - if (element != null && element.isJsonObject()) { - Set keys = new HashSet<>(); - collectStringKeys(element.getAsJsonObject(), "", keys); - return keys.toArray(new String[0]); - } else { - return new String[0]; - } - } - - public String[] keys() { - return keys(""); - } - - public String[] splitKey(String key) { - return key.split("\\."); - } - - public String getAbsolutePath() { - //? if fabric - return FabricLoader.getInstance().getConfigDir().toAbsolutePath() + "/tt20/"; - - //? if forge || neoforge - //return FMLPaths.GAMEDIR.get().resolve(FMLPaths.CONFIGDIR.get()) + "/tt20/"; - } - - private void collectStringKeys(JsonObject jsonObject, String prefix, Set keys) { - for (String key : jsonObject.keySet()) { - JsonElement element = jsonObject.get(key); - String fullKey = prefix.isEmpty() ? key : prefix + "." + key; - - if (element.isJsonPrimitive() && element.getAsJsonPrimitive().isString()) { - keys.add(fullKey); - } else if (element.isJsonObject()) { - collectStringKeys(element.getAsJsonObject(), fullKey, keys); - } - } - } -} \ No newline at end of file diff --git a/src/main/java/net/snackbag/tt20/config/MainConfig.java b/src/main/java/net/snackbag/tt20/config/MainConfig.java deleted file mode 100644 index 2cfe6f3..0000000 --- a/src/main/java/net/snackbag/tt20/config/MainConfig.java +++ /dev/null @@ -1,211 +0,0 @@ -package net.snackbag.tt20.config; - -public class MainConfig extends JSONConfiguration { - private boolean enabled = true; - private boolean blockEntityAcceleration = false; - private boolean blockBreakingAcceleration = true; - private boolean eatingAcceleration = true; - private boolean potionEffectAcceleration = true; - private boolean fluidAcceleration = true; - private boolean pickupAcceleration = true; - private boolean portalAcceleration = true; - private boolean sleepingAcceleration = true; - private boolean timeAcceleration = true; - private boolean bowAcceleration = true; - private boolean crossbowAcceleration = true; - private boolean randomTickSpeedAcceleration = true; - private boolean tntAcceleration = false; - private boolean vanillaLagback = true; - - private boolean serverWatchdog = true; - private boolean automaticUpdater = true; - - public MainConfig() { - super("config.json"); - - putIfEmpty("enabled", enabled); - putIfEmpty("block-entity-acceleration", blockEntityAcceleration); - putIfEmpty("block-breaking-acceleration", blockBreakingAcceleration); - putIfEmpty("potion-effect-acceleration", potionEffectAcceleration); - putIfEmpty("fluid-acceleration", fluidAcceleration); - putIfEmpty("pickup-acceleration", pickupAcceleration); - putIfEmpty("eating-acceleration", eatingAcceleration); - putIfEmpty("portal-acceleration", portalAcceleration); - putIfEmpty("sleeping-acceleration", sleepingAcceleration); - putIfEmpty("server-watchdog", serverWatchdog); - putIfEmpty("time-acceleration", timeAcceleration); - putIfEmpty("bow-acceleration", bowAcceleration); - putIfEmpty("crossbow-acceleration", crossbowAcceleration); - putIfEmpty("random-tickspeed-acceleration", randomTickSpeedAcceleration); - putIfEmpty("tnt-acceleration", tntAcceleration); - putIfEmpty("vanilla-lagback", vanillaLagback); - - putIfEmpty("automatic-updater", automaticUpdater); - - save(); - } - - @Override - public void reload() { - super.reload(); - - this.enabled = getAsBooleanOrDefault("enabled", enabled); - this.blockEntityAcceleration = getAsBooleanOrDefault("block-entity-acceleration", blockEntityAcceleration); - this.blockBreakingAcceleration = getAsBooleanOrDefault("block-breaking-acceleration", blockBreakingAcceleration); - this.potionEffectAcceleration = getAsBooleanOrDefault("potion-effect-acceleration", potionEffectAcceleration); - this.fluidAcceleration = getAsBooleanOrDefault("fluid-acceleration", fluidAcceleration); - this.pickupAcceleration = getAsBooleanOrDefault("pickup-acceleration", pickupAcceleration); - this.eatingAcceleration = getAsBooleanOrDefault("eating-acceleration", eatingAcceleration); - this.portalAcceleration = getAsBooleanOrDefault("portal-acceleration", portalAcceleration); - this.sleepingAcceleration = getAsBooleanOrDefault("sleeping-acceleration", sleepingAcceleration); - this.serverWatchdog = getAsBooleanOrDefault("server-watchdog", serverWatchdog); - this.timeAcceleration = getAsBooleanOrDefault("time-acceleration", timeAcceleration); - this.bowAcceleration = getAsBooleanOrDefault("bow-acceleration", bowAcceleration); - this.crossbowAcceleration = getAsBooleanOrDefault("crossbow-acceleration", crossbowAcceleration); - this.randomTickSpeedAcceleration = getAsBooleanOrDefault("random-tickspeed-acceleration", randomTickSpeedAcceleration); - this.tntAcceleration = getAsBooleanOrDefault("tnt-acceleration", tntAcceleration); - this.vanillaLagback = getAsBooleanOrDefault("vanilla-lagback", vanillaLagback); - - this.automaticUpdater = getAsBooleanOrDefault("automatic-updater", automaticUpdater); - } - - public void enabled(boolean enabled) { - put("enabled", enabled); - } - - public boolean enabled() { - return enabled; - } - - public void serverWatchdog(boolean enabled) { - put("server-watchdog", enabled); - } - - public boolean serverWatchdog() { - return serverWatchdog; - } - - public void blockEntityAcceleration(boolean enabled) { - put("block-entity-acceleration", enabled); - } - - public boolean blockEntityAcceleration() { - return blockEntityAcceleration; - } - - public void blockBreakingAcceleration(boolean enabled) { - put("block-breaking-acceleration", enabled); - } - - public boolean blockBreakingAcceleration() { - return blockBreakingAcceleration; - } - - public void potionEffectAcceleration(boolean enabled) { - put("potion-effect-acceleration", enabled); - } - - public boolean potionEffectAcceleration() { - return potionEffectAcceleration; - } - - public void fluidAcceleration(boolean enabled) { - put("fluid-acceleration", enabled); - } - - public boolean fluidAcceleration() { - return fluidAcceleration; - } - - public void pickupAcceleration(boolean enabled) { - put("pickup-acceleration", enabled); - } - - public boolean pickupAcceleration() { - return pickupAcceleration; - } - - public void eatingAcceleration(boolean enabled) { - put("eating-acceleration", enabled); - } - - public boolean eatingAcceleration() { - return eatingAcceleration; - } - - public void portalAcceleration(boolean enabled) { - put("portal-acceleration", enabled); - } - - public boolean portalAcceleration() { - return portalAcceleration; - } - - public void sleepingAcceleration(boolean enabled) { - put("sleeping-acceleration", enabled); - } - - public boolean sleepingAcceleration() { - return sleepingAcceleration; - } - - public void automaticUpdater(boolean enabled) { - put("automatic-updater", enabled); - } - - public boolean automaticUpdater() { - return automaticUpdater; - } - - public void singlePlayerWarning(boolean enabled) { - put("singleplayer-warning", enabled); - } - - public boolean timeAcceleration() { - return timeAcceleration; - } - - public void timeAcceleration(boolean enabled) { - put("time-acceleration", enabled); - } - - public boolean bowAcceleration() { - return bowAcceleration; - } - - public void bowAcceleration(boolean enabled) { - put("bow-acceleration", enabled); - } - - public boolean crossbowAcceleration() { - return crossbowAcceleration; - } - - public void crossbowAcceleration(boolean enabled) { - put("crossbow-acceleration", enabled); - } - - public boolean randomTickSpeedAcceleration() { - return randomTickSpeedAcceleration; - } - - public void tntAcceleration(boolean enabled) { - put("tnt-acceleration", enabled); - } - - public boolean tntAcceleration() { - return tntAcceleration; - } - - public void vanillaLagback(boolean enabled) { - put("vanilla-lagback", enabled); - } - - public boolean vanillaLagback() { - return vanillaLagback; - } - - public void randomTickSpeedAcceleration(boolean enabled) { - put("random-tickspeed-acceleration", enabled); - } -} diff --git a/src/main/java/net/snackbag/tt20/config/lib/CConfig.java b/src/main/java/net/snackbag/tt20/config/lib/CConfig.java deleted file mode 100644 index cb80d5d..0000000 --- a/src/main/java/net/snackbag/tt20/config/lib/CConfig.java +++ /dev/null @@ -1,56 +0,0 @@ -package net.snackbag.tt20.config.lib; - -import net.snackbag.tt20.config.lib.types.CValue; -import net.snackbag.tt20.config.lib.utils.CCategory; -import net.snackbag.tt20.config.lib.utils.CMap; -import org.jetbrains.annotations.NotNull; - -import java.util.LinkedHashMap; -import java.util.Map; - -public abstract class CConfig { - private final CMap categories = new CMap(); - - protected > T register(CCategory category, T value) { - categories.map() - .computeIfAbsent(category, k -> new LinkedHashMap<>()) - .put(value.key, value); - return value; - } - - public Map>> getCategories() { - return categories.map(); - } - - public LinkedHashMap> getValues(CCategory category) { - return categories.map().get(category); - } - - public abstract @NotNull String getFileName(); - - protected abstract @NotNull CExporter.Format getFormat(); - - public CValue getValue(String key) { - for (CCategory category : categories.map().keySet()) { - CValue value = categories.map().get(category).get(key); - if (value != null) { - return value; - } - } - return null; - } - - public boolean reload() { - CMap loaded = CExporter.load(categories, getFileName(), getFormat()); - if (!loaded.map().isEmpty()) { - this.categories.map().putAll(loaded.map()); - return CExporter.save(loaded, getFileName(), getFormat()); - } else { - return false; - } - } - - public boolean save() { - return CExporter.save(categories, getFileName(), getFormat()); - } -} \ No newline at end of file diff --git a/src/main/java/net/snackbag/tt20/config/lib/CExporter.java b/src/main/java/net/snackbag/tt20/config/lib/CExporter.java deleted file mode 100644 index 41ddc60..0000000 --- a/src/main/java/net/snackbag/tt20/config/lib/CExporter.java +++ /dev/null @@ -1,42 +0,0 @@ -package net.snackbag.tt20.config.lib; - -import com.google.gson.*; -import net.fabricmc.loader.api.FabricLoader; -import net.snackbag.tt20.config.lib.utils.CMap; - -import java.nio.file.Path; - -public class CExporter { - private static final Gson GSON = new Gson(); - - public enum Format { - JSON5(".json5"), - TOML(".toml"); - - private final String extension; - - Format(String extension) { - this.extension = extension; - } - - public String extension() { - return extension; - } - } - - public static CMap load(CMap defaults, String fileName, Format format) { - Path path = configPath(fileName, format); - - } - - public static boolean save(CMap config, String fileName, Format format) { - Path path = configPath(fileName, format); - - } - - private static Path configPath(String fileName, Format format) { - return FabricLoader.getInstance().getConfigDir() - .toAbsolutePath() - .resolve(fileName + format.extension()); - } -} \ No newline at end of file diff --git a/src/main/java/net/snackbag/tt20/config/lib/types/CBoolean.java b/src/main/java/net/snackbag/tt20/config/lib/types/CBoolean.java deleted file mode 100644 index fce9fc3..0000000 --- a/src/main/java/net/snackbag/tt20/config/lib/types/CBoolean.java +++ /dev/null @@ -1,32 +0,0 @@ -package net.snackbag.tt20.config.lib.types; - -public class CBoolean extends CValue { - private final boolean defaultValue; - private Boolean value; - - public CBoolean(String key, String comment, boolean value) { - super(key, comment); - - this.value = value; - this.defaultValue = value; - } - - public void toggle() { - this.value = !value; - } - - @Override - public Boolean get() { - return value; - } - - @Override - public void set(Boolean value) { - this.value = value; - } - - @Override - public boolean isDefault() { - return value == defaultValue; - } -} diff --git a/src/main/java/net/snackbag/tt20/config/lib/types/CEnum.java b/src/main/java/net/snackbag/tt20/config/lib/types/CEnum.java deleted file mode 100644 index 6a8cda9..0000000 --- a/src/main/java/net/snackbag/tt20/config/lib/types/CEnum.java +++ /dev/null @@ -1,42 +0,0 @@ -package net.snackbag.tt20.config.lib.types; - -import java.util.Arrays; - -public class CEnum> extends CValue { - private final Class enumClass; - private final T defaultValue; - private T value; - - public CEnum(String key, String comment, Class enumClass, T defaultValue) { - super(key, comment); - this.enumClass = enumClass; - this.defaultValue = defaultValue; - this.value = defaultValue; - } - - @Override - public T get() { - return value; - } - - @Override - public void set(T value) { - this.value = value; - } - - public void setEnumStr(String enumStr) { - this.value = Arrays.stream(enumClass.getEnumConstants()) - .filter(e -> e.name().equalsIgnoreCase(enumStr)) - .findFirst() - .orElse(defaultValue); - } - - @Override - public boolean isDefault() { - return value == defaultValue; - } - - public Class getEnumClass() { - return enumClass; - } -} diff --git a/src/main/java/net/snackbag/tt20/config/lib/types/CMask.java b/src/main/java/net/snackbag/tt20/config/lib/types/CMask.java deleted file mode 100644 index 6a1b06c..0000000 --- a/src/main/java/net/snackbag/tt20/config/lib/types/CMask.java +++ /dev/null @@ -1,66 +0,0 @@ -package net.snackbag.tt20.config.lib.types; - -import net.minecraft.registry.Registries; -import net.snackbag.tt20.config.lib.CConfig; -import net.snackbag.tt20.config.lib.utils.Mask; -import net.snackbag.tt20.config.lib.utils.MaskType; - -import java.util.List; - -public class CMask extends CValue { - private final Mask defaultMask; - private final String maskTypeKey; - private String[] maskStr; - private Mask mask; - private MaskType maskType; - - public CMask(String key, String comment, String[] maskStr, String maskTypeKey, CConfig config) { - super(key, comment); - - this.maskStr = maskStr; - CValue cValue = config.getValue(maskTypeKey); - if (cValue instanceof CEnum cEnum && cEnum.getEnumClass() == MaskType.class) { - maskType = (MaskType) cEnum.get(); - } - this.defaultMask = new Mask(Registries.BLOCK, maskType, List.of(maskStr)); - this.maskTypeKey = maskTypeKey; - } - - @Override - public Mask get() { - return mask; - } - - public String[] getMaskStr() { - return maskStr; - } - - public void setMaskStr(String[] maskStr) { - this.maskStr = maskStr; - this.mask = new Mask(Registries.BLOCK, maskType, List.of(maskStr)); - } - - public void setMaskStr(List maskStr) { - this.maskStr = maskStr.toArray(new String[0]); - this.mask = new Mask(Registries.BLOCK, maskType, maskStr); - } - - public void setMaskType(MaskType maskType) { - this.maskType = maskType; - this.mask = new Mask(Registries.BLOCK, maskType, List.of(maskStr)); - } - - public String getMaskTypeKey() { - return maskTypeKey; - } - - @Override - public void set(Mask mask) { - this.mask = mask; - } - - @Override - public boolean isDefault() { - return mask.getEntries().equals(defaultMask.getEntries()); - } -} diff --git a/src/main/java/net/snackbag/tt20/config/lib/types/CValue.java b/src/main/java/net/snackbag/tt20/config/lib/types/CValue.java deleted file mode 100644 index 3590cbd..0000000 --- a/src/main/java/net/snackbag/tt20/config/lib/types/CValue.java +++ /dev/null @@ -1,16 +0,0 @@ -package net.snackbag.tt20.config.lib.types; - -public abstract class CValue { - public final String key; - public final String comment; - - protected CValue(String key, String comment) { - this.key = key; - this.comment = comment; - } - - public abstract T get(); - public abstract void set(T value); - - public abstract boolean isDefault(); -} \ No newline at end of file diff --git a/src/main/java/net/snackbag/tt20/config/lib/utils/CCategory.java b/src/main/java/net/snackbag/tt20/config/lib/utils/CCategory.java deleted file mode 100644 index 49b72c9..0000000 --- a/src/main/java/net/snackbag/tt20/config/lib/utils/CCategory.java +++ /dev/null @@ -1,36 +0,0 @@ -package net.snackbag.tt20.config.lib.utils; - -import org.jetbrains.annotations.NotNull; - -public record CCategory(String id, String[] description) { - public CCategory(String id, String[] description) { - this.id = id; - this.description = description.clone(); - } - - public static CCategory of(String id, String... description) { - return new CCategory(id, description); - } - - @Override - public String[] description() { - return description.clone(); - } - - @Override - public @NotNull String toString() { - return id; - } - - @Override - public int hashCode() { - return id.hashCode(); - } - - @Override - public boolean equals(Object obj) { - if (this == obj) return true; - if (!(obj instanceof CCategory)) return false; - return id.equals(((CCategory) obj).id); - } -} diff --git a/src/main/java/net/snackbag/tt20/config/lib/utils/CMap.java b/src/main/java/net/snackbag/tt20/config/lib/utils/CMap.java deleted file mode 100644 index 0a2e7a1..0000000 --- a/src/main/java/net/snackbag/tt20/config/lib/utils/CMap.java +++ /dev/null @@ -1,12 +0,0 @@ -package net.snackbag.tt20.config.lib.utils; - -import net.snackbag.tt20.config.lib.types.CValue; - -import java.util.LinkedHashMap; -import java.util.Map; - -public record CMap(Map>> map) { - public CMap() { - this(new LinkedHashMap<>()); - } -} \ No newline at end of file diff --git a/src/main/java/net/snackbag/tt20/config/lib/utils/Mask.java b/src/main/java/net/snackbag/tt20/config/lib/utils/Mask.java deleted file mode 100644 index cebbe87..0000000 --- a/src/main/java/net/snackbag/tt20/config/lib/utils/Mask.java +++ /dev/null @@ -1,107 +0,0 @@ -package net.snackbag.tt20.util; - -import com.google.gson.JsonElement; -import net.minecraft.core.Registry; -//? if >=1.21.11 { -/*import net.minecraft.resources.Identifier; -*///?} else { -import net.minecraft.resources.ResourceLocation; -//?} -import net.snackbag.tt20.TT20; -import net.snackbag.tt20.config.JSONConfiguration; - -import java.util.*; - -public class Mask { - private final JSONConfiguration file; - private final MaskType maskType; - private final Registry registry; - private final RegistryIndex index; - //? if >=1.21.11 { - /*private final Set entries; - *///?} else { - private final Set entries; - //?} - - public Mask(Registry registry, JSONConfiguration file, String maskKey) { - this.file = file; - this.maskType = MaskType.fromString(file.getAsString("type")); - this.registry = registry; - this.index = RegistryIndex.getIndex(this.registry); - this.entries = new HashSet<>(); - - for (JsonElement element : file.getAsArray(maskKey)) { - if (!(element.isJsonPrimitive() && element.getAsJsonPrimitive().isString())) { - TT20.LOGGER.error("(TT20) Mask element '" + element + "' isn't a string"); - return; - } - - entries.addAll(manageEntry(element.getAsString())); - } - } - - @SuppressWarnings("ConstantConditions") - //? if >=1.21.11 { - /*public List manageEntry(String entry) { - *///?} else { - public List manageEntry(String entry) { - //?} - String[] split = entry.split(":"); - - if (split.length != 2) { - TT20.LOGGER.error("(TT20) '" + entry + "' is not a valid identifier. Correct format is :"); - return new ArrayList<>(); - } - - // if *:* - if (split[0].equals("*") && split[1].equals("*")) { - return index.getResourceLocations(); - } - - // if : - if (!split[0].equals("*") && !split[1].equals("*")) { - return List.of(TT20.id(split[0], split[1])); - } - - // if *: - if (split[0].equals("*") && !split[1].equals("*")) { - return index.getPathIndex().getOrDefault(split[1], new ArrayList<>()); - } - - - // if :* - if (!split[0].equals("*") && split[1].equals("*")) { - return index.getNamespaceIndex().getOrDefault(split[0], new ArrayList<>()); - } - - return null; - } - - public Registry getRegistry() { - return registry; - } - - public JSONConfiguration getFile() { - return file; - } - - //? if >=1.21.11 { - /*public boolean matches(Identifier identifier) { - *///?} else { - public boolean matches(ResourceLocation identifier) { - //?} - return entries.contains(identifier); - } - - //? if >=1.21.11 { - /*public boolean isOkay(Identifier identifier) { - *///?} else { - public boolean isOkay(ResourceLocation identifier) { - //?} - if (maskType == MaskType.WHITELIST) { - return entries.contains(identifier); - } else { - return !entries.contains(identifier); - } - } -} diff --git a/src/main/java/net/snackbag/tt20/config/lib/utils/MaskType.java b/src/main/java/net/snackbag/tt20/config/lib/utils/MaskType.java deleted file mode 100644 index 8e3871a..0000000 --- a/src/main/java/net/snackbag/tt20/config/lib/utils/MaskType.java +++ /dev/null @@ -1,14 +0,0 @@ -package net.snackbag.tt20.config.lib.utils; - -public enum MaskType { - WHITELIST, - BLACKLIST; - - public static MaskType fromString(String input) { - return switch (input.toLowerCase()) { - case "whitelist" -> WHITELIST; - case "blacklist" -> BLACKLIST; - default -> throw new IllegalArgumentException("'" + input + "' is not a valid mask type"); - }; - } -} diff --git a/src/main/java/net/snackbag/tt20/config/lib/utils/RegistryIndex.java b/src/main/java/net/snackbag/tt20/config/lib/utils/RegistryIndex.java deleted file mode 100644 index 23a38d4..0000000 --- a/src/main/java/net/snackbag/tt20/config/lib/utils/RegistryIndex.java +++ /dev/null @@ -1,114 +0,0 @@ -package net.snackbag.tt20.util; - -import net.minecraft.core.Registry; -import net.minecraft.resources.ResourceKey; -//? if >=1.21.11 { -/*import net.minecraft.resources.Identifier; -*///?} else { -import net.minecraft.resources.ResourceLocation; -//?} - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -public class RegistryIndex { - private static final HashMap, RegistryIndex> indexes = new HashMap<>(); - - private final Registry registry; - private final List namespaces; - private final List paths; - //? if >=1.21.11 { - /*private final List identifiers; - private final HashMap> namespaceIndex; - private final HashMap> pathIndex; - *///?} else { - private final List identifiers; - private final HashMap> namespaceIndex; - private final HashMap> pathIndex; - //?} - - private RegistryIndex(Registry registry) { - this.registry = registry; - - this.identifiers = new ArrayList<>(); - this.namespaces = new ArrayList<>(); - this.paths = new ArrayList<>(); - this.namespaceIndex = new HashMap<>(); - this.pathIndex = new HashMap<>(); - - //? if >1.18.2 { - for (ResourceKey key : registry.registryKeySet()) { - //?} else { - /*for (ResourceLocation identifier : registry.keySet()) { - *///?} - //? if >=1.21.11 { - /*Identifier identifier = key.identifier(); - *///?} else if >1.18.2 { - ResourceLocation identifier = key.location(); - //?} - - String namespace = identifier.getNamespace(); - String path = identifier.getPath(); - - if (!namespaces.contains(namespace)) { - namespaces.add(namespace); - namespaceIndex.put(namespace, new ArrayList<>()); - } - - if (!paths.contains(path)) { - paths.add(path); - pathIndex.put(path, new ArrayList<>()); - } - - this.identifiers.add(identifier); - namespaceIndex.get(namespace).add(identifier); - pathIndex.get(path).add(identifier); - } - } - - public Registry getRegistry() { - return registry; - } - - //? if >=1.21.11 { - /*public List getResourceLocations() { - *///?} else { - public List getResourceLocations() { - //?} - return identifiers; - } - - //? if >=1.21.11 { - /*public HashMap> getNamespaceIndex() { - *///?} else { - public HashMap> getNamespaceIndex() { - //?} - return new HashMap<>(namespaceIndex); - } - - //? if >=1.21.11 { - /*public HashMap> getPathIndex() { - *///?} else { - public HashMap> getPathIndex() { - //?} - return new HashMap<>(pathIndex); - } - - public List getNamespaces() { - return new ArrayList<>(namespaces); - } - - public List getPaths() { - return new ArrayList<>(paths); - } - - public static RegistryIndex getIndex(Registry registry) { - if (indexes.containsKey(registry)) { - return indexes.get(registry); - } - - indexes.put(registry, new RegistryIndex(registry)); - return indexes.get(registry); - } -} diff --git a/versions/26.1.1/gradle.properties b/versions/26.1.1/gradle.properties deleted file mode 100644 index 34dd1b1..0000000 --- a/versions/26.1.1/gradle.properties +++ /dev/null @@ -1,3 +0,0 @@ -deps.minecraft=26.1.1 -deps.fabric_api=0.145.3+26.1.1 -modmenu_version=18.0.0-alpha.8 From b043ddb2c1dc31f002463b8566901e8a568dc596 Mon Sep 17 00:00:00 2001 From: lemonnik Date: Sat, 6 Jun 2026 19:31:09 +0200 Subject: [PATCH 30/39] lemon maven --- build.gradle | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/build.gradle b/build.gradle index 8b232e1..8d73bd4 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,8 @@ plugins { id 'java' + id 'maven-publish' + // https://github.com/architectury/architectury-loom id 'dev.architectury.loom' version '1.13-SNAPSHOT' apply false id 'dev.architectury.loom-no-remap' version '1.14-SNAPSHOT' apply false @@ -301,4 +303,30 @@ if (use_paperweight) { tasks.assemble { dependsOn(tasks.reobfJar) } +} + +publishing { + publications { + create("maven${project.name.capitalize()}", MavenPublication) { + artifactId = project.mod_id + + from components.java + } + } + + repositories { + def mavenToken = System.getenv("MAVEN_TOKEN") + + if (mavenToken != null && !mavenToken.isEmpty()) { + maven { + url = uri("http://lemonnik.ddns.net:16555/releases") + allowInsecureProtocol = true + + credentials { + username = "lemonnik" + password = mavenToken + } + } + } + } } \ No newline at end of file From 6ec4c090a304808662de407dac8f15fe548e1ef3 Mon Sep 17 00:00:00 2001 From: lemonnik Date: Sat, 6 Jun 2026 22:07:19 +0200 Subject: [PATCH 31/39] BOOOOOM --- build.gradle | 41 ++++++----------- gradle.properties | 3 +- .../java/net/snackbag/tt20/ModUpdater.java | 4 +- src/main/java/net/snackbag/tt20/TT20.java | 7 ++- .../java/net/snackbag/tt20/TT20Command.java | 44 +++++++++---------- .../tt20/{config => }/TT20Config.java | 27 ++++++------ .../tt20/mixin/LivingEntityMixin.java | 2 +- .../net/snackbag/tt20/mixin/PlayerMixin.java | 4 +- .../snackbag/tt20/mixin/PrimedTntMixin.java | 3 +- .../ServerGamePacketListenerImplMixin.java | 3 +- .../tt20/mixin/ServerPlayerManagerMixin.java | 17 +++++-- .../tt20/mixin/ServerWatchdogMixin.java | 3 +- .../tt20/mixin/fluid/LavaFluidMixin.java | 2 +- .../tt20/mixin/fluid/WaterFluidMixin.java | 2 +- .../tt20/mixin/item/BowItemMixin.java | 2 +- .../tt20/mixin/item/CrossbowItemMixin.java | 2 +- .../tt20/mixin/item/ItemEntityMixin.java | 2 +- .../snackbag/tt20/mixin/item/ItemMixin.java | 2 +- .../tt20/mixin/world/BlockBehaviourMixin.java | 2 +- .../tt20/mixin/world/GameRulesMixin.java | 2 +- .../tt20/mixin/world/LevelChunkMixin.java | 9 ++-- .../tt20/mixin/world/ServerLevelMixin.java | 2 +- versions/fabric-1.19.2/gradle.properties | 1 + versions/fabric-1.20.1/gradle.properties | 1 + versions/fabric-1.20.5/gradle.properties | 3 +- versions/fabric-1.21.1/gradle.properties | 3 +- versions/fabric-1.21.11/gradle.properties | 3 +- versions/fabric-1.21.2/gradle.properties | 3 +- versions/fabric-1.21.9/gradle.properties | 3 +- versions/fabric-26.1.1/gradle.properties | 3 +- versions/forge-1.18.2/gradle.properties | 1 + versions/forge-1.19.2/gradle.properties | 1 + versions/forge-1.20.1/gradle.properties | 1 + versions/neoforge-1.20.3/gradle.properties | 1 + versions/neoforge-1.20.5/gradle.properties | 1 + versions/neoforge-1.21.1/gradle.properties | 1 + versions/neoforge-1.21.11/gradle.properties | 1 + versions/neoforge-1.21.2/gradle.properties | 1 + versions/neoforge-1.21.9/gradle.properties | 1 + versions/neoforge-26.1.1/gradle.properties | 1 + 40 files changed, 115 insertions(+), 100 deletions(-) rename src/main/java/net/snackbag/tt20/{config => }/TT20Config.java (76%) diff --git a/build.gradle b/build.gradle index 8d73bd4..8a62198 100644 --- a/build.gradle +++ b/build.gradle @@ -44,6 +44,12 @@ repositories { name = "Terraformers" url = "https://maven.terraformersmc.com/" } + maven { + name "lemonnik's maven" + url "http://lemonnik.ddns.net:16555/releases" + allowInsecureProtocol = true + } + } def use_architectury_loom = project.platform in ['fabric', 'quilt', 'forge', 'neoforge'] @@ -183,16 +189,21 @@ dependencies { paperweight.paperDevBundle("${project.minecraft_version}-R0.1-SNAPSHOT") } + if (mcVersion < 260100) { + modImplementation "dev.lemonnik:fern_config:${project.fern_version}" + } else { + implementation "dev.lemonnik:fern_config:${project.fern_version}" + } + implementation "net.snackbag.shit:shit:${project.shit_version}" } if (use_architectury_loom) { loom { - def commonVmArgs = ['-Dmixin.debug.export=true', '-Dmixin.debug.countInjections=true'] runConfigs.configureEach { // to make sure it generates all "Minecraft Client (:subproject_name)" applications ideConfigGenerated = true - vmArgs commonVmArgs + vmArgs [] } if (project.platform == 'forge') { @@ -303,30 +314,4 @@ if (use_paperweight) { tasks.assemble { dependsOn(tasks.reobfJar) } -} - -publishing { - publications { - create("maven${project.name.capitalize()}", MavenPublication) { - artifactId = project.mod_id - - from components.java - } - } - - repositories { - def mavenToken = System.getenv("MAVEN_TOKEN") - - if (mavenToken != null && !mavenToken.isEmpty()) { - maven { - url = uri("http://lemonnik.ddns.net:16555/releases") - allowInsecureProtocol = true - - credentials { - username = "lemonnik" - password = mavenToken - } - } - } - } } \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 850ecca..5b1a5df 100644 --- a/gradle.properties +++ b/gradle.properties @@ -8,7 +8,7 @@ dev.kikugie.stonecutter.hard_mode=true # Mod Properties mod_id=tt20 mod_name=TT20 -mod_version=0.8.3 +mod_version=1.8.3 maven_group=net.snackbag mod_description=TT20 helps reduce lag by optimizing how ticks work when the server's TPS is low. @@ -24,6 +24,7 @@ shit_version=1.2.3 # Versioned Dependencies minecraft_version=[VERSIONED] platform=[VERSIONED] +fern_version=[VERSIONED] # Mods minecraft_dependency=[VERSIONED] diff --git a/src/main/java/net/snackbag/tt20/ModUpdater.java b/src/main/java/net/snackbag/tt20/ModUpdater.java index ce2b9d5..823af56 100644 --- a/src/main/java/net/snackbag/tt20/ModUpdater.java +++ b/src/main/java/net/snackbag/tt20/ModUpdater.java @@ -24,8 +24,8 @@ public class ModUpdater { } public static void check() { - if (!TT20.config.automaticUpdater()) { - TT20.LOGGER.info("(TT20) Not checking for updates, because the updater is disabled. Current patch: " + TT20.PATCH); + if (!TT20.config.enabled.get() || !TT20.config.updateChecker.get()) { + TT20.LOGGER.info("(TT20) Not checking for updates, because the updater or mod is disabled. Current patch: " + TT20.PATCH); return; } diff --git a/src/main/java/net/snackbag/tt20/TT20.java b/src/main/java/net/snackbag/tt20/TT20.java index 4675edc..6134e62 100644 --- a/src/main/java/net/snackbag/tt20/TT20.java +++ b/src/main/java/net/snackbag/tt20/TT20.java @@ -25,8 +25,6 @@ //? 1.18.2 //import net.minecraft.network.chat.TextComponent; -import net.snackbag.tt20.config.BlockEntityMaskConfig; -import net.snackbag.tt20.config.MainConfig; import net.snackbag.tt20.util.TPSCalculator; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -53,8 +51,7 @@ public class TT20 public static final String VERSION = /*$ mod_version */"0.8.3"; public static final int PATCH = 3; - public static final MainConfig config = new MainConfig(); - public static final BlockEntityMaskConfig blockEntityMaskConfig = new BlockEntityMaskConfig(); + public static final TT20Config config = new TT20Config(); //? if fabric @Override public void onInitialize() @@ -71,6 +68,8 @@ public class TT20 { LOGGER.info("Starting TT20..."); + config.reload(); + CompletableFuture.runAsync(() -> { try { ModUpdater.check(); diff --git a/src/main/java/net/snackbag/tt20/TT20Command.java b/src/main/java/net/snackbag/tt20/TT20Command.java index b791e2e..0b1b929 100644 --- a/src/main/java/net/snackbag/tt20/TT20Command.java +++ b/src/main/java/net/snackbag/tt20/TT20Command.java @@ -30,27 +30,27 @@ public static void register(CommandDispatcher dispatcher) { } private static int executeStatus(CommandContext context) { - sendMessage(context, literal("§7TT20 enabled: " + (TT20.config.enabled() ? "§aON" : "§cOFF"))); - sendMessage(context, literal("§7Block entity acceleration: " + (TT20.config.blockEntityAcceleration() ? "§aON" : "§cOFF"))); - sendMessage(context, literal("§7Block breaking acceleration: " + (TT20.config.blockBreakingAcceleration() ? "§aON" : "§cOFF"))); - sendMessage(context, literal("§7Potion effect acceleration: " + (TT20.config.potionEffectAcceleration() ? "§aON" : "§cOFF"))); - sendMessage(context, literal("§7Fluid acceleration: " + (TT20.config.fluidAcceleration() ? "§aON" : "§cOFF"))); - sendMessage(context, literal("§7Pickup acceleration: " + (TT20.config.pickupAcceleration() ? "§aON" : "§cOFF"))); - sendMessage(context, literal("§7Eating acceleration: " + (TT20.config.eatingAcceleration() ? "§aON" : "§cOFF"))); - sendMessage(context, literal("§7Portal acceleration: " + (TT20.config.portalAcceleration() ? "§aON" : "§cOFF"))); - sendMessage(context, literal("§7Sleeping acceleration: " + (TT20.config.sleepingAcceleration() ? "§aON" : "§cOFF"))); - sendMessage(context, literal("§7Time acceleration: " + (TT20.config.timeAcceleration() ? "§aON" : "§cOFF"))); - sendMessage(context, literal("§7Bow pull acceleration: " + (TT20.config.bowAcceleration() ? "§aON" : "§cOFF"))); - sendMessage(context, literal("§7Crossbow pull acceleration: " + (TT20.config.crossbowAcceleration() ? "§aON" : "§cOFF"))); - sendMessage(context, literal("§7TNT acceleration: " + (TT20.config.tntAcceleration() ? "§aON" : "§cOFF"))); - sendMessage(context, literal("§7Vanilla Lagback: " + (TT20.config.vanillaLagback() ? "§aON" : "§cOFF"))); - sendMessage(context, literal("§7Random tickspeed acceleration: " + (TT20.config.randomTickSpeedAcceleration() ? "§aON" : "§cOFF"))); - sendMessage(context, literal("§7Server watchdog: " + (TT20.config.serverWatchdog() ? "§aON" : "§cOFF"))); + sendMessage(context, literal("§7TT20 enabled: " + (TT20.config.enabled.get() ? "§aON" : "§cOFF"))); + sendMessage(context, literal("§7Block entity acceleration: " + (TT20.config.blockEntity.get() ? "§aON" : "§cOFF"))); + sendMessage(context, literal("§7Block breaking acceleration: " + (TT20.config.blockBreaking.get() ? "§aON" : "§cOFF"))); + sendMessage(context, literal("§7Potion effect acceleration: " + (TT20.config.potionEffect.get() ? "§aON" : "§cOFF"))); + sendMessage(context, literal("§7Fluid acceleration: " + (TT20.config.fluid.get() ? "§aON" : "§cOFF"))); + sendMessage(context, literal("§7Pickup acceleration: " + (TT20.config.pickup.get() ? "§aON" : "§cOFF"))); + sendMessage(context, literal("§7Eating acceleration: " + (TT20.config.eating.get() ? "§aON" : "§cOFF"))); + sendMessage(context, literal("§7Portal acceleration: " + (TT20.config.portal.get() ? "§aON" : "§cOFF"))); + sendMessage(context, literal("§7Sleeping acceleration: " + (TT20.config.sleeping.get() ? "§aON" : "§cOFF"))); + sendMessage(context, literal("§7Time acceleration: " + (TT20.config.time.get() ? "§aON" : "§cOFF"))); + sendMessage(context, literal("§7Bow pull acceleration: " + (TT20.config.bow.get() ? "§aON" : "§cOFF"))); + sendMessage(context, literal("§7Crossbow pull acceleration: " + (TT20.config.crossbow.get() ? "§aON" : "§cOFF"))); + sendMessage(context, literal("§7TNT acceleration: " + (TT20.config.tnt.get() ? "§aON" : "§cOFF"))); + sendMessage(context, literal("§7Vanilla Lagback: " + (TT20.config.lagback.get() ? "§aON" : "§cOFF"))); + sendMessage(context, literal("§7Random tickspeed acceleration: " + (TT20.config.randomTickSpeed.get() ? "§aON" : "§cOFF"))); + sendMessage(context, literal("§7Server watchdog: " + (TT20.config.watchdog.get() ? "§aON" : "§cOFF"))); executeTps(context, false); sendMessage(context, literal("\n§8Version: §7" + TT20.VERSION)); sendMessage(context, literal("§8MSPT: §7" + TT20.TPS_CALCULATOR.getMSPT())); sendMessage(context, literal("§8Missed ticks: §7" + TPSUtil.formatMissedTicks(TT20.TPS_CALCULATOR.getAllMissedTicks()))); - sendMessage(context, literal("§8Automatic updater: §7" + (TT20.config.automaticUpdater() ? "§aenabled" : "§cdisabled"))); + sendMessage(context, literal("§8Updater checker: §7" + (TT20.config.updateChecker.get() ? "§aenabled" : "§cdisabled"))); return 1; } @@ -58,8 +58,6 @@ private static int executeStatus(CommandContext context) { private static int executeReload(CommandContext context) { TT20.config.reload(); sendMessage(context, literal("Reloaded config")); - TT20.blockEntityMaskConfig.reload(); - sendMessage(context, literal("Reloaded block entity mask config")); return 1; } @@ -81,10 +79,10 @@ private static int executeTps(CommandContext context, boolea } private static int executeToggle(CommandContext context) { - TT20.config.enabled(!TT20.config.enabled()); + TT20.config.enabled.set(!TT20.config.enabled.get()); TT20.config.save(); - String enabledText = TT20.config.enabled() ? "enabled" : "disabled"; + String enabledText = TT20.config.enabled.get() ? "enabled" : "disabled"; sendMessage(context, literal("TT20 is now " + enabledText)); return 1; @@ -92,8 +90,8 @@ private static int executeToggle(CommandContext context) { private static int executeMain(CommandContext context) { - sendMessage(context, literal("Running TT20 version " + TT20.VERSION)); - sendMessage(context, literal("Enabled: " + TT20.config.enabled())); + sendMessage(context, literal("Running TT20 version " + TT20.VERSION + " (PATCH: " + TT20.PATCH + ")")); + sendMessage(context, literal("Enabled: " + TT20.config.enabled.get())); return 1; } diff --git a/src/main/java/net/snackbag/tt20/config/TT20Config.java b/src/main/java/net/snackbag/tt20/TT20Config.java similarity index 76% rename from src/main/java/net/snackbag/tt20/config/TT20Config.java rename to src/main/java/net/snackbag/tt20/TT20Config.java index 1a9314c..d1b29e1 100644 --- a/src/main/java/net/snackbag/tt20/config/TT20Config.java +++ b/src/main/java/net/snackbag/tt20/TT20Config.java @@ -1,13 +1,12 @@ -package net.snackbag.tt20.config; - -import net.snackbag.tt20.TT20; -import net.snackbag.tt20.config.lib.CExporter; -import net.snackbag.tt20.config.lib.utils.CCategory; -import net.snackbag.tt20.config.lib.CConfig; -import net.snackbag.tt20.config.lib.types.CBoolean; -import net.snackbag.tt20.config.lib.types.CEnum; -import net.snackbag.tt20.config.lib.types.CMask; -import net.snackbag.tt20.config.lib.utils.MaskType; +package net.snackbag.tt20; + +import dev.lemonnik.fern_config.CConfig; +import dev.lemonnik.fern_config.CExporter; +import dev.lemonnik.fern_config.types.CBoolean; +import dev.lemonnik.fern_config.types.CEnum; +import dev.lemonnik.fern_config.types.CMask; +import dev.lemonnik.fern_config.utils.CCategory; +import dev.lemonnik.fern_config.utils.MaskType; import org.jetbrains.annotations.NotNull; public class TT20Config extends CConfig { @@ -33,16 +32,18 @@ public class TT20Config extends CConfig { public final CBoolean portal = register(MAIN, new CBoolean("portal", "time in portal acceleration", true)); public final CBoolean sleeping = register(MAIN, new CBoolean("sleeping", "time laying in bed acceleration", true)); public final CBoolean time = register(MAIN, new CBoolean("time", "daytime acceleration", true)); + public final CBoolean bow = register(MAIN, new CBoolean("bow", "bow charge acceleration", true)); + public final CBoolean crossbow = register(MAIN, new CBoolean("crossbow", "crossbow charge acceleration", true)); public final CBoolean randomTickSpeed = register(MAIN, new CBoolean("randomTickSpeed", "random tick speed acceleration (ex. crop growth)", true)); public final CBoolean tnt = register(MAIN, new CBoolean("tnt", "tnt timer acceleration", false)); public final CBoolean lagback = register(MAIN, new CBoolean("lagback", "vanilla player lagback", true)); - public final CBoolean serverWatchdog = register(MAIN, new CBoolean("serverWatchdog", "server watchdog (vanilla's stop server after 1 minute of freeze behaviour)", true)); + public final CBoolean watchdog = register(MAIN, new CBoolean("watchdog", "server watchdog (vanilla's stop server after 1 minute of freeze behaviour)", true)); public final CBoolean singlePlayerWarning = register(MAIN, new CBoolean("singlePlayerWarning","should show warn if loading in a singleplayer?", true)); - public final CBoolean automaticUpdater = register(MAIN, new CBoolean("automaticUpdater", "automatic update checker", true)); + public final CBoolean updateChecker = register(MAIN, new CBoolean("updateChecker", "automatic update checker", true)); private static final CCategory BLOCK_ENTITY_MASK = CCategory.of("block_entity_mask", "Block Entity Mask configuration", "Only change this if you know what you're doing!"); public final CEnum blockEntityMaskType = register(BLOCK_ENTITY_MASK, new CEnum<>("type", "mask type", MaskType.class, MaskType.WHITELIST)); - public final CMask blockEntityMask = register(BLOCK_ENTITY_MASK, new CMask("blocks", "block entity mask", new String[] {"*:*"}, "type", this)); + public final CMask blockEntityMask = register(BLOCK_ENTITY_MASK, new CMask("blocks", "block entity mask", "type", this, "*:*")); } diff --git a/src/main/java/net/snackbag/tt20/mixin/LivingEntityMixin.java b/src/main/java/net/snackbag/tt20/mixin/LivingEntityMixin.java index 4e1d3f4..1e7a86e 100644 --- a/src/main/java/net/snackbag/tt20/mixin/LivingEntityMixin.java +++ b/src/main/java/net/snackbag/tt20/mixin/LivingEntityMixin.java @@ -15,7 +15,7 @@ public abstract class LivingEntityMixin { @Inject(method = "baseTick", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/LivingEntity;tickEffects()V")) private void fixPotionDelayTick(CallbackInfo ci) { - if (!TT20.config.enabled() || !TT20.config.potionEffectAcceleration()) return; + if (!TT20.config.enabled.get() || !TT20.config.potionEffect.get()) return; //? if >=1.20.1 { if (((Entity)(Object)this).level().isClientSide()) return; //?} else { diff --git a/src/main/java/net/snackbag/tt20/mixin/PlayerMixin.java b/src/main/java/net/snackbag/tt20/mixin/PlayerMixin.java index f109f8f..1d780aa 100644 --- a/src/main/java/net/snackbag/tt20/mixin/PlayerMixin.java +++ b/src/main/java/net/snackbag/tt20/mixin/PlayerMixin.java @@ -15,7 +15,7 @@ public abstract class PlayerMixin { //? if <=1.20.5 { @ModifyReturnValue(method = "getPortalWaitTime", at = @At("RETURN")) private int netherPortalTimeTT20(int original) { - if (!TT20.config.enabled() || !TT20.config.portalAcceleration()) return original; + if (!TT20.config.enabled.get() || !TT20.config.portal.get()) return original; //? if >1.19.2 { if (((Entity)(Object)this).level().isClientSide()) return original; //?} else { @@ -31,7 +31,7 @@ private int netherPortalTimeTT20(int original) { private int tickTT20(int original) { Player player = (Player)(Object)this; - if (!TT20.config.enabled() || !TT20.config.sleepingAcceleration()) return original; + if (!TT20.config.enabled.get() || !TT20.config.sleeping.get()) return original; //? if >=1.20.1 { if (((Entity)(Object)this).level().isClientSide()) return original; //?} else { diff --git a/src/main/java/net/snackbag/tt20/mixin/PrimedTntMixin.java b/src/main/java/net/snackbag/tt20/mixin/PrimedTntMixin.java index 2183723..6755249 100644 --- a/src/main/java/net/snackbag/tt20/mixin/PrimedTntMixin.java +++ b/src/main/java/net/snackbag/tt20/mixin/PrimedTntMixin.java @@ -15,6 +15,7 @@ public class PrimedTntMixin { ordinal = 0 ) private int modifyFuseDecrement(int original) { - return TT20.config.tntAcceleration() ? original + TT20.TPS_CALCULATOR.applicableMissedTicks() : original; + if (!TT20.config.enabled.get() || !TT20.config.tnt.get()) return original; + return original + TT20.TPS_CALCULATOR.applicableMissedTicks(); } } \ No newline at end of file diff --git a/src/main/java/net/snackbag/tt20/mixin/ServerGamePacketListenerImplMixin.java b/src/main/java/net/snackbag/tt20/mixin/ServerGamePacketListenerImplMixin.java index e0a4080..24442ac 100644 --- a/src/main/java/net/snackbag/tt20/mixin/ServerGamePacketListenerImplMixin.java +++ b/src/main/java/net/snackbag/tt20/mixin/ServerGamePacketListenerImplMixin.java @@ -20,6 +20,7 @@ public class ServerGamePacketListenerImplMixin { cancellable = true ) private void onMovedTooQuickly(ServerboundMovePlayerPacket packet, CallbackInfo ci) { - if (!TT20.config.vanillaLagback()) ci.cancel(); + if (!TT20.config.enabled.get() || TT20.config.lagback.get()) return; + ci.cancel(); } } \ No newline at end of file diff --git a/src/main/java/net/snackbag/tt20/mixin/ServerPlayerManagerMixin.java b/src/main/java/net/snackbag/tt20/mixin/ServerPlayerManagerMixin.java index a0e451d..4fef3de 100644 --- a/src/main/java/net/snackbag/tt20/mixin/ServerPlayerManagerMixin.java +++ b/src/main/java/net/snackbag/tt20/mixin/ServerPlayerManagerMixin.java @@ -15,6 +15,8 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import java.util.concurrent.CompletableFuture; + import static net.snackbag.tt20.TT20.literal; import static net.snackbag.tt20.TT20.sendMessage; @@ -27,14 +29,23 @@ public abstract class ServerPlayerManagerMixin { *///?} else { private void sendPlayerUpdateMessageIfCorrectPermissions(Connection netManager, ServerPlayer player, CallbackInfo ci) { //?} - if (!TT20.config.automaticUpdater() || !ModUpdater.hasUpdate) return; //? if >=1.21.9 { /*if (((ServerPlayerAccessor) player).getServer().getPlayerList().isOp(player.nameAndId())) { *///?} else { if (player.getServer().getPlayerList().isOp(player.getGameProfile())) { //?} - sendMessage(player, literal(ModUpdater.updateMessage)); - sendMessage(player, literal("§oOnly operators can see this message")); + CompletableFuture.runAsync(() -> { + try { + ModUpdater.check(); + if (!ModUpdater.hasUpdate) return; + + sendMessage(player, literal(ModUpdater.updateMessage)); + sendMessage(player, literal("§oOnly operators can see this message")); + } catch (RuntimeException e) { + TT20.LOGGER.error("Failed to check for updates."); + e.printStackTrace(); + } + }); } } } diff --git a/src/main/java/net/snackbag/tt20/mixin/ServerWatchdogMixin.java b/src/main/java/net/snackbag/tt20/mixin/ServerWatchdogMixin.java index 8b973ef..ac2a824 100644 --- a/src/main/java/net/snackbag/tt20/mixin/ServerWatchdogMixin.java +++ b/src/main/java/net/snackbag/tt20/mixin/ServerWatchdogMixin.java @@ -19,6 +19,7 @@ public class ServerWatchdogMixin { //?} ) private long disableWatchdog(long original) { - return TT20.config.serverWatchdog() ? original : 0; + if (!TT20.config.enabled.get() || TT20.config.watchdog.get()) return original; + return 0; } } \ No newline at end of file diff --git a/src/main/java/net/snackbag/tt20/mixin/fluid/LavaFluidMixin.java b/src/main/java/net/snackbag/tt20/mixin/fluid/LavaFluidMixin.java index 48079ca..7f020ed 100644 --- a/src/main/java/net/snackbag/tt20/mixin/fluid/LavaFluidMixin.java +++ b/src/main/java/net/snackbag/tt20/mixin/fluid/LavaFluidMixin.java @@ -11,7 +11,7 @@ public abstract class LavaFluidMixin { @ModifyReturnValue(method = "getTickDelay", at = @At("RETURN")) private int tickRateTT20(int original) { - if (!TT20.config.enabled() || !TT20.config.fluidAcceleration()) return original; + if (!TT20.config.enabled.get() || !TT20.config.fluid.get()) return original; return TPSUtil.tt20(original, true); } } diff --git a/src/main/java/net/snackbag/tt20/mixin/fluid/WaterFluidMixin.java b/src/main/java/net/snackbag/tt20/mixin/fluid/WaterFluidMixin.java index ca57b77..d8b3690 100644 --- a/src/main/java/net/snackbag/tt20/mixin/fluid/WaterFluidMixin.java +++ b/src/main/java/net/snackbag/tt20/mixin/fluid/WaterFluidMixin.java @@ -11,7 +11,7 @@ public abstract class WaterFluidMixin { @ModifyReturnValue(method = "getTickDelay", at = @At("RETURN")) private int tickRateTT20(int original) { - if (!TT20.config.enabled() || !TT20.config.fluidAcceleration()) return original; + if (!TT20.config.enabled.get() || !TT20.config.fluid.get()) return original; return TPSUtil.tt20(original, true); } } diff --git a/src/main/java/net/snackbag/tt20/mixin/item/BowItemMixin.java b/src/main/java/net/snackbag/tt20/mixin/item/BowItemMixin.java index 2e3a532..82f9c92 100644 --- a/src/main/java/net/snackbag/tt20/mixin/item/BowItemMixin.java +++ b/src/main/java/net/snackbag/tt20/mixin/item/BowItemMixin.java @@ -11,7 +11,7 @@ public class BowItemMixin { @ModifyReturnValue(method = "getPowerForTime", at = @At("RETURN")) private static float bowProgress(float original) { - if (!TT20.config.enabled() || !TT20.config.bowAcceleration()) return original; + if (!TT20.config.enabled.get() || !TT20.config.bow.get()) return original; return original * TPSCalculator.MAX_TPS / (float) TT20.TPS_CALCULATOR.getMostAccurateTPS(); } diff --git a/src/main/java/net/snackbag/tt20/mixin/item/CrossbowItemMixin.java b/src/main/java/net/snackbag/tt20/mixin/item/CrossbowItemMixin.java index b5832e6..425cf9b 100644 --- a/src/main/java/net/snackbag/tt20/mixin/item/CrossbowItemMixin.java +++ b/src/main/java/net/snackbag/tt20/mixin/item/CrossbowItemMixin.java @@ -11,7 +11,7 @@ public class CrossbowItemMixin { @ModifyReturnValue(method = "getPowerForTime", at = @At("RETURN")) private static float crossbowProgress(float original) { - if (!TT20.config.enabled() || !TT20.config.crossbowAcceleration()) return original; + if (!TT20.config.enabled.get() || !TT20.config.crossbow.get()) return original; return original * TPSCalculator.MAX_TPS / (float) TT20.TPS_CALCULATOR.getMostAccurateTPS(); } diff --git a/src/main/java/net/snackbag/tt20/mixin/item/ItemEntityMixin.java b/src/main/java/net/snackbag/tt20/mixin/item/ItemEntityMixin.java index 07e2db9..bb0c158 100644 --- a/src/main/java/net/snackbag/tt20/mixin/item/ItemEntityMixin.java +++ b/src/main/java/net/snackbag/tt20/mixin/item/ItemEntityMixin.java @@ -15,7 +15,7 @@ public abstract class ItemEntityMixin { @Inject(method = "tick", at = @At("HEAD")) private void pickupDelayTT20(CallbackInfo ci) { - if (!TT20.config.enabled() || !TT20.config.pickupAcceleration()) return; + if (!TT20.config.enabled.get() || !TT20.config.pickup.get()) return; //? if >=1.20.1 { if (((Entity)(Object)this).level().isClientSide()) return; //?} else { diff --git a/src/main/java/net/snackbag/tt20/mixin/item/ItemMixin.java b/src/main/java/net/snackbag/tt20/mixin/item/ItemMixin.java index 284adae..d15747f 100644 --- a/src/main/java/net/snackbag/tt20/mixin/item/ItemMixin.java +++ b/src/main/java/net/snackbag/tt20/mixin/item/ItemMixin.java @@ -11,7 +11,7 @@ public abstract class ItemMixin { @ModifyReturnValue(method = "getUseDuration", at = @At(value = "RETURN", ordinal = 0)) private int onGetMaxUseTime(int original) { - if (!TT20.config.enabled() || !TT20.config.eatingAcceleration() || original == 0) return original; + if (!TT20.config.enabled.get() || !TT20.config.eating.get() || original == 0) return original; return TPSUtil.tt20(original, true); } } diff --git a/src/main/java/net/snackbag/tt20/mixin/world/BlockBehaviourMixin.java b/src/main/java/net/snackbag/tt20/mixin/world/BlockBehaviourMixin.java index 8424026..fe287a9 100644 --- a/src/main/java/net/snackbag/tt20/mixin/world/BlockBehaviourMixin.java +++ b/src/main/java/net/snackbag/tt20/mixin/world/BlockBehaviourMixin.java @@ -13,7 +13,7 @@ public abstract class BlockBehaviourMixin { @ModifyReturnValue(method = "getDestroyProgress", at = @At("RETURN")) private float onBlockBreakingCalc(float original, @Local(argsOnly = true) Player player) { - if (!TT20.config.enabled() || !TT20.config.blockBreakingAcceleration()) return original; + if (!TT20.config.enabled.get() || !TT20.config.blockBreaking.get()) return original; //? if >=1.20.1 { if (player.level().isClientSide()) return original; //?} else { diff --git a/src/main/java/net/snackbag/tt20/mixin/world/GameRulesMixin.java b/src/main/java/net/snackbag/tt20/mixin/world/GameRulesMixin.java index 10c2ba6..46f2d34 100644 --- a/src/main/java/net/snackbag/tt20/mixin/world/GameRulesMixin.java +++ b/src/main/java/net/snackbag/tt20/mixin/world/GameRulesMixin.java @@ -22,7 +22,7 @@ private Object randomTickSpeedAcceleration(Object original, @Local(argsOnly = tr @ModifyReturnValue(method = "getInt", at = @At("RETURN")) private int randomTickSpeedAcceleration(int original, @Local(argsOnly = true) GameRules.Key key) { //?} - if (!TT20.config.enabled() || !TT20.config.randomTickSpeedAcceleration()) return original; + if (!TT20.config.enabled.get() || !TT20.config.randomTickSpeed.get()) return original; //? if (>=1.21.11) { /*if (gameRule != GameRules.RANDOM_TICK_SPEED) return original; diff --git a/src/main/java/net/snackbag/tt20/mixin/world/LevelChunkMixin.java b/src/main/java/net/snackbag/tt20/mixin/world/LevelChunkMixin.java index 5721b56..5b1a099 100644 --- a/src/main/java/net/snackbag/tt20/mixin/world/LevelChunkMixin.java +++ b/src/main/java/net/snackbag/tt20/mixin/world/LevelChunkMixin.java @@ -30,17 +30,16 @@ private void onTick( Operation original ) { original.call(instance, world, blockPos, blockState, blockEntity); - if (!TT20.config.enabled()) return; - if (!TT20.config.blockEntityAcceleration()) return; + if (!TT20.config.enabled.get() || !TT20.config.blockEntity.get()) return; if (world.isClientSide()) return; //? if >=1.21.2 { /*Registry registry = world.registryAccess().lookupOrThrow(Registries.BLOCK); - if (!TT20.blockEntityMaskConfig.getMask().isOkay(registry.getKey(blockState.getBlock()))) return; + if (!TT20.config.blockEntityMask.get().isOkay(registry.getKey(blockState.getBlock()))) return; *///?} else if >=1.20.1 { Registry registry = world.registryAccess().registryOrThrow(Registries.BLOCK); - if (!TT20.blockEntityMaskConfig.getMask().isOkay(registry.getKey(blockState.getBlock()))) return; + if (!TT20.config.blockEntityMask.get().isOkay(registry.getKey(blockState.getBlock()))) return; //?} else { - /*if (!TT20.blockEntityMaskConfig.getMask().isOkay(Registry.BLOCK.getKey(blockState.getBlock()))) return; + /*if (!TT20.config.blockEntityMask.get().isOkay(Registry.BLOCK.getKey(blockState.getBlock()))) return; *///?} for (int i = 0; i < TT20.TPS_CALCULATOR.applicableMissedTicks(); i++) { diff --git a/src/main/java/net/snackbag/tt20/mixin/world/ServerLevelMixin.java b/src/main/java/net/snackbag/tt20/mixin/world/ServerLevelMixin.java index 579566f..f7610e7 100644 --- a/src/main/java/net/snackbag/tt20/mixin/world/ServerLevelMixin.java +++ b/src/main/java/net/snackbag/tt20/mixin/world/ServerLevelMixin.java @@ -16,7 +16,7 @@ public abstract class ServerLevelMixin { @Inject(method = "tickTime", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/level/ServerLevel;setDayTime(J)V")) //?} private void applyMissedTicks(CallbackInfo ci) { - if (!TT20.config.enabled() || !TT20.config.timeAcceleration()) return; + if (!TT20.config.enabled.get() || !TT20.config.time.get()) return; ServerLevel self = (ServerLevel) (Object) this; diff --git a/versions/fabric-1.19.2/gradle.properties b/versions/fabric-1.19.2/gradle.properties index 19d9128..2ae50e7 100644 --- a/versions/fabric-1.19.2/gradle.properties +++ b/versions/fabric-1.19.2/gradle.properties @@ -9,3 +9,4 @@ minecraft_dependency= =1.19.2 # Dependencies modmenu_version=4.2.0-beta.2 +fern_version=0.1.0+mc1.19.2-fabric \ No newline at end of file diff --git a/versions/fabric-1.20.1/gradle.properties b/versions/fabric-1.20.1/gradle.properties index f64d14b..a87ed65 100644 --- a/versions/fabric-1.20.1/gradle.properties +++ b/versions/fabric-1.20.1/gradle.properties @@ -9,3 +9,4 @@ minecraft_dependency= >=1.20 <1.20.5 # Dependencies modmenu_version=7.2.2 +fern_version=0.1.0+mc1.20.1-fabric diff --git a/versions/fabric-1.20.5/gradle.properties b/versions/fabric-1.20.5/gradle.properties index 0b086e5..012deb4 100644 --- a/versions/fabric-1.20.5/gradle.properties +++ b/versions/fabric-1.20.5/gradle.properties @@ -9,4 +9,5 @@ minecraft_dependency= >=1.20.5 <=1.20.6 # Dependencies modmenu_version=10.0.0 -fabric_api_version=0.97.8+1.20.5 \ No newline at end of file +fabric_api_version=0.97.8+1.20.5 +fern_version=0.1.0+mc1.20.5-fabric \ No newline at end of file diff --git a/versions/fabric-1.21.1/gradle.properties b/versions/fabric-1.21.1/gradle.properties index 22f5bbb..65471a6 100644 --- a/versions/fabric-1.21.1/gradle.properties +++ b/versions/fabric-1.21.1/gradle.properties @@ -9,4 +9,5 @@ minecraft_dependency= >=1.21 <=1.21.1 # Dependencies modmenu_version=11.0.4 -fabric_api_version=0.116.10+1.21.1 \ No newline at end of file +fabric_api_version=0.116.10+1.21.1 +fern_version=0.1.0+mc1.21.1-fabric \ No newline at end of file diff --git a/versions/fabric-1.21.11/gradle.properties b/versions/fabric-1.21.11/gradle.properties index 740076e..2dfc925 100644 --- a/versions/fabric-1.21.11/gradle.properties +++ b/versions/fabric-1.21.11/gradle.properties @@ -9,4 +9,5 @@ minecraft_dependency= =1.21.11 # Dependencies modmenu_version=17.0.0 -fabric_api_version=0.141.3+1.21.11 \ No newline at end of file +fabric_api_version=0.141.3+1.21.11 +fern_version=0.1.0+mc1.21.11-fabric \ No newline at end of file diff --git a/versions/fabric-1.21.2/gradle.properties b/versions/fabric-1.21.2/gradle.properties index 8c5f442..20e4e00 100644 --- a/versions/fabric-1.21.2/gradle.properties +++ b/versions/fabric-1.21.2/gradle.properties @@ -9,4 +9,5 @@ minecraft_dependency= >=1.21.2 <=1.21.8 # Dependencies modmenu_version=12.0.0 -fabric_api_version=0.106.1+1.21.2 \ No newline at end of file +fabric_api_version=0.106.1+1.21.2 +fern_version=0.1.0+mc1.21.2-fabric \ No newline at end of file diff --git a/versions/fabric-1.21.9/gradle.properties b/versions/fabric-1.21.9/gradle.properties index 4e15410..204b626 100644 --- a/versions/fabric-1.21.9/gradle.properties +++ b/versions/fabric-1.21.9/gradle.properties @@ -9,4 +9,5 @@ minecraft_dependency= >=1.21.9 <=1.21.10 # Dependencies modmenu_version=16.0.1 -fabric_api_version=0.134.1+1.21.9 \ No newline at end of file +fabric_api_version=0.134.1+1.21.9 +fern_version=0.1.0+mc1.21.9-fabric \ No newline at end of file diff --git a/versions/fabric-26.1.1/gradle.properties b/versions/fabric-26.1.1/gradle.properties index 2f47873..4b833a1 100644 --- a/versions/fabric-26.1.1/gradle.properties +++ b/versions/fabric-26.1.1/gradle.properties @@ -9,4 +9,5 @@ minecraft_dependency= ~26.1 # Dependencies modmenu_version=18.0.0-alpha.8 -fabric_api_version=0.145.4+26.1.1 \ No newline at end of file +fabric_api_version=0.145.4+26.1.1 +fern_version=0.1.0+mc26.1.2-fabric \ No newline at end of file diff --git a/versions/forge-1.18.2/gradle.properties b/versions/forge-1.18.2/gradle.properties index 6218d7e..00dcd57 100644 --- a/versions/forge-1.18.2/gradle.properties +++ b/versions/forge-1.18.2/gradle.properties @@ -8,3 +8,4 @@ forge_version=40.3.12 minecraft_dependency=[1.18, 1.18.2] # Dependencies +fern_version=0.1.0+mc1.18.2-forge \ No newline at end of file diff --git a/versions/forge-1.19.2/gradle.properties b/versions/forge-1.19.2/gradle.properties index 60c3bae..d917f15 100644 --- a/versions/forge-1.19.2/gradle.properties +++ b/versions/forge-1.19.2/gradle.properties @@ -8,3 +8,4 @@ forge_version=43.5.2 minecraft_dependency=[1.19, 1.19.2] # Dependencies +fern_version=0.1.0+mc1.19.2-forge \ No newline at end of file diff --git a/versions/forge-1.20.1/gradle.properties b/versions/forge-1.20.1/gradle.properties index 781783f..d395b9b 100644 --- a/versions/forge-1.20.1/gradle.properties +++ b/versions/forge-1.20.1/gradle.properties @@ -8,3 +8,4 @@ forge_version=47.4.18 minecraft_dependency=[1.20.1, 1.20.4] # Dependencies +fern_version=0.1.0+mc1.20.1-forge \ No newline at end of file diff --git a/versions/neoforge-1.20.3/gradle.properties b/versions/neoforge-1.20.3/gradle.properties index 9e81bf6..f77edc3 100644 --- a/versions/neoforge-1.20.3/gradle.properties +++ b/versions/neoforge-1.20.3/gradle.properties @@ -9,3 +9,4 @@ neoforge_version=20.3.8-beta minecraft_dependency=[1.20.3, 1.20.4] # Dependencies +fern_version=0.1.0+mc1.20.3-neoforge \ No newline at end of file diff --git a/versions/neoforge-1.20.5/gradle.properties b/versions/neoforge-1.20.5/gradle.properties index da808e6..207f3f1 100644 --- a/versions/neoforge-1.20.5/gradle.properties +++ b/versions/neoforge-1.20.5/gradle.properties @@ -9,3 +9,4 @@ neoforge_version=20.5.21-beta minecraft_dependency=[1.20.5, 1.20.6] # Dependencies +fern_version=0.1.0+mc1.20.5-neoforge \ No newline at end of file diff --git a/versions/neoforge-1.21.1/gradle.properties b/versions/neoforge-1.21.1/gradle.properties index 764cf19..24cbd74 100644 --- a/versions/neoforge-1.21.1/gradle.properties +++ b/versions/neoforge-1.21.1/gradle.properties @@ -9,3 +9,4 @@ neoforge_version=21.1.224 minecraft_dependency=[1.21, 1.21.1] # Dependencies +fern_version=0.1.0+mc1.21.1-neoforge \ No newline at end of file diff --git a/versions/neoforge-1.21.11/gradle.properties b/versions/neoforge-1.21.11/gradle.properties index 305ece5..576edf5 100644 --- a/versions/neoforge-1.21.11/gradle.properties +++ b/versions/neoforge-1.21.11/gradle.properties @@ -9,3 +9,4 @@ neoforge_version=21.11.42 minecraft_dependency=[1.21.11] # Dependencies +fern_version=0.1.0+mc1.21.11-neoforge \ No newline at end of file diff --git a/versions/neoforge-1.21.2/gradle.properties b/versions/neoforge-1.21.2/gradle.properties index 3457374..9b48627 100644 --- a/versions/neoforge-1.21.2/gradle.properties +++ b/versions/neoforge-1.21.2/gradle.properties @@ -9,3 +9,4 @@ neoforge_version=21.2.1-beta minecraft_dependency=[1.21.2, 1.21.8] # Dependencies +fern_version=0.1.0+mc1.21.2-neoforge \ No newline at end of file diff --git a/versions/neoforge-1.21.9/gradle.properties b/versions/neoforge-1.21.9/gradle.properties index 7214875..8f6bfdd 100644 --- a/versions/neoforge-1.21.9/gradle.properties +++ b/versions/neoforge-1.21.9/gradle.properties @@ -9,3 +9,4 @@ neoforge_version=21.9.16-beta minecraft_dependency=[1.21.9, 1.21.10] # Dependencies +fern_version=0.1.0+mc1.21.9-neoforge \ No newline at end of file diff --git a/versions/neoforge-26.1.1/gradle.properties b/versions/neoforge-26.1.1/gradle.properties index d005a7e..90c410d 100644 --- a/versions/neoforge-26.1.1/gradle.properties +++ b/versions/neoforge-26.1.1/gradle.properties @@ -9,3 +9,4 @@ neoforge_version=26.1.1.10-beta minecraft_dependency=[26.1, 26.1.2] # Dependencies +fern_version=0.1.0+mc26.1.2-neoforge \ No newline at end of file From 0fef3102424cc7fed3a36b6cafca317a8162995a Mon Sep 17 00:00:00 2001 From: lemonnik Date: Sat, 6 Jun 2026 22:16:35 +0200 Subject: [PATCH 32/39] oh and fix mixins --- src/main/java/net/snackbag/tt20/TT20.java | 2 +- .../java/net/snackbag/tt20/mixin/PortalProcessorMixin.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/net/snackbag/tt20/TT20.java b/src/main/java/net/snackbag/tt20/TT20.java index 6134e62..72a0f8c 100644 --- a/src/main/java/net/snackbag/tt20/TT20.java +++ b/src/main/java/net/snackbag/tt20/TT20.java @@ -48,7 +48,7 @@ public class TT20 public static final Logger LOGGER = LoggerFactory.getLogger(MOD_ID); public static final TPSCalculator TPS_CALCULATOR = new TPSCalculator(); - public static final String VERSION = /*$ mod_version */"0.8.3"; + public static final String VERSION = /*$ mod_version */"1.8.3"; public static final int PATCH = 3; public static final TT20Config config = new TT20Config(); diff --git a/src/main/java/net/snackbag/tt20/mixin/PortalProcessorMixin.java b/src/main/java/net/snackbag/tt20/mixin/PortalProcessorMixin.java index 0c38486..0c840db 100644 --- a/src/main/java/net/snackbag/tt20/mixin/PortalProcessorMixin.java +++ b/src/main/java/net/snackbag/tt20/mixin/PortalProcessorMixin.java @@ -18,7 +18,7 @@ public abstract class PortalProcessorMixin { @ModifyExpressionValue(method = "processPortalTeleportation", at = @At(value = "FIELD", target = "Lnet/minecraft/world/entity/PortalProcessor;portalTime:I", opcode = Opcodes.GETFIELD)) private int runMissedTicks(int original, @Local ServerLevel world) { - if (!TT20.config.enabled() || !TT20.config.portalAcceleration()) return original; + if (!TT20.config.enabled.get() || !TT20.config.portal.get()) return original; if (world.isClientSide()) return original; portalTime = portalTime + TT20.TPS_CALCULATOR.applicableMissedTicks(); @@ -43,7 +43,7 @@ public abstract class PortalProcessorMixin { @ModifyExpressionValue(method = "processPortalTeleportation", at = @At(value = "FIELD", target = "Lnet/minecraft/world/entity/PortalProcessor;portalTime:I", opcode = Opcodes.GETFIELD)) private int runMissedTicks(int original, @Local ServerLevel level) { - if (!TT20.config.enabled() || !TT20.config.portalAcceleration()) return original; + if (!TT20.config.enabled.get() || !TT20.config.portal.get()) return original; if (level.isClientSide()) return original; portalTime = portalTime + TT20.TPS_CALCULATOR.applicableMissedTicks(); From fb39f3d20546cfab9e7d874ee5242edfd49c9ef5 Mon Sep 17 00:00:00 2001 From: lemonnik Date: Fri, 12 Jun 2026 09:26:38 +0200 Subject: [PATCH 33/39] new maven url --- build.gradle | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 8a62198..b94dd1a 100644 --- a/build.gradle +++ b/build.gradle @@ -46,8 +46,7 @@ repositories { } maven { name "lemonnik's maven" - url "http://lemonnik.ddns.net:16555/releases" - allowInsecureProtocol = true + url "https://maven.lemonnik.dev/releases/" } } From e17b2fc05c714454be0baf130b31e578b8bde671 Mon Sep 17 00:00:00 2001 From: lemonnik Date: Tue, 16 Jun 2026 00:31:18 +0200 Subject: [PATCH 34/39] bump fern to 1.2.0 --- fern-updater.sh | 9 +++++++++ versions/fabric-1.19.2/gradle.properties | 2 +- versions/fabric-1.20.1/gradle.properties | 2 +- versions/fabric-1.20.5/gradle.properties | 2 +- versions/fabric-1.21.1/gradle.properties | 2 +- versions/fabric-1.21.11/gradle.properties | 2 +- versions/fabric-1.21.2/gradle.properties | 2 +- versions/fabric-1.21.9/gradle.properties | 2 +- versions/fabric-26.1.1/gradle.properties | 2 +- versions/forge-1.18.2/gradle.properties | 2 +- versions/forge-1.19.2/gradle.properties | 2 +- versions/forge-1.20.1/gradle.properties | 2 +- versions/neoforge-1.20.3/gradle.properties | 2 +- versions/neoforge-1.20.5/gradle.properties | 2 +- versions/neoforge-1.21.1/gradle.properties | 2 +- versions/neoforge-1.21.11/gradle.properties | 2 +- versions/neoforge-1.21.2/gradle.properties | 2 +- versions/neoforge-1.21.9/gradle.properties | 2 +- versions/neoforge-26.1.1/gradle.properties | 2 +- 19 files changed, 27 insertions(+), 18 deletions(-) create mode 100644 fern-updater.sh diff --git a/fern-updater.sh b/fern-updater.sh new file mode 100644 index 0000000..b9ad062 --- /dev/null +++ b/fern-updater.sh @@ -0,0 +1,9 @@ +#!/bin/bash + +OLD_PREFIX="0.1.0" +NEW_PREFIX="1.2.0" + +find versions -type f -name "gradle.properties" | while read -r file; do + sed -i "s/\(fern_version=\)${OLD_PREFIX}/\1${NEW_PREFIX}/" "$file" + echo "Updated $file" +done \ No newline at end of file diff --git a/versions/fabric-1.19.2/gradle.properties b/versions/fabric-1.19.2/gradle.properties index 2ae50e7..239b54c 100644 --- a/versions/fabric-1.19.2/gradle.properties +++ b/versions/fabric-1.19.2/gradle.properties @@ -9,4 +9,4 @@ minecraft_dependency= =1.19.2 # Dependencies modmenu_version=4.2.0-beta.2 -fern_version=0.1.0+mc1.19.2-fabric \ No newline at end of file +fern_version=1.2.0+mc1.19.2-fabric \ No newline at end of file diff --git a/versions/fabric-1.20.1/gradle.properties b/versions/fabric-1.20.1/gradle.properties index a87ed65..38b565d 100644 --- a/versions/fabric-1.20.1/gradle.properties +++ b/versions/fabric-1.20.1/gradle.properties @@ -9,4 +9,4 @@ minecraft_dependency= >=1.20 <1.20.5 # Dependencies modmenu_version=7.2.2 -fern_version=0.1.0+mc1.20.1-fabric +fern_version=1.2.0+mc1.20.1-fabric diff --git a/versions/fabric-1.20.5/gradle.properties b/versions/fabric-1.20.5/gradle.properties index 012deb4..73722b3 100644 --- a/versions/fabric-1.20.5/gradle.properties +++ b/versions/fabric-1.20.5/gradle.properties @@ -10,4 +10,4 @@ minecraft_dependency= >=1.20.5 <=1.20.6 # Dependencies modmenu_version=10.0.0 fabric_api_version=0.97.8+1.20.5 -fern_version=0.1.0+mc1.20.5-fabric \ No newline at end of file +fern_version=1.2.0+mc1.20.5-fabric \ No newline at end of file diff --git a/versions/fabric-1.21.1/gradle.properties b/versions/fabric-1.21.1/gradle.properties index 65471a6..720e0c5 100644 --- a/versions/fabric-1.21.1/gradle.properties +++ b/versions/fabric-1.21.1/gradle.properties @@ -10,4 +10,4 @@ minecraft_dependency= >=1.21 <=1.21.1 # Dependencies modmenu_version=11.0.4 fabric_api_version=0.116.10+1.21.1 -fern_version=0.1.0+mc1.21.1-fabric \ No newline at end of file +fern_version=1.2.0+mc1.21.1-fabric \ No newline at end of file diff --git a/versions/fabric-1.21.11/gradle.properties b/versions/fabric-1.21.11/gradle.properties index 2dfc925..8e4274e 100644 --- a/versions/fabric-1.21.11/gradle.properties +++ b/versions/fabric-1.21.11/gradle.properties @@ -10,4 +10,4 @@ minecraft_dependency= =1.21.11 # Dependencies modmenu_version=17.0.0 fabric_api_version=0.141.3+1.21.11 -fern_version=0.1.0+mc1.21.11-fabric \ No newline at end of file +fern_version=1.2.0+mc1.21.11-fabric \ No newline at end of file diff --git a/versions/fabric-1.21.2/gradle.properties b/versions/fabric-1.21.2/gradle.properties index 20e4e00..58cdc4e 100644 --- a/versions/fabric-1.21.2/gradle.properties +++ b/versions/fabric-1.21.2/gradle.properties @@ -10,4 +10,4 @@ minecraft_dependency= >=1.21.2 <=1.21.8 # Dependencies modmenu_version=12.0.0 fabric_api_version=0.106.1+1.21.2 -fern_version=0.1.0+mc1.21.2-fabric \ No newline at end of file +fern_version=1.2.0+mc1.21.2-fabric \ No newline at end of file diff --git a/versions/fabric-1.21.9/gradle.properties b/versions/fabric-1.21.9/gradle.properties index 204b626..48a7f64 100644 --- a/versions/fabric-1.21.9/gradle.properties +++ b/versions/fabric-1.21.9/gradle.properties @@ -10,4 +10,4 @@ minecraft_dependency= >=1.21.9 <=1.21.10 # Dependencies modmenu_version=16.0.1 fabric_api_version=0.134.1+1.21.9 -fern_version=0.1.0+mc1.21.9-fabric \ No newline at end of file +fern_version=1.2.0+mc1.21.9-fabric \ No newline at end of file diff --git a/versions/fabric-26.1.1/gradle.properties b/versions/fabric-26.1.1/gradle.properties index 4b833a1..4e84266 100644 --- a/versions/fabric-26.1.1/gradle.properties +++ b/versions/fabric-26.1.1/gradle.properties @@ -10,4 +10,4 @@ minecraft_dependency= ~26.1 # Dependencies modmenu_version=18.0.0-alpha.8 fabric_api_version=0.145.4+26.1.1 -fern_version=0.1.0+mc26.1.2-fabric \ No newline at end of file +fern_version=1.2.0+mc26.1.2-fabric \ No newline at end of file diff --git a/versions/forge-1.18.2/gradle.properties b/versions/forge-1.18.2/gradle.properties index 00dcd57..f1108ab 100644 --- a/versions/forge-1.18.2/gradle.properties +++ b/versions/forge-1.18.2/gradle.properties @@ -8,4 +8,4 @@ forge_version=40.3.12 minecraft_dependency=[1.18, 1.18.2] # Dependencies -fern_version=0.1.0+mc1.18.2-forge \ No newline at end of file +fern_version=1.2.0+mc1.18.2-forge \ No newline at end of file diff --git a/versions/forge-1.19.2/gradle.properties b/versions/forge-1.19.2/gradle.properties index d917f15..1ae4801 100644 --- a/versions/forge-1.19.2/gradle.properties +++ b/versions/forge-1.19.2/gradle.properties @@ -8,4 +8,4 @@ forge_version=43.5.2 minecraft_dependency=[1.19, 1.19.2] # Dependencies -fern_version=0.1.0+mc1.19.2-forge \ No newline at end of file +fern_version=1.2.0+mc1.19.2-forge \ No newline at end of file diff --git a/versions/forge-1.20.1/gradle.properties b/versions/forge-1.20.1/gradle.properties index d395b9b..1d54acf 100644 --- a/versions/forge-1.20.1/gradle.properties +++ b/versions/forge-1.20.1/gradle.properties @@ -8,4 +8,4 @@ forge_version=47.4.18 minecraft_dependency=[1.20.1, 1.20.4] # Dependencies -fern_version=0.1.0+mc1.20.1-forge \ No newline at end of file +fern_version=1.2.0+mc1.20.1-forge \ No newline at end of file diff --git a/versions/neoforge-1.20.3/gradle.properties b/versions/neoforge-1.20.3/gradle.properties index f77edc3..6464697 100644 --- a/versions/neoforge-1.20.3/gradle.properties +++ b/versions/neoforge-1.20.3/gradle.properties @@ -9,4 +9,4 @@ neoforge_version=20.3.8-beta minecraft_dependency=[1.20.3, 1.20.4] # Dependencies -fern_version=0.1.0+mc1.20.3-neoforge \ No newline at end of file +fern_version=1.2.0+mc1.20.3-neoforge \ No newline at end of file diff --git a/versions/neoforge-1.20.5/gradle.properties b/versions/neoforge-1.20.5/gradle.properties index 207f3f1..f19c36a 100644 --- a/versions/neoforge-1.20.5/gradle.properties +++ b/versions/neoforge-1.20.5/gradle.properties @@ -9,4 +9,4 @@ neoforge_version=20.5.21-beta minecraft_dependency=[1.20.5, 1.20.6] # Dependencies -fern_version=0.1.0+mc1.20.5-neoforge \ No newline at end of file +fern_version=1.2.0+mc1.20.5-neoforge \ No newline at end of file diff --git a/versions/neoforge-1.21.1/gradle.properties b/versions/neoforge-1.21.1/gradle.properties index 24cbd74..a65b46a 100644 --- a/versions/neoforge-1.21.1/gradle.properties +++ b/versions/neoforge-1.21.1/gradle.properties @@ -9,4 +9,4 @@ neoforge_version=21.1.224 minecraft_dependency=[1.21, 1.21.1] # Dependencies -fern_version=0.1.0+mc1.21.1-neoforge \ No newline at end of file +fern_version=1.2.0+mc1.21.1-neoforge \ No newline at end of file diff --git a/versions/neoforge-1.21.11/gradle.properties b/versions/neoforge-1.21.11/gradle.properties index 576edf5..2844ba1 100644 --- a/versions/neoforge-1.21.11/gradle.properties +++ b/versions/neoforge-1.21.11/gradle.properties @@ -9,4 +9,4 @@ neoforge_version=21.11.42 minecraft_dependency=[1.21.11] # Dependencies -fern_version=0.1.0+mc1.21.11-neoforge \ No newline at end of file +fern_version=1.2.0+mc1.21.11-neoforge \ No newline at end of file diff --git a/versions/neoforge-1.21.2/gradle.properties b/versions/neoforge-1.21.2/gradle.properties index 9b48627..4f14d68 100644 --- a/versions/neoforge-1.21.2/gradle.properties +++ b/versions/neoforge-1.21.2/gradle.properties @@ -9,4 +9,4 @@ neoforge_version=21.2.1-beta minecraft_dependency=[1.21.2, 1.21.8] # Dependencies -fern_version=0.1.0+mc1.21.2-neoforge \ No newline at end of file +fern_version=1.2.0+mc1.21.2-neoforge \ No newline at end of file diff --git a/versions/neoforge-1.21.9/gradle.properties b/versions/neoforge-1.21.9/gradle.properties index 8f6bfdd..1a17061 100644 --- a/versions/neoforge-1.21.9/gradle.properties +++ b/versions/neoforge-1.21.9/gradle.properties @@ -9,4 +9,4 @@ neoforge_version=21.9.16-beta minecraft_dependency=[1.21.9, 1.21.10] # Dependencies -fern_version=0.1.0+mc1.21.9-neoforge \ No newline at end of file +fern_version=1.2.0+mc1.21.9-neoforge \ No newline at end of file diff --git a/versions/neoforge-26.1.1/gradle.properties b/versions/neoforge-26.1.1/gradle.properties index 90c410d..b7d13da 100644 --- a/versions/neoforge-26.1.1/gradle.properties +++ b/versions/neoforge-26.1.1/gradle.properties @@ -9,4 +9,4 @@ neoforge_version=26.1.1.10-beta minecraft_dependency=[26.1, 26.1.2] # Dependencies -fern_version=0.1.0+mc26.1.2-neoforge \ No newline at end of file +fern_version=1.2.0+mc26.1.2-neoforge \ No newline at end of file From 2123a08152a4503b002ad9ea3522e8adb1e20756 Mon Sep 17 00:00:00 2001 From: lemonnik Date: Tue, 16 Jun 2026 00:33:07 +0200 Subject: [PATCH 35/39] fern 26.1.2 -> 26.1.1 --- versions/fabric-26.1.1/gradle.properties | 2 +- versions/neoforge-26.1.1/gradle.properties | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/versions/fabric-26.1.1/gradle.properties b/versions/fabric-26.1.1/gradle.properties index 4e84266..b265b96 100644 --- a/versions/fabric-26.1.1/gradle.properties +++ b/versions/fabric-26.1.1/gradle.properties @@ -10,4 +10,4 @@ minecraft_dependency= ~26.1 # Dependencies modmenu_version=18.0.0-alpha.8 fabric_api_version=0.145.4+26.1.1 -fern_version=1.2.0+mc26.1.2-fabric \ No newline at end of file +fern_version=1.2.0+mc26.1.1-fabric \ No newline at end of file diff --git a/versions/neoforge-26.1.1/gradle.properties b/versions/neoforge-26.1.1/gradle.properties index b7d13da..97971ca 100644 --- a/versions/neoforge-26.1.1/gradle.properties +++ b/versions/neoforge-26.1.1/gradle.properties @@ -9,4 +9,4 @@ neoforge_version=26.1.1.10-beta minecraft_dependency=[26.1, 26.1.2] # Dependencies -fern_version=1.2.0+mc26.1.2-neoforge \ No newline at end of file +fern_version=1.2.0+mc26.1.1-neoforge \ No newline at end of file From 71b21c4edcf2803815d3f45ad47e56019935f687 Mon Sep 17 00:00:00 2001 From: lemonnik Date: Tue, 16 Jun 2026 01:00:02 +0200 Subject: [PATCH 36/39] adapt to fern 1.2.0 --- src/main/java/net/snackbag/tt20/TT20Config.java | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/main/java/net/snackbag/tt20/TT20Config.java b/src/main/java/net/snackbag/tt20/TT20Config.java index d1b29e1..2b92f45 100644 --- a/src/main/java/net/snackbag/tt20/TT20Config.java +++ b/src/main/java/net/snackbag/tt20/TT20Config.java @@ -39,11 +39,16 @@ public class TT20Config extends CConfig { public final CBoolean lagback = register(MAIN, new CBoolean("lagback", "vanilla player lagback", true)); public final CBoolean watchdog = register(MAIN, new CBoolean("watchdog", "server watchdog (vanilla's stop server after 1 minute of freeze behaviour)", true)); - public final CBoolean singlePlayerWarning = register(MAIN, new CBoolean("singlePlayerWarning","should show warn if loading in a singleplayer?", true)); public final CBoolean updateChecker = register(MAIN, new CBoolean("updateChecker", "automatic update checker", true)); - private static final CCategory BLOCK_ENTITY_MASK = CCategory.of("block_entity_mask", "Block Entity Mask configuration", "Only change this if you know what you're doing!"); - - public final CEnum blockEntityMaskType = register(BLOCK_ENTITY_MASK, new CEnum<>("type", "mask type", MaskType.class, MaskType.WHITELIST)); - public final CMask blockEntityMask = register(BLOCK_ENTITY_MASK, new CMask("blocks", "block entity mask", "type", this, "*:*")); + public final CMask blockEntityMask = register(MAIN, new CMask("blocks", "Block Entity Mask configuration, only change this if you know what you're doing!", + new CEnum<>( + "type", + "mask type", + MaskType.class, + MaskType.WHITELIST + ), + this, + "*:*") + ); } From 7a3f870a9110d5cc26c160e89130ce02990bab1e Mon Sep 17 00:00:00 2001 From: Lemonnik6484 Date: Thu, 18 Jun 2026 16:24:59 +0200 Subject: [PATCH 37/39] fern 1.2.0 -> 1.3.0 --- fern-updater.sh | 4 ++-- versions/fabric-1.19.2/gradle.properties | 2 +- versions/fabric-1.20.1/gradle.properties | 2 +- versions/fabric-1.20.5/gradle.properties | 2 +- versions/fabric-1.21.1/gradle.properties | 2 +- versions/fabric-1.21.11/gradle.properties | 2 +- versions/fabric-1.21.2/gradle.properties | 2 +- versions/fabric-1.21.9/gradle.properties | 2 +- versions/fabric-26.1.1/gradle.properties | 2 +- versions/forge-1.18.2/gradle.properties | 2 +- versions/forge-1.19.2/gradle.properties | 2 +- versions/forge-1.20.1/gradle.properties | 2 +- versions/neoforge-1.20.3/gradle.properties | 2 +- versions/neoforge-1.20.5/gradle.properties | 2 +- versions/neoforge-1.21.1/gradle.properties | 2 +- versions/neoforge-1.21.11/gradle.properties | 2 +- versions/neoforge-1.21.2/gradle.properties | 2 +- versions/neoforge-1.21.9/gradle.properties | 2 +- versions/neoforge-26.1.1/gradle.properties | 2 +- 19 files changed, 20 insertions(+), 20 deletions(-) diff --git a/fern-updater.sh b/fern-updater.sh index b9ad062..7f29ded 100644 --- a/fern-updater.sh +++ b/fern-updater.sh @@ -1,7 +1,7 @@ #!/bin/bash -OLD_PREFIX="0.1.0" -NEW_PREFIX="1.2.0" +OLD_PREFIX="1.2.0" +NEW_PREFIX="1.3.0" find versions -type f -name "gradle.properties" | while read -r file; do sed -i "s/\(fern_version=\)${OLD_PREFIX}/\1${NEW_PREFIX}/" "$file" diff --git a/versions/fabric-1.19.2/gradle.properties b/versions/fabric-1.19.2/gradle.properties index 239b54c..e249bf6 100644 --- a/versions/fabric-1.19.2/gradle.properties +++ b/versions/fabric-1.19.2/gradle.properties @@ -9,4 +9,4 @@ minecraft_dependency= =1.19.2 # Dependencies modmenu_version=4.2.0-beta.2 -fern_version=1.2.0+mc1.19.2-fabric \ No newline at end of file +fern_version=1.3.0+mc1.19.2-fabric \ No newline at end of file diff --git a/versions/fabric-1.20.1/gradle.properties b/versions/fabric-1.20.1/gradle.properties index 38b565d..646e640 100644 --- a/versions/fabric-1.20.1/gradle.properties +++ b/versions/fabric-1.20.1/gradle.properties @@ -9,4 +9,4 @@ minecraft_dependency= >=1.20 <1.20.5 # Dependencies modmenu_version=7.2.2 -fern_version=1.2.0+mc1.20.1-fabric +fern_version=1.3.0+mc1.20.1-fabric diff --git a/versions/fabric-1.20.5/gradle.properties b/versions/fabric-1.20.5/gradle.properties index 73722b3..c9bd9bf 100644 --- a/versions/fabric-1.20.5/gradle.properties +++ b/versions/fabric-1.20.5/gradle.properties @@ -10,4 +10,4 @@ minecraft_dependency= >=1.20.5 <=1.20.6 # Dependencies modmenu_version=10.0.0 fabric_api_version=0.97.8+1.20.5 -fern_version=1.2.0+mc1.20.5-fabric \ No newline at end of file +fern_version=1.3.0+mc1.20.5-fabric \ No newline at end of file diff --git a/versions/fabric-1.21.1/gradle.properties b/versions/fabric-1.21.1/gradle.properties index 720e0c5..ad01bdf 100644 --- a/versions/fabric-1.21.1/gradle.properties +++ b/versions/fabric-1.21.1/gradle.properties @@ -10,4 +10,4 @@ minecraft_dependency= >=1.21 <=1.21.1 # Dependencies modmenu_version=11.0.4 fabric_api_version=0.116.10+1.21.1 -fern_version=1.2.0+mc1.21.1-fabric \ No newline at end of file +fern_version=1.3.0+mc1.21.1-fabric \ No newline at end of file diff --git a/versions/fabric-1.21.11/gradle.properties b/versions/fabric-1.21.11/gradle.properties index 8e4274e..173c75f 100644 --- a/versions/fabric-1.21.11/gradle.properties +++ b/versions/fabric-1.21.11/gradle.properties @@ -10,4 +10,4 @@ minecraft_dependency= =1.21.11 # Dependencies modmenu_version=17.0.0 fabric_api_version=0.141.3+1.21.11 -fern_version=1.2.0+mc1.21.11-fabric \ No newline at end of file +fern_version=1.3.0+mc1.21.11-fabric \ No newline at end of file diff --git a/versions/fabric-1.21.2/gradle.properties b/versions/fabric-1.21.2/gradle.properties index 58cdc4e..6fad6f7 100644 --- a/versions/fabric-1.21.2/gradle.properties +++ b/versions/fabric-1.21.2/gradle.properties @@ -10,4 +10,4 @@ minecraft_dependency= >=1.21.2 <=1.21.8 # Dependencies modmenu_version=12.0.0 fabric_api_version=0.106.1+1.21.2 -fern_version=1.2.0+mc1.21.2-fabric \ No newline at end of file +fern_version=1.3.0+mc1.21.2-fabric \ No newline at end of file diff --git a/versions/fabric-1.21.9/gradle.properties b/versions/fabric-1.21.9/gradle.properties index 48a7f64..423ae6e 100644 --- a/versions/fabric-1.21.9/gradle.properties +++ b/versions/fabric-1.21.9/gradle.properties @@ -10,4 +10,4 @@ minecraft_dependency= >=1.21.9 <=1.21.10 # Dependencies modmenu_version=16.0.1 fabric_api_version=0.134.1+1.21.9 -fern_version=1.2.0+mc1.21.9-fabric \ No newline at end of file +fern_version=1.3.0+mc1.21.9-fabric \ No newline at end of file diff --git a/versions/fabric-26.1.1/gradle.properties b/versions/fabric-26.1.1/gradle.properties index b265b96..cfb639d 100644 --- a/versions/fabric-26.1.1/gradle.properties +++ b/versions/fabric-26.1.1/gradle.properties @@ -10,4 +10,4 @@ minecraft_dependency= ~26.1 # Dependencies modmenu_version=18.0.0-alpha.8 fabric_api_version=0.145.4+26.1.1 -fern_version=1.2.0+mc26.1.1-fabric \ No newline at end of file +fern_version=1.3.0+mc26.1.1-fabric \ No newline at end of file diff --git a/versions/forge-1.18.2/gradle.properties b/versions/forge-1.18.2/gradle.properties index f1108ab..c57dc8f 100644 --- a/versions/forge-1.18.2/gradle.properties +++ b/versions/forge-1.18.2/gradle.properties @@ -8,4 +8,4 @@ forge_version=40.3.12 minecraft_dependency=[1.18, 1.18.2] # Dependencies -fern_version=1.2.0+mc1.18.2-forge \ No newline at end of file +fern_version=1.3.0+mc1.18.2-forge \ No newline at end of file diff --git a/versions/forge-1.19.2/gradle.properties b/versions/forge-1.19.2/gradle.properties index 1ae4801..d7e3058 100644 --- a/versions/forge-1.19.2/gradle.properties +++ b/versions/forge-1.19.2/gradle.properties @@ -8,4 +8,4 @@ forge_version=43.5.2 minecraft_dependency=[1.19, 1.19.2] # Dependencies -fern_version=1.2.0+mc1.19.2-forge \ No newline at end of file +fern_version=1.3.0+mc1.19.2-forge \ No newline at end of file diff --git a/versions/forge-1.20.1/gradle.properties b/versions/forge-1.20.1/gradle.properties index 1d54acf..be8177d 100644 --- a/versions/forge-1.20.1/gradle.properties +++ b/versions/forge-1.20.1/gradle.properties @@ -8,4 +8,4 @@ forge_version=47.4.18 minecraft_dependency=[1.20.1, 1.20.4] # Dependencies -fern_version=1.2.0+mc1.20.1-forge \ No newline at end of file +fern_version=1.3.0+mc1.20.1-forge \ No newline at end of file diff --git a/versions/neoforge-1.20.3/gradle.properties b/versions/neoforge-1.20.3/gradle.properties index 6464697..143387b 100644 --- a/versions/neoforge-1.20.3/gradle.properties +++ b/versions/neoforge-1.20.3/gradle.properties @@ -9,4 +9,4 @@ neoforge_version=20.3.8-beta minecraft_dependency=[1.20.3, 1.20.4] # Dependencies -fern_version=1.2.0+mc1.20.3-neoforge \ No newline at end of file +fern_version=1.3.0+mc1.20.3-neoforge \ No newline at end of file diff --git a/versions/neoforge-1.20.5/gradle.properties b/versions/neoforge-1.20.5/gradle.properties index f19c36a..8998492 100644 --- a/versions/neoforge-1.20.5/gradle.properties +++ b/versions/neoforge-1.20.5/gradle.properties @@ -9,4 +9,4 @@ neoforge_version=20.5.21-beta minecraft_dependency=[1.20.5, 1.20.6] # Dependencies -fern_version=1.2.0+mc1.20.5-neoforge \ No newline at end of file +fern_version=1.3.0+mc1.20.5-neoforge \ No newline at end of file diff --git a/versions/neoforge-1.21.1/gradle.properties b/versions/neoforge-1.21.1/gradle.properties index a65b46a..e6294ad 100644 --- a/versions/neoforge-1.21.1/gradle.properties +++ b/versions/neoforge-1.21.1/gradle.properties @@ -9,4 +9,4 @@ neoforge_version=21.1.224 minecraft_dependency=[1.21, 1.21.1] # Dependencies -fern_version=1.2.0+mc1.21.1-neoforge \ No newline at end of file +fern_version=1.3.0+mc1.21.1-neoforge \ No newline at end of file diff --git a/versions/neoforge-1.21.11/gradle.properties b/versions/neoforge-1.21.11/gradle.properties index 2844ba1..abb840a 100644 --- a/versions/neoforge-1.21.11/gradle.properties +++ b/versions/neoforge-1.21.11/gradle.properties @@ -9,4 +9,4 @@ neoforge_version=21.11.42 minecraft_dependency=[1.21.11] # Dependencies -fern_version=1.2.0+mc1.21.11-neoforge \ No newline at end of file +fern_version=1.3.0+mc1.21.11-neoforge \ No newline at end of file diff --git a/versions/neoforge-1.21.2/gradle.properties b/versions/neoforge-1.21.2/gradle.properties index 4f14d68..84e7abe 100644 --- a/versions/neoforge-1.21.2/gradle.properties +++ b/versions/neoforge-1.21.2/gradle.properties @@ -9,4 +9,4 @@ neoforge_version=21.2.1-beta minecraft_dependency=[1.21.2, 1.21.8] # Dependencies -fern_version=1.2.0+mc1.21.2-neoforge \ No newline at end of file +fern_version=1.3.0+mc1.21.2-neoforge \ No newline at end of file diff --git a/versions/neoforge-1.21.9/gradle.properties b/versions/neoforge-1.21.9/gradle.properties index 1a17061..abd37d7 100644 --- a/versions/neoforge-1.21.9/gradle.properties +++ b/versions/neoforge-1.21.9/gradle.properties @@ -9,4 +9,4 @@ neoforge_version=21.9.16-beta minecraft_dependency=[1.21.9, 1.21.10] # Dependencies -fern_version=1.2.0+mc1.21.9-neoforge \ No newline at end of file +fern_version=1.3.0+mc1.21.9-neoforge \ No newline at end of file diff --git a/versions/neoforge-26.1.1/gradle.properties b/versions/neoforge-26.1.1/gradle.properties index 97971ca..702b938 100644 --- a/versions/neoforge-26.1.1/gradle.properties +++ b/versions/neoforge-26.1.1/gradle.properties @@ -9,4 +9,4 @@ neoforge_version=26.1.1.10-beta minecraft_dependency=[26.1, 26.1.2] # Dependencies -fern_version=1.2.0+mc26.1.1-neoforge \ No newline at end of file +fern_version=1.3.0+mc26.1.1-neoforge \ No newline at end of file From 418cfcf305fbae9ea5a70ae13ee904f09c19519c Mon Sep 17 00:00:00 2001 From: Lemonnik6484 Date: Thu, 18 Jun 2026 16:45:34 +0200 Subject: [PATCH 38/39] update to fern 1.3.0 --- build.gradle | 4 ++-- src/main/java/net/snackbag/tt20/TT20Config.java | 14 +++++++++++++- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/build.gradle b/build.gradle index b94dd1a..45dd578 100644 --- a/build.gradle +++ b/build.gradle @@ -30,10 +30,10 @@ repositories { maven { url 'https://maven.neoforged.net/releases' } - maven { + /*maven { name = 'papermc' url = 'https://repo.papermc.io/repository/maven-public/' - } + }*/ maven { url "https://libraries.minecraft.net" } diff --git a/src/main/java/net/snackbag/tt20/TT20Config.java b/src/main/java/net/snackbag/tt20/TT20Config.java index 2b92f45..6c419e2 100644 --- a/src/main/java/net/snackbag/tt20/TT20Config.java +++ b/src/main/java/net/snackbag/tt20/TT20Config.java @@ -7,8 +7,16 @@ import dev.lemonnik.fern_config.types.CMask; import dev.lemonnik.fern_config.utils.CCategory; import dev.lemonnik.fern_config.utils.MaskType; + +//? if >1.19.2 { +import net.minecraft.core.registries.BuiltInRegistries; +//?} else { +/*import net.minecraft.core.Registry; +*///?} + import org.jetbrains.annotations.NotNull; +@SuppressWarnings("deprecation") public class TT20Config extends CConfig { @Override public @NotNull String getFileName() { @@ -42,13 +50,17 @@ public class TT20Config extends CConfig { public final CBoolean updateChecker = register(MAIN, new CBoolean("updateChecker", "automatic update checker", true)); public final CMask blockEntityMask = register(MAIN, new CMask("blocks", "Block Entity Mask configuration, only change this if you know what you're doing!", + //? if >1.19.2 { + BuiltInRegistries.BLOCK, + //?} else { + /*Registry.BLOCK, + *///?} new CEnum<>( "type", "mask type", MaskType.class, MaskType.WHITELIST ), - this, "*:*") ); } From 4098633a7a69d3f099687622fcc57c6fff136f09 Mon Sep 17 00:00:00 2001 From: lemonnik Date: Tue, 16 Jun 2026 20:15:24 +0200 Subject: [PATCH 39/39] change VCS version to 26.1.1 --- settings.gradle | 2 +- src/main/java/net/snackbag/tt20/TT20.java | 24 +++++++++---------- .../java/net/snackbag/tt20/TT20Command.java | 8 +++---- .../net/snackbag/tt20/mixin/PlayerMixin.java | 8 +++---- .../tt20/mixin/PortalProcessorMixin.java | 8 +++---- .../tt20/mixin/ServerPlayerManagerMixin.java | 18 +++++++------- .../tt20/mixin/ServerWatchdogMixin.java | 8 +++---- .../snackbag/tt20/mixin/TT20MixinPlugin.java | 8 +++---- .../tt20/mixin/world/GameRulesMixin.java | 24 +++++++++---------- .../tt20/mixin/world/LevelChunkMixin.java | 8 +++---- .../tt20/mixin/world/ServerLevelMixin.java | 16 ++++++------- stonecutter.gradle | 2 +- 12 files changed, 67 insertions(+), 67 deletions(-) diff --git a/settings.gradle b/settings.gradle index 15bee2e..8f54d8f 100644 --- a/settings.gradle +++ b/settings.gradle @@ -36,7 +36,7 @@ stonecutter { mc("1.21.11", "fabric", "neoforge") mc("26.1.1", "fabric", "neoforge") - vcsVersion = "fabric-1.20.1" + vcsVersion = "fabric-26.1.1" } create(getRootProject()) } \ No newline at end of file diff --git a/src/main/java/net/snackbag/tt20/TT20.java b/src/main/java/net/snackbag/tt20/TT20.java index 72a0f8c..3405a34 100644 --- a/src/main/java/net/snackbag/tt20/TT20.java +++ b/src/main/java/net/snackbag/tt20/TT20.java @@ -17,10 +17,10 @@ *///?} //? if >=1.21.11 { -/*import net.minecraft.resources.Identifier; -*///?} else { -import net.minecraft.resources.ResourceLocation; -//?} +import net.minecraft.resources.Identifier; +//?} else { +/*import net.minecraft.resources.ResourceLocation; +*///?} //? 1.18.2 //import net.minecraft.network.chat.TextComponent; @@ -81,15 +81,15 @@ public class TT20 } //? >=1.21.11 { - /*public static Identifier id(String namespace, String path) { - *///?} else { - public static ResourceLocation id(String namespace, String path) { - //?} + public static Identifier id(String namespace, String path) { + //?} else { + /*public static ResourceLocation id(String namespace, String path) { + *///?} //? if >=1.21.11 { - /*return Identifier.tryBuild(namespace, path); - *///?} else if >1.18.2 { - return ResourceLocation.tryBuild(namespace, path); - //?} else { + return Identifier.tryBuild(namespace, path); + //?} else if >1.18.2 { + /*return ResourceLocation.tryBuild(namespace, path); + *///?} else { /*return new ResourceLocation(namespace, path); *///?} } diff --git a/src/main/java/net/snackbag/tt20/TT20Command.java b/src/main/java/net/snackbag/tt20/TT20Command.java index 0b1b929..bc80f6d 100644 --- a/src/main/java/net/snackbag/tt20/TT20Command.java +++ b/src/main/java/net/snackbag/tt20/TT20Command.java @@ -20,12 +20,12 @@ public static void register(CommandDispatcher dispatcher) { .then(Commands.literal("tps").executes(TT20Command::executeTps)) .then(Commands.literal("status").executes(TT20Command::executeStatus)) //? if (>=1.21.11) { - /*.then(Commands.literal("toggle").requires(Commands.hasPermission(Commands.LEVEL_ADMINS)).executes(TT20Command::executeToggle)) + .then(Commands.literal("toggle").requires(Commands.hasPermission(Commands.LEVEL_ADMINS)).executes(TT20Command::executeToggle)) .then(Commands.literal("reload").requires(Commands.hasPermission(Commands.LEVEL_GAMEMASTERS)).executes(TT20Command::executeReload)) - *///?} else { - .then(Commands.literal("toggle").requires(source -> source.hasPermission(3)).executes(TT20Command::executeToggle)) + //?} else { + /*.then(Commands.literal("toggle").requires(source -> source.hasPermission(3)).executes(TT20Command::executeToggle)) .then(Commands.literal("reload").requires(source -> source.hasPermission(2)).executes(TT20Command::executeReload)) - //?} + *///?} ); } diff --git a/src/main/java/net/snackbag/tt20/mixin/PlayerMixin.java b/src/main/java/net/snackbag/tt20/mixin/PlayerMixin.java index 1d780aa..486e611 100644 --- a/src/main/java/net/snackbag/tt20/mixin/PlayerMixin.java +++ b/src/main/java/net/snackbag/tt20/mixin/PlayerMixin.java @@ -13,19 +13,19 @@ @Mixin(Player.class) public abstract class PlayerMixin { //? if <=1.20.5 { - @ModifyReturnValue(method = "getPortalWaitTime", at = @At("RETURN")) + /*@ModifyReturnValue(method = "getPortalWaitTime", at = @At("RETURN")) private int netherPortalTimeTT20(int original) { if (!TT20.config.enabled.get() || !TT20.config.portal.get()) return original; //? if >1.19.2 { if (((Entity)(Object)this).level().isClientSide()) return original; //?} else { - /*if (((Entity)(Object)this).level.isClientSide()) return original; - *///?} + /^if (((Entity)(Object)this).level.isClientSide()) return original; + ^///?} if (original == 1) return original; return TPSUtil.tt20(original, false); } - //?} + *///?} @ModifyExpressionValue(method = "tick", at = @At(value = "FIELD", target = "Lnet/minecraft/world/entity/player/Player;sleepCounter:I", opcode = Opcodes.GETFIELD)) private int tickTT20(int original) { diff --git a/src/main/java/net/snackbag/tt20/mixin/PortalProcessorMixin.java b/src/main/java/net/snackbag/tt20/mixin/PortalProcessorMixin.java index 0c840db..d4f6873 100644 --- a/src/main/java/net/snackbag/tt20/mixin/PortalProcessorMixin.java +++ b/src/main/java/net/snackbag/tt20/mixin/PortalProcessorMixin.java @@ -1,7 +1,7 @@ package net.snackbag.tt20.mixin; //? if >=26.1 { -/*import com.llamalad7.mixinextras.injector.ModifyExpressionValue; +import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import com.llamalad7.mixinextras.sugar.Local; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.PortalProcessor; @@ -25,7 +25,7 @@ private int runMissedTicks(int original, @Local ServerLevel world) { return portalTime; } } -*///?} else if >=1.21 { +//?} else if >=1.21 { /*import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import com.llamalad7.mixinextras.sugar.Local; import net.minecraft.server.level.ServerLevel; @@ -52,7 +52,7 @@ private int runMissedTicks(int original, @Local ServerLevel level) { } *///?} else { -import net.snackbag.tt20.ModUpdater; +/*import net.snackbag.tt20.ModUpdater; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -65,4 +65,4 @@ private static void onInitialize(CallbackInfo ci) { throw new RuntimeException("Tried to load PortalProcessorMixin on <1.21"); } } -//?} \ No newline at end of file +*///?} \ No newline at end of file diff --git a/src/main/java/net/snackbag/tt20/mixin/ServerPlayerManagerMixin.java b/src/main/java/net/snackbag/tt20/mixin/ServerPlayerManagerMixin.java index 4fef3de..c8070f4 100644 --- a/src/main/java/net/snackbag/tt20/mixin/ServerPlayerManagerMixin.java +++ b/src/main/java/net/snackbag/tt20/mixin/ServerPlayerManagerMixin.java @@ -2,7 +2,7 @@ //? if >1.20.1 -//import net.minecraft.server.network.CommonListenerCookie; +import net.minecraft.server.network.CommonListenerCookie; import net.minecraft.network.Connection; import net.minecraft.server.level.ServerPlayer; @@ -25,15 +25,15 @@ public abstract class ServerPlayerManagerMixin { @Inject(method = "placeNewPlayer", at = @At("TAIL")) //? if >1.20.1 { - /*private void sendPlayerUpdateMessageIfCorrectPermissions(Connection connection, ServerPlayer player, CommonListenerCookie cookie, CallbackInfo ci) { - *///?} else { - private void sendPlayerUpdateMessageIfCorrectPermissions(Connection netManager, ServerPlayer player, CallbackInfo ci) { - //?} + private void sendPlayerUpdateMessageIfCorrectPermissions(Connection connection, ServerPlayer player, CommonListenerCookie cookie, CallbackInfo ci) { + //?} else { + /*private void sendPlayerUpdateMessageIfCorrectPermissions(Connection netManager, ServerPlayer player, CallbackInfo ci) { + *///?} //? if >=1.21.9 { - /*if (((ServerPlayerAccessor) player).getServer().getPlayerList().isOp(player.nameAndId())) { - *///?} else { - if (player.getServer().getPlayerList().isOp(player.getGameProfile())) { - //?} + if (((ServerPlayerAccessor) player).getServer().getPlayerList().isOp(player.nameAndId())) { + //?} else { + /*if (player.getServer().getPlayerList().isOp(player.getGameProfile())) { + *///?} CompletableFuture.runAsync(() -> { try { ModUpdater.check(); diff --git a/src/main/java/net/snackbag/tt20/mixin/ServerWatchdogMixin.java b/src/main/java/net/snackbag/tt20/mixin/ServerWatchdogMixin.java index ac2a824..4635bc7 100644 --- a/src/main/java/net/snackbag/tt20/mixin/ServerWatchdogMixin.java +++ b/src/main/java/net/snackbag/tt20/mixin/ServerWatchdogMixin.java @@ -11,12 +11,12 @@ public class ServerWatchdogMixin { @ModifyExpressionValue( method = "run", //? if >=1.21.11 { - /*at = @At(value = "INVOKE", target = "Lnet/minecraft/util/Util;getNanos()J") - *///?} else if >=1.20.3 { + at = @At(value = "INVOKE", target = "Lnet/minecraft/util/Util;getNanos()J") + //?} else if >=1.20.3 { /*at = @At(value = "INVOKE", target = "Lnet/minecraft/Util;getNanos()J") *///?} else { - at = @At(value = "INVOKE", target = "Lnet/minecraft/Util;getMillis()J") - //?} + /*at = @At(value = "INVOKE", target = "Lnet/minecraft/Util;getMillis()J") + *///?} ) private long disableWatchdog(long original) { if (!TT20.config.enabled.get() || TT20.config.watchdog.get()) return original; diff --git a/src/main/java/net/snackbag/tt20/mixin/TT20MixinPlugin.java b/src/main/java/net/snackbag/tt20/mixin/TT20MixinPlugin.java index 1a72a81..f390c55 100644 --- a/src/main/java/net/snackbag/tt20/mixin/TT20MixinPlugin.java +++ b/src/main/java/net/snackbag/tt20/mixin/TT20MixinPlugin.java @@ -21,10 +21,10 @@ public String getRefMapperConfig() { @Override public boolean shouldApplyMixin(String targetClassName, String mixinClassName) { //? if <1.21 { - return !mixinClassName.equals("net.snackbag.tt20.mixin.PortalProcessorMixin"); - //?} else { - /*return true; - *///?} + /*return !mixinClassName.equals("net.snackbag.tt20.mixin.PortalProcessorMixin"); + *///?} else { + return true; + //?} } @Override diff --git a/src/main/java/net/snackbag/tt20/mixin/world/GameRulesMixin.java b/src/main/java/net/snackbag/tt20/mixin/world/GameRulesMixin.java index 46f2d34..71c955b 100644 --- a/src/main/java/net/snackbag/tt20/mixin/world/GameRulesMixin.java +++ b/src/main/java/net/snackbag/tt20/mixin/world/GameRulesMixin.java @@ -3,11 +3,11 @@ import com.llamalad7.mixinextras.injector.ModifyReturnValue; import com.llamalad7.mixinextras.sugar.Local; //? if (>=1.21.11) { -/*import net.minecraft.world.level.gamerules.GameRule; +import net.minecraft.world.level.gamerules.GameRule; import net.minecraft.world.level.gamerules.GameRules; -*///?} else { -import net.minecraft.world.level.GameRules; -//?} +//?} else { +/*import net.minecraft.world.level.GameRules; +*///?} import net.snackbag.tt20.TT20; import net.snackbag.tt20.util.TPSCalculator; import org.spongepowered.asm.mixin.Mixin; @@ -16,23 +16,23 @@ @Mixin(GameRules.class) public class GameRulesMixin { //? if (>=1.21.11) { - /*@ModifyReturnValue(method = "get", at = @At("RETURN")) + @ModifyReturnValue(method = "get", at = @At("RETURN")) private Object randomTickSpeedAcceleration(Object original, @Local(argsOnly = true) GameRule gameRule) { - *///?} else { - @ModifyReturnValue(method = "getInt", at = @At("RETURN")) + //?} else { + /*@ModifyReturnValue(method = "getInt", at = @At("RETURN")) private int randomTickSpeedAcceleration(int original, @Local(argsOnly = true) GameRules.Key key) { - //?} + *///?} if (!TT20.config.enabled.get() || !TT20.config.randomTickSpeed.get()) return original; //? if (>=1.21.11) { - /*if (gameRule != GameRules.RANDOM_TICK_SPEED) return original; + if (gameRule != GameRules.RANDOM_TICK_SPEED) return original; if (!(original instanceof Integer value)) return original; return (int) (value * TPSCalculator.MAX_TPS / (float) TT20.TPS_CALCULATOR.getMostAccurateTPS()); - *///?} else { - if (key != GameRules.RULE_RANDOMTICKING) return original; + //?} else { + /*if (key != GameRules.RULE_RANDOMTICKING) return original; return (int) (original * TPSCalculator.MAX_TPS / (float) TT20.TPS_CALCULATOR.getMostAccurateTPS()); - //?} + *///?} } } diff --git a/src/main/java/net/snackbag/tt20/mixin/world/LevelChunkMixin.java b/src/main/java/net/snackbag/tt20/mixin/world/LevelChunkMixin.java index 5b1a099..f1e3b88 100644 --- a/src/main/java/net/snackbag/tt20/mixin/world/LevelChunkMixin.java +++ b/src/main/java/net/snackbag/tt20/mixin/world/LevelChunkMixin.java @@ -33,12 +33,12 @@ private void onTick( if (!TT20.config.enabled.get() || !TT20.config.blockEntity.get()) return; if (world.isClientSide()) return; //? if >=1.21.2 { - /*Registry registry = world.registryAccess().lookupOrThrow(Registries.BLOCK); + Registry registry = world.registryAccess().lookupOrThrow(Registries.BLOCK); if (!TT20.config.blockEntityMask.get().isOkay(registry.getKey(blockState.getBlock()))) return; - *///?} else if >=1.20.1 { - Registry registry = world.registryAccess().registryOrThrow(Registries.BLOCK); + //?} else if >=1.20.1 { + /*Registry registry = world.registryAccess().registryOrThrow(Registries.BLOCK); if (!TT20.config.blockEntityMask.get().isOkay(registry.getKey(blockState.getBlock()))) return; - //?} else { + *///?} else { /*if (!TT20.config.blockEntityMask.get().isOkay(Registry.BLOCK.getKey(blockState.getBlock()))) return; *///?} diff --git a/src/main/java/net/snackbag/tt20/mixin/world/ServerLevelMixin.java b/src/main/java/net/snackbag/tt20/mixin/world/ServerLevelMixin.java index f7610e7..1b7e00f 100644 --- a/src/main/java/net/snackbag/tt20/mixin/world/ServerLevelMixin.java +++ b/src/main/java/net/snackbag/tt20/mixin/world/ServerLevelMixin.java @@ -11,19 +11,19 @@ @Mixin(ServerLevel.class) public abstract class ServerLevelMixin { //? if >=26.1 { - /*@Inject(method = "tickTime", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/storage/ServerLevelData;setGameTime(J)V")) - *///?} else { - @Inject(method = "tickTime", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/level/ServerLevel;setDayTime(J)V")) - //?} + @Inject(method = "tickTime", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/storage/ServerLevelData;setGameTime(J)V")) + //?} else { + /*@Inject(method = "tickTime", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/level/ServerLevel;setDayTime(J)V")) + *///?} private void applyMissedTicks(CallbackInfo ci) { if (!TT20.config.enabled.get() || !TT20.config.time.get()) return; ServerLevel self = (ServerLevel) (Object) this; //? if >=26.1 { - /*((ServerLevelAccessor) self).getServerLevelData().setGameTime(self.getLevelData().getGameTime() + TT20.TPS_CALCULATOR.applicableMissedTicks()); - *///?} else { - self.setDayTime(self.getLevelData().getDayTime() + TT20.TPS_CALCULATOR.applicableMissedTicks()); - //?} + ((ServerLevelAccessor) self).getServerLevelData().setGameTime(self.getLevelData().getGameTime() + TT20.TPS_CALCULATOR.applicableMissedTicks()); + //?} else { + /*self.setDayTime(self.getLevelData().getDayTime() + TT20.TPS_CALCULATOR.applicableMissedTicks()); + *///?} } } diff --git a/stonecutter.gradle b/stonecutter.gradle index 21bd114..2f2873c 100644 --- a/stonecutter.gradle +++ b/stonecutter.gradle @@ -1,4 +1,4 @@ plugins { id "dev.kikugie.stonecutter" } -stonecutter.active "fabric-1.20.1" \ No newline at end of file +stonecutter.active "fabric-26.1.1" \ No newline at end of file