From 304b381ffa86f534e5335b48a156176a06e2f20e Mon Sep 17 00:00:00 2001
From: hch <305670599@qq.com>
Date: 星期四, 27 十二月 2018 15:59:44 +0800
Subject: [PATCH] Merge branch 'master' of http://192.168.0.87:10010/r/SnxxServerCode

---
 ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerControl.py                                                 |    3 +
 ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmPK.py                                          |   52 +++++++++++++---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerMagicWeapon.py                        |    6 +
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/GMShell.py                                      |    2 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_CrossRealmPK.py |   26 ++++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py                                 |   18 -----
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_CrossRealmReg.py       |    3 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/CrossRealmPlayer.py                         |    2 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py                            |   15 +++++
 ServerPython/CoreServerGroup/GameServer/Script/Player/CrossRealmPlayer.py                                              |   17 +++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py                                        |    1 
 11 files changed, 112 insertions(+), 33 deletions(-)

diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmPK.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmPK.py
index 58401ad..f560d96 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmPK.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmPK.py
@@ -733,10 +733,38 @@
         
     # 跨服登录处理
     else:
-        # 比如验证房间ID是否合法
-        pass
-    
+        mapID = curPlayer.GetMapID()
+        mapIDList = IpyGameDataPY.GetFuncCfg("CrossRealmPKMatch", 4)
+        if mapID not in mapIDList:
+            return
+        
+        GameWorld.Log("玩家登录跨服PK地图, mapID=%s" % mapID, curPlayer.GetPlayerID())
+        if not __CheckCanLoginCrossServerPKMap(curPlayer):
+            CrossRealmPlayer.PlayerExitCrossServer(curPlayer)
+            return
+        
     return
+
+def __CheckCanLoginCrossServerPKMap(curPlayer):
+    # 检查玩家可否登录跨服PK房间
+    
+    playerID = curPlayer.GetPlayerID()
+    vsRoomID = curPlayer.GetVsRoomId()
+    if not vsRoomID:
+        GameWorld.ErrLog("玩家没有对战房间ID,不可进入对战地图! 强制踢出跨服服务器!", playerID)
+        return False
+    
+    if vsRoomID not in PyGameData.g_crossPKRoomDict:
+        GameWorld.ErrLog("玩家对战房间ID已经不存在,不可进入对战地图! 强制踢出跨服服务器!vsRoomID=%s" % vsRoomID, playerID)
+        return False
+    
+    vsRoom = PyGameData.g_crossPKRoomDict[vsRoomID]
+    if playerID not in vsRoom.roomPlayerIDList:
+        GameWorld.ErrLog("玩家对战房间ID不存在该玩家ID,不可进入对战地图! 强制踢出跨服服务器!vsRoomID=%s,roomPlayerIDList=%s" 
+                         % (vsRoomID, vsRoom.roomPlayerIDList), playerID)
+        return False
+    
+    return True
 
 ## 玩家离线处理
 def OnLeaveServer(curPlayer):    
@@ -810,14 +838,14 @@
     ondayScore = playerInfoDict["ondayScore"] # 过天时的积分
     
     zoneMatchPlayerList = PyGameData.g_crossPKZoneMatchPlayerDict.get(pkZoneID, [])
-#    if playerID in zoneMatchPlayerList:
-#        GameWorld.Log("玩家正在匹配中,无法重复发起匹配!playerID=%s,accID=%s" % (playerID, accID))
-#        CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_PKMatchReqRet, [playerID, 1], [serverGroupID])
-#        return
-#    if playerID in PyGameData.g_crossPKPlayerDict:
-#        GameWorld.Log("玩家正在战斗中,无法重复发起匹配!playerID=%s,accID=%s" % (playerID, accID))
-#        CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_PKMatchReqRet, [playerID, -2], [serverGroupID])
-#        return
+    if playerID in zoneMatchPlayerList:
+        GameWorld.Log("玩家正在匹配中,无法重复发起匹配!playerID=%s,accID=%s" % (playerID, accID))
+        CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_PKMatchReqRet, [playerID, 1], [serverGroupID])
+        return
+    if playerID in PyGameData.g_crossPKPlayerDict:
+        GameWorld.Log("玩家正在战斗中,无法重复发起匹配!playerID=%s,accID=%s" % (playerID, accID))
+        CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_PKMatchReqRet, [playerID, -2], [serverGroupID])
+        return
     
     pkPlayer = CrossPKPlayer()
     pkPlayer.accID = accID
@@ -1624,6 +1652,7 @@
             PyGameData.g_crossPKUnNotifyOverInfo[playerID] = sendMapOverInfo
             continue
         
