#!/usr/bin/python # -*- coding: GBK -*- #------------------------------------------------------------------------------- # #------------------------------------------------------------------------------- # ##@package Event.EventSrc.Operate_EquipPlus # # @todo:²¿Î»Ç¿»¯¹«¹²Ä£Ê½Ç¿»¯ # @author hxp # @date 2015-12-15 # @version 1.2 # # ÏêϸÃèÊö: ²¿Î»Ç¿»¯¹«¹²Ä£Ê½Ç¿»¯ # # @change: "2016-06-30 21:30" hxp Ç¿»¯´ïÈË¿ª·þ»î¶¯ # @change: "2016-10-08 18:00" hxp ×Ô¶¯¹ºÂòÎïÆ·¼Û¸ñͳһȡÉ̳ÇÎïÆ·¼Û¸ñ # #--------------------------------------------------------------------- #"""Version = 2016-10-08 18:00""" #--------------------------------------------------------------------- import ItemCommon import ShareDefine import PlayerControl import IPY_GameWorld import OpenServerCampaign import DataRecordPack import PlayerActivity import PlayerSuccess import IpyGameDataPY import PlayerActLogin import GameWorld import ChConfig import ChEquip import EventShell import ChPyNetSendPack import NetPackCommon import PlayerWeekParty import PlayerActGarbageSorting #------------------------------------------------------------------------------------------- #=============================================================================== # //A3 01 ×°±¸Ç¿»¯ #tagEquipPlus # struct tagEquipPlus # { # tagHead Head; # BYTE PackType; //±³°üÀàÐÍ:rptItem, rptEquip, rptPetEquip1~5 # WORD ItemIndex; //ÎïÆ·ÔÚ±³°üÖÐË÷Òý # }; #=============================================================================== ## ×°±¸Ç¿»¯ # @param playerIndex: Íæ¼Ò # @param clientData: ·â°ü # @param tick: µ±Ç°Ê±¼ä # @return None def OnEquipMayaPlus(playerIndex, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(playerIndex) playerID = curPlayer.GetPlayerID() packType = clientData.PackType index = clientData.ItemIndex # ÅÐ¶Ï 1.×°±¸ 2.×î¸ßÇ¿»¯µÈ¼¶£¬ 3.Í­Ç®Êý if packType not in ChConfig.Pack_EquipPart_CanPlusStar: #GameWorld.DebugLog("packType not in ChConfig.Pack_EquipPart_CanPlusStar", playerID) return ipyData = IpyGameDataPY.GetIpyGameDataByCondition('EquipPlaceIndexMap', {'GridIndex':index}) if not ipyData: return equipPlace = ipyData.GetEquipPlace() equipPlaceList = ChConfig.Pack_EquipPart_CanPlusStar[packType] if equipPlace not in equipPlaceList: #GameWorld.Log("index=%s, equipPlace=%s not in ChConfig.Pack_EquipPart_CanPlusStar" % (index, equipPlace), playerID) return # Ôݲ»ÅжϿªÆôµÈ¼¶Óɿͻ§¶Ë´¦Àí # µ±Ç°×°±¸µÈ¼¶ÊÇ·ñµ½´ï×î¸ßµÈ¼¶ curPack = curPlayer.GetItemManager().GetPack(packType) curEquip = curPack.GetAt(index) if not curEquip or curEquip.IsEmpty(): GameWorld.DebugLog("equip is empty") return findType = ChEquip.GetEquipPlusType(curEquip) if not findType: return curPartPlusLV = ChEquip.GetEquipPartPlusLV(curPlayer, packType, index) classLV = ItemCommon.GetItemClassLV(curEquip) plusMaxIpyData = IpyGameDataPY.GetIpyGameData("ItemPlusMax", findType, classLV) if not plusMaxIpyData: return plusLVMax = plusMaxIpyData.GetPlusLVMax() if curPartPlusLV >= plusLVMax: #GameWorld.DebugLog("Ç¿»¯´ïµ½±¾½××î´óµÈ¼¶£¬ÎÞ·¨Ç¿»¯! classLV=%s,plusLVMax=%s,curPartPlusLV=%s" % (classLV, plusLVMax, curPartPlusLV)) return plusIpyData = IpyGameDataPY.GetIpyGameData("ItemPlus", findType, curPartPlusLV) if not plusIpyData: return costSilver = plusIpyData.GetCostCount() costItemInfo = plusIpyData.GetCostItemInfo() if not costSilver and not costItemInfo: #GameWorld.DebugLog("Òѵ½Ç¿»¯×î´óµÈ¼¶! curPartPlusLV=%s" % curPartPlusLV, playerID) return curEvolveLV = ChEquip.GetEquipPartPlusEvolveLV(curPlayer, packType, index) # ½ø»¯µÈ¼¶ nextEvolveLV = curEvolveLV + 1 evolveIpyData = IpyGameDataPY.GetIpyGameDataNotLog('EquipPlusEvolve', equipPlace, nextEvolveLV) if not evolveIpyData: return maxPlusLV = evolveIpyData.GetNeedPlusLV() if curPartPlusLV >= maxPlusLV: GameWorld.Log("Òѵ½µ±Ç°Ç¿»¯×î´óµÈ¼¶£¬½ø»¯ºóÔö¼ÓÇ¿»¯µÈ¼¶ÉÏÏÞ! curPartPlusLV(%s) >= maxPlusLV(%s), curEvolveLV=%s" % (curPartPlusLV, maxPlusLV, curEvolveLV), playerID) return if costSilver and not PlayerControl.HaveMoney(curPlayer, IPY_GameWorld.TYPE_Price_Silver_Money, costSilver): GameWorld.DebugLog("Í­Ç®²»×㣬ÎÞ·¨Ç¿»¯! costSilver=%s" % costSilver) return costItemID, costItemCount = 0, 0 if costItemInfo: costItemID, costItemCount = costItemInfo itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem) hasEnough, itemIndexList = ItemCommon.GetItem_FromPack_ByID(costItemID, itemPack, costItemCount) if not hasEnough: GameWorld.DebugLog("²ÄÁϲ»×㣬ÎÞ·¨Ç¿»¯! costItemID=%s, costItemCount=%s" % (costItemID, costItemCount)) return if costSilver: PlayerControl.PayMoney(curPlayer, IPY_GameWorld.TYPE_Price_Silver_Money, costSilver, isNotify=False) if costItemID: ItemCommon.ReduceItem(curPlayer, itemPack, itemIndexList, costItemCount, True, ChConfig.ItemDel_EquipPlus) isLVUp = False curExp = 0 addExp = plusIpyData.GetAddExp() totalExp = plusIpyData.GetTotalExp() if addExp and totalExp: curExp = ChEquip.GetEquipPartProficiency(curPlayer, packType, index) + addExp if curExp >= totalExp: curExp = curExp - totalExp isLVUp = True else: isLVUp = True if isLVUp: curPartPlusLV += 1 __EquipMayaPlusChange(curPlayer, packType, curEquip, index, curPartPlusLV) #DataRecordPack.DR_UpStarLVSuccess(curPlayer, curExp, curPartPlusLV) ChEquip.SetEquipPartProficiency(curPlayer, packType, index, curExp) ChEquip.NotifyEquipPartPlusLV(curPlayer, packType, index) PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_EquipPlus) PlayerActLogin.AddLoginAwardActionCnt(curPlayer, ChConfig.Def_LoginAct_EquipPlus, 1) PlayerWeekParty.AddWeekPartyActionCnt(curPlayer, ChConfig.Def_WPAct_Plus, 1) return def __EquipMayaPlusChange(curPlayer, packType, curEquip, index, updPlusLV): ## ÂêÑżÓÇ¿µÈ¼¶¸Ä±ä ChEquip.SetEquipPartPlusLV(curPlayer, packType, index, curEquip, updPlusLV) broadCastLVList = IpyGameDataPY.GetFuncEvalCfg("StrengthenLevelBroadCast", 1) if updPlusLV in broadCastLVList: itemID = curEquip.GetItemTypeID() userData = curEquip.GetUserData() guid = ItemCommon.CacheNotifyEquipDetailInfo(curPlayer, curEquip) msgParamList = [curPlayer.GetPlayerName(), itemID, userData, guid, updPlusLV] PlayerControl.WorldNotify(0, "StrengthenCongratulation", msgParamList) classLV = ItemCommon.GetItemClassLV(curEquip) DoLogic_OnEquipPartStarLVChange(curPlayer, packType, classLV) # Ç¿»¯³É¾Í __UpdateEquipPlusSuccess(curPlayer, classLV) EventShell.EventRespons_EquipPlus(curPlayer, classLV, updPlusLV) # ¿ª·þ»î¶¯Êý¾Ý #OpenServerCampaign.UpdOpenServerCampaignRecordData(curPlayer, ShareDefine.Def_Campaign_Type_Plus, ChEquip.GetTotalPlusLV(curPlayer)) return def __UpdateEquipPlusSuccess(curPlayer, classLV): ipyDataList = IpyGameDataPY.GetIpyGameDataByCondition('EquipPlaceIndexMap', {'ClassLV':classLV}, True) if not ipyDataList: return packType = IPY_GameWorld.rptEquip plusLVCountDict = {} for ipyData in ipyDataList: index = ipyData.GetGridIndex() plusLV = ChEquip.GetEquipPartPlusLV(curPlayer, packType, index) if not plusLV: continue conditionKey = (classLV, plusLV) plusLVCountDict[conditionKey] = plusLVCountDict.get(conditionKey, 0) + 1 #GameWorld.DebugLog("Ç¿»¯³É¾ÍÊý¾Ý: classLV=%s,plusLVCountDict=%s" % (classLV, plusLVCountDict)) PlayerSuccess.UpdateSuccessProgressByConditions(curPlayer, ShareDefine.SuccType_EquipPlus, plusLVCountDict) PlayerActGarbageSorting.AddActGarbageTaskProgress(curPlayer, ChConfig.Def_GarbageTask_EquipPlus) return def DoLogic_OnEquipPartStarLVChange(curPlayer, packType, classLV): #ÏÈË¢×°±¸BUFF ÔÙ¼ÆËãÊôÐÔ curPlayer.SetDict(ChConfig.Def_PlayerKey_AttrActivatyNotify, ChConfig.Def_AttrActivatyNotify_Plus) ChEquip.RefreshPlayerEquipAttribute(curPlayer, classLV) #Ë¢ÐÂËùÓÐÊôÐÔ playControl = PlayerControl.PlayerControl(curPlayer) playControl.RefreshPlayerAttrState() return #// A3 16 ×°±¸Ç¿»¯½ø»¯ #tagCMEquipPlusEvolve #struct tagCMEquipPlusEvolve #{ # tagHead Head; # WORD ItemIndex; //×°±¸ÔÚ±³°üÖÐË÷Òý #}; def OnEquipPlusEvolve(playerIndex, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(playerIndex) equipPackindex = clientData.ItemIndex packType = IPY_GameWorld.rptEquip curPack = curPlayer.GetItemManager().GetPack(packType) curEquip = curPack.GetAt(equipPackindex) if not ItemCommon.CheckItemCanUse(curEquip): return curEvolveLV = ChEquip.GetEquipPartPlusEvolveLV(curPlayer, packType, equipPackindex) nextEvolveLV = curEvolveLV + 1 equipPlace = curEquip.GetEquipPlace() ipyData = IpyGameDataPY.GetIpyGameData('EquipPlusEvolve', equipPlace, nextEvolveLV) if not ipyData: return needPlusLV = ipyData.GetNeedPlusLV() curPartPlusLV = ChEquip.GetEquipPartPlusLV(curPlayer, packType, equipPackindex) if curPartPlusLV < needPlusLV: GameWorld.DebugLog("Ç¿»¯µÈ¼¶²»×㣬ÎÞ·¨½ø»¯! curPartPlusLV=%s < needPlusLV=%s, nextEvolveLV=%s" % (curPartPlusLV, needPlusLV, nextEvolveLV)) return costItemDict = ipyData.GetCostItem() delItemDict = {} itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem) for itemID, itemCnt in costItemDict.items(): hasEnough, indexList, findItemIsBind, lackCnt = ItemCommon.GetItem_FromPack_ByID_ExEx(itemID, itemPack, itemCnt) if not hasEnough: GameWorld.DebugLog('×°±¸Ç¿»¯½ø»¯ ²ÄÁϲ»×ãitemID= %s,itemCnt=%s' % (itemID, itemCnt)) return delItemDict[tuple(indexList)] = itemCnt for itemIndexList, delCnt in delItemDict.items(): ItemCommon.ReduceItem(curPlayer, itemPack, itemIndexList, delCnt, True, ChConfig.ItemDel_EquipPlus) ChEquip.SetEquipPartPlusEvolveLV(curPlayer, packType, equipPackindex, nextEvolveLV) DoLogic_OnEquipPartStarLVChange(curPlayer, packType, ItemCommon.GetItemClassLV(curEquip)) ChEquip.NotifyEquipPartPlusLV(curPlayer, packType, equipPackindex) EventShell.EventRespons_EquipPlusEvolve(curPlayer, nextEvolveLV) return #// A5 C7 ¼¤»î´óʦǿ»¯µÈ¼¶ #tagCMActivateMasterPlusLV # #struct tagCMActivateMasterPlusLV #{ # tagHead Head; # BYTE ClassLV; // ËùÊô×°±¸½× # WORD MasterPlusLV; // ´óʦǿ»¯µÈ¼¶ #}; def OnActivateMasterPlusLV(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) classLV = clientData.ClassLV actMasterPlusLV = clientData.MasterPlusLV curMasterPlusLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipPartMasterPlusLV % classLV) if curMasterPlusLV >= actMasterPlusLV: # ÒѾ­¼¤»î¹ýÁË GameWorld.DebugLog("ÒѾ­¼¤»î¹ý¸ÃÇ¿»¯´óʦµÈ¼¶ÁË! actMasterPlusLV=%s,curMasterPlusLV=%s" % (actMasterPlusLV, curMasterPlusLV)) return ipyData = IpyGameDataPY.GetIpyGameDataByCondition("ItemPlusMaster", {"ClassLV":classLV, "MasterPlusLV":actMasterPlusLV}, False, False) if not ipyData: GameWorld.DebugLog("²»´æÔÚ¸ÃÇ¿»¯´óʦµÈ¼¶! actMasterPlusLV=%s" % actMasterPlusLV) return packType = IPY_GameWorld.rptEquip # ÅжϿɷñ¼¤»î for equipPlace in ChConfig.EquipPlace_Base: ipyData = IpyGameDataPY.GetIpyGameData('EquipPlaceIndexMap', classLV, equipPlace) if not ipyData: return equipIndex = ipyData.GetGridIndex() plusLV = ChEquip.GetEquipPartPlusLV(curPlayer, packType, equipIndex) if plusLV < actMasterPlusLV: GameWorld.DebugLog("²¿Î»Ç¿»¯µÈ¼¶²»×㣬ÎÞ·¨¼¤»îÇ¿»¯´óʦ! equipPlace=%s,equipIndex=%s,plusLV=%s < %s" % (equipPlace, equipIndex, plusLV, actMasterPlusLV)) return GameWorld.DebugLog("¼¤»îÇ¿»¯´óʦµÈ¼¶! classLV=%s,actMasterPlusLV=%s" % (classLV, actMasterPlusLV)) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_EquipPartMasterPlusLV % classLV, actMasterPlusLV) SyncEquipMasterPlusLVInfo(curPlayer, classLV) ChEquip.ChangeEquipEffectByPlusMaster(curPlayer, classLV) #Ë¢ÐÂËùÓÐÊôÐÔ DoLogic_OnEquipPartStarLVChange(curPlayer, packType, classLV) return def SyncEquipMasterPlusLVInfo(curPlayer, classLV=0, isForce=False): ## ͬ²½´óʦǿ»¯µÈ¼¶ÐÅÏ¢ if not classLV: needSyncClassLVList = xrange(1, IpyGameDataPY.GetFuncCfg('EquipMaxClasslv') + 1) else: needSyncClassLVList = [classLV] masterPlusLVInfoList = [] for classLV in needSyncClassLVList: masterPlusLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipPartMasterPlusLV % classLV) if not masterPlusLV and not isForce: continue lvInfo = ChPyNetSendPack.tagMCMasterPlusLV() lvInfo.ClassLV = classLV lvInfo.MasterPlusLV = masterPlusLV masterPlusLVInfoList.append(lvInfo) if not masterPlusLVInfoList: return clientPack = ChPyNetSendPack.tagMCMasterPlusLVInfo() clientPack.MasterPlusLVInfoList = masterPlusLVInfoList clientPack.Count = len(masterPlusLVInfoList) NetPackCommon.SendFakePack(curPlayer, clientPack) return