1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
#!/usr/bin/python
# -*- coding: GBK -*-
#-------------------------------------------------------------------------------
#
##@package Player.RemoteQuery.GY_Query_CrossRealmReg
#
# @todo:¿ç·þ»î¶¯Íæ¼Ò×¢²á
# @author hxp
# @date 2018-12-21
# @version 1.0
#
# ÏêϸÃèÊö: ¿ç·þ»î¶¯Íæ¼Ò×¢²á
#
#-------------------------------------------------------------------------------
#"""Version = 2018-12-21 18:00"""
#-------------------------------------------------------------------------------
 
import GameWorld
import PlayerControl
import CrossRealmPlayer
import IPY_GameWorld
import ChPyNetSendPack
import CrossPlayerData
import NetPackCommon
import ChConfig
import FBCommon
import FBLogic
 
 
#------------------------------------------------------------------------------ 
## ¿ç·þÈü±¨Ãûµ÷ÓýӿÚ
#  @param query_Type ÇëÇóÀàÐÍ
#  @param query_ID ÇëÇóµÄÍæ¼ÒID
#  @param packCMDList ·¢°üÃüÁî
#  @param tick µ±Ç°Ê±¼ä
#  @return "True" or "False" or ""
#  @remarks º¯ÊýÏêϸ˵Ã÷.
def DoLogic(query_Type, query_ID, packCMDList, tick): 
    return
 
 
#------------------------------------------------------------------------------ 
## Ö´Ðнá¹û
#  @param curPlayer ·¢³öÇëÇóµÄÍæ¼Ò
#  @param callFunName ¹¦ÄÜÃû³Æ
#  @param funResult ²éѯµÄ½á¹û
#  @param tick µ±Ç°Ê±¼ä
#  @return None
#  @remarks º¯ÊýÏêϸ˵Ã÷.
def DoResult(curPlayer, callFunName, funResult, tick):
    resultInfo = eval(funResult)
    GameWorld.Log("GY_Query_CrossRealmReg DoResult %s" % funResult, curPlayer.GetPlayerID())
    if not resultInfo:
        return
    registerMap, mapID, dataMapID, copyMapID, posX, posY, lineID = resultInfo
    RegisterEnterCrossServer(curPlayer, registerMap, mapID, dataMapID, copyMapID, posX, posY, lineID)
    return
 
