3.2 creature - 生物表

生物表存储了游戏世界中所有生物的实例信息,包括NPC、怪物、宠物等。每个生物实例都有一个唯一的GUID,并且关联到creature_template表中的一个模板。

表结构

字段名 类型 属性 描述
guid int(10) unsigned 主键,自增 生物GUID,唯一标识符
id mediumint(8) unsigned 不为空,默认0 生物模板ID,对应creature_template表中的entry字段
map smallint(5) unsigned 不为空,默认0 地图ID
zoneId smallint(5) unsigned 不为空,默认0 区域ID
areaId smallint(5) unsigned 不为空,默认0 子区域ID
spawnMask tinyint(3) unsigned 不为空,默认1 刷新掩码,控制在哪些副本难度下刷新
phaseMask int(10) unsigned 不为空,默认1 相位掩码,控制在哪些相位中可见
modelid mediumint(8) unsigned 不为空,默认0 模型ID,如果为0则使用模板中的随机模型
equipment_id mediumint(9) 不为空,默认0 装备ID,如果为0则使用模板中的默认装备
position_x float 不为空,默认0 X坐标
position_y float 不为空,默认0 Y坐标
position_z float 不为空,默认0 Z坐标
orientation float 不为空,默认0 朝向(弧度,0-2π)
spawntimesecs int(10) unsigned 不为空,默认120 重生时间(秒)
wander_distance float 不为空,默认0 游荡距离,为0时不游荡
currentwaypoint mediumint(8) unsigned 不为空,默认0 当前路径点
curhealth int(10) unsigned 不为空,默认1 当前生命值
curmana int(10) unsigned 不为空,默认0 当前法力值
MovementType tinyint(3) unsigned 不为空,默认0 移动类型(0=静止,1=随机移动,2=路径移动)
npcflag int(10) unsigned 不为空,默认0 NPC标志,覆盖模板中的值
unit_flags int(10) unsigned 不为空,默认0 单位标志,覆盖模板中的值
dynamicflags int(10) unsigned 不为空,默认0 动态标志,覆盖模板中的值
ScriptName varchar(64) 不为空,默认'' 脚本名称,覆盖模板中的值
VerifiedBuild smallint(5) 不为空,默认0 验证版本

字段详解

guid

生物的唯一标识符,是自动递增的整数。这个字段是表的主键,用于在游戏中唯一标识一个生物实例。

示例值: 1, 42, 1337

id

生物的模板ID,对应creature_template表中的entry字段。这个字段决定了生物的基本属性,如名称、等级、技能等。

示例值: 1260(狗头人矿工), 7427(熔火恶犬)

map

生物所在的地图ID,对应于maps.dbc文件中的记录。

示例值:

zoneId 和 areaId

生物所在的区域ID和子区域ID,对应于AreaTable.dbc文件中的记录。这些字段通常由服务器自动填充,不需要手动设置。

spawnMask

刷新掩码,控制生物在哪些副本难度下刷新。这是一个位掩码值,可以组合多个标志。

示例值:

phaseMask

相位掩码,控制生物在哪些相位中可见。相位是一种允许在同一地图上为不同玩家显示不同内容的机制。这是一个位掩码值,可以组合多个标志。

示例值:

position_x, position_y, position_z

生物的坐标位置,定义了生物在地图上的确切位置。

示例值: position_x: -9449.06, position_y: 64.8392, position_z: 56.3581

orientation

生物的朝向,以弧度表示(0到2π)。0表示朝北,π/2表示朝东,π表示朝南,3π/2表示朝西。

示例值: 0.0(朝北), 1.57(朝东), 3.14(朝南), 4.71(朝西)

spawntimesecs

生物死亡后的重生时间,以秒为单位。如果设置为0,生物将不会重生。

示例值:

wander_distance 和 MovementType

这两个字段一起控制生物的移动行为。wander_distance定义了生物随机移动的最大距离,MovementType定义了移动类型。

示例值:

curhealth 和 curmana

生物的当前生命值和法力值。如果设置为0,将使用模板中定义的默认值。

示例值: curhealth: 1000, curmana: 500

使用示例

添加新生物

以下SQL语句将在艾尔文森林添加一个狗头人矿工:

INSERT INTO creature (id, map, position_x, position_y, position_z, orientation, spawntimesecs, wander_distance, MovementType)
VALUES (1260, 0, -9449.06, 64.8392, 56.3581, 1.57, 300, 5, 1);

修改生物位置

以下SQL语句将修改GUID为42的生物的位置:

UPDATE creature
SET position_x = -9460.12, position_y = 70.5432, position_z = 56.8765, orientation = 3.14
WHERE guid = 42;

修改生物重生时间

以下SQL语句将修改GUID为42的生物的重生时间为1小时:

UPDATE creature
SET spawntimesecs = 3600
WHERE guid = 42;

删除生物

以下SQL语句将删除GUID为42的生物:

DELETE FROM creature
WHERE guid = 42;

相关表

常见问题

如何查找特定区域的所有生物?

使用以下SQL语句查询特定地图和坐标范围内的所有生物:

SELECT c.guid, ct.name, c.position_x, c.position_y, c.position_z
FROM creature c
JOIN creature_template ct ON c.id = ct.entry
WHERE c.map = 0
AND c.position_x BETWEEN -9500 AND -9400
AND c.position_y BETWEEN 50 AND 100;

如何使生物不重生?

将spawntimesecs设置为0:

UPDATE creature
SET spawntimesecs = 0
WHERE guid = 42;

如何使生物在所有副本难度下都刷新?

将spawnMask设置为15(1+2+4+8):

UPDATE creature
SET spawnMask = 15
WHERE guid = 42;

添加生物后需要重启服务器吗?

不需要完全重启服务器,但需要重新加载生物数据:

  1. 在游戏中使用GM命令:.reload creature
  2. 或者使用命令:.reload all creature来重新加载所有与生物相关的数据

注意: 重新加载数据只会影响新生成的生物,已经存在的生物实例不会受到影响,除非它们死亡并重生。

为什么我添加的生物没有出现在游戏中?

可能的原因包括:

可以使用以下命令在游戏中临时生成生物来测试:

.npc add 生物ID