[CustomNpc-plus]脚本相关教程[持续更新中]

365bet体育在线365 📅 2025-07-31 23:13:41 👤 admin 👁️ 7759 ❤️ 77
[CustomNpc-plus]脚本相关教程[持续更新中]

温馨提示:本教程不大适合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")

}

}复制代码

因为是第一次写这方面的东西,也不大了解多少,没什么可给的,就暂时放这几个案例吧。等有空了继续更新.

如果各位有什么绝妙的想法或者想提供自己一份力,欢迎私信或留言,感谢。

相关推荐

在Word 2019中上下移动标题
365bet体育在线365

在Word 2019中上下移动标题

📅 07-15 👁️ 5450
皇子吕布皮肤值得买吗?看完这篇深度测评再决定!
谷歌分分彩下载
365彩票手机app下载

谷歌分分彩下载

📅 07-18 👁️ 6708