本篇教程由作者设定未经允许禁止转载。

你可能是个整合包作者,但是不希望你的玩家在你的整合包作弊,可以使用CrT来进行控制。

实现效果:

  1. 如果登入的玩家本身就是创造模式,那么可以使用任何指令(使用gamestage来辨别);

  2. 如果登入的玩家名为整合包作者名(或你想指定的玩家),那么可以使用任何指令;

  3. 如果登入的玩家是生存模式,那么无法使用任何指令(即使将作弊权限打开)。

在阅读本篇教程前,本人定义读者具有基本的ZS语言使用功能,如果不太了解,可以尝试在这里阅读其他教程。

在编写代码时,本人强烈推荐youyihj大佬的Zen Utils模组,这样可以热重载事件

对于事件应用,同样可以查看本人这个教程


第一步:导包

import crafttweaker.events.IEventManager;

import crafttweaker.event.CommandEvent;
import crafttweaker.event.PlayerLoggedInEvent;
import crafttweaker.event.PlayerLoggedOutEvent;
import crafttweaker.player.IPlayer;
import crafttweaker.command.ICommand;


第二步:判断登入时玩家是否为创造模式

events.onPlayerLoggedIn(function(event as PlayerLoggedInEvent){  //玩家登入事件
    var player as IPlayer = event.player;  //建立IPlayer对象,用变量player存储
    if(player.creative){  //玩家是否为创造模式
        server.commandManager.executeCommand(server,"/gamestage add "+player.name+" creative");  //给玩家游戏阶段
    }
});


第三步:玩家可使用指令的权限及禁用玩家指令

events.onCommand(function(event as CommandEvent){  //使用指令的事件
    if(event.commandSender instanceof IPlayer){  //不然报错[注1]
        var player as IPlayer = event.commandSender;  //建立IPlayer对象
        if(player.hasGameStage("creative") || player.name == "Biggest_Xuan"){  //判断玩家是否有游戏阶段或整合包作者
            return ;  //直接return结束判断
        }
        if(!event.commandSender.world.remote){  //如果该指令如果不是服务端发出的
            event.cancel();  //取消事件
            player.sendRichTextMessage(format.red("请不要使用"+event.command.name+"命令"));  //对玩家给予提示
    }}
});


注1:

如果不使用instanceof进行判断是否为对应的实例类型时,将会报

java.lang.IncompatibleClassChangeError: Class crafttweaker.mc1120.command.MCCommandSender does not implement 

the requested interface crafttweaker.api.player.IPlayer

所以请务必加上对应的判断!