Commit ad484303cb54fc675d96a74be7c853e067641e9f
1 parent
f58eefd7
add rune
Showing
6 changed files
with
114 additions
and
69 deletions
Show diff stats
.luacheckrc
src/RedisKeys.lua
| ... | ... | @@ -6,8 +6,8 @@ R_DAILY = "role:%d:daily" |
| 6 | 6 | R_DINER = "role:%d:diner" -- 餐厅 |
| 7 | 7 | R_EQUIP_ROOT = "role:%d:equip*" -- 装备根目录 |
| 8 | 8 | R_EQUIP = "role:%d:equip:%d:%d" -- 装备type:level |
| 9 | -R_RUNE_ROOT = "role:%d:rune*" -- 符文根目录 | |
| 10 | -R_RUNE = "role:%d:rune:%d" -- 符文零件id:level | |
| 9 | +R_RUNEIDS = "role:%d:runeIds" -- 玩家拥有符文自增id | |
| 10 | +R_RUNE = "role:%d:rune:%d" -- 符文详细信息 | |
| 11 | 11 | |
| 12 | 12 | -- -- role |
| 13 | 13 | -- R_FARM_KEY = "role:%d:farm" | ... | ... |
src/actions/GmAction.lua
| ... | ... | @@ -30,6 +30,13 @@ function _M.equip(role, pms) |
| 30 | 30 | return "成功" |
| 31 | 31 | end |
| 32 | 32 | |
| 33 | +function _M.rune(role, pms) | |
| 34 | + local typ = tonum(pms.pm1) | |
| 35 | + local id = tonum(pms.pm2) | |
| 36 | + local result = role:addRune({type = typ,id = id}) | |
| 37 | + return result | |
| 38 | +end | |
| 39 | + | |
| 33 | 40 | function _M.get(role, pms) |
| 34 | 41 | local itemId = tonum(pms.pm1) |
| 35 | 42 | if not csvdb["itemCsv"][itemId] then | ... | ... |
src/models/Equip.lua
| ... | ... | @@ -11,6 +11,24 @@ function Equip:ctor( properties ) |
| 11 | 11 | Equip.super.ctor(self, properties) |
| 12 | 12 | end |
| 13 | 13 | |
| 14 | +function Equip:notifyUpdateProperty(field, newValue, oldValue) | |
| 15 | + local datas = { | |
| 16 | + key = field, | |
| 17 | + newValue = newValue, | |
| 18 | + oldValue = oldValue, | |
| 19 | + } | |
| 20 | + self:notifyUpdateProperties(datas) | |
| 21 | +end | |
| 22 | + | |
| 23 | +function Equip:notifyUpdateProperties(params) | |
| 24 | + local updateData = { | |
| 25 | + type = self:getProperty("type"), | |
| 26 | + level = self:getProperty("level"), | |
| 27 | + datas = params | |
| 28 | + } | |
| 29 | + SendPacket(actionCodes.Role_updateEquip, MsgPack.pack(updateData)) | |
| 30 | +end | |
| 31 | + | |
| 14 | 32 | function Equip:updateProperty(params) |
| 15 | 33 | if not params.field or (not params.delta and not params.value) then |
| 16 | 34 | return |
| ... | ... | @@ -20,7 +38,7 @@ function Equip:updateProperty(params) |
| 20 | 38 | elseif params.value then |
| 21 | 39 | self:setProperty(params.field, params.value) |
| 22 | 40 | end |
| 23 | - SendPacket(actionCodes.Role_updateEquip, MsgPack.pack(self:data())) | |
| 41 | + self:notifyUpdateProperties(self:data()) | |
| 24 | 42 | end |
| 25 | 43 | |
| 26 | 44 | function Equip:data() | ... | ... |
src/models/RolePlugin.lua
| ... | ... | @@ -433,72 +433,52 @@ function RolePlugin.bind(Role) |
| 433 | 433 | end |
| 434 | 434 | |
| 435 | 435 | function Role:loadRunes() |
| 436 | - -- local roleId = self:getProperty("id") | |
| 437 | - -- self.runeBag = {} | |
| 438 | - -- local keys = redisproxy:keys(string.format(R_EQUIP_ROOT, roleId)) | |
| 439 | - -- if keys and next(keys) then | |
| 440 | - -- for _,v in pairs(keys) do | |
| 441 | - -- local rune = require("models.Rune").new({key = v}) | |
| 442 | - -- rune.owner = self | |
| 443 | - -- self.runeBag[rune.id][rune.level] = rune | |
| 444 | - -- end | |
| 445 | - -- end | |
| 446 | - end | |
| 447 | - | |
| 448 | - function Role:addHero(params) | |
| 449 | 436 | local roleId = self:getProperty("id") |
| 450 | - local heroId = tonum(redisproxy:hincrby(string.format(R_INCR, roleId), "hero", 1)) | |
| 451 | - local heroType = params.type | |
| 452 | - | |
| 453 | - redisproxy:sadd(string.format(R_HEROS, roleId), heroId) | |
| 454 | - | |
| 455 | - local heroInfo = { | |
| 456 | - key = string.format(R_HERO, roleId, heroId), | |
| 457 | - id = heroId, | |
| 458 | - type= heroType, | |
| 459 | - } | |
| 460 | - | |
| 461 | - local newHero = require("models.Hero").new(heroInfo) | |
| 462 | - newHero:create() | |
| 463 | - newHero.owner = self | |
| 464 | - newHero:saveBattleValue() | |
| 465 | - self.heros[heroId] = newHero | |
| 466 | - | |
| 467 | - if not params.notNotify then | |
| 468 | - local heroResponse = {} | |
| 469 | - table.insert(heroResponse, newHero:data()) | |
| 470 | - local bin = MsgPack.pack(heroResponse) | |
| 471 | - SendPacket(actionCodes.Hero_loadInfos, bin) | |
| 437 | + local runeIds = redisproxy:smembers(string.format(R_RUNEIDS, roleId)) | |
| 438 | + local redret = redisproxy:pipelining(function (red) | |
| 439 | + for _, runeId in ipairs(runeIds) do | |
| 440 | + red:hgetall(string.format(R_RUNE, roleId, runeId)) | |
| 441 | + end | |
| 442 | + end) | |
| 443 | + for index, runeId in ipairs(runeIds) do | |
| 444 | + local rune = require("models.Rune").new({key = string.format(R_RUNE, roleId, runeId)}) | |
| 445 | + if rune:load(table.array2Table(redret[index])) then | |
| 446 | + rune.owner = self | |
| 447 | + self.runeBag[tonumber(runeId)] = rune | |
| 448 | + end | |
| 472 | 449 | end |
| 473 | 450 | end |
| 474 | 451 | |
| 452 | + -- 0 为操作成功 | |
| 475 | 453 | function Role:addRune(params) |
| 476 | - local roleId = self:getProperty("id") | |
| 477 | - local runeId = params.id | |
| 478 | - local runeLv = params.level | |
| 479 | - local count = params.count | |
| 480 | - local rune = nil | |
| 481 | - local runeSet = self.runeBag[runeId] | |
| 482 | - if runeSet then | |
| 483 | - rune = self.runeBag[runeId][runeLv] | |
| 484 | - else | |
| 485 | - self.runeBag[runeId] = {} | |
| 486 | - end | |
| 454 | + if params.type and params.id then | |
| 455 | + local set = csvdb["runeCsv"][params.type] | |
| 456 | + if not set then return 2 end | |
| 457 | + local data = set[params.id] | |
| 458 | + if not data then return 3 end | |
| 459 | + | |
| 460 | + local roleId = self:getProperty("id") | |
| 461 | + local runeUid = tonum(redisproxy:hincrby(string.format(R_INCR, roleId), "rune", 1)) | |
| 462 | + | |
| 463 | + redisproxy:sadd(string.format(R_RUNEIDS, roleId), runeUid) | |
| 464 | + | |
| 465 | + local heroInfo = { | |
| 466 | + key = string.format(R_RUNE, roleId, runeUid), | |
| 467 | + uid = runeUid, | |
| 468 | + type = params.type, | |
| 469 | + id = params.id, | |
| 470 | + } | |
| 471 | + | |
| 472 | + local newRune = require("models.Rune").new(heroInfo) | |
| 473 | + newRune:create() | |
| 474 | + newRune:generateAttrs() | |
| 475 | + newRune.owner = self | |
| 476 | + self.runeBag[runeUid] = newRune | |
| 487 | 477 | |
| 488 | - if rune then | |
| 489 | - count = rune:getProperty("count")+count | |
| 478 | + return 0 | |
| 490 | 479 | else |
| 491 | - local data = { | |
| 492 | - key = string.format(R_RUNE,roleId,runeId,runeLv), | |
| 493 | - id = runeId, | |
| 494 | - level = runeLv, | |
| 495 | - } | |
| 496 | - rune = require("models.Rune").new(data) | |
| 497 | - rune.owner = self | |
| 498 | - rune:create() | |
| 480 | + return 1 | |
| 499 | 481 | end |
| 500 | - rune:updateProperty({field = "count", value = math.min(count,0)}) | |
| 501 | - self.runeBag[runeId][runeLv] = rune | |
| 502 | 482 | end |
| 503 | 483 | |
| 504 | 484 | function Role:getRuneCount(id,lv) | ... | ... |
src/models/Rune.lua
| 1 | 1 | local Rune = class("Rune", require("shared.ModelBase")) |
| 2 | 2 | Rune.schema = { |
| 3 | + uid = {"number"}, -- 唯一自增id | |
| 4 | + type = {"number"}, -- 装备位置 | |
| 3 | 5 | id = {"number"}, |
| 4 | 6 | level = {"number", 0}, -- 等级 |
| 5 | - count = {"number", 0}, -- 数量 | |
| 6 | 7 | refer = {"number", 0}, -- 已装备英雄id |
| 8 | + attrs = {"string",""} -- 基础属性值 id=value | |
| 7 | 9 | } |
| 8 | 10 | |
| 9 | 11 | function Rune:ctor( properties ) |
| ... | ... | @@ -21,7 +23,7 @@ end |
| 21 | 23 | |
| 22 | 24 | function Rune:notifyUpdateProperties(params) |
| 23 | 25 | local updateData = { |
| 24 | - id = self:getProperty("id"), | |
| 26 | + uid = self:getProperty("uid"), | |
| 25 | 27 | datas = params |
| 26 | 28 | } |
| 27 | 29 | SendPacket(actionCodes.Role_updateRune, MsgPack.pack(updateData)) |
| ... | ... | @@ -36,16 +38,54 @@ function Rune:updateProperty(params) |
| 36 | 38 | elseif params.value then |
| 37 | 39 | self:setProperty(params.field, params.value) |
| 38 | 40 | end |
| 39 | - local datas = {} | |
| 40 | - table.insert(datas, {key = params.field, newValue = self:getProperty(params.field)}) | |
| 41 | - self:notifyUpdateProperties(datas) | |
| 41 | + self:notifyUpdateProperties(self:data()) | |
| 42 | +end | |
| 43 | + | |
| 44 | +-- types 类型=权重"2=100 3=100 4=100" value最大值=最小值 "50=100 50=100 100=200" | |
| 45 | +local function getRandomValue(types,values) | |
| 46 | + local typeMap = types:toNumMap() | |
| 47 | + local valueArry = values:toArray() | |
| 48 | + if table.nums(typeMap) ~= #valueArry then return nil end | |
| 49 | + local typ,value | |
| 50 | + local typTab,weightSum = {},0 | |
| 51 | + for t,w in pairs(typeMap) do | |
| 52 | + weightSum = weightSum + w | |
| 53 | + table.insert(typTab,{t=t,w=weightSum}) | |
| 54 | + end | |
| 55 | + | |
| 56 | + local tk | |
| 57 | + local tmp = math.random(1,weightSum) | |
| 58 | + for k,v in ipairs(typTab) do | |
| 59 | + if v.w > tmp then | |
| 60 | + typ = v.t | |
| 61 | + tk = k | |
| 62 | + break | |
| 63 | + end | |
| 64 | + end | |
| 65 | + | |
| 66 | + local range = valueArry[tk]:toArray(true,"=") | |
| 67 | + value = math.random(range[1],range[2]) | |
| 68 | + print("typ "..typ.." value "..value) | |
| 69 | + return typ,value | |
| 70 | +end | |
| 71 | + | |
| 72 | +function Rune:generateAttrs() | |
| 73 | + local runeData = csvdb["runeCsv"][self:getProperty("type")][self:getProperty("id")] | |
| 74 | + local attrs = "" | |
| 75 | + attrs:setv(1,20) | |
| 76 | + attrs:setv(getRandomValue(runeData.attr1,runeData.range1)) | |
| 77 | + attrs:setv(getRandomValue(runeData.attr2,runeData.range2)) | |
| 78 | + print(attrs) | |
| 79 | + self:setProperty("attrs","2=30") | |
| 42 | 80 | end |
| 43 | 81 | |
| 44 | 82 | function Rune:data() |
| 45 | 83 | return { |
| 84 | + uid = self:getProperty("uid"), | |
| 85 | + type = self:getProperty("type"), | |
| 46 | 86 | id = self:getProperty("id"), |
| 47 | - level = self:getProperty("level"), | |
| 48 | - count = self:getProperty("count"), | |
| 87 | + refer = self:getProperty("refer"), | |
| 88 | + attrs = self:getProperty("attrs"), | |
| 49 | 89 | } |
| 50 | 90 | end |
| 51 | 91 | ... | ... |