本篇教程由作者设定未经允许禁止转载。
你可能是个整合包作者,但是不希望你的玩家在你的整合包作弊,可以使用CrT来进行控制。
实现效果:
如果登入的玩家本身就是创造模式,那么可以使用任何指令(使用gamestage来辨别);
如果登入的玩家名为整合包作者名(或你想指定的玩家),那么可以使用任何指令;
如果登入的玩家是生存模式,那么无法使用任何指令(即使将作弊权限打开)。
在阅读本篇教程前,本人定义读者具有基本的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
所以请务必加上对应的判断!