[CustomNpc-plus]脚本相关教程[持续更新中]
![[CustomNpc-plus]脚本相关教程[持续更新中]](/0.jpg)
温馨提示:本教程不大适合0基础的新人食用,还望在此之前观看一下灰佬的真·神级教学,链接如下:
https://www.mcbbs.net/forum.php?mod=viewthread&tid=816677
众所周知,1.7.10版本已经十分古老,大部分mod和插件都停止更新,包括cnpc
而KAMKEEL站了出来,将一些高版本的物品和功能移植到了1.7的npc上,称为:CustomNpc-plus(或者说cnpc+?)
然而遗憾的是,在当年有众多大佬活跃的时代,我们可以随手获得已被汉化的api,各种不易发现的用法,而现在大多数已经沉寂,只能靠自己。
如出一辙的是npc-plus的api也没有搜索功能
所以我觉得确实应该有人花一些时间做一些事了,哪怕这个人很拉((
————————————————————————————手动分割————————————————————————————————————————
闲话少说,我们进入正题。
首先,我们需要获取npc-plus的mod文件,在pcl2上可以直接下载,也可以去github或curseforge上下载,链接如下:
curseforge:https://www.curseforge.com/minecraft/mc-mods/customnpc-plusgithub:https://github.com/KAMKEEL/CustomNPC-Plus下载好了以后,别忘了我们还是要装nashorn.不想自己下的话,我已经将需要的东西都打包好了,蓝奏云链接如下:
https://wwlz.lanzoue.com/iOScZ0y4wxkj
密码:dhwo
做完准备工作之后就可以开始正文了。
首先是一系列道具变动
传送魔杖现在跟1.12一样,左键可以传送到所指方块的地点
脚本物品移植过来了,脚本方块和脚本门没有。
灵魂石也跟1.12一样,可以储存普通的生物了。
脚本魔杖现在空右键可以打开跟1.12的一样的界面,不过多了一个All npcs,默认关闭,需要在mod配置里开启,我没用过
脚本魔杖右键npc开启的界面可以由1.7之前的界面和在右上角的event 事件界面自主切换。
需要注意的一些点:部分事件1.7和1.12的命名不同,例如:kills和died.
且某些事件在高版本可以取消,1.7不可以,如:players里的chat事件
然后就是我个人认为比较重要的,在此之前警示一下各位:不要乱套脚本!不要无脑复制粘贴!
随时都可能会导致你的游戏崩溃且难以寻找原因。
原来的'noppes.npcs.scripted.ScriptPlayer'变为'noppes.npcs.scripted.entity.ScriptPlayer'
可以在1.7界面或事件界面直接输入'API'使用api的方法(在我附带的文件里有离线api网页,可以直接看)
且不需要在'API'前面加任何东西
forge脚本可以正常使用。
npc也算ScriptPlayer且含有一定特殊性,所以如果你使用不当,在监听ServerChat时你会发现npc也能在某些情况下说话了
几个实例
/
@author Hueihuea
二改 Honggzn
/
//运行即可
function Command(name,usage){
this.getCommandName=function(){
/String getCommandName()
应返回指令的名字
如:/noppes 则返回noppes
/
};
this.getCommandUsage=function(sender){
/String getCommandUsage(ICommandSender sender)
应返回指令的用法
当玩家输入"/help 你的指令名" 的时候就会出现
sender:指令发送者 可能是玩家 控制台 命令方块 或者其他什么
/
};
this.processCommand=function(sender,args){
/void processCommand(ICommandSender sender, String[] args)
在玩家使用该指令时会调用本函数
sender:指令发送者 可能是玩家 控制台 命令方块 或者其他什么
args:指令的参数
/
};
this.addTabCompletionOptions=function(sender,args){
return null;
/List addTabCompletionOptions(ICommandSender sender, String[] args)
用于tab自动补全
应返回补全后的参数
sender:指令发送者 可能是玩家 控制台 命令方块 或者其他什么
args:指令的参数
/
};
this.getRequiredPermissionLevel=function(){
return 4;
/int getRequiredPermissionLevel
指令所需的权限 0表示所有人可用 4表示OP可用
应返回权限等级
/
}
//上方函数以1.7.10的方法为准
//1.12.2修改函数时补全参数后通用。
this.getMCCommand=function(){
var CommandBase=Java.type("net.minecraft.command.CommandBase");
var MCCommand=Java.extend(CommandBase,{
func_71517_b:this.getCommandName,
func_71518_a:this.getCommandUsage,
func_71515_b:this.processCommand,
func_71516_a:this.addTabCompletionOptions,
func_82362_a:this.getRequiredPermissionLevel,
/下方是对1.12.2的兼容/
func_184881_a:this.processCommand,
func_184883_a:this.addTabCompletionOptions
});
return new MCCommand();
}
}
function registerCommand(command){
var MinecraftServer=Java.type("net.minecraft.server.MinecraftServer");
var server=MinecraftServer.func_71276_C();
if(!(command instanceof Command)){
return;
}
server.func_71187_D().func_71560_a(command.getMCCommand())
}
var EntityPlayerMP=Java.type("net.minecraft.entity.player.EntityPlayerMP");
var command=new Command();
command.getCommandName=function(){
return "test";
}
command.getCommandUsage=function(sender){
return "/test";
}
command.processCommand=function(sender,args){
var ScriptPlayer=Java.type("noppes.npcs.scripted.entity.ScriptPlayer");
if(!(sender instanceof EntityPlayerMP)){
return;
}
/若输入指令非玩家则直接终止*/
var player=new ScriptPlayer(sender);
player.sendMessage("good");
return;
}
registerCommand(command);
var ScriptPlayer = Java.type("noppes.npcs.scripted.entity.ScriptPlayer")
function Listener(eventType, listener, bus) {
var MinecraftForge = Java.type("net.minecraftforge.common.MinecraftForge");
this.eventType = eventType;
this.listener = listener;
this.bus = (bus == null) ? MinecraftForge.EVENT_BUS : bus;
this.getEventType = function () {
return this.eventType;
}
this.getListener = function () {
return this.listener;
}
this.getBus = function () {
return this.bus;
}
}
function listenEvent(eventType, priority, listener, bus) {
var Event = Java.type(eventType);
try {
var IEventListener = Java.type("net.minecraftforge.fml.common.eventhandler.IEventListener");
var EventPriority = Java.type("net.minecraftforge.fml.common.eventhandler.EventPriority");
} catch (err) {
var IEventListener = Java.type("cpw.mods.fml.common.eventhandler.IEventListener");
var EventPriority = Java.type("cpw.mods.fml.common.eventhandler.EventPriority");
}
var MinecraftForge = Java.type("net.minecraftforge.common.MinecraftForge");
var event = new Event();
if (priority == "LOW") {
priority = EventPriority.LOW;
}
if (priority == "HIGH") {
priority = EventPriority.HIGH;
}
if (priority == "NORMAL") {
priority = EventPriority.NORMAL;
}
if (priority == "LOWEST") {
priority = EventPriority.LOWEST;
}
if (priority == "HIGHEST") {
priority = EventPriority.HIGHEST;
}
var EventListener = Java.extend(IEventListener, {
invoke: listener
});
listener = new EventListener();
var bus = (bus == null) ? MinecraftForge.EVENT_BUS : bus;
var busID = bus.class.getDeclaredField("busID");
busID.setAccessible(true);
busID = busID.getInt(bus);
event.getListenerList().register(busID, priority, listener);
return new Listener(eventType, listener, bus);
}
function unListenEvent(eventType, listener, bus) {
var Event = Java.type(eventType);
var MinecraftForge = Java.type("net.minecraftforge.common.MinecraftForge");
var event = new Event();
var bus = (bus == null) ? MinecraftForge.EVENT_BUS : bus;
var busID = bus.class.getDeclaredField("busID");
busID.setAccessible(true);
busID = busID.getInt(bus);
event.getListenerList().unregister(busID, listener);
}
function init(e){
listenEvent("net.minecraftforge.event.ServerChatEvent","HIGH",function(event){
print("6")
}
}复制代码
因为是第一次写这方面的东西,也不大了解多少,没什么可给的,就暂时放这几个案例吧。等有空了继续更新.
如果各位有什么绝妙的想法或者想提供自己一份力,欢迎私信或留言,感谢。