diff --git a/.gitignore b/.gitignore index 269b883..9411b95 100644 --- a/.gitignore +++ b/.gitignore @@ -2,7 +2,7 @@ Thumbs.db ## gradle -/.gradle +.gradle/ build/ ## ForgeGradle diff --git a/Fabric/build.gradle b/Fabric/build.gradle new file mode 100644 index 0000000..256ff87 --- /dev/null +++ b/Fabric/build.gradle @@ -0,0 +1,85 @@ +plugins { + id 'fabric-loom' version '0.10-SNAPSHOT' +} + +version = "${neat_version}-${build_number}-FABRIC" + +loom { + accessWidenerPath = file("src/main/resources/neat.accesswidener") + + runs { + configureEach { + runDir "../run" + ideConfigGenerated(true) + } + } + +} + +repositories { + maven { + name = "Modmuss" + url = "https://maven.modmuss50.me/" + } + maven { + name = "Ladysnake Libs" + url = 'https://ladysnake.jfrog.io/artifactory/mods' + } + maven { + name = "ParchmentMC" + url = "https://maven.parchmentmc.net/" + } +} + +dependencies { + minecraft "com.mojang:minecraft:${mc_version}" + mappings loom.layered() { + officialMojangMappings() + parchment("org.parchmentmc.data:parchment-1.18.1:2021.12.19@zip") + } + + modImplementation "net.fabricmc:fabric-loader:0.13.3" + modImplementation "net.fabricmc.fabric-api:fabric-api:0.50.0+1.18.2" + + compileOnly "com.google.code.findbugs:jsr305:3.0.2" + compileOnly project(":Xplat") + + modImplementation "me.zeroeightsix:fiber:0.23.0-2" + include "me.zeroeightsix:fiber:0.23.0-2" +} + +compileJava { + source(project(":Xplat").sourceSets.main.allSource) + options.compilerArgs << "-Xlint:all,-classfile,-processing,-deprecation,-serial" << "-Werror" + +} + +sourcesJar { + from project(":Xplat").sourceSets.main.allJava +} + +processResources { + from project(":Xplat").sourceSets.main.resources + inputs.property "version", project.version + + filesMatching("fabric.mod.json") { + expand "version": project.version + } +} + +publishing { + publications { + mavenJava(MavenPublication) { + groupId project.group + artifactId project.archivesBaseName + version project.version + from components.java + } + } + + repositories { + maven { + url "file://" + System.getenv("local_maven") + } + } +} diff --git a/Fabric/src/main/java/vazkii/neat/NeatFabricInitializer.java b/Fabric/src/main/java/vazkii/neat/NeatFabricInitializer.java new file mode 100644 index 0000000..a2fb2c7 --- /dev/null +++ b/Fabric/src/main/java/vazkii/neat/NeatFabricInitializer.java @@ -0,0 +1,10 @@ +package vazkii.neat; + +import net.fabricmc.api.ClientModInitializer; + +public class NeatFabricInitializer implements ClientModInitializer { + @Override + public void onInitializeClient() { + NeatFiberConfig.setup(); + } +} diff --git a/Fabric/src/main/java/vazkii/neat/NeatFiberConfig.java b/Fabric/src/main/java/vazkii/neat/NeatFiberConfig.java new file mode 100644 index 0000000..d40415d --- /dev/null +++ b/Fabric/src/main/java/vazkii/neat/NeatFiberConfig.java @@ -0,0 +1,225 @@ +package vazkii.neat; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import java.io.*; +import java.nio.file.*; +import java.util.List; + +import static io.github.fablabsmc.fablabs.api.fiber.v1.schema.type.derived.ConfigTypes.*; +import static io.github.fablabsmc.fablabs.api.fiber.v1.schema.type.derived.ConfigTypes.STRING; + +import io.github.fablabsmc.fablabs.api.fiber.v1.builder.ConfigTreeBuilder; +import io.github.fablabsmc.fablabs.api.fiber.v1.exception.ValueDeserializationException; +import io.github.fablabsmc.fablabs.api.fiber.v1.schema.type.derived.ConfigTypes; +import io.github.fablabsmc.fablabs.api.fiber.v1.serialization.FiberSerialization; +import io.github.fablabsmc.fablabs.api.fiber.v1.serialization.JanksonValueSerializer; +import io.github.fablabsmc.fablabs.api.fiber.v1.tree.ConfigTree; +import io.github.fablabsmc.fablabs.api.fiber.v1.tree.PropertyMirror; + +public final class NeatFiberConfig { + private static final Logger LOGGER = LogManager.getLogger(NeatFiberConfig.class); + + private static void writeDefaultConfig(ConfigTree config, Path path, JanksonValueSerializer serializer) { + try (OutputStream s = new BufferedOutputStream(Files.newOutputStream(path, StandardOpenOption.WRITE, StandardOpenOption.CREATE_NEW))) { + FiberSerialization.serialize(config, s, serializer); + } catch (FileAlreadyExistsException ignored) {} catch (IOException e) { + LOGGER.error("Error writing default config", e); + } + } + + private static void setupConfig(ConfigTree config, Path p, JanksonValueSerializer serializer) { + writeDefaultConfig(config, p, serializer); + + try (InputStream s = new BufferedInputStream(Files.newInputStream(p, StandardOpenOption.READ, StandardOpenOption.CREATE))) { + FiberSerialization.deserialize(config, s, serializer); + } catch (IOException | ValueDeserializationException e) { + LOGGER.error("Error loading config from {}", p, e); + } + } + + public static void setup() { + try { + Files.createDirectory(Paths.get("config")); + } catch (FileAlreadyExistsException ignored) {} catch (IOException e) { + LOGGER.warn("Failed to make config dir", e); + } + + JanksonValueSerializer serializer = new JanksonValueSerializer(false); + ConfigTree client = CLIENT.configure(ConfigTree.builder()); + setupConfig(client, Paths.get("config", NeatConfig.MOD_ID + "-client.json5"), serializer); + NeatConfig.instance = CLIENT; + } + + private static class Client implements NeatConfig.ConfigAccess { + private final PropertyMirror maxDistance = PropertyMirror.create(INTEGER); + private final PropertyMirror renderInF1 = PropertyMirror.create(BOOLEAN); + private final PropertyMirror heightAbove = PropertyMirror.create(DOUBLE); + private final PropertyMirror drawBackground = PropertyMirror.create(BOOLEAN); + private final PropertyMirror backgroundPadding = PropertyMirror.create(INTEGER); + private final PropertyMirror backgroundHeight = PropertyMirror.create(INTEGER); + private final PropertyMirror barHeight = PropertyMirror.create(INTEGER); + private final PropertyMirror plateSize = PropertyMirror.create(INTEGER); + private final PropertyMirror plateSizeBoss = PropertyMirror.create(INTEGER); + private final PropertyMirror showAttributes = PropertyMirror.create(BOOLEAN); + private final PropertyMirror showArmor = PropertyMirror.create(BOOLEAN); + private final PropertyMirror groupArmor = PropertyMirror.create(BOOLEAN); + private final PropertyMirror colorByType = PropertyMirror.create(BOOLEAN); + private final PropertyMirror hpTextHeight = PropertyMirror.create(INTEGER); + private final PropertyMirror showMaxHP = PropertyMirror.create(BOOLEAN); + private final PropertyMirror showCurrentHP = PropertyMirror.create(BOOLEAN); + private final PropertyMirror showPercentage = PropertyMirror.create(BOOLEAN); + private final PropertyMirror showOnPlayers = PropertyMirror.create(BOOLEAN); + private final PropertyMirror showOnBosses = PropertyMirror.create(BOOLEAN); + private final PropertyMirror showOnlyFocused = PropertyMirror.create(BOOLEAN); + private final PropertyMirror showFullHealth = PropertyMirror.create(BOOLEAN); + private final PropertyMirror enableDebugInfo = PropertyMirror.create(BOOLEAN); + private final PropertyMirror> blacklist = PropertyMirror.create(ConfigTypes.makeList(STRING)); + + public ConfigTree configure(ConfigTreeBuilder builder) { + builder.beginValue("maxDistance", INTEGER, 24).finishValue(maxDistance::mirror) + .beginValue("renderInF1", BOOLEAN, false).finishValue(renderInF1::mirror) + .beginValue("heightAbove", DOUBLE, 0.6).finishValue(heightAbove::mirror) + .beginValue("drawBackground", BOOLEAN, true).finishValue(drawBackground::mirror) + .beginValue("backgroundPadding", INTEGER, 2).finishValue(backgroundPadding::mirror) + .beginValue("backgroundHeight", INTEGER, 6).finishValue(backgroundHeight::mirror) + .beginValue("barHeight", INTEGER, 4).finishValue(barHeight::mirror) + .beginValue("plateSize", INTEGER, 25).finishValue(plateSize::mirror) + .beginValue("plateSizeBoss", INTEGER, 50).finishValue(plateSizeBoss::mirror) + .beginValue("showAttributes", BOOLEAN, true).finishValue(showAttributes::mirror) + .beginValue("showArmor", BOOLEAN, true).finishValue(showArmor::mirror) + .beginValue("groupArmor", BOOLEAN, true).finishValue(groupArmor::mirror) + .beginValue("colorByType", BOOLEAN, false).finishValue(colorByType::mirror) + .beginValue("hpTextHeight", INTEGER, 14).finishValue(hpTextHeight::mirror) + .beginValue("showMaxHP", BOOLEAN, true).finishValue(showMaxHP::mirror) + .beginValue("showCurrentHP", BOOLEAN, true).finishValue(showCurrentHP::mirror) + .beginValue("showPercentage", BOOLEAN, true).finishValue(showPercentage::mirror) + .beginValue("showOnPlayers", BOOLEAN, true).finishValue(showOnPlayers::mirror) + .beginValue("showOnBosses", BOOLEAN, true).finishValue(showOnBosses::mirror) + .beginValue("showOnlyFocused", BOOLEAN, false).finishValue(showOnlyFocused::mirror) + .beginValue("showFullHealth", BOOLEAN, true).finishValue(showFullHealth::mirror) + .beginValue("enableDebugInfo", BOOLEAN, true).finishValue(enableDebugInfo::mirror) + .beginValue("blacklist", ConfigTypes.makeList(STRING), NeatConfig.DEFAULT_DISABLED).finishValue(blacklist::mirror); + + return builder.build(); + } + + @Override + public int maxDistance() { + return maxDistance.getValue(); + } + + @Override + public boolean renderInF1() { + return renderInF1.getValue(); + } + + @Override + public double heightAbove() { + return heightAbove.getValue(); + } + + @Override + public boolean drawBackground() { + return drawBackground.getValue(); + } + + @Override + public int backgroundPadding() { + return backgroundPadding.getValue(); + } + + @Override + public int backgroundHeight() { + return backgroundHeight.getValue(); + } + + @Override + public int barHeight() { + return barHeight.getValue(); + } + + @Override + public int plateSize() { + return plateSize.getValue(); + } + + @Override + public int plateSizeBoss() { + return plateSizeBoss.getValue(); + } + + @Override + public boolean showAttributes() { + return showAttributes.getValue(); + } + + @Override + public boolean showArmor() { + return showArmor.getValue(); + } + + @Override + public boolean groupArmor() { + return groupArmor.getValue(); + } + + @Override + public boolean colorByType() { + return colorByType.getValue(); + } + + @Override + public int hpTextHeight() { + return hpTextHeight.getValue(); + } + + @Override + public boolean showMaxHP() { + return showMaxHP.getValue(); + } + + @Override + public boolean showCurrentHP() { + return showCurrentHP.getValue(); + } + + @Override + public boolean showPercentage() { + return showPercentage.getValue(); + } + + @Override + public boolean showOnPlayers() { + return showOnPlayers.getValue(); + } + + @Override + public boolean showOnBosses() { + return showOnBosses.getValue(); + } + + @Override + public boolean showOnlyFocused() { + return showOnlyFocused.getValue(); + } + + @Override + public boolean showFullHealth() { + return showFullHealth.getValue(); + } + + @Override + public boolean enableDebugInfo() { + return enableDebugInfo.getValue(); + } + + @Override + public List blacklist() { + return blacklist.getValue(); + } + } + + private static final Client CLIENT = new Client(); +} diff --git a/Fabric/src/main/resources/fabric.mod.json b/Fabric/src/main/resources/fabric.mod.json new file mode 100644 index 0000000..7df0eac --- /dev/null +++ b/Fabric/src/main/resources/fabric.mod.json @@ -0,0 +1,36 @@ +{ + "schemaVersion": 1, + "id": "neat", + "version": "${version}", + + "name": "Neat", + "description": "Botania is a tech mod themed around natural magic", + "authors": [ + "Vazkii", + "williewillus", + "Alwinfy" + ], + "contact": { + "sources": "https://github.com/VazkiiMods/Neat", + "issues": "https://github.com/VazkiiMods/Neat/issues" + }, + + "license": "MIT AND CC-BY-NC-SA-3.0", + + "environment": "client", + "entrypoints": { + "client": [ + "vazkii.neat.NeatFabricInitializer" + ] + }, + "mixins": [ + "neat.mixins.json" + ], + "accessWidener": "neat.accesswidener", + + "depends": { + "fabricloader": ">=0.12", + "fabric": ">=0.50", + "minecraft": ">=1.18.2" + } +} diff --git a/Fabric/src/main/resources/neat.accesswidener b/Fabric/src/main/resources/neat.accesswidener new file mode 100644 index 0000000..b66ff14 --- /dev/null +++ b/Fabric/src/main/resources/neat.accesswidener @@ -0,0 +1,3 @@ +accessWidener v1 named +accessible class net/minecraft/client/renderer/RenderType$CompositeRenderType +accessible class net/minecraft/client/renderer/RenderType$CompositeState diff --git a/Forge/src/main/java/vazkii/neat/NeatForgeConfig.java b/Forge/src/main/java/vazkii/neat/NeatForgeConfig.java index fc0c432..6d8dafb 100644 --- a/Forge/src/main/java/vazkii/neat/NeatForgeConfig.java +++ b/Forge/src/main/java/vazkii/neat/NeatForgeConfig.java @@ -1,7 +1,5 @@ package vazkii.neat; -import com.google.common.collect.ImmutableList; - import net.minecraftforge.common.ForgeConfigSpec; import net.minecraftforge.common.ForgeConfigSpec.ConfigValue; import net.minecraftforge.fml.ModLoadingContext; @@ -69,9 +67,7 @@ public ForgeNeatConfig(ForgeConfigSpec.Builder builder) { showFullHealth = builder.define("Show entities with full health", true); enableDebugInfo = builder.define("Show Debug Info with F3", true); blacklist = builder.comment("Blacklist uses entity IDs, not their display names. Use F3 to see them in the Neat bar.") - .defineList("Blacklist", - ImmutableList.of("minecraft:shulker", "minecraft:armor_stand", "minecraft:cod", "minecraft:salmon", "minecraft:pufferfish", "minecraft:tropical_fish"), - a -> true); + .defineList("Blacklist", NeatConfig.DEFAULT_DISABLED, a -> true); builder.pop(); } diff --git a/Xplat/src/main/java/vazkii/neat/NeatConfig.java b/Xplat/src/main/java/vazkii/neat/NeatConfig.java index 3b525e1..7f934c3 100644 --- a/Xplat/src/main/java/vazkii/neat/NeatConfig.java +++ b/Xplat/src/main/java/vazkii/neat/NeatConfig.java @@ -1,5 +1,7 @@ package vazkii.neat; +import com.google.common.collect.ImmutableList; + import java.util.List; public class NeatConfig { @@ -33,5 +35,7 @@ public interface ConfigAccess { List blacklist(); } + public static final List DEFAULT_DISABLED = ImmutableList.of("minecraft:shulker", "minecraft:armor_stand", "minecraft:cod", "minecraft:salmon", "minecraft:pufferfish", "minecraft:tropical_fish"); + public static ConfigAccess instance; } diff --git a/settings.gradle b/settings.gradle index e71dbf3..fb06d78 100644 --- a/settings.gradle +++ b/settings.gradle @@ -8,4 +8,4 @@ pluginManagement { } } rootProject.name = 'Neat' -include("Xplat", "Forge") +include("Xplat", "Fabric", "Forge")