AzerothCore 传送系统开发:从 GameTele 数据表到传送门脚本与自定义传送的完整实现 原创
温馨提示:
本文最后更新于 2026-11-05,已超过 0 天没有更新。
若文章内的图片失效(无法正常加载),请留言反馈或直接 联系我。
AzerothCore 传送系统开发:从 GameTele 数据表到传送门脚本与自定义传送的完整实现
传送系统是魔兽世界模拟器里玩家高频使用的功能,也是运营方最常定制的能力之一。无论是日常飞行点、团队副本传送,还是 GM 用的后台传送,底层都由 game_tele 数据表与脚本逻辑共同支撑。本文剖析其完整链路。
一、传送数据从哪里来
AzerothCore 的传送点定义在 game_tele 表中,核心字段包括:
SELECT id, position_x, position_y, position_z, orientation, map, name
FROM game_tele WHERE name = '暴风城';
其中 map 指定目标地图 ID,position_x/y/z 是落地坐标,orientation 是朝向,name 用于命令与技能查找。游戏内 .tele 暴风城 就是按名称在这张表里匹配坐标的。
二、玩家如何触发传送
玩家侧触发的核心命令是 go 与 tele,其查找逻辑封装在 WorldSession 的指令处理中:
# 数据库层匹配
SELECT * FROM game_tele WHERE name LIKE '%暴风%' LIMIT 1;
# 匹配到后调用传送
Player::TeleportTo(map, x, y, z, orientation);
传送动作最终落在 Player::TeleportTo,它会销毁当前会话、切换到目标地图的 Map 实例并重建客户端可见状态。理解这一点,就知道自定义传送的核心就是”往 game_tele 加一行正确的坐标数据”。
三、通过传送门(Portal)脚本联动
很多服务器用”传送门 NPC + 脚本”的方式,让玩家点 NPC 选择目的地。实现上通常会注册一个 ScriptedAI 或使用 Eluna 的 Gossip 菜单:
-- Eluna 示例:点击 NPC 弹出目的地菜单
local function OnGossipHello(event, player, creature)
player:GossipMenuAddItem(0, "前往铁炉堡", 0, 1)
player:GossipMenuAddItem(0, "前往达纳苏斯", 0, 2)
player:GossipSendMenu(1, creature, 0)
end
local function OnGossipSelect(event, player, creature, sender, intid, code)
if intid == 1 then
player:TeleportTo(0, -4839.6, -1309.3, 501.7, 3.3) -- 铁炉堡
elseif intid == 2 then
player:TeleportTo(1, 9967.8, 2055.4, 1329.6, 5.0) -- 达纳苏斯
end
player:GossipComplete()
end
这种方式灵活,适合做”自定义传送点大厅”,也是运营方最常用的功能扩展之一。
四、添加自定义传送点
要给玩家新增一个自定义传送点,只需插入一行 game_tele。先用 .go x y z map 或游戏内坐标工具找到目标坐标,然后:
INSERT INTO game_tele (position_x, position_y, position_z, orientation, map, name)
VALUES (-9000, 870, 92, 0.5, 0, '我的自定义点');
插入后 .tele 我的自定义点 即可直达。注意 map 必须是合法地图 ID,否则会因无法加载目标地图导致传送失败甚至掉线。
五、安全与运维注意
- 坐标合法性:务必校验目标坐标不在虚空或不可达区域,否则玩家会被卡住。
- 等级/阵营限制:如需限制特定玩家可用,可在脚本里加等级或权限判断。
- 缓存问题:部分版本对
game_tele有缓存,改表后需.reload或重启 worldserver 使生效。
理解了 game_tele 与 TeleportTo 的配合,你就能自由扩展传送功能——无论是简单的自定义点位,还是复杂的传送门大厅,都能稳定落地。