Working Neoforge support

Yay!
This commit is contained in:
Martin Prokoph
2024-07-18 14:28:30 +02:00
parent 0d2bd6e4cb
commit da467619cb
11 changed files with 233 additions and 56 deletions

View File

@@ -21,10 +21,12 @@ import eu.midnightdust.midnightcontrols.client.controller.Controller;
import eu.midnightdust.midnightcontrols.client.controller.InputManager;
import eu.midnightdust.midnightcontrols.client.gui.MidnightControlsHud;
import eu.midnightdust.midnightcontrols.client.gui.RingScreen;
import eu.midnightdust.midnightcontrols.client.gui.TouchscreenOverlay;
import eu.midnightdust.midnightcontrols.client.mixin.KeyBindingIDAccessor;
import eu.midnightdust.midnightcontrols.client.ring.ButtonBindingRingAction;
import eu.midnightdust.midnightcontrols.client.ring.MidnightRing;
import eu.midnightdust.midnightcontrols.client.util.platform.NetworkUtil;
import net.minecraft.client.gui.screen.Screen;
import org.thinkingstudio.obsidianui.hud.HudManager;
import eu.midnightdust.midnightcontrols.client.touch.TouchInput;
import eu.midnightdust.midnightcontrols.client.util.RainbowColor;
@@ -166,6 +168,7 @@ public class MidnightControlsClient extends MidnightControls {
public static void onTick(@NotNull MinecraftClient client) {
initKeybindings();
input.tick(client);
reacharound.tick(client);
if (MidnightControlsConfig.controlsMode == ControlsMode.CONTROLLER && (client.isWindowFocused() || MidnightControlsConfig.unfocusedInput))
input.tickController(client);
@@ -183,6 +186,19 @@ public class MidnightControlsClient extends MidnightControls {
RainbowColor.tick();
TouchInput.tick();
}
/**
* Called when opening a screen.
*/
public static void onScreenOpen(Screen screen) {
if (screen == null && MidnightControlsConfig.controlsMode == ControlsMode.TOUCHSCREEN) {
screen = new TouchscreenOverlay();
screen.init(client, client.getWindow().getScaledWidth(), client.getWindow().getScaledHeight());
client.skipGameRender = false;
client.currentScreen = screen;
} else if (screen != null) {
MidnightControlsClient.input.onScreenOpen(client, client.getWindow().getWidth(), client.getWindow().getHeight());
}
}
/**
* Called when leaving a server.

View File

@@ -10,6 +10,7 @@
package eu.midnightdust.midnightcontrols.client;
import com.google.common.collect.ImmutableSet;
import eu.midnightdust.lib.util.PlatformFunctions;
import eu.midnightdust.midnightcontrols.client.util.storage.AxisStorage;
import net.minecraft.entity.vehicle.BoatEntity;
import net.minecraft.util.Pair;
@@ -35,7 +36,6 @@ import org.thinkingstudio.obsidianui.widget.SpruceElement;
import org.thinkingstudio.obsidianui.widget.SpruceLabelWidget;
import org.thinkingstudio.obsidianui.widget.container.SpruceParentWidget;
import eu.midnightdust.midnightcontrols.client.enums.ButtonState;
import net.fabricmc.loader.api.FabricLoader;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.Element;
import net.minecraft.client.gui.ParentElement;
@@ -376,7 +376,7 @@ public class MidnightInput {
return;
}
}
else if (FabricLoader.getInstance().isModLoaded("libgui")) LibGuiCompat.handlePress(client.currentScreen);
else if (PlatformFunctions.isModLoaded("libgui")) LibGuiCompat.handlePress(client.currentScreen);
}
}
}
@@ -697,7 +697,7 @@ public class MidnightInput {
var childFocused = widget.getFocused();
if (childFocused != null)
return this.handleAButton(screen, childFocused);
} else if (FabricLoader.getInstance().isModLoaded("yet-another-config-lib") && YACLCompat.handleAButton(screen, focused)) {
} else if (PlatformFunctions.isModLoaded("yet-another-config-lib") && YACLCompat.handleAButton(screen, focused)) {
return true;
}
else pressKeyboardKey(screen, GLFW_KEY_ENTER);
@@ -716,7 +716,7 @@ public class MidnightInput {
this.actionGuiCooldown = 5;
return false;
}
if (FabricLoader.getInstance().isModLoaded("yet-another-config-lib") && YACLCompat.handleLeftRight(screen, right)) {
if (PlatformFunctions.isModLoaded("yet-another-config-lib") && YACLCompat.handleLeftRight(screen, right)) {
this.actionGuiCooldown = 5;
return false;
}

View File

@@ -4,6 +4,7 @@ import dev.architectury.injectables.annotations.ExpectPlatform;
import eu.midnightdust.midnightcontrols.client.mixin.CreativeInventoryScreenAccessor;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.screen.ingame.CreativeInventoryScreen;
import net.minecraft.client.gui.widget.PressableWidget;
import net.minecraft.item.ItemGroup;
import net.minecraft.item.ItemGroups;
import org.jetbrains.annotations.NotNull;
@@ -15,9 +16,24 @@ public class ItemGroupUtil {
public static List<ItemGroup> getVisibleGroups(CreativeInventoryScreen screen) {
throw new AssertionError();
}
@ExpectPlatform
public static boolean cyclePage(boolean next, CreativeInventoryScreen screen) {
throw new AssertionError();
try {
return screen.children().stream().filter(element -> element instanceof PressableWidget)
.map(element -> (PressableWidget) element)
.filter(element -> element.getMessage() != null && element.getMessage().getContent() != null)
.anyMatch(element -> {
if (next && element.getMessage().getString().equals(">")) {
element.onPress();
return true;
} else if (element.getMessage().getString().equals("<")) {
element.onPress();
return true;
}
return false;
});
} catch (Exception ignored) {}
return false;
}
public static @NotNull ItemGroup cycleTab(boolean next, MinecraftClient client) {

View File

@@ -1,7 +1,6 @@
package eu.midnightdust.midnightcontrols.client.util.platform.fabric;
import net.minecraft.client.gui.screen.ingame.CreativeInventoryScreen;
import net.minecraft.client.gui.widget.PressableWidget;
import net.minecraft.item.ItemGroup;
import java.util.List;
@@ -14,22 +13,4 @@ public class ItemGroupUtilImpl {
public static List<ItemGroup> getVisibleGroups(CreativeInventoryScreen screen) {
return (screen.getItemGroupsOnPage(screen.getCurrentPage()));
}
public static boolean cyclePage(boolean next, CreativeInventoryScreen screen) {
try {
return screen.children().stream().filter(element -> element instanceof PressableWidget)
.map(element -> (PressableWidget) element)
.filter(element -> element.getMessage() != null && element.getMessage().getContent() != null)
.anyMatch(element -> {
if (next && element.getMessage().getString().equals(">")) {
element.onPress();
return true;
} else if (element.getMessage().getString().equals("<")) {
element.onPress();
return true;
}
return false;
});
} catch (Exception ignored) {}
return false;
}
}

View File

@@ -52,18 +52,10 @@ public class MidnightControlsClientFabric implements ClientModInitializer {
});
ClientPlayConnectionEvents.DISCONNECT.register((handler, client) -> MidnightControlsClient.onLeave());
ClientTickEvents.START_CLIENT_TICK.register(MidnightControlsClient.reacharound::tick);
ClientTickEvents.START_CLIENT_TICK.register(MidnightControlsClient::onTick);
OpenScreenCallback.POST.register((client, screen) -> {
if (screen == null && MidnightControlsConfig.controlsMode == ControlsMode.TOUCHSCREEN) {
screen = new TouchscreenOverlay();
screen.init(client, client.getWindow().getScaledWidth(), client.getWindow().getScaledHeight());
client.skipGameRender = false;
client.currentScreen = screen;
} else if (screen != null) {
MidnightControlsClient.input.onScreenOpen(client, client.getWindow().getWidth(), client.getWindow().getHeight());
}
MidnightControlsClient.onScreenOpen(screen);
});
FabricLoader.getInstance().getModContainer(MidnightControlsConstants.NAMESPACE).ifPresent(modContainer -> {
ResourceManagerHelper.registerBuiltinResourcePack(id("bedrock"), modContainer, ResourcePackActivationType.NORMAL);

View File

@@ -0,0 +1,16 @@
package eu.midnightdust.midnightcontrols.client.util.platform.neoforge;
import net.minecraft.client.gui.screen.ingame.CreativeInventoryScreen;
import net.minecraft.item.ItemGroup;
import java.util.List;
/**
* Implementation of neoforge methods for
* @see eu.midnightdust.midnightcontrols.client.util.platform.ItemGroupUtil
*/
public class ItemGroupUtilImpl {
public static List<ItemGroup> getVisibleGroups(CreativeInventoryScreen screen) {
return (screen.getCurrentPage().getVisibleTabs());
}
}

View File

@@ -0,0 +1,25 @@
package eu.midnightdust.midnightcontrols.client.util.platform.neoforge;
import net.minecraft.client.network.ClientPlayNetworkHandler;
import net.minecraft.network.packet.CustomPayload;
import net.minecraft.network.packet.Packet;
import net.minecraft.network.packet.c2s.common.CustomPayloadC2SPacket;
import static eu.midnightdust.midnightcontrols.client.MidnightControlsClient.client;
/**
* Implementation of neoforge methods for
* @see eu.midnightdust.midnightcontrols.client.util.platform.NetworkUtil
*/
public class NetworkUtilImpl {
private static final ClientPlayNetworkHandler handler = client.getNetworkHandler();
public static void sendPacketC2S(Packet<?> packet) {
if (handler != null)
handler.send(packet);
}
public static void sendPayloadC2S(CustomPayload payload) {
if (handler != null && client.world != null)
handler.send(new CustomPayloadC2SPacket(payload));
}
}

View File

@@ -0,0 +1,99 @@
package eu.midnightdust.midnightcontrols.neoforge;
import eu.midnightdust.midnightcontrols.client.MidnightControlsClient;
import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig;
import eu.midnightdust.midnightcontrols.client.util.platform.NetworkUtil;
import eu.midnightdust.midnightcontrols.packet.ControlsModePayload;
import eu.midnightdust.midnightcontrols.packet.HelloPayload;
import net.minecraft.resource.DirectoryResourcePack;
import net.minecraft.resource.ResourcePackInfo;
import net.minecraft.resource.ResourcePackPosition;
import net.minecraft.resource.ResourcePackProfile;
import net.minecraft.resource.ResourcePackSource;
import net.minecraft.resource.ResourceType;
import net.minecraft.text.Text;
import net.minecraft.util.Identifier;
import net.neoforged.api.distmarker.Dist;
import net.neoforged.bus.api.SubscribeEvent;
import net.neoforged.fml.ModList;
import net.neoforged.fml.common.EventBusSubscriber;
import net.neoforged.fml.common.Mod;
import net.neoforged.neoforge.client.event.ClientPlayerNetworkEvent;
import net.neoforged.neoforge.client.event.ClientTickEvent;
import net.neoforged.neoforge.client.event.RegisterKeyMappingsEvent;
import net.neoforged.neoforge.client.event.ScreenEvent;
import net.neoforged.neoforge.event.AddPackFindersEvent;
import net.neoforged.neoforgespi.locating.IModFile;
import java.util.Optional;
import static eu.midnightdust.midnightcontrols.MidnightControls.id;
import static eu.midnightdust.midnightcontrols.MidnightControlsConstants.NAMESPACE;
import static eu.midnightdust.midnightcontrols.client.MidnightControlsClient.BINDING_LOOK_DOWN;
import static eu.midnightdust.midnightcontrols.client.MidnightControlsClient.BINDING_LOOK_LEFT;
import static eu.midnightdust.midnightcontrols.client.MidnightControlsClient.BINDING_LOOK_RIGHT;
import static eu.midnightdust.midnightcontrols.client.MidnightControlsClient.BINDING_LOOK_UP;
import static eu.midnightdust.midnightcontrols.client.MidnightControlsClient.BINDING_RING;
import static eu.midnightdust.midnightcontrols.client.MidnightControlsClient.client;
@Mod(value = NAMESPACE, dist = Dist.CLIENT)
public class MidnightControlsClientNeoforge {
public MidnightControlsClientNeoforge() {
MidnightControlsClient.initClient();
}
@EventBusSubscriber(modid = NAMESPACE, bus = EventBusSubscriber.Bus.MOD, value = Dist.CLIENT)
public class ClientEvents {
@SubscribeEvent
public static void registerKeybinding(RegisterKeyMappingsEvent event) {
event.register(BINDING_RING);
event.register(BINDING_LOOK_UP);
event.register(BINDING_LOOK_DOWN);
event.register(BINDING_LOOK_LEFT);
event.register(BINDING_LOOK_RIGHT);
}
@SubscribeEvent
public static void addPackFinders(AddPackFindersEvent event) {
if (event.getPackType() == ResourceType.CLIENT_RESOURCES) {
registerResourcePack(event, id("bedrock"), false);
registerResourcePack(event, id("legacy"), false);
}
}
private static void registerResourcePack(AddPackFindersEvent event, Identifier id, boolean alwaysEnabled) {
event.addRepositorySource(((profileAdder) -> {
IModFile file = ModList.get().getModFileById(id.getNamespace()).getFile();
try {
ResourcePackProfile.PackFactory pack = new DirectoryResourcePack.DirectoryBackedFactory(file.findResource("resourcepacks/" + id.getPath()));
ResourcePackInfo info = new ResourcePackInfo(id.toString(), Text.of(id.getNamespace()+"/"+id.getPath()), ResourcePackSource.BUILTIN, Optional.empty());
ResourcePackProfile packProfile = ResourcePackProfile.create(info, pack, ResourceType.CLIENT_RESOURCES, new ResourcePackPosition(alwaysEnabled, ResourcePackProfile.InsertionPosition.TOP, false));
if (packProfile != null) {
profileAdder.accept(packProfile);
}
} catch (NullPointerException e) {e.fillInStackTrace();}
}));
}
}
@EventBusSubscriber(modid = NAMESPACE, bus = EventBusSubscriber.Bus.GAME, value = Dist.CLIENT)
public class ClientGameEvents {
@SubscribeEvent
public static void sendPacketOnLogin(ClientPlayerNetworkEvent.LoggingIn event) {
var version = ModList.get().getModFileById(NAMESPACE).versionString();
var controlsMode = MidnightControlsConfig.controlsMode.getName();
NetworkUtil.sendPayloadC2S(new HelloPayload(version, controlsMode));
NetworkUtil.sendPayloadC2S(new ControlsModePayload(controlsMode));
}
@SubscribeEvent
public static void onDisconnect(ClientPlayerNetworkEvent.LoggingOut event) {
MidnightControlsClient.onLeave();
}
@SubscribeEvent
public static void startClientTick(ClientTickEvent.Pre event) {
MidnightControlsClient.onTick(client);
}
@SubscribeEvent
public static void onScreenOpen(ScreenEvent.Opening event) {
MidnightControlsClient.onScreenOpen(event.getNewScreen());
}
}
}

View File

@@ -1,22 +0,0 @@
package eu.midnightdust.midnightcontrols.neoforge;
import eu.midnightdust.midnightcontrols.MidnightControls;
import eu.midnightdust.midnightcontrols.client.MidnightControlsClient;
import net.neoforged.api.distmarker.Dist;
import net.neoforged.fml.common.Mod;
import static eu.midnightdust.midnightcontrols.MidnightControlsConstants.NAMESPACE;
@Mod(value = NAMESPACE)
public class MidnightControlsNeoForge {
public MidnightControlsNeoForge() {
MidnightControls.init();
}
@Mod(value = NAMESPACE, dist = Dist.CLIENT)
public static class YourModClientNeoforge {
public YourModClientNeoforge() {
MidnightControlsClient.initClient();
}
}
}

View File

@@ -0,0 +1,42 @@
package eu.midnightdust.midnightcontrols.neoforge;
import eu.midnightdust.midnightcontrols.ControlsMode;
import eu.midnightdust.midnightcontrols.MidnightControls;
import eu.midnightdust.midnightcontrols.MidnightControlsFeature;
import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig;
import eu.midnightdust.midnightcontrols.neoforge.event.PlayerChangeControlsModeEvent;
import eu.midnightdust.midnightcontrols.packet.ControlsModePayload;
import eu.midnightdust.midnightcontrols.packet.FeaturePayload;
import eu.midnightdust.midnightcontrols.packet.HelloPayload;
import net.minecraft.network.packet.c2s.common.CustomPayloadC2SPacket;
import net.minecraft.network.packet.s2c.common.CustomPayloadS2CPacket;
import net.neoforged.bus.api.SubscribeEvent;
import net.neoforged.fml.common.EventBusSubscriber;
import net.neoforged.fml.common.Mod;
import net.neoforged.neoforge.network.event.RegisterPayloadHandlersEvent;
import net.neoforged.neoforge.network.registration.PayloadRegistrar;
import static eu.midnightdust.midnightcontrols.MidnightControlsConstants.NAMESPACE;
@Mod(value = NAMESPACE)
public class MidnightControlsNeoforge {
public MidnightControlsNeoforge() {
MidnightControls.init();
}
@EventBusSubscriber(modid = NAMESPACE, bus = EventBusSubscriber.Bus.MOD)
public class CommonEvents {
@SubscribeEvent
public static void registerPayloads(RegisterPayloadHandlersEvent event) {
PayloadRegistrar registrar = event.registrar("1");
registrar.playToServer(HelloPayload.PACKET_ID, HelloPayload.codec, (payload, context) -> {
ControlsMode.byId(payload.controlsMode()).ifPresent(controlsMode -> new PlayerChangeControlsModeEvent(context.player(), controlsMode));
context.connection().send(new CustomPayloadS2CPacket(new FeaturePayload(MidnightControlsFeature.HORIZONTAL_REACHAROUND)));
});
registrar.playBidirectional(ControlsModePayload.PACKET_ID, ControlsModePayload.codec, (payload, context) -> {
if (context.flow().isServerbound()) ControlsMode.byId(payload.controlsMode()).ifPresent(controlsMode -> new PlayerChangeControlsModeEvent(context.player(), controlsMode));
else context.connection().send(new CustomPayloadC2SPacket(new ControlsModePayload(MidnightControlsConfig.controlsMode.getName())));
});
registrar.playToClient(FeaturePayload.PACKET_ID, FeaturePayload.codec, (payload, context) -> {});
}
}
}

View File

@@ -0,0 +1,12 @@
package eu.midnightdust.midnightcontrols.neoforge.event;
import eu.midnightdust.midnightcontrols.ControlsMode;
import net.minecraft.entity.player.PlayerEntity;
import net.neoforged.bus.api.Event;
import net.neoforged.fml.event.IModBusEvent;
public class PlayerChangeControlsModeEvent extends Event implements IModBusEvent {
public PlayerChangeControlsModeEvent(PlayerEntity player, ControlsMode controlsMode) {
}
}