3.4 gameobject - 游戏对象表

游戏对象表存储了游戏世界中所有游戏对象实例的位置和状态信息。每个游戏对象实例都基于gameobject_template表中的模板创建,并在游戏世界中有特定的位置和状态。

表结构

字段名 类型 属性 描述
guid int(10) unsigned 主键,不为空 游戏对象实例的全局唯一标识符
id mediumint(8) unsigned 不为空,默认0 游戏对象模板ID,对应gameobject_template表的entry
map smallint(5) unsigned 不为空,默认0 地图ID,对应Map.dbc的ID
zoneId smallint(5) unsigned 不为空,默认0 区域ID
areaId smallint(5) unsigned 不为空,默认0 子区域ID
spawnMask tinyint(3) unsigned 不为空,默认1 刷新掩码,控制在哪些副本难度下刷新
phaseMask int(10) unsigned 不为空,默认1 相位掩码,控制在哪些相位中可见
position_x float 不为空,默认0 X坐标
position_y float 不为空,默认0 Y坐标
position_z float 不为空,默认0 Z坐标
orientation float 不为空,默认0 朝向角度(0-6.28弧度)
rotation0 float 不为空,默认0 旋转四元数X分量
rotation1 float 不为空,默认0 旋转四元数Y分量
rotation2 float 不为空,默认0 旋转四元数Z分量
rotation3 float 不为空,默认0 旋转四元数W分量
spawntimesecs int(11) 不为空,默认0 重生时间(秒)
animprogress tinyint(3) unsigned 不为空,默认0 动画进度
state tinyint(3) unsigned 不为空,默认0 状态
ScriptName varchar(64) 不为空,默认'' 脚本名称
VerifiedBuild smallint(5) 不为空,默认0 验证版本

使用示例

添加新游戏对象

以下SQL语句将在暴风城添加一个邮箱:

INSERT INTO gameobject (id, map, position_x, position_y, position_z, orientation, spawntimesecs, state)
VALUES (142102, 0, -8833.37, 628.62, 94.00, 1.06, 300, 1);

修改游戏对象位置

以下SQL语句将修改GUID为42的游戏对象的位置:

UPDATE gameobject
SET position_x = -8840.12, position_y = 630.54, position_z = 94.25, orientation = 2.35
WHERE guid = 42;

修改游戏对象重生时间

以下SQL语句将修改GUID为42的游戏对象的重生时间为1小时:

UPDATE gameobject
SET spawntimesecs = 3600
WHERE guid = 42;

删除游戏对象

以下SQL语句将删除GUID为42的游戏对象:

DELETE FROM gameobject
WHERE guid = 42;

常见问题

如何查找特定区域的所有游戏对象?

使用以下SQL语句查询特定地图和坐标范围内的所有游戏对象:

SELECT g.guid, gt.name, g.position_x, g.position_y, g.position_z
FROM gameobject g
JOIN gameobject_template gt ON g.id = gt.entry
WHERE g.map = 0
AND g.position_x BETWEEN -8900 AND -8800
AND g.position_y BETWEEN 600 AND 700;

如何使游戏对象不重生?

将spawntimesecs设置为0:

UPDATE gameobject
SET spawntimesecs = 0
WHERE guid = 42;

如何使游戏对象在所有副本难度下都刷新?

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

UPDATE gameobject
SET spawnMask = 15
WHERE guid = 42;

添加游戏对象后需要重启服务器吗?

不需要完全重启服务器,但需要重新加载游戏对象数据:

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

注意: 重新加载数据只会影响新生成的游戏对象,已经存在的游戏对象实例不会受到影响,除非它们被销毁并重生。

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

可能的原因包括:

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

.gameobject add 游戏对象ID