local skynet = require "skynet" local oo = require "Class" local gameCmd = require "GameCmd" local json =require "json" local sqlUrl = require "SqlUrl" local log = require "Log" local dataType = require "DataType" local errorInfo = require "ErrorInfo" local serverId = tonumber(skynet.getenv "serverId") local clusterServer = require "ClusterServer" local socket = require "skynet.socket" local pb = require "pb" local playerCenter = require "PlayerCenter" local playerRecord = require "PlayerRecord" local redeem = require "Redeem" local mail = require "Mail" local announcement = require "Announcement" local house = require "House" local generalShop = require "GeneralShop" local decorateShop = require "DecorateShop" local clothesShop = require "ClothesShop" local petClothesShop = require "PetClothesShop" local plantShop = require "PlantShop" local coffeeShop = require "CoffeeShop" local flowerShop = require "FlowerShop" local styleShop = require "StyleShop" local guGuShop = require "GuGuShop" local lottery = require "Lottery" local flowerpot = require "Flowerpot" local bag = require "Bag" local used = require "Used" local accountServer = require "AccountServer" local serverManage = require "ServerManage" local defense = require "Defense" local gashapon = require "Gashapon" local weather = require "Weather" local msgTips = require "MsgTips" local gm = require "Gm" local personal = require "Personal" local pet = require "Pet" local levelTask = require "LevelTask" local dailyTask = require "DailyTask" local achieveTask = require "AchieveTask" local friend = require "Friend" local illustration = require "Illustration" local flowerShop = require "FlowerShop" local ad = require "AD" local extraRevenue = require "ExtraRevenue" local guide = require "Guide" local map = require "Map" local questionnaire = require "Questionnaire" local dyeworkshop = require "DyeWorkShop" local store = require "Store" local passCheck = require "PassCheck" local design = require "Design" local audit = require "Audit" local signIn = require "SignIn" local playerLand = require "PlayerLand" --local backpack = require "Backpack" local GameServer = oo.class(clusterServer) GameServer.per5MinTotalLoginCount = 300 --每5分钟连接数 --初始化 function GameServer:Init() self.lastLoginCount = 0 self.preLoginUser = {} self.serverInfo.playerCount ={} self.serverInfo.playerCount.playing = 0 self.serverInfo.playerCount.offline = 0 self.serverInfo.pre5MinLoginCount = 0 self.serverInfo.loginCount = 0 self.serverInfo.needPlayerCount = 0 self.last5MinTotalLoginCount = 0 --预登陆玩家 for i = 1, 100, 1 do local account = "womei"..i if not self.preLoginUser[ account ] then self.preLoginUser[ account ] = {} end self.preLoginUser[ account ].platform = "Apple" self.preLoginUser[ account ].loginAccount = account self.preLoginUser[ account ].loginToken = "123456" end if 100 == serverId then --skynet.newservice("debug_console",9099) end end --跨天 function GameServer:OnNewDay() end --1秒Timer function GameServer:On1SecTimer() end --5秒Timer function GameServer:On5SecTimer() self:StatData() end --接收集群数据 function GameServer:ClusterRecv(...) local cmd , c2sData = ... local s2cData = {} s2cData.code = errorInfo.Suc s2cData.data = {} if self.Center2All_ServerManageCmd == cmd then --中心服集群消息 serverManage:DoManageCmd( c2sData , s2cData ) elseif self.Center2All_SyncClusterInfo == cmd then --同步服务器信息 self:RecvSyncClusterInfo( c2sData ) elseif self.Center2All_SyncServerConfig == cmd then --同步服务器配置 self:RecvSyncServerConfig( c2sData ) elseif self.Center2All_WebMsg == cmd then --Web消息 self:WebMsg( c2sData ) elseif self.Route2Game_QueryUserOnline == cmd then --路由服集群消息 self:RecvQueryUserOnline( c2sData , s2cData ) elseif self.Route2Game_UserLoginToken == cmd then self:RecvUserLoginToken( c2sData ) elseif self.Pay2Game_AddPayInfo == cmd then self:AddPayInfo( c2sData , s2cData) else log.info(string.format("集群服务器 消息接口 %d 不存在", cmd)) s2cData.code = errorInfo.ErrorCode.NoExistInterface end log.info(string.format("集群服 执行命令 %d 返回消息状态 %d " , cmd , s2cData.code)) return s2cData end --接收客户端TCP数据 function GameServer:TcpRecv( c2sData , s2cData) function Do() if pb.enum("MsgType","CMD_C2S_UserLogin") == c2sData.cmd then --用户登陆游戏 local t1 = skynet.GetTime() self:UserLogin( c2sData , s2cData ) log.info(string.format("登陆请求运行时间 %d", skynet.GetTime() - t1)) elseif pb.enum("MsgType","CMD_C2S_UserExit") == c2sData.cmd then --用户登陆游戏 else local t1 = skynet.GetTime() c2sData.userId = playerCenter:GetUserIDForSocketId( c2sData.socketId ) if nil == c2sData.userId then log.info("该 sokcet 已经不存在,发来的消息不处理", c2sData.socketId ) s2cData.code = errorInfo.ErrorCode.NoExistSocketId return end local player = playerCenter:GetPlayer( c2sData.userId ) if not playerCenter:IsPlaying( c2sData.userId ) then --除了登陆,断线后不接收任何消息 s2cData.code = errorInfo.ErrorCode.UserOffline return end playerCenter:Ping( c2sData.userId ) player.basicInfo.lastGameTime = skynet.GetTime() if self.curServerConfig.IsDetailLog then log.info(string.format("玩家 %d cmd %d 请求", c2sData.userId , c2sData.cmd)) else log.info(string.format("玩家 %d cmd %d 请求", c2sData.userId , c2sData.cmd)) end --线上版本需要严格检测消息类型 if skynet.server.gameConfig:IsOnline() then if pb.enum("MsgType","CMD_C2S_Ping") ~= c2sData.cmd and pb.enum("MsgType","CMD_C2S_Archive") ~= c2sData.cmd and pb.enum("MsgType","CMD_C2S_ServerTime") ~= c2sData.cmd then s2cData.code = errorInfo.ErrorCode.MsgTypeError log.info(string.format("玩家 %d 存档版本无法走服务器逻辑", c2sData.userId)) return elseif pb.enum("MsgType","CMD_C2S_Archive") == c2sData.cmd then s2cData.code = errorInfo.ErrorCode.MsgTypeError log.info(string.format("玩家 %d 服务器版本无法走存档逻辑", c2sData.userId)) return end end if pb.enum("MsgType","CMD_C2S_Ping") == c2sData.cmd then --用户Ping self:Ping( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_Archive") == c2sData.cmd then --存档 self:Archive( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_ServerTime") == c2sData.cmd then --获取服务器时间 self:ServerTime( player , c2sData , s2cData ) --elseif pb.enum("MsgType","CMD_C2S_MoneyChange") == c2sData.cmd then --货币变化 -- player:MoneyChangeMsg() elseif pb.enum("MsgType","CMD_C2S_MsgTipsConfirm") == c2sData.cmd then --消息提示完成 skynet.server.msgTips:Confirm( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_FinishGuide") == c2sData.cmd then --完成新手引导 skynet.server.guide:FinishGuide( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_GMCmd") == c2sData.cmd then --GM命令 --skynet.server.gm:Cmd( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_GMAddGoods") == c2sData.cmd then --GM商品命令 --skynet.server.gm:AddGoods( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_BagSort") == c2sData.cmd then --背包排序 skynet.server.bag:Sort( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_BagShow") == c2sData.cmd then --背包展现 skynet.server.bag:Show( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_BagClick") == c2sData.cmd then --背包点击 skynet.server.bag:Click( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_HouseShow") == c2sData.cmd and player:IsUnlockSystem( dataType.UnlockSystem_MoveHome ) then --房子展示 skynet.server.house:Show( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_HouseBuy") == c2sData.cmd and player:IsUnlockSystem( dataType.UnlockSystem_MoveHome ) then --房子购买 skynet.server.house:Buy( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_HouseMove") == c2sData.cmd and player:IsUnlockSystem( dataType.UnlockSystem_MoveHome ) then --搬家 skynet.server.house:Move( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_HouseBuyScheme") == c2sData.cmd and player:IsUnlockSystem( dataType.UnlockSystem_MoveHome ) then --购买方案 skynet.server.house:BuyScheme( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_HouseSwitchScheme") == c2sData.cmd and player:IsUnlockSystem( dataType.UnlockSystem_MoveHome ) then --切换方案 skynet.server.house:SwitchScheme( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_HouseSchemeName") == c2sData.cmd and player:IsUnlockSystem( dataType.UnlockSystem_MoveHome ) then --修改方案名称 skynet.server.house:SchemeName( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_HousePutFurniture") == c2sData.cmd then --房屋摆放家具 skynet.server.house:PutFurniture( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_HouseDecorate") == c2sData.cmd then --装修房间 skynet.server.house:Decorate( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_HouseUnlockArea") == c2sData.cmd and player:IsUnlockSystem( dataType.UnlockSystem_MoveHome ) then --解锁房间区域 skynet.server.house:UnlockArea( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_ShopShow") == c2sData.cmd then --通用商店展示 skynet.server.generalShop:Show( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_ShopRefresh") == c2sData.cmd then --通用商店刷新 skynet.server.generalShop:Refresh( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_ShopBuy") == c2sData.cmd then --通用商店购买 skynet.server.generalShop:Buy( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_DecorateShopShow") == c2sData.cmd then --装修商店展示 skynet.server.decorateShop:Show( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_DecorateShopRefresh") == c2sData.cmd then --装修商店刷新 skynet.server.decorateShop:Refresh( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_DecorateShopBuy") == c2sData.cmd then --装修商店购买 skynet.server.decorateShop:Buy( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_ClothesShopShow") == c2sData.cmd and player:IsUnlockSystem( dataType.UnlockSystem_Clothing ) then --服饰商店展示 skynet.server.clothesShop:Show( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_ClothesShopRefresh") == c2sData.cmd and player:IsUnlockSystem( dataType.UnlockSystem_Clothing ) then --服饰商店刷新 skynet.server.clothesShop:Refresh( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_ClothesShopBuy") == c2sData.cmd and player:IsUnlockSystem( dataType.UnlockSystem_Clothing ) then --服饰商店购买 skynet.server.clothesShop:Buy( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_PetClothesShopShow") == c2sData.cmd then --宠物服饰商店展示 skynet.server.petClothesShop:Show( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_PetClothesShopRefresh") == c2sData.cmd then --宠物服饰商店刷新 skynet.server.petClothesShop:Refresh( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_PetClothesShopBuy") == c2sData.cmd then --宠物服饰商店购买 skynet.server.petClothesShop:Buy( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_PlantShopShow") == c2sData.cmd and player:IsUnlockSystem( dataType.UnlockSystem_Plant ) then --植物商店展示 skynet.server.plantShop:Show( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_PlantShopManage") == c2sData.cmd and player:IsUnlockSystem( dataType.UnlockSystem_Plant ) then --植物商店管理 skynet.server.plantShop:Manage( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_LevelTaskShow") == c2sData.cmd and player:IsUnlockSystem( dataType.UnlockSystem_LevelTask ) then --等级任务列表显示 skynet.server.levelTask:Show( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_LevelTaskAccomplish") == c2sData.cmd and player:IsUnlockSystem( dataType.UnlockSystem_LevelTask ) then --等级任务完成 skynet.server.levelTask:Accomplish( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_DailyTaskShow") == c2sData.cmd and player:IsUnlockSystem( dataType.UnlockSystem_DailyTask ) then --每日任务列表显示 skynet.server.dailyTask:Show( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_DailyTaskOneAccomplish") == c2sData.cmd and player:IsUnlockSystem( dataType.UnlockSystem_DailyTask ) then --每日任务完成 skynet.server.dailyTask:OneAccomplish( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_DailyTaskAllAccomplish") == c2sData.cmd and player:IsUnlockSystem( dataType.UnlockSystem_DailyTask ) then --每日任务完成 skynet.server.dailyTask:AllAccomplish( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_AchieveTaskShow") == c2sData.cmd and player:IsUnlockSystem( dataType.UnlockSystem_AchieveTask ) then --成就任务列表显示 skynet.server.achieveTask:Show( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_AchieveTaskAccomplish") == c2sData.cmd and player:IsUnlockSystem( dataType.UnlockSystem_AchieveTask ) then --成就任务完成 skynet.server.achieveTask:Accomplish( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_UsedShow") == c2sData.cmd and player:IsUnlockSystem( dataType.UnlockSystem_Used ) then --闲菜展示 skynet.server.used:Show( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_UsedBuy") == c2sData.cmd and player:IsUnlockSystem( dataType.UnlockSystem_Used )then --闲菜购买 skynet.server.used:Buy( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_UsedRefresh") == c2sData.cmd and player:IsUnlockSystem( dataType.UnlockSystem_Used )then --闲菜刷新 skynet.server.used:Refresh( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_UsedSell") == c2sData.cmd and player:IsUnlockSystem( dataType.UnlockSystem_Used )then --闲菜出售 skynet.server.used:Sell( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_UsedLogisticsShow") == c2sData.cmd then --闲菜物流展示 skynet.server.used:LogisticsShow( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_UsedLogistics") == c2sData.cmd then --闲菜物流 skynet.server.used:Logistics( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_UsedStorageShow") == c2sData.cmd and player:IsUnlockSystem( dataType.UnlockSystem_Used )then --闲菜查看仓库 skynet.server.used:StorageShow( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_UsedSellAccelerate") == c2sData.cmd then --闲菜物流 skynet.server.used:SellAccelerate( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_PersonalShow") == c2sData.cmd then --个人特征展示 skynet.server.personal:Show( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_PersonalChange") == c2sData.cmd then --个人特征改变 skynet.server.personal:Change( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_PersonalRename") == c2sData.cmd then --个人特征重新改名 skynet.server.personal:Rename( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_PetShow") == c2sData.cmd then --宠物特征展示 skynet.server.pet:Show( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_PetChange") == c2sData.cmd then --宠物特征改变 skynet.server.pet:Change( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_PetUnlock") == c2sData.cmd then --宠物解锁 skynet.server.pet:Unlock( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_PetRename") == c2sData.cmd then --宠物改名 skynet.server.pet:Rename( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_IllustrationShow") == c2sData.cmd then --图鉴展示 skynet.server.illustration:Show( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_IllustrationAward") == c2sData.cmd then --图鉴领奖 skynet.server.illustration:Award( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_FlowerpotShow") == c2sData.cmd then --花盆展示信息 skynet.server.flowerpot:Show( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_FlowerpotPlant") == c2sData.cmd then --花盆种植 skynet.server.flowerpot:Plant( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_FlowerpotShovel") == c2sData.cmd then --花盆铲除 skynet.server.flowerpot:Shovel( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_FlowerpotFertilize") == c2sData.cmd then --花盆施肥 skynet.server.flowerpot:Fertilize( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_FriendMsgList") == c2sData.cmd and player:IsUnlockSystem( dataType.UnlockSystem_Friend) then --朋友圈消息列表 skynet.server.friend:MsgList( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_FriendMsgDetail") == c2sData.cmd and player:IsUnlockSystem( dataType.UnlockSystem_Friend ) then --朋友圈消息详情 skynet.server.friend:MsgDetail( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_FriendMsgClient") == c2sData.cmd and player:IsUnlockSystem( dataType.UnlockSystem_Friend ) then --朋友圈客户端发送消息 skynet.server.friend:MsgClient( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_FriendMsgAddFriend") == c2sData.cmd and player:IsUnlockSystem( dataType.UnlockSystem_Friend ) then --朋友圈消息添加好友 skynet.server.friend:AddFriend( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_FriendMsgGetGift") == c2sData.cmd and player:IsUnlockSystem( dataType.UnlockSystem_Friend ) then --朋友圈消息获取礼物 skynet.server.friend:GetGift( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_FriendMsgEnterScene") == c2sData.cmd and player:IsUnlockSystem( dataType.UnlockSystem_Friend ) then --朋友圈消息进入场景 skynet.server.friend:EnterScene( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_FriendMsgLeaveScene") == c2sData.cmd and player:IsUnlockSystem( dataType.UnlockSystem_Friend ) then --朋友圈消息离开场景 skynet.server.friend:LeaveScene( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_FriendListShow") == c2sData.cmd and player:IsUnlockSystem( dataType.UnlockSystem_Friend ) then --好友列表展示 skynet.server.friend:ListShow( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_FriendGiftBag") == c2sData.cmd and player:IsUnlockSystem( dataType.UnlockSystem_Friend ) then --礼物背包 skynet.server.friend:GiftBag( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_FriendGiftGive") == c2sData.cmd and player:IsUnlockSystem( dataType.UnlockSystem_Friend ) then --赠送礼物 skynet.server.friend:GiftGive( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_FriendNewsShow") == c2sData.cmd and player:IsUnlockSystem( dataType.UnlockSystem_Friend ) then --友圈动态 skynet.server.friend:NewsShow( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_FriendLikeNews") == c2sData.cmd and player:IsUnlockSystem( dataType.UnlockSystem_Friend ) then --友圈点赞 skynet.server.friend:LikeNews( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_FriendInteract") == c2sData.cmd and player:IsUnlockSystem( dataType.UnlockSystem_Friend ) then --友圈互动 skynet.server.friend:Interact( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_FriendFavorabilityChange") == c2sData.cmd and player:IsUnlockSystem( dataType.UnlockSystem_Friend ) then --友圈互动 skynet.server.friend:Interact( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_GiftBoxShow") == c2sData.cmd then --礼盒展示 --skynet.server.giftBox:Show( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_GiftBoxPrize") == c2sData.cmd then --礼盒领奖 --skynet.server.giftBox:Prize( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_GashaponShow") == c2sData.cmd then --扭蛋展示 skynet.server.gashapon:Show( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_GashaponLottery") == c2sData.cmd then --扭蛋抽奖 skynet.server.gashapon:Lottery( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_GashaponGainPrize") == c2sData.cmd then --扭蛋获取奖品 skynet.server.gashapon:GainPrize( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_ADWatch") == c2sData.cmd then --观看广告 skynet.server.ad:Watch( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_ExtraRevenue") == c2sData.cmd and player:IsUnlockSystem( dataType.UnlockSystem_Hang ) then --额外收益(在线+离线) skynet.server.extraRevenue:Start( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_MailHistory") == c2sData.cmd then --邮件领取历史 skynet.server.mail:History( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_MailAward") == c2sData.cmd then --邮件奖励 skynet.server.mail:Award( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_ReadMail") == c2sData.cmd then --邮件读取 skynet.server.mail:Read( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_DeleteReadMail") == c2sData.cmd then --删除已读邮件 skynet.server.mail:DeleteRead( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_MailAllAward") == c2sData.cmd then --一键领取邮件奖励 skynet.server.mail:AllAward( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_RedeemHistory") == c2sData.cmd then --兑换码领取历史 skynet.server.redeem:History( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_RedeemAward") == c2sData.cmd then --兑换码领取奖励 skynet.server.redeem:Award( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_CoffeeMergeShow") == c2sData.cmd then --咖啡合成界面展示 skynet.server.coffeeShop:Show( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_CoffeeMergeSupplyClick") == c2sData.cmd then --咖啡供货盒点击 skynet.server.coffeeShop:SupplyClick( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_CoffeeMergeSupplyShow") == c2sData.cmd then --咖啡供货盒展示 skynet.server.coffeeShop:SupplyShow( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_CoffeeMergeSort") == c2sData.cmd then --咖啡排序 skynet.server.coffeeShop:Sort( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_CoffeeMergeAttempt") == c2sData.cmd then --咖啡合成 skynet.server.coffeeShop:Merge( player , c2sData , s2cData ) --elseif pb.enum("MsgType","CMD_C2S_CoffeeMergeCurrency") == c2sData.cmd then --咖啡货币 -- skynet.server.coffeeShop:Show( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_CoffeeSupplierReplenish") == c2sData.cmd then --咖啡原料补充 skynet.server.coffeeShop:Replenish( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_CoffeeResearch") == c2sData.cmd then --咖啡研发 skynet.server.coffeeShop:Research( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_CoffeeIllustrationShow") == c2sData.cmd then --咖啡图鉴展示 skynet.server.coffeeShop:IllustrationShow( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_CoffeeIllustrationPrize") == c2sData.cmd then --咖啡图鉴领取 skynet.server.coffeeShop:IllustrationPrize( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_FlowerShopShow") == c2sData.cmd then --花店内容展示 skynet.server.flowerShop:Show( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_FlowerShopBuy") == c2sData.cmd then --花店展示区购买 skynet.server.flowerShop:Buy( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_FlowerShopRecycle") == c2sData.cmd then --花店回收区售卖 skynet.server.flowerShop:Recycle( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_FlowerShelfShow") == c2sData.cmd then --花店货架展示 skynet.server.flowerShop:ShelfShow( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_FlowerShelfBuy") == c2sData.cmd then --花店货架购买 skynet.server.flowerShop:ShelfBuy( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_StylingRoomMiniGameShow") == c2sData.cmd then --造型间寻物展示 skynet.server.styleShop:GridShow( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_StylingRoomMiniGameRefresh") == c2sData.cmd then --造型间寻物刷新 skynet.server.styleShop:GridRefresh( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_StylingRoomMiniGameClick") == c2sData.cmd then --造型间寻物点击 skynet.server.styleShop:GridClick( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_StylingRoomMiniGameEnergyRefill") == c2sData.cmd then --造型间寻物剪刀回复 skynet.server.styleShop:RestoreEnergy( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_StylingRoomMiniGameEnergyShow") == c2sData.cmd then --造型间寻物剪刀展示 skynet.server.styleShop:EnergyShow( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_StylingDesignRoomShow") == c2sData.cmd then --每次进入造型间的时候需要显示 skynet.server.styleShop:RoomShow( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_StylingDesignRoomAttempt") == c2sData.cmd then --造型间设计 skynet.server.styleShop:RoomAttempt( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_StylingDesignRewardPrize") == c2sData.cmd then --造型间奖励领取 skynet.server.styleShop:RoomReward( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_GuGuShopShow") == c2sData.cmd then --咕咕市集数据展示 skynet.server.guGuShop:Show( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_GuGuShopBuy") == c2sData.cmd then --咕咕市集购买 skynet.server.guGuShop:Buy( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_MapShowLoc") == c2sData.cmd then --外出地点展示 skynet.server.map:ShowLoc( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_MapLocEnter") == c2sData.cmd then --进入外出地点 skynet.server.map:EntryLoc( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_MapShowNPCDetail") == c2sData.cmd then --NPC详情 skynet.server.map:MapShowNPCDetail( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_AnnouncementHistory") == c2sData.cmd then --公告历史 skynet.server.announcement:History( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_QuestionnaireShow") == c2sData.cmd then --问卷调查显示 skynet.server.questionnaire:Show( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_QuestionnaireSubmit") == c2sData.cmd then --问卷调查提交 skynet.server.questionnaire:Submit( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_PassCheckRewardShow") == c2sData.cmd and player:IsUnlockSystem( dataType.UnlockSystem_PassCheck ) then --通行证奖励显示 skynet.server.passCheck:RewardShow( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_PassCheckRewardGet") == c2sData.cmd and player:IsUnlockSystem( dataType.UnlockSystem_PassCheck ) then --通行证奖励获取 skynet.server.passCheck:RewardGet( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_PassCheckRewardAllGet") == c2sData.cmd and player:IsUnlockSystem( dataType.UnlockSystem_PassCheck ) then --通行证奖励一键获取 skynet.server.passCheck:RewardAllGet( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_PassCheckTaskShow") == c2sData.cmd and player:IsUnlockSystem( dataType.UnlockSystem_PassCheck ) then --通行证任务显示 skynet.server.passCheck:TaskShow( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_PassCheckTaskGet") == c2sData.cmd and player:IsUnlockSystem( dataType.UnlockSystem_PassCheck ) then --通行证奖励获取 skynet.server.passCheck:TaskGet( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_FurDyeShow") == c2sData.cmd then --染色工坊显示 skynet.server.dyeworkshop:Show( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_FurDyeAttempt") == c2sData.cmd then --染色工坊染色 skynet.server.dyeworkshop:Attempt( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_FurDyeSlotPrize") == c2sData.cmd then --染色工坊领取 skynet.server.dyeworkshop:Prize( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_FurDyeSlotSpeedUp") == c2sData.cmd then --染色工坊加速 skynet.server.dyeworkshop:SpeedUp( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_FurDyeSlotUnlock") == c2sData.cmd then --染色空间解锁 skynet.server.dyeworkshop:Unlock( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_DesignShow") == c2sData.cmd and player:IsUnlockSystem( dataType.UnlockSystem_DesignHouse ) then --设计抽奖展示 skynet.server.design:Show( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_DesignLottery") == c2sData.cmd and player:IsUnlockSystem( dataType.UnlockSystem_DesignHouse ) then --设计抽奖 skynet.server.design:Lottery( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_StoreShow") == c2sData.cmd then --商城展示 skynet.server.store:Show( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_StoreBuy") == c2sData.cmd then --商城购买 skynet.server.store:Buy( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_SignInShow") == c2sData.cmd then --常规签到显示 skynet.server.signIn:Show( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_SignInGet") == c2sData.cmd then --常规签到获取 skynet.server.signIn:Get( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_SignInSumGet") == c2sData.cmd then --常规签到累签获取 skynet.server.signIn:SumGet( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_PlayerLandCheck") == c2sData.cmd then --新人签到检查 skynet.server.playerLand:Check( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_PlayerLandShow") == c2sData.cmd then --新人签到显示 skynet.server.playerLand:Show( player , c2sData , s2cData ) elseif pb.enum("MsgType","CMD_C2S_PlayerLandGet") == c2sData.cmd then --新人签到获取 skynet.server.playerLand:Get( player , c2sData , s2cData ) else --正在游戏中不接收其它消息 s2cData.code = errorInfo.ErrorCode.ErrRequestParam return end --存档版本,刷新TIPS skynet.server.msgTips:Refresh( player ) if self.curServerConfig.IsDetailLog then log.info(string.format("玩家 %d cmd %d 返回code %d 运行时间 %d", c2sData.userId , s2cData.cmd or 0 , s2cData.code , skynet.GetTime() - t1)) else log.info(string.format("玩家 %d cmd %d 返回code %d 运行时间 %d", c2sData.userId , s2cData.cmd or 0, s2cData.code , skynet.GetTime() - t1)) end end end local isDo,callData = pcall( Do ) local sendMsg,sendLen = 0,0 if not isDo then log.info("GameServer 内部错误",callData ) s2cData.code = errorInfo.ErrorCode.InnerError self:SendErrorInfoToCenter( s2cData.code , "内部错误") end end --接收用户登陆TOKEN function GameServer:RecvUserLoginToken( c2sData ) log.info(string.format("游戏服接收路由服Token信息 平台 %s 帐号 %s Token %s", c2sData.platform , c2sData.loginAccount , c2sData.loginToken)) local platform = c2sData.platform local loginAccount = c2sData.loginAccount local loginToken = c2sData.loginToken if not self.preLoginUser[ loginAccount ] then self.preLoginUser[ loginAccount ] = {} end self.preLoginUser[ loginAccount ].platform = platform self.preLoginUser[ loginAccount ].loginAccount = loginAccount self.preLoginUser[ loginAccount ].loginToken = loginToken self.preLoginUser[ loginAccount ].lastUpdateTime = skynet.GetTime() --上一次更新时间 end --接收用户登陆TOKEN function GameServer:AddPayInfo( c2sData , s2cData) local account = c2sData.account local storeId = c2sData.storeId local count = math.abs(c2sData.count) if not skynet.server.playerCenter:IsExistPlayerForAccount( account ) then s2cData.code = errorInfo.ErrorCode.NoExistUser else local player = skynet.server.playerCenter:GetPlayerForAccount( account ) if not player then s2cData.code = errorInfo.ErrorCode.NoExistUser else if 7 == storeId then --通行证开启VIP礼包 skynet.server.passCheck:Pay( player , storeId ) log.info(string.format("玩家 %s 开始发放充值礼包1 %d", player.userId , storeId)) else local isGive = true --if 8 == storeId then --skynet.server.design:Pay( player , storeId ) --isGive = false ---log.info(string.format("玩家 %s 开始发放充值礼包2 %d", player.userId , storeId)) --else skynet.server.design:Pay( player , storeId ) skynet.server.store:Pay( player , storeId ) isGive = false log.info(string.format("玩家 %s 开始发放充值礼包3 %d", player.userId , storeId)) --end if isGive then --直接发货 local cfgStorePack = skynet.server.gameConfig:GetCurCfg( "StorePack" , storeId ) if not cfgStorePack then s2cData.code = errorInfo.ErrorCode.ErrRequestParam else for i = 1, count , 1 do player:GiveReward( cfgStorePack.rewardId ) end end end end --通知客户端 local data = {} data.storeId = storeId data.count = count self:SendMsgToUser( player.userId , "CMD_S2C_PayInfo" , data ) log.info(string.format("玩家 %s 成功发放充值礼包 %d", player.userId , storeId)) end end end --Web消息 function GameServer:WebMsg( c2sData ) log.info("后台发来的消息 ",skynet.server.common:TableToString(c2sData)) --if "GMCmd" == c2sData.gameMessage or "GMAddGoods" == c2sData.gameMessage then skynet.server.gm:WebMsg( c2sData ) --end end --查询用户登陆状态 function GameServer:RecvQueryUserOnline( c2sData , s2cData ) s2cData.isExistPlayer = playerCenter:IsExistPlayer( c2sData.platform , c2sData.loginAccount ) end --用户登陆游戏 function GameServer:UserLogin( c2sData , s2cData ) local t1 = skynet.GetTime() local socketId = c2sData.socketId c2sData.data = assert(pb.decode("C2SUserLogin", c2sData.data )) --对必要的参数检查 if not c2sData.data.platform or not c2sData.data.loginAccount or not c2sData.data.loginToken then s2cData.code = errorInfo.ErrorCode.ErrRequestParam return s2cData end local loginAccount = c2sData.data.loginAccount log.info(string.format("玩家 %s 平台 %s 登陆请求 Token %s 硬件码 %s",c2sData.data.loginAccount , c2sData.data.platform , c2sData.data.loginToken , c2sData.data.hardwareCode )) --检查预登陆信息,不存在就不能登陆 if not self.preLoginUser[ loginAccount ] then s2cData.code = errorInfo.ErrorCode.NoExistPreLogin log.info(string.format("玩家 %s 不存在预登陆信息", loginAccount)) return s2cData end --检查预登陆玩家是否有效 local isExist = false for k, v in pairs(self.preLoginUser) do if c2sData.data.platform == v.platform and c2sData.data.loginAccount == v.loginAccount and c2sData.data.loginToken == v.loginToken then isExist = true break end end if not isExist then s2cData.code = errorInfo.ErrorCode.VerifyTokenFailed log.info(string.format("玩家 %s 预登陆不匹配", loginAccount)) return s2cData end if not string.find(loginAccount,"womei") then self.preLoginUser[ loginAccount ] = nil end --从帐号模块获取数据 accountServer:UserLoginGame(c2sData , s2cData) local userData = {} if errorInfo.Suc == s2cData.code then local playerData = json:decode(s2cData.data.playerData) playerCenter:UserEnter( c2sData , playerData ) userData = playerCenter:GetLoginInfo( playerData ) if not userData then s2cData.code = errorInfo.ErrorCode.NoExistUser userData ={} end log.info(string.format("玩家 %s 登陆游戏成功", loginAccount)) else log.info(string.format("玩家 %s 登陆游戏失败", loginAccount)) end self.serverInfo.loginCount = self.serverInfo.loginCount + 1 s2cData.code = s2cData.code s2cData.cmd = pb.enum("MsgType","CMD_S2C_UserLogin") s2cData.data = assert(pb.encode("S2CUserLogin", userData)) end --PING消息 function GameServer:Ping( player , c2sData , s2cData ) playerCenter:Ping( c2sData.userId ) local data = {} s2cData.cmd = pb.enum("MsgType","CMD_S2C_Ping") s2cData.data = assert(pb.encode("S2CPing", data)) end --存档 function GameServer:Archive( player , c2sData , s2cData ) local socketId = c2sData.socketId local userId = c2sData.userId c2sData.data = assert(pb.decode("C2SArchive", c2sData.data )) --对必要的参数检查 if nil == c2sData.data.opType then s2cData.code = errorInfo.ErrorCode.ErrRequestParam return s2cData end log.info("玩家存档操作",skynet.server.common:TableToString(c2sData.data)) local userCurLevel = tonumber(player.gameData.archiveLevel) --获取当前等级 local isCoverArchive = false --是否覆盖存档 log.info("读取档接收玩家等级 " , c2sData.data.level , userCurLevel) if 1 == c2sData.data.opType and ( 0 == c2sData.data.level or c2sData.data.level >= userCurLevel ) then isCoverArchive = true player.gameData.archiveLevel = c2sData.data.level log.info(string.format("玩家 %d 原等级 %s 新等级 %s", userId , userCurLevel , c2sData.data.level)) end local data = {} if 1 == c2sData.data.opType and c2sData.data.gameData and isCoverArchive then --保存 log.info(string.format("玩家 %d 覆盖存档", userId )) player.archiveData = c2sData.data.gameData playerCenter:UpdateIntervalSave( userId ) elseif 2 == c2sData.data.opType then --读取 log.info(string.format("玩家 %d 读取存档", userId )) data.gameData = player.archiveData elseif 3 == c2sData.data.opType then --清档 log.info(string.format("玩家 %d 存档置空", userId )) player.archiveData ="{}" player.gameData.level = 0 else s2cData.code = errorInfo.ErrorCode.ErrRequestParam return s2cData end s2cData.cmd = pb.enum("MsgType","CMD_S2C_Archive") s2cData.data = assert(pb.encode("S2CArchive", data)) end --服务器时间 function GameServer:ServerTime( player , c2sData , s2cData ) local data = {} data.serverTime = skynet.GetTime() s2cData.cmd = pb.enum("MsgType","CMD_S2C_ServerTime") s2cData.data = assert(pb.encode("S2CServerTime", data)) end --客户端连接断开 function GameServer:UserOffline( socketId ) local userId = playerCenter:GetUserIDForSocketId( socketId ) playerCenter:UserOffline( userId ) end --向用户发送消息 function GameServer:SendMsgToUser( userId , cmd , userData ) --命令进行裁剪组装一下 local cmdName = string.sub(cmd, 9) cmdName= "S2C"..cmdName local socketId = playerCenter:GetSocketIdForUserID( userId ) if -1 == socketId then return end local c2sData = {} c2sData.code = errorInfo.Suc c2sData.cmd = assert(pb.enum("MsgType",cmd)) c2sData.data = assert(pb.encode(cmdName, userData)) c2sData = assert(pb.encode("S2CMsgData", c2sData)) return skynet.call( "TcpSocket", "lua", cmd , socketId , c2sData ) end --是否停止服务器 function GameServer:StopServer() local playerList = skynet.server.playerCenter:GetPlayerList() local c2sData ={} local s2cData ={} for userId, value in pairs( playerList ) do log.info("玩家" ,userId, "服务器强制关闭,已被服务器下线") accountServer:SavePlayerToDB( value.player , false ) end end --统计数据 function GameServer:StatData() if skynet.GetTime() - self.last5MinTotalLoginCount >= self.per5MinTotalLoginCount then skynet.server.mail:RefreshMailList() skynet.server.announcement:RefreshAnnouncementList() self.serverInfo.pre5MinLoginCount = self.serverInfo.loginCount - self.lastLoginCount self.lastLoginCount = self.serverInfo.loginCount self.last5MinTotalLoginCount = skynet.GetTime() log.info(string.format("5分钟共有 %d 次登陆 , 当前总登陆次数 %d",self.serverInfo.pre5MinLoginCount, self.serverInfo.loginCount)) end self.serverInfo.playerCount = playerCenter:GetPlayerCount() end skynet.server.gameServer = GameServer return GameServer