表概述

holiday_dates表定义了游戏内节日/假日事件的具体日期和持续时间。配合holidays_dbc表使用,id对应Holiday ID,date_id区分同一节日的多个时段,date_value使用位掩码格式存储日期,holiday_duration指定持续天数。

主键为 (id, date_id),允许同一节日配置多个不同时间段。

表结构

字段名数据类型默认值说明
idINT UNSIGNEDNOT NULLHoliday ID(主键,对应holidays_dbc.ID)
date_idTINYINT UNSIGNEDNOT NULL日期组编号(主键,同一节日的多个时段)
date_valueINT UNSIGNEDNOT NULL日期值(位掩码格式:MMDDYYYY)
holiday_durationINT UNSIGNED0节日持续天数

重要字段详解

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天。