扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 2028|回复: 3
收起左侧

[脚本教学] 从零开始学脚本 - 8.enablenpc和disablenpc

[复制链接]

一米阳光商人

贡献:2803

金钱:9554

威望:1495

589

主题

680

帖子

2万

积分

优秀版主荣誉管理RO骑士

RO精灵 RO精灵

RO侏儒 RO侏儒

RO巨人 RO巨人

RO诸神 RO诸神

RO创世 RO创世

发表于 2016-6-16 15:29:29 | 显示全部楼层 |阅读模式
今天是这个阶段最后一课拉

该做点东西出来了呢

今天要实现的就是把前面的内容综合起来制作一个<捉迷藏的小女孩>

当然有人愿意做成<捉迷藏的怪蜀黍>我也不反对

那么先回顾一下之前的内容

创建NPC~对话~条件判定~标签~ON事件以及调用~随机函数

为了最后完成这个小游戏

最终还需要两个命令

enablenpc和disablenpc

两条命令用于让npc转换为加载或是不加载的状态

当npc处在加载状态时,会正常显示出来,同时其所有的触发事件也能直接由玩家触发

但是当npc处在未加载状态时

npc不会显示出来,正常玩家的触发手段(直接点击对话/走进范围触发)都不好使

但是有一条例外

就是虽然这个npc没有加载,但是实际这个npc还是存在的~所以On事件依然可以触发

俺是分割线--------------------------------

当然除了上面的两条命令~还需要一个特殊的On事件

OnInit

这个标签可以同其他On标签一样被自身或者其他npc调用

同时,当服务器脚本重置(服务器启动/@reloadscript重读脚本)时,这个事件也会被触发

综合今天说到的disablenpc

我先给出一个简单的例子
  1. prontera,150,150,4        script        enablenpc测试        877,{
  2.         end;
  3. OnInit:
  4.         disablenpc "enablenpc测试";
  5.         end;
  6. }
复制代码

每当服务器启动或是重读脚本时,这个enablenpc测试就会被隐藏掉

那么将这个例子修改一下~就可以简单控制这个npc的出现和小时

  1. prontera,150,150,4        script        enablenpc测试        877,{
  2.         end;
  3. OnInit:
  4.         disablenpc "enablenpc测试";
  5.         end;
  6. OnEnable:
  7.         enablenpc "enablenpc测试";
  8.         end;
  9. }
复制代码

当需要npc出现时

使用
donpcevent "enablenpc测试::OnEnable";

来让他显示

同理,使用OnInit事件可以让这个npc从新小时

消失- -

那么~我们需要的功能就可以实现了

首先~制作3个npc~外观全部采用一样的外观~

然后里面的内容设计成一样的内容~

当服务器开始运行的时候,只让其中一个显示出来

然后~与其中一个对话时~对话的npc消失~另外两个已经消失的npc随机出现一个

那么脚本看起来就像是这样的
  1. prontera,150,150,4        script        爱捉迷藏的小女孩        877,{
  2.         end;
  3. OnInit:
  4.         disablenpc "爱捉迷藏的小女孩";
  5.         end;
  6. OnEnable:
  7.         enablenpc "爱捉迷藏的小女孩";
  8.         end;
  9. }
  10. prontera,147,150,4        script        爱捉迷藏的小女孩        877,{
  11.         end;
  12. OnInit:
  13.         disablenpc "爱捉迷藏的小女孩";
  14.         end;
  15. OnEnable:
  16.         enablenpc "爱捉迷藏的小女孩";
  17.         end;
  18. }
  19. prontera,144,150,4        script        爱捉迷藏的小女孩        877,{
  20.         end;
  21. OnInit:
  22.         disablenpc "爱捉迷藏的小女孩";
  23.         end;
  24. OnEnable:
  25.         enablenpc "爱捉迷藏的小女孩";
  26.         end;
  27. }
复制代码

