jifeng77s 发表于 2016-7-3 00:57:27

1111111111111

MA20221 发表于 2016-7-3 10:45:26

哈哈哈哈哈哈哈哈

杜子藤丶 发表于 2016-7-4 02:18:51

看看啊看

小灬谢 发表于 2016-7-4 18:37:35

受教了

Alborada 发表于 2016-7-4 20:13:18

看看

lihuan57 发表于 2016-7-5 02:21:45

啊萨达萨达萨达

大叔的儿子 发表于 2016-7-5 02:35:22

长篇基础技术介绍——WZ资源解压修改

liu2630083 发表于 2016-7-6 00:27:30

更符合法规和规范化冯国华

as12345 发表于 2016-7-16 00:56:59

授人以渔】长篇基础技术介绍——JS NPC脚本篇   [复制链接]
nil

175
帖子       
19
主题       
155
积分

侠客
威望17 点冒险币805 个贡献值0 点好评度0 点
原创先锋奖助人为乐奖新人进步奖
发消息       
电梯直达
跳转到指定楼层 楼主
发表于 2013-3-11 14:48:02 | 只看该作者 回帖奖励
本帖最后由 nil 于 2013-3-12 23:46 编辑


由于个人能力有限,如有错误请指出,谢谢

本帖隐藏的内容

大家好,这次讲的是NPC脚本..
NPC脚本有两个东西 一个是 NPCScriptManager 另一个 是 NPCConversationManager
对于 NPCScriptManager 他是用来维护NPC脚本的 有一个保存 脚本的 表 cms , NPCConversationManager 是我们用cm.函数 可以调用的所有函数都在里面
NPCScriptManager 有个 start 函数,上次有个人 通过修改这个函数 达到对 所有不存在脚本的NPC 实现 提示
他的内部逻辑是 查找 NPC 脚本 npc目录下 id.js文件 执行,并调用 start函数,是没有参数的
iv.invokeFunction("start", new Object);
如果没有这个函数的话就会调用 action 参数的是 1 0 0
iv.invokeFunction("action", new Object[] { Byte.valueOf(1), Byte.valueOf(0), Integer.valueOf(0) });
还有三个和任务相关的 函数 我在任务脚本时候讲
另外是一个action函数
他的作用是调用 action 函数
cm.getIv().invokeFunction("action", new Object[] { Byte.valueOf(mode), Byte.valueOf(type), Integer.valueOf(selection) });
这里的3个函数是这个函数传入的

我们再来看下 start 和 action 是怎么被 服务端 调用的
这两个函数在NPCHandler中被调用
当你点NPC后调用 NPCTalk 他调用start 并传入对用 的npcid
当你继续点NPC后调用 NPCMoreTalk 调用action
NPCScriptManager.getInstance().action(c, action, lastMsg, selection);
c不要管,
final byte lastMsg = slea.readByte(); // 00 (last msg type I think) 最后一次的消息类型   
final byte action = slea.readByte(); // 00 = end chat, 01 == follow 结束对话 继续对话是否 按钮或者上一页 下一页
selection = slea.readByte();//选择的,用属性文本实现
-1会被服务端处理掉,所以从0开始
所以综上所说,当你点击NPC时,打开脚本,执行全局数据,再执行start,没有就执行 action (1,0,0) ,如果你有选项,继续交谈,就有
NPCMoreTalk 调用 action ,当然这里是说没任务情况下

好,下面介绍NPCConversationManager里边的函数
你可以在脚本里用cm.函数名调用

public void sendNextPrev(String text)
public void sendNextPrev(String text, int id)
   这两个是 带 上一页 下一页 按钮的对话框 ,截图下次介绍 属性文本的时候一起发,可有npcid也可以没有
public void sendOk(String text)
public void sendOk(String text, int id)
   这种是只有个确认的那种对话框

public void sendYesNo(String text)
public void sendYesNo(String text, int id)
带是否 按钮的
public void askAcceptDecline(String text) =sendAcceptDecline
public void askAcceptDeclineNoESC(String text) =sendAcceptDeclineNoESC
public void askAcceptDecline(String text, int id)
public void askAcceptDeclineNoESC(String text, int id)

   有接受的对话框,下面那个不能按esc取消的

public void sendSimple(String text)
public void sendSimple(String text, int id)

最简单的那种,万能npc用的那个

sendNext(String text) 有继续的那种
sendPrev(String text) 返回的那种

