From f4ba71b4f1f541fbf705ec7ccee1e49d097cb57f Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期二, 08 一月 2019 15:10:26 +0800
Subject: [PATCH] 5722 【后端】【1.5】跨服BOSS开发(登录、退出跨服流程优化)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py |  190 ++++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 168 insertions(+), 22 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 6cba5b1..00674aa 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
@@ -179,7 +179,8 @@
     #先发送所有任务, 再刷新日期, 否则会有2个相同的任务在玩家身上
     #把玩家当前的所有任务发送给客户端
     #GameWorld.Log('EventShell.NotifyAllQuestDetail')
-    EventShell.NotifyAllQuestDetail(curPlayer, True)
+    if not GameWorld.IsCrossServer():
+        EventShell.NotifyAllQuestDetail(curPlayer, True)
     
     #刷新人物日期状态
     #GameWorld.Log('PlayerEventCounter.UpdatePlayerLoginTime')
@@ -222,6 +223,128 @@
     
     return
 
+#// A1 08 刷新主服角色信息 #tagCMRefreshMainServerRole
+#
+#struct tagCMRefreshMainServerRole
+#{
+#    tagHead        Head;
+#};
+def OnRefreshMainServerRole(index, clientData, tick):
+    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
+    
+    Sync_DBPlayer(curPlayer)
+    
+    # 强刷一次属性,刷之前重置还没同步过所有属性
+    curPlayer.SetDict(ChConfig.Def_PlayerKey_NotifyAllAttrState, 0)
+    playerControl = PlayerControl.PlayerControl(curPlayer)
+    playerControl.ReCalcAllState()
+    
+    if PlayerControl.GetCrossRealmState(curPlayer):
+        CrossRealmPlayer.DoExitCrossRealm(curPlayer)
+        
+    return
+
+def Sync_DBPlayer(curPlayer):
+    ## 同步DBPlayer信息,同0102封包
+    dbPlayer = ChPyNetSendPack.tagMCDBPlayer()
+    dbPlayer.AccID = curPlayer.GetAccID()
+    dbPlayer.PlayerID = curPlayer.GetPlayerID()
+    dbPlayer.PlayerName = curPlayer.GetPlayerName()
+    dbPlayer.AccState = curPlayer.GetAccState()
+    dbPlayer.GMLevel = curPlayer.GetGMLevel()
+    dbPlayer.Sex = curPlayer.GetSex()
+    dbPlayer.Job = curPlayer.GetJob()
+    dbPlayer.ReincarnationLv = curPlayer.GetReincarnationLv()
+    dbPlayer.LV = curPlayer.GetLV()
+    dbPlayer.LVEx = curPlayer.GetLVEx()
+    dbPlayer.LV2 = curPlayer.GetLV2()
+    dbPlayer.ExpPoint = curPlayer.GetExpPoint()
+    dbPlayer.TotalExp = curPlayer.GetTotalExp()
+    dbPlayer.Family = curPlayer.GetFamilyID()
+    dbPlayer.FamilyName = curPlayer.GetFamilyName()
+    dbPlayer.TeamHornor = curPlayer.GetTeamHornor()
+    dbPlayer.FamilyHornor = curPlayer.GetFamilyHornor()
+    dbPlayer.FamilyActiveValue = curPlayer.GetFamilyActiveValue()
+    dbPlayer.LastWeekFamilyActiveValue = curPlayer.GetLastWeekFamilyActiveValue()
+    dbPlayer.CountryHornor = curPlayer.GetCountryHornor()
+    dbPlayer.CountryLastWeekHornor = curPlayer.GetCountryLastWeekHornor()
+    dbPlayer.Mate = curPlayer.GetMate()
+    dbPlayer.Gold = curPlayer.GetGold()
+    dbPlayer.GoldPaper = curPlayer.GetGoldPaper()
+    dbPlayer.Silver = curPlayer.GetSilver()
+    dbPlayer.SilverPaper = curPlayer.GetSilverPaper()
+    dbPlayer.FightPoint = curPlayer.GetFightPoint()
+    dbPlayer.HappyPoint = curPlayer.GetHappyPoint()
+    dbPlayer.LineID = curPlayer.GetLineID()
+    dbPlayer.MapID = curPlayer.GetMapID() # 玩家身上的 GetMapID 返回的就是 GetDataMapID
+    dbPlayer.PosX = curPlayer.GetPosX()
+    dbPlayer.PosY = curPlayer.GetPosY()
+    dbPlayer.RebornMapID = curPlayer.GetRebornMapID()
+    dbPlayer.RebornPosX = curPlayer.GetRebornPosX()
+    dbPlayer.RebornPosY = curPlayer.GetRebornPosY()
+    dbPlayer.State = curPlayer.GetState()
+    dbPlayer.HP = curPlayer.GetHP()
+    dbPlayer.XP = curPlayer.GetXP()
+    dbPlayer.HPRestoreSetting = curPlayer.GetHPRestoreSetting()
+    dbPlayer.MPRestoreSetting = curPlayer.GetMPRestoreSetting()
+    dbPlayer.FreePoint = curPlayer.GetFreePoint()
+    dbPlayer.FreeSkillPoint = curPlayer.GetFreeSkillPoint()
+    dbPlayer.BaseSTR = curPlayer.GetBaseSTR()
+    dbPlayer.BasePNE = curPlayer.GetBasePNE()
+    dbPlayer.BasePHY = curPlayer.GetBasePHY()
+    dbPlayer.BaseCON = curPlayer.GetBaseCON()
+    dbPlayer.STR = curPlayer.GetSTR()
+    dbPlayer.PNE = curPlayer.GetPNE()
+    dbPlayer.PHY = curPlayer.GetPHY()
+    dbPlayer.CON = curPlayer.GetCON()
+    #dbPlayer.Setting = curPlayer.GetSetting() # 没有
+    dbPlayer.PKValue = curPlayer.GetPKValue()
+    #dbPlayer.ActiveValue = curPlayer.GetActiveValue() # 没有
+    dbPlayer.BackpackLV = curPlayer.GetBackpackLV()
+    dbPlayer.WarehouseLV = curPlayer.GetWarehouseLV()
+    dbPlayer.TeamID = curPlayer.GetTeamID()
+    dbPlayer.UseGoldType = curPlayer.GetUseGoldType()
+    dbPlayer.UseSilverType = curPlayer.GetUseSilverType()
+    dbPlayer.AttackMode = curPlayer.GetAttackMode()
+    dbPlayer.LastWeekOnlineTime = curPlayer.GetLastWeekOnlineTime()
+    dbPlayer.FBID = curPlayer.GetClientLineID()
+    dbPlayer.FamilyLV = curPlayer.GetFamilyLV()
+    dbPlayer.FriendFavor = curPlayer.GetFriendFavor()
+    dbPlayer.Energy = curPlayer.GetEnergy()
+    dbPlayer.EquipShowSwitch = curPlayer.GetEquipShowSwitch()
+    dbPlayer.LuckValue = curPlayer.GetLuckValue()
+    dbPlayer.ExAttr1 = curPlayer.GetExAttr1()
+    dbPlayer.ExAttr2 = curPlayer.GetExAttr2()
+    dbPlayer.ExAttr3 = curPlayer.GetExAttr3()
+    dbPlayer.ExAttr4 = curPlayer.GetExAttr4()
+    dbPlayer.ExAttr5 = curPlayer.GetExAttr5()
+    dbPlayer.Faction = curPlayer.GetFaction()
+    dbPlayer.InfamyValue = curPlayer.GetInfamyValue()
+    dbPlayer.OfficialRank = curPlayer.GetOfficialRank()
+    dbPlayer.ChangeCoinPointTotal = curPlayer.GetChangeCoinPointTotal()
+    dbPlayer.VIPLv = curPlayer.GetVIPLv()
+    dbPlayer.VIPLvForPhone = curPlayer.GetVIPLvForPhone()
+    dbPlayer.ExAttr6 = curPlayer.GetExAttr6()
+    dbPlayer.ExAttr7 = curPlayer.GetExAttr7()
+    dbPlayer.ExAttr8 = curPlayer.GetExAttr8()
+    dbPlayer.ExAttr9 = curPlayer.GetExAttr9()
+    dbPlayer.ExAttr10 = curPlayer.GetExAttr10()
+    dbPlayer.ModelMark = curPlayer.GetModelMark()
+    dbPlayer.ExAttr11 = curPlayer.GetExAttr11()
+    dbPlayer.ExAttr12 = curPlayer.GetExAttr12()
+    dbPlayer.ExAttr13 = curPlayer.GetExAttr13()
+    dbPlayer.ExAttr14 = curPlayer.GetExAttr14()
+    dbPlayer.OperateInfo = curPlayer.GetOperateInfo()
+    dbPlayer.Operate = curPlayer.GetOperate()
+    dbPlayer.ServerID = curPlayer.GetServerID()
+    dbPlayer.ExAttr15 = curPlayer.GetExAttr15()
+    dbPlayer.ExAttr16 = curPlayer.GetExAttr16()
+    dbPlayer.ExAttr17 = curPlayer.GetExAttr17()
+    dbPlayer.ExAttr18 = curPlayer.GetExAttr18()
+    dbPlayer.ExAttr19 = curPlayer.GetExAttr19()
+    dbPlayer.ExAttr20 = curPlayer.GetExAttr20()
+    NetPackCommon.SendFakePack(curPlayer, dbPlayer)
+    return
 
 #---------------------------------------------------------------------
 ##玩家登陆游戏逻辑处理
