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 ExtraRevenue = oo.class() --挂机 ExtraRevenue.OPType_LastCount = 1 --获取最新收益 ExtraRevenue.OPType_GainRevenue = 2 --领取收益 ExtraRevenue.OPType_GainDouble = 3 --双倍领取 --额外收益 function ExtraRevenue:Start( player , c2sData , s2cData ) c2sData.data = assert(pb.decode("C2SExtraRevenue", c2sData.data )) local data = {} local allCount = 0 local opType = c2sData.data.opType if not opType then s2cData.code = errorInfo.ErrorCode.ErrRequestParam else --计算下在线收益 self:CalcOnline( player ) allCount = player.gameData.extraRevenue.online + player.gameData.extraRevenue.offline local firstOpType = dataType.FirstOpType_ExtraRevenue --第一次没领显示20 if false == player.gameData.firstOp[ firstOpType ] then allCount = 20 end if self.OPType_GainRevenue == opType or self.OPType_GainDouble == opType then if self.OPType_GainRevenue == opType then --第一次领取时只有20 local firstOpType = dataType.FirstOpType_ExtraRevenue if false == player.gameData.firstOp[ firstOpType ] then allCount = 20 player.gameData.firstOp[ firstOpType ] = true end player:MoneyChange( dataType.MoneyType_Coin , allCount ) elseif self.OPType_GainDouble == opType then player:MoneyChange( dataType.MoneyType_Coin , allCount * 2) end if allCount > 0 then skynet.server.levelTask:Modify( player , 44 , 1) skynet.server.dailyTask:Modify( player , 44 , 1) local curPlayerList = skynet.server.playerCenter:Get( player.userId ) curPlayerList.lastExtraRevenueTime = skynet.GetTime() player.gameData.extraRevenue.online = 0 player.gameData.extraRevenue.offline = 0 log.info(string.format("玩家 %d 额外收益 类型 %d 获得金币 %d", player.userId , opType , allCount)) end end end data.opType = opType data.coinCount = allCount s2cData.cmd = pb.enum("MsgType","CMD_S2C_ExtraRevenue") s2cData.data = assert(pb.encode("S2CExtraRevenue", data)) end --计算在线收益 function ExtraRevenue:CalcOnline( player ) local curPlayerList = skynet.server.playerCenter:Get( player.userId ) if player.userId and curPlayerList then local lastTime = curPlayerList.lastExtraRevenueTime local cfgLevel = skynet.server.gameConfig.Level[ player.gameData.level ] --计算在线时间 --if skynet.GetTime() > lastTime + 60 then local onlineTime = math.floor((skynet.GetTime() - lastTime) / 60) player.gameData.extraRevenue.online = math.floor(onlineTime * cfgLevel.onlineRatio) player.gameData.extraRevenue.online = player.gameData.extraRevenue.online < cfgLevel.earningUpper and player.gameData.extraRevenue.online or cfgLevel.earningUpper log.info(string.format("玩家 %d 额外收益 计算在线 时间 %d 金币 %d 最终数量 %d", player.userId ,onlineTime , onlineTime * cfgLevel.onlineRatio , player.gameData.extraRevenue.online )) --end else log.info(string.format("玩家 %d 额外收益 计算在线收益不存在", player.userId or 0)) end end --计算离线收益 function ExtraRevenue:CalcOffline( player ) local cfgLevel = skynet.server.gameConfig.Level[ player.gameData.level ] if cfgLevel then --计算离线时间 local offlineTime = math.floor((skynet.GetTime() - player.basicInfo.lastGameTime) / 60) offlineTime = offlineTime < cfgLevel.offlineUpperTime and offlineTime or cfgLevel.offlineUpperTime if offlineTime ~= 0 then --计算收益 player.gameData.extraRevenue.offline = player.gameData.extraRevenue.offline + player.gameData.extraRevenue.online --把在线的金币也加到离线里 player.gameData.extraRevenue.offline = math.floor(player.gameData.extraRevenue.offline + offlineTime * cfgLevel.offlineRatio) player.gameData.extraRevenue.offline = player.gameData.extraRevenue.offline < cfgLevel.earningUpper and player.gameData.extraRevenue.offline or cfgLevel.earningUpper player.basicInfo.lastGameTime = skynet.GetTime() log.info(string.format("玩家 %d 额外收益 计算离线 时间 %d 金币 %d 最终数量 %d", player.userId ,offlineTime , offlineTime * cfgLevel.offlineRatio , player.gameData.extraRevenue.offline )) end end end skynet.server.extraRevenue = ExtraRevenue return ExtraRevenue