本帖最后由 小黑的手臂 于 2019-8-6 17:36 编辑

教程编辑中...

教程编辑中...
不推荐无编程基础直接上手请Look一下https://www.mcbbs.net/thread-816677-1-1.html(灰灰的教程)中的js基础
先直接放APIDOC地址 http://www.kodevelopment.nl/customnpcs/api/1.12.2/overview-summary.html
我们来..和灰灰一样熟悉一下界面

看见右上角那个了么,就是搜索框。(当然你得差不多知道个方法才能搜出来英语水平捉急)
黄框框里面的是接口!对接口!(你想了解?知乎)
不过大家还是后面一边学一边了解吧!记住APIDOC要看要看要看!
第一章:我与NPC
本章将以可爱的npc为例,对npc进行编写脚本。
序列1-空手的异乡人
好的我们有了npc,我们开放了ECMA。然后这个npc只会说hello?
不!!我不要hello!
我们去给他添加一个脚本。

我们的构思是:如果玩家手上空空如也,就不说话。玩家手上有东西,就让东西-1,npc说出"美妙的约会,一起买菜"然后,我们怎么找相应的方法?
我们都知道,这是一个交互事件!那么 就用function interact(e){}
e就是指那个NpcEvent.InteractEvent
看看这个event的field 里面是Iplayer player ,当然,还有继承NpcEvent 的npc好的我们获取到player对象了,就是你 e.player !
然后我们该如何判断手上有没有物品呢?
player 肯定是个 Entity
于是我们浏览noppes.npcs.api.entity包发现了IPlayer 类,就是你!里面都是关于Iplayer的方法~你会发现,这个类似乎并不有任何与获取手上物品有关的方法?
别急,player 继承了 IEntity以及 IEntityLivingBase 因为其实僵尸也是entityliving,它手上也有物品对吧我下看,发现IEntityLivingBase包含getMainhandItem() 那怎么判断有没有东西?getMainhandItem() 返回的是 IItemStack找到IItemStack的方法 isEmpty()还有,让手上的物品-1就要使用setStackSize?(int size)和getStackSize()方法好了我们基本上完成惹看看代码
序列2-扯淡快乐人
对于这个本地人,身为异乡人的我们自然是没话可说。但是作为外地的卑鄙人,免不了要套一些话比如 :今天天气怎么样这要用world),你吃了吗,你现在啥工作啊,你衣服哪里买的...
这边1.12.2的方法与1.7.10有很大不同,我们不再直接对event.npc进行getName()来获取名字,而是先获取npc的INPCDisplay对象例如:对npc操作 e.npc.getDIsplay().getName()为什么这边要着重强调这个?因为这样做有一个更好的归类性(瞎讲)...
INPCDisplay
中就包含了关于npc 显示/展示 出来的所有东西,包括 skin皮肤 ,名字 血条bossbar 模型model...
以此类推,你现在啥工作?这个问题可以获取npc的INPCJob,也就是getJob() 当然,when you finished then you should use the method getType() ,also ,it's will return an int value.
How to 。。。对不起有点什么奇怪的语言混进来了,关于这个获取的int值,判断?那么你就要快乐的用到noppes.npcs.api.constants.JobType里面提供的枚举.
还有一件事!1.12.2为脚本增加了分页设计,比如上一个教程的空手不说话根本不用删,直接新建一个第二页,在里面写上這樣就可以和npc扯淡了。hhh。
如何判斷npc的Job就给你们当作业(提示,这枚举不多,不用写入一个Map再用了!(JS有MAP嘛,还是Directory<>?))!
序列3-spawnClone与实体操作
好了我们进入正题,如何做出“影分身”效果:
npc被攻击会产生影分身,3秒后影分身消失。影分身存在的时候不会再次生成影分身好的我们先给面前的npc取个名字 :信球思望
我们先来想一下如何创造分身?
分身肯定来源于npc自己!我们来看一下IWorld中提供的方法(为什么是IWorld?不然你怎么生成?!因为是生成在世界里啊,所有在要看IWorld)
那么我们找到了几种方法 spawnEntity?(IEntity entity)和 spawnClone?(double x, double y, double z, int tab, java.lang.String name)嗯接下来发现 spawnClone比较垃圾(还要在复制魔杖里搞?太烦了)
那么我们选择了spawnEntity?(IEntity entity)但是这个IEntity对象哪里搞?
没错,IWorld下提供了
但是这些似乎只能用来生成原有的生物(玩家也无法生成)。
那该怎么办呢?!!!要使用spawnClone() 了吗!那就用吧..把这e.npc.storeAsClone(1,"storedNpc")把他放进clone里面。再利用world的getClone(1,"storedClone")来获取IEntity。

