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 | ... | ... |