源战役客户端
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.

490 lines
17 KiB

  1. BagModel = BagModel or BaseClass(BaseVo)
  2. BagModel.OPEN_BATHANDLE_VIEW = "BagModel.OPEN_BATHANDLE_VIEW"
  3. BagModel.OPEN_ENLARGE_VIEW = "BagModel.OPEN_ENLARGE_VIEW"
  4. BagModel.OPEN_ALL_ADDITION_VIEW = "BagModel.OPEN_ALL_ADDITION_VIEW"
  5. BagModel.OPEN_SELL_VIEW = "BagModel.OPEN_SELL_VIEW"
  6. BagModel.OPEN_DEPOT_VIEW = "BagModel.OPEN_DEPOT_VIEW"
  7. BagModel.CLICK_BAG_ITEM = "BagModel.CLICK_BAG_ITEM"
  8. BagModel.OPEN_EQUIP_DECOMPOSE_VIEW = "BagModel.OPEN_EQUIP_DECOMPOSE_VIEW"
  9. BagModel.EQUIP_ITEM_GET_WAY_TIPS = "BagModel.EQUIP_ITEM_GET_WAY_TIPS"
  10. BagModel.CLOSE_EQUIP_ITEM_GET_WAY_TIPS = "BagModel.CLOSE_EQUIP_ITEM_GET_WAY_TIPS"
  11. BagModel.CLOSE_SELL_VIEW = "BagModel.CLOSE_SELL_VIEW"
  12. --吞噬
  13. BagModel.REQUEST_PROTOCOL = "BagModel.REQUEST_PROTOCOL"
  14. BagModel.CLOSE_SWALLOW_SELECT_CONTENT = "BagModel.CLOSE_SWALLOW_SELECT_CONTENT"
  15. BagModel.SELECT_SWALLOW_TYPE = "BagModel.SELECT_SWALLOW_TYPE"
  16. BagModel.CLICK_EQUIP_ITEM = "BagModel.CLICK_EQUIP_ITEM"
  17. BagModel.REFRESH_SWALLOW_INIT = "BagModel.REFRESH_SWALLOW_INIT"
  18. BagModel.REFRESH_SWALLOW_RESULT = "BagModel.REFRESH_SWALLOW_RESULT"
  19. BagModel.CLICK_SWALLOW_CORE_ITEM = "BagModel.CLICK_SWALLOW_CORE_ITEM"
  20. BagModel.UPDATE_EQUIP_GOODS = "BagModel.UPDATE_EQUIP_GOODS"
  21. BagModel.ANS_UPDATE_EQUIP_RED = "BagModel.ANS_UPDATE_EQUIP_RED"
  22. BagModel.UPDATE_AUTO_SWALLOW_STATE = "BagModel.UPDATE_AUTO_SWALLOW_STATE"
  23. BagModel.SORT_BAG_AFTER_SWALLOW = "BagModel.SORT_BAG_AFTER_SWALLOW"--关闭吞噬界面后要整理一次背包
  24. BagModel.UPDATE_SWALLOW_ATTR_SHOW = "BagModel.UPDATE_SWALLOW_ATTR_SHOW"
  25. BagModel.BAG_SWALLOW_CAN_STRENGTH = "BagModel.BAG_SWALLOW_CAN_STRENGTH"--吞噬数量达标,通知变强
  26. --货币兑换
  27. BagModel.OPEN_CURRENCY_EXCHANGE_VIEW = "BagModel.OPEN_CURRENCY_EXCHANGE_VIEW" --打开货币兑换界面
  28. BagModel.UPDATE_CURRENCY_EXCHANGE_VIEW = "BagModel.UPDATE_CURRENCY_EXCHANGE_VIEW" --进行兑换之后刷新货币兑换界面
  29. BagModel.UPDATE_CURRENCY_GOODS_NUM = "BagModel.UPDATE_CURRENCY_GOODS_NUM" --货币礼包数量更新
  30. BagModel.ANS_UPDATE_CURRENCY_EXCHANGE_RED = "BagModel.ANS_UPDATE_CURRENCY_EXCHANGE_RED" --刷新交易券兑换的执行方法
  31. BagModel.UPDATE_CURRENCY_VIEW = "BagModel.UPDATE_CURRENCY_VIEW" --刷新交易券兑换界面
  32. BagModel.OPEN_SUIT_ACTIVE_VIEW = "BagModel.OPEN_SUIT_ACTIVE_VIEW" --打开套装激活界面
  33. BagModel.OPEN_EQUIP_ORANGE_SUIT_VIEW = "BagModel.OPEN_EQUIP_ORANGE_SUIT_VIEW" --打开橙品套装界面
  34. BagModel.SpiritId = 501002 --吞噬模型id
  35. BagModel.StampGoodsId = 101014 --用于兑换交易券的交易卡券物品id
  36. BagModel.FlyGoodsID = 102602 -- 小飞鞋道具id
  37. BagModel.GoodsLimitState =
  38. {
  39. Normal = 0,
  40. Limit = 1,
  41. TimeOut = 2,
  42. }
  43. function BagModel:__init()
  44. BagModel.Instance = self
  45. self.show_bag_view = false
  46. self.Swallow_data = nil
  47. self.Swallow_result_data = nil
  48. self.IsOnClickSwallow = false
  49. self.double_click_time = 0.3
  50. self.Swallow_red = false
  51. self.is_check_swallow_red = false --是否打开过吞噬界面,打开过一次之后,本次登录不再给红点
  52. self.swallow_lv = 0
  53. self.pre_swallow_lv = 0 --进行吞噬之前的吞噬等级
  54. self.swallow_exp = 0
  55. self.pre_swallow_exp = 0
  56. self.is_auto_swallow = false
  57. self.swallow_active_lv = 0 --激活的吞噬特殊属性等级
  58. self.last_sort_bag_time = {}
  59. self.last_swallow_sort_bag_time = 0 --上次吞噬整理背包的时间
  60. self.can_swallow_strength = false
  61. self.currency_exchange_daily_counts = 0 --彩钻兑换交易券今日已使用次数
  62. self.currency_exchange_red = false --交易券兑换红点
  63. self.currency_exchange_free_time = 0 --免费兑换时间
  64. self.currency_exchange_props_red = false--使用道具兑换交易券红点
  65. self.currency_exchange_diamond_red = false--使用彩钻兑换交易券红点
  66. self.swallow_core_cfg = {}
  67. self.show_drop_timeout_props_tips = true --是否提示丢弃过期道具提示
  68. self.bag_quick_buy_toggle = false --背包便捷购买toggle
  69. self.bag_equip_suit_active_red = false
  70. self.bag_equip_suit_active_level_list = false
  71. self.bag_equip_suit_active_task_list = false
  72. self:InitSwallowCoreCfg()
  73. end
  74. function BagModel:getInstance()
  75. if BagModel.Instance == nil then
  76. BagModel.New();
  77. end
  78. return BagModel.Instance
  79. end
  80. function BagModel:OpenBagView()
  81. end
  82. --[[
  83. ===================================== description: =====================================
  84. ]]
  85. --获取全身宝石数、星级和精炼数、圣印精炼数
  86. function BagModel:GetAllAddition()
  87. local strength = 0
  88. local star = 0
  89. local stone = 0
  90. local seal_stren = 0
  91. local function callback_1(dynamic)
  92. strength = strength + (dynamic.stren or 0)
  93. local _star = Config.Equipattr[dynamic.type_id] and Config.Equipattr[dynamic.type_id].star or 0
  94. star = star + _star
  95. if dynamic.stone_list then
  96. for i, v in ipairs(dynamic.stone_list) do
  97. local cfg = Config.Equipstonelv[v.type_id]
  98. if cfg then
  99. stone = stone + cfg.lv
  100. end
  101. end
  102. end
  103. end
  104. for k, v in pairs(GoodsModel:getInstance().wear_equip_list) do
  105. GoodsModel:getInstance():GetDynamic(v.goods_id, callback_1)
  106. end
  107. local function callback_2(dynamic)
  108. seal_stren = seal_stren + (dynamic.stren or 0)
  109. end
  110. for k, v in pairs(GoodsModel:getInstance().seal_equip_dic) do
  111. GoodsModel:getInstance():GetDynamic(v.goods_id, callback_2)
  112. end
  113. return strength, star, stone, seal_stren
  114. end
  115. --获取全身加成的等级和下一级配置
  116. --增加参数 strength_count 精炼数 by lgj
  117. function BagModel:GetBodyPlusConfig(style, strength_count)
  118. local style = style or 1
  119. local list = {}
  120. for i, v in pairs(Config.Equipwholereward) do
  121. if v.type == style then
  122. table.insert(list, v)
  123. end
  124. end
  125. local sort_fun = function (a, b)
  126. return a.need_lv < b.need_lv
  127. end
  128. table.sort(list, sort_fun)
  129. local now_cfg = nil
  130. local next_cfg = nil
  131. local num_list = {}
  132. local num
  133. if strength_count == nil then
  134. num_list[1], num_list[2], num_list[3], num_list[4] = self:GetAllAddition()
  135. num = num_list[style]
  136. else
  137. num = strength_count
  138. end
  139. for i, v in ipairs(list) do
  140. if num >= v.need_lv then
  141. now_cfg = v
  142. else
  143. next_cfg = v
  144. break
  145. end
  146. end
  147. return now_cfg, next_cfg
  148. end
  149. function BagModel:GetSwallowRedDot( )
  150. return self.Swallow_red
  151. end
  152. function BagModel:CheckEquipSwallowRed()
  153. if GetModuleIsOpen(150,4) then
  154. local need_red_num = 10 -- 所需红点的可吞噬装备数
  155. if VipModel:getInstance():IsForeverVip() then
  156. local fly_shoes = GoodsModel:getInstance():GetTypeGoods(BagModel.FlyGoodsID)
  157. if not IsTableEmpty(fly_shoes) then -- 存在一个小飞鞋以上的道具时,红点所需的装备数减少1
  158. need_red_num = 9
  159. end
  160. end
  161. local equips_list = {}
  162. local goods_list = GoodsModel:getInstance().bag_goods_list
  163. for k,v in pairs(goods_list) do
  164. if v.type == GoodsModel.TYPE.EQUIP and v.subtype ~= 8 and v.subtype ~= 9
  165. and v.subtype ~= 10 and v.subtype ~= 11 and v.goods_num >0 and v.color < 3 then
  166. table.insert(equips_list,v)
  167. end
  168. end
  169. local attr_unlock_red = self:CheckSwallowAttrUnlockRed()
  170. -- if self.is_check_swallow_red then --吞噬的红点登录只给一次,但解锁红点除外
  171. -- self.Swallow_red = attr_unlock_red
  172. -- else
  173. -- self.Swallow_red = #equips_list >= need_red_num or attr_unlock_red
  174. -- end
  175. self.Swallow_red = #equips_list >= need_red_num or attr_unlock_red
  176. self.can_swallow_strength = #equips_list >= need_red_num
  177. else
  178. self.Swallow_red = false
  179. self.can_swallow_strength = false
  180. end
  181. --超过10件可吞噬的装备,通知变强
  182. self:Fire(BagModel.BAG_SWALLOW_CAN_STRENGTH,self.can_swallow_strength)
  183. GlobalEventSystem:Fire(EventName.UPDATE_BAG_RED)
  184. end
  185. function BagModel:GetCanSwallowStrength( )
  186. return self.can_swallow_strength
  187. end
  188. function BagModel:CheckEquipSwallowRedByFlyShoesChanges( )
  189. self:CheckEquipSwallowRed()
  190. local goods_model = GoodsModel:getInstance()
  191. -- 获得道具之后尝试自动吞噬
  192. local fly_shoes_num = goods_model:GetTypeGoodsNum(BagModel.FlyGoodsID)
  193. if fly_shoes_num > 0 then
  194. goods_model:AutoSwallow()
  195. end
  196. end
  197. --检查吞噬特殊属性解锁红点
  198. function BagModel:CheckSwallowAttrUnlockRed( )
  199. for i,v in ipairs(self.swallow_core_cfg) do
  200. if self:SwallowCanUnlock(v.lv) then
  201. return true
  202. end
  203. end
  204. return false
  205. end
  206. function BagModel:TrySortBag( pos_type )
  207. if not pos_type then return end
  208. if not self.last_sort_bag_time[pos_type] or Time.time - self.last_sort_bag_time[pos_type] > 5 then
  209. self.last_sort_bag_time[pos_type] = Time.time
  210. GoodsModel:getInstance():Fire(GoodsModel.REQUEST_CCMD_EVENT,15004,pos_type)
  211. return true
  212. else
  213. Message.show("你的"..(pos_type==GoodsModel.GOODS_POS_TYPE.bag and "背包" or "仓库").."整理的太快了,请稍后再操作")
  214. end
  215. end
  216. function BagModel:GetLastSortBagTime( pos_type )
  217. return self.last_sort_bag_time[pos_type] and self.last_sort_bag_time[pos_type] or 0
  218. end
  219. function BagModel:SetSwallowData(vo)
  220. self.swallow_lv = vo.lv
  221. self.swallow_exp = vo.exp
  222. self.is_auto_swallow = vo.is_auto_swallow == 1 and true or false
  223. self.swallow_active_lv = vo.active
  224. end
  225. --初始化法核配置
  226. function BagModel:InitSwallowCoreCfg( )
  227. for k,v in pairs(Config.Goodsdevourextra) do
  228. table.insert(self.swallow_core_cfg,v)
  229. end
  230. table.sort(self.swallow_core_cfg,function(a,b)
  231. return a.lv<b.lv
  232. end)
  233. end
  234. --拿到法核总配置
  235. function BagModel:GetSwallowCoreCfg( )
  236. return self.swallow_core_cfg
  237. end
  238. --拿到当前吞噬等级所处的法核配置
  239. function BagModel:GetNowSwallowCoreCfg()
  240. for i=#self.swallow_core_cfg,1,-1 do
  241. if self.swallow_lv >= self.swallow_core_cfg[i].lv then
  242. return self.swallow_core_cfg[i],i
  243. end
  244. end
  245. return self.swallow_core_cfg[1],1
  246. end
  247. --拿到当前吞噬等级所处的法核itemId
  248. function BagModel:GetNowSwallowCoreItemId()
  249. for i=#self.swallow_core_cfg,1,-1 do
  250. if self.swallow_lv >= self.swallow_core_cfg[i].lv then
  251. return i
  252. end
  253. end
  254. return 1
  255. end
  256. --获取最大的吞噬法核itemid,其实就是配置的条数
  257. function BagModel:GetMaxSwallowCoreItemId( )
  258. return #self.swallow_core_cfg
  259. end
  260. --根据等级拿到法核配置
  261. function BagModel:GetSwallCoreCfgByLv(index)
  262. return self.swallow_core_cfg[index] and self.swallow_core_cfg[index] or self.swallow_core_cfg[1]
  263. end
  264. --判断当前等级的特殊属性能否解锁
  265. function BagModel:SwallowCanUnlock(lv)
  266. if lv>self.swallow_active_lv and lv<=self.swallow_lv then
  267. return true
  268. end
  269. return false
  270. end
  271. --道具是否过期(状态)
  272. function BagModel:GetGoodsLimitState(goods_vo, cur_time)
  273. local s = BagModel.GoodsLimitState.Normal
  274. if goods_vo and goods_vo.goods_id and goods_vo.goods_id ~= 0 and goods_vo.expire_time ~= 0 then
  275. cur_time = cur_time or TimeUtil:getServerTime()
  276. if cur_time > goods_vo.expire_time then
  277. s = BagModel.GoodsLimitState.TimeOut
  278. else
  279. s = BagModel.GoodsLimitState.Limit
  280. end
  281. end
  282. return s
  283. end
  284. --筛选出已经过期的道具
  285. function BagModel:GetTimeOutGoodsList(goods_vo_list)
  286. local t = {}
  287. if goods_vo_list and #goods_vo_list > 0 then
  288. local cur_time = TimeUtil:getServerTime()
  289. for k,v in pairs(goods_vo_list) do
  290. if v.expire_time and v.expire_time > 0 then
  291. if v.expire_time < cur_time and v.goods_num > 0 then
  292. table.insert(t, {goods_id = v.goods_id, type_id = v.type_id, num = v.goods_num})
  293. end
  294. end
  295. end
  296. end
  297. return t
  298. end
  299. --更新今日彩钻兑换交易券已用次数
  300. function BagModel:SetCurrencyExchangeDailyCounts(counts)
  301. self.currency_exchange_daily_counts = counts
  302. end
  303. --获得今日彩钻兑换交易券已用次数
  304. function BagModel:GetCurrencyExchangeDailyCounts( )
  305. return self.currency_exchange_daily_counts
  306. end
  307. --获取拥有最高兑换次数的vip等级
  308. function BagModel:GetCurreccyExchangeMaxVip( )
  309. local max_vip = 0
  310. for k,v in pairs(Config.Vipprivilege) do
  311. if v.class_id == 150 and v.lv >= max_vip then
  312. max_vip = v.lv
  313. end
  314. end
  315. return max_vip
  316. end
  317. --根据当前vip获得彩钻兑换交易券可用次数
  318. function BagModel:GetCurrencyExchangeNumsByVip( )
  319. local my_vip_flag = RoleManager.Instance.mainRoleInfo.vip_flag
  320. if my_vip_flag == 0 then
  321. return 0
  322. else
  323. local privilege_type = 150 --彩钻兑换交易券的vip权限类型
  324. local cfg = self:GetCurrencyVipPrivilege(my_vip_flag)
  325. local max_vip = self:GetCurreccyExchangeMaxVip()
  326. return cfg and cfg.value or self:GetCurrencyVipPrivilege(max_vip).value
  327. end
  328. end
  329. --获取特权表配置
  330. function BagModel:GetCurrencyVipPrivilege(vip_flag)
  331. local privilege_type = 150--兑换交易券的vip权限类型
  332. local cfg = Config.Vipprivilege
  333. for k,v in pairs(cfg) do
  334. if v.lv == vip_flag and v.class_id == privilege_type then
  335. return v
  336. end
  337. end
  338. return nil
  339. end
  340. --当前还剩多少次交易券兑换次数
  341. function BagModel:GetCurrencyExchangeNumsNow( )
  342. return self:GetCurrencyExchangeNumsByVip()-self:GetCurrencyExchangeDailyCounts()
  343. end
  344. --交易券礼包数量监听
  345. function BagModel:OnCurrencyGiftBagGoodsChange( )
  346. self:Fire(BagModel.UPDATE_CURRENCY_GOODS_NUM)
  347. end
  348. --交易券兑换红点
  349. function BagModel:CheckCurrencyExchangeRed( )
  350. local bool = false
  351. self.currency_exchange_props_red = false
  352. self.currency_exchange_diamond_red = false
  353. local stamp_goods_num = GoodsModel:getInstance():GetTypeGoodsNum(BagModel.StampGoodsId) --已有的交易券数量
  354. if stamp_goods_num >= 10 and RoleManager.Instance.mainRoleInfo.level >= 105 then
  355. bool = true
  356. self.currency_exchange_props_red = true
  357. end
  358. --免费兑换时间
  359. if self.currency_exchange_free_time ~= 0 and RoleManager.Instance.mainRoleInfo.level >= 96 then
  360. if not bool then
  361. bool = self.currency_exchange_free_time <= TimeUtil:getServerTime()
  362. end
  363. self.currency_exchange_diamond_red = self.currency_exchange_free_time <= TimeUtil:getServerTime()
  364. end
  365. self.currency_exchange_red = bool
  366. GlobalEventSystem:Fire(EventName.UPDATE_BAG_RED)
  367. end
  368. --获取交易券兑换红点
  369. function BagModel:GetCurrencyExchangeRed( )
  370. return self.currency_exchange_red
  371. end
  372. --获取道具兑换交易券红点
  373. function BagModel:GetCurrencyExchangePropsRed( )
  374. return self.currency_exchange_props_red
  375. end
  376. --获取彩钻兑换交易券红点
  377. function BagModel:GetCurrencyExchangeDiamondRed( )
  378. return self.currency_exchange_diamond_red
  379. end
  380. --交易券兑换红点免费次数的红点
  381. function BagModel:RequestCurrencyExchangeRed( )
  382. if self.currency_exchange_free_time ~= 0 and self.currency_exchange_free_time <= TimeUtil:getServerTime() then
  383. self:Fire(BagModel.REQUEST_PROTOCOL,15026) --打开背包的时候,在检测一次免费兑换次数,刷新红点
  384. end
  385. end
  386. --获取套装fv激活红点
  387. function BagModel:GetBagEquipSuitActiveRedDot( )
  388. return self.bag_equip_suit_active_red
  389. end
  390. --刷新套装激活红点
  391. function BagModel:UpdateBagEquipSuitActiveRedDot( )
  392. local function delay_fun( )
  393. local max = EquipModel.getInstance():GetCurrentOpenSuitSeries()
  394. local can_max = EquipModel.getInstance():GetCanActiveMaxSeries()
  395. local b = can_max > max
  396. if b ~= self.bag_equip_suit_active_red then
  397. self.bag_equip_suit_active_red = b
  398. GlobalEventSystem:Fire(EventName.UPDATE_BAG_RED)
  399. end
  400. end
  401. TimeManager.GetInstance():StartDalayTime("UpdateBagEquipSuitActiveRedDot",0.2,delay_fun)
  402. end
  403. --是否是套装激活的任务id
  404. function BagModel:IsBagEquipSuitActiveTask(task_id)
  405. if not self.bag_equip_suit_active_task_list then
  406. self.bag_equip_suit_active_task_list = {}
  407. local config = Config.Equipmentseriesopen
  408. for i,v in ipairs(config) do
  409. if v.task_id ~= 0 then
  410. self.bag_equip_suit_active_task_list[v.task_id] = true
  411. end
  412. end
  413. end
  414. return self.bag_equip_suit_active_task_list[task_id]
  415. end
  416. --是否是套装激活的level
  417. function BagModel:IsBagEquipSuitActiveLevel(level)
  418. if not self.bag_equip_suit_active_level_list then
  419. self.bag_equip_suit_active_level_list = {}
  420. local config = Config.Equipmentseriesopen
  421. for i,v in ipairs(config) do
  422. self.bag_equip_suit_active_level_list[v.open_lv] = true
  423. end
  424. end
  425. return self.bag_equip_suit_active_level_list[level]
  426. end