然而还有一个办法是我非常推荐的,就是在
生成一个npc,把他塞进npc复制魔杖的server里面。名字叫clone。
以后直接成成他,在把需要复制的npc的nbt给予那个新的。并且要设置home啊!(但是home数据可以用nbt)所以 综合一下
操作完他的属性,我们来生成。
来看看生成分身代码:
然后关于三秒后消失?使用Timer!
下面我们讲述如何使用timer进行延迟
就关于上面那个entity对象,让它永久消失就是despawn() [死亡可以复活用kill()]
首先我们要获取Timers对象 :方法 e.npc.getTimers()
再次,我们启动一个id为1的timer
e.npc.getTimers().forceStart(1,40,false);//40就是两秒(这边我用了forcestart,因为不想再去检测这个id有没有timer了)
然后,创建timer钩子
function timer(e){}
里面填写 if(e.id==1){e.npc.kill()}
8
9
10
11
12

教程编辑中...
|
2021.12 数据,可能有更多内容

教程编辑中...
|
不推荐无编程基础直接上手请Look一下https://www.mcbbs.net/thread-816677-1-1.html(灰灰的教程)中的js基础
|
我们来..和灰灰一样熟悉一下界面

看见右上角那个了么,就是搜索框。(当然你得差不多知道个方法才能搜出来英语水平捉急)

黄框框里面的是接口!对接口!(你想了解?知乎)
不过大家还是后面一边学一边了解吧!记住APIDOC要看要看要看!
第一章:我与NPC
本章将以可爱的npc为例,对npc进行编写脚本。
|
序列1-空手的异乡人
好的我们有了npc,我们开放了ECMA。然后这个npc只会说hello?
不!!我不要hello!
我们去给他添加一个脚本。

