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 PetShop = oo.class(shop) PetShop.shopType = dataType.ShopType_PetShop function PetShop:Init() end -- 初始化宠物店数据 function PetShop:InitData(player, shopType) local petStudy = skynet.server.gameConfig:GetPlayerAllCfg(player, "PetStudy") -- 宠物店学习数据 local petStore = skynet.server.gameConfig:GetPlayerAllCfg(player, "PetStore") -- 宠物店商店数据 local petTravel = skynet.server.gameConfig:GetPlayerAllCfg(player, "PetTravel") -- 宠物店出游数据 local cfgSValue = skynet.server.gameConfig:GetPlayerAllCfg(player, "SValue") local petShop = player.gameData.shop -- 宠物店学习相关数据 petShop[shopType] = {} petShop[shopType].petStudy = {} petShop[shopType].petTravel = {} petShop[shopType].petShopGoodInfo = {} petShop[shopType].courseType = {1, 2, 3} -- 宠物完成的课程类型 1=语言课 2=体育课 3=魔法课 petShop[shopType].petAward = {} -- 学习等级studyLvl {1,2,3,4} 1=幼级 2=初级 3=高级 4=顶级 -- 学习阶段studyStage {1,2,3,4,5} 1= Ⅰ阶 2=Ⅱ阶 3=Ⅲ阶 4=Ⅳ阶 5= Ⅴ阶 -- 宠物店学习数据赋值 for k, v in pairs(petShop[shopType].courseType) do petShop[shopType].petStudy[v] = {} petShop[shopType].petStudy[v].studyType = v -- 课程的类型 petShop[shopType].petStudy[v].studyLvl = 1 -- 学习完成的等级 petShop[shopType].petStudy[v].studyStage = 1 -- 学习完成的阶段 petShop[shopType].petStudy[v].studyExp = 0 -- 累计经验值 end -- 宠物奖励信息数据赋值 for k, v in pairs(petStudy) do local count = v.id petShop[shopType].petAward[count] = {} petShop[shopType].petAward[count].studyType = v.studyType -- 课程的类型 petShop[shopType].petAward[count].studyLvl = v.studyLvl -- 学习完成的等级 petShop[shopType].petAward[count].studyStage = v.studyStage -- 学习完成的等级 petShop[shopType].petAward[count].status = 0 -- 宠物学习进阶奖励领取状态 0-未解锁 1-待领取 2-已领取 petShop[shopType].petAward[count].rewardId = v.rewardId petShop[shopType].petAward[count].interactionId = v.interactionId end -- 宠物出游信息数据赋值 for k, v in pairs(petTravel) do local count = v.id petShop[shopType].petTravel[count] = {} petShop[shopType].petTravel[count].id = count -- 地点id petShop[shopType].petTravel[count].status = 0 -- 宠物出游状态 0未出游 1出游中 2出游结束待领取奖励 petShop[shopType].petTravel[count].time = v.time -- 出游时间 petShop[shopType].petTravel[count].finishTime = 0 -- 下次可以出游的时间戳 初始为0 petShop[shopType].petTravel[count].happyEncounter = 1 -- 是否触发奇遇 1未触发 2 触发 -- if v.locationType == 0 then -- petShop[shopType].petTravel[count].unlockLocation = 1 -- 是否解锁出游地点 0 未解锁 1已解锁 -- else -- petShop[shopType].petTravel[count].unlockLocation = 0 -- 是否解锁出游地点 0 未解锁 1已解锁 -- end if v.locationType == 0 then petShop[shopType].petTravel[count].unlockLocation = { status = 1, isNew = false } -- 是否解锁出游地点 0 未解锁 1已解锁 else petShop[shopType].petTravel[count].unlockLocation = { status = 0, isNew = false } -- 是否解锁出游地点 0 未解锁 1已解锁 end petShop[shopType].isNew = true end -- 宠物店商店数据赋值 for k, v in pairs(petStore) do local count = v.id petShop[shopType].petShopGoodInfo[count] = {} petShop[shopType].petShopGoodInfo[count].id = count -- 商品id petShop[shopType].petShopGoodInfo[count].buyTimes = 0 -- 购买次数 petShop[shopType].petShopGoodInfo[count].packLimit = v.packLimit -- 礼包对应的购买次数 例 [1,2] (1:日限购 2:周限购 3:限购购买) 每日限购2次 end -- 宠物盲盒状态赋值 petShop[shopType].blindBoxStatus = 1 -- 盲盒状态0-不可领取 1-可领取 petShop[shopType].nextFreeTime = 0 -- 盲盒下次领取时间 skynet.server.msgTips:Add(player, 84) end -- 玩家登录调用 function PetShop:CheckNew(player) local petShop = player.gameData.shop local cfgSValue = skynet.server.gameConfig:GetPlayerAllCfg(player, "SValue") local petTravel = skynet.server.gameConfig:GetPlayerAllCfg(player, "PetTravel") if petShop[self.shopType] then -- 根据npc等级判断出游地点解锁 local curNpc = player.gameData.friend for k, v in pairs(curNpc) do if v.favorabilityLevel >= cfgSValue.petTravelRelation then for k1, v1 in pairs(petTravel) do if v.npcId == v1.npcId and v1.location > 5 then for k2, v2 in ipairs(petShop[self.shopType].petTravel) do if v2.id == v1.id and v2.unlockLocation.status == 0 then v2.unlockLocation = { status = 1, isNew = true } skynet.server.msgTips:Add(player, 85) petShop[self.shopType].isNew = true end end end end end end -- 检查宠物盲盒红点 if petShop[self.shopType] then if skynet.server.msgTips:GetOneTips(player, 83).count == 0 then if petShop[self.shopType].blindBoxStatus == 1 or petShop[self.shopType].blindBoxStatus == 0 and skynet.GetTime() >= petShop[self.shopType].nextFreeTime then skynet.server.msgTips:Reset(player, 83) skynet.server.msgTips:Add(player, 83) end end end -- 宠物店出游奖励可领取增加红点 if petShop[self.shopType].petTravel then for k, v in pairs(petShop[self.shopType].petTravel) do -- 如果CD时间到了,就给红点 if skynet.server.msgTips:GetOneTips(player, 82).count == 0 then if v.status == 2 or v.status == 1 and skynet.GetTime() >= v.finishTime then skynet.server.msgTips:Reset(player, 82) skynet.server.msgTips:Add(player, 82) break end end end end end end -- 进入宠物店 function PetShop:PetShopEnter(player, c2sData, s2cData) c2sData.data = assert(pb.decode("C2SPetShopEnter", c2sData.data)) local data = {} local petShop = player.gameData.shop local cfgSValue = skynet.server.gameConfig:GetPlayerAllCfg(player, "SValue") local petTravel = skynet.server.gameConfig:GetPlayerAllCfg(player, "PetTravel") -- 首次进入宠物店的任务 skynet.server.levelTask:Modify(player, 51, 1) skynet.server.taskListEvent:Modify( player ,51, 1) -- 根据npc等级判断出游地点解锁 local curNpc = player.gameData.friend for k, v in pairs(curNpc) do if v.favorabilityLevel >= cfgSValue.petTravelRelation then for k1, v1 in pairs(petTravel) do if v.npcId == v1.npcId and v1.location > 5 then for k2, v2 in ipairs(petShop[self.shopType].petTravel) do if v2.id == v1.id and v2.unlockLocation.status == 0 then v2.unlockLocation = { status = 1, isNew = true } skynet.server.msgTips:Add(player, 85) petShop[self.shopType].isNew = true end end end end end end -- for k, v in pairs(player.gameData.bag) do -- if dataType.GoodsType_PetVoice == v.type then -- log.info('语音数量', skynet.server.common:TableToString(v)) -- end -- if dataType.GoodsType_PetAction == v.type then -- log.info('动作数量', skynet.server.common:TableToString(v)) -- end -- end -- log.info('红点数量' .. skynet.server.common:TableToString(skynet.server.msgTips:GetOneTips(player, 84).count)) s2cData.cmd = pb.enum("MsgType", "CMD_S2C_PetShopEnter") s2cData.data = assert(pb.encode("S2CPetShopEnter", data)) end -- 宠物学习展示 function PetShop:PetCourseShow(player, c2sData, s2cData) c2sData.data = assert(pb.decode("C2SPetCourseShow", c2sData.data)) local petShop = player.gameData.shop local courseType = c2sData.data.courseType -- 课程种类 local data = {} if petShop[self.shopType] then data.petStudyInfo = self:GetShopData(player, courseType) end -- log.info('宠物学习展示' .. skynet.server.common:TableToString(data)) s2cData.cmd = pb.enum("MsgType", "CMD_S2C_PetCourseShow") s2cData.data = assert(pb.encode("S2CPetCourseShow", data)) end -- 获取商店数据 function PetShop:GetShopData(player, courseType) local shopInfo = {} local petShop = player.gameData.shop shopInfo.courseType = courseType shopInfo.courseLevel = petShop[self.shopType].petStudy[courseType].studyLvl shopInfo.courseStage = petShop[self.shopType].petStudy[courseType].studyStage shopInfo.courseExp = petShop[self.shopType].petStudy[courseType].studyExp return shopInfo end -- 宠物店学习 function PetShop:PetCourseStudy(player, c2sData, s2cData) c2sData.data = assert(pb.decode("C2SPetCourseStudy", c2sData.data)) local petShop = player.gameData.shop[self.shopType] local courseType = c2sData.data.courseType local bookType = c2sData.data.bookType local bookCount = c2sData.data.bookCount local petStudy = skynet.server.gameConfig:GetPlayerAllCfg(player, "PetStudy") local petStore = skynet.server.gameConfig:GetPlayerAllCfg(player, "PetStore") local petTravel = skynet.server.gameConfig:GetPlayerAllCfg(player, "PetTravel") local data = {} data.petStudyInfo = {} -- 判断玩家背包里的资料书是否足够 local porpId = nil if bookType == 1 then porpId = 13 elseif bookType == 2 then porpId = 14 elseif bookType == 3 then porpId = 15 end local isSuc = false -- 判断没有满级扣书 if petShop.petStudy[courseType].studyStage <= 5 and petShop.petStudy[courseType].studyLvl <= 4 then if skynet.server.bag:GetGoodsCount(player, dataType.GoodsType_Prop, porpId) >= bookCount then -- 扣除背包经验书 skynet.server.bag:RemoveGoods(player, dataType.GoodsType_Prop, porpId, bookCount) isSuc = true end else s2cData.code = errorInfo.ErrorCode.petStudyMax end if isSuc then -- 增加玩家经验值 if bookCount and bookType then for i = 1, bookCount, 1 do if bookType == 1 then player:AddExpForType(18, 1) elseif bookType == 2 then player:AddExpForType(18, 2) elseif bookType == 3 then player:AddExpForType(18, 3) end end end skynet.server.taskListEvent:Modify( player ,36, 1) -- 客户端发送过来的经验数量判断学习升级进阶 local allExp = petStore[bookType].goodsValue * bookCount petShop.petStudy[courseType].studyExp = allExp + petShop.petStudy[courseType].studyExp for k, v in pairs(petStudy) do if courseType == v.studyType and petShop.petStudy[courseType].studyLvl == v.studyLvl and petShop.petStudy[courseType].studyStage == v.studyStage then if petShop.petStudy[courseType].studyExp - v.studyExp >= 0 then if petShop.petStudy[courseType].studyStage < 5 then for k1, v1 in pairs(petShop.petAward) do if petShop.petStudy[courseType].studyStage == v1.studyStage and petShop.petStudy[courseType].studyLvl == v1.studyLvl and courseType == v1.studyType then v1.status = 1 end end -- 升一阶 petShop.petStudy[courseType].studyStage = petShop.petStudy[courseType].studyStage + 1 petShop.petStudy[courseType].studyExp = petShop.petStudy[courseType].studyExp - v.studyExp skynet.server.levelTask:Modify(player, 70, 1) skynet.server.achieveTask:Modify(player, 104, 1) skynet.server.taskListEvent:Modify( player ,70, 1) skynet.server.taskListEvent:Modify( player ,104, 1) -- 成就任务 if 1 == courseType then skynet.server.achieveTask:Modify(player, 107, 1) skynet.server.taskListEvent:Modify( player ,107, 1) elseif 2 == courseType then skynet.server.achieveTask:Modify(player, 106, 1) skynet.server.taskListEvent:Modify( player ,106, 1) elseif 3 == courseType then skynet.server.achieveTask:Modify(player, 105, 1) skynet.server.taskListEvent:Modify( player ,105, 1) end skynet.server.msgTips:Add(player, 81) else if petShop.petStudy[courseType].studyLvl < 4 then for k1, v1 in pairs(petShop.petAward) do if petShop.petStudy[courseType].studyStage == v1.studyStage and petShop.petStudy[courseType].studyLvl == v1.studyLvl and courseType == v1.studyType then v1.status = 1 end end -- 升一级 petShop.petStudy[courseType].studyLvl = petShop.petStudy[courseType].studyLvl + 1 petShop.petStudy[courseType].studyExp = petShop.petStudy[courseType].studyExp - v.studyExp petShop.petStudy[courseType].studyStage = 1 skynet.server.levelTask:Modify(player, 70, 1) skynet.server.achieveTask:Modify(player, 104, 1) skynet.server.taskListEvent:Modify( player ,70, 1) skynet.server.taskListEvent:Modify( player ,104, 1) skynet.server.msgTips:Add(player, 81) -- 成就任务 if 1 == courseType then skynet.server.achieveTask:Modify(player, 107, 1) skynet.server.taskListEvent:Modify( player ,107, 1) elseif 2 == courseType then skynet.server.achieveTask:Modify(player, 106, 1) skynet.server.taskListEvent:Modify( player ,106, 1) elseif 3 == courseType then skynet.server.achieveTask:Modify(player, 105, 1) skynet.server.taskListEvent:Modify( player ,105, 1) end -- npc任务 if 1 == courseType and petShop.petStudy[courseType].studyLvl == 3 then skynet.server.npcTask:Modify(player, 107, 1) skynet.server.taskListEvent:Modify( player ,107, 1) elseif 2 == courseType and petShop.petStudy[courseType].studyLvl == 3 then skynet.server.npcTask:Modify(player, 108, 1) skynet.server.taskListEvent:Modify( player ,108, 1) elseif 3 == courseType and petShop.petStudy[courseType].studyLvl == 3 then skynet.server.npcTask:Modify(player, 109, 1) skynet.server.taskListEvent:Modify( player ,109, 1) end else -- 等级已满 petShop.petStudy[courseType].studyExp = 40000 for k1, v1 in pairs(petShop.petAward) do if petShop.petStudy[courseType].studyStage == v1.studyStage and petShop.petStudy[courseType].studyLvl == v1.studyLvl and courseType == v1.studyType then v1.status = 1 end end skynet.server.levelTask:Modify(player, 70, 1) skynet.server.achieveTask:Modify(player, 104, 1) skynet.server.taskListEvent:Modify( player ,70, 1) skynet.server.taskListEvent:Modify( player ,104, 1) -- 成就任务 if 1 == courseType then skynet.server.achieveTask:Modify(player, 107, 1) skynet.server.taskListEvent:Modify( player ,107, 1) elseif 2 == courseType then skynet.server.achieveTask:Modify(player, 106, 1) skynet.server.taskListEvent:Modify( player ,106, 1) elseif 3 == courseType then skynet.server.achieveTask:Modify(player, 105, 1) skynet.server.taskListEvent:Modify( player ,105, 1) end break end end -- 解锁出游地点 -- 后山的解锁条件 if courseType == 1 and petShop.petStudy[courseType].studyLvl == petStudy[petTravel[2].studyId].studyLvl and petShop.petStudy[courseType].studyStage == petStudy[petTravel[2].studyId].studyStage and petShop.petTravel[2].unlockLocation.status == 0 then petShop.petTravel[2].unlockLocation = { status = 1, isNew = true } skynet.server.msgTips:Add(player, 85) petShop.isNew = true -- 森林的解锁条件 elseif courseType == 2 and petShop.petStudy[courseType].studyLvl == petStudy[petTravel[3].studyId].studyLvl and petShop.petStudy[courseType].studyStage == petStudy[petTravel[3].studyId].studyStage and petShop.petTravel[3].unlockLocation.status == 0 then petShop.petTravel[3].unlockLocation = { status = 1, isNew = true } skynet.server.msgTips:Add(player, 85) petShop.isNew = true -- 湖边的解锁条件 elseif courseType == 3 and petShop.petStudy[courseType].studyLvl == petStudy[petTravel[4].studyId].studyLvl and petShop.petStudy[courseType].studyStage == petStudy[petTravel[4].studyId].studyStage and petShop.petTravel[4].unlockLocation.status == 0 then petShop.petTravel[4].unlockLocation = { status = 1, isNew = true } skynet.server.msgTips:Add(player, 85) petShop.isNew = true -- 花园的解锁条件 elseif courseType == 1 and petShop.petStudy[courseType].studyLvl == petStudy[petTravel[5].studyId].studyLvl and petShop.petStudy[courseType].studyStage == petStudy[petTravel[5].studyId].studyStage and petShop.petTravel[5].unlockLocation.status == 0 then petShop.petTravel[5].unlockLocation = { status = 1, isNew = true } skynet.server.msgTips:Add(player, 85) petShop.isNew = true end end end end --通行证任务 --在萌宠乐园使用资料书累积超过%本 skynet.server.taskListEvent:Modify( player , 121 , bookCount ) -- 获取最新的商店数据 data.petStudyInfo = { courseType = courseType, courseLevel = petShop.petStudy[courseType].studyLvl, courseStage = petShop.petStudy[courseType].studyStage, courseExp = petShop.petStudy[courseType].studyExp } end s2cData.cmd = pb.enum("MsgType", "CMD_S2C_PetCourseStudy") s2cData.data = assert(pb.encode("S2CPetCourseStudy", data)) end -- 宠物学习奖励展示 function PetShop:PetCourseAwardShow(player, c2sData, s2cData) c2sData.data = assert(pb.decode("C2SPetCourseAwardShow", c2sData.data)) local petShop = player.gameData.shop[self.shopType] local courseType = c2sData.data.courseType local petAward = petShop.petAward local petStudy = petShop.petStudy local petStudyList = skynet.server.gameConfig:GetPlayerAllCfg(player, "PetStudy") -- 宠物店学习数据 local data = {} data.award = {} for k, v in pairs(petAward) do -- 判断阶段奖励和结业奖励 if courseType == v.studyType then table.insert(data.award, { courseType = courseType, courseLevel = v.studyLvl, courseStage = v.studyStage, status = v.status, interactionId = v.interactionId, rewardId = v.rewardId }) end end -- log.info('学习奖励展示' .. skynet.server.common:TableToString(data)) s2cData.cmd = pb.enum("MsgType", "CMD_S2C_PetCourseAwardShow") s2cData.data = assert(pb.encode("S2CPetCourseAwardShow", data)) end -- 宠物店学习奖励获取 function PetShop:PetCourseAwardGet(player, c2sData, s2cData) c2sData.data = assert(pb.decode("C2SPetCourseAwardGet", c2sData.data)) local petShop = player.gameData.shop[self.shopType] local award = c2sData.data.award local data = {} local petStudyList = skynet.server.gameConfig:GetPlayerAllCfg(player, "PetStudy") -- 宠物店学习数据 local PetInteraction = skynet.server.gameConfig:GetPlayerAllCfg(player, "PetInteraction") -- 宠物阶段奖励数据 local Reward = skynet.server.gameConfig:GetPlayerAllCfg(player, "Reward") -- 奖励数据 data.award = {} -- 奖励判断是否可以领取 for k, v in pairs(petShop.petAward) do if v.studyType == award.courseType and v.studyLvl == award.courseLevel and v.studyStage == award.courseStage then if v.status == 1 then v.status = 2 local eventId = pb.enum("EnumMoneyChangeEventID", "EventID_98") data.award = { courseType = v.studyType, courseLevel = v.studyLvl, courseStage = v.studyStage, status = v.status, interactionId = v.interactionId, rewardId = v.rewardId } if v.rewardId ~= nil and v.rewardId ~= "" and v.rewardId ~= 0 then player:GiveReward(v.rewardId, eventId) end skynet.server.msgTips:Reduce(player, 81) -- 将宠物语音服饰动作存入背包 for k1, v1 in ipairs(petStudyList) do if award.courseType == 1 and v1.interactionId == award.interactionId and v1.rewardType == 2 then skynet.server.bag:AddGoods(player, dataType.GoodsType_PetVoice, PetInteraction[award.interactionId].samId, 1) elseif award.courseType == 2 and v1.interactionId == award.interactionId and v1.rewardType == 2 then for k2, v2 in pairs(PetInteraction[award.interactionId].animId) do skynet.server.bag:AddGoods(player, dataType.GoodsType_PetAction, v2, 1) end -- skynet.server.bag:AddGoods(player, dataType.GoodsType_PetAction, -- PetInteraction[award.interactionId].animId, 1) elseif award.courseType == 3 and v1.interactionId == award.interactionId and v1.rewardType == 2 then skynet.server.bag:AddGoods(player, dataType.GoodsType_PetSkin, PetInteraction[award.interactionId].skinId, 1) -- elseif v1.rewardId == v.rewardId and v.rewardId ~= nil and v.rewardId ~= "" and v1.rewardName == -- "服饰" then -- local clothesId = skynet.server.common:Split(Reward[v.rewardId].appearanceObject[1], "_") -- skynet.server.bag:AddGoods(player, dataType.GoodsType_PetClothes, tonumber(clothesId[2]), 1) end end end end end -- log.info('学习奖励获取' .. skynet.server.common:TableToString(data)) s2cData.cmd = pb.enum("MsgType", "CMD_S2C_PetCourseAwardGet") s2cData.data = assert(pb.encode("S2CPetCourseAwardGet", data)) end -- 宠物出游展示 function PetShop:PetTravelShow(player, c2sData, s2cData) c2sData.data = assert(pb.decode("C2SPetTravelShow", c2sData.data)) local petShop = player.gameData.shop local data = {} local petTravel = skynet.server.gameConfig:GetPlayerAllCfg(player, "PetTravel") -- 宠物出游数据 local cfgSValue = skynet.server.gameConfig:GetPlayerAllCfg(player, "SValue") data.petTravelInfo = {} -- 根据npc等级判断出游地点解锁 local curNpc = player.gameData.friend if not petShop[self.shopType].isNew then for k, v in pairs(petShop[self.shopType].petTravel) do if v.unlockLocation.isNew == true then v.unlockLocation.isNew = false end end end skynet.server.msgTips:ReduceAll(player, 85) petShop[self.shopType].isNew = false for k, v in pairs(curNpc) do if v.favorabilityLevel >= cfgSValue.petTravelRelation then for k1, v1 in pairs(petTravel) do if v.npcId == v1.npcId and v1.location > 5 then for k2, v2 in ipairs(petShop[self.shopType].petTravel) do if v2.id == v1.id and v2.unlockLocation.status == 0 then -- log.info('npc好感度解锁') v2.unlockLocation = { status = 1, isNew = true } skynet.server.msgTips:Add(player, 85) petShop[self.shopType].isNew = true end end end end end end local Ids = {} for k, v in pairs(petShop[self.shopType].petTravel) do if v.unlockLocation.status == 1 then table.insert(Ids, { unlockLocationId = v.id, isNew = v.unlockLocation.isNew }) end end -- 根据出游的状态判断返回内容 for k, v in pairs(petShop[self.shopType].petTravel) do if v.status == 1 then if skynet.GetTime() >= v.finishTime then v.status = 2 data.petTravelInfo = { status = v.status, unlockLocation = Ids, locationId = v.id, happyEncounter = v.happyEncounter } break else data.petTravelInfo = { status = v.status, endTravelTime = v.finishTime, locationId = v.id, unlockLocation = Ids, happyEncounter = v.happyEncounter } break end elseif v.status == 0 then data.petTravelInfo = { status = v.status, unlockLocation = Ids } elseif v.status == 2 then data.petTravelInfo = { status = v.status, unlockLocation = Ids, locationId = v.id, happyEncounter = v.happyEncounter } break end end -- log.info('出游展示信息', skynet.server.common:TableToString(data)) s2cData.cmd = pb.enum("MsgType", "CMD_S2C_PetTravelShow") s2cData.data = assert(pb.encode("S2CPetTravelShow", data)) end -- 宠物出游开始 function PetShop:PetTravelStart(player, c2sData, s2cData) c2sData.data = assert(pb.decode("C2SPetTravelStart", c2sData.data)) local petShop = player.gameData.shop local locationId = c2sData.data.locationId -- log.info('locationId', locationId) local petTravel = skynet.server.gameConfig:GetPlayerAllCfg(player, "PetTravel") -- 宠物店出游数据 local data = {} local Ids = {} data.petTravelInfo = {} if petShop[self.shopType].petTravel[locationId].status == 0 then petShop[self.shopType].petTravel[locationId].status = 1 local petType = 1 -- player.gameData.pet[petType].status = dataType.PetType_UnlockOpened if player.gameData.pet[petType] and dataType.PetType_UnlockOpened == player.gameData.pet[petType].status then player.gameData.pet[petType].status = dataType.PetType_Travel end for k, v in pairs(petShop[self.shopType].petTravel) do if v.unlockLocation.status == 1 then table.insert(Ids, { unlockLocationId = v.id, isNew = v.unlockLocation.isNew }) end end local nextRefreshTime = 0 local timeCoefficient = skynet.server.store:GetTimeCoefficient(player, 7) -- 月卡权益 时间系数 nextRefreshTime = math.ceil(petTravel[locationId].time * 60 * timeCoefficient) + skynet.GetTime() petShop[self.shopType].petTravel[locationId].finishTime = nextRefreshTime local probability = skynet.server.gameConfig:GetPlayerAllCfg(player, "SValue").petTravelProbability[1] * 100 -- 奇遇概率 local petTravelCount = player.gameData.todayGain.petShopPetTravelCount -- 宠物奇遇是否获取的值 if petTravelCount == 0 then local rand = math.random(1, 100) if rand <= probability then -- 触发奇遇 player.gameData.todayGain.petShopPetTravelCount = 1 petShop[self.shopType].petTravel[locationId].happyEncounter = 2 end end data.petTravelInfo = { status = petShop[self.shopType].petTravel[locationId].status, unlockLocation = Ids, endTravelTime = petShop[self.shopType].petTravel[locationId].finishTime, -- 结束出游时间 locationId = locationId, happyEncounter = petShop[self.shopType].petTravel[locationId].happyEncounter } end -- log.info('宠物出游开始信息', skynet.server.common:TableToString(data)) s2cData.cmd = pb.enum("MsgType", "CMD_S2C_PetTravelStart") s2cData.data = assert(pb.encode("S2CPetTravelStart", data)) end -- 宠物出游加速 function PetShop:PetTravelAccelerate(player, c2sData, s2cData) c2sData.data = assert(pb.decode("C2SPetTravelAccelerate", c2sData.data)) local petShop = player.gameData.shop local cfgSValue = skynet.server.gameConfig:GetPlayerAllCfg(player, "SValue") local petTravel = skynet.server.gameConfig:GetPlayerAllCfg(player, "PetTravel") -- 宠物店出游数据 local data = {} local isSuc = false data.petTravelInfo = {} -- 有加速券优先使用加速券 if skynet.server.bag:GetGoodsCount(player, dataType.GoodsType_Prop, 6) > 0 then -- 消耗玩家一个加速券 skynet.server.bag:RemoveGoods(player, dataType.GoodsType_Prop, 6, 1) isSuc = true else local eventId = pb.enum("EnumMoneyChangeEventID", "EventID_92") local needVolute = 10 local nowTime = skynet.GetTime() for k, v in pairs(petShop[self.shopType].petTravel) do if v.status == 1 then needVolute = math.ceil((v.finishTime - nowTime) / 60 / cfgSValue.timeExchangeVoluteCoin[2] * cfgSValue.timeExchangeVoluteCoin[1]) end end if needVolute < 0 then s2cData.cmd = pb.enum("MsgType", "CMD_S2C_PetTravelAccelerate") s2cData.code = errorInfo.ErrorCode.ErrRequestParam return end -- 判断蜗壳币数量是否足够 if player:MoneyChange(dataType.MoneyType_Volute, -needVolute, eventId) then -- 使用蜗壳币进行加速 修改相关数据 player.gameData.todayGain.speedUpUseCount = player.gameData.todayGain.speedUpUseCount + 1 if player.gameData.todayGain.speedUpUseCount == cfgSValue.triggerPlantPack[1] then skynet.server.store:TriggerPack(player, skynet.server.store.TriggerPack_SpeedUp) end local Ids = {} for k, v in pairs(petShop[self.shopType].petTravel) do if v.unlockLocation.status == 1 then table.insert(Ids, { unlockLocationId = v.id, isNew = v.unlockLocation.isNew }) if v.status == 1 then v.finishTime = 0 -- 十分钟 v.status = 2 skynet.server.msgTips:Add(player, 82) data.petTravelInfo = { status = v.status, unlockLocation = Ids, locationId = v.id, happyEncounter = v.happyEncounter } end end end else s2cData.code = errorInfo.ErrorCode.NoEnoughMoney end end -- 判断是否满足条件进行加速 if isSuc then local Ids = {} for k, v in pairs(petShop[self.shopType].petTravel) do if v.unlockLocation.status == 1 then table.insert(Ids, { unlockLocationId = v.id, isNew = v.unlockLocation.isNew }) if v.status == 1 then -- 加速时间 v.finishTime = v.finishTime - cfgSValue.petTravelTime[2] * 60 -- 十分钟 -- v.finishTime = v.finishTime - 7190 -- 十分钟 if skynet.GetTime() >= v.finishTime then v.status = 2 skynet.server.msgTips:Add(player, 82) data.petTravelInfo = { status = v.status, unlockLocation = Ids, locationId = v.id, happyEncounter = v.happyEncounter } else data.petTravelInfo = { status = v.status, endTravelTime = v.finishTime, unlockLocation = Ids, locationId = v.id, happyEncounter = v.happyEncounter } end end end end end -- log.info('宠物出游加速信息', skynet.server.common:TableToString(data)) s2cData.cmd = pb.enum("MsgType", "CMD_S2C_PetTravelAccelerate") s2cData.data = assert(pb.encode("S2CPetTravelAccelerate", data)) end -- 宠物出游奖励获取 function PetShop:PetTravelAward(player, c2sData, s2cData) c2sData.data = assert(pb.decode("C2SPetTravelAward", c2sData.data)) local petShop = player.gameData.shop local data = {} local petTravel = skynet.server.gameConfig:GetPlayerAllCfg(player, "PetTravel") for k, v in pairs(petShop[self.shopType].petTravel) do -- 如果时间已经可以领取修改出游状态 if v.status == 1 and skynet.GetTime() >= v.finishTime then v.status = 2 end if v.status == 2 then for k1, v1 in pairs(petTravel) do if v.id == v1.id then local eventId = pb.enum("EnumMoneyChangeEventID", "EventID_99") data.awardId = v1.travelId data.happyEncounter = 1 v.status = 0 local petType = 1 if player.gameData.pet[petType] and dataType.PetType_Travel == player.gameData.pet[petType].status then player.gameData.pet[petType].status = dataType.PetType_UnlockOpened end if v1.travelId == 661 and v1.npcId == 9 then player:GiveRewardNpc(v1.travelId, 9, eventId) elseif v1.travelId == 661 and v1.npcId ~= 9 then -- 增加指定NPC好感度 local curNpc = player.gameData.friend[v1.npcId] if curNpc then skynet.server.friend:AddFavorability(player, curNpc, 3) curNpc = player.gameData.friend[9] skynet.server.friend:AddFavorability(player, curNpc, 1) end player:GiveReward(v1.travelId, eventId) elseif v1.travelId ~= 661 then player:GiveRewardNpc(v1.travelId, v1.npcId, eventId) end -- 添加的任务 skynet.server.levelTask:Modify(player, 25, 1) skynet.server.achieveTask:Modify(player, 25, 1) skynet.server.taskListEvent:Modify( player ,25, 1) skynet.server.msgTips:ReduceAll(player, 82) --skynet.server.taskListEvent:Modify( player ,37, 1) player:AddExpForType(17) if v.happyEncounter == 2 then data.specialAwardId = v1.rewardId data.happyEncounter = 2 v.happyEncounter = 1 player:GiveReward(v1.rewardId, eventId) end end end end end -- log.info('宠物出游奖励获取信息', skynet.server.common:TableToString(data)) s2cData.cmd = pb.enum("MsgType", "CMD_S2C_PetTravelAward") s2cData.data = assert(pb.encode("S2CPetTravelAward", data)) end -- 宠物商店展示 function PetShop:PetShopShow(player, c2sData, s2cData) c2sData.data = assert(pb.decode("C2SPetShopShow", c2sData.data)) local cfgSValue = skynet.server.gameConfig:GetPlayerAllCfg(player, "SValue") local petStore = skynet.server.gameConfig:GetPlayerAllCfg(player, "PetStore") local petShop = player.gameData.shop local data = {} data.goods = {} for k, v in pairs(petShop[self.shopType].petShopGoodInfo) do table.insert(data.goods, { good = { goodsType = petStore[v.id].goodsType, goodsId = petStore[v.id].ticketId, goodsCount = 1 }, limitType = petStore[v.id].packLimit[1], buyTimes = v.buyTimes }) end if skynet.GetTime() >= petShop[self.shopType].nextFreeTime then petShop[self.shopType].blindBoxStatus = 1 end data.blindBox = { blindBoxStatus = petShop[self.shopType].blindBoxStatus, nextFreeTime = petShop[self.shopType].nextFreeTime, } skynet.server.msgTips:ReduceAll(player, 84) -- log.info('商店传输数据' .. skynet.server.common:TableToString(data)) s2cData.cmd = pb.enum("MsgType", "CMD_S2C_PetShopShow") s2cData.data = assert(pb.encode("S2CPetShopShow", data)) end -- 宠物商店购买 function PetShop:PetShopBuy(player, c2sData, s2cData) c2sData.data = assert(pb.decode("C2SPetShopBuy", c2sData.data)) local petShop = player.gameData.shop local petStore = skynet.server.gameConfig:GetPlayerAllCfg(player, "PetStore") -- 宠物店商店数据 local good = c2sData.data.good local count = c2sData.data.count local data = {} data.count = count -- 购买数量 data.good = {} -- 购买商品 data.goods = {} -- 当前展示的商品 local goodsId = 1 for k, v in pairs(petStore) do if v.ticketId == good.good.goodsId then goodsId = v.id end end -- 判断购买次数是否超过 if goodsId ~= 1 and petShop[self.shopType].petShopGoodInfo[goodsId].buyTimes + count > petStore[goodsId].packLimit[2] then -- log.info('超出购买次数') s2cData.code = errorInfo.ErrorCode.petShopPackLimit else -- 判断三叶币数量是否足够 local eventId = pb.enum("EnumMoneyChangeEventID", "EventID_10") -- 待替换配置 local cfgSValue = skynet.server.gameConfig:GetPlayerAllCfg(player, "SValue") -- 总的扣除数量 local allMoney = count * petStore[goodsId].mapCoin local isSuc = player:MoneyChange(pb.enum("EnumGoodsType", "Clovers"), -allMoney, eventId) if isSuc then for k, v in pairs(petShop[self.shopType].petShopGoodInfo) do if v.id == goodsId then v.buyTimes = v.buyTimes + count data.good = { good = { goodsType = good.good.goodsType, goodsId = petStore[v.id].ticketId, goodsCount = count }, limitType = petStore[v.id].packLimit[1], buyTimes = v.buyTimes } -- -- if v.buyTimes == petShop[self.shopType].petShopGoodInfo[goodsId].packLimit[2] then -- end -- elseif v.id == goodsId and v.packLimit[1] ~= 4 then -- v.buyTimes = v.buyTimes + count -- data.good = { -- good = { -- goodsType = good.good.goodsType, -- goodsId = petStore[v.id].ticketId, -- goodsCount = count -- }, -- -- limitType = v.packLimit[1], -- buyTimes = v.buyTimes -- } end table.insert(data.goods, { good = { goodsType = good.good.goodsType, goodsId = petStore[v.id].ticketId, goodsCount = count }, limitType = petStore[v.id].packLimit[1], buyTimes = v.buyTimes }) end -- 将购买的经验书存入背包 skynet.server.bag:AddGoods(player, dataType.GoodsType_Prop, good.good.goodsId, count) end end -- log.info('宠物商店购买信息' .. skynet.server.common:TableToString(data)) s2cData.cmd = pb.enum("MsgType", "CMD_S2C_PetShopBuy") s2cData.data = assert(pb.encode("S2CPetShopBuy", data)) end -- 宠物盲盒抽取加速 function PetShop:PetShopLotteryAccelerate(player, c2sData, s2cData) c2sData.data = assert(pb.decode("C2SPetShopLotteryAccelerate", c2sData.data)) local petShop = player.gameData.shop local cfgSValue = skynet.server.gameConfig:GetPlayerAllCfg(player, "SValue") local methodType = c2sData.data.methodType local data = {} local isSuc = false data.blindBox = {} if dataType.AccelerateType_WatchAD == methodType and skynet.server.ad:CanWatch(player, "GetPetLottery") then skynet.server.ad:Update(player, "GetPetLottery") petShop[self.shopType].blindBoxStatus = 1 petShop[self.shopType].nextFreeTime = 0 isSuc = true elseif dataType.AccelerateType_Volute == methodType then -- local cfgpetShopVoluteTime = cfgSValue.petShopVoluteTime local eventId = pb.enum("EnumMoneyChangeEventID", "EventID_94") local needVolute = 10 local time = petShop[self.shopType].nextFreeTime local nowTime = skynet.GetTime() needVolute = math.ceil((time - nowTime) / 60 / cfgSValue.timeExchangeVoluteCoin[2] * cfgSValue.timeExchangeVoluteCoin[1]) if -needVolute > 0 then s2cData.cmd = pb.enum("MsgType", "CMD_S2C_PetShopLotteryAccelerate") s2cData.code = errorInfo.ErrorCode.ErrRequestParam return end -- 判断蜗壳币数量是否足够 if player:MoneyChange(dataType.MoneyType_Volute, -needVolute, eventId) then -- 使用蜗壳币进行加速 修改相关数据 player.gameData.todayGain.speedUpUseCount = player.gameData.todayGain.speedUpUseCount + 1 if player.gameData.todayGain.speedUpUseCount == cfgSValue.triggerPlantPack[1] then skynet.server.store:TriggerPack(player, skynet.server.store.TriggerPack_SpeedUp) end -- 蜗壳币加速时间 -- petShop[self.shopType].nextFreeTime = petShop[self.shopType].nextFreeTime - cfgSValue.petShopVoluteTime[2] * -- 60 -- 十分钟 petShop[self.shopType].blindBoxStatus = 1 petShop[self.shopType].nextFreeTime = 0 isSuc = true else s2cData.code = errorInfo.ErrorCode.NoEnoughMoney end elseif dataType.AccelerateType_AccTicket == methodType then if skynet.server.bag:GetGoodsCount(player, dataType.GoodsType_Prop, 6) > 0 then -- 消耗玩家一个加速券 skynet.server.bag:RemoveGoods(player, dataType.GoodsType_Prop, 6, 1) -- 蜗壳币加速时间 petShop[self.shopType].nextFreeTime = petShop[self.shopType].nextFreeTime - cfgSValue.petShopVoluteTime[2] * 60 -- 十分钟 isSuc = true else s2cData.code = errorInfo.ErrorCode.NoEnoughProp end elseif dataType.AccelerateType_ADTicket == methodType and skynet.server.ad:CanWatch(player, "GetPetLottery") and skynet.server.ad:PayADTicket(player, "GetPetLottery") then -- 修改广告数据 petShop[self.shopType].blindBoxStatus = 1 petShop[self.shopType].nextFreeTime = 0 isSuc = true end -- 判断是否满足条件 if isSuc then if skynet.GetTime() >= petShop[self.shopType].nextFreeTime then petShop[self.shopType].blindBoxStatus = 1 skynet.server.msgTips:Add(player, 83) end data.blindBox = { blindBoxStatus = petShop[self.shopType].blindBoxStatus, nextFreeTime = petShop[self.shopType].nextFreeTime, } end -- log.info('宠物商店盲盒抽取加速信息' .. skynet.server.common:TableToString(data)) s2cData.cmd = pb.enum("MsgType", "CMD_S2C_PetShopLotteryAccelerate") s2cData.data = assert(pb.encode("S2CPetShopLotteryAccelerate", data)) end -- 宠物商店盲盒抽取 function PetShop:PetShopLottery(player, c2sData, s2cData) c2sData.data = assert(pb.decode("C2SPetShopLottery", c2sData.data)) local petShop = player.gameData.shop local data = {} local cfgSValue = skynet.server.gameConfig:GetPlayerAllCfg(player, "SValue") local petStore = skynet.server.gameConfig:GetPlayerAllCfg(player, "PetStore") local probability = cfgSValue.petBookBoxOpen -- 盲盒里顶级资料书开启概率、中级资料书开启概率、初级资料书开启概率 {1,2,3} local openCount = cfgSValue.petBoxOpen -- 每次开启盲盒获取的资料书数量 data.blindBox = {} -- 盲盒状态 -- data.getGood = {} -- 盲盒随机领取的商品 local BoxProbability = {} -- 判断盲盒是否处于可领取状态 if skynet.GetTime() >= petShop[self.shopType].nextFreeTime then petShop[self.shopType].blindBoxStatus = 1 end if petShop[self.shopType].blindBoxStatus == 1 then for k, v in pairs(probability) do table.insert(BoxProbability, { type = k, typeProbability = v * 100 }) end local bookType = 3 -- 经验书类型 local rand = math.random(1, 100) local count = 0 for k, v in pairs(BoxProbability) do if rand >= (100 - v.typeProbability) then bookType = v.type break end end -- 根据不同的经验书获取不同的商品id local goodsId = 1 if bookType == 1 then goodsId = 3 elseif bookType == 2 then goodsId = 2 elseif bookType == 3 then goodsId = 1 end -- log.info('goodsId', goodsId) data.getGood = { goodsType = petStore[goodsId].goodsType, goodsId = petStore[goodsId].ticketId, goodsCount = openCount } -- 将购买的经验书存入背包 skynet.server.bag:AddGoods(player, dataType.GoodsType_Prop, petStore[goodsId].ticketId, openCount) local nextFreeTime = math.ceil(skynet.GetTime() + cfgSValue.petBookBox) if next(data.getGood) ~= nil then petShop[self.shopType].blindBoxStatus = 0 data.blindBox = { blindBoxStatus = petShop[self.shopType].blindBoxStatus, nextFreeTime = nextFreeTime, } skynet.server.npcTask:Modify(player, 105, 1) skynet.server.taskListEvent:Modify( player ,105, 1) skynet.server.msgTips:ReduceAll(player, 83) end petShop[self.shopType].nextFreeTime = nextFreeTime end -- log.info('宠物商店盲盒抽取信息' .. skynet.server.common:TableToString(data)) s2cData.cmd = pb.enum("MsgType", "CMD_S2C_PetShopLottery") s2cData.data = assert(pb.encode("S2CPetShopLottery", data)) end skynet.server.petShop = PetShop return PetShop