📦 物品出处完全教程

本服(v079)里「一件物品到底从哪来」一次讲清楚 —— 全部以 scripts 目录里的真实脚本为例

基于 scripts/ 目录 真实代码示例 与查询器联动 记事本即可改

⚠ 先看:怎么知道一个物品「从哪来」

  1. 开 GM100 权限:把角色设为 GM100 管理员权限。
  2. 游戏里看物品来源:对着物品点「查看」,或把鼠标放到查询器列表的「掉落 / 来源」那列,会显示这东西由哪些怪物掉、哪些 NPC 给。
  3. 找不到就搜脚本:打开服务端 scripts 文件夹,搜物品 ID(如 2000002)或脚本名,就能定位到发放它的那个 .js(这个方法在 NPC 修改教程里也用过)。

一、本服物品有 5 大出处

一句话:游戏里每一件能拿到的东西,都从下面 5 个渠道进背包。知道这 5 个,查任何物品出处都不迷路。

来源怎么拿到对应代码 / 文件在查询器里看哪
① 怪物掉落打怪爆出drop_data.sql 掉落表「掉落 / 来源」列(悬停看爆物)
② NPC 商店点 NPC 开商店买cm.openShop(商店ID) ,在 scripts/npc/*.js—
③ NPC 发放 / 兑换做任务、在线时长、用元宝/材料换cm.gainItem(...) ,在 scripts/special/*.js—
④ 活动 / 副本打 BOSS、过活动scripts/event/*.js 、quest 脚本—
⑤ 中枢 NPC:聚合功能一个 NPC 串起上面所有来源scripts/special/聚合功能.js点它就能到 ② ③ ④
记忆口诀:怪掉、店买、NPC 发、活动给、聚合串 —— 五条路,照着查。

二、来源①:怪物掉落(查「掉落 / 来源」列)

这是最基础的出处。本服的掉落数据在 drop_data.sql,查询器已经直接接好了:

掉落数据来自服务端数据库,不在 NPC 脚本里改。要加掉落得动 drop_data 表,本文不展开。

三、来源②:NPC 商店(openShop)

很多 NPC 脚本里一句 cm.openShop(数字) 就弹出一个商品列表。比如「聚合功能」里直接开商店:

// 聚合功能.js 里的一段:case 命中后打开编号 57 的商店
case 某编号:
    cm.dispose();
    cm.openShop(57);   // 57 是商店表的 ID,对应一份商品清单

商店的真正商品清单在服务端的「商店表」里(按 57 这种 ID 查),NPC 脚本只负责「把这个商店开出来」。想知道某商店卖什么,找对应 openShop 的数字、再去商店表查即可。

本服 scripts/npc/ 下大量脚本都用到 openShop(如各职业转职官、杂货商等),它们就是「NPC 商店」这种出处。

四、来源③:NPC 发放 / 兑换(gainItem)—— 本服最丰富的可玩来源

scripts/special/ 里一堆脚本靠 cm.gainItem(物品ID, 数量) 把东西放进你背包。下面全是本服真实代码。

例 1 · 在线奖励.js —— 按在线时长发

// 在线满 60 分钟领「永久雇佣商人」
if(cm.getPlayer().getGamePoints() >= 60 && cm.getPlayer().getGamePointsPD() == 0){
    cm.gainItem(5030001, 1);     // 永久雇佣商人 x1
}
// 在线满 120 / 180 / 240 … 分钟继续发:
cm.gainItem(2000002, 100);  // 红药水 x100
cm.gainItem(2000003, 100);  // 蓝药水 x100
cm.gainItem(5040000, 2);    // 瞬移石头 x2
cm.gainItem(5220040, 3);    // 飞天猪的蛋 x3
cm.gainItem(4001197, 100);  // 强化石 x100

例 2 · 首充奖励.js —— 选一件武器发

// 先列一个「可发清单」,[物品ID, 数量]
var reqlist = Array(
  Array(1372046,1),  // 短杖
  Array(1332081,1),  // 短剑
  Array(1402053,1),  // 双手剑 ...
);
// 玩家选第几个,就发那把武器
var wuqi = reqlist[selection][0];
cm.gainItem(null, wuqi, 0,0,3,3, ...);

例 3 · 元宝商城.js —— 用元宝买

// jmsz 数组:[物品ID, 价格(元宝), 数量, ?, 名称]
var jmsz = Array(
  Array(5220040,1,1,"未定义","飞天猪的蛋"),
  Array(4002000,1,1,"未定义","绿蜗牛邮票"),
  Array(5200002,5,1,"未定义","金币包"),  // ……
);

本服 special/ 里常见的发放 / 兑换脚本

脚本它给什么触发方式
在线奖励.js药水/石头/强化石等(按在线时长)在线满 N 分钟领
首充奖励.js任选一把武器首次充值
元宝商城.js飞天猪蛋/洗蓝洗血/邮票/金币包/祝福…花元宝买
高级点装.js点装类装备兑换/购买
骑宠抽奖.js骑宠抽奖
兑换2043201.js 等一串「兑换XXXX.js」用旧物品换新物品拿材料/碎片去换
黄金换枫叶.js / 金杯纪念币兑换.js / 国庆币换点券.js货币互相兑换拿对应货币换
龙魂戒指打造.js / SS级戒指.js / 钓鱼戒指升级.js成品装备/戒指打造/升级
鉴定.js / 修复强化.js / 革命装备.js装备加工后的产物加工行为产出
这些脚本就是「NPC 发放 / 兑换」出处的全部家底——查一个物品是不是这儿出的,直接搜 gainItem(物品ID 即可命中。

五、来源④:活动 / 副本(event / quest)

打 BOSS、过活动给的物品,来自 scripts/event/ 和任务脚本。比如 scripts/event/bosspq.js 这种 BOSS 副本,通关后用同样的 gainItem 发奖励。要查这类出处,就去找对应的 event / quest 脚本搜物品 ID。

六、来源⑤:中枢 NPC「聚合功能」—— 一个 NPC 串起所有出处

游戏里点「拍卖」就是打开「聚合功能」这个 NPC(聊天窗口会显示名字「聚合功能」)。它本身不囤货,而是把玩家分流到上面各种来源:

// 聚合功能.js 把不同菜单项,转交给其它 NPC / 商店 / 传送
cm.warp(910000000, 0);                  // 传送去某地图
openNpc(9010000, "每日白嫖");             // → 发物品的 NPC
openNpc(9010000, "在线奖励");             // → 在线奖励.js
openNpc(9310022, "材料盲盒");            // → 抽材料
openNpc(9010000, "一条龙");               // → 一条龙福利
cm.openShop(57);                          // → 直接开商店

它菜单里常见的入口:升级传送赞助每日白嫖师徒系统寄售市场每日跑环材料盲盒一条龙技能学习在线奖励元宝商城。要找某件物品的出处,从这里点进去基本都能到。

所以「物品出处」和「NPC 玩法」是绑定的:聚合功能是入口,背后才是真正发东西的脚本(二、三、四节那些)。

七、实战:查「某件物品从哪来」标准流程

1
先查查询器。打开 index.html,搜物品名/ID,看「掉落 / 来源」列——能直接看到怪物掉落就完事了。
2
不是掉落的,搜发放脚本。在 scripts 文件夹搜 gainItem(物品ID,命中的 special/*.js 就是出处。
3
可能是商店。搜 openShop 看哪个 NPC 开了含此物的商店,再按商店 ID 去商店表查。
4
可能是兑换。搜 兑换 或物品 ID,找 兑换XXXX.js 这类脚本。
5
还找不到就看活动。去 scripts/event/ 和任务脚本搜物品 ID。
6
最后问聚合功能。游戏里点它,顺着菜单点进去,基本都能对上。

八、怎么自己改 / 加一个物品出处(GM 用)

方法跟之前 NPC 修改教程一样——用记事本打开 .js,改完 Ctrl+S 保存,进游戏重新点 NPC 就生效(没变化再重启服务端)。

改「在线奖励」的发放数量

// 在线奖励.js 里,把 100 改成你想要的
cm.gainItem(2000002, 100);  → 改成 cm.gainItem(2000002, 300);

给「元宝商城」加一个商品

// 元宝商城.js 的 jmsz 数组里加一行:[物品ID, 元宝价, 数量, "未定义", "名字"]
Array(2000004,2,10,"未定义","祝福"),

加一个「兑换」脚本(套路)

// 新文件 兑换9999999.js:收 A 发 B
if(cm.haveItem(旧物品ID, 1)){
    cm.gainItem(旧物品ID, -1);     // 扣掉旧的
    cm.gainItem(新物品ID, 1);     // 发新的
}
新脚本记得在「聚合功能」或某个 NPC 里加个菜单项来 openNpc 它,否则玩家点不到。改完务必先在测试服验证。

九、新手最容易踩的 5 个坑

  1. 物品 ID 写错:gainItem(2000002, 100) 里 ID 多一位少一位都发不出,先去查询器确认正确 ID。
  2. 数量参数顺序:gainItem(ID, 数量),负数表示扣除(用来收材料);别把数量写成 -1 想发东西。
  3. 商店 ID 不存在:openShop(57) 的 57 必须在商店表里存在,否则点了没反应。
  4. 重复发放没加限制:像在线奖励用 getGamePointsPD()==0 防止领第二次;自己加发放一定要加领取标记,否则无限刷。
  5. 改完不刷新:记事本保存后先进游戏重进 NPC 验证,不行再重启服务端——别光改完就以为好了。