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


教程编辑中...


前排提醒

1.本教程不推荐毫无基础还想一步登天的玩家使用
2.编写脚本务必配合APIDOC,注意标点符号。
3.禁止回复任何售卖脚本内容。
4.不会编程请先进行初步学习并且理解,谢谢。
------------------------------------------------
1.7.10请进入灰灰的教程


2021.12 数据,可能有更多内容

教程编辑中...


前排提醒

1.本教程不推荐毫无基础还想一步登天的玩家使用2.编写脚本务必配合APIDOC,注意标点符号。3.禁止回复任何售卖脚本内容。4.不会编程请先进行初步学习并且理解,谢谢。------------------------------------------------1.7.10请进入灰灰的教程https://www.mcbbs.net/thread-816677-1-1.html


不推荐无编程基础直接上手请Look一下https://www.mcbbs.net/thread-816677-1-1.html(灰灰的教程)中的js基础

我的一点小废话

1.搜索功能很棒。2.大焕欣,比1.7.10的结构好了很多。3.不用进行引入也可以使用很多功能:forge,player...
先直接放APIDOC地址 http://www.kodevelopment.nl/customnpcs/api/1.12.2/overview-summary.html
我们来..和灰灰一样熟悉一下界面

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

黄框框里面的是接口!对接口!(你想了解?知乎
不过大家还是后面一边学一边了解吧!记住APIDOC要看要看要看!


第一章:我与NPC
本章将以可爱的npc为例,对npc进行编写脚本。
完成进度

1.空手的异乡人(√)2.我的工作与对我工作(√)3.弟弟哥哥?()




序列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()方法好了我们基本上完成惹看看代码

代码:

  1. function interact(e){
  2.     var handItem = e.player.getMainhandItem();
  3.     if(handItem.isEmpty()!=true){
  4.   handItem.setStackSize(handItem.getStackSize()-1);
  5.   e.npc.say("美妙的约会,一起买菜");
  6.     }
  7. }



序列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为脚本增加了分页设计,比如上一个教程的空手不说话根本不用删,直接新建一个第二页,在里面写上

代码:

  1. function interact(e){
  2.     var npcdisplay=e.npc.getDisplay();
  3.     var weather=e.npc.getWorld().isRaining();// get a boolen value presents is the world raining
  4.     var skin = npcdisplay.getSkinTexture();
  5.     e.npc.sayTo(e.player,"Hello,my name is"+npcdisplay.getName());
  6.     if(weather){
  7.   e.npc.sayTo(e.player,"現在下雨呢");
  8.     }else{
  9.   e.npc.sayTo(e.player,"天氣晴朗");
  10.     }
  11.     e.npc.sayTo(e.player,"我的衣服?我來看看");
  12.     e.npc.sayTo(e.player,skin);
  13.    
  14. }
這樣就可以和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下提供了
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。



操作完他的属性,我们来生成。
来看看生成分身代码:

代码:

  1. var entity=e.API.  createNPC(e.npc.getWorld().getMCWorld());
  2. entity.setEntityNbt(e.npc.getEntityNbt());
  3. entity.  setPosition(e.npc.getX()+1,e.npc.getY(),e.npc.getZ()+1);
  4. 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

代码:

  1. function ExpPlayer(player,exp){
  2.     this.player=player;//这里推荐用playername,毕竟好操作
  3.     this.exp=exp;
  4. }
  5. //定义一个结构 包含player 和 exp 。

  6. //模拟定义一些玩家
  7. var heer = new ExpPlayer("heer",100);//赫尔,100经验
  8. var siwang = new ExpPlayer("siwang",800);//思望,800经验

  9. //创建一个数组
  10. var arr=new Array();
  11. //把你们加进去。
  12. arr.push(heer);
  13. arr.push(siwang);

  14. //定义魔改版冒泡算法(从高到低)
  15. function bubbleSortPlus(arr) {
  16.     var len = arr.length;
  17.     for (var i = 0; i < len; i++) {
  18.   for (var j = 0; j < len - 1 - i; j++) {
  19.    if (arr[j].exp < arr[j+1].exp) {  //相邻元素两两对比
  20.     var temp = arr[j+1];  //元素交换
  21.     arr[j+1] = arr[j];
  22.     arr[j] = temp;
  23.    }
  24.   }
  25.     }
  26.     return arr;
  27. }
  28. //获得排序后数组
  29. arr = bubbleSortPlus(arr);//这个arr已经排序过了。


  30. /*
  31.   //这边方法我随便取的,都是错误。别管,看懂就行
  32.   var arr2=world.getAllServerPlayers();
  33.   var arr3=new Array(); //定义新的arr3
  34.   for(var i=0;i<arr2.length;i++)
  35.   {
  36.     arr3.push(new ExpPlayer(arr2.getName(),arr2.getExp()));
  37.   }
  38.   arr2 = bubbleSortPlus(arr2);//同理
  39. */




淑芳
非常期待你能写完awa,因为脚本这东西真的 超 超 超好用的!

Heer_Kaisair
占楼放提醒
————救世主赫尔

Eroslon_黎明
小黑的手臂 发表于 2019-7-24 12:24
占楼放提醒
————救世主赫尔

赫尔大佬nb!(我是黎明)

Colin_Sakuya
顶起来,大佬牛逼

Eroslon_黎明
赫尔大佬nb!!!!

1764191550
神乎其技,不服不行!

1764191550
大佬nb!!!!!

1764191550
顶起来,大佬牛逼

1764191550
真的nb真的厉害哇

Heer_Kaisair
1764191550 发表于 2019-7-26 15:02
66666666666666666

请勿水贴刷评论

思望文宣
支持支持

Nayo996
很不错的教程

思望文宣
支持赫尔

j1612480068
赫尔大佬我要定制脚本 q 1612480068

fadlp321
我的天,非常期待你能写完awa,因为脚本这东西真的 超 超 超好用的!

Heer_Kaisair
fadlp321 发表于 2020-1-21 16:19
我的天,非常期待你能写完awa,因为脚本这东西真的 超 超 超好用的!

我咕咕咕了,有时间再说吧==

常规操作
大佬想问下怎么用脚本做个菜单,我朋友在1.7.10做了个菜单,他说用脚本做的

soil-sword
十分高水平的教程,但是这对观看教程者提出了一些要求。
期待完成后的帖子,那肯定是十分美好的作品。

d321313
太强了..

1023436457
非常感谢,教程很有用

gbfjvyj
支持支持,大佬nb

KindLHJ
看不懂0.0但是还要感谢楼主,力顶!!!

Heer_Kaisair
KindLHJ 发表于 2020-4-10 20:47
看不懂0.0但是还要感谢楼主,力顶!!!

咕咕咕(发出了鸽子的声音

2786761452
大佬厉害,教程很不错,楼主加油

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

H笔挺的虎鲸h
萌新看的一脸懵逼

hdxbl005
非常期待你能写完awa,因为脚本这东西真的 超 超 超好用的!

Colin_Sakuya
wai,楼主在吗,新版的NPC MOD里 getclone和spawnclone已经过期了,要spawnclone的话要什么指令楼主可不可以研究下x

Heer_Kaisair
Colin_Sakuya 发表于 2021-4-13 20:25
wai,楼主在吗,新版的NPC MOD里 getclone和spawnclone已经过期了,要spawnclone的话要什么指令楼主可不可以 ...

利用MC原版代码,看MCP对照下吧

多普勒的夜
npc的js能不能实现放特效技能之类的操作,一直没研究明白

Penny_S
更新啊,都成坟贴了...

942109786
大佬NB,懂了一点。

第一页 上一页 下一页 最后一页