@@ -246,25 +369,54 @@
     if GameWorld.IsCrossServer():
         curPlayer.SetForbiddenSyncClientState(True)
     
-    SyncGuideState(curPlayer)
+    __DoPlayerLoginServer(curPlayer, tick)
     
+    # 屏蔽跨服下关闭和子服重复的数据的发送 pushsend接口, notifyall正常发送
+    # !!!必要发送的数据要注意位置
+    if GameWorld.IsCrossServer():
+        curPlayer.SetForbiddenSyncClientState(False)
+        PlayerControl.SetCrossRealmState(curPlayer, 1) # 因为主服上传数据之前该值为0,所以登录跨服后在跨服服务器要设置为1
+        
+    return
+
+def __DoPlayerLoginServer(curPlayer, tick):
+    ''' 玩家登录需要处理的内容,本服及跨服服务器分开
+    '''
+    
+    #设置上线时间
+    curPlayer.SetLoginTime(GameWorld.GetCurrentDataTimeStr())
     #初始化玩家背包
     InitPlayerPack(curPlayer)
+    #通知玩家物品信息
+    __Sync_PackDetel(curPlayer)
+    
+    if GameWorld.IsCrossServer():
+        SkillCommon.PlayerLoginMergeServerSkillLogic(curPlayer, tick)
+        # 重置所有技能CD
+        
+        DoPlayerLoginInMap(curPlayer, tick)
+        
+        DataRecordPack.DR_PlayerLogin(curPlayer)
+        EventReport.WriteEvent_login(curPlayer)
+        #---玩家上线, 宠物逻辑处理---
+        PetControl.DoLogic_PetInfo_OnLogin(curPlayer, tick)
+        
+        #通知运行成功
+        curPlayer.BalanceServer_PlayerLoginInitOK()
+        return
+    
+    SyncGuideState(curPlayer)
     
     #上线检查一次装备属性
     ItemControler.PlayerItemControler(curPlayer).CheckRolePackEquipAttr()
     #上线检查加点属性点
     PlayerControl.FixOldAddPoint(curPlayer)
