#!/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 = GetOSCRecordData(curPlayer, campaignType) cmpValue = value / ChConfig.Def_PerPointValue cmpValue2 = value % ChConfig.Def_PerPointValue GameWorld.DebugLog("ÅÅÐаñ¿ªÆô,ͬ²½¿ª·þ»î¶¯¼Ç¼!campaignType=%s,billBoardType=%s,value=%s" % (campaignType, billBoardType, value)) if CanUpdOSCBillboard(curPlayer, campaignType, value): PlayerBillboard.UpdatePlayerBillboard(curPlayer, billBoardType, cmpValue, cmpValue2) 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 GetOSCRecordData(curPlayer, campaignType): return curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_OSC_RecordData % campaignType) + \ curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_OSC_RecordDataEx % campaignType) * ChConfig.Def_PerPointValue def SetOSCRecordData(curPlayer, campaignType, updRecordData): recordData = updRecordData % ChConfig.Def_PerPointValue recordDataEx = updRecordData / ChConfig.Def_PerPointValue PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_OSC_RecordData % campaignType, recordData) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_OSC_RecordDataEx % campaignType, recordDataEx) return GetOSCRecordData(curPlayer, campaignType) def AddOpenServerCampaignRecordData(curPlayer, campaignType, addValue): ## Ôö¼Ó¿ª·þ»î¶¯Êý¾Ý¼Ç¼(Íâµ÷º¯Êý) recordData = GetOSCRecordData(curPlayer, campaignType) recordData += addValue UpdOpenServerCampaignRecordData(curPlayer, campaignType, recordData) return def UpdOpenServerCampaignRecordData(curPlayer, campaignType, value): ## ¸üпª·þ»î¶¯Êý¾Ý¼Ç¼(Íâµ÷º¯Êý) if not IsNeedSaveOpenServerCampaignRecordData(campaignType): #GameWorld.DebugLog(" ·Ç¿ª·þ»î¶¯¼Ç¼Êý¾Ýʱ»ú, campaignType=%s" % campaignType) return recordData = GetOSCRecordData(curPlayer, 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 # ¸üпª·þ»î¶¯Ê±µÄ¼Ç¼ÊýÖµ value = SetOSCRecordData(curPlayer, 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): cmpValue = value / ChConfig.Def_PerPointValue cmpValue2 = value % ChConfig.Def_PerPointValue if not canUpdOSCBill: cmpValue = -1 cmpValue2 = 0 GameWorld.DebugLog(" ²»ÄÜÉϰñ½µÊý¾ÝµÄ£¬ÉèÖøðñµ¥Êý¾ÝΪ-1£¬É¾³ý¸ÃÊý¾Ý£¡", curPlayer.GetPlayerID()) billBoardType = ShareDefine.Def_Campaign_Billboard_Dict[campaignType] PlayerBillboard.UpdatePlayerBillboard(curPlayer, billBoardType, cmpValue, cmpValue2) 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 = GetOSCRecordData(curPlayer, 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]) ItemControler.NotifyGiveAwardInfo(curPlayer, giveItemList, ChConfig.ItemGive_OpenServerCampaign) 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) oscAward.RecordDataEx = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_OSC_RecordDataEx % 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