跳到主要内容

game.server.rank

简介

组件接口

FRankBoard.gs

为排行榜对象提供启动、收集参与者数据等接口,所有排行榜对象都应该包含本组件

函数原型函数作用
string get_board_id()获取排行榜id
string get_group_id()获取排行榜的分组id
string get_board_name()获取排行榜的名字(跟排行榜服务器中存储排行数据的KEY相关)
bool start()启动排行榜
float calc_time_score(mixed t)将时间值转换城一个介于0和1之间的浮点数(用来辅助排名权重计算,时间越小,值越大)
string desc()排行榜对象的描述对象(本函数用于调试)
RankRequest new_request(string cmd)新建一个对排行榜进行操作的排行服务器请求
bool drop()删除排行服务器上的排行数据并切析构自己

FRankPlayer.gs

为排行榜参与者提供一组更新排行榜上排名和数据接口的组件 所有排行榜参与者都应该包含该组件

函数原型函数作用
void refresh_rank(string board_id)立刻刷新指定排行榜
void refresh_all_ranks()刷新所有和参与者类型一致的排行榜
void refresh_rank_fields(string board_id, map fields)只更新指定排行榜数据但不更新排名
void refresh_all_rank_fields(map fields)所有排行榜只更新指定排行榜数据但不更新排名
void heartbeat_rank()排行榜心跳函数,定时刷新参与的带有指定刷新间隔的排行榜排名(可在参与者的心跳函数中执行)

rank.gs

基于pkg.game.server实现的排行榜功能模块 由三方组成:

  1. 排行榜对象,排行榜对象必须包含FRankBoard组件
  2. 参与排行的实体对象,实体对象必须包含本模块提供的FRankPlayer组件
  3. 排行榜管理对象(rank.gs) 流程简要概括:
  4. 加载排行榜管理对象 a. rank_board.xlsx表配置 b. rank_server的连接配置(通过cfg.get_config读取) c. 加载排行榜对象的静态对象(rank.load_all_entry方式加载)
  5. 排行榜管理对象启动服务 管理对象将为rank_board.xlsx表中指定的所有排行榜逐一创建排行榜对象(new_object)并执行 启动操作;需要自行确保所有排行榜对象都创建并且启动
  6. 一般的,参与排行的实体对象,通过在心跳函数中执行heartbeat_rank()函数更新自己所有的排行榜数据; 同时也可以调用refresh_all_ranks()/reresh_rank()立刻更新所有或者指定的排行榜数据
函数原型函数作用
map get_config(string board_id)获取指定id的排行榜配置
array get_rank_list_by_type(string player_type)获取指定参与者类别的排行榜id列表
map get_auto_refresh_rank_dict_by_type(string player_type)获取指定参与者类别的需要定时自动更新数据的排行榜id列表
object get_rank_ob(string board_id)根据排行榜id获取排行榜对象
bool start()启动服务
void stop()停止服务
bool ok()排行榜是否已经启动
RankRequest new_request(string cmd)新建一个排行服请求
array get_rank_list(string board_id, int from, int to, string special_group_id = nil)获取指定排行榜id从from到to区间的排行信息列表
int get_rank_length(string board_id, string special_group_id = nil)获取排行榜长度
int get_rank(string board_id, string who_rid, string special_group_id = nil)获取特定参与者在指定排行榜的名次
map get_rank_info(string board_id, string who_rid, string special_group_id = nil)获取特定参与者在指定排行榜的排行信息
void flush_board(string board_id)请求排行服务器立刻更新指定的排行榜(异步)
array flush_board_request(string board_id)请求排行服务器立刻更新指定的排行榜(阻塞模式)
void clear_board(string board_id)请求排行服务器清空指定的排行榜
void refresh_rank(string board_id, object who)收集参与者排行数据并请求排行服务器更新排名(异步)
array refresh_rank_request(string board_id, object who)收集参与者排行数据并请求排行服务器更新排名(阻塞模式)
void refresh_fields(string board_id, object who, map fields)仅刷新参与者在排行服务器上的特定数据不更新排名

RankRequest

排行榜操作请求class

成员变量

变量名类型初始值须初始化描述
cmdstringnil可选
argsmapnil可选

成员方法

函数原型函数作用
void set_cmd(string cmd)设置排行榜操作命令
void set_args(map args)设置排行榜操作参数
void append_args(map args)追加排行榜操作参数
void append_arg(mixed key, mixed value)追加一个排行榜操作参数
void send()发送排行榜操作请求(非阻塞,不等待操作结果)
mixed send_request()发送排行榜操作请求(阻塞,等待操作结果)
array send_request_rich()发送排行榜操作请求,包装返回结果(阻塞,等待操作结果)

样例

public void test()
{
cfg.init_by_map({
"server_id" : 1,
"disable_mongo" : true,
"product_name" : "test_rank",
"rank_server" : {
"ip" : "127.0.0.1",
"port" : 6634
}
});
etc.set("transform_to_dat", false);
server_base.boot();

// 增加类型
EntityFactory.append_dynamic_entity_type("user", {
"type" : "user",
"prefix" : "U",
"class_id" : [ 1, 100],
"title" : "用户",
"db_collection" : "user"
});
EntityFactory.append_dynamic_entity_info("user", {
"class_id" : 1,
"name" : "ENT",
"ob_file" : __DIR__ "ent.gs",
"desc" : "test entity"
});
EntityFactory.reload_dynamic();

// 加载排行榜基类
rank.load_all_entry(__DIR__ "board/");

// 启动排行榜
rank.start();

// 没有rank server,这里应该就是false
test_equal(rank.ok(), false);

// 创建实体
map dbase = {};
object ent_ob = EntityFactory.create_entity(1, dbase, this_domain());
test_equal(ent_ob != nil, true);

// 生成金币数据
rank.clear_board("user_gem");
ent_ob.gen_gem_data("g0", 1000, time.time());
ent_ob.gen_gem_data("g1", 2000, time.time());
ent_ob.gen_gem_data("g2", 2000, time.time() + 3600);
ent_ob.gen_gem_data("g3", 1000, time.time() - 3600);

// 生成等级数据
rank.clear_board("user_level");
ent_ob.gen_level_data("g0", 1000, time.time());
ent_ob.gen_level_data("g1", 2000, time.time());
ent_ob.gen_level_data("g2", 2000, time.time() + 3600);
ent_ob.gen_level_data("g3", 1000, time.time() - 3600);
}