#!/usr/bin/python # -*- coding: GBK -*- #--------------------------------------------------------------------- # #--------------------------------------------------------------------- ##@package ItemCommon # ÎïÆ·Í¨Óà # # @author alee # @date 2017-07-28 14:00 # @version 1.0 # # ÐÞ¸Äʱ¼ä ÐÞ¸ÄÈË ÐÞ¸ÄÄÚÈÝ #--------------------------------------------------------------------- #"""Version = 2017-07-28 14:00""" #--------------------------------------------------------------------- #ÎïÆ·¹ÜÀíÆ÷ import GameWorld import BuffSkill import PlayerControl import SkillCommon import IPY_GameWorld import ChConfig import ReadChConfig import ShareDefine import ItemControler import DataRecordPack import EventReport import ChItem import IpyGameDataPY import ChPyNetSendPack import NetPackCommon import PyGameData import ChEquip import SkillShell import PlayerHero import random import math import time import json #--------------------------------------------------------------------- #ʹÓòÄÁÏģʽ ¶¼Óà ֻÓв»°ó¶¨ Ö»ÓÃ°ó¶¨ [ UseStuffMode_All, # ¿ÉÒÔʹÓÃÈ«²¿²ÄÁÏ UseStuffMode_NoBind, # ֻʹÓ÷ǰ󶨵IJÄÁÏ UseStuffMode_Bind, # ֻʹÓð󶨵IJÄÁÏ ] = range(0 , 2 + 1) #--------------------------------------------------------------------- def InitPyItem(): if PyGameData.InitPyItem: return GameWorld.Log("¼ÓÔØÎïÆ·Êý¾Ý...") PyGameData.EquipItemSkillIDList = [] PyGameData.DailyUseCountLimitItemIDList = [] PyGameData.AutoTransformCountItemIDList = [] gameData = GameWorld.GetGameData() for i in range(0, gameData.GetItemCount()): findItemData = gameData.GetItemAt(i) itemID = findItemData.GetItemTypeID() if GetCanUseCountDaily(findItemData): PyGameData.DailyUseCountLimitItemIDList.append(itemID) itemEff = findItemData.GetEffectByIndex(0) curEffID = itemEff.GetEffectID() if curEffID == ChConfig.Def_Effect_EquipStone: stoneEffType = itemEff.GetEffectValue(0) stoneLevel = itemEff.GetEffectValue(1) PyGameData.g_stoneLevelIDDict[(stoneEffType, stoneLevel)] = itemID elif curEffID == ChConfig.Def_Effect_ItemCount: PyGameData.AutoTransformCountItemIDList.append(itemID) if GetIsEquip(findItemData): for skillIndex in xrange(findItemData.GetAddSkillCount()): itemSkillID = findItemData.GetAddSkill(skillIndex) if not itemSkillID: continue if itemSkillID not in PyGameData.EquipItemSkillIDList: PyGameData.EquipItemSkillIDList.append(itemSkillID) if PyGameData.DailyUseCountLimitItemIDList: GameWorld.Log("ÿÈÕÓÐʹÓôÎÊýÏÞÖÆµÄÎïÆ·IDÁбí: %s" % PyGameData.DailyUseCountLimitItemIDList) if PyGameData.EquipItemSkillIDList: GameWorld.Log("×°±¸¼¼ÄÜIDÁбí: %s" % PyGameData.EquipItemSkillIDList) if PyGameData.AutoTransformCountItemIDList: GameWorld.Log("×Ô¶¯×ª»¯ÎªÎïÆ·¸öÊýµÄÎïÆ·IDÁбí: %s" % PyGameData.AutoTransformCountItemIDList) PyGameData.InitPyItem = True return ## ÎïÆ·´¥·¢¼¼ÄÜÔö¼Óbuff # @param curPlayer µ±Ç°Íæ¼Ò # @param curItem ÎïÆ· # @param tick ʱ¼ä´Á # @param needResult ÊÇ·ñÐèҪˢÐÂÊôÐÔ # @return ²¼¶ûÖµ # @remarks ÎïÆ·´¥·¢¼¼ÄÜÔö¼Óbuff def ItemUseSkillAddBuff(curPlayer, curItem, tick, needResult=True, useCnt=1): addSkillList = __GetAddSkillList(curPlayer, curItem) #ÎÞ¸½¼Ó¼¼ÄÜ if not addSkillList: return False refreshResult = False #buffTypeList = [] for _ in xrange(useCnt): for addSkill in addSkillList: buffType = SkillCommon.GetBuffType(addSkill) #@warning: ÎïÆ·´¥·¢¼¼ÄÜ, Buff×ÜֵΪµÚ1¸öЧ¹ûµÄAÖµ addBuffValueList = SkillShell.GetAddBuffValue(curPlayer, addSkill, curPlayer) if BuffSkill.AddBuffNoRefreshState(curPlayer, buffType, addSkill, tick, addBuffValueList, curPlayer): refreshResult = True #---´¥·¢×°±¸¼¼Äܳɹ¦--- if needResult and refreshResult: playerControl = PlayerControl.PlayerControl(curPlayer) playerControl.RefreshPlayerAttrByBuff() return True ## »ñÈ¡ÎïÆ·ËùÓµÓеļ¼ÄÜ # @param curPlayer µ±Ç°Íæ¼Ò # @param curItem ʹÓÃÎïÆ· # @return addSkillList ¼¼ÄÜÁбí # @remarks º¯ÊýÏêϸ˵Ã÷. def __GetAddSkillList(curPlayer , curItem): addSkillList = [] gameData = GameWorld.GetGameData() curItemID = curItem.GetItemTypeID() for i in range(0, curItem.GetAddSkillCount()): curSkillID = curItem.GetAddSkill(i) if not curSkillID: continue curSkill = gameData.GetSkillBySkillID(curSkillID) if not curSkill: GameWorld.Log('###²ß»®Ìî±íÒì³££¬ÎïÆ· = %s´¥·¢¼¼ÄÜʧ°Ü = %s' % (curItemID , curSkillID)) return [] buffType = SkillCommon.GetBuffType(curSkill) #¼ì²éÊÇ·ñ¿ÉÒÔÌí¼ÓÕâ¸öbuff if not SkillCommon.CheckCanAddBuff(curPlayer , buffType , curSkill.GetSkillTypeID(), curSkill.GetSkillLV()): PlayerControl.NotifyCode(curPlayer, 'XW_ZZ_ResInvalidation') return [] addSkillList.append(curSkill) return addSkillList def GetItemSkillIDList(curItem): ## »ñÈ¡ÎïÆ·¿ÉÌí¼ÓµÄ¼¼ÄÜIDÁбí addSkillIDList = [] for i in xrange(curItem.GetUserAttrCount(ShareDefine.Def_IudetAddSkillID)): skillID = curItem.GetUserAttrByIndex(ShareDefine.Def_IudetAddSkillID, i) addSkillIDList.append(skillID) if not addSkillIDList: for i in xrange(curItem.GetAddSkillCount()): skillID = curItem.GetAddSkill(i) if skillID == 0: break addSkillIDList.append(skillID) return addSkillIDList #--------------------------------------------------------------------- ## ÎïÆ·xml²ÎÊý # @param curItem ÎïÆ· # @return None def GetItemXMLMsg(curItem): itemTypeID = curItem.GetItemTypeID() # s0-s2 msgList = ['%s' % itemTypeID, '0' , '0' ] #=============================================================================== # stoneCntMax = ChConfig.Def_EquipMaxHole # ×î¶à¿×Êý # stoneIDList = [] # ¿×Éϵı¦Ê¯IDÁбí # for i in range(stoneCntMax): # # if i >= canPlaceStoneCount: # stoneIDList.append('0') # continue # # stoneIDList.append('%s' % curItem.GetStone(i)) # # #s3-s11 stoneID # msgList.extend(stoneIDList) # # curDurg = GameWorld.GetIntUpper(curItem.GetCurDurg(), ChConfig.Def_EndureRepairParameter) # curMaxDurg = GameWorld.GetIntUpper(curItem.GetMaxEndure(), ChConfig.Def_EndureRepairParameter) # curItemMakerName = curItem.GetMakerName() # # #ÎÞÃû×Ö,·¢¿Õ×Ö·û # # if not curItem.GetMaker(): # # curItemMakerName = ' ' # # addSkillCnt = curItem.GetUserAttr(IPY_GameWorld.iudetEquipAddSkillCnt) # # #s12 -> ÎåÐÐ,s13 -> Áé»ê¼¼ÄÜID,s14 -> µ±Ç°Ä;Ã,s15 -> ×î´óÄ;Ã,s16 -> °ó¶¨,s17 -> MakeID,s18 -> # msgList.extend(['%s' % curItem.GetItemProperty(), # '%s' % curItem.GetSoulProperty(), # '%s' % curDurg, '%s' % curMaxDurg, # '%s' % curItem.GetIsBind(), # '%s' % curItemMakerName, # '%s' % addSkillCnt]) # # skillCntMax = ChConfig.Def_EquipSkillCntMax # ¸½¼ÓÊôÐÔ¼¼ÄÜ×î¶à # addSkillList = [] # ¸Ã×°±¸µ±Ç°µÄÁéÎÆÊôÐÔÁбí # # for j in range(skillCntMax): # if j >= curItem.GetUserAttrCount(IPY_GameWorld.iudetEquipAddSkillList): # addSkillList.append('0') # continue # # skillID = curItem.GetUserAttrByIndex(IPY_GameWorld.iudetEquipAddSkillList, j) # addSkillList.append('%s' % skillID) # # #s19-s38 skillID # msgList.extend(addSkillList) # # #s39 -> ¿ª¹â,s40 -> ×°±¸ÆõºÏµÈ¼¶,s42 -> ×°±¸ÊìÁ·¶È,s42 -> ÊÇ·ñÌ××°»¯,s43 -> ×îСÉ˺¦, # #s44 -> ×î´óÉ˺¦, s45 -> ÁéÎÆ´ÎÊýÉÏÏÞ, s46 -> ×°±¸·ÀÓùÖµ, s47 -> Ê£Óàʱ¼ä, s48 -> hp»ù´¡Öµ, # #s49 -> ÄÚ·À»ù´¡Öµ, s50 -> ÊÇ·ñ»½ÐÑ s51 -> itemTypeID # msgList.extend(['%s' % curItem.GetUserAttr(IPY_GameWorld.iudetEquipElem), # ¿ª¹â # '%s' % curItem.GetFitLV(), # ×°±¸ÆõºÏµÈ¼¶ # '%s' % curItem.GetProficiency(), # ×°±¸ÊìÁ·¶È # '%s' % int(curItem.GetIsSuite()), # ÊÇ·ñÌ××°»¯ # '%s' % curItem.GetEquipMinAtkValue(), # ×îСÉ˺¦ # '%s' % curItem.GetEquipMaxAtkValue(), # ×î´óÉ˺¦ # '%s' % curItem.GetRelMaxAddSkillCnt(), # ÁéÎÆ´ÎÊýÉÏÏÞ # '%s' % curItem.GetEquipDefenseValue(), # ×°±¸·ÀÓùÖµ # '%s' % curItem.GetRemainHour(), # Ê£Óàʱ¼ä # '%s' % curItem.GetBaseHP(), # hp»ù´¡Öµ # '%s' % curItem.GetBaseMagicDef(), # ÄÚ·À»ù´¡Öµ # '%s' % curItem.GetUserAttr(IPY_GameWorld.iudetWakeUpCnt), # ÊÇ·ñ»½ÐÑ # '%s' % itemTypeID]) #=============================================================================== return msgList ## Çå³ý°´Ìì¹ýÆÚÎïÆ· # @param curPlayer Íæ¼Ò # @return None def ClearDayTimeItem(curPlayer): serverDay = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_ServerDay) itemManager = curPlayer.GetItemManager() #±éÀú¿ÉÄÜ´æÔڵı³°ü, Ö´ÐÐÂß¼­ for packIndex in ChConfig.Def_RealityTimeItem_Pack: curPack = itemManager.GetPack(packIndex) for i in range(0, curPack.GetCount()): curItem = curPack.GetAt(i) #Òì³£ÎïÆ· if not CheckItemCanUse(curItem): continue reduceType = curItem.GetEndureReduceType() if reduceType not in [ChConfig.Def_EquipReduceType_Day, ChConfig.Def_EquipReduceType_ServerDay]: continue if reduceType == ChConfig.Def_EquipReduceType_Day: if curItem.GetRemainHour() > 1: curItem.SetRemainHour(curItem.GetRemainHour() - 1) # ÿÌì-1 continue elif reduceType == ChConfig.Def_EquipReduceType_ServerDay: if serverDay < curItem.GetExpireTime(): continue #curTime = GameWorld.ChangeTimeStrToNum(GameWorld.GetCurrentDataTimeStr()) #if curTime < curItem.GetRemainHour(): # continue curItemID = curItem.GetItemTypeID() if packIndex != IPY_GameWorld.rptRecycle: #»Ø¹ºµÄ²»Ìáʾ PlayerControl.NotifyCode(curPlayer, "PK_hwj35_82012", [curItemID]) dataDict = {"ItemID":curItemID, "CreateTime":curItem.GetCreateTime(), "IsBind":curItem.GetIsBind(), "ItemGUID":curItem.GetGUID()} DataRecordPack.DR_DeleteItem(curPlayer, "Time", dataDict) #ÎïÆ·Ïûʧ #curItem.Clear() return ## »ñµÃÖ¸¶¨ÌìµÄ¹ýÆÚʱ¼ä # @param days ¼¸Ììºó¹ýÆÚ ´Ó1¿ªÊ¼£¬´ú±íµ±Ìì # @return ¹ýÆÚʱ¼äÊý×Ö def __GetEndDayTimeNum(days): timeStr = str(GameWorld.GetDatetimeByDiffDays(days - 1)).split(" ")[0] + " 23:59:59" GameWorld.DebugLog("ÎïÆ·¹ýÆÚʱ¼ä" + timeStr) return GameWorld.ChangeTimeStrToNum(timeStr) def CreateSingleItem(itemID, itemCount=1, isAuctionItem=False, expireTime=0, curPlayer=None, setAttrDict=None): ''' ´´½¨ÎïÆ· @param isAuctionItem: ÊÇ·ñÅÄÆ·£¬Ä¬ÈÏ·ÇÅÄÆ· @param expireTime: ÓÐЧʱ¼ä£¬Ê±¼äµ¥Î»ÓÉʱЧÀàÐ;ö¶¨ ''' if itemCount < 1: GameWorld.ErrLog("´´½¨ÎïÆ·¸öÊý²»ÄÜÉÙÓÚ1! itemID=%s,itemCount=%s" % (itemID, itemCount)) return curSingleItem = GameWorld.GetItemFactory().CreateItem(itemID) if not curSingleItem: return #Èç¹ûÊÇÕæÊµÎïÆ·, ²»Í¨¹ýSetRemainHour֪ͨʣÓàʱ¼ä£¬¿Í»§¶Ë×Ô¼º¼ÆË㣬·þÎñ¶Ë·À·¶Ê¹Óà # ´´½¨ºó¿ªÊ¼¼ÆÊ± if curSingleItem.GetEndureReduceType() == ChConfig.Def_EquipReduceType_RTimeItem \ or curSingleItem.GetType() == ChConfig.Def_ItemType_CanUseByCDTime: #curSingleItem.SetRemainHour(curSingleItem.GetExpireTime()) # ֪ͨ¿Í»§¶ËʱЧÎïÆ·µÄ´´½¨Ê±¼ä curSingleItem.SetUserAttr(ShareDefine.Def_IudetCreateTime, int(time.time())) # ×°±¸ºó¿ªÊ¼¼ÆÊ± if curSingleItem.GetEndureReduceType() == ChConfig.Def_EquipReduceType_Time: # ֪ͨ¿Í»§¶ËʱЧÎïÆ·µÄ´´½¨Ê±¼ä curSingleItem.SetUserAttr(ShareDefine.Def_IudetCreateTime, 0) # ÏÞ¶¨Ê±¼ä¹ýÌìÏûʧµÄÎïÆ·£¬Èç1´ú±íµ±ÌìÏûʧ,onday ´¦Àí if curSingleItem.GetEndureReduceType() == ChConfig.Def_EquipReduceType_Day: # SetRemainHour´Ë´¦ÓÃÓڼǼ¹ýÆÚµÄ¾ßÌåʱ¼äÈç 2014-10-10 23:59:59 #timess = __GetEndDayTimeNum(curSingleItem.GetExpireTime()) curSingleItem.SetRemainHour(curSingleItem.GetExpireTime()) if curSingleItem.GetEndureReduceType() == ChConfig.Def_EquipReduceType_ServerDay: outTimeServerDay = curSingleItem.GetExpireTime() serverDay = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_ServerDay) if serverDay >= outTimeServerDay: curSingleItem.Clear() GameWorld.ErrLog("ÎïÆ·ÓÐЧÆÚ³¬¹ýÓÐЧµÄ¿ª·þÌì, ²»¿É´´½¨!itemID=%s,serverDay=%s,outTimeServerDay=%s" % (itemID, serverDay, outTimeServerDay)) return curSingleItem.SetRemainHour(outTimeServerDay) if isAuctionItem: if IpyGameDataPY.GetIpyGameDataNotLog("AuctionItem", itemID): ItemControler.SetIsAuctionItem(curSingleItem, isAuctionItem) else: GameWorld.DebugLog("ÅÄÂôÎïÆ·±í²»´æÔÚ¸ÃID!´´½¨ÅÄÆ·Ê§°Ü£¬Ä¬ÈÏתΪ·ÇÅÄÆ·!itemID=%s" % itemID) ItemControler.SetItemCount(curSingleItem, itemCount) if expireTime > 0: curSingleItem.SetUserAttr(ShareDefine.Def_IudetExpireTime, expireTime) # Ó¢ÐÛ if curSingleItem.GetType() == ChConfig.Def_ItemType_Hero: PlayerHero.InitHeroItem(curSingleItem) elif GetIsEquip(curSingleItem): setAttrDict = GetCreateEquipAttr(curSingleItem, curPlayer, setAttrDict) if setAttrDict == None: curSingleItem.Clear() return AddCreateItemAttr(curSingleItem, setAttrDict) #ÕâÀï·µ»ØµÄÊÇSingleItem , Èç¹û´´½¨ÁË,δʹÓÃ,»áÕÒ³öC++ÄÚ´æÐ¹Â¶!!! return curSingleItem def AddCreateItemAttr(curItem, setAttrDict): ## ÉèÖÃÉú³É×°±¸ËùÓÐÊôÐÔ if not setAttrDict: return for key, value in setAttrDict.items(): key = GameWorld.ToIntDef(key, key) # ÐèÖ§³Ö # 1. UserData¸ñʽ: {'19': ['1889', '2034', '893', '927'], '50': ['1702622046'], '17': ['39', '33', '34', '9']} # 2. ×Ô¶¨Òå×Öµä: {"key":value, ...} keyÖ§³Ö×Ô¶¨Òå»òÓëUserDataµÄkey£¬valueÖ§³ÖÊýÖµ»òÁÐ±í£¬ÁбíÔªËØÖ§³Ö×Ö·û´®»òÊýÖµ£¬¾ùĬÈÏתΪÊýÖµ # ÊýÖµÀàÐ͵ÄĬÈÏΪUserDataÊôÐÔ if isinstance(key, int): if key % 2 == 0: # żÊýÊǵ¥ÊýÖµ v = 0 if isinstance(value, int): v = value elif (isinstance(value, list) or isinstance(value, tuple)) and value: v = GameWorld.ToIntDef(value[0], 0) curItem.SetUserAttr(key, v) elif isinstance(value, list) or isinstance(value, tuple): # µ¥ÊýÒ»¶¨ÊÇÒªÁбí curItem.ClearUserAttr(key) for v in value: v = GameWorld.ToIntDef(v, 0) curItem.AddUserAttr(key, v) # ÆäËûÖ¸¶¨×Ö·û´®ÀàÐÍÊôÐÔ else: GameWorld.Log("###AddCreateItemAttr unknown key:%s, value:%s, itemID=%s" % (key, value, curItem.GetItemTypeID())) #MakeEquipGS(curItem) return def GetCreateEquipAttr(curItem, curPlayer=None, setAttrDict=None): '''»ñÈ¡Éú³É×°±¸ËùÓÐÊôÐÔ @param curPlayer: ¿ÉÄÜΪNone @param setAttrDict: Ö±½ÓÉèÖÃÎïÆ·µÄÊôÐÔ {key:value, ...} keyÖ§³Ö ShareDefine.Def_IudetXXX×Ö·û´® »ò ×Ô¶¨key @return: None - Òì³£Çé¿ö£¬ÎïÆ·ÊµÀýÐèÒªclear equipAttrDict - Éú³ÉºóµÄ×îÐÂÊôÐÔk:v×ֵ䣬¿ÉÖ±½ÓÓÃÓÚ SetCreateEquipAttr ''' if setAttrDict == None: setAttrDict = {} equipAttrDict = {} playerID = 0 if not curPlayer else curPlayer.GetPlayerID() itemID = curItem.GetItemTypeID() appointID = setAttrDict.get(ShareDefine.Def_CItemKey_AppointID) # ¶¨ÖÆÊôÐÔID if appointID > 0: ipyData = IpyGameDataPY.GetIpyGameData("AppointItem", appointID) if not ipyData: return if ipyData.GetCancelUseLimit(): equipAttrDict[str(ShareDefine.Def_IudetCancelUseLimit)] = 1 equipAttrDict[str(ShareDefine.Def_IudetItemLV)] = ipyData.GetItemLV() equipAttrDict[str(ShareDefine.Def_IudetBaseAttrID)] = ipyData.GetBaseAttrID() equipAttrDict[str(ShareDefine.Def_IudetBaseAttrValue)] = ipyData.GetBaseAttrValue() equipAttrDict[str(ShareDefine.Def_IudetLegendAttrID)] = ipyData.GetLegendAttrID() equipAttrDict[str(ShareDefine.Def_IudetLegendAttrValue)] = ipyData.GetLegendAttrValue() GameWorld.DebugLog(" ×°±¸¶¨ÖÆÊôÐÔ: itemID=%s,appointID=%s,equipAttrDict=%s,setAttrDict=%s" % (itemID, appointID, equipAttrDict, setAttrDict), playerID) return equipAttrDict # Ö÷Ïß×°±¸ if GetIsMainEquip(curItem): return GetCreateMainEquipAttr(curItem, curPlayer, setAttrDict) return equipAttrDict def GetCreateMainEquipAttr(curItem, curPlayer, setAttrDict=None): ## Éú³ÉÖ÷Ïß×°±¸ÊôÐÔ equipAttrDict = {} itemID = curItem.GetItemTypeID() itemColor = curItem.GetItemColor() equipPlace = curItem.GetEquipPlace() if not curPlayer: return equipAttrDict colorIpyData = IpyGameDataPY.GetIpyGameData("EquipColor", itemColor) placeIpyData = IpyGameDataPY.GetIpyGameData("EquipPlace", equipPlace) if not colorIpyData or not placeIpyData: return equipAttrDict playerLV = curPlayer.GetLV() playerID = curPlayer.GetPlayerID() randfloat = random.uniform # Ëæ»úÒ»¸öabÇø¼äµÄÊý [a, b]£¬abÖ§³ÖСÊý itemLV = setAttrDict.get(str(ShareDefine.Def_IudetItemLV), 0) if not itemLV: # Ëæ»úµÈ¼¶ lowLV, highLV = IpyGameDataPY.GetFuncEvalCfg("MainEquipDrop", 3) randLVList = range(max(playerLV + lowLV, 1), playerLV + highLV) itemLV = random.choice(randLVList) equipAttrDict[str(ShareDefine.Def_IudetItemLV)] = itemLV GameWorld.DebugLog("Éú³ÉÖ÷Ïß×°±¸: itemID=%s,itemLV=%s,itemColor=%s,equipPlace=%s" % (itemID, itemLV, itemColor, equipPlace), playerID) # »ù´¡Èýά baseAttrIDList = setAttrDict.get(str(ShareDefine.Def_IudetBaseAttrID)) baseAttrValueList = setAttrDict.get(str(ShareDefine.Def_IudetBaseAttrValue)) # ÕâÀï×¢ÒâNoneΪδָ¶¨£¬Ö§³Öµ±¿ÕÁбí[]ʱΪ²»¸ø¸ÃÊôÐÔ if baseAttrIDList != None and baseAttrValueList != None and len(baseAttrIDList) == len(baseAttrValueList): equipAttrDict[str(ShareDefine.Def_IudetBaseAttrID)] = baseAttrIDList equipAttrDict[str(ShareDefine.Def_IudetBaseAttrValue)] = baseAttrValueList else: attrProportion = placeIpyData.GetBaseAttrProportion() attrInfoList = [ [ChConfig.AttrID_Atk, colorIpyData.GetAtkStep()], [ChConfig.AttrID_Def, colorIpyData.GetDefStep()], [ChConfig.AttrID_MaxHP, colorIpyData.GetHPStep()], ] baseAttrIDList, baseAttrValueList = [], [] for attrID, attrStep in attrInfoList: attrValue = eval(IpyGameDataPY.GetFuncCompileCfg("MainEquipDrop", 4)) # int(itemLV*attrStep*attrProportion*randfloat(0.9,1.1)) if not attrValue: continue baseAttrIDList.append(attrID) baseAttrValueList.append(attrValue) if baseAttrIDList: equipAttrDict[str(ShareDefine.Def_IudetBaseAttrID)] = baseAttrIDList equipAttrDict[str(ShareDefine.Def_IudetBaseAttrValue)] = baseAttrValueList GameWorld.DebugLog(" baseAttrIDList=%s,baseAttrValueList=%s" % (baseAttrIDList, baseAttrValueList), playerID) # Õ½¶·ÊôÐÔ legendAttrIDList = setAttrDict.get(str(ShareDefine.Def_IudetLegendAttrID)) legendAttrValueList = setAttrDict.get(str(ShareDefine.Def_IudetLegendAttrValue)) if legendAttrIDList != None and legendAttrValueList != None and len(legendAttrIDList) == len(legendAttrValueList): equipAttrDict[str(ShareDefine.Def_IudetLegendAttrID)] = legendAttrIDList equipAttrDict[str(ShareDefine.Def_IudetLegendAttrValue)] = legendAttrValueList else: legendAttrIDList = [] legendAttrValueList = [] attrRangeDefault = colorIpyData.GetAttrRange() attrRangeDict = colorIpyData.GetAttrRangeDict() libCntList = colorIpyData.GetAttrLibCntList() GameWorld.DebugLog(" libCntList=%s,attrRangeDict=%s, %s" % (libCntList, attrRangeDict, attrRangeDefault), playerID) for num, attrCnt in enumerate(libCntList, 1): if not hasattr(placeIpyData, "GetAttrLib%s" % num): continue libAttrList = getattr(placeIpyData, "GetAttrLib%s" % num)() if not libAttrList: continue random.shuffle(libAttrList) randAttrList = libAttrList[:attrCnt] for attrID in randAttrList: if attrID in legendAttrIDList: continue attrRange = attrRangeDict.get(attrID, attrRangeDefault) if not attrRange or len(attrRange) != 2: continue attrMin, attrMax = attrRange attrValue = random.randint(attrMin, attrMax) legendAttrIDList.append(attrID) legendAttrValueList.append(attrValue) GameWorld.DebugLog(" libNum=%s,attrID=%s,attrValue=%s(%s~%s)" % (num, attrID, attrValue, attrMin, attrMax), playerID) if legendAttrIDList: equipAttrDict[str(ShareDefine.Def_IudetLegendAttrID)] = legendAttrIDList equipAttrDict[str(ShareDefine.Def_IudetLegendAttrValue)] = legendAttrValueList GameWorld.DebugLog(" legendAttrIDList=%s,legendAttrValueList=%s" % (legendAttrIDList, legendAttrValueList), playerID) GameWorld.DebugLog(" ×°±¸×îÖÕÊôÐÔ: equipAttrDict=%s,setAttrDict=%s" % (equipAttrDict, setAttrDict), playerID) return equipAttrDict def SetItemUserData(curItem, dataInfo): if isinstance(dataInfo, dict): UserData = str(dataInfo) elif isinstance(dataInfo, str): pass else: return UserData = UserData.replace(" ", "") curItem.SetUserData(UserData, len(UserData)) return def MakeEquipGS(curItem): return #--------------------------------------------------------------------- ## ͨ¹ýЧ¹ûID,¼ì²éÊÇ·ñΪָ¶¨ÎïÆ· # @param curPlayer µ±Ç°Íæ¼Ò # @param curItem µ±Ç°ÎïÆ· # @param effectList Ö¸¶¨µÄЧ¹ûIDÁбí # @return True or False # @remarks º¯ÊýÏêϸ˵Ã÷. def CheckItemByEffectID(curPlayer, curItem, effectList): if not CheckItemCanUse(curItem): return False if not ItemControler.CheckItemUseLV(curPlayer, curItem, False): return False for i in range(curItem.GetEffectCount()): effectID = curItem.GetEffectByIndex(i).GetEffectID() #ÕÒµ½¿ÕÏî¾ÍÍ˳ö if effectID == 0: return False if effectID in effectList: return True return False #--------------------------------------------------------------------- def FindItemInPackByEffect(curPlayer, effectID): ## ͨ¹ýЧ¹û±éÀú±³°üÕÒµ½ÎïÆ·,ÕÒµ½·µ»Ø¸ÃÎïÆ·£¬Ã»Óзµ»ØÄ¬ÈÏNone # @return curItem, index or None backPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem) #ËÑË÷±³°ü for i in range(backPack.GetCount()): curItem = backPack.GetAt(i) if not CheckItemByEffectID(curPlayer, curItem, [effectID]): continue return curItem, i return def FindItemInPackByEffectEx(curPlayer, effectID): ## ͨ¹ýЧ¹û±éÀú±³°üÕÒµ½ÎïÆ·,ÕÒµ½·µ»Ø¸ÃÎïÆ·£¬Ã»Óзµ»ØÄ¬ÈÏNone # @return curItem or None backPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem) #ËÑË÷±³°ü for i in range(backPack.GetCount()): curItem = backPack.GetAt(i) if not CheckItemByEffectID(curPlayer, curItem, [effectID]): continue return curItem return #--------------------------------------------------------------------- ## ͨ¹ýÎïÆ·ID±éÀú±³°üÕÒµ½ÎïÆ·, ûÓзµ»ØNone # @param curPlayer µ±Ç°Íæ¼Ò # @param findItemID ²éÕÒµÄÎïÆ· # @param packIndex ±³°üÀàÐÍ # @return item or None # @remarks º¯ÊýÏêϸ˵Ã÷. def FindItemInPackByItemID(curPlayer , findItemID , packIndex): backPack = curPlayer.GetItemManager().GetPack(packIndex) #ËÑË÷±³°ü for i in range(backPack.GetCount()): curItem = backPack.GetAt(i) if not CheckItemCanUse(curItem): continue if curItem.GetItemTypeID() != findItemID: continue return curItem return #--------------------------------------------------------------------- def CheckPackEnough(curPlayer, itemInfo, isNotify=True): ## ¼ì²é·ÅÈëÎïÆ·µÄ±³°ü¿Õ¼äÊÇ·ñ×ã¹» # @param itemInfo: Ö§³Ö {itemID:itemCount, ...} or [[itemID, itemCount], ...] if isinstance(itemInfo, dict): itemList = [] for itemID, itemCount in itemInfo.items(): itemList.append([itemID, itemCount]) else: itemList = itemInfo needPackSpaceDict = {} for item in itemList: itemID, itemCount = item[:2] isAuctionItem = item[2] if len(item) > 2 else 0 itemData = GameWorld.GetGameData().GetItemByTypeID(itemID) if not itemData: continue packType = ChConfig.GetItemPackType(itemData) needSpace = ItemControler.GetItemNeedPackCount(packType, itemData, itemCount, isAuctionItem) needPackSpaceDict[packType] = needPackSpaceDict.get(packType, 0) + needSpace #GameWorld.DebugLog("CheckPackEnough %s,needPackSpaceDict=%s" % (itemInfo, needPackSpaceDict)) for packType, needSpace in needPackSpaceDict.items(): if needSpace > GetItemPackSpace(curPlayer, packType, needSpace): if isNotify: PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_676165", [packType]) return False return True ## »ñµÃ±³°üÊ£Óà¿Õ¼ä(²ÎÊý -> µ±Ç°Íæ¼Ò,±³°üË÷Òý) # @param curPlayer µ±Ç°Íæ¼Ò # @param packindex ±³°üË÷Òý # @return itemSpace # @remarks »ñµÃ±³°üÊ£Óà¿Õ¼ä def GetItemPackSpace(curPlayer, packindex, getCount=0): #±³°üÊ£Óà¿Õ¼ä itemSpace = 0 if packindex in ShareDefine.Def_VPack_TypeList: for i in xrange(GetVPackCnt(packindex)): itemKeyData = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_VPackItem % (packindex, i)) if itemKeyData: continue itemSpace += 1 if getCount > 0 and itemSpace >= getCount: break return itemSpace curPack = curPlayer.GetItemManager().GetPack(packindex) for i in range(0, curPack.GetCount()): curItem = curPack.GetAt(i) #²»Êǿոñ¹ýÂË if not curItem.IsEmpty(): continue itemSpace += 1 if getCount > 0 and itemSpace >= getCount: break return itemSpace #--------------------------------------------------------------------- ## ¼ì²é±³°üÊÇ·ñÓпÕλ # @param curPlayer µ±Ç°Íæ¼Ò # @param packindex ±³°üË÷Òý # @return ²¼¶ûÖµ # @remarks ¼ì²é±³°üÊÇ·ñÓпÕλ def CheckPackHasSpace(curPlayer, packindex, isNotify=False): if packindex in ShareDefine.Def_VPack_TypeList: for i in xrange(GetVPackCnt(packindex)): itemKeyData = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_VPackItem % (packindex, i)) if not itemKeyData: return True return False curPack = curPlayer.GetItemManager().GetPack(packindex) for i in range(0, curPack.GetCount()): curItem = curPack.GetAt(i) #ÕÒµ½¿Õ¸ñ if curItem.IsEmpty(): return True if isNotify: PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_676165", [packindex]) return False #--------------------------------------------------------------------- ## ¼ì²é±³°üÊÇ·ñΪ¿Õ # @param curPlayer µ±Ç°Íæ¼Ò # @param packindex ±³°üË÷Òý # @return ²¼¶ûÖµ # @remarks ¼ì²é±³°üÊÇ·ñÓпÕλ def CheckPackIsEmpty(curPlayer, packindex): if packindex in ShareDefine.Def_VPack_TypeList: for i in xrange(GetVPackCnt(packindex)): itemKeyData = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_VPackItem % (packindex, i)) if itemKeyData: return False return True curPack = curPlayer.GetItemManager().GetPack(packindex) for i in range(0, curPack.GetCount()): curItem = curPack.GetAt(i) if not curItem.IsEmpty(): #ÕÒµ½ÎïÆ· return False return True ## »ñµÃ±³°üµÚÒ»¸öΪ¿ÕµÄλÖà # @param curPlayer µ±Ç°Íæ¼Ò # @param packindex ±³°üË÷Òý # @return ²¼¶ûÖµ def GetEmptyIndexInPack(curPlayer, packindex): if packindex in ShareDefine.Def_VPack_TypeList: for i in xrange(GetVPackCnt(packindex)): itemKeyData = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_VPackItem % (packindex, i)) if not itemKeyData: return i return -1 curPack = curPlayer.GetItemManager().GetPack(packindex) for i in range(0, curPack.GetCount()): curItem = curPack.GetAt(i) if curItem.IsEmpty(): #ÕÒµ½ÎïÆ· return i return -1 def GetPackInitCount(packType): ## »ñÈ¡±³°üÀàÐͶÔÓ¦³õʼ¸ñ×ÓÊý initCount = 0 if packType == IPY_GameWorld.rptItem: initCount = IpyGameDataPY.GetFuncCfg("InitBagCellCount", 1) elif packType == IPY_GameWorld.rptWarehouse: initCount = IpyGameDataPY.GetFuncCfg("InitDepotCellCount", 1) elif packType == ShareDefine.rptTreasure: initCount = IpyGameDataPY.GetFuncCfg("TreasureSet", 3) elif packType == ShareDefine.rptDogzItem: initCount = IpyGameDataPY.GetFuncCfg("DogzPack", 1) elif packType == ShareDefine.rptDogzEquip: initCount = IpyGameDataPY.GetFuncCfg("DogzPack", 2) if not initCount: bagInitCntDict = IpyGameDataPY.GetFuncEvalCfg("InitBagCellCount", 2, {}) initCount = bagInitCntDict.get(str(packType), 0) GameWorld.DebugLog("±³°üÀàÐͳõʼ¸ñ×ÓÊý: packType=%s,initCount=%s" % (packType, initCount)) return initCount def GetPackOpenItemCnt(curPlayer, packType): ## »ñÈ¡¶ÔÓ¦±³°üÒѹºÂòµÄ¸ñ×ÓÊý openCntDict = IpyGameDataPY.GetFuncEvalCfg("OpenPack", 3, {}) if str(packType) not in openCntDict: return 0 openCntList = openCntDict[str(packType)] if not openCntList: return 0 buyCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_PackBuyCnt % packType) openCnt = sum(openCntList[:buyCnt]) if buyCnt > len(openCntList): addCnt = (buyCnt - len(openCntList)) * openCntList[-1] openCnt += addCnt return openCnt def SyncPackBuyCnt(curPlayer, packType=None): ## ͬ²½ÒѹºÂò¸ñ×Ó´ÎÊýÐÅÏ¢ openCntDict = IpyGameDataPY.GetFuncEvalCfg("OpenPack", 3, {}) if not openCntDict: return syncTypeList = [str(packType)] if packType else openCntDict.keys() clientPack = ChPyNetSendPack.tagSCPackBuyInfo() clientPack.BuyInfoList = [] for packTypeStr in syncTypeList: packType = int(packTypeStr) buy = ChPyNetSendPack.tagSCPackBuy() buy.PackType = packType buy.BuyCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_PackBuyCnt % packType) clientPack.BuyInfoList.append(buy) clientPack.Count = len(clientPack.BuyInfoList) NetPackCommon.SendFakePack(curPlayer, clientPack) return ## »ñµÃÐéÄâ±³°ü¸ñ×ÓÊý # @param packindex ±³°üË÷Òý # @return ±³°ü¸ñ×ÓÊý # @remarks º¯ÊýÏêϸ˵Ã÷. def GetVPackCnt(packindex): if packindex not in ChConfig.Def_VPackCnt_Dict: return 0 keyStr = ChConfig.Def_VPackCnt_Dict[packindex] return IpyGameDataPY.GetFuncCfg(keyStr) ## ʹÓÃÎïÆ·µÄÌØÊâÌáʾ # @param curPlayer µ±Ç°Íæ¼Ò # @param useItemID ʹÓÃÎïÆ· # @return None # @remarks ʹÓÃÎïÆ·µÄÌØÊâÌáʾ def UseItemSpecialNotify(curPlayer, useItemID): #ÐèÒªÌáʾµÄÎïÆ·Áбí itemIDDict = ReadChConfig.GetEvalChConfig('need_eff_box_id') if useItemID in itemIDDict.keys(): PlayerControl.NotifyCode(curPlayer, itemIDDict.get(useItemID), [useItemID]) #ÐèҪȫ·þÌáʾµÄÎïÆ·Áбí wNotifyIDDict = ReadChConfig.GetEvalChConfig('need_wnotify_id') if useItemID in wNotifyIDDict: PlayerControl.WorldNotify(0, wNotifyIDDict[useItemID], [curPlayer.GetPlayerName(), useItemID, useItemID]) return #--------------------------------------------------------------------- #´Ëº¯ÊýÑéÖ¤µ±Ç°Ö°ÒµÏµ¿ÉÓà def CheckJob(curPlayer, curItem): '''ÅжÏÎïÆ·ÊÇ·ñְҵϵ¿ÉÓà ÎïÆ·±íÖÐÖ°ÒµÏÞÖÆ¹æÔò: 0ΪͨÓã»·Ç0°Ùλ´ú±íÖ°Òµ ''' itemJobLimit = curItem.GetJobLimit() if not itemJobLimit: return True if curPlayer.GetJob() == itemJobLimit: return True return False ## ÎïÆ·¹«ÓÃÅж¨ # @param curItem µ±Ç°ÎïÆ· # @return None or True # @remarks º¯ÊýÏêϸ˵Ã÷. def CheckItemCanUse(curItem): if not curItem or curItem.IsEmpty(): return if curItem.GetIsLocked(): return return True # ÌØÊâÅж¨¸ù¾ÝʱЧʱ¼äÅж¨ÎïÆ·ÊÇ·ñ¿ÉÒÔʹÓà # ¹ýÆÚÎïÆ·²»ÄÜʹÓûò×°±¸µ«ÊÇ¿ÉÒÔ³öÊÛÐø·Ñ def CheckItemCanUseByExpireTime(curItem): # curItemCreateTime = curItem.GetCreateTime() # curItemExpireTime = curItem.GetExpireTime() # curItemPastTime = GameWorld.GetPastSeconds(curItemCreateTime) # # reduceType = curItem.GetEndureReduceType() # if reduceType == ChConfig.Def_EquipReduceType_RTimeItem and \ # curItemPastTime >= curItemExpireTime: # # ¹ýÆÚÁË # return False # # if reduceType == ChConfig.Def_EquipReduceType_Time: # # ¿ªÊ¼×°±¸Ê±¼ä # startTime = curItem.GetUserAttr(ShareDefine.Def_IudetCreateTime) # if startTime == 0: # return True # if time.time() - startTime > curItemExpireTime: # return False isExpireItem, expireTime = GetItemRemainingTime(curItem) if isExpireItem: if expireTime <= 0: return False return True def GetItemRemainingTime(curItem): ''' »ñÈ¡ÎïÆ·Ê£Óàʱ¼ä£¬Ãë @return: ÊÇ·ñʱЧÎïÆ·, Ê£Óàʱ¼ä ''' isExpireItem = False reduceType = curItem.GetEndureReduceType() remainingTime = 0 if reduceType in [ChConfig.Def_EquipReduceType_Time, ChConfig.Def_EquipReduceType_RTimeItem]: isExpireItem = True # ×°±¸ºó¿ªÊ¼¼ÆÊ± curItemExpireTime = curItem.GetUserAttr(ShareDefine.Def_IudetExpireTime) if not curItemExpireTime: curItemExpireTime = curItem.GetExpireTime() # ¿ªÊ¼×°±¸Ê±¼ä startTime = curItem.GetUserAttr(ShareDefine.Def_IudetCreateTime) if startTime == 0: remainingTime = curItemExpireTime else: curItemPastTime = max(0, int(time.time()) - startTime) remainingTime = max(0, curItemExpireTime - curItemPastTime) return isExpireItem, remainingTime return isExpireItem, remainingTime ## ¼ì²é×°±¸ÊÇ·ñÓÐÏâǶ±¦Ê¯ # @param curItem ×°±¸¶ÔÏó # @return True-ÓÐ def CheckHasStone(curItem): # GetStoneCount ×î´ó¿É¿ª¿×Êý # GetMaxHoleCount ÎïÆ·±íÅäÖõÄ×î´ó¿É¿ª¿×Êý£¬²»¿É³¬¹ý×î´ó¿É¿ª¿×Êý # GetCanPlaceStoneCount ÒÑ¿ª¿×Êý # GetUseStoneCount ÒÑÏâǶµÄ±¦Ê¯¿×Êý #=========================================================================== # stoneCount = curItem.GetCanPlaceStoneCount() # if stoneCount <= 0: # return False # # # Ò»¼þ×°±¸²»ÄÜÓÐÏâǶÏàͬIDµÄ¸ß¼¶±¦Ê¯ # for index in range(stoneCount): # if curItem.GetStone(index) > 0: # return True #=========================================================================== return False ##¼ì²éÖ¸¶¨Î»ÖÃÊÇ·ñÓÐÎïÆ· # @param equipIndex ×°±¸Î» # @return bool def CheckHasEquip(curPlayer, packIndex, equipIndex): roleEquipPack = curPlayer.GetItemManager().GetPack(packIndex) curEquip = roleEquipPack.GetAt(equipIndex) if not curEquip or curEquip.IsEmpty(): return False #ÓÐÎïÆ·´æÔÚ return True ## ͨ¹ýÎïÆ·ID, »ñµÃÎïÆ·µÄÏêϸЧ¹ûÐÅÏ¢ # @param itemID µ±Ç°ÎïÆ· # @param effectIndex Ч¹ûË÷Òý # @return EffectID£¬EffectValue0£¬ EffectValue1 # @remarks º¯ÊýÏêϸ˵Ã÷. def GetItemEffectByEffectID(curItem, effectID): for i in range(curItem.GetEffectCount()): effect = curItem.GetEffectByIndex(i) if effect.GetEffectID() != effectID: continue return effect return ## »ñÈ¡ÎïÆ·Ê¹Óý׼¶ # @param curItem ÎïÆ·¶ÔÏó # @return -1-ÕÒ²»µ½Ð§¹ûÀàÐÍ£¬ÎïÆ·ÅäÖÿÉÄÜÓÐÎó # @remarks ¼¼ÄÜÎïÆ·Ð§¹û±ê¼ÇID, Ïàͬ±ê¼ÇµÄ¼¼ÄÜÖ»ÄÜ·ÅÈë(ÏâǶ/ʹÓÃ)Ò»¸ö£¬AÖµÌî±ê¼ÇID£¬Ä¬ÈÏ´Ó1¿ªÊ¼ def GetItemUseClassLV(curItem): effect = GetItemEffectByEffectID(curItem, ChConfig.Def_Item_Eff_UseClassLV) if not effect: return -1 return effect.GetEffectValue(0) def GetItemNoteDict(curItem, writeCount=1, beforeCount=None, afterCount=None): ''' ÎïÆ·ÐÅÏ¢¼Ç¼ @param curItem: ÎïÆ· ''' dataDict = {"ItemID":curItem.GetItemTypeID(), "ItemCount":writeCount, "IsBind":curItem.GetIsBind(), "ItemGUID":curItem.GetGUID()} if beforeCount != None: dataDict["BeforeCount"] = beforeCount if afterCount != None: dataDict["AfterCount"] = afterCount #if not CheckItemIsEquip(curItem): # return dataDict if curItem.GetUserData() and curItem.GetUserData() != "{}": dataDict.update({"UserData":curItem.GetUserData()}) return dataDict def DR_GetItem(curPlayer, packType, eventName, itemNoteDict, noteDict={}): # ¼Ç¼µÃµ½ÎïÆ· noteDict["PackType"] = packType if eventName in ChConfig.ItemGiveTypeList: operateType = eventName if operateType in ChConfig.ItemGiveTypeDict: eventName = ChConfig.ItemGiveTypeDict[operateType] else: operateType = ChConfig.ItemGive_Unknown if not eventName and operateType in ChConfig.ItemGiveTypeDict: eventName = ChConfig.ItemGiveTypeDict[operateType] if not eventName: eventName = "Unknown" # ±¾µØÁ÷ÏòÖ»¼Ç¼ÓÐʼþÃû³ÆµÄ if eventName: DataRecordPack.DR_SetPlayerItem(curPlayer, eventName, itemNoteDict, noteDict) # ¼ÇÂ¼Íæ¼Ò±³°ü»ñµÃÎïÆ· if packType in [IPY_GameWorld.rptItem, ShareDefine.rptTreasure] or packType in ShareDefine.Def_VPack_TypeList: EventReport.WriteEvent_item_record(curPlayer, 1, operateType, itemNoteDict, noteDict) return def DR_DelItem(curPlayer, packType, eventName, itemNoteDict, noteDict={}): # ¼Ç¼ɾ³ýÎïÆ· noteDict["PackType"] = packType if eventName in ChConfig.ItemDelTypeList: operateType = eventName if operateType in ChConfig.ItemDelTypeDict: eventName = ChConfig.ItemDelTypeDict[operateType] else: operateType = ChConfig.ItemDel_Unknown DataRecordPack.DR_DeleteItem(curPlayer, eventName, itemNoteDict, noteDict) # ¼ÇÂ¼Íæ¼Ò±³°üÎïÆ·É¾³ý if packType in [IPY_GameWorld.rptItem, ShareDefine.rptTreasure] or packType in ShareDefine.Def_VPack_TypeList: EventReport.WriteEvent_item_record(curPlayer, 0, operateType, itemNoteDict, noteDict) return def DR_EquipItemChange(curPlayer, curEquip, eventName, addDict={}): # ¼Ç¼װ±¸ÎïÆ·ÊôÐÔ±ä¸ü noteDict = GetItemNoteDict(curEquip, 1) noteDict.update(addDict) noteDict["packType"] = curEquip.GetItemPlaceType() DataRecordPack.DR_EquipMachining(curPlayer, eventName, noteDict) return #=============================================================================== ## ¼ì²éÊÇ·ñÊÇ×°±¸ # @param curItem # @return None or True # @remarks º¯ÊýÏêϸ˵Ã÷. def CheckItemIsEquip(curItem): if not CheckItemCanUse(curItem): return False if curItem.GetType() not in ChConfig.Def_EquipItemType: return False # #²»¿ÉÐÞÀí # if not curItem.GetCanRepair(): # return #Ä;Ã×ֶβ»Âú×ã # if not curItem.GetEndureReduceType() or not curItem.GetMaxEndure(): # return return True def CheckNoteEquipGS(curItem): return False #--------------------------------------------------------------------- ## ͨ¹ý±³°ü²éÕÒÖ¸¶¨Ð§¹ûIDµÄÖ¸¶¨ÊýÁ¿ÎïÆ· # @param findEffectID Ч¹ûID # @param curItemPack ±³°ü # @param needCount Ö¸¶¨µÄÊýÁ¿ # @param isBind ÊÇ·ñʹÓÃ°ó¶¨µÄ # @return hasEnough, itemIndexList [ÊÇ·ñÓµÓÐ×ã¹»²ÄÁÏ, ²ÄÁÏÁÐ±í±³°üË÷Òý, ËùÓвÄÁÏÊÇ·ñ°ó¶¨, ²»×ãÊýÁ¿] # @remarks º¯ÊýÏêϸ˵Ã÷. def GetItem_FromPack_ByEff_Ex(findEffectID, curItemPack, needCount, isBind): hasEnough = False itemIndexList = [] findItemIsBind = False for i in range(curItemPack.GetCount()): findItem = curItemPack.GetAt(i) if not CheckItemCanUse(findItem): continue #²»Ê¹Óð󶨵IJÄÁÏ if not isBind and findItem.GetIsBind(): continue #²»ÊÇÕâ¸öЧ¹ûµÄ if findItem.GetEffectByIndex(0).GetEffectID() != findEffectID: continue #²éÕÒµ½µÄÎïÆ·Îª°ó¶¨ÎïÆ· if not findItemIsBind and findItem.GetIsBind(): findItemIsBind = True itemCount = findItem.GetCount() #²»¹» if needCount > itemCount: needCount -= itemCount itemIndexList.append(i) else: needCount = 0 hasEnough = True itemIndexList.append(i) break #·µ»ØÁбí[ÊÇ·ñÓµÓÐ×ã¹»²ÄÁÏ, ²ÄÁÏÁÐ±í±³°üË÷Òý, ËùÓвÄÁÏÊÇ·ñ°ó¶¨, ²»×ãÊýÁ¿] return hasEnough, itemIndexList, findItemIsBind, needCount #--------------------------------------------------------------------- ## ͨ¹ý±³°ü²éÕÒÖ¸¶¨Ð§¹ûIDµÄÖ¸¶¨ÊýÁ¿ÎïÆ· # @param findEffectID Ч¹ûID # @param curItemPack ±³°ü # @param needCount Ö¸¶¨µÄÊýÁ¿ # @param isBind ÊÇ·ñʹÓÃ°ó¶¨µÄ # @return hasEnough, itemIndexList [ ÊÇ·ñÓµÓÐ×ã¹»²ÄÁÏ, ²ÄÁÏÁÐ±í±³°üË÷Òý ] # @remarks º¯ÊýÏêϸ˵Ã÷. def GetItem_FromPack_ByEff(findEffectID, curItemPack, needCount, isBind): hasEnough = False itemIndexList = [] for i in range(curItemPack.GetCount()): curItem = curItemPack.GetAt(i) if not CheckItemCanUse(curItem): continue #²»Ê¹Óð󶨵IJÄÁÏ if not isBind and curItem.GetIsBind(): continue #²»ÊÇÕâ¸öЧ¹ûµÄ if curItem.GetEffectByIndex(0).GetEffectID() != findEffectID: continue itemCount = curItem.GetCount() #²»¹» if needCount > itemCount: needCount -= itemCount itemIndexList.append(i) else: hasEnough = True itemIndexList.append(i) break #·µ»ØÁбí[ ÊÇ·ñÓµÓÐ×ã¹»²ÄÁÏ, ²ÄÁÏÁÐ±í±³°üË÷Òý ] return hasEnough, itemIndexList ## ͨ¹ý±³°ü²éÕÒÖ¸¶¨ÎïÆ·IDµÄÖ¸¶¨Ð§¹ûIDµÄÖ¸¶¨ÊýÁ¿ÎïÆ· # @param findItemID ÎïÆ·ID # @param findEffectID Ч¹ûID # @param curItemPack ±³°ü # @param needCount Ö¸¶¨µÄÊýÁ¿ # @param isBind ÊÇ·ñʹÓÃ°ó¶¨µÄ # @return hasEnough, itemIndexList [ ÊÇ·ñÓµÓÐ×ã¹»²ÄÁÏ, ²ÄÁÏÁÐ±í±³°üË÷Òý ] # @remarks º¯ÊýÏêϸ˵Ã÷. def GetItemFromPack_ByIDAndEff(findItemID, findEffectID, curItemPack, needCount, isBind): hasEnough = False itemIndexList = [] for i in range(curItemPack.GetCount()): curItem = curItemPack.GetAt(i) if not CheckItemCanUse(curItem): continue if curItem.GetItemTypeID() != findItemID: continue #²»Ê¹Óð󶨵IJÄÁÏ if not isBind and curItem.GetIsBind(): continue #²»ÊÇÕâ¸öЧ¹ûµÄ if curItem.GetEffectByIndex(0).GetEffectID() != findEffectID: continue itemCount = curItem.GetCount() #²»¹» if needCount > itemCount: needCount -= itemCount itemIndexList.append(i) else: hasEnough = True itemIndexList.append(i) break #·µ»ØÁбí[ ÊÇ·ñÓµÓÐ×ã¹»²ÄÁÏ, ²ÄÁÏÁÐ±í±³°üË÷Òý ] return hasEnough, itemIndexList #--------------------------------------------------------------------- ##´ÓÖ¸¶¨±³°üÖлñÈ¡ÎïÆ·Çåµ¥ # @param findItemID ²éÕÒµÄÎïÆ·ID # @param itemPack ÎïÆ·±³°ü # @param needCnt ÐèÒªÊýÁ¿ # @param useItemMode °ó¶¨Ä£Ê½ # @return ÎïÆ·Çåµ¥ [ÊÇ·ñÓµÓÐ×ã¹»²ÄÁÏ, ²ÄÁÏÁÐ±í±³°üË÷Òý] # @remarks ´ÓÖ¸¶¨±³°üÖлñÈ¡ÎïÆ·Çåµ¥ def GetItem_FromPack_ByID(findItemID, itemPack, needCnt, useItemMode=UseStuffMode_All): hasEnough = False itemIndexList = [] for i in range(itemPack.GetCount()): curItem = itemPack.GetAt(i) #¹ýÂ˲»·ûºÏÆäËûÌõ¼þµÄÎïÆ· if not CheckItemCanUse(curItem): continue if curItem.GetItemTypeID() != findItemID: continue #ÑéÖ¤ÎïÆ·ÊôÐÔ if curItem.GetIsBind(): if useItemMode == UseStuffMode_NoBind: continue else: if useItemMode == UseStuffMode_Bind: continue itemCount = curItem.GetCount() #²»¹» if needCnt > itemCount: needCnt -= itemCount itemIndexList.append(i) else: hasEnough = True itemIndexList.append(i) break #·µ»ØÁбí[ÊÇ·ñÓµÓÐ×ã¹»²ÄÁÏ, ²ÄÁÏÁÐ±í±³°üË÷Òý] return hasEnough, itemIndexList ##´ÓÖ¸¶¨±³°üÖлñÈ¡ÎïÆ·Çåµ¥ # @param findItemID ²éÕÒµÄÎïÆ·ID # @param itemPack ÎïÆ·±³°ü # @param needCnt ÐèÒªÊýÁ¿ # @param useItemMode °ó¶¨Ä£Ê½ # @return ÎïÆ·Çåµ¥ [ÊÇ·ñÓµÓÐ×ã¹»²ÄÁÏ, ²ÄÁÏÁÐ±í±³°üË÷Òý, ËùÕҵIJÄÁÏÊÇ·ñÓа󶨵Ä] def GetItem_FromPack_ByID_Ex(findItemID, itemPack, needCnt, useItemMode=UseStuffMode_All): hasEnough = False itemIndexList = [] findItemIsBind = False for i in range(itemPack.GetCount()): curItem = itemPack.GetAt(i) #¹ýÂ˲»·ûºÏÆäËûÌõ¼þµÄÎïÆ· if not CheckItemCanUse(curItem): continue if curItem.GetItemTypeID() != findItemID: continue #ÑéÖ¤ÎïÆ·ÊôÐÔ if curItem.GetIsBind(): if useItemMode == UseStuffMode_NoBind: continue else: if useItemMode == UseStuffMode_Bind: continue #²éÕÒµ½µÄÎïÆ·Îª°ó¶¨ÎïÆ· if not findItemIsBind and curItem.GetIsBind(): findItemIsBind = True itemCount = curItem.GetCount() #²»¹» if needCnt > itemCount: needCnt -= itemCount itemIndexList.append(i) else: hasEnough = True itemIndexList.append(i) break #·µ»ØÁбí[ÊÇ·ñÓµÓÐ×ã¹»²ÄÁÏ, ²ÄÁÏÁÐ±í±³°üË÷Òý, ËùÕҵIJÄÁÏÊÇ·ñÓа󶨵Ä] return hasEnough, itemIndexList, findItemIsBind ##´ÓÖ¸¶¨±³°üÖлñÈ¡ÎïÆ·Çåµ¥ # @param findItemID ²éÕÒµÄÎïÆ·ID # @param itemPack ÎïÆ·±³°ü # @param needCnt ÐèÒªÊýÁ¿ # @param useItemMode °ó¶¨Ä£Ê½ # @return ÎïÆ·Çåµ¥ [ÊÇ·ñÓµÓÐ×ã¹»²ÄÁÏ, ²ÄÁÏÁÐ±í±³°üË÷Òý, ËùÕҵIJÄÁÏÊÇ·ñÓа󶨵Ä, ²»×ãµÄ¸öÊý] def GetItem_FromPack_ByID_ExEx(findItemID, itemPack, needCnt, useItemMode=UseStuffMode_All): hasEnough = False itemIndexList = [] findItemIsBind = False for i in range(itemPack.GetCount()): curItem = itemPack.GetAt(i) #¹ýÂ˲»·ûºÏÆäËûÌõ¼þµÄÎïÆ· if not CheckItemCanUse(curItem): continue if curItem.GetItemTypeID() != findItemID: continue #ÑéÖ¤ÎïÆ·ÊôÐÔ if curItem.GetIsBind(): if useItemMode == UseStuffMode_NoBind: continue else: if useItemMode == UseStuffMode_Bind: continue #²éÕÒµ½µÄÎïÆ·Îª°ó¶¨ÎïÆ· if not findItemIsBind and curItem.GetIsBind(): findItemIsBind = True itemCount = curItem.GetCount() #²»¹» if needCnt > itemCount: needCnt -= itemCount itemIndexList.append(i) else: needCnt = 0 # Èç¹û×ã¹»£¬ÔòÉèÖÃȱÉٵĸöÊýΪ0 hasEnough = True itemIndexList.append(i) break #·µ»ØÁбí[ÊÇ·ñÓµÓÐ×ã¹»²ÄÁÏ, ²ÄÁÏÁÐ±í±³°üË÷Òý, ËùÕҵIJÄÁÏÊÇ·ñÓа󶨵Ä, ²»×ãµÄ¸öÊý] return hasEnough, itemIndexList, findItemIsBind, needCnt def GetPackItemBindStateIndexInfo(curPlayer, itemID, needCount=0, packType=IPY_GameWorld.rptItem): ''' »ñÈ¡±³°üÏûºÄµÀ¾ß°ó¶¨¼°Î´°ó¶¨Ë÷ÒýÇé¿ö @param needCount: ËùÐè¸öÊý, ĬÈϰó¶¨ÓÅÏÈ£¬µ±ÕÒµ½ÒѾ­×ã¹»µÄ¸öÊýºó²»ÔÙ±éÀú£¬¼õÉÙÎÞÓñéÀú @return: ¿ÉÏûºÄÎïÆ·Áбí[[°ó¶¨ÎïÆ·Ë÷Òý], [²»°ó¶¨ÎïÆ·Ë÷Òý]], °ó¶¨¸öÊý, δ°ó¶¨¸öÊý ''' consumeItemIndexList = [[], []] # ¿ÉÏûºÄÎïÆ·Áбí[[°ó¶¨ÎïÆ·Ë÷Òý], [²»°ó¶¨ÎïÆ·Ë÷Òý]] bindCnt, unBindCnt = 0, 0 curPack = curPlayer.GetItemManager().GetPack(packType) for i in range(0, curPack.GetCount()): curItem = curPack.GetAt(i) if not CheckItemCanUse(curItem): continue if curItem.GetItemTypeID() != itemID: continue itemCount = curItem.GetCount() #²éÕÒµ½µÄÎïÆ·Îª°ó¶¨ÎïÆ· if curItem.GetIsBind(): consumeItemIndexList[0].append(i) bindCnt += itemCount if needCount > 0 and bindCnt >= needCount: break else: consumeItemIndexList[1].append(i) unBindCnt += itemCount return consumeItemIndexList, bindCnt, unBindCnt ## ¿Û³ýÏûºÄ²ÄÁÏ, ÓÅÏȿ۳ý°ó¶¨µÄÎïÆ·, ÅäÖú¯ÊýʹÓà GetPackItemBindStateIndexInfo, DelCostItemByBind def DelCostItemByBind(curPlayer, costItemIndexList, bindCnt, unBindCnt, delCnt, delEvent, saveDataDict={}, packType=IPY_GameWorld.rptItem): curPack = curPlayer.GetItemManager().GetPack(packType) bindIndexList, unBindIndexList = costItemIndexList if bindCnt >= delCnt: ReduceItem(curPlayer, curPack, bindIndexList, delCnt, True, delEvent, saveDataDict) else: ReduceItem(curPlayer, curPack, bindIndexList, bindCnt, True, delEvent, saveDataDict) ReduceItem(curPlayer, curPack, unBindIndexList, delCnt - bindCnt, False, delEvent, saveDataDict) return ## ÅäºÏ GetItem_FromPack_ByEff, ʹÓÃ, ɾ³ýÎïÆ· # @param curPlayer µ±Ç°Íæ¼Ò # @param curItemPack ÎïÆ·±³°ü # @param itemIndexList ÎïÆ·Ë÷ÒýÁбí # @param reduceCount ɾ³ýÊýÁ¿ # @param makeItemBind ÎïÆ·°ó¶¨ # @return True # @remarks º¯ÊýÏêϸ˵Ã÷. def ReduceItem(curPlayer, curItemPack, itemIndexList, reduceCount, makeItemBind, eventName="", saveDataDict={}, needSysmsg=True): itemTypeID = 0 totalUseCnt = reduceCount if not eventName: eventName = "ReduceItem" for itemIndex in itemIndexList: curItem = curItemPack.GetAt(itemIndex) if not makeItemBind and curItem.GetIsBind(): makeItemBind = True itemCount = curItem.GetCount() itemTypeID = curItem.GetItemTypeID() if reduceCount > itemCount: if ItemControler.ItemNeedRecord(curItem): itemNoteDict = GetItemNoteDict(curItem, itemCount, itemCount, 0) DR_DelItem(curPlayer, IPY_GameWorld.rptItem, eventName, itemNoteDict, saveDataDict) ItemControler.SetItemCount(curItem, 0, curPlayer.GetPlayerID(), curPlayer.GetAccID(), curPlayer.GetPlayerName()) reduceCount -= itemCount else: if ItemControler.ItemNeedRecord(curItem): itemNoteDict = GetItemNoteDict(curItem, reduceCount, itemCount, itemCount - reduceCount) DR_DelItem(curPlayer, IPY_GameWorld.rptItem, eventName, itemNoteDict, saveDataDict) ItemControler.SetItemCount(curItem, itemCount - reduceCount, curPlayer.GetPlayerID(), curPlayer.GetAccID(), curPlayer.GetPlayerName()) break #ϵͳÌáʾ LostRes ʧȥÎïÆ· #if needSysmsg: # PlayerControl.NotifyCode(curPlayer, 'LostRes', [itemTypeID, totalUseCnt]) return makeItemBind def GetCostItemIndexList(costItemInfo, itemPack, bindFirst=True): '''»ñµÃÐèÒªÏûºÄµÄ²ÄÁÏÎïÆ·ÐÅÏ¢, ÓÅÏȿ۳ý°ó¶¨ÎïÆ· @param costItemInfo: ÐèÒªÎïÆ·ÊýÁ¿[(itemID,itemCnt), ...] »ò {itemID:itemCnt, ...} @param itemPack: ±³°ü @param bindFirst: ÊÇ·ñ°ó¶¨ÓÅÏÈ, True-°ó¶¨ÓÅÏÈ£¬ False-·Ç°ó¶¨ÓÅÏÈ @return: ȱÉÙµÄÎïÆ·¸öÊýÐÅÏ¢×Öµä{itemID:ȱÉÙ¸öÊý}, ¿Û³ýÎïÆ·ÐÅÏ¢×Öµä{itemID:[ɾ³ýË÷ÒýÁбí, ɾ³ý¸öÊý], ...} ''' lackItemDict = {} delInfoDict = {} costItemDict = {} if not isinstance(costItemInfo, dict): for needItemID, needItemCnt in costItemInfo: costItemDict[needItemID] = needItemCnt else: costItemDict = costItemInfo bindItemCntDict = {} noBindItemCntDict = {} bindItemIndexDict = {} noBindItemIndexDict = {} # ÕâÁ½ÖÖģʽ±ØÐë±éÀú±³°üÒ»±é for i in xrange(itemPack.GetCount()): curItem = itemPack.GetAt(i) #¹ýÂ˲»·ûºÏÆäËûÌõ¼þµÄÎïÆ· if not CheckItemCanUse(curItem): continue curItemID = curItem.GetItemTypeID() if curItemID not in costItemDict: continue curItemCount = curItem.GetCount() if curItem.GetIsBind(): indexDict = bindItemIndexDict bindItemCntDict[curItemID] = bindItemCntDict.get(curItemID, 0) + curItemCount else: indexDict = noBindItemIndexDict noBindItemCntDict[curItemID] = noBindItemCntDict.get(curItemID, 0) + curItemCount if curItemID not in indexDict: indexDict[curItemID] = [] indexList = indexDict[curItemID] indexList.append(i) # ±éÀúÍêºóÅжÏÊÇ·ñ×ã¹» for needItemID, needItemCnt in costItemDict.items(): itemCntTotal = bindItemCntDict.get(needItemID, 0) + noBindItemCntDict.get(needItemID, 0) lackCnt = max(0, needItemCnt - itemCntTotal) # ²»¹» if lackCnt: lackItemDict[needItemID] = lackCnt if itemCntTotal: delCnt = needItemCnt - lackCnt if bindFirst: indexList = bindItemIndexDict.get(needItemID, []) + noBindItemIndexDict.get(needItemID, []) else: indexList = noBindItemIndexDict.get(needItemID, []) + bindItemIndexDict.get(needItemID, []) delInfoDict[needItemID] = [indexList, delCnt] return lackItemDict, delInfoDict ## »ñÈ¡×Ô¶¯¹ºÂò²ÄÁÏÐèÒªÏûºÄµÄ×êʯÊý def GetAutoBuyItemNeedGold(lackItemDict): totalGold = 0 # ¼ÆËã×Ô¶¯¹ºÂòÏûºÄ for itemID, lackCnt in lackItemDict.items(): if lackCnt <= 0: continue curItem = GameWorld.GetGameData().GetItemByTypeID(itemID) if not curItem: return 0 itemGold = GetShopItemPrice(curItem.GetItemTypeID(), IPY_GameWorld.TYPE_Price_Gold_Money) if itemGold <= 0: GameWorld.ErrLog("É̳DZíδÅäÖÃÎïÆ·×êʯÏûºÄ!itemID=%s" % itemID) return 0 totalGold += (lackCnt * itemGold) return totalGold def GetShopItemPrice(itemID, priceType): ''' »ñÈ¡É̳ÇÎïÆ·¶ÔÓ¦¼Û¸ñ ''' # ϵͳ¹Ì¶¨É̵êÀàÐÍ£º ÏÉÓñ£¨2-³£ÓõÀ¾ß£¬3-³É³¤±äÇ¿£©£¬°óÓñ£¨4-°óÓñÉ̳ǣ© ipyData = GetShopItemPriceIpyData(itemID, priceType) if not ipyData: return 0 return ipyData.GetMoneyNum() def GetShopItemPriceIpyData(itemID, priceType): ''' »ñÈ¡É̳ÇÎïÆ·¶ÔÓ¦¼Û¸ñ ''' # ϵͳ¹Ì¶¨É̵êÀàÐÍ£º ÏÉÓñ£¨2-³£ÓõÀ¾ß£¬3-³É³¤±äÇ¿£©£¬°óÓñ£¨4-°óÓñÉ̳ǣ© priceTypeShopTypeDict = {IPY_GameWorld.TYPE_Price_Gold_Money:[1, 2, 3], IPY_GameWorld.TYPE_Price_Gold_Paper:[5, 4], } ipyData = None if priceType in priceTypeShopTypeDict: for shopType in priceTypeShopTypeDict[priceType]: ipyData = IpyGameDataPY.GetIpyGameDataByCondition("Store", {"ShopType":shopType, "ItemID":itemID, "MoneyType":priceType}, isLogNone=False) if ipyData: break else: ipyData = IpyGameDataPY.GetIpyGameDataByCondition("Store", {"ItemID":itemID, "MoneyType":priceType}, isLogNone=False) if not ipyData: GameWorld.ErrLog("ÕÒ²»µ½¶ÔÓ¦»õ±ÒÀàÐÍÉ̵ê³öÊÛ¸ÃÎïÆ·! itemID=%s,priceType=%s" % (itemID, priceType)) return ipyData def DelCostItem(curPlayer, itemPack, delInfoDict, delEvent="ReduceItem", saveDataDict={}): ## ¿Û³ýÏûºÄ²ÄÁÏ, ÅäÖú¯ÊýʹÓà GetCostItemIndexList, GetAutoBuyItemNeedGold, DelCostItem delItemHasBind = False for indexList, delCnt in delInfoDict.values(): if not indexList: continue hasBindItem = ReduceItem(curPlayer, itemPack, indexList, delCnt, False, delEvent, saveDataDict) delItemHasBind = True if hasBindItem else delItemHasBind return delItemHasBind #--------------------------------------------------------------------- ##ÈÎÎñϵͳµ÷ÓÃ, ɾ³ýÖ¸¶¨±³°üÖеÄÎïÆ· # @param curPlayer Íæ¼ÒʵÀý # @param delItemID ɾ³ýÎïÆ·ID # @param delItemCount ɾ³ýÎïÆ·ÊýÁ¿( Ϊ0È«²¿É¾³ý ) # @param missionID ÈÎÎñID # @return ·µ»ØÖµÎÞÒâÒå # @remarks ÈÎÎñϵͳµ÷ÓÃ, ɾ³ýÖ¸¶¨±³°üÖеÄÎïÆ· def DelMissionItem(curPlayer, packIndex, delItemID, delItemCount, missionID): itemPack = curPlayer.GetItemManager().GetPack(packIndex) #ÊÇ·ñÈ«²¿É¾³ý delAllItem = False if delItemCount <= 0: delAllItem = True for index in range(0, itemPack.GetCount()): item = itemPack.GetAt(index) if not CheckItemCanUse(item): continue itemTypeID = item.GetItemTypeID() itemCount = item.GetCount() if itemTypeID != delItemID: continue curBind = item.GetIsBind() #È«²¿É¾³ý,»òɾ³ýµÄÊýÁ¿´óÓÚÎïÆ·µÄÊýÁ¿, Çå³ýÕâ¸öÎïÆ· if delAllItem or delItemCount > itemCount: item.Clear() continue #ÎïÆ·ÊýÁ¿´óÓÚɾ³ýµÄÊýÁ¿, º¯Êý·µ»Ø ItemControler.SetItemCount(item, itemCount - delItemCount, curPlayer.GetPlayerID(), curPlayer.GetAccID(), curPlayer.GetPlayerName()) return return #--------------------------------------------------------------------- ## ÉèÖÃÎïÆ·°ó¶¨ÊôÐÔ// ChConfig.Def_BindType # @param curPlayer µ±Ç°Íæ¼Ò # @param curItem µ±Ç°ÎïÆ· # @param bindType °ó¶¨ÀàÐÍ # @return None or True # @remarks º¯ÊýÏêϸ˵Ã÷. def DoLogic_ItemBindType(curPlayer, curItem, bindType): #¹Ì¶¨²»°ó¶¨ #ÅÄÆ·È¥³ý°ó¶¨Âß¼­£¬ÔÝÆÁ±Î # if bindType == ChConfig.Def_BindType_NoBind: # return # # #²»´¦ÀíÒѾ­°ó¶¨µÄÎïÆ· # if curItem.GetIsBind(): # return # #²»ÊÇÕâ¸ö¹¦Äܵİó¶¨ÀàÐÍ # if curItem.GetBindType() != bindType: # return # if curItem.GetBindType() == ChConfig.Def_BindType_DoEquipBind: # pass # # ItemControler.SetItemIsBind(curItem, True) return True #--------------------------------------------------------------------- ## ¸ø½±ÀøÎïÆ· # @param awardItemInfo ½±ÀøÎïÆ·ÐÅÏ¢£¬Ö§³Ö×ֵ䰴ְҵ¸ø£¬»òÕßÖ±½Ólist # @return ²¼¶ûÖµ def GiveAwardItem(curPlayer, awardItemInfo, eventName=""): job = curPlayer.GetJob() if isinstance(awardItemInfo, dict): if str(job) not in awardItemInfo: return itemList = awardItemInfo[str(job)] else: itemList = awardItemInfo if not itemList: return # ¼ì²é±³°ü needSpace = len(itemList) packSpace = GetItemPackSpace(curPlayer, IPY_GameWorld.rptItem, needSpace) if needSpace > packSpace: PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_998371") return # ¸øÎïÆ· for itemInfo in itemList: itemID, itemCount = itemInfo[:2] ItemControler.GivePlayerItem(curPlayer, itemID, itemCount, 0, [IPY_GameWorld.rptItem]) if eventName: ItemControler.NotifyGiveAwardInfo(curPlayer, itemList, eventName) return True ##¶ÔÍâ½Ó¿Ú, ½»»»ÎïÆ· # @param curPlayer Íæ¼ÒʵÀý # @param curItem µ±Ç°ÎïÆ· # @param switchItem ½»»»µÄÎïÆ· # @param putInPackIndex ·ÅÈëµÄ±³°ü # @return ²¼¶ûÖµ # @remarks ¶ÔÍâ½Ó¿Ú, ½»»»ÎïÆ· def DoLogicSwitchItemEx(curPlayer, srcBackpack, desBackPack, srcIndex, destIndex): #---ÎïÆ·¼ì²é--- srcPack = curPlayer.GetItemManager().GetPack(srcBackpack) if srcIndex < 0 or srcIndex >= srcPack.GetCount(): return srcItem = srcPack.GetAt(srcIndex) if not CheckItemCanUse(srcItem): return destPack = curPlayer.GetItemManager().GetPack(desBackPack) if destIndex < 0 or destIndex >= destPack.GetCount(): return destItem = destPack.GetAt(destIndex) #Ä¿±ê¸ñ×ÓÖ»ÑéÖ¤Ëø¶¨, ¿ÉÒÔÔÊÐí¿Õλ if destItem == None or destItem.GetIsLocked(): return return DoLogicSwitchItem(curPlayer, srcItem, destItem, desBackPack) ##¶ÔÍâ½Ó¿Ú, ½»»»ÎïÆ· # @param curPlayer Íæ¼ÒʵÀý # @param curItem µ±Ç°ÎïÆ· # @param switchItem ½»»»µÄÎïÆ· # @param putInPackIndex ·ÅÈëµÄ±³°ü # @return ²¼¶ûÖµ # @remarks ¶ÔÍâ½Ó¿Ú, ½»»»ÎïÆ· def DoLogicSwitchItem(curPlayer, curItem, switchItem, packIndex): #¿ÕÎïÆ·, ·ÅÈë if curItem.IsEmpty(): return PutIn(curPlayer, curItem, switchItem, packIndex) #·Ç¿ÕÎïÆ·½»»» return SwitchItem(curPlayer, curItem, switchItem, packIndex) ## ½»»»ÎïÆ· # @param curPlayer µ±Ç°Íæ¼Ò # @param curItem µ±Ç°ÎïÆ· # @param switchItem ½»»»µÄÎïÆ· # @param putInPackIndex ·ÅÈëµÄ±³°ü # @return True # @remarks º¯ÊýÏêϸ˵Ã÷. def SwitchItem(curPlayer, curItem, switchItem, putInPackIndex): ##ÎïÆ·°ó¶¨×Ö¶ÎÅж¨ -> ×°±¸°ó¶¨ if putInPackIndex in [IPY_GameWorld.rptEquip]: DoLogic_ItemBindType(curPlayer, switchItem, ChConfig.Def_BindType_DoEquipBind) # ×°±¸¼¼ÄÜÊé¡¢×øÆï×°±¸°ó¶¨ if putInPackIndex in [IPY_GameWorld.rptHorseEquip]: DoLogic_ItemBindType(curPlayer, curItem, ChConfig.Def_BindType_DoEquipBind) if putInPackIndex not in [IPY_GameWorld.rptItem, IPY_GameWorld.rptWarehouse]: if ItemControler.GetIsAuctionItem(curItem): ItemControler.SetIsAuctionItem(curItem, False, curPlayer) GameWorld.DebugLog("SwitchItem ÅÄÆ·ÉèÖÃΪ·ÇÅÄÆ·!curItemID=%s" % curItem.GetItemTypeID()) if ItemControler.GetIsAuctionItem(switchItem): ItemControler.SetIsAuctionItem(switchItem, False, curPlayer) GameWorld.DebugLog("SwitchItem ÅÄÆ·ÉèÖÃΪ·ÇÅÄÆ·!switchItemID=%s" % switchItem.GetItemTypeID()) #½»»»×°±¸ curItem.Switch(switchItem) return True ## ·ÅÈëÎïÆ· # @param curPlayer µ±Ç°Íæ¼Ò # @param emptyItem ¿ÕÎïÆ· # @param switchItem ½»»»µÄÎïÆ· # @param putInPackIndex ·ÅÈëµÄ±³°ü # @return None or True # @remarks º¯ÊýÏêϸ˵Ã÷. def PutIn(curPlayer, emptyItem, switchItem, putInPackIndex): #Òì³£Ò»¶¨Òª¿ÕÎïÆ· if not emptyItem.IsEmpty(): GameWorld.ErrLog('putInErr' , curPlayer.GetID()) return ##ÎïÆ·°ó¶¨×Ö¶ÎÅж¨ -> ×°±¸°ó¶¨ if putInPackIndex in [IPY_GameWorld.rptEquip]: DoLogic_ItemBindType(curPlayer, switchItem, ChConfig.Def_BindType_DoEquipBind) # ×°±¸¼¼ÄÜÊé¡¢×øÆï×°±¸°ó¶¨ if putInPackIndex in [IPY_GameWorld.rptHorseEquip]: DoLogic_ItemBindType(curPlayer, emptyItem, ChConfig.Def_BindType_DoEquipBind) if putInPackIndex not in [IPY_GameWorld.rptItem, IPY_GameWorld.rptWarehouse]: if ItemControler.GetIsAuctionItem(switchItem): ItemControler.SetIsAuctionItem(switchItem, False, curPlayer) GameWorld.DebugLog("PutIn ÅÄÆ·ÉèÖÃΪ·ÇÅÄÆ·!switchItemID=%s" % switchItem.GetItemTypeID()) if switchItem.GetGameWorldItemType() == IPY_GameWorld.gwitRoleItem: emptyItem.PutIn(switchItem) elif switchItem.GetGameWorldItemType() == IPY_GameWorld.gwitSingleItem: emptyItem.AssignItem(switchItem) #½»»»×°±¸ #emptyItem.PutIn( switchItem ) return True ## ·µ»ØÊÇ·ñÊÇ×°±¸ # @param curItem µ±Ç°ÎïÆ· # @return None # @remarks º¯ÊýÏêϸ˵Ã÷. def GetIsEquip(curItem): return curItem.GetType() in ChConfig.Def_EquipItemType def GetIsMainEquip(curItem): ## ÊÇ·ñÖ÷Ïß×°±¸ return curItem.GetType() in ChConfig.Def_MainEquipType def GetIsDogzEquip(curItem): ## ·µ»ØÊÇ·ñÉñÊÞ×°±¸ return curItem.GetType() in ChConfig.Def_DogzEquiipType #--------------------------------------------------------------------- ##±éÀúÊý¾Ý¿â²éÕÒºÏÊʵÄÎïÆ·, ͨ¹ý Ч¹ûID + Ч¹ûAֵȷ¶¨ÎïÆ· # @param itemType ÎïÆ·ÀàÐÍ # @param itemEffectID ÎïÆ·Ð§¹ûID # @param itemEffectValue ÎïÆ·Ð§¹ûÖµ # @return ÎïÆ·Êý¾Ý # @remarks ¿Í»§¶Ë·â°üÏìÓ¦ # ±éÀúÊý¾Ý¿â²éÕÒºÏÊʵÄÎïÆ·, ͨ¹ý Ч¹ûID + Ч¹ûAֵȷ¶¨ÎïÆ· def FindItemFromDataByEffValue(itemType, itemEffectID, findEffectValue): gameData = GameWorld.GetGameData() #¹ýÂËÎïÆ·ÀàÐÍ gameData.FilterItemByType(itemType) #²éÕÒÊý¾Ý¿â for i in range(0, gameData.GetFilterItemCount()): curFindItem = gameData.GetFilterItem(i) #================================================== # #¹Ì¶¨²»³öÏÖµÄÎïÆ· # if not curFindItem.GetCanIdentifyAppear(): # continue #================================================== curFindItemEffect = curFindItem.GetEffectByIndex(0) curFindItemEffectID = curFindItemEffect.GetEffectID() curFindItemEffectValue = curFindItemEffect.GetEffectValue(0) #¶Ô±ÈЧ¹ûÖµ if itemEffectID == curFindItemEffectID and curFindItemEffectValue == findEffectValue: return curFindItem return None #--------------------------------------------------------------------- ## ͨ¹ý±³°ü²éÕÒÖ¸¶¨Ð§¹ûIDºÍAÖµµÄÖ¸¶¨ÊýÁ¿ÎïÆ· # @param effectID Ч¹ûID # @param effectA Ч¹ûA # @param curItemPack ±³°ü # @param needCount Ö¸¶¨µÄÊýÁ¿ # @return hasEnough, itemIndexList [ ÊÇ·ñÓµÓÐ×ã¹»²ÄÁÏ, ²ÄÁÏÁÐ±í±³°üË÷Òý,»¹Ðè¶àÉÙÊýÁ¿ ] # @remarks º¯ÊýÏêϸ˵Ã÷. def GetItemIndexListFromPackByEffA(effectID, effectA, curItemPack, needCount): hasEnough = False itemIndexList = [] for i in range(curItemPack.GetCount()): curItem = curItemPack.GetAt(i) #¼ì²éÎïÆ· if not CheckItemCanUse(curItem): continue effect = curItem.GetEffectByIndex(0) #²»ÊÇÕâ¸öЧ¹ûIDµÄ if effect.GetEffectID() != effectID: continue #²»ÊÇÕâ¸öЧ¹ûAÖµµÄ if effect.GetEffectValue(0) != effectA: continue itemCount = curItem.GetCount() #²»¹» if needCount > itemCount: needCount -= itemCount itemIndexList.append(i) else: needCount = 0 # Èç¹û×ã¹»£¬ÔòÉèÖÃȱÉٵĸöÊýΪ0 hasEnough = True itemIndexList.append(i) break #·µ»ØÁбí[ ÊÇ·ñÓµÓÐ×ã¹»²ÄÁÏ, ²ÄÁÏÁÐ±í±³°üË÷Òý ] return hasEnough, itemIndexList, needCount #--------------------------------------------------------------------- ##¿Û³ýÎïÆ· # @param curPlayer Íæ¼ÒʵÀý # @param curItem ÎïÆ·ÊµÀý # @param delCnt ɾ³ýÊýÁ¿ # @param needSysmsg ÊÇ·ñÐèҪϵͳÌáʾ # @param recordName ossÁ÷ÏòÃû # @param saveDataDict ¸½¼Ó´æ´¢ÐÅÏ¢ # @param isForceDR ÊÇ·ñÇ¿ÖÆ¼Ç¼Á÷Ïò # @return ·µ»ØÖµÎÞÒâÒå # @remarks ¿Û³ýÎïÆ· def DelItem(curPlayer, curItem, delCnt, needSysmsg=True, recordName="", saveDataDict={}, isForceDR=False): curItemTypeID = curItem.GetItemTypeID() curItemCnt = curItem.GetCount() curItemBind = curItem.GetIsBind() if curItemCnt < delCnt: GameWorld.ErrLog("DelItem, delCnt = %s < itemCnt = %s, itemTypeID = %s" % (delCnt, curItemCnt, curItemTypeID), curPlayer.GetID()) #raise Exception("DelItem, delCnt = %s, itemCnt = %s, itemTypeID = %s" % (delCnt, curItemCnt, curItemTypeID), curPlayer.GetID()) #return delCnt = curItemCnt # ÕâÀïÇ¿ÖÆ¿Û³ýÊ£ÓàÎïÆ·£¬·ÀÖ¹¹¦ÄÜÂß¼­³öÎÊÌâµ¼ÖÂÎÞ·¨¿Û³ýÎïÆ·¶øÒýÆðË¢bugÎÊÌâ #=========================================================================== # if needSysmsg: # PlayerControl.NotifyCode(curPlayer, "LostRes", [curItemTypeID , delCnt]) #=========================================================================== if isForceDR or ItemControler.ItemNeedRecord(curItem): itemNoteDict = GetItemNoteDict(curItem, delCnt, curItemCnt, curItemCnt - delCnt) DR_DelItem(curPlayer, IPY_GameWorld.rptItem, recordName, itemNoteDict, saveDataDict) #¿Û³ýÎïÆ· ItemControler.SetItemCount(curItem, curItemCnt - delCnt, curPlayer.GetPlayerID(), curPlayer.GetAccID(), curPlayer.GetPlayerName()) return def DelItemByGUID(curPlayer, curItemPack, delItemByGUIDDict, recordName="", saveDataDict={}, isForceDR=False): ## ¸ù¾ÝÎïÆ·GUID¿Û³ýÎïÆ· for i in xrange(curItemPack.GetCount()): curItem = curItemPack.GetAt(i) if not CheckItemCanUse(curItem): continue itemGUID = curItem.GetGUID() if itemGUID not in delItemByGUIDDict: continue delCnt = delItemByGUIDDict.pop(itemGUID) DelItem(curPlayer, curItem, delCnt, True, recordName, saveDataDict, isForceDR) if not delItemByGUIDDict: break return def DelVPackItem(curPlayer, packIndex, placeList, eventName=""): ''' ɾ³ýÐéÄâ±³°üÎïÆ· ''' if packIndex not in ShareDefine.Def_VPack_TypeList: return for place in placeList: itemKeyData = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_VPackItem % (packIndex, place)) if not itemKeyData: continue isNeedRecord = False itemID = 0 itemName = "" if packIndex == ShareDefine.rptRune: itemID = ItemControler.GetRuneItemID(itemKeyData) plusLV = ItemControler.GetRuneItemPlusLV(itemKeyData) curItemData = GameWorld.GetGameData().GetItemByTypeID(itemID) itemName = str(itemID) if not curItemData else curItemData.GetName() itemName = "%s LV%s" % (itemName, plusLV + 1) isNeedRecord = curItemData and ItemControler.IsRuneItemNeedRecord(curItemData, plusLV) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_VPackItem % (packIndex, place), 0) if isNeedRecord: dataDict = {"ItemID":itemID, "ItemCount":1, "PlusLV":plusLV + 1} DR_DelItem(curPlayer, packIndex, "VPack_%s" % packIndex if not eventName else eventName, dataDict) ItemControler.Sync_VPackItem_Clear(curPlayer, packIndex, placeList) return ## »ñÈ¡ÎïÆ·½×¼¶»òÆ·¼¶ def GetItemClassLV(curItem): return curItem.GetLV() ## ×°±¸ÆÀ·Ö def GetEquipGearScore(curItem): return curItem.GetGearScore() def SetEquipGearScore(curItem, value): return curItem.SetGearScore(value) def GetEquipPackIndex(curItem): ## ¸ù¾ÝÎïÆ·»ñÈ¡¶ÔÓ¦µÄ¿É×°±¸±³°üλÖà ipyData = IpyGameDataPY.GetIpyGameData('EquipPlaceIndexMap', GetItemClassLV(curItem), curItem.GetEquipPlace()) if not ipyData: return -1 return ipyData.GetGridIndex() ## ÿÈÕ¿ÉʹÓôÎÊý def GetCanUseCountDaily(curItem): return curItem.GetMaxAddSkillCnt() ## ÿÖÜ¿ÉʹÓôÎÊý, Ô¤Áô£¬Ôݲ»ÊµÏÖ #def GetCanUseCountWeek(curItem): return curItem.GetMaxFitLV() ## »ñÈ¡·¢ËÍÓʼþÎïÆ·×ÖµäÐÅÏ¢ def GetMailItemDict(curItem): if not curItem or curItem.IsEmpty(): return {} isAuctionItem = ItemControler.GetIsAuctionItem(curItem) if not CheckItemIsEquip(curItem): return [curItem.GetItemTypeID(), curItem.GetCount(), isAuctionItem] addItemDict = {} addItemDict['ItemID'] = curItem.GetItemTypeID() addItemDict['Count'] = curItem.GetCount() addItemDict['IsAuctionItem'] = isAuctionItem #addItemDict['IsBind'] = int(curItem.GetIsBind()) #addItemDict['EquipGS'] = GetEquipGearScore(curItem) #addItemDict['ItemStarLV'] = curItem.GetItemStarLV() #addItemDict['CurDurg'] = GameWorld.GetIntUpper(curItem.GetCurDurg(), ChConfig.Def_EndureRepairParameter) #addItemDict['MaxDurg'] = GameWorld.GetIntUpper(curItem.GetMaxEndure(), ChConfig.Def_EndureRepairParameter) #addItemDict['ItemProperty'] = curItem.GetItemProperty() #addItemDict['SoulProperty'] = curItem.GetSoulProperty() #addItemDict['CanPlaceStoneCount'] = curItem.GetCanPlaceStoneCount() #addItemDict['Stone1'] = curItem.GetStone(0) #addItemDict['Stone2'] = curItem.GetStone(1) #addItemDict['Stone3'] = curItem.GetStone(2) #addItemDict['Stone4'] = curItem.GetStone(3) #addItemDict['Stone5'] = curItem.GetStone(4) #addItemDict['Stone6'] = curItem.GetStone(5) #addItemDict['Stone7'] = curItem.GetStone(6) #addItemDict['Stone8'] = curItem.GetStone(7) #addItemDict['Stone9'] = curItem.GetStone(8) #addItemDict['RemainHour'] = curItem.GetRemainHour() #addItemDict['IsRenZhu'] = curItem.GetCanRenZhu() #addItemDict['EquipDefenseValue'] = curItem.GetEquipDefenseValue() #addItemDict['EquipMinAtkValue'] = curItem.GetEquipMinAtkValue() #addItemDict['EquipMaxAtkValue'] = curItem.GetEquipMaxAtkValue() #addItemDict['FitLV'] = curItem.GetFitLV() #addItemDict['Proficiency'] = curItem.GetProficiency() #addItemDict['IsSuite'] = int(curItem.GetIsSuite()) #addItemDict['BaseHP'] = curItem.GetBaseHP() #addItemDict['BaseMagicDef'] = curItem.GetBaseMagicDef() #addItemDict['MaxAddSkillCnt'] = curItem.GetMaxAddSkillCnt() #addItemDict['EquipMagicDefValue'] = curItem.GetEquipMagicDefValue() #addItemDict['EquipMinMagicAtkValue'] = curItem.GetEquipMinMagicAtkValue() #addItemDict['EquipMaxMagicAtkValue'] = curItem.GetEquipMaxMagicAtkValue() addItemDict['UserData'] = str(curItem.GetUserData()) return addItemDict def GetJsonItem(itemInfo): '''»ñÈ¡ÎïÆ·ÐÅÏ¢¶ÔÓ¦µÄjsonÐÅÏ¢ @param itemInfo: Ö§³ÖÁбí [itemID, itemCount, isAuctionItem], Ö§³Ö¶¯Ì¬ÁÐ±í³¤¶È£¬Ë÷Òý´ú±íÊôÐԹ̶¨ Ö§³ÖÎïÆ·ÊµÀý, Èç¹ûÊÇʾÀýʱ±ØÐëÔÚ¸øÍæ¼Ò֮ǰÏÈ»ñÈ¡³öÀ´£¬·ÀÖ¹¸øÍæ¼Òºó¸ÃÎïÆ·ÊµÀý±»Çå¿Õ @return: {"ItemID":101, "Count":10, "IsAuctionItem":1, "UserData":"×Ô¶¨ÒåÊôÐÔ×Ö·û´®"} ''' itemDict = {} if isinstance(itemInfo, list) or isinstance(itemInfo, tuple): infolen = len(itemInfo) if infolen > 0: itemDict["ItemID"] = itemInfo[0] if infolen > 1 and itemInfo[1] > 1: itemDict["Count"] = itemInfo[1] if infolen > 2 and itemInfo[2]: itemDict["IsAuctionItem"] = int(itemInfo[2]) elif isinstance(itemInfo, int): itemDict["ItemID"] = itemInfo else: #ÎïÆ·ÊµÀý if not CheckItemCanUse(itemInfo): # ÐèÒªÏÈ»ñÈ¡ÐÅÏ¢£¬ÔÙ¸øÎïÆ·£¬²»ÄÜ¿ÉÄܵ¼Ö¸øÎïÆ·ºó£¬Ô­À´µÄÁÙʱÎïÆ·±»Çå¿Õ£¬µ¼ÖÂÎÞ·¨Õý³£»ñµÃÎïÆ·ÐÅÏ¢ GameWorld.ErrLog("ÎïÆ·Îª¿Õ!ÎÞ·¨»ñÈ¡JsonItemÐÅÏ¢!") return {} itemDict["ItemID"] = itemInfo.GetItemTypeID() if itemInfo.GetCount() > 1: itemDict["Count"] = itemInfo.GetCount() if ItemControler.GetIsAuctionItem(itemInfo): itemDict["IsAuctionItem"] = 1 if itemInfo.GetUserData(): itemDict["UserData"] = itemInfo.GetUserData() return itemDict def GetWeightItemListByAlchemyDiffLV(curPlayer, weightList, alchemyDiffLV): ''' ¸ù¾ÝÁ¶µ¤µÈ¼¶²îÒìµÈ¼¶¹ýÂËÈ¨ÖØÁбíÖв»Âú×ãµÄÎïÆ·£¬¹ýÂË×îµÍÍæ¼ÒµÈ¼¶ÒªÇóÎïÆ· ·µ»ØÐµÄÈ¨ÖØÁбí @param weightList: ÎïÆ·È¨ÖØÐÅÏ¢Áбí @param alchemyDiffLV: ÊÇ·ñ¹ýÂ˵ô´óÓÚX¼¶µÄÁ¶µ¤µÈ¼¶ÎïÆ·£¬0-²»¹ýÂË£¬1-¹ýÂËÇÒ¶ÁĬÈÏÅäÖã¬>1-ÌØÊ⹦ÄÜÖ¸¶¨µÄ¹ýÂ˵ȼ¶ ''' resultWeightList = [] return resultWeightList ## ======================================================================================= def SyncMakeItemAnswer(curPlayer, makeType, isSuccess, makeValue): makeItemAnswer = ChPyNetSendPack.tagMCMakeItemAnswer() makeItemAnswer.Clear() makeItemAnswer.MakeType = makeType makeItemAnswer.Result = isSuccess makeItemAnswer.MakeValue = makeValue NetPackCommon.SendFakePack(curPlayer, makeItemAnswer) return