sendGetNumber(String text, int def, int min, int max)
可以输入数字的对话框,文字,默认值,最小,最大
public void sendGetText(String text)
public void sendGetText(String text, int id)
可以输入文字的对话框
public void setHair(int hair)
public void setFace(int face)
public void setSkin(int color)
public void setAndroidHair(int hair)
public void setAndroidFace(int face)
public void setAndroidSkin(int skin)
分别是设置机子的头发 脸 皮肤 和机器人的

public void openShop(int id)
public void openShopNPC(int id)
打开商店,商店NPC 后面是npcid
changeJob(int job)
改变职业
public boolean isValidJob(int id)
返回职业是否有效
public String getJobNameById(int id)
通过职业id返回职业的中文名字
startQuest(int idd)
completeQuest(int idd)
forceStartQuest(int idd)
forceCompleteQuest(int idd)

开始和完成任务,下面两个是强制的
gainAp(int amount)
获得AP点
unequipEverything()
拿下装备
clearSkills()
清空技能
public boolean hasSkill(int skillid)
返回是否有这个技能

public void increaseGuildCapacity(boolean trueMax)
增加家族容量
displayGuildRanks()
显示家族排名

disbandGuild()
取消家族

public void changeStat(byte slot, int type, int amount)
changePotentialStat(byte slot, int type, int amount)

改变身上装备的属性 和潜在属性 参数太多 不建议用

public void sendPVPWindow()

public void sendPartyWindow()

public void sendRepairWindow()
public void sendProfessionWindow()

public void sendEventWindow()

打开各种窗口
maxStats()
人物属性加满 这个满是他设置的比较大的值


maxAllSkills()
maxSkillsByJob()
加满技能 和本职业技能

public boolean isEligibleName(String t)
检查是否是合法的名称

handleDivorce()
离婚

int getMoney()
查银行里的钱

public int addMoney(int money, int type)
银行加钱,如果 type为1 银行钱多于money就不加

public String checkDrop(int mobId)

检查掉率,返回可以sendok之类的字符串
public String getPotentialInfo(int id)
判断装备潜能,返回可以send 的字符串

public Equip getEquip(int itemid)
获取装备返回的是一个装备对象
public void setExpiration(Object statsSel, long expire)
设置装备的有效期 第一个是上面那个返回的 后面那个单位是天

public void renewPotential(int type)
这个是装备对象的函数 改变潜能品质
getEquip(100000).renewPotential(4)

public boolean isCash(int itemId)
判断是否为现金装备

public short getSpace(byte type)
获取某一类物品的剩余空间
比如想知道玩家 装备背包还有多少剩余

public MapleCharacter getCharByName(String name)

通过角色名获取角色对象
下个帖子我会把各种id之类的梳理一遍,相关的对象也会说明下

public MapleClient getClient()
获取服务器对象
public String EquipList(MapleClient c)
public String CashList(MapleClient c)
查整个服务器的装备列表和现金道具列表





public int getHour()
public int getMin()
public int getSec()

获取服务器时间


int countMonster()
地图怪的数量


cm.dispose()
结束,不能再调用任何cm的函数

--------------------------------------------------------------------------------------------------------
下面这个是所有cm qm都具有的 在AbstractPlayerInteraction里的

public void spawnMobOnMap(int id, int qty, int x, int y, int map)
在特定地图刷怪 怪id 数量,坐标,地图


killAllMob()
清怪

public String getName()
用户名
public boolean haveItem(int itemid)
判断是否有物品
public boolean canHold(int itemid)
判断是否可以拿某个物品
public int getJob()
职业id

public int getLevel()
等级
public void gainItem(int id, short quantity)
获取道具 数量
boolean removeItem(int id)
删除道具
warp(int map)
warp(int map,int portal)

传送,portal是传送点,0为默认

public void gainMeso(int gain)
拿钱
public void gainExp(int gain)
拿经验
public void openNpc(int id)
打开npc
public int getMapId()
地图号
public int getChannelNumber()
频道号
public int getMonsterCount(int mapid)
public int getPlayerCount(int mapid)
地图怪数量 玩家数量
public void teachSkill(int id, int level, byte masterlevel)
public void teachSkill(int id, int level)
学习技能,技能id,最高技能等级,掌握的等级
public void setVip(int vip)
public void setVip(int vip, long period)
设置vip
public int getVip()
vip等级
public boolean isVip()
是否vip
public void setViptime(long period)
设置vip时间
public void openWeb(String web)
打开网页
public boolean isCanPvp()
频道是否可以pvp
public int getGMLevel()
gm等级
public void changeSex()
变性


