BloodyCastle_1.lua 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600
  1. --血色城堡副本
  2. BloodyCastle = {}
  3. -- @description 客户端请求面板数据
  4. -- @param 玩家对象;请求参数
  5. -- @return
  6. function BloodyCastle.ReqGetPanelInfo(actor, msgData)
  7. local configId = tonumber(msgData)
  8. if configId == nil or configId <= 0 then
  9. gameDebug.assertPrintTrace(false, actor:toString() .. "请求血色城堡面板,参数有误!configId:" .. configId)
  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. -- 血色城堡面板协议
  24. sendluamsg(actor, LuaMessageIdToClient.RES_BLOODY_CASTLE_PANEL, resInfo)
  25. end
  26. -- @description 请求进入血色城堡
  27. -- @param 玩家对象;cfg_rep的id
  28. -- @return
  29. function BloodyCastle.ReqEnterBloodyCastle(actor, configId)
  30. --是否组队,组队需要拉队友
  31. local personal = true
  32. local teamId = getbaseinfo(actor, "teamid")
  33. teamId = tostring(teamId)
  34. if teamId ~= "0" then
  35. local teamInfo = getteaminfo(actor, teamId)
  36. local size = #teamInfo["allteammemberinfo"]
  37. if size > 1 then
  38. personal = false
  39. end
  40. end
  41. if personal == false then
  42. --组队进入
  43. DuplicateCommon.CallTeamMembersPrepare(actor, configId)
  44. else
  45. --个人进入
  46. if DuplicateCommon.CheckEnterConditonCommon(actor, configId) ~= EnterLimitResultConst.ALLOW then
  47. return
  48. end
  49. --寻找是否有可进入的副本,如果没有创建副本
  50. local mapId = DuplicateCommon.FindEnterableDupCommon(configId, 1)
  51. local x, y = DuplicateCommon.GetEnterPointXYCommon(configId)
  52. if mapId == 0 then
  53. mapId = DuplicateCommon.CreateDupMapCommon(actor, configId, true)
  54. end
  55. --回蓝回血
  56. DuplicateCommon.RecoverHPMP(actor)
  57. BloodyCastle.PlayerEnterBloodyCastle(actor, mapId, x, y, configId)
  58. end
  59. end
  60. -- @description 组队进入副本
  61. -- @param 玩家对象;队伍id;副本配置
  62. -- @return
  63. function BloodyCastle.DoTeamEnter(actor, teamId, configId)
  64. local teamInfo = getteaminfo(actor, teamId)
  65. local members = teamInfo["allteammemberinfo"]
  66. for index, memberInfo in ipairs(members) do
  67. local memberId = memberInfo["rid"]
  68. local memberActor = getactor(actor, memberId)
  69. local check = DuplicateCommon.CheckEnterConditonCommon(memberActor, configId)
  70. if check ~= EnterLimitResultConst.ALLOW then
  71. gameDebug.assertPrintTrace(false, actor:toString() .. "组队进入成员条件不满足!memberId:" .. memberId)
  72. return
  73. end
  74. end
  75. local memberActors = {}
  76. --扣除次数;扣除道具
  77. for index, memberInfo in ipairs(members) do
  78. local memberId = memberInfo["rid"]
  79. local memberActor = getactor(actor, memberId)
  80. BloodyCastle.RemoveItemBeforeEnter(memberActor, configId)
  81. table.insert(memberActors, memberActor)
  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 BloodyCastle.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 BloodyCastle.PlayerEnterBloodyCastle(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. -- @description 玩家进入副本后
  124. -- @param 玩家对象;地图id;副本阶段;下一阶段开始时间戳;配置id(cfg_rep的id)
  125. -- @return
  126. function BloodyCastle.AfterPlayerBloodyCaster(actor, mapId, state, nextStateStartTime, configId)
  127. local dupInfo = getduplicate(mapId)
  128. local players = dupInfo["players"]
  129. local playerDupInfo = getplaydef(actor, BloodyCastlePlayerConst.BLOODY_CASTLE_MAP_INFO)
  130. -- 是否是新进入的副本
  131. local newEnter = false
  132. if playerDupInfo == nil or playerDupInfo == "" then
  133. newEnter = true
  134. else
  135. local lastMapId = playerDupInfo[1]
  136. if mapId ~= lastMapId then
  137. newEnter = true
  138. end
  139. end
  140. if newEnter == true then
  141. -- 进入新的副本,初始化玩家变量
  142. playerDupInfo = {mapId, configId}
  143. setplaydef(actor, BloodyCastlePlayerConst.BLOODY_CASTLE_MAP_INFO, playerDupInfo)
  144. setplaydef(actor, BloodyCastlePlayerConst.KILL_MONSTER_COUNT, 0)
  145. setplaydef(actor, BloodyCastlePlayerConst.KILL_MONSTER_EXP, 0)
  146. setplaydef(actor, BloodyCastlePlayerConst.ARCHANGEL_SWORD_ID, 0)
  147. end
  148. local maxCount = ConfigDataManager.getTableValue("cfg_repGlobal", "value", "id", RepGlobalConfig.PREPARE_MAX_COUNT)
  149. -- 阶段信息
  150. BloodyCastle.ResCurrencyStateInfo(actor, mapId)
  151. if state == DuplicateState.PREPARE then
  152. -- 如果是准备阶段,判断人满立即开启
  153. local playerCount = #players
  154. if playerCount >= tonumber(maxCount) then
  155. setduplicatestate(mapId, SetDuplicateStateConst.TO_FIGHT)
  156. return
  157. end
  158. elseif state == DuplicateState.FIGHT then
  159. -- 战斗阶段任务信息
  160. BloodyCastle.ResTaskPhaseUpdate(actor, mapId)
  161. -- 大天使武器视野包
  162. BloodyCastle.ResSwordRoundMsg(actor)
  163. end
  164. end
  165. -- @description 玩家进入任意地图事件
  166. -- @param 玩家对象;上一个地图配置id;当前地图配置id
  167. -- @return
  168. function BloodyCastle.EnterAllMapDS(actor, lastMapCfgId, mapCfgId)
  169. -- 判断发送副本结算
  170. local dupInfo = getplaydef(actor, BloodyCastlePlayerConst.BLOODY_CASTLE_MAP_INFO)
  171. if dupInfo == nil or dupInfo == "" then
  172. return
  173. end
  174. local bloodyId = dupInfo[1]
  175. local mapId = getbaseinfo(actor, "unimapid")
  176. local mapInfo = getmapinfobyid(mapId)
  177. local isDup = mapInfo["isdup"]
  178. if isDup == true and bloodyId ~= mapId then
  179. BloodyCastle.ClearPlayerDef(actor)
  180. return
  181. end
  182. if bloodyId ~= mapId then
  183. gameDebug.debug(LogManager.TriggerByType, actor, LogOpType.B_AND_D_CHALLENGE)
  184. -- 结算
  185. BloodyCastle.PlayerSettleMent(actor)
  186. end
  187. end
  188. -- @description 击杀怪物
  189. -- @param 归属者;默认掉落经验;怪物配置id
  190. -- @return 经验值
  191. function BloodyCastle.KillMonterInBloodyCastle(actor, mapId, exp, monCfgId)
  192. -- 玩家击杀数量
  193. local killCount = getplaydef(actor, BloodyCastlePlayerConst.KILL_MONSTER_COUNT)
  194. if killCount == nil or killCount <= 0 then
  195. killCount = 0
  196. end
  197. killCount = killCount + 1
  198. setplaydef(actor, BloodyCastlePlayerConst.KILL_MONSTER_COUNT, killCount)
  199. end
  200. function BloodyCastle.AddExp(actor, mapId, exp)
  201. -- 玩家杀怪经验
  202. local killExp = getplaydef(actor, BloodyCastlePlayerConst.KILL_MONSTER_EXP)
  203. if killExp == nil or killExp <= 0 then
  204. killExp = 0
  205. end
  206. killExp = killExp + exp
  207. setplaydef(actor, BloodyCastlePlayerConst.KILL_MONSTER_EXP, killExp)
  208. end
  209. --血色城堡阶段更新
  210. function BloodyCastle.BloodyCastleStateUpdate(system, mapId, state, nextStateStartTime, configId)
  211. if state == DuplicateState.PREPARE then
  212. -- 初始化副本数据,初始化第一个任务
  213. BloodyCastle.InitBloodyCastle(mapId, configId)
  214. elseif state == DuplicateState.FIGHT then
  215. --战斗阶段
  216. local monsterId = ConfigDataManager.getTableValue("cfg_rep", "monster", "id", configId)
  217. DuplicateCommon.DupGenMonsterCommon(mapId, monsterId) --刷怪
  218. -- 一阶段刷新城门怪
  219. local dupLevel = ConfigDataManager.getTableValue("cfg_rep", "repLevel", "id", configId)
  220. dupLevel = tonumber(dupLevel)
  221. local configStr =
  222. ConfigDataManager.getTableValue("cfg_repGlobal", "value", "id", RepGlobalConfig.BLOODY_CASTLE_GATE_MONSTER)
  223. local configList = string.split(configStr, "|")
  224. for index, value in ipairs(configList) do
  225. local valueList = string.split(value, "#")
  226. local levelCfg = tonumber(valueList[1])
  227. local monCfgId = valueList[2]
  228. local x = valueList[3]
  229. local y = valueList[4]
  230. if dupLevel == levelCfg then
  231. local gateMons = mongen(mapId, x, y, 0, monCfgId, 1)
  232. local gateMon = gateMons[1]
  233. setmapobjectdir(gateMon, -1)
  234. end
  235. end
  236. BloodyCastle.ResAllPlayCurrencyStateInfo(mapId) --阶段信息
  237. BloodyCastle.ResAllTaskPhaseUpdate(mapId) -- 任务信息
  238. end
  239. end
  240. -- @description 初始化副本数据
  241. -- @param 副本地图id;cfg_rep的id
  242. -- @return
  243. function BloodyCastle.InitBloodyCastle(mapId, configId)
  244. --当前任务信息
  245. local taskId = ConfigDataManager.getTableValue("cfg_rep", "repTarget", "id", configId)
  246. local taskInfo = DuplicateCommon.GenDupTaskInfoCommon(taskId)
  247. table.insert(taskInfo, 1, BloodyCastleTaskPhase.ONE)
  248. setenvirvar(mapId, DuplicateVarConst.BLOODY_CASTLE_TASK_INFO, taskInfo)
  249. end
  250. -- @description 完成当前任务
  251. -- @param 地图id;任务id
  252. -- @return
  253. function BloodyCastle.FinishTaskBloodyCastle(mapId, taskId, actor)
  254. -- 更新任务,掉落任务奖励
  255. --奖励
  256. local reward = ConfigDataManager.getTableValue("cfg_repTask", "reward", "id", taskId)
  257. if reward ~= nil and reward ~= "" then
  258. local split = string.split(reward, "|")
  259. -- 权重算法
  260. local index = -1
  261. local weights = {}
  262. local sum = 0
  263. for i, value in ipairs(split) do
  264. local valueSplit = string.split(value, "#")
  265. local weight = tonumber(valueSplit[3])
  266. weights[i] = weight
  267. sum = sum + weight
  268. end
  269. local randomNum = math.random(sum)
  270. for k, v in pairs(weights) do
  271. if randomNum <= v then
  272. index = k
  273. break
  274. else
  275. randomNum = randomNum - v
  276. end
  277. end
  278. if index > 0 and index <= #split then
  279. local itemData = split[index]
  280. local itemDataTable = string.split(itemData, "#")
  281. local itemId = tonumber(itemDataTable[1])
  282. local count = tonumber(itemDataTable[2])
  283. local x = getbaseinfo(actor, "x")
  284. local y = getbaseinfo(actor, "y")
  285. throwitem(actor, mapId, x, y, 1, itemId, count, 10000000, 3, 0)
  286. end
  287. end
  288. -- 更新任务和阶段
  289. BloodyCastle.UpdateNextTaskPhaseBloodyCastle(mapId, taskId, actor)
  290. end
  291. function BloodyCastle.UpdateNextTaskPhaseBloodyCastle(mapId, taskId, actor)
  292. local taskInfo = getenvirvar(mapId, DuplicateVarConst.BLOODY_CASTLE_TASK_INFO)
  293. local nextTask = ConfigDataManager.getTableValue("cfg_repTask", "nextID", "id", taskId)
  294. if nextTask == nil or nextTask == "" then
  295. return
  296. end
  297. local dupInfo = getduplicate(mapId)
  298. local dupConfig = dupInfo["dupcfgid"]
  299. local dupLevel = ConfigDataManager.getTableValue("cfg_rep", "repLevel", "id", dupConfig)
  300. dupLevel = tonumber(dupLevel)
  301. local nowPhase = taskInfo[1]
  302. local nextPhase = nowPhase + 1
  303. if nextPhase == BloodyCastleTaskPhase.TWO then
  304. --阶段二
  305. elseif nextPhase == BloodyCastleTaskPhase.FOUR then
  306. --阶段四,刷新水晶灵柩怪
  307. local configStr =
  308. ConfigDataManager.getTableValue(
  309. "cfg_repGlobal",
  310. "value",
  311. "id",
  312. RepGlobalConfig.BLOODY_CASTLE_CRYSTAL_MONSTER
  313. )
  314. local configList = string.split(configStr, "|")
  315. for index, value in ipairs(configList) do
  316. local valueList = string.split(value, "#")
  317. local levelCfg = tonumber(valueList[1])
  318. local monCfgId = valueList[2]
  319. local x = valueList[3]
  320. local y = valueList[4]
  321. if dupLevel == levelCfg then
  322. mongen(mapId, x, y, 0, monCfgId, 1)
  323. end
  324. end
  325. elseif nextPhase == BloodyCastleTaskPhase.FIVE then
  326. -- 阶段五,大天使武器给击杀者
  327. local taskConfig = ConfigDataManager.getTableValue("cfg_repTask", "param", "id", nextTask)
  328. local taskSplit = string.split(taskConfig, "#")
  329. local swordId = tonumber(taskSplit[1])
  330. setplaydef(actor, BloodyCastlePlayerConst.ARCHANGEL_SWORD_ID, swordId)
  331. -- 视野包
  332. BloodyCastle.ResSwordRoundMsg(actor)
  333. end
  334. -- 设置下一个任务
  335. local nextTaskInfo = DuplicateCommon.GenDupTaskInfoCommon(nextTask)
  336. table.insert(nextTaskInfo, 1, nextPhase)
  337. setenvirvar(mapId, DuplicateVarConst.BLOODY_CASTLE_TASK_INFO, nextTaskInfo)
  338. end
  339. -- @description 血色城堡中怪物死亡
  340. -- @param 副本地图id;怪物击杀者;怪物的配置id
  341. -- @return
  342. function BloodyCastle.BloodyCastleOnMonsterDie(mapId, killer, monCfgId)
  343. local taskInfo = getenvirvar(mapId, DuplicateVarConst.BLOODY_CASTLE_TASK_INFO)
  344. local taskId = taskInfo[2]
  345. local taskType = taskInfo[3]
  346. if taskType == DuplicateTaskType.KILL_MONSTER_COUNT then
  347. local totalCount = taskInfo[4]
  348. local oldCount = taskInfo[5]
  349. local newCount = oldCount + 1
  350. if newCount >= totalCount then
  351. -- 完成任务,给客户端回包
  352. BloodyCastle.FinishTaskBloodyCastle(mapId, taskId, killer)
  353. else
  354. -- 更新记录,给客户端回包
  355. taskInfo[5] = newCount
  356. setenvirvar(mapId, DuplicateVarConst.BLOODY_CASTLE_TASK_INFO, taskInfo)
  357. end
  358. elseif taskType == DuplicateTaskType.KILL_TARGET_MONSTER then
  359. local targetMon = taskInfo[6]
  360. local totalCount = taskInfo[4]
  361. local oldCount = taskInfo[5]
  362. if tonumber(monCfgId) ~= targetMon then
  363. return
  364. end
  365. local newCount = oldCount + 1
  366. if newCount >= totalCount then
  367. -- 完成任务,给客户端回包
  368. BloodyCastle.FinishTaskBloodyCastle(mapId, taskId, killer)
  369. else
  370. -- 更新记录,给客户端回包
  371. taskInfo[5] = newCount
  372. setenvirvar(mapId, DuplicateVarConst.BLOODY_CASTLE_TASK_INFO, taskInfo)
  373. end
  374. end
  375. BloodyCastle.ResAllTaskPhaseUpdate(mapId) -- 任务信息
  376. end
  377. -- @description 响应给客户端当前阶段
  378. -- @param 玩家对象;地图id
  379. -- @return
  380. function BloodyCastle.ResCurrencyStateInfo(actor, mapId)
  381. local dupInfo = getduplicate(mapId)
  382. local state = dupInfo["state"]
  383. local configId = dupInfo["dupcfgid"]
  384. local nextStateStartTime = dupInfo["nextstatetime"]
  385. sendluamsg(
  386. actor,
  387. LuaMessageIdToClient.RES_BLOODY_CASTLE_STATE_UPDATE,
  388. {state, tostring(nextStateStartTime), configId}
  389. )
  390. end
  391. -- @description 通知地图所有玩家更新当前阶段
  392. -- @param 地图id
  393. -- @return
  394. function BloodyCastle.ResAllPlayCurrencyStateInfo(mapId)
  395. local dupInfo = getduplicate(mapId)
  396. local players = dupInfo["players"]
  397. for index, actor in ipairs(players) do
  398. BloodyCastle.ResCurrencyStateInfo(actor, mapId)
  399. end
  400. end
  401. -- @description 任务阶段更新响应
  402. -- @param 玩家对象;地图唯一id
  403. -- @return
  404. function BloodyCastle.ResTaskPhaseUpdate(actor, mapId)
  405. local taskInfo = getenvirvar(mapId, DuplicateVarConst.BLOODY_CASTLE_TASK_INFO)
  406. local nowPhase = taskInfo[1]
  407. local taskId = taskInfo[2]
  408. local totalCount = taskInfo[4]
  409. local nowCount = taskInfo[5]
  410. local response = {}
  411. response["phase"] = nowPhase
  412. response["taskId"] = taskId
  413. response["nowCount"] = nowCount
  414. response["totalCount"] = totalCount
  415. -- 协议
  416. sendluamsg(actor, LuaMessageIdToClient.RES_BLOODY_CASTLE_TASK_UPDATE, response)
  417. end
  418. -- @description 通知地图玩家任务阶段更新响应
  419. -- @param 玩家对象;地图唯一id
  420. -- @return
  421. function BloodyCastle.ResAllTaskPhaseUpdate(mapId)
  422. local dupInfo = getduplicate(mapId)
  423. local players = dupInfo["players"]
  424. for index, actor in ipairs(players) do
  425. BloodyCastle.ResTaskPhaseUpdate(actor, mapId)
  426. end
  427. end
  428. -- @description 大天使宝剑视野包发给周围玩家
  429. -- @param 地图id;玩家id
  430. -- @return
  431. function BloodyCastle.ResSwordRoundMsg(actor)
  432. local itemId = getplaydef(actor, BloodyCastlePlayerConst.ARCHANGEL_SWORD_ID)
  433. if itemId == nil or itemId == "" or itemId <= 0 then
  434. return
  435. end
  436. local rid = getbaseinfo(actor, "rid")
  437. -- 协议待定
  438. sendrefluamsg(actor, LuaMessageIdToClient.BLOODY_CASTLE_SWORD_VIEW, {tostring(rid), tostring(itemId)})
  439. end
  440. -- @description 玩家进入视野
  441. -- @param 玩家对象;进入视野的玩家对象
  442. -- @return
  443. function BloodyCastle.PlayerEnterView(actor, target, mapId)
  444. local taskInfo = getenvirvar(mapId, DuplicateVarConst.BLOODY_CASTLE_TASK_INFO)
  445. if taskInfo == nil then
  446. return
  447. end
  448. local nowPhase = taskInfo[1]
  449. if nowPhase ~= BloodyCastleTaskPhase.FIVE then
  450. return
  451. end
  452. local itemId = getplaydef(target, BloodyCastlePlayerConst.ARCHANGEL_SWORD_ID)
  453. if itemId == nil or itemId == "" or itemId == 0 then
  454. return
  455. end
  456. --携带大天使武器的视野包
  457. -- 协议待定
  458. local rid = getbaseinfo(target, "rid")
  459. sendluamsg(actor, LuaMessageIdToClient.BLOODY_CASTLE_SWORD_VIEW, {tostring(rid), tostring(itemId)})
  460. end
  461. -- @description 玩家请求,大天使武器给npc
  462. -- @param 玩家对象
  463. -- @return
  464. function BloodyCastle.ReqGive2NPC(actor)
  465. local mapId = getbaseinfo(actor, "unimapid")
  466. local taskInfo = getenvirvar(mapId, DuplicateVarConst.BLOODY_CASTLE_TASK_INFO)
  467. local nowPhase = taskInfo[1]
  468. local count = taskInfo[5]
  469. if nowPhase ~= BloodyCastleTaskPhase.FIVE or count >= 1 then
  470. return
  471. end
  472. local itemId = getplaydef(actor, BloodyCastlePlayerConst.ARCHANGEL_SWORD_ID)
  473. if itemId == nil or itemId <= 0 then
  474. return
  475. end
  476. -- 副本结束d
  477. local taskId = taskInfo[2]
  478. taskInfo[5] = 1
  479. setenvirvar(mapId, DuplicateVarConst.BLOODY_CASTLE_TASK_INFO, taskInfo)
  480. -- 清掉玩家武器变量
  481. setplaydef(actor, BloodyCastlePlayerConst.ARCHANGEL_SWORD_ID, 0)
  482. BloodyCastle.FinishTaskBloodyCastle(mapId, taskId, actor)
  483. BloodyCastle.ResAllTaskPhaseUpdate(mapId) -- 任务信息
  484. end
  485. -- @description 清除玩家在副本中的变量
  486. -- @param 玩家对象
  487. -- @return
  488. function BloodyCastle.ClearPlayerDef(actor)
  489. setplaydef(actor, BloodyCastlePlayerConst.BLOODY_CASTLE_MAP_INFO, "")
  490. setplaydef(actor, BloodyCastlePlayerConst.KILL_MONSTER_COUNT, 0)
  491. setplaydef(actor, BloodyCastlePlayerConst.KILL_MONSTER_EXP, 0)
  492. setplaydef(actor, BloodyCastlePlayerConst.ARCHANGEL_SWORD_ID, 0)
  493. end
  494. -- @description 玩家副本结算
  495. -- @param 玩家对象;
  496. -- @return
  497. function BloodyCastle.PlayerSettleMent(actor)
  498. -- 击杀怪物
  499. local killCount = getplaydef(actor, BloodyCastlePlayerConst.KILL_MONSTER_COUNT)
  500. -- 获得经验
  501. local killExp = getplaydef(actor, BloodyCastlePlayerConst.KILL_MONSTER_EXP)
  502. local playerDupInfo = getplaydef(actor, BloodyCastlePlayerConst.BLOODY_CASTLE_MAP_INFO)
  503. local configId = playerDupInfo[2]
  504. -- 活动剩余次数
  505. local leftCount = getleftcountofactivity(actor, DuplicateType.BLOODY_CASTLE)
  506. -- 发回给客户端
  507. local response = {}
  508. response["configId"] = configId --配置表id
  509. response["kill"] = killCount --击杀怪物
  510. response["exp"] = killExp --活动经验
  511. response["leftCount"] = leftCount --剩余次数
  512. sendluamsg(actor, LuaMessageIdToClient.RES_BLOODY_CASTLE_SETTLEMENT, response)
  513. end
  514. -- @description 客户端请求领取奖励
  515. -- @param 玩家对象;领取倍数
  516. -- @return
  517. function BloodyCastle.ReqReciveReward(actor, multipleCount)
  518. multipleCount = tonumber(multipleCount)
  519. local dupInfo = getplaydef(actor, BloodyCastlePlayerConst.BLOODY_CASTLE_MAP_INFO)
  520. if dupInfo == nil or dupInfo == "" then
  521. return
  522. end
  523. -- 经验
  524. local killExp = getplaydef(actor, BloodyCastlePlayerConst.KILL_MONSTER_EXP)
  525. local killCount = getplaydef(actor, BloodyCastlePlayerConst.KILL_MONSTER_COUNT)
  526. local configId = dupInfo[2]
  527. -- 副本进度任务刷新
  528. DuplicateCommon.FinishDupActivity(actor, configId)
  529. if multipleCount <= 1 then
  530. -- 清空角色副本信息
  531. BloodyCastle.ClearPlayerDef(actor)
  532. return
  533. end
  534. local cfgString =
  535. ConfigDataManager.getTableValue("cfg_repGlobal", "value", "id", RepGlobalConfig.BLOODY_CASTLE_MULTIPLE_REWARD)
  536. local cfgList = string.split(cfgString, "|")
  537. for index, value in ipairs(cfgList) do
  538. local valueList = string.split(value, "#")
  539. if multipleCount == tonumber(valueList[1]) then
  540. local costItemId = tonumber(valueList[2])
  541. local costItemCount = tonumber(valueList[3])
  542. local costActivityCount = tonumber(valueList[4])
  543. local activityId = ConfigDataManager.getTableValue("cfg_rep", "type", "id", configId)
  544. local leftCount = getleftcountofactivity(actor, activityId)
  545. if leftCount < costActivityCount then
  546. --tipinfo(actor, "次数不足")
  547. return
  548. end
  549. local ownCount = getbagitemcountbyid(actor, costItemId)
  550. if ownCount < costItemCount then
  551. --tipinfo(actor, "扣除道具不足")
  552. return
  553. end
  554. -- 扣除次数和道具
  555. reduceactivitytimes(actor, activityId, costActivityCount)
  556. removeitemfrombag(actor, costItemId, costItemCount, 0, 9999, "血色城堡")
  557. -- 发放奖励
  558. local totalExp = killExp * (multipleCount - 1)
  559. -- additemtobag(actor, ItemConfigId.EXP, totalExp, 0, 9999, '血色城堡')
  560. -- 增加加成逻辑
  561. _, totalExp = Bag.addItemToBag(actor, ItemConfigId.EXP, totalExp, 0, 9999, "血色城堡")
  562. -- 清空角色副本信息
  563. BloodyCastle.ClearPlayerDef(actor)
  564. end
  565. end
  566. end