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 --双倍领取 ExtraRevenue.OnlineIntervalTime = 2 --在线间隔时间(分钟) ExtraRevenue.OfflineIntervalTime = 5 --离线间隔时间(分钟) --计算离线收益 function ExtraRevenue:LoginInitData( player ) local cfgLevel = skynet.server.gameConfig:GetPlayerCurCfg( player , "Level" , player.gameData.level ) if cfgLevel then local lastTime = player.basicInfo.lastGameTime local extraRevenue = player.gameData.extraRevenue local offlineTime = math.floor((skynet.GetTime() - lastTime) / 60) --离线分钟数 if offlineTime > 0 then extraRevenue.offlineTime = extraRevenue.offlineTime + offlineTime if extraRevenue.offlineTime > cfgLevel.offlineUpperTime then extraRevenue.offlineTime = cfgLevel.offlineUpperTime end end end end --额外收益 function ExtraRevenue:Start( player , c2sData , s2cData ) c2sData.data = assert(pb.decode("C2SExtraRevenue", c2sData.data )) local data = {} local allCount = 0 local opType = c2sData.data.opType local level = player.gameData.level local cfgLevel = skynet.server.gameConfig:GetPlayerCurCfg( player , "Level" , level ) log.debug(string.format("玩家 %d 额外收益 开始 操作类型 %d ", player.userId , opType )) if not opType then s2cData.code = errorInfo.ErrorCode.ErrRequestParam elseif not cfgLevel then s2cData.code = errorInfo.ErrorCode.NoExistCfg else --计算下在线收益 self:CalcOnline( player ) local extraRevenue = player.gameData.extraRevenue local onlineTime = extraRevenue.onlineTime local offlineTime = extraRevenue.offlineTime local onlineCoinCount = math.floor( onlineTime / self.OnlineIntervalTime ) * cfgLevel.onlineRatio local offlineCoinCount = math.floor( offlineTime / self.OfflineIntervalTime ) * cfgLevel.offlineRatio local allCoinCount = 0 --第一次未领取只能给20,不能再多了 if not player:GetOnceSign( "isFirstExtraRevenue" ) then onlineTime = 0 onlineCoinCount = 20 offlineTime = 0 offlineCoinCount = 0 end allCount = onlineCoinCount + offlineCoinCount if self.OPType_GainRevenue == opType or self.OPType_GainDouble == opType then if not player:GetOnceSign( "isFirstExtraRevenue" ) then player:SetOnceSign( "isFirstExtraRevenue" , true) --打上第一次领取标记 end if self.OPType_GainDouble == opType then allCount = allCount * 2 end --发放金币 local eventId = pb.enum("EnumMoneyChangeEventID","EventID_23") player:MoneyChange( dataType.MoneyType_Coin , allCount , eventId) --触发相关任务 if allCount > 0 then skynet.server.levelTask:Modify( player , 44 , 1) skynet.server.dailyTask:Modify( player , 44 , 1) skynet.server.taskListEvent:Modify( player ,44, 1) extraRevenue.onlineTime = 0 extraRevenue.offlineTime = 0 end end data.opType = opType data.onlineTime = onlineTime data.onlineCoinCount = onlineCoinCount data.offlineTime = offlineTime data.offlineCoinCount = offlineCoinCount --data.coinCount = onlineCoinCount + offlineCoinCount --需要注释 --data.totalTime = onlineTime + offlineTime --需要注释 log.debug(string.format("玩家 %d 额外收益 操作类型 %d 在线时间 %d 在线金币 %d 离线时间 %d 离线金币 %d", player.userId , data.opType , data.onlineTime , data.onlineCoinCount , data.offlineTime , data.offlineCoinCount )) end s2cData.cmd = pb.enum("MsgType","CMD_S2C_ExtraRevenue") s2cData.data = assert(pb.encode("S2CExtraRevenue", data)) end --计算在线收益 function ExtraRevenue:CalcOnline( player ) local lastTime = player.tmpData.lastOnlineTime local cfgLevel = skynet.server.gameConfig:GetPlayerCurCfg( player , "Level" , player.gameData.level ) local extraRevenue = player.gameData.extraRevenue local onlineTime = math.floor((skynet.GetTime() - lastTime) / 60) --在线分钟数 if onlineTime > 0 then extraRevenue.onlineTime = extraRevenue.onlineTime + onlineTime if extraRevenue.onlineTime > cfgLevel.onlineUpperTime then extraRevenue.onlineTime = cfgLevel.onlineUpperTime end player.tmpData.lastOnlineTime = skynet.GetTime() end end skynet.server.extraRevenue = ExtraRevenue return ExtraRevenue