[DEV] Fix up porting patches and configs

This commit is contained in:
2024-06-11 19:51:28 +02:00
parent 68fea1db1e
commit 1ffa879f17
1023 changed files with 38304 additions and 596 deletions

126
1.19.3/Fabric/build.gradle Normal file
View File

@@ -0,0 +1,126 @@
archivesBaseName = "${mod_name.replace(" ", "")}-Fabric-${minecraft_version}"
dependencies {
// Core
modImplementation "net.fabricmc.fabric-api:fabric-api:${fabric_api}"
// Compat
modImplementation("com.terraformersmc:modmenu:${mod_menu_version}") {
exclude(group: "net.fabricmc.fabric-api")
}
modImplementation "maven.modrinth:fabrictailor:${fabrictailor}"
modImplementation "maven.modrinth:vanish:${vanish}"
// Do not edit or remove
implementation project(":Common")
}
shadowJar {
from sourceSets.main.output
configurations = [project.configurations.shade]
dependencies {
exclude(dependency('com.google.code.gson:.*'))
relocate 'me.hypherionmc.moonconfig', 'shadow.hypherionmc.moonconfig'
relocate 'me.hypherionmc.mcdiscordformatter', 'shadow.hypherionmc.mcdiscordformatter'
relocate 'net.kyori', 'shadow.kyori'
}
setArchiveClassifier('dev-shadow')
}
/**
* ===============================================================================
* = DO NOT EDIT BELOW THIS LINE UNLESS YOU KNOW WHAT YOU ARE DOING =
* ===============================================================================
*/
unimined.minecraft {
fabric {
loader fabric_loader
}
}
remapJar {
inputFile.set shadowJar.archiveFile
dependsOn shadowJar
archiveClassifier.set null
}
jar {
archiveClassifier.set "dev"
}
processResources {
from project(":Common").sourceSets.main.resources
def buildProps = project.properties.clone()
filesMatching(['fabric.mod.json']) {
expand buildProps
}
}
compileTestJava.enabled = false
tasks.withType(JavaCompile).configureEach {
source(project(":Common").sourceSets.main.allSource)
}
/**
* Publishing Config
*/
publishing {
publications {
mavenJava(MavenPublication) {
artifactId project.archivesBaseName
from components.java
artifact(remapJar) {
builtBy remapJar
}
pom.withXml {
Node pomNode = asNode()
pomNode.dependencies.'*'.findAll() {
it.artifactId.text() == 'regutils-joined-fabric' ||
it.artifactId.text() == 'core' ||
it.artifactId.text() == 'toml'
}.each() {
it.parent().remove(it)
}
}
}
}
repositories {
maven rootProject.orion.getPublishingMaven()
}
}
publisher {
apiKeys {
modrinth(System.getenv("MODRINTH_TOKEN"))
curseforge(System.getenv("CURSE_TOKEN"))
}
setCurseID(curse_id)
setModrinthID(modrinth_id)
setVersionType("release")
setChangelog("https://raw.githubusercontent.com/hypherionmc/changelogs/main/craterlib/changelog-fabric.md")
setProjectVersion("${minecraft_version}-${project.version}")
setDisplayName("[FABRIC/QUILT 1.19.3/1.19.4] CraterLib - ${project.version}")
setGameVersions("1.19.3", "1.19.4")
setLoaders("fabric", "quilt")
setArtifact(remapJar)
setCurseEnvironment("both")
modrinthDepends {
required("fabric-api")
}
curseDepends {
required("fabric-api")
}
}

View File

