Compare commits

..

No commits in common. "e831f8fe01dd0d7932c55b30b775ee1a6b8936c8" and "cf1af0993b967f57842b2bc42ae3779ca2b9d41a" have entirely different histories.

16 changed files with 118 additions and 144 deletions

2
.gitlab-ci.yml Normal file
View File

@ -0,0 +1,2 @@
include:
- remote: 'https://jfmods.gitlab.io/scripts/jfmod.yml'

View File

@ -1 +0,0 @@
#link https://pages.frohnmeyer-wds.de/scripts/jfmod.yml

14
build.gradle Normal file
View File

@ -0,0 +1,14 @@
apply from: "https://jfmods.gitlab.io/scripts/jfmod.gradle"
dependencies {
modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}"
include modImplementation("io.gitlab.jfronny.libjf:libjf-web-v0:${project.jfapi_version}")
include modImplementation("io.gitlab.jfronny.libjf:libjf-config-v0:${project.jfapi_version}")
include("io.gitlab.jfronny.libjf:libjf-unsafe-v0:${project.jfapi_version}")
include("io.gitlab.jfronny.libjf:libjf-base:${project.jfapi_version}")
include modRuntimeOnly('io.gitlab.jfronny:gson:2.9.0.2022.4.2.19.45.43') // Dependency of LibJF 2.7.0
modImplementation "com.terraformersmc:modmenu:3.1.0"
}

View File

@ -1,15 +0,0 @@
import io.gitlab.jfronny.scripts.*
plugins {
id("jfmod") version "1.2-SNAPSHOT"
id("io.gitlab.jfronny.libjf.libjf-config-compiler-plugin")
}
dependencies {
modImplementation("io.gitlab.jfronny.libjf:libjf-web-v0:${prop("libjf_version")}")
modImplementation("io.gitlab.jfronny.libjf:libjf-config-core-v1:${prop("libjf_version")}")
// Dev env
modLocalRuntime("io.gitlab.jfronny.libjf:libjf-config-reflect-v1:${prop("libjf_version")}")
modLocalRuntime("com.terraformersmc:modmenu:4.0.6")
}

View File

@ -1,17 +1,14 @@
# check these on https://fabricmc.net/develop/ # check these on https://fabricmc.net/develop/
minecraft_version=1.19.2 minecraft_version=1.18.2
yarn_mappings=build.24 yarn_mappings=build.2
loader_version=0.14.11 loader_version=0.13.3
maven_group=io.gitlab.jfronny maven_group=io.gitlab.jfronny
archives_base_name=dynres archives_base_name=dynres
modrinth_id=dynres fabric_version=0.48.0+1.18.2
modrinth_required_dependencies=libjf jfapi_version=2.7.0
modrinth_optional_dependencies=modmenu
curseforge_id=407012
curseforge_required_dependencies=libjf
curseforge_optional_dependencies=modmenu
fabric_version=0.68.0+1.19.2 modrinth_id=v3lfX2LD
libjf_version=3.2.1 modrinth_optional_dependencies=mOgUt4GM
curseforge_id=407012
curseforge_optional_dependencies=modmenu

View File

@ -1,13 +0,0 @@
pluginManagement {
val libjf_version: String by settings
repositories {
maven("https://maven.fabricmc.net/") // FabricMC
maven("https://maven.frohnmeyer-wds.de/artifacts") // scripts
gradlePluginPortal()
}
plugins {
id("io.gitlab.jfronny.libjf.libjf-config-compiler-plugin") version libjf_version
}
}
rootProject.name = "dynres"

View File

@ -1,38 +0,0 @@
package io.gitlab.jfronny.dynres.mixin;
import io.gitlab.jfronny.dynres.*;
import net.minecraft.client.network.*;
import net.minecraft.network.packet.c2s.play.*;
import net.minecraft.network.packet.s2c.play.*;
import org.jetbrains.annotations.*;
import org.spongepowered.asm.mixin.*;
import org.spongepowered.asm.mixin.injection.*;
import org.spongepowered.asm.mixin.injection.callback.*;
import java.net.*;
@Mixin(ClientPlayNetworkHandler.class)
public abstract class ClientPlayNetworkHandlerMixin {
@Shadow @Nullable
private static URL resolveUrl(String url) {
throw new RuntimeException("Mixin not applied");
}
@Inject(at = @At("HEAD"), method = "sendResourcePackStatus(Lnet/minecraft/network/packet/c2s/play/ResourcePackStatusC2SPacket$Status;)V")
public void logSentResourcePackStatus(ResourcePackStatusC2SPacket.Status packStatus, CallbackInfo info) {
DynRes.LOGGER.info("[SEND] ResourcePackStatus=" + packStatus);
}
@Inject(at = @At("HEAD"), method = "onResourcePackSend(Lnet/minecraft/network/packet/s2c/play/ResourcePackSendS2CPacket;)V")
public void logResourcePackStatus(ResourcePackSendS2CPacket status, CallbackInfo info) {
DynRes.LOGGER.info("[RECEIVE] ResourcePackUrl=" + status.getURL());
DynRes.LOGGER.info("[RECEIVE] ResourcePackSha1=" + status.getSHA1());
}
@Redirect(method = "onResourcePackSend(Lnet/minecraft/network/packet/s2c/play/ResourcePackSendS2CPacket;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/ClientPlayNetworkHandler;resolveUrl(Ljava/lang/String;)Ljava/net/URL;"))
public URL logResourcePackStatus(String url) {
URL res = resolveUrl(url);
DynRes.LOGGER.info("[CHECK] ResourcePackUrlValid=" + (res != null));
return res;
}
}

