| | |
| | | import IPY_GameObj
|
| | | import CrossMsg
|
| | | import ChConfig
|
| | | import CommFunc
|
| | |
|
| | | class CrossPlayerObj():
|
| | | ## 跨服在线玩家实例,不入库,由游戏服玩家登录同步,当做以前GameServer的Player处理,跨服及游戏服本服通用,方便统一逻辑
|
| | |
| | | self.SetServerID(curCache.GetServerID())
|
| | | self.SetMainServerID(fromServerID)
|
| | | self.SetRealmLV(curCache.GetRealmLV())
|
| | | # familyID 由公会模块管理
|
| | | self.SetFamilyID(curCache.GetFamilyID())
|
| | | return
|
| | |
|
| | | def GetPlayer(self): return self.__curPlayer
|
| | |
| | | def DeletePlayer(self, playerID):
|
| | | self.__crossPlayerDict.pop(playerID, None)
|
| | | return
|
| | | |
| | | def GetPlayerIDList(self): return self.__crossPlayerDict.keys()
|
| | |
|
| | | def GetCrossPlayerMgr():
|
| | | mgr = PyGameData.g_crossPlayerMgr
|
| | |
| | | SendFakePackToPlayerList(crossPlayerList, clientPack)
|
| | | return
|
| | |
|
| | | def SendFackPackToServerList(clientPack, serverIDList):
|
| | | ## 给服务器范围的在线玩家发送封包
|
| | | toCrossPlayerList = []
|
| | | crossPlayerMgr = GetCrossPlayerMgr()
|
| | | playerIDList = crossPlayerMgr.GetPlayerIDList()
|
| | | for playerID in playerIDList:
|
| | | crossPlayer = crossPlayerMgr.FindCrossPlayer(playerID)
|
| | | mainServerID = crossPlayer.GetMainServerID()
|
| | | if not GameWorld.CheckServerIDInList(mainServerID, serverIDList):
|
| | | continue
|
| | | curPlayer = crossPlayer.GetPlayer()
|
| | | if curPlayer: # 有玩家,一般只有游戏服有,可视为游戏服在线,直接发送
|
| | | curPlayer.SendFakePack(clientPack.GetBuffer(), clientPack.GetLength())
|
| | | continue
|
| | | toCrossPlayerList.append(crossPlayer)
|
| | | SendFakePackToPlayerList(toCrossPlayerList, clientPack)
|
| | | return
|
| | |
|
| | | def SendFakePackToPlayerList(crossPlayerList, clientPack):
|
| | | '''给crossPlayer玩家发送封包,适用于接受的玩家封包数据一致的,跨服、游戏服通用
|
| | | '''
|
| | |
| | | if not crossServerPlayerDict:
|
| | | return
|
| | |
|
| | | packBuff, packLen = clientPack.GetBuffer(), clientPack.GetLength()
|
| | | packBuff, packLen, packHead = clientPack.GetBuffer(), clientPack.GetLength(), CommFunc.GetPackHead(clientPack)
|
| | | for mainServerID, playerIDList in crossServerPlayerDict.items():
|
| | | dataMsg = {"playerIDList":playerIDList, "packBuff":packBuff, "packLen":packLen}
|
| | | dataMsg = {"playerIDList":playerIDList, "packBuff":packBuff, "packLen":packLen, "packHead":packHead}
|
| | | playerID = playerIDList[0]
|
| | | CrossMsg.SendToClientServer(ShareDefine.C2S_SendFakePack, dataMsg, [mainServerID], playerID)
|
| | |
|
| | |
| | |
|
| | | playerID = crossPlayer.GetPlayerID()
|
| | | packBuff, packLen = clientPack.GetBuffer(), clientPack.GetLength()
|
| | | dataMsg = {"playerIDList":[playerID], "packBuff":packBuff, "packLen":packLen}
|
| | | dataMsg = {"playerIDList":[playerID], "packBuff":packBuff, "packLen":packLen, "packHead":CommFunc.GetPackHead(clientPack)}
|
| | | CrossMsg.SendToClientServer(ShareDefine.C2S_SendFakePack, dataMsg, [mainServerID], playerID)
|
| | | return
|
| | |
|
| | | def SendFakePackByID(playerID, clientPack, fromServerID=0):
|
| | | if not clientPack:
|
| | | return
|
| | | packBuff, packLen = clientPack.GetBuffer(), clientPack.GetLength()
|
| | | dataMsg = {"playerIDList":[playerID], "packBuff":packBuff, "packLen":packLen, "packHead":CommFunc.GetPackHead(clientPack)}
|
| | | CrossMsg.SendToClientServer(ShareDefine.C2S_SendFakePack, dataMsg, [fromServerID], playerID)
|
| | | CrossMsg.SendToServer(ShareDefine.C2S_SendFakePack, dataMsg, [fromServerID], ShareDefine.dirType_All, playerID)
|
| | | return
|
| | |
|
| | | def C2S_SendFakePack(dataMsg):
|
| | |
| | | #本游戏服又没有玩家的不处理
|
| | | return
|
| | | playerID = crossPlayer.GetPlayerID()
|
| | | dataMsg = {"msgMark":msgMark, "msgParamList":msgParamList}
|
| | | dataMsg = {"playerIDList":[playerID], "msgMark":msgMark, "msgParamList":msgParamList}
|
| | | CrossMsg.SendToClientServer(ShareDefine.C2S_NotifyCode, dataMsg, [mainServerID], playerID)
|
| | | return
|
| | |
|
| | | def C2S_NotifyCode(dataMsg, playerID):
|
| | | def SendToFamilyPlayer(familyID, msgType, dataMsg, excludeIDList=[], onlyIDList=[], havePlayerCall=None):
|
| | | ## 发送给某个公会所有在线游戏服成员,跨服游戏服通用
|
| | | # @param havePlayerCall: 有curPlayer时回调函数,一般是游戏服时有,直接本服执行 func(curPlayer, familyID, dataMsg)
|
| | | family = DBDataMgr.GetFamilyMgr().FindFamily(familyID)
|
| | | if not family:
|
| | | return
|
| | | |
| | | curServerID = GameWorld.GetGameWorld().GetServerID()
|
| | | crossServerPlayerDict = {}
|
| | | crossPlayerMgr = GetCrossPlayerMgr()
|
| | | for index in range(family.GetCount()):
|
| | | member = family.GetAt(index)
|
| | | playerID = member.GetPlayerID()
|
| | | if onlyIDList and playerID not in onlyIDList:
|
| | | continue
|
| | | if excludeIDList and playerID in excludeIDList:
|
| | | continue
|
| | | crossPlayer = crossPlayerMgr.FindCrossPlayer(playerID)
|
| | | if not crossPlayer:
|
| | | # 不在线
|
| | | continue
|
| | | curPlayer = crossPlayer.GetPlayer()
|
| | | if curPlayer: # 有玩家,一般只有游戏服有,可视为游戏服在线,直接发送
|
| | | if havePlayerCall:
|
| | | havePlayerCall(curPlayer, familyID, dataMsg)
|
| | | continue
|
| | | mainServerID = crossPlayer.GetMainServerID()
|
| | | if mainServerID == curServerID:
|
| | | #本游戏服又没有玩家的不处理
|
| | | continue
|
| | | if mainServerID not in crossServerPlayerDict:
|
| | | crossServerPlayerDict[mainServerID] = []
|
| | | playerIDList = crossServerPlayerDict[mainServerID]
|
| | | if playerID not in playerIDList:
|
| | | playerIDList.append(playerID)
|
| | | |
| | | for mainServerID, playerIDList in crossServerPlayerDict.items():
|
| | | sendDataMsg = {"playerIDList":playerIDList, "familyID":familyID}
|
| | | sendDataMsg.update(dataMsg)
|
| | | CrossMsg.SendToClientServer(msgType, sendDataMsg, [mainServerID])
|
| | | return
|
| | |
|
| | | def FamilyNotify(familyID, msgMark, msgParamList=[], excludeIDList=[]):
|
| | | family = DBDataMgr.GetFamilyMgr().FindFamily(familyID)
|
| | | if not family:
|
| | | return
|
| | | |
| | | def havePlayerCall(curPlayer, familyID, dataMsg):
|
| | | PlayerControl.NotifyCode(curPlayer, dataMsg["msgMark"], dataMsg["msgParamList"])
|
| | | return
|
| | | |
| | | dataMsg = {"msgMark":msgMark, "msgParamList":msgParamList}
|
| | | SendToFamilyPlayer(familyID, ShareDefine.C2S_NotifyCode, dataMsg, excludeIDList, havePlayerCall=havePlayerCall)
|
| | | return
|
| | |
|
| | | def C2S_NotifyCode(dataMsg):
|
| | | msgMark = dataMsg["msgMark"]
|
| | | msgParamList = dataMsg["msgParamList"]
|
| | | curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(playerID)
|
| | | if curPlayer:
|
| | | playerIDList = dataMsg["playerIDList"]
|
| | | |
| | | playerManager = GameWorld.GetPlayerManager()
|
| | | for playerID in playerIDList:
|
| | | curPlayer = playerManager.FindPlayerByID(playerID)
|
| | | if curPlayer == None:
|
| | | continue
|
| | | PlayerControl.NotifyCode(curPlayer, msgMark, msgParamList)
|
| | | |
| | | return
|
| | |
|
| | | def OnPlayerLogin(curPlayer):
|
| | |
| | |
|
| | | return
|
| | |
|
| | | def GivePlayerResources(crossPlayer, awardItemList=None, moneyDict=None, eventName="", drDict=None):
|
| | | def GivePlayerResources(crossPlayer, awardItemList=None, moneyDict=None, eventName="", drDict=None, isNotifyAward=True):
|
| | | '''给玩家资源
|
| | | @param awardItemList: 给物品列表 [[itemID,itemCnt], ...]
|
| | | @param moneyDict: 给货币 {货币类型:消耗值, ...}
|
| | |
| | | dataMsg["moneyDict"] = moneyDict
|
| | | if drDict:
|
| | | dataMsg["drDict"] = drDict
|
| | | if not isNotifyAward:
|
| | | dataMsg["isNotifyAward"] = isNotifyAward
|
| | |
|
| | | playerID = crossPlayer.GetPlayerID()
|
| | | curPlayer = crossPlayer.GetPlayer()
|
| | |
| | | awardItemList = eventData.get("awardItemList", [])
|
| | | moneyDict = eventData.get("moneyDict", {})
|
| | | drDict = eventData.get("drDict", {})
|
| | | isNotifyAward = eventData.get("isNotifyAward", True)
|
| | |
|
| | | GameWorld.DebugLog("awardItemList=%s" % awardItemList)
|
| | | if awardItemList:
|
| | |
| | | for moneyType, moneyValue in moneyDict.items():
|
| | | PlayerControl.GiveMoney(curPlayer, moneyType, moneyValue, eventName, moneyRDict)
|
| | |
|
| | | ItemControler.NotifyGiveAwardInfo(curPlayer, awardItemList, eventName, moneyInfo=moneyDict)
|
| | | if isNotifyAward:
|
| | | ItemControler.NotifyGiveAwardInfo(curPlayer, awardItemList, eventName, moneyInfo=moneyDict)
|
| | | return
|
| | |
|
| | | def SetPlayerNomalDict(crossPlayer, setDict, isDayReset=False):
|
| | |
| | | if resetType != "":
|
| | | centerEventValue = eventData.get("centerEventValue", 0)
|
| | | playerEventValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_OnCrossEvent)
|
| | | centerEventTime = GameWorld.ChangeStrToDatetime("%s:%02d:%02d" % centerEventValue, ChConfig.TYPE_Time_Format_YmdHMS)
|
| | | playerEventTime = GameWorld.ChangeStrToDatetime("%s:%02d:%02d" % playerEventValue, ChConfig.TYPE_Time_Format_YmdHMS)
|
| | | centerEventTime = GameWorld.ChangeStrToDatetime("%s" % centerEventValue, ChConfig.TYPE_Time_Format_YmdH)
|
| | | playerEventTime = GameWorld.ChangeStrToDatetime("%s" % playerEventValue, ChConfig.TYPE_Time_Format_YmdH)
|
| | |
|
| | | center_Day = centerEventTime.day
|
| | | center_Month = centerEventTime.month
|