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
#!/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 NetPackCommon
import IpyGameDataPY
import ChConfig
 
 
#------------------------------------------------------------------------------ 
## ¿ç·þÈü±¨Ãûµ÷ÓýӿÚ
#  @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
    registerType, mapID, dataMapID, copyMapID, posX, posY = resultInfo
    RegisterEnterCrossServer(curPlayer, registerType, mapID, dataMapID, copyMapID, posX, posY)
    return
 
def RegisterEnterCrossServer(curPlayer, registerType, mapID=0, dataMapID=0, copyMapID=0, posX=0, posY=0):
    playerID = curPlayer.GetPlayerID()
    if GameWorld.IsCrossServer():
        GameWorld.Log("    ¿ç·þ·þÎñÆ÷²»ÔÊÐíÉÏ´«±¨ÃûÊý¾Ý!", playerID)
        return
    
    playerRegisterType = curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_CrossRegisterType)
    if playerRegisterType in ChConfig.RegisterEnter_CrossServerMapIDList:
        GameWorld.ErrLog("¿ç·þÒѾ­ÔÚÉÏ´«Êý¾Ý£¬²»Öظ´Ìá½»!playerRegisterType=%s,registerType=%s" % (playerRegisterType, registerType), curPlayer.GetPlayerID())
        return
    
    if not mapID:
        if registerType in ChConfig.RegisterEnter_CrossServerMapIDList:
            registerTableName = "CrossPenglaiZone"
        else:
            return
        RegisterMapInfo = GetCurServerGroupIDRegisterMapInfo(registerTableName)
        if not RegisterMapInfo:
            GameWorld.ErrLog("ÕÒ²»µ½¸Ã·þÎñÆ÷¶ÔÓ¦¿ç·þ·ÖÇø: registerType=%s,registerTableName=%s" % (registerType, registerTableName))
            return
        mapID, copyMapID, posX, posY = RegisterMapInfo
        dataMapID = mapID
        
    if not mapID:
        return
    
    #¿ç·þǰ¸üÐÂ×Ô¼ºËùÊô·þÎñÆ÷×éID
    PlayerControl.UpdPlayerServerGroupID(curPlayer)
    
    if registerType in ChConfig.RegisterEnter_CrossServerMapIDList:
        prepareEnterCrossServer = ChPyNetSendPack.tagMCPrepareEnterCrossServer()
        prepareEnterCrossServer.DataMapID = registerType
        NetPackCommon.SendFakePack(curPlayer, prepareEnterCrossServer)
    curPlayer.SetDict(ChConfig.Def_PlayerKey_CrossRegisterType, registerType)
    #curPlayer.SendMergeRegisterPlayer(mapID, dataMapID, copyMapID, posX, posY)
    curPlayer.SendMergeRegisterPlayerAfterChange(CrossRealmPlayer.GetCrossPlayerName(curPlayer), mapID, dataMapID, copyMapID, posX, posY)
    GameWorld.Log("    ·¢ËÍ¿ç·þÍæ¼ÒÊý¾Ý×¢²á: registerType=%s,mapID=%s,dataMapID=%s,copyMapID=%s,posX=%s,posY=%s,GetVsRoomId=%s" 
                  % (registerType, mapID, dataMapID, copyMapID, posX, posY, curPlayer.GetVsRoomId()), playerID)
    return
 
def GetCurServerGroupIDRegisterMapInfo(tableName):
    ipyDataMgr = IpyGameDataPY.IPY_Data()
    if not hasattr(ipyDataMgr, "Get%sCount" % tableName):
        return
    
    serverGroupID = GameWorld.GetServerGroupID()
    for i in xrange(getattr(ipyDataMgr, "Get%sCount" % tableName)()):
        ipyData = getattr(ipyDataMgr, "Get%sByIndex" % tableName)(i)
        serverGroupIDList = ipyData.GetServerGroupIDList()
        for serverGroupIDInfo in serverGroupIDList:
            if (isinstance(serverGroupIDInfo, tuple) and serverGroupIDInfo[0] <= serverGroupID <= serverGroupIDInfo[1]) \
                or (isinstance(serverGroupIDInfo, int) and serverGroupIDInfo == serverGroupID):
                return ipyData.GetMapID(), ipyData.GetCopyMapID(), ipyData.GetPosX(), ipyData.GetPosY()
    return
 
## ¿ç·þÈü±¨Ãû½á¹û£¨ÉÏ´«Êý¾Ý£©
#  @param index Íæ¼ÒË÷Òý
#  @param tick µ±Ç°Ê±¼ä
#  @return None
def GameServer_MergeRegisterResult(index, tick):
    registerResult = IPY_GameWorld.IPY_GMMergeRegisterPlayerResult()
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    registerType = curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_CrossRegisterType)
    curPlayer.SetDict(ChConfig.Def_PlayerKey_CrossRegisterType, 0)
    playerID = curPlayer.GetPlayerID()
    result = registerResult.GetResult()
    GameWorld.Log("GameServer_MergeRegisterResult registerType=%s,result=%s" % (registerType, result), playerID)
    if not result:
        errorMsg = registerResult.GetErrorMsg()
        GameWorld.Log("CrossRealmReg result Error:%s" % errorMsg, playerID)
        NetPackCommon.SendFakePack(curPlayer, ChPyNetSendPack.tagMCEnterCrossServerError())
        return
    
    if registerType in ChConfig.RegisterEnter_CrossServerMapIDList:
        CrossRealmPlayer.DoEnterCrossRealm(curPlayer)
        PlayerControl.SetCrossRealmState(curPlayer, 1)
        NetPackCommon.SendFakePack(curPlayer, ChPyNetSendPack.tagMCStartEnterCrossServer())
        return
    
    #newAccount = registerResult.GetAccount()
    #newName = registerResult.GetPwd()
    
    msgList = str([registerType]) 
    GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(curPlayer.GetID(), 0, 0, "CrossRealmReg", msgList, len(msgList))    
    return