但是这样处理的时候会发现一个问题

三个npc的名字是相同的

那么这时候enablenpc或是disablenpc时~他可能无法得知需要关闭和开启的到底是哪一个

这里要说明一个小东西

npc的名字部分

格式是这样的

名字#标识

在游戏里,只会显示出名字部分的内容

#和后面的标识不会显示

只是在脚本里才能看到

所以这时候,我们需要为三个不同的但是同名的npc派个编号
  1. prontera,150,150,4        script        爱捉迷藏的小女孩#1        877,{
  2.         end;
  3. OnInit:
  4.         disablenpc "爱捉迷藏的小女孩#1";
  5.         end;
  6. OnEnable:
  7.         enablenpc "爱捉迷藏的小女孩#1";
  8.         end;
  9. }
  10. prontera,147,150,4        script        爱捉迷藏的小女孩#2        877,{
  11.         end;
  12. OnInit:
  13.         disablenpc "爱捉迷藏的小女孩#2";
  14.         end;
  15. OnEnable:
  16.         enablenpc "爱捉迷藏的小女孩#2";
  17.         end;
  18. }
  19. prontera,144,150,4        script        爱捉迷藏的小女孩#3        877,{
  20.         end;
  21. OnInit:
  22.         disablenpc "爱捉迷藏的小女孩#3";
  23.         end;
  24. OnEnable:
  25.         enablenpc "爱捉迷藏的小女孩#3";
  26.         end;
  27. }
复制代码

当这样处理以后~读取时~服务端不会报错~脚本的调用也不会因为npc重名而导致无法判断具体应该对哪个npc进行操作

之后

我们其实还需要再增加一个内容

现在有OnInit和OnEnable事件~但是没有disable事件

因为其中有一个npc是需要初始化时不会隐藏

所以我们额外在制作一个disable事件

同时,我设计让1号小女孩在初始化时出现
  1. prontera,150,150,4        script        爱捉迷藏的小女孩#1        877,{
  2.         end;
  3. OnInit:
  4.         end;
  5. OnEnable:
  6.         enablenpc "爱捉迷藏的小女孩#1";
  7.         end;
  8. OnDisable:
  9.         disablenpc "爱捉迷藏的小女孩#1";
  10.         end;
  11. }
  12. prontera,147,150,4        script        爱捉迷藏的小女孩#2        877,{
  13.         end;
  14. OnInit:
  15.         disablenpc "爱捉迷藏的小女孩#2";
  16.         end;
  17. OnEnable:
  18.         enablenpc "爱捉迷藏的小女孩#2";
  19.         end;
  20. OnDisable:
  21.         disablenpc "爱捉迷藏的小女孩#2";
  22.         end;
  23. }
  24. prontera,144,150,4        script        爱捉迷藏的小女孩#3        877,{
  25.         end;
  26. OnInit:
  27.         disablenpc "爱捉迷藏的小女孩#3";
  28.         end;
  29. OnEnable:
  30.         enablenpc "爱捉迷藏的小女孩#3";
  31.         end;
  32. OnDisable:
  33.         disablenpc "爱捉迷藏的小女孩#2";
  34.         end;
  35. }
复制代码

所以脚本变成了这样

这样~三个npc就都有出现和消失事件了

同时1号npc在初始化时不消失,另外两个在初始化时消失

之后要做的就是设计游戏内容了

我初步设计的是这样

当玩家没接取任务的时候

随便找到任意位置的小女孩对话时~都可以接取任务~

接取任务以后要找到随机出现的小女孩10次

当找到第10次的时候~

小女孩会承认败给玩家~同时给玩家奖励

那么~因为是任意位置的NPC~所以每一个npc里都要设计出相同的对话内容

然后接取任务的方法

我通常是用变量控制

因为是针对玩家的~所以我一般会使用@变量

在这里~我使用@ZMC这个变量

别问我是不是(捉迷藏)的缩写~

