Puzzle 1.1.0 - Use IrisAPI, Deactivatable Integrations, Remove puzzle-blocks

- Use the new Iris API
- Builtin mod support is now configurable
- Puzzle button in Options screen can be disabled
- Remove puzzle-blocks (Already covered by Continuity)
- Fix #4
- Fix #5
- Fix #6
- Fix #7
This commit is contained in:
Motschen
2022-01-09 15:32:24 +01:00
parent 49ddb467ae
commit 88d6b4f5c3
20 changed files with 73 additions and 257 deletions

View File

@@ -1,3 +1,9 @@
archivesBaseName = "puzzle-base"
dependencies {
repositories {
maven {
url = "https://api.modrinth.com/maven"
}
}
dependencies {
modImplementation "maven.modrinth:midnightlib:${project.midnightlib_version}"
}

View File

@@ -11,7 +11,7 @@ public class PuzzleCore implements ClientModInitializer {
public final static String name = "Puzzle";
public final static String id = "puzzle";
public final static String website = "https://github.com/PuzzleMC/Puzzle";
public static String updateURL = "https://modrinth.com/mod/puzzle";
public final static String updateURL = "https://modrinth.com/mod/puzzle";
public final static String UPDATE_CHECKER_URL = "https://raw.githubusercontent.com/PuzzleMC/Puzzle-Versions/main/puzzle_versions.json";

View File

@@ -1,69 +0,0 @@
package net.puzzlemc.core.config;
import com.google.gson.ExclusionStrategy;
import com.google.gson.FieldAttributes;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import net.fabricmc.loader.api.FabricLoader;
import java.lang.annotation.*;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.*;
// MidnightConfigLite v0.2.0
// Just writing and parsing of config files
/** Based on https://github.com/Minenash/TinyConfig
* Credits to Minenash */
public class MidnightConfigLite {
protected static class EntryInfo {
Object defaultValue;
}
public static final Map<String,Class<?>> configClass = new HashMap<>();
private static Path path;
private static final Gson gson = new GsonBuilder().excludeFieldsWithModifiers(Modifier.TRANSIENT).excludeFieldsWithModifiers(Modifier.PRIVATE).addSerializationExclusionStrategy(new HiddenAnnotationExclusionStrategy()).setPrettyPrinting().create();
public static void init(String modid, Class<?> config) {
path = FabricLoader.getInstance().getConfigDir().resolve(modid + ".json");
configClass.put(modid, config);
for (Field field : config.getFields()) {
EntryInfo info = new EntryInfo();
if (field.isAnnotationPresent(Entry.class))
try {
info.defaultValue = field.get(null);
} catch (IllegalAccessException ignored) {}
}
try { gson.fromJson(Files.newBufferedReader(path), config); }
catch (Exception e) { write(modid); }
}
public static void write(String modid) {
path = FabricLoader.getInstance().getConfigDir().resolve(modid + ".json");
try {
if (!Files.exists(path)) Files.createFile(path);
Files.write(path, gson.toJson(configClass.get(modid).getDeclaredConstructor().newInstance()).getBytes());
} catch (Exception e) {
e.printStackTrace();
}
}
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Entry {
}
public static class HiddenAnnotationExclusionStrategy implements ExclusionStrategy {
public boolean shouldSkipClass(Class<?> clazz) { return false; }
public boolean shouldSkipField(FieldAttributes fieldAttributes) {
return fieldAttributes.getAnnotation(Entry.class) == null;
}
}
}

View File

@@ -1,6 +1,13 @@
package net.puzzlemc.core.config;
public class PuzzleConfig extends MidnightConfigLite {
import eu.midnightdust.lib.config.MidnightConfig;
import java.util.ArrayList;
import java.util.List;
public class PuzzleConfig extends MidnightConfig {
@Entry public static List<String> disabledIntegrations = new ArrayList<>();
@Entry public static boolean enablePuzzleButton = true;
@Entry public static boolean debugMessages = false;
@Entry public static boolean checkUpdates = true;
@@ -8,7 +15,6 @@ public class PuzzleConfig extends MidnightConfigLite {
@Entry public static boolean resourcepackSplashScreen = true;
@Entry public static boolean disableSplashScreenBlend = false;
@Entry public static boolean emissiveTextures = true;
@Entry public static boolean customRenderLayers = true;
@Entry public static boolean unlimitedRotations = true;
@Entry public static boolean biggerModels = true;

View File

@@ -1,5 +1,6 @@
package net.puzzlemc.core.mixin;
import net.fabricmc.loader.api.FabricLoader;
import net.puzzlemc.core.PuzzleCore;
import net.puzzlemc.core.config.PuzzleConfig;
import net.puzzlemc.core.util.UpdateChecker;
@@ -26,12 +27,14 @@ public abstract class MixinTitleScreen extends Screen {
@Shadow private long backgroundFadeStart;
private Text puzzleText;
private int puzzleTextWidth;
private int yOffset = 20;
protected MixinTitleScreen(Text title) {
super(title);
}
@Inject(at = @At("TAIL"), method = "init")
private void puzzle$init(CallbackInfo ci) {
if (FabricLoader.getInstance().isModLoaded("dashloader")) yOffset = yOffset + 10;
if (UpdateChecker.isUpToDate) {
puzzleText = Text.of(PuzzleCore.version);
}
@@ -47,9 +50,9 @@ public abstract class MixinTitleScreen extends Screen {
float f = this.doBackgroundFade ? (float) (Util.getMeasuringTimeMs() - this.backgroundFadeStart) / 1000.0F : 1.0F;
float g = this.doBackgroundFade ? MathHelper.clamp(f - 1.0F, 0.0F, 1.0F) : 1.0F;
int l = MathHelper.ceil(g * 255.0F) << 24;
textRenderer.drawWithShadow(matrices, puzzleText,2,this.height - 20, 16777215 | l);
if (mouseX > 2 && mouseX < 2 + this.puzzleTextWidth && mouseY > this.height - 20 && mouseY < this.height - 10) {
fill(matrices, 2, this.height - 11, 2 + this.puzzleTextWidth, this.height-10, 16777215 | l);
textRenderer.drawWithShadow(matrices, puzzleText,2,this.height - yOffset, 16777215 | l);
if (mouseX > 2 && mouseX < 2 + this.puzzleTextWidth && mouseY > this.height - yOffset && mouseY < this.height - yOffset + 10) {
fill(matrices, 2, this.height - yOffset + 9, 2 + this.puzzleTextWidth, this.height - yOffset + 10, 16777215 | l);
}
}
}
@@ -63,7 +66,7 @@ public abstract class MixinTitleScreen extends Screen {
@Inject(at = @At("HEAD"), method = "mouseClicked",cancellable = true)
private void puzzle$mouseClicked(double mouseX, double mouseY, int button, CallbackInfoReturnable<Boolean> cir) {
if (mouseX > 2 && mouseX < (double)(2 + this.puzzleTextWidth) && mouseY > (double)(this.height - 20) && mouseY < (double)this.height-10) {
if (mouseX > 2 && mouseX < (double)(2 + this.puzzleTextWidth) && mouseY > (double)(this.height - yOffset) && mouseY < (double)this.height - yOffset + 10) {
if (Objects.requireNonNull(this.client).options.chatLinksPrompt) {
this.client.setScreen(new ConfirmChatLinkScreen(this::confirmLink, PuzzleCore.updateURL, true));
} else {

View File

@@ -43,7 +43,6 @@ public class UpdateChecker {
latestVersion = versionMap.get(minecraftVersion);
if (!latestVersion.equals(PuzzleCore.version)) {
isUpToDate = false;
PuzzleCore.updateURL = PuzzleCore.website + "download/" + latestVersion.replace(PuzzleCore.name + " ","");
logger.log(Level.INFO, "There is a newer version of "+ PuzzleCore.name +" available: " + latestVersion);
logger.log(Level.INFO, "Please update immediately!");
}