DevilSquare.lua 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450
  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 itemMap = string.toIntIntMap(itemConfig, "#", "|")
  104. for key, value in pairs(itemMap) do
  105. removeitemfrombag(actor, key, value,0,9999,'恶魔广场')
  106. end
  107. end
  108. -- @description 玩家传送进副本
  109. -- @param 玩家对象;地图id;x坐标;y坐标;cfg_rep的id
  110. -- @return
  111. function DevilSquare.PlayerEnterDevilSquare(actor, mapId, x, y, configId)
  112. -- 扣除次数
  113. local activityId = ConfigDataManager.getTableValue("cfg_rep", "type", "id", configId)
  114. reduceactivitytimes(actor, activityId)
  115. -- 扣除道具
  116. local itemConfig = ConfigDataManager.getTableValue("cfg_rep", "itemId", "id", configId)
  117. local itemMap = string.toIntIntMap(itemConfig, "#", "|")
  118. for key, value in pairs(itemMap) do
  119. removeitemfrombag(actor, key, value,0,9999,'恶魔广场')
  120. end
  121. enterduplicate(actor, mapId, x, y)
  122. end
  123. --恶魔广场阶段更新
  124. function DevilSquare.DevilSquareStateUpdate(system, id, state, nextStateStartTime, configId)
  125. if state == DuplicateState.PREPARE then
  126. --准备阶段,等待满人开启,发给客户端下次开启时间
  127. -- 初始化副本数据
  128. DevilSquare.InitDupDataDevilSquare(id)
  129. elseif state == DuplicateState.FIGHT then
  130. --战斗阶段,刷怪
  131. local monsterId = ConfigDataManager.getTableValue("cfg_rep", "monster", "id", configId)
  132. setenvirvar(id, DuplicateVarConst.DEVIL_SQUARE_STATE, 1)
  133. DevilSquare.GenMonsterDevilSquare(id, monsterId)
  134. DevilSquare.ResAllPlayCurrencyStateInfo(id)
  135. DevilSquare.ResAllPlayDupTaskUpdate(id)
  136. end
  137. end
  138. -- @description 玩家进入副本后
  139. -- @param 玩家对象;地图id;副本阶段;下一阶段开始时间戳;配置id(cfg_rep的id)
  140. -- @return
  141. function DevilSquare.AfterPlayerEnterDevilSquare(actor, mapId, state, nextStateStartTime, configId)
  142. local dupInfo = getduplicate(mapId)
  143. local players = dupInfo["players"]
  144. local playerDupInfo = getplaydef(actor, DevilSquarePlayerConst.DEVIL_SQUARE_MAP_INFO)
  145. -- 是否是新进入的副本
  146. local newEnter = false
  147. if playerDupInfo == nil or playerDupInfo == "" then
  148. newEnter = true
  149. else
  150. local lastMapId = playerDupInfo[1]
  151. if mapId ~= lastMapId then
  152. newEnter = true
  153. end
  154. end
  155. if newEnter == true then
  156. -- 进入新的副本,初始化玩家变量
  157. playerDupInfo = { mapId, configId }
  158. setplaydef(actor, DevilSquarePlayerConst.DEVIL_SQUARE_MAP_INFO, playerDupInfo)
  159. setplaydef(actor, DevilSquarePlayerConst.KILL_MONSTER_COUNT, 0)
  160. setplaydef(actor, DevilSquarePlayerConst.KILL_MONSTER_EXP, 0)
  161. end
  162. local maxCount = ConfigDataManager.getTableValue("cfg_repGlobal", "value", "id", RepGlobalConfig.PREPARE_MAX_COUNT)
  163. --阶段信息
  164. DevilSquare.ResCurrencyStateInfo(actor, mapId)
  165. -- 如果是准备阶段,判断人满立即开启
  166. if state == DuplicateState.PREPARE then
  167. local playerCount = #players
  168. if playerCount >= tonumber(maxCount) then
  169. setduplicatestate(mapId, SetDuplicateStateConst.TO_FIGHT)
  170. return
  171. end
  172. elseif state == DuplicateState.FIGHT then
  173. DevilSquare.ResDupTaskUpdate(actor, mapId)
  174. end
  175. end
  176. -- @description 初始化副本数据
  177. -- @param 副本地图唯一id
  178. -- @return
  179. function DevilSquare.InitDupDataDevilSquare(mapId)
  180. --当前波次怪物击杀数量
  181. setenvirvar(mapId, DuplicateVarConst.DEVIL_SQUARE_STATE_KILL_COUNT, 0)
  182. end
  183. -- @description 刷怪
  184. -- @param 地图唯一id;刷怪表id
  185. -- @return
  186. function DevilSquare.GenMonsterDevilSquare(mapId, genMonCfgId)
  187. --战斗阶段才可以刷怪
  188. local dupInfo = getduplicate(mapId)
  189. if dupInfo["state"] ~= DuplicateState.FIGHT then
  190. return
  191. end
  192. --储存当前刷怪配置
  193. setenvirvar(mapId, DuplicateVarConst.DEVIL_SQUARE_MONSTER_GEN_CONFIG, genMonCfgId)
  194. DuplicateCommon.DupGenMonsterCommon(mapId, genMonCfgId)
  195. end
  196. -- @description 击杀怪物
  197. -- @param 归属者;默认掉落经验;怪物配置id
  198. -- @return 经验值
  199. function DevilSquare.KillMonterInDevilSquare(actor, mapId, exp, monCfgId)
  200. -- 当前波次击杀的怪物
  201. local oldCount = getenvirvar(mapId, DuplicateVarConst.DEVIL_SQUARE_STATE_KILL_COUNT)
  202. local newCount = oldCount + 1
  203. local genMonCfgId = getenvirvar(mapId, DuplicateVarConst.DEVIL_SQUARE_MONSTER_GEN_CONFIG)
  204. local totalCount = ConfigDataManager.getTableValue("cfg_repMonster", "kill", "id", genMonCfgId)
  205. if newCount >= tonumber(totalCount) then
  206. newCount = 0
  207. --生成下一波怪
  208. local nextGenMonCfgId = ConfigDataManager.getTableValue("cfg_repMonster", "nextID", "id", genMonCfgId)
  209. DevilSquare.GenMonsterDevilSquare(mapId, nextGenMonCfgId)
  210. local oldState = getenvirvar(mapId, DuplicateVarConst.DEVIL_SQUARE_STATE)
  211. local newState = oldState + 1
  212. setenvirvar(mapId, DuplicateVarConst.DEVIL_SQUARE_STATE, newState)
  213. end
  214. setenvirvar(mapId, DuplicateVarConst.DEVIL_SQUARE_STATE_KILL_COUNT, newCount)
  215. -- 玩家击杀数量
  216. local killCount = getplaydef(actor, DevilSquarePlayerConst.KILL_MONSTER_COUNT)
  217. if killCount == nil or killCount <= 0 then
  218. killCount = 0
  219. end
  220. killCount = killCount + 1
  221. setplaydef(actor, DevilSquarePlayerConst.KILL_MONSTER_COUNT, killCount)
  222. -- 玩家杀怪经验
  223. local killExp = getplaydef(actor, DevilSquarePlayerConst.KILL_MONSTER_EXP)
  224. if killExp == nil or killExp <= 0 then
  225. killExp = 0
  226. end
  227. killExp = killExp + exp
  228. setplaydef(actor, DevilSquarePlayerConst.KILL_MONSTER_EXP, killExp)
  229. DevilSquare.ResAllPlayDupTaskUpdate(mapId)
  230. OpenServerCompetition.expCal(actor, exp)
  231. end
  232. -- @description 玩家副本结算
  233. -- @param 玩家对象;
  234. -- @return
  235. function DevilSquare.PlayerSettleMentDevilSquare(actor)
  236. -- 击杀怪物
  237. local killCount = getplaydef(actor, DevilSquarePlayerConst.KILL_MONSTER_COUNT)
  238. -- 获得经验
  239. local killExp = getplaydef(actor, DevilSquarePlayerConst.KILL_MONSTER_EXP)
  240. local playerDupInfo = getplaydef(actor, DevilSquarePlayerConst.DEVIL_SQUARE_MAP_INFO)
  241. local configId = playerDupInfo[2]
  242. local score, scoreExp = DevilSquare.CalcuScoreAndExp(configId)
  243. local totalScoreExp = killCount * score * scoreExp
  244. local totalExp = killExp + totalScoreExp
  245. -- 活动剩余次数
  246. local leftCount = getleftcountofactivity(actor, DuplicateType.DEVIL_SQUARE)
  247. -- 发回给客户端
  248. local response = {}
  249. response["configId"] = configId --配置表id
  250. response["kill"] = killCount --击杀怪物
  251. response["exp"] = totalExp --活动经验
  252. response["leftCount"] = leftCount --剩余次数
  253. sendluamsg(actor, LuaMessageIdToClient.RES_DEVIL_SQUARE_SETTLEMENT, response)
  254. end
  255. -- @description 计算配置的积分及积分经验
  256. -- @param cfg_rep的id
  257. -- @return 积分,积分经验
  258. function DevilSquare.CalcuScoreAndExp(configId)
  259. local repLevel = ConfigDataManager.getTableValue("cfg_rep", "repLevel", "id", configId)
  260. repLevel = tonumber(repLevel)
  261. local configStr = ConfigDataManager.getTableValue("cfg_repGlobal", "value", "id", RepGlobalConfig.DEVIL_SQUARE_SCORE_EXP)
  262. local configList = string.split(configStr, "|")
  263. local score
  264. local scoreExp
  265. for index, value in ipairs(configList) do
  266. local valueList = string.split(value, "#")
  267. local configLevel = tonumber(valueList[1])
  268. if repLevel == configLevel then
  269. score = tonumber(valueList[2])
  270. scoreExp = tonumber(valueList[3])
  271. return score, scoreExp
  272. end
  273. end
  274. return 0, 0
  275. end
  276. -- @description 玩家进入任意地图事件
  277. -- @param 玩家对象;上一个地图配置id;当前地图配置id
  278. -- @return
  279. function DevilSquare.EnterAllMapDS(actor, lastMapCfgId, mapCfgId)
  280. -- 判断发送副本结算
  281. local dupInfo = getplaydef(actor, DevilSquarePlayerConst.DEVIL_SQUARE_MAP_INFO)
  282. if dupInfo == nil or dupInfo == "" then
  283. return
  284. end
  285. local devilSquareId = dupInfo[1]
  286. local mapId = getbaseinfo(actor, "unimapid")
  287. local mapInfo = getmapinfobyid(mapId)
  288. local isDup = mapInfo["isdup"]
  289. if isDup == true and devilSquareId ~= mapId then
  290. error("恶魔广场有未结算的奖励")
  291. DevilSquare.ClearPlayerDevilSquareDef(actor)
  292. return
  293. end
  294. if devilSquareId ~= mapId then
  295. -- 结算
  296. DevilSquare.PlayerSettleMentDevilSquare(actor)
  297. end
  298. end
  299. -- @description 客户端请求领取奖励
  300. -- @param 玩家对象;领取倍数
  301. -- @return
  302. function DevilSquare.ReqReciveRewardDevilSquare(actor, multipleCount)
  303. multipleCount = tonumber(multipleCount)
  304. local dupInfo = getplaydef(actor, DevilSquarePlayerConst.DEVIL_SQUARE_MAP_INFO)
  305. if dupInfo == nil or dupInfo == "" then
  306. return
  307. end
  308. -- 经验
  309. local killExp = getplaydef(actor, DevilSquarePlayerConst.KILL_MONSTER_EXP)
  310. local killCount = getplaydef(actor, DevilSquarePlayerConst.KILL_MONSTER_COUNT)
  311. local configId = dupInfo[2]
  312. local score, scoreExp = DevilSquare.CalcuScoreAndExp(configId)
  313. local totalScoreExp = killCount * score * scoreExp
  314. -- 副本进度任务刷新
  315. DuplicateCommon.FinishDupActivity(actor, configId)
  316. if multipleCount <= 1 then
  317. additemtobag(actor, ItemConfigId.EXP, totalScoreExp, 0, 9999, '恶魔广场')
  318. -- 清空角色副本信息
  319. DevilSquare.ClearPlayerDevilSquareDef(actor)
  320. return
  321. end
  322. local cfgString = ConfigDataManager.getTableValue("cfg_repGlobal", "value", "id", RepGlobalConfig.DEVIL_SQUARE_MULTIPLE_REWARD)
  323. local cfgList = string.split(cfgString, "|")
  324. for index, value in ipairs(cfgList) do
  325. local valueList = string.split(value, "#")
  326. if multipleCount == tonumber(valueList[1]) then
  327. local costItemId = tonumber(valueList[2])
  328. local costItemCount = tonumber(valueList[3])
  329. local costActivityCount = tonumber(valueList[4])
  330. local activityId = ConfigDataManager.getTableValue("cfg_rep", "type", "id", configId)
  331. local leftCount = getleftcountofactivity(actor, activityId)
  332. if leftCount < costActivityCount then
  333. --tipinfo(actor, "次数不足")
  334. return
  335. end
  336. local ownCount = getbagitemcountbyid(actor, costItemId)
  337. if ownCount < costItemCount then
  338. --tipinfo(actor, "扣除道具不足")
  339. return
  340. end
  341. -- 扣除次数和道具
  342. reduceactivitytimes(actor, activityId, costActivityCount)
  343. removeitemfrombag(actor, costItemId, costItemCount,0,9999,'恶魔广场')
  344. -- 发放奖励
  345. local totalExp = killExp * (multipleCount - 1) + totalScoreExp * multipleCount
  346. additemtobag(actor, ItemConfigId.EXP, totalExp, 0, 9999, '恶魔广场')
  347. -- 清空角色副本信息
  348. DevilSquare.ClearPlayerDevilSquareDef(actor)
  349. end
  350. end
  351. end
  352. -- @description 清除玩家在恶魔广场副本中的变量
  353. -- @param 玩家对象
  354. -- @return
  355. function DevilSquare.ClearPlayerDevilSquareDef(actor)
  356. setplaydef(actor, DevilSquarePlayerConst.DEVIL_SQUARE_MAP_INFO, "")
  357. setplaydef(actor, DevilSquarePlayerConst.KILL_MONSTER_COUNT, 0)
  358. setplaydef(actor, DevilSquarePlayerConst.KILL_MONSTER_EXP, 0)
  359. end
  360. -- @description 响应给客户端当前阶段
  361. -- @param 玩家对象;地图id
  362. -- @return
  363. function DevilSquare.ResCurrencyStateInfo(actor, mapId)
  364. local dupInfo = getduplicate(mapId)
  365. local state = dupInfo["state"]
  366. local configId = dupInfo["dupcfgid"]
  367. local nextStateStartTime = dupInfo["nextstatetime"]
  368. sendluamsg(actor, LuaMessageIdToClient.DEVIL_SQUARE_STATE, { state, tostring(nextStateStartTime), configId })
  369. end
  370. -- @description 通知地图所有玩家更新当前阶段
  371. -- @param 地图id
  372. -- @return
  373. function DevilSquare.ResAllPlayCurrencyStateInfo(mapId)
  374. local dupInfo = getduplicate(mapId)
  375. local players = dupInfo["players"]
  376. for index, actor in ipairs(players) do
  377. DevilSquare.ResCurrencyStateInfo(actor, mapId)
  378. end
  379. end
  380. -- @description 立即开启战斗
  381. -- @param 玩家对象;请求参数
  382. -- @return
  383. function DevilSquare.ChangeToFight(actor, msgData)
  384. local mapId = getbaseinfo(actor, "unimapid")
  385. setduplicatestate(mapId, SetDuplicateStateConst.TO_FIGHT)
  386. end
  387. -- @description 副本任务更新响应
  388. -- @param 玩家对象;副本id
  389. -- @return
  390. function DevilSquare.ResDupTaskUpdate(actor, mapId)
  391. local dupInfo = getduplicate(mapId)
  392. local configId = dupInfo["dupcfgid"]
  393. --波次
  394. local wave = getenvirvar(mapId, DuplicateVarConst.DEVIL_SQUARE_STATE)
  395. --击杀数量
  396. local count = getenvirvar(mapId, DuplicateVarConst.DEVIL_SQUARE_STATE_KILL_COUNT)
  397. --任务总数量
  398. local genMonCfgId = getenvirvar(mapId, DuplicateVarConst.DEVIL_SQUARE_MONSTER_GEN_CONFIG)
  399. local totalCount = ConfigDataManager.getTableValue("cfg_repMonster", "kill", "id", genMonCfgId)
  400. local killCount = getplaydef(actor, DevilSquarePlayerConst.KILL_MONSTER_COUNT)
  401. --通关奖励
  402. local score, scoreExp = DevilSquare.CalcuScoreAndExp(configId)
  403. local totalScoreExp = killCount * score * scoreExp
  404. --击杀怪物积分
  405. local killScore = killCount * score
  406. local response = {}
  407. response["wave"] = wave
  408. response["nowCount"] = count
  409. response["totalCount"] = totalCount
  410. response["rewardCount"] = totalScoreExp
  411. response["score"] = killScore
  412. sendluamsg(actor, LuaMessageIdToClient.RES_DEVIL_SQUARE_TASK, response)
  413. end
  414. -- @description 通知地图所有玩家更新当前任务
  415. -- @param 副本id
  416. -- @return
  417. function DevilSquare.ResAllPlayDupTaskUpdate(mapId)
  418. local dupInfo = getduplicate(mapId)
  419. local players = dupInfo["players"]
  420. for index, actor in ipairs(players) do
  421. DevilSquare.ResDupTaskUpdate(actor, mapId)
  422. end
  423. end