本帖最后由 z25096708 于 2016-8-9 21:34 编辑 
你们吐槽我写插件百科做模组教程. 我加个UD你们没意见了吧

Minecraft插件百科出品
脚本编写(旧)
旧版的脚本编写相对来说比较容易, 因为选择一个事件, 然后写代码就行了.
我这里用1.7.10版本来演示.
编写脚本可以在NPC中或者在脚本方块中. 一般在脚本方块中写的都是循环型脚本.
拿着NPC魔杖在地面右键可以创建一个NPC. 然后拿着脚本魔杖对着NPC右键会打开脚本编写界面.

如图, 如果语言选项为空白的请去看我翻译的教程. 选择完语言后将开启设置为是. 然后这个控制台就是指示运行状态的东东了.如果用print(或者其他语言的输出方法)的输出将会在这里显示. 另外, 报错也会在这里显示, 所以可以用于DEBUG.
然后就可以去Script界面编写脚本了.

不过在这里编写脚本的话肯定是会有些麻烦的. 毕竟MC自带的编辑器不(chao)是(ji)那(bu)么(gei)的(li)给力. 我们点击设置返回刚刚的界面, 单击Open Scripts folder, 这样就会在资源管理器中打开存放脚本文件的文件夹了. 在脚本文件夹中应该会有一个以语言名称命名的文件夹. 在这个文件夹中创建一个脚本文件并在其中写入内容. 然后重启游戏. 就可以在Scripts选项里面单击Load Script然后你就可以看见你的脚本了. 注意, 后缀一定要对应相应的语言. 比如python是.py, JavaScript是.js. 选中你的脚本, 单机, 然后点 > 按钮, 即可载入. 注意, 你要选择相应的Hook然后再载入你的脚本 !

就像这样. (两个对话应该是翻译出错了. 他们估计是机翻...). 应该上面那个, 就是我选中的那个是Interact, 也就是互动. 这个事件在玩家右键NPC时触发.
我的脚本内容为
复制代码
然后执行的结果就是这样的

它很逗比地说了好几次我的名字对不对! 只要我右键一次它, 他就会跟我说我的名字一次233
来分析一下这个脚本. 在npc(ScriptNpc)参数中, 有一个方法叫复制代码
. npc指的就是跟我互动的这个逗比steve, 而它的say方法则是让NPC说一句话. 而后面括号的String message就是要说的话. 当然他还有另外一个方式:复制代码
. 这个方法要求传入一个ScriptPlayer类型的参数. 而事件调用时的传参传入的就是一个ScriptPlayer类型的player. 这样就可以指定玩家了. 当然如果用复制代码
的话也是可以的, 因为默认是向触发事件的玩家说话.
总结一下:
在旧版本里面, API的调用是写死在游戏里面的. 我们只需要在Hooks选中一个事件, 然后在里面利用他传入的参数进行操作即可. 这是旧版本的一个优势(也是劣势), 优势是编写方便, 省去了不必要的代码, 但是就是因为它写死的方式妨碍了他的拓展性.
脚本编写(新)
新版本由于调用机制发生了变动, 所以脚本的编写方式也随之变动.
首先同旧版, 先创建一个NPC. 然后用脚本魔杖右键. 我用1.9版本为你们演示.

