local skynet = require "skynet" local oo = require "Class" local log = require "Log" local pb = require "pb" local dataType = require "DataType" local errorInfo = require "ErrorInfo" local shop = require "Shop" local json = require "json" local FishShop = oo.class(shop) FishShop.shopType = dataType.ShopType_Fish FishShop.NPCId = 7 -- 余师傅 -- 初始化渔店数据 function FishShop:InitData(player, shopType) local cfgFishType = skynet.server.gameConfig:GetPlayerAllCfg(player, "FishType") -- 鱼类信息 local cfgFishRod = skynet.server.gameConfig:GetPlayerAllCfg(player, "FishRod") -- 鱼竿信息 local cfgSValue = skynet.server.gameConfig:GetPlayerAllCfg(player, "SValue") -- 玩家渔店相关数据 player.gameData.shop[shopType] = {} player.gameData.shop[shopType].fishInfos = {} -- 鱼类信息 player.gameData.shop[shopType].fishingRodInfos = {} -- 鱼竿信息 player.gameData.shop[shopType].fishTypeInfos = {} -- 鱼百科信息 player.gameData.shop[shopType].fishingLure = cfgSValue.beginFishFood -- 初始化鱼饵数量 player.gameData.shop[shopType].canGetFish = false -- 玩家是否完成鱼饵扣除 player.gameData.shop[shopType].FishRodUnlock = {true, false, false, false} -- 玩家鱼竿是否完成解锁 player.gameData.shop[shopType].ExchangeRecord={} --渔店家具兑换记录 -- 玩家鱼类数据赋值 for k, v in pairs(cfgFishType) do local count = v.id player.gameData.shop[shopType].fishInfos[count] = {} player.gameData.shop[shopType].fishInfos[count].id = count -- 鱼类id player.gameData.shop[shopType].fishInfos[count].status = 0 -- 鱼类状态 0 未拥有 1 已拥有 2已领取奖励 默认未拥有 player.gameData.shop[shopType].fishInfos[count].award = v.unlockPrice -- 鱼对应解锁的奖励 player.gameData.shop[shopType].fishInfos[count].furnitureNum = v.furnitureNum -- 家具对应兑换数量 player.gameData.shop[shopType].fishInfos[count].fishType = v.fishType end -- 玩家鱼竿数据赋值 for k, v in pairs(cfgFishRod) do local count = v.id if 1 == count then player.gameData.shop[shopType].fishingRodInfos[count] = {} player.gameData.shop[shopType].fishingRodInfos[count].id = count -- 鱼竿 player.gameData.shop[shopType].fishingRodInfos[count].status = 1 -- 为鱼竿的解锁状态 0-未解锁 1-当前装备 2-已解锁 else player.gameData.shop[shopType].fishingRodInfos[count] = {} player.gameData.shop[shopType].fishingRodInfos[count].id = count -- 鱼竿 player.gameData.shop[shopType].fishingRodInfos[count].status = 0 -- 为鱼竿的解锁状态 0-未解锁 1-当前装备 2-已解锁 end end -- 玩家鱼类百科数据赋值 for k, v in pairs(cfgFishType) do -- 判断该玩家有没有存储该鱼类图鉴 if not player.gameData.shop[shopType].fishTypeInfos[v.fishType] then local count = v.fishType player.gameData.shop[shopType].fishTypeInfos[count] = {} player.gameData.shop[shopType].fishTypeInfos[count].fishType = v.fishType -- 鱼类图鉴id player.gameData.shop[shopType].fishTypeInfos[count].progress = 0 -- 鱼类图鉴进度 player.gameData.shop[shopType].fishTypeInfos[count].fishIds = {} -- 该鱼类包含的鱼id player.gameData.shop[shopType].fishTypeInfos[count].status = 0 -- 鱼种类奖励领取状态 0-未领取 1-已领取 2-待领取 for k1, v1 in pairs(cfgFishType) do if v1.fishType == count then table.insert(player.gameData.shop[shopType].fishTypeInfos[count].fishIds, v1.id) end end end end -- 将玩家可以获取鱼的最高等级存入redis中 提供给送礼进行使用 skynet.server.personal:SetDetail(player.gameData.partner.id, "fishLevel", self:GetMustFishLevel(player)) end -- 玩家登录调用 function FishShop:LoginInitData(player) skynet.server.msgTips:Reset(player, 55) skynet.server.msgTips:Reset(player, 56) skynet.server.msgTips:Reset(player, 57) -- 红点系统 -- 鱼饵红点 local cfgSValue = skynet.server.gameConfig:GetPlayerAllCfg(player, "SValue") local cfgFishType = skynet.server.gameConfig:GetPlayerAllCfg(player, "FishType") -- 鱼类信息 if player.gameData.shop[self.shopType] then self:FishRefresh(player) -- if player.gameData.shop[self.shopType].fishingLure >= 1 then -- skynet.server.msgTips:AddNoNotice(player, 55) -- end -- 图鉴红点 -- local redDot = false for k, v in pairs(player.gameData.shop[self.shopType].fishInfos) do if v.status == 1 then -- redDot = true skynet.server.msgTips:AddNoNotice(player, 56) end end for k, v in pairs(player.gameData.shop[self.shopType].fishTypeInfos) do if v.status == 2 then -- redDot = true skynet.server.msgTips:AddNoNotice(player, 56) end end -- 手工坊红点 local CraftRedDot = false for k, v in pairs(player.gameData.bag) do if dataType.GoodsType_Fish == v.type then for k1, v1 in pairs(cfgFishType) do if v.count >= v1.furnitureNum and v.id == v1.id then CraftRedDot = true end end end end if CraftRedDot then skynet.server.msgTips:AddNoNotice(player, 57) end -- 登录发放鱼饵 self:giveFishingLure(player) end end -- 发放鱼饵 function FishShop:giveFishingLure(player) local cfgSValue = skynet.server.gameConfig:GetPlayerAllCfg(player, "SValue") local openTime = skynet.GetTime() local todayTwelve = self:FormatTime(skynet.GetTime(), 0, 12) local todayEighteen = self:FormatTime(skynet.GetTime(), 0, 18) local fishFoodAutoLimit = cfgSValue.fishFoodAutoLimit -- 查看玩家是否有月卡权益 local extraFishFood = 0 if player.gameData.storePack.monthCard.buyStatus then fishFoodAutoLimit = cfgSValue.monthCardFish[2] extraFishFood = cfgSValue.monthCardFish[1] - cfgSValue.dailyFishFood[1] end --检查过了设置成已检查 12:00 到 18:00 if openTime >= todayTwelve and openTime <= todayEighteen then if player.gameData.todayGain.todayTwelveGameTime == 0 and player.gameData.shop[self.shopType].fishingLure < fishFoodAutoLimit then player.gameData.shop[self.shopType].fishingLure = player.gameData.shop[self.shopType].fishingLure + cfgSValue.dailyFishFood[1] + extraFishFood --是否达到上限 if player.gameData.shop[self.shopType].fishingLure > fishFoodAutoLimit then player.gameData.shop[self.shopType].fishingLure = fishFoodAutoLimit end end player.gameData.todayGain.todayTwelveGameTime = 1 end --检查过了设置成已检查 18:00 if openTime >= todayEighteen then if player.gameData.todayGain.todayEighteenGameTime == 0 and player.gameData.shop[self.shopType].fishingLure < fishFoodAutoLimit then player.gameData.shop[self.shopType].fishingLure = player.gameData.shop[self.shopType].fishingLure + cfgSValue.dailyFishFood[2] --是否达到上限 if player.gameData.shop[self.shopType].fishingLure > fishFoodAutoLimit then player.gameData.shop[self.shopType].fishingLure = fishFoodAutoLimit end end player.gameData.todayGain.todayEighteenGameTime = 1 end if player.gameData.shop[self.shopType].fishingLure >= 1 and skynet.server.msgTips:GetOneTips(player, 55).count == 0 then skynet.server.msgTips:AddNoNotice(player, 55) end end -- 返回指定时间戳的方法 function FishShop:FormatTime(lastDate, day, hour) local dayTimestamp = 24 * 60 * 60 lastDate = lastDate + dayTimestamp * day local date = os.date("*t", lastDate) -- 这里返回的是你指定的时间点的时间戳 return os.time({ year = date.year, month = date.month, day = date.day, hour = hour, minute = 00,--date.minute, second = 00--date.second }) end -- 好友赠送鱼红点增加方法 function FishShop:FishRefreshRedDot(player, fishId) -- 判断玩家的鱼类数据是否需要进行修改 local fishInfos = player.gameData.shop[self.shopType].fishInfos local fishTypeInfos = player.gameData.shop[self.shopType].fishTypeInfos local cfgFishType = skynet.server.gameConfig:GetPlayerAllCfg(player, "FishType") if skynet.server.bag:GetGoodsCount(player, dataType.GoodsType_Fish, fishId) > 0 and 0 == fishInfos[fishId].status then fishInfos[fishId].status = 1 -- 将鱼的完成度计算出并存入玩家数据+ for k, v in pairs(fishInfos) do local haveData = 0 local allData = #fishTypeInfos[v.fishType].fishIds for k1, v1 in pairs(fishTypeInfos[v.fishType].fishIds) do if fishInfos[v1].status == 1 or fishInfos[v1].status == 2 then haveData = haveData + 1 end end fishTypeInfos[v.fishType].progress = math.floor((haveData / allData + 0.005) * 100) end -- 判断鱼的完成度是否解锁了鱼竿 local FishRodUnlock = player.gameData.shop[self.shopType].FishRodUnlock for k, v in pairs(player.gameData.shop[self.shopType].fishTypeInfos) do if v.fishType == 1 and v.progress >= 66 and not FishRodUnlock[2] then player.gameData.shop[self.shopType].fishingRodInfos[2].status = 2 player.gameData.shop[self.shopType].FishRodUnlock[2] = true self:FishUnlock(player, 1, 2) -- 将玩家可以获取鱼的最高等级存入redis中 提供给送礼进行使用 skynet.server.personal:SetDetail(player.gameData.partner.id, "fishLevel", self:GetMustFishLevel(player)) elseif v.fishType == 2 and v.progress >= 83 and not FishRodUnlock[3] then player.gameData.shop[self.shopType].fishingRodInfos[3].status = 2 player.gameData.shop[self.shopType].FishRodUnlock[3] = true self:FishUnlock(player, 1, 3) -- 将玩家可以获取鱼的最高等级存入redis中 提供给送礼进行使用 skynet.server.personal:SetDetail(player.gameData.partner.id, "fishLevel", self:GetMustFishLevel(player)) elseif v.fishType == 3 and v.progress >= 87 and not FishRodUnlock[4] then player.gameData.shop[self.shopType].fishingRodInfos[4].status = 2 player.gameData.shop[self.shopType].FishRodUnlock[4] = true self:FishUnlock(player, 1, 4) -- 将玩家可以获取鱼的最高等级存入redis中 提供给送礼进行使用 skynet.server.personal:SetDetail(player.gameData.partner.id, "fishLevel", self:GetMustFishLevel(player)) end end skynet.server.msgTips:Add(player, 56) end -- 完成度达到一百增加类型奖励红点 for k, v in pairs(fishTypeInfos) do if v.progress == 100 and v.status == 0 then v.status = 2 skynet.server.msgTips:Add(player, 56) self:FishUnlock(player, 2, v.fishType) end end -- 手工坊红点 local bagCount = skynet.server.bag:GetGoodsCount(player, dataType.GoodsType_Fish, fishId) local CraftRedDot = false for k1, v1 in pairs(cfgFishType) do if bagCount == v1.furnitureNum and v1.id == fishId then CraftRedDot = true end end if CraftRedDot then skynet.server.msgTips:Add(player, 57) end end -- 判断玩家鱼类数据是否需要刷新 function FishShop:FishRefresh(player) -- 判断玩家的鱼类数据是否需要进行 local fishInfos = player.gameData.shop[self.shopType].fishInfos local fishTypeInfos = player.gameData.shop[self.shopType].fishTypeInfos for k, v in pairs(fishInfos) do if skynet.server.bag:GetGoodsCount(player, dataType.GoodsType_Fish, v.id) > 0 and 0 == v.status then v.status = 1 -- 将鱼的完成度计算出并存入玩家数据+ local haveData = 0 local allData = #fishTypeInfos[v.fishType].fishIds for k1, v1 in pairs(fishTypeInfos[v.fishType].fishIds) do if fishInfos[v1].status == 1 or fishInfos[v1].status == 2 then haveData = haveData + 1 end end fishTypeInfos[v.fishType].progress = math.floor((haveData / allData + 0.005) * 100) -- 判断鱼的完成度是否解锁了鱼竿 local FishRodUnlock = player.gameData.shop[self.shopType].FishRodUnlock for k, v in pairs(player.gameData.shop[self.shopType].fishTypeInfos) do if v.fishType == 1 and v.progress >= 66 and not FishRodUnlock[2] then player.gameData.shop[self.shopType].fishingRodInfos[2].status = 2 player.gameData.shop[self.shopType].FishRodUnlock[2] = true self:FishUnlock(player, 1, 2) -- 将玩家可以获取鱼的最高等级存入redis中 提供给送礼进行使用 skynet.server.personal:SetDetail(player.gameData.partner.id, "fishLevel", self:GetMustFishLevel(player)) elseif v.fishType == 2 and v.progress >= 83 and not FishRodUnlock[3] then player.gameData.shop[self.shopType].fishingRodInfos[3].status = 2 player.gameData.shop[self.shopType].FishRodUnlock[3] = true self:FishUnlock(player, 1, 3) -- 将玩家可以获取鱼的最高等级存入redis中 提供给送礼进行使用 skynet.server.personal:SetDetail(player.gameData.partner.id, "fishLevel", self:GetMustFishLevel(player)) elseif v.fishType == 3 and v.progress >= 87 and not FishRodUnlock[4] then player.gameData.shop[self.shopType].fishingRodInfos[4].status = 2 player.gameData.shop[self.shopType].FishRodUnlock[4] = true self:FishUnlock(player, 1, 4) -- 将玩家可以获取鱼的最高等级存入redis中 提供给送礼进行使用 skynet.server.personal:SetDetail(player.gameData.partner.id, "fishLevel", self:GetMustFishLevel(player)) end end -- 完成度达到一百将奖励状态修改 for k1, v1 in pairs(fishTypeInfos) do if v1.progress == 100 and v1.status == 0 then v1.status = 2 self:FishUnlock(player, 2, v1.fishType) end end end end end -- 使用蜗壳币购买鱼饵 function FishShop:FishingLuresBuy(player, c2sData, s2cData) c2sData.data = assert(pb.decode("C2SFishingLuresBuy", c2sData.data)) local data = {} local cfgSValue = skynet.server.gameConfig:GetPlayerAllCfg(player, "SValue") local methodType = c2sData.data.methodType -- 加速类型 local isSuc = false if methodType == dataType.AccelerateType_Volute then -- 消耗玩家蜗壳币 local eventId = pb.enum("EnumMoneyChangeEventID", "EventID_10") isSuc = player:MoneyChange(pb.enum("EnumGoodsType", "VoluteCoin"), -cfgSValue.voluteCoinFishFood[1], eventId) elseif methodType == dataType.AccelerateType_AccTicket and skynet.server.bag:GetGoodsCount(player, dataType.GoodsType_Prop, 12) > 0 then -- 扣除一个饲料包 增加对应的鱼饵 skynet.server.bag:RemoveGoods(player, dataType.GoodsType_Prop, 12, 1) player.gameData.shop[self.shopType].fishingLure = player.gameData.shop[self.shopType].fishingLure + cfgSValue.fishFoodPack -- isSuc = true elseif methodType == dataType.AccelerateType_ADTicket and skynet.server.ad:CanWatch(player, "GetFishingLures") and skynet.server.ad:PayADTicket(player, "GetFishingLures") then isSuc = true elseif methodType == dataType.AccelerateType_WatchAD and skynet.server.ad:CanWatch(player, "GetFishingLures") then skynet.server.ad:Update(player, "GetFishingLures") isSuc = true end if isSuc then player.gameData.shop[self.shopType].fishingLure = player.gameData.shop[self.shopType].fishingLure + cfgSValue.voluteCoinFishFood[2] end -- -- 判断蜗壳币数量是否足够 -- local eventId = pb.enum("EnumMoneyChangeEventID", "EventID_10") -- -- 优先使用饲料包进行补充鱼饵 -- if skynet.server.bag:GetGoodsCount(player, dataType.GoodsType_Prop, 12) > 0 then -- -- 扣除一个饲料包 增加对应的鱼饵 -- skynet.server.bag:RemoveGoods(player, dataType.GoodsType_Prop, 12, 1) -- player.gameData.shop[self.shopType].fishingLure = player.gameData.shop[self.shopType].fishingLure + -- cfgSValue.fishFoodPack -- else -- local isSuc = player:MoneyChange(pb.enum("EnumGoodsType", "VoluteCoin"), -cfgSValue.voluteCoinFishFood[1], -- eventId) -- if isSuc then -- player.gameData.shop[self.shopType].fishingLure = -- player.gameData.shop[self.shopType].fishingLure + cfgSValue.voluteCoinFishFood[2] -- -- player.gameData.shop[self.shopType].fishingLure = player.gameData.shop[self.shopType].fishingLure + 5 -- end -- end data.fishLures = player.gameData.shop[self.shopType].fishingLure -- 鱼饵红点 if data.fishLures == 5 then skynet.server.msgTips:Add(player, 55) end s2cData.cmd = pb.enum("MsgType", "CMD_S2C_FishingLuresBuy") s2cData.data = assert(pb.encode("S2CFishingLuresBuy", data)) end -- 进入渔店 function FishShop:FishGearShopEnter(player, c2sData, s2cData) c2sData.data = assert(pb.decode("C2SFishGearShopEnter", c2sData.data)) -- 发放鱼饵 self:giveFishingLure(player) local data = {} data.furnitureGoodsInfo={} local fishInfos = player.gameData.shop[self.shopType].fishInfos -- 背包所有鱼的信息 data.fish = {} for k, v in pairs(player.gameData.bag) do if dataType.GoodsType_Fish == v.type then table.insert(data.fish, { goodsType = v.type, goodsId = v.id, goodsCount = v.count }) end end -- 当前鱼竿id for k, v in pairs(player.gameData.shop[self.shopType].fishingRodInfos) do if 1 == v.status then data.fishRod = v.id end end -- 当前鱼饵数量 data.fishLures = player.gameData.shop[self.shopType].fishingLure --玩家兑换家具信息 local cfgFishType = skynet.server.gameConfig:GetPlayerAllCfg(player, "FishType") --玩家兑换家具 for _, value in ipairs(cfgFishType) do if not value.furniture or value.furniture <= 0 then goto continue end local goodsNum = skynet.server.bag:GetGoodsCount(player, dataType.GoodsType_Furniture, value.furniture) if (player.gameData.shop[self.shopType].ExchangeRecord == nil or player.gameData.shop[self.shopType].ExchangeRecord[value.furniture] == nil) and goodsNum <= 0 then goto continue end table.insert(data.furnitureGoodsInfo, { goodsType = dataType.GoodsType_Furniture, goodsId = value.furniture, goodsCount = goodsNum }) ::continue:: end skynet.server.levelTask:Modify(player, 92, 1) skynet.server.taskListEvent:Modify( player ,92, 1) s2cData.cmd = pb.enum("MsgType", "CMD_S2C_FishGearShopEnter") s2cData.data = assert(pb.encode("S2CFishGearShopEnter", data)) end -- 渔店解锁 function FishShop:FishUnlock(player, unlockType, unlockId) local data = {} data.unlockType = unlockType; -- 解锁类型 1-鱼竿 2-任意品种的鱼 data.unlockId = unlockId; -- 解锁id skynet.server.gameServer:SendMsgToUser(player.userId, "CMD_S2C_FishUnlock", data) end -- 开始钓鱼 function FishShop:FishingStart(player, c2sData, s2cData) c2sData.data = assert(pb.decode("C2SFishingStart", c2sData.data)) local data = {} -- 消耗鱼饵 if player.gameData.shop[self.shopType].fishingLure > 0 then player.gameData.shop[self.shopType].canGetFish = true player.gameData.shop[self.shopType].fishingLure = player.gameData.shop[self.shopType].fishingLure - 1 data.fishLures = player.gameData.shop[self.shopType].fishingLure if data.fishLures == 0 then skynet.server.msgTips:Reduce(player, 55) end else data.fishLures = 0 player.gameData.shop[self.shopType].canGetFish = false end s2cData.cmd = pb.enum("MsgType", "CMD_S2C_FishingStart") s2cData.data = assert(pb.encode("S2CFishingStart", data)) end -- -- 判断当前玩家返回鱼的等级是否满足所拥有的鱼竿 -- function FishShop:CheckLevel(player, scopeLvl) -- for k, v in pairs(player.gameData.shop[self.shopType].fishingRodInfos) do -- if 1 == v.status then -- for k1, v1 in pairs(v.primaryProb) do -- if tonumber(string.sub(v1, 1, 1)) >= scopeLvl then -- return true -- end -- end -- end -- end -- end -- 钓鱼完成之后 function FishShop:FishingComplete(player, c2sData, s2cData) if player.gameData.shop[self.shopType].canGetFish then local cfgFishRod = skynet.server.gameConfig:GetPlayerAllCfg(player, "FishRod") local cfgFishType = skynet.server.gameConfig:GetPlayerAllCfg(player, "FishType") c2sData.data = assert(pb.decode("C2SFishingComplete", c2sData.data)) local scopeLvl = c2sData.data.scopeLvl -- if self:CheckLevel(player, scopeLvl) then -- 完成时鱼的等级 local data = {} data.fish = {} local fishTypeInfos = player.gameData.shop[self.shopType].fishTypeInfos local fishInfos = player.gameData.shop[self.shopType].fishInfos -- 当前鱼竿id local fishRodId = 0 for k, v in pairs(player.gameData.shop[self.shopType].fishingRodInfos) do if 1 == v.status then fishRodId = v.id -- 高级鱼竿npc任务 if 2 == fishRodId then skynet.server.npcTask:Modify(player, 100, 1) skynet.server.taskListEvent:Modify( player ,100, 1) end -- 精英鱼竿npc任务 if 3 == fishRodId then skynet.server.npcTask:Modify(player, 101, 1) skynet.server.taskListEvent:Modify( player ,101, 1) end end end local fishScope = {} -- 拿到鱼类概率 for k, v in pairs(cfgFishRod) do if 1 == scopeLvl then if v.id == fishRodId then for k1, v1 in pairs(v.primaryProb) do local arr = skynet.server.common:Split(v1, "_") arr[1], arr[2] = tonumber(arr[1]), tonumber(arr[2]) table.insert(fishScope, { fishLevel = arr[1], probability = arr[2] * 100 }) end end elseif 2 == scopeLvl then if v.id == fishRodId then for k1, v1 in pairs(v.mediumProb) do local arr = skynet.server.common:Split(v1, "_") arr[1], arr[2] = tonumber(arr[1]), tonumber(arr[2]) table.insert(fishScope, { fishLevel = arr[1], probability = arr[2] * 100 }) end end elseif 3 == scopeLvl then if v.id == fishRodId then for k1, v1 in pairs(v.seniorProb) do local arr = skynet.server.common:Split(v1, "_") arr[1], arr[2] = tonumber(arr[1]), tonumber(arr[2]) table.insert(fishScope, { fishLevel = arr[1], probability = arr[2] * 100 }) end end end end local fishType = 0 -- 鱼的类型等级 local rand = math.random(1, 100) local count = 0 for k, v in pairs(fishScope) do local probability = v.probability if count > 0 then for i = 1, count, 1 do probability = probability + fishScope[i].probability end end if rand <= probability then fishType = v.fishLevel break end count = count + 1 end -- 将出现在范围的鱼类的id存入列表 local allFish = {} for k, v in pairs(cfgFishType) do if fishType == v.fishType then table.insert(allFish, v.id) end end -- 从满足鱼的列表中随机一个鱼的id local count = math.random(1, #allFish) -- #allfish 列表的长度 local fishId = allFish[count] -- 钓鱼完成之后判断是否将玩家的相关数据修改 {id = 1,status = 0} local redDot = false if 0 == fishInfos[fishId].status then fishInfos[fishId].status = 1 redDot = true end -- 图鉴红点 if redDot then skynet.server.msgTips:Add(player, 56) end -- 将鱼的完成度计算出并存入玩家数据+ local haveData = 0 local allData = #fishTypeInfos[fishType].fishIds for k, v in pairs(fishTypeInfos[fishType].fishIds) do if fishInfos[v].status == 1 or fishInfos[v].status == 2 then haveData = haveData + 1 end end fishTypeInfos[fishType].progress = math.floor((haveData / allData + 0.005) * 100) -- 判断鱼的完成度是否解锁了鱼竿 local FishRodUnlock = player.gameData.shop[self.shopType].FishRodUnlock for k, v in pairs(player.gameData.shop[self.shopType].fishTypeInfos) do if v.fishType == 1 and v.progress >= 66 and not FishRodUnlock[2] then player.gameData.shop[self.shopType].fishingRodInfos[2].status = 2 player.gameData.shop[self.shopType].FishRodUnlock[2] = true self:FishUnlock(player, 1, 2) -- 将玩家可以获取鱼的最高等级存入redis中 提供给送礼进行使用 skynet.server.personal:SetDetail(player.gameData.partner.id, "fishLevel", self:GetMustFishLevel(player)) elseif v.fishType == 2 and v.progress >= 83 and not FishRodUnlock[3] then player.gameData.shop[self.shopType].fishingRodInfos[3].status = 2 player.gameData.shop[self.shopType].FishRodUnlock[3] = true self:FishUnlock(player, 1, 3) -- 将玩家可以获取鱼的最高等级存入redis中 提供给送礼进行使用 skynet.server.personal:SetDetail(player.gameData.partner.id, "fishLevel", self:GetMustFishLevel(player)) elseif v.fishType == 3 and v.progress >= 87 and not FishRodUnlock[4] then player.gameData.shop[self.shopType].fishingRodInfos[4].status = 2 player.gameData.shop[self.shopType].FishRodUnlock[4] = true self:FishUnlock(player, 1, 4) -- 将玩家可以获取鱼的最高等级存入redis中 提供给送礼进行使用 skynet.server.personal:SetDetail(player.gameData.partner.id, "fishLevel", self:GetMustFishLevel(player)) end end -- 完成度达到一百将奖励状态修改 for k, v in pairs(fishTypeInfos) do if v.progress == 100 and v.status == 0 then v.status = 2 skynet.server.msgTips:Add(player, 56) self:FishUnlock(player, 2, v.fishType) end end -- 将鱼存入背包,并将鱼的id返回客户端 skynet.server.bag:AddGoods(player, dataType.GoodsType_Fish, fishId, 1) local bagCount = skynet.server.bag:GetGoodsCount(player, dataType.GoodsType_Fish, fishId) data.fish = { goodsType = dataType.GoodsType_Fish, goodsId = fishId, goodsCount = bagCount } player:AddExpCount(5) -- 手工坊红点 local CraftRedDot = false for k1, v1 in pairs(cfgFishType) do if bagCount == v1.furnitureNum and v1.id == fishId then CraftRedDot = true end end if CraftRedDot then skynet.server.msgTips:Add(player, 57) end -- 钓鱼任务 if 1 == cfgFishType[fishId].fishType then--淡水鱼 skynet.server.taskListEvent:Modify( player ,128, 1) elseif 2 == cfgFishType[fishId].fishType then--沿海鱼 skynet.server.taskListEvent:Modify( player ,113, 1) elseif 3 == cfgFishType[fishId].fishType then--远海鱼 skynet.server.taskListEvent:Modify( player ,129, 1) elseif 4 == cfgFishType[fishId].fishType then--深海鱼 skynet.server.taskListEvent:Modify( player ,130, 1) end skynet.server.levelTask:Modify(player, 64, 1) skynet.server.achieveTask:Modify(player, 64, 1) skynet.server.taskListEvent:Modify( player ,64, 1) --skynet.server.taskListEvent:Modify( player ,27, 1) s2cData.cmd = pb.enum("MsgType", "CMD_S2C_FishingComplete") s2cData.data = assert(pb.encode("S2CFishingComplete", data)) -- end end end -- 手工坊家具兑换 function FishShop:FishCraftRedeem(player, c2sData, s2cData) c2sData.data = assert(pb.decode("C2SFishCraftRedeem", c2sData.data)) local fishId = c2sData.data.fishId local data = {} local cfgFishType = skynet.server.gameConfig:GetPlayerAllCfg(player, "FishType") local bagCount = skynet.server.bag:GetGoodsCount(player, dataType.GoodsType_Fish, fishId) data.goodsType = dataType.GoodsType_Furniture -- 兑换商品类型 11-家具 12-装修 data.buyGoods = {} -- 兑换货物 data.fish = {} -- 对应消耗完成之后的鱼 --是否存在该商品 local repeatRebate = nil --兑换家具 local furniture = 0 for k, v in pairs(player.gameData.shop[self.shopType].fishInfos) do if v.id == fishId then --资源不足 if bagCount < v.furnitureNum then s2cData.cmd = pb.enum("MsgType", "CMD_S2C_FishCraftRedeem") s2cData.code = errorInfo.ErrorCode.OpFailed return end data.fish = { goodsType = dataType.GoodsType_Fish, goodsId = v.id, goodsCount = bagCount - v.furnitureNum } -- 将鱼从背包扣除 skynet.server.bag:RemoveGoods(player, dataType.GoodsType_Fish, fishId, v.furnitureNum) skynet.server.levelTask:Modify(player, 93, 1) skynet.server.npcTask:Modify(player, 93, 1) skynet.server.taskListEvent:Modify( player ,93, 1) break end end for k, v in pairs(cfgFishType) do if v.id == fishId then data.buyGoods = { id = v.furniture, -- 商品ID buyCount = 1 -- 购买数量 } --是否已存在 repeatRebate=v.repeatRebate furniture=v.furniture break end end local redDot = false -- 判断红点是否移除 for k1, v1 in pairs(cfgFishType) do for k2, v2 in pairs(player.gameData.bag) do if dataType.GoodsType_Fish == v2.type then if v1.id == v2.id and v2.count >= v1.furnitureNum then redDot = true end end end end if not redDot then skynet.server.msgTips:ReduceAll(player, 57) end --获取原有道具 local goodsNum = skynet.server.bag:GetGoodsCount(player, dataType.GoodsType_Furniture, data.buyGoods.id) -- 将兑换后的家具存入背包 skynet.server.bag:AddGoods(player, dataType.GoodsType_Furniture, data.buyGoods.id, 1) --发奖返利奖励 if (player.gameData.shop[self.shopType].ExchangeRecord ~= nil and player.gameData.shop[self.shopType].ExchangeRecord[furniture] ~= nil or goodsNum > 0) and repeatRebate then data.repeatRebate=repeatRebate --发放返利奖励 local eventId = pb.enum("EnumMoneyChangeEventID","EventID_141") player:GiveReward(repeatRebate , eventId ,1) end --添加兑换记录信息 if player.gameData.shop[self.shopType].ExchangeRecord == nil then player.gameData.shop[self.shopType].ExchangeRecord={} end if player.gameData.shop[self.shopType].ExchangeRecord[furniture] == nil then player.gameData.shop[self.shopType].ExchangeRecord[furniture]=furniture end s2cData.cmd = pb.enum("MsgType", "CMD_S2C_FishCraftRedeem") s2cData.data = assert(pb.encode("S2CFishCraftRedeem", data)) end -- 鱼类百科展示 function FishShop:FishIllustartionShow(player, c2sData, s2cData) self:FishRefresh(player) c2sData.data = assert(pb.decode("C2SFishIllustartionShow", c2sData.data)) local data = {} local fishTypeInfos = player.gameData.shop[self.shopType].fishTypeInfos local fishInfos = player.gameData.shop[self.shopType].fishInfos -- 已领取的每个种类鱼类图鉴id data.fishGroupIllustrationId = {} for k, v in pairs(fishTypeInfos) do if 1 == v.status then table.insert(data.fishGroupIllustrationId, v.fishType) end end -- 已领取的单个鱼类图鉴id data.singleFishillustrationId = {} for k, v in pairs(fishInfos) do if 2 == v.status then table.insert(data.singleFishillustrationId, v.id) end end s2cData.cmd = pb.enum("MsgType", "CMD_S2C_FishIllustartionShow") s2cData.data = assert(pb.encode("S2CFishIllustartionShow", data)) end -- 鱼竿展示 function FishShop:FishRodShow(player, c2sData, s2cData) c2sData.data = assert(pb.decode("C2SFishRodShow", c2sData.data)) local data = {} -- local fishingRodInfos = player.gameData.shop[self.shopType].fishingRodInfos data.fishRod = {} for k, v in pairs(player.gameData.shop[self.shopType].fishingRodInfos) do table.insert(data.fishRod, { id = v.id, status = v.status }) end s2cData.cmd = pb.enum("MsgType", "CMD_S2C_FishRodShow") s2cData.data = assert(pb.encode("S2CFishRodShow", data)) end -- 鱼竿切换 function FishShop:FishRodChange(player, c2sData, s2cData) c2sData.data = assert(pb.decode("C2SFishRodChange", c2sData.data)) local rodId = c2sData.data.rodId local data = {} -- local fishingRodInfos = player.gameData.shop[self.shopType].fishingRodInfos data.fishRod = {} -- 切换鱼竿改变鱼竿状态 for k, v in pairs(player.gameData.shop[self.shopType].fishingRodInfos) do if v.id == rodId then v.status = 1 table.insert(data.fishRod, v) else if v.status == 1 then v.status = 2 table.insert(data.fishRod, v) else table.insert(data.fishRod, v) end end end player.gameData.shop[self.shopType].fishingRodInfos = data.fishRod s2cData.cmd = pb.enum("MsgType", "CMD_S2C_FishRodChange") s2cData.data = assert(pb.encode("S2CFishRodChange", data)) end -- 三叶币奖励增加 function FishShop:CloversAdd(player, awardId) local cfgReward = skynet.server.gameConfig:GetPlayerAllCfg(player, "Reward") for k, v in pairs(cfgReward) do if v.id == awardId then local eventId = pb.enum("EnumMoneyChangeEventID", "EventID_46") player:MoneyChange(pb.enum("EnumGoodsType", "Clovers"), v.mapCoin, eventId) return v.mapCoin end end end -- 获取奖励配置三叶币数量 function FishShop:GetCloversAddNum(player, awardId) local cfgReward = skynet.server.gameConfig:GetPlayerAllCfg(player, "Reward") for k, v in pairs(cfgReward) do if v.id == awardId then return v.mapCoin end end end -- 领取图鉴奖励 function FishShop:FishIllustrationAward(player, c2sData, s2cData) c2sData.data = assert(pb.decode("C2SFishIllustrationAward", c2sData.data)) local type = c2sData.data.type local id = c2sData.data.id local data = {} local cfgSValue = skynet.server.gameConfig:GetPlayerAllCfg(player, "SValue") local fishTypeInfos = player.gameData.shop[self.shopType].fishTypeInfos local fishInfos = player.gameData.shop[self.shopType].fishInfos -- 判断该鱼类奖励有没有领取 data.type = type data.award = {} -- 领取鱼类图鉴对应奖励 if 1 == type then data.fishGroupIllustrationId = {} for k, v in pairs(fishTypeInfos) do if v.fishType == id then if 2 == v.status then v.status = 1 for k1, v1 in pairs(cfgSValue.fishUnlockReward) do if k1 == id then table.insert(data.award, { type = dataType.GoodsType_Clovers, id = v1, count = self:GetCloversAddNum(player, v1) -- 对应奖励增加对应三叶币 }) local eventId = pb.enum("EnumMoneyChangeEventID", "EventID_81") player:GiveRewardNpc(v1, self.NPCId, eventId) skynet.server.msgTips:Reduce(player, 56) end end else s2cData.code = errorInfo.ErrorCode.AlreadyGetFishAward s2cData.desc = errorInfo.ErrorMsg[s2cData.code] end end if 1 == v.status or v.fishType == id then table.insert(data.fishGroupIllustrationId, v.fishType) end end end -- 领取单个鱼图鉴对应奖励 if 2 == type then data.singleFishillustrationId = {} for k, v in pairs(fishInfos) do if v.id == id then if 1 == v.status then v.status = 2 table.insert(data.award, { type = dataType.GoodsType_Clovers, id = v.award, count = self:GetCloversAddNum(player, v.award) -- 对应奖励增加对应三叶币 }) local eventId = pb.enum("EnumMoneyChangeEventID", "EventID_81") player:GiveRewardNpc(v.award, self.NPCId, eventId) skynet.server.msgTips:Reduce(player, 56) else s2cData.code = errorInfo.ErrorCode.AlreadyGetFishAward s2cData.desc = errorInfo.ErrorMsg[s2cData.code] end end if v.status == 2 or v.id == id then table.insert(data.singleFishillustrationId, v.id) end end end local redDot = false -- 判断图鉴红点是否移除 for k, v in pairs(player.gameData.shop[self.shopType].fishInfos) do if v.status == 1 then redDot = true end end for k, v in pairs(player.gameData.shop[self.shopType].fishTypeInfos) do if v.status == 2 then redDot = true end end if not redDot then skynet.server.msgTips:Reduce(player, 56) -- log.info('红点数量' .. skynet.server.common:TableToString(skynet.server.common:GetOneTips(player).count)) end s2cData.cmd = pb.enum("MsgType", "CMD_S2C_FishIllustrationAward") s2cData.data = assert(pb.encode("S2CFishIllustrationAward", data)) end -- 该玩家可获取的最高等级的鱼 function FishShop:GetMustFishLevel(player) local fishRodId = 1 local cfgFishRod = skynet.server.gameConfig:GetPlayerAllCfg(player, "FishRod") for k, v in pairs(player.gameData.shop[self.shopType].fishingRodInfos) do if v.status > 1 and v.id > fishRodId then fishRodId = v.id end end local fishLevel = 1 for k, v in pairs(cfgFishRod[fishRodId].primaryProb) do local arr = skynet.server.common:Split(v, "_") arr[1], arr[2] = tonumber(arr[1]), tonumber(arr[2]) if arr[1] > fishLevel then fishLevel = arr[1] end end return fishLevel end skynet.server.fishShop = FishShop return FishShop