Commit 284482c639e450a29dd69cc4b6b2b15d95bb299b
1 parent
56484297
冒险成就
Showing
4 changed files
with
66 additions
and
14 deletions
Show diff stats
src/actions/AdvAction.lua
src/actions/GmAction.lua
| ... | ... | @@ -213,7 +213,6 @@ function _M.fbc(role, pms) -- 直接通关 |
| 213 | 213 | end |
| 214 | 214 | end |
| 215 | 215 | addPre(carbonId) |
| 216 | - role:updateProperty({field = "hangInfo", value = {}}) | |
| 217 | 216 | role:updateProperty({field = "hangPass", value = passCarbon}) |
| 218 | 217 | role:checkTaskEnter("HangPass", {id = carbonId}) |
| 219 | 218 | ... | ... |
src/adv/AdvTask.lua
| ... | ... | @@ -248,18 +248,33 @@ function AdvTask.bind(Adv) |
| 248 | 248 | |
| 249 | 249 | local advAchievChange = {} |
| 250 | 250 | |
| 251 | - local function insertChange(chapterId, taskId, value, pts) | |
| 251 | + local function insertChange(self, chapterId, taskId, value, pts) | |
| 252 | 252 | local achievField = AdvCommon.isEndless(chapterId) and "advEAchiev" or "advAchiev" |
| 253 | + local dbData = self.owner:getProperty(achievField) | |
| 253 | 254 | if pts then |
| 254 | - table.insert(advAchievChange, {type = achievField, field = {chapterId, "pts", taskId}, value = value}) | |
| 255 | + advAchievChange[achievField] = advAchievChange[achievField] or {} | |
| 256 | + advAchievChange[achievField][chapterId] = advAchievChange[achievField][chapterId] or {} | |
| 257 | + advAchievChange[achievField][chapterId]["pts"] = advAchievChange[achievField][chapterId]["pts"] or {} | |
| 258 | + advAchievChange[achievField][chapterId]["pts"][taskId] = value | |
| 259 | + | |
| 260 | + dbData[chapterId] = dbData[chapterId] or {} | |
| 261 | + dbData[chapterId]["pts"] = dbData[chapterId]["pts"] or {} | |
| 262 | + dbData[chapterId]["pts"][taskId] = value | |
| 255 | 263 | else |
| 256 | - table.insert(advAchievChange, {type = achievField, field = {chapterId, taskId}, value = value}) | |
| 264 | + advAchievChange[achievField] = advAchievChange[achievField] or {} | |
| 265 | + advAchievChange[achievField][chapterId] = advAchievChange[achievField][chapterId] or {} | |
| 266 | + advAchievChange[achievField][chapterId][taskId] = value | |
| 267 | + | |
| 268 | + dbData[chapterId] = dbData[chapterId] or {} | |
| 269 | + dbData[chapterId][taskId] = value | |
| 257 | 270 | end |
| 258 | 271 | end |
| 259 | 272 | |
| 260 | 273 | function Adv:checkAchievement(taskType, count, cond, cond2) |
| 261 | 274 | local achievField = self:isEndless() and "advEAchiev" or "advAchiev" |
| 262 | - local advAchiev = self.owner:getProperty(achievField)[self.chapterId] or {} | |
| 275 | + local dbData = self.owner:getProperty(achievField) | |
| 276 | + dbData[self.chapterId] = dbData[self.chapterId] or {} | |
| 277 | + local advAchiev = dbData[self.chapterId] | |
| 263 | 278 | for taskId , data in pairs(csvdb["adv_achievementCsv"][self.chapterId] or {}) do |
| 264 | 279 | local oldStatus = advAchiev[taskId] or 0 |
| 265 | 280 | if oldStatus ~= -1 and data.type == taskType then |
| ... | ... | @@ -332,18 +347,18 @@ function AdvTask.bind(Adv) |
| 332 | 347 | |
| 333 | 348 | if self:isEndless() then |
| 334 | 349 | if status and status ~= oldStatus then |
| 335 | - insertChange(self.chapterId, taskId, status) | |
| 350 | + insertChange(self, self.chapterId, taskId, status) | |
| 336 | 351 | end |
| 337 | 352 | else |
| 338 | 353 | if (status or -1) >= data.value1 then |
| 339 | 354 | status = -1 |
| 340 | 355 | end |
| 341 | 356 | if status and status ~= oldStatus then |
| 342 | - insertChange(self.chapterId, taskId, status) | |
| 357 | + insertChange(self, self.chapterId, taskId, status) | |
| 343 | 358 | if status == -1 then |
| 344 | - local ptcount = (self.owner:getProperty(achievField)[self.chapterId] or {})[-1] or 0 | |
| 359 | + local ptcount = advAchiev[-1] or 0 | |
| 345 | 360 | ptcount = ptcount + data.pt |
| 346 | - insertChange(self.chapterId, -1, ptcount) | |
| 361 | + insertChange(self, self.chapterId, -1, ptcount) | |
| 347 | 362 | end |
| 348 | 363 | end |
| 349 | 364 | end |
| ... | ... | @@ -361,10 +376,10 @@ function AdvTask.bind(Adv) |
| 361 | 376 | |
| 362 | 377 | local reward = {} |
| 363 | 378 | if status >= achievData.value1 then |
| 364 | - insertChange(chapterId, taskId, -1) | |
| 379 | + insertChange(self, chapterId, taskId, -1) | |
| 365 | 380 | local count = (self.owner:getProperty(achievField)[chapterId] or {})[-1] or 0 |
| 366 | 381 | count = count + achievData.pt |
| 367 | - insertChange(chapterId, -1, count) | |
| 382 | + insertChange(self, chapterId, -1, count) | |
| 368 | 383 | |
| 369 | 384 | -- 发放奖励 |
| 370 | 385 | reward = self.owner:award(achievData.reward, {log = {desc = "advAchiev", int1 = chapterId, int2 = taskId}}) |
| ... | ... | @@ -380,13 +395,14 @@ function AdvTask.bind(Adv) |
| 380 | 395 | if status == -1 or count < achievData.pt then return end |
| 381 | 396 | |
| 382 | 397 | local reward = self.owner:award(achievData.reward, {log = {desc = "advAchievReward", int1 = chapterId, int2 = taskId}}) |
| 383 | - insertChange(chapterId, taskId, -1, true) | |
| 398 | + insertChange(self, chapterId, taskId, -1, true) | |
| 384 | 399 | return true, reward |
| 385 | 400 | end |
| 386 | 401 | |
| 387 | 402 | function Adv:updateAchievement(notNotify) |
| 388 | 403 | if not next(advAchievChange) then return end |
| 389 | - self.owner:changeUpdates(advAchievChange, notNotify) | |
| 404 | + self.owner:changeMapUpdates(advAchievChange, notNotify) | |
| 405 | + advAchievChange = {} | |
| 390 | 406 | end |
| 391 | 407 | |
| 392 | 408 | end | ... | ... |
src/models/Role.lua
| ... | ... | @@ -192,8 +192,39 @@ function Role:notifyUpdateProperties(params) |
| 192 | 192 | SendPacket(actionCodes.Role_updateProperties, MsgPack.pack(params)) |
| 193 | 193 | end |
| 194 | 194 | |
| 195 | +local mapToList | |
| 196 | +mapToList = function(map) | |
| 197 | + local result = {} | |
| 198 | + if type(map) == "table" then | |
| 199 | + for k, v in pairs(map) do | |
| 200 | + for _, _one in ipairs(mapToList(v)) do | |
| 201 | + table.insert(result, {k, table.unpack(_one)}) | |
| 202 | + end | |
| 203 | + end | |
| 204 | + else | |
| 205 | + table.insert(result, {map}) | |
| 206 | + end | |
| 207 | + return result | |
| 208 | +end | |
| 209 | + | |
| 210 | +function Role:changeMapUpdates(params, notNotify) | |
| 211 | + local changes = {} | |
| 212 | + for _, one in ipairs(mapToList(params)) do | |
| 213 | + local ftype = table.remove(one, 1) | |
| 214 | + local value = table.remove(one, #one) | |
| 215 | + if ftype and value and #one > 0 then | |
| 216 | + table.insert(changes, {type = ftype, field = #one > 1 and one or one[1], value = value}) | |
| 217 | + else | |
| 218 | + print("ERROR: changeMapUpdates") | |
| 219 | + dump(params) | |
| 220 | + end | |
| 221 | + end | |
| 222 | + self:changeUpdates(changes, notNotify) | |
| 223 | +end | |
| 224 | + | |
| 195 | 225 | -- 某些字段 更新改变量 改变量的定义由字段自身决定 {{type = ""}, } |
| 196 | 226 | function Role:changeUpdates(params, notNotify) |
| 227 | + local needSetProperty = {} | |
| 197 | 228 | local changeUpdateFunc = { |
| 198 | 229 | -- ["loveStatus"] = function(info) |
| 199 | 230 | -- self:setProperty("loveStatus", self:getProperty("loveStatus"):setv(info["field"], info["value"])) |
| ... | ... | @@ -219,7 +250,7 @@ function Role:changeUpdates(params, notNotify) |
| 219 | 250 | else |
| 220 | 251 | curValue[info["field"]] = info["value"] |
| 221 | 252 | end |
| 222 | - self:setProperty(fieldType) | |
| 253 | + needSetProperty[fieldType] = 1 | |
| 223 | 254 | return {type = fieldType, field = info["field"], value = info["value"]} |
| 224 | 255 | end, |
| 225 | 256 | ["onlyToC"] = function(info) |
| ... | ... | @@ -238,6 +269,10 @@ function Role:changeUpdates(params, notNotify) |
| 238 | 269 | table.insert(updates, changeUpdateFunc["tableCommon"](one["type"], one)) |
| 239 | 270 | end |
| 240 | 271 | end |
| 272 | + | |
| 273 | + for fieldType, _ in pairs(needSetProperty) do | |
| 274 | + self:setProperty(fieldType) | |
| 275 | + end | |
| 241 | 276 | if not notNotify and next(updates) then |
| 242 | 277 | SendPacket(actionCodes.Role_changeUpdate, MsgPack.pack(updates)) |
| 243 | 278 | end | ... | ... |