Neoforge support

This commit is contained in:
Martin Prokoph
2024-06-20 23:14:29 +02:00
parent 64dfcd8a87
commit ce1bc60a87
12 changed files with 130 additions and 15 deletions

View File

@@ -2,6 +2,7 @@ package eu.midnightdust.picturesign;
import eu.midnightdust.lib.util.PlatformFunctions; import eu.midnightdust.lib.util.PlatformFunctions;
import eu.midnightdust.picturesign.config.PictureSignConfig; import eu.midnightdust.picturesign.config.PictureSignConfig;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.option.KeyBinding; import net.minecraft.client.option.KeyBinding;
import net.minecraft.client.util.InputUtil; import net.minecraft.client.util.InputUtil;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
@@ -11,9 +12,10 @@ import org.lwjgl.glfw.GLFW;
public class PictureSignClient { public class PictureSignClient {
public static Logger LOGGER = LogManager.getLogger("PictureSign"); public static Logger LOGGER = LogManager.getLogger("PictureSign");
public static String MOD_ID = "picturesign"; public static final String MOD_ID = "picturesign";
public static final boolean hasWaterMedia = PlatformFunctions.isModLoaded("watermedia"); public static final boolean hasWaterMedia = PlatformFunctions.isModLoaded("watermedia");
public static String[] clipboard = new String[4]; public static String[] clipboard = new String[4];
public static final MinecraftClient client = MinecraftClient.getInstance();
public static final KeyBinding BINDING_COPY_SIGN = new KeyBinding("key."+MOD_ID+".copy_sign", public static final KeyBinding BINDING_COPY_SIGN = new KeyBinding("key."+MOD_ID+".copy_sign",
InputUtil.Type.KEYSYM, GLFW.GLFW_KEY_U, "key.categories."+MOD_ID); InputUtil.Type.KEYSYM, GLFW.GLFW_KEY_U, "key.categories."+MOD_ID);

View File

@@ -17,7 +17,6 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(HangingSignBlockEntityRenderer.class) @Mixin(HangingSignBlockEntityRenderer.class)
public abstract class MixinHangingSignBlockEntityRenderer implements BlockEntityRenderer<SignBlockEntity> { public abstract class MixinHangingSignBlockEntityRenderer implements BlockEntityRenderer<SignBlockEntity> {
@Unique private static final MinecraftClient client = MinecraftClient.getInstance();
@Unique PictureSignRenderer psRenderer = new PictureSignRenderer(); @Unique PictureSignRenderer psRenderer = new PictureSignRenderer();
@Inject(at = @At("HEAD"), method = "render") @Inject(at = @At("HEAD"), method = "render")

View File

@@ -4,7 +4,6 @@ import eu.midnightdust.picturesign.config.PictureSignConfig;
import eu.midnightdust.picturesign.render.PictureSignRenderer; import eu.midnightdust.picturesign.render.PictureSignRenderer;
import eu.midnightdust.picturesign.util.PictureSignType; import eu.midnightdust.picturesign.util.PictureSignType;
import net.minecraft.block.entity.SignBlockEntity; import net.minecraft.block.entity.SignBlockEntity;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.render.*; import net.minecraft.client.render.*;
import net.minecraft.client.render.block.entity.BlockEntityRenderer; import net.minecraft.client.render.block.entity.BlockEntityRenderer;
import net.minecraft.client.render.block.entity.BlockEntityRendererFactory; import net.minecraft.client.render.block.entity.BlockEntityRendererFactory;
@@ -18,9 +17,10 @@ import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import static eu.midnightdust.picturesign.PictureSignClient.client;
@Mixin(SignBlockEntityRenderer.class) @Mixin(SignBlockEntityRenderer.class)
public abstract class MixinSignBlockEntityRenderer implements BlockEntityRenderer<SignBlockEntity> { public abstract class MixinSignBlockEntityRenderer implements BlockEntityRenderer<SignBlockEntity> {
@Unique private static final MinecraftClient client = MinecraftClient.getInstance();
@Unique private PictureSignRenderer psRenderer; @Unique private PictureSignRenderer psRenderer;
@Inject(at = @At("TAIL"), method = "<init>") @Inject(at = @At("TAIL"), method = "<init>")

View File

@@ -2,6 +2,7 @@ package eu.midnightdust.picturesign.screen;
import eu.midnightdust.picturesign.PictureSignClient; import eu.midnightdust.picturesign.PictureSignClient;
import eu.midnightdust.picturesign.config.PictureSignConfig; import eu.midnightdust.picturesign.config.PictureSignConfig;
import eu.midnightdust.picturesign.util.NetworkUtil;
import eu.midnightdust.picturesign.util.PictureSignType; import eu.midnightdust.picturesign.util.PictureSignType;
import eu.midnightdust.picturesign.util.PictureURLUtils; import eu.midnightdust.picturesign.util.PictureURLUtils;
import net.minecraft.block.*; import net.minecraft.block.*;
@@ -229,14 +230,11 @@ public class PictureSignHelperScreen extends Screen {
} }
public void removed() { public void removed() {
if (this.client == null || switchScreen) return; if (this.client == null || switchScreen) return;
ClientPlayNetworkHandler clientPlayNetworkHandler = this.client.getNetworkHandler();
for (int i = 0; i < 4; i++) { for (int i = 0; i < 4; i++) {
int finalI = i; int finalI = i;
sign.changeText(changer -> changer.withMessage(finalI, Text.of(text[finalI])), front); sign.changeText(changer -> changer.withMessage(finalI, Text.of(text[finalI])), front);
} }
if (clientPlayNetworkHandler != null) { NetworkUtil.sendPacket(new UpdateSignC2SPacket(this.sign.getPos(), front, this.text[0], this.text[1], this.text[2], this.text[3]));
clientPlayNetworkHandler.sendPacket(new UpdateSignC2SPacket(this.sign.getPos(), front, this.text[0], this.text[1], this.text[2], this.text[3]));
}
} }
private String[] breakLink(String prefix, String link) { private String[] breakLink(String prefix, String link) {

View File

@@ -11,13 +11,14 @@ import java.net.MalformedURLException;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import static eu.midnightdust.picturesign.PictureSignClient.client;
public class GIFHandler { public class GIFHandler {
public static Map<Identifier, GIFHandler> gifPlayers = new HashMap<>(); public static Map<Identifier, GIFHandler> gifPlayers = new HashMap<>();
public final Identifier id; public final Identifier id;
public boolean playbackStarted; public boolean playbackStarted;
private ImageCache player; private ImageCache player;
private static final MinecraftClient client = MinecraftClient.getInstance();
private long tick = 0L; private long tick = 0L;
private GIFHandler(Identifier id) { private GIFHandler(Identifier id) {
@@ -59,7 +60,7 @@ public class GIFHandler {
} }
public int getTexture() { public int getTexture() {
return player.getRenderer().texture(tick, return player.getRenderer().texture(tick,
(MathAPI.tickToMs(GIFHandler.client.getRenderTickCounter().getTickDelta(true))), true); (MathAPI.tickToMs(client.getRenderTickCounter().getTickDelta(true))), true);
} }
public boolean isWorking() { public boolean isWorking() {
if (player != null && player.getException() != null) player.getException().fillInStackTrace(); if (player != null && player.getException() != null) player.getException().fillInStackTrace();

View File

@@ -0,0 +1,11 @@
package eu.midnightdust.picturesign.util;
import dev.architectury.injectables.annotations.ExpectPlatform;
import net.minecraft.network.packet.Packet;
public class NetworkUtil {
@ExpectPlatform
public static void sendPacket(Packet<?> packet) {
throw new AssertionError();
}
}

View File

@@ -0,0 +1,15 @@
package eu.midnightdust.picturesign.util.fabric;
import net.minecraft.client.network.ClientPlayNetworkHandler;
import net.minecraft.network.packet.Packet;
import static eu.midnightdust.picturesign.PictureSignClient.client;
public class NetworkUtilImpl {
private static final ClientPlayNetworkHandler handler = client.getNetworkHandler();
public static void sendPacket(Packet<?> packet) {
if (handler != null)
handler.sendPacket(packet);
}
}

View File

@@ -5,7 +5,7 @@ yarn_mappings=1.21+build.2
enabled_platforms=fabric,neoforge enabled_platforms=fabric,neoforge
archives_base_name=picturesign archives_base_name=picturesign
mod_version=2.0.0-beta.2 mod_version=2.0.0-pre.1
maven_group=eu.midnightdust maven_group=eu.midnightdust
release_type=release release_type=release
curseforge_id=432008 curseforge_id=432008

View File

@@ -0,0 +1,17 @@
package eu.midnightdust.picturesign.neoforge;
import net.neoforged.api.distmarker.Dist;
import net.neoforged.bus.api.SubscribeEvent;
import net.neoforged.fml.common.EventBusSubscriber;
import net.neoforged.neoforge.client.event.RegisterKeyMappingsEvent;
import static eu.midnightdust.picturesign.PictureSignClient.MOD_ID;
import static eu.midnightdust.picturesign.PictureSignClient.BINDING_COPY_SIGN;
@EventBusSubscriber(modid = MOD_ID, bus = EventBusSubscriber.Bus.MOD, value = Dist.CLIENT)
public class PictureSignClientEvents {
@SubscribeEvent
public static void registerKeybinding(RegisterKeyMappingsEvent event) {
event.register(BINDING_COPY_SIGN);
}
}

View File

@@ -0,0 +1,55 @@
package eu.midnightdust.picturesign.neoforge;
import eu.midnightdust.picturesign.util.GIFHandler;
import eu.midnightdust.picturesign.util.MediaHandler;
import net.minecraft.block.entity.SignBlockEntity;
import net.minecraft.util.Identifier;
import net.minecraft.util.hit.HitResult;
import net.minecraft.util.math.BlockPos;
import net.neoforged.api.distmarker.Dist;
import net.neoforged.bus.api.SubscribeEvent;
import net.neoforged.fml.common.EventBusSubscriber;
import net.neoforged.neoforge.client.event.ClientPlayerNetworkEvent;
import net.neoforged.neoforge.client.event.ClientTickEvent;
import net.neoforged.neoforge.event.level.ChunkEvent;
import static eu.midnightdust.picturesign.PictureSignClient.id;
import static eu.midnightdust.picturesign.PictureSignClient.client;
import static eu.midnightdust.picturesign.PictureSignClient.clipboard;
import static eu.midnightdust.picturesign.PictureSignClient.hasWaterMedia;
import static eu.midnightdust.picturesign.PictureSignClient.MOD_ID;
import static eu.midnightdust.picturesign.PictureSignClient.BINDING_COPY_SIGN;
@EventBusSubscriber(modid = MOD_ID, bus = EventBusSubscriber.Bus.GAME, value = Dist.CLIENT)
public class PictureSignClientGameEvents {
@SubscribeEvent()
public static void sendPacketOnLogin(ClientPlayerNetworkEvent.LoggingIn event) {
if (hasWaterMedia) MediaHandler.closeAll();
}
@SubscribeEvent
public static void onBlockEntityUnload(ChunkEvent.Unload event) {
for (BlockPos pos : event.getChunk().getBlockEntityPositions()) {
if (hasWaterMedia) {
Identifier videoId = id(pos.getX() + "_" + pos.getY() + "_" + pos.getZ() + "_f");
MediaHandler.closePlayer(videoId);
Identifier videoId2 = id(pos.getX() + "_" + pos.getY() + "_" + pos.getZ() + "_b");
MediaHandler.closePlayer(videoId2);
}
}
}
@SubscribeEvent
public static void endClientTick(ClientTickEvent.Post event) {
GIFHandler.gifPlayers.forEach(((identifier, handler) -> handler.tick()));
if (!BINDING_COPY_SIGN.isPressed()) return;
BINDING_COPY_SIGN.setPressed(false);
if (client.player == null || client.world == null || client.crosshairTarget == null || client.crosshairTarget.getType() != HitResult.Type.BLOCK) return;
if (client.crosshairTarget.getType() == HitResult.Type.BLOCK && client.world.getBlockState(BlockPos.ofFloored(client.crosshairTarget.getPos())).hasBlockEntity()) {
if (client.world.getBlockEntity(BlockPos.ofFloored(client.crosshairTarget.getPos())) instanceof SignBlockEntity sign) {
boolean front = sign.isPlayerFacingFront(client.player);
for (int i = 0; i < 4; i++) {
clipboard[i] = sign.getText(front).getMessage(i, false).getString();
}
}
}
}
}

View File

@@ -2,18 +2,20 @@ package eu.midnightdust.picturesign.neoforge;
import eu.midnightdust.picturesign.PictureSignClient; import eu.midnightdust.picturesign.PictureSignClient;
import net.minecraft.resource.ResourcePackProfile; import net.minecraft.resource.ResourcePackProfile;
import net.neoforged.neoforge.client.event.ClientTickEvent; import net.neoforged.api.distmarker.Dist;
import net.neoforged.fml.common.Mod;
import org.apache.commons.compress.utils.Lists; import org.apache.commons.compress.utils.Lists;
import java.util.List; import java.util.List;
import static eu.midnightdust.picturesign.PictureSignClient.MOD_ID;
@SuppressWarnings("all") @SuppressWarnings("all")
@Mod(value = MOD_ID, dist = Dist.CLIENT)
public class PictureSignClientNeoForge { public class PictureSignClientNeoForge {
public static List<ResourcePackProfile> defaultEnabledPacks = Lists.newArrayList(); public static List<ResourcePackProfile> defaultEnabledPacks = Lists.newArrayList();
public static void initClient() { public PictureSignClientNeoForge() {
PictureSignClient.init(); PictureSignClient.init();
} }
public static void doClientTick(ClientTickEvent.Pre event) {
}
} }

View File

@@ -0,0 +1,15 @@
package eu.midnightdust.picturesign.util.neoforge;
import net.minecraft.client.network.ClientPlayNetworkHandler;
import net.minecraft.network.packet.Packet;
import static eu.midnightdust.picturesign.PictureSignClient.client;
public class NetworkUtilImpl {
private static final ClientPlayNetworkHandler handler = client.getNetworkHandler();
public static void sendPacket(Packet<?> packet) {
if (handler != null)
handler.send(packet);
}
}