AzerothCore 物品与装备系统开发:从 item_template 到掉落与特殊效果脚本 原创
引言
物品是 MMO 里最基础的数据资产——武器、护甲、消耗品、任务物品、材料,玩家的成长体验很大程度上由”拿到了什么装备”驱动。AzerothCore 把物品做成数据驱动:物品定义、属性、掉落、装备效果全部存在 world 库中,脚本只在需要特殊逻辑时介入。本文拆解 item_template 结构、装备属性计算、自定义物品与特殊效果脚本的完整开发方法。
一、item_template 表结构
所有物品的定义都在 item_template 表(3.3.5 分支)。核心字段分组:
1. 基础标识
| 字段 | 作用 |
|---|---|
| entry | 物品 ID(客户端 item.dbc 对应) |
| class | 大类:0消耗品 1容器 2武器 3护甲 4商品 5弹药 6任务物品 … |
| subclass | 子类,如武器下分斧/剑/锤/法杖等 |
| SoundOverrideSubclass | 音效子类覆盖 |
| name | 物品名 |
| displayid | 客户端外观模型 ID |
| Quality | 品质:0灰 1白 2绿 3蓝 4紫 5橙 6传说 7 |
| Flags | 物品标志位(可交易/灵魂绑定/唯一等) |
| FlagsExtra | 扩展标志位 |
| BuyCount / BuyPrice | 商人购买堆叠/单价 |
| SellPrice | 卖给商人价格 |
| InventoryType | 装备栏位:非装备0,头1、项链2、肩3、胸5、腰6、腿7、脚8、腕9、手10、手指11、饰品12、主手13、副手14、双手17、远程26… |
| AllowableClass / AllowableRace | 允许的职业/种族(位掩码,0 为不限) |
| ItemLevel | 物品等级(影响属性预算和需求) |
| RequiredLevel | 使用/装备所需角色等级 |
2. 属性数值
stat_type1..10 -- 属性类型:3敏捷 4力量 7耐力 5智力 6精神
stat_value1..10 -- 对应数值
ScalingStatDistribution / ScalingStatValue -- 传家宝等缩放属性
dmg_min1/2, dmg_max1/2 -- 武器伤害上下限(近战/远程)
dmg_type1/2 -- 伤害类型(物理0 等)
attack_speed -- 武器攻击速度(毫秒,如 2000)
armor -- 护甲值
block -- 盾牌格挡值
bonding -- 绑定类型:0不绑 1拾取绑定 2装备绑定 4任务绑定
delay -- 同 attack_speed(部分字段别名)
DPS(每秒伤害)由伤害范围和速度算出:DPS = ((min+max)/2) / (speed/1000)。设计武器时一般先定目标 DPS 和速度,反推 min/max。
3. 触发与法术效果
| 字段 | 作用 |
|---|---|
| spellid_1..5 | 物品携带的法术 ID |
| spelltrigger_1..5 | 触发方式:0使用 1装备生效 2击中可能 3… |
| spellppmRate_1..5 | 每分钟触发次数(击中特效用) |
| spellcooldown_1..5 | 冷却(毫秒) |
| spellcategory / categorycooldown | 法术类别及公共冷却 |
消耗品、饰品的特效大多数直接挂 spellid 即可,由法术系统处理,无需写脚本。
4. 抗性与其他
holy_res / fire_res / nature_res / frost_res / shadow_res / arcane_res -- 抗性
socketColor_1..3 -- 宝石孔颜色(meta/red/yellow/blue)
socketBonus -- 镶孔奖励 spellid
GemProperties -- 宝石自身属性指向
RandomProperty -- 随机附魔前缀模板(绿色随机装备)
duration / EventId -- 限时物品
Material / MaxDurability / AreaLevel / Map -- 材料、耐久度、区域限制
二、装备属性与加成链路
物品装备到身上后,属性如何影响角色:
- 基础属性(力量/敏捷等):item_template 的 stat_value 直接加入角色对应属性,再受种族/天赋/Buff 修正
- 武器伤害:参与攻击强度(AP)转化的伤害公式,速度影响 normalized 武器伤害
- 护甲:累加后按职业公式换算物理减伤百分比,护甲有等级递减
- 装备法术:spelltrigger=1(装备时)的效果在装备时应用,卸下时移除——属性、光环、特效都靠这个机制
关键理解:装备上的绿字特效(命中、暴击、AP、法强)在 3.3.5 通常不是直接的 stat_type,而是通过 spelltrigger=1 的光环法术提供。比如”装备:提高暴击等级 50″,是物品挂一个 spellid,该法术的光环效果是 +50 暴击等级。自定义这类属性时,做法是新建/复用一个 ItemEnchantment 风格的法术挂到物品。
三、新建自定义物品
纯服务端加自定义物品有两种情形。如果客户端 item.dbc 没有该 entry 的外观/名称,纯改库会导致客户端无法正确显示,因此私服自定义物品通常需要:
- 选一个客户端已存在的空闲/可复用 entry,或
- 配合客户端补丁(修改 item.dbc、itemcache)下发新物品定义和图标
一个自定义双手剑示例(假设用可下发的高 entry,如 90000 段):
INSERT INTO item_template
(entry, class, subclass, name, displayid, Quality, Flags,
InventoryType, bonding, ItemLevel, RequiredLevel,
stat_type1, stat_value1, stat_type2, stat_value2,
dmg_min1, dmg_max1, dmg_type1, attack_speed,
armor, spellid_1, spelltrigger_1, BuyPrice, SellPrice,
AllowableClass, Material, MaxDurability)
VALUES
(90001, 2, 1, '寒霜巨剑', 41000, 4, 0,
17, 1, 245, 80,
4, 40, -- +40 力量
7, 60, -- +60 耐力
350, 525, 0, 3600, -- 伤害范围 + 速度3.6s
0, 50100, 1, -- 装备时触发法术50100(如+暴击)
0, 150000,
1, 1, 120); -- AllowableClass=1(战士位掩码示例)
插入后重载物品缓存(在线生效一般需要重启 worldserver 或用 .reload item_template),用 GM 命令 .additem 90001 测试。
四、掉落与获取
物品做好后要能被获取,常见途径:
-- 1. NPC 掉落(creature_loot_template)
-- Entry=生物entry 或 loot id,Item=物品entry,Reference=引用组,
-- Chance=掉率,QuestRequired=任务所需,minCountOrRef/maxCount
INSERT INTO creature_loot_template (Entry, Item, Reference, Chance, minCountOrRef, maxCount)
VALUES (10184, 90001, 0, 12, 1, 1); -- 12% 掉率
-- 2. 商人出售(npc_vendor)
INSERT INTO npc_vendor (entry, item, maxcount, incrtime, ExtendedCost)
VALUES (90000, 90001, 0, 0, 0);
-- 3. 锻造制造(item_template 里 recipe 物品 + spell_recipe 关联)
-- 学习配方法术 -> 施法制造产品,产品挂在 spell 的效果上
-- 4. 任务奖励(quest_template.RewardItem1..4 + RewardAmount)
UPDATE quest_template SET RewardItem1=90001, RewardAmount1=1 WHERE ID=12001;
Reference 是掉落组的引用机制:一组共享掉率池的掉落(如”史诗装备表”)做成 reference_loot_template,BOSS 的掉落表引用它,掉率按组分配。设计 BOSS 掉落时优先用 reference 组而不是逐条堆在主表。
五、物品脚本:特殊行为
数据和法术覆盖不了的复杂逻辑(使用物品触发多步效果、根据条件变化、自定义召唤)用 ItemScript:
class item_custom_portal_stone : public ItemScript
{
public:
item_custom_portal_stone() : ItemScript("item_custom_portal_stone") {}
bool OnUse(Player* player, Item* item, SpellCastTargets const& /*targets*/) override
{
// 检查条件
if (player->IsInCombat())
{
player->GetSession()->SendNotification("战斗中无法使用");
return false; // 阻止默认使用
}
// 自定义效果:传送 + 视觉 + 冷却
player->CastSpell(player, 50110, true); // 传送法术
return true; // 允许物品使用流程继续
}
void OnEquip(Player* player, Item* item) override
{
// 装备时的额外处理(如动态加层、记录)
}
void OnUnequip(Player* player, Item* item) override
{
// 务必对称清理 OnEquip 加的状态,防止残留
}
};
void AddSC_item_custom_portal_stone()
{
new item_custom_portal_stone();
}
脚本通过 item_template 的 ScriptName 字段关联:
UPDATE item_template SET ScriptName='item_custom_portal_stone' WHERE entry=90002;
其他可重写的钩子还有 OnCreate、OnQuestAccept、OnExpire(限时物品到期)、OnItemUse 等,按需实现。
六、套装与宝石附魔
套装(item-set)
-- item_template 的 item-set 字段指向 item_set.dbc / 套装 ID
-- 套装2件/4件奖励本质是穿戴数量达标的光环,通过 spell_enchant 或脚本判定
-- 私服自定义套装同样需要客户端 DBC 配合,或用脚本模拟套装奖励
宝石与镶孔
带孔装备 socketColor 指定孔颜色,宝石(自身 GemProperties 定义颜色和属性)镶入时校验颜色匹配,匹配全部孔给 socketBonus。宝石属性也是通过镶孔后应用的 ItemEnchantment 法术生效。
附魔
附魔是给物品附加 ItemEnchantment(一个带属性的法术 ID),存在角色物品实例的附魔槽上(characters 库 item_instance 的 enchanted field),不是改 item_template 模板。
七、常见坑
- 客户端不显示:纯库加的 entry 若 item.dbc 无对应定义,客户端显示问号/红块,自定义物品必须配合客户端补丁或复用已有 entry
- displayid 错误:外观模型不存在会导致物品图标或手持模型异常
- 属性预算超标:不按 ItemLevel 预算随意堆数值,会破坏平衡,参考同等级官方装备的 stat 总和做基准
- 绿字属性写错字段:暴击/命中/法强是 spelltrigger=1 的光环,不是 stat_type,直接填 stat_type 会变成错误属性
- 掉率不生效:creature_loot_template 的 Entry 要匹配生物实际引用的 loot id(精英/模板生物可能用 reference),Chance 之和与组模式要正确
- 脚本不加载:忘记在脚本加载器注册 AddSC 函数,或 ScriptName 拼写不一致
- OnEquip/OnUnequip 不对称:装备加的状态卸下时没清理,导致属性残留叠加
- 绑定位配错:bonding/Flags 设错导致本该拾取绑定的装备可交易
总结
AzerothCore 物品系统的核心是数据驱动:item_template 用 class/subclass/InventoryType 定义”是什么、能装备在哪”,stat 字段给基础属性,spellid+spelltrigger 承载绿字特效和使用效果,掉落/商人/任务/制造解决”怎么获得”。真正需要 ItemScript 的只是多步条件型特殊使用逻辑。开发顺序建议先复刻一件官方物品理解字段含义,再做纯数据的新装备,最后才碰带脚本的复杂物品;同时始终记住”客户端 DBC 决定显示”,自定义 entry 必须配合客户端补丁才能完整生效。