From 440aa055543a9be39467532389631332a02386c8 Mon Sep 17 00:00:00 2001 From: zhouhaihai Date: Wed, 20 Nov 2019 17:57:11 +0800 Subject: [PATCH] 聊天 --- src/RedisKeys.lua | 8 ++++++++ src/actions/PvpAction.lua | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/actions/RoleAction.lua | 19 +++++++++++-------- src/models/Daily.lua | 8 ++++++-- src/models/Pvp.lua | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/models/RolePlugin.lua | 15 +++++++++++++++ 6 files changed, 190 insertions(+), 10 deletions(-) create mode 100644 src/actions/PvpAction.lua create mode 100644 src/models/Pvp.lua diff --git a/src/RedisKeys.lua b/src/RedisKeys.lua index 8d4e459..19f6b6c 100644 --- a/src/RedisKeys.lua +++ b/src/RedisKeys.lua @@ -4,6 +4,7 @@ R_HEROS = "role:%d:heroIds" R_HERO = "hero:%d:%d" R_DAILY = "role:%d:daily" R_DINER = "role:%d:diner" -- 餐厅 +R_PVP = "role:%d:pvp" -- pvp R_EQUIP_ROOT = "role:%d:equip*" -- 装备根目录 R_RUNEIDS = "role:%d:runeIds" -- 玩家拥有符文自增id R_RUNE = "role:%d:rune:%d" -- 符文详细信息 @@ -15,6 +16,12 @@ RANK_TOWER_INFO = "rank:tower:info" RANK_DINER = {"rank:diner1", "rank:diner2"} -- 餐厅排行榜 两个每天互换 RANK_DINER_INFO = "rank:diner:info" + +RANK_PVP_COMMON = "rank:pvpc" +RANK_PVP_INFO_COMMON = "rank:pvpc:info" + +RANK_PVP_HIGHT = "rank:pvph" +RANK_PVP_INFO_HIGHT = "rank:pvph:info" -- -- role -- R_FARM_KEY = "role:%d:farm" -- R_TOWER_KEY = "role:%d:tower" @@ -47,6 +54,7 @@ FRIEND_APPLY_KEY = "role:%d:apply" -- sort set 申请列表 FRIEND_BLACK_KEY = "role:%d:black" -- set 黑名单 FRIEND_POINT = "role:%d:point" -- set 当天送给我心的人 FRIEND_RECOMMEND = "friend:recommend" -- sort set 登录排序 获取推荐好友 +CHAT_OFFLINE = "chat:offline:%d" --消息离线缓存 -- FRIEND_DINER_LIKE_KEY = "role:%d:diner:like" -- list diff --git a/src/actions/PvpAction.lua b/src/actions/PvpAction.lua new file mode 100644 index 0000000..4369f07 --- /dev/null +++ b/src/actions/PvpAction.lua @@ -0,0 +1,74 @@ +local ipairs = ipairs +local table = table +local math = math +local redisproxy = redisproxy +local MsgPack = MsgPack + + +local _M = {} + + +function _M.formatCommonRpc(agent , data) + local role = agent.role + local msg = MsgPack.unpack(data) + local pvpFC = role.pvpData:getProperty("pvpFC") + for slot, heroId in pairs(msg.heros) do + if not role.heros[heroId] then + return + end + end + table.clear(pvpFC) + pvpFC.heros = {} + for slot, heroId in pairs(msg.heros) do + pvpFC.heros[slot] = heroId + end + pvpFC.leader = msg.leader + + role.pvpData:updateProperty({field = "pvpFC", value = pvpFC}) + SendPacket(actionCodes.Pvp_formatCommonRpc, '') + return true +end + +function _M.formatHighRpc(agent , data) + local role = agent.role + local msg = MsgPack.unpack(data) + local pvpFH = role.pvpData:getProperty("pvpFH") + + + role.pvpData:updateProperty({field = "pvpFH", value = pvpFH}) + SendPacket(actionCodes.Pvp_formatHighRpc, '') + return true +end + +function _M.refreshMatchRpc(agent, data) + local role = agent.role + local msg = MsgPack.unpack(data) + local pvpData = role.pvpData + pvpData:refreshMatchC() + + SendPacket(actionCodes.Pvp_refreshMatchRpc, '') + return true +end + +function _M.buyCountRpc(agent, data) + local role = agent.role + local msg = MsgPack.unpack(data) + + + SendPacket(actionCodes.Pvp_buyCountRpc, '') + return true +end + +function _M.startBattleRpc(agent, data) + +end + +function _M.endBattleRpc(agent, data) + +end + +function _M.matchListRpc(agent, data) + +end + +return _M \ No newline at end of file diff --git a/src/actions/RoleAction.lua b/src/actions/RoleAction.lua index 6fa9b31..6f9abca 100644 --- a/src/actions/RoleAction.lua +++ b/src/actions/RoleAction.lua @@ -124,7 +124,7 @@ function _M.loginRpc( agent, data ) role:setProperty("ltime", now) redisproxy:zadd(FRIEND_RECOMMEND, now, roleId) - for _, name in ipairs({"dailyData", "dinerData"}) do + for _, name in ipairs({"dailyData", "dinerData", "pvpData"}) do response[name] = role[name]:data() end @@ -226,6 +226,7 @@ function _M.loginRpc( agent, data ) msgs = {} end worldChatResponse.worldChats = msgs + worldChatResponse.p2pChats = redisproxy:lrange(CHAT_OFFLINE:format(roleId), 0, -1) worldChatResponse.chatWave = curWave + 1 curWave = curWave + 1 @@ -647,15 +648,17 @@ function _M.chatRpc(agent, data) end -- 若在线,实时发送聊天信息 - local agent = datacenter.get("agent", toRoleId) - if not agent then - result = 2 - return - end + local agent = datacenter.get("agent", objectId) local bin = MsgPack.pack(response) - SendPacket(actionCode, bin, agent.fd) + if agent then + SendPacket(actionCode, bin, agent.fd) + else + redisproxy:pipelining(function(red) + red:rpush(CHAT_OFFLINE:format(objectId), bin) + red:ltrim(CHAT_OFFLINE:format(objectId), 0, 200) + end) + end SendPacket(actionCode, bin, fromFd) - end, } if not check[cmd] then return end diff --git a/src/models/Daily.lua b/src/models/Daily.lua index e3f36f4..9fbc4e2 100644 --- a/src/models/Daily.lua +++ b/src/models/Daily.lua @@ -25,12 +25,16 @@ function Daily:updateProperty(params) if params.delta then self:incrProperty(params.field, params.delta) - self.owner:notifyUpdateProperty(params.field, self:getProperty(params.field)) + if not params.notNotify then + self.owner:notifyUpdateProperty(params.field, self:getProperty(params.field)) + end return true end if params.value then self:setProperty(params.field, params.value) - self.owner:notifyUpdateProperty(params.field, self:getProperty(params.field)) + if not params.notNotify then + self.owner:notifyUpdateProperty(params.field, self:getProperty(params.field)) + end return true end return false diff --git a/src/models/Pvp.lua b/src/models/Pvp.lua new file mode 100644 index 0000000..5ffa952 --- /dev/null +++ b/src/models/Pvp.lua @@ -0,0 +1,76 @@ +-- 日常数据 + +local Pvp = class("Pvp", require("shared.ModelBase")) + +function Pvp:ctor(properties) + Pvp.super.ctor(self, properties) +end + +Pvp.schema = { + pvpFC = {"table", {}}, -- pvp 编队普通 + pvpFH = {"table", {}}, -- pvp 编队高级 + matchC = {"table", {}}, -- pvp 匹配的对手 普通 {{t = 1, id = roleId}, {t = 2, id = id}, {t = 2, id = id}} -- t 1 玩家 2 机器人 + matchH = {"table", {}}, -- pvp 匹配的对手 高级 {{t = 1, id = roleId}, {t = 2, id = id}, {t = 2, id = id}} -- t 1 玩家 2 机器人 +} + +function Pvp:updateProperty(params) + if params.delta then + self:incrProperty(params.field, params.delta) + if not params.notNotify then + self.owner:notifyUpdateProperty(params.field, self:getProperty(params.field)) + end + return true + end + if params.value then + self:setProperty(params.field, params.value) + if not params.notNotify then + self.owner:notifyUpdateProperty(params.field, self:getProperty(params.field)) + end + return true + end + return false +end + + + +function Pvp:refreshDailyData(notify) + +end + +function Pvp:rankResetData(notify) + +end + +function Pvp:refreshMatchC(score) + local roleId = self.owner:getProperty("id") + local score = score or redisproxy:zscore(RANK_PVP_COMMON, roleId) + local redret = redisproxy:pipelining(function(red) + + end) +end + + +function Pvp:changeScoreCommon(score) + local roleId = self.owner:getProperty("id") + local newScore = tonumber(redisproxy:ZINCRBY(RANK_PVP_COMMON, score, roleId)) + if newScore < 0 then -- 最低0分 + newScore = 0 + redisproxy:zadd(RANK_PVP_COMMON, 0, roleId) + end + self:refreshMatch(newScore) + return newScore +end + + +function Pvp:save + + + +function Pvp:data() + return { + pvpFC = self:getProperty("pvpFC"), + pvpFH = self:getProperty("pvpFH"), + } +end + +return Pvp \ No newline at end of file diff --git a/src/models/RolePlugin.lua b/src/models/RolePlugin.lua index 8338f4d..8689423 100644 --- a/src/models/RolePlugin.lua +++ b/src/models/RolePlugin.lua @@ -14,6 +14,7 @@ function RolePlugin.bind(Role) self:loadRunes() self:loadHeros() self:loadDiner() + self:loadPvp() end function Role:reloadWhenLogin() @@ -31,6 +32,7 @@ function RolePlugin.bind(Role) self.dailyData:refreshDailyData(notify) self.dinerData:refreshDailyData(notify) + self.pvpData:refreshDailyData(notify) self:setProperty("dTask", {}) response.dTask = {} @@ -71,6 +73,7 @@ function RolePlugin.bind(Role) local response = {} self.dinerData:rankResetData(notify) + self.pvpData:rankResetData(notify) return response end @@ -430,6 +433,18 @@ function RolePlugin.bind(Role) end end + function Role:loadPvp() + local roleId = self:getProperty("id") + local dataKey = string.format(R_PVP, roleId) + self.pvpData = require("models.Pvp").new({key = dataKey}) + self.pvpData.owner = self + if not redisproxy:exists(dataKey) then + self.pvpData:create() + else + self.pvpData:load() + end + end + function Role:loadEquips() -- 放role 里面了 end -- libgit2 0.21.2