DevilSquare_1.lua 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573
  1. --恶魔广场副本
  2. DevilSquare = {}
  3. -- @description 客户端请求面板数据
  4. -- @param 玩家对象;请求参数
  5. -- @return
  6. function DevilSquare.ReqGetPanelInfo(actor, msgData)
  7. local configId = tonumber(msgData)
  8. if configId == nil or configId <= 0 then
  9. error("DevilSquare.ReqGetPanelInfo param is wrong", msgData)
  10. return
  11. end
  12. local activityId = ConfigDataManager.getTableValue("cfg_rep", "type", "id", configId)
  13. local leftCount = getleftcountofactivity(actor, activityId)
  14. local activityInfo = getactivityinfo(activityId)
  15. local isOpen = activityInfo["open"]
  16. local nextOpenTime
  17. if isOpen then
  18. nextOpenTime = activityInfo["closetime"]
  19. else
  20. nextOpenTime = activityInfo["nextopentime"]
  21. end
  22. local resInfo = { configId, leftCount, isOpen, tostring(nextOpenTime) }
  23. sendluamsg(actor, LuaMessageIdToClient.RES_DEVIL_SQUARE_PANEL, resInfo)
  24. end
  25. -- @description 请求进入恶魔广场
  26. -- @param 玩家对象;cfg_rep的id
  27. -- @return
  28. function DevilSquare.ReqEnterDevilSquare(actor, configId)
  29. --是否组队,组队需要拉队友
  30. local personal = true
  31. local teamId = getbaseinfo(actor, "teamid")
  32. teamId = tostring(teamId)
  33. if teamId ~= "0" then
  34. local teamInfo = getteaminfo(actor, teamId)
  35. local size = #teamInfo["allteammemberinfo"]
  36. if size > 1 then
  37. personal = false
  38. end
  39. end
  40. if personal == false then
  41. --组队进入
  42. DuplicateCommon.CallTeamMembersPrepare(actor, configId)
  43. else
  44. --个人进入
  45. if DuplicateCommon.CheckEnterConditonCommon(actor, configId) ~= EnterLimitResultConst.ALLOW then
  46. return
  47. end
  48. --寻找是否有可进入的副本,如果没有创建副本
  49. local mapId = DuplicateCommon.FindEnterableDupCommon(configId, 1)
  50. local x, y = DuplicateCommon.GetEnterPointXYCommon(configId)
  51. if mapId == 0 then
  52. mapId = DuplicateCommon.CreateDupMapCommon(actor, configId, true)
  53. end
  54. --回蓝回血
  55. DuplicateCommon.RecoverHPMP(memberActor)
  56. DevilSquare.PlayerEnterDevilSquare(actor, mapId, x, y, configId)
  57. end
  58. end
  59. -- @description 组队进入副本
  60. -- @param 玩家对象;队伍id;副本配置
  61. -- @return
  62. function DevilSquare.DoTeamEnter(actor, teamId, configId)
  63. local teamInfo = getteaminfo(actor, teamId)
  64. local members = teamInfo["allteammemberinfo"]
  65. for index, memberInfo in ipairs(members) do
  66. local memberId = memberInfo["rid"]
  67. local memberActor = getactor(actor, memberId)
  68. local check = DuplicateCommon.CheckEnterConditonCommon(memberActor, configId)
  69. if check ~= EnterLimitResultConst.ALLOW then
  70. error("组队进入成员条件不满足" .. memberId)
  71. return
  72. end
  73. end
  74. local memberActors = {}
  75. --扣除次数;扣除道具
  76. for index, memberInfo in ipairs(members) do
  77. local memberId = memberInfo["rid"]
  78. local memberActor = getactor(actor, memberId)
  79. DevilSquare.RemoveItemBeforeEnter(memberActor, configId)
  80. table.insert(memberActors, memberActor)
  81. --回蓝回血
  82. DuplicateCommon.RecoverHPMP(memberActor)
  83. end
  84. --组队进入
  85. local size = #members
  86. --寻找是否有可进入的副本,如果没有创建副本
  87. local mapId = DuplicateCommon.FindEnterableDupCommon(configId, size)
  88. local x, y = DuplicateCommon.GetEnterPointXYCommon(configId)
  89. if mapId == 0 then
  90. mapId = DuplicateCommon.CreateDupMapCommon(actor, configId, true)
  91. end
  92. enterduplicate(actor, mapId, x, y, memberActors)
  93. end
  94. -- @description 进入副本扣除次数和道具
  95. -- @param
  96. -- @return
  97. function DevilSquare.RemoveItemBeforeEnter(actor, configId)
  98. -- 扣除次数
  99. local activityId = ConfigDataManager.getTableValue("cfg_rep", "type", "id", configId)
  100. reduceactivitytimes(actor, activityId)
  101. -- 扣除道具
  102. local itemConfig = ConfigDataManager.getTableValue("cfg_rep", "itemId", "id", configId)
  103. local itemArr = {}
  104. if itemConfig == "" then
  105. elseif string.contains(itemConfig, "|") then
  106. local tmpItemArr = string.split(itemConfig, "|")
  107. for i,tmpItemStr in ipairs(tmpItemArr) do
  108. local tmpItem = string.split(tmpItemStr, "#")
  109. itemArr[i] = tmpItem
  110. end
  111. else
  112. local tmpItem = string.split(itemConfig, "#")
  113. itemArr[1] = tmpItem
  114. end
  115. for i = 1, #itemArr do
  116. local itemData = itemArr[#itemArr - i + 1]
  117. local result = removeitemfrombag(actor, itemData[1], itemData[2], 0, 9999, '恶魔广场')
  118. if result then
  119. break
  120. end
  121. end
  122. -- local itemMap = string.toIntIntMap(itemConfig, "#", "|")
  123. -- for key, value in pairs(itemMap) do
  124. -- removeitemfrombag(actor, key, value, 0, 9999, '恶魔广场')
  125. -- end
  126. end
  127. -- @description 玩家传送进副本
  128. -- @param 玩家对象;地图id;x坐标;y坐标;cfg_rep的id
  129. -- @return
  130. function DevilSquare.PlayerEnterDevilSquare(actor, mapId, x, y, configId)
  131. -- 扣除次数
  132. local activityId = ConfigDataManager.getTableValue("cfg_rep", "type", "id", configId)
  133. local leftTimes = getleftcountofactivity(actor, activityId)
  134. -- 判断次数是否足够,足够则扣次数,不够则扣除背包的活动次数道具
  135. if leftTimes > 0 then
  136. reduceactivitytimes(actor, activityId)
  137. else
  138. local result = removeitemfrombag(actor, 50010115, 1, 0, 9999, '恶魔广场')
  139. if not result then
  140. return
  141. end
  142. end
  143. -- 扣除道具
  144. local itemConfig = ConfigDataManager.getTableValue("cfg_rep", "itemId", "id", configId)
  145. local itemArr = {}
  146. if itemConfig == "" then
  147. elseif string.contains(itemConfig, "|") then
  148. local tmpItemArr = string.split(itemConfig, "|")
  149. for i,tmpItemStr in ipairs(tmpItemArr) do
  150. local tmpItem = string.split(tmpItemStr, "#")
  151. itemArr[i] = tmpItem
  152. end
  153. else
  154. local tmpItem = string.split(itemConfig, "#")
  155. itemArr[1] = tmpItem
  156. end
  157. for i = 1, #itemArr do
  158. local itemData = itemArr[#itemArr - i + 1]
  159. local result = removeitemfrombag(actor, itemData[1], itemData[2], 0, 9999, '恶魔广场')
  160. if result then
  161. break
  162. end
  163. end
  164. -- local itemMap = string.toIntIntMap(itemConfig, "#", "|")
  165. -- for key, value in pairs(itemMap) do
  166. -- removeitemfrombag(actor, key, value, 0, 9999, '恶魔广场')
  167. -- end
  168. enterduplicate(actor, mapId, x, y)
  169. end
  170. --恶魔广场阶段更新
  171. function DevilSquare.DevilSquareStateUpdate(system, id, state, nextStateStartTime, configId)
  172. if state == DuplicateState.PREPARE then
  173. --准备阶段,等待满人开启,发给客户端下次开启时间
  174. -- 初始化副本数据
  175. DevilSquare.InitDupDataDevilSquare(id)
  176. elseif state == DuplicateState.FIGHT then
  177. --战斗阶段,刷怪
  178. local monsterId = ConfigDataManager.getTableValue("cfg_rep", "monster", "id", configId)
  179. local durationTime = ConfigDataManager.getTableValue("cfg_rep", "continuous", "id", configId)
  180. durationTime = tonumber(durationTime)
  181. setenvirvar(id, DuplicateVarConst.DEVIL_SQUARE_STATE, 1)
  182. setenvirvar(id, DuplicateVarConst.DEVIL_SQUARE_STATE_NEXT_TIME, nextStateStartTime - durationTime * 1000)
  183. DevilSquare.GenMonsterDevilSquare(id, monsterId)
  184. DevilSquare.ResAllPlayCurrencyStateInfo(id)
  185. DevilSquare.ResAllPlayDupTaskUpdate(id)
  186. -- 做定时器刷新,监听波次状态
  187. local waveTime = ConfigDataManager.getTableValue("cfg_repMonster", "time", "id", monsterId)
  188. waveTime = tonumber(waveTime)
  189. local now = getbaseinfo("now")
  190. local delay = nextStateStartTime - durationTime * 1000 + waveTime * 1000 - now
  191. setenvirontimer(id, delay, 0, 1, "devilsquarestatetimeupdate", id)
  192. end
  193. end
  194. function devilsquarestatetimeupdate(system, mapId)
  195. local nextStartTime = getenvirvar(mapId, DuplicateVarConst.DEVIL_SQUARE_STATE_NEXT_TIME) or 0
  196. nextStartTime = tonumber(nextStartTime)
  197. if nextStartTime <= 0 then
  198. return
  199. end
  200. local genMonCfgId = getenvirvar(mapId, DuplicateVarConst.DEVIL_SQUARE_MONSTER_GEN_CONFIG) or 0
  201. local waveTime = ConfigDataManager.getTableValue("cfg_repMonster", "time", "id", genMonCfgId)
  202. waveTime = tonumber(waveTime)
  203. local curState = getenvirvar(mapId, DuplicateVarConst.DEVIL_SQUARE_STATE) or 1
  204. local now = getbaseinfo("now")
  205. if now >= nextStartTime + waveTime * 1000 * curState then
  206. --生成下一波怪
  207. local nextGenMonCfgId = ConfigDataManager.getTableValue("cfg_repMonster", "nextID", "id", genMonCfgId)
  208. DevilSquare.GenMonsterDevilSquare(mapId, nextGenMonCfgId)
  209. curState = curState + 1
  210. setenvirvar(mapId, DuplicateVarConst.DEVIL_SQUARE_STATE, curState)
  211. setenvirvar(mapId, DuplicateVarConst.DEVIL_SQUARE_STATE_KILL_COUNT, 0)
  212. DevilSquare.ResAllPlayDupTaskUpdate(mapId)
  213. end
  214. setenvirontimer(mapId, nextStartTime + waveTime * 1000 * curState - now, 0, 1, "devilSquareStateTimeUpdate", mapId)
  215. end
  216. -- @description 玩家进入副本后
  217. -- @param 玩家对象;地图id;副本阶段;下一阶段开始时间戳;配置id(cfg_rep的id)
  218. -- @return
  219. function DevilSquare.AfterPlayerEnterDevilSquare(actor, mapId, state, nextStateStartTime, configId)
  220. local dupInfo = getduplicate(mapId)
  221. local players = dupInfo["players"]
  222. local playerDupInfo = getplaydef(actor, DevilSquarePlayerConst.DEVIL_SQUARE_MAP_INFO)
  223. -- 是否是新进入的副本
  224. local newEnter = false
  225. if playerDupInfo == nil or playerDupInfo == "" then
  226. newEnter = true
  227. else
  228. local lastMapId = playerDupInfo[1]
  229. if mapId ~= lastMapId then
  230. newEnter = true
  231. end
  232. end
  233. if newEnter == true then
  234. -- 进入新的副本,初始化玩家变量
  235. playerDupInfo = { mapId, configId }
  236. setplaydef(actor, DevilSquarePlayerConst.DEVIL_SQUARE_MAP_INFO, playerDupInfo)
  237. setplaydef(actor, DevilSquarePlayerConst.KILL_MONSTER_COUNT, 0)
  238. setplaydef(actor, DevilSquarePlayerConst.KILL_MONSTER_EXP, 0)
  239. -- 如果是新副本,则添加定时器,如果准备阶段走完,则直接开启副本
  240. local now = getbaseinfo("now")
  241. setenvirontimer(mapId, nextStateStartTime - now, 0, 1, "devilsquarebattlestart", mapId)
  242. print("DevilSquare.AfterPlayerEnterDevilSquare 新副本,开启定时器,准备时间到后开启战斗", nextStateStartTime - now)
  243. end
  244. local maxCount = ConfigDataManager.getTableValue("cfg_repGlobal", "value", "id", RepGlobalConfig.PREPARE_MAX_COUNT)
  245. --阶段信息
  246. DevilSquare.ResCurrencyStateInfo(actor, mapId)
  247. -- 如果是准备阶段,判断人满立即开启
  248. if state == DuplicateState.PREPARE then
  249. local playerCount = #players
  250. if playerCount >= tonumber(maxCount) then
  251. setduplicatestate(mapId, SetDuplicateStateConst.TO_FIGHT)
  252. setenvirontimer(mapId, 0.1, 0, 1, "devilsquarebattlestateupdate", mapId)
  253. return
  254. end
  255. elseif state == DuplicateState.FIGHT then
  256. DevilSquare.ResDupTaskUpdate(actor, mapId)
  257. end
  258. end
  259. function devilsquarebattlestateupdate(system, mapId)
  260. DevilSquare.ResAllPlayCurrencyStateInfo(mapId)
  261. end
  262. function devilsquarebattlestart(system, mapId)
  263. setduplicatestate(mapId, SetDuplicateStateConst.TO_FIGHT)
  264. end
  265. -- @description 初始化副本数据
  266. -- @param 副本地图唯一id
  267. -- @return
  268. function DevilSquare.InitDupDataDevilSquare(mapId)
  269. --当前波次怪物击杀数量
  270. setenvirvar(mapId, DuplicateVarConst.DEVIL_SQUARE_STATE_KILL_COUNT, 0)
  271. end
  272. -- @description 刷怪
  273. -- @param 地图唯一id;刷怪表id
  274. -- @return
  275. function DevilSquare.GenMonsterDevilSquare(mapId, genMonCfgId)
  276. --战斗阶段才可以刷怪
  277. local dupInfo = getduplicate(mapId)
  278. if dupInfo["state"] ~= DuplicateState.FIGHT then
  279. return
  280. end
  281. -- info("恶魔广场清空怪物开始")
  282. --清空当前地图怪物
  283. local monsterInfoList = mapbossinfo(mapId)
  284. for key, monInfo in pairs(monsterInfoList) do
  285. local monId = monInfo["id"]
  286. local monster = getactor(monId, mapId)
  287. removemapobject(monster)
  288. end
  289. -- info("恶魔广场清空怪物结束")
  290. --储存当前刷怪配置
  291. setenvirvar(mapId, DuplicateVarConst.DEVIL_SQUARE_MONSTER_GEN_CONFIG, genMonCfgId)
  292. DuplicateCommon.DupGenMonsterCommon(mapId, genMonCfgId)
  293. end
  294. -- @description 击杀怪物
  295. -- @param 归属者;默认掉落经验;怪物配置id
  296. -- @return 经验值
  297. function DevilSquare.KillMonterInDevilSquare(actor, mapId, exp, monCfgId)
  298. -- 当前波次击杀的怪物
  299. local oldCount = getenvirvar(mapId, DuplicateVarConst.DEVIL_SQUARE_STATE_KILL_COUNT) or 0
  300. local newCount = oldCount + 1
  301. local genMonCfgId = getenvirvar(mapId, DuplicateVarConst.DEVIL_SQUARE_MONSTER_GEN_CONFIG) or 0
  302. local totalCount = ConfigDataManager.getTableValue("cfg_repMonster", "kill", "id", genMonCfgId)
  303. totalCount = tonumber(totalCount)
  304. local now = getbaseinfo("now")
  305. if totalCount > 0 and newCount >= totalCount then
  306. newCount = 0
  307. --生成下一波怪
  308. local nextGenMonCfgId = ConfigDataManager.getTableValue("cfg_repMonster", "nextID", "id", genMonCfgId)
  309. DevilSquare.GenMonsterDevilSquare(mapId, nextGenMonCfgId)
  310. local oldState = getenvirvar(mapId, DuplicateVarConst.DEVIL_SQUARE_STATE)
  311. local newState = oldState + 1
  312. setenvirvar(mapId, DuplicateVarConst.DEVIL_SQUARE_STATE, newState)
  313. local waveTime = ConfigDataManager.getTableValue("cfg_repMonster", "time", "id", genMonCfgId)
  314. setenvirvar(mapId, DuplicateVarConst.DEVIL_SQUARE_STATE_NEXT_TIME, now + waveTime * 1000)
  315. end
  316. setenvirvar(mapId, DuplicateVarConst.DEVIL_SQUARE_STATE_KILL_COUNT, newCount)
  317. -- 玩家击杀数量
  318. local killCount = getplaydef(actor, DevilSquarePlayerConst.KILL_MONSTER_COUNT)
  319. if killCount == nil or killCount <= 0 then
  320. killCount = 0
  321. end
  322. killCount = killCount + 1
  323. setplaydef(actor, DevilSquarePlayerConst.KILL_MONSTER_COUNT, killCount)
  324. end
  325. function DevilSquare.AddExp(actor, mapId, exp)
  326. -- 玩家杀怪经验
  327. -- local killExp = getplaydef(actor, DevilSquarePlayerConst.KILL_MONSTER_EXP)
  328. -- if killExp == nil or killExp <= 0 then
  329. -- killExp = 0
  330. -- end
  331. -- killExp = killExp + exp
  332. -- setplaydef(actor, DevilSquarePlayerConst.KILL_MONSTER_EXP, killExp)
  333. -- DevilSquare.ResAllPlayDupTaskUpdate(mapId)
  334. -- OpenServerCompetition.expCal(actor, exp)
  335. end
  336. -- @description 玩家副本结算
  337. -- @param 玩家对象;
  338. -- @return
  339. function DevilSquare.PlayerSettleMentDevilSquare(actor)
  340. -- 击杀怪物
  341. local killCount = getplaydef(actor, DevilSquarePlayerConst.KILL_MONSTER_COUNT)
  342. -- 获得经验
  343. local killExp = getplaydef(actor, DevilSquarePlayerConst.KILL_MONSTER_EXP)
  344. local playerDupInfo = getplaydef(actor, DevilSquarePlayerConst.DEVIL_SQUARE_MAP_INFO)
  345. local configId = playerDupInfo[2]
  346. local score, scoreExp = DevilSquare.CalcuScoreAndExp(configId)
  347. local totalScoreExp = killCount * score * scoreExp
  348. -- 经验加成
  349. totalScoreExp = Player.calculExpByAddRate(actor, totalScoreExp)
  350. -- 这里发放积分经验
  351. -- additemtobag(actor, ItemConfigId.EXP, totalScoreExp, 0, 9999, '恶魔广场')
  352. -- 活动剩余次数
  353. local leftCount = getleftcountofactivity(actor, DuplicateType.DEVIL_SQUARE)
  354. -- 发回给客户端
  355. local response = {}
  356. response["configId"] = configId --配置表id
  357. response["kill"] = killCount --击杀怪物数量
  358. response["killExp"] = killExp --击杀怪物掉落的经验
  359. response["scoreExp"] = totalScoreExp --积分经验
  360. response["leftCount"] = leftCount --剩余次数
  361. sendluamsg(actor, LuaMessageIdToClient.RES_DEVIL_SQUARE_SETTLEMENT, response)
  362. end
  363. -- @description 计算配置的积分及积分经验
  364. -- @param cfg_rep的id
  365. -- @return 积分,积分经验
  366. function DevilSquare.CalcuScoreAndExp(configId)
  367. local repLevel = ConfigDataManager.getTableValue("cfg_rep", "repLevel", "id", configId)
  368. repLevel = tonumber(repLevel)
  369. local configStr = ConfigDataManager.getTableValue("cfg_repGlobal", "value", "id", RepGlobalConfig.DEVIL_SQUARE_SCORE_EXP)
  370. local configList = string.split(configStr, "|")
  371. local score
  372. local scoreExp
  373. for index, value in ipairs(configList) do
  374. local valueList = string.split(value, "#")
  375. local configLevel = tonumber(valueList[1])
  376. if repLevel == configLevel then
  377. score = tonumber(valueList[2])
  378. scoreExp = tonumber(valueList[3])
  379. return score, scoreExp
  380. end
  381. end
  382. return 0, 0
  383. end
  384. -- @description 玩家进入任意地图事件
  385. -- @param 玩家对象;上一个地图配置id;当前地图配置id
  386. -- @return
  387. function DevilSquare.EnterAllMapDS(actor, lastMapCfgId, mapCfgId)
  388. -- 判断发送副本结算
  389. -- local dupInfo = getplaydef(actor, DevilSquarePlayerConst.DEVIL_SQUARE_MAP_INFO)
  390. -- if dupInfo == nil or dupInfo == "" then
  391. -- return
  392. -- end
  393. -- local devilSquareId = dupInfo[1]
  394. -- local mapId = getbaseinfo(actor, "unimapid")
  395. -- local mapInfo = getmapinfobyid(mapId)
  396. -- local isDup = mapInfo["isdup"]
  397. -- if isDup == true and devilSquareId ~= mapId then
  398. -- error("恶魔广场有未结算的奖励")
  399. -- DevilSquare.ClearPlayerDevilSquareDef(actor)
  400. -- return
  401. -- end
  402. -- if devilSquareId ~= mapId then
  403. -- -- 结算
  404. -- gameDebug.debug(LogManager.TriggerByType, actor, LogOpType.B_AND_D_CHALLENGE)
  405. -- DevilSquare.PlayerSettleMentDevilSquare(actor)
  406. -- end
  407. end
  408. -- @description 客户端请求领取奖励
  409. -- @param 玩家对象;领取倍数
  410. -- @return
  411. function DevilSquare.ReqReciveRewardDevilSquare(actor, multipleCount)
  412. -- multipleCount = tonumber(multipleCount)
  413. -- local dupInfo = getplaydef(actor, DevilSquarePlayerConst.DEVIL_SQUARE_MAP_INFO)
  414. -- if dupInfo == nil or dupInfo == "" then
  415. -- return
  416. -- end
  417. -- -- 经验
  418. -- local killExp = getplaydef(actor, DevilSquarePlayerConst.KILL_MONSTER_EXP)
  419. -- local killCount = getplaydef(actor, DevilSquarePlayerConst.KILL_MONSTER_COUNT)
  420. -- local configId = dupInfo[2]
  421. -- local score, scoreExp = DevilSquare.CalcuScoreAndExp(configId)
  422. -- local totalScoreExp = killCount * score * scoreExp
  423. -- totalScoreExp = Player.calculExpByAddRate(actor, totalScoreExp)
  424. -- -- 副本进度任务刷新
  425. -- DuplicateCommon.FinishDupActivity(actor, configId)
  426. -- if multipleCount <= 1 then
  427. -- -- 清空角色副本信息
  428. -- DevilSquare.ClearPlayerDevilSquareDef(actor)
  429. -- return
  430. -- end
  431. -- local cfgString = ConfigDataManager.getTableValue("cfg_repGlobal", "value", "id", RepGlobalConfig.DEVIL_SQUARE_MULTIPLE_REWARD)
  432. -- local cfgList = string.split(cfgString, "|")
  433. -- for index, value in ipairs(cfgList) do
  434. -- local valueList = string.split(value, "#")
  435. -- if multipleCount == tonumber(valueList[1]) then
  436. -- local costItemId = tonumber(valueList[2])
  437. -- local costItemCount = tonumber(valueList[3])
  438. -- local costActivityCount = tonumber(valueList[4])
  439. -- local activityId = ConfigDataManager.getTableValue("cfg_rep", "type", "id", configId)
  440. -- local leftCount = getleftcountofactivity(actor, activityId)
  441. -- if leftCount < costActivityCount then
  442. -- --tipinfo(actor, "次数不足")
  443. -- return
  444. -- end
  445. -- local ownCount = getbagitemcountbyid(actor, costItemId)
  446. -- if ownCount < costItemCount then
  447. -- --tipinfo(actor, "扣除道具不足")
  448. -- return
  449. -- end
  450. -- -- 扣除次数和道具
  451. -- reduceactivitytimes(actor, activityId, costActivityCount)
  452. -- removeitemfrombag(actor, costItemId, costItemCount, 0, 9999, '恶魔广场')
  453. -- -- 发放奖励
  454. -- local totalExp = killExp * (multipleCount - 1) + totalScoreExp * (multipleCount - 1)
  455. -- additemtobag(actor, ItemConfigId.EXP, totalExp, 0, 9999, '恶魔广场')
  456. -- -- 清空角色副本信息
  457. -- DevilSquare.ClearPlayerDevilSquareDef(actor)
  458. -- end
  459. -- end
  460. end
  461. -- @description 清除玩家在恶魔广场副本中的变量
  462. -- @param 玩家对象
  463. -- @return
  464. function DevilSquare.ClearPlayerDevilSquareDef(actor)
  465. setplaydef(actor, DevilSquarePlayerConst.DEVIL_SQUARE_MAP_INFO, "")
  466. setplaydef(actor, DevilSquarePlayerConst.KILL_MONSTER_COUNT, 0)
  467. setplaydef(actor, DevilSquarePlayerConst.KILL_MONSTER_EXP, 0)
  468. end
  469. -- @description 响应给客户端当前阶段
  470. -- @param 玩家对象;地图id
  471. -- @return
  472. function DevilSquare.ResCurrencyStateInfo(actor, mapId)
  473. local dupInfo = getduplicate(mapId)
  474. local state = dupInfo["state"]
  475. local configId = dupInfo["dupcfgid"]
  476. local nextStateStartTime = dupInfo["nextstatetime"]
  477. sendluamsg(actor, LuaMessageIdToClient.DEVIL_SQUARE_STATE, { state, tostring(nextStateStartTime), configId })
  478. end
  479. -- @description 通知地图所有玩家更新当前阶段
  480. -- @param 地图id
  481. -- @return
  482. function DevilSquare.ResAllPlayCurrencyStateInfo(mapId)
  483. local dupInfo = getduplicate(mapId)
  484. local players = dupInfo["players"]
  485. for index, actor in ipairs(players) do
  486. DevilSquare.ResCurrencyStateInfo(actor, mapId)
  487. end
  488. end
  489. -- @description 立即开启战斗
  490. -- @param 玩家对象;请求参数
  491. -- @return
  492. function DevilSquare.ChangeToFight(actor, msgData)
  493. local mapId = getbaseinfo(actor, "unimapid")
  494. setduplicatestate(mapId, SetDuplicateStateConst.TO_FIGHT)
  495. end
  496. -- @description 副本任务更新响应
  497. -- @param 玩家对象;副本id
  498. -- @return
  499. function DevilSquare.ResDupTaskUpdate(actor, mapId)
  500. local dupInfo = getduplicate(mapId)
  501. local configId = dupInfo["dupcfgid"]
  502. --波次
  503. local wave = getenvirvar(mapId, DuplicateVarConst.DEVIL_SQUARE_STATE) or 1
  504. --击杀数量
  505. local count = getenvirvar(mapId, DuplicateVarConst.DEVIL_SQUARE_STATE_KILL_COUNT) or 0
  506. --任务总数量
  507. local genMonCfgId = getenvirvar(mapId, DuplicateVarConst.DEVIL_SQUARE_MONSTER_GEN_CONFIG) or 0
  508. local totalCount = ConfigDataManager.getTableValue("cfg_repMonster", "kill", "id", genMonCfgId)
  509. local killCount = getplaydef(actor, DevilSquarePlayerConst.KILL_MONSTER_COUNT)
  510. --通关奖励
  511. local score, scoreExp = DevilSquare.CalcuScoreAndExp(configId)
  512. local totalScoreExp = killCount * score * scoreExp
  513. totalScoreExp = Player.calculExpByAddRate(actor, totalScoreExp)
  514. --击杀怪物积分
  515. local killScore = killCount * score
  516. local response = {}
  517. response["wave"] = wave
  518. response["nowCount"] = count
  519. response["totalCount"] = totalCount
  520. response["rewardCount"] = totalScoreExp
  521. response["score"] = killScore
  522. sendluamsg(actor, LuaMessageIdToClient.RES_DEVIL_SQUARE_TASK, response)
  523. end
  524. -- @description 通知地图所有玩家更新当前任务
  525. -- @param 副本id
  526. -- @return
  527. function DevilSquare.ResAllPlayDupTaskUpdate(mapId)
  528. local dupInfo = getduplicate(mapId)
  529. local players = dupInfo["players"]
  530. for index, actor in ipairs(players) do
  531. DevilSquare.ResDupTaskUpdate(actor, mapId)
  532. end
  533. end