由于界面发生了变化, 没有直接打开Script存放目录的按钮了. 但是脚本目录我们可以手动进入, 路径为: ".minecraft/saves/世界名/customnpcs/scripts/脚本语言名称". 脚本语言名称就是类似python(.py文件放这里), ecmascript(.js文件放这里).
在里面创建一个新的文件, 文件名随意.但是后缀一定要为脚本语言的指定后缀.
在里面按照这个格式写入内容:
复制代码
然后重启游戏, 重新打开上述界面. 将开启设置为是. 语言设置为ECMAScript(其他语言到时候在示例讲). 然后点一下上面的+, 创建一个新的脚本页面. 注意: 删除NPC时会提示是否确定删除NPC....实际上是确认删除这个脚本页面....机翻无误.
点击Load Scripts, 选择你刚刚写的脚本, 单击 > 按钮. 然后确定即可. 不要用Editor!!!这玩意一见中文就让MC崩溃!!!!
现在来分析下上面那个脚本....复制代码
这里的function是js的格式. 然后xxx是Hook的名字, Hook列表在这.括号里的event可以自定义....新版的(event)只是做为传入参数的一个别名, 即为指代传入参数的名称.
event在新版也不同了.....他的方法没有获取Player或者npc的....他从其他地方拉来了个(net.minecraft.entity.player.EntityPlayer)player. 即为EntityPlayer类型的player...
然后这就很坑了......Minecraft官方没有给出mc的API啊.....这tm不是坑人吗.....然而....应该用的是IPlayer类复制代码
方法...真的是太好了....这下就可以获取玩家的名字了....然后event里面还拉了另外一个字段: (ICustomNpc)npc. 这个就是他自己的类了...毕竟他想用原版类也用不到啊. 我们在里面可以看到返回值为空(void)的say方法, 所以就把他们拼起来了, 成了复制代码
这段代码. 然后整段代码的含义就是当玩家与NPC互动时npc会对玩家说出他的名字~

这张图是我的测试效果.
总结: 新版总体来说拥有很大的拓展性. 比如你可以写多个function然后再在事件的function里面调用其他的function. 但是为了这个特点也牺牲了一些, 比如:新版编写方式较旧版来说复杂了很多. 不过不得不说, 对于会编程的人来说, 新版带来的好处真的是太多了. 因为他是hook出来的, 所以只要function的名称写hook的名称即可.
示例与分析
好了, 上面的坑终于填好了. 这里是进阶介绍, 上面的是基础. 如果你没有一定的编程基础, 建议你先把上面的看完.
在这里我会标注上代码是新版还是旧版的,以及使用语言 可以放心看.
由于我只会js和python, 其他的只是见过, 所以我不保证其他的代码格式(命名方式等)正确.
Lua代码格式(新版):
复制代码就如同上面的js一样, event只是传参的一个别名. 主体中填你要执行的代码即可.
Python代码格式(新版):
复制代码
同上, xxx为Hook名称, event为传参别名
设置玩家游戏模式(Python, 新版):
复制代码
然后我就...

悲剧地摔死了....
其他分楼了= =
字数: 不包括标点和英文2546字. 包括则3000字
* 附录
来自群组: Minecraft插件百科

Minecraft插件百科出品
前言
Custom Npcs模组是一个历史十分悠久的模组, 它可以被用来创建NPC以及任务, 具有高度的可自定义性. 并且对于服务器的兼容性极佳, 是RPG模组服务器的首选. 我在之前翻译了Custom Npcs的官方教程, 但是由于官方教程对脚本方面介绍极为含糊, 导致有许多人看了直接懵逼了, 因此我在这里写一个教程给那些想要学写Custom Npcs脚本的人.
* 本教程由于楼主较懒, 所以不采用分楼的方式, 教程会直接在本帖内完成. 帖子可能比较长, 见谅.
了解Custom Npcs脚本
脚本, 是使用一种特定的描述性语言,是依照一定的格式编写而成的可执行文件. 而Custom Npcs的脚本根据新旧的API可以分为: 事件脚本, 普通脚本(楼主自己的定义). 旧版API(1.8.8以前版本)在游戏中的脚本编写界面可以直接选择事件, 根据给出的API来调用参数, 实现脚本功能. 而新版API(1.8.8及以后版本), 由于利用Hook实现了脚本功能, 所以需要自己监听事件, 然后在自己的函数中进行处理.
JavaDoc与脚本
Java在通过特定接口编写程序时, 需要通过阅读JavaDoc来获取接口的调用方式以及其他的信息(比如某个方法的作用). 要学会编写Custom Npcs脚本, 先要掌握对JavaDoc的阅读以及理解的能力.
官方JavaDoc(新 | 旧)
旧版Doc阅读方法:
新版Doc阅读方法:
Custom Npcs模组是一个历史十分悠久的模组, 它可以被用来创建NPC以及任务, 具有高度的可自定义性. 并且对于服务器的兼容性极佳, 是RPG模组服务器的首选. 我在之前翻译了Custom Npcs的官方教程, 但是由于官方教程对脚本方面介绍极为含糊, 导致有许多人看了直接懵逼了, 因此我在这里写一个教程给那些想要学写Custom Npcs脚本的人.
* 本教程由于楼主较懒, 所以不采用分楼的方式, 教程会直接在本帖内完成. 帖子可能比较长, 见谅.
了解Custom Npcs脚本
脚本, 是使用一种特定的描述性语言,是依照一定的格式编写而成的可执行文件. 而Custom Npcs的脚本根据新旧的API可以分为: 事件脚本, 普通脚本(楼主自己的定义). 旧版API(1.8.8以前版本)在游戏中的脚本编写界面可以直接选择事件, 根据给出的API来调用参数, 实现脚本功能. 而新版API(1.8.8及以后版本), 由于利用Hook实现了脚本功能, 所以需要自己监听事件, 然后在自己的函数中进行处理.
JavaDoc与脚本
Java在通过特定接口编写程序时, 需要通过阅读JavaDoc来获取接口的调用方式以及其他的信息(比如某个方法的作用). 要学会编写Custom Npcs脚本, 先要掌握对JavaDoc的阅读以及理解的能力.
官方JavaDoc(新 | 旧)
旧版Doc阅读方法:
新版Doc阅读方法:
脚本编写(旧)
旧版的脚本编写相对来说比较容易, 因为选择一个事件, 然后写代码就行了.
我这里用1.7.10版本来演示.
编写脚本可以在NPC中或者在脚本方块中. 一般在脚本方块中写的都是循环型脚本.
拿着NPC魔杖在地面右键可以创建一个NPC. 然后拿着脚本魔杖对着NPC右键会打开脚本编写界面.

