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