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

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