@@ -0,0 +1,42 @@
package com.hypherionmc.craterlib;
import com.hypherionmc.craterlib.api.events.server.CraterRegisterCommandEvent;
import com.hypherionmc.craterlib.api.events.server.CraterServerLifecycleEvent;
import com.hypherionmc.craterlib.common.FabricCommonPlatform;
import com.hypherionmc.craterlib.compat.Vanish;
import com.hypherionmc.craterlib.core.event.CraterEventBus;
import com.hypherionmc.craterlib.core.networking.CraterPacketNetwork;
import com.hypherionmc.craterlib.core.networking.data.PacketSide;
import com.hypherionmc.craterlib.core.platform.ModloaderEnvironment;
import com.hypherionmc.craterlib.network.CraterFabricNetworkHandler;
import com.hypherionmc.craterlib.nojang.commands.CommandsRegistry;
import com.hypherionmc.craterlib.nojang.server.BridgedMinecraftServer;
import net.fabricmc.api.ModInitializer;
import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback;
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents;
public class CraterLibInitializer implements ModInitializer {
@Override
public void onInitialize() {
new CraterPacketNetwork(new CraterFabricNetworkHandler(PacketSide.SERVER));
CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> {
CraterEventBus.INSTANCE.postEvent(new CraterRegisterCommandEvent());
CommandsRegistry.INSTANCE.registerCommands(dispatcher);
});
ServerLifecycleEvents.SERVER_STARTING.register(server -> {
FabricCommonPlatform.server = server;
CraterEventBus.INSTANCE.postEvent(new CraterServerLifecycleEvent.Starting(BridgedMinecraftServer.of(server)));
});
ServerLifecycleEvents.SERVER_STARTED.register(li -> CraterEventBus.INSTANCE.postEvent(new CraterServerLifecycleEvent.Started(BridgedMinecraftServer.of(li))));
ServerLifecycleEvents.SERVER_STOPPING.register(server -> CraterEventBus.INSTANCE.postEvent(new CraterServerLifecycleEvent.Stopping(BridgedMinecraftServer.of(server))));
ServerLifecycleEvents.SERVER_STOPPED.register(server -> CraterEventBus.INSTANCE.postEvent(new CraterServerLifecycleEvent.Stopped(BridgedMinecraftServer.of(server))));
if (ModloaderEnvironment.INSTANCE.isModLoaded("melius-vanish")) {
Vanish.register();
}
}
}

View File

@@ -0,0 +1,30 @@
package com.hypherionmc.craterlib;
import com.hypherionmc.craterlib.client.gui.config.CraterConfigScreen;
import com.hypherionmc.craterlib.core.config.ConfigController;
import com.hypherionmc.craterlib.core.config.ModuleConfig;
import com.hypherionmc.craterlib.core.config.annotations.NoConfigScreen;
import com.terraformersmc.modmenu.api.ConfigScreenFactory;
import com.terraformersmc.modmenu.api.ModMenuApi;
import java.util.HashMap;
import java.util.Map;
/**
* @author HypherionSA
*/
public class CraterLibModMenuIntegration implements ModMenuApi {
@Override
public Map<String, ConfigScreenFactory<?>> getProvidedConfigScreenFactories() {
Map<String, ConfigScreenFactory<?>> configScreens = new HashMap<>();
ConfigController.getMonitoredConfigs().forEach((conf, watcher) -> {
if (!conf.getClass().isAnnotationPresent(NoConfigScreen.class)) {
configScreens.put(((ModuleConfig) conf).getModId(), screen -> new CraterConfigScreen((ModuleConfig) conf, screen));
}
});
return configScreens;
}
}

View File

@@ -0,0 +1,27 @@
package com.hypherionmc.craterlib.client;
import com.hypherionmc.craterlib.api.events.client.CraterClientTickEvent;
import com.hypherionmc.craterlib.core.event.CraterEventBus;
import com.hypherionmc.craterlib.core.networking.CraterPacketNetwork;
import com.hypherionmc.craterlib.core.networking.data.PacketSide;
import com.hypherionmc.craterlib.network.CraterFabricNetworkHandler;
import com.hypherionmc.craterlib.nojang.client.multiplayer.BridgedClientLevel;
import net.fabricmc.api.ClientModInitializer;
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents;
public class CraterLibClientInitializer implements ClientModInitializer {
@Override
public void onInitializeClient() {
new CraterPacketNetwork(new CraterFabricNetworkHandler(PacketSide.CLIENT));
ClientTickEvents.START_CLIENT_TICK.register((listener) -> {
if (listener.level == null)
return;
CraterClientTickEvent event = new CraterClientTickEvent(BridgedClientLevel.of(listener.level));
CraterEventBus.INSTANCE.postEvent(event);
});
CraterEventBus.INSTANCE.registerEventListener(CraterLibClientInitializer.class);
}
}

View File

