holiday_dates 表
holiday_dates表存储游戏中Holiday事件的具体开始日期和持续时间配置。
表概述
holiday_dates表定义了游戏内节日/假日事件的具体日期和持续时间。配合holidays_dbc表使用,id对应Holiday ID,date_id区分同一节日的多个时段,date_value使用位掩码格式存储日期,holiday_duration指定持续天数。
主键为 (id, date_id),允许同一节日配置多个不同时间段。
表结构
| 字段名 | 数据类型 | 默认值 | 说明 |
|---|---|---|---|
| id | INT UNSIGNED | NOT NULL | Holiday ID(主键,对应holidays_dbc.ID) |
| date_id | TINYINT UNSIGNED | NOT NULL | 日期组编号(主键,同一节日的多个时段) |
| date_value | INT UNSIGNED | NOT NULL | 日期值(位掩码格式:MMDDYYYY) |
| holiday_duration | INT UNSIGNED | 0 | 节日持续天数 |
重要字段详解
date_value (位掩码日期)
使用位掩码格式存储具体日期。数值由月、日、年按位组合而成:
- 低8位(0-7):日 (1-31)
- 中8位(8-15):月 (1-12)
- 高16位(16-31):年 (如2024)
例如:2024年12月25日 = (2024 << 16) | (12 << 8) | 25
date_id (时段分组)
同一Holiday可以在一年中多次出现(如暗月马戏团每月一次),通过不同date_id值区分。date_id从0开始递增,服务器会遍历所有date_id检查当前日期是否匹配。
实战案例
设置冬幕节(Holiday ID=141)从12月15日持续到1月2日
INSERT INTO holiday_dates (id, date_id, date_value, holiday_duration)
VALUES (141, 0, (2024 << 16) | (12 << 8) | 15, 18);
查询指定Holiday的所有时间段
SELECT id, date_id, date_value,
(date_value >> 16) AS year_val,
((date_value >> 8) & 0xFF) AS month_val,
(date_value & 0xFF) AS day_val,
holiday_duration
FROM holiday_dates
WHERE id = 141
ORDER BY date_id;
常见问题
Q: 节日事件不触发怎么办?
A: 检查三点:(1) holidays_dbc表中ID是否存在;(2) holiday_dates中日期是否正确(注意年份位掩码格式);(3) game_event表中是否配置了对应的world event关联。
Q: holiday_duration=0有什么效果?
A: holiday_duration=0时,节日仅在date_value指定的当天激活。持续时间设为N,则从date_value那天起持续N天。