#!/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