Commit 1cbe35d88cf9852e0d6560c54eef1f95b04e3de5
Merge branch 'cn/develop' into cn/develop-mysql
* cn/develop: (136 commits) 付费钻区分ios钻和android钻 修改gm添加满级英雄指令,开启特权时,加速道具效果未受影响 gm 奖励 获取有效期物品 增加gm 方法 每日抽卡礼包bug 每日抽卡限时礼包触发时,清空购买记录 添加活动关卡gm指令, 活动代理拾荒数据清理 新春签到代码优化,支持不同时开同类型的签到活动,方便后期复用 新春签到领奖方法里 漏掉了一个int转string 拾荒活动积分up 新春签到 记录字段值的key改成string 拾荒bug 每日抽卡次数触发礼包 第一层奖励 错误单词 重置preload服务器时间 新春活动任务 第一层也发奖 假的boss 没有效果 ...
Showing
42 changed files
with
2710 additions
and
486 deletions
Show diff stats
src/GlobalVar.lua
... | ... | @@ -16,6 +16,9 @@ TIME_ZONE = math.floor(os.difftime(START_RESET_TIME_BASE, os.time(os.date("!*t", |
16 | 16 | |
17 | 17 | START_RESET_TIME = START_RESET_TIME_BASE - TIME_ZONE * 3600 |
18 | 18 | |
19 | +STRUCT_VERSION = 3 -- 数据结构版本 | |
20 | + | |
21 | +IOS_SID = 4 -- 判断是不是ios设备 | |
19 | 22 | |
20 | 23 | MAX_ROLE_NUM = 1000000 |
21 | 24 | -- 属性枚举 |
... | ... | @@ -72,7 +75,7 @@ ItemType = { |
72 | 75 | EquipBase = 9, -- 基础装备 |
73 | 76 | Rune = 10, -- 符文 |
74 | 77 | Cuisine = 11, -- 料理(用于增加好感度、贩卖获得金币) |
75 | - LunchBox = 12, -- 便当盒(料理合成,冒险系统消耗道具) | |
78 | + Potion = 12, -- 拾荒药剂 | |
76 | 79 | TimeBox = 13, -- 时间箱(开启需要时间,随机产出道具) |
77 | 80 | AdvItem = 14, -- 冒险道具 |
78 | 81 | FuncOpen = 15, -- 管理功能开放 |
... | ... | @@ -141,7 +144,6 @@ ItemId = { |
141 | 144 | TimeReset = { |
142 | 145 | CrossDay = 1, --通用跨天 |
143 | 146 | CrossWeek = 2, --通用跨周 |
144 | - CrossMonth = 1, --通用跨月 索引使用跨天,在回调方法中判断是否跨越 跨月的前置条件是跨天 | |
145 | 147 | DinerRank = 1, -- 餐厅排行榜 |
146 | 148 | PvpRank = 2, -- pvp排行榜 |
147 | 149 | PvpHight = 11, --高级竞技场 |
... | ... | @@ -155,6 +157,23 @@ TimeReset = { |
155 | 157 | DrawType3 = 19, -- 魔法 抽卡加成 |
156 | 158 | } |
157 | 159 | |
160 | +-- TimeReset 索引数组 | |
161 | +TimeResetArray = { | |
162 | + "CrossDay", --通用跨天 | |
163 | + "CrossWeek", --通用跨周 | |
164 | + "DinerRank", -- 餐厅排行榜 | |
165 | + "PvpRank", -- pvp排行榜 | |
166 | + "PvpHight", --高级竞技场 | |
167 | + "PvpCross", -- 跨服竞技场 | |
168 | + "PvpShop", -- 竞技场商城 | |
169 | + "DailyBattle2", -- 特殊-每日副本(贴纸) | |
170 | + "DailyBattle1", -- 特殊-每日副本(装备) | |
171 | + "DailyBattle3", -- 特殊-每日副本(时钟箱) | |
172 | + "DrawType1", -- 变异 抽卡加成 | |
173 | + "DrawType2", -- 通常 抽卡加成 | |
174 | + "DrawType3", -- 魔法 抽卡加成 | |
175 | +} | |
176 | + | |
158 | 177 | GuideStep = { |
159 | 178 | AdvGuide = 41, |
160 | 179 | AdvRelay = 42, |
... | ... | @@ -224,6 +243,8 @@ AdvBackEventType = { |
224 | 243 | LinkChooseOver = 26, -- 连锁事件结束 |
225 | 244 | BuffEffect = 27, -- buff 效果 |
226 | 245 | PassiveEffect = 28, -- 被动 效果 |
246 | + ChooseDice = 29, -- 选择点随机效果 | |
247 | + NoEffect = 30, -- 没有效果 | |
227 | 248 | } |
228 | 249 | |
229 | 250 | AdvScoreType = { |
... | ... | @@ -290,6 +311,7 @@ CardType = { |
290 | 311 | BattleCard = 5, --赛季卡 |
291 | 312 | PaySignCard = 6, -- 付费签到卡 |
292 | 313 | BattlePassCard = 7, -- 探索指令 |
314 | + ActBattleCommandCard = 8, -- 战令活动卡 | |
293 | 315 | } |
294 | 316 | |
295 | 317 | ShopPackType = { |
... | ... | @@ -324,6 +346,8 @@ MailId = { |
324 | 346 | PayBackAward = 242, |
325 | 347 | CBBackAward = 243, |
326 | 348 | CBBackAward2 = 244, |
349 | + ActivityPoolRet = 280, | |
350 | + MyCardBuy = 300, | |
327 | 351 | } |
328 | 352 | |
329 | 353 | TriggerEventType = { |
... | ... | @@ -334,6 +358,7 @@ TriggerEventType = { |
334 | 358 | AddNewHero = 5, |
335 | 359 | SSRCount = 6, |
336 | 360 | AfterTs = 7, -- 某时间以后 |
361 | + DrawHeroCnt = 8, -- 每日抽卡次数 | |
337 | 362 | } |
338 | 363 | |
339 | 364 | DrawCardType = { | ... | ... |
src/ProtocolCode.lua
... | ... | @@ -232,6 +232,13 @@ actionCodes = { |
232 | 232 | Activity_battleMilestoneRpc = 663, |
233 | 233 | Activity_bossRewardRpc = 664, |
234 | 234 | Activity_crisisMilestoneRpc = 665, |
235 | + Activity_commonSignRpc = 666, | |
236 | + Activity_friendHelpRpc = 667, | |
237 | + Activity_battleCommandRpc = 668, | |
238 | + Activity_actBattleCommandTaskRpc = 669, | |
239 | + Activity_newSignRpc = 670, | |
240 | + Activity_advLevelRpc = 671, | |
241 | + Activity_buyBattleCommandLvlRpc = 672, | |
235 | 242 | |
236 | 243 | Radio_startQuestRpc = 700, |
237 | 244 | Radio_finishQuestRpc = 701, |
... | ... | @@ -249,4 +256,4 @@ for key, value in pairs(actionCodes) do |
249 | 256 | actionHandlers[value + rpcResponseBegin] = handlerName .. "Response" |
250 | 257 | end |
251 | 258 | actionHandlers[value] = string.gsub(key, "_", ".") |
252 | -end | |
253 | 259 | \ No newline at end of file |
260 | +end | ... | ... |
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
... | ... | @@ -259,7 +259,57 @@ function _M.actCalendaTaskRpc(agent, data) |
259 | 259 | activity_reward = reward, -- 活动奖励,json格式记录,{'itemid1':123,'itemid2':456,………...} |
260 | 260 | }) |
261 | 261 | |
262 | + role:checkTaskEnter("FinishSpeTask", {taskId = taskId, actId = actId}) | |
263 | + | |
262 | 264 | SendPacket(actionCodes.Activity_actCalendaTaskRpc, MsgPack.pack(role:packReward(reward, change))) |
265 | + | |
266 | + return true | |
267 | +end | |
268 | + | |
269 | +function _M.actBattleCommandTaskRpc(agent, data) | |
270 | + local role = agent.role | |
271 | + local msg = MsgPack.unpack(data) | |
272 | + local taskId = msg.id | |
273 | + local calTask = role:getProperty("bcTask") or {} | |
274 | + local record = calTask["r"] or {} | |
275 | + local flag = record[taskId] or 0 | |
276 | + if flag == 1 then return 1 end | |
277 | + local open, actId = role.activity:isOpen("BattleCommandTask") | |
278 | + local actData = csvdb["activity_ctrlCsv"][actId] | |
279 | + if not open then return 2 end | |
280 | + if not actData then return 3 end | |
281 | + | |
282 | + local taskList = csvdb["activity_taskCsv"][actData.condition] | |
283 | + if not taskList then return 4 end | |
284 | + local taskCfg = taskList[taskId] | |
285 | + if not taskCfg then return 5 end | |
286 | + if taskCfg.key ~= actData.condition then return 6 end | |
287 | + | |
288 | + if (calTask[taskId] or 0) < taskCfg.condition1 then return 7 end | |
289 | + | |
290 | + local open, actId = role.activity:isOpen("BattleCommand") | |
291 | + local actData = csvdb["activity_ctrlCsv"][actId] | |
292 | + if not open then return 2 end | |
293 | + if not actData then return 3 end | |
294 | + | |
295 | + | |
296 | + record[taskId] = 1 | |
297 | + calTask["r"] = record | |
298 | + | |
299 | + role:updateProperty({field = "bcTask", value = calTask}) | |
300 | + | |
301 | + local reward, change = role:award(taskCfg.reward, {log = {desc = "battleCommandTask"}}) | |
302 | + | |
303 | + role:log("activity", { | |
304 | + activity_id = taskId, -- 活动ID(或活动指定任务的ID) | |
305 | + activity_type = role.activity.ActivityType.BattleCommandTask, -- 活动类型,见活动类型枚举表 | |
306 | + activity_reward = reward, -- 活动奖励,json格式记录,{'itemid1':123,'itemid2':456,………...} | |
307 | + }) | |
308 | + | |
309 | + role:checkTaskEnter("FinishSpeTask", {taskId = taskId, actId = actId}) | |
310 | + | |
311 | + SendPacket(actionCodes.Activity_actBattleCommandTaskRpc, MsgPack.pack(role:packReward(reward, change))) | |
312 | + | |
263 | 313 | return true |
264 | 314 | end |
265 | 315 | |
... | ... | @@ -511,6 +561,7 @@ function _M.startBattleRpc(agent, data) |
511 | 561 | key = tostring(math.random()), |
512 | 562 | actid = actid, |
513 | 563 | id = id, |
564 | + format = msg.format, | |
514 | 565 | } |
515 | 566 | SendPacket(actionCodes.Activity_startBattleRpc, MsgPack.pack({key = role.__actBattleCache.key})) |
516 | 567 | else |
... | ... | @@ -539,7 +590,7 @@ function _M.startBattleRpc(agent, data) |
539 | 590 | bi["bossP"] = (bi["bossP"] or 0) + bi["maxP"] * count |
540 | 591 | end |
541 | 592 | |
542 | - bi["sum"] = bi["sum"] + bi["top"] | |
593 | + bi["sum"] = bi["sum"] + bi["top"] * count | |
543 | 594 | actData["ticket"] = ticket - num |
544 | 595 | actData[id] = bi |
545 | 596 | changeFlag = true |
... | ... | @@ -568,7 +619,10 @@ function _M.endBattleRpc(agent, data) |
568 | 619 | local isWin = msg.isWin |
569 | 620 | local heros = msg.heros |
570 | 621 | local support = msg.support |
571 | - if not role.activity:isOpenById(actid, "ChallengeLevel") then return 1 end | |
622 | + if not role.activity:isOpenById(actid, "ChallengeLevel") then | |
623 | + SendPacket(actionCodes.Activity_endBattleRpc, MsgPack.pack({})) | |
624 | + return true | |
625 | + end | |
572 | 626 | |
573 | 627 | if not role.__actBattleCache then return 2 end |
574 | 628 | |
... | ... | @@ -576,6 +630,18 @@ function _M.endBattleRpc(agent, data) |
576 | 630 | SendPacket(actionCodes.Activity_endBattleRpc, MsgPack.pack({errorCode = 1})) |
577 | 631 | end |
578 | 632 | |
633 | + -- 防作弊 | |
634 | + if not role:checkBattleCheat("act_battle", { | |
635 | + id = id, | |
636 | + isWin = isWin, | |
637 | + info = msg.info, | |
638 | + format = role.__actBattleCache.format | |
639 | + }) then | |
640 | + SendPacket(actionCodes.Activity_endBattleRpc, MsgPack.pack({errorCode = 1})) | |
641 | + return true | |
642 | + end | |
643 | + role.__actBattleCache = nil | |
644 | + | |
579 | 645 | local actCfg = csvdb["activity_battleCsv"][actid] |
580 | 646 | if not actCfg then return 3 end |
581 | 647 | |
... | ... | @@ -657,7 +723,9 @@ function _M.endBattleRpc(agent, data) |
657 | 723 | if check[cond[1]] and check[cond[1]](table.unpack(cond)) then |
658 | 724 | curStar = curStar + (1 << (i - 1)) |
659 | 725 | end |
660 | - end | |
726 | + end | |
727 | + | |
728 | + role:checkTaskEnter("ActBattlePass", {chapterId = id}) | |
661 | 729 | else |
662 | 730 | curStar = 0 |
663 | 731 | if battleCfg.rank ~= 0 then |
... | ... | @@ -889,4 +957,417 @@ function _M.bossRewardRpc(agent, data) |
889 | 957 | return true |
890 | 958 | end |
891 | 959 | |
892 | -return _M | |
893 | 960 | \ No newline at end of file |
961 | +function _M.commonSignRpc(agent, data) | |
962 | + local role = agent.role | |
963 | + local msg = MsgPack.unpack(data) | |
964 | + local actid = msg.actid | |
965 | + local index = msg.index | |
966 | + | |
967 | + if not role.activity:isOpenById(actid, "CommonSignIn") then return 1 end | |
968 | + | |
969 | + local actData = role.activity:getActData("CommonSignIn") | |
970 | + if (actData[0] or 0) < index then | |
971 | + return 2 | |
972 | + end | |
973 | + if (actData[index] or 0) == 1 then | |
974 | + return 3 | |
975 | + end | |
976 | + | |
977 | + local actCfg = csvdb["activity_signInCsv"][actid] | |
978 | + if not actCfg then return 4 end | |
979 | + actCfg = actCfg[index] | |
980 | + if not actCfg then return 5 end | |
981 | + | |
982 | + actData[index] = 1 | |
983 | + role.activity:updateActData("CommonSignIn", actData) | |
984 | + | |
985 | + local award = actCfg.reward:toNumMap() | |
986 | + local reward, change = role:award(award, {log = {desc = "commonSign", int1 = actid, int2 = index}}) | |
987 | + SendPacket(actionCodes.Activity_commonSignRpc, MsgPack.pack(role:packReward(reward, change))) | |
988 | + return true | |
989 | +end | |
990 | + | |
991 | +function _M.friendHelpRpc(agent, data) | |
992 | + local role = agent.role | |
993 | + local roleId = role:getProperty("id") | |
994 | + local msg = MsgPack.unpack(data) | |
995 | + local oper = tonumber(msg.oper) or -1 | |
996 | + local award = {} | |
997 | + local result | |
998 | + | |
999 | + | |
1000 | + local actid = 37 | |
1001 | + if not role.activity:isOpenById(actid, "FriendEnergy") then return 1 end | |
1002 | + if oper < 1 or oper > 4 then return 2 end | |
1003 | + | |
1004 | + local actCsv = csvdb["activity_ctrlCsv"][actid] | |
1005 | + local getLimit = actCsv.condition | |
1006 | + local gifts = actCsv.condition2:toTableArray(true) | |
1007 | + | |
1008 | + local actData = role.activity:getActData("FriendEnergy") or {} | |
1009 | + | |
1010 | + local function getIds() | |
1011 | + local ids = {} | |
1012 | + local friends = redisproxy:hgetall(FRIEND_KEY:format(roleId)) | |
1013 | + for i = 1, #friends , 2 do | |
1014 | + local objId = tonumber(friends[i]) | |
1015 | + ids[objId] = 1 | |
1016 | + end | |
1017 | + return ids | |
1018 | + end | |
1019 | + | |
1020 | + if oper == 1 then -- 赠送好友能量 | |
1021 | + local giveAE = actData.giveAE or {} | |
1022 | + local objId = msg.roleId | |
1023 | + local gift = gifts[1] | |
1024 | + local ids = {} | |
1025 | + | |
1026 | + if not objId then | |
1027 | + return 3 | |
1028 | + end | |
1029 | + if not redisproxy:hexists(FRIEND_KEY:format(roleId), objId) then | |
1030 | + result = 2 | |
1031 | + end | |
1032 | + if giveAE[objId] then | |
1033 | + result = 1 | |
1034 | + end | |
1035 | + | |
1036 | + if not result then | |
1037 | + giveAE[objId] = 1 | |
1038 | + award[gift[1]] = gift[2] | |
1039 | + redisproxy:sadd(FRIEND_ENERGY:format(objId), roleId) | |
1040 | + rpcRole(objId, "SendPacket", actionCodes.Role_notifyNewEvent, MsgPack.pack({events = {actFriendGive = roleId}})) | |
1041 | + actData.giveAE = giveAE | |
1042 | + end | |
1043 | + elseif oper == 2 then -- 收取能量 | |
1044 | + local objId = msg.roleId | |
1045 | + local gift = gifts[2] | |
1046 | + local getAE = actData.getAE or {} | |
1047 | + local limit = actData.limit or 0 | |
1048 | + | |
1049 | + if limit >= getLimit then return 4 end | |
1050 | + if not redisproxy:sismember(FRIEND_ENERGY:format(roleId), objId) then | |
1051 | + result = 3 | |
1052 | + end | |
1053 | + if getAE[objId] then | |
1054 | + result = 2 | |
1055 | + end | |
1056 | + if limit >= getLimit then | |
1057 | + result = 1 | |
1058 | + end | |
1059 | + | |
1060 | + if not result then | |
1061 | + limit = limit + 1 | |
1062 | + getAE[objId] = 1 | |
1063 | + award[gift[1]] = gift[2] | |
1064 | + redisproxy:srem(FRIEND_ENERGY:format(roleId), objId) | |
1065 | + actData.limit = limit | |
1066 | + actData.getAE = getAE | |
1067 | + end | |
1068 | + elseif oper == 3 then -- 一键送领全部 | |
1069 | + local giveAE = actData.giveAE or {} | |
1070 | + local getAE = actData.getAE or {} | |
1071 | + local gift1 = gifts[1] | |
1072 | + local gift2 = gifts[2] | |
1073 | + local limit = actData.limit or 0 | |
1074 | + local cmd1, cmd2 = 0, 0 | |
1075 | + local ids = getIds() | |
1076 | + | |
1077 | + local members = {} | |
1078 | + local temp = redisproxy:smembers(FRIEND_ENERGY:format(roleId)) | |
1079 | + for _, id in pairs(temp) do | |
1080 | + members[tonumber(id)] = 1 | |
1081 | + end | |
1082 | + | |
1083 | + redisproxy:pipelining(function(red) | |
1084 | + for friendId, _ in pairs(ids) do | |
1085 | + if not giveAE[friendId] then | |
1086 | + giveAE[friendId] = 1 | |
1087 | + award[gift1[1]] = (award[gift1[1]] or 0) + gift1[2] | |
1088 | + red:sadd(FRIEND_ENERGY:format(friendId), roleId) | |
1089 | + rpcRole(friendId, "SendPacket", actionCodes.Role_notifyNewEvent, MsgPack.pack({events = {actFriendGive = roleId}})) | |
1090 | + cmd1 = 2 | |
1091 | + end | |
1092 | + | |
1093 | + if members[friendId] and not getAE[friendId] and limit <= getLimit then | |
1094 | + cmd2 = 1 | |
1095 | + limit = limit + 1 | |
1096 | + getAE[friendId] = 1 | |
1097 | + award[gift2[1]] = (award[gift2[1]] or 0) + gift2[2] | |
1098 | + red:srem(FRIEND_ENERGY:format(roleId), friendId) | |
1099 | + end | |
1100 | + end | |
1101 | + end) | |
1102 | + | |
1103 | + local sum = cmd1 + cmd2 | |
1104 | + if sum == 0 then | |
1105 | + result = 3 | |
1106 | + elseif sum ~= 3 then | |
1107 | + result = sum | |
1108 | + end | |
1109 | + | |
1110 | + actData.limit = limit | |
1111 | + actData.giveAE = giveAE | |
1112 | + actData.getAE = getAE | |
1113 | + elseif oper == 4 then -- 抽大奖 | |
1114 | + local magic = actData.magic or 0 | |
1115 | + local rewards = actData.reward or {} | |
1116 | + local rewardCsv = csvdb["activity_orderRewardsCsv"][actid] | |
1117 | + local itemId1 = gifts[1][1] | |
1118 | + local itemId2 = gifts[2][1] | |
1119 | + | |
1120 | + local level = math.min(magic + 1,#rewardCsv) | |
1121 | + local rewardData = rewardCsv[level] | |
1122 | + | |
1123 | + local cost = {[itemId1] = rewardData.condition1, [itemId2] = rewardData.condition2} | |
1124 | + | |
1125 | + if not role:checkItemEnough(cost) then return 7 end | |
1126 | + role:costItems(cost, {log = {desc = "actFriendHelp", int1 = actid, int2 = level}}) | |
1127 | + | |
1128 | + if rewardData.reward ~= "" then | |
1129 | + result = 1 | |
1130 | + award = rewardData.reward:toNumMap() | |
1131 | + end | |
1132 | + if rewardData.reward_random ~= "" then | |
1133 | + result = 1 | |
1134 | + local pool = {} | |
1135 | + for _, temp in pairs(rewardData.reward_random:toArray()) do | |
1136 | + table.insert(pool, temp:toArray(true, "=")) | |
1137 | + end | |
1138 | + local gift = pool[math.randWeight(pool, 3)] | |
1139 | + award[gift[1]] = (award[gift[1]] or 0) + gift[2] | |
1140 | + end | |
1141 | + rewards[level] = 1 | |
1142 | + actData.reward = rewards | |
1143 | + actData.magic = level | |
1144 | + else | |
1145 | + return 5 | |
1146 | + end | |
1147 | + | |
1148 | + local ids = {} | |
1149 | + local members = {} | |
1150 | + local friendIds = getIds() | |
1151 | + local temp = redisproxy:smembers(FRIEND_ENERGY:format(roleId)) | |
1152 | + for _, id in pairs(temp) do | |
1153 | + members[tonumber(id)] = 1 | |
1154 | + end | |
1155 | + | |
1156 | + for id, _ in pairs(friendIds) do | |
1157 | + if members[id] then | |
1158 | + ids[id] = 1 | |
1159 | + end | |
1160 | + end | |
1161 | + | |
1162 | + actData.new = ids | |
1163 | + | |
1164 | + local reward, change | |
1165 | + if next(award) then | |
1166 | + reward, change = role:award(award, {log = {desc = "actFriendHelp", int1 = actid}}) | |
1167 | + end | |
1168 | + role.activity:updateActData("FriendEnergy", actData) | |
1169 | + SendPacket(actionCodes.Activity_friendHelpRpc, MsgPack.pack({result = result, reward = reward})) | |
1170 | + return true | |
1171 | +end | |
1172 | + | |
1173 | +-- 战令活动奖励 | |
1174 | +function _M.battleCommandRpc(agent, data) | |
1175 | + local role = agent.role | |
1176 | + local msg = MsgPack.unpack(data) | |
1177 | + local actid = msg.actid -- 活动id | |
1178 | + local index = msg.index -- 领取的阶段id | |
1179 | + local pay = msg.pay -- 是否是超级奖励 | |
1180 | + | |
1181 | + if not role.activity:isOpenById(actid, "BattleCommand") then return 1 end | |
1182 | + local actCtrlData = csvdb["activity_ctrlCsv"][actid] | |
1183 | + | |
1184 | + if not actCtrlData then return end | |
1185 | + | |
1186 | + local actData = role.activity:getActData("BattleCommand") or {} | |
1187 | + if pay and not actData["unlock"] then return 2 end | |
1188 | + | |
1189 | + local bpCfg = csvdb["activity_battlepass_rewardCsv"][actid] | |
1190 | + if not bpCfg then return 3 end | |
1191 | + | |
1192 | + local unlock = actData["unlock"] or 0 | |
1193 | + local award = {} | |
1194 | + if not index then -- 一键领取 | |
1195 | + for i = 1, #bpCfg do | |
1196 | + local cfg = bpCfg[i] | |
1197 | + if not cfg then return 4 end | |
1198 | + | |
1199 | + if (actData["lvl"] or 0) < cfg["type"] then break end | |
1200 | + local records = {{"freeR", "rewardNormal"}, {"payR", "rewardHigh"}} | |
1201 | + | |
1202 | + for _, info in ipairs(records) do | |
1203 | + local typeKey, rewardKey = info[1], info[2] | |
1204 | + if typeKey == "payR" and unlock == 0 then | |
1205 | + break | |
1206 | + end | |
1207 | + local record = actData[typeKey] or "" | |
1208 | + local flag = string.char(string.getbit(record, i)) | |
1209 | + if flag == "0" then | |
1210 | + record = string.setbit(record, i) | |
1211 | + local awd = cfg[rewardKey] | |
1212 | + for k, v in pairs(awd:toNumMap()) do | |
1213 | + award[k] = (award[k] or 0) + v | |
1214 | + end | |
1215 | + end | |
1216 | + actData[typeKey] = record | |
1217 | + | |
1218 | + end | |
1219 | + end | |
1220 | + else | |
1221 | + bpCfg = bpCfg[index] | |
1222 | + if not bpCfg then return 4 end | |
1223 | + | |
1224 | + if (actData["lvl"] or 0) < bpCfg["type"] then return 5 end | |
1225 | + | |
1226 | + local record = "" | |
1227 | + if pay then | |
1228 | + record = actData["payR"] or "" | |
1229 | + else | |
1230 | + record = actData["freeR"] or "" | |
1231 | + end | |
1232 | + | |
1233 | + local flag = string.char(string.getbit(record, index)) | |
1234 | + | |
1235 | + if flag == "1" then | |
1236 | + return 6 | |
1237 | + end | |
1238 | + | |
1239 | + record = string.setbit(record, index) | |
1240 | + local awd = "" | |
1241 | + if pay then | |
1242 | + actData["payR"] = record | |
1243 | + awd = bpCfg["rewardHigh"] | |
1244 | + else | |
1245 | + actData["freeR"] = record | |
1246 | + awd = bpCfg["rewardNormal"] | |
1247 | + end | |
1248 | + for k, v in pairs(awd:toNumMap()) do | |
1249 | + award[k] = (award[k] or 0) + v | |
1250 | + end | |
1251 | + end | |
1252 | + | |
1253 | + role.activity:updateActData("BattleCommand", actData) | |
1254 | + | |
1255 | + local reward, change = role:award(award, {log = {desc = "actBattleCommand", int1 = actid, int2 = index}}) | |
1256 | + | |
1257 | + SendPacket(actionCodes.Activity_battleCommandRpc, MsgPack.pack(role:packReward(reward, change))) | |
1258 | + return true | |
1259 | +end | |
1260 | + | |
1261 | +function _M.buyBattleCommandLvlRpc(agent, data) | |
1262 | + local role = agent.role | |
1263 | + local msg = MsgPack.unpack(data) | |
1264 | + local actid = msg.actid -- 活动id | |
1265 | + local count = msg.count | |
1266 | + | |
1267 | + if not role.activity:isOpenById(actid, "BattleCommand") then return 1 end | |
1268 | + local actCtrlData = csvdb["activity_ctrlCsv"][actid] | |
1269 | + | |
1270 | + if not actCtrlData then return 2 end | |
1271 | + | |
1272 | + local bpCfg = csvdb["activity_battlepass_rewardCsv"][actid] | |
1273 | + if not bpCfg then return 3 end | |
1274 | + | |
1275 | + local actData = role.activity:getActData("BattleCommand") or {} | |
1276 | + | |
1277 | + local curLvl = actData["lvl"] or 0 | |
1278 | + local nextLvl = curLvl + count | |
1279 | + if curLvl >= bpCfg[#bpCfg]["type"] then return 4 end | |
1280 | + local cost = 0 | |
1281 | + for i = 1, #bpCfg do | |
1282 | + local cfg = bpCfg[i] | |
1283 | + if cfg["type"] > curLvl and cfg["type"] <= nextLvl then | |
1284 | + cost = cost + cfg["cost"] | |
1285 | + elseif cfg["type"] > nextLvl then | |
1286 | + break | |
1287 | + end | |
1288 | + end | |
1289 | + if cost == 0 then return 5 end | |
1290 | + | |
1291 | + if not role:checkItemEnough({[ItemId.Diamond] = cost}) then return 6 end | |
1292 | + role:costItems({[ItemId.Diamond] = cost}, {log = {desc = "actBuyBpLevel", int1 = curLvl}}) | |
1293 | + actData["lvl"] = nextLvl | |
1294 | + role.activity:updateActData("BattleCommand", actData) | |
1295 | + | |
1296 | + SendPacket(actionCodes.Activity_buyBattleCommandLvlRpc, MsgPack.pack({})) | |
1297 | + return true | |
1298 | +end | |
1299 | + | |
1300 | +function _M.newSignRpc(agent, data) | |
1301 | + local role = agent.role | |
1302 | + local msg = MsgPack.unpack(data) | |
1303 | + | |
1304 | + local open, actId = role.activity:isOpen("NewSign") | |
1305 | + if not open then return 1 end | |
1306 | + | |
1307 | + local actData = role.activity:getActData("NewSign") | |
1308 | + if actData[tostring(actData["0"] or 0)] then | |
1309 | + return 2 | |
1310 | + end | |
1311 | + | |
1312 | + local actCfg = csvdb["activity_signInCsv"][actId] | |
1313 | + if not actCfg then return 4 end | |
1314 | + | |
1315 | + local sumDay = actData["0"] or 0 | |
1316 | + local award = {} | |
1317 | + for k, data in pairs(actCfg) do | |
1318 | + if not actData[tostring(data.day)] and data.day <= sumDay then | |
1319 | + for id, value in pairs(data.reward:toNumMap()) do | |
1320 | + award[id] = (award[id] or 0) + value | |
1321 | + end | |
1322 | + actData[tostring(data.day)] = 1 | |
1323 | + end | |
1324 | + end | |
1325 | + | |
1326 | + local reward, change | |
1327 | + if next(award) then | |
1328 | + role.activity:updateActData("NewSign", actData) | |
1329 | + reward, change = role:award(award, {log = {desc = "newSign", int1 = actId, int2 = sumDay}}) | |
1330 | + end | |
1331 | + | |
1332 | + SendPacket(actionCodes.Activity_newSignRpc, MsgPack.pack(role:packReward(reward, change))) | |
1333 | + return true | |
1334 | +end | |
1335 | + | |
1336 | +-- 活动拾荒领取阶段奖励 | |
1337 | +function _M.advLevelRpc(agent, data) | |
1338 | + local role = agent.role | |
1339 | + local msg = MsgPack.unpack(data) | |
1340 | + local actid = msg.actid | |
1341 | + local index = msg.index | |
1342 | + | |
1343 | + if not role.activity:isOpenById(actid, "AdvLevel") then return 1 end | |
1344 | + | |
1345 | + local actCfg = csvdb["activity_stagesAwardCsv"][actid] | |
1346 | + if not actCfg then return 2 end | |
1347 | + actCfg = actCfg[index] | |
1348 | + if not actCfg then return 3 end | |
1349 | + | |
1350 | + local actData = role.activity:getActData("AdvLevel") or {} | |
1351 | + local record = actData["r"] or "" | |
1352 | + local flag = string.char(string.getbit(record, index)) | |
1353 | + | |
1354 | + if flag == "1" then return 4 end | |
1355 | + | |
1356 | + local chapters = actCfg["condition2"]:toArray(true, "=") | |
1357 | + local totalVal = 0 | |
1358 | + for i = 1, #chapters do | |
1359 | + local cid = chapters[i] | |
1360 | + local info = actData[cid] or {} | |
1361 | + totalVal = totalVal + (info["max"] or 0) | |
1362 | + end | |
1363 | + if totalVal < actCfg["condition1"] then return 5 end | |
1364 | + | |
1365 | + actData["r"] = string.setbit(record, index) | |
1366 | + role.activity:updateActData("AdvLevel", actData) | |
1367 | + | |
1368 | + local reward, change = role:award(actCfg.reward, {log = {desc = "advLevelStage", int1 = actid, int2 = index}}) | |
1369 | + | |
1370 | + SendPacket(actionCodes.Activity_advLevelRpc, MsgPack.pack(role:packReward(reward, change))) | |
1371 | + return true | |
1372 | +end | |
1373 | + | |
1374 | +return _M | ... | ... |
src/actions/AdvAction.lua
... | ... | @@ -57,6 +57,15 @@ local function checkFormat(role, format, checkAdvTeam) |
57 | 57 | end |
58 | 58 | end |
59 | 59 | |
60 | + -- 多队挂机 电台任务英雄也不能重用 | |
61 | + local radioTask = role:getProperty("radioTask") | |
62 | + for id, taskInfo in pairs(radioTask) do | |
63 | + local heros = taskInfo["heros"] or {} | |
64 | + for _, heroId in ipairs(heros) do | |
65 | + hadHero[heroId] = true | |
66 | + end | |
67 | + end | |
68 | + | |
60 | 69 | if not format.leader then return end |
61 | 70 | if format.leader2 == format.leader then return end |
62 | 71 | local hadLeader = false |
... | ... | @@ -86,22 +95,58 @@ function _M.startAdvRpc( agent, data ) |
86 | 95 | local role = agent.role |
87 | 96 | local msg = MsgPack.unpack(data) |
88 | 97 | local chapterId = msg.chapterId --关卡id |
98 | + local actid = msg.actid --活动id | |
89 | 99 | local layer = msg.layer or 1 --选择层数 |
90 | 100 | --local format = msg.format --编队 |
91 | 101 | local supportIdx = msg.supportIdx --选择的支援效果 |
92 | 102 | if not role:isFuncUnlock(FuncUnlock.Adv) then return end |
93 | - | |
103 | + | |
94 | 104 | --上一个关卡结束才可以开始新的关卡 |
95 | 105 | if role:getAdvData():isRunning() then return 8 end |
96 | 106 | local advHang = role:getProperty("advHang") |
97 | 107 | -- if advHang[chapterId] then return 9 end --正在挂机 |
98 | 108 | |
109 | + -- 检查活动正确性 | |
110 | + if actid then | |
111 | + if not role.activity:isOpenById(actid, "AdvLevel") then | |
112 | + return 20 | |
113 | + end | |
114 | + local actCfg = csvdb["activity_adv_chapterCsv"][actid] | |
115 | + if not actCfg then return 21 end | |
116 | + actCfg = actCfg[chapterId] | |
117 | + if not actCfg then return 22 end | |
118 | + | |
119 | + if actCfg["unlockTime"] ~= 0 then | |
120 | + local st = toUnixtime(actCfg["unlockTime"]..string_format("%02x", RESET_TIME)) | |
121 | + if st > skynet.timex() then return 23 end | |
122 | + end | |
123 | + | |
124 | + if actCfg["prepose"] ~= "" then | |
125 | + local type, cid = actCfg["prepose"]:toArray(true, "=") | |
126 | + if type == 1 then | |
127 | + local actData = role.activity:getActData("ChallengeLevel") | |
128 | + local battleInfo = actData[cid] or {} | |
129 | + if (battleInfo["star"] or 0) == 0 then | |
130 | + return 24 | |
131 | + end | |
132 | + elseif type == 2 then | |
133 | + local actData = role.activity:getActData("AdvLevel") | |
134 | + local advInfo = actData[cid] or {} | |
135 | + if not advInfo["pass"] then | |
136 | + return 25 | |
137 | + end | |
138 | + end | |
139 | + end | |
140 | + end | |
99 | 141 | |
100 | 142 | local chapterData = csvdb["adv_chapterCsv"][chapterId] |
101 | 143 | if not chapterData or layer < 1 then return 1 end |
102 | 144 | |
103 | 145 | local advPass = role:getProperty("advPass") |
104 | 146 | |
147 | + if not checkFormat(role) then return 7 end | |
148 | + | |
149 | + local cost = 0 | |
105 | 150 | if AdvCommon.isEndless(chapterId) then -- 无尽模式判断 |
106 | 151 | |
107 | 152 | if chapterId ~= role.advElChapter then return end -- 不是当前进行的章节 |
... | ... | @@ -118,37 +163,27 @@ function _M.startAdvRpc( agent, data ) |
118 | 163 | if not relayData then return 14 end -- 不是中继层 |
119 | 164 | if advElM < relayData.unlockfloor then return 15 end --未解锁 |
120 | 165 | end |
166 | + | |
167 | + role.dailyData:updateProperty({field = "advElC", delta = 1}) | |
168 | + cost = 1 | |
121 | 169 | else -- 普通模式判断 |
122 | - if not role:checkAdvCount(chapterData.limitlevel) then return 2 end -- 是否有体力 | |
123 | 170 | if layer >= chapterData.limitlevel then return 4 end |
124 | - -- 关卡开放判断 | |
125 | - if not role:advChapterIsOpen(chapterId) then return 5 end | |
126 | 171 | |
172 | + local relayData = role:getAdvData():isHaveRelay(layer, chapterId, true) | |
173 | + if not relayData then return 6 end -- 不是中继层 | |
127 | 174 | if layer ~= 1 then |
128 | - local relayData = role:getAdvData():isHaveRelay(layer, chapterId) | |
129 | - if not relayData then return 6 end -- 不是中继层 | |
130 | - if (advPass[chapterId] or 0) < relayData.floor then return 21 end | |
175 | + local advRelay = role:getProperty("advRelay") | |
176 | + if not (advRelay[chapterId] or {})[layer] then return 21 end -- 没有开放 | |
131 | 177 | end |
132 | - end | |
133 | - | |
134 | - if not checkFormat(role) then return 7 end | |
135 | - | |
136 | - --local advTeam = role:getProperty("advTeam") | |
137 | - --table.clear(advTeam) | |
178 | + if not role:checkAdvCount(relayData.supply) then return 2 end -- 是否有体力 | |
179 | + -- 关卡开放判断 | |
180 | + if not role:advChapterIsOpen(chapterId) then return 5 end | |
138 | 181 | |
139 | - --advTeam.heros = {} | |
140 | - --for slot, heroId in pairs(format.heros) do | |
141 | - -- advTeam.heros[slot] = heroId | |
142 | - --end | |
143 | - --advTeam.leader = format.leader | |
144 | - --advTeam.leader2 = format.leader2 | |
145 | - --role:updateProperty({field = "advTeam", value = advTeam}) | |
146 | - if AdvCommon.isEndless(chapterId) then | |
147 | - role.dailyData:updateProperty({field = "advElC", delta = 1}) | |
148 | - else | |
149 | - role:changeAdvCount(chapterData.limitlevel) | |
182 | + role:changeAdvCount(relayData.supply) | |
183 | + cost = relayData.supply | |
150 | 184 | end |
151 | - | |
185 | + role:checkTaskEnter("AdvCostPower", {count = cost}) | |
186 | + | |
152 | 187 | local support = {} -- 支援效果 |
153 | 188 | if AdvCommon.isEndless(chapterId) then |
154 | 189 | -- 选择的支援效果 |
... | ... | @@ -168,13 +203,16 @@ function _M.startAdvRpc( agent, data ) |
168 | 203 | end |
169 | 204 | end |
170 | 205 | end |
206 | + | |
171 | 207 | role:getAdvData():initByChapter({ |
172 | 208 | chapterId = chapterId, |
173 | 209 | level = layer, |
174 | 210 | isRelay = layer ~= 1, |
175 | 211 | isEnter = true, |
176 | 212 | support = support, |
213 | + actid = actid | |
177 | 214 | }) |
215 | + | |
178 | 216 | role:checkTaskEnter("AdvStart", {id = chapterId}) |
179 | 217 | role:checkTaskEnter("AdvStartSelf", {id = chapterId}) |
180 | 218 | role:getAdvData():popBackEvents() -- 清一下事件 |
... | ... | @@ -191,8 +229,42 @@ function _M.startHangRpc(agent, data) |
191 | 229 | local campId = msg.campId or 2 --营地id |
192 | 230 | local format = msg.format --编队 |
193 | 231 | local index = msg.index or 1--时间索引id |
232 | + local actid = msg.actid | |
194 | 233 | |
195 | - local chapterData = csvdb["adv_chapter_campsiteCsv"][chapterId] | |
234 | + -- 检查活动正确性 | |
235 | + if actid then | |
236 | + if not role.activity:isOpenById(actid, "AdvLevel") then | |
237 | + return 20 | |
238 | + end | |
239 | + local actCfg = csvdb["activity_adv_chapterCsv"][actid] | |
240 | + if not actCfg then return 21 end | |
241 | + actCfg = actCfg[chapterId] | |
242 | + if not actCfg then return 22 end | |
243 | + | |
244 | + if actCfg["unlockTime"] ~= 0 then | |
245 | + local st = toUnixtime(actCfg["unlockTime"]..string_format("%02x", RESET_TIME)) | |
246 | + if st > skynet.timex() then return 23 end | |
247 | + end | |
248 | + | |
249 | + if actCfg["prepose"] ~= "" then | |
250 | + local type, cid = actCfg["prepose"]:toArray(true, "=") | |
251 | + if type == 1 then | |
252 | + local actData = role.activity:getActData("ChallengeLevel") | |
253 | + local battleInfo = actData[cid] or {} | |
254 | + if (battleInfo["star"] or 0) == 0 then | |
255 | + return 24 | |
256 | + end | |
257 | + elseif type == 2 then | |
258 | + local actData = role.activity:getActData("AdvLevel") | |
259 | + local advInfo = actData[cid] or {} | |
260 | + if not advInfo["pass"] then | |
261 | + return 25 | |
262 | + end | |
263 | + end | |
264 | + end | |
265 | + end | |
266 | + | |
267 | + local chapterData = csvdb["adv_chapter_campsiteCsv"][chapterId] | |
196 | 268 | if not chapterData then return 1 end |
197 | 269 | local campSiteData = chapterData[campId] |
198 | 270 | if not campSiteData then return 1 end |
... | ... | @@ -214,11 +286,13 @@ function _M.startHangRpc(agent, data) |
214 | 286 | if AdvCommon.isEndless(chapterId) then return 5 end -- 无尽没有代理 |
215 | 287 | |
216 | 288 | local advRelay = role:getProperty("advRelay") |
217 | - if not next(advRelay[chapterId] or {}) then return 6 end -- 没有开放 | |
289 | + if not (advRelay[chapterId] or {})[campSiteData.floor] then return 6 end -- 没有开放 | |
218 | 290 | |
219 | 291 | |
220 | 292 | if not role:checkAdvCount(adv_idle_energy) then return 7 end -- 是否有体力 |
221 | 293 | |
294 | + role:checkTaskEnter("AdvCostPower", {count = adv_idle_energy}) | |
295 | + | |
222 | 296 | if not checkFormat(role, format, role:getAdvData():isRunning()) then return 8 end --编队是否正确 |
223 | 297 | |
224 | 298 | local player = {} |
... | ... | @@ -236,7 +310,8 @@ function _M.startHangRpc(agent, data) |
236 | 310 | + 0.226 * player["hit"] |
237 | 311 | + 0.26 * player["miss"] |
238 | 312 | |
239 | - if battleV < campSiteData.idleValue then return 9 end -- 战斗力是否满足 | |
313 | + --print(math.ceil(battleV), campSiteData.idleValue) | |
314 | + if math.ceil(battleV) < campSiteData.idleValue then return 9 end -- 战斗力是否满足 | |
240 | 315 | |
241 | 316 | local info = {} |
242 | 317 | info.format = {} |
... | ... | @@ -259,7 +334,7 @@ function _M.startHangRpc(agent, data) |
259 | 334 | role:changeUpdates({{type = "advHang", field = chapterId, value = info}}) |
260 | 335 | |
261 | 336 | role:changeAdvCount(adv_idle_energy) |
262 | - role:checkTaskEnter("AdvStart", {id = chapterId}) | |
337 | + role:checkTaskEnter("AdvStart", {id = chapterId, actid = actid}) | |
263 | 338 | role:mylog("adv_action", {desc = "startHang", int1 = chapterId}) |
264 | 339 | |
265 | 340 | SendPacket(actionCodes.Adv_startHangRpc, '') |
... | ... | @@ -344,6 +419,7 @@ function _M.endHangRpc(agent, data) |
344 | 419 | adv_idle_time = adv_idle_time * 60 |
345 | 420 | |
346 | 421 | local reward, isFull, change, heroFaithMap |
422 | + local heroCnt = 0 | |
347 | 423 | if skynet.timex() >= info.time then |
348 | 424 | -- 最新需求加成取消 |
349 | 425 | --[[ |
... | ... | @@ -378,6 +454,7 @@ function _M.endHangRpc(agent, data) |
378 | 454 | for _, heroId in pairs(info.format.heros) do |
379 | 455 | local curFaith = addHeroFaith(role, heroId, exp) |
380 | 456 | heroFaithMap[heroId] = curFaith |
457 | + heroCnt = heroCnt + 1 | |
381 | 458 | end |
382 | 459 | |
383 | 460 | local totalReward = campSiteData.idleReward_1 .. " " .. campSiteData.idleReward_2 |
... | ... | @@ -406,6 +483,7 @@ function _M.endHangRpc(agent, data) |
406 | 483 | role:mylog("adv_action", {desc = "endHang", int1 = chapterId, short1 = cancel and 1 or 0}) |
407 | 484 | |
408 | 485 | role:checkTaskEnter("AdvHang", {}) |
486 | + role:checkTaskEnter("AdvHangHeroCnt", {count = heroCnt}) | |
409 | 487 | |
410 | 488 | SendPacket(actionCodes.Adv_endHangRpc, MsgPack.pack({reward = reward, change = change, isFull = isFull, heroFaith = heroFaithMap})) |
411 | 489 | return true |
... | ... | @@ -543,8 +621,8 @@ function _M.usePotionRpc(agent, data) |
543 | 621 | local msg = MsgPack.unpack(data) |
544 | 622 | local potionId = msg.potionId -- 营养剂Id |
545 | 623 | local target = msg.target -- {roomId = 1, blockId = 1} 选择的目标 |
546 | - local potionLv = role.dinerData:getProperty("dishTree"):getv(potionId, 0) | |
547 | - if potionLv == 0 then return 1 end | |
624 | + local potionLv = role.dinerData:getProperty("dishTree"):getv(potionId, 1) | |
625 | + if potionLv < 1 then return 1 end | |
548 | 626 | |
549 | 627 | local potionSet = csvdb["adv_potionCsv"][potionId] |
550 | 628 | if not potionSet then return 2 end |
... | ... | @@ -552,12 +630,9 @@ function _M.usePotionRpc(agent, data) |
552 | 630 | local potionData = potionSet[potionLv] |
553 | 631 | if not potionData then return 3 end |
554 | 632 | |
555 | - local potionBag = role:getProperty("potionBag") | |
556 | - local own = potionBag[potionId] or 0 | |
557 | - if own <= 0 then return 4 end | |
558 | - | |
559 | 633 | if not isCanContinue(role) then return end |
560 | 634 | local adv = role:getAdvData() |
635 | + if not adv:cost({[potionId] = 1}, {}, true) then return 4 end | |
561 | 636 | if adv:isWaitChooseArtifact() then return end |
562 | 637 | |
563 | 638 | adv:mylog({desc = "usePotion", int1 = potionId}) |
... | ... | @@ -565,8 +640,7 @@ function _M.usePotionRpc(agent, data) |
565 | 640 | local status = adv:doActive(potionData.effect, target) -- target |
566 | 641 | if not status then return end |
567 | 642 | |
568 | - potionBag[potionId] = own - 1 | |
569 | - role:updateProperty({field = "potionBag", value = potionBag}) | |
643 | + adv:cost({[potionId] = 1}, {log = {desc = "usePotion", int1 = potionId}}) | |
570 | 644 | adv:pushBackEvent(AdvBackEventType.Potion, {id = potionId}) |
571 | 645 | adv:afterRound() |
572 | 646 | adv:saveDB() |
... | ... | @@ -737,7 +811,7 @@ function _M.endBattleRpc(agent, data) |
737 | 811 | role:finishGuide(52) |
738 | 812 | -- 调理剂使用引导(生命药剂) |
739 | 813 | if not role:checkOverGuide(61) then |
740 | - local potionBag = role:getProperty("potionBag") | |
814 | + local potionBag = role:getProperty("advItems"):toNumMap() | |
741 | 815 | local own = potionBag[10] or 0 |
742 | 816 | if own > 0 then |
743 | 817 | -- 造假 |
... | ... | @@ -962,6 +1036,9 @@ function _M.roleFormatRpc(agent , data) |
962 | 1036 | local index = msg.index -- 阵容索引 |
963 | 1037 | local title = msg.title -- 阵容名称 |
964 | 1038 | local team = {} |
1039 | + | |
1040 | + if role:getAdvData():isRunning() then return 3 end | |
1041 | + | |
965 | 1042 | for slot, heroId in pairs(msg.heros) do |
966 | 1043 | if not role.heros[heroId] then |
967 | 1044 | return 1 |
... | ... | @@ -1004,6 +1081,9 @@ function _M.selectTeamRpc(agent, data) |
1004 | 1081 | local role = agent.role |
1005 | 1082 | local msg = MsgPack.unpack(data) |
1006 | 1083 | local index = msg.index -- 阵容索引 |
1084 | + | |
1085 | + if role:getAdvData():isRunning() then return 1 end | |
1086 | + | |
1007 | 1087 | local team = role:getAdvTeamFormat(index) |
1008 | 1088 | if not next(team) then return end |
1009 | 1089 | team["index"] = index | ... | ... |
src/actions/CarAction.lua
... | ... | @@ -13,7 +13,7 @@ function _M.makePotionRpc( agent, data ) |
13 | 13 | local count = msg.count |
14 | 14 | if count < 1 then return 0 end |
15 | 15 | local potionBag = role:getProperty("potionBag") |
16 | - local potionLv = role.dinerData:getProperty("dishTree"):getv(potionId, 0) | |
16 | + local potionLv = role.dinerData:getProperty("dishTree"):getv(potionId, 1) | |
17 | 17 | if potionLv < 1 then return 1 end |
18 | 18 | |
19 | 19 | local potionSet = csvdb["adv_potionCsv"][potionId] |
... | ... | @@ -22,20 +22,15 @@ function _M.makePotionRpc( agent, data ) |
22 | 22 | local potionData = potionSet[potionLv] |
23 | 23 | if not potionData then return 3 end |
24 | 24 | |
25 | - local own = potionBag[potionId] or 0 | |
26 | - if own+count > potionData.limit then | |
27 | - return 4 | |
28 | - end | |
29 | - | |
30 | 25 | local cost = potionData.material:toNumMap() |
31 | 26 | for k, n in pairs(cost) do |
32 | 27 | cost[k] = n * count |
33 | 28 | end |
34 | 29 | if not role:checkItemEnough(cost) then |
35 | - return 5 | |
30 | + return 4 | |
36 | 31 | end |
37 | - | |
38 | 32 | role:costItems(cost, {log = {desc = "makePotion", int1 = potionId, int2 = count}}) |
33 | + local own = potionBag[potionId] or 0 | |
39 | 34 | potionBag[potionId] = own + count |
40 | 35 | role:updateProperty({field = "potionBag", value = potionBag}) |
41 | 36 | role:checkTaskEnter("PotionMake", {count = count, id = potionId}) | ... | ... |
src/actions/DinerAction.lua
... | ... | @@ -305,7 +305,7 @@ function _M.expediteSellRpc( agent, data ) |
305 | 305 | local gift = reward:toNumMap() |
306 | 306 | |
307 | 307 | -- 特权卡获取加速获得额外道具 |
308 | - local coef = role.storeData:getProduceItemSpeedCoef() | |
308 | + local coef = 1 --role.storeData:getProduceItemSpeedCoef() | |
309 | 309 | for k, v in pairs(gift) do |
310 | 310 | if coef > 1 then |
311 | 311 | v = math.floor(v * coef) |
... | ... | @@ -385,22 +385,12 @@ function _M.talentUpRpc( agent, data ) |
385 | 385 | local msg = MsgPack.unpack(data) |
386 | 386 | local dish = msg.dish |
387 | 387 | local dishTree = role.dinerData:getProperty("dishTree") |
388 | - local dishLevel = dishTree:getv(dish, 0) | |
389 | 388 | |
390 | 389 | local talentSet = csvdb["diner_talentCsv"][dish] |
391 | 390 | if not talentSet then |
392 | 391 | return 1 |
393 | 392 | end |
394 | 393 | |
395 | - local talentData = talentSet[dishLevel] | |
396 | - if not talentData then | |
397 | - return 2 | |
398 | - end | |
399 | - | |
400 | - if not talentSet[dishLevel+1] then | |
401 | - return 21 | |
402 | - end | |
403 | - | |
404 | 394 | local typ = math.floor(dish/100 + 1) |
405 | 395 | local treeSet = csvdb["diner_treeCsv"][typ] |
406 | 396 | if not treeSet then |
... | ... | @@ -412,6 +402,17 @@ function _M.talentUpRpc( agent, data ) |
412 | 402 | return 4 |
413 | 403 | end |
414 | 404 | |
405 | + -- 调理剂的默认等级是1级 | |
406 | + local dishLevel = dishTree:getv(dish, treeData.rarity == 2 and 1 or 0) | |
407 | + local talentData = talentSet[dishLevel] | |
408 | + if not talentData then | |
409 | + return 2 | |
410 | + end | |
411 | + | |
412 | + if not talentSet[dishLevel+1] then | |
413 | + return 21 | |
414 | + end | |
415 | + | |
415 | 416 | local limit = talentData.pointFront:toNumMap() |
416 | 417 | for k,v in pairs(limit) do |
417 | 418 | local lv = dishTree:getv(k, 0) | ... | ... |
src/actions/EmailAction.lua
... | ... | @@ -40,10 +40,17 @@ function _M.listRpc(agent, data) |
40 | 40 | local count = 1 |
41 | 41 | for _, data in ipairs(result) do |
42 | 42 | local email = tarr2tab(data) |
43 | - if tonum(email.createtime) > role:getProperty("ctime") | |
44 | - and ( not email.mid or tonum(email.mid) == mid ) | |
43 | + -- 0 需要判斷創角時間小於郵件創建時間 1 只需要在時間段內登陸即可領取 | |
44 | + local delayType = tonum(email.delayType) | |
45 | + local flag = false | |
46 | + if delayType == 1 then | |
47 | + flag = skynet.timex() > tonum(email.createtime) | |
48 | + else | |
49 | + flag = tonum(email.createtime) > role:getProperty("ctime") | |
50 | + end | |
51 | + if flag and ( not email.mid or tonum(email.mid) == mid ) | |
45 | 52 | and ( not email.endtime or tonum(email.endtime) > now )then |
46 | - local time = math.max(tonum(email.timestamp, 0) or email.createtime) | |
53 | + local time = math.max(tonum(email.timestamp, 0) , tonum(email.createtime)) | |
47 | 54 | redisproxy:insertEmail({ |
48 | 55 | roleId = roleId, |
49 | 56 | emailId = 0, | ... | ... |
src/actions/GmAction.lua
... | ... | @@ -36,26 +36,15 @@ function _M.ban(role, pms) |
36 | 36 | local time = tonum(pms.pm1, 1) |
37 | 37 | local ctype = tonum(pms.pm2, 0) |
38 | 38 | |
39 | - local isBan = role:getProperty("banTime") <= now | |
40 | 39 | role:setBan(time, ctype) |
41 | - if time > 0 then | |
42 | - role:sendGmMsg("server_accountBanned_1") | |
43 | - local agent = datacenter.get("agent", role:getProperty("id")) | |
44 | - if agent then | |
45 | - skynet.timeout(50, function () | |
46 | - skynet.call(agent.gate_serv, "lua", "forcekick", agent.fd) | |
47 | - end) | |
48 | - end | |
49 | - end | |
50 | - | |
51 | 40 | role:mylog("gm_action", {desc = "ban", int1 = time, int2 = ctype, key1 = pms.sender}) |
52 | - | |
53 | - return isBan and "解封杀成功" or "封杀成功" | |
41 | + return "封杀成功" | |
54 | 42 | end |
55 | 43 | |
44 | + | |
56 | 45 | function _M.unban(role, pms) |
57 | 46 | role:setBan(0, 0) |
58 | - | |
47 | + role:setProperty("cheatCount", 0) -- 清除作弊次数 | |
59 | 48 | role:mylog("gm_action", {desc = "unban", key1 = pms.sender}) |
60 | 49 | |
61 | 50 | return "解封杀成功" |
... | ... | @@ -63,18 +52,17 @@ end |
63 | 52 | |
64 | 53 | function _M.gmmsg(role, pms) |
65 | 54 | role:sendGmMsg(pms.pm1, true) |
66 | - | |
67 | - local agent = datacenter.get("agent", role:getProperty("id")) | |
68 | - if agent then | |
69 | - skynet.timeout(50, function () | |
70 | - skynet.call(agent.gate_serv, "lua", "forcekick", agent.fd) | |
71 | - end) | |
72 | - end | |
73 | 55 | role:mylog("gm_action", {desc = "gmmsg", text1 = pms.pm1, key1 = pms.sender}) |
74 | - | |
75 | 56 | return "指令成功" |
76 | 57 | end |
77 | 58 | |
59 | + | |
60 | +function _M.reset_rank(role, pms) | |
61 | + role:resetRank() | |
62 | + role:mylog("gm_action", {desc = "reset_rank", key1 = pms.sender}) | |
63 | + return "封杀成功" | |
64 | +end | |
65 | + | |
78 | 66 | function _M.silent(role, pms) |
79 | 67 | local pm1 = tonum(pms.pm1) |
80 | 68 | if pm1 < 1 then |
... | ... | @@ -92,6 +80,10 @@ function _M.pvp_cross_head(role, pms) |
92 | 80 | return "成功" |
93 | 81 | end |
94 | 82 | |
83 | +function _M.expire_item(role, pms) | |
84 | + role:awardExpireItem(tonum(pms.pm1), pms.pm2, {log = {desc = "gm"}}) | |
85 | + return "成功" | |
86 | +end | |
95 | 87 | |
96 | 88 | local helpDes = {{"描述", "指令", "参数1", "参数2" ,"参数3"}} |
97 | 89 | |
... | ... | @@ -259,6 +251,7 @@ table.insert(helpDes, {"获得所有零件", "get", "RUNE"}) |
259 | 251 | table.insert(helpDes, {"获得所有碎片", "get", "FRAG"}) |
260 | 252 | table.insert(helpDes, {"获得所有食物", "get", "FOOD"}) |
261 | 253 | table.insert(helpDes, {"获得所有角色", "get", "HERO"}) |
254 | +table.insert(helpDes, {"获得满级满觉醒角色,满级满精进铭文", "get", "MAXHERO"}) | |
262 | 255 | function _M.get(role, pms) |
263 | 256 | if pms.pm1 == "ALL" then |
264 | 257 | local reward = {} |
... | ... | @@ -275,7 +268,7 @@ function _M.get(role, pms) |
275 | 268 | end |
276 | 269 | end |
277 | 270 | elseif pms.pm1 == "RUNE" then |
278 | - for itemId = 2000 , 3000 do | |
271 | + for itemId = 10000 , 20000 do | |
279 | 272 | if csvdb["itemCsv"][itemId] then |
280 | 273 | role:award({[itemId] = 1}, {log = {desc = "gm"}}) |
281 | 274 | end |
... | ... | @@ -298,6 +291,37 @@ function _M.get(role, pms) |
298 | 291 | role:award({[itemId] = 1}, {log = {desc = "gm"}}) |
299 | 292 | end |
300 | 293 | end |
294 | + elseif pms.pm1 == "MAXHERO" then | |
295 | + -- 给英雄 | |
296 | + for heroId = 100, 500 do | |
297 | + local heroCfg = csvdb["unitCsv"][heroId] | |
298 | + if heroCfg and heroCfg.open == 1 then | |
299 | + role:award({[heroId + 300] = 1}, {log = {desc = "gm"}}) | |
300 | + end | |
301 | + end | |
302 | + -- 升满级 | |
303 | + for _, hero in ipairs(role.heros) do | |
304 | + _M.herol(role, {pm1 = hero:getProperty("type"), pm2 = 130}) | |
305 | + hero:updateProperty({field = "wakeL", value = #csvdb["unit_wakeCsv"]}) | |
306 | + end | |
307 | + | |
308 | + -- 添加铭文 | |
309 | + for itemId = 10000 , 20000 do | |
310 | + if csvdb["itemCsv"][itemId] then | |
311 | + role:award({[itemId] = 1}, {log = {desc = "gm"}}) | |
312 | + end | |
313 | + end | |
314 | + for _, rune in ipairs(role.runeBag) do | |
315 | + local typ = rune:getProperty("type") | |
316 | + local id = rune:getProperty("id") | |
317 | + | |
318 | + local runeSet = csvdb["runeCsv"][typ] | |
319 | + if not runeSet then break end | |
320 | + local runeData = runeSet[id] | |
321 | + if not runeData then break end | |
322 | + | |
323 | + rune:updateProperty({field = "level",value = runeData.lvLimit}) | |
324 | + end | |
301 | 325 | else |
302 | 326 | local itemId = tonum(pms.pm1) |
303 | 327 | if not csvdb["itemCsv"][itemId] then |
... | ... | @@ -371,6 +395,7 @@ function _M.advt(role, pms) |
371 | 395 | local chapterId = tonum(pms.pm1) |
372 | 396 | local layer = tonum(pms.pm2) |
373 | 397 | local mapId = tonum(pms.pm3) |
398 | + local actid = tonum(pms.pm4) | |
374 | 399 | local advCsv = csvdb["adv_chapterCsv"][chapterId] |
375 | 400 | if not advCsv then return "不存在的章节" end |
376 | 401 | |
... | ... | @@ -387,6 +412,7 @@ function _M.advt(role, pms) |
387 | 412 | level = layer, |
388 | 413 | isEnter = true, |
389 | 414 | debugMapId = mapId, |
415 | + actid = actid, | |
390 | 416 | }) |
391 | 417 | role:mylog("gm_action", {desc = "advt", int1 = chapterId, int2 = layer, key1 = pms.sender}) |
392 | 418 | return "成功" |
... | ... | @@ -539,6 +565,70 @@ function _M.actbattle(role, pms) |
539 | 565 | return "成功" |
540 | 566 | end |
541 | 567 | |
568 | +table.insert(helpDes, {"清空背包", "clearbag"}) | |
569 | +function _M.clearbag(role, pms) | |
570 | + -- 装备 | |
571 | + role:updateProperty({field="equips", value = {}}) | |
572 | + -- 道具 | |
573 | + local items = role:getProperty("items"):toNumMap() | |
574 | + for k, v in pairs(items) do | |
575 | + role:addItem({itemId = k, count = -v, log = {desc = "gm"}}) | |
576 | + end | |
577 | + | |
578 | + -- 铭文 | |
579 | + local uids = {} | |
580 | + for uid, _ in pairs(role.runeBag) do | |
581 | + table.insert(uids, uid) | |
582 | + end | |
583 | + role:delRunes(uids, {log = {desc = "gm"}}) | |
584 | + | |
585 | + return "成功" | |
586 | +end | |
587 | + | |
588 | +table.insert(helpDes, {"发送跑马灯", "notice"}) | |
589 | +function _M.notice(role, pms) | |
590 | + local msg = pms.pm1 | |
591 | + SendPacket(actionCodes.Sys_commonNotice, MsgPack.pack({body = msg})) | |
592 | + | |
593 | + return "成功" | |
594 | +end | |
595 | + | |
596 | +table.insert(helpDes, {"活动关卡", "actbp", "id", "actid"}) | |
597 | +function _M.actbp(role, pms) | |
598 | + local id = tonum(pms.pm1, 0) | |
599 | + local actid = tonum(pms.pm2, 0) | |
600 | + if not role.activity:isOpenById(actid, "ChallengeLevel") then return end | |
601 | + local actData = role.activity:getActData("ChallengeLevel") or {} | |
602 | + | |
603 | + local actCfg = csvdb["activity_battleCsv"][actid] | |
604 | + if not actCfg then return end | |
605 | + for k, v in pairs(actCfg) do | |
606 | + if k <= id then | |
607 | + local bpInfo = actData[i] or {} | |
608 | + bpInfo["star"] = 1 | |
609 | + actData[k] = bpInfo | |
610 | + end | |
611 | + end | |
612 | + role.activity:updateActData("ChallengeLevel", actData) | |
613 | + | |
614 | + return "成功" | |
615 | +end | |
616 | + | |
617 | +table.insert(helpDes, {"活动拾荒", "actadv", "id", "actid"}) | |
618 | +function _M.actadv(role, pms) | |
619 | + local id = tonum(pms.pm1, 0) | |
620 | + local actid = tonum(pms.pm2, 0) | |
621 | + if not role.activity:isOpenById(actid, "AdvLevel") then return end | |
622 | + local actData = role.activity:getActData("AdvLevel") or {} | |
623 | + local advInfo = actData[id] | |
624 | + advInfo["pass"] = 1 | |
625 | + actData[id] = advInfo | |
626 | + | |
627 | + role.activity:updateActData("AdvLevel", actData) | |
628 | + | |
629 | + return "成功" | |
630 | +end | |
631 | + | |
542 | 632 | function _M.helpRpc(agent, data) |
543 | 633 | SendPacket(actionCodes.Gm_helpRpc, MsgPack.pack({help = helpDes})) |
544 | 634 | return true |
... | ... | @@ -546,11 +636,23 @@ end |
546 | 636 | |
547 | 637 | function _M.test(role, pms) |
548 | 638 | local id = tonum(pms.pm1, 0) |
639 | + local actid = nil | |
640 | + if id > 100 then | |
641 | + actid = tonum(pms.pm2, 0) | |
642 | + end | |
549 | 643 | --local hero = require ("actions.HeroAction") |
550 | 644 | --hero.unlockPoolRpc({role = role}, MsgPack.pack({type = id})) |
551 | 645 | |
552 | 646 | --role:sendMail(13, nil, "1=2", {111}) |
553 | - dump(redisproxy:zrevrange("rank:tower", 0 , 10, "WITHSCORES")) | |
647 | + local file = io.open("draw_hero_"..id..".csv", "a") | |
648 | + for i=1, 10000 do | |
649 | + local heroIds = _M.drawHero(role, id, actid) | |
650 | + for k, v in ipairs(heroIds) do | |
651 | + print((i - 1)* 10 + k, v) | |
652 | + file:write(v.."\n") | |
653 | + end | |
654 | + end | |
655 | + io.close(file) | |
554 | 656 | return "成功" |
555 | 657 | end |
556 | 658 | |
... | ... | @@ -559,8 +661,15 @@ function _M.ayncPurchase(role, params) |
559 | 661 | return role:handlePurchase(params) or "" |
560 | 662 | end |
561 | 663 | |
664 | +-- 获取订单号 | |
665 | +function _M.getPurchaseOrder(role, params) | |
666 | + return role:getPurchaseOrderByPlatform(params) or "" | |
667 | +end | |
668 | + | |
669 | + | |
562 | 670 | function _M.cz(role, pms) |
563 | 671 | local id = tonum(pms.pm1) |
672 | + local sid = tonum(pms.pm2) or 0 | |
564 | 673 | local csvData = csvdb["shop_rechargeCsv"][id] |
565 | 674 | if not csvData then |
566 | 675 | return "充值id错误, 查看shop_recharge.csv" |
... | ... | @@ -570,10 +679,276 @@ function _M.cz(role, pms) |
570 | 679 | transactionId = "GM", |
571 | 680 | order = "GM", |
572 | 681 | pay_time = skynet.timex(), |
682 | + sid = sid == 1 and IOS_SID or 0, | |
573 | 683 | }) |
574 | 684 | role:mylog("gm_action", {desc = "recharge", int1 = id, key1 = pms.sender}) |
575 | 685 | return "指令成功" |
576 | 686 | end |
577 | 687 | |
688 | +function _M.drawHero(role, t, act) | |
689 | + local btype = t -- 1 2 3 4 5 卡池类型 4新手卡池 5心愿卡池 | |
690 | + local subType = 1-- 定向卡池需要传 子类型 | |
691 | + local drawType = 2 -- 1 单抽 2 十连 | |
692 | + if btype ~= 1 then | |
693 | + subType = 1 | |
694 | + end | |
695 | + | |
696 | + local actid = act | |
697 | + -- 另开活动卡池 | |
698 | + if actid then | |
699 | + --if not role.activity:isOpenById(actid, "ActHeroPool") then return end | |
700 | + local cfg = csvdb["activity_ctrlCsv"][actid] | |
701 | + if not cfg then return end | |
702 | + | |
703 | + btype = cfg.condition | |
704 | + end | |
705 | + | |
706 | + local buildTypeData = csvdb["build_typeCsv"][btype] | |
707 | + if not buildTypeData then return 2 end | |
708 | + | |
709 | + local drawCount = {1, 10} -- 抽取次数 | |
710 | + if not drawCount[drawType] then return 3 end | |
711 | + | |
712 | + local draw_floor_back_counts = globalCsv.draw_floor_back_counts[btype] | |
713 | + local floorHeroCount = role:getProperty("floorHero")[btype] or 0 | |
714 | + | |
715 | + -- 抽取的池子 | |
716 | + local poolMap = buildTypeData["pool"]:toNumMap() | |
717 | + local poolId = poolMap[subType] | |
718 | + if not poolId then return 5 end | |
719 | + | |
720 | + --TODO 活动覆盖 | |
721 | + local actPoolId = role.activity:getActivityPool(btype, subType) | |
722 | + if actPoolId ~= 0 then | |
723 | + poolId = actPoolId | |
724 | + end | |
725 | + | |
726 | + local unitPool = csvdb["build_unitCsv"][poolId] | |
727 | + if not unitPool then return 7 end | |
728 | + | |
729 | + -- 开始抽 | |
730 | + local resultPool = {} | |
731 | + local function fillDrawPool(isFloorBack) | |
732 | + local condition = {"rare"} | |
733 | + local values = {} | |
734 | + | |
735 | + | |
736 | + for idx, field in ipairs(condition) do | |
737 | + if not values[idx] then | |
738 | + local lpool = {} | |
739 | + local curIdx = 1 | |
740 | + while unitPool[field .. "_" .. curIdx] do | |
741 | + lpool[curIdx] = {unitPool[field .. "_" .. curIdx]} | |
742 | + curIdx = curIdx + 1 | |
743 | + end | |
744 | + | |
745 | + if next(lpool) then | |
746 | + values[idx] = math.randWeight(lpool, 1) | |
747 | + end | |
748 | + end | |
749 | + end | |
750 | + | |
751 | + local weight = 0 | |
752 | + local up_pool = nil | |
753 | + local rand_v = math.randomInt(1, 100) | |
754 | + if values[1] == HeroQuality.SR then | |
755 | + weight = unitPool["up_sr_weight"] | |
756 | + up_pool = unitPool["up_sr_id"] | |
757 | + elseif values[1] == HeroQuality.SSR then | |
758 | + weight = unitPool["up_ssr_weight"] | |
759 | + up_pool = unitPool["up_ssr_id"] | |
760 | + if btype == 5 then | |
761 | + weight = 3 * weight | |
762 | + end | |
763 | + end | |
764 | + --print(poolId, rand_v, weight, up_pool, values[1]) | |
765 | + if rand_v < weight and up_pool then | |
766 | + up_pool = up_pool:toArray(true, "=") | |
767 | + if btype == 5 then -- 爱心卡池,使用玩家设置的备选池子 | |
768 | + up_pool = role:getProperty("wishPool") | |
769 | + up_pool[1] = 408 | |
770 | + up_pool[2] = 409 | |
771 | + up_pool[3] = 410 | |
772 | + end | |
773 | + for k, v in ipairs(up_pool) do | |
774 | + resultPool[v] = {1} | |
775 | + end | |
776 | + else | |
777 | + for itemId, oneData in pairs(isFloorBack and csvdb["build_floorCsv"] or csvdb["build_poolCsv"]) do | |
778 | + local pool_str = "pool_" .. poolId | |
779 | + if oneData[pool_str] and oneData[pool_str] ~= "" then | |
780 | + local itemData = csvdb["itemCsv"][itemId] | |
781 | + while itemData do | |
782 | + if itemData.type ~= ItemType.Hero then break end | |
783 | + local heroData = csvdb["unitCsv"][itemData.id - ItemStartId.Hero] | |
784 | + if not heroData then break end | |
785 | + local ok = true | |
786 | + -- 保底是全随机,不用比较类型 | |
787 | + if not isFloorBack then | |
788 | + for idx, field in ipairs(condition) do | |
789 | + if heroData[field] ~= values[idx] then ok = false break end | |
790 | + end | |
791 | + end | |
792 | + if up_pool then | |
793 | + for k, v in ipairs(up_pool) do | |
794 | + if v == itemData.id then | |
795 | + ok = false | |
796 | + break | |
797 | + end | |
798 | + end | |
799 | + end | |
800 | + if not ok then break end | |
801 | + if oneData[pool_str] > 0 then | |
802 | + resultPool[itemId] = {oneData[pool_str]} -- itemId, count, 概率 | |
803 | + end | |
804 | + break | |
805 | + end | |
806 | + end | |
807 | + end | |
808 | + end | |
809 | + end | |
810 | + | |
811 | + local guideHero = nil | |
812 | + if role:getProperty("newerGuide") == "8=1" then | |
813 | + guideHero = globalCsv.newdraw_hero_item_id or 503 | |
814 | + end | |
815 | + | |
816 | + local ssrCount = 0 | |
817 | + local reward = {} | |
818 | + local logReward = {} | |
819 | + local result = {} | |
820 | + for i = 1, drawCount[drawType] do | |
821 | + floorHeroCount = floorHeroCount + 1 | |
822 | + local isFloorBack = draw_floor_back_counts and floorHeroCount >= draw_floor_back_counts | |
823 | + resultPool = {} | |
824 | + fillDrawPool(isFloorBack) | |
825 | + if not next(resultPool) then | |
826 | + skynet.error("random pool error, poolId:" .. poolId, isFloorBack) | |
827 | + return 8 | |
828 | + end | |
829 | + | |
830 | + local itemId = math.randWeight(resultPool, 1) | |
831 | + if guideHero then | |
832 | + itemId = guideHero | |
833 | + end | |
834 | + | |
835 | + local itemData = csvdb["itemCsv"][itemId] | |
836 | + if itemData.quality == HeroQuality.SSR then | |
837 | + ssrCount = ssrCount + 1 | |
838 | + if not guideHero then | |
839 | + -- 广播获得ssr英雄 | |
840 | + local ntf = {heroId = itemData.id - ItemStartId.Hero, nick = role:getProperty("name")} | |
841 | + --mcast_util.pub_world(actionCodes.Role_broadGetSSR, MsgPack.pack(ntf)) | |
842 | + end | |
843 | + end | |
844 | + | |
845 | + if btype == 4 and role:getProperty("newerDraw") == 0 then -- 新手卡池 | |
846 | + if itemData.quality == HeroQuality.SSR then | |
847 | + floorHeroCount = 0 | |
848 | + end | |
849 | + else | |
850 | + if itemData.quality >= HeroQuality.SR then | |
851 | + floorHeroCount = 0 | |
852 | + end | |
853 | + end | |
854 | + | |
855 | + if role:isHaveHero(itemData.id - ItemStartId.Hero) then | |
856 | + local fragId = itemData.id - ItemStartId.Hero | |
857 | + local heroData = csvdb["unitCsv"][fragId] | |
858 | + local count = globalCsv.draw_unit_tofragment[heroData.rare] | |
859 | + role:award({[fragId] = count}, {log = {desc = "drawHero", int1 = btype, int2 = poolId}}) | |
860 | + logReward[fragId] = (logReward[fragId] or 0) + count | |
861 | + table.insert(reward, {id = fragId, count = count, from = itemId, fcount = 1}) | |
862 | + else | |
863 | + role:award({[itemId] = 1}, {log = {desc = "drawHero", int1 = btype, int2 = poolId}}) | |
864 | + logReward[itemId] = (logReward[itemId] or 0) + 1 | |
865 | + table.insert(reward, {id = itemId, count = 1}) | |
866 | + end | |
867 | + end | |
868 | + | |
869 | + if draw_floor_back_counts then | |
870 | + local floorHero = role:getProperty("floorHero") | |
871 | + floorHero[btype] = floorHeroCount | |
872 | + role:setProperty("floorHero", floorHero) | |
873 | + end | |
874 | + | |
875 | + if btype == 4 then | |
876 | + local newCount = role:getProperty("newerDraw") | |
877 | + role:updateProperty({field="newerDraw", value = newCount + drawCount[drawType]}) | |
878 | + end | |
879 | + | |
880 | + --SendPacket(actionCodes.Hero_drawHeroRpc, MsgPack.pack({reward = reward})) -- 这个 reward 是数组 | |
881 | + for k, v in pairs(reward) do | |
882 | + local hero = v | |
883 | + if hero["from"] then | |
884 | + result[#result+1] = hero["from"] | |
885 | + else | |
886 | + result[#result+1] = hero["id"] | |
887 | + end | |
888 | + end | |
889 | + | |
890 | + local feedbackId = buildTypeData["can_feedback"] or 0 | |
891 | + if feedbackId ~= 0 then | |
892 | + -- 达到一定次数,给响应奖励 | |
893 | + local oldVal = role:getProperty("repayHero") or 0 | |
894 | + if actid then | |
895 | + local actData = role.activity:getActData("ActHeroPool") | |
896 | + oldVal = actData[btype] or 0 | |
897 | + end | |
898 | + local newVal = oldVal + drawCount[drawType] | |
899 | + local drawCardReward, val = role:getDrawCardExtraReward(feedbackId, oldVal, newVal) | |
900 | + -- 空字符穿代表直接给英雄 走以前repayHeroRpc | |
901 | + if drawCardReward == "" then | |
902 | + local repayHeroMaxCount = role:getProperty("repayMaxC") or 0 | |
903 | + repayHeroMaxCount = repayHeroMaxCount + 1 | |
904 | + | |
905 | + role:updateProperty({field = "repayMaxC", value = repayHeroMaxCount}) | |
906 | + local even = repayHeroMaxCount % 2 | |
907 | + local id = 0 | |
908 | + if even == 1 then | |
909 | + id = math.randWeight(csvdb["build_giftCsv"], "pool_"..feedbackId) | |
910 | + else | |
911 | + local giftHeroSet = {} | |
912 | + for gid, cfg in pairs(csvdb["build_giftCsv"]) do | |
913 | + if cfg["pool_"..feedbackId] ~= 0 and not role:isHaveHero(gid - ItemStartId.Hero) then | |
914 | + giftHeroSet[gid] = {1} | |
915 | + end | |
916 | + end | |
917 | + if next(giftHeroSet) then | |
918 | + id = math.randWeight(giftHeroSet, 1) | |
919 | + end | |
920 | + end | |
921 | + if id == 0 then | |
922 | + id = math.randWeight(csvdb["build_giftCsv"], "pool_"..feedbackId) | |
923 | + end | |
924 | + | |
925 | + local r,change = {} | |
926 | + local itemData = csvdb["itemCsv"][id] | |
927 | + --if itemData.type == ItemType.Hero and role:isHaveHero(itemData.id - ItemStartId.Hero) then | |
928 | + -- local fragId = itemData.id - ItemStartId.Hero | |
929 | + -- local heroData = csvdb["unitCsv"][fragId] | |
930 | + -- local count = globalCsv.draw_unit_tofragment[heroData.rare] | |
931 | + -- r, change = role:award({[fragId] = count}, {log = {desc = "drawHeroExtraReward"}}) | |
932 | + -- --r = {id = fragId, count = count, from = id, fcount = 1} | |
933 | + --else | |
934 | + r, change = role:award({[id] = 1}, {log = {desc = "drawHeroExtraReward"}}) | |
935 | + --end | |
936 | + SendPacket(actionCodes.Hero_drawHeroExtraRewardNtf, MsgPack.pack(role:packReward(r, change))) | |
937 | + elseif drawCardReward and drawCardReward ~= "" then | |
938 | + local r,change = {} | |
939 | + r, change = role:award(drawCardReward, {log = {desc = "drawHeroExtraReward", int1 = oldVal, int2 = newVal}}) | |
940 | + SendPacket(actionCodes.Hero_drawHeroExtraRewardNtf, MsgPack.pack(role:packReward(r, change))) | |
941 | + end | |
942 | + if not actid then | |
943 | + role:updateProperty({field = "repayHero", value = val}) | |
944 | + else | |
945 | + local actData = role.activity:getActData("ActHeroPool") | |
946 | + actData[btype] = val | |
947 | + role.activity:updateActData("ActHeroPool", actData) | |
948 | + end | |
949 | + end | |
950 | + return result | |
951 | +end | |
952 | + | |
578 | 953 | |
579 | 954 | return _M |
580 | 955 | \ No newline at end of file | ... | ... |
src/actions/HangAction.lua
... | ... | @@ -235,6 +235,16 @@ function _M.endBattleRpc(agent, data) |
235 | 235 | return 4 |
236 | 236 | end |
237 | 237 | |
238 | + -- 防作弊 | |
239 | + if not role:checkBattleCheat("hang", { | |
240 | + id = carbonId, | |
241 | + isWin = isWin, | |
242 | + info = msg.info | |
243 | + }) then | |
244 | + SendPacket(actionCodes.Hang_endBattleRpc, MsgPack.pack({errorCode = 1})) | |
245 | + return true | |
246 | + end | |
247 | + | |
238 | 248 | local reward, change |
239 | 249 | if isWin then --win |
240 | 250 | role:hangFinish(carbonId) |
... | ... | @@ -581,6 +591,8 @@ function _M.startBonusBattleRpc(agent, data) |
581 | 591 | |
582 | 592 | local reward, change = bonusWinReward(role, bonusData, 3, count) |
583 | 593 | SendPacket(actionCodes.Hang_startBonusBattleRpc, MsgPack.pack({reward = reward, change = change})) |
594 | + | |
595 | + role:checkTaskEnter("BonusQuick", {count = count}) | |
584 | 596 | else |
585 | 597 | local bTeam = role:getTeamFormatByType(TeamSystemType.BonusBattle) |
586 | 598 | if not next(bTeam) then return 5 end |
... | ... | @@ -607,6 +619,18 @@ function _M.endBonusBattleRpc(agent, data) |
607 | 619 | SendPacket(actionCodes.Hang_endBonusBattleRpc, MsgPack.pack({errorCode = 1})) |
608 | 620 | return true |
609 | 621 | end |
622 | + role.__bonusBattleCache = nil | |
623 | + | |
624 | + -- 防作弊 | |
625 | + if not role:checkBattleCheat("bonus", { | |
626 | + id = id, | |
627 | + isWin = starNum and starNum > 0, | |
628 | + info = msg.info | |
629 | + }) then | |
630 | + SendPacket(actionCodes.Hang_endBonusBattleRpc, MsgPack.pack({errorCode = 1})) | |
631 | + return true | |
632 | + end | |
633 | + | |
610 | 634 | local bonusData = csvdb["bonus_battleCsv"][id] |
611 | 635 | |
612 | 636 | local reward, change = {} | ... | ... |
src/actions/HeroAction.lua
... | ... | @@ -72,6 +72,7 @@ function _M.breakRpc( agent, data ) |
72 | 72 | if hero:getProperty("level") < hero:getMaxLevel() then return 2 end |
73 | 73 | if hero:getProperty("breakL") >= #csvdb["unit_breakCsv"] then return 3 end |
74 | 74 | local curData = csvdb["unit_breakCsv"][hero:getProperty("breakL")] |
75 | + if hero:getProperty("wakeL") < curData["starLimit"] then return 4 end | |
75 | 76 | local cost = {[ItemId.BreakCost] = curData.cost, [ItemId.Gold] = curData.gold} |
76 | 77 | if not role:checkItemEnough(cost) then return 4 end |
77 | 78 | role:costItems(cost, {log = {desc = "heroBreak", int1 = msg.id, int2 = hero:getProperty("type")}}) |
... | ... | @@ -617,7 +618,7 @@ function _M.getResetRewardRpc(agent, data) |
617 | 618 | if level <= 1 and talent == "" then return end |
618 | 619 | |
619 | 620 | local pay = true |
620 | - if level <= 60 then | |
621 | + if level <= 60 or role.activity:isOpen("HeroBackFree") then | |
621 | 622 | pay = false |
622 | 623 | end |
623 | 624 | |
... | ... | @@ -663,7 +664,8 @@ function _M.getResetRewardRpc(agent, data) |
663 | 664 | |
664 | 665 | while stage > 0 do |
665 | 666 | local curData = csvdb["unit_talent_"..heroCfgId.."Csv"][stage] |
666 | - for lvl = 1, curTalentLvl - 1 do | |
667 | + local offset = stage == talent:getv(0,1) and curTalentLvl - 1 or #curData | |
668 | + for lvl = 1, offset do | |
667 | 669 | local talentData = curData[lvl] |
668 | 670 | for itemId, count in pairs(talentData.money:toNumMap()) do |
669 | 671 | reward[itemId] = (reward[itemId] or 0) + count |
... | ... | @@ -853,6 +855,10 @@ function _M.drawHeroRpc(agent, data) |
853 | 855 | elseif values[1] == HeroQuality.SSR then |
854 | 856 | weight = unitPool["up_ssr_weight"] |
855 | 857 | up_pool = unitPool["up_ssr_id"] |
858 | + if btype == 5 then | |
859 | + local wishPool = role:getProperty("wishPool") or {} | |
860 | + weight = weight * #wishPool | |
861 | + end | |
856 | 862 | end |
857 | 863 | --print(poolId, rand_v, weight, up_pool, values[1]) |
858 | 864 | if rand_v < weight and up_pool then |
... | ... | @@ -879,6 +885,15 @@ function _M.drawHeroRpc(agent, data) |
879 | 885 | if heroData[field] ~= values[idx] then ok = false break end |
880 | 886 | end |
881 | 887 | end |
888 | + -- 随机剔除up池中的角色 | |
889 | + if up_pool then | |
890 | + for k, v in ipairs(up_pool) do | |
891 | + if v == itemData.id then | |
892 | + ok = false | |
893 | + break | |
894 | + end | |
895 | + end | |
896 | + end | |
882 | 897 | if not ok then break end |
883 | 898 | if oneData[pool_str] > 0 then |
884 | 899 | resultPool[itemId] = {oneData[pool_str]} -- itemId, count, 概率 |
... | ... | @@ -900,6 +915,8 @@ function _M.drawHeroRpc(agent, data) |
900 | 915 | local ssrCount = 0 |
901 | 916 | local reward = {} |
902 | 917 | local logReward = {} |
918 | + -- 限时礼包 | |
919 | + local dailyDrawCnt = role.dailyData:getProperty("drawHeroCnt") or 0 | |
903 | 920 | for i = 1, drawCount[drawType] do |
904 | 921 | floorHeroCount = floorHeroCount + 1 |
905 | 922 | local isFloorBack = draw_floor_back_counts and floorHeroCount >= draw_floor_back_counts |
... | ... | @@ -913,6 +930,7 @@ function _M.drawHeroRpc(agent, data) |
913 | 930 | local itemId = math.randWeight(resultPool, 1) |
914 | 931 | if guideHero then |
915 | 932 | itemId = guideHero |
933 | + guideHero = nil | |
916 | 934 | end |
917 | 935 | |
918 | 936 | local itemData = csvdb["itemCsv"][itemId] |
... | ... | @@ -947,8 +965,13 @@ function _M.drawHeroRpc(agent, data) |
947 | 965 | logReward[itemId] = (logReward[itemId] or 0) + 1 |
948 | 966 | table.insert(reward, {id = itemId, count = 1}) |
949 | 967 | end |
968 | + | |
969 | + dailyDrawCnt = dailyDrawCnt + 1 | |
970 | + role:checkTaskEnter("DrawHeroLimitPack", {count = dailyDrawCnt}) | |
950 | 971 | end |
951 | 972 | |
973 | + role.dailyData:setProperty("drawHeroCnt", dailyDrawCnt) | |
974 | + | |
952 | 975 | if draw_floor_back_counts then |
953 | 976 | local floorHero = role:getProperty("floorHero") |
954 | 977 | floorHero[btype] = floorHeroCount |
... | ... | @@ -961,6 +984,9 @@ function _M.drawHeroRpc(agent, data) |
961 | 984 | end |
962 | 985 | |
963 | 986 | role:checkTaskEnter("DrawHero", {pool = btype, count = drawCount[drawType]}) |
987 | + if btype ~= 3 then | |
988 | + role:checkTaskEnter("DrawHeroNotFriend", {pool = btype, count = drawCount[drawType]}) | |
989 | + end | |
964 | 990 | if ssrCount > 0 then |
965 | 991 | role:checkTaskEnter("DrawSSR", {count = ssrCount}) |
966 | 992 | end |
... | ... | @@ -1108,7 +1134,7 @@ function _M.changeCrown(agent, data) |
1108 | 1134 | |
1109 | 1135 | local heroType = msg.heroType |
1110 | 1136 | |
1111 | - if not role:isHaveHero(heroType) then return true end | |
1137 | + if heroType < 10000 and not role:isHaveHero(heroType) then return true end | |
1112 | 1138 | role:setProperty("crown", heroType) |
1113 | 1139 | |
1114 | 1140 | role:log("hero_show", { | ... | ... |
src/actions/HttpAction.lua
... | ... | @@ -147,6 +147,15 @@ function _M.gm_action(query) |
147 | 147 | return status |
148 | 148 | end |
149 | 149 | |
150 | +function _M.query_role(query) | |
151 | + if not query.uid then return "not found" end | |
152 | + local user = redisproxy:get(string.format("uid:%s", query.uid)) | |
153 | + if not user then return "not found" end | |
154 | + local roleId = redisproxy:get(string.format("user:%s", string.upper(user))) | |
155 | + if not roleId then return "not found" end | |
156 | + return json.encode({roleId, user}) | |
157 | +end | |
158 | + | |
150 | 159 | function _M.broadcast(query) |
151 | 160 | local msg = {} |
152 | 161 | local handle = { | ... | ... |
src/actions/PvpAction.lua
... | ... | @@ -372,6 +372,16 @@ function _M.endBattleRpc(agent, data) |
372 | 372 | |
373 | 373 | if not match then return end |
374 | 374 | |
375 | + -- 防作弊 | |
376 | + if not role:checkBattleCheat("pvpc", { | |
377 | + isWin = isWin, | |
378 | + info = msg.info, | |
379 | + format = _pvpStartBattleCacheC.pvpTC, | |
380 | + }) then | |
381 | + SendPacket(actionCodes.Pvp_endBattleRpc, MsgPack.pack({errorCode = 1})) | |
382 | + return true | |
383 | + end | |
384 | + | |
375 | 385 | local temp = string.randWeight(csvdb["player_expCsv"][role:getProperty("level")].pvpBonus, true) |
376 | 386 | local reward, change = role:award({[temp[1]] = temp[2]}, {log = {desc = "pvpBattleC"}}) |
377 | 387 | local myScore, matchScore, oldmyScore, oldMatchScore, myRank, oldMyRank = 0, 0, 0, 0, -1, -1 |
... | ... | @@ -652,13 +662,22 @@ function _M.endBattleHRpc(agent, data) |
652 | 662 | end |
653 | 663 | end |
654 | 664 | |
665 | + -- 防作弊 | |
666 | + if not role:checkBattleCheat("pvph", { | |
667 | + isWin = isWin, | |
668 | + info = msg.info, | |
669 | + format = _pvpStartBattleCacheH.pvpTH[#_pvpStartBattleCacheH.result] | |
670 | + }) then | |
671 | + SendPacket(actionCodes.Pvp_endBattleHRpc, MsgPack.pack({errorCode = 1})) | |
672 | + return true | |
673 | + end | |
674 | + | |
655 | 675 | if winCount >= 2 then |
656 | 676 | isWin = true |
657 | 677 | elseif loseCount >= 2 then |
658 | 678 | isWin = false |
659 | 679 | else -- 没结束 |
660 | 680 | -- 返回继续战斗 |
661 | - | |
662 | 681 | local key = tostring(math.random()) |
663 | 682 | _pvpStartBattleCacheH.key = key |
664 | 683 | local round = #_pvpStartBattleCacheH.result + 1 | ... | ... |
src/actions/RadioAction.lua
... | ... | @@ -179,6 +179,7 @@ function _M.finishQuestRpc(agent, data) |
179 | 179 | msg["heroFaith"] = heroFaithMap |
180 | 180 | SendPacket(actionCodes.Radio_finishQuestRpc, MsgPack.pack(msg)) |
181 | 181 | |
182 | + role:checkTaskEnter("RadioTaskStart", {heroCnt = #task.heros}) | |
182 | 183 | |
183 | 184 | local herolist = {} |
184 | 185 | for _, heroId in ipairs(task.heros) do | ... | ... |
src/actions/RoleAction.lua
... | ... | @@ -157,6 +157,7 @@ function _M.loginRpc( agent, data ) |
157 | 157 | SERV_OPEN = redisproxy:hget("autoincrement_set", "server_start") |
158 | 158 | |
159 | 159 | role:changeStructVersion() -- 数据结构 版本更新 |
160 | + role:getAdvData(true) -- 清掉不合格的数据 | |
160 | 161 | role:advEndlessSeasonCheck(true) -- 冒险赛季更新检查 |
161 | 162 | |
162 | 163 | -- 跨天登陆事件 |
... | ... | @@ -165,6 +166,7 @@ function _M.loginRpc( agent, data ) |
165 | 166 | role.activity:checkActivityStatus(now, false, false) |
166 | 167 | role:log("onLogin") |
167 | 168 | end |
169 | + role:checkTaskEnter("Login", {}) | |
168 | 170 | |
169 | 171 | redisproxy:zadd(FRIEND_RECOMMEND, now, roleId) |
170 | 172 | |
... | ... | @@ -586,9 +588,9 @@ function _M.openTimeBoxRpc(agent, data) |
586 | 588 | else |
587 | 589 | local oldId, process, time = boxL[slot].id, boxL[slot].process, boxL[slot].time |
588 | 590 | local unitTime = globalCsv.box_key_time[oldId] * 60 |
589 | - local doneCnt = math.floor((process + skynet.timex() - time) / unitTime) | |
591 | + local doneCnt = time == 0 and 0 or math.floor((process + skynet.timex() - time) / unitTime) | |
590 | 592 | if doneCnt > 0 then |
591 | - reward = role:award({[oldId] = doneCnt}, {log = {desc = "openTimeBox", int1 = slot}}) | |
593 | + reward = role:award({[oldId] = doneCnt}, {log = {desc = "openTimeBox", int1 = slot, int2 = oper}}) | |
592 | 594 | end |
593 | 595 | end |
594 | 596 | local limit = globalCsv.box_key_max[itemId] or 5 |
... | ... | @@ -606,11 +608,11 @@ function _M.openTimeBoxRpc(agent, data) |
606 | 608 | local itemData = csvdb["itemCsv"][itemId] |
607 | 609 | local unitTime = globalCsv.box_key_time[itemId] * 60 |
608 | 610 | if quick then |
609 | - stopTime = time + globalCsv.box_productLine_time * 3600 | |
611 | + stopTime = nowTime + quick | |
610 | 612 | local cost_pre = globalCsv.box_timeOpen_diamond:toArray(true, "=") |
611 | - local costKey = math.ceil((stopTime - nowTime) / (cost_pre[1] * 60)) * cost_pre[2] | |
613 | + local costKey = math.ceil(quick / (cost_pre[1] * 60)) * cost_pre[2] | |
612 | 614 | if not role:checkItemEnough({[ItemId.Diamond] = costKey}) then return 5 end |
613 | - role:costItems({[ItemId.Diamond] = costKey}, {log = {desc = "openTimeBox", int1 = slot}}) | |
615 | + role:costItems({[ItemId.Diamond] = costKey}, {log = {desc = "openTimeBox", int1 = slot, int2 = oper}}) | |
614 | 616 | else |
615 | 617 | stopTime = math.min(nowTime,time + globalCsv.box_productLine_time * 3600) |
616 | 618 | end |
... | ... | @@ -618,7 +620,7 @@ function _M.openTimeBoxRpc(agent, data) |
618 | 620 | |
619 | 621 | local doneCnt = math.floor((process + stopTime - time) / unitTime) |
620 | 622 | if doneCnt > 0 then |
621 | - reward = role:award({[itemId] = doneCnt}, {log = {desc = "openTimeBox", int1 = slot}}) | |
623 | + reward = role:award({[itemId] = doneCnt}, {log = {desc = "openTimeBox", int1 = slot, int2 = oper}}) | |
622 | 624 | end |
623 | 625 | if role:getItemCount(itemId) >= globalCsv.box_key_max[itemId] then |
624 | 626 | nowTime = 0 |
... | ... | @@ -687,7 +689,7 @@ function _M.openTimeBoxRpc(agent, data) |
687 | 689 | reward[id] = (reward[id] or 0) + num |
688 | 690 | end |
689 | 691 | end |
690 | - reward, change = role:award(reward, {log = {desc = "openTimeBox", int1 = costId}}) | |
692 | + reward, change = role:award(reward, {log = {desc = "openTimeBox", int1 = costId, int2 = oper}}) | |
691 | 693 | else |
692 | 694 | return |
693 | 695 | end |
... | ... | @@ -752,6 +754,17 @@ function _M.openSpeedUpBoxRpc(agent, data) |
752 | 754 | role:costItems({[id] = count}, {log = {desc = "speedUpBox"}}) |
753 | 755 | end |
754 | 756 | |
757 | + local doubleCoef = role.activity:isOpen("DoubleDrop") and 2 or 1 | |
758 | + -- 特权卡获取加速获得额外道具 | |
759 | + local coef = role.storeData:getProduceItemSpeedCoef() | |
760 | + if coef > 1 or doubleCoef > 1 then | |
761 | + for k, cnt in pairs(reward) do | |
762 | + if k == ItemId.Gold or k == ItemId.Exp then | |
763 | + reward[k] = math.floor(cnt * coef * doubleCoef) | |
764 | + end | |
765 | + end | |
766 | + end | |
767 | + | |
755 | 768 | local change |
756 | 769 | reward, change = role:award(reward, {log = {desc = "speedUpBox"}}) |
757 | 770 | |
... | ... | @@ -847,6 +860,13 @@ function _M.taskRpc(agent, data) |
847 | 860 | local reward, change = role:award(taskData.reward, {log = {desc = "finishTask", int1 = taskType, int2 = taskId}}) |
848 | 861 | local active = (taskStatus["a"] or 0) + taskData.active |
849 | 862 | |
863 | + -- 日常活动完成 | |
864 | + if taskType == 1 then | |
865 | + role:checkTaskEnter("DailyTask", {pre = (taskStatus["a"] or 0), cur = active}) | |
866 | + else | |
867 | + role:checkTaskEnter("WeekTask", {pre = (taskStatus["a"] or 0), cur = active}) | |
868 | + end | |
869 | + | |
850 | 870 | role:changeUpdates({ |
851 | 871 | { type = roleField[taskType], field = {"t", taskId}, value = -1 }, |
852 | 872 | { type = roleField[taskType], field = "a", value = active}, |
... | ... | @@ -907,62 +927,96 @@ function _M.achiveRpc(agent, data) |
907 | 927 | local taskId = msg.id --任务id |
908 | 928 | |
909 | 929 | if not role:isFuncUnlock(FuncUnlock.TaskAchiv) then return end |
910 | - | |
911 | - local achiveTask = csvdb["achievementCsv"][taskId] | |
912 | - if not achiveTask then return 1 end | |
913 | - | |
914 | 930 | local achiveT = role:getProperty("achiveT") |
915 | 931 | local achiveV = role:getProperty("achiveV") |
932 | + local fuxRecord = role:getProperty("fuxR") or 0 | |
933 | + | |
934 | + local groups = {} | |
935 | + | |
936 | + if not taskId then | |
937 | + local awards = {} | |
938 | + for id, cfg in pairs(csvdb["achievementCsv"]) do | |
939 | + -- 没领过 | |
940 | + if not achiveV[id] then | |
941 | + if (achiveT[cfg.type] or 0) >= cfg.condition1 then | |
942 | + local award = cfg.reward:toNumMap() | |
943 | + for k, v in pairs(award) do | |
944 | + awards[k] = (awards[k] or 0) + v | |
945 | + end | |
946 | + achiveV[id] = skynet.timex() | |
947 | + groups[cfg.group] = 1 | |
948 | + | |
949 | + role:log("achievement", { | |
950 | + achievement_id = cfg.id, -- 成就id | |
951 | + achievement_type = cfg.type, -- 成就类型,具体枚举表中成就类型枚举表 | |
952 | + achievement_reward = award, -- 达成成就奖励,json格式记录,{"itemid1":123,"itemid2":12,……….} | |
953 | + }) | |
954 | + end | |
955 | + end | |
956 | + end | |
957 | + if not next(awards) then | |
958 | + return 5 | |
959 | + end | |
960 | + local reward, change = role:award(awards, {log = {desc = "finishAchive", int1 = 0}}) | |
961 | + role:updateProperty({field = "achiveV", value = achiveV}) | |
916 | 962 | |
917 | - if achiveV[taskId] then return 2 end | |
963 | + SendPacket(actionCodes.Role_achiveRpc, MsgPack.pack(role:packReward(reward, change))) | |
964 | + else | |
965 | + local achiveTask = csvdb["achievementCsv"][taskId] | |
966 | + if not achiveTask then return 1 end | |
918 | 967 | |
919 | - local curStatus = achiveT[achiveTask.type] or 0 | |
920 | - local maxc = achiveTask.condition1 | |
968 | + if achiveV[taskId] then return 2 end | |
921 | 969 | |
922 | - if maxc > curStatus then | |
923 | - return 3 | |
924 | - end | |
970 | + local curStatus = achiveT[achiveTask.type] or 0 | |
971 | + local maxc = achiveTask.condition1 | |
925 | 972 | |
926 | - local reward, change = role:award(achiveTask.reward, {log = {desc = "finishAchive", int1 = taskId}}) | |
927 | - role:changeUpdates({ | |
928 | - { type = "achiveV", field = taskId, value = skynet.timex() } | |
929 | - }) | |
973 | + if maxc > curStatus then | |
974 | + return 3 | |
975 | + end | |
930 | 976 | |
931 | - -- 复兴奖励 | |
932 | - if csvdb["achievement_groupCsv"][achiveTask.group].bookmark == 3 then | |
933 | - local overCount = 0 | |
934 | - for tId, status in pairs(achiveV) do | |
935 | - local tData = csvdb["achievementCsv"][tId] | |
936 | - if tData then | |
937 | - local groupData = csvdb["achievement_groupCsv"][tData.group] | |
938 | - if groupData.bookmark == 3 then | |
939 | - overCount = overCount + 1 | |
977 | + local reward, change = role:award(achiveTask.reward, {log = {desc = "finishAchive", int1 = taskId}}) | |
978 | + role:changeUpdates({ | |
979 | + { type = "achiveV", field = taskId, value = skynet.timex() } | |
980 | + }) | |
981 | + groups[achiveTask.group] = 1 | |
982 | + | |
983 | + role:log("achievement", { | |
984 | + achievement_id = taskId, -- 成就id | |
985 | + achievement_type = achiveTask.type, -- 成就类型,具体枚举表中成就类型枚举表 | |
986 | + achievement_reward = reward, -- 达成成就奖励,json格式记录,{"itemid1":123,"itemid2":12,……….} | |
987 | + }) | |
988 | + | |
989 | + SendPacket(actionCodes.Role_achiveRpc, MsgPack.pack(role:packReward(reward, change))) | |
990 | + end | |
991 | + | |
992 | + for group, _ in pairs(groups) do | |
993 | + -- 复兴奖励 | |
994 | + if csvdb["achievement_groupCsv"][group].bookmark == 3 then | |
995 | + local overCount = 0 | |
996 | + local preMaxCount = fuxRecord or 0 | |
997 | + for tId, status in pairs(achiveV) do | |
998 | + local tData = csvdb["achievementCsv"][tId] | |
999 | + if tData then | |
1000 | + local groupData = csvdb["achievement_groupCsv"][tData.group] | |
1001 | + if groupData.bookmark == 3 then | |
1002 | + overCount = overCount + 1 | |
1003 | + end | |
940 | 1004 | end |
941 | 1005 | end |
942 | - end | |
943 | - | |
944 | - for level, pData in pairs(csvdb["achievement_rewardCsv"]) do | |
945 | - if pData.request == overCount then | |
946 | - -- 发放奖励 | |
947 | - redisproxy:insertEmail({ | |
948 | - roleId = role:getProperty("id"), | |
949 | - emailId = 101, | |
950 | - attachments = pData.reward, | |
951 | - contentPms = {pData.level}, | |
952 | - }) | |
953 | - elseif pData.request > overCount then | |
954 | - break | |
1006 | + local flag = false | |
1007 | + for level, pData in pairs(csvdb["achievement_rewardCsv"]) do | |
1008 | + if preMaxCount < pData.request and overCount >= pData.request then | |
1009 | + role:sendMail(101, skynet.timex(), pData.reward, {pData.level}) | |
1010 | + flag = true | |
1011 | + end | |
955 | 1012 | end |
1013 | + if flag then | |
1014 | + role:updateProperty({field = "fuxR", value = overCount, notNotify = true}) | |
1015 | + end | |
1016 | + break | |
956 | 1017 | end |
957 | 1018 | end |
958 | - | |
959 | - role:log("achievement", { | |
960 | - achievement_id = taskId, -- 成就id | |
961 | - achievement_type = achiveTask.type, -- 成就类型,具体枚举表中成就类型枚举表 | |
962 | - achievement_reward = reward, -- 达成成就奖励,json格式记录,{"itemid1":123,"itemid2":12,……….} | |
963 | - }) | |
964 | 1019 | |
965 | - SendPacket(actionCodes.Role_achiveRpc, MsgPack.pack(role:packReward(reward, change))) | |
966 | 1020 | return true |
967 | 1021 | end |
968 | 1022 | |
... | ... | @@ -1013,6 +1067,10 @@ function _M.chatRpc(agent, data) |
1013 | 1067 | result = 1 |
1014 | 1068 | return |
1015 | 1069 | end |
1070 | + if role:getProperty("level") < (globalCsv.chat_level or 15) then | |
1071 | + result = 3 | |
1072 | + return | |
1073 | + end | |
1016 | 1074 | |
1017 | 1075 | role._worldChatLimit = role._worldChatLimit or {start = 0, count = 0, canSayt = 0} --第一次开始说话时间 从第一次说话次数 能说话的时间 |
1018 | 1076 | ... | ... |
src/actions/StoreAction.lua
... | ... | @@ -23,7 +23,7 @@ function _M.rechargeRpc(agent , data) |
23 | 23 | skynet.timeout(10, function () |
24 | 24 | role:handlePurchase({ |
25 | 25 | order = partnerOrderId, |
26 | - amount = dataSet.rmb, | |
26 | + amount = dataSet.rmb * 100, | |
27 | 27 | game_money = dataSet.diamond, |
28 | 28 | product_id = dataSet.productId, |
29 | 29 | pay_time = skynet.timex(), |
... | ... | @@ -310,6 +310,13 @@ function _M.getFreeChestRpc(agent, data) |
310 | 310 | local config = csvdb["shop_rechargeCsv"][id] |
311 | 311 | if not config then return end |
312 | 312 | |
313 | + --判断是否是活动商品 | |
314 | + if config.activity_id ~= 0 then | |
315 | + local actCfg = csvdb["activity_ctrlCsv"][config.activity_id] | |
316 | + if not actCfg then return 2 end | |
317 | + if not role.activity:isOpenById(config.activity_id, "ActShopGoods") then return 3 end | |
318 | + end | |
319 | + | |
313 | 320 | local rechargeRecord = role.storeData:getProperty("payR") |
314 | 321 | local getCount = (rechargeRecord[id] or 0) |
315 | 322 | if getCount >= config.limit then | ... | ... |
src/actions/TowerAction.lua
... | ... | @@ -65,6 +65,15 @@ function _M.endBattleRpc(agent, data) |
65 | 65 | local curTower = csvdb["tower_battleCsv"][id] |
66 | 66 | if not curTower then return 2 end |
67 | 67 | |
68 | + -- 防作弊 | |
69 | + if not role:checkBattleCheat("tower", { | |
70 | + isWin = msg.starNum and msg.starNum > 0, | |
71 | + info = msg.info | |
72 | + }) then | |
73 | + SendPacket(actionCodes.Tower_endBattleRpc, MsgPack.pack({errorCode = 1})) | |
74 | + return true | |
75 | + end | |
76 | + | |
68 | 77 | local curCount, nextTime = getUpdateTime(towerInfo.c, towerInfo.t) |
69 | 78 | |
70 | 79 | ... | ... |
src/adv/Adv.lua
... | ... | @@ -20,8 +20,6 @@ function Adv:ctor(owner) |
20 | 20 | self.advTask = self.owner:getProperty("advTask") |
21 | 21 | self.advMTask = self.owner:getProperty("advMTask") |
22 | 22 | self.advTaskChange = false -- 任务改变才更新 |
23 | - | |
24 | - self:initByInfo(self.owner:getProperty("advInfo")) | |
25 | 23 | end |
26 | 24 | |
27 | 25 | function Adv:mylog(contents) |
... | ... | @@ -36,11 +34,13 @@ function Adv:mylog(contents) |
36 | 34 | end |
37 | 35 | |
38 | 36 | --初始化adv 信息 |
39 | -function Adv:initByInfo(advInfo) | |
37 | +function Adv:initByInfo() | |
38 | + local advInfo = self.owner:getProperty("advInfo") | |
40 | 39 | if not next(advInfo) then return end --还没有 开始新地图 |
41 | 40 | |
42 | 41 | self.chapterId = advInfo.chapterId |
43 | 42 | self.level = advInfo.level or 1 |
43 | + self.actid = advInfo.actid | |
44 | 44 | self.round = advInfo.round or 0 |
45 | 45 | self.score = advInfo.score or {} |
46 | 46 | self.isRelay = advInfo.isRelay |
... | ... | @@ -61,10 +61,10 @@ function Adv:initByInfo(advInfo) |
61 | 61 | self:initBattle(advInfo) |
62 | 62 | end |
63 | 63 | -- 找出level 是否存在中继层 |
64 | -function Adv:isHaveRelay(level, chapterId) | |
64 | +function Adv:isHaveRelay(level, chapterId, force) | |
65 | 65 | level = level or self.level |
66 | 66 | chapterId = chapterId or self.chapterId |
67 | - if level == 1 then return end | |
67 | + if level == 1 and not force then return end | |
68 | 68 | |
69 | 69 | local campsiteCsv = csvdb["adv_chapter_campsiteCsv"][chapterId] |
70 | 70 | for _, campsite in ipairs(campsiteCsv) do |
... | ... | @@ -85,6 +85,7 @@ function Adv:initByChapter(params) |
85 | 85 | local isEnter = params.isEnter |
86 | 86 | local support = params.support |
87 | 87 | local debugMapId = params.debugMapId |
88 | + local actid = params.actid | |
88 | 89 | |
89 | 90 | if not self.chapterId then -- 开始新的章节 |
90 | 91 | self.chapterId = chapterId |
... | ... | @@ -95,6 +96,7 @@ function Adv:initByChapter(params) |
95 | 96 | |
96 | 97 | self.level = level or 1 |
97 | 98 | self.round = 0 |
99 | + self.actid = self.actid or actid | |
98 | 100 | self.score = self.score or {} |
99 | 101 | self.lastEnemyId = 1 |
100 | 102 | self.mapStack = {1} -- 最后一个为当前的地图 |
... | ... | @@ -140,12 +142,13 @@ function Adv:initByChapter(params) |
140 | 142 | local chapter = self:isEndless() and -1 or self.chapterId |
141 | 143 | if not (advRelay[chapter] or {})[self.level] then |
142 | 144 | isNewRelay = true |
143 | - advRelay[chapter] = advRelay[chapter] or {} | |
144 | - advRelay[chapter][self.level] = 1 | |
145 | - self.owner:updateProperty({field = "advRelay", value = advRelay}) | |
146 | 145 | end |
147 | 146 | end |
148 | 147 | |
148 | + if self.level == 1 or self.isRelay then | |
149 | + self:supplyPotion() | |
150 | + end | |
151 | + | |
149 | 152 | self.maps = {} |
150 | 153 | self.maps[1] = AdvMap.new(self, 1, mapId, isEnter, isNewRelay) |
151 | 154 | |
... | ... | @@ -153,14 +156,15 @@ function Adv:initByChapter(params) |
153 | 156 | |
154 | 157 | self:initLayerTask() |
155 | 158 | |
156 | - | |
157 | - | |
158 | 159 | self:checkTask(Adv.TaskType.Arrive) |
159 | 160 | self:checkAdvUnlock(1, self.level) |
160 | 161 | |
161 | 162 | -- 中继进入奖励 |
162 | - if relayData and isEnter then | |
163 | - self:awardRelay(relayData, notNotify) | |
163 | + if isEnter then | |
164 | + relayData = relayData or self:isHaveRelay(level, chapterId, true) | |
165 | + if relayData then | |
166 | + self:awardRelay(relayData, notNotify) | |
167 | + end | |
164 | 168 | end |
165 | 169 | |
166 | 170 | if not notNotify then |
... | ... | @@ -168,9 +172,24 @@ function Adv:initByChapter(params) |
168 | 172 | end |
169 | 173 | end |
170 | 174 | |
175 | +function Adv:passAdvRelay() | |
176 | + local advRelay = self.owner:getProperty("advRelay") | |
177 | + local chapter = self:isEndless() and -1 or self.chapterId | |
178 | + if not (advRelay[chapter] or {})[self.level] then | |
179 | + advRelay[chapter] = advRelay[chapter] or {} | |
180 | + advRelay[chapter][self.level] = 1 | |
181 | + self.owner:updateProperty({field = "advRelay", value = advRelay}) | |
182 | + local relayData = self:isHaveRelay() | |
183 | + if relayData and relayData.award ~= "" then | |
184 | + self:pushBackEvent(AdvBackEventType.RelayReward, {items = self:award(relayData.award:toNumMap(), {log = {desc = "relayReward"}})}) | |
185 | + end | |
186 | + end | |
187 | +end | |
188 | + | |
171 | 189 | function Adv:clear() |
172 | 190 | self.chapterId = nil |
173 | 191 | self.level = nil |
192 | + self.actid = nil | |
174 | 193 | self.score = {} |
175 | 194 | self.round = 0 |
176 | 195 | self.lastEnemyId = 1 |
... | ... | @@ -193,6 +212,7 @@ function Adv:saveDB(notNotify) |
193 | 212 | advInfo.level = self.level |
194 | 213 | advInfo.round = self.round |
195 | 214 | advInfo.score = self.score |
215 | + advInfo.actid = self.actid | |
196 | 216 | advInfo.isRelay = self.isRelay |
197 | 217 | advInfo.lastEId = self.lastEnemyId |
198 | 218 | advInfo.mstack = self.mapStack |
... | ... | @@ -223,7 +243,6 @@ end |
223 | 243 | |
224 | 244 | function Adv:awardRelay(relayData, notNotify) |
225 | 245 | local gift = {} |
226 | - | |
227 | 246 | if relayData.artifact > 0 then |
228 | 247 | local pool = {} |
229 | 248 | for id, temp in pairs(csvdb["adv_artifactCsv"]) do |
... | ... | @@ -248,7 +267,9 @@ function Adv:awardRelay(relayData, notNotify) |
248 | 267 | local dropData = csvdb["event_dropCsv"][dropId] |
249 | 268 | if dropData then |
250 | 269 | local item = dropData["range"]:randWeight(true) |
251 | - gift[item[1]] = (gift[item[1]] or 0) + item[2] | |
270 | + if item[1] ~= 0 then | |
271 | + gift[item[1]] = (gift[item[1]] or 0) + item[2] | |
272 | + end | |
252 | 273 | else |
253 | 274 | skynet.error(string.format("[ERROR]: event_dropCsv no id %s, adv_chapter_campsite", dropId)) |
254 | 275 | end |
... | ... | @@ -389,18 +410,24 @@ function Adv:isRunning() |
389 | 410 | return false |
390 | 411 | end |
391 | 412 | |
392 | --- 强制结束 | |
393 | -function Adv:forceOver(notNotify) | |
394 | - if self:isRunning() then | |
395 | - | |
413 | +-- 强制结束 逻辑和adv内部无关 | |
414 | +function Adv:forceOver(notNotify, force) | |
415 | + if self:isRunning() or force then | |
396 | 416 | local advTeam = self.owner:getProperty("advTeam") |
397 | 417 | advTeam.player = nil |
398 | 418 | |
419 | + local advPotionCsv = csvdb["adv_potionCsv"] | |
420 | + local potionBag = self.owner:getProperty("potionBag") | |
421 | + | |
399 | 422 | local reward = self.owner:getProperty("advItems"):toNumMap() |
400 | 423 | for itemId, count in pairs(reward) do |
401 | - reward[itemId] = math.ceil(count * globalCsv.adv_fail_reward_ratio / 100) -- 奖励相当于失败 | |
424 | + if advPotionCsv[itemId] then | |
425 | + potionBag[itemId] = (potionBag[itemId] or 0) + count | |
426 | + else | |
427 | + reward[itemId] = math.ceil(count * globalCsv.adv_fail_reward_ratio / 100) -- 奖励相当于失败 | |
428 | + end | |
402 | 429 | end |
403 | - self.owner:award(reward, {log = {desc = "advOver", int1 = self.chapterId}}) | |
430 | + self.owner:award(reward, {log = {desc = "advOver", int1 = self.chapterId}, notNotify = notNotify}) | |
404 | 431 | |
405 | 432 | self:clear() |
406 | 433 | self.owner:updateProperties({ |
... | ... | @@ -409,6 +436,7 @@ function Adv:forceOver(notNotify) |
409 | 436 | advItems = "", |
410 | 437 | advAFGet = {}, |
411 | 438 | advAFWear = {}, |
439 | + potionBag = potionBag, | |
412 | 440 | }, notNotify) |
413 | 441 | end |
414 | 442 | end |
... | ... | @@ -752,6 +780,10 @@ function Adv:isEndless() |
752 | 780 | return AdvCommon.isEndless(self.chapterId) |
753 | 781 | end |
754 | 782 | |
783 | +function Adv:isActivity() | |
784 | + return self.actid ~= nil | |
785 | +end | |
786 | + | |
755 | 787 | function Adv:getCurFloorData() |
756 | 788 | local chapter = self.chapterId % 100 |
757 | 789 | return (csvdb["adv_chapter_floorCsv"][self.chapterId] or {})[self.level] |
... | ... | @@ -781,17 +813,69 @@ function Adv:over(success, rewardRatio, overType) |
781 | 813 | |
782 | 814 | local score = self.owner:fixAdvScoreChange(self:getScore()) |
783 | 815 | local scoreInfo = self.score |
816 | + | |
817 | + local scoreCoef = chapterData.scoreAward | |
818 | + local itemId = ItemId.OldCoin | |
819 | + -- 拾荒活动关卡相关处理 | |
820 | + if self.actid then | |
821 | + while true do | |
822 | + if not self.owner.activity:isOpenById(self.actid, "AdvLevel") then | |
823 | + break | |
824 | + end | |
825 | + local actCfg = csvdb["activity_adv_chapterCsv"][self.actid] | |
826 | + if not actCfg then break end | |
827 | + actCfg = actCfg[self.chapterId] | |
828 | + if not actCfg then break end | |
829 | + local arr = actCfg["transform"]:toArray(true, "=") | |
830 | + itemId, scoreCoef = arr[1], arr[2] | |
831 | + local actData = self.owner.activity:getActData("AdvLevel") | |
832 | + | |
833 | + -- 计算活动积分up | |
834 | + local upMap = actCfg["upCharacter"]:toNumMap() | |
835 | + local team = self.owner:getProperty("advTeam") | |
836 | + local format = self.owner:getTeamHerosInfo(team).heros | |
837 | + local upVal = 0 | |
838 | + for _, hero in pairs(format) do | |
839 | + local heroId = hero["type"] | |
840 | + upVal = upVal + (upMap[heroId] or 0) | |
841 | + end | |
842 | + score = math.floor(score * (1 + upVal / 100)) | |
843 | + | |
844 | + local advInfo = actData[self.chapterId] or {} | |
845 | + --print("upVal", upVal, score, advInfo["max"], itemId, scoreCoef) | |
846 | + local maxScore = advInfo["max"] or 0 | |
847 | + local flag = false | |
848 | + if success then | |
849 | + advInfo["pass"] = 1 | |
850 | + flag = true | |
851 | + end | |
852 | + -- 更新活动最大积分 | |
853 | + if score > maxScore then | |
854 | + advInfo["max"] = score | |
855 | + actData[self.chapterId] = advInfo | |
856 | + flag = true | |
857 | + end | |
858 | + if flag then | |
859 | + self.owner.activity:updateActData("AdvLevel", actData) | |
860 | + end | |
861 | + break | |
862 | + end | |
863 | + end | |
784 | 864 | |
785 | - local scoreReward = math.floor(score / chapterData.scoreAward) | |
786 | - self.owner:award({[ItemId.OldCoin] = scoreReward}, {log = {desc = "advOver", int1 = self.chapterId}}) | |
865 | + local scoreReward = math.floor(score / scoreCoef) | |
866 | + self.owner:award({[itemId] = scoreReward}, {log = {desc = "advOver", int1 = self.chapterId}}) | |
787 | 867 | |
788 | 868 | -- 被动技会影响奖励 |
789 | 869 | self.battle.player:triggerPassive(Passive.ADV_OVER, {score = score, level = self.level}) |
790 | 870 | |
791 | 871 | local reward = {} |
872 | + local advPotionCsv = csvdb["adv_potionCsv"] | |
873 | + local potionBag = self.owner:getProperty("potionBag") | |
792 | 874 | for itemId, count in pairs(self.owner:getProperty("advItems"):toNumMap()) do |
793 | 875 | local itemCsv = csvdb["itemCsv"][itemId] |
794 | - if not itemCsv then | |
876 | + if advPotionCsv[itemId] then | |
877 | + potionBag[itemId] = (potionBag[itemId] or 0) + count | |
878 | + elseif not itemCsv then | |
795 | 879 | print("ERROR: no itemId in ItemCsv : ", itemId) |
796 | 880 | elseif itemCsv.type ~= ItemType.AdvItem then |
797 | 881 | reward[itemId] = math.ceil(count * rewardRatio / 100) |
... | ... | @@ -811,25 +895,27 @@ function Adv:over(success, rewardRatio, overType) |
811 | 895 | if not self:isEndless() and self.level >= chapterData.limitlevel then |
812 | 896 | self.owner:checkTaskEnter("AdvAllPass", {id = self.chapterId}) |
813 | 897 | end |
898 | + end | |
814 | 899 | |
815 | - local roleId = self.owner:getProperty("id") | |
816 | - local oldMaxScore = tonum(redisproxy:zscore(self.owner:getAdvRankKey(), roleId)) | |
817 | - if score > oldMaxScore then | |
818 | - local team = self.owner:getProperty("advTeam") | |
819 | - local curInfo = { | |
820 | - name = self.owner:getProperty("name"), | |
821 | - headId = self.owner:getProperty("headId"), | |
822 | - lv = self.owner:getProperty("level"), | |
823 | - batteV = self.owner:getTeamBattleValue(team.heros), | |
824 | - chapter = self.chapterId, | |
825 | - format = self.owner:getTeamHerosInfo(team).heros, | |
826 | - } | |
827 | - redisproxy:pipelining(function (red) | |
828 | - red:zadd(self.owner:getAdvRankKey(), score, roleId) --更新分数 | |
829 | - red:hset(RANK_ADV_INFO, roleId, MsgPack.pack(curInfo)) | |
830 | - end) | |
831 | - end | |
900 | + | |
901 | + local roleId = self.owner:getProperty("id") | |
902 | + local oldMaxScore = tonum(redisproxy:zscore(self.owner:getAdvRankKey(), roleId)) | |
903 | + if score > oldMaxScore and not self.actid then | |
904 | + local team = self.owner:getProperty("advTeam") | |
905 | + local curInfo = { | |
906 | + name = self.owner:getProperty("name"), | |
907 | + headId = self.owner:getProperty("headId"), | |
908 | + lv = self.owner:getProperty("level"), | |
909 | + batteV = self.owner:getTeamBattleValue(team.heros), | |
910 | + chapter = self.chapterId, | |
911 | + format = self.owner:getTeamHerosInfo(team).heros, | |
912 | + } | |
913 | + redisproxy:pipelining(function (red) | |
914 | + red:zadd(self.owner:getAdvRankKey(), score, roleId) --更新分数 | |
915 | + red:hset(RANK_ADV_INFO, roleId, MsgPack.pack(curInfo)) | |
916 | + end) | |
832 | 917 | end |
918 | + | |
833 | 919 | -- 通关的时候要把引导步骤设定到成就引导 |
834 | 920 | if not self.owner:checkOverGuide(57) then |
835 | 921 | self.owner:saveGuide(57,1,true) |
... | ... | @@ -882,6 +968,7 @@ function Adv:over(success, rewardRatio, overType) |
882 | 968 | }) |
883 | 969 | |
884 | 970 | local chapterId = self.chapterId |
971 | + local actid = self.actid | |
885 | 972 | self:clear() |
886 | 973 | self.owner:checkTaskEnter("AdvScore", {score = score}) |
887 | 974 | |
... | ... | @@ -889,6 +976,7 @@ function Adv:over(success, rewardRatio, overType) |
889 | 976 | advItems = "", |
890 | 977 | advAFGet = {}, |
891 | 978 | advAFWear = {}, |
979 | + potionBag = potionBag, | |
892 | 980 | }) |
893 | 981 | self:pushBackEvent(AdvBackEventType.End, { |
894 | 982 | success = success, |
... | ... | @@ -899,6 +987,7 @@ function Adv:over(success, rewardRatio, overType) |
899 | 987 | scoreAward = scoreReward, |
900 | 988 | chapterId = chapterId, |
901 | 989 | backAdvCount = backAdvCount, |
990 | + actid = actid | |
902 | 991 | }) |
903 | 992 | end |
904 | 993 | |
... | ... | @@ -963,7 +1052,7 @@ function Adv:award(gift, params, backRewardParams) |
963 | 1052 | |
964 | 1053 | local autoUse = {} |
965 | 1054 | for itemId, count in pairs(tgift) do |
966 | - if count > 0 then | |
1055 | + if count > 0 and self.battle.player then | |
967 | 1056 | local buffAdd = self.battle.player:getRewardChange(itemId) |
968 | 1057 | count = math.floor(math.max(0, (count + buffAdd[0]) * (1 + buffAdd[1]))) --附加 buff 的影响 |
969 | 1058 | self:checkTask(Adv.TaskType.Item, count, itemId) |
... | ... | @@ -973,7 +1062,8 @@ function Adv:award(gift, params, backRewardParams) |
973 | 1062 | if globalCsv.adv_auto_useItem[itemId] and count > 0 then |
974 | 1063 | autoUse[itemId] = count |
975 | 1064 | else |
976 | - local origin = items:getv(itemId, 0) | |
1065 | + local transId = globalCsv.adv_item_potion[itemId] or itemId | |
1066 | + local origin = items:getv(transId, 0) | |
977 | 1067 | local nums = origin + count |
978 | 1068 | |
979 | 1069 | if csvdb["adv_artifactCsv"][itemId] then -- 获得神器 |
... | ... | @@ -983,10 +1073,10 @@ function Adv:award(gift, params, backRewardParams) |
983 | 1073 | end |
984 | 1074 | else |
985 | 1075 | if nums <= 0 then |
986 | - items = items:delk(itemId) | |
1076 | + items = items:delk(transId) | |
987 | 1077 | nums = 0 |
988 | 1078 | else |
989 | - items = items:setv(itemId, nums) | |
1079 | + items = items:setv(transId, nums) | |
990 | 1080 | end |
991 | 1081 | |
992 | 1082 | if itemId == 16 and not self.owner:checkOverGuide(51,4) then |
... | ... | @@ -1045,6 +1135,7 @@ function Adv:useItem(itemId, count, target) |
1045 | 1135 | end |
1046 | 1136 | |
1047 | 1137 | self:checkAchievement(self.AchievType.UseItem, count, itemId) |
1138 | + self.owner:checkTaskEnter("AdvUseItem", {itemId = itemId, count = count}) | |
1048 | 1139 | self:mylog({desc = "useItem", int1 = itemId, int2 = count}) |
1049 | 1140 | |
1050 | 1141 | self.owner:log("mission_pick_use", { |
... | ... | @@ -1064,6 +1155,7 @@ end |
1064 | 1155 | -- 消耗物品 优先冒险背包 --check 只是检查够不够 |
1065 | 1156 | function Adv:cost(item, params, check) |
1066 | 1157 | local items = self.owner:getProperty("advItems") |
1158 | + local potionCsv = csvdb["adv_potionCsv"] | |
1067 | 1159 | local less = {} |
1068 | 1160 | local advCost = {} |
1069 | 1161 | for itemId, count in pairs(item) do |
... | ... | @@ -1077,9 +1169,13 @@ function Adv:cost(item, params, check) |
1077 | 1169 | less[itemId] = -last |
1078 | 1170 | end |
1079 | 1171 | |
1172 | + if potionCsv[itemId] and last < 0 then -- 只能使用冒险背包里的药水 | |
1173 | + return | |
1174 | + end | |
1080 | 1175 | end |
1081 | 1176 | if next(less) and not self.owner:checkItemEnough(less) then return end --不够 |
1082 | 1177 | if check then return true end |
1178 | + | |
1083 | 1179 | self:award(advCost, params) |
1084 | 1180 | if next(less) then |
1085 | 1181 | self.owner:costItems(less, params) |
... | ... | @@ -1087,6 +1183,35 @@ function Adv:cost(item, params, check) |
1087 | 1183 | return true |
1088 | 1184 | end |
1089 | 1185 | |
1186 | +-- 补满冒险背包药剂,从药剂背包扣除药水放到冒险背包 | |
1187 | +function Adv:supplyPotion() | |
1188 | + local potionCsv = csvdb["adv_potionCsv"] | |
1189 | + local potionBag = self.owner:getProperty("potionBag") | |
1190 | + local advItems = self.owner:getProperty("advItems") | |
1191 | + local dishTree = self.owner.dinerData:getProperty("dishTree") | |
1192 | + for potionId, set in pairs(potionCsv) do | |
1193 | + local count = potionBag[potionId] or 0 | |
1194 | + if count > 0 then | |
1195 | + local max = set[dishTree:getv(potionId,1)].limit | |
1196 | + local old = advItems:getv(potionId,0) | |
1197 | + local need = max - old | |
1198 | + | |
1199 | + if need < 0 then | |
1200 | + elseif need < count then | |
1201 | + advItems = advItems:setv(potionId,max) | |
1202 | + potionBag[potionId] = count - need | |
1203 | + else | |
1204 | + advItems = advItems:setv(potionId,old + count) | |
1205 | + potionBag[potionId] = nil | |
1206 | + end | |
1207 | + end | |
1208 | + end | |
1209 | + self.owner:updateProperties({ | |
1210 | + advItems = advItems, | |
1211 | + potionBag = potionBag, | |
1212 | + }) | |
1213 | +end | |
1214 | + | |
1090 | 1215 | --事件点击处理 |
1091 | 1216 | local function clickOut(self, room, block, params, isExit) |
1092 | 1217 | if self:getCurMap():checkOver() then --检查是否可以出去了 |
... | ... | @@ -1112,6 +1237,11 @@ local function clickOut(self, room, block, params, isExit) |
1112 | 1237 | else |
1113 | 1238 | if self.level > (advPass[self.chapterId] or 0) then |
1114 | 1239 | self.owner:changeUpdates({{type = "advPass", field = self.chapterId, value = self.level}}) |
1240 | + | |
1241 | + if (self.level >= csvdb["adv_chapterCsv"][self.chapterId].limitlevel) then --关卡结束 | |
1242 | + self.owner:checkTaskEnter("AdvPassFirst", {id = self.chapterId}) | |
1243 | + end | |
1244 | + | |
1115 | 1245 | end |
1116 | 1246 | end |
1117 | 1247 | |
... | ... | @@ -1124,6 +1254,7 @@ local function clickOut(self, room, block, params, isExit) |
1124 | 1254 | end |
1125 | 1255 | |
1126 | 1256 | if not self:isEndless() and (self.level >= csvdb["adv_chapterCsv"][self.chapterId].limitlevel) then --关卡结束 |
1257 | + self:passAdvRelay() | |
1127 | 1258 | self:over(true) |
1128 | 1259 | else |
1129 | 1260 | self.battle.player:triggerPassive(Passive.DOWN_LAYER) |
... | ... | @@ -1168,24 +1299,22 @@ local function clickMonster(self, room, block, params) |
1168 | 1299 | return true |
1169 | 1300 | end |
1170 | 1301 | |
1171 | -local function chooseCommon(self, room, block, chooseData, choose, tag) | |
1172 | - if not choose then return end | |
1173 | - if not chooseData or not chooseData["button".. choose .."cond"] then return end | |
1174 | 1302 | |
1175 | - local conds = chooseData["button".. choose .."cond"]:toTableArray(true) | |
1303 | +local function checkChooseCondFunc(self, condStr, room, block, tag, chooseData) | |
1304 | + chooseData = chooseData or {} | |
1176 | 1305 | local checkCond = { |
1177 | 1306 | -- 没有条件 |
1178 | 1307 | [0] = function() |
1179 | 1308 | return true |
1180 | 1309 | end, |
1181 | 1310 | -- 拥有道具 |
1182 | - [1] = function(_, itemId, count) | |
1311 | + [1] = function(itemId, count) | |
1183 | 1312 | if self:cost({[itemId] = count}, {log = {desc = "chooseEvent", key1 = tag, int1 = chooseData.id}}, true) then |
1184 | 1313 | return true |
1185 | 1314 | end |
1186 | 1315 | end, |
1187 | 1316 | -- xx角色(todo 队长) |
1188 | - [2] = function(_, heroType) | |
1317 | + [2] = function(heroType) | |
1189 | 1318 | for slot, heroId in pairs(self.owner:getProperty("advTeam").heros) do |
1190 | 1319 | local hero = self.owner.heros[heroId] |
1191 | 1320 | if hero and hero:getProperty("type") == heroType then |
... | ... | @@ -1205,38 +1334,38 @@ local function chooseCommon(self, room, block, chooseData, choose, tag) |
1205 | 1334 | return true |
1206 | 1335 | end, |
1207 | 1336 | --制定属性 |
1208 | - [4] = function(_, attrType, value) | |
1337 | + [4] = function(attrType, value) | |
1209 | 1338 | if (self.battle.player[AttsEnumEx[attrType]] or 0) >= value then |
1210 | 1339 | return true |
1211 | 1340 | end |
1212 | 1341 | end, |
1213 | 1342 | -- 提交一个物品 |
1214 | - [5] = function (_, itemId, count) | |
1343 | + [5] = function (itemId, count) | |
1215 | 1344 | if self:cost({[itemId] = count}, {log = {desc = "chooseEvent", key1 = tag, int1 = chooseData.id}}) then |
1216 | 1345 | self:backCost({[itemId] = count}) |
1217 | 1346 | return true |
1218 | 1347 | end |
1219 | 1348 | end, |
1220 | 1349 | -- sp 到达指定值 |
1221 | - [6] = function(_, value) | |
1350 | + [6] = function(value) | |
1222 | 1351 | if self.battle.player.sp >= value then |
1223 | 1352 | self.battle.player:changeSp(-value) |
1224 | 1353 | return true |
1225 | 1354 | end |
1226 | 1355 | end, |
1227 | 1356 | --7=拥有指定buff指定层数 |
1228 | - [7] = function(_, buffId, layer) | |
1357 | + [7] = function(buffId, layer) | |
1229 | 1358 | local buff = self.battle.player:getBuffById(buffId) |
1230 | 1359 | if buff and buff:getLayer() >= layer then |
1231 | 1360 | return true |
1232 | 1361 | end |
1233 | 1362 | end, |
1234 | 1363 | --8=拥有x神器 |
1235 | - [8] = function(_, artifactId) | |
1364 | + [8] = function(artifactId) | |
1236 | 1365 | return self:isHaveArtifact(artifactId) |
1237 | 1366 | end, |
1238 | 1367 | -- 9 = 生命值大于x% |
1239 | - [9] = function (_, value) | |
1368 | + [9] = function (value) | |
1240 | 1369 | local cost = value / 100 * self.battle.player.hpMax |
1241 | 1370 | if self.battle.player.hp > cost then |
1242 | 1371 | self.battle.player:hurt(cost, nil, {hurtType = 6, buffId = -1}) |
... | ... | @@ -1244,16 +1373,27 @@ local function chooseCommon(self, room, block, chooseData, choose, tag) |
1244 | 1373 | end |
1245 | 1374 | end, |
1246 | 1375 | -- 10 = 未获得x神器 |
1247 | - [10] = function(_, artifactId) | |
1376 | + [10] = function(artifactId) | |
1248 | 1377 | return not self:isHaveArtifact(artifactId) |
1249 | 1378 | end, |
1250 | 1379 | -- 11 = 地图上没有指定id 的怪 |
1251 | - [11] = function(_, monsterId) | |
1252 | - for _, room in pairs(self:getCurMap().rooms) do | |
1253 | - for _, block in pairs(room.blocks) do | |
1254 | - if block:isMonster() then | |
1255 | - if not monsterId then return false end | |
1256 | - if block.event.id == monsterId then | |
1380 | + [11] = function(monsterId, size) | |
1381 | + if not size or size == 0 then | |
1382 | + for _, room in pairs(self:getCurMap().rooms) do | |
1383 | + for _, block in pairs(room.blocks) do | |
1384 | + if block:isMonster() then | |
1385 | + if not monsterId or monsterId == 0 then return false end | |
1386 | + if block.event.id == monsterId then | |
1387 | + return false | |
1388 | + end | |
1389 | + end | |
1390 | + end | |
1391 | + end | |
1392 | + else | |
1393 | + for _, cblock in ipairs(self:getCurMap():getBlocksBySize(room.roomId, block.blockId, size)) do | |
1394 | + if cblock:isMonster() then | |
1395 | + if not monsterId or monsterId == 0 then return false end | |
1396 | + if cblock.event.id == monsterId then | |
1257 | 1397 | return false |
1258 | 1398 | end |
1259 | 1399 | end |
... | ... | @@ -1262,12 +1402,23 @@ local function chooseCommon(self, room, block, chooseData, choose, tag) |
1262 | 1402 | return true |
1263 | 1403 | end, |
1264 | 1404 | -- 12 = 地图上没有指定id 的建筑 |
1265 | - [12] = function(_, buildId) | |
1266 | - for _, room in pairs(self:getCurMap().rooms) do | |
1267 | - for _, block in pairs(room.blocks) do | |
1268 | - if block:isBuild() then | |
1269 | - if not buildId then return false end | |
1270 | - if block.event.id == buildId then | |
1405 | + [12] = function(buildId, size) | |
1406 | + if not size or size == 0 then | |
1407 | + for _, room in pairs(self:getCurMap().rooms) do | |
1408 | + for _, block in pairs(room.blocks) do | |
1409 | + if block:isBuild() then | |
1410 | + if not buildId or buildId == 0 then return false end | |
1411 | + if block.event.id == buildId then | |
1412 | + return false | |
1413 | + end | |
1414 | + end | |
1415 | + end | |
1416 | + end | |
1417 | + else | |
1418 | + for _, cblock in ipairs(self:getCurMap():getBlocksBySize(room.roomId, block.blockId, size)) do | |
1419 | + if cblock:isBuild() then | |
1420 | + if not buildId or buildId == 0 then return false end | |
1421 | + if cblock.event.id == buildId then | |
1271 | 1422 | return false |
1272 | 1423 | end |
1273 | 1424 | end |
... | ... | @@ -1276,12 +1427,23 @@ local function chooseCommon(self, room, block, chooseData, choose, tag) |
1276 | 1427 | return true |
1277 | 1428 | end, |
1278 | 1429 | -- 13 = 地图上没有指定的 选择点 |
1279 | - [13] = function(_, chooseId) | |
1280 | - for _, room in pairs(self:getCurMap().rooms) do | |
1281 | - for _, block in pairs(room.blocks) do | |
1282 | - if block:isChoose() then | |
1283 | - if not chooseId then return false end | |
1284 | - if block.event.id == chooseId then | |
1430 | + [13] = function(chooseId, size) | |
1431 | + if not size or size == 0 then | |
1432 | + for _, room in pairs(self:getCurMap().rooms) do | |
1433 | + for _, block in pairs(room.blocks) do | |
1434 | + if block:isChoose() then | |
1435 | + if not chooseId or chooseId == 0 then return false end | |
1436 | + if block.event.id == chooseId then | |
1437 | + return false | |
1438 | + end | |
1439 | + end | |
1440 | + end | |
1441 | + end | |
1442 | + else | |
1443 | + for _, cblock in ipairs(self:getCurMap():getBlocksBySize(room.roomId, block.blockId, size)) do | |
1444 | + if cblock:isChoose() then | |
1445 | + if not chooseId or chooseId == 0 then return false end | |
1446 | + if cblock.event.id == chooseId then | |
1285 | 1447 | return false |
1286 | 1448 | end |
1287 | 1449 | end |
... | ... | @@ -1290,138 +1452,178 @@ local function chooseCommon(self, room, block, chooseData, choose, tag) |
1290 | 1452 | return true |
1291 | 1453 | end, |
1292 | 1454 | } |
1293 | - for _, cond in ipairs(conds) do | |
1455 | + | |
1456 | + local status, count = true, 0 | |
1457 | + for _, cond in ipairs(condStr:toTableArray(true)) do | |
1294 | 1458 | assert(not cond[1] or checkCond[cond[1]], "error cond, event_" .. (tag or "choose") .. "Csv id :" .. block.event.id) |
1295 | - if cond[1] and not checkCond[cond[1]](table.unpack(cond)) then return end | |
1459 | + if not checkCond[cond[1]](select(2, table.unpack(cond))) then | |
1460 | + status = false | |
1461 | + else | |
1462 | + count = count + 1 | |
1463 | + end | |
1296 | 1464 | end |
1297 | - | |
1298 | - local clearBlock = chooseData.keep ~= 1 | |
1299 | - local effects = chooseData["button".. choose .."effect"]:toTableArray(true) | |
1300 | - for _, effect in ipairs(effects) do | |
1301 | - local doEffect = { | |
1302 | - [1] = function() -- 获得某道具N个 | |
1303 | - local count = effect[3] or 1 | |
1304 | - local reward = {} | |
1305 | - for i = 1, count do | |
1306 | - local dropData = csvdb["event_dropCsv"][effect[2]] | |
1307 | - if dropData then | |
1308 | - local item = dropData["range"]:randWeight(true) | |
1465 | + return status, count | |
1466 | +end | |
1467 | + | |
1468 | +local function doChooseEffect(self, effectStr, room, block, tag, chooseData) | |
1469 | + chooseData = chooseData or {} | |
1470 | + local clearBlock = true | |
1471 | + local doEffect = { | |
1472 | + [1] = function(dropId, count) -- 获得某道具N个 | |
1473 | + count = count or 1 | |
1474 | + local reward = {} | |
1475 | + for i = 1, count do | |
1476 | + local dropData = csvdb["event_dropCsv"][dropId] | |
1477 | + if dropData then | |
1478 | + local item = dropData["range"]:randWeight(true) | |
1479 | + if item[1] ~= 0 then | |
1309 | 1480 | reward[item[1]] = (reward[item[1]] or 0) + item[2] |
1310 | - else | |
1311 | - skynet.error(string.format("[ERROR]: event_dropCsv no id %s in %s id: %s", effect[2], tag, chooseData.id)) | |
1312 | 1481 | end |
1313 | - end | |
1314 | - self:award(reward, {log = {desc = "chooseEvent", key1 = tag, int1 = chooseData.id}}, {roomId = room.roomId, blockId = block.blockId}) | |
1315 | - end, | |
1316 | - [2] = function() --获得冒险buff | |
1317 | - local layer = effect[3] or 1 | |
1318 | - for i = 1, layer do | |
1319 | - self.battle.player:addBuff(effect[2]) | |
1320 | - end | |
1321 | - end, | |
1322 | - [3] = function() --发现怪物 | |
1323 | - self:getCurMap():addNewMonsterRand(effect[2], {room, block}) | |
1324 | - self:pushBackEvent(AdvBackEventType.Monster, {id = effect[2]}) | |
1325 | - clearBlock = false | |
1326 | - end, | |
1327 | - [4] = function() --无事发生 | |
1328 | - end, | |
1329 | - [5] = function() --5=属性枚举=数值;直接增加玩家属性 | |
1330 | - local attr | |
1331 | - if effect[3] == 0 then | |
1332 | - attr = "sp" | |
1333 | 1482 | else |
1334 | - attr = AttsEnumEx[effect[3]] | |
1335 | - if not AdvAttsEnum[attr] then return end | |
1483 | + skynet.error(string.format("[ERROR]: event_dropCsv no id %s in %s id: %s", dropId, tag, chooseData.id)) | |
1336 | 1484 | end |
1337 | - self.battle.player:addBaseAttr(attr, effect[4], effect[2]) | |
1338 | - end, | |
1339 | - [6] = function() -- 商店 | |
1340 | - block:updateEvent({ | |
1341 | - etype = AdvEventType.Trader, | |
1342 | - id = effect[2] | |
1343 | - }) | |
1344 | - self:pushBackEvent(AdvBackEventType.Trader, {id = effect[2]}) | |
1345 | - clearBlock = false | |
1346 | - end, | |
1347 | - [7] = function() -- 建筑 | |
1348 | - block:updateEvent({ | |
1349 | - etype = AdvEventType.Build, | |
1350 | - id = effect[2] | |
1351 | - }) | |
1352 | - clearBlock = false | |
1353 | - end, | |
1354 | - [8] = function() -- 选择 | |
1355 | - block:updateEvent({ | |
1356 | - etype = AdvEventType.Choose, | |
1357 | - id = effect[2] | |
1358 | - }) | |
1359 | - clearBlock = false | |
1360 | - end, | |
1361 | - [9] = function() -- click | |
1362 | - block:updateEvent({ | |
1363 | - etype = AdvEventType.Click, | |
1364 | - id = effect[2] | |
1365 | - }) | |
1366 | - clearBlock = false | |
1367 | - end, | |
1368 | - [10] = function() -- 陷阱 | |
1369 | - block:updateEvent({ | |
1370 | - etype = AdvEventType.Trap, | |
1371 | - id = effect[2] | |
1372 | - }) | |
1373 | - clearBlock = false | |
1374 | - end, | |
1375 | - [11] = function() -- 获得神器 | |
1376 | - self:waitChooseArtifact() --等待获取神器 | |
1377 | - end, | |
1378 | - [12] = function() | |
1379 | - -- buffId | |
1380 | - local targers = self.battle.player:getTeam(2, nil, nil, true) | |
1381 | - for _, target in pairs(targers) do | |
1382 | - target:addBuff(effect[2]) | |
1485 | + end | |
1486 | + self:award(reward, {log = {desc = "chooseEvent", key1 = tag, int1 = chooseData.id}}, {roomId = room.roomId, blockId = block.blockId}) | |
1487 | + end, | |
1488 | + [2] = function(buffId, layer) --获得冒险buff | |
1489 | + self.battle.player:addBuff(buffId, nil, layer or 1) | |
1490 | + end, | |
1491 | + [3] = function(id) --发现怪物 | |
1492 | + self:getCurMap():addNewMonsterRand(id, {room, block}) | |
1493 | + self:pushBackEvent(AdvBackEventType.Monster, {id = id}) | |
1494 | + clearBlock = false | |
1495 | + end, | |
1496 | + [4] = function() --无事发生 | |
1497 | + end, | |
1498 | + [5] = function(addType, attrType, value) --5=属性枚举=数值;直接增加玩家属性 | |
1499 | + local attr | |
1500 | + if attrType == 0 then | |
1501 | + attr = "sp" | |
1502 | + else | |
1503 | + attr = AttsEnumEx[attrType] | |
1504 | + if not AdvAttsEnum[attr] then return end | |
1505 | + end | |
1506 | + self.battle.player:addBaseAttr(attr, value, addType) | |
1507 | + end, | |
1508 | + [6] = function(id) -- 商店 | |
1509 | + block:updateEvent({ | |
1510 | + etype = AdvEventType.Trader, | |
1511 | + id = id | |
1512 | + }) | |
1513 | + self:pushBackEvent(AdvBackEventType.Trader, {id = id}) | |
1514 | + clearBlock = false | |
1515 | + end, | |
1516 | + [7] = function(id) -- 建筑 | |
1517 | + block:updateEvent({ | |
1518 | + etype = AdvEventType.Build, | |
1519 | + id = id | |
1520 | + }) | |
1521 | + clearBlock = false | |
1522 | + end, | |
1523 | + [8] = function(id) -- 选择 | |
1524 | + block:updateEvent({ | |
1525 | + etype = AdvEventType.Choose, | |
1526 | + id = id | |
1527 | + }) | |
1528 | + clearBlock = false | |
1529 | + end, | |
1530 | + [9] = function(id) -- click | |
1531 | + block:updateEvent({ | |
1532 | + etype = AdvEventType.Click, | |
1533 | + id = id | |
1534 | + }) | |
1535 | + clearBlock = false | |
1536 | + end, | |
1537 | + [10] = function(id) -- 陷阱 | |
1538 | + block:updateEvent({ | |
1539 | + etype = AdvEventType.Trap, | |
1540 | + id = id | |
1541 | + }) | |
1542 | + clearBlock = false | |
1543 | + end, | |
1544 | + [11] = function() -- 获得神器 | |
1545 | + self:waitChooseArtifact() --等待获取神器 | |
1546 | + end, | |
1547 | + [12] = function(id) | |
1548 | + -- buffId | |
1549 | + local targers = self.battle.player:getTeam(2, nil, nil, true) | |
1550 | + for _, target in pairs(targers) do | |
1551 | + target:addBuff(id) | |
1552 | + end | |
1553 | + end, | |
1554 | + [13] = function() -- 显示地图 | |
1555 | + self:getCurMap():showMap() | |
1556 | + self:backMapShow() | |
1557 | + end, | |
1558 | + [14] = function(eventType, eventId, count, stage) -- 指定地块召唤 指定类型的id | |
1559 | + local change = self:getCurMap():layEventToStage(eventType, eventId, count, stage) | |
1560 | + for _, one in ipairs(change) do | |
1561 | + if one[1].roomId == room.roomId and one[2].blockId == block.blockId then | |
1562 | + clearBlock = false | |
1563 | + else | |
1564 | + self:backBlockChange(one[1].roomId, one[2].blockId) | |
1383 | 1565 | end |
1384 | - end, | |
1385 | - [13] = function() -- 显示地图 | |
1386 | - self:getCurMap():showMap() | |
1387 | - self:backMapShow() | |
1388 | - end, | |
1389 | - [14] = function() -- 指定地块召唤 指定类型的id | |
1390 | - local change = self:getCurMap():layEventToStage(effect[2], effect[3], effect[4], effect[5]) | |
1391 | - for _, one in ipairs(change) do | |
1392 | - if one[1].roomId == room.roomId and one[2].blockId == block.blockId then | |
1393 | - clearBlock = false | |
1394 | - else | |
1395 | - self:backBlockChange(one[1].roomId, one[2].blockId) | |
1396 | - end | |
1566 | + end | |
1567 | + end, | |
1568 | + [15] = function(eventType, eventId, count) -- 移除指定事件 | |
1569 | + local change = self:getCurMap():clearEventById(eventType, eventId, count) | |
1570 | + for _, one in ipairs(change) do | |
1571 | + if one[1].roomId == room.roomId and one[2].blockId == block.blockId then | |
1572 | + clearBlock = false | |
1573 | + else | |
1574 | + self:backBlockChange(one[1].roomId, one[2].blockId) | |
1397 | 1575 | end |
1398 | - end, | |
1399 | - [15] = function() -- 移除指定事件 | |
1400 | - local change = self:getCurMap():clearEventById(effect[2], effect[3], effect[4]) | |
1401 | - for _, one in ipairs(change) do | |
1402 | - if one[1].roomId == room.roomId and one[2].blockId == block.blockId then | |
1403 | - clearBlock = false | |
1404 | - else | |
1405 | - self:backBlockChange(one[1].roomId, one[2].blockId) | |
1406 | - end | |
1576 | + end | |
1577 | + end, | |
1578 | + [16] = function(eventTypeF, eventIdF, eventTypeT, eventIdT, count) -- 指定事件转移 | |
1579 | + local change = self:getCurMap():eventChangeToOther(eventTypeF, eventIdF, eventTypeT, eventIdT, count) | |
1580 | + for _, one in ipairs(change) do | |
1581 | + if one[1].roomId == room.roomId and one[2].blockId == block.blockId then | |
1582 | + clearBlock = false | |
1583 | + else | |
1584 | + self:backBlockChange(one[1].roomId, one[2].blockId) | |
1407 | 1585 | end |
1408 | - end, | |
1409 | - [16] = function() -- 指定事件转移 | |
1410 | - local change = self:getCurMap():eventChangeToOther(effect[2], effect[3], effect[4], effect[5], effect[6]) | |
1411 | - for _, one in ipairs(change) do | |
1412 | - if one[1].roomId == room.roomId and one[2].blockId == block.blockId then | |
1413 | - clearBlock = false | |
1414 | - else | |
1415 | - self:backBlockChange(one[1].roomId, one[2].blockId) | |
1416 | - end | |
1586 | + end | |
1587 | + end, | |
1588 | + [17] = function(eventId) | |
1589 | + local diceCsv = csvdb["event_choose_diceCsv"][eventId] | |
1590 | + if not diceCsv then return end | |
1591 | + local weight = math.randomInt(1, 12) | |
1592 | + local sum = 0 | |
1593 | + local needEffect = nil | |
1594 | + local pool = {} | |
1595 | + for _, v in ipairs(diceCsv) do | |
1596 | + local status, okCount = checkChooseCondFunc(self, v.cond, room, block, tag .. " dice", chooseData) | |
1597 | + pool[#pool + 1] = v.weight + okCount * v.weightUp | |
1598 | + sum = sum + pool[#pool] | |
1599 | + if sum >= weight and not needEffect then | |
1600 | + -- 达成效果 | |
1601 | + needEffect = v.effect | |
1417 | 1602 | end |
1418 | - end, | |
1419 | - } | |
1603 | + end | |
1604 | + if needEffect then | |
1605 | + self:pushBackEvent(AdvBackEventType.ChooseDice, {id = eventId, pool = pool, result = weight}) | |
1606 | + clearBlock = doChooseEffect(self, needEffect, room, block, tag .. " dice", chooseData) | |
1607 | + end | |
1608 | + end, | |
1609 | + } | |
1610 | + | |
1611 | + for _, effect in ipairs(effectStr:toTableArray(true)) do | |
1420 | 1612 | assert(doEffect[effect[1]], "error effect, event_" .. (tag or "choose") .. "Csv id :" .. (block.event and block.event.id or 0) .. "effect " .. effect[1]) |
1421 | - doEffect[effect[1]]() | |
1613 | + doEffect[effect[1]](select(2, table.unpack(effect))) | |
1422 | 1614 | end |
1423 | - self:scoreChange(AdvScoreType.Event, chooseData.advScore) --增加加分 | |
1615 | + return clearBlock | |
1616 | +end | |
1617 | + | |
1424 | 1618 | |
1619 | +local function chooseCommon(self, room, block, chooseData, choose, tag) | |
1620 | + if not choose then return end | |
1621 | + if not chooseData or not chooseData["button".. choose .."cond"] then return end | |
1622 | + if not checkChooseCondFunc(self, chooseData["button".. choose .."cond"], room, block, tag, chooseData) then return end | |
1623 | + local clearBlock = chooseData.keep ~= 1 | |
1624 | + local clearBlock_ = doChooseEffect(self, chooseData["button".. choose .."effect"], room, block, tag, chooseData) | |
1625 | + clearBlock = clearBlock and clearBlock_ | |
1626 | + self:scoreChange(AdvScoreType.Event, chooseData.advScore) --增加加分 | |
1425 | 1627 | return true, clearBlock |
1426 | 1628 | end |
1427 | 1629 | |
... | ... | @@ -1561,6 +1763,7 @@ local function clickBuild(self, room, block, params) |
1561 | 1763 | self:checkTask(Adv.TaskType.Build, 1, oldId) |
1562 | 1764 | self:checkAchievement(Adv.AchievType.Build, 1, oldId) |
1563 | 1765 | self:checkAchievement(Adv.AchievType.BuildBySelect, 1, oldId, choose) |
1766 | + self.owner:checkTaskEnter("AdvBuild", {buildId = oldId}) | |
1564 | 1767 | |
1565 | 1768 | if clearBlock then |
1566 | 1769 | block:clear() |
... | ... | @@ -1583,7 +1786,9 @@ local function clickClick(self, room, block, params) |
1583 | 1786 | local reward = {} |
1584 | 1787 | for _, dropId in ipairs(clickData.effect:toArray(true, "=")) do |
1585 | 1788 | local item = csvdb["event_dropCsv"][dropId]["range"]:randWeight(true) |
1586 | - reward[item[1]] = (reward[item[1]] or 0) + item[2] | |
1789 | + if item[1] ~= 0 then | |
1790 | + reward[item[1]] = (reward[item[1]] or 0) + item[2] | |
1791 | + end | |
1587 | 1792 | end |
1588 | 1793 | self:award(reward, {log = {desc = "clickClick", int1 = block.event.id}}, {roomId = room.roomId, blockId = block.blockId}) |
1589 | 1794 | end, |
... | ... | @@ -1675,12 +1880,6 @@ function Adv:clickBlock(roomId, blockId, params) |
1675 | 1880 | if not block.isOpen then |
1676 | 1881 | if self.isRelay or checkAroundBlocks() then --开放 |
1677 | 1882 | self:getCurMap():openBlock(roomId, blockId, true, true) |
1678 | - if self.isRelay and self:getCurMap():isAllOpen() then -- 发放翻开的奖励 | |
1679 | - local relayData = self:isHaveRelay() | |
1680 | - if relayData and relayData.award ~= "" then | |
1681 | - self:pushBackEvent(AdvBackEventType.RelayReward, {items = self:award(relayData.award:toNumMap(), {log = {desc = "relayReward"}})}) | |
1682 | - end | |
1683 | - end | |
1684 | 1883 | status = true |
1685 | 1884 | end |
1686 | 1885 | else |
... | ... | @@ -1690,6 +1889,18 @@ function Adv:clickBlock(roomId, blockId, params) |
1690 | 1889 | return |
1691 | 1890 | end |
1692 | 1891 | |
1892 | + if not block:isMonster() then | |
1893 | + for _, one in ipairs(map:getAroundBlocksPlus(room, block)) do | |
1894 | + local _room, _block = one[1], one[2] | |
1895 | + if _block:isMonster() then | |
1896 | + local enemy = self.battle:getEnemy(_room.roomId, _block.blockId) | |
1897 | + if enemy:hadBuff(Buff.OBSTACLE_PLUS) then | |
1898 | + return | |
1899 | + end | |
1900 | + end | |
1901 | + end | |
1902 | + end | |
1903 | + | |
1693 | 1904 | if block:isHinder() then |
1694 | 1905 | if not checkAroundBlocks(true) then return end |
1695 | 1906 | end |
... | ... | @@ -1824,9 +2035,18 @@ function Adv:doActive(activeId, target) |
1824 | 2035 | -- 5:放逐目标 |
1825 | 2036 | doActiveEffect[5] = function(_) |
1826 | 2037 | for _, target in ipairs(targers) do |
2038 | + local had = false | |
1827 | 2039 | if not target.lock and not target.isDead then |
1828 | - target:kill() | |
1829 | - self:backBlockChange(target.roomId, target.blockId) | |
2040 | + if target:getMonsterCsv().type == 5 then | |
2041 | + -- 假boss 不能用 | |
2042 | + had = true | |
2043 | + else | |
2044 | + target:kill() | |
2045 | + self:backBlockChange(target.roomId, target.blockId) | |
2046 | + end | |
2047 | + end | |
2048 | + if had then | |
2049 | + self:pushBackEvent(AdvBackEventType.NoEffect) | |
1830 | 2050 | end |
1831 | 2051 | end |
1832 | 2052 | return true |
... | ... | @@ -1855,13 +2075,8 @@ function Adv:doActive(activeId, target) |
1855 | 2075 | end |
1856 | 2076 | |
1857 | 2077 | -- 7=道具燃烧效果 |
1858 | - doActiveEffect[7] = function(_) | |
1859 | - for _ , target in ipairs(targers) do | |
1860 | - if target:getEventType() == AdvEventType.Drop then | |
1861 | - target:updateEvent(nil) | |
1862 | - self:backBlockChange(target.room.roomId, target.blockId) | |
1863 | - end | |
1864 | - end | |
2078 | + doActiveEffect[7] = function(_, ctype) | |
2079 | + self:blockDropChange(ctype, targers) | |
1865 | 2080 | return true |
1866 | 2081 | end |
1867 | 2082 | |
... | ... | @@ -2091,7 +2306,7 @@ function Adv:enemyDead(enemy, escape) |
2091 | 2306 | end |
2092 | 2307 | end |
2093 | 2308 | -- 这些奖励可能会有被动加成 |
2094 | - self.battle.player:triggerPassive(Passive.BATTLE_WIN, {drops = drops}) | |
2309 | + self.battle.player:triggerPassive(Passive.BATTLE_WIN, {drops = drops, trigger = enemy}) | |
2095 | 2310 | |
2096 | 2311 | -- 自身带的掉落是不会被改变的 也不会被加成 |
2097 | 2312 | if block.event.item and block.event.item[1] ~= 0 then |
... | ... | @@ -2131,6 +2346,8 @@ function Adv:enemyDead(enemy, escape) |
2131 | 2346 | self:checkAchievement(Adv.AchievType.Kill, 1, enemyId) |
2132 | 2347 | self:checkAchievement(Adv.AchievType.KillHadBuff, 1, enemy) |
2133 | 2348 | |
2349 | + self.owner:checkTaskEnter("AdvKill", {chapterId = self.chapterId}) | |
2350 | + | |
2134 | 2351 | self:checkAchievement(Adv.AchievType.KillWithBuff, 1) |
2135 | 2352 | self:checkAchievement(Adv.AchievType.KillNoBuff, 1) |
2136 | 2353 | self:checkAchievement(Adv.AchievType.KillWithMWeapon, 1) |
... | ... | @@ -2143,6 +2360,7 @@ function Adv:enemyDead(enemy, escape) |
2143 | 2360 | self:checkAchievement(Adv.AchievType.KillBossNoBuff, 1) |
2144 | 2361 | self:checkAchievement(Adv.AchievType.KillBossWithMWeapon, 1) |
2145 | 2362 | self:checkAchievement(Adv.AchievType.KillBossWithAMWeapon, 1) |
2363 | + self.owner:checkTaskEnter("AdvKillBoss") | |
2146 | 2364 | elseif monsterData.type == 3 then |
2147 | 2365 | self:checkTask(Adv.TaskType.KillElite, 1, enemyId) |
2148 | 2366 | end | ... | ... |
src/adv/AdvBlock.lua
... | ... | @@ -60,9 +60,9 @@ function Block:updateEvent(event, isInit) |
60 | 60 | end |
61 | 61 | self:randomEvent() |
62 | 62 | end |
63 | - self:quickDrop() | |
64 | 63 | |
65 | 64 | if not isInit and self.isOpen then |
65 | + self:quickDrop() | |
66 | 66 | local newet = self:getEventType() |
67 | 67 | if oldet ~= newet then |
68 | 68 | local em = {} |
... | ... | @@ -134,6 +134,9 @@ function Block:randomEvent() |
134 | 134 | randomFunc[AdvEventType.Drop] = function() |
135 | 135 | if not self.event.item then |
136 | 136 | self.event.item = csvdb["event_dropCsv"][self.event.id]["range"]:randWeight(true) |
137 | + if self.event.item[1] == 0 then | |
138 | + self:clear() | |
139 | + end | |
137 | 140 | end |
138 | 141 | end |
139 | 142 | --交易 | ... | ... |
src/adv/AdvBuff.lua
src/adv/AdvMap.lua
... | ... | @@ -272,6 +272,10 @@ function Map:openBlock(roomId, blockId, isPlayer, ignoreBack) |
272 | 272 | if not ignoreBack then |
273 | 273 | self.adv:backBlockChange(roomId, blockId) |
274 | 274 | end |
275 | + | |
276 | + if self.adv.isRelay and self:isAllOpen() then -- 发放翻开的奖励 | |
277 | + self.adv:passAdvRelay() | |
278 | + end | |
275 | 279 | end |
276 | 280 | return status |
277 | 281 | end |
... | ... | @@ -379,6 +383,24 @@ function Map:getAroundBlocks(room, block) |
379 | 383 | return blocks |
380 | 384 | end |
381 | 385 | |
386 | +function Map:getAroundBlocksPlus(room, block) | |
387 | + local blocks = {} | |
388 | + local range = {1, 0, -1} | |
389 | + local col, row = room:tranLtoG(block.col, block.row) | |
390 | + for _, c in ipairs(range) do | |
391 | + for _, r in ipairs(range) do | |
392 | + if c == 0 and r == 0 then | |
393 | + else | |
394 | + local rroom, rblock = self:getRBByPos(col + c, row + r) | |
395 | + if rroom then | |
396 | + table.insert(blocks, {rroom, rblock}) | |
397 | + end | |
398 | + end | |
399 | + end | |
400 | + end | |
401 | + return blocks | |
402 | +end | |
403 | + | |
382 | 404 | function Map:getBlocksBySize(roomId, blockId, size) |
383 | 405 | local blocks = {} |
384 | 406 | local room = self.rooms[roomId] |
... | ... | @@ -873,7 +895,7 @@ getEventLib = function(self, needEventType) -- needEventType 需要的事件 |
873 | 895 | level = AdvCommon.getEndlessDataLv(chapterId, level) |
874 | 896 | end |
875 | 897 | local libsToType = { |
876 | - ["event_monsterCsv"] = {AdvEventType.Monster, AdvEventType.BOSS, AdvEventType.Monster}, | |
898 | + ["event_monsterCsv"] = {AdvEventType.Monster, AdvEventType.BOSS, AdvEventType.Monster, AdvEventType.Monster, AdvEventType.Monster}, | |
877 | 899 | ["event_chooseCsv"] = AdvEventType.Choose, |
878 | 900 | ["event_dropCsv"] = AdvEventType.Drop, |
879 | 901 | ["event_buildingCsv"] = AdvEventType.Build, | ... | ... |
src/adv/AdvPassive.lua
... | ... | @@ -527,12 +527,13 @@ function Passive:effect8(dropId) |
527 | 527 | skynet.error(string.format("CSVDATA Error adv_map_passive %s effect 8 not id %s in event_drop", self.id, dropId)) |
528 | 528 | end |
529 | 529 | local item = dropData["range"]:randWeight(true) |
530 | - self.owner.battle.adv:award({[item[1]] = item[2]}, {log = {desc = "passive", int1 = self.id}}, {roomId = self.owner.roomId, blockId = self.owner.blockId}) | |
531 | - | |
530 | + if item[1] ~= 0 then | |
531 | + self.owner.battle.adv:award({[item[1]] = item[2]}, {log = {desc = "passive", int1 = self.id}}, {roomId = self.owner.roomId, blockId = self.owner.blockId}) | |
532 | + end | |
532 | 533 | end |
533 | 534 | |
534 | 535 | --9=直接获得item(可在结算触发时使用) |
535 | -function Passive:effect9(itemId, triggerPms, ratio, max) | |
536 | +function Passive:effect9(itemId, triggerPms, ratio, ratio2, max) | |
536 | 537 | local cond = nil |
537 | 538 | if self.passiveData.value == 0 then |
538 | 539 | cond = triggerPms.score |
... | ... | @@ -542,7 +543,7 @@ function Passive:effect9(itemId, triggerPms, ratio, max) |
542 | 543 | return |
543 | 544 | end |
544 | 545 | if not cond then return end |
545 | - self.owner.battle.adv:award({[itemId] = math.floor(math.max(0, math.min(max, cond / ratio)))}, {log = {desc = "passive", int1 = self.id}}, {roomId = self.owner.roomId, blockId = self.owner.blockId}) | |
546 | + self.owner.battle.adv:award({[itemId] = math.floor(math.max(0, math.min(max, cond / ratio * ratio2)))}, {log = {desc = "passive", int1 = self.id}}, {roomId = self.owner.roomId, blockId = self.owner.blockId}) | |
546 | 547 | end |
547 | 548 | |
548 | 549 | --10=战斗额外掉落次数 | ... | ... |
src/adv/AdvPlayer.lua
... | ... | @@ -677,6 +677,10 @@ function Enemy:getClassify() |
677 | 677 | return csvdb["event_monsterCsv"][self.monsterId].classify |
678 | 678 | end |
679 | 679 | |
680 | +function Enemy:getMonsterCsv() | |
681 | + return csvdb["event_monsterCsv"][self.monsterId] | |
682 | +end | |
683 | + | |
680 | 684 | -- 0=所有 1=怪物 2=玩家 |
681 | 685 | function Enemy:checkAuraBuff(buffs) |
682 | 686 | local needBuffs = {} |
... | ... | @@ -795,7 +799,7 @@ function Player:changeSp(value, cType) |
795 | 799 | if cType == 0 then |
796 | 800 | change = value |
797 | 801 | elseif cType == 1 then |
798 | - change = self.sp * value / 100 | |
802 | + change = self.spMax * value / 100 | |
799 | 803 | end |
800 | 804 | local old = self.sp |
801 | 805 | self.sp = math.floor(math.min(self.spMax, math.max(0, self.sp + change))) | ... | ... |
src/models/Activity.lua
... | ... | @@ -30,6 +30,15 @@ Activity.ActivityType = { |
30 | 30 | ActShopGoods = 25, -- 活动商品 |
31 | 31 | |
32 | 32 | Crisis = 26, -- 宝藏怪活动 |
33 | + | |
34 | + CommonSignIn = 28, --通用签到 | |
35 | + FriendEnergy = 30, -- 好友互赠能量活动 | |
36 | + AdvLevel = 33, -- 拾荒关卡 | |
37 | + BattleCommand = 34, -- 战令活动 | |
38 | + NewSign = 36, -- 活动签到,单独的签到界面 | |
39 | + HeroBackFree = 37, -- 无损耗归还 | |
40 | + | |
41 | + BattleCommandTask = 38, -- 战令任务活动 | |
33 | 42 | } |
34 | 43 | |
35 | 44 | local function checkActivityType(activityType) |
... | ... | @@ -73,6 +82,14 @@ Activity.schema = { |
73 | 82 | |
74 | 83 | act24 = {"table", {}, true}, -- 活动卡池 {id=repaynum} |
75 | 84 | act26 = {"table", {}}, -- {task = {id = count}, socre = {id = status}} |
85 | + | |
86 | + act28 = {"table", {}}, -- 每日活跃签到 {0=day, 1=1,2=1,3=1} | |
87 | + act30 = {"table", {}}, -- {magic = 0, limit = 0, reward = {id = 1, id = 1}, giveAE = {}, getAE = {}} 奖励字段1表示领取过奖励 | |
88 | + | |
89 | + act33 = {"table", {}}, -- 拾荒关卡活动 {id={max=最大积分, pass=1}, r=""} | |
90 | + | |
91 | + act34 = {"table", {}}, -- 战令记录{unlock = 1, freeR = "", payR = "", lvl = 10, sum = 100} | |
92 | + act36 = {"table", {}}, -- 每日活跃签到 {0=day, 1=1,2=1,3=1} | |
76 | 93 | } |
77 | 94 | |
78 | 95 | function Activity:data() |
... | ... | @@ -91,7 +108,16 @@ function Activity:data() |
91 | 108 | act18 = self:getProperty("act18"), |
92 | 109 | act19 = self:getProperty("act19"), |
93 | 110 | act20 = self:getProperty("act20"), |
111 | + act24 = self:getProperty("act24"), | |
94 | 112 | act26 = self:getProperty("act26"), |
113 | + | |
114 | + act28 = self:getProperty("act28"), | |
115 | + act30 = self:getProperty("act30"), | |
116 | + | |
117 | + act33 = self:getProperty("act33"), | |
118 | + | |
119 | + act34 = self:getProperty("act34"), | |
120 | + act36 = self:getProperty("act36"), | |
95 | 121 | } |
96 | 122 | end |
97 | 123 | |
... | ... | @@ -445,8 +471,9 @@ activityFunc[Activity.ActivityType.PayBack] = { |
445 | 471 | -- 英雄帖 |
446 | 472 | activityFunc[Activity.ActivityType.CalendaTask] = { |
447 | 473 | ["init"] = function(self, actType, isCrossDay, notify) |
448 | - local calTask = self.owner:getProperty("CalTask") | |
474 | + local calTask = self.owner:getProperty("calTask") | |
449 | 475 | calTask = {} |
476 | + self.owner:updateProperty({field="calTask", value=calTask}) | |
450 | 477 | local role = self.owner |
451 | 478 | local buildL = role.dinerData:getProperty("buildL") |
452 | 479 | local curLevel = buildL:getv(1, 1) |
... | ... | @@ -470,8 +497,111 @@ activityFunc[Activity.ActivityType.CalendaTask] = { |
470 | 497 | role:checkTaskEnter("RuneQualityCollect", {}) |
471 | 498 | |
472 | 499 | end, |
473 | - -- ["close"] = function(self, actType, notify) | |
474 | - -- end, | |
500 | + ["crossDay"] = function(self, actType, notify, actId) | |
501 | + local actData = self.owner:getProperty("calTask") or {} | |
502 | + local record = actData["r"] or {} | |
503 | + local actCfg = csvdb["activity_taskCsv"][actId] | |
504 | + if not actCfg then return end | |
505 | + local change = false | |
506 | + for taskId, cfg in pairs(actCfg) do | |
507 | + if cfg["resetType"] == 1 then -- 每日重置 | |
508 | + record[taskId] = nil | |
509 | + actData[taskId] = nil | |
510 | + change = true | |
511 | + end | |
512 | + end | |
513 | + if change then | |
514 | + self.owner:updateProperty({field="calTask", value=actData}) | |
515 | + end | |
516 | + end, | |
517 | + ["crossWeek"] = function(self, actType, notify, actId) | |
518 | + local actData = self.owner:getProperty("calTask") or {} | |
519 | + local record = actData["r"] or {} | |
520 | + local actCfg = csvdb["activity_taskCsv"][actId] | |
521 | + if not actCfg then return end | |
522 | + local change = false | |
523 | + for taskId, cfg in pairs(actCfg) do | |
524 | + if cfg["resetType"] == 2 then -- 每周重置 | |
525 | + record[taskId] = nil | |
526 | + actData[taskId] = nil | |
527 | + change = true | |
528 | + end | |
529 | + end | |
530 | + if change then | |
531 | + self.owner:updateProperty({field="calTask", value=actData}) | |
532 | + end | |
533 | + end, | |
534 | + ["close"] = function(self, actType, notify) | |
535 | + self.owner:updateProperty({field="calTask", value={}}) | |
536 | + end, | |
537 | +} | |
538 | + | |
539 | +-- 活动任务 仅供春节活动使用 防冲突 | |
540 | +activityFunc[Activity.ActivityType.BattleCommandTask] = { | |
541 | + ["init"] = function(self, actType, isCrossDay, notify) | |
542 | + local bcTask = self.owner:getProperty("bcTask") | |
543 | + bcTask = {} | |
544 | + self.owner:updateProperty({field="bcTask", value=bcTask}) | |
545 | + local role = self.owner | |
546 | + local buildL = role.dinerData:getProperty("buildL") | |
547 | + local curLevel = buildL:getv(1, 1) | |
548 | + role:checkTaskEnter("DinerLevelUp", {level = curLevel}) | |
549 | + | |
550 | + role:checkTaskEnter("HeroLvlCollect", {}) | |
551 | + role:checkTaskEnter("HeroQualityCollect", {}) | |
552 | + | |
553 | + local curPopular = role.dinerData:getProperty("popular") | |
554 | + role:checkTaskEnter("DinerPopular", {count = curPopular}) | |
555 | + | |
556 | + local rLevel = role:getProperty("level") | |
557 | + role:checkTaskEnter("RoleLevelUp", {level = rLevel}) | |
558 | + | |
559 | + local towerInfo = role:getProperty("towerInfo") | |
560 | + role:checkTaskEnter("TowerPass", {level = towerInfo.l}) | |
561 | + --"PvpWin" | |
562 | + --role:checkTaskEnter("HangPass", {id = 0}) | |
563 | + role:checkCalendaTask(true, 15, 3) | |
564 | + role:checkTaskEnter("HeroStarCollect", {}) | |
565 | + role:checkTaskEnter("RuneQualityCollect", {}) | |
566 | + | |
567 | + end, | |
568 | + ["crossDay"] = function(self, actType, notify, actId) | |
569 | + local actData = self.owner:getProperty("bcTask") or {} | |
570 | + local record = actData["r"] or {} | |
571 | + local actCfg = csvdb["activity_taskCsv"][actId] | |
572 | + if not actCfg then return end | |
573 | + local change = false | |
574 | + for taskId, cfg in pairs(actCfg) do | |
575 | + if cfg["resetType"] == 1 then -- 每日充值 | |
576 | + record[taskId] = nil | |
577 | + actData[taskId] = nil | |
578 | + change = true | |
579 | + end | |
580 | + end | |
581 | + if change then | |
582 | + self.owner:updateProperty({field="bcTask", value=actData}) | |
583 | + end | |
584 | + end, | |
585 | + ["crossWeek"] = function(self, actType, notify, actId) | |
586 | + local actData = self.owner:getProperty("bcTask") or {} | |
587 | + local record = actData["r"] or {} | |
588 | + local actCfg = csvdb["activity_taskCsv"][actId] | |
589 | + if not actCfg then return end | |
590 | + local change = false | |
591 | + for taskId, cfg in pairs(actCfg) do | |
592 | + if cfg["resetType"] == 2 then -- 每周重置 | |
593 | + record[taskId] = nil | |
594 | + actData[taskId] = nil | |
595 | + change = true | |
596 | + end | |
597 | + end | |
598 | + if change then | |
599 | + self.owner:updateProperty({field="bcTask", value=actData}) | |
600 | + end | |
601 | + end, | |
602 | + ["close"] = function(self, actType, notify) | |
603 | + self.owner:updateProperty({field="bcTask", value={}}) | |
604 | + end, | |
475 | 605 | } |
476 | 606 | |
477 | 607 | -- 兑换 |
... | ... | @@ -481,6 +611,9 @@ activityFunc[Activity.ActivityType.Exchange] = { |
481 | 611 | actData[actId] = {} |
482 | 612 | self:updateActData(actType, actData, not notify) |
483 | 613 | end, |
614 | + ["login"] = function(self, actType, actId) | |
615 | + activityFunc[Activity.ActivityType.Exchange]["crossDay"](self, actType, true, actId) | |
616 | + end, | |
484 | 617 | ["crossDay"] = function(self, actType, notify, actId) |
485 | 618 | local actData = self:getActData(actType) or {} |
486 | 619 | local lastTs = actData["ts"] or 0 |
... | ... | @@ -489,14 +622,14 @@ activityFunc[Activity.ActivityType.Exchange] = { |
489 | 622 | if not cfg then return end |
490 | 623 | local refreshTimes = cfg.condition2:toArray(false, "=") |
491 | 624 | for i = 1, #refreshTimes do |
492 | - local rt = toUnixtime(refreshTimes[1]..string_format("%02x", RESET_TIME)) | |
625 | + local rt = toUnixtime(refreshTimes[i]..string_format("%02x", RESET_TIME)) | |
493 | 626 | if timeNow >= rt and rt > lastTs then |
494 | 627 | lastTs = rt |
495 | 628 | actData = {} |
496 | 629 | end |
497 | 630 | end |
498 | - if next(actData) then | |
499 | - actData["ts"] = lastTs | |
631 | + if not next(actData) then | |
632 | + actData["ts"] = timeNow | |
500 | 633 | self:updateActData(actType, actData, not notify) |
501 | 634 | end |
502 | 635 | end, |
... | ... | @@ -525,6 +658,12 @@ activityFunc[Activity.ActivityType.ActHeroPool] = { |
525 | 658 | local actData = self:getActData(actType) |
526 | 659 | local cfg = csvdb["activity_ctrlCsv"][actId] |
527 | 660 | if not cfg then return end |
661 | + -- 保底次数转换成万能碎片 | |
662 | + --local count = math.ceil(((actData[cfg.condition] or 0) / 100) * 60) | |
663 | + --if count > 0 then | |
664 | + -- local gift = {[723] = count} | |
665 | + -- self.owner:sendMail(MailId.ActivityPoolRet, nil, gift, {}) | |
666 | + --end | |
528 | 667 | actData[cfg.condition] = nil |
529 | 668 | self:updateActData(actType, actData, not notify) |
530 | 669 | end, |
... | ... | @@ -578,8 +717,8 @@ function Activity:closeActivity(actId, notify, notUpdateAct) |
578 | 717 | local actType = actData.showType |
579 | 718 | if activityFunc[actType] and activityFunc[actType]['close'] then |
580 | 719 | activityFunc[actType]["close"](self, actType, notify, actId) |
581 | - self:recycleActItem(actId) | |
582 | 720 | end |
721 | + self:recycleActItem(actId) | |
583 | 722 | if Activity.schema["act".. actType] then |
584 | 723 | if not Activity.schema["act" .. actType][3] then |
585 | 724 | self:updateActData(actType, Activity.schema["act" .. actType][2], not notify or notUpdateAct) |
... | ... | @@ -599,6 +738,18 @@ function Activity:refreshDailyData(notify) |
599 | 738 | end |
600 | 739 | end |
601 | 740 | |
741 | +function Activity:refreshWeekData(notify) | |
742 | + for actId, status in pairs(self._isOpen) do | |
743 | + local actData = csvdb["activity_ctrlCsv"][actId] | |
744 | + if status and actData then | |
745 | + local actType = actData.showType | |
746 | + if activityFunc[actType] and activityFunc[actType]['crossWeek'] then | |
747 | + activityFunc[actType]["crossWeek"](self, actType, notify, actId) | |
748 | + end | |
749 | + end | |
750 | + end | |
751 | +end | |
752 | + | |
602 | 753 | function Activity:checkActivity(notNotify, activityType, ...) |
603 | 754 | if not activityType then return end |
604 | 755 | if not self:isOpen(activityType) then return end |
... | ... | @@ -698,7 +849,7 @@ function Activity:recycleActItem(actId) |
698 | 849 | local itemCount = role:getItemCount(fromId) |
699 | 850 | if itemCount > 0 then |
700 | 851 | costs[fromId] = (costs[fromId] or 0) + itemCount |
701 | - gift[toId] = toNum * itemCount | |
852 | + gift[toId] = (gift[toId] or 0) + toNum * itemCount | |
702 | 853 | end |
703 | 854 | end |
704 | 855 | if next(costs) then |
... | ... | @@ -762,7 +913,46 @@ activityFunc[Activity.ActivityType.ActShopGoods] = { |
762 | 913 | end, |
763 | 914 | } |
764 | 915 | |
916 | +activityFunc[Activity.ActivityType.FriendEnergy] = { | |
917 | + ["init"] = function (self, actType, isCrossDay, notify, actId) | |
918 | + local data = {magic = 0, limit = 0, reward = {}, giveAE = {}, getAE = {}, new = self:getActFriendNew()} | |
919 | + self:updateActData(actType, data, not notify) | |
920 | + end, | |
921 | + ["login"] = function (self, actType) | |
922 | + local actData = self:getActData(actType) or {} | |
923 | + actData.new = self:getActFriendNew() | |
924 | + self:updateActData(actType, actData, not notify) | |
925 | + end, | |
926 | + ["crossDay"] = function(self, actType, notify) | |
927 | + local actData = self:getActData(actType) | |
928 | + actData.limit = 0 | |
929 | + actData.giveAE = {} | |
930 | + actData.getAE = {} | |
931 | + self:updateActData(actType, actData, not notify) | |
932 | + end, | |
933 | + ["close"] = function (self, actType, notify, actId) | |
934 | + redisproxy:del(FRIEND_ENERGY:format(self.owner:getProperty("id"))) | |
935 | + end | |
936 | +} | |
937 | + | |
938 | +function Activity:getActFriendNew() | |
939 | + local roleId = self.owner:getProperty("id") | |
940 | + local friendIds = {} | |
941 | + local friends = redisproxy:hgetall(FRIEND_KEY:format(roleId)) | |
942 | + for i = 1, #friends , 2 do | |
943 | + local objId = tonumber(friends[i]) | |
944 | + friendIds[objId] = 1 | |
945 | + end | |
765 | 946 | |
947 | + local ids = {} | |
948 | + local members = redisproxy:smembers(FRIEND_ENERGY:format(roleId)) | |
949 | + for _, id in pairs(members) do | |
950 | + if friendIds[tonumber(id)] then | |
951 | + ids[tonumber(id)] = 1 | |
952 | + end | |
953 | + end | |
954 | + return ids | |
955 | +end | |
766 | 956 | |
767 | 957 | activityFunc[Activity.ActivityType.Crisis] = { |
768 | 958 | ["check"] = function(self, actType, notify, atype, count) -- 检查 |
... | ... | @@ -775,25 +965,27 @@ activityFunc[Activity.ActivityType.Crisis] = { |
775 | 965 | for id, actSet in pairs(actCsv) do |
776 | 966 | if actSet.type == atype then |
777 | 967 | local status = actData.task[id] or 0 |
778 | - status = status + count | |
779 | - if status >= actSet.condition1 then | |
780 | - local reward | |
781 | - if actSet.loop == 1 then | |
782 | - local rcount = math.floor(status / actSet.condition1) | |
783 | - reward = actSet.reward:toNumMap() | |
784 | - for itemId, itemC in pairs(reward) do | |
785 | - reward[itemId] = itemC * rcount | |
968 | + if status ~= -1 then | |
969 | + status = status + count | |
970 | + if status >= actSet.condition1 then | |
971 | + local reward | |
972 | + if actSet.loop == 1 then | |
973 | + local rcount = math.floor(status / actSet.condition1) | |
974 | + reward = actSet.reward:toNumMap() | |
975 | + for itemId, itemC in pairs(reward) do | |
976 | + reward[itemId] = itemC * rcount | |
977 | + end | |
978 | + status = status % actSet.condition1 | |
979 | + else | |
980 | + reward = actSet.reward | |
981 | + status = -1 | |
786 | 982 | end |
787 | - status = status % actSet.condition1 | |
788 | - else | |
789 | - reward = actSet.reward | |
790 | - status = -1 | |
791 | - end | |
792 | 983 | |
793 | - self.owner:award(reward, {log = {desc = "activity_crisis"}, notNotify = not notify}) | |
984 | + self.owner:award(reward, {log = {desc = "activity_crisis"}, notNotify = not notify}) | |
985 | + end | |
986 | + actData.task[id] = status | |
987 | + change = true | |
794 | 988 | end |
795 | - actData.task[id] = status | |
796 | - change = true | |
797 | 989 | end |
798 | 990 | end |
799 | 991 | if change then |
... | ... | @@ -804,4 +996,193 @@ activityFunc[Activity.ActivityType.Crisis] = { |
804 | 996 | end, |
805 | 997 | } |
806 | 998 | |
999 | +activityFunc[Activity.ActivityType.CommonSignIn] = { | |
1000 | + ["init"] = function(self, actType, isCrossDay, notify, actId) | |
1001 | + if not isCrossDay then | |
1002 | + activityFunc[Activity.ActivityType.CommonSignIn]["crossDay"](self, actType, notify, actId) | |
1003 | + | |
1004 | + local taskStatus = self.owner:getProperty("dTask") | |
1005 | + activityFunc[Activity.ActivityType.CommonSignIn]["check"](self, actType, notify, 0, (taskStatus["a"] or 0)) | |
1006 | + end | |
1007 | + end, | |
1008 | + ["crossDay"] = function(self, actType, notify, actId) | |
1009 | + local actCfg = csvdb["activity_ctrlCsv"][actId] | |
1010 | + if not actCfg then return end | |
1011 | + local conArr = actCfg.condition2:toArray(true, "=") | |
1012 | + -- 0 登录即可, 1 达到指定活跃度 | |
1013 | + if conArr[1] ~= 0 then | |
1014 | + return | |
1015 | + end | |
1016 | + local curData = self:getActData(actType) or {} | |
1017 | + curData[0] = (curData[0] or 0) + 1 | |
1018 | + self:updateActData(actType, curData, not notify) | |
1019 | + end, | |
1020 | + ["check"] = function(self, actType, notify, pre, cur) -- 检查 | |
1021 | + local isOpen, actId = self:isOpen(actType) | |
1022 | + local actData = self:getActData(actType) or {} | |
1023 | + local actCfg = csvdb["activity_ctrlCsv"][actId] | |
1024 | + if not actCfg then return end | |
1025 | + local conArr = actCfg.condition2:toArray(true, "=") | |
1026 | + -- 0 登录即可, 1 达到指定活跃度 | |
1027 | + if conArr[1] ~= 1 then | |
1028 | + return | |
1029 | + end | |
1030 | + local val = conArr[2] or 0 | |
1031 | + if pre < val and cur >= val then | |
1032 | + actData[0] = (actData[0] or 0) + 1 | |
1033 | + self:updateActData(actType, actData, not notify) | |
1034 | + end | |
1035 | + end, | |
1036 | +} | |
1037 | + | |
1038 | +activityFunc[Activity.ActivityType.BattleCommand] = { | |
1039 | + ["init"] = function (self, actType, isCrossDay, notify, actId) | |
1040 | + local data = {unlock = 0, freeR = "", payR = "", lvl = 0, sum = 0, week = 0} | |
1041 | + self:updateActData(actType, data, not notify) | |
1042 | + end, | |
1043 | + ["check"] = function(self, actType, notify, id, count) -- 检查 itemid, count | |
1044 | + local isOpen, actId = self:isOpen(actType) | |
1045 | + local actData = self:getActData(actType) or {} | |
1046 | + local actCfg = csvdb["activity_ctrlCsv"][actId] | |
1047 | + if not actCfg then return end | |
1048 | + if actCfg.condition1 == "" then return end | |
1049 | + local arr = actCfg.condition2:toArray(true, "=") | |
1050 | + local itemIdWeek, itemIdNormal, limit = arr[1], arr[2], arr[3] | |
1051 | + if (itemIdWeek == id or itemIdNormal == id) and count > 0 then | |
1052 | + if itemIdWeek == id then | |
1053 | + if (actData["week"] or 0) >= limit then | |
1054 | + return | |
1055 | + end | |
1056 | + local old = actData["week"] or 0 | |
1057 | + actData["week"] = math.min(old + count, limit) | |
1058 | + count = actData["week"] - old | |
1059 | + end | |
1060 | + local total = actData["sum"] + count | |
1061 | + local curLvl = actData["lvl"] or 0 | |
1062 | + if actCfg.condition == 1 then -- 代表sum需要转换为等级 | |
1063 | + local bpCfg = csvdb["activity_battlepass_rewardCsv"][actId] | |
1064 | + if not bpCfg then return end | |
1065 | + for i = 1, #bpCfg do | |
1066 | + local cfg = bpCfg[i] | |
1067 | + if cfg["type"] > curLvl then | |
1068 | + if total < cfg["condition"] then break end | |
1069 | + total = total - cfg["condition"] | |
1070 | + curLvl = curLvl + 1 | |
1071 | + end | |
1072 | + end | |
1073 | + actData["lvl"] = curLvl | |
1074 | + actData["sum"] = total | |
1075 | + end | |
1076 | + | |
1077 | + self:updateActData(actType, actData) | |
1078 | + end | |
1079 | + end, | |
1080 | + ["crossWeek"] = function(self, actType, notify, actId) | |
1081 | + local actData = self:getActData(actType) or {} | |
1082 | + actData["week"] = 0 | |
1083 | + self:updateActData(actType, actData, true) | |
1084 | + end, | |
1085 | +} | |
1086 | + | |
1087 | + | |
1088 | +activityFunc[Activity.ActivityType.NewSign] = { | |
1089 | + -- ["check"] = function(self, actType, notify) -- 检查 | |
1090 | + -- end, | |
1091 | + ["init"] = function(self, actType, isCrossDay, notify) | |
1092 | + if not isCrossDay then | |
1093 | + activityFunc[Activity.ActivityType.NewSign]["crossDay"](self, actType, notify) | |
1094 | + end | |
1095 | + end, | |
1096 | + -- ["close"] = function(self, actType, notify) | |
1097 | + -- end, | |
1098 | + ["crossDay"] = function(self, actType, notify) | |
1099 | + local curData = self:getActData(actType) | |
1100 | + local isOpen, actId = self:isOpen(actType) | |
1101 | + local actData = csvdb["activity_signInCsv"][actId] or {} | |
1102 | + curData["0"] = curData["0"] or 0 | |
1103 | + if curData["0"] >= #actData then return end -- 满了就忽略了 | |
1104 | + curData["0"] = curData["0"] + 1 | |
1105 | + | |
1106 | + -- 没满更新一下 | |
1107 | + self:updateActData(actType, curData, not notify) | |
1108 | + end, | |
1109 | +} | |
1110 | + | |
1111 | +local function closeActAdvHang(role, chapterId) | |
1112 | + local advHang = role:getProperty("advHang") | |
1113 | + local info = advHang[chapterId] | |
1114 | + if not info then return end | |
1115 | + | |
1116 | + local index = info.index or 1 | |
1117 | + local chapterData = csvdb["adv_chapter_campsiteCsv"][chapterId] | |
1118 | + if not chapterData then return end | |
1119 | + local campSiteData = chapterData[info.campId or 2] | |
1120 | + if not campSiteData then return 1 end | |
1121 | + if campSiteData.idleReward_1 == "" and campSiteData.idleReward_2 == "" then return 2 end --没有奖励 没有挂机 | |
1122 | + | |
1123 | + local adv_idle_time = globalCsv.adv_idle_time[index] | |
1124 | + local adv_idle_energy = globalCsv.adv_idle_energy[index] | |
1125 | + local adv_idle_reward_coef = globalCsv.adv_idle_reward[index] | |
1126 | + if not adv_idle_time or not adv_idle_energy or not adv_idle_reward_coef then | |
1127 | + return 2 | |
1128 | + end | |
1129 | + adv_idle_time = adv_idle_time * 60 | |
1130 | + | |
1131 | + local reward, isFull, change, heroFaithMap | |
1132 | + local heroCnt = 0 | |
1133 | + if skynet.timex() >= info.time then | |
1134 | + -- 增加英雄信赖 | |
1135 | + local exp = info.duration / 60 | |
1136 | + heroFaithMap = {} | |
1137 | + for _, heroId in pairs(info.format.heros) do | |
1138 | + local curFaith = role:addHeroFaith(heroId, exp) | |
1139 | + heroFaithMap[heroId] = curFaith | |
1140 | + heroCnt = heroCnt + 1 | |
1141 | + end | |
1142 | + | |
1143 | + local totalReward = campSiteData.idleReward_1 .. " " .. campSiteData.idleReward_2 | |
1144 | + | |
1145 | + local idleReward = totalReward:toNumMap() | |
1146 | + for itemId, count in pairs(idleReward) do | |
1147 | + idleReward[itemId] = count * adv_idle_reward_coef | |
1148 | + end | |
1149 | + reward, change = role:award(idleReward, {log = {desc = "advHang", int1 = chapterId}}) | |
1150 | + end | |
1151 | + role:changeUpdates({{type = "advHang", field = chapterId, value = nil}}) | |
1152 | + | |
1153 | + role:mylog("adv_action", {desc = "endHang", int1 = chapterId, short1 = 2}) | |
1154 | + | |
1155 | + role:checkTaskEnter("AdvHang", {}) | |
1156 | + role:checkTaskEnter("AdvHangHeroCnt", {count = heroCnt}) | |
1157 | +end | |
1158 | + | |
1159 | +activityFunc[Activity.ActivityType.AdvLevel] = { | |
1160 | + -- ["check"] = function(self, actType, notify) -- 检查 | |
1161 | + -- end, | |
1162 | + ["init"] = function(self, actType, isCrossDay, notify) | |
1163 | + end, | |
1164 | + ["close"] = function(self, actType, notify, actid) | |
1165 | + local actCfg = csvdb["activity_adv_chapterCsv"][actid] | |
1166 | + if not actCfg then return end | |
1167 | + for chapterId, _ in pairs(actCfg) do | |
1168 | + local advPass = self.owner:getProperty("advPass") | |
1169 | + advPass[chapterId] = nil | |
1170 | + local advRelay = self.owner:getProperty("advRelay") | |
1171 | + advRelay[chapterId] = nil | |
1172 | + self.owner:updateProperties({ | |
1173 | + advPass = advPass, | |
1174 | + advRelay = advRelay, | |
1175 | + }, not notify) | |
1176 | + -- 关闭活动代理拾荒 | |
1177 | + closeActAdvHang(self.owner, chapterId) | |
1178 | + end | |
1179 | + -- 强制关闭活动拾荒关卡 | |
1180 | + local adv = self.owner:getAdvData() | |
1181 | + if adv:isRunning() and adv:isActivity() then | |
1182 | + adv:forceOver() | |
1183 | + end | |
1184 | + | |
1185 | + end, | |
1186 | +} | |
1187 | + | |
807 | 1188 | return Activity | ... | ... |
src/models/Daily.lua
src/models/Diner.lua
... | ... | @@ -201,7 +201,7 @@ function Diner:calSellReward(sell, delta, dishData) |
201 | 201 | upValue[ItemId.Gold] = (upValue[ItemId.Gold] or 0) + buildData.gold_up |
202 | 202 | end |
203 | 203 | if buildData.item_up > 0 then |
204 | - upValue[ItemId.DinerCoin] = (upValue[ItemId.DinerCoin] or 0) + buildData.gold_up | |
204 | + upValue[ItemId.DinerCoin] = (upValue[ItemId.DinerCoin] or 0) + buildData.item_up | |
205 | 205 | end |
206 | 206 | if buildData and buildData.famous_up > 0 then |
207 | 207 | upValue[-1] = (upValue[-1] or 0) + buildData.famous_up | ... | ... |
src/models/HeroPlugin.lua
... | ... | @@ -53,22 +53,25 @@ function HeroPlugin.bind(Hero) |
53 | 53 | local talentAttrS = {} |
54 | 54 | |
55 | 55 | -- 四个基础属性 |
56 | - local curData = csvdb["unit_talentCsv"][talent:getv(0, 1)] | |
57 | - local curTalentLvl = 0 | |
58 | - if not curData then -- 已经满阶段了 | |
59 | - local cfgName = "unit_talent_"..heroCfgId.."Csv" | |
60 | - curData = csvdb[cfgName][#csvdb[cfgName]] | |
61 | - else | |
62 | - curTalentLvl = talent:getv(1, 1) | |
63 | - end | |
64 | - for lvl, cfg in pairs(curData) do | |
65 | - if lvl < curTalentLvl or curTalentLvl == 0 then | |
66 | - if cfg.effect ~= 99 then | |
67 | - local curVal = talentAttrS[cfg.effect] or 0 | |
68 | - if curVal < cfg.strength then | |
69 | - talentAttrS[cfg.effect] = cfg.strength | |
56 | + local cfgName = "unit_talent_"..heroCfgId.."Csv" | |
57 | + local curRank = talent:getv(0, 1) | |
58 | + local curLv = talent:getv(1,1) - 1 | |
59 | + for i, value in ipairs(csvdb[cfgName]) do | |
60 | + if i <= curRank then | |
61 | + for lv, cfg in ipairs(value) do | |
62 | + if i < curRank or lv <= curLv then | |
63 | + if cfg.effect ~= 99 then | |
64 | + if not talentAttrS[cfg.effect] then | |
65 | + talentAttrS[AttsEnumEx[cfg.effect]] = 0 | |
66 | + end | |
67 | + talentAttrS[AttsEnumEx[cfg.effect]] = cfg.strength | |
68 | + end | |
69 | + else | |
70 | + break | |
70 | 71 | end |
71 | 72 | end |
73 | + else | |
74 | + break | |
72 | 75 | end |
73 | 76 | end |
74 | 77 | |
... | ... | @@ -85,7 +88,7 @@ function HeroPlugin.bind(Hero) |
85 | 88 | for lvl = 1, #faithConfig do |
86 | 89 | if faith >= faithConfig[lvl].exp then |
87 | 90 | local add = faithConfig[lvl]["position_"..unitData.position]:toArray(true, "=") |
88 | - faithAttr[add[1]] = (faithAttr[add[1]] or 0) + add[2] | |
91 | + faithAttr[AttsEnumEx[add[1]]] = (faithAttr[AttsEnumEx[add[1]]] or 0) + add[2] | |
89 | 92 | end |
90 | 93 | end |
91 | 94 | for _, attrName in pairs(AttsEnumEx) do | ... | ... |
src/models/Order.lua
... | ... | @@ -12,6 +12,7 @@ Order.schema = { |
12 | 12 | createTime = {"number", skynet.timex()}, -- 订单创建时间 |
13 | 13 | finishTime = {"number", 0}, -- 服务端验证完成时间 |
14 | 14 | status = {"string", "create"}, |
15 | + sid = {"number",0}, -- 创建单号的设备的sid | |
15 | 16 | } |
16 | 17 | |
17 | 18 | Order.fields = { |
... | ... | @@ -21,6 +22,7 @@ Order.fields = { |
21 | 22 | createTime = true, |
22 | 23 | finishTime = true, |
23 | 24 | status = true, |
25 | + sid = true, | |
24 | 26 | } |
25 | 27 | |
26 | 28 | return Order |
27 | 29 | \ No newline at end of file | ... | ... |
src/models/Role.lua
... | ... | @@ -54,13 +54,15 @@ Role.schema = { |
54 | 54 | banTime = {"number", 0}, |
55 | 55 | banType = {"number", 0}, |
56 | 56 | heartWarning = {"number", 0}, |
57 | + cheatCount = {"number", 0}, | |
57 | 58 | ltime = {"number", 0}, -- 最后登录时间 |
58 | 59 | ctime = {"number", skynet.timex()}, -- 创建时间 |
59 | 60 | ignoreMt = {"number", 0}, -- 忽略维护拦截 |
60 | - sversion = {"number", globalCsv.StructVersion or 0}, -- 重整数据版本 | |
61 | + sversion = {"number", STRUCT_VERSION or 0}, -- 重整数据版本 | |
61 | 62 | timeReset = {"table", {}}, --重置轮回记录 |
62 | - diamond = {"number", 0}, | |
63 | - reDiamond = {"number", 0}, | |
63 | + diamond = {"number", 0}, -- 免费钻 | |
64 | + reDiamond = {"number", 0}, -- android充值钻 | |
65 | + reDiamondIos = {"number", 0}, -- ios充值钻 | |
64 | 66 | setting = {"table", {}}, --设置 |
65 | 67 | codeStr = {"string", "", "blob"}, --已经领过的礼包码 |
66 | 68 | -- roleInfo |
... | ... | @@ -155,6 +157,7 @@ Role.schema = { |
155 | 157 | |
156 | 158 | achiveT = {"table", {}}, -- 成就计数统计 achivement_type {id = status} |
157 | 159 | achiveV = {"table", {}}, -- 成就领奖统计 achivement {id = status} |
160 | + fuxR = {"number", 0}, -- 复兴成就最大完成数量 | |
158 | 161 | |
159 | 162 | rechargeF = {"table", {}}, -- 是否首次充值某一项 -- —{[id] = 1} -- 不存在就是没有充值过 |
160 | 163 | dinerS = {"table", {}}, -- 美食币商城 购买记录 {[id] = count} |
... | ... | @@ -183,6 +186,7 @@ Role.schema = { |
183 | 186 | feedback = {"table", {}}, -- 反馈相关信息 {flag = false, count = 0} flag是否评论过,count 提示次数 |
184 | 187 | |
185 | 188 | calTask = {"table", {}}, -- 英雄令活动 日历任务活动 |
189 | + bcTask = {"table", {}}, -- 英雄令活动 日历任务活动 临时使用 | |
186 | 190 | radioTask = {"table", {}}, -- 电台任务 {id = {time=end_ts,heros=heros}} 表crusadeCsv |
187 | 191 | } |
188 | 192 | |
... | ... | @@ -356,6 +360,7 @@ function Role:data() |
356 | 360 | advSup = self:getProperty("advSup"), |
357 | 361 | advC = self:getProperty("advC"), |
358 | 362 | advCT = self:getProperty("advCT"), |
363 | + advRelay = self:getProperty("advRelay"), | |
359 | 364 | |
360 | 365 | hangPass = self:getProperty("hangPass"), |
361 | 366 | hangGift = self:getProperty("hangGift"), |
... | ... | @@ -409,6 +414,7 @@ function Role:data() |
409 | 414 | feedback = self:getProperty("feedback"), |
410 | 415 | ctime = self:getProperty("ctime"), |
411 | 416 | calTask = self:getProperty("calTask"), |
417 | + bcTask = self:getProperty("bcTask"), | |
412 | 418 | radioTask = self:getProperty("radioTask"), |
413 | 419 | } |
414 | 420 | end | ... | ... |
src/models/RoleBattle.lua
... | ... | @@ -21,13 +21,153 @@ local BattleType = { |
21 | 21 | |
22 | 22 | RoleBattle.bind = function (Role) |
23 | 23 | |
24 | +local checkCheatAttrs = { | |
25 | + ["hp"] = 1, | |
26 | + ["atk"] = 1, | |
27 | + ["def"] = 1, | |
28 | + ["hit"] = 1, | |
29 | + ["miss"] = 1, | |
30 | + ["crit"] = 1, | |
31 | + ["atkSpeed"] = 1, | |
32 | + ["critHurt"] = 1, | |
33 | + -- ["vampire"] = 1, | |
34 | + -- ["pierce"] = 1, | |
35 | +} | |
24 | 36 | |
25 | --- TODO 检查战斗是否作弊 | |
26 | -local function checkBattleCheat() | |
27 | - | |
37 | +local function checkOneCheat(selfTeamClient, selfTeamServer, enemyClient, enemyServer) | |
38 | + if not selfTeamClient or type(selfTeamClient) ~= "table" then return end | |
39 | + for unitType, clientInfo in pairs(selfTeamClient) do | |
40 | + local serverInfo = selfTeamServer[unitType] | |
41 | + if not serverInfo then return end | |
42 | + for attr, pm in pairs(checkCheatAttrs) do | |
43 | + if not clientInfo[attr] then return end | |
44 | + end | |
45 | + local b1 = ((clientInfo["hp"] + clientInfo["def"] * 7 + clientInfo["miss"] * 4) * (clientInfo["atk"] * 4 + clientInfo["hit"] * 2) * (1 + clientInfo["crit"]/100 * clientInfo["critHurt"]/100) * clientInfo["atkSpeed"] / 600000) ^ 0.8 | |
46 | + local b2 = ((serverInfo["hp"] + serverInfo["def"] * 7 + serverInfo["miss"] * 4) * (serverInfo["atk"] * 4 + serverInfo["hit"] * 2) * (1 + serverInfo["crit"]/100 * serverInfo["critHurt"]/100) * serverInfo["atkSpeed"] / 600000) ^ 0.8 | |
47 | + if b1 >= b2 * 2 then | |
48 | + return | |
49 | + end | |
50 | + end | |
51 | + return true | |
28 | 52 | end |
29 | 53 | |
54 | +-- local function getRobotAttrs(info, strength) | |
55 | +-- strength = strength or 10000 | |
56 | +-- local unitData = csvdb["unitCsv"][info.unitType] | |
57 | +-- local enemy = {} | |
58 | +-- for arr, _ in pairs(checkCheatAttrs) do | |
59 | +-- enemy[arr] = unitData[attr] * info[attr] * strength / 10000 | |
60 | +-- end | |
61 | +-- return enemy | |
62 | +-- end | |
63 | + | |
64 | +-- --通过配表构建敌人队伍 通用 | |
65 | +-- function BattleEnter:packBattleEnemyCommon( carbonData ) | |
66 | +-- local enemys = {} | |
67 | +-- local monsterSet = csvdb[carbonData.monster:match("/([^/]*)$") .. "Csv"] | |
68 | +-- for phase = 1, #monsterSet do | |
69 | +-- local allEnemys = table.values(monsterSet[phase]) | |
70 | +-- table.sort(allEnemys, function(a, b) return a.id < b.id end) | |
71 | +-- local heros = {} | |
72 | +-- for idx, enemy in ipairs(allEnemys) do | |
73 | +-- local info = getRobotAttrs(enemy, carbonData.strength) | |
74 | +-- enemys[idx] = info | |
75 | +-- end | |
76 | +-- break | |
77 | +-- end | |
78 | +-- return enemys | |
79 | +-- end | |
80 | + | |
81 | +-- 检查战斗是否作弊 | |
82 | +function Role:checkBattleCheat(battleType, params) | |
83 | + if not params.isWin then return true end | |
84 | + local clientInfo = params.info or {} | |
85 | + | |
86 | + if not BattleType[battleType] then | |
87 | + print(string.format("NO find battleType: %s", battleType)) | |
88 | + return true | |
89 | + end | |
90 | + local selfTeamServer = {} | |
91 | + local enemyServer = {} | |
92 | + | |
93 | + local cheat = {} | |
94 | + cheat["hang"] = function() | |
95 | + local team = self:getTeamBattleInfo(self:getTeamFormatByType(TeamSystemType.Hang)) | |
96 | + for slot, hero in pairs(team.heros) do | |
97 | + local temp = {} | |
98 | + for arr, _ in pairs(checkCheatAttrs) do | |
99 | + temp[arr] = hero[arr] | |
100 | + end | |
101 | + selfTeamServer[hero.type] = temp | |
102 | + end | |
103 | + -- local carbonData = csvdb["idle_battleCsv"][params.id] | |
104 | + -- enemyServer = packBattleEnemyCommon(carbonData) | |
105 | + end | |
106 | + cheat["tower"] = function() | |
107 | + local team = self:getTeamBattleInfo(self:getTeamFormatByType(TeamSystemType.Tower)) | |
108 | + for slot, hero in pairs(team.heros) do | |
109 | + local temp = {} | |
110 | + for arr, _ in pairs(checkCheatAttrs) do | |
111 | + temp[arr] = hero[arr] | |
112 | + end | |
113 | + selfTeamServer[hero.type] = temp | |
114 | + end | |
115 | + -- local carbonData = csvdb["tower_battleCsv"][params.id] | |
116 | + -- enemyServer = packBattleEnemyCommon(carbonData) | |
117 | + end | |
118 | + cheat["bonus"] = function() | |
119 | + local team = self:getTeamBattleInfo(self:getTeamFormatByType(TeamSystemType.BonusBattle)) | |
120 | + for slot, hero in pairs(team.heros) do | |
121 | + local temp = {} | |
122 | + for arr, _ in pairs(checkCheatAttrs) do | |
123 | + temp[arr] = hero[arr] | |
124 | + end | |
125 | + selfTeamServer[hero.type] = temp | |
126 | + end | |
127 | + -- local carbonData = csvdb["bonus_battleCsv"][params.id] | |
128 | + -- enemyServer = packBattleEnemyCommon(carbonData) | |
129 | + end | |
130 | + cheat["pvpc"] = function() | |
131 | + if not params.format then return end | |
132 | + local team = self:getTeamBattleInfo(params.format) | |
133 | + for slot, hero in pairs(team.heros) do | |
134 | + local temp = {} | |
135 | + for arr, _ in pairs(checkCheatAttrs) do | |
136 | + temp[arr] = hero[arr] | |
137 | + end | |
138 | + selfTeamServer[hero.type] = temp | |
139 | + end | |
140 | + end | |
141 | + cheat["pvph"] = cheat["pvpc"] | |
142 | + cheat["act_battle"] = cheat["pvpc"] | |
143 | + | |
144 | + cheat[battleType]() | |
145 | + | |
146 | + local status = checkOneCheat(clientInfo.selfAttr, selfTeamServer, clientInfo.enemyAttr, enemyServer) | |
147 | + if not status then | |
148 | + -- local cheatCount = self:getProperty("cheatCount") | |
149 | + -- cheatCount = cheatCount + 1 | |
150 | + -- self:setProperty("cheatCount", cheatCount) | |
151 | + | |
152 | + local result = {clientSelf = {}, serverSelf = {}} | |
153 | + for k , v in pairs(clientInfo.selfAttr or {}) do | |
154 | + result.clientSelf[tostring(k)] = v | |
155 | + end | |
156 | + for k , v in pairs(selfTeamServer) do | |
157 | + result.serverSelf[tostring(k)] = v | |
158 | + end | |
159 | + result = json.encode(result) | |
160 | + self:mylog("cheat", {desc = battleType, int1 = 1, text1 = result}) | |
30 | 161 | |
162 | + -- for _, v in ipairs(globalCsv.cheat_check) do | |
163 | + -- if cheatCount == v[1] then | |
164 | + -- self:setBan(v[2] / 86400, 5) | |
165 | + -- break | |
166 | + -- end | |
167 | + -- end | |
168 | + end | |
169 | + return true | |
170 | +end | |
31 | 171 | |
32 | 172 | function Role:checkBattle(battleType, params) |
33 | 173 | local clientInfo = params.info or {} | ... | ... |
src/models/RoleChangeStruct.lua
... | ... | @@ -31,6 +31,7 @@ local awardGift = createVersionFunc(VersionType.Override ,function(role, params) |
31 | 31 | print("awardGift" .. " >>> " .. params) |
32 | 32 | end) |
33 | 33 | |
34 | + | |
34 | 35 | local bugFixSuduku = createVersionFunc(VersionType.DoOnly, function(role, params) |
35 | 36 | local sudoku = role:getProperty("sudoku") |
36 | 37 | local phase = sudoku[-1] or 1 |
... | ... | @@ -48,11 +49,38 @@ local bugFixSuduku = createVersionFunc(VersionType.DoOnly, function(role, params |
48 | 49 | end |
49 | 50 | end) |
50 | 51 | |
52 | +local bugFixRune = createVersionFunc(VersionType.DoOnly, function(role, params) | |
53 | + local had = false | |
54 | + for id, rune in pairs(role.runeBag) do | |
55 | + if math.floor(rune:getProperty("id") / 1000) == 16 then | |
56 | + local attrs = rune:getProperty("attrs") | |
57 | + local atk = attrs:getv(2, 0) | |
58 | + if atk ~= 0 then | |
59 | + attrs = attrs:delk(2):setv(1, atk) | |
60 | + had = true | |
61 | + rune:setProperty("attrs",attrs) | |
62 | + end | |
63 | + end | |
64 | + end | |
65 | + if had then | |
66 | + -- 补偿 | |
67 | + end | |
68 | +end) | |
69 | + | |
70 | +-- 清除 player 消失 的冒险 | |
71 | +local bugFixAdvPlayer = createVersionFunc(VersionType.Override, function(role, params) | |
72 | + if role:getAdvData():isRunning() and not role:getProperty("advTeam").player then | |
73 | + role:getAdvData():forceOver(true) | |
74 | + end | |
75 | +end) | |
76 | + | |
51 | 77 | ---------------------版本方法 end ---------------------- |
52 | 78 | |
53 | 79 | -- version 罗列start |
54 | 80 | local versionList = {} -- version 列表 |
55 | 81 | versionList[1] = {bugFixSuduku, {}} |
82 | +versionList[2] = {bugFixRune, {}} | |
83 | +versionList[3] = {bugFixAdvPlayer, {}} | |
56 | 84 | -- versionList[2] = {clearActivity, {5, 7}} |
57 | 85 | -- versionList[3] = {changeStructF, "test1"} |
58 | 86 | -- versionList[4] = {changeStructF, "test2"} |
... | ... | @@ -69,11 +97,11 @@ function RoleChangeStruct.bind(Role) |
69 | 97 | |
70 | 98 | function Role:changeStructVersion() |
71 | 99 | local curVersion = self:getProperty("sversion") |
72 | - if not globalCsv.StructVersion or curVersion >= globalCsv.StructVersion then return end | |
100 | + if not STRUCT_VERSION or curVersion >= STRUCT_VERSION then return end | |
73 | 101 | |
74 | 102 | local jumpVersion = {} |
75 | 103 | local versionTemp = {} |
76 | - for version = curVersion + 1, globalCsv.StructVersion do | |
104 | + for version = curVersion + 1, STRUCT_VERSION do | |
77 | 105 | local versionData = versionList[version] |
78 | 106 | if versionData then |
79 | 107 | if versionData[1].vType == VersionType.DoOnly then |
... | ... | @@ -106,7 +134,7 @@ function RoleChangeStruct.bind(Role) |
106 | 134 | end |
107 | 135 | end |
108 | 136 | |
109 | - for version = curVersion + 1, globalCsv.StructVersion do | |
137 | + for version = curVersion + 1, STRUCT_VERSION do | |
110 | 138 | if not jumpVersion[version] then |
111 | 139 | local versionData = versionList[version] |
112 | 140 | if versionData[1].vType == VersionType.DoOnly or versionData[1].vType == VersionType.Override then |
... | ... | @@ -116,7 +144,7 @@ function RoleChangeStruct.bind(Role) |
116 | 144 | end |
117 | 145 | end |
118 | 146 | end |
119 | - self:setProperty("sversion", globalCsv.StructVersion) | |
147 | + self:setProperty("sversion", STRUCT_VERSION) | |
120 | 148 | end |
121 | 149 | |
122 | 150 | end | ... | ... |
src/models/RoleLog.lua
... | ... | @@ -51,6 +51,12 @@ local ItemReason = { |
51 | 51 | actBattle = 135, -- 活动关卡 |
52 | 52 | actMilestone = 136, -- 活动关卡boss伤害里程碑 |
53 | 53 | worldBossReward = 137, -- 世界boss翻牌奖励 |
54 | + commonSign = 138, -- 每日活跃签到 | |
55 | + actFriendHelp = 139,-- 好友能量互助活动 | |
56 | + actBattleCommand = 140, -- 活动战令 | |
57 | + actBuyBpLevel = 141, -- 购买活动战令等级 | |
58 | + newSign = 142,-- 新的活动签到 | |
59 | + advLevelStage = 143, -- 拾荒活动阶段奖励 | |
54 | 60 | |
55 | 61 | |
56 | 62 | advHang = 301, -- 拾荒挂机 |
... | ... | @@ -92,6 +98,7 @@ local ItemReason = { |
92 | 98 | actPaySign = 1008, -- 活动付费签到 |
93 | 99 | calendaTask = 1009, -- 英雄帖 |
94 | 100 | actMilecrisis = 1010, -- 物资危机 |
101 | + battleCommandTask = 1011, -- 将军令任务 | |
95 | 102 | |
96 | 103 | -- 餐厅 |
97 | 104 | greenHourse = 1101, -- 食材获得 |
... | ... | @@ -122,6 +129,7 @@ local ItemReason = { |
122 | 129 | |
123 | 130 | -- pvp |
124 | 131 | pvpCHead = 1301, -- pvp 跨服竞技场头像 |
132 | + crossPvpBet = 1302, -- 竞猜 | |
125 | 133 | |
126 | 134 | --adv |
127 | 135 | chooseEvent = 1351, -- 冒险选择 |
... | ... | @@ -591,6 +599,7 @@ local LogType = { |
591 | 599 | guide = "common", |
592 | 600 | newdevice = "common", |
593 | 601 | cbback = "common", |
602 | + cheat = "common", | |
594 | 603 | |
595 | 604 | in_item = "common", |
596 | 605 | out_item = "common", |
... | ... | @@ -875,4 +884,4 @@ function RoleLog.bind(Role) |
875 | 884 | |
876 | 885 | |
877 | 886 | end |
878 | -return RoleLog | |
879 | 887 | \ No newline at end of file |
888 | +return RoleLog | ... | ... |
src/models/RolePlugin.lua
... | ... | @@ -131,7 +131,19 @@ function RolePlugin.bind(Role) |
131 | 131 | self:addItem(pms) |
132 | 132 | end |
133 | 133 | end, |
134 | + [ItemType.Potion] = function () | |
135 | + self:addPotion({id = itemId, count = count, notNotify = pms.notNotify, log = pms.log}) | |
136 | + end, | |
134 | 137 | } |
138 | + | |
139 | + if count > 0 then | |
140 | + local itemCfg = csvdb["itemCsv"][itemId] | |
141 | + local itemType = 0 | |
142 | + if itemCfg then | |
143 | + itemType = itemCfg.type | |
144 | + end | |
145 | + self:checkTaskEnter("AddItem", {id = itemId, count = count, type = itemType}) | |
146 | + end | |
135 | 147 | -- 对数量筛查 |
136 | 148 | count = checkItemCount(self, itemId, count) |
137 | 149 | if count ~= 0 then |
... | ... | @@ -286,10 +298,41 @@ function RolePlugin.bind(Role) |
286 | 298 | print("addPlayExp no log ", debug.traceback()) |
287 | 299 | end |
288 | 300 | |
289 | - self:updateProperties({level = level, exp = newExp}) | |
301 | + self:updateProperties({level = level, exp = newExp}, params.notNotify) | |
290 | 302 | self:changeCrossServerPvpSelfInfo("level") |
291 | 303 | end |
292 | 304 | |
305 | + function Role:addPotion(params) | |
306 | + dump(params) | |
307 | + local pId = globalCsv.adv_item_potion[params.id] | |
308 | + local potionBag = self:getProperty("potionBag") | |
309 | + local origin = potionBag[pId] or 0 | |
310 | + local nums = origin + params.count | |
311 | + potionBag[pId] = nums | |
312 | + | |
313 | + self:logItems(params.id, origin, nums, params.log) | |
314 | + if params.log then | |
315 | + local log = clone(params.log) | |
316 | + if log["cint1"] or log["cint2"] then | |
317 | + print("addItem error log have cint1 or cint2 ", debug.traceback()) | |
318 | + end | |
319 | + log["cint1"] = params.id | |
320 | + log["cint2"] = math.abs(params.count) | |
321 | + if params.count <= 0 then | |
322 | + self:mylog("out_item", log) | |
323 | + else | |
324 | + self:mylog("in_item", log) | |
325 | + end | |
326 | + else | |
327 | + print("addItem no log ", debug.traceback()) | |
328 | + end | |
329 | + | |
330 | + self:updateProperty({field = "potionBag", value = potionBag}) | |
331 | + if not params.notNotify then | |
332 | + SendPacket(actionCodes.Role_updateItems, MsgPack.pack({[params.id] = params.count})) | |
333 | + end | |
334 | + end | |
335 | + | |
293 | 336 | function Role:addItem(params) |
294 | 337 | params = params or {} |
295 | 338 | params.count = math.floor(params.count or 0) |
... | ... | @@ -387,7 +430,7 @@ function RolePlugin.bind(Role) |
387 | 430 | end |
388 | 431 | |
389 | 432 | if update then |
390 | - self:updateProperty({field = "boxL", value = boxL}) | |
433 | + self:updateProperty({field = "boxL", value = boxL, notNotify = pms.notNotify}) | |
391 | 434 | end |
392 | 435 | end |
393 | 436 | |
... | ... | @@ -399,7 +442,8 @@ function RolePlugin.bind(Role) |
399 | 442 | end |
400 | 443 | |
401 | 444 | function Role:getAllDiamond() |
402 | - return self:getProperty("diamond") + self:getProperty("reDiamond") | |
445 | + local diamond = self:getProperty("sid") == IOS_SID and self:getProperty("reDiamondIos") or self:getProperty("reDiamond") | |
446 | + return self:getProperty("diamond") + diamond | |
403 | 447 | end |
404 | 448 | |
405 | 449 | function Role:gainDiamond(params) |
... | ... | @@ -409,10 +453,14 @@ function RolePlugin.bind(Role) |
409 | 453 | return false |
410 | 454 | end |
411 | 455 | local origind = self:getProperty("diamond") |
412 | - local originr = self:getProperty("reDiamond") | |
456 | + local originr = self:getProperty("sid") == IOS_SID and self:getProperty("reDiamondIos") or self:getProperty("reDiamond") | |
413 | 457 | local origin = origind + originr |
414 | 458 | if params.isRecharge then |
415 | - self:incrProperty("reDiamond", count) | |
459 | + if params.sid == IOS_SID then | |
460 | + self:incrProperty("reDiamondIos", count) | |
461 | + else | |
462 | + self:incrProperty("reDiamond", count) | |
463 | + end | |
416 | 464 | else |
417 | 465 | self:incrProperty("diamond", count) |
418 | 466 | end |
... | ... | @@ -443,8 +491,9 @@ function RolePlugin.bind(Role) |
443 | 491 | if count <= 0 then |
444 | 492 | return false |
445 | 493 | end |
494 | + local isIos = self:getProperty("sid") == IOS_SID | |
446 | 495 | local origind = self:getProperty("diamond") |
447 | - local originr = self:getProperty("reDiamond") | |
496 | + local originr = isIos and self:getProperty("reDiamondIos") or self:getProperty("reDiamond") | |
448 | 497 | local origin = origind + originr |
449 | 498 | |
450 | 499 | if origin < 0 then |
... | ... | @@ -454,9 +503,9 @@ function RolePlugin.bind(Role) |
454 | 503 | return false |
455 | 504 | end |
456 | 505 | local last = count |
457 | - local costFirst = {"diamond", "reDiamond"} | |
506 | + local costFirst = isIos and {"diamond", "reDiamondIos"} or {"diamond", "reDiamond"} | |
458 | 507 | if params.isRecharge then |
459 | - costFirst = {"reDiamond", "diamond"} | |
508 | + costFirst = isIos and {"reDiamondIos", "diamond"} or {"reDiamond", "diamond"} | |
460 | 509 | end |
461 | 510 | last = math.max(last - self:getProperty(costFirst[1]), 0) |
462 | 511 | if last < count then |
... | ... | @@ -481,6 +530,8 @@ function RolePlugin.bind(Role) |
481 | 530 | end |
482 | 531 | |
483 | 532 | self:notifyUpdateProperty("diamond", self:getAllDiamond()) |
533 | + | |
534 | + self:checkTaskEnter("CostDiamond", {count = count}) | |
484 | 535 | return true |
485 | 536 | end |
486 | 537 | |
... | ... | @@ -804,9 +855,16 @@ function RolePlugin.bind(Role) |
804 | 855 | return runeSet |
805 | 856 | end |
806 | 857 | |
807 | - function Role:getAdvData() | |
858 | + function Role:getAdvData(notNotify) | |
808 | 859 | if not self.advData then |
809 | 860 | self.advData = require("adv.Adv").new(self) |
861 | + local status, err = pcall(function() | |
862 | + self.advData:initByInfo() | |
863 | + end) | |
864 | + if not status then | |
865 | + self.advData:forceOver(notNotify, true) | |
866 | + skynet.error("getAdvData error adv initByInfo " .. err) | |
867 | + end | |
810 | 868 | end |
811 | 869 | return self.advData |
812 | 870 | end |
... | ... | @@ -830,7 +888,6 @@ function RolePlugin.bind(Role) |
830 | 888 | self:setProperty("heartWarning", heartWarning) |
831 | 889 | if heartWarning == 50 then |
832 | 890 | self:setBan(30, 1) --封禁 30天 |
833 | - self:sendGmMsg("server_accountBanned_inGame_1") | |
834 | 891 | return |
835 | 892 | end |
836 | 893 | if heartWarning < 50 and heartWarning % 5 == 0 then |
... | ... | @@ -843,21 +900,52 @@ function RolePlugin.bind(Role) |
843 | 900 | time = time or 0 |
844 | 901 | banType = banType or 0 |
845 | 902 | local now = skynet.timex() |
846 | - if time == 0 then | |
903 | + if time <= 0 then | |
847 | 904 | self:setProperty("banTime", 0) |
848 | 905 | self:setProperty("banType", 0) |
849 | 906 | self:setProperty("heartWarning", 0) |
850 | - | |
851 | 907 | self:mylog("role_action", {desc = "ban_rm"}) |
852 | 908 | else |
853 | - self:setProperty("banTime", now + 86400 * time) | |
909 | + self:sendGmMsg(globalCsv.ban_tips[banType] or globalCsv.ban_tips[0]) | |
910 | + self:setProperty("banTime", math.ceil(now + 86400 * time)) | |
854 | 911 | self:setProperty("banType", banType) |
855 | - self:mylog("role_action", {desc = "ban", int1 = time, int2 = banType}) | |
912 | + self:resetRank() | |
913 | + self:mylog("role_action", {desc = "ban", int1 = math.ceil(time), int2 = banType}) | |
856 | 914 | end |
857 | 915 | end |
858 | 916 | |
917 | + -- 清掉所有排行榜 | |
918 | + function Role:resetRank() | |
919 | + local roleId = self:getProperty("id") | |
920 | + redisproxy:pipelining(function (red) | |
921 | + red:zrem(RANK_TOWER, roleId) | |
922 | + for _, rk in pairs(RANK_ADV) do | |
923 | + red:zrem(rk, roleId) | |
924 | + end | |
925 | + for _, rk in pairs(RANK_DINER) do | |
926 | + red:zrem(rk, roleId) | |
927 | + end | |
928 | + for _, rk in pairs(RANK_PVP_COMMON_KEY) do | |
929 | + red:zrem(rk, roleId) | |
930 | + end | |
931 | + for _, rk in pairs(RANK_PVP_HIGHT_KEY) do | |
932 | + red:zrem(rk, roleId) | |
933 | + end | |
934 | + for _, ct in pairs(RANK_TYPE) do | |
935 | + red:zrem(RANK_COMMON .. ct, roleId) | |
936 | + end | |
937 | + end) | |
938 | + end | |
939 | + | |
859 | 940 | function Role:sendGmMsg(text, isNotKey) |
860 | 941 | SendPacket(actionCodes.Sys_maintainNotice, MsgPack.pack({ body = text, iskey = not isNotKey})) |
942 | + | |
943 | + local agent = datacenter.get("agent", self:getProperty("id")) | |
944 | + if agent then | |
945 | + skynet.timeout(50, function () | |
946 | + skynet.call(agent.gate_serv, "lua", "forcekick", agent.fd) | |
947 | + end) | |
948 | + end | |
861 | 949 | end |
862 | 950 | |
863 | 951 | -- function Role:getHeroActiveRelationData(heros) |
... | ... | @@ -1470,6 +1558,7 @@ function RolePlugin.bind(Role) |
1470 | 1558 | return function (now, role) |
1471 | 1559 | if name == "email" and role.sendMailFlag then |
1472 | 1560 | last_breath = now + sec |
1561 | + role.sendMailFlag = false | |
1473 | 1562 | return true |
1474 | 1563 | end |
1475 | 1564 | if now >= last_breath then |
... | ... | @@ -1505,8 +1594,15 @@ function RolePlugin.bind(Role) |
1505 | 1594 | end) |
1506 | 1595 | for _, data in ipairs(redret) do |
1507 | 1596 | local email = tarr2tab(data) |
1508 | - if tonum(email.createtime) > self:getProperty("ctime") | |
1509 | - and ( not email.mid or tonum(email.mid) == mid ) | |
1597 | + -- 0 需要判斷創角時間小於郵件創建時間 1 只需要在時間段內登陸即可領取 | |
1598 | + local delayType = tonum(email.delayType) | |
1599 | + local flag = false | |
1600 | + if delayType == 1 then | |
1601 | + flag = skynet.timex() > tonum(email.createtime) | |
1602 | + else | |
1603 | + flag = tonum(email.createtime) > self:getProperty("ctime") | |
1604 | + end | |
1605 | + if flag and ( not email.mid or tonum(email.mid) == mid ) | |
1510 | 1606 | and ( not email.endtime or tonum(email.endtime) > now )then |
1511 | 1607 | return true |
1512 | 1608 | end |
... | ... | @@ -1543,7 +1639,6 @@ function RolePlugin.bind(Role) |
1543 | 1639 | if table.pack(next(newReward))[2] >= divisionData.limit then |
1544 | 1640 | return true |
1545 | 1641 | end |
1546 | - | |
1547 | 1642 | end |
1548 | 1643 | |
1549 | 1644 | local events = {} |
... | ... | @@ -1596,8 +1691,34 @@ function RolePlugin.bind(Role) |
1596 | 1691 | self:updateProperty({field = "redp", value = redp}) |
1597 | 1692 | end |
1598 | 1693 | |
1694 | + -- 网页支付获取订单号 | |
1695 | + function Role:getPurchaseOrderByPlatform(params) | |
1696 | + local checkPlatform = { | |
1697 | + ["mycard"] = "mycard_product_id", | |
1698 | + } | |
1699 | + local pidField = checkPlatform[params.payMode or ""] | |
1700 | + if not pidField or not params.product_id or params.product_id == "" then | |
1701 | + return "no product" | |
1702 | + end | |
1703 | + | |
1704 | + for k , v in pairs(csvdb["shop_rechargeCsv"]) do | |
1705 | + if not v[pidField] then return "no product" end | |
1706 | + if v[pidField] == params.product_id then | |
1707 | + if v.twd * 100 ~= tonumber(params.money) then | |
1708 | + return "error money" | |
1709 | + end | |
1710 | + -- 发现需要的id | |
1711 | + local partnerOrderId = self:getPurchaseOrder(k, params.transactionId) | |
1712 | + if partnerOrderId == "" then | |
1713 | + return "no product" | |
1714 | + end | |
1715 | + return json.encode({order = partnerOrderId}) | |
1716 | + end | |
1717 | + end | |
1718 | + end | |
1719 | + | |
1599 | 1720 | -- 获取充值订单号 |
1600 | - function Role:getPurchaseOrder(rechargeId) | |
1721 | + function Role:getPurchaseOrder(rechargeId, transactionId) | |
1601 | 1722 | local roleId = self:getProperty("id") |
1602 | 1723 | local rechargeData = csvdb["shop_rechargeCsv"][rechargeId] |
1603 | 1724 | if not rechargeData then |
... | ... | @@ -1634,6 +1755,8 @@ function RolePlugin.bind(Role) |
1634 | 1755 | order = partnerOrderId, |
1635 | 1756 | rechargeId = rechargeId, |
1636 | 1757 | createTime = skynet.timex(), |
1758 | + transactionId = transactionId, | |
1759 | + sid = role:getProperty("sid"), | |
1637 | 1760 | }) |
1638 | 1761 | order:create() |
1639 | 1762 | -- 正在进行中的订单 缓存 |
... | ... | @@ -1664,8 +1787,12 @@ function RolePlugin.bind(Role) |
1664 | 1787 | |
1665 | 1788 | local rechargeId = orderObject:getProperty("rechargeId") |
1666 | 1789 | local dataSet = csvdb["shop_rechargeCsv"][rechargeId] |
1790 | + local sid = orderObject:getProperty("sid") | |
1667 | 1791 | |
1668 | 1792 | if orderObject:getProperty("finishTime") > 0 then |
1793 | + skynet.error(string.format("[recharge] is a finish order cpOrder: %s, platformOrder : %s, hadPlatformOrder: %s, id: %s, overTime : %s", | |
1794 | + partnerOrderStr, platformOrder, orderObject:getProperty("transactionId"), rechargeId, orderObject:getProperty("finishTime") | |
1795 | + )) | |
1669 | 1796 | return false, "finsh" |
1670 | 1797 | end |
1671 | 1798 | |
... | ... | @@ -1698,24 +1825,25 @@ function RolePlugin.bind(Role) |
1698 | 1825 | }) |
1699 | 1826 | end |
1700 | 1827 | |
1701 | - return true, rechargeId | |
1828 | + return true, rechargeId, sid | |
1702 | 1829 | end |
1703 | 1830 | |
1704 | 1831 | -- 充值 -- |
1705 | 1832 | --[[ |
1706 | 1833 | request.order = data.out_trade_no |
1707 | - request.amount = data.money / 100 | |
1834 | + request.amount = data.money | |
1708 | 1835 | request.game_money = data.game_money |
1709 | 1836 | request.product_id = data.product_id |
1710 | 1837 | request.pay_time = data.pay_time |
1711 | 1838 | request.transactionId = data.order_no |
1839 | + request.extension_info = data.extension_info | |
1840 | + request.is_mycard = 1 | |
1712 | 1841 | ]] |
1713 | 1842 | function Role:handlePurchase(params) |
1714 | 1843 | local roleId = self:getProperty("id") |
1715 | 1844 | local partnerOrderStr = params.order |
1716 | 1845 | |
1717 | - | |
1718 | - local status, back = self:updatePurchaseOrder(partnerOrderStr, params.transactionId, "finsh") | |
1846 | + local status, back, sid = self:updatePurchaseOrder(partnerOrderStr, params.transactionId, "finsh") | |
1719 | 1847 | if not status then |
1720 | 1848 | if back == "finsh" then |
1721 | 1849 | -- 订单已经处理 |
... | ... | @@ -1725,7 +1853,7 @@ function RolePlugin.bind(Role) |
1725 | 1853 | end |
1726 | 1854 | local rechargeId = back |
1727 | 1855 | local rechargeData = csvdb["shop_rechargeCsv"][rechargeId] |
1728 | - if rechargeData.rmb ~= tonumber(params.amount) then | |
1856 | + if (params.is_mycard and rechargeData.twd * 100 ~= tonumber(params.amount)) or (not params.is_mycard and rechargeData.rmb * 100 ~= tonumber(params.amount)) then | |
1729 | 1857 | skynet.error(string.format("[recharge] fake order: %s, roleId: %d, order: %s, rmb %s, get %s", |
1730 | 1858 | params.transactionId, roleId, partnerOrderStr, rechargeData.rmb, params.amount |
1731 | 1859 | )) |
... | ... | @@ -1737,9 +1865,13 @@ function RolePlugin.bind(Role) |
1737 | 1865 | transactionId = params.transactionId, |
1738 | 1866 | pay_time = params.pay_time, |
1739 | 1867 | order = partnerOrderStr, |
1868 | + sid = sid, | |
1740 | 1869 | }) |
1741 | 1870 | |
1742 | 1871 | if not status then |
1872 | + if params.extension_info == "mycard_web" then | |
1873 | + self:sendMail(MailId.MyCardBuy, nil, nil, {rechargeId}) | |
1874 | + end | |
1743 | 1875 | SendPacket(actionCodes.Store_ayncPurchaseRpc, MsgPack.pack({ order = partnerOrderStr, |
1744 | 1876 | result = "success", reward = reward})) |
1745 | 1877 | end |
... | ... | @@ -1770,10 +1902,10 @@ function RolePlugin.bind(Role) |
1770 | 1902 | rechargeF[id] = 1 |
1771 | 1903 | self:updateProperty({field = "rechargeF", value = rechargeF}) |
1772 | 1904 | end |
1773 | - self:gainDiamond({count = diamondCount, isRecharge = true, log = {desc = "recharge", int1 = id}}) | |
1905 | + self:gainDiamond({count = diamondCount, isRecharge = true, sid = params.sid, log = {desc = "recharge", int1 = id}}) | |
1774 | 1906 | elseif rechargeData.shop == 2 then --通行证商店 |
1775 | 1907 | reward, _ = self:award(rechargeData.itemFirst, {isRecharge = true, log = {desc = "recharge", int1 = id}}) |
1776 | - self.storeData:onBuyCard(rechargeData.type, rechargeData.time, rechargeData.id) | |
1908 | + self.storeData:onBuyCard(rechargeData.type, rechargeData.time, rechargeData.id, rechargeData.activity_id) | |
1777 | 1909 | elseif rechargeData.shop == 3 then -- 礼包商店 |
1778 | 1910 | reward, _ = self:award(rechargeData.itemFirst, {isRecharge = true, log = {desc = "recharge", int1 = id}}) |
1779 | 1911 | else |
... | ... | @@ -2013,6 +2145,15 @@ function RolePlugin.bind(Role) |
2013 | 2145 | return {list = list, rank = rank} |
2014 | 2146 | end |
2015 | 2147 | |
2148 | + function Role:addHeroFaith(heroId, exp) | |
2149 | + local hero = self.heros[heroId] | |
2150 | + if not hero then | |
2151 | + return | |
2152 | + end | |
2153 | + | |
2154 | + hero:addHeroFaith(exp) | |
2155 | + return hero:getProperty("faith") | |
2156 | + end | |
2016 | 2157 | |
2017 | 2158 | end |
2018 | 2159 | ... | ... |
src/models/RolePvp.lua
... | ... | @@ -9,7 +9,7 @@ local PVP_RANK_TIME_SORT_PRECISION = 360 -- 时间精度 每6分钟忽略差异 |
9 | 9 | local PVP_RANK_BASE_SCORE = globalCsv.pvp_base_score -- 初始积分 |
10 | 10 | |
11 | 11 | -- 匹配规则改为以排名来匹配 |
12 | -local PVP_GET_ROBOT_SCORE = 2400 -- 2400分以下低档位匹配机器人 | |
12 | +local PVP_GET_ROBOT_SCORE = 1300 -- 1300分以下低档位匹配机器人 | |
13 | 13 | local PRE_RANGE_COUNT = 20 -- 每个档位人数 |
14 | 14 | local NEED_MATCH = 3 --匹配到多少人 |
15 | 15 | |
... | ... | @@ -73,7 +73,7 @@ function Role:changePvpScoreCommon(matchId, isWin) |
73 | 73 | if isWin then |
74 | 74 | local scoreChange = math.ceil(60 / (1 + 10 ^ ((myScore - matchScore) / 400))) |
75 | 75 | myScore = myScore + scoreChange |
76 | - matchScore = matchScore - math.ceil(scoreChange / 3) -- 防守方失败时,扣分减为原来的1/3 | |
76 | + matchScore = matchScore - math.ceil(scoreChange / 3 * 2) -- 防守方失败时,扣分减为原来的2/3 | |
77 | 77 | else |
78 | 78 | local scoreChange = math.ceil(60 / (1 + 10 ^ ((matchScore - myScore) / 400))) |
79 | 79 | myScore = myScore - scoreChange |
... | ... | @@ -139,7 +139,7 @@ function Role:changePvpScoreHigh(matchId, isWin) |
139 | 139 | if isWin then |
140 | 140 | local scoreChange = math.ceil(50 / (1 + 10 ^ ((myScore - matchScore) / 1000))) |
141 | 141 | myScore = myScore + scoreChange |
142 | - matchScore = matchScore - math.ceil(scoreChange / 3) -- 防守方失败时,扣分减为原来的1/3 | |
142 | + matchScore = matchScore - math.ceil(scoreChange / 3 * 2) -- 防守方失败时,扣分减为原来的2/3 | |
143 | 143 | else |
144 | 144 | local scoreChange = math.ceil(50 / (1 + 10 ^ ((matchScore - myScore) / 1000))) |
145 | 145 | myScore = myScore - scoreChange |
... | ... | @@ -521,7 +521,7 @@ function Role:changeCrossServerPvpSelfInfo(cType) |
521 | 521 | change[cType] = self:getProperty(cType) |
522 | 522 | elseif cType == "format" then |
523 | 523 | -- 是否过了时间 |
524 | - local crossTime = skynet.timex() - self:getTimeResetStartTime(TimeReset.PvpCross) | |
524 | + local crossTime = skynet.timex() - self:getTimeResetStartTime(TimeReset.PvpCross) + RESET_TIME * 3600 | |
525 | 525 | local aday = 3600 * 24 |
526 | 526 | local day = math.ceil(crossTime / aday) -- 当前是第几个比赛日 |
527 | 527 | local ctime = crossTime % aday -- 当前在本天 经过多少时间 |
... | ... | @@ -530,7 +530,7 @@ function Role:changeCrossServerPvpSelfInfo(cType) |
530 | 530 | return |
531 | 531 | end |
532 | 532 | change.battleV = self:getProperty("pvpTBVH") |
533 | - change.heros = self:getProperty("pvpTSH") | |
533 | + change.team = self:getProperty("pvpTSH") | |
534 | 534 | change.battleInfo = self:getProperty("pvpTBH") |
535 | 535 | end |
536 | 536 | |
... | ... | @@ -615,7 +615,7 @@ end |
615 | 615 | |
616 | 616 | function Role:setCrossServerPvpBet(idx) |
617 | 617 | if not self:isTimeResetOpen(TimeReset.PvpCross) then return false , 1 end |
618 | - local crossTime = skynet.timex() - self:getTimeResetStartTime(TimeReset.PvpCross) | |
618 | + local crossTime = skynet.timex() - self:getTimeResetStartTime(TimeReset.PvpCross) + RESET_TIME * 3600 | |
619 | 619 | local aday = 3600 * 24 |
620 | 620 | local day = math.ceil(crossTime / aday) -- 当前是第几个比赛日 |
621 | 621 | local ctime = crossTime % aday -- 当前在本天 经过多少时间 | ... | ... |
src/models/RoleTask.lua
... | ... | @@ -15,6 +15,8 @@ local TaskType = { |
15 | 15 | HeroLvlCollect = 10, -- 英雄等级收集进度 |
16 | 16 | HeroQualityCollect = 11, -- 英雄品质收集进度 |
17 | 17 | HeroStarCollect = 12, -- 英雄星级收集进度 |
18 | + DrawHeroNotFriend = 13, -- 非友情招募 -- count | |
19 | + DrawHeroLimitPack = 14, -- 抽卡限时礼貌 -- count | |
18 | 20 | |
19 | 21 | --装备相关 |
20 | 22 | AddEquip = 101, -- 获得装备 - equipId rarity |
... | ... | @@ -34,6 +36,7 @@ local TaskType = { |
34 | 36 | HangBattle = 304, -- 挂机战斗 - id |
35 | 37 | HangGetGold = 305, -- 挂机获得齿轮 - count |
36 | 38 | BonusPass = 306, -- 奖励副本通关 - id count |
39 | + BonusQuick = 307, -- 奖励关卡扫荡 -- id count | |
37 | 40 | |
38 | 41 | -- 冒险相关 |
39 | 42 | AdvPass = 401, -- 冒险通过关 - id level score |
... | ... | @@ -50,6 +53,13 @@ local TaskType = { |
50 | 53 | AdvHang = 412, -- 代理拾荒次数 |
51 | 54 | AdvMineKill = 413, -- 宝藏怪击杀 |
52 | 55 | AdvMineLayer = 414, -- 宝藏洞激活 |
56 | + AdvKillBoss = 415, -- 拾荒击杀boss | |
57 | + AdvHangHeroCnt = 416, -- 拾荒人数 | |
58 | + AdvCostPower = 417, -- 消耗体力 | |
59 | + AdvPassFirst = 418, -- 冒险首次通关 - id | |
60 | + AdvUseItem = 419, -- 使用道具 - itemId count | |
61 | + AdvBuild = 420, -- 建筑交互 - buildId | |
62 | + AdvKill = 421, -- 拾荒击败敌人 | |
53 | 63 | |
54 | 64 | --爬塔相关 |
55 | 65 | TowerPass = 501, -- 爬塔通关 - level |
... | ... | @@ -91,6 +101,14 @@ local TaskType = { |
91 | 101 | SignIn = 901, -- 签到 |
92 | 102 | Pay = 902, -- 充值 |
93 | 103 | ShopAll = 903, -- 在任意商店购买 |
104 | + DailyTask = 904, -- 完成每日活跃任务 | |
105 | + RadioTaskStart = 905, -- 电台任务开始 | |
106 | + FinishSpeTask = 906, -- 指定任务完成 | |
107 | + AddItem = 907, -- 获得道具 | |
108 | + Login = 908, -- 登入 | |
109 | + CostDiamond = 909, -- 消耗钻石 | |
110 | + WeekTask = 910, -- 完成每周活跃任务 | |
111 | + ActBattlePass = 911, -- 活动关卡通关 -- chapterId | |
94 | 112 | |
95 | 113 | --功能未实现 todo |
96 | 114 | AdvShop = 1002, -- 冒险商城 |
... | ... | @@ -231,6 +249,8 @@ local ActivityListener = { |
231 | 249 | [TaskType.Pay] = {{Activity.ActivityType.PayBack, f("twd")}}, |
232 | 250 | [TaskType.AdvMineKill] = {{Activity.ActivityType.Crisis, 1}}, |
233 | 251 | [TaskType.AdvMineLayer] = {{Activity.ActivityType.Crisis, 2}}, |
252 | + [TaskType.DailyTask] = {{Activity.ActivityType.CommonSignIn, f("pre"), f("cur")}}, | |
253 | + [TaskType.AddItem] = {{Activity.ActivityType.BattleCommand, f("id"), f("count")}}, | |
234 | 254 | } |
235 | 255 | } |
236 | 256 | |
... | ... | @@ -240,8 +260,9 @@ local StoreListener = { |
240 | 260 | [TaskType.HangPass] = {{TriggerEventType.HangPass, f("id")}}, |
241 | 261 | [TaskType.RoleLevelUp] = {{TriggerEventType.LevelUp, f("level")}}, |
242 | 262 | [TaskType.TowerPass] = {{TriggerEventType.TowerPass, f("level")}}, |
243 | - [TaskType.AdvPass] = {{TriggerEventType.AdvPass, f("id")}}, | |
263 | + [TaskType.AdvPassFirst] = {{TriggerEventType.AdvPass, f("id")}}, | |
244 | 264 | [TaskType.AddHero] = {{TriggerEventType.AddNewHero, f("heroType")}, {TriggerEventType.SSRCount, f("ssrCount")}}, |
265 | + [TaskType.DrawHeroLimitPack] = {{TriggerEventType.DrawHeroCnt, f("count")}}, | |
245 | 266 | } |
246 | 267 | } |
247 | 268 | |
... | ... | @@ -253,7 +274,7 @@ local CalendaTaskListener = { |
253 | 274 | [TaskType.AdvStart]= {{3, 1}}, |
254 | 275 | [TaskType.DinerLevelUp]= {{4, 2, f("level")}}, |
255 | 276 | [TaskType.HeroLvlCollect]= {{5, 3}}, -- x名y级英雄 |
256 | - [TaskType.AdvHang]= {{6, 1}}, ---- | |
277 | + [TaskType.AdvHang]= {{6, 3, f("actid")}}, ---- | |
257 | 278 | [TaskType.HeroQualityCollect]= {{7, 3}}, |
258 | 279 | [TaskType.OverOderTask]= {{8, 1}}, |
259 | 280 | [TaskType.VillageApply]= {{9, 1}}, |
... | ... | @@ -268,9 +289,35 @@ local CalendaTaskListener = { |
268 | 289 | [TaskType.HangGet]= {{18, 3, f("reward")}}, |
269 | 290 | [TaskType.RuneQualityCollect]= {{19, 3}}, |
270 | 291 | [TaskType.OpenBox]= {{20, 3, f("count"), f("quality")}}, |
292 | + [TaskType.RadioTaskStart] = {{21, 1}, {22, 3, f("heroCnt")}}, | |
293 | + [TaskType.BonusQuick] = {{23, 1, f("count")}}, | |
294 | + [TaskType.AdvHangHeroCnt] = {{24, 3, f("count")}}, | |
295 | + [TaskType.AdvKillBoss] = {{25, 1}}, | |
296 | + [TaskType.AdvMineKill] = {{26, 1}}, | |
297 | + [TaskType.PvpBattle] = {{27, 1}}, | |
298 | + [TaskType.FinishSpeTask] = {{28, 3, f("taskId"), f("actId")}}, | |
299 | + [TaskType.Login] = {{29, 1}}, | |
300 | + [TaskType.DailyTask] = {{30, 2, f("cur")}}, | |
301 | + [TaskType.WeekTask] = {{31, 2, f("cur")}}, | |
302 | + [TaskType.MakeFood] = {{32, 1, f("count")}}, | |
303 | + [TaskType.AddItem] = {{33, 3, f("type"), f("count")}, {42, 3, f("id"), f("count")}}, | |
304 | + [TaskType.CostDiamond] = {{34, 1, f("count")}}, | |
305 | + [TaskType.DrawHeroNotFriend] = {{35, 1, f("count")}}, | |
306 | + [TaskType.AdvCostPower] = {{36, 1, f("count")}}, | |
307 | + | |
308 | + [TaskType.AdvUseItem] = {{37, 3, f("itemId"), f("count")}}, | |
309 | + [TaskType.AdvBuild] = {{38, 3, f("buildId")}}, | |
310 | + [TaskType.AdvKill] = {{39, 1, f("chapterId")}}, | |
311 | + [TaskType.ActBattlePass] = {{40, 3, f("chapterId")}}, | |
312 | + [TaskType.AdvPass] = {{41, 3, f("id")}}, | |
271 | 313 | } |
272 | 314 | } |
273 | 315 | |
316 | +local BattleCommandTaskListener = { | |
317 | + func = "checkBattleCommandTask", | |
318 | + listen = CalendaTaskListener["listen"] | |
319 | +} | |
320 | + | |
274 | 321 | local TaskListeners = { |
275 | 322 | StoryListener, |
276 | 323 | CommonListener, |
... | ... | @@ -279,6 +326,7 @@ local TaskListeners = { |
279 | 326 | ActivityListener, |
280 | 327 | StoreListener, |
281 | 328 | CalendaTaskListener, |
329 | + BattleCommandTaskListener, | |
282 | 330 | } |
283 | 331 | |
284 | 332 | local RoleTask = {} |
... | ... | @@ -606,16 +654,8 @@ function RoleTask.bind(Role) |
606 | 654 | self.storeData:OnTriggerLimitTimePack(triggerType, param) |
607 | 655 | end |
608 | 656 | |
609 | - function Role:checkCalendaTask(notNotify, mainType, subType, param1, param2) | |
610 | - --print("check calenda taskl", mainType, subType, param1, param2) | |
611 | - if not self.activity then return end | |
612 | - local open, actId = self.activity:isOpen("CalendaTask") | |
613 | - local actData = csvdb["activity_ctrlCsv"][actId] | |
614 | - if not actData then return end | |
615 | - if not open then return end | |
616 | - | |
617 | - local change = false | |
618 | - local calTask = self:getProperty("calTask") or {} | |
657 | + function Role:checkActTask(notNotify, keyName, actData, mainType, subType, param1, param2) | |
658 | + local calTask = self:getProperty(keyName) or {} | |
619 | 659 | param1 = param1 or 1 |
620 | 660 | |
621 | 661 | local cid = actData.condition |
... | ... | @@ -690,7 +730,7 @@ function RoleTask.bind(Role) |
690 | 730 | calTask[id] = count |
691 | 731 | elseif cfg.type == 20 then -- 开启x品质时钟箱子 |
692 | 732 | if cfg.condition2 <= (param2 or 0) then |
693 | - calTask[id] = (calTask[id] or 0) + param2 | |
733 | + calTask[id] = (calTask[id] or 0) + param1 | |
694 | 734 | end |
695 | 735 | elseif cfg.type == 15 then -- 通关关卡 |
696 | 736 | if (calTask[id] or 0) == 0 then |
... | ... | @@ -700,16 +740,90 @@ function RoleTask.bind(Role) |
700 | 740 | calTask[id] = 1 |
701 | 741 | end |
702 | 742 | end |
743 | + elseif cfg.type == 22 then -- 电台任务出勤人数 | |
744 | + calTask[id] = (calTask[id] or 0) + (param1 or 0) | |
745 | + elseif cfg.type == 24 then -- 代理拾荒出勤人数 | |
746 | + calTask[id] = (calTask[id] or 0) + (param1 or 0) | |
747 | + elseif cfg.type == 28 then -- 完成指定任务 | |
748 | + --print(actId,param2, cfg.condition2, param1) | |
749 | + if actData.id == param2 and cfg.condition2 == param1 then | |
750 | + calTask[id] = (calTask[id] or 0) + 1 | |
751 | + end | |
752 | + elseif cfg.type == 33 then -- 获得指定类型道具多少个 | |
753 | + if cfg.condition2 == param1 then | |
754 | + calTask[id] = (calTask[id] or 0) + (param2 or 0) | |
755 | + end | |
756 | + elseif cfg.type == 42 then -- 获得指定id道具多少个 | |
757 | + if cfg.condition2 == param1 then | |
758 | + calTask[id] = (calTask[id] or 0) + (param2 or 0) | |
759 | + end | |
760 | + elseif cfg.type == 6 then -- 代理拾荒次数 | |
761 | + if cfg.condition2 == 0 or (cfg.condition2 == 1 and param1) then | |
762 | + calTask[id] = (calTask[id] or 0) + 1 | |
763 | + end | |
764 | + elseif cfg.type == 37 then -- 拾荒使用道具 | |
765 | + if cfg.condition2 == param1 then | |
766 | + calTask[id] = (calTask[id] or 0) + (param2 or 0) | |
767 | + end | |
768 | + elseif cfg.type == 38 then -- 和指定建筑交互 | |
769 | + local condArr = cfg.condition3:toArray(true, "=") | |
770 | + for i = 0, #condArr do | |
771 | + if condArr[i] == param1 then | |
772 | + calTask[id] = (calTask[id] or 0) + 1 | |
773 | + break | |
774 | + end | |
775 | + end | |
776 | + elseif cfg.type == 39 then -- 拾荒特定章节消灭敌人 | |
777 | + local condArr = cfg.condition3:toArray(true, "=") | |
778 | + for i = 0, #condArr do | |
779 | + if condArr[i] == param1 then | |
780 | + calTask[id] = (calTask[id] or 0) + 1 | |
781 | + break | |
782 | + end | |
783 | + end | |
784 | + elseif cfg.type == 40 then -- 指定活动关卡通关 | |
785 | + if cfg.condition2 == param1 then | |
786 | + calTask[id] = (calTask[id] or 0) + 1 | |
787 | + end | |
788 | + elseif cfg.type == 41 then -- 通关拾荒指定关卡 | |
789 | + if cfg.condition2 == param1 then | |
790 | + calTask[id] = (calTask[id] or 0) + 1 | |
791 | + end | |
703 | 792 | end |
704 | 793 | end |
705 | 794 | end |
706 | 795 | end |
707 | 796 | end |
708 | 797 | end |
709 | - self:updateProperty({field = "calTask", value = calTask, notNotify = notNotify}) | |
710 | - --dump(calTask) | |
798 | + self:updateProperty({field = keyName, value = calTask, notNotify = notNotify}) | |
799 | + end | |
800 | + | |
801 | + function Role:checkCalendaTask(notNotify, mainType, subType, param1, param2) | |
802 | + --print("check calenda task", mainType, subType, param1, param2) | |
803 | + local actEnum = "CalendaTask" | |
804 | + local keyName = "calTask" | |
805 | + if not self.activity then return end | |
806 | + local open, actId = self.activity:isOpen(actEnum) | |
807 | + local actData = csvdb["activity_ctrlCsv"][actId] | |
808 | + if not actData then return end | |
809 | + if not open then return end | |
810 | + | |
811 | + self:checkActTask(notNotify, keyName, actData, mainType, subType, param1, param2) | |
812 | + end | |
813 | + | |
814 | + function Role:checkBattleCommandTask(notNotify, mainType, subType, param1, param2) | |
815 | + --print("check battle command task", mainType, subType, param1, param2) | |
816 | + local actEnum = "BattleCommandTask" | |
817 | + local keyName = "bcTask" | |
818 | + if not self.activity then return end | |
819 | + local open, actId = self.activity:isOpen(actEnum) | |
820 | + local actData = csvdb["activity_ctrlCsv"][actId] | |
821 | + if not actData then return end | |
822 | + if not open then return end | |
823 | + | |
824 | + self:checkActTask(notNotify, keyName, actData, mainType, subType, param1, param2) | |
711 | 825 | end |
712 | 826 | |
713 | 827 | end |
714 | 828 | |
715 | -return RoleTask | |
716 | 829 | \ No newline at end of file |
830 | +return RoleTask | ... | ... |
src/models/RoleTimeReset.lua
... | ... | @@ -5,6 +5,7 @@ RoleTimeReset.bind = function (Role) |
5 | 5 | -- 重置内容 对应 GlobalVar TimeReset |
6 | 6 | local ResetFunc = {} |
7 | 7 | ResetFunc["CrossDay"] = function(self, notify, response, now) |
8 | + self:setProperty("dTask", {}) | |
8 | 9 | self.activity:checkActivityStatus(now, true, notify) |
9 | 10 | |
10 | 11 | self.dailyData:refreshDailyData(notify) |
... | ... | @@ -12,7 +13,6 @@ ResetFunc["CrossDay"] = function(self, notify, response, now) |
12 | 13 | self.activity:refreshDailyData(notify) |
13 | 14 | self.storeData:onCrossDay() |
14 | 15 | |
15 | - self:setProperty("dTask", {}) | |
16 | 16 | self:incrProperty("lday", 1) |
17 | 17 | self:advRandomSupportEffect(not notify) |
18 | 18 | |
... | ... | @@ -23,6 +23,11 @@ ResetFunc["CrossDay"] = function(self, notify, response, now) |
23 | 23 | end |
24 | 24 | self:setProperty("advMine", advMine) |
25 | 25 | |
26 | + local ltime = self:getProperty("ltime") | |
27 | + if isCrossMonth(ltime, now) then | |
28 | + self.storeData:resetStoreReored(3) --商店跨月重置 time_reset表关联id | |
29 | + end | |
30 | + | |
26 | 31 | response.dTask = {} |
27 | 32 | response.advSup = self:getProperty("advSup") |
28 | 33 | self:log("onLogin") |
... | ... | @@ -41,13 +46,8 @@ ResetFunc["CrossWeek"] = function(self, notify, response) |
41 | 46 | |
42 | 47 | response.wTask = {} |
43 | 48 | response.dinerS = {} |
44 | -end | |
45 | 49 | |
46 | -ResetFunc["CrossMonth"] = function(self, notify, response) | |
47 | - local ltime = self:getProperty("ltime") | |
48 | - if isCrossMonth(ltime, skynet.timex()) then | |
49 | - self.storeData:resetStoreReored(3) --商店跨月重置 time_reset表关联id | |
50 | - end | |
50 | + self.activity:refreshWeekData(notify) | |
51 | 51 | end |
52 | 52 | |
53 | 53 | |
... | ... | @@ -84,18 +84,19 @@ function Role:updateTimeReset(now, notify) |
84 | 84 | local resetMode = {} |
85 | 85 | |
86 | 86 | local response = {} |
87 | - for funcName, resetId in pairs(TimeReset) do | |
88 | - if needResetId[resetId] and ResetFunc[funcName] then | |
89 | - ResetFunc[funcName](self, notify, response, now) | |
90 | - resetMode[funcName] = true | |
91 | - end | |
92 | - if needResetId[resetId] then | |
93 | - -- 充值商城购买记录 | |
94 | - self.storeData:resetStoreReored(resetId) | |
87 | + for idx = 1, #TimeResetArray do | |
88 | + local funcName = TimeResetArray[idx] | |
89 | + local resetId = TimeReset[funcName] | |
90 | + if resetId then | |
91 | + if needResetId[resetId] and ResetFunc[funcName] then | |
92 | + ResetFunc[funcName](self, notify, response, now) | |
93 | + resetMode[funcName] = true | |
94 | + end | |
95 | 95 | end |
96 | 96 | end |
97 | 97 | |
98 | 98 | for resetId, round in pairs(needResetId) do |
99 | + self.storeData:resetStoreReored(resetId) | |
99 | 100 | timeReset[resetId] = round |
100 | 101 | end |
101 | 102 | self:setProperties({timeReset = timeReset, ltime = now}) | ... | ... |
src/models/Store.lua
... | ... | @@ -186,7 +186,7 @@ end |
186 | 186 | |
187 | 187 | |
188 | 188 | -- 购买通行证 |
189 | -function Store:onBuyCard(type, duration, id) | |
189 | +function Store:onBuyCard(type, duration, id, actid) | |
190 | 190 | local timeNow = skynet.timex() |
191 | 191 | if type == CardType.NormalMonthCard then |
192 | 192 | if self:isMonthCardExpire() then |
... | ... | @@ -221,6 +221,18 @@ function Store:onBuyCard(type, duration, id) |
221 | 221 | info["flag"] = 1 |
222 | 222 | bpInfo[index] = info |
223 | 223 | self:updateProperty({field = "bpInfo", value = bpInfo}) |
224 | + elseif type == CardType.ActBattleCommandCard then | |
225 | + if not self.owner.activity:isOpenById(actid, "ActShopGoods") then | |
226 | + return | |
227 | + end | |
228 | + local actCfg = csvdb["activity_ctrlCsv"][actid] | |
229 | + if not actCfg then return end | |
230 | + local actData = self.owner.activity:getActData("BattleCommand") or {} | |
231 | + actData["unlock"] = 1 | |
232 | + if actCfg.condition ~= 0 then | |
233 | + actData["lvl"] = (actData["lvl"] or 0) + actCfg.condition | |
234 | + end | |
235 | + self.owner.activity:updateActData("BattleCommand", actData) | |
224 | 236 | end |
225 | 237 | end |
226 | 238 | |
... | ... | @@ -363,6 +375,14 @@ function Store:OnTriggerLimitTimePack(eventType, param) |
363 | 375 | gift_id = rechargeCfg.id, --礼包ID |
364 | 376 | gift_name = rechargeCfg.title, --礼包名称 |
365 | 377 | }) |
378 | + -- 每日抽卡限时礼包 触发重置 | |
379 | + if eventType == TriggerEventType.DrawHeroCnt then | |
380 | + local payR = self:getProperty("payR") | |
381 | + if payR[rechargeCfg.id] then | |
382 | + payR[rechargeCfg.id] = nil | |
383 | + self:updateProperty({field = "payR", value = payR}) | |
384 | + end | |
385 | + end | |
366 | 386 | self:updateProperty({field = "limitTPack", value = limitPack}) |
367 | 387 | end |
368 | 388 | end | ... | ... |
src/services/globald.lua
... | ... | @@ -69,7 +69,8 @@ local function mailQuene() |
69 | 69 | "attachments", email.attachments, |
70 | 70 | "endtime", email.endTime, |
71 | 71 | "mid", email.mid, |
72 | - "timestamp", now | |
72 | + "timestamp", now, | |
73 | + "delayType", email.delayType | |
73 | 74 | ) |
74 | 75 | else |
75 | 76 | redisproxy:hmset(string_format("globalEmail:%s", gid), |
... | ... | @@ -80,7 +81,8 @@ local function mailQuene() |
80 | 81 | "content", email.content, |
81 | 82 | "attachments", email.attachments, |
82 | 83 | "endtime", email.endTime, |
83 | - "timestamp", now | |
84 | + "timestamp", now, | |
85 | + "delayType", email.delayType | |
84 | 86 | ) |
85 | 87 | end |
86 | 88 | end | ... | ... |
src/services/httpweb.lua
... | ... | @@ -41,8 +41,10 @@ local port = ... |
41 | 41 | port = tonumber(port) |
42 | 42 | |
43 | 43 | local key = "zhaolu1234dangge" |
44 | -local function response(id, ...) | |
45 | - local ok, err = httpd.write_response(sockethelper.writefunc(id), ...) | |
44 | +local function response(id, code, body) | |
45 | + local ok, err = httpd.write_response(sockethelper.writefunc(id), code, body, { | |
46 | + ["Connection"] = "Close", | |
47 | + }) | |
46 | 48 | if not ok then |
47 | 49 | -- if err == sockethelper.socket_error , that means socket closed. |
48 | 50 | skynet.error(string.format("fd = %d, %s", id, err)) | ... | ... |
src/services/pvpd.lua
... | ... | @@ -84,7 +84,7 @@ function CMD.updateRoleInfo(change) |
84 | 84 | CMD.refreshRoleInfo(change) |
85 | 85 | local pvpd = cluster.query("center", "pvpd") |
86 | 86 | if pvpd then |
87 | - pcall(cluster.call, "center", pvpd, "updateRoleInfo", change) | |
87 | + pcall(cluster.send, "center", pvpd, "updateRoleInfo", change) | |
88 | 88 | end |
89 | 89 | end |
90 | 90 | |
... | ... | @@ -92,7 +92,7 @@ local function getDayAndTime() |
92 | 92 | local startTime = getStartTime() |
93 | 93 | local now = skynet.timex() |
94 | 94 | |
95 | - local crossTime = now - startTime | |
95 | + local crossTime = now - startTime + RESET_TIME * 3600 | |
96 | 96 | local aday = 3600 * 24 |
97 | 97 | local day = math.ceil(crossTime / aday) -- 当前是第几个比赛日 |
98 | 98 | local ctime = crossTime % aday -- 当前在本天 经过多少时间 | ... | ... |
src/utils/CommonFunc.lua
... | ... | @@ -100,7 +100,7 @@ end |
100 | 100 | -- 判断是不是同一个月 |
101 | 101 | function isCrossMonth(target, now) |
102 | 102 | now = now or skynet.timex() |
103 | - local tarTm = os.date("*t", target) | |
103 | + local tarTm = os.date("*t", target - RESET_TIME * 3600) | |
104 | 104 | local nowTm = os.date("*t", now - RESET_TIME * 3600) |
105 | 105 | if tarTm.year == nowTm.year and tarTm.month == nowTm.month then |
106 | 106 | return false | ... | ... |