其他还有好多,参照其他人的脚本学习

as12345 发表于 2016-7-16 00:57:01

授人以渔】长篇基础技术介绍——JS NPC脚本篇   [复制链接]
nil

175
帖子       
19
主题       
155
积分

侠客
威望17 点冒险币805 个贡献值0 点好评度0 点
原创先锋奖助人为乐奖新人进步奖
发消息       
电梯直达
跳转到指定楼层 楼主
发表于 2013-3-11 14:48:02 | 只看该作者 回帖奖励
本帖最后由 nil 于 2013-3-12 23:46 编辑


由于个人能力有限,如有错误请指出,谢谢

本帖隐藏的内容

大家好,这次讲的是NPC脚本..
NPC脚本有两个东西 一个是 NPCScriptManager 另一个 是 NPCConversationManager
对于 NPCScriptManager 他是用来维护NPC脚本的 有一个保存 脚本的 表 cms , NPCConversationManager 是我们用cm.函数 可以调用的所有函数都在里面
NPCScriptManager 有个 start 函数,上次有个人 通过修改这个函数 达到对 所有不存在脚本的NPC 实现 提示
他的内部逻辑是 查找 NPC 脚本 npc目录下 id.js文件 执行,并调用 start函数,是没有参数的
iv.invokeFunction("start", new Object);
如果没有这个函数的话就会调用 action 参数的是 1 0 0
iv.invokeFunction("action", new Object[] { Byte.valueOf(1), Byte.valueOf(0), Integer.valueOf(0) });
还有三个和任务相关的 函数 我在任务脚本时候讲
另外是一个action函数
他的作用是调用 action 函数
cm.getIv().invokeFunction("action", new Object[] { Byte.valueOf(mode), Byte.valueOf(type), Integer.valueOf(selection) });
这里的3个函数是这个函数传入的

我们再来看下 start 和 action 是怎么被 服务端 调用的
这两个函数在NPCHandler中被调用
当你点NPC后调用 NPCTalk 他调用start 并传入对用 的npcid
当你继续点NPC后调用 NPCMoreTalk 调用action
NPCScriptManager.getInstance().action(c, action, lastMsg, selection);
c不要管,
final byte lastMsg = slea.readByte(); // 00 (last msg type I think) 最后一次的消息类型   
final byte action = slea.readByte(); // 00 = end chat, 01 == follow 结束对话 继续对话是否 按钮或者上一页 下一页
selection = slea.readByte();//选择的,用属性文本实现
-1会被服务端处理掉,所以从0开始
所以综上所说,当你点击NPC时,打开脚本,执行全局数据,再执行start,没有就执行 action (1,0,0) ,如果你有选项,继续交谈,就有
NPCMoreTalk 调用 action ,当然这里是说没任务情况下

好,下面介绍NPCConversationManager里边的函数
你可以在脚本里用cm.函数名调用

public void sendNextPrev(String text)
public void sendNextPrev(String text, int id)
   这两个是 带 上一页 下一页 按钮的对话框 ,截图下次介绍 属性文本的时候一起发,可有npcid也可以没有
public void sendOk(String text)
public void sendOk(String text, int id)
   这种是只有个确认的那种对话框

public void sendYesNo(String text)
public void sendYesNo(String text, int id)
带是否 按钮的
public void askAcceptDecline(String text) =sendAcceptDecline
public void askAcceptDeclineNoESC(String text) =sendAcceptDeclineNoESC
public void askAcceptDecline(String text, int id)
public void askAcceptDeclineNoESC(String text, int id)

   有接受的对话框,下面那个不能按esc取消的

public void sendSimple(String text)
public void sendSimple(String text, int id)

最简单的那种,万能npc用的那个

sendNext(String text) 有继续的那种
sendPrev(String text) 返回的那种

sendGetNumber(String text, int def, int min, int max)
可以输入数字的对话框,文字,默认值,最小,最大
public void sendGetText(String text)
public void sendGetText(String text, int id)
可以输入文字的对话框
public void setHair(int hair)
public void setFace(int face)
public void setSkin(int color)
public void setAndroidHair(int hair)
public void setAndroidFace(int face)
public void setAndroidSkin(int skin)
分别是设置机子的头发 脸 皮肤 和机器人的

