Commit 091912ed095c19f249a57fe099c142b3c51cc43d

Authored by chenyueqi
1 parent ac885527

未测试版好友能量助力活动

src/ProtocolCode.lua
... ... @@ -230,6 +230,7 @@ actionCodes = {
230 230 Activity_bossRewardRpc = 664,
231 231 Activity_crisisMilestoneRpc = 665,
232 232 Activity_commonSignRpc = 666,
  233 + Activity_friendHelpRpc = 667,
233 234  
234 235 Radio_startQuestRpc = 700,
235 236 Radio_finishQuestRpc = 701,
... ...
src/RedisKeys.lua
... ... @@ -47,6 +47,7 @@ FRIEND_KEY = "role:%d:friend" --哈希表 好友
47 47 FRIEND_APPLY_KEY = "role:%d:apply" -- sort set 申请列表
48 48 FRIEND_BLACK_KEY = "role:%d:black" -- set 黑名单
49 49 FRIEND_POINT = "role:%d:point" -- set 当天送给我心的人
  50 +FRIEND_ENERGY = "role:%d:energy" -- set 送给我活动能量的好友
50 51 FRIEND_RECOMMEND = "friend:recommend" -- sort set 登录排序 获取推荐好友
51 52 CHAT_OFFLINE = "chat:offline:%d" --消息离线缓存
52 53  
... ...
src/actions/ActivityAction.lua
... ... @@ -888,4 +888,173 @@ function _M.commonSignRpc(agent, data)
888 888 return true
889 889 end
890 890  
  891 +function _M.friendHelpRpc(agent, data)
  892 + local role = agent.role
  893 + local roleId = role:getProperty("id")
  894 + local msg = MsgPack.unpack(data)
  895 + local oper = tonumber(msg.oper) or -1
  896 + local actid = msg.actid
  897 + local result, award
  898 +
  899 + if not role.activity:isOpenById(actid, "FriendEnergy") then return 1 end
  900 + if oper < 0 or oper > 3 then return 2 end
  901 +
  902 + local actCsv = csvdb["activity_ctrlCsv"][actid]
  903 + local getLimit = actCsv.condition
  904 + local gifts = actCsv.condition2:toTableArray(true)
  905 +
  906 + local actData = role.activity:getActData("FriendEnergy") or {}
  907 +
  908 + local function getIds()
  909 + local ids = {}
  910 + local friends = redisproxy:hgetall(FRIEND_KEY:format(roleId))
  911 + for i = 1, #friends , 2 do
  912 + local objId = tonumber(friends[i])
  913 + ids[objId] = 1
  914 + end
  915 + return ids
  916 + end
  917 +
  918 + if oper == 0 then
  919 + local ids = {}
  920 + local friendIds = getIds()
  921 + for id, _ in pairs(friendIds) do
  922 + if redisproxy:sismember(FRIEND_ENERGY:format(roleId), id) then
  923 + ids[id] = 1
  924 + end
  925 + end
  926 + SendPacket(actionCodes.Activity_friendHelpRpc, MsgPack.pack({result = 1, ids = ids}))
  927 + return true
  928 + elseif oper == 1 then -- 赠送好友能量
  929 + local objId = msg.roleId
  930 + local gift = gifts[1]
  931 + local ids = {}
  932 +
  933 + if not objId then
  934 + if not redisproxy:hexists(FRIEND_KEY:format(roleId), objId) then
  935 + return 3
  936 + end
  937 + ids[objId] = 1
  938 + else
  939 + ids = getIds()
  940 + end
  941 +
  942 + local giveFE = actData.giveFE or {}
  943 + redisproxy:pipelining(function(red)
  944 + for friendId, _ in pairs(ids) do
  945 + if not giveFE[friendId] then
  946 + result = 1
  947 + giveFE[friendId] = 1
  948 + award[gift[1]] = (award[gift[1]] or 0) + gift[2]
  949 + red:sadd(FRIEND_ENERGY:format(friendId), roleId)
  950 + end
  951 + end
  952 + end)
  953 +
  954 + actData.giveFE = giveFE
  955 + elseif oper == 2 then -- 收取能量
  956 + local objId = msg.roleId
  957 + local gift = gifts[2]
  958 + local getFE = actData.getFE or {}
  959 + local limit = actData.limit or 0
  960 +
  961 + if limit >= getLimit then return 4 end
  962 +
  963 + local ids = {}
  964 + if not objId then
  965 + if not redisproxy:hexists(FRIEND_KEY:format(roleId), objId) then
  966 + return 5
  967 + end
  968 + if not redisproxy:sismember(FRIEND_ENERGY:format(roleId), objId) then
  969 + return 6
  970 + end
  971 + ids[objId] = 1
  972 + else
  973 + ids = getIds()
  974 + end
  975 +
  976 + local getFE = actData.getFE or {}
  977 + redisproxy:pipelining(function(red)
  978 + for friendId, _ in pairs(ids) do
  979 + if not getFE[friendId] and limit <= getLimit then
  980 + result = 1
  981 + limit = limit + 1
  982 + getFE[friendId] = 1
  983 + award[gift[1]] = (award[gift[1]] or 0) + gift[2]
  984 + red:srem(FRIEND_ENERGY:format(roleId), friendId)
  985 + end
  986 + end
  987 + end)
  988 +
  989 + actData.limit = limit
  990 + actData.getFE = getFE
  991 + elseif oper == 3 then -- 一键送领全部
  992 + local giveFE = actData.giveFE or {}
  993 + local getFE = actData.getFE or {}
  994 + local gift1 = gifts[1]
  995 + local gift2 = gifts[2]
  996 + local limit = actData.limit or 0
  997 + local ids = getIds()
  998 + redisproxy:pipelining(function(red)
  999 + for friendId, _ in pairs(ids) do
  1000 + if not giveFE[friendId] then
  1001 + result = 1
  1002 + giveFE[friendId] = 1
  1003 + award[gift1[1]] = (award[gift1[1]] or 0) + gift1[2]
  1004 + red:sadd(FRIEND_ENERGY:format(friendId), roleId)
  1005 + end
  1006 +
  1007 + if not getFE[friendId] and limit <= getLimit then
  1008 + result = 1
  1009 + limit = limit + 1
  1010 + getFE[friendId] = 1
  1011 + award[gift2[1]] = (award[gift2[1]] or 0) + gift2[2]
  1012 + red:srem(FRIEND_ENERGY:format(roleId), friendId)
  1013 + end
  1014 + end
  1015 + end)
  1016 +
  1017 + actData.limit = limit
  1018 + actData.giveFE = giveFE
  1019 + actData.getFE = getFE
  1020 + elseif oper == 4 then -- 抽大奖
  1021 + local magic = actData.magic or 0
  1022 + local rewards = actData.reward or {}
  1023 + local rewardCsv = csvdb["activity_orderRewardsCsv"][actid]
  1024 + local itemId1 = gifts[1][1]
  1025 + local itemId2 = gifts[2][1]
  1026 +
  1027 + local level = math.min(magic + 1,#rewardCsv)
  1028 + local rewardData = rewardCsv[level]
  1029 +
  1030 + local cost = {[itemId1] = rewardData.condition1, [itemId2] = rewardData.condition2}
  1031 +
  1032 + if not role:checkItemEnough(cost) then return 7 end
  1033 + role:costItems(cost, {log = {desc = "actFriendHelp", int1 = actid, int2 = level}})
  1034 +
  1035 + award = {}
  1036 + if rewardCsv.reward ~= "" then
  1037 + result = 1
  1038 + award = rewardCsv.reward:toNumMap()
  1039 + end
  1040 + if rewardCsv.reward_random ~= "" then
  1041 + result = 1
  1042 + local pool = {}
  1043 + for _, temp in pairs(rewardCsv.reward_random:toArray()) do
  1044 + table.insert(pool, temp:toArray(true, "="))
  1045 + end
  1046 + local gift = pool(math.randWeight(pool, 3))
  1047 + award[gift[1]] = (award[gift[1]] or 0) + gift[2]
  1048 + end
  1049 + rewards[level] = 1
  1050 + actData.reward = rewards
  1051 + actData.magic = level
  1052 + end
  1053 +
  1054 + local reward, change = role:award(award, {log = {desc = "actFriendHelp", int1 = actid, int2 = level}})
  1055 + role.activity:updateActData("FriendEnergy", actData)
  1056 + SendPacket(actionCodes.Activity_friendHelpRpc, MsgPack.pack({result = result, reward = reward}))
  1057 + return true
  1058 +end
  1059 +
891 1060 return _M
892 1061 \ No newline at end of file
... ...
src/models/Activity.lua
... ... @@ -32,6 +32,7 @@ Activity.ActivityType = {
32 32 Crisis = 26, -- 宝藏怪活动
33 33  
34 34 CommonSignIn = 28, --通用签到
  35 + FriendEnergy = 29, -- 好友互赠能量活动
35 36 }
36 37  
37 38 local function checkActivityType(activityType)
... ... @@ -77,6 +78,7 @@ Activity.schema = {
77 78 act26 = {"table", {}}, -- {task = {id = count}, socre = {id = status}}
78 79  
79 80 act28 = {"table", {}}, -- 每日活跃签到 {0=day, 1=1,2=1,3=1}
  81 + act29 = {"table", {}}, -- {magic = 0, limit = 0, reward = {id = 1, id = 1}, giveAE = {}, getAE = {}} 奖励字段1表示领取过奖励
80 82 }
81 83  
82 84 function Activity:data()
... ... @@ -99,6 +101,7 @@ function Activity:data()
99 101 act26 = self:getProperty("act26"),
100 102  
101 103 act28 = self:getProperty("act28"),
  104 + act29 = self:getProperty("act29"),
102 105 }
103 106 end
104 107  
... ... @@ -746,7 +749,22 @@ activityFunc[Activity.ActivityType.ActShopGoods] = {
746 749 end,
747 750 }
748 751  
749   -
  752 +activityFunc[Activity.ActivityType.FriendEnergy] = {
  753 + ["init"] = function (self, actType, isCrossDay, notify, actId)
  754 + local data = {magic = 0, limit = 0, reward = {}, giveAE = {}, getAE = {}}
  755 + self:updateActData(actType, data, not notify)
  756 + end,
  757 + ["crossDay"] = function(self, actType, notify)
  758 + local actData = self:getActData(actType)
  759 + actData.limit = 0
  760 + actData.giveAE = {}
  761 + actData.getAE = {}
  762 + self:updateActData(actType, actData, not notify)
  763 + end,
  764 + ["close"] = function (self, actType, notify, actId)
  765 + redisproxy:del(FRIEND_ENERGY:format(self.owner:getProperty("id")))
  766 + end
  767 +}
750 768  
751 769 activityFunc[Activity.ActivityType.Crisis] = {
752 770 ["check"] = function(self, actType, notify, atype, count) -- 检查
... ...
src/models/RoleLog.lua
... ... @@ -52,6 +52,7 @@ local ItemReason = {
52 52 actMilestone = 136, -- 活动关卡boss伤害里程碑
53 53 worldBossReward = 137, -- 世界boss翻牌奖励
54 54 commonSign = 138, -- 每日活跃签到
  55 + actFriendHelp = 139,-- 好友能量互助活动
55 56  
56 57  
57 58 advHang = 301, -- 拾荒挂机
... ...
src/models/RolePlugin.lua
... ... @@ -1515,6 +1515,7 @@ function RolePlugin.bind(Role)
1515 1515 local breathes = {
1516 1516 ["email"] = breath(120, "email"), -- email
1517 1517 ["pvphg"] = breath(300, "pvphg"), -- 高级竞技场 奖励满的红点
  1518 + ["actfriend"] = breath(180, "actfriend"), -- 好友能量助力活动
1518 1519 }
1519 1520 function Role:checkNewEvent(now)
1520 1521 if now - self:getProperty("ltime") < 5 then
... ... @@ -1576,7 +1577,21 @@ function RolePlugin.bind(Role)
1576 1577 if table.pack(next(newReward))[2] >= divisionData.limit then
1577 1578 return true
1578 1579 end
1579   -
  1580 + end
  1581 +
  1582 + checks["actfriend"] = function ()
  1583 + local ids = {}
  1584 + local roleId = self:getProperty("id")
  1585 + local friends = redisproxy:hgetall(FRIEND_KEY:format(roleId))
  1586 + for i = 1, #friends , 2 do
  1587 + local objId = tonumber(friends[i])
  1588 + ids[objId] = 1
  1589 + end
  1590 + for friendId, _ in pairs(ids) do
  1591 + if redisproxy:sismember(FRIEND_ENERGY:format(roleId), friendId) then
  1592 + return true
  1593 + end
  1594 + end
1580 1595 end
1581 1596  
1582 1597 local events = {}
... ...