mirror of
https://github.com/PuzzleMC/Puzzle.git
synced 2025-12-16 11:55:09 +01:00
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:
@@ -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";
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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!");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user