+        PlayerControl.SetVsRoomId(player, 0)
         sysMsg = str(sendMapOverInfo)
         player.MapServer_QueryPlayerResult(0, 0, "CrossPKOverInfo", sysMsg, len(sysMsg))
         GameWorld.Log("通知地图跨服PK结算: roomID=%s,zoneID=%s,seasonID=%s,timeStr=%s,overType=%s,winnerID=%s,roundWinnerIDList=%s, pkScore=%s,danLV=%s,cWinCount=%s,addScore=%s,tagPlayerID=%s,notifyState=%s,mapID=%s" 
@@ -1636,6 +1665,7 @@
         return
     overInfo = PyGameData.g_crossPKUnNotifyOverInfo.pop(playerID)
     PlayerControl.SetCrossRealmState(curPlayer, 0)
+    PlayerControl.SetVsRoomId(curPlayer, 0)
     sysMsg = str(overInfo)
     curPlayer.MapServer_QueryPlayerResult(0, 0, "CrossPKOverInfo", sysMsg, len(sysMsg))
     GameWorld.Log("玩家上线通知地图未结算的跨服PK结算: mapID=%s,overInfo=%s" % (curPlayer.GetMapID(), overInfo), playerID)
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/CrossRealmPlayer.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/CrossRealmPlayer.py
index 35f6bf2..c8d42a2 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/CrossRealmPlayer.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/CrossRealmPlayer.py
@@ -23,6 +23,7 @@
 import PlayerControl
 import PlayerViewCache
 import ChPyNetSendPack
+import IPY_PlayerDefine
 import NetPackCommon
 import PyGameData
 
@@ -38,11 +39,27 @@
 
     return (nameFormat%{"opname":opName, "sid":GameWorld.GetPlayerServerID(curPlayer)}).decode('gbk').encode(GameWorld.GetCharacterEncoding()) + playerName
 
+def PlayerExitCrossServer(curPlayer):
+    ## 玩家退出跨服服务器
+    
+    # 通知子服玩家退出跨服服务器
+    playerID = curPlayer.GetPlayerID()
+    serverGroupID = PlayerControl.GetPlayerServerGroupID(curPlayer)
+    CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_ExitCrossServer, playerID, [serverGroupID])
+    
+    # 设置非跨服状态,踢下线
+    PlayerControl.SetCrossRealmState(curPlayer, 0)
+    curPlayer.Kick(0)
+    GameWorld.Log("PlayerExitCrossServer...serverGroupID=%s" % serverGroupID, playerID)
+    return
+
 def CrossServerMsg_ExitCrossServer(msgData):
     ## 收到跨服服务器同步的玩家退出跨服服务器
     playerID = msgData
+    GameWorld.Log("收到跨服服务器同步的玩家退出跨服服务器: playerID=%s" % playerID)
     curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(playerID)
     if not curPlayer:
+        GameWorld.Log("    退出跨服时本服玩家不在线!", playerID)
         return
     PlayerControl.SetCrossRealmState(curPlayer, 0)
     return
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerControl.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerControl.py
index c9fecb5..6215b85 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerControl.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerControl.py
@@ -229,6 +229,9 @@
     return 
 def GetLeaveFamilyTime(curPlayer):return curPlayer.GetExAttr12()
 
+## 玩家所属服务器组ID
+def GetPlayerServerGroupID(curPlayer): return curPlayer.GetExAttr13()
+
 ## 是否脱机挂机状态
 def GetIsTJG(curPlayer):
     if curPlayer.GetDictByKey(ChConfig.Def_OnlineType):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
index 5d76327..c5d9066 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -3283,7 +3283,6 @@
 Def_PDict_OnDayEx = "OnDayEx" # 特殊时间点凌晨X点过天
 Def_PDict_OnWeekEx = "OnWeekEx" # 特殊时间点凌晨X点过周
 Def_PDict_OnMonthEx = "OnMonthEx" # 特殊时间点凌晨X点过月
-Def_Player_Dict_ServerGroupID = "ServerGroupID"    # 合服/混服时所属游戏服务器组ID
 Def_Player_Dict_PlayerFromPID = "PlayerFromPID"    # pid
 Def_Player_Dict_Account_Type = "account_type"    # account_type
 Def_Player_Dict_TencentPF = "tencentPF"    # 腾讯平台来源pf
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/GMShell.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/GMShell.py
index d58ea44..9aed006 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/GMShell.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/GMShell.py
@@ -255,7 +255,7 @@
     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
     
     if not curPlayer.GetMapLoadOK():
-        #未读取地图成功,不让用
+        GameWorld.DebugLog("    未读取地图成功,不让用")
         return
     
     #判断FB中是否可使用GM命令
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_CrossRealmPK.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_CrossRealmPK.py
index 0213d80..85e2305 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_CrossRealmPK.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_CrossRealmPK.py
@@ -193,6 +193,26 @@
             
     return
 