如图, 如果语言选项为空白的请去看我翻译的教程. 选择完语言后将开启设置为是. 然后这个控制台就是指示运行状态的东东了.如果用print(或者其他语言的输出方法)的输出将会在这里显示. 另外, 报错也会在这里显示, 所以可以用于DEBUG.
然后就可以去Script界面编写脚本了.

不过在这里编写脚本的话肯定是会有些麻烦的. 毕竟MC自带的编辑器不(chao)是(ji)那(bu)么(gei)的(li)给力. 我们点击设置返回刚刚的界面, 单击Open Scripts folder, 这样就会在资源管理器中打开存放脚本文件的文件夹了. 在脚本文件夹中应该会有一个以语言名称命名的文件夹. 在这个文件夹中创建一个脚本文件并在其中写入内容. 然后重启游戏. 就可以在Scripts选项里面单击Load Script然后你就可以看见你的脚本了. 注意, 后缀一定要对应相应的语言. 比如python是.py, JavaScript是.js. 选中你的脚本, 单机, 然后点 > 按钮, 即可载入. 注意, 你要选择相应的Hook然后再载入你的脚本 !

就像这样. (两个对话应该是翻译出错了. 他们估计是机翻...). 应该上面那个, 就是我选中的那个是Interact, 也就是互动. 这个事件在玩家右键NPC时触发.
我的脚本内容为
- npc.say(player.getDisplayName());
然后执行的结果就是这样的

它很逗比地说了好几次我的名字对不对! 只要我右键一次它, 他就会跟我说我的名字一次233
来分析一下这个脚本. 在npc(ScriptNpc)参数中, 有一个方法叫
- say(String message)
. npc指的就是跟我互动的这个逗比steve, 而它的say方法则是让NPC说一句话. 而后面括号的String message就是要说的话. 当然他还有另外一个方式:
- say(ScriptPlayer player, String message)
. 这个方法要求传入一个ScriptPlayer类型的参数. 而事件调用时的传参传入的就是一个ScriptPlayer类型的player. 这样就可以指定玩家了. 当然如果用
- say(String messaeg)
的话也是可以的, 因为默认是向触发事件的玩家说话.
总结一下:
在旧版本里面, API的调用是写死在游戏里面的. 我们只需要在Hooks选中一个事件, 然后在里面利用他传入的参数进行操作即可. 这是旧版本的一个优势(也是劣势), 优势是编写方便, 省去了不必要的代码, 但是就是因为它写死的方式妨碍了他的拓展性.
脚本编写(新)
新版本由于调用机制发生了变动, 所以脚本的编写方式也随之变动.
首先同旧版, 先创建一个NPC. 然后用脚本魔杖右键. 我用1.9版本为你们演示.

