#!/usr/bin/python # -*- coding: GBK -*- #------------------------------------------------------------------------------- # ##@package Player.OpenServerActivity # # @todo:¿ª·þ»î¶¯ # @author hxp # @date 2025-12-04 # @version 1.0 # # ÏêϸÃèÊö: ¿ª·þ»î¶¯ # #------------------------------------------------------------------------------- #"""Version = 2025-12-04 16:00""" #------------------------------------------------------------------------------- import DBDataMgr import PlayerMail import ShareDefine import PlayerPreset import PlayerOnline import GameFuncComm import IPY_GameWorld import IpyGameDataPY import PlayerTreasure import PlayerBillboard import ChPyNetSendPack import PlayerControl import NetPackCommon import ItemControler import PlayerBeauty import ItemCommon import GameWorld import ChConfig import math # ¿ª·þ³å°ñÀàÐͶÔÓ¦¹¦ÄÜID OSAFuncIDDict = { ShareDefine.Def_BT_OSA_MainLevel:ShareDefine.GameFuncID_OSA_MainLevel, ShareDefine.Def_BT_OSA_HeroCall:ShareDefine.GameFuncID_OSA_HeroCall, ShareDefine.Def_BT_OSA_HeroTrain:ShareDefine.GameFuncID_OSA_HeroTrain, ShareDefine.Def_BT_OSA_BeautyTrain:ShareDefine.GameFuncID_OSA_BeautyTrain, ShareDefine.Def_BT_OSA_MinggeTrain:ShareDefine.GameFuncID_OSA_MinggeTrain, } def DoOSA_MainLevelOpen(curPlayer): UpdOSA_MainLevelBillboard(curPlayer) def UpdOSA_MainLevelBillboard(curPlayer, lvID=0): if GetOSAState(curPlayer, ShareDefine.Def_BT_OSA_MainLevel) != 1: return if not lvID: lvID = PlayerControl.GetPassMainLevelID(curPlayer) PlayerBillboard.UpdatePlayerBillboard(curPlayer, ShareDefine.Def_BT_OSA_MainLevel, lvID) return def DoOSA_HeroCallOpen(curPlayer): UpdOSA_HeroCallBillboard(curPlayer) def UpdOSA_HeroCallBillboard(curPlayer, callCnt=0): if GetOSAState(curPlayer, ShareDefine.Def_BT_OSA_HeroCall) != 1: return if not callCnt: callCnt = PlayerTreasure.GetHeroCallCnt(curPlayer) PlayerBillboard.UpdatePlayerBillboard(curPlayer, ShareDefine.Def_BT_OSA_HeroCall, callCnt) return def DoOSA_HeroTrainOpen(curPlayer): UpdOSA_HeroTrainBillboard(curPlayer) def UpdOSA_HeroTrainBillboard(curPlayer): if GetOSAState(curPlayer, ShareDefine.Def_BT_OSA_HeroTrain) != 1: return osaType = ShareDefine.Def_BT_OSA_HeroTrain mainBatPresetID = PlayerPreset.GetBatPresetID(curPlayer, ShareDefine.BatPreset_Main) heroPresetID = PlayerPreset.GetFuncPresetID(curPlayer, mainBatPresetID, ShareDefine.FuncPreset_Hero) olPlayer = PlayerOnline.GetOnlineMgr().GetOnlinePlayer(curPlayer) heroPreset = olPlayer.GetHeroPreset(heroPresetID) effCardDict = heroPreset.GetEffectiveCardDict() cardScore = 0 curPack = curPlayer.GetItemManager().GetPack(ShareDefine.rptHero) for cardInfo in effCardDict.values(): index = cardInfo[1] if index < 0 or index >= curPack.GetCount(): continue heroItem = curPack.GetAt(index) if not heroItem or heroItem.IsEmpty(): continue cardScore += __calcHeroCardTrainScore(heroItem) washItemID = IpyGameDataPY.GetFuncCfg("HeroWash", 1) trainItemScoreDict = IpyGameDataPY.GetFuncEvalCfg("OSABillboardTrain", 1, {}) osaValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_OSAValue % osaType) washScore = osaValue * trainItemScoreDict.get(str(washItemID), 0) trainScore = cardScore + washScore # Éϰñ»ý·Ö£º ֻȡÀúÊ·×î¸ß·Ö osaBillValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_OSABillValue % osaType) GameWorld.DebugLog("Î佫³å°ñ: trainScore=%s(%s+%s),osaValue=%s,osaBillValue=%s,mainBatPresetID=%s,heroPresetID=%s" % (trainScore, cardScore, washScore, osaValue, osaBillValue, mainBatPresetID, heroPresetID)) if trainScore <= osaBillValue: # ¿ÉÄܽµµÍ»ý·Ö£¬½µµÍʱ²»¸üаñµ¥ GameWorld.DebugLog(" Î佫³å°ñ»ý·ÖδÌáÉý²»¸üаñµ¥! trainScore=%s <= %s" % (trainScore, osaBillValue)) return trainScore = PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_OSABillValue % osaType, trainScore) PlayerBillboard.UpdatePlayerBillboard(curPlayer, ShareDefine.Def_BT_OSA_HeroTrain, trainScore) return def __calcHeroCardTrainScore(heroItem): heroID = heroItem.GetItemTypeID() heroIpyData = IpyGameDataPY.GetIpyGameData("Hero", heroID) if not heroIpyData: return 0 quality = heroIpyData.GetQuality() qualityIpyData = IpyGameDataPY.GetIpyGameData("HeroQuality", quality) if not qualityIpyData: return 0 heroLV = heroItem.GetUserAttr(ShareDefine.Def_IudetHeroLV) star = heroItem.GetUserAttr(ShareDefine.Def_IudetHeroStar) breakLV = heroItem.GetUserAttr(ShareDefine.Def_IudetHeroBreakLV) awakeLV = heroItem.GetUserAttr(ShareDefine.Def_IudetHeroAwakeLV) # ÅàÑø»ý·Ö£¬¿ª·þÎ佫³å°ñ»áÓõ½ # Î佫³å°ñÔö¼Ó»ý·Ö °´ÏûºÄ²ÄÁÏËã {"ÏûºÄÎïÆ·ID":ÿ¸öÎïÆ·»ý·Ö, }£¬»ý·ÖÖ§³ÖСÊý£¬ÎïÆ·IDÖ§³ÖÅäÎ佫¾­Ñéʯ¡¢Í»ÆÆÊ¯¡¢¾õÐÑʯ¡¢Ï´Á·Ê¯µÈ trainItemScoreDict = IpyGameDataPY.GetFuncEvalCfg("OSABillboardTrain", 1, {}) qualityStarScoreDict = IpyGameDataPY.GetFuncEvalCfg("OSABillboardTrain", 2, {}) trainItemCntDict = {} #GameWorld.DebugLog("Î佫ÎïÆ·ÅàÑø»ý·Ö: heroID=%s,quality=%s,heroLV=%s,star=%s,breakLV=%s,awakeLV=%s" % (heroID, quality, heroLV, star, breakLV, awakeLV)) # µÈ¼¶ ipyDataList = IpyGameDataPY.GetIpyGameDataByCondition("HeroQualityLV", {"Quality":quality}, True) if ipyDataList: for ipyData in ipyDataList: if heroLV <= ipyData.GetHeroLV(): break costItemInfo = ipyData.GetUPCostItem() if not costItemInfo: continue costItemID, costItemCount = costItemInfo trainItemCntDict[costItemID] = trainItemCntDict.get(costItemID, 0) + costItemCount #GameWorld.DebugLog(" quality=%s,heroLV=%s,%s" % (quality, heroLV, trainItemCntDict)) # Í»ÆÆ ipyDataList = IpyGameDataPY.GetIpyGameDataByCondition("HeroQualityBreak", {"Quality":quality}, True) if ipyDataList: for ipyData in ipyDataList: if breakLV <= ipyData.GetBreakLV(): break costItemList = ipyData.GetUPCostItemList() if not costItemList: continue for costItemInfo in costItemList: costItemID, costItemCount = costItemInfo[:2] trainItemCntDict[costItemID] = trainItemCntDict.get(costItemID, 0) + costItemCount #GameWorld.DebugLog(" quality=%s,breakLV=%s,%s" % (quality, breakLV, trainItemCntDict)) # ¾õÐÑ ipyDataList = IpyGameDataPY.GetIpyGameDataByCondition("HeroQualityAwake", {"Quality":quality}, True, False) if ipyDataList: for ipyData in ipyDataList: if awakeLV <= ipyData.GetAwakeLV(): break costItemInfo = ipyData.GetUPCostItem() if not costItemInfo: continue costItemID, costItemCount = costItemInfo trainItemCntDict[costItemID] = trainItemCntDict.get(costItemID, 0) + costItemCount #GameWorld.DebugLog(" quality=%s,awakeLV=%s,%s" % (quality, awakeLV, trainItemCntDict)) trainScore = 0 for costItemID, itemCnt in trainItemCntDict.items(): addScore = trainItemScoreDict.get(str(costItemID), 0) * itemCnt trainScore += addScore # ÐǼ¶ starScore = star * qualityStarScoreDict.get(str(quality), 0) trainScore += starScore #GameWorld.DebugLog(" trainScore=%s,starScore=%s" % (trainScore, starScore)) # Ï´Á¶ÎªÍ¨Óõģ¬ÔÚÍâ²ã×îºóÖ±½Ó¼Ó return int(trainScore) def DoOSA_BeautyTrainOpen(curPlayer): UpdOSA_BeautyTrainBillboard(curPlayer) def UpdOSA_BeautyTrainBillboard(curPlayer): if GetOSAState(curPlayer, ShareDefine.Def_BT_OSA_BeautyTrain) != 1: return # ºìÑպøÐ×ܵȼ¶ beautyTotalLV = PlayerBeauty.GetBeautyLVTotal(curPlayer) PlayerBillboard.UpdatePlayerBillboard(curPlayer, ShareDefine.Def_BT_OSA_BeautyTrain, beautyTotalLV) return def DoOSA_MinggeTrainOpen(curPlayer): UpdOSA_MinggeTrainBillboard(curPlayer) def UpdOSA_MinggeTrainBillboard(curPlayer): if GetOSAState(curPlayer, ShareDefine.Def_BT_OSA_MinggeTrain) != 1: return osaType = ShareDefine.Def_BT_OSA_MinggeTrain trainScoreList = IpyGameDataPY.GetFuncEvalCfg("OSABillboardTrain", 4) if not trainScoreList or len(trainScoreList) != 2: return tuiyanScore, lingyingScore = trainScoreList osaValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_OSAValue % osaType) curLingying = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MGLingying) trainScore = int(osaValue * tuiyanScore + curLingying * lingyingScore) GameWorld.DebugLog("Ãü¸ñ³å°ñ: trainScore=%s,osaValue=%s,curLingying=%s" % (trainScore, osaValue, curLingying)) PlayerBillboard.UpdatePlayerBillboard(curPlayer, ShareDefine.Def_BT_OSA_MinggeTrain, trainScore) return def AddOSAValue(curPlayer, osaType, addValue): ## Ôö¼Ó¿ª·þ³å°ñ»î¶¯Öµ£¬¹¦ÄÜ먦ÆôʱҲҪ¼Ó if GetOSAState(curPlayer, osaType, checkFuncOpen=False) != 1: return osaValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_OSAValue % osaType) updOSAValue = PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_OSAValue % osaType, osaValue + addValue) GameWorld.DebugLog("¸üпª·þ³å°ñ»î¶¯Öµ: osaType=%s,addValue=%s,updOSAValue=%s" % (osaType, addValue, updOSAValue)) return def GetOSAState(curPlayer, osaType, checkFuncOpen=True): ## Íæ¼ÒÊÇ·ñÔÚ¿ª·þ³å°ñ»î¶¯ÖÐ # @return: 0-먦Æô£»1-»î¶¯ÖУ»2-½áÊøÏÔʾÆÚ£»3-½áÊø¹Ø±ÕÆÚ funcID = OSAFuncIDDict.get(osaType) if not funcID: return 0 if checkFuncOpen and not GameFuncComm.GetFuncCanUse(curPlayer, funcID): #GameWorld.DebugLog("¿ª·þ³å°ñ¹¦ÄÜ먦Æô! osaType=%s,funcID=%s" % (osaType, funcID)) return 0 osaDayDict = IpyGameDataPY.GetFuncEvalCfg("OSABillboard", 1, {}) startDay, endDay = osaDayDict.get(str(osaType), [0, 0]) serverDay = DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_ServerDay) + 1 if startDay <= serverDay <= endDay: #GameWorld.DebugLog("¿ª·þ³å°ñ»î¶¯ÖÐ! osaType=%s,serverDay=%s,startDay=%s,endDay=%s" % (osaType, serverDay, startDay, endDay)) return 1 if serverDay == (endDay + 1): #GameWorld.DebugLog("¿ª·þ³å°ñ½áËãÖÐ! osaType=%s,serverDay=%s,startDay=%s,endDay=%s" % (osaType, serverDay, startDay, endDay)) return 2 #GameWorld.DebugLog("¿ª·þ³å°ñÒѽáÊø! osaType=%s,serverDay=%s,startDay=%s,endDay=%s" % (osaType, serverDay, startDay, endDay)) return 3 def OnDay(): osaAwardState = DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_OSAAwardState) serverDay = DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_ServerDay) + 1 osaDayDict = IpyGameDataPY.GetFuncEvalCfg("OSABillboard", 1, {}) for osaType, dayRange in osaDayDict.items(): osaType = int(osaType) startDay, endDay = dayRange if startDay > endDay: continue if serverDay <= endDay: #GameWorld.DebugLog("¿ª·þ³å°ñδ¿ªÊ¼»ò»î¶¯ÖеIJ»´¦Àí: osaType=%s,serverDay=%s <= endDay(%s)" % (osaType, serverDay, endDay)) continue # ½áËã if osaAwardState & pow(2, osaType): #GameWorld.DebugLog("¿ª·þ³å°ñ½±ÀøÒѽáËã¹ýÁË: osaType=%s,osaAwardState=%s" % (osaType, osaAwardState)) continue osaAwardState |= pow(2, osaType) DBDataMgr.GetEventTrigMgr().SetValue(ShareDefine.Def_OSAAwardState, osaAwardState) GameWorld.DebugLog("¿ª·þ³å°ñ½±Àø½áËã: osaType=%s,osaAwardState=%s,serverDay=%s" % (osaType, osaAwardState, serverDay)) if osaType == ShareDefine.Def_BT_OSA_MainLevel: billboardAwardDict = IpyGameDataPY.GetFuncEvalCfg("OSABillboard", 2, {}) PlayerBillboard.DoGiveBillboardAwardByMail(osaType, "OSAMainLevel", billboardAwardDict, "OSAMainLevel") elif osaType == ShareDefine.Def_BT_OSA_HeroCall: billboardAwardDict = IpyGameDataPY.GetFuncEvalCfg("OSABillboard", 3, {}) PlayerBillboard.DoGiveBillboardAwardByMail(osaType, "OSAHeroCall", billboardAwardDict, "OSAHeroCall") elif osaType == ShareDefine.Def_BT_OSA_HeroTrain: billboardAwardDict = IpyGameDataPY.GetFuncEvalCfg("OSABillboardTrain", 3, {}) PlayerBillboard.DoGiveBillboardAwardByMail(osaType, "OSAHeroTrain", billboardAwardDict, "OSAHeroTrain") elif osaType == ShareDefine.Def_BT_OSA_BeautyTrain: billboardAwardDict = IpyGameDataPY.GetFuncEvalCfg("OSABillboard", 4, {}) PlayerBillboard.DoGiveBillboardAwardByMail(osaType, "OSABeautyTrain", billboardAwardDict, "OSABeautyTrain") elif osaType == ShareDefine.Def_BT_OSA_MinggeTrain: billboardAwardDict = IpyGameDataPY.GetFuncEvalCfg("OSABillboardTrain", 5, {}) PlayerBillboard.DoGiveBillboardAwardByMail(osaType, "OSAMinggeTrain", billboardAwardDict, "OSAMinggeTrain") return ## ------------------------------------------- ¿ª·þÇìµä --------------------------------------------- def OnPlayerLogin(curPlayer): if GetOSACelebrationState(curPlayer) == 3: __autoChangeCelebrationPoint(curPlayer) return SyncOSACelebrationInfo(curPlayer) return def PlayerOnDay(curPlayer): if GetOSACelebrationState(curPlayer) == 3: __autoChangeCelebrationPoint(curPlayer) return return def __autoChangeCelebrationPoint(curPlayer): ## »î¶¯½áÊøºó×Ô¶¯×ª»»Çìµä»ý·Ö unUsePoint = PlayerControl.GetMoney(curPlayer, ShareDefine.TYPE_Price_OSAPoint) if unUsePoint <= 0: return moneyItemID = ItemCommon.GetMoneyItemID(IPY_GameWorld.TYPE_Price_Gold_Money) if not moneyItemID: return playerID = curPlayer.GetPlayerID() oneNeedPoint = IpyGameDataPY.GetFuncCfg("OSACelebration", 3) # ¶àÉÙ»ý·Ö=1Ôª±¦ changeMoney = int(math.ceil(unUsePoint / float(oneNeedPoint))) itemList = [[moneyItemID, changeMoney]] GameWorld.DebugLog("×Ô¶¯×ª»¯Î´Ê¹ÓõÄÇìµä»ý·Ö: unUsePoint=%s,oneNeedPoint=%s,changeMoney=%s,itemList=%s" % (unUsePoint, oneNeedPoint, changeMoney, itemList), playerID) if PlayerControl.PayMoney(curPlayer, ShareDefine.TYPE_Price_OSAPoint, unUsePoint, "SysClear"): PlayerMail.SendMailByKey("OSACelebrationPoint", playerID, itemList) return def GetOSACelebrationState(curPlayer): ## Íæ¼ÒÊÇ·ñÔÚ¿ª·þÇìµä»î¶¯ÖÐ # @return: 0-먦Æô£»1-»î¶¯ÖУ»2-½áÊøÏÔʾÆÚ£»3-½áÊø¹Ø±ÕÆÚ #¿ª·þÇìµä£¬ºó¶Ë²»ÏÞÖÆ¹¦ÄÜÊÇ·ñ¿ªÆô #funcID = ShareDefine.GameFuncID_OSA_Celebration #if not GameFuncComm.GetFuncCanUse(curPlayer, funcID): # #GameWorld.DebugLog("¿ª·þÇìµä¹¦ÄÜ먦Æô! funcID=%s" % (funcID)) # return 0 endDay = IpyGameDataPY.GetFuncCfg("OSACelebration", 1) serverDay = DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_ServerDay) + 1 if serverDay <= endDay: #GameWorld.DebugLog("¿ª·þÇìµä»î¶¯ÖÐ! serverDay=%s,endDay=%s" % (serverDay, endDay)) return 1 if serverDay == (endDay + 1): #GameWorld.DebugLog("¿ª·þÇìµä½áËãÖÐ! serverDay=%s,endDay=%s" % (serverDay, endDay)) return 2 #GameWorld.DebugLog("¿ª·þÇìµäÒѽáÊø! serverDay=%s,endDay=%s" % (serverDay, endDay)) return 3 def AddOSACelebrationPoint(curPlayer, addPoint): ## ÇìµäÀۼƻý·Ö curPoint = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_OSACelebrationPoint) updPoint = PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_OSACelebrationPoint, curPoint + addPoint) GameWorld.DebugLog("Ôö¼Ó¿ª·þÇìµä»ý·Ö: addPoint=%s,curPoint=%s,updPoint=%s" % (addPoint, curPoint, updPoint)) SyncOSACelebrationInfo(curPlayer) return def GetOSACelebrationPointAward(curPlayer, awardPoint): ## ÁìÈ¡¿ª·þÇìµäÀۼƻý·Ö½×¶Î½±Àø curPoint = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_OSACelebrationPoint) if curPoint < awardPoint: GameWorld.DebugLog("Àۼƿª·þÇìµä»ý·Ö²»×ã: curPoint=%s < %s" % (curPoint, awardPoint)) return awardDict = IpyGameDataPY.GetFuncEvalCfg("OSACelebration", 2, {}) # {"Àۼƻý·Ö":[[ÎïÆ·ID,¸öÊý], ...], ...} pointKeyList = [int(p) for p in awardDict.keys()] pointKeyList.sort() if awardPoint not in pointKeyList: GameWorld.DebugLog("²»´æÔڸÿª·þÇìµä»ý·Ö½×¶Î½±Àø: awardPoint=%s not in %s" % (awardPoint, pointKeyList)) return index = pointKeyList.index(awardPoint) awardState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_OSACelebrationAward) if awardState&pow(2, index): GameWorld.DebugLog("¸Ã¿ª·þÇìµä»ý·Ö½×¶Î½±ÀøÒÑÁìÈ¡: awardPoint=%s,index=%s,awardState=%s" % (awardPoint, index, awardState)) return updState = PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_OSACelebrationAward, awardState|pow(2, index)) itemList = awardDict[str(awardPoint)] GameWorld.DebugLog("ÁìÈ¡¿ª·þÇìµä»ý·Ö½×¶Î½±Àø: awardPoint=%s,index=%s,awardState=%s,updState=%s,itemList=%s" % (awardPoint, index, awardState, updState, itemList)) ItemControler.GivePlayerItemOrMail(curPlayer, itemList, event=["OSACelebration", False, {}]) SyncOSACelebrationInfo(curPlayer) return def SyncOSACelebrationInfo(curPlayer): clientPack = ChPyNetSendPack.tagSCOSACelebrationInfo() clientPack.PointTotal = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_OSACelebrationPoint) clientPack.PointAward = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_OSACelebrationAward) NetPackCommon.SendFakePack(curPlayer, clientPack) return