我加入本群

因为@变量~在玩家进入游戏以后~没做过特殊设定的时候~默认为0

所以就将变量值为0时,判定为玩家未接受任务的状态

那么之后的 处理就相应简单很多

每次找到的时候~变量+1

最后变量等于10的时候,给与玩家奖励,同时将变量归零,玩家就可以再次参与游戏
  1. prontera,150,150,4        script        爱捉迷藏的小女孩#1        877,{
  2.         if(@ZMC == 0)
  3.         {
  4.                 mes "hi!";
  5.                 mes "尊敬的冒险者";
  6.                 mes "你愿意和我捉迷藏吗?";
  7.                 next;
  8.                 mes "你要找到我10次的话,我就会给你奖励哟!";
  9.                 set @ZMC,1;
  10.                 close;
  11.                 end;
  12.         }
  13.         if(@ZMC<10)
  14.         {
  15.                 if(@ZMC>0)
  16.                 {
  17.                         set @ZMC,@ZMC+1;
  18.                         mes "哎呀!竟然被发现了";
  19.                         mes "这是你第 "+@ZMC+" 次发现我拉!";
  20.                         close;
  21.                         end;
  22.                 }
  23.         }
  24.         if(@ZMC == 10)
  25.         {
  26.                 mes "哎呀呀呀~";
  27.                 mes "已经被找到10次了呢";
  28.                 mes "你还真是厉害呀!";
  29.                 mes "那我就把我收藏的宝物给你好了";
  30.                 getitem 969,10;
  31.                 set @ZMC,0;
  32.                 close;
  33.                 end;
  34.         }
  35.         end;
  36. OnInit:
  37.         end;
  38. OnEnable:
  39.         enablenpc "爱捉迷藏的小女孩#1";
  40.         end;
  41. OnDisable:
  42.         disablenpc "爱捉迷藏的小女孩#1";
  43.         end;
  44. }
  45. prontera,147,150,4        script        爱捉迷藏的小女孩#2        877,{
  46.         end;
  47. OnInit:
  48.         disablenpc "爱捉迷藏的小女孩#2";
  49.         end;
  50. OnEnable:
  51.         enablenpc "爱捉迷藏的小女孩#2";
  52.         end;
  53. OnDisable:
  54.         disablenpc "爱捉迷藏的小女孩#2";
  55.         end;
  56. }
  57. prontera,144,150,4        script        爱捉迷藏的小女孩#3        877,{
  58.         end;
  59. OnInit:
  60.         disablenpc "爱捉迷藏的小女孩#3";
  61.         end;
  62. OnEnable:
  63.         enablenpc "爱捉迷藏的小女孩#3";
  64.         end;
  65. OnDisable:
  66.         disablenpc "爱捉迷藏的小女孩#2";
  67.         end;
  68. }
复制代码

我设计了一套很简单的对话

分别区分了变量为0时,1-9时和为10时不同的情况

再然后,就需要对npc的出现和消失做处理

