冒险岛单机版简单的编写NPC脚本
的有关信息介绍如下:冒险岛单机版的玩家作为游戏里的GM,能随意调用各种权限与GM工具操作游戏内的数据。如果想让游戏本身的功能性可玩性更强,有能力的玩家可以改写游戏数据,下面我们来简单了解下如何改写添加游戏中NPC的功能:编写NPC脚本。
首先各个冒险岛单机版版本的NPC文件一般都在服务端的\scripts\npc文件夹中,其中文件的名字对应游戏中NPC的代码:也就是说如果游戏中射手村村长长老斯坦的ID是:1012003,你只要修改\scripts\npc\1012003文件就能改变这个NPC的作用。(如果你发现没有这段代码你可以把其他文件重命名改成这个代码试试)
因为可能会编程的人是少数,我们就来简单分析个例子。下图是一个简单的实现在NPC对话中,点击选项栏中的"测试给我15星",给玩家15星强化卷轴的代码。其中只要大家细细琢磨下,会发现里面的"2049349"是物品的ID,而后面的5代表给的数量,因为"2049349"是15星强化卷轴的ID,所以会给15星强化卷。如果我们改成其他物品的ID,那么就会给那个物品了。(看到这个文件的名字了吗,那是NPC代码,你想哪个NPC实现这个代码的功能,就改成那个NPC的ID放进\scripts\npc中,主义文件后缀不是txt哦。)
下面我把代码贴出来大家可以试验试验。
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();
}
}
再把个多重选项的代码贴出来,能活用上面的代码时改这个应该不难了。
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();
}
}
以上的内容仅供非编程人员参考,这里贴出基本语法,有更多想法的同学可以琢磨琢磨哦。
格式: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]位置值,默认为0
openShop
打开一个商店窗口
示例: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 在下一行显示