#!/usr/bin/python # -*- coding: GBK -*- #--------------------------------------------------------------------- # #--------------------------------------------------------------------- ##@package PlayerFamily #¼Ò×åÂß¼­´¦Àí # # @author eggxp # @date 2010-4-23 # @version 1.0 # #--------------------------------------------------------------------- #"""Version = 2017-07-12 21:00""" #--------------------------------------------------------------------- import FBLogic import ChConfig import GameWorld import ShareDefine import PlayerControl import NetPackCommon import PlayerViewCache import ChPyNetSendPack import PlayerFamilyEmblem import PlayerFamilyZhenbaoge import PlayerFamilyTaofa import IPY_PlayerDefine import IpyGameDataPY import IPY_GameWorld import PlayerMail import PlayerTask import CrossPlayer import PlayerTalk import DirtyList import DBDataMgr import DBFamily import CrossMsg import CrossMgr import random import time #ÉêÇë¡¢ÉóºË¡¢Í˳ö¡¢ÌßÈË¡¢¾èÏס¢Éý¼¶ Def_CreatFamily_MaxStr = 33 #¹«»áȨÏÞ ( FamilyPowerID_Call, #ÕÐÈË 1 FamilyPowerID_ChangeFmlv, #±ä¸üְλ 2 FamilyPowerID_Broadcast, #·¢²¼¹«¸æ 3 FamilyPowerID_Kick, #ÌßÈË 4 ) = range(1, 1 + 4) #¹«»áְλ¶ÔÓ¦ÈËÊýÉèÖÃÊôÐÔÃû Def_FmlSetAttrName = { IPY_PlayerDefine.fmlMember:"MemberMax", IPY_PlayerDefine.fmlCounsellor:"EliteMax", IPY_PlayerDefine.fmlViceLeader:"DeputyLeaderMax", } def GetRenameTime(family): return family.GetExtra1() def SetRenameTime(family, renameTime): return family.SetExtra1(renameTime) def OnMinute(): #Õ½Á¦Ë¢ÐÂÔÚDBFamily.OnMinute if GameWorld.IsCrossServer(): pass elif not GameWorld.IsMainServer() or DBFamily.IsFamilyCross(): return PlayerFamilyEmblem.CheckExpireEmblem() return def FamilyCrossCenterOnHour(): if GameWorld.IsCrossServer(): __doFamilyOnHour() return def FamilyOnHour(): if not GameWorld.IsMainServer() or DBFamily.IsFamilyCross(): GameWorld.DebugLog("·ÇÓÎÏ··þ»ò±¾·þÒÑ¿ç·þ»¥Í¨Á˲»´¦Àí FamilyOnHour") return __doFamilyOnHour() return def __doFamilyOnHour(): familyManager = DBDataMgr.GetFamilyMgr() for zoneID in familyManager.GetZoneIDListThisServer(): zoneMgr = familyManager.GetZoneFamilyMgr(zoneID) for i in range(0, zoneMgr.GetCount()): family = zoneMgr.GetAt(i) #×Ô¶¯´«Î» __AutoChangeLeader(family) return def FamilyCrossCenterOnDay(): if GameWorld.IsCrossServer(): __doFamilyOnDay() return def FamilyOnDay(): ## ±¾·þʱ¼ä×Ô¼º´¥·¢µÄondayÂß¼­ if not GameWorld.IsMainServer() or DBFamily.IsFamilyCross(): GameWorld.DebugLog("·ÇÓÎÏ··þ»ò±¾·þÒÑ¿ç·þ»¥Í¨Á˲»´¦Àí FamilyOnDay") return __doFamilyOnDay() DBFamily.CheckCrossFamilyTransData() return def __doFamilyOnDay(): familyManager = DBDataMgr.GetFamilyMgr() for zoneID in familyManager.GetZoneIDListThisServer(): zoneMgr = familyManager.GetZoneFamilyMgr(zoneID) for i in range(0, zoneMgr.GetCount()): family = zoneMgr.GetAt(i) familyID = family.GetID() PlayerFamilyZhenbaoge.OnDay(family) PlayerFamilyTaofa.OnDay(family) for index in xrange(family.GetCount()): member = family.GetAt(index) # ÖØÖóÉÔ±ÈÕÐÅÏ¢ member.SetContribDay(0) member.SetDonateCntDay(0) Broadcast_FamilyInfo(familyID) # onday return def PlayerCrossCenterOnDay(curPlayer): ## ´¦Àí¿ç·þÖÐÐÄͬ²½µÄondayÍæ¼Òʼþ if not DBFamily.IsFamilyCross(): GameWorld.DebugLog("¹«»á»¹ÊôÓÚ±¾·þ£¬²»´¦Àí³ÉÔ±¿ç·þ¹ýÌì", curPlayer.GetPlayerID()) return __doPlayerOnDay(curPlayer) return def PlayerOnDay(curPlayer): ## ±¾·þʱ¼äµÄondayÍæ¼Òʼþ if DBFamily.IsFamilyCross(): GameWorld.DebugLog("¹«»áÒѾ­¿ç·þÁË£¬²»´¦Àí³ÉÔ±±¾·þ¹ýÌì", curPlayer.GetPlayerID()) return __doPlayerOnDay(curPlayer) return def __doPlayerOnDay(curPlayer): PlayerFamilyZhenbaoge.PlayerOnDay(curPlayer) PlayerFamilyTaofa.PlayerOnDay(curPlayer) ResetDailyDonateCnt(curPlayer) return def OnPlayerLogin(curPlayer, tick): if DBFamily.IsFamilyCross(): GameWorld.DebugLog("¹«»áÒÑ¿ç·þ²»´¦Àí£¬ÓÉËùÊô¿ç·þ·þÎñÆ÷´¦Àí³ÉÔ±µÇ¼Âß¼­ OnPlayerLogin", curPlayer.GetPlayerID()) return crossPlayer = CrossPlayer.GetCrossPlayerMgr().FindCrossPlayer(curPlayer.GetPlayerID()) OnCrossPlayerLogin(crossPlayer) return def OnCrossPlayerLogin(crossPlayer): ## Íæ¼ÒÉÏÏߣ¬ÓÎÏ··þ¿ç·þͨÓã¬Á÷³ÌÉϵ±×öÒÔǰGameServer´¦Àí¹«»áÒ»Ñù£¬´¦ÀíºóÔÙ֪ͨµØÍ¼£¨ÏÖÔÚµÄÓÎÏ··þ£© PlayerLoginRefreshFamily(crossPlayer) # ±ØÐëÏÈˢРSync_RequestAddFamilyInfo(crossPlayer, False) PlayerTalk.NotifyTalkCache(crossPlayer, [IPY_GameWorld.tcFamily]) # ¹«»áÁÄÌ컺´æ if GameWorld.IsCrossServer(): PlayerTalk.NotifyTalkCache(crossPlayer, [IPY_GameWorld.tcCountry]) # ¿ç·þ¹«»áÁÄÌ컺´æ PlayerFamilyTaofa.OnCrossPlayerLogin(crossPlayer) return def OnPlayerLogout(curPlayer): if DBFamily.IsFamilyCross(): GameWorld.DebugLog("¹«»áÒÑ¿ç·þ²»´¦Àí£¬ÓÉËùÊô¿ç·þ·þÎñÆ÷´¦Àí³ÉÔ±ÀëÏßÂß¼­ OnPlayerLogout", curPlayer.GetPlayerID()) return crossPlayer = CrossPlayer.GetCrossPlayerMgr().FindCrossPlayer(curPlayer.GetPlayerID()) OnCrossPlayerLogout(crossPlayer) return def OnCrossPlayerLogout(crossPlayer): ## Íæ¼ÒÏÂÏߣ¬ÓÎÏ··þ¿ç·þͨÓã¬Á÷³ÌÉϵ±×öÒÔǰGameServer´¦Àí¹«»áÒ»Ñù£¬´¦ÀíºóÔÙ֪ͨµØÍ¼£¨ÏÖÔÚµÄÓÎÏ··þ£© playerID = crossPlayer.GetPlayerID() familyID = crossPlayer.GetFamilyID() if not familyID: return familyMgr = DBDataMgr.GetFamilyMgr() family = familyMgr.FindFamily(familyID) if not family: return curMember = family.FindMember(playerID) if not curMember: return curMember.SetOffTime(int(time.time())) # ֪ͨ³ÉÔ±ÏÂÏß Broadcast_FamilyInfo(familyID, changeMemIDList=[playerID]) # ³ÉÔ±ÏÂÏß return def SendToFamilyMapPlayer(crossPlayer, doType, doData): playerID = crossPlayer.GetPlayerID() dataMsg = {"doType":doType, "doData":doData} if GameWorld.IsCrossServer(): CrossMsg.SendToClientServer(ShareDefine.C2S_FamilyMapPlayer, dataMsg, [crossPlayer.GetMainServerID()], playerID) else: C2S_FamilyMapPlayer(dataMsg, playerID) return def MapServer_FamilyRefresh(crossPlayer, familyID, isVoluntarily=0, isLogin=False): ''' Ï൱ÓÚGameServerµ÷Óà curPlayer.MapServer_FamilyRefresh() ''' playerID = crossPlayer.GetPlayerID() FmLV = 0 # ְλ FamilyLV = 0 # ¹«»áµÈ¼¶ JoinTime = 0 FamilyName = "" EmblemID, EmblemWord = 0, "" if familyID: familyMgr = DBDataMgr.GetFamilyMgr() curFamily = familyMgr.FindFamily(familyID) if curFamily: FamilyLV = curFamily.GetLV() FamilyName = curFamily.GetName() EmblemID = curFamily.GetEmblemID() EmblemWord = curFamily.GetEmblemWord() member = curFamily.FindMember(playerID) if member: FmLV = member.GetFmLV() JoinTime = member.GetJoinTime() else: familyID = 0 crossPlayer.SetFamilyID(familyID) # ͬ²½¸üв鿴»º´æ PlayerViewCache.UpdPlayerViewFamilyInfo(playerID, familyID, FamilyName, EmblemID, EmblemWord) doData = {"FamilyID":familyID} if familyID: doData.update({"FmLV":FmLV, "JoinTime":JoinTime, "FamilyLV":FamilyLV, "FamilyName":FamilyName, "EmblemID":EmblemID, "EmblemWord":EmblemWord}) if isVoluntarily: doData["isVoluntarily"] = 1 if isLogin: doData["isLogin"] = 1 SendToFamilyMapPlayer(crossPlayer, "FamilyRefresh", doData) return def PlayerLoginRefreshFamily(crossPlayer): ## Íæ¼ÒµÇ¼ʱˢмÒ×å playerID = crossPlayer.GetPlayerID() familyMgr = DBDataMgr.GetFamilyMgr() refreshFamilyID = familyMgr.GetPlayerFamilyID(playerID) GameWorld.DebugLog("PlayerLoginRefreshFamily playerID=%s,refreshFamilyID=%s" % (playerID, refreshFamilyID)) crossPlayer.SetFamilyID(refreshFamilyID) MapServer_FamilyRefresh(crossPlayer, refreshFamilyID, isLogin=True) # µÇ¼ familyID = refreshFamilyID if not familyID: return family = familyMgr.FindFamily(familyID) if not family: return curMember = family.FindMember(playerID) if not curMember: return curMember.SetOffTime(0) # ÔÚÏß0£¬ÍÑ»ú1£¬>1ÀëÏßʱ¼ä curMember.RefreshMemberByID(playerID) Sync_FamilyInfo(crossPlayer) # ¸ø×Ô¼ºÍ¬²½ÍêÕûµÄ # ¹ã²¥³ÉÔ±ÔÚÏß Broadcast_FamilyInfo(familyID, changeMemIDList=[playerID], excludeIDList=[playerID]) # ³ÉÔ±µÇ¼ #֪ͨÕÐÈË if GetFamilyMemberHasPow(curMember, FamilyPowerID_Call): CrossPlayer.SendFakePack(crossPlayer, GetPack_FamilyReqJoinInfo(familyID)) # ÃËÖ÷ÉÏÏß´¦Àí #if curMember.GetFmLV() == IPY_PlayerDefine.fmlLeader: # OnFamilyLeaderLogin(curPlayer) return def RefreshFamilyMember(crossPlayer): ## Íæ¼Ò³ÉÔ±Ïà¹ØÊôÐÔ±ä¸üʱͬ²½¸üмÒ×å³ÉÔ±ÐÅÏ¢ if GameWorld.IsCrossServer(): pass elif not GameWorld.IsMainServer() or DBFamily.IsFamilyCross(): return familyID = crossPlayer.GetFamilyID() if not familyID: return familyMgr = DBDataMgr.GetFamilyMgr() family = familyMgr.FindFamily(familyID) if not family: return playerID = crossPlayer.GetPlayerID() member = family.FindMember(playerID) if not member: return member.RefreshMemberByID(playerID) Broadcast_FamilyInfo(familyID, changeMemIDList=[playerID], excludeIDList=[playerID]) # ³ÉÔ±ÐÅÏ¢±ä¸ü return def FamilyPyPackForwarding(curPlayer, clientData, tick, funcName, needResult=False, reqCD=0.5, reqDataEx=None): ## Íæ¼ÒÇëÇ󹫻ṦÄܰüת·¢´¦Àí # @needResult: ת·¢¿ç·þ´¦ÀíÍê±ÏÊÇ·ñÐèÒª»Ø¸´×´Ì¬£¬Ò»°ãÓÐÏûºÄ»õ±Ò¡¢ÎïÆ·Ïà¹ØµÄ¶¼Òª»Ø¸´£¬ÇÒÉèÖÃÒ»¸ö½Ï³¤ÇëÇócd£¬·ÀÖ¹ÖØ¸´´¦Àí # @param reqCD: ת·¢¿ç·þÇëÇócd£¬Ã룬֧³ÖСÊý playerID = curPlayer.GetPlayerID() crossServerID = DBDataMgr.GetFamilyMgr().GetCurCrossServerID() if crossServerID == -2: PlayerControl.NotifyCode(curPlayer, "FamilyInTransData") return if crossServerID < 0: GameWorld.ErrLog("¹«»á¹¦ÄÜÒì³£! crossServerID=%s" % crossServerID) return # ±¾·þ´¦Àí if crossServerID == 0 or crossServerID == GameWorld.GetGameWorld().GetServerID(): isOK = CallPyPackFunc(playerID, clientData, funcName, reqDataEx=reqDataEx) if needResult: __doFamilyPyPackRet(curPlayer, clientData, funcName, isOK) return ssServer = CrossMgr.GetSSServerMgr().GetSSServer(crossServerID) if not ssServer or not ssServer.IsServerOpen(): PlayerControl.NotifyCode(curPlayer, "ServerNoOpen") return # ת·¢ÇëÇóCDÑéÖ¤ if reqCD: reqTick = curPlayer.GetDictByKey(funcName) # ¸ù¾Ýº¯ÊýÃûµ¥¶À´¦ÀíCD£¬·ÀÖ¹Ï໥ӰÏì if reqTick and (tick - reqTick) < reqCD * 1000: PlayerControl.NotifyCode(curPlayer, "RequestLater") return curPlayer.SetDict(funcName, tick) # ʣϵľÍÊÇ´óÓÚ0 dataMsg = {"funcName":funcName} if clientData: dataMsg["packBuff"] = clientData.GetBuffer() if reqDataEx: dataMsg["reqDataEx"] = reqDataEx if needResult: dataMsg["needResult"] = 1 CrossMsg.SendToCrossServer(ShareDefine.S2C_FamilyPyPack, dataMsg, [crossServerID], playerID) return def S2C_FamilyPyPack(dataMsg, fromServerID, playerID): funcName = dataMsg["funcName"] packBuff = dataMsg.get("packBuff") reqDataEx = dataMsg.get("reqDataEx") clientData = None if packBuff: clientData = NetPackCommon.ReadRecPyPackData(packBuff) if not clientData: return isOK = CallPyPackFunc(playerID, clientData, funcName, fromServerID, reqDataEx) # ´¦Àí½áÊø»Ø¸´£¬ÎÞÂ۳ɹ¦Óë·ñ if "needResult" in dataMsg: dataMsg.pop("needResult") dataMsg["isOK"] = isOK CrossMsg.SendToClientServer(ShareDefine.C2S_FamilyPyPackRet, dataMsg, [fromServerID], playerID) return def C2S_FamilyPyPackRet(dataMsg, playerID): curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(playerID) if not curPlayer: return funcName = dataMsg["funcName"] packBuff = dataMsg.get("packBuff") curPlayer.SetDict(funcName, 0) # ÖØÖÃCD clientData = None if packBuff: clientData = NetPackCommon.ReadRecPyPackData(packBuff) if not clientData: return isOK = dataMsg.get("isOK") __doFamilyPyPackRet(curPlayer, clientData, funcName, isOK) return def CallPyPackFunc(playerID, clientData, funcName, fromServerID=0, reqDataEx=None): crossPlayer = CrossPlayer.GetCrossPlayerMgr().FindCrossPlayer(playerID) if not crossPlayer: GameWorld.ErrLog("ÕÒ²»µ½¸ÃCrossPlayer! playerID=%s" % playerID, playerID) return callFunc = GetCallFunc(funcName) if not callFunc: GameWorld.ErrLog("¹«»á·â°ü¹¦Äܺ¯ÊýÃû²»´æÔÚ! %s" % funcName) return # Ö´Ðк¯Êý tick = GameWorld.GetGameWorld().GetTick() isOK = callFunc(crossPlayer, clientData, tick, fromServerID, reqDataEx) return isOK def __doFamilyPyPackRet(curPlayer, clientData, funcName, isOK): ## ´¦Àíºó¶îÍâ´¦Àí£¬Èç³É¾Í¡¢ÈÎÎñµÈ funcName = "%s_Ret" % funcName callFunc = GetCallFunc(funcName) if not callFunc: # ½á¹û¶îÍâ´¦Àíº¯ÊýÔÊÐí²»Ò»¶¨ÐèÒª£¬¸ù¾Ý¹¦ÄÜ×ÔÐоö¶¨ return callFunc(curPlayer, clientData, isOK) return def GetCallFunc(funcName): callFunc = None if "." in funcName: # ·Ö¸î×Ö·û´®£¬×îºóÒ»¸ö²¿·ÖÊǺ¯ÊýÃû parts = funcName.split('.') if len(parts) == 2: moduleName, func_name = parts # µ¼ÈëÄ£¿é module = __import__(moduleName) # »ñÈ¡º¯Êý if hasattr(module, func_name): func = getattr(module, func_name) if callable(func): callFunc = func else: gDict = globals() if funcName in gDict and callable(gDict[funcName]): # »ñÈ¡º¯Êý¶ÔÏó callFunc = gDict[funcName] return callFunc #// A6 04 ´´½¨¼Ò×å #tagCMCreateFamily # #struct tagCMCreateFamily #{ # tagHead Head; # char Name[33]; # WORD EmblemID; //Ñ¡Ôñ»ÕÕÂID£¬½âËø¹«»áµÈ¼¶Îª1¼¶µÄ¾ùΪ¿ÉÑ¡ID # char EmblemWord[3]; //»ÕÕÂÎÄ×Ö #}; def OnCreateFamily(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) inputName = clientData.Name GameWorld.DebugLog("OnCreateFamily: %s" % GameWorld.CodeToGbk(inputName)) # ͨÓõÄǰÖÃÑéÖ¤£¬Ö±½ÓÓÎÏ··þ´¦Àí¼´¿É if not CheckInputFamilyName(curPlayer, inputName): return needMoney = IpyGameDataPY.GetFuncCfg("CreateFamily", 1) moneyType = IpyGameDataPY.GetFuncCfg("CreateFamily", 2) if moneyType and needMoney: if not PlayerControl.HaveMoney(curPlayer, moneyType, needMoney): return FamilyPyPackForwarding(curPlayer, clientData, tick, "__OnCreateFamily", True, 20) return def __OnCreateFamily(crossPlayer, clientData, tick, fromServerID=0, reqDataEx=None): inputName = clientData.Name emblemID = clientData.EmblemID emblemWord = clientData.EmblemWord GameWorld.DebugLog("__OnCreateFamily: %s" % GameWorld.CodeToGbk(inputName)) fullFamilyName = inputName playerID = crossPlayer.GetPlayerID() playerFamilyID = crossPlayer.GetFamilyID() familyMgr = DBDataMgr.GetFamilyMgr() if playerFamilyID: curFamily = familyMgr.FindFamily(playerFamilyID) if curFamily: if curFamily.FindMember(playerID): #Íæ¼ÒÒѾ­ÓмÒ×å, ´´½¨Ê§°Ü CrossPlayer.NotifyCode(crossPlayer, "GeRen_chenxin_85890") return # ÑéÖ¤ÖØÃû if CheckFamilyNameExists(crossPlayer, fullFamilyName, fromServerID): return serverID = crossPlayer.GetServerID() curFamily = familyMgr.AddFamily(fullFamilyName, serverID) if curFamily == None: GameWorld.ErrLog("´´½¨¼Ò×åʧ°Ü", playerID) return newFamilyID = curFamily.GetID() zoneMgr = familyMgr.GetZoneFamilyMgrByFamilyID(newFamilyID) zoneID = zoneMgr.GetZoneID() if zoneMgr else -1 curFamily.SetLV(1) emblemIDList = PlayerFamilyEmblem.GetDefaultFamilyEmblemIDList() if not emblemID or emblemID not in emblemIDList: emblemID = random.choice(emblemIDList) # ´ÓĬÈÏ»ÕÕÂÖÐËæ»úÑ¡ÔñÒ»¸ö GameWorld.Log("´´½¨¹«»á: familyID=%s,playerID=%s,emblemID=%s,serverID=%s,zoneID=%s" % (newFamilyID, playerID, emblemID, serverID, zoneID)) curFamily.SetEmblemID(emblemID) curFamily.SetEmblemWord(emblemWord) # ¿Û³ýÏûºÄ needMoney = IpyGameDataPY.GetFuncCfg("CreateFamily", 1) moneyType = IpyGameDataPY.GetFuncCfg("CreateFamily", 2) if moneyType and needMoney: CrossPlayer.CostPlayerResources(crossPlayer, "CreateFamily", costMoneyDict={moneyType:needMoney}) #-ÉèÖüÒ×å³ÉÔ±ÊôÐÔ DoPlayerJionFamily(curFamily, playerID, crossPlayer, IPY_PlayerDefine.fmlLeader) if zoneMgr: zoneMgr.Sort() #XW_JZ_EstablishSud ¹§Ï²Äú£¬¼Ò×彨Á¢³É¹¦! 25 - - #CrossPlayer.NotifyCode(crossPlayer, "XW_JZ_EstablishSud") #PlayerControl.WorldNotify(0, "jiazu_liubo_671654", [curPlayer.GetName(), fullFamilyName, newFamilyID]) PlayerFamilyZhenbaoge.OnZhenbaogeReset(curFamily) return True def CheckInputFamilyName(curPlayer, inputName): '''¼ì²éÍæ¼ÒÊäÈëµÄ¹«»áÃûÊÇ·ñºÏ·¨£¬½¨ÃË¡¢¸ÄÃûͨÓà ¡¾×¢¡¿¸Ãº¯Êý½öÔÚÓÎÏ··þÑéÖ¤Ãû×ÖµÄͨÓúϷ¨ÐÔ£¬È糤¶È¡¢Ãô¸Ð´ÊµÈ£¬¹«»áÃûÖØÃûÇëÔÚ¹«»áËùÔÚÊý¾Ý·þÑéÖ¤ @return: None-²»ºÏ·¨£»·Ç¿Õ-ºÏ·¨µÄ¹«»áÈ«Ãû ''' #C++¹ýÂ˿ոñ familyName = GameWorld.GetGameWorld().GetCharTrim(inputName) serverID = GameWorld.GetPlayerServerID(curPlayer) maxServerID = IpyGameDataPY.GetFuncCfg("FamilyNameFormat", 3) if serverID > maxServerID or serverID <= 0: GameWorld.ErrLog("¹«»áÈ«Ãû serverID=%s error! maxServerID=%s, check FamilyNameFormat.txt" % (serverID, maxServerID)) return maxLen = IpyGameDataPY.GetFuncCfg("FamilyNameFormat", 2) if len(familyName) > maxLen: GameWorld.ErrLog("¹«»áÈ«Ãû familyName=%s, len=%s > %s, check FamilyNameFormat.txt" % (familyName, len(familyName), maxLen)) PlayerControl.NotifyCode(curPlayer, "NameLenLimit", [maxLen / 3, maxLen]) return if DirtyList.IsWordForbidden(familyName): #XW_JZ_Family_NameNoLegality ¶Ô²»Æð,¼Ò×åÃû³ÆÖк¬ÓзǷ¨×Ö·û PlayerControl.NotifyCode(curPlayer, "NameSensitive") return if len(familyName) <= 0 or len(familyName) > Def_CreatFamily_MaxStr: PlayerControl.NotifyCode(curPlayer, "NameLenLimit", [Def_CreatFamily_MaxStr / 3, Def_CreatFamily_MaxStr]) return return True def CheckFamilyNameExists(crossPlayer, familyName, fromServerID=0): ## ÖØÃûÔÚÊý¾ÝËùÔÚ·þÎñÆ÷ÑéÖ¤ familyMgr = DBDataMgr.GetFamilyMgr() zoneID = familyMgr.GetZoneIDInThisServer(fromServerID) if zoneID < 0: GameWorld.ErrLog("ÑéÖ¤¹«»áÖØÃûʱ·ÖÇøÒì³£Ò²ÊÓÎªÖØÃû") return True zoneMgr = familyMgr.GetZoneFamilyMgr(zoneID) # ²»Í¬·ÖÇøÔÝʱÔÊÐíÖØÃû if zoneMgr.FindFamilyByName(familyName): #XW_JZ_EstablishErr_Name ¶Ô²»Æð£¬ÄúÊäÈëµÄ¼Ò×åÃûÒÑ´æÔÚ£¬½¨Á¢¼Ò×åʧ°Ü£¡ 25 - - CrossPlayer.NotifyCode(crossPlayer, "NameExists") return True return False def DoPlayerJionFamily(family, playerID, crossPlayer, jionFamilySetLv=IPY_PlayerDefine.fmlMember, broadcastFamilyChange=True): '''¼ÓÈë¼Ò×壬֧³ÖÀëÏßÍæ¼Ò¼ÓÈë @param crossPlayer: Èç¹ûÊÇÀëÏßÍæ¼ÒÔòΪNone ''' familyMgr = DBDataMgr.GetFamilyMgr() if isinstance(family, int): familyID = family curFamily = familyMgr.FindFamily(familyID) else: curFamily = family if not curFamily: return familyID = curFamily.GetID() member = curFamily.AddMember(playerID) member.SetFmLV(jionFamilySetLv) member.RefreshMemberByID(playerID) if jionFamilySetLv == IPY_PlayerDefine.fmlLeader: curFamily.SetLeaderID(playerID) if broadcastFamilyChange: # ¹ã²¥ÆäËûÔÚÏß³ÉÔ± Broadcast_FamilyInfo(familyID, changeMemIDList=[playerID], excludeIDList=[playerID]) # ³ÉÔ±¼ÓÈë familyMgr.DelPlayerReqJoinFamilyIDAll(playerID) #ÉèÖÃÍæ¼ÒÉíÉϱ£´æµÄ¼Ò×åÐÅÏ¢ if crossPlayer: MapServer_FamilyRefresh(crossPlayer, familyID) # ¼ÓÈë Sync_FamilyInfo(crossPlayer) # ¸ø×Ô¼ºÍ¬²½ÍêÕûµÄ Sync_RequestAddFamilyInfo(crossPlayer) PlayerFamilyTaofa.OnCrossPlayerEnterFamily(crossPlayer) if jionFamilySetLv != IPY_PlayerDefine.fmlLeader: #֪ͨËùÓмÒ×å³ÉÔ±, Õâ¸öÈ˼ÓÈëÁ˼Ò×å CrossPlayer.FamilyNotify(familyID, "XW_JZ_EnterFamily", [member.GetPlayerName()], excludeIDList=[playerID]) #if jionPlayer: # PlayerControl.NotifyCode(jionPlayer, 'XW_JZ_EnterFamilyInfo', [family.GetName()]) #¼Ç¼¼ÓÈëʼþ tick = GameWorld.GetGameWorld().GetTick() AddFamilyActionNote(member.GetPlayerName(), familyID, ShareDefine.Def_ActionType_FamilyEvent, [ShareDefine.Def_FamilyActionEvent_MemberChange, ShareDefine.Def_FamilyMemberChange_Join, jionFamilySetLv, 0], tick) return def AddFamilyActionNote(curName, familyID, actionType, actionDataList, tick, isClearNone=True, useData=""): '''ͳһÌí¼Ó¼Ò×åActionÊý¾Ý ''' if actionType not in ShareDefine.Def_ActionTypeList: #¼Ç¼ÐÐΪÀàÐÍ´íÎó GameWorld.ErrLog("¼Ç¼¼Ò×åÐÐΪÀàÐÍ:%s ´íÎó") return False familyAction = DBDataMgr.GetFamilyActionMgr().GetFamilyAction(familyID, actionType) actionData = familyAction.AddAction() if not actionData: return False #---ÉèÖÃÐÐΪ¶ÔÏóÊý¾Ý--- actionData.SetName(curName) # ÉèÖÃÃû×Ö actionData.SetUserData(useData) # ÉèÖÃ×Ô¶¨ÒåÊý¾Ý for num, value in enumerate(actionDataList, 1): setFunc = getattr(actionData, "SetValue%s" % num) if setFunc: setFunc(value) return True def GetFamilyMemberHasPow(member, powerID): ## ¹«»á³ÉÔ±ÊÇ·ñÓиÃȨÏÞ powerDict = IpyGameDataPY.GetFuncEvalCfg("FamilyPower", 1, {}) if str(powerID) not in powerDict: return False needMemberLV = powerDict[str(powerID)] return member.GetFmLV() >= needMemberLV def Sync_FamilyInfo(crossPlayer, syncMemIDList=None, isSyncMem=True): ## ָ֪ͨ¶¨Íæ¼Ò // A5 20 Íæ¼Ò¼Ò×åÐÅÏ¢ #tagMCRoleFamilyInfo familyID = crossPlayer.GetFamilyID() if not familyID: return clientPack = GetPack_FamilyInfo(familyID, syncMemIDList, isSyncMem) CrossPlayer.SendFakePack(crossPlayer, clientPack) return def Broadcast_FamilyInfo(familyID, changeMemIDList=None, isSyncMem=True, excludeIDList=None): ## ¹ã²¥¸ø¹«»á³ÉÔ± // A5 20 Íæ¼Ò¼Ò×åÐÅÏ¢ #tagMCRoleFamilyInfo # @param changeMemIDList: Ö¸¶¨½ö֪ͨÄÄЩ±ä»¯³ÉÔ±ÐÅÏ¢£¬²îÒì¸üÐÂ֪ͨ # @param isSyncMem: ÊÇ·ñÐèҪ֪ͨ³ÉÔ±ÐÅÏ¢ clientPack = GetPack_FamilyInfo(familyID, changeMemIDList, isSyncMem) CrossPlayer.SendFakePackByFamily(familyID, clientPack, excludeIDList) return def GetPack_FamilyInfo(familyID, changeMemIDList=None, isSyncMem=True): familyMgr = DBDataMgr.GetFamilyMgr() curFamily = familyMgr.FindFamily(familyID) if not curFamily: return clientPack = ChPyNetSendPack.tagMCRoleFamilyInfo() clientPack.FamilyID = familyID clientPack.FamilyName = curFamily.GetName() clientPack.FamilyLV = curFamily.GetLV() clientPack.FamilyLVExp = curFamily.GetExp() clientPack.JoinReview = curFamily.GetJoinReview() clientPack.JoinLVMin = curFamily.GetJoinLVMin() clientPack.ServerID = curFamily.GetServerID() clientPack.EmblemID = curFamily.GetEmblemID() clientPack.EmblemWord = curFamily.GetEmblemWord() clientPack.FightPower = curFamily.GetFightPower() clientPack.FightPowerEx = curFamily.GetFightPowerEx() clientPack.Broadcast = curFamily.GetBroadcast() clientPack.BroadcastLen = len(clientPack.Broadcast) clientPack.LeaderID = curFamily.GetLeaderID() clientPack.MemberList = [] # --------------- # ²âÊÔÓã¬Í¬²½È«²¿£¬µÈǰ¶Ëͬ²½Ð޸ĺóɾ³ý #isSyncMem = True #changeMemIDList = [] # --------------- if isSyncMem: for index in xrange(curFamily.GetCount()): member = curFamily.GetAt(index) memID = member.GetPlayerID() if changeMemIDList and memID not in changeMemIDList: continue memInfo = ChPyNetSendPack.tagMCRoleFamilyMember() memInfo.PlayerID = member.GetPlayerID() memInfo.JoinTime = member.GetJoinTime() memInfo.Name = member.GetPlayerName() memInfo.NameLen = len(memInfo.Name) memInfo.LV = member.GetLV() memInfo.Job = member.GetJob() memInfo.RealmLV = member.GetRealmLV() memInfo.Face = member.GetFace() memInfo.FacePic = member.GetFacePic() memInfo.TitleID = member.GetTitleID() memInfo.FightPower = member.GetFightPower() memInfo.FightPowerEx = member.GetFightPowerEx() memInfo.FmLV = member.GetFmLV() memInfo.ServerID = member.GetServerID() memInfo.ContribTotal = member.GetContribTotal() memInfo.ContribDay = member.GetContribDay() memInfo.DonateCntTotal = member.GetDonateCntTotal() memInfo.DonateCntDay = member.GetDonateCntDay() memInfo.OffTime = member.GetOffTime() clientPack.MemberList.append(memInfo) clientPack.MemberCount = len(clientPack.MemberList) clientPack.Extra1 = curFamily.GetExtra1() return clientPack def GetPack_FamilyDel(delPlayerID, playerName, delType=0): # @param delType: 0-Ìß³ö£»1-Ö÷¶¯Í˳ö clientPack = ChPyNetSendPack.tagSCFamilyMemDel() clientPack.Type = delType clientPack.PlayerID = delPlayerID clientPack.Name = playerName clientPack.NameLen = len(clientPack.Name) return clientPack #// A6 01 ÏòÍæ¼ÒÉêÇë¼ÓÈë¼Ò×å #tagCMRequestJoinFamilyByPlayer # #struct tagCMRequestJoinFamilyByPlayer #{ # tagHead Head; # DWORD TagPlayerID; //Ä¿±ê¼Ò×åÍæ¼ÒID #}; def OnRequestJoinFamilyByPlayer(index, clientData, tick): #ÆÁ±Î£¬Ä¬ÈÏֻʹÓà A6 02 #curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) #tagPlayerID = clientData.TagPlayerID #tagPlayer = GameWorld.GetPlayerManager().FindPlayerByID(tagPlayerID) #if not tagPlayer: # GameWorld.DebugLog("¶Ô·½²»ÔÚÏß! tagPlayerID=%s" % tagPlayerID) # return #tagFamilyID = tagPlayer.GetFamilyID() #if tagFamilyID <= 0: # GameWorld.DebugLog("¶Ô·½Ã»ÓмÒ×å! tagPlayerID=%s" % tagPlayerID) # return #RequestJoinTagFamily(curPlayer, tagFamilyID) return #// A6 02 ÉêÇë¼ÓÈë¼Ò×å#tagCMRequesJoinFamily # #struct tagCMRequesJoinFamily #{ # tagHead Head; # BYTE Type; //ÉêÇëÀàÐÍ£¬0-ÉêÇ룻1-³·Ïú # DWORD TagFamilyID; //Ä¿±ê¼Ò×åID£¬ÉêÇëʱΪ0´ú±íÒ»¼üÉêÇë¼Ò×åÈÎÒâ¼Ò×å #}; def OnRequesJoinFamily(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) requestType = clientData.Type if requestType == 0: if CheckInJoinCD(curPlayer): return FamilyPyPackForwarding(curPlayer, clientData, tick, "__OnRequesJoinFamily", True) return def __OnRequesJoinFamily(crossPlayer, clientData, tick, fromServerID=0, reqDataEx=None): tagFamilyID = clientData.TagFamilyID # ÉêÇë½øÈëµÄ¼Ò×åID requestType = clientData.Type # ÉêÇëÀàÐÍ(ÉêÇë/³·Ïú) GameWorld.DebugLog("__OnRequesJoinFamily: tagFamilyID=%s,requestType=%s" % (tagFamilyID, requestType)) # ÉêÇë¼ÓÈë if requestType == 0: if not tagFamilyID: AutoJoinFamily(crossPlayer) else: RequestJoinTagFamily(crossPlayer, tagFamilyID) # ³·ÏúÉêÇë elif requestType == 1: CancelJoinTagFamily(crossPlayer, tagFamilyID) return True def __OnRequesJoinFamily_Ret(curPlayer, clientData, isOK): requestType = clientData.Type # ÉêÇëÀàÐÍ(ÉêÇë/³·Ïú) # ÉêÇë¼ÓÈë if requestType == 0: PlayerTask.AddTaskValue(curPlayer, ChConfig.TaskType_ReqOrJoinFamily, 1) return def CheckInJoinCD(curPlayer): ## ¼ì²éÊÇ·ñ¼ÓÈ빫»áCDÖÐ leaveFamilyTime = PlayerControl.GetLeaveFamilyTimeEx(curPlayer) if not leaveFamilyTime: return False leaveCnt, kickedCnt, lastVoluntarily = PlayerControl.GetLeaveFamilyInfo(curPlayer) joinCDMinute = 0 if lastVoluntarily: if leaveCnt <= 0: return False joinCDMinuteList = IpyGameDataPY.GetFuncEvalCfg("FamilyLeave", 1) if joinCDMinuteList: joinCDMinute = joinCDMinuteList[leaveCnt - 1] if len(joinCDMinuteList) >= leaveCnt else joinCDMinuteList[-1] else: if kickedCnt <= 0: return False joinCDMinuteList = IpyGameDataPY.GetFuncEvalCfg("FamilyLeave", 2) if joinCDMinuteList: joinCDMinute = joinCDMinuteList[kickedCnt - 1] if len(joinCDMinuteList) >= kickedCnt else joinCDMinuteList[-1] if joinCDMinute: cdTimes = joinCDMinute * 60 passTimes = int(time.time()) - leaveFamilyTime if passTimes < cdTimes: GameWorld.DebugLog("¼ÓÈ빫»áCDÖÐ: leaveCnt=%s,kickedCnt=%s,lastVoluntarily=%s,leaveFamilyTime=%s(%s),passTimes=%s < %s" % (leaveCnt, kickedCnt, lastVoluntarily, leaveFamilyTime, GameWorld.ChangeTimeNumToStr(leaveFamilyTime), passTimes, cdTimes)) return True return False def AutoJoinFamily(crossPlayer): if crossPlayer.GetFamilyID(): return playerID = crossPlayer.GetPlayerID() realmLV = crossPlayer.GetRealmLV() GameWorld.DebugLog("Íæ¼ÒÒ»¼ü×Ô¶¯¼ÓÈë¼Ò×壡 realmLV=%s" % realmLV, playerID) #if CheckInJoinCD(curPlayer): # return mainServerID = crossPlayer.GetMainServerID() familyMgr = DBDataMgr.GetFamilyMgr() zoneID = familyMgr.GetZoneIDInThisServer(mainServerID) if zoneID < 0: return zoneMgr = familyMgr.GetZoneFamilyMgr(zoneID) indexList = range(zoneMgr.GetCount()) random.shuffle(indexList) #´òÂÒ˳Ðò for index in indexList: family = zoneMgr.GetAt(index) if not family: continue #familyID = family.GetID() lvMin = family.GetJoinLVMin() if lvMin and realmLV < lvMin: #GameWorld.DebugLog(" ¹ÙÖ°²»×ãµÄ²»´¦Àí! familyID=%s,lvMin=%s" % (familyID, lvMin), playerID) continue if family.GetJoinReview(): #GameWorld.DebugLog(" ÐèÒªÉóºËµÄ²»´¦Àí! familyID=%s" % familyID, playerID) continue MemberMax = GetFamilySetting(family.GetLV(), "MemberMax") if family.GetCount() >= MemberMax: #GameWorld.DebugLog(" ³ÉÔ±ÒÑÂúµÄ²»´¦Àí! familyID=%s" % familyID, playerID) continue #Ö±½Ó¼ÓÈë DoPlayerJionFamily(family, playerID, crossPlayer) return # ¿ÉÔÙÀ©Õ¹×Ô¶¯ÇëÇó£¬ÔÝʱ²»´¦Àí GameWorld.DebugLog("ûÓпÉ×Ô¶¯½øÈëµÄ¹«»á!") CrossPlayer.NotifyCode(crossPlayer, "QuickEnterFamilyFail") return def GetFamilySetting(familyLV, fieldName): ## »ñÈ¡¹«»áµÈ¼¶±í¶ÔÓ¦×Ö¶ÎÖµ if not fieldName: return 0 ipyData = IpyGameDataPY.GetIpyGameData("Family", familyLV) if not ipyData: return 0 attrName = "Get%s" % fieldName if not hasattr(ipyData, attrName): return 0 return getattr(ipyData, attrName)() def RequestJoinTagFamily(crossPlayer, familyID): ## ÉêÇë¼ÓÈë #if CheckInJoinCD(curPlayer): # return playerID = crossPlayer.GetPlayerID() if crossPlayer.GetFamilyID(): GameWorld.DebugLog('ÒѾ­Óй«»á²»ÄÜÔÙÉêÇë¼ÓÈë! familyID=%s' % crossPlayer.GetFamilyID(), playerID) return familyMgr = DBDataMgr.GetFamilyMgr() reqFamilyIDList = familyMgr.GetPlayerReqJoinFamilyIDList(playerID) if playerID in reqFamilyIDList: GameWorld.DebugLog('ÒѾ­ÔÚÉêÇë¼ÓÈ빫»áÁбíÖÐ! familyID=%s' % familyID, playerID) return maxReqFamilyCnt = IpyGameDataPY.GetFuncCfg("FamilyReqJoin", 2) if len(reqFamilyIDList) >= maxReqFamilyCnt: GameWorld.DebugLog('ÒѾ­´ïµ½×î´óÉêÇë¼ÓÈ빫»áÊý! %s, %s' % (len(reqFamilyIDList), reqFamilyIDList), playerID) return tagFamily = familyMgr.FindFamily(familyID) if not tagFamily: return lvMin = tagFamily.GetJoinLVMin() if crossPlayer.GetRealmLV() < lvMin: GameWorld.DebugLog('¹Ùְδ´ïµ½¸Ã¹«»á¼ÓÈë×îµÍÏÞÖÆ! realmLV=%s < %s' % (crossPlayer.GetRealmLV(), lvMin), playerID) return # ÐèÒªÉóºË£¬ÂúÔ±ºó¶Ë²»ÏÞÖÆÉêÇ룬ÓÉǰ¶Ë×ÔÐоö¶¨ÊÇ·ñ¿ÉÉêÇë if tagFamily.GetJoinReview(): reqPlayerIDDict = tagFamily.GetReqJoinPlayerInfo() if playerID not in reqPlayerIDDict: maxReqPlayerCnt = IpyGameDataPY.GetFuncCfg("FamilyReqJoin", 1) if len(reqPlayerIDDict) >= maxReqPlayerCnt: GameWorld.DebugLog('Ä¿±ê¹«»áÉêÇë¼ÓÈëÊýÒÑÂú! %s, %s' % (len(reqFamilyIDList), reqFamilyIDList), playerID) CrossPlayer.NotifyCode(crossPlayer, "jiazu_pan_141056") return tagFamily.AddReqJoinPlayerID(playerID) # ¹ã²¥¸øÓÐÕÐÈËȨÏÞµÄ SendFamilyReqJoinInfo(familyID) #jiazu_pan_500807:ÉêÇëÈë°ï³É¹¦£¡ÇëµÈ´ý°ï»á¹ÜÀíÈËÔ±ÉóÅú£¡ CrossPlayer.NotifyCode(crossPlayer, "jiazu_pan_500807") Sync_RequestAddFamilyInfo(crossPlayer) return # ²»ÐèÒªÉóºË£¬×Ô¶¯¼ÓÈë memberMax = GetFamilySetting(tagFamily.GetLV(), "MemberMax") if tagFamily.GetCount() >= memberMax: GameWorld.DebugLog('Ä¿±ê¹«»á³ÉÔ±ÒÑÂú! familyLV=%s,memberMax=%s' % (tagFamily.GetLV(), memberMax), playerID) return DoPlayerJionFamily(tagFamily, playerID, crossPlayer) return def CancelJoinTagFamily(crossPlayer, familyID): # ³·ÏúÉêÇë familyMgr = DBDataMgr.GetFamilyMgr() playerID = crossPlayer.GetPlayerID() tagFamily = familyMgr.FindFamily(familyID) if tagFamily: tagFamily.DelReqJoinPlayerID(playerID) familyMgr.DelPlayerReqJoinFamilyID(playerID, familyID) SendFamilyReqJoinInfo(familyID) Sync_RequestAddFamilyInfo(crossPlayer) return def Sync_RequestAddFamilyInfo(crossPlayer, isForce=True): ## ֪ͨµ±Ç°ÉêÇë¼ÓÈëµÄÄÄЩ¼Ò×å playerID = crossPlayer.GetPlayerID() familyMgr = DBDataMgr.GetFamilyMgr() reqFamilyIDList = familyMgr.GetPlayerReqJoinFamilyIDList(playerID) # ·ÇÇ¿ÖÆÍ¨ÖªÊ±Ã»ÓÐÉêÇë¼Ç¼µÄ¿É²»Í¨Öª£¬ÈçµÇ¼ if not isForce and not reqFamilyIDList: return clientPack = ChPyNetSendPack.tagMCNotifyRequestJoinFamilyInfo() clientPack.Clear() clientPack.RequestJoinFamilyIDList = reqFamilyIDList clientPack.RequestCount = len(clientPack.RequestJoinFamilyIDList) CrossPlayer.SendFakePack(crossPlayer, clientPack) return def IsFamilyNeedViewPlayer(playerID): ## ¹«»á¹¦ÄÜÖÐ²é¿´Íæ¼ÒÊÇ·ñÐèÒªÓõ½µÄ # ¹«»á³ÉÔ±ÒÑ´æ´¢³ÉÔ±ÐÅÏ¢£¬ËùÒÔ³ÉÔ±²»ÓÃÅжϣ¬½öÅÐ¶ÏÆäËû¼´¿É # ÊÇ·ñÓÐÇëÇó¼ÓÈëij¸ö¹«»á familyMgr = DBDataMgr.GetFamilyMgr() if familyMgr.GetPlayerReqJoinFamilyIDList(playerID): return True return False def SendFamilyReqJoinInfo(familyID): ## ¹ã²¥¸ø¹«»áÓÐÕÐÈËȨÏÞµÄ CrossPlayer.SendFakePackByFamily(familyID, GetPack_FamilyReqJoinInfo(familyID), None, GetFamilyMemberHasPow, FamilyPowerID_Call) return def GetPack_FamilyReqJoinInfo(familyID): ## »ñÈ¡ // A5 22 ¼Ò×åÉêÇë¼ÓÈëµÄÍæ¼ÒÐÅÏ¢ #tagMCFamilyReqJoinInfo familyMgr = DBDataMgr.GetFamilyMgr() curFamily = familyMgr.FindFamily(familyID) if not curFamily: return reqPlayerIDDict = curFamily.GetReqJoinPlayerInfo() #ûÈËÉêÇëҲҪ֪ͨ #if not reqPlayerIDDict: # return crossPlayerMgr = CrossPlayer.GetCrossPlayerMgr() clientPack = ChPyNetSendPack.tagMCFamilyReqJoinInfo() clientPack.ReqJoinList = [] for playerID, reqTime in reqPlayerIDDict.items(): crossPlayer = crossPlayerMgr.FindCrossPlayer(playerID) reqInfo = ChPyNetSendPack.tagMCFamilyReqJoinPlayer() reqInfo.PlayerID = playerID reqInfo.ReqTime = reqTime reqInfo.IsOnLine = 1 if crossPlayer else 0 viewCache = PlayerViewCache.FindViewCache(playerID) if viewCache: reqInfo.Name = viewCache.GetPlayerName() reqInfo.NameLen = len(reqInfo.Name) reqInfo.LV = viewCache.GetLV() reqInfo.Job = viewCache.GetJob() reqInfo.RealmLV = viewCache.GetRealmLV() reqInfo.Face = viewCache.GetFace() reqInfo.FacePic = viewCache.GetFacePic() reqInfo.TitleID = viewCache.GetTitleID() reqInfo.FightPower = viewCache.GetFightPower() reqInfo.FightPowerEx = viewCache.GetFightPowerEx() reqInfo.ServerID = viewCache.GetServerID() clientPack.ReqJoinList.append(reqInfo) if len(clientPack.ReqJoinList) >= 100: break clientPack.ReqCnt = len(clientPack.ReqJoinList) return clientPack #// A6 21 ÉóºËÇëÇó¼ÓÈë¼Ò×å #tagCMJoinFamilyReply # #struct tagCMJoinFamilyReply #{ # tagHead Head; # DWORD TagPlayerID; //±»ÉóºËÍæ¼ÒID 0Ôò´ú±íÈ«²¿ # BYTE IsOK; //ÊÇ·ñͬÒâÆä¼ÓÈë #}; def OnJoinFamilyReply(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) FamilyPyPackForwarding(curPlayer, clientData, tick, "__OnJoinFamilyReply") return def __OnJoinFamilyReply(crossPlayer, clientData, tick, fromServerID=0, reqDataEx=None): tagPlayerID = clientData.TagPlayerID isOK = clientData.IsOK GameWorld.DebugLog("__OnJoinFamilyReply: tagPlayerID=%s,isOK=%s" % (tagPlayerID, isOK)) playerID = crossPlayer.GetPlayerID() familyID = crossPlayer.GetFamilyID() if familyID <= 0: return familyMgr = DBDataMgr.GetFamilyMgr() family = familyMgr.FindFamily(familyID) if not family: return curMember = family.FindMember(playerID) if not curMember: return if not GetFamilyMemberHasPow(curMember, FamilyPowerID_Call): GameWorld.DebugLog("ûÓÐÕÐÈËȨÏÞ£¬ÎÞ·¨ÉóºËÈËÔ±ÈëÃË!", playerID) #PlayerControl.NotifyCode(curPlayer, "XW_JZ_InviteErr_Popedom") return GameWorld.DebugLog("ÉóºËÈëÃËÉêÇë: tagPlayerID=%s,familyID=%s,isOK=%s" % (tagPlayerID, familyID, isOK), playerID) reqPlayerIDDict = family.GetReqJoinPlayerInfo() tagPlayerIDList = reqPlayerIDDict.keys() if tagPlayerID: if tagPlayerID not in reqPlayerIDDict: GameWorld.DebugLog("²»´æÔÚ¸ÃÉêÇëÈËÔ±! tagPlayerID=%s" % tagPlayerID) return tagPlayerIDList = [tagPlayerID] if not tagPlayerIDList: GameWorld.DebugLog("ûÓÐÉêÇëÈËÔ±!") return crossPlayerMgr = CrossPlayer.GetCrossPlayerMgr() # ¾Ü¾ø if not isOK: for tagPlayerID in tagPlayerIDList: family.DelReqJoinPlayerID(tagPlayerID) tagCrossPlayer = crossPlayerMgr.FindCrossPlayer(tagPlayerID) if not tagCrossPlayer: continue Sync_RequestAddFamilyInfo(tagCrossPlayer) #jiazu_pan_592934:{%S}¾Ü¾øÁËÄúµÄÈë°ïÉêÇë CrossPlayer.NotifyCode(tagCrossPlayer, "jiazu_pan_592934", [family.GetName()]) SendFamilyReqJoinInfo(familyID) return # ´¦ÀíͬÒâ offlinePlayerCanJoin = IpyGameDataPY.GetFuncCfg("FamilyReqJoin", 3) MemberMax = GetFamilySetting(family.GetLV(), "MemberMax") joinOKPlayerIDList = [] for tagPlayerID in tagPlayerIDList: if family.GetCount() >= MemberMax: CrossPlayer.NotifyCode(crossPlayer, "jiazu_lhs_202580") break tagCrossPlayer = crossPlayerMgr.FindCrossPlayer(tagPlayerID) #ÉêÇëÄ¿±ê²»ÔÚÏß if not tagCrossPlayer: if not offlinePlayerCanJoin: GameWorld.DebugLog("ÀëÏßÍæ¼ÒÎÞ·¨¼ÓÈ빫»á! tagPlayerID=%s" % tagPlayerID, playerID) CrossPlayer.NotifyCode(crossPlayer, "jiazu_hwj35_367906") continue family.DelReqJoinPlayerID(tagPlayerID) # ÒÔÏÂÖ»Òª²Ù×÷µÄ¶¼É¾³ý if family.FindMember(tagPlayerID): GameWorld.DebugLog("ÒѾ­ÊDZ¾Ã˳ÉÔ±! tagPlayerID=%s" % tagPlayerID, playerID) CrossPlayer.NotifyCode(crossPlayer, "XW_JZ_InviteErr_Repeat") continue tagFamilyID = familyMgr.GetPlayerFamilyID(tagPlayerID) if tagFamilyID: GameWorld.DebugLog("ÒѾ­¼ÓÈëÆäËû¹«»á! tagPlayerID=%s,tagFamilyID=%s" % (tagPlayerID, tagFamilyID), playerID) CrossPlayer.NotifyCode(crossPlayer, "XW_JZ_InviteErr_Repeat") continue DoPlayerJionFamily(family, tagPlayerID, tagCrossPlayer, broadcastFamilyChange=False) joinOKPlayerIDList.append(tagPlayerID) #if not joinOKPlayerIDList: # return SendFamilyReqJoinInfo(familyID) if joinOKPlayerIDList: Broadcast_FamilyInfo(familyID, changeMemIDList=joinOKPlayerIDList, excludeIDList=joinOKPlayerIDList) # ÉóºË return #// A6 22 ÐÞ¸ÄÊÕÈË·½Ê½ #tagCMChangeFamilyJoin # #struct tagCMChangeFamilyJoin #{ # tagHead Head; # BYTE JoinReview; //³ÉÔ±¼ÓÈëÊÇ·ñÐèÒªÉóºË£¬Ä¬ÈÏ0×Ô¶¯¼ÓÈë # WORD JoinLVMin; //ÏÞÖÆ×îµÍ¿É¼ÓÈëµÄÍæ¼ÒµÈ¼¶ #}; def OnChangeFamilyJoin(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) FamilyPyPackForwarding(curPlayer, clientData, tick, "__OnChangeFamilyJoin") return def __OnChangeFamilyJoin(crossPlayer, clientData, tick, fromServerID=0, reqDataEx=None): joinReview = clientData.JoinReview joinLVMin = clientData.JoinLVMin # ¹ÙÖ° GameWorld.DebugLog("__OnChangeFamilyJoin: joinReview=%s,joinLVMin=%s" % (joinReview, joinLVMin)) playerID = crossPlayer.GetPlayerID() familyID = crossPlayer.GetFamilyID() if familyID <= 0: return familyMgr = DBDataMgr.GetFamilyMgr() family = familyMgr.FindFamily(familyID) if not family: return curMember = family.FindMember(playerID) if not curMember: return if not GetFamilyMemberHasPow(curMember, FamilyPowerID_Call): GameWorld.DebugLog("ûÓÐÕÐÈËȨÏÞ", playerID) return GameWorld.DebugLog("ÐÞ¸ÄÕÐÈËÉèÖÃ: familyID=%s,joinReview=%s,joinLVMin=%s" % (familyID, joinReview, joinLVMin), playerID) family.SetJoinReview(joinReview) family.SetJoinLVMin(joinLVMin) Broadcast_FamilyInfo(familyID, isSyncMem=False) # ÐÞ¸ÄÕÐÈË return #// A6 23 Ð޸ļÒ×幫¸æ #tagCMChangeFamilyBroadcast # #struct tagCMChangeFamilyBroadcast #{ # tagHead Head; # char Msg[200]; #}; def OnChangeFamilyBroadcast(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) FamilyPyPackForwarding(curPlayer, clientData, tick, "__OnChangeFamilyBroadcast") return def __OnChangeFamilyBroadcast(crossPlayer, clientData, tick, fromServerID=0, reqDataEx=None): broadcast = clientData.Msg playerID = crossPlayer.GetPlayerID() familyID = crossPlayer.GetFamilyID() if familyID <= 0: return familyMgr = DBDataMgr.GetFamilyMgr() family = familyMgr.FindFamily(familyID) if not family: return curMember = family.FindMember(playerID) if not curMember: return if not GetFamilyMemberHasPow(curMember, FamilyPowerID_Broadcast): GameWorld.DebugLog("ûÓÐÐ޸Ĺ«¸æÈ¨ÏÞ", playerID) return family.SetBroadcast(broadcast) GameWorld.DebugLog('¸ü¸Ä¹«»á¹«¸æ: Family=%s,¹«¸æ=%s' % (GameWorld.CodeToGbk(family.GetName()), GameWorld.CodeToGbk(broadcast)), playerID) Broadcast_FamilyInfo(familyID, isSyncMem=False) # Ð޸Ĺ«¸æ return #// A6 24 Ð޸ļÒ×å»ÕÕ #tagCMChangeFamilyEmblem # #struct tagCMChangeFamilyEmblem #{ # tagHead Head; # BYTE EmblemID; // ¸ü»»µÄ»ÕÕÂID # char EmblemWord[3]; // »ÕÕÂÎÄ×Ö #}; def OnChangeFamilyEmblem(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) FamilyPyPackForwarding(curPlayer, clientData, tick, "__OnChangeFamilyEmblem") return def __OnChangeFamilyEmblem(crossPlayer, clientData, tick, fromServerID=0, reqDataEx=None): changeEmblemID = clientData.EmblemID emblemWord = clientData.EmblemWord PlayerFamilyEmblem.OnChangeFamilyEmblem(crossPlayer, changeEmblemID, emblemWord) return #// A6 25 Ð޸ļÒ×å³ÉԱְλ #tagCMChangeFamilyMemLV # #struct tagCMChangeFamilyMemLV #{ # tagHead Head; # DWORD PlayerID; // Ä¿±ê³ÉÔ±ID # BYTE FmLV; // ±ä¸üΪxxְλ #}; def OnChangeFamilyMemLV(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) FamilyPyPackForwarding(curPlayer, clientData, tick, "__OnChangeFamilyMemLV") return def __OnChangeFamilyMemLV(crossPlayer, clientData, tick, fromServerID=0, reqDataEx=None): OnChangeFamilyMemberLV(crossPlayer, clientData.PlayerID, clientData.FmLV) return def OnChangeFamilyMemberLV(crossPlayer, tagID, changeFmlv, isGMOP=False): '''±ä¸ü³ÉԱְλ @param curPlayer: ²Ù×÷µÄÍæ¼Ò @param tagID: Ä¿±ê³ÉÔ±ID @param changeFmlv: ÐÞ¸ÄΪxxְλ @param isGMOP: ÊÇ·ñÊÇGMºǫ́·¢ÆðµÄ£¬Èç¹ûÊÇGM·¢ÆðµÄ£¬Ò»°ãcurPlayer´«ÈëµÄΪĿ±ê³ÉÔ±IDʵÀý ''' if not crossPlayer: return playerID = crossPlayer.GetPlayerID() familyID = crossPlayer.GetFamilyID() if familyID <= 0: return familyMgr = DBDataMgr.GetFamilyMgr() family = familyMgr.FindFamily(familyID) if not family: return curMember = family.FindMember(playerID) if not curMember: return if changeFmlv < 0 or changeFmlv > IPY_PlayerDefine.fmlLeader: GameWorld.DebugLog("²»´æÔÚ¸ÃְλµÈ¼¶! changeFmlv=%s" % changeFmlv) return # ·ÇGM²Ù×÷µÄÐè¼ì²éȨÏÞ if not isGMOP: if not GetFamilyMemberHasPow(curMember, FamilyPowerID_ChangeFmlv): return if playerID == tagID: GameWorld.DebugLog("²»ÄÜÈÎÃâ×Ô¼ºµÄ¼Ò×åְλ", playerID) return tagMember = family.FindMember(tagID) if tagMember == None: GameWorld.DebugLog("¸ü¸Ä¼Ò×å³ÉԱְλʱĿ±ê³ÉÔ±²»´æÔÚ! tagID=%s" % tagID, playerID) return if not isGMOP: if curMember.GetFmLV() != IPY_PlayerDefine.fmlLeader: if changeFmlv >= curMember.GetFmLV(): GameWorld.DebugLog("Ð޸ĵÄְλ²»ÄܱÈ×Ô¼º¸ß»òƽ¼¶! changeFmlv=%s" % changeFmlv, playerID) return if tagMember.GetFmLV() >= curMember.GetFmLV(): GameWorld.DebugLog("Ð޸ĵÄÄ¿±ê³ÉԱְλ²»ÄܱÈ×Ô¼º¸ß»òƽ¼¶! tagFmlv=%s" % tagMember.GetFmLV(), playerID) return changeMemIDList = [tagID] if changeFmlv == IPY_PlayerDefine.fmlLeader: ChangeFamilyLeader(family, tagMember) changeMemIDList.append(playerID) else: fmLVMemCnt = 0 for index in range(family.GetCount()): familyMember = family.GetAt(index) if familyMember.GetFmLV() != changeFmlv: continue fmLVMemCnt += 1 maxCnt = GetFamilySetting(family.GetLV(), Def_FmlSetAttrName.get(changeFmlv, "")) if fmLVMemCnt >= maxCnt: # jiazu_hwj35_272921 ¸ÄΪ jiazu_chenxin_31379 CrossPlayer.NotifyCode(crossPlayer, "jiazu_chenxin_31379") GameWorld.DebugLog("Ŀǰ¸ÃְλµÄÈËÊýÒѾ­´ïµ½ÉÏÏÞ! changeFmlv=%s,fmLVMemCnt=%s >= %s" % (changeFmlv, fmLVMemCnt, maxCnt)) return ChangeFamilyMemberLv(tagMember, changeFmlv) if isGMOP: family.SetBroadcast("") Broadcast_FamilyInfo(familyID, changeMemIDList=changeMemIDList) # ÐÞ¸Äְλ return True def ChangeFamilyLeader(family, newLeaderMem): ## ±ä¸ü¼Ò×å×峤 familyID = family.GetID() befLeaderID = family.GetLeaderID() newLeaderID = newLeaderMem.GetPlayerID() if befLeaderID == newLeaderID: return befLeaderMem = family.FindMember(befLeaderID) if befLeaderMem: #°ÑÔ­×峤½µÎªÆÕͨ³ÉÔ± ChangeFamilyMemberLv(befLeaderMem, IPY_PlayerDefine.fmlMember) family.SetLeaderID(newLeaderID) ChangeFamilyMemberLv(newLeaderMem, IPY_PlayerDefine.fmlLeader) GameWorld.Log("¼Ò×åÉèÖÃÐÂ×峤! familyID=%s,newLeaderID=%s,befLeaderID=%s" % (familyID, newLeaderID, befLeaderID)) return def ChangeFamilyMemberLv(tagMember, changeFamilyLV): ## Ð޸ijÉԱְλ£¬Ö»×öÐÞ¸ÄÂß¼­£¬²»×öÑéÖ¤£¬ÑéÖ¤Óɸ÷µ÷ÓÃÈë¿Ú×ÔÐÐÑéÖ¤ familyID = tagMember.GetFamilyID() tagID = tagMember.GetPlayerID() memName = tagMember.GetPlayerName() befFamilyLV = tagMember.GetFmLV() tagMember.SetFmLV(changeFamilyLV) tagCrossPlayer = CrossPlayer.GetCrossPlayerMgr().FindCrossPlayer(tagID) if tagCrossPlayer: MapServer_FamilyRefresh(tagCrossPlayer, familyID) # ÐÞ¸Äְλ if GetFamilyMemberHasPow(tagMember, FamilyPowerID_Call): CrossPlayer.SendFakePack(tagCrossPlayer, GetPack_FamilyReqJoinInfo(familyID)) # ¼Ç¼¼Ò×åʼþ¼Ç¼ÐÅÏ¢ tick = GameWorld.GetGameWorld().GetTick() AddFamilyActionNote(memName, familyID, ShareDefine.Def_ActionType_FamilyEvent, [ShareDefine.Def_FamilyActionEvent_MemberChange, ShareDefine.Def_FamilyMemberChange_FMLV, changeFamilyLV, befFamilyLV], tick) #xx±»ÈÎÃüΪxx CrossPlayer.FamilyNotify(familyID, "XW_JZ_AppointFamily", [memName, changeFamilyLV]) return def __AutoChangeLeader(curFamily): ## ×Ô¶¯´«Î» leaderID = curFamily.GetLeaderID() leaderMem = curFamily.FindMember(leaderID) if not leaderMem: return offTime = leaderMem.GetOffTime() if not offTime: return familyID = curFamily.GetID() curTime = int(time.time()) passTime = curTime - offTime passHours = passTime / 3600.0 needHours = IpyGameDataPY.GetFuncCfg("FamilyLeaderAutoChange", 1) if passHours < needHours: GameWorld.DebugLogEx("ÃËÖ÷ÀëÏß䳬¹ýÏÞÖÆÐ¡Ê±£¬²»´¦Àí×Ô¶¯´«Î»£¡familyID=%s,leaderID=%s,offTime=%s,passHours=%s < %s", familyID, leaderID, GameWorld.ChangeTimeNumToStr(offTime), passHours, needHours) return priorityHours = IpyGameDataPY.GetFuncCfg("FamilyLeaderAutoChange", 1) # ÓÅÏÈ´«¸øÀëÏß²»³¬¹ýxСʱµÄ³ÉÔ±£¬Ò»Ñù°´ÓÅÏȼ¶ priorityList = [] commList = [] for i in range(0, curFamily.GetCount()): member = curFamily.GetAt(i) if member.GetFmLV() == IPY_PlayerDefine.fmlLeader: continue memOffTime = member.GetOffTime() if memOffTime: sortTime = memOffTime memPassTime = curTime - memOffTime memPassHours = memPassTime / 3600.0 else: sortTime = curTime # ÅÅÐòÓõÄʱ¼ä£¬Ô½´óÔ½ÓÅÏÈ memPassTime = 0 memPassHours = 0 fmLV = member.GetFmLV() # ְλ contribTotal = member.GetContribTotal() # ×ܹ±Ï× commList.append([fmLV, sortTime, contribTotal, member]) if priorityHours and memPassHours <= priorityHours: priorityList.append([fmLV, sortTime, contribTotal, member]) if not priorityList and not commList: # ûÓпɴ«Î»µÄÄ¿±ê³ÉÔ± return toMember = None if priorityList: priorityList.sort(reverse=True) toMember = priorityList[0][-1] else: commList.sort(reverse=True) toMember = commList[0][-1] if not toMember: return newLeaderID = toMember.GetPlayerID() GameWorld.Log("¹«»á×Ô¶¯´«Î»: familyID=%s,leaderID=%s,offTime=%s,passHours=%s,newLeaderID=%s" % (familyID, leaderID, GameWorld.ChangeTimeNumToStr(offTime), passHours, newLeaderID)) ChangeFamilyLeader(curFamily, toMember) Broadcast_FamilyInfo(familyID, changeMemIDList=[leaderID, newLeaderID]) # ×Ô¶¯´«Î» # Óʼþ֪ͨ toServerID = toMember.GetServerID() PlayerMail.SendMailByKey("FamilyLeaderAutoChange", newLeaderID, [], [curFamily.GetName()], toServerID=toServerID) return #// A6 26 ÇëÇó¼Ò×å³ÉÔ±Áбí #tagCMGetFamilyInfo # #struct tagCMGetFamilyInfo #{ # tagHead Head; #}; def OnGetFamilyInfo(index, clientData, tick): #¸ÄΪºó¶ËÖ÷¶¯Í¬²½²îÒ죬²»ÓÃÔÙÇëÇóÁË #curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) #Sync_FamilyInfo(crossPlayer) return #// A6 03 À뿪¼Ò×å #tagCMLeaveFamily # #struct tagCMLeaveFamily #{ # tagHead Head; #}; def OnLeaveFamily(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) FamilyPyPackForwarding(curPlayer, clientData, tick, "__OnMemLeaveFamily") return def __OnMemLeaveFamily(crossPlayer, clientData, tick, fromServerID=0, reqDataEx=None): playerID = crossPlayer.GetPlayerID() familyID = crossPlayer.GetFamilyID() if familyID <= 0: return familyMgr = DBDataMgr.GetFamilyMgr() family = familyMgr.FindFamily(familyID) if not family: return curMember = family.FindMember(playerID) if not curMember: return familyLV = curMember.GetFmLV() # ְλ if family.GetCount() > 1 and familyLV == IPY_PlayerDefine.fmlLeader: GameWorld.DebugLog("×峤ÔÚ³ÉÔ±ÈËÊý´óÓÚ1ʱ²»ÄÜÖ±½ÓÍ˳ö¼Ò×å", playerID) return # ¹¦ÄÜÏÞÖÆÍ˳ö¹«»á # ... # ½ø³öʱ¼äÏÞÖÆÔݲ»×ö£¬µÈÕýʽ¹¦ÄÜÔÙ²¹ #PlayerControl.SetLeaveFamilyTime(curPlayer, updTime) # Ö´ÐÐÍ˳ö GameWorld.DebugLog("À뿪¼Ò×å! familyID=%s" % familyID, playerID) family.DeleteMember(playerID) AddFamilyActionNote(crossPlayer.GetPlayerName(), familyID, ShareDefine.Def_ActionType_FamilyEvent, [ShareDefine.Def_FamilyActionEvent_MemberChange, ShareDefine.Def_FamilyMemberChange_Leave], tick) __DoPlayerLeaveFamilyByID(family, playerID, crossPlayer) MapServer_FamilyRefresh(crossPlayer, 0, 1) # Ö÷¶¯Í˳ö CrossPlayer.SendFakePackByFamily(familyID, GetPack_FamilyDel(playerID, crossPlayer.GetPlayerName(), 1)) CrossPlayer.FamilyNotify(familyID, "XW_JZ_LeaveFamily", [crossPlayer.GetPlayerName()]) Broadcast_FamilyInfo(familyID, isSyncMem=False) # Í˳ö if family.GetCount() == 0: #Íæ¼ÒÀ뿪ºó, ¼Ò×åûÓÐÈËÁË , ɾ³ýÕâ¸ö¼Ò×å familyMgr.DelFamily(familyID) return return #// A6 05 ɾ³ý¼Ò×å³ÉÔ± #tagCMDeleteFamilyMember # #struct tagCMDeleteFamilyMember #{ # tagHead Head; # DWORD MemberID; #}; def OnDeleteFamilyMember(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) FamilyPyPackForwarding(curPlayer, clientData, tick, "__OnDeleteFamilyMember") return def __OnDeleteFamilyMember(crossPlayer, clientData, tick, fromServerID=0, reqDataEx=None): tagMemberID = clientData.MemberID GameWorld.DebugLog("__OnDeleteFamilyMember tagMemberID=%s" % tagMemberID) playerID = crossPlayer.GetPlayerID() if playerID == tagMemberID: return familyID = crossPlayer.GetFamilyID() if familyID <= 0: return familyMgr = DBDataMgr.GetFamilyMgr() family = familyMgr.FindFamily(familyID) if not family: return curMember = family.FindMember(playerID) if not curMember: return if not GetFamilyMemberHasPow(curMember, FamilyPowerID_Kick): GameWorld.DebugLog("ûÓÐÌßÈËȨÏÞ!") return tagMember = family.FindMember(tagMemberID) if not tagMember: return curFmlv = curMember.GetFmLV() tagFmlv = tagMember.GetFmLV() if tagFmlv >= curFmlv: GameWorld.DebugLog("Ö»ÄÜÌß±È×Ô¼ºÖ°Î»µÍµÄ³ÉÔ±! tagMemberID=%s,tagFmlv(%s) >= curFmlv(%s)" % (tagMemberID, tagFmlv, curFmlv), playerID) return # ¹¦ÄÜÏÞÖÆÌßÈË # ... tagPlayerName = tagMember.GetPlayerName() # ±»ÌßÍæ¼ÒÃû tagPlayerID = tagMember.GetPlayerID() # ±»ÌßÍæ¼ÒID family.DeleteMember(tagPlayerID) AddFamilyActionNote(tagPlayerName, familyID, ShareDefine.Def_ActionType_FamilyEvent, [ShareDefine.Def_FamilyActionEvent_MemberChange, ShareDefine.Def_FamilyMemberChange_KickOut], tick) #XW_JZ_LeaveFamily {%S1%}Í˳öÁ˼Ò×壡 25 - - CrossPlayer.FamilyNotify(familyID, "XW_JZ_LeaveFamily", [tagPlayerName]) #ɾ³ýÍæ¼Ò tagCrossPlayer = CrossPlayer.GetCrossPlayerMgr().FindCrossPlayer(tagMemberID) __DoPlayerLeaveFamilyByID(family, tagPlayerID, tagCrossPlayer) if tagCrossPlayer: MapServer_FamilyRefresh(tagCrossPlayer, 0) # ±»Ìß CrossPlayer.NotifyCode(tagCrossPlayer, "XW_JZ_LeaveFamilyKick", [curMember.GetPlayerName()]) CrossPlayer.SendFakePackByFamily(familyID, GetPack_FamilyDel(tagMemberID, tagPlayerName, 0)) Broadcast_FamilyInfo(familyID, isSyncMem=False) # ÌßÈË return def __DoPlayerLeaveFamilyByID(curFamily, leavePlayerID, crossPlayer=None): ## ÓÐÍæ¼ÒÀ뿪¼Ò×å´¦Àí£¬Ö÷ÒªÕë¶Ô¼Ò×å²ã¼¶µÄ£¬Íæ¼Ò¸öÈ˵ÄÔÚ __OnLeaveFamily ´¦Àí PlayerFamilyTaofa.OnFamilyMemberLeave(curFamily, leavePlayerID) return #// A6 11 ¼Ò×å¸ÄÃû #tagCMRenameFamily # #struct tagCMRenameFamily #{ # tagHead Head; # BYTE NewNameLen; # char NewName[NewNameLen]; # BYTE ItemIndex; //¸ÄÃûÎïÆ·ÔÚ±³°üÖеÄλÖà #}; def UpdateFamilyName(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) newName = clientData.NewName if not CheckInputFamilyName(curPlayer, newName): GameWorld.DebugLog("Ãû×ÖÑéÖ¤²»Í¨¹ý") return moneyType, moneyValue = IpyGameDataPY.GetFuncEvalCfg("FamilyRename", 1) if moneyType and moneyValue and not PlayerControl.HaveMoney(curPlayer, moneyType, moneyValue): return FamilyPyPackForwarding(curPlayer, clientData, tick, "__UpdateFamilyName", True, 20) return def __UpdateFamilyName(crossPlayer, clientData, tick, fromServerID=0, reqDataEx=None): newName = clientData.NewName #itemIndex = clientData.ItemIndex playerID = crossPlayer.GetPlayerID() familyID = crossPlayer.GetFamilyID() if familyID <= 0: return familyMgr = DBDataMgr.GetFamilyMgr() family = familyMgr.FindFamily(familyID) if not family: return curMember = family.FindMember(playerID) if not curMember: return if curMember.GetFmLV() != IPY_PlayerDefine.fmlLeader: GameWorld.DebugLog("·ÇÃËÖ÷²»¿É¸ÄÃû!", playerID) return curTime = int(time.time()) cdHours = IpyGameDataPY.GetFuncCfg("FamilyRename", 2) if cdHours: cdSeconds = cdHours * 3600 lastRenameTime = GetRenameTime(family) if lastRenameTime and (curTime - lastRenameTime) < cdSeconds: GameWorld.DebugLog("¹«»á¸ÄÃûCDÖÐ! lastRenameTime=%s,cdHours=%s" % (GameWorld.ChangeTimeNumToStr(lastRenameTime), cdHours)) return # ÑéÖ¤ÖØÃû if CheckFamilyNameExists(crossPlayer, newName, fromServerID): return moneyType, moneyValue = IpyGameDataPY.GetFuncEvalCfg("FamilyRename", 1) if moneyType and moneyValue: CrossPlayer.CostPlayerResources(crossPlayer, "FamilyRename", costMoneyDict={moneyType:moneyValue}) family.SetName(newName) if cdHours: SetRenameTime(family, curTime) crossPlayerMgr = CrossPlayer.GetCrossPlayerMgr() for index in xrange(family.GetCount()): member = family.GetAt(index) memID = member.GetPlayerID() memCrossPlayer = crossPlayerMgr.FindCrossPlayer(memID) if not memCrossPlayer: continue MapServer_FamilyRefresh(memCrossPlayer, familyID) # ¸ÄÃû #player.Notify_FamilyNameRefresh() #//04 36 ÖÜÎ§Íæ¼Ò¼Ò×åÃûË¢ÐÂ#tagPlayerFamilyNameRefresh Broadcast_FamilyInfo(familyID, isSyncMem=False) # ¸ÄÃû return True #// A6 19 ²é¿´Ä¿±ê¹«»á #tagCSViewTagFamily # #struct tagCSViewTagFamily #{ # tagHead Head; # DWORD FamilyID; # DWORD DataServerID; //Êý¾ÝËùÔÚ·þÎñÆ÷ID #}; def OnViewTagFamily(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) playerID = curPlayer.GetPlayerID() tagFamilyID = clientData.FamilyID dataServerID = clientData.DataServerID # ±¾·þ»òÖ÷·þÊDZ¾·þ if not dataServerID or dataServerID == GameWorld.GetGameWorld().GetServerID(): NetPackCommon.SendFakePack(curPlayer, GetTagFamilyInfoPack(tagFamilyID)) return CrossMsg.SendToServer(ShareDefine.S2S_ViewTagFamily, {"tagFamilyID":tagFamilyID}, [dataServerID], ShareDefine.dirType_All, playerID) return def S2S_ViewTagFamily(dataMsg, fromServerID, playerID): tagFamilyID = dataMsg["tagFamilyID"] CrossPlayer.SendFakePackByID(playerID, GetTagFamilyInfoPack(tagFamilyID), fromServerID) return def GetTagFamilyInfoPack(tagFamilyID): familyMgr = DBDataMgr.GetFamilyMgr() family = familyMgr.FindFamily(tagFamilyID) if not family: GameWorld.ErrLog("±¾·þÊý¾ÝÕÒ²»µ½Ä¿±ê¹«»á! tagFamilyID=%s" % tagFamilyID) return clientPack = ChPyNetSendPack.tagSCTagFamilyInfo() clientPack.FamilyID = family.GetID() clientPack.FamilyName = family.GetName() clientPack.FamilyNameLen = len(clientPack.FamilyName) clientPack.LeaderID = family.GetLeaderID() leaderMember = family.FindMember(clientPack.LeaderID) if leaderMember: clientPack.LeaderName = leaderMember.GetPlayerName() clientPack.LeaderNameLen = len(clientPack.LeaderName) clientPack.LeaderServerID = leaderMember.GetServerID() clientPack.FamilyLV = family.GetLV() clientPack.ServerID = family.GetServerID() clientPack.EmblemID = family.GetEmblemID() clientPack.EmblemWord = family.GetEmblemWord() clientPack.FightPower = family.GetFightPower() clientPack.FightPowerEx = family.GetFightPowerEx() clientPack.Broadcast = family.GetBroadcast() clientPack.BroadcastLen = len(clientPack.Broadcast) clientPack.MemberCount = family.GetCount() clientPack.DataServerID = GameWorld.GetGameWorld().GetServerID() return clientPack #// A6 20 ËÑË÷¼Ò×åÁбí #tagCMViewFamilyPage # #struct tagCMViewFamilyPage #{ # tagHead Head; # BYTE MsgLen; //Ä£ºýËÑË÷¼Ò×壬Èç¹ûÊäÈëΪ¿Õ£¬ÔòΪ²»ÏÞÖÆ¸ÃÌõ¼þ # char Msg[MsgLen]; //size = MsgLen # BYTE PageIndex; //²éѯµÚXÒ³Ë÷Òý£¬0~n # BYTE ShowCount; //ÿҳÊýÁ¿£¬Ç°¶Ë¿É×ÔÐÐÖ¸¶¨£¬×î´ó50 #}; def OnViewFamilyPage(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) FamilyPyPackForwarding(curPlayer, clientData, tick, "__OnViewFamilyPage") return def __OnViewFamilyPage(crossPlayer, clientData, tick, fromServerID=0, reqDataEx=None): msg = clientData.Msg pageIndex = clientData.PageIndex showCount = min(clientData.ShowCount, 50) familyMgr = DBDataMgr.GetFamilyMgr() zoneID = familyMgr.GetZoneIDInThisServer(fromServerID) if zoneID < 0: GameWorld.ErrLog("ÕÒ²»µ½·þÎñÆ÷IDÔÚ±¾·þÖеĹ«»á·ÖÇø! fromServerID=%s" % fromServerID) return playerFamilyID = crossPlayer.GetFamilyID() zoneMgr = familyMgr.GetZoneFamilyMgr(zoneID) zoneMgr.Sort(True) familyCount = zoneMgr.GetCount() totalPage = 0 if not msg: startIndex = pageIndex * showCount endIndex = startIndex + showCount - 1 if familyCount > 0: totalPage = GameWorld.GetIntUpper(familyCount, showCount) # ÓÐÖ¸¶¨ËÑË÷ÄÚÈݵĺó¶Ë¹Ì¶¨·µ»Øµ¥Ò³ else: pageIndex = 0 showCount = 20 totalPage = 1 startIndex = 0 endIndex = familyCount - 1 clientPack = ChPyNetSendPack.tagMCFamilyViewList() clientPack.Msg = msg clientPack.MsgLen = len(clientPack.Msg) clientPack.PageIndex = pageIndex clientPack.ShowCount = showCount clientPack.TotalPage = totalPage clientPack.Rank = zoneMgr.GetFamilyRank(playerFamilyID) clientPack.FamilyList = [] for index in range(startIndex, endIndex + 1): if index >= familyCount: break family = zoneMgr.GetAt(index) if not family: continue if msg: if msg in family.GetName() or msg == str(family.GetID()): pass else: continue familyView = ChPyNetSendPack.tagMCFamilyView() familyView.Rank = index + 1 familyView.FamilyID = family.GetID() familyView.FamilyName = family.GetName() familyView.FamilyNameLen = len(familyView.FamilyName) familyView.LeaderID = family.GetLeaderID() leaderMember = family.FindMember(familyView.LeaderID) familyView.LeaderName = leaderMember.GetPlayerName() if leaderMember else "" familyView.LeaderNameLen = len(familyView.LeaderName) familyView.LeaderServerID = leaderMember.GetServerID() if leaderMember else family.GetServerID() familyView.FamilyLV = family.GetLV() familyView.JoinReview = family.GetJoinReview() familyView.JoinLVMin = family.GetJoinLVMin() familyView.ServerID = family.GetServerID() familyView.EmblemID = family.GetEmblemID() familyView.EmblemWord = family.GetEmblemWord() familyView.FightPower = family.GetFightPower() familyView.FightPowerEx = family.GetFightPowerEx() familyView.MemberCount = family.GetCount() clientPack.FamilyList.append(familyView) clientPack.FamilyCount = len(clientPack.FamilyList) if clientPack.FamilyCount >= showCount: break CrossPlayer.SendFakePack(crossPlayer, clientPack) return #// A6 12 ¼Ò×å¾èÏ×»õ±Ò #tagCMFamilyMoneyDonate # #struct tagCMFamilyMoneyDonate #{ # tagHead Head; # BYTE DonateType; // ¾èÏ×ÀàÐÍ #}; def OnFamilyMoneyDonate(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) playerID = curPlayer.GetPlayerID() donateType = clientData.DonateType ipyData = IpyGameDataPY.GetIpyGameData("FamilyDonate", donateType) if not ipyData: return dailyCntMax = ipyData.GetDailyCnt() donateCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyDonateCnt % donateType) if donateCnt >= dailyCntMax: GameWorld.DebugLog("½ñÈÕ¾èÏ×´ÎÊýÒÑ´ïÉÏÏÞ! donateType=%s,donateCnt=%s >= %s" % (donateType, donateCnt, dailyCntMax), playerID) return moneyType = ipyData.GetMoneyType() moneyValue = ipyData.GetMoneyValue() if not moneyType or not moneyValue: return if not PlayerControl.HaveMoney(curPlayer, moneyType, moneyValue): return reqDataEx = {"donateCnt":donateCnt} FamilyPyPackForwarding(curPlayer, clientData, tick, "__OnFamilyMoneyDonate", True, 20, reqDataEx=reqDataEx) return def __OnFamilyMoneyDonate(crossPlayer, clientData, tick, fromServerID=0, reqDataEx=None): donateType = clientData.DonateType playerID = crossPlayer.GetPlayerID() familyID = crossPlayer.GetFamilyID() if familyID <= 0: return familyMgr = DBDataMgr.GetFamilyMgr() curFamily = familyMgr.FindFamily(familyID) if not curFamily: return curMember = curFamily.FindMember(playerID) if not curMember: return if not reqDataEx: return if "donateCnt" not in reqDataEx: return donateCnt = reqDataEx["donateCnt"] ipyData = IpyGameDataPY.GetIpyGameData("FamilyDonate", donateType) if not ipyData: return moneyType = ipyData.GetMoneyType() moneyValue = ipyData.GetMoneyValue() if not moneyType or not moneyValue: return CrossPlayer.CostPlayerResources(crossPlayer, "FamilyMoneyDonate", costMoneyDict={moneyType:moneyValue}) awardItemList = ipyData.GetAwardItemList() donateCnt += 1 CrossPlayer.SetPlayerNomalDict(crossPlayer, {ChConfig.Def_Player_Dict_FamilyDonateCnt % donateType:donateCnt}, isDayReset=True) #SyncDonateCntInfo(curPlayer) # Ôö¼Ó³ÉÔ±¾èÏ×´ÎÊý¼Ç¼ memDonateCntDay = curMember.GetDonateCntDay() + 1 memDonateCntTotal = min(curMember.GetDonateCntTotal() + 1, ChConfig.Def_UpperLimit_DWord) curMember.SetDonateCntDay(memDonateCntDay) curMember.SetDonateCntTotal(memDonateCntTotal) GameWorld.DebugLog("¼Ò×å¾èÏ×: donateType=%s,donateCnt=%s,%s,memDonateCntDay=%s,memDonateCntDay=%s" % (donateType, donateCnt, awardItemList, memDonateCntDay, memDonateCntTotal), playerID) CrossPlayer.GivePlayerResources(crossPlayer, awardItemList, eventName="FamilyMoneyDonate") return True def __OnFamilyMoneyDonate_Ret(curPlayer, clientData, isOK): if not isOK: return SyncDonateCntInfo(curPlayer) return def AddFamilyExp(curPlayer, addExp): ## Ôö¼ÓÍæ¼Ò¼Ò×å¾­Ñé clientData, tick = None, 0 reqDataEx = {"addExp":addExp} FamilyPyPackForwarding(curPlayer, clientData, tick, "__AddFamilyExp", reqCD=0, reqDataEx=reqDataEx) return def __AddFamilyExp(crossPlayer, clientData, tick, fromServerID=0, reqDataEx=None): playerID = crossPlayer.GetPlayerID() familyID = crossPlayer.GetFamilyID() if familyID <= 0: return familyMgr = DBDataMgr.GetFamilyMgr() curFamily = familyMgr.FindFamily(familyID) if not curFamily: return curLV = curFamily.GetLV() curExp = curFamily.GetExp() if not reqDataEx: return addExp = reqDataEx["addExp"] updLV = curLV updExp = curExp + addExp GameWorld.DebugLog("Ôö¼Ó¹«»á¾­Ñé: curLV=%s,curExp=%s,addExp=%s,updExp=%s" % (curLV, curExp, addExp, updExp), playerID) ipyData = IpyGameDataPY.GetIpyGameData("Family", curLV) lvUPExp = ipyData.GetNeedExp() while lvUPExp and updExp >= lvUPExp: ipyData = IpyGameDataPY.GetIpyGameDataNotLog("Family", updLV + 1) if not ipyData: break updLV += 1 updExp -= lvUPExp lvUPExp = ipyData.GetNeedExp() GameWorld.DebugLog(" ¹«»áÉý¼¶: updLV=%s,updExp=%s,lvUPExp=%s" % (updLV, updExp, lvUPExp), playerID) curFamily.SetLV(updLV) curFamily.SetExp(updExp) Broadcast_FamilyInfo(familyID, isSyncMem=False) # ¹«»á¾­Ñé return True def AddFamilyContrib(curPlayer, addContribValue): ## Ôö¼ÓÍæ¼ÒÀۼƼÒ×å¹±Ï× clientData, tick = None, 0 reqDataEx = {"addContribValue":addContribValue} FamilyPyPackForwarding(curPlayer, clientData, tick, "__AddFamilyContrib", reqCD=0, reqDataEx=reqDataEx) return def __AddFamilyContrib(crossPlayer, clientData, tick, fromServerID=0, reqDataEx=None): playerID = crossPlayer.GetPlayerID() familyID = crossPlayer.GetFamilyID() if familyID <= 0: return familyMgr = DBDataMgr.GetFamilyMgr() curFamily = familyMgr.FindFamily(familyID) if not curFamily: return curMember = curFamily.FindMember(playerID) if not curMember: return if not reqDataEx: return addContribValue = reqDataEx["addContribValue"] contribDay = curMember.GetContribDay() + addContribValue contribTotal = min(curMember.GetContribTotal() + addContribValue, ChConfig.Def_UpperLimit_DWord) curMember.SetContribDay(contribDay) curMember.SetContribTotal(contribTotal) GameWorld.DebugLog("Ôö¼Ó³ÉÔ±¹±Ï×: familyID=%s,addContribValue=%s,contribDay=%s,contribTotal=%s" % (familyID, addContribValue, contribDay, contribTotal), playerID) Broadcast_FamilyInfo(familyID, isSyncMem=False) # ³ÉÔ±¹±Ï× return ## ------------------------------------------------------------------------------------------------ #// A6 17 ²éѯ¼Ò×åÐÐΪÐÅÏ¢ #tagCMQueryFamilyAction # #struct tagCMQueryFamilyAction #{ # tagHead Head; # BYTE ActionType; // ÐÐΪÀàÐÍ # DWORD FamilyID; // ¼Ò×åID£¬·¢0ĬÈÏ×Ô¼º¼Ò×å #}; def OnQueryFamilyAction(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) FamilyPyPackForwarding(curPlayer, clientData, tick, "__OnQueryFamilyAction") return def __OnQueryFamilyAction(crossPlayer, clientData, tick, fromServerID=0, reqDataEx=None): actionType = clientData.ActionType familyID = clientData.FamilyID if not familyID: familyID = crossPlayer.GetFamilyID() SendFamilyActionInfo(crossPlayer, familyID, actionType) return def SendFamilyActionInfo(crossPlayer, familyID, actionType): ## ·¢ËͼÒ×åÐÐΪ # @param crossPlayer: ΪNoneʱ֪ͨ¸Ã¹«»áËùÓгÉÔ± if not familyID: return familyAction = DBDataMgr.GetFamilyActionMgr().GetFamilyAction(familyID, actionType) clientPack = ChPyNetSendPack.tagMCFamilyActionInfo() clientPack.FamilyID = familyID clientPack.ActionType = actionType clientPack.FamilyActionList = [] for index in xrange(familyAction.Count()): familyActionData = familyAction.At(index) actionData = ChPyNetSendPack.tagMCFamilyAction() actionData.Time = familyActionData.GetTime() actionData.Name = familyActionData.GetName() actionData.NameLen = len(actionData.Name) actionData.Value1 = familyActionData.GetValue1() actionData.Value2 = familyActionData.GetValue2() actionData.Value3 = familyActionData.GetValue3() actionData.Value4 = familyActionData.GetValue4() actionData.Value5 = familyActionData.GetValue5() actionData.Value6 = familyActionData.GetValue6() actionData.UseData = familyActionData.GetUserData() actionData.UseDataLen = len(actionData.UseData) clientPack.FamilyActionList.append(actionData) clientPack.Count = len(clientPack.FamilyActionList) if crossPlayer: CrossPlayer.SendFakePack(crossPlayer, clientPack) return CrossPlayer.SendFakePackByFamily(familyID, clientPack) return def SendFamilyAction(actionDataList, crossPlayer=None): ## ͬ²½Ö¸¶¨¹«»áaction # @param actionDataList: Ö§³ÖÁбí»òÖ¸¶¨actionData # @param crossPlayer: ΪNoneʱ֪ͨ¸Ã¹«»áËùÓгÉÔ± if not isinstance(actionDataList, list): actionDataList = [actionDataList] if not actionDataList: return familyActionData = actionDataList[0] familyID = familyActionData.GetFamilyID() actionType = familyActionData.GetActionType() clientPack = ChPyNetSendPack.tagMCFamilyActionInfo() clientPack.FamilyID = familyID clientPack.ActionType = actionType clientPack.FamilyActionList = [] for familyActionData in actionDataList: actionData = ChPyNetSendPack.tagMCFamilyAction() actionData.Time = familyActionData.GetTime() actionData.Name = familyActionData.GetName() actionData.NameLen = len(actionData.Name) actionData.Value1 = familyActionData.GetValue1() actionData.Value2 = familyActionData.GetValue2() actionData.Value3 = familyActionData.GetValue3() actionData.Value4 = familyActionData.GetValue4() actionData.Value5 = familyActionData.GetValue5() actionData.Value6 = familyActionData.GetValue6() actionData.UseData = familyActionData.GetUserData() actionData.UseDataLen = len(actionData.UseData) clientPack.FamilyActionList.append(actionData) clientPack.Count = len(clientPack.FamilyActionList) if crossPlayer: CrossPlayer.SendFakePack(crossPlayer, clientPack) return CrossPlayer.SendFakePackByFamily(familyID, clientPack) return def OnFamilyTalk(curPlayer, familyID, talkPack, tick): clientData, tick = None, 0 reqDataEx = {"talkBuffer":talkPack.GetBuffer()} FamilyPyPackForwarding(curPlayer, clientData, tick, "__OnFamilyTalk", reqDataEx=reqDataEx) return def __OnFamilyTalk(crossPlayer, clientData, tick, fromServerID=0, reqDataEx=None): talkBuffer = reqDataEx["talkBuffer"] playerID = crossPlayer.GetPlayerID() familyID = crossPlayer.GetFamilyID() if not familyID or not talkBuffer: return clientPack = ChPyNetSendPack.tagMCTalk() clientPack.ReadData(talkBuffer) CrossPlayer.SendFakePackByFamily(familyID, clientPack) # ÁÄÌ컺´æ channelType = clientPack.ChannelType content = clientPack.Content bubbleBox = clientPack.BubbleBox PlayerTalk.DoTalkCache(channelType, playerID, content, bubbleBox, familyID) return def OnCrossFamilyTalk(curPlayer, talkPack, tick): ## ¿ç·þ¹«»áÁÄÌ죬Óë¿ç·þ¹«»á»¥Í¨·¶Î§Ò»Ö crossServerID = DBDataMgr.GetFamilyMgr().GetCurCrossServerID() if crossServerID <= 0: GameWorld.DebugLog("±¾·þ¹«»áδ»¥Í¨£¬²»ÔÊÐí¿ç·þÁÄÌì") return clientData, tick = None, 0 reqDataEx = {"talkBuffer":talkPack.GetBuffer()} FamilyPyPackForwarding(curPlayer, clientData, tick, "__OnCrossTalk", reqDataEx=reqDataEx) return def __OnCrossTalk(crossPlayer, clientData, tick, fromServerID=0, reqDataEx=None): talkBuffer = reqDataEx["talkBuffer"] playerID = crossPlayer.GetPlayerID() if not talkBuffer: return familyMgr = DBDataMgr.GetFamilyMgr() zoneID = familyMgr.GetZoneIDInThisServer(fromServerID) if zoneID < 0: GameWorld.ErrLog("ÕÒ²»µ½·þÎñÆ÷IDÔÚ¿ç·þÖеĹ«»á·ÖÇø! fromServerID=%s" % fromServerID) return zoneMgr = familyMgr.GetZoneFamilyMgr(zoneID) serverIDList = zoneMgr.GetZoneServerIDList() if not serverIDList: return clientPack = ChPyNetSendPack.tagMCTalk() clientPack.ReadData(talkBuffer) CrossPlayer.SendFackPackToServerList(clientPack, serverIDList) # ÁÄÌ컺´æ channelType = clientPack.ChannelType content = clientPack.Content bubbleBox = clientPack.BubbleBox PlayerTalk.DoTalkCache(channelType, playerID, content, bubbleBox) return ## -------------------------------------- ÓÎÏ··þ±¾·þ´¦Àí -------------------------------------------- ''' Ϊ·½±ã±¾·þ¡¢¿ç·þ»¥Í¨¹«»áÂß¼­Í³Ò»£¬¹«»áÏà¹ØÊý¾Ý´¦ÀíͳһʹÓà CrossPlayer£¬ÊÓΪÒÔǰµÄGameServer´¦Àí£¬ÕâÑù±¾·þ¿ç·þµÄ¹«»á¹ÜÀíͨÓà ±¾·þµÄcurPlayer½ö´¦ÀíÒÔǰÀàËÆMapServerµÄcurPlayerÏà¹ØÂß¼­ ¡¾×¢¡¿ MapServerµÄÂß¼­²»ÄÜÔÙÖ±½Ó»ñÈ¡ family ʵÀý½øÐÐÂß¼­´¦Àí£¬Ö»ÄÜ´¦Àí curPlayer ¿ÉÓõÄÂß¼­ ''' def C2S_FamilyMapPlayer(dataMsg, playerID): curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(playerID) if not curPlayer: return doType = dataMsg["doType"] doData = dataMsg["doData"] if doType == "FamilyRefresh": Do_MapServer_FamilyRefresh(curPlayer, doData) return def Do_MapServer_FamilyRefresh(curPlayer, doData): tick = GameWorld.GetGameWorld().GetTick() playerID = curPlayer.GetPlayerID() refreshFamilyID = doData["FamilyID"] refreshFmLV = doData.get("FmLV", 0) refreshJoinTime = doData.get("JoinTime", 0) refreshFamilyLV = doData.get("FamilyLV", 0) refreshFamilyName = doData.get("FamilyName", "") refreshEmblemID = doData.get("EmblemID", 0) refreshEmblemWord = doData.get("EmblemWord", "") isLogin = doData.get("isLogin", 0) # ÊÇ·ñµÇ¼ˢÐ嵀 PlayerViewCache.UpdPlayerViewFamilyInfo(playerID, refreshFamilyID, refreshFamilyName, refreshEmblemID, refreshEmblemWord) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyJoinTime, refreshJoinTime) lastFamilyID = curPlayer.GetFamilyID() lastFamilyLV = curPlayer.GetFamilyLV() # ¹«»áµÈ¼¶£¬·ÇְλµÈ¼¶ lastFmLV = PlayerControl.GetFamilyMemberLV(curPlayer) if lastFamilyID != refreshFamilyID: curPlayer.SetFamilyID(refreshFamilyID) if curPlayer.GetFamilyName() != refreshFamilyName: curPlayer.SetFamilyName(refreshFamilyName) #curPlayer.Notify_FamilyNameRefresh() #//04 36 ÖÜÎ§Íæ¼Ò¼Ò×åÃûË¢ÐÂ#tagPlayerFamilyNameRefresh if lastFmLV != refreshFmLV: PlayerControl.SetFamilyMemberLV(curPlayer, refreshFmLV) if lastFamilyLV != refreshFamilyLV: isLVUP = False if lastFamilyLV and refreshFamilyLV > 0: #´¥·¢¼Ò×åÉý¼¶Ê¼þ isLVUP = True curPlayer.SetFamilyLV(refreshFamilyLV) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyLV, refreshFamilyLV) #´¥·¢¼Ò×åÉý¼¶Ê¼þ, ÔÚSetFamilyLVÖ®ºó£¬ÈÎÎñ¿ÉÒÔÈ¡µÈ¼¶Åж¨ if isLVUP: pass if lastFamilyID != 0 and curPlayer.GetFamilyID() == 0: #Íæ¼ÒÀ뿪¼Ò×å isVoluntarily = doData.get("isVoluntarily", 0) __OnLeaveFamily(curPlayer, isVoluntarily, tick) elif lastFamilyID == 0 and curPlayer.GetFamilyID() != 0: #¸Õ½ø¼Ò×岢Ϊ×峤,´¥·¢½¨¼Ò×åʼþ if curPlayer.GetFamilyMemberLV() == IPY_GameWorld.fmlLeader: pass #½øÈë¼Ò×å´¥·¢Ê¼þ __OnEnterFamily(curPlayer, tick) #---֪ͨ¿Í»§¶ËË¢ÐÂÊôÐÔ--- curPlayer.View_FamilyInfoRefresh() #//04 30 Íæ¼Ò¼Ò×åÃû×ÖְλµÈÐÅϢˢÐÂ#tagPlayerInFamilyInfoRefresh if isLogin: Do_MapServer_PlayerLogin(curPlayer) return def Do_MapServer_PlayerLogin(curPlayer): ## µØÍ¼¹«»áÍæ¼ÒµÄµÇ¼Âß¼­ÓÉ×îÐÂËùÊô¹«»áˢкó´¦Àí DBFamily.Sync_FamilyCrossInfo(curPlayer) SyncDonateCntInfo(curPlayer) PlayerFamilyZhenbaoge.OnPlayerLogin(curPlayer) PlayerFamilyTaofa.OnPlayerLogin(curPlayer) return def __OnEnterFamily(curPlayer, tick): ## ½øÈë¼Ò×å´¥·¢Ê¼þ PlayerTask.UpdTaskValue(curPlayer, ChConfig.TaskType_ReqOrJoinFamily) return def __OnLeaveFamily(curPlayer, isVoluntarily, tick): ## Í˳ö¼Ò×å´¥·¢Ê¼þ #---Çå¿Õ¼Ò×åÏà¹ØÐÅÏ¢--- curPlayer.SetPerExp(0) curPlayer.SetFamilyHornor(0) curPlayer.SetFamilyActiveValue(0) curPlayer.SetLastWeekFamilyActiveValue(0) curPlayer.SetFamilyLV(0) PlayerControl.SetLeaveFamilyTimeEx(curPlayer, int(time.time())) leaveCnt, kickedCnt, _ = PlayerControl.GetLeaveFamilyInfo(curPlayer) GameWorld.DebugLog("__OnLeaveFamily: isVoluntarily=%s,leaveCnt=%s,kickedCnt=%s" % (isVoluntarily, leaveCnt, kickedCnt)) delMoneyType, delMoneyPer = IpyGameDataPY.GetFuncCfg("FamilyLeave", 3), 0 if isVoluntarily: delMoneyPerList = IpyGameDataPY.GetFuncEvalCfg("FamilyLeave", 4) if delMoneyPerList: delMoneyPer = delMoneyPerList[leaveCnt] if len(delMoneyPerList) > leaveCnt else delMoneyPerList[-1] leaveCnt += 1 GameWorld.DebugLog(" Ôö¼ÓÖ÷¶¯À뿪´ÎÊý: leaveCnt=%s" % (leaveCnt)) else: delMoneyPerList = IpyGameDataPY.GetFuncEvalCfg("FamilyLeave", 5) if delMoneyPerList: delMoneyPer = delMoneyPerList[kickedCnt] if len(delMoneyPerList) > kickedCnt else delMoneyPerList[-1] kickedCnt += 1 GameWorld.DebugLog(" Ôö¼Ó±»ÌßÀ뿪´ÎÊý: kickedCnt=%s" % (kickedCnt)) PlayerControl.SetLeaveFamilyInfo(curPlayer, leaveCnt, kickedCnt, isVoluntarily) if delMoneyType and delMoneyPer: nowMoney = PlayerControl.GetMoney(curPlayer, delMoneyType) delMoney = int(nowMoney * delMoneyPer / 100.0) GameWorld.DebugLog(" ¿Û³ý»õ±Ò: delMoneyType=%s,delMoneyPer=%s,nowMoney=%s,delMoney=%s" % (delMoneyType, delMoneyPer, nowMoney, delMoney)) PlayerControl.PayMoney(curPlayer, delMoneyType, delMoney, "LeaveFamily") PlayerFamilyTaofa.OnPlayerLeaveFamily(curPlayer) FBLogic.OnLeaveFamily(curPlayer, tick) return def ResetDailyDonateCnt(curPlayer): isReset = False ipyDataMgr = IpyGameDataPY.IPY_Data() for index in range(ipyDataMgr.GetFamilyDonateCount()): ipyData = ipyDataMgr.GetFamilyDonateByIndex(index) donateType = ipyData.GetDonateType() donateCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyDonateCnt % donateType) if donateCnt: PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyDonateCnt % donateType, 0) isReset = True if isReset: SyncDonateCntInfo(curPlayer) return def SyncDonateCntInfo(curPlayer): donateCntList = [] ipyDataMgr = IpyGameDataPY.IPY_Data() for index in range(ipyDataMgr.GetFamilyDonateCount()): ipyData = ipyDataMgr.GetFamilyDonateByIndex(index) donateType = ipyData.GetDonateType() donateCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyDonateCnt % donateType) donateCntList.append(donateCnt) if not donateCntList: return clientPack = ChPyNetSendPack.tagSCDonateCntInfo() clientPack.DonateCntList = donateCntList clientPack.Count = len(clientPack.DonateCntList) NetPackCommon.SendFakePack(curPlayer, clientPack) return