+##玩家主动离开副本.
+def DoPlayerLeaveFB(curPlayer, tick):
+    gameFB = GameWorld.GetGameFB()
+    fbStep = gameFB.GetFBStep()
+    
+    if fbStep <= FB_State_Waiting and fbStep >= FB_State_Leave:
+        return
+    
+    leavePlayerID = curPlayer.GetPlayerID()
+    roomID = GameWorld.GetGameWorld().GetPropertyID()
+    playerIDA = gameFB.GetGameFBDictByKey(GameFBDict_FBPlayerID % 1)
+    playerIDB = gameFB.GetGameFBDictByKey(GameFBDict_FBPlayerID % 2)
+    
+    loser, loserID = curPlayer, leavePlayerID
+    winnerID = playerIDA if playerIDB == loserID else playerIDB
+    winner = GameWorld.GetMapCopyPlayerManager().FindPlayerByID(winnerID)
+    GameWorld.Log("玩家主动退出,直接算输! roomID=%s,leavePlayerID=%s,loserID=%s,winnerID=%s" % (roomID, leavePlayerID, loserID, winnerID))
+    __DoFBPKAllOver(winner, winnerID, loser, loserID, Def_OverType_PlayerExit, tick)
+    return
+
 ## 获得副本帮助信息
 def DoFBHelp(curPlayer, tick):
     return
