Role.lua
4.32 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
local Role = class("Role", require("shared.ModelBase"))
local RolePlugin = import(".RolePlugin")
local RoleTask = import(".RoleTask")
local RoleAdv = import(".RoleAdv")
local RoleActivity = import(".RoleActivity")
local RoleChangeStruct = import(".RoleChangeStruct")
RolePlugin.bind(Role)
RoleTask.bind(Role)
RoleAdv.bind(Role)
RoleActivity.bind(Role)
RoleChangeStruct.bind(Role)
function Role:ctor( properties )
Role.super.ctor(self, properties)
self.ignoreHeartbeat = false
self.heros = {}
end
Role.schema = {
id = {"number"},
uid = {"string", ""},
name = {"string", ""},
sid = {"number", 0},
device = {"string", ""},
banTime = {"number", 0},
banType = {"number", 0},
ltime = {"number", 0}, -- 最后登录时间
ctime = {"number", skynet.timex()}, -- 创建时间
ignoreMt = {"number", 0}, -- 忽略维护拦截
sversion = {"number", globalCsv.StructVersion or 0}, -- 重整数据版本
-- roleInfo
level = {"number", 0},
diamond = {"number", 0},
reDiamond = {"number", 0},
items = {"string", ""},
loveStatus = {"string", ""}, --统计角色的最高 好感度等级 类型相关 -- type=loveL type=loveL
--冒险相关
advPass = {"string", ""}, -- 通关记录
advInfo = {"table", {}}, -- 其他信息
}
function Role:notifyUpdateProperty(field, newValue, oldValue, extraValue)
local updateData = {
{
key = field,
newValue = newValue,
oldValue = oldValue or "",
extraValue = extraValue,
}
}
SendPacket(actionCodes.Role_updateProperty, MsgPack.pack(updateData))
end
function Role:updateProperty(params)
params = params or {}
if not self.schema[params.field] then return end
local oldValue = self:getProperty(params.field)
local ret = {key = params.field, oldValue = oldValue}
if params.value then
ret.newValue = params.value
self:setProperty(params.field, params.value)
elseif params.delta then
self:incrProperty(params.field, params.delta)
ret.newValue = self:getProperty(params.field)
else
return
end
if not params.notNotify then
SendPacket(actionCodes.Role_updateProperty, MsgPack.pack({ret}))
end
end
function Role:updateProperties(params, notNotify)
for field, value in pairs(params) do
self:setProperty(field, value)
end
if not notNotify then
SendPacket(actionCodes.Role_updateProperties, MsgPack.pack(params))
end
end
function Role:notifyUpdateProperties(params)
SendPacket(actionCodes.Role_updateProperties, MsgPack.pack(params))
end
-- 某些字段 更新改变量 改变量的定义由字段自身决定 {{type = ""}, }
function Role:changeUpdates(params, notNotify)
local changeUpdateFunc = {
["loveStatus"] = function(info)
self:setProperty("loveStatus", self:getProperty("loveStatus"):setv(info["field"], info["value"]))
return {type = "loveStatus", field = info["field"], value = info["value"]}
end,
--table 类型通用更新
["tableCommon"] = function(fieldType, info)
if self.class.schema[fieldType][1] ~= "table" then
error("[ERROR:] need handler for changeUpdate, field : " .. fieldType)
return
end
--支持多深度单字段
local curValue = self:getProperty(fieldType)
if type(info["field"]) == "table" then
for _idx, _field in ipairs(info["field"]) do
if _idx < #info["field"] then
curValue[_field] = curValue[_field] or {}
curValue = curValue[_field]
else
curValue[_field] = info["value"]
end
end
else
curValue[info["field"]] = info["value"]
end
self:setProperty(fieldType)
return {type = fieldType, field = info["field"], value = info["value"]}
end,
}
local updates = {}
for _, one in ipairs(params) do
if changeUpdateFunc[one["type"]] then
table.insert(updates, changeUpdateFunc[one["type"]](one))
else
table.insert(updates, changeUpdateFunc["tableCommon"](one["type"], one))
end
end
if not notNotify and next(updates) then
SendPacket(actionCodes.Role_changeUpdate, MsgPack.pack(updates))
end
end
function Role:data()
return {
id = self:getProperty("id"),
name = self:getProperty("name"),
level = self:getProperty("level"),
diamond = self:getProperty("diamond"),
reDiamond = self:getProperty("reDiamond"),
items = self:getProperty("items"):toNumMap(),
loveStatus = self:getProperty("loveStatus"):toNumMap(),
advPass = self:getProperty("advPass"),
advInfo = self:getProperty("advInfo"),
}
end
return Role