我们的构思是:如果玩家手上空空如也,就不说话。玩家手上有东西,就让东西-1,npc说出"美妙的约会,一起买菜"然后,我们怎么找相应的方法?
我们都知道,这是一个交互事件!那么 就用function interact(e){}
e就是指那个NpcEvent.InteractEvent
看看这个event的field 里面是Iplayer player ,当然,还有继承NpcEvent 的npc好的我们获取到player对象了,就是你 e.player !
然后我们该如何判断手上有没有物品呢?
player 肯定是个 Entity
于是我们浏览noppes.npcs.api.entity包发现了IPlayer 类,就是你!里面都是关于Iplayer的方法~你会发现,这个类似乎并不有任何与获取手上物品有关的方法?
别急,player 继承了 IEntity以及 IEntityLivingBase 因为其实僵尸也是entityliving,它手上也有物品对吧我下看,发现IEntityLivingBase包含getMainhandItem() 那怎么判断有没有东西?getMainhandItem() 返回的是 IItemStack找到IItemStack的方法 isEmpty()还有,让手上的物品-1就要使用setStackSize?(int size)和getStackSize()方法好了我们基本上完成惹看看代码
代码:
- function interact(e){
- var handItem = e.player.getMainhandItem();
- if(handItem.isEmpty()!=true){
- handItem.setStackSize(handItem.getStackSize()-1);
- e.npc.say("美妙的约会,一起买菜");
- }
- }
序列2-扯淡快乐人
对于这个本地人,身为异乡人的我们自然是没话可说。但是作为外地的卑鄙人,免不了要套一些话比如 :今天天气怎么样这要用world),你吃了吗,你现在啥工作啊,你衣服哪里买的...
这边1.12.2的方法与1.7.10有很大不同,我们不再直接对event.npc进行getName()来获取名字,而是先获取npc的INPCDisplay对象例如:对npc操作 e.npc.getDIsplay().getName()为什么这边要着重强调这个?因为这样做有一个更好的归类性(瞎讲)...
INPCDisplay
中就包含了关于npc 显示/展示 出来的所有东西,包括 skin皮肤 ,名字 血条bossbar 模型model...
以此类推,你现在啥工作?这个问题可以获取npc的INPCJob,也就是getJob() 当然,when you finished then you should use the method getType() ,also ,it's will return an int value.
How to 。。。对不起有点什么奇怪的语言混进来了,关于这个获取的int值,判断?那么你就要快乐的用到noppes.npcs.api.constants.JobType里面提供的枚举.
还有一件事!1.12.2为脚本增加了分页设计,比如上一个教程的空手不说话根本不用删,直接新建一个第二页,在里面写上
代码:
- function interact(e){
- var npcdisplay=e.npc.getDisplay();
- var weather=e.npc.getWorld().isRaining();// get a boolen value presents is the world raining
- var skin = npcdisplay.getSkinTexture();
- e.npc.sayTo(e.player,"Hello,my name is"+npcdisplay.getName());
- if(weather){
- e.npc.sayTo(e.player,"現在下雨呢");
- }else{
- e.npc.sayTo(e.player,"天氣晴朗");
- }
- e.npc.sayTo(e.player,"我的衣服?我來看看");
- e.npc.sayTo(e.player,skin);
-
- }
如何判斷npc的Job就给你们当作业(提示,这枚举不多,不用写入一个Map再用了!(JS有MAP嘛,还是Directory<>?))!
序列3-spawnClone与实体操作
好了我们进入正题,如何做出“影分身”效果:
npc被攻击会产生影分身,3秒后影分身消失。影分身存在的时候不会再次生成影分身好的我们先给面前的npc取个名字 :信球思望
我们先来想一下如何创造分身?
分身肯定来源于npc自己!我们来看一下IWorld中提供的方法(为什么是IWorld?不然你怎么生成?!因为是生成在世界里啊,所有在要看IWorld)
那么我们找到了几种方法 spawnEntity?(IEntity entity)和 spawnClone?(double x, double y, double z, int tab, java.lang.String name)嗯接下来发现 spawnClone比较垃圾(还要在复制魔杖里搞?太烦了)
那么我们选择了spawnEntity?(IEntity entity)但是这个IEntity对象哪里搞?
没错,IWorld下提供了
createEntity(java.lang.String id) createEntityFromNBT(INbt nbt) |
那该怎么办呢?!!!要使用spawnClone() 了吗!那就用吧..把这e.npc.storeAsClone(1,"storedNpc")把他放进clone里面。再利用world的getClone(1,"storedClone")来获取IEntity。

