AzerothCore 物品与装备系统开发:从 item_template 到掉落与特殊效果脚本 原创

温馨提示:
本文最后更新于 2026-09-28,已超过 0 天没有更新。 若文章内的图片失效(无法正常加载),请留言反馈或直接 联系我。

引言

物品是 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  -- 材料、耐久度、区域限制

二、装备属性与加成链路

物品装备到身上后,属性如何影响角色:

  1. 基础属性(力量/敏捷等):item_template 的 stat_value 直接加入角色对应属性,再受种族/天赋/Buff 修正
  2. 武器伤害:参与攻击强度(AP)转化的伤害公式,速度影响 normalized 武器伤害
  3. 护甲:累加后按职业公式换算物理减伤百分比,护甲有等级递减
  4. 装备法术:spelltrigger=1(装备时)的效果在装备时应用,卸下时移除——属性、光环、特效都靠这个机制

关键理解:装备上的绿字特效(命中、暴击、AP、法强)在 3.3.5 通常不是直接的 stat_type,而是通过 spelltrigger=1 的光环法术提供。比如”装备:提高暴击等级 50″,是物品挂一个 spellid,该法术的光环效果是 +50 暴击等级。自定义这类属性时,做法是新建/复用一个 ItemEnchantment 风格的法术挂到物品。

三、新建自定义物品

纯服务端加自定义物品有两种情形。如果客户端 item.dbc 没有该 entry 的外观/名称,纯改库会导致客户端无法正确显示,因此私服自定义物品通常需要:

  1. 选一个客户端已存在的空闲/可复用 entry,或
  2. 配合客户端补丁(修改 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 必须配合客户端补丁才能完整生效。