SummonsProxy.lua 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305
  1. local skillUtils = requireProxy("skillUtils")
  2. local RemoteProxy = requireProxy("remote/RemoteProxy")
  3. local SummonsProxy = class("SummonsProxy", RemoteProxy)
  4. SummonsProxy.NAME = global.ProxyTable.SummonsProxy
  5. function SummonsProxy:ctor()
  6. SummonsProxy.super.ctor(self)
  7. self._data = {}
  8. self._config = {}
  9. self._summonsConfigByLv = {} --{组={技能配置 技能按优先级排序}}
  10. self._skillGroup = {}--{技能=组}
  11. self._groups = {}-- {{Group},{Group} 按组排序}
  12. self:clear()
  13. end
  14. function SummonsProxy:clear()
  15. self._data.mode = 2
  16. self._data.summonsAlived = false
  17. self._data.heroSummonsAlived = false--英雄是否有召唤物
  18. self._summonsData = {} --每种可能有多只 {技能id ={当前数目,最大数目}}
  19. self._isMerge = false --召唤骷髅和召唤神兽 是否公用一个数目
  20. self._lockTargetID = nil
  21. self._canUseSkillID = {}--直接根据 服务端下发的技能id来判断能不能召唤
  22. self._summonsNum = 0--召唤物 总量 精灵和宠物不算
  23. self._summonNumByGroup = {}--{组={id,数量}
  24. end
  25. function SummonsProxy:LoadConfig()
  26. local GameConfigMgrProxy = global.Facade:retrieveProxy(global.ProxyTable.GameConfigMgrProxy)
  27. local config = GameConfigMgrProxy:getConfigByKey("cfg_callmobset") or {}
  28. self._config = config
  29. dump(self._config,"self._config__")
  30. self._summonsConfigByLv = {}
  31. for i, v in ipairs(self._config) do
  32. if not self._summonsConfigByLv[v.Group] then
  33. self._summonsConfigByLv[v.Group] = {}
  34. table.insert(self._groups, v)
  35. end
  36. table.insert(self._summonsConfigByLv[v.Group], v)
  37. self._skillGroup[v.ID] = v.Group
  38. end
  39. for k, group in pairs(self._summonsConfigByLv) do
  40. table.sort(group,function (a,b)
  41. return a.Lv > b.Lv
  42. end)
  43. end
  44. table.sort(self._groups,function (a,b)
  45. return a.Group > b.Group
  46. end)
  47. end
  48. --先招组别Group大的 同组别中先招优先级Lv大的 每组只招一种
  49. function SummonsProxy:autoSummon()
  50. local summunMax = tonumber(SL:GetMetaValue("SERVER_OPTION", "CallMobSetCnt"))
  51. local useLvNext = SL:GetMetaValue("SERVER_OPTION", "UseLvNext")--是否顺延
  52. if self._summonsNum >= summunMax then
  53. return -1
  54. end
  55. if self._canUseSkillID["-1"] == 1 then
  56. return -1
  57. end
  58. local configByLv
  59. local skillID
  60. local curCount
  61. local summonData
  62. local group
  63. local curSummonData
  64. local isNextGroup = false
  65. local curSkillID
  66. for i, v in ipairs(self._groups) do
  67. group = v.Group
  68. configByLv = self._summonsConfigByLv[group]
  69. for _, config in ipairs(configByLv) do
  70. repeat
  71. skillID = config.ID
  72. curSummonData = self._summonNumByGroup[group] or {}
  73. curSkillID = curSummonData[1]
  74. if curSkillID then--当前组存在召唤物
  75. if curSkillID == skillID then
  76. curCount = curSummonData[2] --当前数目
  77. if curCount < config.Cnt then--还能招
  78. if self:canSummons(skillID) and skillUtils.checkAbleToAutoLaunch(skillID) then
  79. return skillID
  80. else
  81. isNextGroup = true
  82. break
  83. end
  84. else
  85. isNextGroup = true
  86. break
  87. end
  88. else
  89. break
  90. end
  91. else--当前组不存在召唤物
  92. if self:canSummons(skillID) and skillUtils.checkAbleToAutoLaunch(skillID) then
  93. return skillID
  94. else
  95. if useLvNext then
  96. break
  97. else
  98. isNextGroup = true
  99. break
  100. end
  101. end
  102. end
  103. until true
  104. if isNextGroup then
  105. isNextGroup = false
  106. break
  107. end
  108. end
  109. end
  110. return -1
  111. end
  112. function SummonsProxy:GetMode()
  113. return self._data.mode
  114. end
  115. function SummonsProxy:SetMode(mode)
  116. self._data.mode = mode
  117. end
  118. function SummonsProxy:IsAlived()
  119. return self:IsSummonsAlived()
  120. end
  121. function SummonsProxy:IsSummonsAlived()
  122. return self._data.summonsAlived == true
  123. end
  124. function SummonsProxy:IsHeroSummonsAlived()
  125. return self._data.heroSummonsAlived == true
  126. end
  127. function SummonsProxy:RequestModeChange(mode)
  128. local targetID = ""
  129. if mode == 3 then
  130. -- 锁定
  131. local PlayerInputProxy = global.Facade:retrieveProxy(global.ProxyTable.PlayerInputProxy)
  132. targetID = PlayerInputProxy:GetTargetID() or ""
  133. end
  134. LuaSendMsg(global.MsgType.MSG_CS_SUMMONS_MODE_CHANGE, mode, 0, 0, 0, targetID, string.len(targetID))
  135. self:SetMode(mode)
  136. -- SL
  137. SLBridge:onLUAEvent(LUA_EVENT_SUMMON_MODE_CHANGE, { mode = mode })
  138. end
  139. function SummonsProxy:RespSummonAliveUpdate(msg)
  140. local header = msg:GetHeader()
  141. local status = header.recog > 0
  142. local isHero = header.param1 == 1
  143. if isHero then
  144. self._data.heroSummonsAlived = status
  145. else
  146. global.monsterManager:SetPetOfMainAlive(status)
  147. self._data.summonsAlived = status
  148. end
  149. global.Facade:sendNotification(global.NoticeTable.SummonsAliveStatusChange, { status = self:IsAlived() })
  150. -- SL
  151. SLBridge:onLUAEvent(LUA_EVENT_SUMMON_ALIVE_CHANGE, { status = self:IsAlived() })
  152. end
  153. function SummonsProxy:RespModeUpdate(msg)
  154. local header = msg:GetHeader()
  155. local mode = header.recog
  156. self:SetMode(mode)
  157. -- SL
  158. SLBridge:onLUAEvent(LUA_EVENT_SUMMON_MODE_CHANGE, { mode = mode })
  159. end
  160. function SummonsProxy:canSummons(skillID)
  161. if not skillID then
  162. return false
  163. end
  164. -- 分身术不走 服务端的统计。。。。
  165. if skillID ~= 74 then
  166. if next(self._canUseSkillID) then
  167. return self._canUseSkillID[skillID] == 1
  168. end
  169. end
  170. local newAutoSummon = SL:GetMetaValue("SERVER_OPTION", "CallMobSet")
  171. if not newAutoSummon then
  172. if self._isMerge and skillID == global.MMO.SKILL_INDEX_ZHKL then--召唤骷髅和 召唤神兽公用一个数目
  173. skillID = global.MMO.SKILL_INDEX_ZHSS
  174. end
  175. end
  176. local SummonsData = self._summonsData[skillID]
  177. if SummonsData then
  178. return SummonsData[1] < SummonsData[2]
  179. end
  180. return true
  181. end
  182. function SummonsProxy:RespPetDeath(msg)--召唤物最大数量 和 数目变化
  183. local header = msg:GetHeader()
  184. local status = header.recog == 1
  185. -- dump(header, "header__")
  186. local maxNum = header.param1
  187. local skillID = header.param2
  188. self._isMerge = header.param3 == 0
  189. local msgLen = msg:GetDataLength()
  190. if msgLen > 0 then
  191. local str = msg:GetData():ReadString(msgLen)
  192. self._canUseSkillID = {}
  193. if str == "-1" then
  194. self._canUseSkillID["-1"] = 1
  195. else
  196. local t = string.split(str, ",")
  197. for i, v in ipairs(t) do
  198. self._canUseSkillID[tonumber(v)] = 1
  199. end
  200. end
  201. -- dump(str,"str____")
  202. end
  203. if skillID > 0 then-- 技能召唤的
  204. local newAutoSummon = SL:GetMetaValue("SERVER_OPTION", "CallMobSet")
  205. if not newAutoSummon then
  206. if self._isMerge and skillID == 17 then--召唤骷髅和 召唤神兽公用一个数目
  207. skillID = 30
  208. end
  209. end
  210. self._summonsData[skillID] = self._summonsData[skillID] or { 0, 1 } -- 当前个数,最大数目
  211. if status then--出生
  212. self._summonsData[skillID][1] = self._summonsData[skillID][1] + 1
  213. self._summonsData[skillID][2] = maxNum
  214. self._summonsNum = self._summonsNum + 1
  215. local group = self._skillGroup[skillID]
  216. if group then
  217. self._summonNumByGroup[group] = self._summonNumByGroup[group] or {skillID, 0}
  218. self._summonNumByGroup[group][2] = self._summonNumByGroup[group][2] + 1
  219. end
  220. else--死亡
  221. self._summonsData[skillID][1] = self._summonsData[skillID][1] - 1
  222. self._summonsNum = self._summonsNum - 1
  223. local group = self._skillGroup[skillID]
  224. if group then
  225. if self._summonNumByGroup[group] then
  226. self._summonNumByGroup[group][2] = self._summonNumByGroup[group][2] - 1
  227. if self._summonNumByGroup[group][2] == 0 then
  228. self._summonNumByGroup[group] = nil
  229. end
  230. end
  231. end
  232. end
  233. end
  234. global.Facade:sendNotification(global.NoticeTable.SummonsAliveStatusChange, { status = self:IsAlived() })
  235. -- SL
  236. SLBridge:onLUAEvent(LUA_EVENT_SUMMON_ALIVE_CHANGE, { status = self:IsAlived() })
  237. end
  238. ----------锁定
  239. function SummonsProxy:SetLockTargetID(actorID)
  240. self._lockTargetID = actorID
  241. end
  242. function SummonsProxy:GetLockTargetID()
  243. return self._lockTargetID
  244. end
  245. function SummonsProxy:ReqLockActorByID(actorID)
  246. self:SetLockTargetID(actorID)
  247. LuaSendMsg(global.MsgType.MSG_CS_MOBLOCKTARGET, 0, 0, 0, 0, actorID, string.len(actorID))
  248. end
  249. function SummonsProxy:ReqUnLockActorByID(actorID)
  250. self:SetLockTargetID(nil)
  251. if not actorID then
  252. return
  253. end
  254. LuaSendMsg(global.MsgType.MSG_CS_MOBUNLOCKTARGET, 0, 0, 0, 0, actorID, string.len(actorID))
  255. end
  256. function SummonsProxy:RegisterMsgHandler()
  257. SummonsProxy.super.RegisterMsgHandler(self)
  258. local msgType = global.MsgType
  259. LuaRegisterMsgHandler(msgType.MSG_SC_SUMMONS_MODE_UPDATE, handler(self, self.RespModeUpdate)) -- 召唤物攻击模式改变
  260. LuaRegisterMsgHandler(msgType.MSG_SC_SUMMON_ALIVE_UPDATE, handler(self, self.RespSummonAliveUpdate)) -- 召唤物存活状态(是否有召唤物)
  261. LuaRegisterMsgHandler(msgType.MSG_SC_PET_STATE, handler(self, self.RespPetDeath)) -- 召唤物存活状态(出生死亡数量变化)
  262. end
  263. return SummonsProxy