#!/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 PlayerFamilyTech
import PlayerFamilyEmblem
import PlayerFamilyZhenfa
import PlayerFamilyZhenbaoge
import IPY_PlayerDefine
import IpyGameDataPY
import IPY_GameWorld
import GameFuncComm
import ItemCommon
import DBDataMgr
import DirtyList
import random
import time
#ÉêÇë¡¢ÉóºË¡¢Í˳ö¡¢ÌßÈË¡¢¾èÏס¢Éý¼¶
Def_CreatFamily_MaxStr = 33
#ÏÉÃ˱ä¸üÀàÐÍ
FamilyChangeTypes = (
FamilyChangeType_None,
FamilyChangeType_MemJoin, # ³ÉÔ±¼ÓÈë 1
FamilyChangeType_MemLeave, # ³ÉÔ±Í˳ö 2
FamilyChangeType_JoinSet, # ÊÕÈËÉèÖÃÐÞ¸Ä 3
FamilyChangeType_Broadcast, # ¹«¸æÐÞ¸Ä 4
FamilyChangeType_EChange, # »ÕÕÂÐÞ¸Ä 5
FamilyChangeType_LeaderChange, # ÃËÖ÷±ä¸ü 6
FamilyChangeType_MemFmlvChange, # ³ÉԱְλ±ä¸ü 7
FamilyChangeType_MemLogin, # ³ÉÔ±ÉÏÏß 8
FamilyChangeType_MemLogout, # ³ÉÔ±ÀëÏß9
) = range(10)
#ÏÉÃËȨÏÞ
(
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 FamilyOnDay():
if GameWorld.IsCrossServer():
return
familyManager = DBDataMgr.GetFamilyMgr()
for i in range(0, familyManager.GetCount()):
family = familyManager.GetAt(i)
#Õ䱦¸ó
PlayerFamilyZhenbaoge.OnDay(family)
return
def PlayerOnDay(curPlayer):
if not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Family):
return
#ÿÈÕ¸£Àû½±Àø
Sync_FamilyDayRewardState(curPlayer)
__FamilyAffair_Refresh(curPlayer, True)
PlayerFamilyZhenbaoge.PlayerOnDay(curPlayer)
return
def OnPlayerLogin(curPlayer, tick):
if not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Family):
return
PlayerLoginRefreshFamily(curPlayer, tick)
Sync_RequestAddFamilyInfo(curPlayer, False)
Sync_FamilyDayRewardState(curPlayer)
PlayerFamilyTech.Sync_PlayerFamilyTechLV(curPlayer)
__FamilyAffair_CheckReset(curPlayer)
PlayerFamilyZhenfa.OnPlayerLogin(curPlayer)
PlayerFamilyZhenbaoge.OnPlayerLogin(curPlayer)
return
def OnPlayerLogout(curPlayer):
playerID = curPlayer.GetPlayerID()
familyID = curPlayer.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()))
#XW_JZ_LeaguerLeaveline {%S1%}ÏÂÏßÁË£¡ 25 - -
NotifyAllFamilyMemberMsg(familyID, "XW_JZ_LeaguerLeaveline", [curPlayer.GetPlayerName()])
Broadcast_FamilyChange(familyID, FamilyChangeType_MemLogout, excludeIDList=[playerID])
return
def OnWeekEx(curPlayer):
#ÖØÖÃ
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FamilyActivityAwardRecord, 0)
for actionid in ShareDefine.FamilyActiveIDList:
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FamilyActivityFinishCnt%actionid, 0)
return
def PlayerLoginRefreshFamily(curPlayer, tick):
## Íæ¼ÒµÇ¼ʱˢмÒ×å
playerID = curPlayer.GetPlayerID()
familyMgr = DBDataMgr.GetFamilyMgr()
refreshFamilyID = familyMgr.GetPlayerFamilyID(playerID)
MapServer_FamilyRefresh(curPlayer, refreshFamilyID)
familyID = curPlayer.GetFamilyID()
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.RefreshMember(curPlayer)
Sync_FamilyInfo(curPlayer)
#֪ͨÕÐÈË
if GetFamilyMemberHasPow(curMember, FamilyPowerID_Call):
NetPackCommon.SendFakePack(curPlayer, GetPack_FamilyReqJoinInfo(familyID))
#XW_JZ_LeaguerOnline {%S1%}ÉÏÏßÁË£¡ 25 - -
NotifyAllFamilyMemberMsg(familyID, "XW_JZ_LeaguerOnline", [curPlayer.GetName()], [playerID])
Broadcast_FamilyChange(familyID, FamilyChangeType_MemLogin, excludeIDList=[playerID])
# ÃËÖ÷ÉÏÏß´¦Àí
if curMember.GetFmLV() == IPY_PlayerDefine.fmlLeader:
OnFamilyLeaderLogin(curPlayer)
return
def OnFamilyLeaderLogin(curPlayer):
## ÃËÖ÷µÇ¼¶îÍâ´¦Àí
return
#// A6 04 ´´½¨¼Ò×å #tagCMCreateFamily
#
#struct tagCMCreateFamily
#{
# tagHead Head;
# char Name[33];
# WORD EmblemID; //Ñ¡Ôñ»ÕÕÂID£¬½âËøÏÉÃ˵ȼ¶Îª1¼¶µÄ¾ùΪ¿ÉÑ¡ID
#};
def OnCreateFamily(index, clientPack, tick):
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
inputName = clientPack.Name
emblemID = clientPack.EmblemID
if not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Family):
return
playerID = curPlayer.GetPlayerID()
playerFamilyID = curPlayer.GetFamilyID()
familyMgr = DBDataMgr.GetFamilyMgr()
if playerFamilyID:
curFamily = familyMgr.FindFamily(playerFamilyID)
if curFamily:
if curFamily.FindMember(playerID):
#Íæ¼ÒÒѾÓмÒ×å, ´´½¨Ê§°Ü
PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_85890")
return
fullFamilyName = CheckInputFamilyName(curPlayer, inputName)
if not fullFamilyName:
return
needMoney = IpyGameDataPY.GetFuncCfg("CreateFamily", 1)
moneyType = IpyGameDataPY.GetFuncCfg("CreateFamily", 2)
if moneyType and needMoney:
if not PlayerControl.PayMoney(curPlayer, moneyType, needMoney, "CreateFamily"):
return
serverID = GameWorld.GetPlayerServerID(curPlayer)
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" % (newFamilyID, playerID, emblemID))
curFamily.SetEmblemID(emblemID)
#-ÉèÖüÒ×å³ÉÔ±ÊôÐÔ
DoPlayerJionFamily(curFamily, playerID, curPlayer, IPY_PlayerDefine.fmlLeader)
familyMgr.Sort()
#XW_JZ_EstablishSud ¹§Ï²Äú£¬¼Ò×彨Á¢³É¹¦! 25 - -
PlayerControl.NotifyCode(curPlayer, "XW_JZ_EstablishSud")
PlayerControl.WorldNotify(0, "jiazu_liubo_671654", [curPlayer.GetName(), fullFamilyName, newFamilyID])
PlayerFamilyZhenbaoge.OnZhenbaogeReset(curFamily)
return
def CheckInputFamilyName(curPlayer, inputName):
'''¼ì²éÍæ¼ÒÊäÈëµÄÏÉÃËÃûÊÇ·ñºÏ·¨£¬½¨ÃË¡¢¸ÄÃûͨÓÃ
@return: None-²»ºÏ·¨£»·Ç¿Õ-ºÏ·¨µÄÏÉÃËÈ«Ãû
'''
#C++¹ýÂ˿ոñ
familyName = GameWorld.GetGameWorld().GetCharTrim(inputName)
fullFamilyName = GetFamilyFullName(curPlayer, familyName)
if not fullFamilyName:
GameWorld.ErrLog("¼Ò×åÈ«ÃûÒì³£!", curPlayer.GetPlayerID())
return
if DirtyList.IsWordForbidden(familyName):
#XW_JZ_Family_NameNoLegality ¶Ô²»Æð,¼Ò×åÃû³ÆÖк¬ÓзǷ¨×Ö·û
PlayerControl.NotifyCode(curPlayer, "XW_JZ_Family_NameNoLegality")
return
if len(familyName) <= 0 or len(familyName) > Def_CreatFamily_MaxStr:
PlayerControl.NotifyCode(curPlayer, "GeRen_liubo_980181", [Def_CreatFamily_MaxStr / 2, Def_CreatFamily_MaxStr])
return
familyMgr = DBDataMgr.GetFamilyMgr()
if familyMgr.FindFamilyByName(fullFamilyName):
#XW_JZ_EstablishErr_Name ¶Ô²»Æð£¬ÄúÊäÈëµÄ¼Ò×åÃûÒÑ´æÔÚ£¬½¨Á¢¼Ò×åʧ°Ü£¡ 25 - -
PlayerControl.NotifyCode(curPlayer, "XW_JZ_EstablishErr_Name")
return
return fullFamilyName
## »ñÈ¡¼Ò×åÈ«Ãû
def GetFamilyFullName(curPlayer, familyName):
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 ""
specServerDict = IpyGameDataPY.GetFuncEvalCfg("FamilyNameFormat", 4, {})
nameFormatInfo = GameWorld.GetDictValueByRangeKey(specServerDict, serverID)
if not nameFormatInfo:
nameFormatInfo = IpyGameDataPY.GetFuncEvalCfg("FamilyNameFormat", 1)
if not nameFormatInfo:
return ""
nameFormat = nameFormatInfo[0]
paramList = [eval(pName) for pName in nameFormatInfo[1:]]
fullName = nameFormat % tuple(paramList)
maxLen = IpyGameDataPY.GetFuncCfg("FamilyNameFormat", 2)
if len(fullName) > maxLen:
GameWorld.ErrLog("ÏÉÃËÈ«Ãû familyName=%s,È«Ãû=%s len=%s > %s, check FamilyNameFormat.txt" % (familyName, fullName, len(fullName), maxLen))
PlayerControl.NotifyCode(curPlayer, "GeRen_liubo_980181", [maxLen / 2, maxLen])
return ""
return fullName
def DoPlayerJionFamily(family, playerID, jionPlayer, jionFamilySetLv=IPY_PlayerDefine.fmlMember, broadcastFamilyChange=True):
'''¼ÓÈë¼Ò×壬֧³ÖÀëÏßÍæ¼Ò¼ÓÈë
@param jionPlayer: Èç¹ûÊÇÀëÏßÍæ¼ÒÔòΪNone
'''
if isinstance(family, int):
familyID = family
familyMgr = DBDataMgr.GetFamilyMgr()
curFamily = familyMgr.FindFamily(familyID)
else:
curFamily = family
if not curFamily:
return
familyID = curFamily.GetID()
member = curFamily.AddMember(playerID)
member.SetFmLV(jionFamilySetLv)
if jionPlayer:
member.RefreshMember(jionPlayer)
else:
member.RefreshMemberByID(playerID)
curFamily.SetFightPowerTotal(curFamily.GetFightPowerTotal() + member.GetFightPowerTotal())
if jionFamilySetLv == IPY_PlayerDefine.fmlLeader:
curFamily.SetLeaderID(playerID)
#ÉèÖÃÍæ¼ÒÉíÉϱ£´æµÄ¼Ò×åÐÅÏ¢
if jionPlayer:
MapServer_FamilyRefresh(jionPlayer, familyID)
Sync_FamilyInfo(jionPlayer)
if jionFamilySetLv != IPY_PlayerDefine.fmlLeader:
if broadcastFamilyChange:
Broadcast_FamilyChange(familyID, FamilyChangeType_MemJoin, excludeIDList=[playerID])
#֪ͨËùÓмÒ×å³ÉÔ±, Õâ¸öÈ˼ÓÈëÁ˼Ò×å
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)
#Íæ¼Ò»º´æ
#PlayerViewCache.OnPlayerFamilyChange(jionPlayer.GetPlayerID(), curFamily.GetID(), curFamily.GetName())
#PlayerTeam.OnTeamMemFamilyRefresh(jionPlayer, curFamily.GetID())
#SetMemberFightPower(familyMember, PlayerControl.GetFightPower(jionPlayer))
#GetFamilyMgr().AddFamilyIDToFightPowerChangeList(curFamily.GetID(), jionPlayer.GetPlayerID())
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 MapServer_FamilyRefresh(curPlayer, refreshFamilyID):
''' Ï൱ÓÚGameServerµ÷Óà curPlayer.MapServer_FamilyRefresh()
@param familyID: Íæ¼Ò¸üеÄfamilyID
'''
tick = GameWorld.GetGameWorld().GetTick()
playerID = curPlayer.GetPlayerID()
refreshFmLV = 0
refreshFamilyLV = 0
refreshEmblemID = 0
refreshFamilyName = ""
if refreshFamilyID:
familyMgr = DBDataMgr.GetFamilyMgr()
curFamily = familyMgr.FindFamily(refreshFamilyID)
if curFamily:
refreshFamilyLV = curFamily.GetLV()
refreshFamilyName = curFamily.GetName()
refreshEmblemID = curFamily.GetEmblemID()
member = curFamily.FindMember(playerID)
if member:
refreshFmLV = member.GetFmLV()
else:
refreshFamilyID = 0
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 PlayerControl.GetFamilyEmblemID(curPlayer) != refreshEmblemID:
PlayerControl.SetFamilyEmblemID(curPlayer, refreshEmblemID)
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:
#Íæ¼ÒÀ뿪¼Ò×å
__OnLeaveFamily(curPlayer, 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):
## ½øÈë¼Ò×å´¥·¢Ê¼þ
familyMgr = DBDataMgr.GetFamilyMgr()
familyMgr.DelPlayerReqJoinFamilyIDAll(curPlayer.GetPlayerID())
Sync_RequestAddFamilyInfo(curPlayer)
__FamilyAffair_CheckReset(curPlayer)
PlayerFamilyTech.Sync_PlayerFamilyTechLV(curPlayer)
#GameLogic_FamilyWar.DoCheckChampionFamilyTitle(curPlayer)
#GameLogic_FamilyBoss.OnEnterFamily(curPlayer)
#PlayerFamilyRedPacket.CreatCacheRedPacktet(curPlayer)
#PlayerFamilyZhenfa.OnEnterFamily(curPlayer)
return
def __OnLeaveFamily(curPlayer, tick):
## Í˳ö¼Ò×å´¥·¢Ê¼þ
#---Çå¿Õ¼Ò×åÏà¹ØÐÅÏ¢---
curPlayer.SetPerExp(0)
curPlayer.SetFamilyHornor(0)
curPlayer.SetFamilyActiveValue(0)
curPlayer.SetLastWeekFamilyActiveValue(0)
curPlayer.SetFamilyLV(0)
PlayerControl.SetLeaveFamilyTimeEx(curPlayer, int(time.time()))
FBLogic.OnLeaveFamily(curPlayer, tick)
return
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(curPlayer, infoPack=None):
## // A5 20 Íæ¼Ò¼Ò×åÐÅÏ¢ #tagMCRoleFamilyInfo
familyID = curPlayer.GetFamilyID()
if not familyID:
return
if not infoPack:
infoPack = GetPack_FamilyInfo(familyID)
NetPackCommon.SendFakePack(curPlayer, infoPack)
return
def GetPack_FamilyInfo(familyID):
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.FightPower = curFamily.GetFightPower()
clientPack.FightPowerEx = curFamily.GetFightPowerEx()
clientPack.Broadcast = curFamily.GetBroadcast()
clientPack.BroadcastLen = len(clientPack.Broadcast)
clientPack.LeaderID = curFamily.GetLeaderID()
clientPack.MemberList = []
for index in xrange(curFamily.GetCount()):
member = curFamily.GetAt(index)
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.FightPower = member.GetFightPower()
memInfo.FightPowerEx = member.GetFightPowerEx()
memInfo.FmLV = member.GetFmLV()
memInfo.ServerID = member.GetServerID()
memInfo.ContribTotal = member.GetContribTotal()
memInfo.ContribWeek = member.GetContribWeek()
memInfo.OffTime = member.GetOffTime()
clientPack.MemberList.append(memInfo)
clientPack.MemberCount = len(clientPack.MemberList)
return clientPack
def Broadcast_FamilyChange(familyID, changeType=FamilyChangeType_None, powerID=None, excludeIDList=None):
## // A5 21 ¼Ò×å±ä¸ü #tagMCFamilyChange
# @param excludeIDList: ²»¹ã²¥µÄ³ÉÔ±IDÁбí
clientPack = ChPyNetSendPack.tagMCFamilyChange()
clientPack.Type = changeType
Broadcast_FamilyPack(familyID, clientPack, powerID, excludeIDList)
return
def Broadcast_FamilyPack(familyID, clientPack, powerID=None, excludeIDList=None):
## ¹ã²¥¼Ò×å³ÉÔ±·â°ü
# @param powerID: ¿ÉÖ¸¶¨Ö»·¢¸øÓиÃȨÏ޵ijÉÔ±
# @param excludeIDList: ²»¹ã²¥µÄ³ÉÔ±IDÁбí
if not clientPack:
return
familyMgr = DBDataMgr.GetFamilyMgr()
curFamily = familyMgr.FindFamily(familyID)
if not curFamily:
return
playerManager = GameWorld.GetPlayerManager()
for index in xrange(curFamily.GetCount()):
member = curFamily.GetAt(index)
playerID = member.GetPlayerID()
if excludeIDList and playerID in excludeIDList:
continue
curPlayer = playerManager.FindPlayerByID(playerID)
if not curPlayer:
continue
if powerID != None and not GetFamilyMemberHasPow(member, powerID):
continue
NetPackCommon.SendFakePack(curPlayer, clientPack)
return
def NotifyAllFamilyMemberMsg(familyID, code, paramList=[], excludeIDList=None):
## ֪ͨËùÓмÒ×å³ÉÔ±ÐÅÏ¢
# @param excludeIDList: ²»Í¨ÖªµÄ³ÉÔ±IDÁбí
familyMgr = DBDataMgr.GetFamilyMgr()
curFamily = familyMgr.FindFamily(familyID)
if not curFamily:
return
playerManager = GameWorld.GetPlayerManager()
for i in xrange(curFamily.GetCount()):
member = curFamily.GetAt(i)
playerID = member.GetPlayerID()
if excludeIDList and playerID in excludeIDList:
continue
curPlayer = playerManager.FindPlayerByID(playerID)
if not curPlayer:
continue
PlayerControl.NotifyCode(curPlayer, code, paramList)
return
#// A6 01 ÏòÍæ¼ÒÉêÇë¼ÓÈë¼Ò×å #tagCMRequestJoinFamilyByPlayer
#
#struct tagCMRequestJoinFamilyByPlayer
#{
# tagHead Head;
# DWORD TagPlayerID; //Ä¿±ê¼Ò×åÍæ¼ÒID
#};
def OnRequestJoinFamilyByPlayer(index, clientData, tick):
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)
tagFamilyID = clientData.TagFamilyID # ÉêÇë½øÈëµÄ¼Ò×åID
requestType = clientData.Type # ÉêÇëÀàÐÍ(ÉêÇë/³·Ïú)
# ÉêÇë¼ÓÈë
if requestType == 0:
if not tagFamilyID:
AutoJoinFamily(curPlayer)
else:
RequestJoinTagFamily(curPlayer, tagFamilyID)
# ³·ÏúÉêÇë
elif requestType == 1:
CancelJoinTagFamily(curPlayer, tagFamilyID)
return
def AutoJoinFamily(curPlayer):
if curPlayer.GetFamilyID():
return
playerID = curPlayer.GetPlayerID()
playerLV = curPlayer.GetLV()
GameWorld.DebugLog("Íæ¼ÒÒ»¼ü×Ô¶¯¼ÓÈë¼Ò×壡 playerLV=%s" % playerLV, playerID)
familyMgr = DBDataMgr.GetFamilyMgr()
indexList = range(familyMgr.GetCount())
random.shuffle(indexList) #´òÂÒ˳Ðò
for index in indexList:
family = familyMgr.GetAt(index)
if not family:
continue
familyID = family.GetID()
lvMin = family.GetJoinLVMin()
if lvMin and playerLV < 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, curPlayer)
return
# ¿ÉÔÙÀ©Õ¹×Ô¶¯ÇëÇó£¬ÔÝʱ²»´¦Àí
GameWorld.DebugLog("ûÓпÉ×Ô¶¯½øÈëµÄÏÉÃË!")
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(curPlayer, familyID):
## ÉêÇë¼ÓÈë
playerID = curPlayer.GetPlayerID()
if curPlayer.GetFamilyID():
GameWorld.DebugLog('ÒѾÓÐÏÉÃ˲»ÄÜÔÙÉêÇë¼ÓÈë! familyID=%s' % curPlayer.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 curPlayer.GetLV() < lvMin:
GameWorld.DebugLog('µÈ¼¶Î´´ïµ½¸ÃÏÉÃ˼ÓÈë×îµÍµÈ¼¶ÏÞÖÆ! lv=%s < %s' % (curPlayer.GetLV(), 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)
PlayerControl.NotifyCode(curPlayer, "jiazu_pan_141056")
return
tagFamily.AddReqJoinPlayerID(playerID)
# ¹ã²¥¸øÓÐÕÐÈËȨÏÞµÄ
Broadcast_FamilyPack(familyID, GetPack_FamilyReqJoinInfo(familyID), FamilyPowerID_Call)
#jiazu_pan_500807:ÉêÇëÈë°ï³É¹¦£¡ÇëµÈ´ý°ï»á¹ÜÀíÈËÔ±ÉóÅú£¡
PlayerControl.NotifyCode(curPlayer, "jiazu_pan_500807")
Sync_RequestAddFamilyInfo(curPlayer)
return
# ²»ÐèÒªÉóºË£¬×Ô¶¯¼ÓÈë
memberMax = GetFamilySetting(tagFamily.GetLV(), "MemberMax")
if tagFamily.GetCount() >= memberMax:
GameWorld.DebugLog('Ä¿±êÏÉÃ˳ÉÔ±ÒÑÂú! familyLV=%s,memberMax=%s' % (tagFamily.GetLV(), memberMax), playerID)
return
DoPlayerJionFamily(tagFamily, playerID, curPlayer)
return
def CancelJoinTagFamily(curPlayer, familyID):
# ³·ÏúÉêÇë
familyMgr = DBDataMgr.GetFamilyMgr()
playerID = curPlayer.GetPlayerID()
tagFamily = familyMgr.FindFamily(familyID)
if tagFamily:
tagFamily.DelReqJoinPlayerID(playerID)
familyMgr.DelPlayerReqJoinFamilyID(playerID, familyID)
Broadcast_FamilyPack(familyID, GetPack_FamilyReqJoinInfo(familyID), FamilyPowerID_Call)
Sync_RequestAddFamilyInfo(curPlayer)
return
def Sync_RequestAddFamilyInfo(curPlayer, isForce=True):
## ֪ͨµ±Ç°ÉêÇë¼ÓÈëµÄÄÄЩ¼Ò×å
playerID = curPlayer.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)
NetPackCommon.SendFakePack(curPlayer, clientPack)
return
def GetPack_FamilyReqJoinInfo(familyID):
## »ñÈ¡ // A5 22 ¼Ò×åÉêÇë¼ÓÈëµÄÍæ¼ÒÐÅÏ¢ #tagMCFamilyReqJoinInfo
familyMgr = DBDataMgr.GetFamilyMgr()
curFamily = familyMgr.FindFamily(familyID)
if not curFamily:
return
reqPlayerIDDict = curFamily.GetReqJoinPlayerInfo()
playerManager = GameWorld.GetPlayerManager()
clientPack = ChPyNetSendPack.tagMCFamilyReqJoinInfo()
clientPack.ReqJoinList = []
for playerID, reqTime in reqPlayerIDDict.items():
curPlayer = playerManager.FindPlayerByID(playerID)
reqInfo = ChPyNetSendPack.tagMCFamilyReqJoinPlayer()
reqInfo.PlayerID = playerID
reqInfo.ReqTime = reqTime
if curPlayer:
reqInfo.IsOnLine = True
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.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)
tagPlayerID = clientData.TagPlayerID
isOK = clientData.IsOK
playerID = curPlayer.GetPlayerID()
familyID = curPlayer.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
playerManager = GameWorld.GetPlayerManager()
# ¾Ü¾ø
if not isOK:
for tagPlayerID in tagPlayerIDList:
family.DelReqJoinPlayerID(tagPlayerID)
tagPlayer = playerManager.FindPlayerByID(tagPlayerID)
if not tagPlayer:
continue
Sync_RequestAddFamilyInfo(tagPlayer)
#jiazu_pan_592934:{%S}¾Ü¾øÁËÄúµÄÈë°ïÉêÇë
PlayerControl.NotifyCode(tagPlayer, "jiazu_pan_592934", [family.GetName()])
Broadcast_FamilyPack(familyID, GetPack_FamilyReqJoinInfo(familyID), FamilyPowerID_Call)
return
# ´¦ÀíͬÒâ
offlinePlayerCanJoin = IpyGameDataPY.GetFuncCfg("FamilyReqJoin", 3)
MemberMax = GetFamilySetting(family.GetLV(), "MemberMax")
joinOKPlayerIDList = []
for tagPlayerID in tagPlayerIDList:
if family.GetCount() >= MemberMax:
PlayerControl.NotifyCode(curPlayer, "jiazu_lhs_202580")
break
tagPlayer = playerManager.FindPlayerByID(tagPlayerID)
#ÉêÇëÄ¿±ê²»ÔÚÏß
if not tagPlayer:
if not offlinePlayerCanJoin:
GameWorld.DebugLog("ÀëÏßÍæ¼ÒÎÞ·¨¼ÓÈëÏÉÃË! tagPlayerID=%s" % tagPlayerID, playerID)
PlayerControl.NotifyCode(curPlayer, "jiazu_hwj35_367906")
continue
if family.FindMember(tagPlayerID):
GameWorld.DebugLog("ÒѾÊDZ¾Ã˳ÉÔ±! tagPlayerID=%s" % tagPlayerID, playerID)
PlayerControl.NotifyCode(curPlayer, "XW_JZ_InviteErr_Repeat")
continue
tagFamilyID = familyMgr.GetPlayerFamilyID(tagPlayerID)
if tagFamilyID:
GameWorld.DebugLog("ÒѾ¼ÓÈëÆäËûÏÉÃË! tagPlayerID=%s,tagFamilyID=%s" % (tagPlayerID, tagFamilyID), playerID)
PlayerControl.NotifyCode(curPlayer, "XW_JZ_InviteErr_Repeat")
continue
DoPlayerJionFamily(family, tagPlayerID, tagPlayer, broadcastFamilyChange=False)
joinOKPlayerIDList.append(tagPlayerID)
if not joinOKPlayerIDList:
return
Broadcast_FamilyChange(familyID, FamilyChangeType_MemJoin, excludeIDList=joinOKPlayerIDList)
Broadcast_FamilyPack(familyID, GetPack_FamilyReqJoinInfo(familyID), FamilyPowerID_Call)
return
#// A6 22 ÐÞ¸ÄÊÕÈË·½Ê½ #tagCMChangeFamilyJoin
#
#struct tagCMChangeFamilyJoin
#{
# tagHead Head;
# BYTE JoinReview; //³ÉÔ±¼ÓÈëÊÇ·ñÐèÒªÉóºË£¬Ä¬ÈÏ0×Ô¶¯¼ÓÈë
# WORD JoinLVMin; //ÏÞÖÆ×îµÍ¿É¼ÓÈëµÄÍæ¼ÒµÈ¼¶
#};
def OnChangeFamilyJoin(index, clientData, tick):
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
joinReview = clientData.JoinReview
joinLVMin = clientData.JoinLVMin
playerID = curPlayer.GetPlayerID()
familyID = curPlayer.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)
Sync_FamilyInfo(curPlayer)
Broadcast_FamilyChange(familyID, FamilyChangeType_JoinSet, FamilyPowerID_Call, excludeIDList=[playerID])
return
#// A6 23 Ð޸ļÒ×幫¸æ #tagCMChangeFamilyBroadcast
#
#struct tagCMChangeFamilyBroadcast
#{
# tagHead Head;
# char Msg[200];
#};
def OnChangeFamilyBroadcast(index, clientData, tick):
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
broadcast = clientData.Msg
playerID = curPlayer.GetPlayerID()
familyID = curPlayer.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)
Sync_FamilyInfo(curPlayer)
Broadcast_FamilyChange(familyID, FamilyChangeType_Broadcast, excludeIDList=[playerID])
return
#// A6 24 Ð޸ļÒ×å»ÕÕ #tagCMChangeFamilyEmblem
#
#struct tagCMChangeFamilyEmblem
#{
# tagHead Head;
# BYTE EmblemID; // ¸ü»»µÄ»ÕÕÂID
#};
def OnChangeFamilyEmblem(index, clientData, tick):
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
changeEmblemID = clientData.EmblemID
PlayerFamilyEmblem.OnChangeFamilyEmblem(curPlayer, changeEmblemID)
return
#// A6 25 Ð޸ļÒ×å³ÉԱְλ #tagCMChangeFamilyMemLV
#
#struct tagCMChangeFamilyMemLV
#{
# tagHead Head;
# DWORD PlayerID; // Ä¿±ê³ÉÔ±ID
# BYTE FmLV; // ±ä¸üΪxxְλ
#};
def OnChangeFamilyMemLV(index, clientData, tick):
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
OnChangeFamilyMemberLV(curPlayer, clientData.PlayerID, clientData.FmLV)
return
def OnChangeFamilyMemberLV(curPlayer, tagID, changeFmlv, isGMOP=False):
'''±ä¸ü³ÉԱְλ
@param curPlayer: ²Ù×÷µÄÍæ¼Ò
@param tagID: Ä¿±ê³ÉÔ±ID
@param changeFmlv: ÐÞ¸ÄΪxxְλ
@param isGMOP: ÊÇ·ñÊÇGMºǫ́·¢ÆðµÄ£¬Èç¹ûÊÇGM·¢ÆðµÄ£¬Ò»°ãcurPlayer´«ÈëµÄΪĿ±ê³ÉÔ±IDʵÀý
'''
if not curPlayer:
return
playerID = curPlayer.GetPlayerID()
familyID = curPlayer.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:
changeType = FamilyChangeType_LeaderChange
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
PlayerControl.NotifyCode(curPlayer, "jiazu_chenxin_31379")
GameWorld.DebugLog("Ŀǰ¸ÃְλµÄÈËÊýÒѾ´ïµ½ÉÏÏÞ! changeFmlv=%s,fmLVMemCnt=%s >= %s" % (changeFmlv, fmLVMemCnt, maxCnt))
return
changeType = FamilyChangeType_MemFmlvChange
ChangeFamilyMemberLv(tagMember, changeFmlv)
if isGMOP:
family.SetBroadcast("")
Sync_FamilyInfo(curPlayer)
Broadcast_FamilyChange(familyID, changeType, excludeIDList=[playerID, 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)
tagPlayer = GameWorld.GetPlayerManager().FindPlayerByID(tagID)
if tagPlayer:
MapServer_FamilyRefresh(tagPlayer, familyID)
Sync_FamilyInfo(tagPlayer)
if GetFamilyMemberHasPow(tagMember, FamilyPowerID_Call):
NetPackCommon.SendFakePack(tagPlayer, 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
#// A6 26 ÇëÇó¼Ò×å³ÉÔ±Áбí #tagCMGetFamilyInfo
#
#struct tagCMGetFamilyInfo
#{
# tagHead Head;
#};
def OnGetFamilyInfo(index, clientData, tick):
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
Sync_FamilyInfo(curPlayer)
return
#// A6 03 À뿪¼Ò×å #tagCMLeaveFamily
#
#struct tagCMLeaveFamily
#{
# tagHead Head;
#};
def OnLeaveFamily(index, clientData, tick):
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
playerID = curPlayer.GetPlayerID()
familyID = curPlayer.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(curPlayer.GetName(), familyID, ShareDefine.Def_ActionType_FamilyEvent,
[ShareDefine.Def_FamilyActionEvent_MemberChange, ShareDefine.Def_FamilyMemberChange_Leave], tick)
#XW_JZ_LeaveFamily {%S1%}Í˳öÁ˼Ò×壡 25 - -
NotifyAllFamilyMemberMsg(familyID, "XW_JZ_LeaveFamily", [curPlayer.GetName()])
MapServer_FamilyRefresh(curPlayer, 0)
if family.GetCount() == 0:
#Íæ¼ÒÀ뿪ºó, ¼Ò×åûÓÐÈËÁË , ɾ³ýÕâ¸ö¼Ò×å
familyMgr.DelFamily(familyID)
return
Broadcast_FamilyChange(familyID, FamilyChangeType_MemLeave)
return
#// A6 05 ɾ³ý¼Ò×å³ÉÔ± #tagCMDeleteFamilyMember
#
#struct tagCMDeleteFamilyMember
#{
# tagHead Head;
# DWORD MemberID;
#};
def OnDeleteFamilyMember(index, clientData, tick):
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
tagMemberID = clientData.MemberID
playerID = curPlayer.GetPlayerID()
if playerID == tagMemberID:
return
familyID = curPlayer.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 - -
NotifyAllFamilyMemberMsg(familyID, "XW_JZ_LeaveFamily", [tagPlayerName])
#ɾ³ýÍæ¼Ò
tagPlayer = GameWorld.GetPlayerManager().FindPlayerByID(tagMemberID)
if tagPlayer:
MapServer_FamilyRefresh(tagPlayer, 0)
Broadcast_FamilyChange(familyID, FamilyChangeType_MemLeave)
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
itemIndex = clientData.ItemIndex
playerID = curPlayer.GetPlayerID()
familyID = curPlayer.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
familyName = CheckInputFamilyName(curPlayer, newName)
if not familyName:
return
itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
curItem = itemPack.GetAt(itemIndex)
if not ItemCommon.CheckItemCanUse(curItem) or curItem.GetType() != ChConfig.Def_ItemType_ChangeFamilyName:
GameWorld.DebugLog("ûÓÐÏÉÃ˸ÄÃûµÀ¾ß! itemIndex=%s" % itemIndex, playerID)
return
ItemCommon.DelItem(curPlayer, curItem, 1, True, 'UpdateFamilyName')
#oldName = curFamily.GetName()
family.SetName(familyName)
infoPack = GetPack_FamilyInfo(familyID)
playerManager = GameWorld.GetPlayerManager()
for index in xrange(family.GetCount()):
member = family.GetAt(index)
memID = member.GetPlayerID()
player = playerManager.FindPlayerByID(memID)
if not player:
continue
Sync_FamilyInfo(player, infoPack)
player.SetFamilyName(familyName)
player.Notify_FamilyNameRefresh() #//04 36 ÖÜÎ§Íæ¼Ò¼Ò×åÃûË¢ÐÂ#tagPlayerFamilyNameRefresh
#PlayerCompensation.SendMailByKey('FamilyNameChange', memberIDList, [], [oldName, familyName])
#PlayerControl.WorldNotify(0, 'Family_ChangeName', [oldName, familyName])
return
#// 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)
msg = clientData.Msg
pageIndex = clientData.PageIndex
showCount = min(clientData.ShowCount, 50)
familyMgr = DBDataMgr.GetFamilyMgr()
familyCount = familyMgr.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.FamilyList = []
for index in range(startIndex, endIndex + 1):
if index >= familyCount:
break
family = familyMgr.GetAt(index)
if not family:
continue
if msg and msg not in family.GetName():
continue
familyView = ChPyNetSendPack.tagMCFamilyView()
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.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
NetPackCommon.SendFakePack(curPlayer, clientPack)
return
#// A6 12 ¼Ò×å¾èÏ×»õ±Ò #tagCMFamilyMoneyDonate
#
#struct tagCMFamilyMoneyDonate
#{
# tagHead Head;
# BYTE DonateType; // ¾èÏ×ÀàÐÍ
#};
def OnFamilyMoneyDonate(index, clientData, tick):
#curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
#DonateType = clientData.DonateType
#playerID = curPlayer.GetPlayerID()
# ÏÈÆÁ±Î£¬µÈ¹¦Äܶ¨ÁËÔÙ¸Ä
return
#---------------------------------------------------------------------
def AddPlayerFamilyActiveValue(curPlayer, addValue, sendPackGameServer = False, reason = 0, isSysMsg=False):
# ¶à¸öµØ·½Óõ½£¬Ïȱ£Áô£¬Ö®ºóɾ³ýͳһÐÞ¸Ä
return True
def SendPack_GameServer_AddFamilyDetail(curPlayer, addFamilyHornor = 0, addFamilyMoney = 0, addFamilyActiveValue = 0, resion=0):
return
def SendPack_GameServer_AddFamilyDetailEx(curPlayer, addPlayerActiveValue, addFamilyMoney = 0, addFamilyHornor = 0, resion=0):
return
## ------------------------------------------------------------------------------------------------
#// A6 17 ²éѯ¼Ò×åÐÐΪÐÅÏ¢ #tagCMQueryFamilyAction
#
#struct tagCMQueryFamilyAction
#{
# tagHead Head;
# BYTE ActionType; // ÐÐΪÀàÐÍ
# DWORD FamilyID; // ¼Ò×åID£¬·¢0ĬÈÏ×Ô¼º¼Ò×å
#};
def OnQueryFamilyAction(index, cliendData, tick):
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
if not curPlayer:
return
actionType = cliendData.ActionType
familyID = cliendData.FamilyID
if not familyID:
familyID = curPlayer.GetFamilyID()
SendFamilyActionInfo(curPlayer, familyID, actionType)
return
def SendFamilyActionInfo(curPlayer, familyID, actionType):
## ·¢ËͼÒ×åÐÐΪ
# @param curPlayer: ΪNoneʱ֪ͨ¸ÃÏÉÃËËùÓгÉÔ±
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 curPlayer:
NetPackCommon.SendFakePack(curPlayer, clientPack)
return
Broadcast_FamilyPack(familyID, clientPack)
return
def SendFamilyAction(actionDataList, curPlayer=None):
## ͬ²½Ö¸¶¨ÏÉÃËaction
# @param actionDataList: Ö§³ÖÁбí»òÖ¸¶¨actionData
# @param curPlayer: Ϊ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 curPlayer:
NetPackCommon.SendFakePack(curPlayer, clientPack)
return
Broadcast_FamilyPack(familyID, clientPack)
return
def GetFamilyDayAward(curPlayer):
##ÁìÈ¡ÏÉÃËÿÈÕ½±Àø 2СʱÍÑ»ú¹Òʱ¼ä
return
def Sync_FamilyDayRewardState(curPlayer):
clientPack = ChPyNetSendPack.tagMCFamilyDayAward()
clientPack.GetState = 0
clientPack.MoneyDonateCount = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyDonateRecord)
NetPackCommon.SendFakePack(curPlayer, clientPack)
return
def AddFamilyActivity(curPlayer, actionid, addCnt=1):
return
##--------------------------------------- ÏÉÃËÊÂÎñ --------------------------------------------------
AffairState_None = 0 # ÎÞ
AffairState_Underway = 1 # ½øÐÐÖÐ
AffairState_Finish = 2 # ÒÑÍê³É
#// A6 13 ¼Ò×åÊÂÎñ²Ù×÷ #tagCMFamilyAffairOP
#
#struct tagCMFamilyAffairOP
#{
# tagHead Head;
# BYTE OPType; // ²Ù×÷ÀàÐÍ£º1-Ë¢ÐÂÊÂÎñ£»2-¿ªÊ¼ÊÂÎñ£»3-ÁìÈ¡ÊÂÎñ½±Àø£»
# WORD AffairID; // ÊÂÎñID£¬¿ÉÑ¡
#};
def OnFamilyAffairOP(index, clientData, tick):
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
opType = clientData.OPType
affairID = clientData.AffairID
if opType == 1:
__FamilyAffair_Refresh(curPlayer)
elif opType == 2:
__FamilyAffair_Start(curPlayer, affairID)
elif opType == 3:
__FamilyAffair_GetAward(curPlayer, affairID)
return
def __FamilyAffair_CheckReset(curPlayer):
## ¼ì²éÈÎÎñÖØÖ㬵Ǽ£¬½øÈëÏÉÃË´¥·¢
info = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyAffairInfo % 1)
if not info:
# ÈÎÎñ1»¹Ã»·ÖÅ䣬ĬÈÏÇ¿ÖÆÖØÖÃ
__FamilyAffair_Refresh(curPlayer, True)
else:
SyncFamilyAffairInfo(curPlayer)
return
def __FamilyAffair_Refresh(curPlayer, isReset=False):
## Ë¢ÐÂÊÂÎñ
playerID = curPlayer.GetPlayerID()
moneyType, moneyValue = 0, 0
dayRefreshFreeCount = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyAffairRefreshFree)
if not isReset:
freeCountMax = IpyGameDataPY.GetFuncCfg("FamilyAffair", 2)
if freeCountMax and dayRefreshFreeCount >= freeCountMax:
moneyType, moneyValue = IpyGameDataPY.GetFuncEvalCfg("FamilyAffair", 3)
if not PlayerControl.HaveMoney(curPlayer, moneyType, moneyValue):
return
sendMailAffairList = []
refreshAffairIDList = []
affairCountMax = IpyGameDataPY.GetFuncCfg("FamilyAffair", 1)
affairStarDict = IpyGameDataPY.GetFuncEvalCfg("FamilyAffair", 4)
maxStar = 0
starWeightList = []
for starStr, starInfo in affairStarDict.items():
star = int(starStr)
if star > maxStar:
maxStar = star
starWeightList.append([starInfo[0], star])
for affairID in range(1, affairCountMax + 1):
star, state = __GetAffairInfo(curPlayer, affairID)
if isReset:
# ÖØÖÃʱ»¹ÔÚ½øÐÐÖеÄÖ±½Ó·¢½±Àø
if state == AffairState_Underway:
sendMailAffairList.append([affairID, star])
refreshAffairIDList.append(affairID)
else:
# ·ÇÖØÖÃÖ»´¦ÀíûÓÐ״̬·Ç×î¸ßÐǵÄ
if state == AffairState_None and star < maxStar:
refreshAffairIDList.append(affairID)
GameWorld.DebugLog("Ë¢ÐÂÊÂÎñ: isReset=%s,moneyType=%s,moneyValue=%s,dayRefreshFreeCount=%s"
% (isReset, moneyType, moneyValue, dayRefreshFreeCount), playerID)
GameWorld.DebugLog(" sendMailAffairList=%s" % sendMailAffairList, playerID)
for mailInfo in sendMailAffairList:
affairID, star = mailInfo
if str(star) not in affairStarDict:
continue
paramList = [affairID, star]
addItemList = affairStarDict[str(star)][2]
PlayerControl.SendMailByKey("FamilyAffairAward", [playerID], addItemList, paramList)
if isReset:
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyAffairRefreshFree, 0)
for affairID in range(1, affairCountMax + 1):
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyAffairInfo % affairID, 0)
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyAffairStartTime % affairID, 0)
else:
if moneyType and moneyValue:
PlayerControl.PayMoney(curPlayer, moneyType, moneyValue, "FamilyAffair")
else:
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyAffairRefreshFree, dayRefreshFreeCount + 1)
GameWorld.DebugLog(" starWeightList=%s" % starWeightList, playerID)
GameWorld.DebugLog(" refreshAffairIDList=%s" % refreshAffairIDList, playerID)
for affairID in refreshAffairIDList:
star = GameWorld.GetResultByWeightList(starWeightList, 1)
__SetAffairInfo(curPlayer, affairID, star, AffairState_None)
GameWorld.DebugLog(" Ëæ»úÊÂÎñ:affairID=%s,star=%s" % (affairID, star), playerID)
SyncFamilyAffairInfo(curPlayer)
return
def __FamilyAffair_Start(curPlayer, affairID):
## ¿ªÊ¼ÊÂÎñ
playerID = curPlayer.GetPlayerID()
star, state = __GetAffairInfo(curPlayer, affairID)
if not star:
return
if state != AffairState_None:
GameWorld.DebugLog("ÏÉÃËÊÂÎñÒѾ½øÐÐÖлòÒÑÍê³É£¬ÎÞ·¨¿ªÊ¼: affairID=%s,star=%s,state=%s" % (affairID, star, state), playerID)
return
startTime = int(time.time())
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyAffairStartTime % affairID, startTime)
__SetAffairInfo(curPlayer, affairID, star, AffairState_Underway)
GameWorld.DebugLog("ÏÉÃËÊÂÎñ¿ªÊ¼: affairID=%s,star=%s,startTime=%s" % (affairID, star, startTime), playerID)
SyncFamilyAffairInfo(curPlayer, affairID)
return
def __FamilyAffair_GetAward(curPlayer, affairID):
## ÁìÈ¡ÊÂÎñ½±Àø
playerID = curPlayer.GetPlayerID()
curTime = int(time.time())
affairStarDict = IpyGameDataPY.GetFuncEvalCfg("FamilyAffair", 4)
star, state = __GetAffairInfo(curPlayer, affairID)
if state != AffairState_Underway:
GameWorld.DebugLog("ÏÉÃËÊÂÎñ״̬·Ç½øÐÐÖÐÎÞ·¨ÁìÈ¡: affairID=%s,star=%s,state=%s" % (affairID, star, state), playerID)
SyncFamilyAffairInfo(curPlayer, affairID)
return
startTime = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyAffairStartTime % affairID)
remainDuration = __GetAffairRemainDuration(curPlayer, affairID, star, curTime, affairStarDict)
if remainDuration != 0:
GameWorld.DebugLog("ÏÉÃËÊÂÎñµ±Ç°Ê£Óàʱ³¤Î´Íê³É: affairID=%s,remainDuration=%s,startTime=%s"
% (affairID, remainDuration, startTime), playerID)
SyncFamilyAffairInfo(curPlayer, affairID)
return
if str(star) not in affairStarDict:
return
addItemList = affairStarDict[str(star)][2]
if not ItemCommon.GiveAwardItem(curPlayer, addItemList):
return
__SetAffairInfo(curPlayer, affairID, star, AffairState_Finish)
GameWorld.DebugLog("ÏÉÃËÊÂÎñÁì½±: affairID=%s,star=%s" % (affairID, star), playerID)
SyncFamilyAffairInfo(curPlayer, affairID)
return
def __GetAffairInfo(curPlayer, affairID):
affairInfo = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyAffairInfo % affairID)
star, state = affairInfo / 10, affairInfo % 10
return star, state
def __SetAffairInfo(curPlayer, affairID, star, state):
info = star * 10 + state
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyAffairInfo % affairID, info)
return
def __GetAffairRemainDuration(curPlayer, affairID, star, curTime, affairStarDict):
## -1-δ¿ªÊ¼£»>=0-Ê£Óàʱ³¤
startTime = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyAffairStartTime % affairID)
if not startTime:
return -1
starInfo = affairStarDict.get(str(star), [])
needDuration = starInfo[1] if len(starInfo) > 1 else 0
# ¿ÉÀ©Õ¹¼õʱ³¤ÊôÐÔ
speedPer = PlayerControl.GetAffairSpeedPer(curPlayer)
if speedPer:
needDuration = int(needDuration * max(10000 - speedPer, 0) / 10000.0)
#GameWorld.DebugLog("ÊÂÎñ¼ÓËÙ: needDuration=%s,speedPer=%s" % (needDuration, speedPer), curPlayer.GetPlayerID())
remainDuration = max(needDuration - (curTime - startTime), 0)
return remainDuration
def SyncFamilyAffairInfo(curPlayer, affairID=None):
if affairID == None:
affairIDList = []
affairCountMax = IpyGameDataPY.GetFuncCfg("FamilyAffair", 1)
for affairID in range(1, affairCountMax + 1):
affairIDList.append(affairID)
else:
affairIDList = [affairID]
curTime = int(time.time())
affairStarDict = IpyGameDataPY.GetFuncEvalCfg("FamilyAffair", 4)
affairInfoList = []
for affairID in affairIDList:
star, state = __GetAffairInfo(curPlayer, affairID)
remainDuration = __GetAffairRemainDuration(curPlayer, affairID, star, curTime, affairStarDict)
affairInfo = ChPyNetSendPack.tagMCFamilyAffair()
affairInfo.AffairID = affairID
affairInfo.Star = star
affairInfo.State = state
affairInfo.RemainDuration = max(0, remainDuration)
affairInfoList.append(affairInfo)
if not affairInfoList:
return
clientPack = ChPyNetSendPack.tagMCFamilyAffairInfo()
clientPack.Clear()
clientPack.RefreshFreeCount = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyAffairRefreshFree)
clientPack.AffairInfoList = affairInfoList
clientPack.Count = len(clientPack.AffairInfoList)
NetPackCommon.SendFakePack(curPlayer, clientPack)
return