public void openShop(int id)
public void openShopNPC(int id)
打开商店,商店NPC 后面是npcid
changeJob(int job)
改变职业
public boolean isValidJob(int id)
返回职业是否有效
public String getJobNameById(int id)
通过职业id返回职业的中文名字
startQuest(int idd)
completeQuest(int idd)
forceStartQuest(int idd)
forceCompleteQuest(int idd)

开始和完成任务,下面两个是强制的
gainAp(int amount)
获得AP点
unequipEverything()
拿下装备
clearSkills()
清空技能
public boolean hasSkill(int skillid)
返回是否有这个技能

public void increaseGuildCapacity(boolean trueMax)
增加家族容量
displayGuildRanks()
显示家族排名

disbandGuild()
取消家族

public void changeStat(byte slot, int type, int amount)
changePotentialStat(byte slot, int type, int amount)

改变身上装备的属性 和潜在属性 参数太多 不建议用

public void sendPVPWindow()

public void sendPartyWindow()

public void sendRepairWindow()
public void sendProfessionWindow()

public void sendEventWindow()

打开各种窗口
maxStats()
人物属性加满 这个满是他设置的比较大的值


maxAllSkills()
maxSkillsByJob()
加满技能 和本职业技能

public boolean isEligibleName(String t)
检查是否是合法的名称

handleDivorce()
离婚

int getMoney()
查银行里的钱

public int addMoney(int money, int type)
银行加钱,如果 type为1 银行钱多于money就不加

public String checkDrop(int mobId)

检查掉率,返回可以sendok之类的字符串
public String getPotentialInfo(int id)
判断装备潜能,返回可以send 的字符串

public Equip getEquip(int itemid)
获取装备返回的是一个装备对象
public void setExpiration(Object statsSel, long expire)
设置装备的有效期 第一个是上面那个返回的 后面那个单位是天

public void renewPotential(int type)
这个是装备对象的函数 改变潜能品质
getEquip(100000).renewPotential(4)

public boolean isCash(int itemId)
判断是否为现金装备

public short getSpace(byte type)
获取某一类物品的剩余空间
比如想知道玩家 装备背包还有多少剩余

public MapleCharacter getCharByName(String name)

通过角色名获取角色对象
下个帖子我会把各种id之类的梳理一遍,相关的对象也会说明下

public MapleClient getClient()
获取服务器对象
public String EquipList(MapleClient c)
public String CashList(MapleClient c)
查整个服务器的装备列表和现金道具列表





public int getHour()
public int getMin()
public int getSec()

获取服务器时间


int countMonster()
地图怪的数量


cm.dispose()
结束,不能再调用任何cm的函数

--------------------------------------------------------------------------------------------------------
下面这个是所有cm qm都具有的 在AbstractPlayerInteraction里的

public void spawnMobOnMap(int id, int qty, int x, int y, int map)
在特定地图刷怪 怪id 数量,坐标,地图


killAllMob()
清怪

public String getName()
用户名
public boolean haveItem(int itemid)
判断是否有物品
public boolean canHold(int itemid)
判断是否可以拿某个物品
public int getJob()
职业id

public int getLevel()
等级
public void gainItem(int id, short quantity)
获取道具 数量
boolean removeItem(int id)
删除道具
warp(int map)
warp(int map,int portal)

传送,portal是传送点,0为默认

public void gainMeso(int gain)
拿钱
public void gainExp(int gain)
拿经验
public void openNpc(int id)
打开npc
public int getMapId()
地图号
public int getChannelNumber()
频道号
public int getMonsterCount(int mapid)
public int getPlayerCount(int mapid)
地图怪数量 玩家数量
public void teachSkill(int id, int level, byte masterlevel)
public void teachSkill(int id, int level)
学习技能,技能id,最高技能等级,掌握的等级
public void setVip(int vip)
public void setVip(int vip, long period)
设置vip
public int getVip()
vip等级
public boolean isVip()
是否vip
public void setViptime(long period)
设置vip时间
public void openWeb(String web)
打开网页
public boolean isCanPvp()
频道是否可以pvp
public int getGMLevel()
gm等级
public void changeSex()
变性


其他还有好多,参照其他人的脚本学习
页: 68 69 70 71 72 73 74 75 76 77 [78] 79 80 81 82 83 84 85 86 87
查看完整版本: 【授人以渔】长篇基础技术介绍——JS 属性文本