Add NeoForge platform adapter
This commit is contained in:
@@ -0,0 +1,97 @@
|
||||
package com.livingworld.platform.neoforge;
|
||||
|
||||
import com.livingworld.platform.PlatformAdapter;
|
||||
import com.mojang.brigadier.CommandDispatcher;
|
||||
import java.nio.file.Path;
|
||||
import java.util.Objects;
|
||||
import java.util.function.Consumer;
|
||||
import java.util.function.Supplier;
|
||||
import net.minecraft.SharedConstants;
|
||||
import net.minecraft.commands.CommandSourceStack;
|
||||
import net.neoforged.api.distmarker.Dist;
|
||||
import net.neoforged.fml.ModList;
|
||||
import net.neoforged.fml.loading.FMLEnvironment;
|
||||
import net.neoforged.neoforge.common.NeoForge;
|
||||
import net.neoforged.neoforge.event.RegisterCommandsEvent;
|
||||
import net.neoforged.neoforge.event.tick.ServerTickEvent;
|
||||
|
||||
/**
|
||||
* NeoForge implementation of the Living World platform boundary.
|
||||
*/
|
||||
public final class NeoForgePlatformAdapter implements PlatformAdapter {
|
||||
|
||||
private static final String NEOFORGE_MOD_ID = "neoforge";
|
||||
|
||||
private final Supplier<Path> worldSaveDirectory;
|
||||
private final Consumer<CommandDispatcher<CommandSourceStack>> commandRegistrar;
|
||||
private final Runnable serverTickHook;
|
||||
private boolean commandsRegistered;
|
||||
private boolean serverTickRegistered;
|
||||
|
||||
public NeoForgePlatformAdapter(
|
||||
Supplier<Path> worldSaveDirectory,
|
||||
Consumer<CommandDispatcher<CommandSourceStack>> commandRegistrar,
|
||||
Runnable serverTickHook) {
|
||||
this.worldSaveDirectory =
|
||||
Objects.requireNonNull(worldSaveDirectory, "worldSaveDirectory");
|
||||
this.commandRegistrar = Objects.requireNonNull(commandRegistrar, "commandRegistrar");
|
||||
this.serverTickHook = Objects.requireNonNull(serverTickHook, "serverTickHook");
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getPlatformName() {
|
||||
return "NeoForge";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getMinecraftVersion() {
|
||||
return SharedConstants.getCurrentVersion().getName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getLoaderVersion() {
|
||||
return ModList.get()
|
||||
.getModContainerById(NEOFORGE_MOD_ID)
|
||||
.map(container -> container.getModInfo().getVersion().toString())
|
||||
.orElse("unknown");
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isDedicatedServer() {
|
||||
return FMLEnvironment.dist == Dist.DEDICATED_SERVER;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Path getWorldSaveDirectory() {
|
||||
Path path = worldSaveDirectory.get();
|
||||
if (path == null) {
|
||||
throw new IllegalStateException("world save directory is not available yet");
|
||||
}
|
||||
return path;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void registerCommands() {
|
||||
if (commandsRegistered) {
|
||||
return;
|
||||
}
|
||||
NeoForge.EVENT_BUS.addListener(RegisterCommandsEvent.class, event ->
|
||||
commandRegistrar.accept(event.getDispatcher()));
|
||||
commandsRegistered = true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void registerServerTickHook() {
|
||||
if (serverTickRegistered) {
|
||||
return;
|
||||
}
|
||||
NeoForge.EVENT_BUS.addListener(ServerTickEvent.Post.class, event ->
|
||||
serverTickHook.run());
|
||||
serverTickRegistered = true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void registerPlayerEventHooks() {
|
||||
// Player activity hooks are intentionally deferred until a module needs them.
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user