@@ -0,0 +1,34 @@
package com.hypherionmc.craterlib.client;
import com.hypherionmc.craterlib.core.platform.ClientPlatform;
import com.hypherionmc.craterlib.nojang.client.BridgedMinecraft;
import com.hypherionmc.craterlib.nojang.client.multiplayer.BridgedClientLevel;
import com.hypherionmc.craterlib.nojang.world.entity.player.BridgedPlayer;
import net.minecraft.client.Minecraft;
import net.minecraft.network.Connection;
/**
* @author HypherionSA
*/
public class FabricClientPlatform implements ClientPlatform {
@Override
public BridgedMinecraft getClientInstance() {
return new BridgedMinecraft();
}
@Override
public BridgedPlayer getClientPlayer() {
return BridgedPlayer.of(Minecraft.getInstance().player);
}
@Override
public BridgedClientLevel getClientLevel() {
return BridgedClientLevel.of(Minecraft.getInstance().level);
}
@Override
public Connection getClientConnection() {
return Minecraft.getInstance().getConnection().getConnection();
}
}

View File

@@ -0,0 +1,18 @@
package com.hypherionmc.craterlib.common;
import com.hypherionmc.craterlib.core.platform.CommonPlatform;
import com.hypherionmc.craterlib.nojang.server.BridgedMinecraftServer;
import net.minecraft.server.MinecraftServer;
/**
* @author HypherionSA
*/
public class FabricCommonPlatform implements CommonPlatform {
public static MinecraftServer server;
@Override
public BridgedMinecraftServer getMCServer() {
return BridgedMinecraftServer.of(server);
}
}

View File

@@ -0,0 +1,23 @@
package com.hypherionmc.craterlib.common;
import com.hypherionmc.craterlib.compat.FabricTailor;
import com.hypherionmc.craterlib.compat.Vanish;
import com.hypherionmc.craterlib.core.platform.CompatUtils;
import com.hypherionmc.craterlib.core.platform.ModloaderEnvironment;
import com.hypherionmc.craterlib.nojang.world.entity.player.BridgedPlayer;
public class FabricCompatHelper implements CompatUtils {
@Override
public boolean isPlayerActive(BridgedPlayer player) {
if (!ModloaderEnvironment.INSTANCE.isModLoaded("melius-vanish"))
return true;
return Vanish.isPlayerVanished(player.toMojangServerPlayer());
}
@Override
public String getSkinUUID(BridgedPlayer player) {
return FabricTailor.getTailorSkin(player.toMojangServerPlayer());
}
}

View File

@@ -0,0 +1,69 @@
package com.hypherionmc.craterlib.common;
import com.hypherionmc.craterlib.core.platform.Environment;
import com.hypherionmc.craterlib.core.platform.ModloaderEnvironment;
import net.fabricmc.loader.api.FabricLoader;
import net.minecraft.SharedConstants;
import net.minecraft.client.Minecraft;
import java.io.File;
/**
* @author HypherionSA
* @date 07/08/2022
*/
public class FabricLoaderHelper implements ModloaderEnvironment {
@Override
public boolean isFabric() {
return true;
}
@Override
public String getGameVersion() {
return SharedConstants.VERSION_STRING;
}
@Override
public File getGameFolder() {
return Minecraft.getInstance().gameDirectory;
}
@Override
public File getConfigFolder() {
return FabricLoader.getInstance().getConfigDir().toFile();
}
@Override
public File getModsFolder() {
return new File(FabricLoader.getInstance().getGameDir().toString() + File.separator + "mods");
}
@Override
public Environment getEnvironment() {
switch (FabricLoader.getInstance().getEnvironmentType()) {
case SERVER -> {
return Environment.SERVER;
}
case CLIENT -> {
return Environment.CLIENT;
}
}
return Environment.UNKNOWN;
}
@Override
public boolean isModLoaded(String modid) {
return FabricLoader.getInstance().isModLoaded(modid);
}
@Override
public boolean isDevEnv() {
return FabricLoader.getInstance().isDevelopmentEnvironment();
}
@Override
public int getModCount() {
return FabricLoader.getInstance().getAllMods().size();
}
}

View File

@@ -0,0 +1,23 @@
package com.hypherionmc.craterlib.compat;
import com.hypherionmc.craterlib.core.platform.ModloaderEnvironment;
import net.minecraft.server.level.ServerPlayer;
import org.samo_lego.fabrictailor.casts.TailoredPlayer;
public class FabricTailor {
public static String getTailorSkin(ServerPlayer player) {
if (!ModloaderEnvironment.INSTANCE.isModLoaded("fabrictailor"))
return player.getStringUUID();
try {
if (player instanceof TailoredPlayer tp) {
return tp.getSkinId();
}
} catch (Exception e) {
e.printStackTrace();
}
return player.getStringUUID();
}
}

View File

