需要在属性表配置用户环境变量的字段,为了节省内存空间,主管让我用一个字段记录多个数据状态,开始用表结构,但客户端不支持,就想到二进制数值保存数据
先简单测试了下使用效果,数据很直观,代码如下图:
活动奖励储存:以前的用法是rewardlist表储存已领取奖励列表也很方便,用数值的话更省空间
示例:奖励列表有7个id。表结构{1,2,4,6},对应二进制数字0101011(43)
打印方法
--10进制转二进制。n需要转的数,m几位数,二进制只有8位,改造了下
function byte2bin(n,m)
local t = {}
if not m then
m = 8
end
for i=m-1,0,-1 do
t[#t+1] = math.floor(n / 2^i)
n = n % 2^i
end
return table.concat(t)
end
配置表用户设置默认值,现在改成默认0
统一格式使用数值类型,转成二进制数记录修改后格式如下图
{ "userset" ,"int(11)" ,0
--0默认开放 是否播放bgm--是否允许好友申请--是否预设聊天内容--是否播放bgm
,"用户个性设置" },
--用户个性设置修改
function Player:ChangeUserSetting(type)
if self.cache.userset & (1<<(type - 1)) ~= 0 then
--已设置为1
self.cache.userset = self.cache.userset &~(1<<type-1)
else
self.cache.userset = self.cache.userset | (1<<(type - 1))
end
--个性设置
self.prop.userset = self.cache.userset
return true
end
因为只有简单的开关设置,所以设置时候1的类型改为0,0的类型改1
初始userset属性为0默认打开,调用四次Player:ChangeUserSetting(type=1,2,3,4)方法后为15(1111)四个设置关掉
再调用一次Player:ChangeUserSetting(type = 4)关掉,打印结果7 = 15-8测试开关没有问题
我们只需获取所需位数的值
--获取二进制数据索引值(从1右到左)
function lua_util.getbyte2index(x,index)
return (x>>index-1) & 1
end
这里是判定好友申请设置,如果不为0则不接受申请好友
--申请添加好友
function Friend:ApplyFriend(dbid)
local target = server.playerCenter:DoGetPlayerByDBID(dbid)
local targerdata = target.cache.friend_data
if lua_util.getbyte2index(target.prop.userset,settype) ~= 0 then
server.chatCenter:sendTipMsg(1712,self.player.cache.dbid)
return false
end
--(……省略)
end
类型控制
UserSetConfig.SettingType = {
isOpenBgm = 1, --是否播放bgm
isApplyFriend = 2, --是否允许申请好友
isdefalutChat = 3,--是否默认聊天框
test = 4,--
}
local settype = UserSetConfig.SettingType.isApplyFriend
二进制骚操作也很多,学习还是有用的
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。