多语言展示
当前在线:1810今日阅读:27今日分享:41

冒险岛单机版简单的编写NPC脚本

冒险岛单机版的玩家作为游戏里的GM,能随意调用各种权限与GM工具操作游戏内的数据。如果想让游戏本身的功能性可玩性更强,有能力的玩家可以改写游戏数据,下面我们来简单了解下如何改写添加游戏中NPC的功能:编写NPC脚本。
工具/原料
1

一个编程的思维

2

或者一个修改其他脚本代码的思维

3

冒险岛代码查询器

4

电脑

方法/步骤
1

首先各个冒险岛单机版版本的NPC文件一般都在服务端的\scripts\npc文件夹中,其中文件的名字对应游戏中NPC的代码:也就是说如果游戏中射手村村长长老斯坦的ID是:1012003,你只要修改\scripts\npc\1012003文件就能改变这个NPC的作用。(如果你发现没有这段代码你可以把其他文件重命名改成这个代码试试)

2

因为可能会编程的人是少数,我们就来简单分析个例子。下图是一个简单的实现在NPC对话中,点击选项栏中的"测试给我15星",给玩家15星强化卷轴的代码。其中只要大家细细琢磨下,会发现里面的"2049349"是物品的ID,而后面的5代表给的数量,因为"2049349"是15星强化卷轴的ID,所以会给15星强化卷。如果我们改成其他物品的ID,那么就会给那个物品了。(看到这个文件的名字了吗,那是NPC代码,你想哪个NPC实现这个代码的功能,就改成那个NPC的ID放进\scripts\npc中,主义文件后缀不是txt哦。)

3

下面我把代码贴出来大家可以试验试验。function start() { cm.sendSimple ("领取物品:  #L0##r1:测试给我15星 #k\r\n");}function action(mode, type, selection) { cm.dispose(); if (selection == 0) { cm.gainItem(2049349, 5 );  }else { cm.dispose(); }}

4

