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,8 +6,8 @@ R_DAILY = "role:%d:daily" | ||
6 | R_DINER = "role:%d:diner" -- 餐厅 | 6 | R_DINER = "role:%d:diner" -- 餐厅 |
7 | R_EQUIP_ROOT = "role:%d:equip*" -- 装备根目录 | 7 | R_EQUIP_ROOT = "role:%d:equip*" -- 装备根目录 |
8 | R_EQUIP = "role:%d:equip:%d:%d" -- 装备type:level | 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 | -- -- role | 12 | -- -- role |
13 | -- R_FARM_KEY = "role:%d:farm" | 13 | -- R_FARM_KEY = "role:%d:farm" |
src/actions/GmAction.lua
@@ -30,6 +30,13 @@ function _M.equip(role, pms) | @@ -30,6 +30,13 @@ function _M.equip(role, pms) | ||
30 | return "成功" | 30 | return "成功" |
31 | end | 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 | function _M.get(role, pms) | 40 | function _M.get(role, pms) |
34 | local itemId = tonum(pms.pm1) | 41 | local itemId = tonum(pms.pm1) |
35 | if not csvdb["itemCsv"][itemId] then | 42 | if not csvdb["itemCsv"][itemId] then |
src/models/Equip.lua
@@ -11,6 +11,24 @@ function Equip:ctor( properties ) | @@ -11,6 +11,24 @@ function Equip:ctor( properties ) | ||
11 | Equip.super.ctor(self, properties) | 11 | Equip.super.ctor(self, properties) |
12 | end | 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 | function Equip:updateProperty(params) | 32 | function Equip:updateProperty(params) |
15 | if not params.field or (not params.delta and not params.value) then | 33 | if not params.field or (not params.delta and not params.value) then |
16 | return | 34 | return |
@@ -20,7 +38,7 @@ function Equip:updateProperty(params) | @@ -20,7 +38,7 @@ function Equip:updateProperty(params) | ||
20 | elseif params.value then | 38 | elseif params.value then |
21 | self:setProperty(params.field, params.value) | 39 | self:setProperty(params.field, params.value) |
22 | end | 40 | end |
23 | - SendPacket(actionCodes.Role_updateEquip, MsgPack.pack(self:data())) | 41 | + self:notifyUpdateProperties(self:data()) |
24 | end | 42 | end |
25 | 43 | ||
26 | function Equip:data() | 44 | function Equip:data() |
src/models/RolePlugin.lua
@@ -433,72 +433,52 @@ function RolePlugin.bind(Role) | @@ -433,72 +433,52 @@ function RolePlugin.bind(Role) | ||
433 | end | 433 | end |
434 | 434 | ||
435 | function Role:loadRunes() | 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 | local roleId = self:getProperty("id") | 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 | end | 449 | end |
473 | end | 450 | end |
474 | 451 | ||
452 | + -- 0 为操作成功 | ||
475 | function Role:addRune(params) | 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 | else | 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 | end | 481 | end |
500 | - rune:updateProperty({field = "count", value = math.min(count,0)}) | ||
501 | - self.runeBag[runeId][runeLv] = rune | ||
502 | end | 482 | end |
503 | 483 | ||
504 | function Role:getRuneCount(id,lv) | 484 | function Role:getRuneCount(id,lv) |
src/models/Rune.lua
1 | local Rune = class("Rune", require("shared.ModelBase")) | 1 | local Rune = class("Rune", require("shared.ModelBase")) |
2 | Rune.schema = { | 2 | Rune.schema = { |
3 | + uid = {"number"}, -- 唯一自增id | ||
4 | + type = {"number"}, -- 装备位置 | ||
3 | id = {"number"}, | 5 | id = {"number"}, |
4 | level = {"number", 0}, -- 等级 | 6 | level = {"number", 0}, -- 等级 |
5 | - count = {"number", 0}, -- 数量 | ||
6 | refer = {"number", 0}, -- 已装备英雄id | 7 | refer = {"number", 0}, -- 已装备英雄id |
8 | + attrs = {"string",""} -- 基础属性值 id=value | ||
7 | } | 9 | } |
8 | 10 | ||
9 | function Rune:ctor( properties ) | 11 | function Rune:ctor( properties ) |
@@ -21,7 +23,7 @@ end | @@ -21,7 +23,7 @@ end | ||
21 | 23 | ||
22 | function Rune:notifyUpdateProperties(params) | 24 | function Rune:notifyUpdateProperties(params) |
23 | local updateData = { | 25 | local updateData = { |
24 | - id = self:getProperty("id"), | 26 | + uid = self:getProperty("uid"), |
25 | datas = params | 27 | datas = params |
26 | } | 28 | } |
27 | SendPacket(actionCodes.Role_updateRune, MsgPack.pack(updateData)) | 29 | SendPacket(actionCodes.Role_updateRune, MsgPack.pack(updateData)) |
@@ -36,16 +38,54 @@ function Rune:updateProperty(params) | @@ -36,16 +38,54 @@ function Rune:updateProperty(params) | ||
36 | elseif params.value then | 38 | elseif params.value then |
37 | self:setProperty(params.field, params.value) | 39 | self:setProperty(params.field, params.value) |
38 | end | 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 | end | 80 | end |
43 | 81 | ||
44 | function Rune:data() | 82 | function Rune:data() |
45 | return { | 83 | return { |
84 | + uid = self:getProperty("uid"), | ||
85 | + type = self:getProperty("type"), | ||
46 | id = self:getProperty("id"), | 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 | end | 90 | end |
51 | 91 |