BuffProxy.lua 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550
  1. local RemoteProxy = requireProxy("remote/RemoteProxy")
  2. local BuffProxy = class("BuffProxy", RemoteProxy)
  3. BuffProxy.NAME = global.ProxyTable.Buff
  4. BuffProxy.DIS_ACTION_TYPE = {
  5. NO_WALK = 1, --禁止走
  6. NO_RUN = 2, --禁止跑
  7. NO_ATTACK = 3, --禁止平砍动作技能(不要按照普攻)
  8. NO_MAGIC = 4, --禁止施法动作技能
  9. NO_USE_ITEM = 5, --禁止使用物品
  10. NO_CHAT = 6, --禁止说话
  11. }
  12. local mmo = global.MMO
  13. BuffProxy.BuffColorDefaultOrder = {
  14. [mmo.BUFF_ID_COLOR] = 1,
  15. [mmo.BUFF_ID_COLORS] = 2, -- (宝宝自动变色生效)
  16. [mmo.BUFF_ID_POISONING_GREEN] = 3,
  17. [mmo.BUFF_ID_POISONING_RED] = 4,
  18. [mmo.BUFF_ID_THUNDER_SWORD] = 5,
  19. [mmo.BUFF_ID_POISONING_PURPLE] = 6,
  20. }
  21. function BuffProxy:ctor()
  22. BuffProxy.super.ctor(self)
  23. self._data = {}
  24. self._config = {}
  25. self._buff_config_sfx = {}
  26. self._auto_skill_buff = {}
  27. self._launch_skill_buff = {}
  28. end
  29. function BuffProxy:RegisterMsgHandler()
  30. BuffProxy.super.RegisterMsgHandler(self)
  31. end
  32. function BuffProxy:LoadConfig()
  33. self._config = requireGameConfig("cfg_buff")
  34. for k, v in pairs(self._config or {}) do
  35. local parseArray = string.split(v.RSRules or "", "#")
  36. for i, iv in ipairs(parseArray) do
  37. local skillID = tonumber(iv)
  38. if skillID then
  39. if not self._auto_skill_buff[skillID] then
  40. self._auto_skill_buff[skillID] = {}
  41. end
  42. self._auto_skill_buff[skillID][v.ID] = v.ID
  43. end
  44. end
  45. parseArray = string.split(v.target_no_skill_launch or "", "#")
  46. for i, iv in ipairs(parseArray) do
  47. local skillID = tonumber(iv)
  48. if skillID then
  49. if not self._launch_skill_buff[skillID] then
  50. self._launch_skill_buff[skillID] = {}
  51. end
  52. self._launch_skill_buff[skillID][v.ID] = v.ID
  53. end
  54. end
  55. end
  56. end
  57. function BuffProxy:GetConfig()
  58. return self._config
  59. end
  60. function BuffProxy:GetConfigByID( id )
  61. return self._config[id]
  62. end
  63. -- 自动释放时身上有哪些buff时不能释放
  64. function BuffProxy:GetNoSkillAuto( skillID )
  65. return self._auto_skill_buff[skillID]
  66. end
  67. -- 手动释放时有身上有哪些buff时不能释放
  68. function BuffProxy:GetNoSkillLaunch( skillID )
  69. return self._launch_skill_buff[skillID]
  70. end
  71. -- 手动释放时不能释放时的提示
  72. function BuffProxy:GetNoSkillBuffTitle( buffid )
  73. local config = self._config[buffid]
  74. return config and config.target_buff_title
  75. end
  76. -- 获取音效声音
  77. function BuffProxy:GetAudio( buffid )
  78. local config = self._config[buffid]
  79. return config and tonumber(config.buff_audio) or nil
  80. end
  81. -- 检测是否禁止动作, 位运算( 1:禁止走 2:禁止跑 4: 禁止普攻 8:禁止施法 16:禁止使用物品 32: 禁止说话)
  82. function BuffProxy:CheckDisAction( dis_action, dis_action_type )
  83. if not tonumber(dis_action) or not tonumber(dis_action_type) then
  84. return false
  85. end
  86. return CheckBit( tonumber(dis_action), tonumber(dis_action_type) - 1 )
  87. end
  88. local function parseSfx( value )
  89. if not value then
  90. return nil
  91. end
  92. value = tostring(value)
  93. if string.len(value) == 0 then
  94. return nil
  95. end
  96. local offsetList = string.split(value, "|")
  97. value = offsetList[1]
  98. local unOffset = offsetList[2] and tonumber(offsetList[2]) or 0
  99. local slices = string.split( value, "#" )
  100. local sfxID = tonumber(slices[1]) or tonumber(slices[2])
  101. local loop = tonumber(slices[3]) or 0
  102. local is8dir = slices[4]
  103. local dirfollow = (tonumber(slices[5]) or 0) == 1
  104. return {sfxID = sfxID, loop = loop, is8dir = is8dir, dirfollow = dirfollow, unOffset = unOffset}
  105. end
  106. function BuffProxy:GetBuffSfxByID( id )
  107. local sfxConfig = self._buff_config_sfx[id]
  108. if sfxConfig then
  109. return sfxConfig
  110. end
  111. local config = self._config[id]
  112. if not config then
  113. return nil
  114. end
  115. sfxConfig = {
  116. front = parseSfx(config.front_sfx),
  117. front_stuck = parseSfx(config.front_sfx_stuck),
  118. behind = parseSfx(config.behind_sfx),
  119. behind_stuck = parseSfx(config.behind_sfx_stuck),
  120. play_sfx = {sfxID = tonumber(config.play_sfx), loop = 1, is8dir = false}
  121. }
  122. self._buff_config_sfx[id] = sfxConfig
  123. return sfxConfig
  124. end
  125. function BuffProxy:GetSfxOffset(id)
  126. local config = self._config[id]
  127. if not config then
  128. return cc.p(0,0)
  129. end
  130. local offsetxArray = string.split(config.offsetx or "", "#")
  131. local offsetyArray = string.split(config.offsety or "", "#")
  132. local offsetX = tonumber(offsetxArray[1]) or 0
  133. local offsetY = tonumber(offsetyArray[1]) or 0
  134. return cc.p(offsetX, offsetY)
  135. end
  136. -- 骑马buff特效偏移
  137. function BuffProxy:GetHorseOffset(id)
  138. local config = self._config[id]
  139. if not config then
  140. return cc.p(0,0)
  141. end
  142. local offsetxArray = string.split(config.offsetx or "", "#")
  143. local offsetyArray = string.split(config.offsety or "", "#")
  144. local offsetX = tonumber(offsetxArray[2]) or 0
  145. local offsetY = tonumber(offsetyArray[2]) or 0
  146. return cc.p(offsetX, offsetY)
  147. end
  148. -- 骑马是否显示buff特效
  149. function BuffProxy:IsHorseShow(id)
  150. local config = self._config[id]
  151. if not config then
  152. return true
  153. end
  154. local offsetxArray = string.split(config.offsetx or "", "#")
  155. local offsetyArray = string.split(config.offsety or "", "#")
  156. local showX = tonumber(offsetxArray[3]) or 1
  157. local showY = tonumber(offsetyArray[3]) or 1
  158. return showX == 1 and showY == 1
  159. end
  160. function BuffProxy:GetSfxSpeed(id)
  161. local config = self._config[id]
  162. if not config then
  163. return 1
  164. end
  165. return config.speed or 1
  166. end
  167. -- 是否配置avatar、scale、color
  168. function BuffProxy:IsAvatarBuff( id )
  169. local config = self._config[id]
  170. if not config then
  171. return false
  172. end
  173. if config.color or config.buff_sacle or config.avatar then
  174. return true
  175. end
  176. return false
  177. end
  178. -- buff配置颜色
  179. function BuffProxy:GetBuffColorByID( id )
  180. if id == global.MMO.BUFF_ID_POISONING_RED then
  181. return cc.c3b(128, 0x00, 0x00)
  182. elseif id == global.MMO.BUFF_ID_POISONING_GREEN then
  183. return cc.c3b(0x00, 128, 0x00)
  184. elseif id == global.MMO.BUFF_ID_THUNDER_SWORD then
  185. return cc.c3b(0xff, 0xff, 0x00)
  186. elseif id == global.MMO.BUFF_ID_POISONING_PURPLE then
  187. return cc.c3b(128, 0x00, 128)
  188. end
  189. local config = self._config[id]
  190. if not config or not config.color then
  191. return nil
  192. end
  193. return GetColorFromHexString( GET_COLOR_BYID( config.color ) )
  194. end
  195. -- buff配置颜色优先级
  196. function BuffProxy:GetBuffColorOrderByID(id)
  197. local configCOrder = self._config[id] and self._config[id].colorOrder
  198. if configCOrder then
  199. return configCOrder
  200. end
  201. return self.BuffColorDefaultOrder[id] or 0
  202. end
  203. -- buff 配置缩放
  204. function BuffProxy:GetBuffScaleByID( id )
  205. local config = self._config[id]
  206. if not config then
  207. return nil
  208. end
  209. return tonumber( config.buff_sacle )
  210. end
  211. -- buff 配置变形
  212. function BuffProxy:GetBuffAvatarByID( id )
  213. local config = self._config[id]
  214. if not config or not config.avatar then
  215. return nil
  216. end
  217. local avatarArray = string.split( config.avatar, "#" )
  218. local data = nil
  219. if avatarArray[2] then
  220. data = {}
  221. data.avatarType = tonumber(avatarArray[1])
  222. data.avatarID = tonumber(avatarArray[2])
  223. data.avatarSex = data.avatarType == 0 and tonumber(avatarArray[3]) or nil
  224. end
  225. return data
  226. end
  227. function BuffProxy:CheckUseItemEnable( typeID )
  228. local ret = true
  229. local buffid = nil
  230. for _, buffData in pairs( self._data ) do
  231. if not self:checkOneBuffUseItemEnable( buffData.id, typeID ) then
  232. ret = false
  233. buffid = buffData.id
  234. break
  235. end
  236. end
  237. return ret,buffid
  238. end
  239. function BuffProxy:CheckSkillEnable( skillID )
  240. local ret = true
  241. for _, buffData in pairs( self._data ) do
  242. if not self:checkOneBuffSkillEnable( buffData.id, skillID ) then
  243. ret = false
  244. break
  245. end
  246. end
  247. return ret
  248. end
  249. function BuffProxy:CheckMoveEnable()
  250. local ret = true
  251. for _, buffData in pairs( self._data ) do
  252. if not self:checkOneBuffMoveEnable( buffData.id ) then
  253. ret = false
  254. break
  255. end
  256. end
  257. return ret
  258. end
  259. function BuffProxy:CheckRunEnable()
  260. local ret = true
  261. for _, buffData in pairs( self._data ) do
  262. if not self:checkOneBuffRunEnable( buffData.id ) then
  263. ret = false
  264. break
  265. end
  266. end
  267. return ret
  268. end
  269. -- 检测聊天启用
  270. function BuffProxy:CheckChatEnable()
  271. local ret = true
  272. local buffid = nil
  273. for _, buffData in pairs( self._data ) do
  274. if not self:checkOneBuffChatEnable( buffData.id ) then
  275. ret = false
  276. buffid = buffData.id
  277. break
  278. end
  279. end
  280. return ret
  281. end
  282. function BuffProxy:CheckExistControlBuff()
  283. for _, buffData in pairs( self._data ) do
  284. if self:checkOneBuffIsControlBuff( buffData.id ) then
  285. return true
  286. end
  287. end
  288. return false
  289. end
  290. function BuffProxy:checkOneBuffUseItemEnable( id, typeID )
  291. local config = self._config[id]
  292. if not config then
  293. return true
  294. end
  295. if self:CheckDisAction( config.dis_action, BuffProxy.DIS_ACTION_TYPE.NO_USE_ITEM ) then
  296. return false
  297. end
  298. if nil == config.no_item or 0 == config.no_item then
  299. return true
  300. end
  301. if -1 == config.no_item then
  302. return false
  303. end
  304. local slices = string.split( tostring(config.no_item), "#" )
  305. local strTypeID = tostring( typeID )
  306. for _, value in ipairs( slices ) do
  307. if strTypeID == value then
  308. return false
  309. end
  310. end
  311. return true
  312. end
  313. function BuffProxy:checkOneBuffSkillEnable( id, skillID )
  314. local config = self._config[id]
  315. if not config then
  316. return true
  317. end
  318. local SkillProxy = global.Facade:retrieveProxy(global.ProxyTable.Skill)
  319. -- 冰冻 麻痹 技能忽略该buff
  320. local checkBit = {
  321. [global.MMO.BUFF_ID_FREEZED_GRAY] = {[1]=true,[3]=true},
  322. [global.MMO.BUFF_ID_ICE] = {[2]=true,[3]=true},
  323. }
  324. if checkBit[id] then
  325. local skillData = SkillProxy:GetSkillByID(skillID) or {}
  326. local igornAct = tonumber(skillData.IgornAct)
  327. if igornAct then
  328. local isEnable = false
  329. for k, v in pairs(checkBit[id]) do
  330. if CheckBit(igornAct, k-1) then
  331. return true
  332. end
  333. end
  334. end
  335. end
  336. local skillConfig = SkillProxy:FindConfigBySkillID(skillID)
  337. if skillConfig then
  338. if skillConfig.action == 0 then
  339. if self:CheckDisAction( config.dis_action, BuffProxy.DIS_ACTION_TYPE.NO_ATTACK ) then
  340. return false
  341. end
  342. else
  343. if self:CheckDisAction( config.dis_action, BuffProxy.DIS_ACTION_TYPE.NO_MAGIC ) then
  344. return false
  345. end
  346. end
  347. end
  348. if -2 == config.no_skill or nil == config.no_skill then
  349. return true
  350. end
  351. if -1 == config.no_skill then
  352. return false
  353. end
  354. local strSkillID = tostring( skillID )
  355. local slices = string.split( tostring(config.no_skill), "#" )
  356. for _, value in ipairs( slices ) do
  357. if strSkillID == value then
  358. return false
  359. end
  360. end
  361. return true
  362. end
  363. function BuffProxy:checkOneBuffMoveEnable( id )
  364. local config = self._config[id]
  365. if not config then
  366. return true
  367. end
  368. if self:CheckDisAction( config.dis_action, BuffProxy.DIS_ACTION_TYPE.NO_WALK ) then
  369. return false
  370. end
  371. if 0 == config.no_move or nil == config.no_move then
  372. return true
  373. end
  374. if -1 == config.no_move then
  375. return false
  376. end
  377. return true
  378. end
  379. function BuffProxy:checkOneBuffRunEnable( id )
  380. local config = self._config[id]
  381. if not config then
  382. return true
  383. end
  384. if self:CheckDisAction( config.dis_action, BuffProxy.DIS_ACTION_TYPE.NO_RUN ) then
  385. return false
  386. end
  387. if -2 == config.no_move then
  388. return false
  389. end
  390. return true
  391. end
  392. -- 检测说话启用
  393. function BuffProxy:checkOneBuffChatEnable( id )
  394. local config = self._config[id]
  395. if not config then
  396. return true
  397. end
  398. if self:CheckDisAction( config.dis_action, BuffProxy.DIS_ACTION_TYPE.NO_CHAT ) then
  399. return false
  400. end
  401. return true
  402. end
  403. function BuffProxy:checkOneBuffIsControlBuff( id )
  404. local config = self._config[id]
  405. if not config then
  406. return false
  407. end
  408. return config.control_skill == 1
  409. end
  410. function BuffProxy:AddBuffItem( data, isHero )
  411. if isHero then
  412. local buffID = data.id
  413. local cofig = self:GetConfigByID( buffID )
  414. if cofig and cofig.bufftitle then
  415. ShowSystemTips( GET_STRING(310000501) .. cofig.bufftitle )
  416. end
  417. return
  418. end
  419. local moveEnable = self:CheckMoveEnable()
  420. local buffID = data.id
  421. -- set
  422. self._data[buffID] = data
  423. -- buff是否限制移动
  424. if moveEnable and not self:checkOneBuffMoveEnable(buffID) then
  425. global.Facade:sendNotification(global.NoticeTable.ForbiddenMoveBuffBegan, buffID)
  426. end
  427. -- buff 提示
  428. local cofig = self:GetConfigByID( buffID )
  429. if cofig and cofig.bufftitle then
  430. ShowSystemTips( cofig.bufftitle )
  431. end
  432. end
  433. function BuffProxy:RmvBuffItem( data )
  434. local buffID = data.id
  435. -- reset
  436. self._data[buffID] = nil
  437. -- buff是否限制移动
  438. local moveEnable = self:CheckMoveEnable()
  439. if moveEnable and not self:checkOneBuffMoveEnable(buffID) then
  440. global.Facade:sendNotification(global.NoticeTable.ForbiddenMoveBuffEnd, buffID)
  441. end
  442. end
  443. function BuffProxy:UpdateBuffItem( data )
  444. local buffID = data.id
  445. -- set
  446. self._data[buffID] = data
  447. end
  448. return BuffProxy