再把个多重选项的代码贴出来,能活用上面的代码时改这个应该不难了。var status = 0;function start() {    status = -1;    action(1, 0, 0);}function action(mode, type, selection) {    if (status == 0 && mode == 0) {        cm.dispose();        return;    }    if (mode == 1) {        status++;    } else {        status--;    }    if (status == 0) {        var selStr = "领取会员福利:\r\n点击领取哦\r\n#b#L0#日常极品#l\r\n#L1#漩涡双手剑#l\r\n#L2#突破百万之石#l\r\n#L3#手套攻击卷轴#l\r\n#L4#漩涡弓#l\r\n#b#L5#漩涡双弩#l\r\n#b#L6#肃清者套装#l\r\n#b#L7#暗炎赎罪者套装#l\r\n#b#L8#漩涡套装#l\r\n#b#L9#奥尔卡套装#l\r\n#b#L10#漩涡恶魔剑#l\r\n#b#L11#漩涡手杖#l\r\n#b#L12#漩涡灵魂手铳#l\r\n#b#L13#漩涡长杖#l\r\n#b#L14#先代狂龙战士套装#l\r\n#b#L15#漩涡匕首#l\r\n#b#L16#斯乌套装#l\r\n#b#L17#漩涡锁链剑#l\r\n#b#L18#死亡之刃套装#l";        cm.sendSimple(selStr);    } else if (status == 1) {        switch (selection) {        case 0:            if (cm.getMeso() >= 1) {                cm.gainItem(1112312,1)                cm.gainItem(1112495,1)                cm.gainItem(1112763,1)                cm.gainItem(1112597,1)                cm.gainItem(1113028,1)                cm.gainItem(1132246,1)                cm.gainItem(1122267,1)                cm.gainItem(1032223,1)                cm.gainItem(1113075,1)                cm.gainItem(1202031,1)                cm.gainItem(1202083,1)                cm.gainItem(1202023,1)                cm.gainItem(1672027,1)                cm.gainItem(1142788,1)                cm.gainItem(1182147,1)                cm.gainItem(1122076,1)                cm.gainItem(2041200,3)                cm.gainItem(1022232,1)                cm.gainItem(1012478,1)                cm.gainItem(1190407,1)                cm.gainItem(4032933,1)                cm.gainItem(1162025,1)                cm.gainItem(1152170,1)                cm.gainItem(2000005,300)                cm.gainItem(2050004,300)                cm.gainItem(4001017,100)                cm.gainItem(4031179,100)            } else {                cm.sendOk("金币不足");            }            break;        case 1:            if (cm.getMeso() >= 1) {                cm.gainItem(1402220,1)            } else {                cm.sendOk("金币不足");            }            break;        case 2:            if (cm.getMeso() >= 1) {                cm.gainItem(2614019,100);            } else {                cm.sendOk("金币不足");            }            break;        case 3:            if (cm.getMeso() >= 1) {                cm.gainItem(2040804,100);                cm.gainItem(2040805,100);                cm.gainItem(2040810,100);                cm.gainItem(2040811,100);            } else {                cm.sendOk("金币不足");            }            break;        case 4:            if (cm.getMeso() >= 1) {                cm.gainItem(1452226,1)                cm.gainItem(2061008,9999)                cm.gainItem(2061008,9999)                cm.gainItem(2061008,9999)                cm.gainItem(2061008,9999)                cm.gainItem(2061008,9999)                cm.gainItem(2061008,9999)                cm.gainItem(2061008,9999)                cm.gainItem(2061008,9999)                cm.gainItem(2061008,9999)                cm.gainItem(2061008,9999)                cm.gainItem(2061008,9999)                cm.gainItem(2061008,9999)            } else {                cm.sendOk("金币不足");            }            break;        case 5:            if (cm.getMeso() >= 1) {                cm.gainItem(1522113,1)            } else {                cm.sendOk("金币不足");            }            break;        case 6:            if (cm.getMeso() >= 1) {                cm.gainMeso( - 1);                cm.gainItem(1052709,1)                cm.gainItem(1004095,1)                cm.gainItem(1102671,1)                cm.gainItem(1072911,1)                cm.gainItem(1702490,1)            } else {                cm.sendOk("金币不足");            }            break;        case 7:            if (cm.getMeso() >= 1) {              cm.gainItem(1102605,1)              cm.gainItem(1052643,1)              cm.gainItem(1072848,1)              cm.gainItem(1003934,1)            } else {                cm.sendOk("金币不足");            }            break;        case 8:            if (cm.getMeso() >= 1) {                cm.gainItem(1003976,1)                cm.gainItem(1102623,1)                cm.gainItem(1082556,1)                cm.gainItem(1052669,1)                cm.gainItem(1072870,1)            } else {                cm.sendOk("金币不足");            }            break;        case 9:            if (cm.getMeso() >= 1) {                cm.gainItem(1003390,1)                cm.gainItem(1003533,1)                cm.gainItem(1004146,1)                cm.gainItem(1052416,1)                cm.gainItem(1052360,1)                cm.gainItem(1072622,1)                } else {                cm.sendOk("金币不足");            }            break;        case 10:            if (cm.getMeso() >= 1) {               cm.gainItem(1232084,1)             } else {                cm.sendOk("金币不足");            }            break;        case 11:            if (cm.getMeso() >= 1) {               cm.gainItem(1362109,1)                cm.gainItem(1702120,1)            } else {                cm.sendOk("金币不足");            }            break;        case 12:            if (cm.getMeso() >= 1) {                cm.gainItem(1222084,1)             } else {                cm.sendOk("金币不足");            }            break;       case 13:            if (cm.getMeso() >= 1) {                cm.gainItem(1382231,1)                 cm.gainItem(1092089,1)                 cm.gainItem(1092106,1)             } else {                cm.sendOk("金币不足");            }            break;       case 14:            if (cm.getMeso() >= 1) {                cm.gainItem(1003625,1)                 cm.gainItem(1052532,1)                 cm.gainItem(1072751,1)             } else {                cm.sendOk("金币不足");            }            break;      case 15:            if (cm.getMeso() >= 1) {                cm.gainItem(1332247,1)                 cm.gainItem(1092049,1)                 cm.gainItem(1342082,1)             } else {                cm.sendOk("金币不足");            }            break;     case 16:            if (cm.getMeso() >= 1) {                cm.gainItem(1004140,1)                 cm.gainItem(1052576,1)                 cm.gainItem(1072783,1)                 cm.gainItem(1004336,1)                 cm.gainItem(1052852,1)             } else {                cm.sendOk("金币不足");            }            break;     case 17:            if (cm.getMeso() >= 1) {               cm.gainItem(1242090)             } else {                cm.sendOk("金币不足");            }            break;    case 18:            if (cm.getMeso() >= 1) {               cm.gainItem(1702565,1)                cm.gainItem(1102809,1)                cm.gainItem(1004450,1)                cm.gainItem(1073041,1)             } else {                cm.sendOk("金币不足");            }            break;    case 19:            if (cm.getMeso() >= 1) {              cm.setEnhance(1);            } else {                cm.sendOk("金币不足");            }            break;        }        cm.dispose();    }}