@@ -260,6 +280,7 @@
                     其他情况则在线玩家获胜,如果没有玩家在线,则最迟离线的获胜
     '''
     winner, winnerID, loser, loserID = None, 0, None, 0
+    roomID = GameWorld.GetGameWorld().GetPropertyID()
     gameFB = GameWorld.GetGameFB()
     fbStep = gameFB.GetFBStep()
     copyMapPlayerManager = GameWorld.GetMapCopyPlayerManager()
@@ -271,6 +292,7 @@
         # 时间到还没分出胜负, 根据以下规则决定胜负,这里用玩家ID处理,防止结算时都掉线了导致没有结果
         # 伤害输出 > 优先到达时间 > 剩余HP > 最大HP > playerID
         
+        GameWorld.Log("两个人都在线,根据超时规则判断胜负玩家! roomID=%s" % (roomID))
         playerInfoList = []
         for playerID in [playerIDA, playerIDB]:
             player = copyMapPlayerManager.FindPlayerByID(playerID)
@@ -298,11 +320,13 @@
             continue
         winner = player
         winnerID = player.GetPlayerID()
+        GameWorld.Log("超时结算,玩家在线,直接获胜: roomID=%s,winnerID=%s" % (roomID, winnerID))
         break
     
     if not winner:
         playerLeaveTickA = gameFB.GetGameFBDictByKey(GameFBDict_PlayerLeaveTick % playerIDA)
         playerLeaveTickB = gameFB.GetGameFBDictByKey(GameFBDict_PlayerLeaveTick % playerIDB)
+        GameWorld.Log("超时结算,没有玩家在线,后离线的获胜: playerLeaveTickA=%s,playerLeaveTickB=%s" % (playerLeaveTickA, playerLeaveTickB))
         # 离线tick较大的就是比较晚离线的
         if playerLeaveTickA > playerLeaveTickB:
             winnerID = playerIDA
@@ -474,7 +498,7 @@
     SkillCommon.ResetAllSkillCD(player)
     return
 
-## 跨服PK结束处理
+## 跨服PK结束处理,注意 winner、loser 参数可能为None
 def __DoFBPKAllOver(winner, winnerID, loser, loserID, overType, tick):
     gameFB = GameWorld.GetGameFB()
     
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 38297f3..6ec55f3 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
@@ -252,8 +252,8 @@
     #通知玩家物品信息
     __Sync_PackDetel(curPlayer)
     
-    #更新主服ID信息
-    #UpdatePlayerServerGroupID(curPlayer)
+    #更新服务器组ID
+    PlayerControl.UpdPlayerServerGroupID(curPlayer)
     
     #上线学习技能
     SkillCommon.PlayerLoginCheckLearnSkill(curPlayer)
@@ -826,20 +826,6 @@
 # #    curPlayer.Syn_OfflineTimeRefresh(int(curOfflineMinutes))
 #    curPlayer.Syn_OfflineTimeQueryResult()
 #===============================================================================
-    return
-
-def UpdatePlayerServerGroupID(curPlayer):
-    # 更新自己的服务器组ID, 跨服服务器不处理
-    if GameWorld.IsCrossServer():
-        return
-    serverGroupID = GameWorld.GetServerGroupID()
-    if not serverGroupID:
-        return
-    playerServerGroupID = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_ServerGroupID)
-    if playerServerGroupID != serverGroupID:
-        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_ServerGroupID, serverGroupID)
-        GameWorld.DebugLog("更新玩家所属服务器组ID: serverGroupID=%s" % serverGroupID)
-        
     return
 
 #---------------------------------------------------------------------
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/CrossRealmPlayer.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/CrossRealmPlayer.py
index 2729273..8758929 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/CrossRealmPlayer.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/CrossRealmPlayer.py
@@ -56,7 +56,7 @@
     
     # 通知子服玩家退出跨服服务器
     playerID = curPlayer.GetPlayerID()
-    serverGroupID = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_ServerGroupID)
+    serverGroupID = PlayerControl.GetPlayerServerGroupID(curPlayer)
     GameWorld.SendMsgToClientServer(ShareDefine.CrossServerMsg_ExitCrossServer, playerID, [serverGroupID])
     
     # 设置非跨服状态,踢下线
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
index 70637d6..f09873c 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
@@ -5673,6 +5673,21 @@
 def GetChatBubbleBox(curPlayer): return curPlayer.GetExAttr10()
 def SetChatBubbleBox(curPlayer, value): return curPlayer.SetExAttr10(value, False, True)
 
+## 玩家所属服务器组ID
+def GetPlayerServerGroupID(curPlayer): return curPlayer.GetExAttr13()
+def UpdPlayerServerGroupID(curPlayer):
+    # 更新自己的服务器组ID, 跨服服务器不处理
+    if GameWorld.IsCrossServer():
+        return
+    serverGroupID = GameWorld.GetServerGroupID()
+    if not serverGroupID:
+        return
+    playerServerGroupID = curPlayer.GetExAttr13()
+    if playerServerGroupID != serverGroupID:
+        curPlayer.SetExAttr13(serverGroupID, False, True)
+        GameWorld.DebugLog("更新玩家所属服务器组ID: serverGroupID=%s" % serverGroupID)
+    return
+
 ##获得玩家威望值
 def GetPrestige(curPlayer): return 0
 def SetPrestige(curPlayer, value): return
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerMagicWeapon.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerMagicWeapon.py
index 1caf2ff..83f6c91 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerMagicWeapon.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerMagicWeapon.py
@@ -920,12 +920,14 @@
 def Sycn_MagicWeaponLV(curPlayer, mwID= -1):
     #通知法宝等级信息
     if mwID == -1:
+        isAll = True
         needCalList = []
         ipyDataMgr = IpyGameDataPY.IPY_Data()
         for i in xrange(ipyDataMgr.GetTreasureCount()):
             ipyData = ipyDataMgr.GetTreasureByIndex(i)
             needCalList.append(ipyData.GetID())
     else:
+        isAll = False
         needCalList = [mwID]
     sendPack = ChPyNetSendPack.tagMCMagicWeaponLVInfo()
     sendPack.InfoList = []
@@ -935,7 +937,7 @@
         state = GetIsClickMagicWeapon(curPlayer, mwID)
         FBPassLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MWFBPassLevel % mwID)
         isWear = GetIsWearMagicWeapon(curPlayer, mwID)
-        if not mwLv and not curUpExp and not state and not FBPassLV and not isWear:
+        if isAll and not mwLv and not curUpExp and not state and not FBPassLV and not isWear:
             continue
         pack = ChPyNetSendPack.tagMCMagicWeaponInfo()
         pack.MWID = mwID
@@ -1130,6 +1132,8 @@
                 hasWearCnt +=1
                 
     SetMagicWeaponWearState(curPlayer, mwID, isWear)
+    CalcMagicWeaponAttr(curPlayer)
+    PlayerControl.PlayerControl(curPlayer).RefreshPlayerAttrState()
     Sycn_MagicWeaponLV(curPlayer, mwID)
     return
 
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_CrossRealmReg.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_CrossRealmReg.py
index eae5dde..98d7d21 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_CrossRealmReg.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_CrossRealmReg.py
@@ -16,6 +16,7 @@
 #-------------------------------------------------------------------------------
 
 import GameWorld
+import PlayerControl
 import CrossRealmPlayer
 import IPY_GameWorld
 import ChPlayer
@@ -59,7 +60,7 @@
         return
     
     #跨服前更新自己所属服务器组ID
-    ChPlayer.UpdatePlayerServerGroupID(curPlayer)
+    PlayerControl.UpdPlayerServerGroupID(curPlayer)
     
     mapID, dataMapID, copyMapID, posX, posY = mapPosInfo
     #curPlayer.SendMergeRegisterPlayer(mapID, dataMapID, copyMapID, posX, posY)

--
Gitblit v1.8.0