#!/usr/bin/python
|
# -*- coding: GBK -*-
|
#-------------------------------------------------------------------------------
|
#
|
##@package Player.OpenServerCampaign
|
#
|
# @todo:¿ª·þ»î¶¯
|
# @author hxp
|
# @date 2018-03-06
|
# @version 1.0
|
#
|
# ÏêϸÃèÊö: ¿ª·þ»î¶¯
|
#
|
#-------------------------------------------------------------------------------
|
#"""Version = 2018-03-06 11:00"""
|
#-------------------------------------------------------------------------------
|
import ShareDefine
|
import ChPyNetSendPack
|
import NetPackCommon
|
import ChConfig
|
import GameWorld
|
import ItemControler
|
import IPY_GameWorld
|
import PlayerControl
|
import IpyGameDataPY
|
import PlayerBillboard
|
import PlayerFamilyRedPacket
|
import ItemCommon
|
|
(
|
OSC_BillLimitValue, # ÉϰñÏÞÖÆÖµ
|
OSC_StartDay, # ¿ªÆô¿ª·þÌì
|
OSC_EndDay, # ½áÊø¿ª·þÌì
|
) = range(3)
|
|
def DoBillboardOpen(curPlayer):
|
for campaignType, billBoardType in ShareDefine.Def_Campaign_Billboard_Dict.items():
|
value = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_OSC_RecordData % campaignType)
|
GameWorld.DebugLog("ÅÅÐаñ¿ªÆô,ͬ²½¿ª·þ»î¶¯¼Ç¼!campaignType=%s,billBoardType=%s,value=%s" % (campaignType, billBoardType, value))
|
if CanUpdOSCBillboard(curPlayer, campaignType, value):
|
PlayerBillboard.UpdatePlayerBillboard(curPlayer, billBoardType, value)
|
return
|
|
def __CanUpdOSCRecordData(campaignType, curValue=None):
|
## ¿É·ñ¸üпª·þ»î¶¯Êý¾Ý
|
OSCBillboardDataLimitDict = IpyGameDataPY.GetFuncEvalCfg("OSCBillboardOpen", 1)
|
campTypeS = str(campaignType)
|
if campTypeS not in OSCBillboardDataLimitDict:
|
#GameWorld.DebugLog("²»´æÔڸÿª·þ»î¶¯ÀàÐÍ: %s" % campaignType)
|
return False
|
limitValue = OSCBillboardDataLimitDict[campTypeS][OSC_BillLimitValue]
|
endOpenServerDay = OSCBillboardDataLimitDict[campTypeS][OSC_EndDay]
|
|
openServerDay = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_ServerDay) + 1
|
if openServerDay > endOpenServerDay:
|
#GameWorld.DebugLog("¸Ã¿ª·þ»î¶¯ÒѽáÊø£¬ÎÞ·¨Éϰñ£¡campaignType=%s,openServerDay=%s > endOpenServerDay=%s" % (campaignType, openServerDay, endOpenServerDay))
|
return False
|
|
if curValue != None and curValue < limitValue:
|
#GameWorld.DebugLog("¸Ã¿ª·þ»î¶¯ÊýÖµ²»×㣬ÎÞ·¨Éϰñ£¡campaignType=%s,curValue=%s < limitValue=%s" % (campaignType, curValue, limitValue))
|
return False
|
return True
|
|
def CanUpdOSCBillboard(curPlayer, campaignType, curValue): return __CanUpdOSCRecordData(campaignType, curValue)
|
def IsNeedSaveOpenServerCampaignRecordData(campaignType): return __CanUpdOSCRecordData(campaignType)
|
|
def AddOpenServerCampaignRecordData(curPlayer, campaignType, addValue):
|
## Ôö¼Ó¿ª·þ»î¶¯Êý¾Ý¼Ç¼(Íâµ÷º¯Êý)
|
recordData = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_OSC_RecordData % campaignType)
|
|
recordData += addValue
|
UpdOpenServerCampaignRecordData(curPlayer, campaignType, recordData)
|
return
|
|
def UpdOpenServerCampaignRecordData(curPlayer, campaignType, value):
|
## ¸üпª·þ»î¶¯Êý¾Ý¼Ç¼(Íâµ÷º¯Êý)
|
if not IsNeedSaveOpenServerCampaignRecordData(campaignType):
|
#GameWorld.DebugLog(" ·Ç¿ª·þ»î¶¯¼Ç¼Êý¾Ýʱ»ú, campaignType=%s" % campaignType)
|
return
|
|
recordData = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_OSC_RecordData % campaignType)
|
|
if value == recordData:
|
GameWorld.DebugLog(" ¿ª·þ»î¶¯Êý¾ÝµÈÓÚÀúÊ·¼Ç¼, ²»¸üРcampaignType=%s,recordData=%s,updValue=%s"
|
% (campaignType, recordData, value), curPlayer.GetPlayerID())
|
return
|
|
if campaignType not in [ShareDefine.Def_Campaign_Type_StoneLV, ShareDefine.Def_Campaign_Type_FightPower,
|
ShareDefine.Def_Campaign_Type_RuneLV, ShareDefine.Def_Campaign_Type_LingGen, ShareDefine.Def_Campaign_Type_StarLV] and value < recordData:
|
GameWorld.DebugLog(" ¿ª·þ»î¶¯Êý¾ÝСÓÚÀúÊ·¼Ç¼, ²»¸üРcampaignType=%s,recordData=%s,updValue=%s"
|
% (campaignType, recordData, value), curPlayer.GetPlayerID())
|
return
|
|
# ¸üпª·þ»î¶¯Ê±µÄ¼Ç¼ÊýÖµ
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_OSC_RecordData % campaignType, value)
|
Sync_OpenServerCampaignAward(curPlayer, campaignType)
|
GameWorld.DebugLog(" ¸üпª·þ»î¶¯Êý¾Ý¼Ç¼ campaignType=%s,recordData=%s,updValue=%s"
|
% (campaignType, recordData, value), curPlayer.GetPlayerID())
|
|
canUpdOSCBill = CanUpdOSCBillboard(curPlayer, campaignType, value)
|
if campaignType in ShareDefine.Def_Campaign_Billboard_Dict and (value <= recordData or canUpdOSCBill):
|
if not canUpdOSCBill:
|
value = -1
|
GameWorld.DebugLog(" ²»ÄÜÉϰñ½µÊý¾ÝµÄ£¬ÉèÖøðñµ¥Êý¾ÝΪ-1£¬É¾³ý¸ÃÊý¾Ý£¡", curPlayer.GetPlayerID())
|
billBoardType = ShareDefine.Def_Campaign_Billboard_Dict[campaignType]
|
PlayerBillboard.UpdatePlayerBillboard(curPlayer, billBoardType, value)
|
return
|
|
##==================================================================================================
|
|
def GetOSCTagAwardIpyList(campType):
|
tagAwardList = IpyGameDataPY.GetIpyGameDataListNotLog("OSCBillTagAward", campType)
|
if not tagAwardList:
|
return []
|
|
tagAwardIpyList = []
|
for ipyData in tagAwardList:
|
tagAwardIpyList.append([ipyData.GetTagCondition(), ipyData])
|
tagAwardIpyList.sort()
|
return [info[1] for info in tagAwardIpyList]
|
|
def OnOpenServerCampaignLogin(curPlayer):
|
## ¿ª·þ»î¶¯µÇ¼´¦Àí
|
if not __DoSendOSCAwardMail(curPlayer):
|
Sync_OpenServerCampaignAward(curPlayer)
|
return
|
|
def OnOpenServerCampaignDay(curPlayer):
|
## ¿ª·þ»î¶¯¹ýÌì´¦Àí
|
__DoSendOSCAwardMail(curPlayer)
|
return
|
|
def __DoSendOSCAwardMail(curPlayer):
|
## Ö´Ðпª·þ»î¶¯²¹·¢½±ÀøÓʼþÂß¼
|
# @return: ÊÇ·ñ´¦Àí²¹·¢
|
|
openServerDay = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_ServerDay) + 1
|
awardEndOpenServerDay = IpyGameDataPY.GetFuncCfg("OSCBillboardOpen", 2)
|
if openServerDay <= awardEndOpenServerDay:
|
GameWorld.DebugLog("¿ª·þ»î¶¯ÖУ¬¹ýÌì²»´¦Àí!openServerDay=%s,awardEndOpenServerDay=%s" % (openServerDay, awardEndOpenServerDay))
|
return False
|
|
endMailState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_OSC_EndMailState)
|
if endMailState:
|
GameWorld.DebugLog("ÒѾ´¦Àí¹ý¿ª·þ»î¶¯½±Àø²¹·¢£¡")
|
return True
|
|
for campType in ShareDefine.Def_Campaign_Type_List:
|
tagAwardIpyList = GetOSCTagAwardIpyList(campType)
|
for index, tagAwardIpyData in enumerate(tagAwardIpyList):
|
DoGiveOSCTagAward(curPlayer, campType, index, tagAwardIpyData, True)
|
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_OSC_EndMailState, 1)
|
return True
|
|
#def __SendOSCGameServerQuery(curPlayer, campTypeList, isEndMail=False):
|
# # ÒÔÏÂΪÐèÒªÏòGameServerÇëÇóÁìÈ¡½±ÀøËùÐèÐÅÏ¢
|
# # @param isEndMail: ÊÇ·ñʹÓÃÓʼþ·¢·Å
|
# if curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_QueryOpenServerAwardState) == 1:
|
# #ÒѾÔÚ²éѯÖÐ
|
# GameWorld.DebugLog(" ÒѾÔÚ²éѯÖÐ...")
|
# return
|
# curPlayer.SetDict(ChConfig.Def_PlayerKey_QueryOpenServerAwardState, 1)
|
#
|
# msgListStr = str([campTypeList, isEndMail])
|
# GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(curPlayer.GetID(), 0, 0, 'OpenServerCampaignAward', msgListStr, len(msgListStr))
|
# GameWorld.DebugLog(" __SendOSCGameServerQuery campTypeList=%s, isEndMail=%s" % (campTypeList, isEndMail), curPlayer.GetPlayerID())
|
# return
|
|
|
#// AB 11 ¿ª·þ»î¶¯½±Àø #tagCMOpenServerCampaignAward
|
#
|
#struct tagCMOpenServerCampaignAward
|
#
|
#{
|
# tagHead Head;
|
# DWORD CampaignType; //»î¶¯ÀàÐÍ
|
# BYTE AwardType; //½±ÀøÀàÐÍ£¬1-ÅÅÐУ¬2-Ä¿±ê
|
# BYTE AwardIndex; //Ä¿±ê½±ÀøË÷Òý£¬ÁìȡĿ±ê½±ÀøÊ±Óã¬Ä¿±êÌõ¼þÔÚÄ¿±ê½±ÀøÁбíÖÐË÷Òý
|
#};
|
def OnQueryOpenServerCampaignAward(index, clientData, tick):
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
campaignType = clientData.CampaignType
|
awardType = clientData.AwardType
|
awardIndex = clientData.AwardIndex # ½±ÀøÎ»
|
|
GameWorld.DebugLog("¿ª·þ»î¶¯Áì½± campaignType=%s,awardType=%s,index=%s" % (campaignType, awardType, awardIndex), curPlayer.GetPlayerID())
|
|
OSCBillboardDataLimitDict = IpyGameDataPY.GetFuncEvalCfg("OSCBillboardOpen", 1)
|
campTypeS = str(campaignType)
|
if campTypeS not in OSCBillboardDataLimitDict:
|
GameWorld.ErrLog("²»´æÔڸÿª·þ»î¶¯ÀàÐÍ,²»¿ÉÁì½±£¡campaignType=%s" % campaignType)
|
return
|
endOpenServerDay = OSCBillboardDataLimitDict[campTypeS][OSC_EndDay]
|
openServerDay = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_ServerDay) + 1
|
# Ö»ÏÞÖÆÅÅÐаñ£»Ä¿±ê½±ÀøËæÊ±¿ÉÁìÈ¡
|
if awardType == 1 and openServerDay <= endOpenServerDay:
|
GameWorld.DebugLog("¸Ã¿ª·þ»î¶¯Î´½áÊø£¬ÎÞ·¨Áì½±£¡campaignType=%s,openServerDay=%s <= endOpenServerDay=%s" % (campaignType, openServerDay, endOpenServerDay))
|
return
|
|
awardEndOpenServerDay = IpyGameDataPY.GetFuncCfg("OSCBillboardOpen", 2)
|
if openServerDay > awardEndOpenServerDay:
|
GameWorld.DebugLog("¸Ã¿ª·þ»î¶¯Áì½±ÒѽáÊø£¡campaignType=%s,openServerDay=%s > awardEndOpenServerDay=%s" % (campaignType, openServerDay, awardEndOpenServerDay))
|
return
|
|
# ÅÅÐн±Àø
|
if awardType == 1:
|
# ×Ô¶¯·¢·Å£¬²»¿ÉÊÖ¶¯ÁìÈ¡
|
return
|
|
# Ä¿±ê½±Àø
|
elif awardType == 2:
|
tagAwardIpyList = GetOSCTagAwardIpyList(campaignType)
|
if not tagAwardIpyList or awardIndex < 0 or awardIndex >= len(tagAwardIpyList):
|
GameWorld.DebugLog("²»´æÔÚ¸ÃÄ¿±ê½±Àø£¡awardIndex=%s" % (awardIndex))
|
return
|
DoGiveOSCTagAward(curPlayer, campaignType, awardIndex, tagAwardIpyList[awardIndex], False)
|
else:
|
GameWorld.ErrLog("¿ª·þ»î¶¯Áì½±½±ÀøÀàÐÍ´íÎó!²»´æÔÚ:awardType=%s" % awardType)
|
return
|
|
return
|
|
def DoGiveOSCTagAward(curPlayer, campaignType, index, tagAwardIpyData, isEndMail=False):
|
## ¸øÄ¿±ê½±Àø
|
|
tagAwardRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_OSC_TagAwardRecord % campaignType)
|
if tagAwardRecord & pow(2, index):
|
GameWorld.DebugLog(" ÒѾÁìÈ¡¹ý¸ÃÄ¿±ê½±Àø, campaignType=%s,awardIndex=%s" % (campaignType, index), curPlayer.GetPlayerID())
|
return
|
|
condition = tagAwardIpyData.GetTagCondition()
|
recordData = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_OSC_RecordData % campaignType)
|
if recordData < condition:
|
GameWorld.DebugLog(" δ´ïµ½¸Ã¿ª·þ»î¶¯Ä¿±êÌõ¼þ½±Àø£¡campaignType=%s,index=%s,recordData=%s < condition=%s"
|
% (campaignType, index, recordData, condition), curPlayer.GetPlayerID())
|
return
|
|
tagAwardDict = tagAwardIpyData.GetTagAward()
|
job = str(curPlayer.GetJob())
|
if job not in tagAwardDict:
|
GameWorld.ErrLog("ûÓÐÅäÖøÃÖ°Òµ¶ÔÓ¦µÄ¿ª·þ»î¶¯Ä¿±ê½±Àø!campaignType=%s,job=%s" % (campaignType, job))
|
return
|
giveItemList = tagAwardDict[job]
|
|
updAwardRecord = tagAwardRecord|pow(2, index)
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_OSC_TagAwardRecord % campaignType, updAwardRecord)
|
|
GameWorld.DebugLog(" ·¢·Å»î¶¯Ä¿±ê½±Àø, campaignType=%s,index=%s,condition=%s,recordData=%s,updAwardRecord=%s,giveItemList=%s"
|
% (campaignType, index, condition, recordData, updAwardRecord, giveItemList), curPlayer.GetPlayerID())
|
|
drDict = {"CampaignType":campaignType, "Index":index}
|
mailTypeKey = "OSCTagAward%s" % campaignType
|
mailParamList = [condition]
|
__DoGiveOSCAwardItem(curPlayer, giveItemList, drDict, isEndMail, mailTypeKey, mailParamList)
|
|
if not isEndMail:
|
Sync_OpenServerCampaignAward(curPlayer, campaignType)
|
|
return
|
|
def DoGiveOSCBillAward(curPlayer, awardResultList):
|
## ¸øÅÅÐн±Àø
|
return
|
# campTypeList, isEndMail, queryResultList = awardResultList
|
# if len(campTypeList) != len(queryResultList):
|
# return
|
#
|
# job = str(curPlayer.GetJob())
|
# for i, campaignType in enumerate(campTypeList):
|
# billAwardRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_OSC_BillAwardRecord)
|
# if billAwardRecord & pow(2, campaignType):
|
# GameWorld.DebugLog(" ÒѾÁìÈ¡¹ý¸ÃÅÅÐл½±Àø, campaignType=%s" % (campaignType), curPlayer.GetPlayerID())
|
# continue
|
#
|
# order = queryResultList[i]
|
# billAwardInfo = None
|
# billRankAwardIpyList = IpyGameDataPY.GetIpyGameDataList("OSCBillRankAward", campaignType)
|
# if not billRankAwardIpyList:
|
# continue
|
# for billRankIpyData in billRankAwardIpyList:
|
# if (billRankIpyData.GetRankA() <= order <= billRankIpyData.GetRankB()) \
|
# or (not billRankIpyData.GetRankB() and billRankIpyData.GetRankA() == order):
|
# billAwardInfo = billRankIpyData.GetRankAward()
|
# break
|
#
|
# if not billAwardInfo:
|
# GameWorld.DebugLog(" Íæ¼ÒÃû´ÎûÓн±Àø£¡campaignType=%s,order=%s" % (campaignType, order), curPlayer.GetPlayerID())
|
# continue
|
#
|
# billAwardDict = billAwardInfo
|
# if job not in billAwardDict:
|
# GameWorld.ErrLog("ûÓÐÅäÖøÃÖ°Òµ¶ÔÓ¦µÄ¿ª·þ»î¶¯°ñµ¥½±Àø!campaignType=%s,job=%s" % (campaignType, job))
|
# continue
|
# awardItemList = billAwardDict[job]
|
#
|
# updBillAwardRecord = billAwardRecord|pow(2, campaignType)
|
# PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_OSC_BillAwardRecord, updBillAwardRecord)
|
# GameWorld.DebugLog(" ·¢·Å»î¶¯°ñµ¥½±Àø,campaignType=%s,order=%s,awardItemList=%s,updBillAwardRecord=%s"
|
# % (campaignType, order, awardItemList, updBillAwardRecord), curPlayer.GetPlayerID())
|
#
|
# drDict = {"CampaignType":campaignType, "Order":order}
|
# mailTypeKey = "OSCBillAward%s" % campaignType
|
# mailParamList = [order]
|
# __DoGiveOSCAwardItem(curPlayer, awardItemList, drDict, isEndMail, mailTypeKey, mailParamList)
|
# #ºì°ü½±Àø
|
# redPacketIDDict = IpyGameDataPY.GetFuncEvalCfg('OSCRankRedpackAward', 1, {})
|
# redPacketID = GameWorld.GetDictValueByRangeKey(redPacketIDDict, order, 0)
|
# if redPacketID:
|
# PlayerFamilyRedPacket.CreatRedPacketByID(curPlayer, redPacketID)
|
# #if not isEndMail:
|
# Sync_OpenServerCampaignAward(curPlayer, campaignType)
|
# return
|
|
def __DoGiveOSCAwardItem(curPlayer, giveItemList, drDict, isEndMail, mailTypeKey, mailParamList):
|
## ¸ø¿ª·þ»î¶¯½±Àø [[itemID, itemCount], ...], ĬÈϰó¶¨
|
if not giveItemList:
|
return
|
|
isMail = False
|
needSpace = len(giveItemList)
|
if isEndMail or ItemCommon.GetItemPackSpace(curPlayer, IPY_GameWorld.rptItem, needSpace) < needSpace:
|
isMail = True
|
|
if isMail:
|
mailItemList = []
|
for itemInfo in giveItemList:
|
itemID, itemCount = itemInfo[:2]
|
isBind = itemInfo[2] if len(itemInfo) > 2 else 1
|
mailItemList.append([itemID, itemCount, isBind])
|
PlayerControl.SendMailByKey(mailTypeKey, [curPlayer.GetPlayerID()], mailItemList, mailParamList)
|
|
else:
|
for itemInfo in giveItemList:
|
itemID, itemCount = itemInfo[:2]
|
isBind = itemInfo[2] if len(itemInfo) > 2 else 1
|
ItemControler.GivePlayerItem(curPlayer, itemID, itemCount, 0, [IPY_GameWorld.rptItem],
|
event=[ChConfig.ItemGive_OpenServerCampaign, True, drDict])
|
return
|
|
|
def Sync_OpenServerCampaignAward(curPlayer, campaignType=None):
|
## ֪ͨ¿ª·þ»î¶¯½±ÀøÐÅÏ¢
|
|
syncOSCTypeList = [campaignType] if campaignType != None else ShareDefine.Def_Campaign_Type_List
|
|
oscAwardListPack = ChPyNetSendPack.tagMCOpenServerCampaignAwardList()
|
oscAwardListPack.Clear()
|
oscAwardListPack.OSCAwardList = []
|
|
for syncOSCType in syncOSCTypeList:
|
oscAward = ChPyNetSendPack.tagMCOpenServerCampaignAward()
|
oscAward.Clear()
|
oscAward.CampaignType = syncOSCType
|
oscAward.BillAwardRecord = 1 if curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_OSC_BillAwardRecord) & pow(2, syncOSCType) else 0
|
oscAward.TagAwardRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_OSC_TagAwardRecord % syncOSCType)
|
oscAward.RecordData = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_OSC_RecordData % syncOSCType)
|
oscAwardListPack.OSCAwardList.append(oscAward)
|
|
oscAwardListPack.OSCAwardCnt = len(oscAwardListPack.OSCAwardList)
|
NetPackCommon.SendFakePack(curPlayer, oscAwardListPack)
|
return
|
|
def UpdOpenServerCampaignLingGenData(curPlayer):
|
# ¼Ç¼¿ª·þ»î¶¯Êý¾Ý
|
totalLingGen = curPlayer.GetFreePoint() + PlayerControl.GetMetal(curPlayer) + PlayerControl.GetWood(curPlayer) + \
|
PlayerControl.GetWater(curPlayer) + PlayerControl.GetFire(curPlayer) + PlayerControl.GetEarth(curPlayer)
|
#GameWorld.DebugLog("×ÜÁé¸ù: %s" % totalLingGen)
|
UpdOpenServerCampaignRecordData(curPlayer, ShareDefine.Def_Campaign_Type_LingGen, totalLingGen)
|
return
|
|