From de17a057f7a93fe8c9ccb04dd44023b4c8ed1161 Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期一, 26 五月 2025 18:35:49 +0800 Subject: [PATCH] 16 卡牌服务端(仙盟珍宝阁支持;仙盟行为数据查询通知;去除特殊时间5点过天、过周、过月逻辑,统一保留0点触发;) --- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py | 127 +++++++++++++++++------------------------- 1 files changed, 52 insertions(+), 75 deletions(-) diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py index abc747b..706101a 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py @@ -100,7 +100,6 @@ import PassiveBuffEffMng import PlayerDiceEx import QuestCommon -import PlayerTJG import GameLogic_XMZZ import PlayerFlashSale import PlayerFlashGiftbag @@ -145,7 +144,6 @@ import PlayerArena import PyGameData import PlayerCoin -import PlayerGeTui import PlayerCharm import PlayerDogz import PlayerCoat @@ -174,11 +172,17 @@ import PlayerActTask import PlayerMail import DBDataMgr +import GameServerRefresh +import IPY_ServerDefine +import CommFunc +from PyMongoDB import RecvPackToMapDB +import PlayerTalk import datetime import time import math import re +import base64 #--------------------------------------------------------------------- #--------------------------------------------------------------------- @@ -203,10 +207,6 @@ #初始化玩家的时钟个数 if curPlayer.GetTickTypeCount() == 0: curPlayer.SetTickTypeCount(ChConfig.TYPE_Player_Tick_Count) - - #初始化玩家聊天频道 - if curPlayer.GetMaxChannelCount() == 0: - curPlayer.SetMaxChannelCount(ChConfig.Def_PlayerTalkChannelMaxCount) #=============================================================================== # #初始化玩家鉴定管理器物品最大个数 @@ -483,51 +483,28 @@ #--------------------------------------------------------------------- ''' 登录流程 +UserCrtlDB + onAuthentication 玩家登录 :验证账号-若没有角色则创角-返回角色信息-通知Map C++ + Map C++调用 PlayerLogin MapServer ChPlayer:def PlayerLogin(index, tick) - DoPlayerLogin - curPlayer.Sync_ClientPlayerLogin() - curPlayer.Sync_GameServer_MapID() #同步GameServer自己的地图ID - curPlayer.BalanceServer_PlayerLoginInitOK() - -GameServer - ChPlayer:def PlayerLoadMapState(index, tick) pack.GetLoadState()=0 此时的 LoadState 为0 - curPlayer.SetIsLoadMap(True) 设置在加载地图 - - ChPlayer:def PlayerLogin(index, tick) - curPlayer.MapServer_InitOK() 通知地图自己OK了 - -MapServer - PlayerEventCounter:def GameServer_InitOK(index, tick) - curPlayer.SendToBServerServerInitOK() #通知BServer自己OK了 - ChPlayer:def OnAllServerInitOK(curPlayer, tick) + DoPlayerLogin + curPlayer.Sync_ClientPlayerLogin() #01 02 玩家初始化#tagCDBPlayer + curPlayer.BalanceServer_PlayerLoginInitOK() #向route设置玩家在map中的索引 + + curPlayer.SendToBServerServerInitOK() #通知route登录成功 ,route向客户端发送//01 09 服务器准备就绪#tagServerPrepareOK + ChPlayer:def OnAllServerInitOK(curPlayer, tick) - ChPlayer:def LoadMapOK(curPlayer, tick) - curPlayer.GameServer_SetLoadMapState(1) #通知GameServer切换地图停止 - curPlayer.SetMapLoadOK(True) - curPlayer.SetInitOK(True) - curPlayer.EndLoadMap() - -GameServer - ChPlayer:def PlayerLoadMapState(index, tick) pack.GetLoadState()=1 此时的 LoadState 为1 - PlayerLoginLoadMapOK + ChPlayer:def __Func_LoadMapOK(curPlayer, tick) #!!!直接调用不等待客户端封包 //01 07 地图读取OK#tagCInitMapOK + curPlayer.SetMapLoadOK(True) curPlayer.SetInitOK(True) - curPlayer.MapServer_GameServerRefreshOK() #通知地图服务器玩家初始化成功 - curPlayer.SetIsLoadMap(False) - -MapServer - GameServerRefresh:GameSever_PlayerInitOK curPlayer.GetGameServerInitOK()=0 - curPlayer.SetGameServerInitOK(True) - -后续补充流程 -MapServer - ChPlayer:def DoPlayerRealLoginOK(curPlayer, tick) - 玩家真正登录成功处理,用于替换 __DoPlayerLoginServer 中的功能登录逻辑 - 通知GameServer地图最终登录成功了 - -GameServer - ChPlayer:def DoPlayerRealLoginOK(curPlayer, tick) - 玩家真正登录成功处理,用于替换 __DoPlayerLoginServer 中的功能登录逻辑 + curPlayer.EndLoadMap() #通知客户端 04 03 玩家登录数据发送完毕OK#tagPlayerLoginLoadOK + + GameServerRefresh:GameSever_PlayerInitOK + curPlayer.SetGameServerInitOK(True) + + ChPlayer:def DoPlayerRealLoginOK(curPlayer, tick) 玩家真正登录成功处理,用于替换 __DoPlayerLoginServer 中的功能登录逻辑 + ''' ##玩家登陆游戏逻辑处理 @@ -544,10 +521,7 @@ Sync_PyServerDataTimeToClient(curPlayer) Sync_OpenServerDay(curPlayer) #通知玩家基本信息 - curPlayer.Sync_ClientPlayerLogin() - - #同步GameServer自己的地图ID - curPlayer.Sync_GameServer_MapID() + curPlayer.Sync_ClientPlayerLogin() #01 02 玩家初始化#tagCDBPlayer # 屏蔽跨服下关闭和子服重复的数据的发送 pushsend接口, notifyall正常发送 # !!!必要发送的数据要注意位置 @@ -563,7 +537,7 @@ PlayerControl.SetCrossMapID(curPlayer, curPlayer.GetMapID()) # 因为主服上传数据之前该值为0,所以登录跨服后在跨服服务器要设置为对应地图 #通知运行成功 - curPlayer.BalanceServer_PlayerLoginInitOK() + curPlayer.BalanceServer_PlayerLoginInitOK() #向route设置玩家在map中的索引 return def __DoPlayerLoginServer(curPlayer, tick): @@ -663,9 +637,6 @@ #大师 PlayerGreatMaster.MasterOnLogin(curPlayer) - - # 推送提醒 - PlayerGeTui.LoginNotifySetting(curPlayer) #通知VIP PlayerVip.DoOnLogin(curPlayer, tick) @@ -866,8 +837,6 @@ PlayerEquipDecompose.PlayerLogin(curPlayer) #防沉迷 PlayerGameWallow.DoLogic_CheckWallow(curPlayer, tick) - # 通知脱机挂信息 - #PlayerTJG.NotifyTJGInfo(curPlayer) # 协助 PlayerAssist.OnPlayerLogin(curPlayer) # 极品白拿 @@ -985,10 +954,7 @@ curPlayer.SetState(0) # 脱机挂恢复为正常上线 curPlayer.SetCountryLastWeekHornor(0) # 通知数据库是否保存还是下线,做一次恢复,1为保存 0为正常下线 - #tjgTime = PlayerTJG.GetTJGTime(curPlayer) - #if tjgTime: - # PlayerControl.SendGameServerRefreshState(curPlayer, IPY_GameWorld.CDBPlayerRefresh_HappyPoint, tjgTime) - + PlayerControl.DoGMForbidenTalkOnLogin(curPlayer) DataRecordPack.DR_PlayerLogin(curPlayer) # 放最后,记录等级、经验等信息 return @@ -1019,6 +985,7 @@ PlayerMineArea.OnPlayerLogin(curPlayer) PlayerGuaji.OnPlayerLogin(curPlayer) PlayerActFamilyGCZ.OnPlayerLogin(curPlayer) + PlayerTalk.OnPlayerLogin(curPlayer) # 上线查询一次充值订单 curPlayer.SendDBQueryRecharge() @@ -1298,7 +1265,6 @@ #---等级限制--- if GameWorld.IsCrossServer(): return - #PlayerTJG.TJGDeadOffline(curPlayer) #=============================================================================== # #---等级限制--- @@ -1345,7 +1311,7 @@ #@remarks 玩家在地图服务器中登录ok,初始化自己 def DoPlayerLoginInMap(curPlayer, tick): #通知GameServer切换地图开始 - curPlayer.GameServer_SetLoadMapState(0) + #curPlayer.GameServer_SetLoadMapState(0) #在玩家切换场景的时候, 不会调用到这里 curPlayer.SetCanMove(False) curPlayer.SetInitOK(False) @@ -1471,13 +1437,18 @@ #锁住玩家, 等到读取地图成功, 再解锁 curPlayer.SetCanMove(False) - - #登陆发图形验证码 - PlayerAutoCheckOnline.PlayerLoginCaptcha(curPlayer, tick) + + curPlayer.SendToBServerServerInitOK() #通知route登录成功 ,route向客户端发送0109包 + OnAllServerInitOK(curPlayer, tick) + #到此处已经可以保存数据,即使客户端不回包断线 + #原 //01 07 地图读取OK#tagCInitMapOK 逻辑 直接调用 + __Func_LoadMapOK(index, tick) + GameServerRefresh.GameSever_PlayerInitOK(index, tick) except: curPlayer.Kick(IPY_GameWorld.disWaitForPlayerLoinError) import traceback GameWorld.RaiseException("玩家上线逻辑错误\r\n%s" % traceback.format_exc()) + return @@ -1540,9 +1511,6 @@ #更改镖车记录的部分主人信息 PlayerTruck.ChangeTruckNoteInfo(curPlayer) - #更新镖车进排行榜 - PlayerBillboard.UpdateBillboardPlayerTruck(curPlayer.GetPlayerID(), curPlayer.GetName(), curPlayer.GetOperateInfo(), - curPlayer.GetLV(), truckLv, curPlayer.GetMapID()) #---初始化自己的召唤兽--- #=========================================================================== @@ -1563,7 +1531,7 @@ PetControl.Sync_PetInfo_ChangeMap(curPlayer, tick) #通知GameServer自己现在的地图 - curPlayer.Sync_GameServer_MapID() + #curPlayer.Sync_GameServer_MapID() #如果本地图是副本的话, 则通知GameServer玩家进入副本 if GameWorld.GetMap().GetMapFBType() == IPY_GameWorld.fbtTeam: @@ -1678,7 +1646,9 @@ #@return 返回值无意义 #@remarks C++封包触发, 切换地图成功( 目标地图 ) def LoadMapOK(index, tick): - GameWorld.GetPsycoFunc(__Func_LoadMapOK)(index, tick) + #不需要等待客户端,以前有视野客户端未加载成功会被偷袭的问题,可以通过加x秒无敌BUFF解决,不应该增加流程 + # GameWorld.GetPsycoFunc(__Func_LoadMapOK)(index, tick) + # GameServerRefresh.GameSever_PlayerInitOK(index, tick) return #--------------------------------------------------------------------- @@ -1722,7 +1692,7 @@ GameWorld.Log("地图读取成功" , curPlayer.GetPlayerID()) #通知GameServer切换地图停止 - curPlayer.GameServer_SetLoadMapState(1) + #curPlayer.GameServer_SetLoadMapState(1) curPlayer.SetMapLoadOK(True) #将玩家放置在这个地图上 @@ -3114,10 +3084,19 @@ except: import traceback GameWorld.RaiseException("玩家下线逻辑错误\r\n%s" % traceback.format_exc()) - + RecvPackToMapDB.MapCallDB(GetPackSaveData(curPlayer)) #调用底层使玩家下线 curPlayer.DoDisconnect(tick) +# 简化c++的保存数据封包 +def GetPackSaveData(curPlayer): + roleSaveData = base64.b64decode(curPlayer.GetPackData()) # base64加密了 + allData = "" + allData = CommFunc.WriteBYTE(allData, IPY_ServerDefine.gstUpdate) + allData = CommFunc.WriteString(allData, len(roleSaveData), roleSaveData) + return allData + + ##玩家正常下线 #@param curPlayer 玩家索引 #@param tick 时间戳 @@ -3171,8 +3150,6 @@ #下线召回宠物 PetControl.ReCallFightPet(curPlayer) - - #PlayerTJG.CalcPlayerTJG(curPlayer, tick) #离线session EventReport.WriteEvent_session(curPlayer) -- Gitblit v1.8.0