源战役客户端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

455 line
12 KiB

  1. BossHomeModel = BossHomeModel or BaseClass(BaseVo, true)
  2. local BossHomeModel = BossHomeModel
  3. function BossHomeModel:__init()
  4. BossHomeModel.Instance = self
  5. self:Reset()
  6. end
  7. function BossHomeModel:Reset()
  8. --boss之家配置
  9. self.boss_home_cfg = {}--boss之家boss配置
  10. self.boss_home_level_cfg = {}--boss之家层数配置
  11. --社团之家配置
  12. self.guild_boss_home_cfg = {}
  13. self.guild_boss_home_level_cfg = {}
  14. self.boss_home_rank_info = {}--boss之家伤害列表
  15. self.boss_home_info = {}--boss之家基础信息
  16. self.need_find_boss_id = false--进场景前记录需要寻找的boss
  17. self.cur_fight_boss_id = nil--当前在打的boss id
  18. self.scene_boss_hp = {}--场景中boss最大血量
  19. self.bosshome_guild_exclusive_data = {} -- 幻魔之家社团专属信息
  20. self.boss_hurt_info = {}
  21. self.my_hurt_only = false
  22. self.boss_home_red_cache = {}
  23. self.first_open_red = false--功能首次开放时,给个一次性红点
  24. self.boss_home_login_red = true -- 每日登录红点
  25. self:InitBossHomeCFG()
  26. end
  27. function BossHomeModel:getInstance()
  28. if BossHomeModel.Instance == nil then
  29. BossHomeModel.Instance = BossHomeModel.New()
  30. end
  31. return BossHomeModel.Instance
  32. end
  33. --boss之家boss配置
  34. function BossHomeModel:InitBossHomeCFG( )
  35. self.boss_home_cfg = {}
  36. self.guild_boss_home_cfg = {}
  37. local cfg = Config.Homeboss
  38. for k,v in pairs(cfg) do
  39. if v.sub_module == 1 then
  40. if not self.boss_home_cfg[v.level] then
  41. self.boss_home_cfg[v.level] = {}
  42. end
  43. table_insert(self.boss_home_cfg[v.level], v)
  44. else
  45. if not self.guild_boss_home_cfg[v.level] then
  46. self.guild_boss_home_cfg[v.level] = {}
  47. end
  48. table_insert(self.guild_boss_home_cfg[v.level], v)
  49. end
  50. end
  51. for k,v in pairs(self.boss_home_cfg) do
  52. local sort_func = function ( a, b )
  53. return a.recommend_lv < b.recommend_lv
  54. end
  55. table.sort(v, sort_func)
  56. end
  57. for k,v in pairs(self.guild_boss_home_cfg) do
  58. local sort_func = function ( a, b )
  59. return a.recommend_lv < b.recommend_lv
  60. end
  61. table.sort(v, sort_func)
  62. end
  63. self.boss_home_level_cfg = {}
  64. self.guild_boss_home_level_cfg = {}
  65. for k,v in pairs(Config.Homebosslevel) do
  66. if v.sub_module == 1 then
  67. table_insert(self.boss_home_level_cfg, v)
  68. else
  69. table_insert(self.guild_boss_home_level_cfg, v)
  70. end
  71. end
  72. local sort_func = function ( a, b )
  73. return a.level < b.level
  74. end
  75. table.sort(self.boss_home_level_cfg, sort_func)
  76. table.sort(self.guild_boss_home_level_cfg, sort_func)
  77. end
  78. --根据层数获取boss之家boss配置
  79. function BossHomeModel:GetBossHomeCFG( level )
  80. if not level then
  81. return self.boss_home_cfg
  82. else
  83. return self.boss_home_cfg[level] or {}
  84. end
  85. end
  86. --根据层数获取社团之家boss配置
  87. function BossHomeModel:GetGuildBossHomeCFG( level )
  88. if not level then
  89. return self.guild_boss_home_cfg
  90. else
  91. return self.guild_boss_home_cfg[level] or {}
  92. end
  93. end
  94. --根据层数获取boss之家层数配置
  95. function BossHomeModel:GetBossHomeLevelCFG( level )
  96. if not level then
  97. return self.boss_home_level_cfg
  98. else
  99. return self.boss_home_level_cfg[level] or {}
  100. end
  101. end
  102. --根据层数获取社团之家层数配置
  103. function BossHomeModel:GetGuildBossHomeLevelCFG( level )
  104. if not level then
  105. return self.guild_boss_home_level_cfg
  106. else
  107. return self.guild_boss_home_level_cfg[level] or {}
  108. end
  109. end
  110. --根据bossid获取boss之家boss配置
  111. function BossHomeModel:GetBossHomeCFGById( boss_id )
  112. if boss_id then
  113. return Config.Homeboss["1@"..boss_id]
  114. end
  115. return {}
  116. end
  117. --根据bossid获取社团之家boss配置
  118. function BossHomeModel:GetGuildBossHomeCFGById( boss_id )
  119. if boss_id then
  120. return Config.Homeboss["2@"..boss_id]
  121. end
  122. return {}
  123. end
  124. --根据bossid获取boss之家场景id
  125. function BossHomeModel:GetBossHomeSceneById( boss_id )
  126. local cfg = Config.Homeboss
  127. if cfg["1@"..boss_id] then
  128. local level = cfg["1@"..boss_id].level
  129. local scene_cfg = Config.Homebosslevel["1@"..level]
  130. return scene_cfg.scene
  131. end
  132. return 0
  133. end
  134. --根据bossid获取社团之家场景id
  135. function BossHomeModel:GetGuildBossHomeSceneById( boss_id )
  136. local cfg = Config.Homeboss
  137. if cfg["2@"..boss_id] then
  138. local level = cfg["2@"..boss_id].level
  139. local scene_cfg = Config.Homebosslevel["2@"..level]
  140. return scene_cfg.scene
  141. end
  142. return 0
  143. end
  144. --获取boss之家和社团之家在第几层(通用)
  145. function BossHomeModel:GetBossHomeSceneFloor( scene_id )
  146. scene_id = scene_id or SceneManager:getInstance():GetSceneId()
  147. local cfg = Config.Homebosslevel
  148. for k,v in pairs(cfg) do
  149. if v.scene == scene_id then
  150. return v.level
  151. end
  152. end
  153. return 0
  154. end
  155. --根据场景id判断是社团之家还是boss之家
  156. function BossHomeModel:GetBossHomeSceneType(scene_id)
  157. local scene_id = SceneManager:getInstance():GetSceneId()
  158. local cfg = Config.Homebosslevel
  159. for k,v in pairs(cfg) do
  160. if v.scene == scene_id then
  161. return v.sub_module
  162. end
  163. end
  164. return 1
  165. end
  166. --boss之家boss信息46201
  167. function BossHomeModel:SetBossHomeInfo(boss_id,reborn_time,killer)
  168. if boss_id then
  169. self.boss_home_info[boss_id] = {
  170. boss_id = boss_id,reborn_time = reborn_time,killer = killer,kill_count = 0
  171. }
  172. end
  173. end
  174. function BossHomeModel:GetBossHomeInfo( boss_id )
  175. if boss_id then
  176. return self.boss_home_info[boss_id]
  177. else
  178. return self.boss_home_info
  179. end
  180. end
  181. --boss之家伤害列表 46202
  182. function BossHomeModel:SetBossHomeRankInfo( vo )
  183. self.boss_home_rank_info[vo.boss_id] = vo
  184. self:SetCurFightBossId(vo.boss_id)
  185. end
  186. function BossHomeModel:GetBossHomeRankInfo( boss_id )
  187. return self.boss_home_rank_info[boss_id]
  188. end
  189. function BossHomeModel:CleanBossHomeRankInfoById( boss_id )
  190. self.boss_home_rank_info[boss_id] = nil
  191. end
  192. function BossHomeModel:GetLeftBossHomeMapShowDataList(level)
  193. local list = {}
  194. local all_boss_list = self:GetBossHomeCFG(level) or {}
  195. if all_boss_list and #all_boss_list > 0 then
  196. for i,v in ipairs(all_boss_list) do
  197. local d = {}
  198. local pos = stringtotable(v.born_pos)
  199. d.x = tonumber(pos[1])
  200. d.y = tonumber(pos[2])
  201. d.boss_id = v.boss_id
  202. d.id = v.boss_id
  203. d.sub_type = FindVo.MONSTER
  204. d.xy = v.born_pos
  205. d.name = Trim(v.name)
  206. table.insert(list, d)
  207. end
  208. end
  209. return list
  210. end
  211. --进场景前保存需要前往寻路的bossid
  212. function BossHomeModel:SetNeedFindBoss( boss_id )
  213. self.need_find_boss_id = boss_id
  214. end
  215. function BossHomeModel:GetNeedFindBoss( )
  216. return self.need_find_boss_id
  217. end
  218. --保存当前正在战斗的bossid
  219. function BossHomeModel:SetCurFightBossId( value )
  220. self.cur_fight_boss_id = value
  221. end
  222. function BossHomeModel:GetCurFightBossId( )
  223. return self.cur_fight_boss_id
  224. end
  225. -- 幻魔之家社团专属信息 40605
  226. function BossHomeModel:SetBossHomeGuildExclusiveData(vo)
  227. local sort_func = function ( a, b )
  228. return a.guild_id < b.guild_id
  229. end
  230. table.sort(vo.guild_list, sort_func)
  231. self.bosshome_guild_exclusive_data = vo.guild_list
  232. end
  233. function BossHomeModel:GetBossHomeGuildExclusiveData(guild_id)
  234. if guild_id then
  235. for k, v in ipairs(self.bosshome_guild_exclusive_data) do
  236. if v.guild_id == guild_id then
  237. return v
  238. end
  239. end
  240. return false
  241. else
  242. return self.bosshome_guild_exclusive_data
  243. end
  244. end
  245. --刷新墓碑
  246. function BossHomeModel:UpdateSceneGrave(vo)
  247. if not vo or not vo.boss_info then return end
  248. local boss_info = vo.boss_info
  249. if boss_info then
  250. local cur_scene_id = SceneManager.Instance:GetSceneId()
  251. for _, v in ipairs(boss_info) do
  252. if v.reborn_time > 0 then --复活结束时间戳>0说明怪物已经死亡
  253. local x, y
  254. local cfg = Config.Homeboss["1@"..v.boss_id]
  255. local scene_id = 0
  256. if not cfg then
  257. cfg = Config.Homeboss["2@"..v.boss_id]
  258. scene_id = self:GetGuildBossHomeSceneById(v.boss_id)
  259. else
  260. scene_id = self:GetBossHomeSceneById(v.boss_id)
  261. end
  262. if cfg then
  263. local pos = stringtotable(cfg.born_pos)
  264. x = tonumber(pos[1])
  265. y = tonumber(pos[2])
  266. end
  267. local monCfg = ConfigItemMgr.Instance:GetMonsterDataItem(v.boss_id)
  268. if x and y and monCfg and (scene_id == cur_scene_id) then
  269. local grave_vo = GraveVo.New()
  270. local data = {}
  271. data.instance_id = v.boss_id
  272. data.type_id = BossModel.GRAVE_MONSTER_ID
  273. data.boss_id = v.boss_id
  274. data.name = monCfg.name
  275. data.level = monCfg.lv
  276. data.refresh_time = math.ceil(v.reborn_time - TimeUtil:getServerTime())
  277. data.pos_x = x
  278. data.pos_y = y
  279. grave_vo:SetGraveVo(data)
  280. print("<<<<<<==================<WQ>==================>>>>>>",v.boss_id)
  281. SceneManager:getInstance():AddGraveVo(grave_vo)
  282. end
  283. else
  284. SceneManager:getInstance():DeleteGraveVo(v.boss_id)
  285. end
  286. end
  287. end
  288. end
  289. function BossHomeModel:GetShortNameStr( str )
  290. str = str or ""
  291. if SubStringGetTotalIndex(str) > 8 then
  292. return SubStringUTF8(str, 1, 8) .. "..."
  293. else
  294. return str
  295. end
  296. end
  297. function BossHomeModel:GetHurtNumStr( num )
  298. num = num or 0
  299. if num >= 0 and num <= 99999 then
  300. return num
  301. elseif num >= 100000 and num <= 99999999 then
  302. return string.format("%.1f万", num / 10000)
  303. elseif num >= 100000000 and num <= 99999999999 then
  304. return string.format("%.2f亿", num / 100000000)
  305. elseif num >= 100000000000 and num <= 999999999999 then
  306. return string.format("%.2f千亿", num / 100000000000)
  307. elseif num >= 1000000000000 and num <= 9999999999999 then
  308. return string.format("%.1f千亿", num / 100000000000)
  309. end
  310. return string.format("%.1f千亿", num / 100000000000)
  311. end
  312. --根据当前boss_id获取boss类型(通用)--boss之家12 --社团之家13
  313. function BossHomeModel:GetBossTypeByBossId( boss_id )
  314. if not boss_id then return end
  315. if self:GetBossHomeCFGById(boss_id) then
  316. return Config.ConfigBoss.ModuleId.BossHome
  317. elseif self:GetGuildBossHomeCFGById(boss_id) then
  318. return Config.ConfigBoss.ModuleId.GuildBossHome
  319. end
  320. end
  321. --离开场景清除数据
  322. function BossHomeModel:LeaveSceneClear( type_id )
  323. self.boss_hurt_info = {}
  324. self.scene_boss_hp = {}
  325. self.my_hurt_only = false
  326. end
  327. --boss自己的总伤害(只在组队状态下有用)
  328. function BossHomeModel:GetMyHurtOnly( )
  329. return self.my_hurt_only
  330. end
  331. function BossHomeModel:SetMyHurtOnly( value )
  332. self.my_hurt_only = value
  333. end
  334. function BossHomeModel:GetBossHurtInfo( type_id,role_id )
  335. if not type_id then return end
  336. if self.boss_hurt_info[type_id] then
  337. if role_id then
  338. return self.boss_hurt_info[type_id][role_id]
  339. else
  340. return self.boss_hurt_info[type_id]
  341. end
  342. end
  343. return {}
  344. end
  345. function BossHomeModel:GetSceneBossHp( type_id )
  346. return self.scene_boss_hp[type_id] or 0
  347. end
  348. function BossHomeModel:ResetBossHurtInfo( type_id )
  349. if not type_id then return end
  350. self.boss_hurt_info[type_id] = {}
  351. self.scene_boss_hp[type_id] = 0
  352. end
  353. function BossHomeModel:SetBossHurtInfo( boss_id,role_id,name,hurt,boss_hp,type )
  354. if not boss_id then return end
  355. local type_id = self:GetBossTypeByBossId(boss_id)
  356. if role_id and hurt and name and type_id then
  357. self.boss_hurt_info[type_id] = self.boss_hurt_info[type_id] or {}
  358. self.boss_hurt_info[type_id][role_id] =
  359. {
  360. ["role_id"] = role_id,
  361. ["name"] = name,
  362. ["hurt"] = hurt,
  363. ["type"] = type,
  364. }
  365. end
  366. if boss_hp and type_id then
  367. self.scene_boss_hp[type_id] = boss_hp
  368. end
  369. end
  370. ---红点
  371. function BossHomeModel:CheckBossHomeRedByType(red_type, ...)
  372. local args = {...}
  373. local bool = false
  374. if red_type == BossConst.RedType.ModuleOpen then -- 模块开放红点,终身一次
  375. bool = self:SetBossHomeFirstRed(args[1])
  376. elseif red_type == BossConst.RedType.Login then -- 登录红点,登录一次
  377. bool = self:SetBossHomeLoginRed(args[1])
  378. end
  379. self.boss_home_red_cache[red_type] = bool
  380. BossModel.Instance:Fire(BossModel.EVENT_UPDATE_RED_DOT)
  381. end
  382. function BossHomeModel:GetBossHomeRedCache(red_type)
  383. if red_type then
  384. return self.boss_home_red_cache[red_type] or false
  385. else
  386. for k, v in pairs(self.boss_home_red_cache) do
  387. if v then return true end
  388. end
  389. return false
  390. end
  391. end
  392. function BossHomeModel:SetBossHomeFirstRed(bool)
  393. if GetModuleIsOpen(462) then
  394. self.first_open_red = bool
  395. else
  396. self.first_open_red = false
  397. end
  398. return self.first_open_red
  399. end
  400. function BossHomeModel:GetBossHomeFirstRed( )
  401. return self.first_open_red
  402. end
  403. -- 登录红点
  404. function BossHomeModel:SetBossHomeLoginRed( )
  405. self.boss_home_login_red = self.boss_home_login_red and GetModuleIsOpen(462)
  406. return self.boss_home_login_red
  407. end