-
我的mod包含一些指令,我觉得在某些情况下玩家用不到他们,所以我提供了配置文件来开启/关闭他们。 但是,配置文件的加载是在命令注册之后的,并且我没找到如何注销这个指令的方法... 感谢回答! |
Beta Was this translation helpful? Give feedback.
Replies: 5 comments 6 replies
-
反注册指令目前来看是不可能的。 至于配置文件控制注册命令,我个人的建议是「不要尝试这么做」。这里面有一些意想不到的坑…… |
Beta Was this translation helpful? Give feedback.
-
Beta Was this translation helpful? Give feedback.
-
不行的,这个事件存在的原因是 因此才会多出来一个专门的注册命令的事件,从而正确实现 正如我一开始说的那样,「这里面有一些意想不到的坑」。我还是建议你不要这么做。 |
Beta Was this translation helpful? Give feedback.
-
233用了一个很脏的方法实现了既可以用配置控制命令,也可以使reload正常运作。 @Mod.EventBusSubscriber(modid = Main.MODID, bus = Mod.EventBusSubscriber.Bus.FORGE)
public class CommandsRegistry {
public static boolean init = false;
private static void register(CommandDispatcher<CommandSource> dispatcher) {
// Main Commands
CommandSCE.register(dispatcher);
// Teleport
if (CommandSpawn.isSpawnEnable) CommandSpawn.register(dispatcher);
if (CommandHome.isHomeEnable) CommandHome.register(dispatcher);
if (CommandBack.isBackEnable) CommandBack.register(dispatcher);
if (CommandRTP.isRTPEnable) CommandRTP.register(dispatcher);
if (CommandWarp.isWarpEnable) CommandWarp.register(dispatcher);
if (CommandTPA.isTPAEnable) CommandTPA.register(dispatcher);
// Util Commands
if (CommandFly.isFlyEnable) CommandFly.register(dispatcher);
if (CommandOpenInv.isOpenInvEnable) CommandOpenInv.register(dispatcher);
if (CommandHat.isHatEnabel) CommandHat.register(dispatcher);
if (CommandTrashcan.isTrashcanEnable) CommandTrashcan.register(dispatcher);
// Info Commands
CommandGetRegistryName.register(dispatcher);
Main.LOGGER.info("All commands registered!");
}
/**
* See https://github.com/TeamCovertDragon/Harbinger/discussions/96
* @param event FMLServerAboutToStartEvent
*/
@SubscribeEvent
public static void register(FMLServerAboutToStartEvent event) {
CommandDispatcher<CommandSource> dispatcher = event.getServer().getCommandManager().getDispatcher();
if (!init) {
register(dispatcher);
init = true;
}
}
/**
* @param event RegisterCommandsEvent
*/
@SubscribeEvent
public static void register(RegisterCommandsEvent event) {
CommandDispatcher<CommandSource> dispatcher = event.getDispatcher();
if (init) {
register(dispatcher);
}
}
@SubscribeEvent
public static void onServerStopped(FMLServerStoppedEvent event) {
init = false;
}
} |
Beta Was this translation helpful? Give feedback.
-
如果只是不想让用户使用某些指令, 直接在指令运行时根据配置值做出不同的行为可以吗? |
Beta Was this translation helpful? Give feedback.
@ScottCTD
不行的,这个事件存在的原因是
/reload
命令执行后会「刷新」命令;在原来的设计中(FMLServerStartingEvent.getCommandDispatcher
),注册的命令会因为FMLServerStartingEvent
并没有再次发布而全部失效。因此才会多出来一个专门的注册命令的事件,从而正确实现
/reload
的行为。命令只有在这里注册才能避免/reload
时被刷掉。关于这个原版命令的用途可参考中文 MinecraftWiki 上的说明。正如我一开始说的那样,「这里面有一些意想不到的坑」。我还是建议你不要这么做。
参考来源:Forge Issue Ticket #6968