HomeServer/Server/AllServer/GameServer/Shop/PetShop.lua
2024-11-20 15:41:37 +08:00

1087 lines
51 KiB
Lua
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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