这里就需要使用到
donpcevent
  1. prontera,150,150,4        script        爱捉迷藏的小女孩#1        877,{
  2.         if(@ZMC == 0)
  3.         {
  4.                 mes "hi!";
  5.                 mes "尊敬的冒险者";
  6.                 mes "你愿意和我捉迷藏吗?";
  7.                 next;
  8.                 mes "你要找到我10次的话,我就会给你奖励哟!";
  9.                 set @ZMC,1;
  10.                 donpcevent "爱捉迷藏的小女孩#"+rand(2,3)+"::OnEnable";
  11.                 disablenpc "爱捉迷藏的小女孩#1";
  12.                 close;
  13.                 end;
  14.         }
  15.         if(@ZMC<10)
  16.         {
  17.                 if(@ZMC>0)
  18.                 {
  19.                         set @ZMC,@ZMC+1;
  20.                         mes "哎呀!竟然被发现了";
  21.                         mes "这是你第 "+@ZMC+" 次发现我拉!";
  22.                         donpcevent "爱捉迷藏的小女孩#"+rand(2,3)+"::OnEnable";
  23.                         disablenpc "爱捉迷藏的小女孩#1";
  24.                         close;
  25.                         end;
  26.                 }
  27.         }
  28.         if(@ZMC == 10)
  29.         {
  30.                 mes "哎呀呀呀~";
  31.                 mes "已经被找到10次了呢";
  32.                 mes "你还真是厉害呀!";
  33.                 mes "那我就把我收藏的宝物给你好了";
  34.                 getitem 969,10;
  35.                 set @ZMC,0;
  36.                 donpcevent "爱捉迷藏的小女孩#"+rand(2,3)+"::OnEnable";
  37.                 disablenpc "爱捉迷藏的小女孩#1";
  38.                 close;
  39.                 end;
  40.         }
  41.         end;
  42. OnInit:
  43.         end;
  44. OnEnable:
  45.         enablenpc "爱捉迷藏的小女孩#1";
  46.         end;
  47. OnDisable:
  48.         disablenpc "爱捉迷藏的小女孩#1";
  49.         end;
  50. }
  51. prontera,147,150,4        script        爱捉迷藏的小女孩#2        877,{
  52.         if(@ZMC == 0)
  53.         {
  54.                 mes "hi!";
  55.                 mes "尊敬的冒险者";
  56.                 mes "你愿意和我捉迷藏吗?";
  57.                 next;
  58.                 mes "你要找到我10次的话,我就会给你奖励哟!";
  59.                 set @ZMC,1;
  60.                 donpcevent "爱捉迷藏的小女孩#"+rand(2,3)+"::OnEnable";
  61.                 disablenpc "爱捉迷藏的小女孩#2";
  62.                 close;
  63.                 end;
  64.         }
  65.         if(@ZMC<10)
  66.         {
  67.                 if(@ZMC>0)
  68.                 {
  69.                         set @ZMC,@ZMC+1;
  70.                         mes "哎呀!竟然被发现了";
  71.                         mes "这是你第 "+@ZMC+" 次发现我拉!";
  72.                         donpcevent "爱捉迷藏的小女孩#"+rand(2,3)+"::OnEnable";
  73.                         disablenpc "爱捉迷藏的小女孩#2";
  74.                         close;
  75.                         end;
  76.                 }
  77.         }
  78.         if(@ZMC == 10)
  79.         {
  80.                 mes "哎呀呀呀~";
  81.                 mes "已经被找到10次了呢";
  82.                 mes "你还真是厉害呀!";
  83.                 mes "那我就把我收藏的宝物给你好了";
  84.                 getitem 969,10;
  85.                 set @ZMC,0;
  86.                 donpcevent "爱捉迷藏的小女孩#"+rand(2,3)+"::OnEnable";
  87.                 disablenpc "爱捉迷藏的小女孩#2";
  88.                 close;
  89.                 end;
  90.         }
  91.         end;
  92. OnInit:
  93.         disablenpc "爱捉迷藏的小女孩#2";
  94.         end;
  95. OnEnable:
  96.         enablenpc "爱捉迷藏的小女孩#2";
  97.         end;
  98. OnDisable:
  99.         disablenpc "爱捉迷藏的小女孩#2";
  100.         end;
  101. }
  102. prontera,144,150,4        script        爱捉迷藏的小女孩#3        877,{
  103.         if(@ZMC == 0)
  104.         {
  105.                 mes "hi!";
  106.                 mes "尊敬的冒险者";
  107.                 mes "你愿意和我捉迷藏吗?";
  108.                 next;
  109.                 mes "你要找到我10次的话,我就会给你奖励哟!";
  110.                 set @ZMC,1;
  111.                 donpcevent "爱捉迷藏的小女孩#"+rand(2,3)+"::OnEnable";
  112.                 disablenpc "爱捉迷藏的小女孩#3";
  113.                 close;
  114.                 end;
  115.         }
  116.         if(@ZMC<10)
  117.         {
  118.                 if(@ZMC>0)
  119.                 {
  120.                         set @ZMC,@ZMC+1;
  121.                         mes "哎呀!竟然被发现了";
  122.                         mes "这是你第 "+@ZMC+" 次发现我拉!";
  123.                         donpcevent "爱捉迷藏的小女孩#"+rand(2,3)+"::OnEnable";
  124.                         disablenpc "爱捉迷藏的小女孩#3";
  125.                         close;
  126.                         end;
  127.                 }
  128.         }
  129.         if(@ZMC == 10)
  130.         {
  131.                 mes "哎呀呀呀~";
  132.                 mes "已经被找到10次了呢";
  133.                 mes "你还真是厉害呀!";
  134.                 mes "那我就把我收藏的宝物给你好了";
  135.                 getitem 969,10;
  136.                 set @ZMC,0;
  137.                 donpcevent "爱捉迷藏的小女孩#"+rand(2,3)+"::OnEnable";
  138.                 disablenpc "爱捉迷藏的小女孩#3";
  139.                 close;
  140.                 end;
  141.         }
  142.         end;
  143. OnInit:
  144.         disablenpc "爱捉迷藏的小女孩#3";
  145.         end;
  146. OnEnable:
  147.         enablenpc "爱捉迷藏的小女孩#3";
  148.         end;
  149. OnDisable:
  150.         disablenpc "爱捉迷藏的小女孩#2";
  151.         end;
  152. }
