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

@@ -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) {
}
}