HomeServer/Server/AllServer/GameServer/Shop/PetShop.lua

1087 lines
51 KiB
Lua
Raw Normal View History

2024-11-20 15:41:09 +08:00
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