复制代码

喔~好像发现最后有一个小错误

3号npc的隐藏事件里的npc名字编号写错了

最后~脚本看起来就像是这样的

在初始化时,2,3号npc会消失~1号npc出现

当玩家与npc对话以后,1号npc消失,2,3号随机一个出现

剩下的就是今天的作业了

分割线--------------------------------------


作业1:
在我最后发布的例子里,有一些错误,会导致脚本不能按照预期的功能运行,将那些错误修复以让脚本能按照预期的功能执行


作业2:
完成作业1以后,将npc数量从3个扩展到10个,同时将10个npc分布在不同的地方,做完这些以后测试脚本是否能够正常运行,预期的功能是否都能实现


作业3:
在完成作业1和作业2以后,思考一下,有什么方法能让脚本简化一下,脚本现在写了153行,在修改完以后~增加对话以后,可能会更长,有没有办法能让脚本变得精简一些~同时功能不缺失


选作作业:
完成作业1,作业2,作业3以后,尝试优化脚本,在功能不缺失的前提下,让脚本的行数尽量的减少
最后放上脚本一个。

001-从零开始学脚本-被尾随的小女孩.txt (2.28 KB, 下载次数: 1, 售价: 10 金钱)

贡献:66

金钱:28

威望:48

0

主题

38

帖子

332

积分

Rank: 3Rank: 3

发表于 2016-11-1 16:48:21 | 显示全部楼层
非常详细的脚本教学,受益匪浅,万分感谢,希望将来有更多这样的好的教学文章

贡献:583

金钱:232

威望:332

0

主题

89

帖子

2245

积分

Rank: 5Rank: 5

发表于 2017-1-13 13:31:50 | 显示全部楼层
好文章 就是要頂

贡献:22

金钱:10

威望:20

0

主题

19

帖子

132

积分

Rank: 2

发表于 2017-2-10 03:33:49 | 显示全部楼层
好文章 就是要頂
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为兴趣而生…… 立即登录 立即注册
TOP

从零开始学脚本 - 8.enablenpc和disablenpc

今天是这个阶段最后一课拉 该做点东西出来了呢 今天要实现 ...

温馨提示:手机扫描二维码继续浏览

快速回复 返回顶部 返回列表