#!/usr/bin/python # -*- coding: GBK -*- #------------------------------------------------------------------------------- # #------------------------------------------------------------------------------- ##@package ChEquip # ×°±¸Âß¼­´¦Àí # # @author alee # @date 2017-07-29 00:30 # @version 1.0 # # ÐÞ¸Äʱ¼ä ÐÞ¸ÄÈË ÐÞ¸ÄÄÚÈÝ #------------------------------------------------------------------------------ #"""Version = 2017-07-29 00:30""" #------------------------------------------------------------------------------ import IPY_GameWorld import GameWorld import ChConfig import ShareDefine import IpyGameDataPY import PlayerOnline import PlayerControl import DataRecordPack import ItemControler import ItemCommon def RefreshRoleEquipAttr(curPlayer): ## Ë¢ÐÂÖ÷¹«×°±¸ÊôÐÔ CalcRoleEquipAttr(curPlayer) PlayerOnline.GetOnlinePlayer(curPlayer).RefreshRoleAttr() return def CalcRoleEquipAttr(curPlayer): ## ¼ÆËãÖ÷¹«×°±¸ÊôÐÔ playerID = curPlayer.GetPlayerID() mainEquipAttrDict = {} packType = IPY_GameWorld.rptEquip equipPack = curPlayer.GetItemManager().GetPack(packType) # Ö÷×°±¸ for equipPlace in ChConfig.Def_MainEquipPlaces: equipIndex = equipPlace - 1 if equipIndex < 0 or equipIndex >= equipPack.GetCount(): continue curEquip = equipPack.GetAt(equipIndex) if not curEquip or curEquip.IsEmpty(): continue #itemColor = curEquip.GetItemColor() baseAttrIDCnt = curEquip.GetUserAttrCount(ShareDefine.Def_IudetBaseAttrID) baseAttrValueCnt = curEquip.GetUserAttrCount(ShareDefine.Def_IudetBaseAttrValue) if baseAttrIDCnt == baseAttrValueCnt: for i in xrange(baseAttrIDCnt): attrID = curEquip.GetUserAttrByIndex(ShareDefine.Def_IudetBaseAttrID, i) attrValue = curEquip.GetUserAttrByIndex(ShareDefine.Def_IudetBaseAttrValue, i) mainEquipAttrDict[attrID] = mainEquipAttrDict.get(attrID, 0) + attrValue legendAttrIDCnt = curEquip.GetUserAttrCount(ShareDefine.Def_IudetLegendAttrID) legendAttrValueCnt = curEquip.GetUserAttrCount(ShareDefine.Def_IudetLegendAttrValue) if legendAttrIDCnt == legendAttrValueCnt: for i in xrange(legendAttrIDCnt): attrID = curEquip.GetUserAttrByIndex(ShareDefine.Def_IudetLegendAttrID, i) attrValue = curEquip.GetUserAttrByIndex(ShareDefine.Def_IudetLegendAttrValue, i) mainEquipAttrDict[attrID] = mainEquipAttrDict.get(attrID, 0) + attrValue GameWorld.DebugLog("Ö÷Ïß×°±¸ÊôÐÔ: %s" % mainEquipAttrDict, playerID) PlayerOnline.GetOnlinePlayer(curPlayer).SetCalcAttr(ChConfig.Def_CalcAttr_MainEquip, mainEquipAttrDict) return def FixRoleEquipHP(curPlayer, fixVersion): ## ÐÞÕýÍæ¼Ò×°±¸ÉúÃüÊýÖµ£º ²ß»®µ÷ÕûÁËÉúÃüÕ¼±È£¬Í¬²½ÐÞ¸ÄÁËÉúÃüÕ½Á¦£¬¹ÊÐèÐÞÕýÏßÉÏÍæ¼Ò×°±¸ÉúÃü£¬·ÀÖ¹Õ½Á¦Ï½µ playerID = curPlayer.GetPlayerID() fightPowerBef = PlayerControl.GetFightPower(curPlayer) GameWorld.Log("ÐÞÕýÍæ¼Ò×°±¸ÉúÃüÊýÖµ! fixVersion=%s,fightPowerBef=%s" % (fixVersion, fightPowerBef), playerID) # ÐèÒªÐÞÕýÉíÉÏ¡¢µôÂä±³°ü for packType in [IPY_GameWorld.rptEquip, IPY_GameWorld.rptIdentify]: equipPack = curPlayer.GetItemManager().GetPack(packType) for index in range(equipPack.GetCount()): curEquip = equipPack.GetAt(index) if not curEquip or curEquip.IsEmpty(): continue if not ItemCommon.GetIsMainEquip(curEquip): #GameWorld.DebugLog("·ÇÖ÷Ïß×°±¸: itemIndex=%s" % itemIndex, playerID) continue itemID = curEquip.GetItemTypeID() # Ö±½ÓÖØÐÂÉú³ÉÒ»¼þ×°±¸½øÐÐÌæ»»ÉúÃüÊôÐÔ¼´¿É tempItem = ItemControler.GetOutPutItemObj(itemID, curPlayer=curPlayer) if not tempItem: continue tempEquipMaxHP = 0 baseAttrIDCnt = tempItem.GetUserAttrCount(ShareDefine.Def_IudetBaseAttrID) baseAttrValueCnt = tempItem.GetUserAttrCount(ShareDefine.Def_IudetBaseAttrValue) for i in xrange(min(baseAttrIDCnt, baseAttrValueCnt)): attrID = tempItem.GetUserAttrByIndex(ShareDefine.Def_IudetBaseAttrID, i) attrValue = tempItem.GetUserAttrByIndex(ShareDefine.Def_IudetBaseAttrValue, i) if attrID == ChConfig.AttrID_MaxHP: tempEquipMaxHP = attrValue break tempItem.Clear() # ²»ÐèÒªÁË£¬Ö±½Ó Clear if tempEquipMaxHP <= 0: continue curEquipMaxHP = 0 baseIDList, baseValueList = [], [] baseAttrIDCnt = curEquip.GetUserAttrCount(ShareDefine.Def_IudetBaseAttrID) baseAttrValueCnt = curEquip.GetUserAttrCount(ShareDefine.Def_IudetBaseAttrValue) for i in xrange(min(baseAttrIDCnt, baseAttrValueCnt)): attrID = curEquip.GetUserAttrByIndex(ShareDefine.Def_IudetBaseAttrID, i) attrValue = curEquip.GetUserAttrByIndex(ShareDefine.Def_IudetBaseAttrValue, i) if attrID == ChConfig.AttrID_MaxHP: curEquipMaxHP = attrValue attrValue = tempEquipMaxHP baseIDList.append(attrID) baseValueList.append(attrValue) if curEquipMaxHP >= tempEquipMaxHP: GameWorld.Log(" packType=%s,index=%s,curEquipMaxHP=%s >= %s, ²»´¦Àí! " % (packType, index, curEquipMaxHP, tempEquipMaxHP), playerID) continue userDataBef = curEquip.GetUserData() singleItem = curEquip.GetItem() singleItem.ClearUserAttr(ShareDefine.Def_IudetBaseAttrID) singleItem.ClearUserAttr(ShareDefine.Def_IudetBaseAttrValue) for i, attrID in enumerate(baseIDList): singleItem.AddUserAttr(ShareDefine.Def_IudetBaseAttrID, attrID) singleItem.AddUserAttr(ShareDefine.Def_IudetBaseAttrValue, baseValueList[i]) curEquip.Sync_Item() userDataAft = curEquip.GetUserData() GameWorld.Log(" packType=%s,index=%s,curEquipMaxHP=%s to %s,userDataBef=%s,userDataAft=%s" % (packType, index, curEquipMaxHP, tempEquipMaxHP, userDataBef, userDataAft), playerID) fixDict = {"fixVersion":fixVersion, "packType":packType, "index":index, "itemID":itemID, "userDataBef":userDataBef, "userDataAft":userDataAft} DataRecordPack.DR_FixVersion(curPlayer, "EquipHP", fixDict) RefreshRoleEquipAttr(curPlayer) PlayerOnline.GetOnlinePlayer(curPlayer).RefreshRoleAttr(refreshForce=True) fightPowerAft = PlayerControl.GetFightPower(curPlayer) DataRecordPack.DR_FixVersion(curPlayer, "EquipHP", {"fixVersion":fixVersion, "fightPowerBef":fightPowerBef, "fightPowerAft":fightPowerAft}) return #// A3 18 ÁéÆ÷Í»ÆÆ #tagCMLingQiEquipBreak # #struct tagCMLingQiEquipBreak #{ # tagHead Head; # DWORD ItemID; //Í»ÆÆµÄÎïÆ·ID #}; def OnLingQiEquipBreak(index, clientData, tick): return #// A3 27 ÁéÆ÷ÅàÑø #tagCMLingQiTrain # #struct tagCMLingQiTrain #{ # tagHead Head; # BYTE EquipPlace; //ÁéÆ÷×°±¸Î» # BYTE TrainType; //ÅàÑøÀàÐÍ£º 1-»ù´¡ÅàÑø£¬2-ÌØÊâÅàÑø£¬3-°Ù·Ö±ÈÅàÑø # WORD UseItemCnt; //ÏûºÄ²ÄÁϸöÊý #}; def OnLingQiTrain(index, clientData, tick): return def RefreshPlayerLingQiEquipAttr(curPlayer): ''' Ë¢ÐÂÍæ¼ÒÁéÆ÷×°±¸ÊôÐÔ ''' return def CalcAttr_LegendAttr(curPlayer, curEquip, allAttrListEquip, legendAttrDict={}): ## ¼ÆËã´«ÆæÊôÐÔ return #// A5 C6 ×°±¸²¿Î»ÐǼ¶Ì××°¼¤»î #tagCMEquipPartSuiteActivate # #struct tagCMEquipPartSuiteActivate #{ # tagHead Head; # BYTE ClassLV; // ËùÊô×°±¸½× # WORD SuiteID; // Ì××°ID # BYTE SuiteCount; // ¼þÊý # BYTE Star; // ÐÇÊý #}; def OnEquipPartSuiteActivate(index, clientData, tick): return def GetPlayerMaxEquipClassLV(curPlayer): ## »ñÈ¡Íæ¼Òµ±Ç°½âËøµÄ×°±¸½× key = "RealmEquipClassLVMap" RealmEquipClassLVMap = IpyGameDataPY.GetConfigEx(key) if not RealmEquipClassLVMap: RealmEquipClassLVMap = {} infoDict = {} ipyDataMgr = IpyGameDataPY.IPY_Data() for index in xrange(ipyDataMgr.GetEquipControlCount()): ipyData = ipyDataMgr.GetEquipControlByIndex(index) infoDict[ipyData.GetNeedRealmLV()] = ipyData.GetClassLV() needReamlLVList = infoDict.keys() needReamlLVList.sort() # ÉýÐòÅÅ for i, realmLV in enumerate(needReamlLVList): classLV = infoDict[realmLV] if i == len(needReamlLVList) - 1: RealmEquipClassLVMap[realmLV] = classLV if i == 0: continue else: preRealmLV = needReamlLVList[i - 1] preClassLV = infoDict[preRealmLV] for pRealmLV in range(preRealmLV, realmLV): RealmEquipClassLVMap[pRealmLV] = preClassLV GameWorld.DebugLog("¼ÓÔØ¾³½ç¶ÔÓ¦¿ª·Å×î´ó×°±¸½×ÉèÖÃ: %s" % RealmEquipClassLVMap) IpyGameDataPY.SetConfigEx(key, RealmEquipClassLVMap) playerRealmLV = curPlayer.GetOfficialRank() if playerRealmLV in RealmEquipClassLVMap: return RealmEquipClassLVMap[playerRealmLV] maxRealmLV = max(RealmEquipClassLVMap) if playerRealmLV >= maxRealmLV: return RealmEquipClassLVMap[maxRealmLV] return 0 # »ñÈ¡ÂúÌ××°»¯µÄ×îµÍ½×Êý£¬Èç5¼þÌ×£¬4¼þ5¼¶£¬1¼þ3¼¶£¬Ôò·µ»Ø3 def GetEquipSuitsLVByType(curPlayer, suitType, groupType): return 0