#!/usr/bin/python # -*- coding: GBK -*- #------------------------------------------------------------------------------- # ##@package EquipZhuXian # # @todo:ÖïÏÉ×°±¸ # @author hxp # @date 2019-01-22 # @version 1.0 # # ÏêϸÃèÊö: ÖïÏÉ×°±¸ # #------------------------------------------------------------------------------- #"""Version = 2019-01-22 15:30""" #------------------------------------------------------------------------------- import GameWorld import ItemCommon import ShareDefine import PlayerControl import DataRecordPack import IpyGameDataPY import SkillCommon import PyGameData import ChConfig def GetZhuXianEquipIndexByPlace(equipPlace): ## »ñÈ¡ÖïÏÉ×°±¸Î»¶ÔÓ¦µÄË÷Òý return equipPlace - 1 - 120 def GetZhuXianEquipPlaceByIndex(equipIndex): ## »ñÈ¡ÖïÏÉ×°±¸Ë÷Òý¶ÔӦװ±¸Î» return equipIndex + 1 + 120 def GetZhuXianEquipPlaceIndexIsUnlock(curPlayer, equipPlaceIndex): ## »ñÈ¡ÖïÏÉ×°±¸Î»ÊÇ·ñ½âËø # @param equipPlaceIndex: ×¢Òâ´«ÈëµÄ²ÎÊýÊÇ×°±¸Î»Ë÷Òý equipPlace = GetZhuXianEquipPlaceByIndex(equipPlaceIndex) placeUnlockDict = IpyGameDataPY.GetFuncEvalCfg("EquipZhuXian", 1, {}) # ÖïÏÉ×°±¸Î»¶ÔÓ¦½âËøËùÐèÖïÏÉËþ²ãÊý {"×°±¸Î»":ÖïÏÉËþ²ãÊý, ...} ûÅäµÄĬÈϽâËø if str(equipPlace) not in placeUnlockDict: return True needTowerLV = placeUnlockDict[str(equipPlace)] curTowerLV = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_ZhuXianTowerPassLV) # Òѹý¹ØµÄÖïÏÉËþ²ãÊý return curTowerLV >= needTowerLV def CheckLearnZhuXianSkill(curPlayer, skillID): ## ¼ì²éÖïÏÉ×°±¸Î»×°±¸½×Êý zhuxianSkillCondition = IpyGameDataPY.GetFuncEvalCfg("EquipZhuXian", 3, {}) if str(skillID) not in zhuxianSkillCondition: return True classLVPlaceListDict = zhuxianSkillCondition[str(skillID)] zhuXianEquipPack = curPlayer.GetItemManager().GetPack(ShareDefine.rptZhuXianEquip) for classLV, placeList in classLVPlaceListDict.items(): needClassLV = int(classLV) for equipPlace in placeList: placeIndex = GetZhuXianEquipIndexByPlace(equipPlace) if placeIndex < 0 or placeIndex >= zhuXianEquipPack.GetCount(): return curEquip = zhuXianEquipPack.GetAt(placeIndex) if curEquip.IsEmpty(): GameWorld.DebugLog("ÖïÏÉ×°±¸Î»ÎÞ×°±¸£¬ÎÞ·¨¼¤»îÉñ¼¼! equipPlace=%s" % equipPlace) return curClassLV = ItemCommon.GetItemClassLV(curEquip) if curClassLV < needClassLV: GameWorld.DebugLog("ÖïÏÉ×°±¸Î»×°±¸½×¼¶²»×㣬ÎÞ·¨¼¤»îÉñ¼¼! equipPlace=%s,curClassLV=%s < needClassLV=%s" % (equipPlace, curClassLV, needClassLV)) return return True #// A3 30 ×°±¸ÖïÏÉ×°±¸ #tagCMEquipZhuXianItem # #struct tagCMEquipZhuXianItem #{ # tagHead Head; # BYTE EquipIndex; //×°±¸ÔÚÖïÏÉ×°±¸±³°üÖеÄË÷Òý # BYTE ItemIndex; //×°±¸ÔÚÖïÏÉÎïÆ·±³°üÖеÄË÷Òý #}; def OnEquipZhuXianItem(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) playerID = curPlayer.GetPlayerID() reqEquipPlaceIndex = clientData.EquipIndex itemIndex = clientData.ItemIndex GameWorld.DebugLog("´©´÷ÖïÏÉ×°±¸: EquipIndex=%s,ItemIndex=%s" % (reqEquipPlaceIndex, itemIndex), playerID) zhuXianItemPack = curPlayer.GetItemManager().GetPack(ShareDefine.rptZhuXianItem) curEquip = zhuXianItemPack.GetAt(itemIndex) if not ItemCommon.CheckItemCanUse(curEquip): GameWorld.DebugLog("ÎïÆ·Îª¿Õ»ò²»¿ÉÓÃ: itemIndex=%s" % itemIndex, playerID) return if not ItemCommon.GetIsZhuXianEquip(curEquip): GameWorld.DebugLog("·ÇÖïÏÉ×°±¸: itemIndex=%s" % itemIndex, playerID) return equipPlace = curEquip.GetEquipPlace() equipPlaceIndex = GetZhuXianEquipIndexByPlace(equipPlace) if reqEquipPlaceIndex != equipPlaceIndex: reqEquipPlace = GetZhuXianEquipPlaceByIndex(reqEquipPlaceIndex) canPlace = False for sharePlaceList in ShareDefine.ShareEquipPlace: if reqEquipPlace in sharePlaceList and equipPlace in sharePlaceList: canPlace = True break if not canPlace: GameWorld.DebugLog("¸Ã×°±¸Î»²»¿É×°±¸¸ÃÎïÆ·!equipPlace=%s,equipPlaceIndex=%s != reqEquipPlaceIndex=%s" % (equipPlace, equipPlaceIndex, reqEquipPlaceIndex), playerID) return zhuXianEquipPack = curPlayer.GetItemManager().GetPack(ShareDefine.rptZhuXianEquip) if reqEquipPlaceIndex < 0 or reqEquipPlaceIndex >= zhuXianEquipPack.GetCount(): GameWorld.ErrLog("ÖïÏÉ×°±¸±³°üË÷ÒýÒì³£: EquipIndex=%s" % (reqEquipPlaceIndex), playerID) return if not GetZhuXianEquipPlaceIndexIsUnlock(curPlayer, reqEquipPlaceIndex): GameWorld.DebugLog("ÖïÏÉ×°±¸Î»Î´½âËø: equipPlace=%s,EquipIndex=%s" % (equipPlace, reqEquipPlaceIndex)) return destEquip = zhuXianEquipPack.GetAt(reqEquipPlaceIndex) desItemID, desUserData = [0, ''] if destEquip.IsEmpty() else [destEquip.GetItemTypeID(), destEquip.GetUserData()] srcItemID, srcUserData = curEquip.GetItemTypeID(), curEquip.GetUserData() if not ItemCommon.DoLogicSwitchItem(curPlayer, curEquip, destEquip, ShareDefine.rptZhuXianEquip): return dataDict = {'dotype':'EquipZhuXianItem', 'desItemID':desItemID, 'desUserData':desUserData, 'srcItemID':srcItemID, 'srcUserData':srcUserData} DataRecordPack.Cache_FightPowerChangeInfo(curPlayer, ChConfig.PowerDownType_EquipChange, dataDict) RefreshZhuXianAttr(curPlayer) return #// A3 31 жÏÂÖïÏÉ×°±¸ #tagCMUnEquipZhuXianItem # #struct tagCMUnEquipZhuXianItem #{ # tagHead Head; # BYTE EquipIndex; //×°±¸ÔÚÖïÏÉ×°±¸±³°üÖеÄË÷Òý #}; def OnUnEquipZhuXianItem(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) playerID = curPlayer.GetPlayerID() EquipIndex = clientData.EquipIndex GameWorld.DebugLog("жÏÂÖïÏÉ×°±¸: EquipIndex=%s" % (EquipIndex), playerID) zhuXianEquipPack = curPlayer.GetItemManager().GetPack(ShareDefine.rptZhuXianEquip) if EquipIndex < 0 or EquipIndex >= zhuXianEquipPack.GetCount(): GameWorld.ErrLog("ÖïÏÉ×°±¸±³°üË÷ÒýÒì³£: EquipIndex=%s" % (EquipIndex), playerID) return curEquip = zhuXianEquipPack.GetAt(EquipIndex) if not ItemCommon.CheckItemCanUse(curEquip): GameWorld.DebugLog("ÖïÏÉ×°±¸Îª¿Õ»ò²»¿ÉÓÃ: EquipIndex=%s" % EquipIndex, playerID) return emptyIndex = ItemCommon.GetEmptyIndexInPack(curPlayer, ShareDefine.rptZhuXianItem) if not ItemCommon.DoLogicSwitchItemEx(curPlayer, ShareDefine.rptZhuXianEquip, ShareDefine.rptZhuXianItem, EquipIndex, emptyIndex): GameWorld.DebugLog("ÖïÏÉжÏÂ×°±¸Ê§°Ü: EquipIndex=%s" % (EquipIndex), playerID) return RefreshZhuXianAttr(curPlayer) return def RefreshZhuXianAttr(curPlayer): CalcZhuXianAttr(curPlayer) PlayerControl.PlayerControl(curPlayer).RefreshPlayerAttrState() return def CalcZhuXianAttr(curPlayer): ## Ë¢ÐÂÖïÏÉÊôÐÔ playerID = curPlayer.GetPlayerID() PyGameData.g_zhuXianSkillAddPerDict.pop(playerID, None) PyGameData.g_zhuXianSkillReducePerDict.pop(playerID, None) allAttrList = [{} for _ in range(4)] allAttrListZXSuit = [{} for _ in range(4)] equipScoreTotal = 0 #Ϊ½â¾ö×°±¸ÆÀ·Ö¡¢Õ½Á¦²»Ò»ÖµÄÇé¿ö£¬×°±¸Õ½Á¦¸ÄΪÓÉÆÀ·Ö×÷Ϊ²ÎÊý¼ÆËãÕ½Á¦ equipPlaceClassLVDict = {} #×°±¸Î»¶ÔӦװ±¸½× {×°±¸Î»:½×, ...} equipPlaceBaseAttrDict = {} #×°±¸Î»¶ÔÓ¦»ù´¡ÊôÐÔ×Öµä {×°±¸Î»:{ÊôÐÔID:value, ...}, ...} attrIDSkillPlusDict = IpyGameDataPY.GetFuncEvalCfg("SkillPlusAttrID", 1, {}) # ÊôÐÔID¶ÔÓ¦Ó°ÏìµÄ¼¼ÄÜTypeIDÁбí {ÊôÐÔID:[¼¼ÄÜTypeIDÁбí, ...], ...} addAttrIDList = range(ShareDefine.Def_Effect_SkillAddPer1, ShareDefine.Def_Effect_SkillAddPer7 + 1) reduceAttrIDList = range(ShareDefine.Def_Effect_SkillReducePer1, ShareDefine.Def_Effect_SkillReducePer7 + 1) zxSkillPlusAttrDict = {} # Íæ¼ÒÖïÏÉ×°±¸Ó°Ïì¼¼ÄÜTypeIDÊôÐÔ×Öµä {ÊôÐÔID:Öµ, ...} zhuXianEquipPack = curPlayer.GetItemManager().GetPack(ShareDefine.rptZhuXianEquip) equipPackCount = zhuXianEquipPack.GetCount() for equipIndex in range(len(ShareDefine.ZhuXianEquipPlace)): if equipIndex < 0 or equipIndex >= equipPackCount: break curEquip = zhuXianEquipPack.GetAt(equipIndex) if curEquip.IsEmpty(): continue equipScoreTotal += ItemCommon.GetEquipGearScore(curEquip) equipPlace = GetZhuXianEquipPlaceByIndex(equipIndex) equipPlaceClassLVDict[equipPlace] = ItemCommon.GetItemClassLV(curEquip) # »ù´¡ÊôÐÔ baseAttrDict = {} for effIndex in xrange(curEquip.GetEffectCount()): curEffect = curEquip.GetEffectByIndex(effIndex) if not curEffect or not curEffect.GetEffectID(): break effID = curEffect.GetEffectID() if not effID: continue effValue = curEffect.GetEffectValue(0) PlayerControl.CalcAttrDict_Type(effID, effValue, allAttrList) baseAttrDict[effID] = baseAttrDict.get(effID, 0) + effValue equipPlaceBaseAttrDict[equipPlace] = baseAttrDict # ´«ÆæÊôÐÔ if curEquip.GetUserAttrCount(ShareDefine.Def_IudetLegendAttrID) == curEquip.GetUserAttrCount(ShareDefine.Def_IudetLegendAttrValue): for i in xrange(curEquip.GetUserAttrCount(ShareDefine.Def_IudetLegendAttrID)): legendAttrID = curEquip.GetUserAttrByIndex(ShareDefine.Def_IudetLegendAttrID, i) legendAttrValue = curEquip.GetUserAttrByIndex(ShareDefine.Def_IudetLegendAttrValue, i) if legendAttrID in attrIDSkillPlusDict: zxSkillPlusAttrDict[legendAttrID] = zxSkillPlusAttrDict.get(legendAttrID, 0) + legendAttrValue else: PlayerControl.CalcAttrDict_Type(legendAttrID, legendAttrValue, allAttrList) # GameWorld.DebugLog("ÖïÏÉ×°±¸ÊôÐÔ: allAttrList=%s" % (allAttrList)) # GameWorld.DebugLog(" zxSkillPlusAttrDict=%s" % (zxSkillPlusAttrDict)) # GameWorld.DebugLog(" equipPlaceClassLVDict=%s" % (equipPlaceClassLVDict)) # »º´æ¼¼ÄÜÔöÇ¿±ÈÀý£¬Ä¿Ç°ÔÝдËÀ¶ÔÖ¸¶¨¼¼ÄÜÉ˺¦°Ù·Ö±ÈÌáÉý for attrID, plusValue in zxSkillPlusAttrDict.items(): if attrID not in attrIDSkillPlusDict: continue skillTypeIDList = attrIDSkillPlusDict[attrID] effSkillTypeID = 0 for skillTypeID in skillTypeIDList: skillData = curPlayer.GetSkillManager().FindSkillBySkillTypeID(skillTypeID) if not skillData: continue if SkillCommon.CheckSkillJob(curPlayer, skillData): effSkillTypeID = skillTypeID break if not effSkillTypeID: continue if attrID in addAttrIDList: skillAddPerDict = PyGameData.g_zhuXianSkillAddPerDict.get(playerID, {}) skillAddPerDict[effSkillTypeID] = plusValue PyGameData.g_zhuXianSkillAddPerDict[playerID] = skillAddPerDict elif attrID in reduceAttrIDList: skillReducePerDict = PyGameData.g_zhuXianSkillReducePerDict.get(playerID, {}) skillReducePerDict[effSkillTypeID] = plusValue PyGameData.g_zhuXianSkillReducePerDict[playerID] = skillReducePerDict # GameWorld.DebugLog(" PyGameData.g_zhuXianSkillAddPerDict=%s" % PyGameData.g_zhuXianSkillAddPerDict) # GameWorld.DebugLog(" PyGameData.g_zhuXianSkillReducePerDict=%s" % PyGameData.g_zhuXianSkillReducePerDict) # ¼ÆËãÌ××°£¬Ä¿Ç°ÔÝдËÀ¶ÔÖïÏÉ×°±¸²¿Î»»ù´¡ÊôÐÔÌáÉý suitAttrIDPlusPlaceDict = { ShareDefine.Def_Effect_ZXCloakAttrPer:ShareDefine.zxetCloak, ShareDefine.Def_Effect_ZXMaskAttrPer:ShareDefine.zxetMask, ShareDefine.Def_Effect_ZXGloveAttrPer:ShareDefine.zxetGlove, ShareDefine.Def_Effect_ZXRuyiAttrPer:ShareDefine.zxetRuyi, ShareDefine.Def_Effect_ZXPendantAttrPer:ShareDefine.zxetPendant, ShareDefine.Def_Effect_ZXRingAttrPer:ShareDefine.zxetRing, } suitPlaceGroupDict = IpyGameDataPY.GetFuncEvalCfg("EquipZhuXian", 2, {}) for suitType, placeGroupList in suitPlaceGroupDict.items(): suitType = int(suitType) suitLV = 0 isSuit = True for place in placeGroupList: if place not in equipPlaceClassLVDict: isSuit = False #GameWorld.DebugLog(" δ´©´÷×°±¸£¬ÎÞ·¨¼¤»îÖïÏÉÌ××°! suitType=%s,placeGroupList=%s,place=%s" % (suitType, placeGroupList, place)) break if not suitLV: suitLV = equipPlaceClassLVDict[place] else: suitLV = min(suitLV, equipPlaceClassLVDict[place]) if not isSuit or not suitLV: continue GameWorld.DebugLog(" ¼¤»îÖïÏÉÌ××°: suitType=%s, suitLV=%s" % (suitType, suitLV)) suitAttrIpyData = IpyGameDataPY.GetIpyGameData("ZhuXianSuitAttr", suitType, suitLV) if not suitAttrIpyData: continue suitAttrIDList = suitAttrIpyData.GetSuitAttrIDList() suitAttrValueList = suitAttrIpyData.GetSuitAttrValueList() if len(suitAttrIDList) != len(suitAttrValueList): continue for i, suitEffID in enumerate(suitAttrIDList): suitEffValue = suitAttrValueList[i] #GameWorld.DebugLog(" suitEffID=%s,suitEffValue=%s" % (suitEffID, suitEffValue)) if suitEffID in suitAttrIDPlusPlaceDict: plusPlace = suitAttrIDPlusPlaceDict[suitEffID] if plusPlace not in equipPlaceBaseAttrDict: continue plusEffDict = equipPlaceBaseAttrDict[plusPlace] #GameWorld.DebugLog(" plusPlace=%s,plusEffDict=%s" % (plusPlace, plusEffDict)) for plusEffID, plusEffValue in plusEffDict.items(): addValue = int(plusEffValue * (10000 + suitEffValue) / 10000.0) #GameWorld.DebugLog(" plusEffID=%s,plusEffValue=%s,addValue=%s" % (plusEffID, plusEffValue, addValue)) PlayerControl.CalcAttrDict_Type(plusEffID, addValue, allAttrListZXSuit) else: PlayerControl.CalcAttrDict_Type(suitEffID, suitEffValue, allAttrListZXSuit) # ±£´æ¼ÆËãÖµ PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_ZXEquip, allAttrList) PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_ZXEquipSuit, allAttrListZXSuit) #¼ÆËã×°±¸»ù´¡ÊôÐÔ¸½¼ÓÕ½Á¦ (Ŀǰ×é³É: ÆÀ·ÖÕ½Á¦ + ...) equipFightPowerEx = eval(IpyGameDataPY.GetFuncCompileCfg("FightpowerFormula", 2)) GameWorld.DebugLog("ÖïÏÉ×°±¸ÆÀ·ÖÕ½Á¦: equipScoreTotal=%s,equipFightPowerEx=%s" % (equipScoreTotal, equipFightPowerEx)) curPlayer.SetDict(ChConfig.Def_PlayerKey_MFPEx % ShareDefine.Def_MFPType_ZhuXian, equipFightPowerEx) return def GetZhuXianEquipSkillAddPer(playerID, skillTypeID): ## »ñÈ¡ÖïÏÉ×°±¸É˺¦°Ù·Ö±ÈÌáÉýÖµ if playerID not in PyGameData.g_zhuXianSkillAddPerDict: return 0 skillAddPerDict = PyGameData.g_zhuXianSkillAddPerDict[playerID] if skillTypeID not in skillAddPerDict: return 0 return skillAddPerDict[skillTypeID] def GetZhuXianEquipSkillReducePer(playerID, skillTypeID): ## »ñÈ¡ÖïÏÉ×°±¸¼õÉ˰ٷֱÈÌáÉýÖµ if playerID not in PyGameData.g_zhuXianSkillReducePerDict: return 0 skillReducePerDict = PyGameData.g_zhuXianSkillReducePerDict[playerID] if skillTypeID not in skillReducePerDict: return 0 return skillReducePerDict[skillTypeID]