View File

@ -1,15 +0,0 @@
{
"required": true,
"minVersion": "0.8",
"package": "io.gitlab.jfronny.dynres.mixin",
"compatibilityLevel": "JAVA_17",
"client": [
"ClientPlayNetworkHandlerMixin",
"ServerInfoMixin"
],
"injectors": {
"defaultRequire": 1
},
"mixins": [
]
}

View File

@ -1,10 +1,11 @@
package io.gitlab.jfronny.dynres; package io.gitlab.jfronny.dynres;
import io.gitlab.jfronny.libjf.config.api.v1.Entry; import io.gitlab.jfronny.libjf.config.api.Entry;
import io.gitlab.jfronny.libjf.config.api.v1.JfConfig; import io.gitlab.jfronny.libjf.config.api.JfConfig;
@JfConfig public class Cfg implements JfConfig {
public class Cfg { @Entry
@Entry public static String resourcesFile = "resources.zip"; public static String resourcesFile = "resources.zip";
@Entry public static boolean hashResources = false; @Entry
public static boolean hashResources = false;
} }

View File

@ -0,0 +1,30 @@
package io.gitlab.jfronny.dynres.mixin;
import io.gitlab.jfronny.dynres.DynRes;
import net.minecraft.client.network.ClientPlayNetworkHandler;
import net.minecraft.network.packet.c2s.play.ResourcePackStatusC2SPacket;
import net.minecraft.network.packet.s2c.play.ResourcePackSendS2CPacket;
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;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
@Mixin(ClientPlayNetworkHandler.class)
public class ClientPlayNetworkHandlerMixin {
@Inject(at = @At("HEAD"), method = "sendResourcePackStatus(Lnet/minecraft/network/packet/c2s/play/ResourcePackStatusC2SPacket$Status;)V")
public void logSentResourcePackStatus(ResourcePackStatusC2SPacket.Status packStatus, CallbackInfo info) {
DynRes.LOGGER.info("[SEND] ResourcePackStatus=" + packStatus);
}
@Inject(at = @At("HEAD"), method = "onResourcePackSend(Lnet/minecraft/network/packet/s2c/play/ResourcePackSendS2CPacket;)V")
public void logResourcePackStatus(ResourcePackSendS2CPacket status, CallbackInfo info) {
DynRes.LOGGER.info("[RECEIVE] ResourcePackUrl=" + status.getURL());
DynRes.LOGGER.info("[RECEIVE] ResourcePackSha1=" + status.getSHA1());
}
@Inject(at = @At("RETURN"), method = "validateResourcePackUrl(Ljava/lang/String;)Z")
public void logUrlValid(String url, CallbackInfoReturnable<Boolean> info) {
DynRes.LOGGER.info("[CHECK] ResourcePackUrlValid=" + info.getReturnValue());
}
}

View File

