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
@@ -156,7 +154,9 @@
import PlayerShentong
import PlayerCustomAward
import PlayerZhanling
import PlayerTree
import PlayerLianTi
#import PlayerTask
import PlayerYinji
import PlayerLove
import GameObj
@@ -172,11 +172,19 @@
import PlayerActFamilyGCZ
import PlayerActYunshi
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
#---------------------------------------------------------------------
#---------------------------------------------------------------------
@@ -201,10 +209,6 @@
    #初始化玩家的时钟个数
    if curPlayer.GetTickTypeCount() == 0:
        curPlayer.SetTickTypeCount(ChConfig.TYPE_Player_Tick_Count)
    #初始化玩家聊天频道
    if curPlayer.GetMaxChannelCount() == 0:
        curPlayer.SetMaxChannelCount(ChConfig.Def_PlayerTalkChannelMaxCount)
        
#===============================================================================
#    #初始化玩家鉴定管理器物品最大个数
@@ -481,51 +485,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  中的功能登录逻辑
'''
##玩家登陆游戏逻辑处理
@@ -542,10 +523,7 @@
    Sync_PyServerDataTimeToClient(curPlayer)
    Sync_OpenServerDay(curPlayer)
    #通知玩家基本信息
    curPlayer.Sync_ClientPlayerLogin()
    #同步GameServer自己的地图ID
    curPlayer.Sync_GameServer_MapID()
    curPlayer.Sync_ClientPlayerLogin()  #01 02 玩家初始化#tagCDBPlayer
    
    # 屏蔽跨服下关闭和子服重复的数据的发送 pushsend接口, notifyall正常发送
    # !!!必要发送的数据要注意位置
@@ -561,7 +539,7 @@
        PlayerControl.SetCrossMapID(curPlayer, curPlayer.GetMapID()) # 因为主服上传数据之前该值为0,所以登录跨服后在跨服服务器要设置为对应地图
        
    #通知运行成功
    curPlayer.BalanceServer_PlayerLoginInitOK()
    curPlayer.BalanceServer_PlayerLoginInitOK() #向route设置玩家在map中的索引
    return
def __DoPlayerLoginServer(curPlayer, tick):
@@ -585,8 +563,6 @@
        EventReport.WriteEvent_login(curPlayer)
        #---玩家上线, 宠物逻辑处理---
        PetControl.DoLogic_PetInfo_OnLogin(curPlayer, tick)
        PlayerFamily.FamilyPlayerOnLoginCross(curPlayer)
        
        PlayerTeam.OnPlayerLoginCrossServer(curPlayer)
        return
@@ -664,9 +640,6 @@
    #大师
    PlayerGreatMaster.MasterOnLogin(curPlayer)
    
    # 推送提醒
    PlayerGeTui.LoginNotifySetting(curPlayer)
    #֪ͨVIP
    PlayerVip.DoOnLogin(curPlayer, tick)
    
@@ -726,8 +699,6 @@
    #充值活动玩家登入处理
    #PlayerGoldAction.DoLogic_PlayerOnLogin(curPlayer)
    
    # 通知玩家是否可以参加家族活动
    #PlayerFamily.SendClientForbidFamilyAction(curPlayer)
    # 提示贵宾俱乐部信息
    #PlayerVip.NoteVIPClubInfo(curPlayer)
    
@@ -785,7 +756,7 @@
    #同步自动战斗配置记录
#    Sync_AutoFightSetting(curPlayer)
    
    PlayerFamily.FamilyPlayerOnLogin(curPlayer, tick)
    PlayerFamily.OnPlayerLogin(curPlayer, tick)
    #改到 GameServerRefresh GameSever_PlayerInitOK后处理才能保证玩家已经在Gameserver注册
    #PlayerDienstgrad.RefreshBillBoardDienstgrad(curPlayer)
    # 称号
@@ -868,8 +839,6 @@
    PlayerEquipDecompose.PlayerLogin(curPlayer)
    #防沉迷
    PlayerGameWallow.DoLogic_CheckWallow(curPlayer, tick)
    # 通知脱机挂信息
    #PlayerTJG.NotifyTJGInfo(curPlayer)
    # 协助
    PlayerAssist.OnPlayerLogin(curPlayer)
    # 极品白拿
@@ -987,10 +956,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
@@ -1011,15 +977,19 @@
        pass
    
    else:
        PlayerMail.OnPlayerLogin(curPlayer)
        PlayerChatBox.OnPlayerLogin(curPlayer)
        PlayerFace.OnPlayerLogin(curPlayer)
        PlayerXiangong.OnPlayerLogin(curPlayer)
        PlayerGubao.OnPlayerLogin(curPlayer)
        PlayerShentong.OnPlayerLogin(curPlayer)
        PlayerZhanling.OnPlayerLogin(curPlayer)
        #PlayerTask.OnPlayerLogin(curPlayer)
        PlayerTree.OnPlayerLogin(curPlayer)
        PlayerMineArea.OnPlayerLogin(curPlayer)
        PlayerGuaji.OnPlayerLogin(curPlayer)
        PlayerActFamilyGCZ.OnPlayerLogin(curPlayer)
        PlayerTalk.OnPlayerLogin(curPlayer)
        
        # 上线查询一次充值订单
        curPlayer.SendDBQueryRecharge()
@@ -1299,7 +1269,6 @@
    #---等级限制---
    if GameWorld.IsCrossServer():
        return
    #PlayerTJG.TJGDeadOffline(curPlayer)
    
#===============================================================================
#    #---等级限制---
@@ -1346,7 +1315,7 @@
#@remarks 玩家在地图服务器中登录ok,初始化自己
def DoPlayerLoginInMap(curPlayer, tick):
    #通知GameServer切换地图开始
    curPlayer.GameServer_SetLoadMapState(0)
    #curPlayer.GameServer_SetLoadMapState(0)
    #在玩家切换场景的时候, 不会调用到这里
    curPlayer.SetCanMove(False)
    curPlayer.SetInitOK(False)
@@ -1472,13 +1441,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
    
    
@@ -1541,9 +1515,6 @@
        #更改镖车记录的部分主人信息
        PlayerTruck.ChangeTruckNoteInfo(curPlayer)
        
        #更新镖车进排行榜
        PlayerBillboard.UpdateBillboardPlayerTruck(curPlayer.GetPlayerID(), curPlayer.GetName(), curPlayer.GetOperateInfo(),
                                                   curPlayer.GetLV(), truckLv, curPlayer.GetMapID())
    #---初始化自己的召唤兽---
    #===========================================================================
@@ -1564,7 +1535,7 @@
    PetControl.Sync_PetInfo_ChangeMap(curPlayer, tick)
    #通知GameServer自己现在的地图
    curPlayer.Sync_GameServer_MapID()
    #curPlayer.Sync_GameServer_MapID()
    
    #如果本地图是副本的话, 则通知GameServer玩家进入副本
    if GameWorld.GetMap().GetMapFBType() == IPY_GameWorld.fbtTeam:
@@ -1679,7 +1650,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
#---------------------------------------------------------------------
@@ -1723,7 +1696,7 @@
    GameWorld.Log("地图读取成功" , curPlayer.GetPlayerID())
    
    #通知GameServer切换地图停止
    curPlayer.GameServer_SetLoadMapState(1)
    #curPlayer.GameServer_SetLoadMapState(1)
    curPlayer.SetMapLoadOK(True)
    
    #将玩家放置在这个地图上
@@ -3115,10 +3088,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 时间戳
@@ -3172,8 +3154,6 @@
    
    #下线召回宠物
    PetControl.ReCallFightPet(curPlayer)
    #PlayerTJG.CalcPlayerTJG(curPlayer, tick)
    
    #离线session
    EventReport.WriteEvent_session(curPlayer)
@@ -5598,9 +5578,6 @@
    # 每日免费直购礼包
    elif rewardType == ChConfig.Def_RewardType_DayFreeGoldGift:
        PlayerDailyGiftbag.OnGetDailyFreeGiftbag(curPlayer)
    # 仙盟活跃度奖励
    elif rewardType == ChConfig.Def_RewardType_FamilyActivity:
        PlayerFamily.GetFamilyActivityAward(curPlayer, dataEx)
    # 仙盟联赛冠军仙盟每日俸禄奖励
    elif rewardType == ChConfig.Def_RewardType_ChampionFamilyDailyReward:
        GameLogic_FamilyWar.GetChampionFamilyDailyReward(curPlayer)
@@ -6081,6 +6058,23 @@
    serverTime = GameWorld.GetCurrentTime()
    if not serverTime:
        return
    clientPack = ChPyNetSendPack.tagMCOpenServerDay()
    clientPack.Day = DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_ServerDay)
    clientPack.IsMixServer = DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_IsMixServer)
    clientPack.MixDay = DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_MixServerDay)
    clientPack.OpenWeekday = DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_OpenServerWeekday)
    clientPack.NowYear = serverTime.year
    clientPack.NowMonth = serverTime.month
    clientPack.NowDay = serverTime.day
    clientPack.NowHour = serverTime.hour
    clientPack.NowMinute = serverTime.minute
    clientPack.NowSecond = serverTime.second
    clientPack.NowMicSecond = serverTime.microsecond
    clientPack.WeekOfYear = GameWorld.GetWeekOfYear()
    NetPackCommon.SendFakePack(curPlayer, clientPack)
    #旧包先保留,之后删除
    gw = GameWorld.GetGameWorld()
    packData = ChPyNetSendPack.tagOpenServerDay()
    packData.Clear()