#!/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 DirtyList
|
import DBDataMgr
|
import DBFamily
|
import CrossMsg
|
|
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():
|
# ·ÇÓÎÏ··þ»ò±¾·þÒÑ¿ç·þ»¥Í¨Á˲»´¦Àí
|
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():
|
# ·ÇÓÎÏ··þ»ò±¾·þÒÑ¿ç·þ»¥Í¨Á˲»´¦Àí
|
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)
|
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)
|
Do_MapServer_PlayerOnDay(curPlayer)
|
return
|
|
def OnPlayerLogin(curPlayer, tick):
|
Do_MapServer_PlayerLogin(curPlayer)
|
if DBFamily.IsFamilyCross():
|
#¹«»áÒÑ¿ç·þ²»´¦Àí£¬ÓÉËùÊô¿ç·þ·þÎñÆ÷´¦Àí³ÉÔ±µÇ¼Âß¼
|
return
|
crossPlayer = CrossPlayer.GetCrossPlayerMgr().FindCrossPlayer(curPlayer.GetPlayerID())
|
OnCrossPlayerLogin(crossPlayer)
|
return
|
|
def OnCrossPlayerLogin(crossPlayer):
|
## Íæ¼ÒÉÏÏߣ¬ÓÎÏ··þ¿ç·þͨÓã¬Á÷³ÌÉϵ±×öÒÔǰGameServer´¦Àí¹«»áÒ»Ñù£¬´¦ÀíºóÔÙ֪ͨµØÍ¼£¨ÏÖÔÚµÄÓÎÏ··þ£©
|
PlayerLoginRefreshFamily(crossPlayer)
|
Sync_RequestAddFamilyInfo(crossPlayer, False)
|
#PlayerFamilyTaofa.OnPlayerLogin(curPlayer) ÌÖ·¥´ýÐÞ¸Ä
|
return
|
|
def OnPlayerLogout(curPlayer):
|
if DBFamily.IsFamilyCross():
|
#¹«»áÒÑ¿ç·þ²»´¦Àí£¬ÓÉËùÊô¿ç·þ·þÎñÆ÷´¦Àí³ÉÔ±µÇ¼Âß¼
|
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):
|
''' Ï൱ÓÚGameServerµ÷Óà curPlayer.MapServer_FamilyRefresh()
|
'''
|
playerID = crossPlayer.GetPlayerID()
|
FmLV = 0 # ְλ
|
FamilyLV = 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()
|
else:
|
familyID = 0
|
|
crossPlayer.SetFamilyID(familyID)
|
|
doData = {"FamilyID":familyID}
|
if familyID:
|
doData.update({"FmLV":FmLV, "FamilyLV":FamilyLV, "FamilyName":FamilyName, "EmblemID":EmblemID, "EmblemWord":EmblemWord})
|
if isVoluntarily:
|
doData["isVoluntarily"] = 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)
|
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)
|
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
|
|
# ת·¢ÇëÇóCDÑéÖ¤
|
if reqCD:
|
reqTick = curPlayer.GetDictByKey("FamilyPyPackForwardingTick")
|
if reqTick and (tick - reqTick) < reqCD * 1000:
|
PlayerControl.NotifyCode(curPlayer, "RequestLater")
|
return
|
curPlayer.SetDict("FamilyPyPackForwardingTick", 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
|
curPlayer.SetDict("FamilyPyPackForwardingTick", 0)
|
|
funcName = dataMsg["funcName"]
|
packBuff = dataMsg.get("packBuff")
|
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()
|
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" % (newFamilyID, playerID, emblemID, serverID))
|
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)
|
zoneMgr = familyMgr.GetZoneFamilyMgrByFamilyID(newFamilyID)
|
zoneMgr and zoneMgr.Sort()
|
|
#XW_JZ_EstablishSud <n color="255,255,0">¹§Ï²Äú£¬¼Ò×彨Á¢³É¹¦!</n> 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 <n color="255,255,0">¶Ô²»Æð£¬ÄúÊäÈëµÄ¼Ò×åÃûÒÑ´æÔÚ£¬½¨Á¢¼Ò×åʧ°Ü£¡</n> 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)
|
curFamily.SetFightPowerTotal(curFamily.GetFightPowerTotal() + member.GetFightPowerTotal())
|
|
if jionFamilySetLv == IPY_PlayerDefine.fmlLeader:
|
curFamily.SetLeaderID(playerID)
|
|
if broadcastFamilyChange:
|
Broadcast_FamilyInfo(familyID, changeMemIDList=[playerID])
|
|
familyMgr.DelPlayerReqJoinFamilyIDAll(playerID)
|
#ÉèÖÃÍæ¼ÒÉíÉϱ£´æµÄ¼Ò×åÐÅÏ¢
|
if crossPlayer:
|
MapServer_FamilyRefresh(crossPlayer, familyID)
|
Sync_RequestAddFamilyInfo(crossPlayer)
|
PlayerFamilyTaofa.OnCrossPlayerEnterFamily(crossPlayer)
|
|
#if jionFamilySetLv != IPY_PlayerDefine.fmlLeader:
|
#֪ͨËùÓмÒ×å³ÉÔ±, Õâ¸öÈ˼ÓÈëÁ˼Ò×å
|
#NotifyAllFamilyMemberMsg(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)
|
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
|
|
if changeFmlv == IPY_PlayerDefine.fmlLeader:
|
ChangeFamilyLeader(family, tagMember)
|
|
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=[tagID])
|
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
|
#NotifyAllFamilyMemberMsg(familyID, "XW_JZ_AppointFamily", [memName, changeFamilyLV])
|
#GetFamilyMgr().SetSyncCrossFamilyUpd(familyMember.GetFamilyID(), familyMember.GetPlayerID(), syncNow=True) # ³ÉԱְλ±ä¸ü
|
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)
|
|
#XW_JZ_LeaveFamily <n color="0,190,255">{%S1%}</n><n color="255,255,0">Í˳öÁ˼Ò×壡</n> 25 - -
|
#NotifyAllFamilyMemberMsg(familyID, "XW_JZ_LeaveFamily", [curPlayer.GetName()])
|
|
__DoPlayerLeaveFamilyByID(family, playerID, crossPlayer)
|
MapServer_FamilyRefresh(crossPlayer, 0, 1)
|
CrossPlayer.SendFakePackByFamily(familyID, GetPack_FamilyDel(playerID, crossPlayer.GetPlayerName(), 1))
|
|
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 <n color="0,190,255">{%S1%}</n><n color="255,255,0">Í˳öÁ˼Ò×壡</n> 25 - -
|
#NotifyAllFamilyMemberMsg(familyID, "XW_JZ_LeaveFamily", [tagPlayerName])
|
|
#ɾ³ýÍæ¼Ò
|
crossPlayer = CrossPlayer.GetCrossPlayerMgr().FindCrossPlayer(tagMemberID)
|
__DoPlayerLeaveFamilyByID(family, tagPlayerID, crossPlayer)
|
if crossPlayer:
|
MapServer_FamilyRefresh(crossPlayer, 0)
|
|
CrossPlayer.SendFakePackByFamily(familyID, GetPack_FamilyDel(tagMemberID, tagPlayerName, 0))
|
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 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.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
|
|
## -------------------------------------- ÓÎÏ··þ±¾·þ´¦Àí --------------------------------------------
|
'''
|
Ϊ·½±ã±¾·þ¡¢¿ç·þ»¥Í¨¹«»áÂ߼ͳһ£¬¹«»áÏà¹ØÊý¾Ý´¦ÀíͳһʹÓà 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_PlayerOnDay(curPlayer):
|
ResetDailyDonateCnt(curPlayer)
|
return
|
|
def Do_MapServer_PlayerLogin(curPlayer):
|
SyncDonateCntInfo(curPlayer)
|
PlayerFamilyZhenbaoge.OnPlayerLogin(curPlayer)
|
return
|
|
def Do_MapServer_FamilyRefresh(curPlayer, doData):
|
tick = GameWorld.GetGameWorld().GetTick()
|
playerID = curPlayer.GetPlayerID()
|
refreshFamilyID = doData["FamilyID"]
|
refreshFmLV = doData.get("FmLV", 0)
|
refreshFamilyLV = doData.get("FamilyLV", 0)
|
refreshFamilyName = doData.get("FamilyName", "")
|
refreshEmblemID = doData.get("EmblemID", 0)
|
refreshEmblemWord = doData.get("EmblemWord", "")
|
|
PlayerViewCache.UpdPlayerViewFamilyInfo(playerID, refreshFamilyID, refreshFamilyName, refreshEmblemID, refreshEmblemWord)
|
|
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
|
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
|