@@ -0,0 +1,25 @@
package com.hypherionmc.craterlib.compat;
import com.hypherionmc.craterlib.api.events.server.CraterPlayerEvent;
import com.hypherionmc.craterlib.core.event.CraterEventBus;
import com.hypherionmc.craterlib.nojang.world.entity.player.BridgedPlayer;
import me.drex.vanish.api.VanishAPI;
import me.drex.vanish.api.VanishEvents;
import net.minecraft.server.level.ServerPlayer;
public class Vanish {
public static void register() {
VanishEvents.VANISH_EVENT.register((serverPlayer, b) -> {
if (b) {
CraterEventBus.INSTANCE.postEvent(new CraterPlayerEvent.PlayerLoggedOut(BridgedPlayer.of(serverPlayer)));
} else {
CraterEventBus.INSTANCE.postEvent(new CraterPlayerEvent.PlayerLoggedIn(BridgedPlayer.of(serverPlayer)));
}
});
}
public static boolean isPlayerVanished(ServerPlayer player) {
return VanishAPI.isVanished(player);
}
}

View File

@@ -0,0 +1,36 @@
package com.hypherionmc.craterlib.mixin;
import com.hypherionmc.craterlib.api.events.server.CraterServerChatEvent;
import com.hypherionmc.craterlib.core.event.CraterEventBus;
import com.hypherionmc.craterlib.nojang.world.entity.player.BridgedPlayer;
import com.hypherionmc.craterlib.utils.ChatUtils;
import net.minecraft.network.chat.PlayerChatMessage;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.server.network.ServerGamePacketListenerImpl;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import java.util.concurrent.CompletableFuture;
@Mixin(value = ServerGamePacketListenerImpl.class, priority = Integer.MIN_VALUE)
public class ServerGamePacketListenerImplMixin {
@Shadow
public ServerPlayer player;
@Inject(
method = "lambda$handleChat$8",
at = @At("HEAD"),
cancellable = true
)
private void injectChatEvent(PlayerChatMessage arg, CompletableFuture completableFuture, CompletableFuture completableFuture2, Void void_, CallbackInfo ci) {
CraterServerChatEvent event = new CraterServerChatEvent(BridgedPlayer.of(this.player), arg.decoratedContent().getString(), ChatUtils.mojangToAdventure(arg.decoratedContent()));
CraterEventBus.INSTANCE.postEvent(event);
if (event.wasCancelled())
ci.cancel();
}
}

View File

@@ -0,0 +1,24 @@
package com.hypherionmc.craterlib.mixin;
import com.hypherionmc.craterlib.api.events.client.LateInitEvent;
import com.hypherionmc.craterlib.core.event.CraterEventBus;
import com.hypherionmc.craterlib.nojang.client.BridgedMinecraft;
import com.hypherionmc.craterlib.nojang.client.BridgedOptions;
import net.minecraft.client.Minecraft;
import net.minecraft.client.Options;
import net.minecraft.client.tutorial.Tutorial;
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(Tutorial.class)
public class TutorialMixin {
@Inject(method = "<init>", at = @At("RETURN"))
private void injectEarlyInitEvent(Minecraft minecraft, Options options, CallbackInfo ci) {
LateInitEvent event = new LateInitEvent(new BridgedMinecraft(), BridgedOptions.of(options));
CraterEventBus.INSTANCE.postEvent(event);
}
}

View File

