ItemBoss.lua 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313
  1. --道具boss副本
  2. ItemBoss = {}
  3. -- @description 请求进入道具boss场景
  4. -- @param 玩家对象;cfg_rep的id
  5. -- @return
  6. function ItemBoss.ReqEnterItemBoss(actor, configId)
  7. --是否组队,组队需要拉队友
  8. local personal = true
  9. local teamId = getbaseinfo(actor, "teamid")
  10. teamId = tostring(teamId)
  11. if teamId ~= "0" then
  12. local teamInfo = getteaminfo(actor, teamId)
  13. local size = #teamInfo["allteammemberinfo"]
  14. if size > 1 then
  15. personal = false
  16. end
  17. end
  18. if personal == false then
  19. --组队进入
  20. DuplicateCommon.CallTeamMembersPrepare(actor, configId)
  21. else
  22. --个人进入
  23. if DuplicateCommon.CheckEnterConditonCommon(actor, configId) ~= EnterLimitResultConst.ALLOW then
  24. return
  25. end
  26. --寻找是否有可进入的副本,如果没有创建副本
  27. local mapId = DuplicateCommon.FindEnterableDupCommon(configId, 1)
  28. local x, y = DuplicateCommon.GetEnterPointXYCommon(configId)
  29. if mapId == 0 then
  30. mapId = DuplicateCommon.CreateDupMapCommon(actor, configId, true)
  31. end
  32. --回蓝回血
  33. DuplicateCommon.RecoverHPMP(memberActor)
  34. ItemBoss.PlayerEnterItemBoss(actor, mapId, x, y, configId)
  35. end
  36. end
  37. -- @description 组队进入副本
  38. -- @param 玩家对象;队伍id;副本配置
  39. -- @return
  40. function ItemBoss.DoTeamEnter(actor, teamId, configId)
  41. local teamInfo = getteaminfo(actor, teamId)
  42. local members = teamInfo["allteammemberinfo"]
  43. for index, memberInfo in ipairs(members) do
  44. local memberId = memberInfo["rid"]
  45. local memberActor = getactor(actor, memberId)
  46. local check = DuplicateCommon.CheckEnterConditonCommon(memberActor, configId)
  47. if check ~= EnterLimitResultConst.ALLOW then
  48. error("组队进入成员条件不满足" .. memberId)
  49. return
  50. end
  51. end
  52. local memberActors = {}
  53. --扣除次数;扣除道具
  54. for index, memberInfo in ipairs(members) do
  55. local memberId = memberInfo["rid"]
  56. local memberActor = getactor(actor, memberId)
  57. ItemBoss.RemoveItemBeforeEnter(memberActor, configId)
  58. table.insert(memberActors, memberActor)
  59. --回蓝回血
  60. DuplicateCommon.RecoverHPMP(memberActor)
  61. end
  62. --组队进入
  63. local size = #members
  64. --寻找是否有可进入的副本,如果没有创建副本
  65. local mapId = DuplicateCommon.FindEnterableDupCommon(configId, size)
  66. local x, y = DuplicateCommon.GetEnterPointXYCommon(configId)
  67. if mapId == 0 then
  68. mapId = DuplicateCommon.CreateDupMapCommon(actor, configId, true)
  69. end
  70. enterduplicate(actor, mapId, x, y, memberActors)
  71. end
  72. -- @description 进入副本扣除次数和道具
  73. -- @param
  74. -- @return
  75. function ItemBoss.RemoveItemBeforeEnter(actor, configId)
  76. -- 扣除次数
  77. local activityId = ConfigDataManager.getTableValue("cfg_rep", "type", "id", configId)
  78. reduceactivitytimes(actor, activityId)
  79. -- 扣除道具
  80. local itemConfig = ConfigDataManager.getTableValue("cfg_rep", "itemId", "id", configId)
  81. local itemMap = string.toIntIntMap(itemConfig, "#", "|")
  82. for key, value in pairs(itemMap) do
  83. removeitemfrombag(actor, key, value, 0, 9999, '道具Boss')
  84. end
  85. end
  86. -- @description 玩家传送进副本
  87. -- @param 玩家对象;地图id;x坐标;y坐标;cfg_rep的id
  88. -- @return
  89. function ItemBoss.PlayerEnterItemBoss(actor, mapId, x, y, configId)
  90. -- 扣除道具
  91. local itemConfig = ConfigDataManager.getTableValue("cfg_rep", "itemId", "id", configId)
  92. local itemMap = string.toIntIntMap(itemConfig, "#", "|")
  93. for key, value in pairs(itemMap) do
  94. removeitemfrombag(actor, key, value, 0, 9999, '道具Boss')
  95. end
  96. -- info("PlayerEnterItemBoss, mapId: " .. mapId .. ", x: " .. x .. ", y: " .. y)
  97. enterduplicate(actor, mapId, x, y)
  98. end
  99. --道具boss阶段更新
  100. function ItemBoss.DupStateUpdate(system, id, state, nextStateStartTime, configId)
  101. if state == DuplicateState.PREPARE or state == DuplicateState.FIGHT then
  102. --战斗阶段,刷怪
  103. local monsterId = ConfigDataManager.getTableValue("cfg_rep", "monster", "id", configId)
  104. ItemBoss.GenMonsterItemBoss(id, monsterId)
  105. ItemBoss.ResAllPlayCurrencyStateInfo(id)
  106. ItemBoss.ResAllPlayDupTaskUpdate(id)
  107. elseif state == DuplicateState.FINISH then
  108. --jprint("【道具boss】副本结束",configId,id,state)
  109. local dupInfo = getduplicate(id)
  110. local players = table.getValue(dupInfo, "players")
  111. --计算战斗时间
  112. if players ~= nil then
  113. for _, actor in pairs(players) do
  114. ItemBoss.ResCurrencyStateInfo(actor, id)
  115. end
  116. end
  117. else
  118. local dupInfo = getduplicate(id)
  119. local players = table.getValue(dupInfo, "players")
  120. if players ~= nil then
  121. for _, actor in pairs(players) do
  122. quitduplicate(actor)
  123. end
  124. end
  125. end
  126. end
  127. -- @description 玩家进入副本后
  128. -- @param 玩家对象;地图id;副本阶段;下一阶段开始时间戳;配置id(cfg_rep的id)
  129. -- @return
  130. function ItemBoss.AfterEnterItemBoss(actor, mapId, state, nextStateStartTime, configId)
  131. local dupInfo = getduplicate(mapId)
  132. local players = dupInfo["players"]
  133. local playerDupInfo = getplaydef(actor, ItemBossPlayerConst.ITEM_BOSS_MAP_INFO)
  134. -- 是否是新进入的副本
  135. local newEnter = false
  136. if playerDupInfo == nil or playerDupInfo == "" then
  137. newEnter = true
  138. else
  139. local lastMapId = playerDupInfo[1]
  140. if mapId ~= lastMapId then
  141. newEnter = true
  142. end
  143. end
  144. if newEnter == true then
  145. -- 进入新的副本,初始化玩家变量
  146. playerDupInfo = { mapId, configId }
  147. setplaydef(actor, ItemBossPlayerConst.ITEM_BOSS_MAP_INFO, playerDupInfo)
  148. end
  149. local maxCount = ConfigDataManager.getTableValue("cfg_repGlobal", "value", "id", RepGlobalConfig.PREPARE_MAX_COUNT)
  150. --阶段信息
  151. ItemBoss.ResCurrencyStateInfo(actor, mapId)
  152. setduplicatestate(mapId, SetDuplicateStateConst.TO_FIGHT)
  153. ItemBoss.ResDupTaskUpdate(actor, mapId)
  154. end
  155. -- @description 刷怪
  156. -- @param 地图唯一id;刷怪表id
  157. -- @return
  158. function ItemBoss.GenMonsterItemBoss(mapId, genMonCfgId)
  159. --战斗阶段才可以刷怪
  160. local dupInfo = getduplicate(mapId)
  161. if dupInfo["state"] ~= DuplicateState.FIGHT then
  162. return
  163. end
  164. --储存当前刷怪配置
  165. setenvirvar(mapId, DuplicateVarConst.ITEM_BOSS_MONSTER_GEN_CONFIG, genMonCfgId)
  166. DuplicateCommon.DupGenMonsterCommon(mapId, genMonCfgId)
  167. end
  168. -- @description 击杀怪物
  169. -- @param 归属者;默认掉落经验;怪物配置id
  170. -- @return 经验值
  171. function ItemBoss.KillMonterInItemBoss(actor, mapId, exp, monCfgId)
  172. -- 当前波次击杀的怪物
  173. -- local oldCount = getenvirvar(mapId, DuplicateVarConst.ITEM_BOSS_STATE_KILL_COUNT)
  174. -- local newCount = oldCount + 1
  175. -- local genMonCfgId = getenvirvar(mapId, DuplicateVarConst.ITEM_BOSS_MONSTER_GEN_CONFIG)
  176. -- local totalCount = ConfigDataManager.getTableValue("cfg_repMonster", "kill", "id", genMonCfgId)
  177. -- if newCount >= tonumber(totalCount) then
  178. -- newCount = 0
  179. -- --生成下一波怪
  180. -- local nextGenMonCfgId = ConfigDataManager.getTableValue("cfg_repMonster", "nextID", "id", genMonCfgId)
  181. -- ItemBoss.GenMonsterItemBoss(mapId, nextGenMonCfgId)
  182. -- local oldState = getenvirvar(mapId, DuplicateVarConst.ITEM_BOSS_STATE)
  183. -- local newState = oldState + 1
  184. -- setenvirvar(mapId, DuplicateVarConst.ITEM_BOSS_STATE, newState)
  185. -- end
  186. -- setenvirvar(mapId, DuplicateVarConst.ITEM_BOSS_STATE_KILL_COUNT, newCount)
  187. -- 调用退出副本接口
  188. setduplicatestate(mapId, SetDuplicateStateConst.TO_FINISH)
  189. end
  190. -- @description 玩家副本结算
  191. -- @param 玩家对象;
  192. -- @return
  193. function ItemBoss.PlayerSettleMentItemBoss(actor)
  194. -- 这里发放积分经验
  195. -- additemtobag(actor, ItemConfigId.EXP, totalScoreExp, 0, 9999, '道具boss')
  196. local playerDupInfo = getplaydef(actor, ItemBossPlayerConst.ITEM_BOSS_MAP_INFO)
  197. local configId = playerDupInfo[2]
  198. -- -- 发回给客户端
  199. local response = {}
  200. response["configId"] = configId --配置表id
  201. -- response["kill"] = killCount --击杀怪物数量
  202. -- response["killExp"] = killExp --击杀怪物掉落的经验
  203. -- response["scoreExp"] = totalScoreExp --积分经验
  204. -- response["leftCount"] = leftCount --剩余次数
  205. sendluamsg(actor, LuaMessageIdToClient.RES_ITEM_BOSS_SETTLEMENT, response)
  206. end
  207. -- @description 玩家进入任意地图事件
  208. -- @param 玩家对象;上一个地图配置id;当前地图配置id
  209. -- @return
  210. function ItemBoss.EnterAllMapDS(actor, lastMapCfgId, mapCfgId)
  211. -- 判断发送副本结算
  212. local dupInfo = getplaydef(actor, ItemBossPlayerConst.ITEM_BOSS_MAP_INFO)
  213. if dupInfo == nil or dupInfo == "" then
  214. return
  215. end
  216. local ItemBossId = dupInfo[1]
  217. local mapId = getbaseinfo(actor, "unimapid")
  218. local mapInfo = getmapinfobyid(mapId)
  219. local isDup = mapInfo["isdup"]
  220. if isDup == true and ItemBossId ~= mapId then
  221. error("道具boss有未结算的奖励")
  222. ItemBoss.ClearPlayerItemBossDef(actor)
  223. return
  224. end
  225. if ItemBossId ~= mapId then
  226. -- 结算
  227. gameDebug.debug(LogManager.TriggerByType, actor, LogOpType.B_AND_D_CHALLENGE)
  228. ItemBoss.PlayerSettleMentItemBoss(actor)
  229. else
  230. -- info("道具boss进入副本,地图不同,结算失败")
  231. end
  232. end
  233. -- @description 清除玩家在道具boss副本中的变量
  234. -- @param 玩家对象
  235. -- @return
  236. function ItemBoss.ClearPlayerItemBossDef(actor)
  237. setplaydef(actor, ItemBossPlayerConst.ITEM_BOSS_MAP_INFO, "")
  238. end
  239. -- @description 响应给客户端当前阶段
  240. -- @param 玩家对象;地图id
  241. -- @return
  242. function ItemBoss.ResCurrencyStateInfo(actor, mapId)
  243. local dupInfo = getduplicate(mapId)
  244. local state = dupInfo["state"]
  245. local configId = dupInfo["dupcfgid"]
  246. local nextStateStartTime = dupInfo["nextstatetime"]
  247. sendluamsg(actor, LuaMessageIdToClient.ITEM_BOSS_STATE, { state, tostring(nextStateStartTime), configId })
  248. end
  249. -- @description 通知地图所有玩家更新当前阶段
  250. -- @param 地图id
  251. -- @return
  252. function ItemBoss.ResAllPlayCurrencyStateInfo(mapId)
  253. local dupInfo = getduplicate(mapId)
  254. local players = dupInfo["players"]
  255. for index, actor in ipairs(players) do
  256. ItemBoss.ResCurrencyStateInfo(actor, mapId)
  257. end
  258. end
  259. -- @description 立即开启战斗
  260. -- @param 玩家对象;请求参数
  261. -- @return
  262. function ItemBoss.ChangeToFight(actor, msgData)
  263. local mapId = getbaseinfo(actor, "unimapid")
  264. setduplicatestate(mapId, SetDuplicateStateConst.TO_FIGHT)
  265. end
  266. -- @description 副本任务更新响应
  267. -- @param 玩家对象;副本id
  268. -- @return
  269. function ItemBoss.ResDupTaskUpdate(actor, mapId)
  270. local dupInfo = getduplicate(mapId)
  271. local configId = dupInfo["dupcfgid"]
  272. --任务总数量
  273. local genMonCfgId = getenvirvar(mapId, DuplicateVarConst.ITEM_BOSS_MONSTER_GEN_CONFIG)
  274. local totalCount = ConfigDataManager.getTableValue("cfg_repMonster", "kill", "id", genMonCfgId)
  275. local totalReward = ConfigDataManager.getTableValue("cfg_rep", "reward", "id", configId)
  276. local response = {}
  277. response["totalCount"] = totalCount
  278. response["rewardCount"] = totalReward
  279. -- response["score"] = killScore
  280. sendluamsg(actor, LuaMessageIdToClient.RES_ITEM_BOSS_TASK, response)
  281. end
  282. -- @description 通知地图所有玩家更新当前任务
  283. -- @param 副本id
  284. -- @return
  285. function ItemBoss.ResAllPlayDupTaskUpdate(mapId)
  286. local dupInfo = getduplicate(mapId)
  287. local players = dupInfo["players"]
  288. for index, actor in ipairs(players) do
  289. ItemBoss.ResDupTaskUpdate(actor, mapId)
  290. end
  291. end