Commit 091912ed095c19f249a57fe099c142b3c51cc43d
1 parent
ac885527
未测试版好友能量助力活动
Showing
6 changed files
with
207 additions
and
2 deletions
Show diff stats
src/ProtocolCode.lua
@@ -230,6 +230,7 @@ actionCodes = { | @@ -230,6 +230,7 @@ actionCodes = { | ||
230 | Activity_bossRewardRpc = 664, | 230 | Activity_bossRewardRpc = 664, |
231 | Activity_crisisMilestoneRpc = 665, | 231 | Activity_crisisMilestoneRpc = 665, |
232 | Activity_commonSignRpc = 666, | 232 | Activity_commonSignRpc = 666, |
233 | + Activity_friendHelpRpc = 667, | ||
233 | 234 | ||
234 | Radio_startQuestRpc = 700, | 235 | Radio_startQuestRpc = 700, |
235 | Radio_finishQuestRpc = 701, | 236 | Radio_finishQuestRpc = 701, |
src/RedisKeys.lua
@@ -47,6 +47,7 @@ FRIEND_KEY = "role:%d:friend" --哈希表 好友 | @@ -47,6 +47,7 @@ FRIEND_KEY = "role:%d:friend" --哈希表 好友 | ||
47 | FRIEND_APPLY_KEY = "role:%d:apply" -- sort set 申请列表 | 47 | FRIEND_APPLY_KEY = "role:%d:apply" -- sort set 申请列表 |
48 | FRIEND_BLACK_KEY = "role:%d:black" -- set 黑名单 | 48 | FRIEND_BLACK_KEY = "role:%d:black" -- set 黑名单 |
49 | FRIEND_POINT = "role:%d:point" -- set 当天送给我心的人 | 49 | FRIEND_POINT = "role:%d:point" -- set 当天送给我心的人 |
50 | +FRIEND_ENERGY = "role:%d:energy" -- set 送给我活动能量的好友 | ||
50 | FRIEND_RECOMMEND = "friend:recommend" -- sort set 登录排序 获取推荐好友 | 51 | FRIEND_RECOMMEND = "friend:recommend" -- sort set 登录排序 获取推荐好友 |
51 | CHAT_OFFLINE = "chat:offline:%d" --消息离线缓存 | 52 | CHAT_OFFLINE = "chat:offline:%d" --消息离线缓存 |
52 | 53 |
src/actions/ActivityAction.lua
@@ -888,4 +888,173 @@ function _M.commonSignRpc(agent, data) | @@ -888,4 +888,173 @@ function _M.commonSignRpc(agent, data) | ||
888 | return true | 888 | return true |
889 | end | 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 | return _M | 1060 | return _M |
892 | \ No newline at end of file | 1061 | \ No newline at end of file |
src/models/Activity.lua
@@ -32,6 +32,7 @@ Activity.ActivityType = { | @@ -32,6 +32,7 @@ Activity.ActivityType = { | ||
32 | Crisis = 26, -- 宝藏怪活动 | 32 | Crisis = 26, -- 宝藏怪活动 |
33 | 33 | ||
34 | CommonSignIn = 28, --通用签到 | 34 | CommonSignIn = 28, --通用签到 |
35 | + FriendEnergy = 29, -- 好友互赠能量活动 | ||
35 | } | 36 | } |
36 | 37 | ||
37 | local function checkActivityType(activityType) | 38 | local function checkActivityType(activityType) |
@@ -77,6 +78,7 @@ Activity.schema = { | @@ -77,6 +78,7 @@ Activity.schema = { | ||
77 | act26 = {"table", {}}, -- {task = {id = count}, socre = {id = status}} | 78 | act26 = {"table", {}}, -- {task = {id = count}, socre = {id = status}} |
78 | 79 | ||
79 | act28 = {"table", {}}, -- 每日活跃签到 {0=day, 1=1,2=1,3=1} | 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 | function Activity:data() | 84 | function Activity:data() |
@@ -99,6 +101,7 @@ function Activity:data() | @@ -99,6 +101,7 @@ function Activity:data() | ||
99 | act26 = self:getProperty("act26"), | 101 | act26 = self:getProperty("act26"), |
100 | 102 | ||
101 | act28 = self:getProperty("act28"), | 103 | act28 = self:getProperty("act28"), |
104 | + act29 = self:getProperty("act29"), | ||
102 | } | 105 | } |
103 | end | 106 | end |
104 | 107 | ||
@@ -746,7 +749,22 @@ activityFunc[Activity.ActivityType.ActShopGoods] = { | @@ -746,7 +749,22 @@ activityFunc[Activity.ActivityType.ActShopGoods] = { | ||
746 | end, | 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 | activityFunc[Activity.ActivityType.Crisis] = { | 769 | activityFunc[Activity.ActivityType.Crisis] = { |
752 | ["check"] = function(self, actType, notify, atype, count) -- 检查 | 770 | ["check"] = function(self, actType, notify, atype, count) -- 检查 |
src/models/RoleLog.lua
@@ -52,6 +52,7 @@ local ItemReason = { | @@ -52,6 +52,7 @@ local ItemReason = { | ||
52 | actMilestone = 136, -- 活动关卡boss伤害里程碑 | 52 | actMilestone = 136, -- 活动关卡boss伤害里程碑 |
53 | worldBossReward = 137, -- 世界boss翻牌奖励 | 53 | worldBossReward = 137, -- 世界boss翻牌奖励 |
54 | commonSign = 138, -- 每日活跃签到 | 54 | commonSign = 138, -- 每日活跃签到 |
55 | + actFriendHelp = 139,-- 好友能量互助活动 | ||
55 | 56 | ||
56 | 57 | ||
57 | advHang = 301, -- 拾荒挂机 | 58 | advHang = 301, -- 拾荒挂机 |
src/models/RolePlugin.lua
@@ -1515,6 +1515,7 @@ function RolePlugin.bind(Role) | @@ -1515,6 +1515,7 @@ function RolePlugin.bind(Role) | ||
1515 | local breathes = { | 1515 | local breathes = { |
1516 | ["email"] = breath(120, "email"), -- email | 1516 | ["email"] = breath(120, "email"), -- email |
1517 | ["pvphg"] = breath(300, "pvphg"), -- 高级竞技场 奖励满的红点 | 1517 | ["pvphg"] = breath(300, "pvphg"), -- 高级竞技场 奖励满的红点 |
1518 | + ["actfriend"] = breath(180, "actfriend"), -- 好友能量助力活动 | ||
1518 | } | 1519 | } |
1519 | function Role:checkNewEvent(now) | 1520 | function Role:checkNewEvent(now) |
1520 | if now - self:getProperty("ltime") < 5 then | 1521 | if now - self:getProperty("ltime") < 5 then |
@@ -1576,7 +1577,21 @@ function RolePlugin.bind(Role) | @@ -1576,7 +1577,21 @@ function RolePlugin.bind(Role) | ||
1576 | if table.pack(next(newReward))[2] >= divisionData.limit then | 1577 | if table.pack(next(newReward))[2] >= divisionData.limit then |
1577 | return true | 1578 | return true |
1578 | end | 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 | end | 1595 | end |
1581 | 1596 | ||
1582 | local events = {} | 1597 | local events = {} |