-    #通知玩家物品信息
-    __Sync_PackDetel(curPlayer)
     
     #更新服务器组ID
     PlayerControl.UpdPlayerServerGroupID(curPlayer)
     
     #上线学习技能
     SkillCommon.PlayerLoginCheckLearnSkill(curPlayer)
-    
-    SkillCommon.PlayerLoginMergeServerSkillLogic(curPlayer, tick)
     
     #刷新技能CD
     SkillCommon.PlayerLoginUpdateSkillCD(curPlayer, tick)
@@ -285,12 +437,10 @@
     
     #初始化现实时间物品
     InitRealityTimeItem(curPlayer, tick)
-
+    
     #---刷新了玩家属性, 登陆只刷新一次,其他地方不用刷
     DoPlayerLoginInMap(curPlayer, tick)
     
-    #设置上线时间
-    curPlayer.SetLoginTime(GameWorld.GetCurrentDataTimeStr())
     #PlayerControl.SyncOnLineTimeTotal(curPlayer)
     #PlayerControl.SyncOnLineTimeLastOpenPack(curPlayer, IPY_GameWorld.rptItem)
     PlayerGodWeapon.OnLogin(curPlayer)
@@ -575,13 +725,6 @@
     # 如果被禁言的,上线同步前端
     if curPlayer.GetGMForbidenTalk():
         curPlayer.SendPropertyRefresh(ShareDefine.CDBPlayerRefresh_ForbidenTalk, curPlayer.GetGMForbidenTalk(), False)
