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

954 lines
41 KiB
Lua
Raw 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 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