|
|
- -- <*
- -- @Author: Saber
- -- @Description: 招财猫活动model
- -- *>
-
- FortuneCatModel = FortuneCatModel or BaseClass(BaseVo, true)
-
- FortuneCatModel.REQUEST_CCMD_EVENT = "FortuneCatModel.REQUEST_CCMD_EVENT" -- 请求协议
- FortuneCatModel.OPEN_FORTUNE_CAT_VIEW = "FortuneCatModel.OPEN_FORTUNE_CAT_VIEW" -- 打开招财猫主界面
- FortuneCatModel.UPDATE_FORTUNE_CAT_CONFIG = "FortuneCatModel.UPDATE_FORTUNE_CAT_CONFIG" -- 更新协议返回的活动配置
- FortuneCatModel.UPDATE_FORTUNE_CAT_ROLL_TIME = "FortuneCatModel.UPDATE_FORTUNE_CAT_ROLL_TIME" -- 更新招财猫活动信息
- FortuneCatModel.UPDATE_FORTUNE_CAT_RESULT = "FortuneCatModel.UPDATE_FORTUNE_CAT_RESULT" -- 更新招财猫抽奖结果
- FortuneCatModel.UPDATE_FORTUNE_CAT_ROLL_RECORD = "FortuneCatModel.UPDATE_FORTUNE_CAT_ROLL_RECORD" -- 更新招财猫服务器抽奖记录信息
- FortuneCatModel.OPEN_FORTUNE_CAT_AD_VIEW = "FortuneCatModel.OPEN_FORTUNE_CAT_AD_VIEW" -- 打开招财猫广告界面
-
- FortuneCatModel.AnimRollTime = 8 -- 抽奖动画中旋转圈数
- FortuneCatModel.AnimTime = 10 -- 抽奖动画持续时间
- FortuneCatModel.AnimAmountDiv = 0.2 -- 动画快慢速阈值(0~1),数值越大,旋转加速动画区间越大
- FortuneCatModel.RecordAnimDuration = 6 -- 抽奖记录滚动间隔(秒)
-
-
- local FortuneCatModel = FortuneCatModel
-
- function FortuneCatModel:__init()
- FortuneCatModel.Instance = self
- self:Reset()
- end
-
- function FortuneCatModel:Reset()
- self.fortune_cat_cfg = nil -- 招财猫活动配置信息
- self.fc_roll_time = {} -- 招财猫活动抽奖信息 格式为[活动主类型][活动子类型] = 次数
- self.fc_roll_result = {} -- 招财猫活动信息抽奖结果缓存
- self.fc_roll_record = {} -- 招财猫活动服务器抽奖记录信息
- self.fc_red_cache = {} -- 招财猫红点缓存
- -- 广告界面
- self.fc_login_ad_view_flag = false -- 本次登录是否已经检测过广告界面的弹出
- -- 跳过动画
- self._skip_anim_cache = false
- -- 限制票字
- self._is_fc_view_open = false
- end
-
- function FortuneCatModel:getInstance()
- if self.Instance == nil then
- self.Instance = FortuneCatModel.New()
- end
- return self.Instance
- end
-
- -- 协议部分
- -- 通过协议设置活动配置缓存 33219
- function FortuneCatModel:SetFortuneCatConfig(vo)
- if not vo then return end
- self.fortune_cat_cfg = {}
- local temp_tb1, temp_tb2
- for k, v in ipairs(vo.cfglist) do
- self.fortune_cat_cfg[v.base_type] = self.fortune_cat_cfg[v.base_type] or {}
- self.fortune_cat_cfg[v.base_type][v.sub_type] = self.fortune_cat_cfg[v.base_type][v.sub_type] or {}
- -- 对抽奖次数配置和档位倍率配置进行重新排序,用对应的值作为键值
- temp_tb1 = {}
- for k2, v2 in ipairs(v.confs) do
- temp_tb1[v2.times] = v2
- end
- v.confs = temp_tb1
- -- temp_tb2 = {}
- -- for k2, v2 in ipairs(v.rebacks) do
- -- temp_tb2[v2.sort] = v2
- -- end
- -- v.rebacks_sorted = temp_tb2
- self.fortune_cat_cfg[v.base_type][v.sub_type] = v
- end
- end
- function FortuneCatModel:GetFortuneCatConfig(base_type, sub_type)
- if not sub_type then return nil end
- base_type = base_type or CustomActivityModel.CustomActBaseType.FORTUNE_CAT
- if self.fortune_cat_cfg then
- return self.fortune_cat_cfg[base_type] and self.fortune_cat_cfg[base_type][sub_type] or nil
- else
- -- 如果没有数据则要及时请求33219
- self:Fire(FortuneCatModel.REQUEST_CCMD_EVENT, 33219)
- end
- return nil
- end
-
- -- 缓存单个招财猫活动的已抽奖次数信息 33220
- function FortuneCatModel:SetFortuneCatRollTimes(vo)
- if not vo then return end
- self.fc_roll_time[vo.base_type] = self.fc_roll_time[vo.base_type] or {}
- self.fc_roll_time[vo.base_type][vo.sub_type] = self.fc_roll_time[vo.base_type][vo.sub_type] or {}
- self.fc_roll_time[vo.base_type][vo.sub_type].times = vo.times
- -- 这么写是因为33221抽奖协议不会把累充发过来
- self.fc_roll_time[vo.base_type][vo.sub_type].recharge = vo.recharge or self.fc_roll_time[vo.base_type][vo.sub_type].recharge
- self.fc_login_ad_view_flag = CookieWrapper.Instance:GetCookie(CookieLevelType.Account, CookieKey.FORTUNECAT_AD_HAS_SHOWN) or false
- -- 添加活动按钮
- self:CheckEventOpen(vo.base_type, vo.sub_type)
- end
- function FortuneCatModel:GetFortuneCatRollTimes(base_type, sub_type)
- base_type = base_type or CustomActivityModel.CustomActBaseType.FORTUNE_CAT
- if sub_type then
- return self.fc_roll_time[base_type] and self.fc_roll_time[base_type][sub_type] or nil
- else
- return self.fc_roll_time[base_type]
- end
- end
-
- -- 缓存招财猫抽奖结果 33221
- function FortuneCatModel:SetFortuneCatRollResult(vo)
- if not vo then return end
- -- 更新抽奖次数
- self:SetFortuneCatRollTimes(vo)
-
- self.fc_roll_result[vo.base_type] = self.fc_roll_result[vo.base_type] or {}
- self.fc_roll_result[vo.base_type][vo.sub_type] = self.fc_roll_result[vo.base_type][vo.sub_type] or {}
- self.fc_roll_result[vo.base_type][vo.sub_type].sort = vo.sort
- self.fc_roll_result[vo.base_type][vo.sub_type].mult = vo.mult
- end
- function FortuneCatModel:GetFortuneCatRollResult(base_type, sub_type)
- base_type = base_type or CustomActivityModel.CustomActBaseType.FORTUNE_CAT
- if sub_type then
- return self.fc_roll_result[base_type] and self.fc_roll_result[base_type][sub_type] or nil
- else
- return self.fc_roll_result[base_type]
- end
- end
- -- 插入玩家的抽奖信息
- function FortuneCatModel:UpdateFortuneCatRollRecord(vo, info)
- self.fc_roll_record[vo.base_type] = self.fc_roll_record[vo.base_type] or {}
- self.fc_roll_record[vo.base_type][vo.sub_type] = self.fc_roll_record[vo.base_type][vo.sub_type] or {}
- table.insert(self.fc_roll_record[vo.base_type][vo.sub_type], 1, info)
- end
-
- -- 更新招财猫活动服务器抽奖记录信息 33222
- function FortuneCatModel:SetFortuneCatRollRecord(vo)
- if not vo then return end
- self.fc_roll_record[vo.base_type] = self.fc_roll_record[vo.base_type] or {}
- self.fc_roll_record[vo.base_type][vo.sub_type] = vo.list
- end
- -- 获取招财记录信息 only_personal:只拿自己的记录
- function FortuneCatModel:GetFortuneCatRollRecord(base_type, sub_type, only_personal)
- base_type = base_type or CustomActivityModel.CustomActBaseType.FORTUNE_CAT
- if sub_type then
- if only_personal then
- local data = self.fc_roll_record[base_type] and self.fc_roll_record[base_type][sub_type] or {}
- local role_id = RoleManager.Instance.mainRoleInfo.role_id
- local tb = {}
- for k, v in ipairs(data) do
- if v.role_id == role_id then
- tb[#tb+1] = v
- end
- end
- return tb
- else
- return self.fc_roll_record[base_type] and self.fc_roll_record[base_type][sub_type] or {}
- end
- else
- return {}
- end
- end
-
- -- 按钮控制相关
- -- 检查主界面按钮是否开启 sub_type:传入时检查对应的子类型,不穿则遍历331返回的目标类型[64]的缓存活动表
- function FortuneCatModel:CheckEventOpen(base_type, sub_type)
- if not GetModuleIsOpen(331, 64) then return end
-
- base_type = base_type or CustomActivityModel.CustomActBaseType.FORTUNE_CAT
- local function check_func(event_data)
- if event_data then
- local icon_sub_type_base = event_data.base_type*1000
- if event_data.sub_type >= 10001 then
- icon_sub_type_base = event_data.base_type*100000
- end
- if event_data.etime then
- local is_open = event_data.etime - TimeUtil:getServerTime()
- if is_open then
- -- ActivityIconManager:getInstance():addIcon(icon_sub_type_base + event_data.sub_type, event_data.etime - TimeUtil:getServerTime())
- ActivityIconManager:getInstance():addIcon(icon_sub_type_base + event_data.sub_type, -1)--2021.8.2鸿杰说干掉彩钻星轮倒计时显示
- else
- ActivityIconManager:getInstance():deleteIcon(icon_sub_type_base + event_data.sub_type)
- end
- else
- ActivityIconManager:getInstance():deleteIcon(icon_sub_type_base + event_data.sub_type)
- end
- end
- end
- -- 不存在子类型,就要获取目标活动的全部类型列表遍历
- if not sub_type then
- local fc_event_all_list = CustomActivityModel:getInstance():getAllActListByBaseType(base_type)
- for k, v in pairs(fc_event_all_list) do
- check_func(v)
- end
- else
- local event_data = CustomActivityModel:getInstance():getActList(base_type, sub_type)
- if event_data then
- check_func(event_data)
- else--活动消失要删除图标
- local icon_sub_type_base = base_type*1000
- if sub_type >= 10001 then
- icon_sub_type_base = base_type*100000
- end
- ActivityIconManager:getInstance():deleteIcon(icon_sub_type_base + sub_type)
- end
- end
- end
-
- -- 通过抽奖信息来构建奖励界面
- function FortuneCatModel:ShowDrawRewardEffect(fc_cfg, target_id, roll_cost)
- if fc_cfg and target_id and roll_cost then
- local mult = 1
- for k, v in pairs(fc_cfg.rebacks) do
- if v.sort == target_id then
- -- 后端配置倍率放大了100倍
- mult = v.mult * 0.01
- break
- end
- end
- -- 构造彩钻数据结构表,创建奖励界面
- local data = {}
- data.award = {
- [1] = {1, 100000, math.floor(roll_cost * mult)}
- }
- data.col_num = 5
- -- GlobalEventSystem:Fire(EventName.OPEN_COM_AWARD_RESULT_VIEW, data)
- GiftModel:getInstance():Fire(GiftModel.OPEN_SHOW_ACT_GOODS_VIEW, data.award)
- --飘字
- local goods_fly_data = {
- [1] = {
- goods_type_id = 100000,
- num = math.floor(roll_cost * mult),
- }
- }
- if TableSize(goods_fly_data) > 0 then
- MainUIModel:getInstance():AddFloatInfo(goods_fly_data, true)
- end
- end
- end
-
- -- 根据活动子类型和招财次数获取当次招财的钻石花费
- function FortuneCatModel:GetDiamondCostBySubtypeAndTimes(sub_type, times)
- if not sub_type or not times then return nil end
- local cfg = self:GetFortuneCatConfig(nil, sub_type)
- if cfg then
- local cost
- for k, v in pairs(cfg.confs) do
- if v.times == times then
- return v.cost
- end
- end
- end
- return nil
- end
-
- -- 红点相关
- -- 检测所有子类型的红点 (目前主要用于彩钻数据更新后刷新红点,由外部定时刷新,不要单独调用)
- function FortuneCatModel:CheckFCAllSubTypeRed( )
- local fc_event_all_list = CustomActivityModel:getInstance():getAllActListByBaseType(CustomActivityModel.CustomActBaseType.FORTUNE_CAT)
- if fc_event_all_list then
- for k, v in pairs(fc_event_all_list) do
- self:CheckFortuneCatRed(v.sub_type)
- end
- end
- end
-
- function FortuneCatModel:CheckFortuneCatRed(sub_type)
- if not sub_type then return end
- local base_type = CustomActivityModel.CustomActBaseType.FORTUNE_CAT
- -- 招财数据和招财配置
- local fc_data = self:GetFortuneCatRollTimes(base_type, sub_type)
- local fc_cfg = self:GetFortuneCatConfig(base_type, sub_type)
- if not fc_data or not fc_cfg then
- self.fc_red_cache[sub_type] = false
- return
- end
- local times = fc_data.times or 0
- local recharge = fc_data.recharge or 0
- -- 先判断是否已经抽完了
- local is_finished = fc_cfg.max_times <= times
- -- 这个次数是已抽次数,前端获取配置时要+1
- local roll_time = is_finished and fc_data.times or fc_data.times + 1
- -- 计算出当前充值额度下还有几次转盘次数
- local left_roll_time = 0
- local cost = nil -- 只保存最近一档的转盘花费
- if not is_finished then
- for i = roll_time, fc_cfg.max_times do
- if recharge >= fc_cfg.confs[i].recharge then
- left_roll_time = left_roll_time + 1
- cost = cost or fc_cfg.confs[i].cost
- else
- break
- end
- end
- end
- local jin = RoleManager.Instance.mainRoleInfo.jin
- local login_red_list = self:GetFortuneCatLoginCookie()--每日登陆红点
- if left_roll_time <= 0 and not login_red_list[sub_type] then -- 如果次数用完且还有登录红点,就干掉登录红点
- self:SetFortuneCatLoginCookie(sub_type)
- end
- local bool = left_roll_time > 0 and (cost and cost <= jin) or not login_red_list[sub_type]
- self.fc_red_cache[sub_type] = bool
-
- -- 更新到主界面按钮上
- local icon_sub_type_base = base_type*1000
- if sub_type >= 10001 then
- icon_sub_type_base = base_type*100000
- end
- GlobalEventSystem:Fire(ActivityIconManager.UPDATE_ICON_TIPS, icon_sub_type_base + sub_type, bool)
-
- -- self:CheckAdViewOpen()--取消主动弹广告改为任务弹
- end
-
- function FortuneCatModel:GetFortuneCatRedCache(sub_type)
- return sub_type and self.fc_red_cache[sub_type] or false
- end
-
- -- 进入活动界面之后就干掉外部红点
- function FortuneCatModel:ShutDownFcLoginRed(sub_type)
- self:SetFortuneCatLoginCookie(sub_type)
- self:CheckFortuneCatRed(sub_type)
- end
-
- function FortuneCatModel:CheckAdViewOpen( )
- local lv = RoleManager.Instance.mainRoleInfo.level
- local can_show = Config.Modulesub["331@64"].icon_lv <= lv
- -- 打开广告界面
- if not self.fc_login_ad_view_flag and can_show then
- local event_data = CustomActivityModel:getInstance():getActList(CustomActivityModel.CustomActBaseType.FORTUNE_CAT)
- if event_data and event_data.etime - TimeUtil:getServerTime() > 0 then
- local function delay_method( )
- self:Fire(FortuneCatModel.OPEN_FORTUNE_CAT_AD_VIEW, true, event_data.sub_type)
- end
- setTimeout(delay_method, 1)
- end
- end
- end
-
- -- 设置广告界面检测状态
- function FortuneCatModel:SetFcAdViewOpenFlag( )
- CookieWrapper.Instance:SaveCookie(CookieLevelType.Account, CookieTimeType.TYPE_ALWAYS, CookieKey.FORTUNECAT_AD_HAS_SHOWN, true)
- CookieWrapper.Instance:WriteAll()
- self.fc_login_ad_view_flag = true
- end
-
- function FortuneCatModel:GetGoodsCanFly( )
- return self._is_fc_view_open
- end
-
- --设置招财猫每日登陆红点cookie
- function FortuneCatModel:SetFortuneCatLoginCookie( sub_type )
- local list = self:GetFortuneCatLoginCookie() or {}
- list[sub_type] = true
- CookieWrapper.Instance:SaveCookie(CookieLevelType.Account,CookieTimeType.TYPE_DAY2,CookieKey.FORTUNE_CAT_LOGIN_RED,list)
- CookieWrapper.Instance:WriteAll()
- end
-
- --获得招财猫每日登陆红点cookie
- function FortuneCatModel:GetFortuneCatLoginCookie( )
- local bool = CookieWrapper.Instance:GetCookie(CookieLevelType.Account,CookieKey.FORTUNE_CAT_LOGIN_RED) or {}
- return bool
- end
|