-        
-    # 屏蔽跨服下关闭和子服重复的数据的发送 pushsend接口, notifyall正常发送
-    # !!!必要发送的数据要注意位置
-    if GameWorld.IsCrossServer():
-        curPlayer.SetForbiddenSyncClientState(False)
-        PlayerControl.SetCrossRealmState(curPlayer, 1) # 因为主服上传数据之前该值为1,所以登录跨服后在跨服服务器要设置为1
-        
     return
 
 
@@ -862,7 +1005,10 @@
     SkillCommon.AddBuffBySkillType_NoRefurbish(curPlayer, ChConfig.Def_SkillID_LimitSuperBuff, tick)
             
     #刷新玩家的视野
-    PlayerState.ChangePlayerSigh(curPlayer, tick)
+    if not GameWorld.IsCrossServer() and PlayerControl.GetCrossRealmState(curPlayer):
+        GameWorld.DebugLog("===登录本服地图时,处于跨服状态,不刷新视野!", curPlayer.GetPlayerID())
+    else:
+        PlayerState.ChangePlayerSigh(curPlayer, tick)
     
     if GameWorld.IsCrossServer():
         curPlayer.SetForbiddenSyncClientState(False)
@@ -1213,8 +1359,11 @@
     firstMission = QuestCommon.GetCommonMission(curPlayer)
     if not (firstMission and firstMission.GetProperty(QuestCommon.Def_NewGuyNoSight) == 1):
         #刷新自己的视野
-        curPlayer.RefreshView()
-        curPlayer.SetVisible(True)
+        if not GameWorld.IsCrossServer() and PlayerControl.GetCrossRealmState(curPlayer):
+            GameWorld.DebugLog("===本服LoadMapOK时玩家处于跨服状态,不设置可见!", curPlayer.GetPlayerID())
+        else:
+            curPlayer.RefreshView()
+            curPlayer.SetVisible(True)
     
     #如果玩家hp为0,设置玩家为死亡状态
     if curPlayer.GetHP() <= 0:
@@ -1367,9 +1516,6 @@
     
     PassiveBuffEffMng.OnLoadMapGFPassive(curPlayer)
     ItemControler.PlayerItemControler(curPlayer).RefreshStartEquipCount()   # 刷新装备珍品星级
-    
-    #最后处理下跨服
-    CrossRealmPlayer.OnLoadMapOK(curPlayer)
     
     #EndLoadMap需放在最后
     curPlayer.EndLoadMap()

--
Gitblit v1.8.0