def RegisterEnterCrossServer(curPlayer, registerMap, mapID=0, dataMapID=0, copyMapID=0, posX=0, posY=0, lineID=0):
    '''
    @param registerMap: Ò»°ãÊǹ¦ÄܵØÍ¼ID dataMapID
    @param mapID: ÕæÊµ³¡¾°µØÍ¼ID
    @param dataMapID: ÕæÊµ³¡¾°µØÍ¼ID¶ÔÓ¦³¡¾°Êý¾ÝµØÍ¼ID
    '''
    playerID = curPlayer.GetPlayerID()
    if GameWorld.IsCrossServer():
        GameWorld.Log("    ¿ç·þ·þÎñÆ÷²»ÔÊÐíÉÏ´«±¨ÃûÊý¾Ý!", playerID)
        return
    
    playerRegisterMap = curPlayer.NomalDictGetProperty(ChConfig.Def_PlayerKey_CrossRegisterMap)
    if playerRegisterMap in ChConfig.RegisterEnter_CrossServerMapIDList:
        GameWorld.ErrLog("¿ç·þÒѾ­ÔÚÉÏ´«Êý¾Ý£¬²»Öظ´Ìá½»!playerRegisterMap=%s,registerMap=%s" % (playerRegisterMap, registerMap), curPlayer.GetPlayerID())
        return
    
    #¿ç·þǰ¸üÐÂ×Ô¼ºËùÊô·þÎñÆ÷×éID
    PlayerControl.UpdPlayerServerGroupID(curPlayer)
    serverGroupID = PlayerControl.GetPlayerServerGroupID(curPlayer)
    zoneIpyData = CrossRealmPlayer.GetCrossZoneIpyDataByServerGroupID(registerMap, serverGroupID)
    if not zoneIpyData:
        return
    zoneID = zoneIpyData.GetZoneID()
    
    if not mapID:
        zoneIpyData = CrossRealmPlayer.GetServerCrossZoneMapIpyData(zoneID, registerMap)
        if not zoneIpyData:
            GameWorld.ErrLog("ÕÒ²»µ½¸Ã·þÎñÆ÷¶ÔÓ¦¿ç·þ·ÖÇø: registerMap=%s" % (registerMap))
            return
        mapID, dataMapID, copyMapID, posX, posY = zoneIpyData.GetMapID(), zoneIpyData.GetDataMapID(), zoneIpyData.GetCopyMapID(), zoneIpyData.GetPosX(), zoneIpyData.GetPosY()
    
    if not posX or not posY:
        fbLineIpyData = FBCommon.GetFBLineIpyData(mapID, lineID)
        if fbLineIpyData:
            tick = GameWorld.GetGameWorld().GetTick()
            ipyEnterPosInfo = FBCommon.GetFBLineEnterPosInfo(mapID, lineID, fbLineIpyData)
            retPos = FBLogic.OnGetFBEnterPos(curPlayer, mapID, lineID, ipyEnterPosInfo, tick)
            if not retPos:
                GameWorld.ErrLog("δÕÒµ½½øÈ븱±¾×ø±ê£¡mapID=%s,lineID=%s" % (mapID, lineID))
                return
            posX, posY = retPos
            
    if not mapID or not posX or not posY:
        return
    
    if not FBLogic.OnRegEnterCrossFB(curPlayer, mapID, lineID):
        GameWorld.ErrLog("OnRegEnterCrossFB ½øÈë¿ç·þ¸±±¾×¢²áʧ°Ü£¬½øÈëÌõ¼þ²»×㣡ÎÞ·¨×¢²á! mapID=%s,lineID=%s" % (mapID, lineID), playerID)
        return
    
    if registerMap in ChConfig.RegisterEnter_CrossServerMapIDList:
        prepareEnterCrossServer = ChPyNetSendPack.tagMCPrepareEnterCrossServer()
        prepareEnterCrossServer.DataMapID = registerMap
        NetPackCommon.SendFakePack(curPlayer, prepareEnterCrossServer)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PlayerKey_CrossRegisterMap, registerMap) # µÇ¼ÇÖмǼ£¬·µ»ØºóÇå¿Õ
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_ReqCrossFBMapID, registerMap) # ´¿Ìæ»»¼Ç¼£¬²»Çå¿Õ
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_ReqCrossFBFuncLine, lineID)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_ReqCrossFBZoneID, zoneID)
    CrossPlayerData.OnPlayerCrossReg(curPlayer)
    #curPlayer.SendMergeRegisterPlayer(mapID, dataMapID, copyMapID, posX, posY)
    curPlayer.SendMergeRegisterPlayerAfterChange(CrossRealmPlayer.GetCrossPlayerName(curPlayer), mapID, dataMapID, copyMapID, posX, posY)
    GameWorld.Log("    ·¢ËÍ¿ç·þÍæ¼ÒÊý¾Ý×¢²á: registerMap=%s,lineID=%s,zoneID=%s,mapID=%s,dataMapID=%s,copyMapID=%s,posX=%s,posY=%s,GetVsRoomId=%s" 
                  % (registerMap, lineID, zoneID, mapID, dataMapID, copyMapID, posX, posY, curPlayer.GetVsRoomId()), playerID)
    return True
 
## ¿ç·þÈü±¨Ãû½á¹û£¨ÉÏ´«Êý¾Ý£©
#  @param index Íæ¼ÒË÷Òý
#  @param tick µ±Ç°Ê±¼ä
#  @return None
def GameServer_MergeRegisterResult(index, tick):
    registerResult = IPY_GameWorld.IPY_GMMergeRegisterPlayerResult()
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    registerMap = curPlayer.NomalDictGetProperty(ChConfig.Def_PlayerKey_CrossRegisterMap)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PlayerKey_CrossRegisterMap, 0)
    curPlayer.SetDict(ChConfig.Def_PlayerKey_RequestEnterCrossServerTick, 0)
    playerID = curPlayer.GetPlayerID()
    result = registerResult.GetResult()
    GameWorld.Log("GameServer_MergeRegisterResult registerMap=%s,result=%s" % (registerMap, result), playerID)
    if not result:
        errorMsg = registerResult.GetErrorMsg()
        GameWorld.Log("CrossRealmReg result Error:%s" % errorMsg, playerID)
        NetPackCommon.SendFakePack(curPlayer, ChPyNetSendPack.tagMCEnterCrossServerError())
        return
    
    if registerMap in ChConfig.RegisterEnter_CrossServerMapIDList:
        CrossRealmPlayer.DoEnterCrossRealm(curPlayer)
        PlayerControl.SetCrossMapID(curPlayer, registerMap)
        NetPackCommon.SendFakePack(curPlayer, ChPyNetSendPack.tagMCStartEnterCrossServer())
        return
    
    #newAccount = registerResult.GetAccount()
    #newName = registerResult.GetPwd()
    
    msgList = str([registerMap]) 
    GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(curPlayer.GetID(), 0, 0, "CrossRealmReg", msgList, len(msgList))    
    return