game_server.user_data
简介
支持修改离线用户数据的功能模块
替换之前的engine.mods.user_data模块
如果玩家对象在线,则直接操作
如果玩家对象离线,则创建一个用户数据对象执行操作,操作在用户登录队列中执行的,是免锁安全的
组件接口
RawUser.gs
用户数据象 - 目前仅用于用户离线数据操作
本对象不会在RID表中记录
@export true
| 函数原型 | 函数作用 |
|---|---|
| bool is_raw_user() | 判断是否为用户数据对象 |
| map FSave.query_self_save_dbase() | 获得自身的存盘数据(常驻数据加上动态组件对象的常驻数据词典) |
user_data.gs
| 函数原型 | 函数作用 |
|---|---|
| bool setup(map para = ) | 执行模块初始化 |
| object create_raw_user(string user_rid) | 创建RawUser对象(需要自己保证安全性) |
| array safe_invoke(string user_rid, function func) | 安全的处理离线玩家用户数据 |
样例
public void test()
{
// 启动engine
cfg.init_by_map({
"server_id" : 1234,
"disable_mongo" : true
});
engine.boot();
// 模拟玩家配置
EntityFactory.append_dynamic_entity_type("user", {
"prefix" : "U",
"class_id" : [ 1, 999 ],
"title" : "用户",
"type" : "user"
}, true);
EntityFactory.append_dynamic_entity_info("user", {
"class_id" : 1,
"name" : "玩家"
}, true);
// 玩家数据模块初始化
bool setup_result = user_data.setup({
"get_user_account_func" : (: get_user_account_func :),
"create_raw_user_func" : (: create_raw_user_func :),
});
test_equal(setup_result, true);
// 模拟访问离线玩家数据
string user_rid = "U000067B4379A0000";
let bool invoked, mixed invoke_result = user_data.safe_invoke(user_rid, parallel (object raw_user_ob) {
raw_user_ob.set("aaa", 100);
raw_user_ob.set("bbb", 200);
return raw_user_ob.raw_query("aaa") + raw_user_ob.raw_query("bbb");
});
if (invoked)
test_equal(invoke_result, 300);
else
test_equal(invoke_result, nil);
}
string get_user_account_func(string user_rid)
{
return user_rid;
}
object create_raw_user_func(string user_rid)
{
map user_dbase = {
"rid" : user_rid,
"class_id" : 1
};
RawUserCreator creator = RawUserCreator.new(user_dbase, nil, GaRawUser);
return EntityFactory.create_entity_by_creator(creator);
}