#!/usr/bin/python
|
# -*- coding: GBK -*-
|
#-------------------------------------------------------------------------------
|
#
|
#-------------------------------------------------------------------------------
|
#
|
##@package GameWorldMixServerCampaign
|
#
|
# @todo:ºÏ·þ»î¶¯
|
# @author hxp
|
# @date 2014-12-03
|
# @version 1.2
|
#
|
# ÏêϸÃèÊö: ºÏ·þ»î¶¯
|
# @change: "2015-07-10 17:30" ljd ÅÅÐаñ¼ÓÍæ¼Òƽ̨²ÎÊýName2
|
# @change: "2016-11-21 10:30" xdh Ôö¼ÓÓʼþ²¹·¢ºÏ·þ½±Àø,Ôö¼ÓÕ½ÃË»÷ɱboss»î¶¯
|
#
|
#---------------------------------------------------------------------
|
"""Version = 2016-11-21 10:30"""
|
|
|
import GameWorld
|
import PlayerDBGSEvent
|
import PlayerBillboard
|
import DataRecordPack
|
import ReadChConfig
|
import ShareDefine
|
|
#---------------------------------------------------------------------
|
|
#½±ÀøÅÅÐаñcopyÊý¾ÝÀ´Ô´
|
Def_MixAward_Billboard_Copy_Dict = {
|
#ShareDefine.Def_BT_MixCampaign_PlayerBattle:ShareDefine.Def_BT_FightPower, # Õ½¶·Á¦
|
}
|
|
#MixServerCampaign±í×ÖµäÖµÁбíö¾Ù
|
(
|
Def_MixCampaign_Index_InterceptTime, # ½±ÀøÊý¾Ý½ØÈ¡Ê±¼ä
|
Def_MixCampaign_Index_AwardTime, # Á콱ʱ¼ä
|
Def_MixCampaign_Index_MaxPlace, # ǰ¼¸Ãû¿ÉÁì½±
|
Def_MixCampaign_Index_Max,
|
) = range(0, 3 + 1)
|
|
|
## ÿÌì´¥·¢
|
# @param None
|
# @return: None
|
def MixServerOnDay():
|
|
# ¿ç·þ·þÎñÆ÷¹¦ÄÜÏÞÖÆ
|
if GameWorld.IsCrossServer():
|
return
|
|
isMixServer = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_IsMixServer) # ÊÇ·ñºÏ·þ
|
if not isMixServer:
|
return
|
|
sendMSCMailTypeList = UpdateMixServerCampaignState()
|
|
mixServerDay = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_MixServerDay) # ºÏ·þÌìÊý
|
GameWorld.DebugLog("ºÏ·þ¹ýÌì mixServerDay=%s,sendMSCMailTypeList=%s" % (mixServerDay, sendMSCMailTypeList))
|
# for key, value in ShareDefine.Def_MixCampaign_Billboard_Dict.items():
|
#
|
# #»î¶¯ÒѾ½áÊø,ɾ³ýÅÅÐаñÊý¾Ý
|
# if __IsClearMixCampaignBillboard(key):
|
# billboardType = ShareDefine.Def_MixCampaign_Billboard_Dict.get(key)
|
#
|
# #Çå³ýÅÅÐаñÊý¾Ý
|
# PlayerBillboard.ClearBillboardByIndex(billboardType)
|
# continue
|
#
|
# if not __CanCopyMixCampaignBillboardData(key):
|
# #²»ÊǽØÈ¡»î¶¯ÅÅÐаñʱ¼ä
|
# GameWorld.DebugLog(" ²»ÊǽØÈ¡»î¶¯ÅÅÐаñʱ¼ä cType=%s" % key)
|
# continue
|
#
|
# #¿½±´ÅÅÐаñ½±ÀøÓÃÓÚ½±Àø
|
# copyBillboard = Def_MixAward_Billboard_Copy_Dict.get(value) # ʵʱ°ñ
|
# GameWorld.DebugLog(" ¿½±´ÅÅÐаñ½±ÀøÓÃÓÚ½±Àø cType=%s,value=%s,copyBillboard=%s"
|
# % (key, value, copyBillboard))
|
#
|
# if not copyBillboard:
|
# continue
|
#
|
# PlayerBillboard.CopyBillboard(value, copyBillboard)
|
# DataRecordPack.DR_BillboardData(value, "MixCampaignBillboard", {"MixServerDay":mixServerDay})
|
|
|
# Áì½±½áÊøºó, ²¹·¢Î´ÁìÈ¡µÄ½±ÀøÓʼþ, ±ØÐëÔÚÊý¾Ý¿½±´Íê±Ïºó´¦Àí
|
__SendMSCAwardMailOnOver(sendMSCMailTypeList)
|
return
|
|
|
def __SendMSCAwardMailOnOver(overTypeList):
|
if not overTypeList:
|
return
|
|
playerManager = GameWorld.GetPlayerManager()
|
for i in range(0, playerManager.GetPlayerCount()):
|
curPlayer = playerManager.GetPlayerByIndex(i)
|
if curPlayer == None or not curPlayer.GetInitOK():
|
continue
|
|
resultName = '%s' % __GetMSCQueryMailAwardResult(curPlayer, [ShareDefine.Def_MSCGameServerQuery_MailAward, overTypeList])
|
curPlayer.MapServer_QueryPlayerResult(0, 0, 'MixServerCampaignAward', resultName, len(resultName))
|
return
|
|
|
## »ñÈ¡·¢ËͺϷþ»î¶¯Óʼþ½±ÀøËùÐèµÄÐÅÏ¢
|
def __GetMSCQueryMailAwardResult(curPlayer, msgList):
|
#queryType = msgList[0]
|
oscTypeList = msgList[1]
|
queryResultList = []
|
# ²¹·¢ÓʼþµÄÀàÐÍÅúÁ¿´¦Àí
|
for oscType in oscTypeList:
|
queryResultList.append(__GetGiveCampaignAwardInfo(curPlayer, oscType))
|
|
msgList.append(queryResultList)
|
GameWorld.DebugLog("ÇëÇó·¢ËͺϷþ»î¶¯Óʼþ: oscTypeList=%s,queryResultList=%s,msgList=%s" % (oscTypeList, queryResultList, msgList))
|
return msgList
|
|
## »ñÈ¡Áì½±ËùÐèµÄÐÅÏ¢
|
def __GetGiveCampaignAwardInfo(curPlayer, campaignType):
|
|
if campaignType in ShareDefine.DoOnMapServerMixCampaignTypeList:
|
GameWorld.DebugLog(" µØÍ¼·þÎñÆ÷µ¥¶À´¦ÀíµÄÀàÐÍ!")
|
return []
|
|
curPlayerID = curPlayer.GetID()
|
|
# ½±Àø°ñÏà¹Ø
|
awardBillboardType = ShareDefine.Def_MixCampaign_Billboard_Dict.get(campaignType)
|
if not awardBillboardType:
|
return []
|
|
billBoard = GameWorld.GetBillboard().FindBillboard(awardBillboardType)
|
if billBoard:
|
memberLV = 0
|
# #Õ½ÃË»÷ɱbossÅÅÐÐ È¡Íæ¼ÒËùÔÚÕ½Ã˵ÄÅÅÃû
|
if campaignType == ShareDefine.Def_MixCampaign_Type_FamilyKillBoss:
|
familyID = curPlayer.GetFamilyID()
|
if not familyID:
|
GameWorld.DebugLog("__GetGiveCampaignAwardInfo ->Íæ¼ÒûÓмÒ×å" , curPlayerID)
|
return []
|
billIndex = billBoard.IndexOfByID(familyID)
|
if billIndex < 0:
|
GameWorld.DebugLog("__GetGiveCampaignAwardInfo ->Íæ¼ÒËùÔÚ¼Ò×åûÃû´Î" , curPlayerID)
|
return []
|
order = billIndex + 1
|
else:
|
order = billBoard.IndexOfByID(curPlayerID) + 1 # Íæ¼ÒÔÚÅÅÐаñÖеÄÃû´Î
|
|
GameWorld.DebugLog(" ½±Àø°ñ: awardBillboardType=%s,order=%s" % (awardBillboardType, order))
|
return [order, memberLV]
|
|
|
return []
|
|
|
|
## ¸üкϷþ»î¶¯×´Ì¬
|
# @param isSoonNotify:ÊÇ·ñÂíÉÏ֪ͨ
|
# @return: None
|
def UpdateMixServerCampaignState(isSoonNotify=False):
|
dataStateChangeOverList = []
|
sendMSCMailTypeList = []
|
isMixServer = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_IsMixServer) # ÊÇ·ñºÏ·þ
|
mixServerDay = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_MixServerDay) # ºÏ·þÌìÊý
|
for campaignType in ShareDefine.Def_MixCampaign_Type_List:
|
updSaveDataState = ShareDefine.Def_CampaignDataState_None
|
campaignInfoList = __GetMixCampaignInfoList(campaignType)
|
if len(campaignInfoList) != Def_MixCampaign_Index_Max:
|
continue
|
interceptTimeList = campaignInfoList[Def_MixCampaign_Index_InterceptTime]
|
if isMixServer and interceptTimeList != []:
|
if mixServerDay in interceptTimeList:
|
updSaveDataState = ShareDefine.Def_CampaignDataState_Save
|
elif mixServerDay > max(interceptTimeList): # ³¬¹ý×î´óµÄÓÐЧÊý¾ÝÌìÊýÔòΪ»î¶¯½áÊø
|
updSaveDataState = ShareDefine.Def_CampaignDataState_Over
|
|
# ͬ²½MapServerºÏ·þ»î¶¯±£´æÊý¾Ý½×¶Î
|
saveDataKey = ShareDefine.Def_Notify_WorldKey_MixServerCampaignSaveData % campaignType
|
curSaveState = GameWorld.GetGameWorld().GetDictByKey(saveDataKey)
|
if __IsNeedNoticeMapServer(saveDataKey, updSaveDataState, isSoonNotify):
|
GameWorld.SendMapServerMsgEx(saveDataKey, updSaveDataState)
|
GameWorld.GetGameWorld().SetDict(saveDataKey, updSaveDataState)
|
# ´ÓÓÐЧ״̬±äΪ½áÊø×´Ì¬
|
if curSaveState == ShareDefine.Def_CampaignDataState_Save and updSaveDataState == ShareDefine.Def_CampaignDataState_Over:
|
dataStateChangeOverList.append(campaignType)
|
|
awardTimeList = campaignInfoList[Def_MixCampaign_Index_AwardTime]
|
updGetAwardState = ShareDefine.Def_CampaignAwardState_None
|
if isMixServer and awardTimeList != []:
|
if mixServerDay in awardTimeList:
|
updGetAwardState = ShareDefine.Def_CampaignAwardState_Allow
|
elif mixServerDay > max(awardTimeList):
|
updGetAwardState = ShareDefine.Def_CampaignAwardState_Over
|
# ͬ²½MapServerºÏ·þ»î¶¯Áì½±½×¶Î
|
getAwardKey = ShareDefine.Def_Notify_WorldKey_MixServerCampaignGetAward % campaignType
|
curAwardState = GameWorld.GetGameWorld().GetDictByKey(getAwardKey)
|
|
if __IsNeedNoticeMapServer(getAwardKey, updGetAwardState, isSoonNotify):
|
GameWorld.SendMapServerMsgEx(getAwardKey, updGetAwardState)
|
GameWorld.GetGameWorld().SetDict(getAwardKey, updGetAwardState)
|
|
# ´ÓÁì½±ÓÐЧ״̬±äΪ½áÊø×´Ì¬ or δÅäÖÃÁì½±ÁбíÇÒÓÐЧÊý¾Ý±äΪ½áÊø×´Ì¬
|
if (curAwardState == ShareDefine.Def_CampaignAwardState_Allow and updGetAwardState == ShareDefine.Def_CampaignAwardState_Over) or \
|
(not awardTimeList and campaignType in dataStateChangeOverList):
|
sendMSCMailTypeList.append(campaignType)
|
|
return sendMSCMailTypeList
|
|
## ÊÇ·ñÐèҪ֪ͨMapServer»î¶¯ÐÅÏ¢
|
# @param key:֪ͨÀàÐÍkey
|
# @param noticeType:֪ͨÀàÐÍ
|
# @param isSoonNotify:ÊÇ·ñÂíÉÏ֪ͨ
|
# @return: None
|
def __IsNeedNoticeMapServer(key, noticeType, isSoonNotify):
|
curType = GameWorld.GetGameWorld().GetDictByKey(key)
|
|
if noticeType != curType or isSoonNotify:
|
return True
|
|
return False
|
|
|
## »ñÈ¡»î¶¯ÐÅÏ¢
|
# @param campaignType: »î¶¯ÀàÐÍ
|
# @return: »î¶¯ÐÅÏ¢
|
def __GetMixCampaignInfoList(campaignType):
|
openServerCampaignDict = ReadChConfig.GetEvalChConfig("MixServerCampaign")
|
campaignInfoList = openServerCampaignDict.get(campaignType, [])
|
return campaignInfoList
|
|
|
## »ñÈ¡»î¶¯ÊÇ·ñÒѾ½áÊø
|
# @param campaignType: »î¶¯ÀàÐÍ
|
# @return: »î¶¯ÊÇ·ñÒѾ½áÊø
|
def __IsClearMixCampaignBillboard(campaignType):
|
if campaignType not in ShareDefine.Def_MixCampaign_Type_List:
|
#»î¶¯ÀàÐÍ´íÎó
|
return True
|
|
campaignInfoList = __GetMixCampaignInfoList(campaignType)
|
if len(campaignInfoList) != Def_MixCampaign_Index_Max:
|
#»î¶¯ÐÅÏ¢±íÅäÖôíÎó
|
return True
|
|
awardTimeList = campaignInfoList[Def_MixCampaign_Index_AwardTime]
|
if awardTimeList == []:
|
return True
|
|
mixServerDay = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_MixServerDay) # ºÏ·þÌìÊý
|
if mixServerDay == max(awardTimeList) + 1:
|
#ÒѾ¹ýÁËÁ콱ʱ¼ä, »î¶¯½áÊø
|
return True
|
|
return False
|
|
|
## ÊÇ·ñcopyÅÅÐаñÊý¾ÝÓÃÓÚ½±Àø
|
# @param campaignType: »î¶¯ÀàÐÍ
|
# @return: ÊÇ·ñcopyÅÅÐаñÊý¾ÝÓÃÓÚ½±Àø
|
def __CanCopyMixCampaignBillboardData(campaignType):
|
campaignInfoList = __GetMixCampaignInfoList(campaignType)
|
if len(campaignInfoList) != Def_MixCampaign_Index_Max:
|
#»î¶¯ÐÅÏ¢±íÅäÖôíÎó
|
return False
|
|
#½±ÀøÊý¾Ý½ØÈ¡Ê±¼ä
|
interceptTimeList = campaignInfoList[Def_MixCampaign_Index_InterceptTime]
|
if interceptTimeList == []:
|
return False
|
|
mixServerDay = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_MixServerDay) # ºÏ·þÌìÊý
|
if mixServerDay > max(interceptTimeList):
|
#ÒѾ½ØÈ¡ÅÅÐаñÊý¾Ý
|
return False
|
|
if mixServerDay not in interceptTimeList:
|
#²»ÊǽØÈ¡ÅÅÐаñÊý¾Ýʱ¼ä
|
return False
|
|
return True
|
|
|
## ¿É·ñÁìÈ¡ºÏ·þÎñ»î¶¯½±Àø
|
# @param curPlayer: Íæ¼ÒʵÀý
|
# @param msgList: ½±ÀøÁìÈ¡ÐÅÏ¢[ÇëÇóÀàÐÍ, »î¶¯ÀàÐÍ, ÁìÈ¡Ë÷Òý, ¼Ò×åID]
|
# @return: [²éѯÀàÐÍ, »î¶¯ÀàÐÍ, ²éѯ½±ÀøË÷Òý, Ãû´Î, ¼Ò×åµÈ¼¶, ¼Ò×åְλ]
|
def CanGiveMixCampaignAward(curPlayer, msgList):
|
queryType = msgList[0] # ÇëÇóÀàÐÍ(Áì½±, Óʼþ)
|
|
if queryType == ShareDefine.Def_MSCGameServerQuery_MailAward:
|
return __GetMSCQueryMailAwardResult(curPlayer, msgList)
|
|
campaignType = msgList[1] # »î¶¯ÀàÐÍ
|
awardIndex = msgList[2] # ÏëÒªÁìÈ¡µÄ½±ÀøË÷Òý
|
familyID = msgList[3] # ¼Ò×åID
|
|
mixServerDay = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_MixServerDay) # ºÏ·þÌìÊý
|
GameWorld.DebugLog("CanGiveMixCampaignAward: mixServerDay=%s,msgList=%s"
|
% (mixServerDay, str(msgList)))
|
|
if campaignType not in ShareDefine.Def_MixCampaign_Type_List:
|
#ÁìÈ¡µÄ½±ÀøÀàÐÍ´íÎó
|
GameWorld.ErrLog(" ÁìÈ¡µÄºÏ·þ½±ÀøÀàÐÍ´íÎó campaignType=%s" % (campaignType))
|
return [queryType, campaignType, awardIndex, 0, 0, 0]
|
|
campaignInfoList = __GetMixCampaignInfoList(campaignType)
|
if len(campaignInfoList) != Def_MixCampaign_Index_Max:
|
#»î¶¯ÐÅÏ¢±íÅäÖôíÎó
|
GameWorld.ErrLog(" MixServerCampaign: ºÏ·þ»î¶¯ÐÅÏ¢±íÅäÖôíÎó")
|
return [queryType, campaignType, awardIndex, 0, 0, 0]
|
|
awardTimeList = campaignInfoList[Def_MixCampaign_Index_AwardTime]
|
if awardTimeList == []:
|
GameWorld.ErrLog(" MixServerCampaign: awardTimeList is []")
|
return [queryType, campaignType, awardIndex, 0, 0, 0]
|
|
interceptTimeList = campaignInfoList[Def_MixCampaign_Index_InterceptTime]
|
if interceptTimeList == []:
|
GameWorld.ErrLog(" MixServerCampaign: interceptTimeList is []")
|
return [queryType, mixServerDay, campaignType, awardIndex, 0, 0, 0]
|
|
if mixServerDay not in awardTimeList:
|
GameWorld.DebugLog(" MixServerCampaign: ·ÇÁ콱ʱ¼ä mixServerDay=%s,awardTimeList=%s"
|
% (mixServerDay, str(awardTimeList)))
|
return [queryType, campaignType, awardIndex, 0, 0, 0]
|
|
curPlayerID = curPlayer.GetID()
|
|
awardBillboardType = ShareDefine.Def_MixCampaign_Billboard_Dict.get(campaignType)
|
if not awardBillboardType:
|
GameWorld.DebugLog(" ÕÒ²»µ½Def_MixCampaign_Billboard_Dict¶ÔÓ¦ÅÅÐаñ %s" % campaignType)
|
return [queryType, campaignType, awardIndex, 0, 0, 0]
|
|
billBoard = GameWorld.GetBillboard().FindBillboard(awardBillboardType)
|
if not billBoard:
|
GameWorld.DebugLog(" ÕÒ²»µ½ÅÅÐаñÊý¾Ý")
|
#ÕÒ²»µ½ÅÅÐаñÊý¾Ý
|
return [queryType, campaignType, awardIndex, 0, 0, 0]
|
|
maxPlace = campaignInfoList[Def_MixCampaign_Index_MaxPlace] # ¿ÉÁì½±Ãû´Î
|
if campaignType == ShareDefine.Def_MixCampaign_Type_FamilyKillBoss:
|
#Õ½ÃË»÷ɱbossÅÅÐÐ È¡Íæ¼ÒËùÔÚÕ½Ã˵ÄÅÅÃû
|
billBoardIndex = billBoard.IndexOfByID(familyID)
|
else:
|
billBoardIndex = billBoard.IndexOfByID(curPlayerID)
|
order = billBoardIndex + 1 # Íæ¼ÒÔÚÅÅÐаñÖеÄÃû´Î
|
GameWorld.DebugLog(" billBoardIndex=%s,order=%s,maxPlace=%s"
|
% (billBoardIndex, order, maxPlace))
|
if billBoardIndex < 0 or order > maxPlace:
|
GameWorld.DebugLog(" ²»ÔÚ¿ÉÁìÃû´Î")
|
return [queryType, campaignType, awardIndex, 0, 0, 0]
|
|
return [queryType, campaignType, awardIndex, order, 0, 0]
|
|
##ºÏ·þ»î¶¯Õ½ÃË»÷ɱbossÅÅÐиüÐÂ
|
# @param cmdList ¼Ç¼ÄÚÈÝ
|
# @return ·µ»ØÖµÎÞÒâÒå
|
def UpdMixCampaignFamiliyBossCnt(curPlayer, cmdList):
|
isMixServer = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_IsMixServer) # ÊÇ·ñºÏ·þ
|
# ·ÇºÏ·þ²»´¦Àí
|
if not isMixServer:
|
GameWorld.DebugLog("·ÇºÏ·þ ²»¸üкϷþ»î¶¯Õ½ÃË»÷ɱbossÅÅÐÐ")
|
return
|
|
campaignType = ShareDefine.Def_MixCampaign_Type_FamilyKillBoss
|
if not __CanCopyMixCampaignBillboardData(campaignType):
|
GameWorld.DebugLog("²»ÊǸüÐÂʱ»ú ²»¸üкϷþ»î¶¯Õ½ÃË»÷ɱbossÅÅÐÐ")
|
return
|
|
addCnt = cmdList[0]
|
curPlayerID = curPlayer.GetPlayerID()
|
curFamily = curPlayer.GetFamily()
|
|
if curFamily == None:
|
GameWorld.DebugLog("UpdMixCampaignFamiliyBossCnt ->Íæ¼ÒûÓмÒ×å" , curPlayerID)
|
return
|
curMember = curFamily.FindMember(curPlayerID)
|
if curMember == None:
|
GameWorld.DebugLog("UpdMixCampaignFamiliyBossCnt ->Î޴˳ÉÔ±" , curPlayerID)
|
return
|
billboardIndex = ShareDefine.Def_BT_MixCampaign_FamilyKillBoss
|
billboard = GameWorld.GetBillboard().FindBillboard(billboardIndex)
|
if not billboard:
|
GameWorld.ErrLog(" ÕÒ²»µ½Õ½ÃË»÷ɱbossÅÅÐаñ!!!")
|
return
|
familyID = curFamily.GetID()
|
familyName = curFamily.GetName()
|
familyLV = curFamily.GetLV()
|
|
killCnt = 0
|
billboardCnt = billboard.GetCount()
|
for index in range(0, billboardCnt):
|
objBillboard = billboard.At(index)
|
objID = objBillboard.GetID()
|
if familyID != objID:
|
continue
|
killCnt = objBillboard.GetCmpValue()
|
break
|
newCnt = killCnt + addCnt
|
|
PlayerBillboard.UpdatePlayerBillboard(familyID, familyName, 0, ShareDefine.Def_BT_MixCampaign_FamilyKillBoss, 0, 0, 0, newCnt, cmpValue2=familyLV)
|
return
|
|