#!/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 import PlayerTongTianLing #------------------------------------------------------------------------------------------- #=============================================================================== # //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) PlayerTongTianLing.AddTongTianTaskValue(curPlayer, ChConfig.TTLTaskType_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 totalPlusLV = ChEquip.GetTotalPlusLV(curPlayer) classPlusLV = 0 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 classPlusLV += plusLV #GameWorld.DebugLog("Ç¿»¯³É¾ÍÊý¾Ý: classLV=%s,plusLVCountDict=%s,classPlusLV=%s,totalPlusLV=%s" % (classLV, plusLVCountDict, classPlusLV, totalPlusLV)) PlayerSuccess.UpdateSuccessProgressByConditions(curPlayer, ShareDefine.SuccType_EquipPlus, plusLVCountDict) PlayerSuccess.UptateSuccessProgress(curPlayer, ShareDefine.SuccType_EquipPlusTotal, totalPlusLV) PlayerSuccess.UptateSuccessProgress(curPlayer, ShareDefine.SuccType_EquipPlusClass, classPlusLV, [classLV]) 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