然而还有一个办法是我非常推荐的,就是在
生成一个npc,把他塞进npc复制魔杖的server里面。名字叫clone。
以后直接成成他,在把需要复制的npc的nbt给予那个新的。并且要设置home啊!(但是home数据可以用nbt)所以 综合一下
对于npc来说,最好的生成方法(纯脚本)就是利用服务器提供的API(NpcAPI)来创造出npc,再将原来的npc的EntityNbt给新创造的nbt,同时再次设定新npc的Position。 |
操作完他的属性,我们来生成。
来看看生成分身代码:
代码:
- var entity=e.API. createNPC(e.npc.getWorld().getMCWorld());
- entity.setEntityNbt(e.npc.getEntityNbt());
- entity. setPosition(e.npc.getX()+1,e.npc.getY(),e.npc.getZ()+1);
- entity.getDisplay().setName("影分身");
然后关于三秒后消失?使用Timer!
下面我们讲述如何使用timer进行延迟
就关于上面那个entity对象,让它永久消失就是despawn() [死亡可以复活用kill()]
首先我们要获取Timers对象 :方法 e.npc.getTimers()
再次,我们启动一个id为1的timer
e.npc.getTimers().forceStart(1,40,false);//40就是两秒(这边我用了forcestart,因为不想再去检测这个id有没有timer了)
然后,创建timer钩子
function timer(e){}
里面填写 if(e.id==1){e.npc.kill()}
8
9
10
11
12
代码:
- function ExpPlayer(player,exp){
- this.player=player;//这里推荐用playername,毕竟好操作
- this.exp=exp;
- }
- //定义一个结构 包含player 和 exp 。
- //模拟定义一些玩家
- var heer = new ExpPlayer("heer",100);//赫尔,100经验
- var siwang = new ExpPlayer("siwang",800);//思望,800经验
- //创建一个数组
- var arr=new Array();
- //把你们加进去。
- arr.push(heer);
- arr.push(siwang);
- //定义魔改版冒泡算法(从高到低)
- function bubbleSortPlus(arr) {
- var len = arr.length;
- for (var i = 0; i < len; i++) {
- for (var j = 0; j < len - 1 - i; j++) {
- if (arr[j].exp < arr[j+1].exp) { //相邻元素两两对比
- var temp = arr[j+1]; //元素交换
- arr[j+1] = arr[j];
- arr[j] = temp;
- }
- }
- }
- return arr;
- }
- //获得排序后数组
- arr = bubbleSortPlus(arr);//这个arr已经排序过了。
- /*
- //这边方法我随便取的,都是错误。别管,看懂就行
- var arr2=world.getAllServerPlayers();
- var arr3=new Array(); //定义新的arr3
- for(var i=0;i<arr2.length;i++)
- {
- arr3.push(new ExpPlayer(arr2.getName(),arr2.getExp()));
- }
- arr2 = bubbleSortPlus(arr2);//同理
- */
非常期待你能写完awa,因为脚本这东西真的 超 超 超好用的!
占楼放提醒
————救世主赫尔
————救世主赫尔
小黑的手臂 发表于 2019-7-24 12:24
占楼放提醒
————救世主赫尔
赫尔大佬nb!(我是黎明)
顶起来,大佬牛逼
赫尔大佬nb!!!!
神乎其技,不服不行!
大佬nb!!!!!
顶起来,大佬牛逼
真的nb真的厉害哇
1764191550 发表于 2019-7-26 15:02
66666666666666666
请勿水贴刷评论
支持支持
很不错的教程
支持赫尔
赫尔大佬我要定制脚本 q 1612480068
我的天,非常期待你能写完awa,因为脚本这东西真的 超 超 超好用的!
fadlp321 发表于 2020-1-21 16:19
我的天,非常期待你能写完awa,因为脚本这东西真的 超 超 超好用的!
我咕咕咕了,有时间再说吧==
大佬想问下怎么用脚本做个菜单,我朋友在1.7.10做了个菜单,他说用脚本做的
十分高水平的教程,但是这对观看教程者提出了一些要求。
期待完成后的帖子,那肯定是十分美好的作品。
期待完成后的帖子,那肯定是十分美好的作品。
太强了..
非常感谢,教程很有用
支持支持,大佬nb
看不懂0.0但是还要感谢楼主,力顶!!!
KindLHJ 发表于 2020-4-10 20:47
看不懂0.0但是还要感谢楼主,力顶!!!
咕咕咕(发出了鸽子的声音
大佬厉害,教程很不错,楼主加油

非常感谢,很有意思,坐等更新物品

萌新看的一脸懵逼
非常期待你能写完awa,因为脚本这东西真的 超 超 超好用的!
wai,楼主在吗,新版的NPC MOD里 getclone和spawnclone已经过期了,要spawnclone的话要什么指令楼主可不可以研究下x
Colin_Sakuya 发表于 2021-4-13 20:25
wai,楼主在吗,新版的NPC MOD里 getclone和spawnclone已经过期了,要spawnclone的话要什么指令楼主可不可以 ...
利用MC原版代码,看MCP对照下吧
npc的js能不能实现放特效技能之类的操作,一直没研究明白
更新啊,都成坟贴了...
大佬NB,懂了一点。