778 lines
48 KiB
Lua
778 lines
48 KiB
Lua
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 |