@ -0,0 +1,14 @@
package io.gitlab.jfronny.dynres.mixin;
import net.minecraft.server.MinecraftServer;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
@Mixin(MinecraftServer.class)
public class MinecraftServerMixin {
@Redirect(method = "loadWorldResourcePack()V", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/MinecraftServer;setResourcePack(Ljava/lang/String;Ljava/lang/String;)V"))
public void cancelResourcePackSet(MinecraftServer server, String url, String hash) {
// cancel
}
}

View File

@ -1,50 +1,48 @@
package io.gitlab.jfronny.dynres.mixin; package io.gitlab.jfronny.dynres.mixin;
import io.gitlab.jfronny.dynres.*; import io.gitlab.jfronny.dynres.Cfg;
import io.gitlab.jfronny.libjf.web.api.*; import io.gitlab.jfronny.dynres.DynRes;
import io.gitlab.jfronny.libjf.web.impl.util.*; import io.gitlab.jfronny.libjf.web.api.WebServer;
import net.minecraft.server.*; import io.gitlab.jfronny.libjf.web.impl.util.WebPaths;
import net.minecraft.server.dedicated.*; import net.minecraft.server.dedicated.ServerPropertiesHandler;
import net.minecraft.text.*; import org.spongepowered.asm.mixin.Final;
import org.jetbrains.annotations.*; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.*; import org.spongepowered.asm.mixin.Mutable;
import org.spongepowered.asm.mixin.injection.*; import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.callback.*; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import java.io.*; import java.io.IOException;
import java.nio.file.*; import java.nio.file.Files;
import java.security.*; import java.security.MessageDigest;
import java.util.*; import java.security.NoSuchAlgorithmException;
@Mixin(ServerPropertiesHandler.class) @Mixin(ServerPropertiesHandler.class)
public abstract class ServerPropertiesHandlerMixin { public class ServerPropertiesHandlerMixin {
@Shadow @Nullable @Mutable @Final @Shadow public String resourcePackHash;
private static Text parseResourcePackPrompt(String prompt) { @Mutable @Final @Shadow public String resourcePackSha1;
throw new IllegalStateException("Mixin not applied"); @Mutable @Final @Shadow public String resourcePack;
}
@Inject(method = "getServerResourcePackProperties(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZLjava/lang/String;)Ljava/util/Optional;", at = @At("HEAD"), cancellable = true) @Inject(at = @At("RETURN"), method = "<init>(Ljava/util/Properties;)V")
private static void getServerResourcePackProperties(String url, String sha1, @Nullable String hash, boolean required, String prompt, CallbackInfoReturnable<Optional<MinecraftServer.ServerResourcePackProperties>> cir) { public void init(CallbackInfo info) {
if (DynRes.packFile != null) { if (DynRes.packFile != null) {
sha1 = ""; resourcePack = WebPaths.concat(WebServer.getInstance().getServerRoot(), "resources.zip");
DynRes.LOGGER.info("Pack link: " + resourcePack);
resourcePackSha1 = "";
if (Cfg.hashResources) { if (Cfg.hashResources) {
try { try {
StringBuilder result = new StringBuilder(); StringBuilder result = new StringBuilder();
for (byte b : MessageDigest.getInstance("SHA-1").digest(Files.readAllBytes(DynRes.packFile))) { for (byte b : MessageDigest.getInstance("SHA-1").digest(Files.readAllBytes(DynRes.packFile))) {
result.append(Integer.toString((b & 0xff) + 0x100, 16).substring(1)); result.append(Integer.toString((b & 0xff) + 0x100, 16).substring(1));
} }
sha1 = result.toString(); resourcePackSha1 = result.toString();
DynRes.LOGGER.info("Set hash to " + sha1); DynRes.LOGGER.info("Set hash to " + resourcePackSha1);
} catch (IOException | NoSuchAlgorithmException e) { } catch (IOException | NoSuchAlgorithmException e) {
DynRes.LOGGER.error("Failed to get hash, continuing with empty", e); DynRes.LOGGER.error("Failed to get hash, continuing with empty", e);
} }
} }
cir.setReturnValue(Optional.of(new MinecraftServer.ServerResourcePackProperties( resourcePackHash = resourcePackSha1;
WebPaths.concat(WebServer.getInstance().getServerRoot(), "resources.zip"),
sha1,
required,
parseResourcePackPrompt(prompt)
)));
} }
} }
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

View File

@ -3,8 +3,13 @@
"minVersion": "0.8", "minVersion": "0.8",
"package": "io.gitlab.jfronny.dynres.mixin", "package": "io.gitlab.jfronny.dynres.mixin",
"compatibilityLevel": "JAVA_17", "compatibilityLevel": "JAVA_17",
"client": [
"ClientPlayNetworkHandlerMixin",
"ServerInfoMixin"
],
"server": [ "server": [
"ServerPropertiesHandlerMixin" "ServerPropertiesHandlerMixin",
"MinecraftServerMixin"
], ],
"injectors": { "injectors": {
"defaultRequire": 1 "defaultRequire": 1

View File

@ -3,13 +3,13 @@
"id": "dynres", "id": "dynres",
"version": "${version}", "version": "${version}",
"name": "DynRes", "name": "DynRes",
"description": "Host a resource pack directly on your server", "description": "Host resourcepacks directly in-server",
"authors": ["JFronny"], "authors": [
"JFronny"
],
"contact": { "contact": {
"email": "projects.contact@frohnmeyer-wds.de", "website": "https://jfronny.gitlab.io",
"homepage": "https://jfronny.gitlab.io", "repo": "https://www.gitlab.com/jfmods/DynRes"
"issues": "https://git.frohnmeyer-wds.de/JfMods/DynRes/issues",
"sources": "https://git.frohnmeyer-wds.de/JfMods/DynRes"
}, },
"license": "MIT", "license": "MIT",
"icon": "assets/dynres/icon.png", "icon": "assets/dynres/icon.png",
@ -20,17 +20,12 @@
"libjf:config": ["io.gitlab.jfronny.dynres.Cfg"] "libjf:config": ["io.gitlab.jfronny.dynres.Cfg"]
}, },
"mixins": [ "mixins": [
"dynres.mixins.json", "dynres.mixins.json"
{
"config": "dynres.client.mixins.json",
"environment": "client"
}
], ],
"depends": { "depends": {
"fabricloader": ">=0.12.0", "fabricloader": ">=0.12.0",
"minecraft": "*", "minecraft": "*",
"fabric-api": "*", "libjf-config-v0": ">=2.7.0"
"libjf-config-core-v1": ">=2.7.0"
}, },
"custom": { "custom": {
"libjf": { "libjf": {