#!/usr/bin/python
|
# -*- coding: GBK -*-
|
#
|
##@package
|
#
|
# @todo:
|
#
|
# @author: Alee
|
# @date 2019-1-14 ÏÂÎç11:30:12
|
# @version 1.0
|
#
|
# @note:
|
#
|
#---------------------------------------------------------------------
|
import GameWorld
|
import CommFunc
|
import PlayerControl
|
import IPY_GameWorld
|
import BuffSkill
|
import SkillCommon
|
import base64
|
import ChConfig
|
import PyGameData
|
|
# ·¢Ë͸ñʽ£º ÀàÐÍ+£¨ÊýÁ¿£©+Êý¾Ý
|
# Ïò¿ç·þ·¢Ë͵ÄÊý¾ÝÀàÐÍ
|
(
|
MergeData_Player, # ¶Ô±È´¦Àí
|
MergeData_Item, # ¶Ô±È´¦Àí Ö»ËãÊôÐԵı³°ü ×°±¸ ³èÎï
|
MergeData_Skill, # Ö»´¦ÀíID
|
MergeData_Buff, # ¼´Ê±·¢ËÍ
|
) = range(0, 4)
|
|
# Ó°Ïì¿ç·þÕ½Á¦ÊôÐÔÁбí
|
CrossFightPowerAttrList = [
|
[lambda curObj:curObj.GetBaseSTR(), lambda curObj, value:curObj.SetBaseSTR(value)], # Á¦Á¿
|
[lambda curObj:curObj.GetBasePNE(), lambda curObj, value:curObj.SetBasePNE(value)], # ÖÇÁ¦
|
[lambda curObj:curObj.GetBasePHY(), lambda curObj, value:curObj.SetBasePHY(value)], # Ãô½Ý
|
[lambda curObj:curObj.GetBaseCON(), lambda curObj, value:curObj.SetBaseCON(value)], # ÌåÖÊ
|
[lambda curObj:curObj.GetOfficialRank(), lambda curObj, value:curObj.SetOfficialRank(value)], # ¾³½ç
|
[lambda curObj:curObj.GetVIPLv(), lambda curObj, value:curObj.SetVIPLv(value)], # VIPµÈ¼¶
|
]
|
|
# ·¢ËÍÖ÷·þÍæ¼ÒÊý¾Ý¸ø¿ç·þ
|
def SendMergeData_Buff(curPlayer, buffID, plusValueList):
|
if buffID in [ChConfig.Def_SkillID_LimitSuperBuff,
|
ChConfig.Def_SkillID_TJGSuperBuff]:
|
# ²»ÐèÒª´¦ÀíµÄbuff
|
return
|
if curPlayer.GetGameObjType() != IPY_GameWorld.gotPlayer:
|
return
|
|
if GameWorld.IsCrossServer():
|
# ·ÇÖ÷·þ
|
return
|
|
if not PlayerControl.GetCrossMapID(curPlayer):
|
# ·Ç¿ç·þÖÐ
|
return
|
|
data = ''
|
data = CommFunc.WriteBYTE(data, MergeData_Buff)
|
data = CommFunc.WriteDWORD(data, buffID)
|
data = CommFunc.WriteBYTE(data, len(plusValueList))
|
for value in plusValueList:
|
data = CommFunc.WriteDWORD(data, value)
|
|
|
#Ö±½ÓÓÃ×Ö½ÚÁ÷»á±¨´í
|
data = base64.b64encode(data)
|
curPlayer.SendMergePlayerData(data)
|
return
|
|
|
# ½ÓÊÕ×Ó·þÍæ¼ÒÊý¾Ý
|
def OnMergePlayerData(index, tick):
|
if not GameWorld.IsCrossServer():
|
# ·Ç¿ç·þ
|
return
|
|
# ¿ç·þ·þÎñÆ÷´¦Àí
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
pdata = base64.b64decode(curPlayer.GetMergePlayerData())
|
|
pos = 0
|
dataType, pos = CommFunc.ReadBYTE(pdata, pos)
|
if dataType == MergeData_Buff:
|
buffID, pos = CommFunc.ReadDWORD(pdata, pos)
|
curSkill = GameWorld.GetGameData().GetSkillBySkillID(buffID)
|
if not curSkill:
|
return
|
|
plusValueList = []
|
cnt, pos = CommFunc.ReadBYTE(pdata, pos)
|
for i in range(cnt):
|
value, pos = CommFunc.ReadDWORD(pdata, pos)
|
plusValueList.append(value)
|
|
buffType = SkillCommon.GetBuffType(curSkill)
|
BuffSkill.AddBuffNoRefreshState(curPlayer, buffType, curSkill, tick, plusValueList)
|
|
elif dataType == MergeData_Player:
|
__ReadMainServerSyncPlayerData(curPlayer, curPlayer.GetMergePlayerData(), pos)
|
|
return
|
|
## ----------------------------------------------------------------------------------------------
|
|
def IsNeedProcessCrossPlayer(curPlayer):
|
## ÊÇ·ñÐèÒª´¦Àíͬ²½¿ç·þÖеÄÍæ¼ÒÊý¾Ý
|
if GameWorld.IsCrossServer():
|
return
|
|
crossMapID = curPlayer.NomalDictGetProperty(ChConfig.Def_PlayerKey_CrossRegisterMap)
|
if not crossMapID:
|
crossMapID = PlayerControl.GetCrossMapID(curPlayer)
|
if not crossMapID or crossMapID not in ChConfig.Def_CrossMapIDList:
|
return
|
|
# ²»ÐèÒª´¦ÀíµÄ¿ç·þµØÍ¼
|
if crossMapID in [ChConfig.Def_FBMapID_CrossRealmPK]:
|
return
|
|
return True
|
|
def ClearCrossSyncDataCache(curPlayer):
|
## Çå³ýͬ²½¿ç·þÊý¾ÝµÄÁÙʱ»º´æ
|
playerID = curPlayer.GetPlayerID()
|
PyGameData.g_crossRegPlayerAttrDict.pop(playerID, None)
|
PyGameData.g_crossSyncTickDict.pop(playerID, None)
|
PyGameData.g_crossPlayerDictChangeInfo.pop(playerID, None)
|
GameWorld.DebugLog("Çå³ýͬ²½¿ç·þÊý¾ÝµÄÁÙʱ»º´æ", playerID)
|
return
|
|
def OnPlayerCrossReg(curPlayer):
|
## Íæ¼Ò¿ç·þÊý¾Ý×¢²á
|
|
if not IsNeedProcessCrossPlayer(curPlayer):
|
return
|
|
ClearCrossSyncDataCache(curPlayer)
|
attrList = []
|
for attrInfo in CrossFightPowerAttrList:
|
attrList.append(attrInfo[0](curPlayer))
|
playerID = curPlayer.GetPlayerID()
|
PyGameData.g_crossRegPlayerAttrDict[playerID] = attrList
|
return
|
|
def OnPlayerFightPowerChange(curPlayer):
|
## Íæ¼ÒÕ½Á¦±ä¸üʱ
|
if not IsNeedProcessCrossPlayer(curPlayer):
|
return
|
playerID = curPlayer.GetPlayerID()
|
if playerID in PyGameData.g_crossSyncTickDict:
|
return
|
tick = GameWorld.GetGameWorld().GetTick()
|
PyGameData.g_crossSyncTickDict[playerID] = tick
|
#GameWorld.DebugLog("±ê¼ÇÐèҪͬ²½¿ç·þÍæ¼ÒÕ½Á¦±ä¸üÏà¹ØÊý¾Ý! tick=%s" % tick, curPlayer.GetPlayerID())
|
return
|
|
def ProcessCrossPlayer(curPlayer, tick):
|
## ¿ç·þ״̬µÄ±¾·þÍæ¼Ò´¦Àí
|
if not IsNeedProcessCrossPlayer(curPlayer):
|
return
|
|
playerID = curPlayer.GetPlayerID()
|
if playerID not in PyGameData.g_crossSyncTickDict:
|
return
|
setTick = PyGameData.g_crossSyncTickDict[playerID]
|
if tick - setTick < 5000:
|
return
|
PyGameData.g_crossSyncTickDict.pop(playerID)
|
GameWorld.DebugLog("¿ªÊ¼Í¬²½±¾·þ±ä¸üµÄÊôÐÔ...", playerID)
|
|
# ÕâÀïÖ»×ö¿ÉÄÜÒýÆðÕ½Á¦±ä»¯ËùÐèҪͬ²½µÄÊý¾Ý
|
data = ""
|
data = __WriteSyncPlayerAttrData(curPlayer, data) # Íæ¼ÒÊôÐÔ
|
data = __WriteSyncPlayerDictData(curPlayer, data) # ×Öµä
|
# ÎïÆ·
|
|
# ¼¼ÄÜ
|
|
#Ö±½ÓÓÃ×Ö½ÚÁ÷»á±¨´í
|
data = base64.b64encode(data)
|
curPlayer.SendMergePlayerData(data)
|
return
|
|
def __ReadMainServerSyncPlayerData(curPlayer, pdata, pos):
|
## ¶ÁÈ¡×Ó·þͬ²½µÄÍæ¼ÒÕ½Á¦±ä¸üÏà¹ØÊôÐÔ
|
|
GameWorld.DebugLog("ÊÕµ½×Ó·þͬ²½µÄÍæ¼Ò±ä¸üÊý¾Ý:", curPlayer.GetPlayerID())
|
|
pos = __ReadSyncPlayerAttrData(curPlayer, pdata, pos) # Íæ¼ÒÊôÐÔ
|
pos = __ReadSyncPlayerDictData(curPlayer, pdata, pos) # ×Öµä
|
# ÎïÆ·
|
|
# ¼¼ÄÜ
|
|
# ǿˢһ´ÎÊôÐÔ
|
PlayerControl.PlayerControl(curPlayer).ReCalcAllState()
|
return
|
|
def __WriteSyncPlayerAttrData(curPlayer, data):
|
## дÈëÐèҪͬ²½µÄÍæ¼ÒÊôÐÔ
|
|
data = CommFunc.WriteBYTE(data, MergeData_Player)
|
playerID = curPlayer.GetPlayerID()
|
if playerID not in PyGameData.g_crossRegPlayerAttrDict:
|
return CommFunc.WriteBYTE(data, 0)
|
attrList = PyGameData.g_crossRegPlayerAttrDict[playerID]
|
|
if len(attrList) != len(CrossFightPowerAttrList):
|
return CommFunc.WriteBYTE(data, 0)
|
|
changeAttrList = []
|
for i, attrInfo in enumerate(CrossFightPowerAttrList):
|
befValue = attrList[i]
|
curValue = attrInfo[0](curPlayer)
|
if befValue == curValue:
|
continue
|
changeAttrList.append([i, curValue])
|
attrList[i] = curValue # ¸üмǼµÄÖµ
|
|
if not changeAttrList:
|
return CommFunc.WriteBYTE(data, 0)
|
|
count = len(changeAttrList)
|
GameWorld.DebugLog("±ä¸üµÄÍæ¼ÒÊôÐÔ¸öÊý: %s" % count)
|
data = CommFunc.WriteBYTE(data, count)
|
for index, curValue in changeAttrList:
|
data = CommFunc.WriteBYTE(data, index)
|
data = CommFunc.WriteDWORD(data, curValue)
|
GameWorld.DebugLog(" index=%s,value=%s" % (index, curValue))
|
|
return data
|
|
def __ReadSyncPlayerAttrData(curPlayer, pdata, pos):
|
## ¶Áȡͬ²½µÄÍæ¼ÒÊôÐÔ
|
pdata = base64.b64decode(pdata)
|
count, pos = CommFunc.ReadBYTE(pdata, pos)
|
GameWorld.DebugLog("±ä¸üµÄÍæ¼ÒÊôÐÔ¸öÊý: %s" % count)
|
for _ in range(count):
|
index, pos = CommFunc.ReadBYTE(pdata, pos)
|
value, pos = CommFunc.ReadDWORD(pdata, pos)
|
CrossFightPowerAttrList[index][1](curPlayer, value) # ÉèÖøüÐÂÖµ
|
GameWorld.DebugLog(" index=%s,value=%s" % (index, value))
|
|
return pos
|
|
def __WriteSyncPlayerDictData(curPlayer, data):
|
## дÈëÐèҪͬ²½µÄÍæ¼Ò×Öµä
|
playerID = curPlayer.GetPlayerID()
|
if playerID not in PyGameData.g_crossPlayerDictChangeInfo:
|
return CommFunc.WriteBYTE(data, 0)
|
changeDict = PyGameData.g_crossPlayerDictChangeInfo.pop(playerID)
|
|
count = len(changeDict)
|
GameWorld.DebugLog("±ä¸üµÄÍæ¼Ò×Öµä¸öÊý: %s" % count)
|
data = CommFunc.WriteWORD(data, count)
|
for keyInfo, value in changeDict.items():
|
key, dType = keyInfo
|
keyLen = len(key)
|
data = CommFunc.WriteBYTE(data, keyLen)
|
data = CommFunc.WriteString(data, keyLen, key)
|
data = CommFunc.WriteDWORD(data, value)
|
data = CommFunc.WriteBYTE(data, dType)
|
GameWorld.DebugLog(" key=%s, value=%s, dType=%s" % (key, value, dType))
|
|
return data
|
|
def __ReadSyncPlayerDictData(curPlayer, pdata, pos):
|
## ¶Áȡͬ²½µÄÍæ¼Ò×Öµä
|
pdata = base64.b64decode(pdata)
|
count, pos = CommFunc.ReadWORD(pdata, pos)
|
GameWorld.DebugLog("±ä¸üµÄÍæ¼Ò×Öµä¸öÊý: %s" % count)
|
for _ in xrange(count):
|
keyLen, pos = CommFunc.ReadBYTE(pdata, pos)
|
key, pos = CommFunc.ReadString(pdata, pos, keyLen)
|
value, pos = CommFunc.ReadDWORD(pdata, pos)
|
dType, pos = CommFunc.ReadBYTE(pdata, pos)
|
PlayerControl.NomalDictSetProperty(curPlayer, key, value, dType)
|
GameWorld.DebugLog(" key=%s, value=%s, dType=%s" % (key, value, dType))
|
|
return pos
|
|
|
|
|
|