#!/usr/bin/python # -*- coding: GBK -*- #------------------------------------------------------------------------------- # ##@package Player.PlayerZhanling # # @todo:Õ½Áî # @author hxp # @date 2023-12-05 # @version 1.0 # # ÏêϸÃèÊö: Õ½Áî # #------------------------------------------------------------------------------- #"""Version = 2023-12-05 15:30""" #------------------------------------------------------------------------------- import GameWorld import NetPackCommon import IpyGameDataPY import PlayerControl import ChPyNetSendPack import PlayerGatherTheSoul import PlayerActHorsePetTrain import PlayerActGubao import ItemControler import IPY_GameWorld import PlayerGubao import ChConfig import time # Õ½ÁîÀàÐÍ ZhanlingTypeList = ( ZhanlingType_LV, ZhanlingType_Realm, ZhanlingType_SkyTower, ZhanlingType_GubaoStar, ZhanlingType_Login, ZhanlingType_GatherTheSoulLV, ZhanlingType_HorsePetTrain, ZhanlingType_GubaoTrain, ) = range(1, 1 + 8) def OnPlayerLogin(curPlayer): for zhanlingType in ZhanlingTypeList: if zhanlingType == ZhanlingType_Login: value1 = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ZhanlingValue1 % zhanlingType) if not value1: firstLoginTime = int(time.time()) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ZhanlingValue1 % zhanlingType, firstLoginTime) GameWorld.DebugLog("ÉèÖõǼսÁîÊ״εǼʱ¼ä: %s" % firstLoginTime, curPlayer.GetPlayerID()) SyncZhanlingInfo(curPlayer, zhanlingType) return def OnActiviteByCTGID(curPlayer, ctgID): zhanlingCTGIDDict = IpyGameDataPY.GetFuncEvalCfg("Zhanling", 1) for zhanlingTypeStr, ctgIDList in zhanlingCTGIDDict.items(): if ctgID not in ctgIDList: continue zhanlingType = int(zhanlingTypeStr) state = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ZhanlingState) if state&pow(2, zhanlingType): break updState = state|pow(2, zhanlingType) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ZhanlingState, updState) SyncZhanlingInfo(curPlayer, zhanlingType) GameWorld.Log("¼¤»îÕ½ÁîÆÕͨ: zhanlingType=%s,updState=%s" % (zhanlingType, updState), curPlayer.GetPlayerID()) break # ¸ß¼¶Õ½Áî zhanlingCTGIDDictH = IpyGameDataPY.GetFuncEvalCfg("Zhanling", 3) for zhanlingTypeStr, ctgIDList in zhanlingCTGIDDictH.items(): if ctgID not in ctgIDList: continue zhanlingType = int(zhanlingTypeStr) state = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ZhanlingStateH) if state&pow(2, zhanlingType): break updState = state|pow(2, zhanlingType) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ZhanlingStateH, updState) SyncZhanlingInfo(curPlayer, zhanlingType) GameWorld.Log("¼¤»îÕ½Áî¸ß¼¶: zhanlingType=%s,updState=%s" % (zhanlingType, updState), curPlayer.GetPlayerID()) break return def ResetZhanling(curPlayer, zhanlingType, backValue=None): ''' ÖØÖÃÕ½Áî @param zhanlingType: Õ½ÁîÀàÐÍ @param backValue: ÖØÖÃÕ½ÁîʱµÄÕ½Áî½±ÀøÖµ£¬ÓÃÓÚ·µ»¹Î´ÁìÈ¡½±Àø ''' state = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ZhanlingState) stateH = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ZhanlingStateH) updState = GameWorld.SetBitValue(state, zhanlingType, 0) updStateH = GameWorld.SetBitValue(stateH, zhanlingType, 0) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ZhanlingState, updState) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ZhanlingStateH, updStateH) GameWorld.Log("ÖØÖÃÕ½Áî: zhanlingType=%s,backValue=%s,state=(%s to %s) stateH=(%s to %s)" % (zhanlingType, backValue, state, updState, stateH, updStateH), curPlayer.GetPlayerID()) if backValue: __giveUngetAward(curPlayer, zhanlingType, backValue, state&pow(2, zhanlingType), stateH&pow(2, zhanlingType)) for keyNum in range(10): PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ZhanlingReward % (zhanlingType, keyNum), 0) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ZhanlingRewardH % (zhanlingType, keyNum), 0) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ZhanlingRewardFree % (zhanlingType, keyNum), 0) SyncZhanlingInfo(curPlayer, zhanlingType) return def __giveUngetAward(curPlayer, zhanlingType, backValue, activeState, activeStateH): ipyDataList = IpyGameDataPY.GetIpyGameDataByCondition("Zhanling", {"ZhanlingType":zhanlingType}, True) if not ipyDataList: return if not backValue: return playerID = curPlayer.GetPlayerID() GameWorld.DebugLog("´¦ÀíÕ½ÁîÖØÖò¹·¢½±Àø: zhanlingType=%s,backValue=%s,activeState=%s,activeStateH=%s" % (zhanlingType, backValue, activeState, activeStateH), playerID) ungetItemDict = {} for ipyData in ipyDataList: needValue = ipyData.GetNeedValue() rewardIndex = ipyData.GetRewardIndex() if backValue < needValue: break if not GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_ZhanlingRewardFree, rewardIndex, True, [zhanlingType]): rewardItemList = ipyData.GetFreeRewardItemList() for itemID, itemCount, _ in rewardItemList: ungetItemDict[itemID] = ungetItemDict.get(itemID, 0) + itemCount GameWorld.DebugLog(" Õ½Áî²¹·¢Ãâ·Ñ½±Àø: rewardIndex=%s,needValue=%s,%s, %s" % (rewardIndex, needValue, rewardItemList, ungetItemDict), playerID) if activeState and not GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_ZhanlingReward, rewardIndex, True, [zhanlingType]): rewardItemList = ipyData.GetZLRewardItemList() for itemID, itemCount, _ in rewardItemList: ungetItemDict[itemID] = ungetItemDict.get(itemID, 0) + itemCount GameWorld.DebugLog(" Õ½Áî²¹·¢ÆÕͨ½±Àø: rewardIndex=%s,needValue=%s,%s, %s" % (rewardIndex, needValue, rewardItemList, ungetItemDict), playerID) if activeStateH and not GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_ZhanlingRewardH, rewardIndex, True, [zhanlingType]): rewardItemList = ipyData.GetZLRewardItemListH() for itemID, itemCount, _ in rewardItemList: ungetItemDict[itemID] = ungetItemDict.get(itemID, 0) + itemCount GameWorld.DebugLog(" Õ½Áî²¹·¢¸ß¼¶½±Àø: rewardIndex=%s,needValue=%s,%s, %s" % (rewardIndex, needValue, rewardItemList, ungetItemDict), playerID) if not ungetItemDict: return paramList = [zhanlingType] itemList = [] for itemID, itemCount in ungetItemDict.items(): itemList.append([itemID, itemCount, 0]) GameWorld.DebugLog(" Õ½Áî²¹·¢½±Àø»ã×Ü: %s, %s" % (itemList, ungetItemDict), playerID) PlayerControl.SendMailByKey("ZhanlingRewardUnget", [playerID], itemList, paramList) return def GetZhanlingReward(curPlayer, zhanlingType, rewardID): ## ÁìȡսÁî½±Àø rewardID = GameWorld.ToIntDef(rewardID) needValue, rewardType = rewardID/10, rewardID%10 # rewardType£º 0-Ãâ·Ñ£»1-ÆÕͨ£»2-¸ß¼¶ playerID = curPlayer.GetPlayerID() ipyData = IpyGameDataPY.GetIpyGameData("Zhanling", zhanlingType, needValue) if not ipyData: return curValue = 0 if zhanlingType == ZhanlingType_LV: curValue = curPlayer.GetLV() elif zhanlingType == ZhanlingType_Realm: curValue = curPlayer.GetOfficialRank() elif zhanlingType == ZhanlingType_SkyTower: curValue = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_SkyTowerFloor) elif zhanlingType == ZhanlingType_GubaoStar: _, curValue = PlayerGubao.GetGubaoTotalLVStar(curPlayer) elif zhanlingType == ZhanlingType_Login: firstLoginTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ZhanlingValue1 % zhanlingType) if not firstLoginTime: return curValue = GameWorld.GetDiff_Day(int(time.time()), firstLoginTime) + 1 elif zhanlingType == ZhanlingType_GatherTheSoulLV: curValue = PlayerGatherTheSoul.GetGatherTheSoulTotalLV(curPlayer) elif zhanlingType == ZhanlingType_HorsePetTrain: curValue = PlayerActHorsePetTrain.GetActHorsePetTrainScore(curPlayer) elif zhanlingType == ZhanlingType_GubaoTrain: curValue = PlayerActGubao.GetActGubaoTrainScore(curPlayer) else: return if curValue < needValue: GameWorld.DebugLog("Õ½ÁîËùÐèÖµ²»×㣬ÎÞ·¨Áì½±: zhanlingType=%s,curValue=%s < %s" % (zhanlingType, curValue, needValue), playerID) return rewardIndex = ipyData.GetRewardIndex() itemList = ipyData.GetFreeRewardItemList() rewardKey = ChConfig.Def_PDict_ZhanlingRewardFree if rewardType == 1: itemList = ipyData.GetZLRewardItemList() rewardKey = ChConfig.Def_PDict_ZhanlingReward state = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ZhanlingState) if not state&pow(2, zhanlingType): GameWorld.DebugLog("ÆÕͨսÁîδ¼¤»î£¬ÎÞ·¨ÁìȡսÁî½±Àø: zhanlingType=%s,state=%s" % (zhanlingType, state), playerID) return elif rewardType == 2: itemList = ipyData.GetZLRewardItemListH() rewardKey = ChConfig.Def_PDict_ZhanlingRewardH state = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ZhanlingStateH) if not state&pow(2, zhanlingType): GameWorld.DebugLog("¸ß¼¶Õ½Áîδ¼¤»î£¬ÎÞ·¨ÁìȡսÁî½±Àø: zhanlingType=%s,state=%s" % (zhanlingType, state), playerID) return if not itemList: GameWorld.DebugLog("ûÓиÃÕ½Áî½±Àø! zhanlingType=%s,needValue=%s,rewardType=%s" % (zhanlingType, needValue, rewardType), playerID) return if GameWorld.GetDictValueByBit(curPlayer, rewardKey, rewardIndex, True, [zhanlingType]): GameWorld.DebugLog("ÒѾ­ÁìÈ¡¹ý¸ÃÕ½Áî½±Àø! zhanlingType=%s,needValue=%s,rewardType=%s" % (zhanlingType, needValue, rewardType), playerID) return # ¼ì²é±³°ü if not ItemControler.CheckPackSpaceEnough(curPlayer, itemList): return # ¸üÐÂÒÑÁìÈ¡³É¹¦±ê¼Ç GameWorld.SetDictValueByBit(curPlayer, rewardKey, rewardIndex, 1, True, [zhanlingType]) SyncZhanlingInfo(curPlayer, zhanlingType, ipyData) GameWorld.DebugLog("ÁìȡսÁî½±Àø: zhanlingType=%s,needValue=%s,rewardType=%s,itemList=%s" % (zhanlingType, needValue, rewardType, itemList), playerID) # ¸øÎïÆ· for itemID, itemCount, isAuctionItem in itemList: ItemControler.GivePlayerItem(curPlayer, itemID, itemCount, isAuctionItem, [IPY_GameWorld.rptItem]) return def SyncZhanlingInfo(curPlayer, zhanlingType, ipyData=None): ipyDataList = [] if ipyData == None: ipyDataList = IpyGameDataPY.GetIpyGameDataByCondition("Zhanling", {"ZhanlingType":zhanlingType}, True) else: ipyDataList = [ipyData] if not ipyDataList: return rewardList = [] for ipyData in ipyDataList: rewardIndex = ipyData.GetRewardIndex() reward = ChPyNetSendPack.tagMCZhanling() reward.Clear() reward.NeedValue = ipyData.GetNeedValue() reward.FreeRewardState = 1 if GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_ZhanlingRewardFree, rewardIndex, True, [zhanlingType]) else 0 reward.ZLRewardState = 1 if GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_ZhanlingReward, rewardIndex, True, [zhanlingType]) else 0 reward.ZLRewardStateH = 1 if GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_ZhanlingRewardH, rewardIndex, True, [zhanlingType]) else 0 rewardList.append(reward) clientPack = ChPyNetSendPack.tagMCZhanlingInfo() clientPack.Clear() clientPack.ZhanlingType = zhanlingType clientPack.IsActivite = 1 if curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ZhanlingState)&pow(2, zhanlingType) else 0 clientPack.IsActiviteH = 1 if curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ZhanlingStateH)&pow(2, zhanlingType) else 0 clientPack.Value1 = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ZhanlingValue1 % zhanlingType) clientPack.RewardList = rewardList clientPack.RewardCount = len(clientPack.RewardList) NetPackCommon.SendFakePack(curPlayer, clientPack) return