game_server.activity
简介
基于engine层实现的活动模块
几点说明:
- 支持解释自定义的活动时间格式
- 支持扩展自定义的活动周期
- 支持扩展自定义的活动功能模块
- 支持扩展自定义的活动对象
- 支持扩展自定义的活动相关的mongo脚本
活动初始化设置时处理:
- 先加载所有自定义活动周期、功能模块、对象、mongo脚本
- 创建所有在/etc/activity.xlsx中配置的活动对象(启动计划事件、心跳)
活动配置表(activity.xlsx)的一些说明
activity.xlsx必有字段:
- name - 活动名称
- ob - 活动开始后创建的活动对象实例的名称(可以通过activity_factory.query_entry查询到非nil值)
- mod - 活动对象实例关联的活动功能模块的名称(可以通过activity_mod.query_entry查询到非nil值)
- date_type -活动周期类型(可以通过activity_cycle.query_entry查询到非nil值),当前支持周期为:
day - 每天(可循环)
week - 每周(可循环)
period - 时间段(不可循环)
- date - 活动日期列表(默认仅在date_type为'week'时起效-表示每周哪几天有活动)
- time - 活动时间列表
- switch_stage_time - 活动阶段转换时间列表(相对于开始时间)
- stage_name - 活动阶段名称(需和switch_stage_time一一对应)
- pre_start_time - 活动开始预告时间(相对于开始时间)
- pre_stop_time - 活动结束预告时间(相对于结束时间)
- after_stop_time - 活动结束后处理时间((相对于结束时间))
activity.xlsx可选字段:
- only_show - true值时表示仅用于显示,不会创建活动对象实例
基础组件的一些说明:
- FActivityCycleBase - 自定义的活动周期需要包含这个组件
- FActivityModBase - 自定义的活动功能模块需要包含这个组件
- FActivityObBase - 自定义的活动对象需要包含这个组件
组件接口
activity.gs
| 函数原型 | 函数作用 |
|---|---|
| void setup(map para = ) | 初始化活动模块设置 |
| void shutdown() | 关闭活动模块 |
| void load_activity_mods(string path) | 载入指定路径的活动功能模块 |
| void load_activity_obs(string path) | 载入指定路径的活动对象 |
| void load_activity_cycles(string path) | 载入指定路径的活动周期对象 |
| void load_activity_mongo_scripts(string path) | 载入指定路径的活动相关的mongo脚本 |
| void start() | 开始服务 |
| void stop() | 停止服务 |
| void dump() | 调试接口-输出所有活动信息 |
| object get_heart() | 获得活动模块提供的心跳对象 |
| map get_activity_info(string name) | 获取指定活动的活动配置信息 |
| void create_local_activity(string name) | 创建本地活动对象实例 |
| void reload_activities() | 重新加载所有活动 |
| void register_scheduler(object ob) | 为活动对象登记活动定时事件 |
| object get_activity(string name) | 根据指定名称查找活动对象实例 |
| void iterate_activity(function func) | 遍历所有活动对象实例 |
| int calc_activity_stage(string name, int t = 0) | 计算出指定活动在指定时间时所处的活动阶段 |
| array calc_activity_start_time(string name) | 计算活动的开始时间 |
| int calc_activity_next_start_time(string name) | 计算活动下一次开启的时间 |
| int find_activity_batch(string name, int t = 0) | 查找指定时间处于活动的第几个活动时间段 |
| int is_during_activity(string name, int t = 0) | 指定时间是不是在指定活动的活动时间段里 |
| void set_parse_time_function(function func) | 设置解释自定义活动时间格式的处理回调函数 |
activity_factory.gs
活动对象工厂
| 函数原型 | 函数作用 |
|---|---|
| object load_or_create_activity(string name) | 创建一个活动对象实例 |
FActivityObBase.gs
活动对象基础组件 活动基础对象,保存活动相关的数据 活动对象dbase中的数据会持久化 本组件提供基础功能: 1.获取配置 2.获取当前是否是远程活动/远程对象 3.开始,结束,活动状态管理 4.活动数据持久化 5.对远程活动对象进行远程调用 6.活动心跳
| 函数原型 | 函数作用 |
|---|---|
| string get_name() | 获取活动名称 |
| string desc() | 获取活动描述 |
| bool is_running() | 活动是不是正在进行中 |
| mixed get_cfg(string path = nil) | 获取活动配置 |
| void save() | 活动对象保存到数据库 |
| void dump() | 活动对象导出到数据库(可多次导出,每次键值不同) |
| object get_mod() | 获取活动对象关联的活动功能模块 |
| void try_check_start() | 尝试开启活动 |
| void pre_start(int batch, int pre_index, int pre_time) | 活动对象开始活动前的处理 |
| bool fix_start() | 活动对象尝试恢复并开始 |
| void start(int batch, map args) | 活动对象开始活动 |
| void resume() | 活动对象恢复活动 |
| void switch_stage(int batch, int index, int time) | 活动对象切换阶段 |
| void pre_stop(int batch, int pre_index, int pre_time) | 活动对象结束前处理 |
| void stop(map args = ) | 活动对象结束活动 |
| void after_stop(int batch, int after_index, int after_time) | 活动对象结束后处理 |
| void user_join_activity(object user) | 玩家加入活动时的处理 |
| void user_quit_activity(object user) | 玩家离开活动时的处理 |
FActivityObData.gs
活动对象的数据组件
| 函数原型 | 函数作用 |
|---|---|
| string get_state() | 获取活动状态 |
| void set_state(string state) | 设置活动状态 |
| void set_start_time(int t) | 设置活动开始时间 |
| int get_start_time() | 获取活动开始时间 |
| int get_stage() | 获取当前阶段 |
| void set_stage(int stage) | 设置阶段 |
| void add_stage() | 增加阶段 |
| void reset_stage() | 重置阶段 |
| void set_batch(int batch) | 设置批次 |
| int get_batch() | 获取批次 |
样例
public void test()
{
map activity_para = {
"parse_time_func" : (: parse_time :),
"activity_obs" : nil,
"activity_mods" : nil,
"activity_cycles" : nil,
"activity_mongo_scripts" : __DIR__ "scripts/"
};
activity.setup(activity_para);
}
parallel mixed parse_time(string t)
{
if (! t.starts_with("START_SERVER_DAY"))
return nil;
// 格式START_SERVER_DAY(n)-hh:mm:ss
// sample: START_SERVER_DAY(0)-12:30:05
let int match_count, mixed offset_days, mixed hh, mixed mm, mixed ss = sscanf(t, "START_SERVER_DAY(%d)-%d:%d:%d");
if (match_count < 1)
return nil;
int result = time.from_string("20230720000000");
result += offset_days * 86400;
if (is_int(hh) && (hh > 0))
result += hh * 3600;
if (is_int(mm) && (mm > 0))
result += mm * 60;
if (is_int(ss) && (ss > 0))
result += ss;
return time.info(result);
}