TrinityCore 自定义副本制作指南:从设计到实现 原创
温馨提示:
本文最后更新于 2026-03-30,已超过 0 天没有更新。
若文章内的图片失效(无法正常加载),请留言反馈或直接 联系我。
TrinityCore 提供了强大的自定义内容支持,让服务器管理员可以创建独特的游戏体验。本文将详细介绍如何制作一个完整的自定义副本,包括地图设计、Boss 脚本、物品掉落等全流程。
一、副本设计规划
1.1 确定副本主题
在开始制作前,需要明确:
- 故事背景:副本的剧情是什么?与现有世界观如何融合?
- 难度定位:5 人本、10 人本还是 25 人本?
- 等级范围:适合多少级的玩家?
- 预计时长:普通模式 1-2 小时,英雄模式 2-3 小时
1.2 副本结构设计
示例:幽暗城堡(5 人本,等级 70-80)
副本结构:
├── 入口大厅
│ ├── 小怪 x10
│ └── 第一个 Boss:守卫队长
├── 上层走廊
│ ├── 小怪 x8
│ └── 第二个 Boss:大法师
├── 地下密室
│ ├── 小怪 x12
│ └── 最终 Boss:黑暗领主
└── 宝藏室(隐藏)
└── 稀有精英 + 宝箱
二、地图制作
2.1 使用 WoWMapEditor
# 下载地图编辑器
git clone https://github.com/TrinityCore/TrinityCore.git
cd TrinityCore/contrib/map_extractor
# 编译
mkdir build && cd build
cmake ../
make -j $(nproc)
2.2 创建新地图
- 复制现有地图:基于相似地形的现有地图修改
- 修改地形:使用编辑器调整高度、纹理
- 添加建筑:放置 WMO 和 M2 模型
- 设置出生点:定义玩家和怪物的出生位置
2.3 地图配置
编辑 map_template.sql:
INSERT INTO `map_template` (`id`, `name`, `type`, `flags`, `expansion`) VALUES
(999, '幽暗城堡', 1, 0, 2);
-- id: 地图 ID(不能与现有冲突)
-- type: 0=世界,1=副本,2=团队
-- flags: 地图标志
-- expansion: 资料片(0=原版,1=TBC,2=WotLK)
三、NPC 和怪物创建
3.1 创建 NPC 模板
-- 插入到 creature_template 表
INSERT INTO `creature_template` (
`entry`, `name`, `subname`, `IconName`, `gossip_menu_id`,
`minlevel`, `maxlevel`, `exp`, `faction`, `npcflag`,
`speed_walk`, `speed_run`, `scale`, `rank`, `mindmg`, `maxdm g`,
`dmgschool`, `attackpower`, `dmg_multiplier`, `baseattacktime`,
`unit_class`, `unit_flags`, `dynamicflags`, `family`, `trainer_type`,
`trainer_spell`, `trainer_class`, `trainer_race`, `type`, `type_flags`,
`lootid`, `pickpocketloot`, `skinloot`, `resistance1`, `resistance2`,
`resistance3`, `resistance4`, `resistance5`, `resistance6`,
`spell1`, `spell2`, `spell3`, `spell4`, `PetSpellDataID`, `VehicleID`,
`mingold`, `maxgold`, `AIName`, `MovementType`, `InhabitType`,
`HoverHeight`, `HealthModifier`, `ManaModifier`, `ArmorModifier`,
`ExperienceModifier`, `RacialLeader`, `movementId`, `RegenHealth`,
`mechanic_immune_mask`, `flags_extra`, `ScriptName`, `VerifiedBuild`
) VALUES (
99001, -- entry: NPC ID
'黑暗守卫', -- name: 名称
'幽暗城堡守卫', -- subname: 头衔
'', -- IconName
0, -- gossip_menu_id
75, 78, -- minlevel, maxlevel
2, -- exp: 资料片
14, -- faction: 阵营(14=人类)
0, -- npcflag
1, 1.14286, -- speed_walk, speed_run
1, -- scale
0, -- rank: 0=普通,1=精英,2=稀有精英
500, 800, -- mindmg, maxdmg
0, -- dmgschool
1000, -- attackpower
1, -- dmg_multiplier
2000, -- baseattacktime
1, -- unit_class: 1=战士,2=圣骑士,8=法师
0, -- unit_flags
0, -- dynamicflags
0, -- family
0, -- trainer_type
0, 0, 0, -- trainer_spell, trainer_class, trainer_race
0, -- type
0, -- type_flags
99001, -- lootid: 掉落表 ID
0, 0, -- pickpocketloot, skinloot
0, 0, 0, 0, 0, 0, -- resistances
0, 0, 0, 0, 0, 0, -- spells
0, 0, -- mingold, maxgold
'', -- AIName
1, -- MovementType: 0=不动,1=巡逻,2=巡逻路径
3, -- InhabitType: 1=地面,2=水下,4=飞行
1, -- HoverHeight
1, 1, 1, 1, -- 生命、法力、护甲、经验修正
0, -- RacialLeader
0, -- movementId
1, -- RegenHealth
0, -- mechanic_immune_mask
0, -- flags_extra
'dark_castle_guard', -- ScriptName: 脚本名称
1 -- VerifiedBuild
);
3.2 设置巡逻路径
-- 插入到 waypoint_data 表
INSERT INTO `waypoint_data` (`id`, `pointid`, `position_x`, `position_y`, `position_z`, `orientation`, `waittime`, `script_id`, `textid`, `achievement_event`) VALUES
(99001, 1, 100.5, 200.3, 50.0, 0, 0, 0, 0, 0),
(99001, 2, 150.5, 200.3, 50.0, 0, 5000, 0, 0, 0),
(99001, 3, 150.5, 250.3, 50.0, 0, 0, 0, 0, 0),
(99001, 4, 100.5, 250.3, 50.0, 0, 5000, 0, 0, 0);
-- 关联到 NPC
UPDATE `creature` SET `path_id` = 99001 WHERE `id` = 99001;
四、Boss 脚本编写
4.1 Boss 技能设计
示例:黑暗领主(最终 Boss)
- 技能 1:暗影冲击 – 对当前目标造成 5000 点暗影伤害
- 技能 2:黑暗新星 – 对周围 20 码内所有玩家造成 3000 点伤害
- 技能 3:召唤仆从 – 召唤 2 个黑暗守卫
- 技能 4:狂暴 – 血量低于 30% 时,伤害提升 50%
4.2 编写 C++ 脚本
#include "ScriptPCH.h"
enum DarkLordSpells
{
SPELL_SHADOW_BOLT = 99001,
SPELL_DARK_NOVA = 99002,
SPELL_SUMMON_GUARD = 99003,
SPELL_ENRAGE = 99004
};
enum DarkLordEvents
{
EVENT_SHADOW_BOLT = 1,
EVENT_DARK_NOVA = 2,
EVENT_SUMMON_GUARD = 3,
EVENT_CHECK_HEALTH = 4
};
class boss_dark_lord : public CreatureScript
{
public:
boss_dark_lord() : CreatureScript("boss_dark_lord") { }
struct boss_dark_lordAI : public ScriptedAI
{
boss_dark_lordAI(Creature* creature) : ScriptedAI(creature) {}
void Reset() override
{
_scheduler.Reset();
_enraged = false;
}
void EnterCombat(Unit* who) override
{
_scheduler.Schedule(Seconds(5), Seconds(10), [this](ScheduleContext& context)
{
context.ScheduleAction(EVENT_SHADOW_BOLT, Seconds(1),
[this](TaskContext task)
{
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
DoCast(target, SPELL_SHADOW_BOLT);
task.Repeat(Seconds(8), Seconds(12));
});
});
_scheduler.Schedule(Seconds(15), Seconds(20), [this](ScheduleContext& context)
{
context.ScheduleAction(EVENT_DARK_NOVA, Seconds(1),
[this](TaskContext task)
{
DoCast(me, SPELL_DARK_NOVA);
task.Repeat(Seconds(20), Seconds(25));
});
});
}
void UpdateAI(uint32 diff) override
{
if (!UpdateVictim())
return;
// 检查血量,30% 时狂暴
if (!_enraged && HealthBelowPct(30))
{
_enraged = true;
DoCast(me, SPELL_ENRAGE);
Talk(EMOTE_ENRAGE);
}
_scheduler.Update(diff);
DoMeleeAttackIfReady();
}
private:
Scheduler _scheduler;
bool _enraged;
};
CreatureAI* GetAI(Creature* creature) const override
{
return new boss_dark_lordAI(creature);
}
};
void AddSC_boss_dark_lord()
{
new boss_dark_lord();
}
4.3 编译脚本
# 将脚本添加到 CMakeLists.txt
# 重新编译
cd build
make -j $(nproc)
make install
五、物品掉落配置
5.1 创建掉落表
-- 插入到 loot_template 表
INSERT INTO `creature_loot_template` (`Entry`, `Item`, `Chance`, `QuestChance`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES
(99001, 50001, 100, 0, 0, 1, 1, '黑暗领主 - 金币袋'),
(99001, 60001, 50, 0, 1, 1, 1, '黑暗领主 - 史诗武器'),
(99001, 60002, 30, 0, 1, 1, 1, '黑暗领主 - 传说饰品'),
(99001, 60003, 10, 0, 1, 1, 1, '黑暗领主 - 稀有坐骑');
5.2 创建自定义物品
INSERT INTO `item_template` (
`entry`, `class`, `subclass`, `name`, `displayid`, `Quality`, `Flags`,
`BuyPrice`, `SellPrice`, `InventoryType`, `AllowableClass`,
`AllowableRace`, `ItemLevel`, `RequiredLevel`, `RequiredSkill`,
`RequiredSkillRank`, `requiredspell`, `requiredhonorrank`,
`RequiredCityRank`, `RequiredReputationFaction`,
`RequiredReputationRank`, `maxcount`, `stackable`,
`ContainerSlots`, `stat_count`, `stat_type1`, `stat_value1`,
`stat_type2`, `stat_value2`, `stat_type3`, `stat_value3`,
`dmg_min1`, `dmg_max1`, `dmg_type1`, `armor`, `holy_res`,
`fire_res`, `nature_res`, `frost_res`, `shadow_res`,
`arcane_res`, `delay`, `ammo_type`, `RangedModRange`,
`SpellId_1`, `SpellTrigger_1`, `SpellCharges_1`,
`SpellCooldown_1`, `category_1`, `socketColor_1`, `socketContent_1`
) VALUES (
60001, -- entry: 物品 ID
2, -- class: 2=武器
1, -- subclass: 1=单手剑
'黑暗之刃', -- name
12345, -- displayid
4, -- Quality: 4=史诗
0, -- Flags
100000, -- BuyPrice
25000, -- SellPrice
13, -- InventoryType: 13=主手
-1, -- AllowableClass
-1, -- AllowableRace
80, -- ItemLevel
70, -- RequiredLevel
0, 0, 0, 0, 0, 0, -- 其他要求
0, 0, 0, 0, -- 声望要求
1, 1, -- maxcount, stackable
0, -- ContainerSlots
3, -- stat_count
4, 100, -- stat_type1, stat_value1: 耐力 +100
5, 80, -- stat_type2, stat_value2: 力量 +80
36, 50, -- stat_type3, stat_value3: 爆击 +50
500, 800, 0, -- dmg_min1, dmg_max1, dmg_type1
200, -- armor
0, 0, 0, 0, 0, 0, -- 抗性
2000, -- delay
0, 0, -- ammo_type, RangedModRange
0, 0, 0, 0, 0, 0, 0 -- 附魔/宝石
);
六、任务系统
6.1 创建任务
INSERT INTO `quest_template` (
`ID`, `QuestType`, `QuestLevel`, `MinLevel`, `MaxLevel`,
`SuggestedGroupNum`, `RewardNextQuest`, `RewardXPDifficulty`,
`RewardXPMultiplier`, `RewardMoney`, `RewardMoneyDifficulty`,
`RewardMoneyMultiplier`, `RewardBonusHonor`, `RewardKillHonor`,
`StartItem`, `Flags`, `Title`, `Details`, `Objectives`,
`Completion`, `RewardText`, `IncompleteText`,
`RewardItem1`, `RewardAmount1`, `RewardItem2`, `RewardAmount2`
) VALUES (
99001, -- ID: 任务 ID
1, -- QuestType
75, -- QuestLevel
70, 80, -- MinLevel, MaxLevel
0, -- SuggestedGroupNum
0, -- RewardNextQuest
0, 1, -- RewardXPDifficulty, RewardXPMultiplier
50000, -- RewardMoney
0, 1, -- RewardMoneyDifficulty, RewardMoneyMultiplier
0, 0, -- RewardBonusHonor, RewardKillHonor
0, -- StartItem
0, -- Flags
'消灭黑暗领主', -- Title
'冒险者,幽暗城堡的黑暗领主正在威胁我们的领地。请前往城堡深处,消灭他并带回他的头颅作为证明。', -- Details
'收集黑暗领主的头颅。', -- Objectives
'你做到了!黑暗领主已被消灭,我们将永远铭记你的功绩。', -- Completion
'这是你应得的奖励。', -- RewardText
'任务尚未完成。', -- IncompleteText
60001, 1, -- RewardItem1, RewardAmount1: 黑暗之刃
0, 0 -- RewardItem2, RewardAmount2
);
七、测试与调试
7.1 测试清单
- [ ] NPC 是否正常生成
- [ ] 巡逻路径是否正确
- [ ] Boss 技能是否正常释放
- [ ] 掉落物品是否正确
- [ ] 任务是否可以接取和完成
- [ ] 副本难度是否合适
7.2 常用调试命令
# GM 命令
.npc add 99001 # 添加 NPC
.npc info # 查看 NPC 信息
.quest add 99001 # 添加任务
.quest complete 99001 # 完成任务
.additem 60001 # 添加物品
.learn all # 学习所有技能
.level 80 # 设置等级
.revive # 复活
.gm on # 开启 GM 模式
八、发布与运营
8.1 数据备份
# 备份数据库
mysqldump -u acore -p acore_world > world_backup.sql
mysqldump -u acore -p acore_characters > characters_backup.sql
8.2 玩家反馈
收集玩家反馈,持续优化:
- 难度是否合适
- 掉落是否合理
- Boss 机制是否有趣
- 是否有 Bug
总结
制作一个完整的自定义副本需要:
- 规划设计:明确副本主题、结构、难度
- 地图制作:使用编辑器创建或修改地图
- NPC 创建:配置怪物属性和行为
- Boss 脚本:编写 C++ 脚本实现技能
- 物品配置:创建掉落和自定义物品
- 任务系统:设计相关任务
- 测试调试:全面测试确保无 Bug
- 持续优化:根据反馈调整
祝你创作出精彩的副本内容!
发表回复