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

253 lines
9.3 KiB

  1. RedPacketModel = RedPacketModel or BaseClass(BaseModel)
  2. RedPacketModel.REQUEST_CCMD_EVENT = "RedPacketModel.REQUEST_CCMD_EVENT"
  3. RedPacketModel.UPDATE_GUILD_RP_LIST = "RedPacketModel.UPDATE_GUILD_RP_LIST"
  4. RedPacketModel.OPEN_GUILD_REDPACKET_VIEW = "RedPacketModel.OPEN_GUILD_REDPACKET_VIEW" --打开社团红包界面
  5. RedPacketModel.OPEN_GUILD_REDPACKET_RESULT_VIEW = "RedPacketModel.OPEN_GUILD_REDPACKET_RESULT_VIEW" --打开社团红包领取结果界面
  6. RedPacketModel.UPDATE_GUILD_REDPACKET_RED = "RedPacketModel.UPDATE_GUILD_REDPACKET_RED" --更新社团红包红点
  7. function RedPacketModel:__init()
  8. RedPacketModel.Instance = self
  9. self.red_packet_list = {}
  10. -- self.has_not_look_list = {} -- 已查看的红包列表,格式为红包唯一id = true
  11. self.guild_rp_times = 0 -- 今日已领社团红包个数
  12. self.guild_rp_gold = 0 -- 今日已领社团红包彩钻
  13. self.guild_rp_bgold = 0 -- 今日已领社团红包红钻
  14. self.guild_rp_limit = 0 -- 社团红包上限个数
  15. self.guild_rp_red = false -- 社团红包红点缓存
  16. end
  17. function RedPacketModel:GetInstance()
  18. if RedPacketModel.Instance == nil then
  19. RedPacketModel.New()
  20. end
  21. return RedPacketModel.Instance
  22. end
  23. function RedPacketModel:CheckShowMsgTip(forceShow)
  24. -- local flag = forceShow or self:GetGuildRedPacketRed()
  25. -- if flag then
  26. -- MsgManager:getInstance():Add({type=Config.ConfigMainIcon.TipType.guild_redpacket, zoom=true})
  27. -- else
  28. -- if MsgManager:getInstance():IsMsgTypeShow(Config.ConfigMainIcon.TipType.guild_redpacket) then
  29. -- MsgManager:getInstance():Remove(Config.ConfigMainIcon.TipType.guild_redpacket)
  30. -- end
  31. -- end
  32. end
  33. -- 检查红点
  34. function RedPacketModel:CheckGuildRedPacketRed()
  35. -- 初始化红点
  36. self.guild_rp_red = false
  37. -- 有加入社团才有红点
  38. local guild_id = RoleManager.Instance.mainRoleInfo.guild_id
  39. if guild_id ~= 0 then
  40. -- 是否已经达到红钻红包的领取限制
  41. local bgold_rp_limit = self:IsGuildRedPacketInLimit()
  42. --把其他人待发的红包过滤掉 条件:其他人、status为0
  43. local my_role_id = RoleManager.Instance.mainRoleInfo.role_id
  44. local rp_temp_cfg
  45. for k, v in pairs(self.red_packet_list) do
  46. if (v.status == 0 and v.role_id == my_role_id) then -- 自己有可以发的红包
  47. self.guild_rp_red = true
  48. break
  49. else
  50. if (v.receive_status == 1 and v.status == 1) then
  51. rp_temp_cfg = Config.Redpacket[v.packet_id]
  52. if rp_temp_cfg.kind == 3 then -- 交易券红包,有了就有红点
  53. self.guild_rp_red = true
  54. break
  55. elseif rp_temp_cfg.kind == 2 and not bgold_rp_limit then -- 红钻,需要判断是否达到了当日红钻红包领取限制
  56. self.guild_rp_red = true
  57. break
  58. end
  59. end
  60. end
  61. end
  62. end
  63. self:Fire(RedPacketModel.UPDATE_GUILD_REDPACKET_RED, self.guild_rp_red)
  64. return self.guild_rp_red
  65. end
  66. function RedPacketModel:GetGuildRedPacketRed( )
  67. return self.guild_rp_red
  68. end
  69. -- 获取社团红包列表 33901
  70. function RedPacketModel:SetGuildRedpacketList(vo)
  71. if not vo then return end
  72. vo.red_packet_list = self:SortRedPacketList(vo.red_packet_list)
  73. self.red_packet_list = vo.red_packet_list
  74. end
  75. function RedPacketModel:SortRedPacketList(list)
  76. --把其他人待发的红包过滤掉 条件:其他人、status为0
  77. local my_role_id = RoleManager.Instance.mainRoleInfo.role_id
  78. for k = #list, 1, -1 do
  79. if list[k].status == 0 and list[k].role_id ~= my_role_id then
  80. table.remove(list, k)
  81. end
  82. end
  83. for k, v in pairs(list) do
  84. if v.status == 0 then -- 还没发的红包,置顶
  85. v.sort_level = 1
  86. elseif v.status == 1 then -- 发出去的红包,收到协议时未领完
  87. if v.receive_status == 3 then -- 已经领了的放到4
  88. v.sort_level = 4
  89. elseif v.receive_status == 2 then -- 领不到了,统一到4
  90. v.sort_level = 3
  91. elseif v.receive_status == 1 then -- 还能领,排在2
  92. v.sort_level = 2
  93. end
  94. elseif v.status == 2 then -- 已领完,去4
  95. if v.receive_status == 2 then -- 已经领了的放到4
  96. v.sort_level = 3
  97. else -- 领不到了,统一到4
  98. v.sort_level = 4
  99. end
  100. end
  101. end
  102. local sort_func = function ( a, b )
  103. if a.sort_level ~= b.sort_level then
  104. return a.sort_level < b.sort_level
  105. else
  106. return a.id < b.id -- 同排序等级则按id排序
  107. end
  108. end
  109. table.sort(list, sort_func)
  110. return list
  111. end
  112. function RedPacketModel:GetGuildRedpacketList( )
  113. return self.red_packet_list
  114. end
  115. -- 玩家领取红包,更新缓存红包状态并展示 33902
  116. function RedPacketModel:UpdateGuildRedpacket(vo)
  117. -- 打开新红包,清除前端新红包列表缓存
  118. -- self.has_not_look_list[tonumber(vo.red_envelopes_id)] = nil
  119. for k,v in pairs(self.red_packet_list) do
  120. if v.id == vo.red_envelopes_id then
  121. v.has_look = 1
  122. v.status = vo.status
  123. v.receive_money = vo.receive_money
  124. v.receive_status = vo.receive_money == 0 and 2 or 3
  125. break
  126. end
  127. end
  128. self:SortRedPacketList(self.red_packet_list)
  129. end
  130. --收到社团新红包 33904
  131. function RedPacketModel:UpdateGuildNewRedPacket(vo)
  132. -- 先遍历已有的红包列表,确认这个红包不存在再插入到红包表中
  133. local exist_rp_list = {}
  134. for k, v in pairs(self.red_packet_list) do
  135. exist_rp_list[v.id] = v.id
  136. end
  137. for k, v in pairs(vo.red_envelopes_list) do
  138. if not exist_rp_list[v.id] then
  139. -- 前端缓存这个红包尚未查看
  140. -- self.has_not_look_list[tonumber(v.id)] = true
  141. table.insert(self.red_packet_list, 1, v)
  142. else--如果发现列表中已经有这个红包,那必然是玩家刚刚发的红包,直接覆盖原数据
  143. -- self.has_not_look_list[tonumber(v.id)] = true
  144. for kk,vv in pairs(self.red_packet_list) do
  145. if vv.id == v.id then
  146. self.red_packet_list[kk] = v
  147. end
  148. end
  149. end
  150. end
  151. self:SortRedPacketList(self.red_packet_list)
  152. end
  153. -- 获取社团红包的领取情况 33908
  154. function RedPacketModel:SetGuildRedPacketRecord(vo)
  155. if not vo then return end
  156. self.guild_rp_times = vo.times
  157. self.guild_rp_gold = vo.gold
  158. self.guild_rp_bgold = vo.bgold
  159. self.guild_rp_limit = vo.limit
  160. end
  161. -- 判断【红钻】红包领取是否达到上限,交易券红包不会被这个判断影响,注意区分
  162. function RedPacketModel:IsGuildRedPacketInLimit( )
  163. local guild_bgold_limit_cfg = GuildModel:getInstance():GetGuildKvByKey("red_packet_limit")
  164. local bgold_limit = guild_bgold_limit_cfg and guild_bgold_limit_cfg.val or 0
  165. return self.guild_rp_times >= self.guild_rp_limit or self.guild_rp_bgold >= bgold_limit
  166. end
  167. function RedPacketModel:GetGuildRedPacketRecord( )
  168. return self.guild_rp_times, self.guild_rp_limit, self.guild_rp_bgold
  169. end
  170. --设置在线人数
  171. -- function RedPacketModel:SetOnlineNum(vo )
  172. -- self.on_line_num = vo
  173. -- end
  174. -- function RedPacketModel:GetOnlineNum( )
  175. -- return self.on_line_num
  176. -- end
  177. --设置红包个人奖励领取上限
  178. -- function RedPacketModel:SetSingleGetAwardLimit ( vo )
  179. -- self.single_get_limnt = vo
  180. -- end
  181. --获得红包可领数量
  182. function RedPacketModel:GetRedPacketNumCan( )
  183. local guild_id = RoleManager.Instance.mainRoleInfo.guild_id
  184. -- 没加入社团就没有红包可以拿
  185. if guild_id == 0 then return 0 end
  186. local red_list = self:GetGuildRedpacketList()
  187. local my_role_id = RoleManager.Instance.mainRoleInfo.role_id
  188. local guild_rp_times, guild_rp_limit, guild_rp_bgold = self:GetGuildRedPacketRecord( )
  189. local max_rest_time = math.abs(guild_rp_times - guild_rp_limit)
  190. local bgold_rp_limit = self:IsGuildRedPacketInLimit()
  191. -------------------------
  192. local red_num = 0
  193. -------------------------
  194. local rp_temp_cfg
  195. if max_rest_time > 0 then
  196. for k,v in pairs(red_list) do
  197. if (v.receive_status == 1 and v.status == 1) then
  198. rp_temp_cfg = Config.Redpacket[v.packet_id]
  199. if rp_temp_cfg.kind == 3 then -- 交易券,没有限制
  200. red_num = red_num + 1
  201. elseif rp_temp_cfg.kind == 2 and not bgold_rp_limit then -- 红钻,需要限制
  202. red_num = red_num + 1
  203. end
  204. end
  205. end
  206. end
  207. return max_rest_time > red_num and red_num or max_rest_time
  208. end
  209. --获取一个可领红包 igonre_id:忽略的红包唯一id
  210. function RedPacketModel:GetOneRedPacketCan(igonre_id)
  211. local red_list = self:GetGuildRedpacketList()
  212. local my_role_id = RoleManager.Instance.mainRoleInfo.role_id
  213. local guild_rp_times, guild_rp_limit, guild_rp_bgold = self:GetGuildRedPacketRecord( )
  214. local max_rest_time = math.abs(guild_rp_times - guild_rp_limit)
  215. local bgold_rp_limit = self:IsGuildRedPacketInLimit()
  216. -------------------------
  217. local get_data = false
  218. -------------------------
  219. local rp_temp_cfg
  220. if max_rest_time > 0 then
  221. for k,v in pairs(red_list) do
  222. if (v.receive_status == 1 and v.status == 1) and ((igonre_id and igonre_id ~= v.id) or not igonre_id) then
  223. rp_temp_cfg = Config.Redpacket[v.packet_id]
  224. if rp_temp_cfg.kind == 3 then -- 交易券,可以直接开
  225. get_data = v
  226. break
  227. elseif rp_temp_cfg.kind == 2 and not bgold_rp_limit then -- 红钻,判断是否到达限制
  228. get_data = v
  229. break
  230. end
  231. end
  232. end
  233. end
  234. return get_data
  235. end