@@ -0,0 +1,81 @@
package com.hypherionmc.craterlib.network;
import com.hypherionmc.craterlib.CraterConstants;
import com.hypherionmc.craterlib.core.networking.PacketRegistry;
import com.hypherionmc.craterlib.core.networking.data.PacketContext;
import com.hypherionmc.craterlib.core.networking.data.PacketHolder;
import com.hypherionmc.craterlib.core.networking.data.PacketSide;
import com.hypherionmc.craterlib.nojang.network.BridgedFriendlyByteBuf;
import com.hypherionmc.craterlib.nojang.resources.ResourceIdentifier;
import com.hypherionmc.craterlib.nojang.world.entity.player.BridgedPlayer;
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking;
import net.fabricmc.fabric.api.networking.v1.PacketByteBufs;
import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking;
import net.minecraft.network.FriendlyByteBuf;
import java.util.HashMap;
import java.util.Map;
import java.util.function.BiConsumer;
/**
* Based on https://github.com/mysticdrew/common-networking/tree/1.20.4
*/
public class CraterFabricNetworkHandler extends PacketRegistry {
private final Map<Class<?>, Message<?>> CHANNELS = new HashMap();
public CraterFabricNetworkHandler(PacketSide side) {
super(side);
}
protected <T> void registerPacket(PacketHolder<T> holder) {
if (CHANNELS.get(holder.messageType()) == null) {
CHANNELS.put(holder.messageType(), new Message<>(holder.type(), holder.encoder()));
if (PacketSide.CLIENT.equals(this.side)) {
ClientPlayNetworking.registerGlobalReceiver(holder.type().toMojang(), ((client, listener, buf, responseSender) -> {
buf.readByte();
T message = holder.decoder().apply(BridgedFriendlyByteBuf.of(buf));
client.execute(() -> holder.handler().accept(new PacketContext<>(message, PacketSide.CLIENT)));
}));
} else {
ServerPlayNetworking.registerGlobalReceiver(holder.type().toMojang(), ((server, player, listener, buf, responseSender) -> {
buf.readByte();
T message = holder.decoder().apply(BridgedFriendlyByteBuf.of(buf));
server.execute(() -> holder.handler().accept(new PacketContext<>(BridgedPlayer.of(player), message, PacketSide.SERVER)));
}));
}
} else {
CraterConstants.LOG.error("Trying to register duplicate packet for type {}", holder.messageType());
}
}
public <T> void sendToServer(T packet) {
this.sendToServer(packet, false);
}
public <T> void sendToServer(T packet, boolean ignoreCheck) {
Message<T> message = (Message<T>) CHANNELS.get(packet.getClass());
if (ClientPlayNetworking.canSend(message.id().toMojang()) || ignoreCheck) {
FriendlyByteBuf buf = PacketByteBufs.create();
buf.writeByte(0);
message.encoder().accept(packet, BridgedFriendlyByteBuf.of(buf));
ClientPlayNetworking.send(message.id().toMojang(), buf);
}
}
public <T> void sendToClient(T packet, BridgedPlayer player) {
Message<T> message = (Message<T>) CHANNELS.get(packet.getClass());
if (ServerPlayNetworking.canSend(player.toMojangServerPlayer(), message.id().toMojang())) {
FriendlyByteBuf buf = PacketByteBufs.create();
buf.writeByte(0);
message.encoder().accept(packet, BridgedFriendlyByteBuf.of(buf));
ServerPlayNetworking.send(player.toMojangServerPlayer(), message.id().toMojang(), buf);
}
}
public record Message<T>(ResourceIdentifier id, BiConsumer<T, BridgedFriendlyByteBuf> encoder) { }
}

View File

@@ -0,0 +1 @@
com.hypherionmc.craterlib.client.FabricClientPlatform

View File

@@ -0,0 +1 @@
com.hypherionmc.craterlib.common.FabricCommonPlatform

View File

@@ -0,0 +1 @@
com.hypherionmc.craterlib.common.FabricCompatHelper

View File

@@ -0,0 +1 @@
com.hypherionmc.craterlib.common.FabricLoaderHelper

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

View File

@@ -0,0 +1,17 @@
{
"required": true,
"minVersion": "0.8",
"package": "com.hypherionmc.craterlib.mixin",
"compatibilityLevel": "JAVA_17",
"mixins": [
],
"client": [
"TutorialMixin"
],
"server": [
"ServerGamePacketListenerImplMixin"
],
"injectors": {
"defaultRequire": 1
}
}

View File

@@ -0,0 +1,39 @@
{
"schemaVersion": 1,
"id": "${mod_id}",
"version": "${version}",
"name": "${mod_name}",
"description": "A library mod used by First Dark Development and HypherionSA Mods",
"authors": [
"${mod_author}",
"Misha"
],
"contact": {
"homepage": "https://modrinth.com/mod/craterlib",
"sources": "https://github.com/firstdarkdev/craterLib/"
},
"license": "MIT",
"icon": "assets/craterlib/craterlib_logo.png",
"environment": "*",
"entrypoints": {
"main": [
"com.hypherionmc.craterlib.CraterLibInitializer"
],
"client": [
"com.hypherionmc.craterlib.client.CraterLibClientInitializer"
],
"modmenu": [
"com.hypherionmc.craterlib.CraterLibModMenuIntegration"
]
},
"mixins": [
"${mod_id}.mixins.json",
"${mod_id}.fabric.mixins.json"
],
"depends": {
"fabricloader": ">=0.15.0",
"fabric-api": "*",
"minecraft": ">=1.19.3",
"java": ">=17"
}
}