由于界面发生了变化, 没有直接打开Script存放目录的按钮了. 但是脚本目录我们可以手动进入, 路径为: ".minecraft/saves/世界名/customnpcs/scripts/脚本语言名称". 脚本语言名称就是类似python(.py文件放这里), ecmascript(.js文件放这里).
在里面创建一个新的文件, 文件名随意.但是后缀一定要为脚本语言的指定后缀.
在里面按照这个格式写入内容:
- function interact(event) {
 
-     event.npc.say(event.player.getName());
 
- }
然后重启游戏, 重新打开上述界面. 将开启设置为是. 语言设置为ECMAScript(其他语言到时候在示例讲). 然后点一下上面的+, 创建一个新的脚本页面. 注意: 删除NPC时会提示是否确定删除NPC....实际上是确认删除这个脚本页面....机翻无误.
点击Load Scripts, 选择你刚刚写的脚本, 单击 > 按钮. 然后确定即可. 不要用Editor!!!这玩意一见中文就让MC崩溃!!!!
现在来分析下上面那个脚本....
- function xxx(event)
这里的function是js的格式. 然后xxx是Hook的名字, Hook列表在这.括号里的event可以自定义....新版的(event)只是做为传入参数的一个别名, 即为指代传入参数的名称.
event在新版也不同了.....他的方法没有获取Player或者npc的....他从其他地方拉来了个(net.minecraft.entity.player.EntityPlayer)player. 即为EntityPlayer类型的player...
然后这就很坑了......Minecraft官方没有给出mc的API啊.....这tm不是坑人吗.....然而....应该用的是IPlayer类
- public String getName()
方法...真的是太好了....这下就可以获取玩家的名字了....然后event里面还拉了另外一个字段: (ICustomNpc)npc. 这个就是他自己的类了...毕竟他想用原版类也用不到啊. 我们在里面可以看到返回值为空(void)的say方法, 所以就把他们拼起来了, 成了
- event.npc.say(event.player.getName());
这段代码. 然后整段代码的含义就是当玩家与NPC互动时npc会对玩家说出他的名字~

这张图是我的测试效果.
总结: 新版总体来说拥有很大的拓展性. 比如你可以写多个function然后再在事件的function里面调用其他的function. 但是为了这个特点也牺牲了一些, 比如:新版编写方式较旧版来说复杂了很多. 不过不得不说, 对于会编程的人来说, 新版带来的好处真的是太多了. 因为他是hook出来的, 所以只要function的名称写hook的名称即可.
示例与分析
好了, 上面的坑终于填好了. 这里是进阶介绍, 上面的是基础. 如果你没有一定的编程基础, 建议你先把上面的看完.
在这里我会标注上代码是新版还是旧版的,以及使用语言 可以放心看.
由于我只会js和python, 其他的只是见过, 所以我不保证其他的代码格式(命名方式等)正确.
Lua代码格式(新版):
- function xxx(event)
 
-     主体
 
- End
Python代码格式(新版):
- def xxx(event):
 
- 主体
同上, xxx为Hook名称, event为传参别名
设置玩家游戏模式(Python, 新版):
- def interact(event):
 
-     event.player.setGamemode(0);
 
- # 0为生存, 1为创造, 2为冒险, 3为旁观
然后我就...

悲剧地摔死了....
其他分楼了= =
字数: 不包括标点和英文2546字. 包括则3000字
* 附录
来自群组: Minecraft插件百科
 本帖最后由 z25096708 于 2016-8-9 21:31 编辑 
重设NPC(JS, Python, 新版):
复制代码
看到evt没= =这个地方不一定要event的.....可以自己随便写
复制代码
这是python的
持续更新
重设NPC(JS, Python, 新版):
- function interact(evt) {
 
-     evt.npc.reset()
 
- }
看到evt没= =这个地方不一定要event的.....可以自己随便写
- def interact(evt):
 
- evt.npc.reset()
这是python的
持续更新
楼主,我旧版,在服务器没有Open save folder那一栏,输入了也不会执行怎么破
楼主,像是RPG里的BOSS那种技能该怎么制作?


