跳到主要内容

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);
}