5

以上的内容仅供非编程人员参考,这里贴出基本语法,有更多想法的同学可以琢磨琢磨哦。格式:cm.[Commands]dispose对话结束示例:cm.dispose();sendNext显示一个带“继续”按钮的对话窗口示例:cm.sendNext("[text]");sendPrev显示一个带“返回”按钮的对话窗口示例:cm.sendPrev("[text]");sendNextPrev显示一个带“继续”和“返回”按钮的对话窗口示例:cm.sendNextPrev("[text]");sendOk显示一个带“好”按钮的对话窗口示例:cm.sendOk("[text]");sendYesNo显示一个带“是”和“否”按钮的对话窗口,选“否”结束对话,否则做相反处理。示例:cm.sendYesNo("[text]");sendAcceptDecline显示一个带“接受”和“拒绝”按钮的对话窗口,选“拒绝”结束对话,否则做相反处理。示例:cm.sendAcceptDecline("[text]");sendSimple显示一个无按钮的对话窗口示例:cm.sendAcceptSimple("[text]");sendStyle显示一个选择性的对话窗口示例:cm.sendStyle("[Text]", [variable]); //需要声明一个变量warp传送玩家到指定地图  示例:cm.warp([mapid], [portal]); //[portal]位置值,默认为0openShop打开一个商店窗口示例:cm.openShop([shopid]);haveItem检查玩家是否具有指定物品示例:cm.haveItem([itemid]); //物品栏和装备栏gainItem给予或取走玩家指定物品示例:cm.gainItem([itemid],[ammount]); //-[ammount]表示取走数量changeJob改变玩家职业示例:cm.changeJob([jobid]);getJob取得玩家职业值示例:cm.getJob();startQuest开始任务示例:cm.startQuest([questid]);completeQuest完成任务示例:cm.completeQuest([questid]);forfeitQuest解除任务示例:cm.forfeitQuest([questid]);getMeso取得玩家金币数量值示例:cm.getMeso();gainMeso给予或取走玩家指定数量金币示例:cm.gainMeso([ammount]); //-[ammount]表示取走数量gainExp给予或取走玩家指定数量经验值示例:cm.gainExp([ammount]); //-[ammount]表示取走数量getLevel取得玩家等级值示例:cm.getLevel();teachSkill给予玩家指定技能示例:cm.teachSkill([skillid],[skilllevel],[maxskilllevel]);//[skillid]技能代码  [skilllevel]技能等级  [maxskilllevel]等级上限isGM判断玩家是否为GM示例:cm.isGM();get[Stat]取得玩家状态值示例:cm.get[Stat](); //[Stat]值的顺序为:HP, MP, STR, DEX, INT, LUK#k 黑色字#e 粗体字#b 蓝色字#d 紫色字#g 绿色字#r 红色字#n 普通字(移除粗体)#c[itemid]# 显示为玩家物品栏里指定物品的数量#f[imagelocation]# 引用.wz文件里的图片#h # 显示为玩家名字#l - Selection close.选择关闭?(不知道什么意思)#L[number]# - Selection open.选择打开?#m[mapid]# 显示为地图名称#o[mobid]# 显示为怪物名称#p[npcid]# 显示为NPC名称#q[skillid]# 显示为技能名称#s[skillid]# 显示为技能图标#t[itemid]# 显示为物品名称#z[itemid]# 显示为物品名称#v[itemid]# 显示为物品图标#i[itemid]# 显示为物品图片#x 显示为0%(不知道什么意思)#B[%]# 显示为一个进度条\r\n 在下一行显示

注意事项
1

如果编写的程序有错误点击NPC会弹出。

2

代码基于冒险岛单机版v124版本

推荐信息