#!/usr/bin/python # -*- coding: GBK -*- #------------------------------------------------------------------------------- # ##@package Player.PlayerHero # # @todo:Î佫ӢÐÛ # @author hxp # @date 2025-06-11 # @version 1.0 # # ÏêϸÃèÊö: Î佫ӢÐÛ # #------------------------------------------------------------------------------- #"""Version = 2025-06-11 11:00""" #------------------------------------------------------------------------------- import ItemCommon import ShareDefine import IpyGameDataPY import IPY_GameWorld import ItemControler import PlayerSuccess import ChPyNetSendPack import OpenServerActivity import PlayerActivity import NetPackCommon import PlayerControl import PlayerOnline import PlayerPreset import PlayerBeauty import PlayerTask import PlayerHJG import GameWorld import ChConfig import random import math def PlayerOnDay(curPlayer): if curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroAwakeRebirthCnt): PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HeroAwakeRebirthCnt, 0) Sync_PlayerHeroInfo(curPlayer) return def OnPlayerLogin(curPlayer): Sync_HeroInfo(curPlayer) Sync_PlayerHeroInfo(curPlayer) Sync_LineupRecommendInfo(curPlayer) Sync_HeroFatesInfo(curPlayer) __CheckOSAHeroStar(curPlayer) return def OnPlayerFirstLogin(curPlayer): OnFirstLoginInitPlayer(curPlayer) OnFirstLoginInitHero(curPlayer) return def OnFirstLoginInitPlayer(curPlayer): ## ³õʼ»¯Ö÷¹« equipPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptEquip) if not equipPack.GetCount(): identifyPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptIdentify) if not identifyPack.GetCount(): return defaultEquipInfo = IpyGameDataPY.GetFuncEvalCfg("NewRoleInit", 1, {}) if not defaultEquipInfo: return GameWorld.DebugLog("³õʼ»¯ÐÂÊÖ¶¨ÖÆ×°±¸: %s" % defaultEquipInfo, curPlayer.GetPlayerID()) for equipID, appointID in defaultEquipInfo.items(): itemData = GameWorld.GetGameData().GetItemByTypeID(equipID) if not itemData: continue equipPlace = itemData.GetEquipPlace() equipPlaceIndex = equipPlace - 1 # Ôݹ̶¨Ö±½Ó×°±¸Î»-1 if equipPlaceIndex < 0 or equipPlaceIndex >= equipPack.GetCount(): continue destEquip = equipPack.GetAt(equipPlaceIndex) if not destEquip.IsEmpty(): continue setAttrDict = {ShareDefine.Def_CItemKey_AppointID:appointID} if appointID else {} curItem = ItemControler.GetOutPutItemObj(equipID, 1, curPlayer=curPlayer, setAttrDict=setAttrDict) if not curItem: continue destEquip.AssignItem(curItem) return def OnFirstLoginInitHero(curPlayer): ## ³õʼ»¯Ä¬ÈÏÎ佫ÕóÐÍ curPack = curPlayer.GetItemManager().GetPack(ShareDefine.rptHero) GameWorld.DebugLog("OnFirstLoginInitHero: %s" % curPack.GetCount(), curPlayer.GetPlayerID()) if not curPack.GetCount(): return defaultHeroInfo = IpyGameDataPY.GetFuncEvalCfg("NewRoleInit", 2, {}) if not defaultHeroInfo: return GameWorld.DebugLog("³õʼ»¯ÐÂÊÖÎ佫: %s" % defaultHeroInfo, curPlayer.GetPlayerID()) presetID = 1 # ĬÈÏÔ¤Éè1 shapeType = 0 for heroID, posNum in defaultHeroInfo.items(): lineupValue = ComLineupValue(presetID, shapeType, posNum) setAttrDict = {ShareDefine.Def_IudetHeroLineup:[lineupValue]} ItemControler.GivePlayerItem(curPlayer, heroID, 1, False, [ShareDefine.rptHero], setAttrDict=setAttrDict) return def InitHeroItem(singleItem): ## Î佫¿¨ÅƳõʼ»¯£º³õʼµÈ¼¶1£» ÐǼ¶¡¢Í»ÆÆµÈ¼¶¡¢¾õÐѵȼ¶¾ùΪ0 singleItem.SetUserAttr(ShareDefine.Def_IudetHeroLV, 1) if singleItem.GetUserAttr(ShareDefine.Def_IudetHeroStar): singleItem.SetUserAttr(ShareDefine.Def_IudetHeroStar, 0) if singleItem.GetUserAttr(ShareDefine.Def_IudetHeroBreakLV): singleItem.SetUserAttr(ShareDefine.Def_IudetHeroBreakLV, 0) if singleItem.GetUserAttr(ShareDefine.Def_IudetHeroAwakeLV): singleItem.SetUserAttr(ShareDefine.Def_IudetHeroAwakeLV, 0) if singleItem.GetUserAttr(ShareDefine.Def_IudetHeroSkin): singleItem.SetUserAttr(ShareDefine.Def_IudetHeroSkin, 0) if singleItem.GetUserAttr(ShareDefine.Def_IudetHeroSkinAttr): singleItem.SetUserAttr(ShareDefine.Def_IudetHeroSkinAttr, 0) if singleItem.GetUserAttrCount(ShareDefine.Def_IudetHeroTalentID): singleItem.ClearUserAttr(ShareDefine.Def_IudetHeroTalentID) if singleItem.GetUserAttrCount(ShareDefine.Def_IudetHeroTalentIDLV): singleItem.ClearUserAttr(ShareDefine.Def_IudetHeroTalentIDLV) if singleItem.GetUserAttrCount(ShareDefine.Def_IudetHeroTalentWashLock): singleItem.ClearUserAttr(ShareDefine.Def_IudetHeroTalentWashLock) if singleItem.GetUserAttrCount(ShareDefine.Def_IudetHeroTalentWashID): singleItem.ClearUserAttr(ShareDefine.Def_IudetHeroTalentWashID) if singleItem.GetUserAttrCount(ShareDefine.Def_IudetHeroTalentIDAwakeRand): singleItem.ClearUserAttr(ShareDefine.Def_IudetHeroTalentIDAwakeRand) if singleItem.GetUserAttrCount(ShareDefine.Def_IudetHeroLineup): singleItem.ClearUserAttr(ShareDefine.Def_IudetHeroLineup) InitHeroTalent(singleItem) return def InitHeroTalent(singleItem): '''³õʼ»¯²ÛλÌ츳£¬²»Í¬²ÛλÌ츳ID²»ÄÜÒ»Ñù ''' heroID = singleItem.GetItemTypeID() heroIpyData = IpyGameDataPY.GetIpyGameData("Hero", heroID) if not heroIpyData: return quality = heroIpyData.GetQuality() qualityIpyData = IpyGameDataPY.GetIpyGameData("HeroQuality", quality) if not qualityIpyData: return initTalentCnt = 1 initTalentWeight = qualityIpyData.GetInitTalentWeight() # ³õʼÌ츳ÊýÈ¨ÖØ if initTalentWeight: initTalentCnt = GameWorld.GetResultByWeightList(initTalentWeight, 1) talentIDDict = {} talentWeightList = [] ipyDataMgr = IpyGameDataPY.IPY_Data() for index in range(ipyDataMgr.GetHeroTalentCount()): talentIpyData = ipyDataMgr.GetHeroTalentByIndex(index) talentID = talentIpyData.GetTalentID() initWeight = talentIpyData.GetInitWeight() talentWeightList.append([initWeight, talentID]) talentIDDict[talentID] = initWeight singleItem.ClearUserAttr(ShareDefine.Def_IudetHeroTalentID) singleItem.ClearUserAttr(ShareDefine.Def_IudetHeroTalentIDLV) for _ in range(initTalentCnt): randTalentID = GameWorld.GetResultByWeightList(talentWeightList) if not randTalentID: continue # ÒÆ³ýÈ·±£²»Öظ´ randWeightID = [talentIDDict.get(randTalentID, 0), randTalentID] if randWeightID in talentWeightList: talentWeightList.remove(randWeightID) singleItem.AddUserAttr(ShareDefine.Def_IudetHeroTalentID, randTalentID) singleItem.AddUserAttr(ShareDefine.Def_IudetHeroTalentIDLV, 1) return def OnGiveHeroItem(curPlayer, heroItem): ## »ñµÃij¸öÎ佫 heroID = heroItem.GetItemTypeID() heroIpyData = IpyGameDataPY.GetIpyGameData("Hero", heroID) if not heroIpyData: return if not GetHeroActivite(curPlayer, heroID): SetHeroActivite(curPlayer, heroID, 1) GameWorld.DebugLog("Ê״줻îÎ佫: heroID=%s" % (heroID), curPlayer.GetPlayerID()) #Ê״λñµÃͼ¼ø¶îÍâÂß¼­ ... Sync_HeroInfo(curPlayer, [heroID]) PlayerOnline.GetOnlinePlayer(curPlayer).OnHeroItemUpate(heroItem) # Ê״λñµÃ OpenServerActivity.UpdOSA_HeroTrainBillboard(curPlayer) # Ê״λñµÃ return def GetHeroActivite(curPlayer, heroID): ## Î佫״̬ # @return: 0-δ¼¤»î£»1-Î佫ÒÑ»ñµÃ,¿É¼¤»î£»2-ͼ¼øÒѼ¤»î actState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroBook % heroID) % 10 return actState def SetHeroActivite(curPlayer, heroID, isAct=1): ## ÉèÖÃÎ佫ÒÑ»ñµÃ£¬¿É¼¤»î״̬ bookState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroBook % heroID) actState = bookState % 10 if isAct: if actState: return actState = 1 else: actState = 0 updBookState = GameWorld.SetValue(bookState, 1, 1, actState) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HeroBook % heroID, updBookState) GameWorld.DebugLog("ÉèÖÃÎ佫¼¤»î״̬:%s,bookState=%s,updBookState=%s" % (isAct, bookState, updBookState), curPlayer.GetPlayerID()) return def GetHeroBookInitState(curPlayer, heroID): ## Î佫ͼ¼ø¼¤»î״̬ initState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroBook % heroID) % 10 return initState > 1 def SetHeroBookInitState(curPlayer, heroID, isAct=1): ## ÉèÖÃÎ佫ͼ¼ø¼¤»î״̬ bookState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroBook % heroID) actState = bookState % 10 if isAct: actState = 2 else: actState = 1 if actState else 0 updBookState = GameWorld.SetValue(bookState, 1, 1, actState) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HeroBook % heroID, updBookState) GameWorld.DebugLog("ÉèÖÃÎ佫ͼ¼ø¼¤»î״̬:%s,bookState=%s,updBookState=%s" % (isAct, bookState, updBookState), curPlayer.GetPlayerID()) return ## Def_PDict_HeroSkinInfo ÐǼ¶*10+ÊÇ·ñÒѼ¤»î def GetHeroSkinState(curPlayer, skinID): ## Î佫ʱװ¼¤»î״̬ return curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroSkinInfo % skinID) % 10 def SetHeroSkinState(curPlayer, skinID, state): info = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroSkinInfo % skinID) info = info / 10 * 10 + min(1, state) return PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HeroSkinInfo % skinID, info) def GetHeroSkinStar(curPlayer, skinID): ## Î佫ʱװÐǼ¶ return curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroSkinInfo % skinID) / 10 def SetHeroSkinStar(curPlayer, skinID, star): info = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroSkinInfo % skinID) info = star * 10 + info % 10 return PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HeroSkinInfo % skinID, info) def GetHeroItem(curPlayer, itemIndex): curPack = curPlayer.GetItemManager().GetPack(ShareDefine.rptHero) if itemIndex < 0 or itemIndex >= curPack.GetCount(): return heroItem = curPack.GetAt(itemIndex) if not heroItem or heroItem.IsEmpty(): return if heroItem.GetType() != ChConfig.Def_ItemType_Hero: return return heroItem def GetHeroEffPresetIDList(heroItem): ## »ñȡӢÐÛÓÐÉúЧµÄÔ¤ÉèIDÁбí dataCount = heroItem.GetUserAttrCount(ShareDefine.Def_IudetHeroEffPresetID) if not dataCount: return [] effPresetIDList = [] for lpIndex in range(dataCount): presetID = heroItem.GetUserAttrByIndex(ShareDefine.Def_IudetHeroEffPresetID, lpIndex) effPresetIDList.append(presetID) return effPresetIDList #// B2 30 Î佫Éý¼¶ #tagCSHeroLVUP # #struct tagCSHeroLVUP #{ # tagHead Head; # WORD ItemIndex; //Î佫ÎïÆ·ËùÔÚÎ佫±³°üλÖÃË÷Òý #}; def OnHeroLVUP(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) playerID = curPlayer.GetPlayerID() itemIndex = clientData.ItemIndex heroItem = GetHeroItem(curPlayer, itemIndex) if not heroItem: return heroID = heroItem.GetItemTypeID() heroIpyData = IpyGameDataPY.GetIpyGameData("Hero", heroID) if not heroIpyData: return quality = heroIpyData.GetQuality() breakLV = heroItem.GetUserAttr(ShareDefine.Def_IudetHeroBreakLV) heroLV = heroItem.GetUserAttr(ShareDefine.Def_IudetHeroLV) GameWorld.DebugLog("ÇëÇóÎ佫Éý¼¶: itemIndex=%s,heroID=%s,heroLV=%s,quality=%s,breakLV=%s" % (itemIndex, heroID, heroLV, quality, breakLV), playerID) qualityLVIpyData = IpyGameDataPY.GetIpyGameData("HeroQualityLV", quality, heroLV) if not qualityLVIpyData: return nextHeroLV = heroLV + 1 if not IpyGameDataPY.GetIpyGameData("HeroQualityLV", quality, nextHeroLV): GameWorld.DebugLog("²»´æÔÚ¸ÃÎ佫µÈ¼¶: quality=%s,nextHeroLV=%s" % (quality, nextHeroLV), playerID) return costItemInfo = qualityLVIpyData.GetUPCostItem() if not costItemInfo: return costItemID, costItemCount = costItemInfo if not costItemID or not costItemCount: return 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 ItemCommon.ReduceItem(curPlayer, itemPack, itemIndexList, costItemCount, True, "HeroLVUP") updHeroLV = nextHeroLV GameWorld.DebugLog("Î佫Éý¼¶: itemIndex=%s,heroID=%s,updHeroLV=%s" % (itemIndex, heroID, updHeroLV), playerID) heroItem.SetUserAttr(ShareDefine.Def_IudetHeroLV, updHeroLV) PlayerOnline.GetOnlinePlayer(curPlayer).OnHeroItemUpate(heroItem) # Éý¼¶ PlayerActivity.AddDailyTaskValue(curPlayer, ChConfig.DailyTask_HeroLVUP, 1) PlayerTask.AddTaskValue(curPlayer, ChConfig.TaskType_HeroLVUP) PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_OSAHeroLVUP, 1) OpenServerActivity.UpdOSA_HeroTrainBillboard(curPlayer) # Éý¼¶ return def GetHeroLVMax(heroItem): ## »ñÈ¡Î佫µ±Ç°×î´óµÈ¼¶ heroID = heroItem.GetItemTypeID() heroIpyData = IpyGameDataPY.GetIpyGameData("Hero", heroID) if not heroIpyData: return 0 quality = heroIpyData.GetQuality() lvIpyDataList = IpyGameDataPY.GetIpyGameDataByCondition("HeroQualityLV", {"Quality":quality}, True) if not lvIpyDataList: return 0 return len(lvIpyDataList) #// B2 31 Î佫ÉýÐÇ #tagCSHeroStarUP # #struct tagCSHeroStarUP #{ # tagHead Head; # WORD ItemIndex; //Î佫ÎïÆ·ËùÔÚÎ佫±³°üλÖÃË÷Òý # WORD UseItemIndex; //ʹÓÃÎ佫²ÄÁÏÎïÆ·ËùÔÚÎ佫±³°üλÖÃË÷Òý #}; def OnHeroStarUP(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) playerID = curPlayer.GetPlayerID() itemIndex = clientData.ItemIndex useItemIndex = clientData.UseItemIndex heroItem = GetHeroItem(curPlayer, itemIndex) useItem = GetHeroItem(curPlayer, useItemIndex) if not heroItem or not useItem or itemIndex == useItemIndex: return heroID = heroItem.GetItemTypeID() useHeroID = useItem.GetItemTypeID() GameWorld.DebugLog("ÇëÇóÎ佫ÉýÐÇ: itemIndex=%s,heroID=%s,useItemIndex=%s,useHeroID=%s" % (itemIndex, heroID, useItemIndex, useHeroID), playerID) if heroID != useHeroID: GameWorld.DebugLog("Î佫²ÄÁϷDZ¾Ì壬ÎÞ·¨ÉýÐÇ!", playerID) return if useItem.GetIsLocked(): GameWorld.DebugLog("²ÄÁÏ¿¨Ëø¶¨ÖУ¬ÎÞ·¨ÉýÐÇ! useItemIndex=%s,heroID=%s" % (useItemIndex, heroID), playerID) return washIDCnt = heroItem.GetUserAttrCount(ShareDefine.Def_IudetHeroTalentWashID) if washIDCnt: GameWorld.ErrLog("Î佫ϴÁ¶½á¹ûδ´¦Àí£¬ÎÞ·¨ÉýÐÇ! itemIndex=%s,heroID=%s" % (itemIndex, heroID), playerID) return awakeRandCnt = heroItem.GetUserAttrCount(ShareDefine.Def_IudetHeroTalentIDAwakeRand) if awakeRandCnt: GameWorld.ErrLog("Î佫¾õÐѽâËøÌ츳δѡÔñ£¬ÎÞ·¨ÉýÐÇ! itemIndex=%s,heroID=%s" % (itemIndex, heroID), playerID) return useAwakeLV = useItem.GetUserAttr(ShareDefine.Def_IudetHeroAwakeLV) if useAwakeLV: GameWorld.DebugLog("²ÄÁÏ¿¨¾õÐѵȼ¶²»Îª0ÔÝʱÎÞ·¨ÉýÐÇ£¡useAwakeLV=%s" % (useAwakeLV), playerID) return useHeroLV = useItem.GetUserAttr(ShareDefine.Def_IudetHeroLV) useBreakLV = useItem.GetUserAttr(ShareDefine.Def_IudetHeroBreakLV) if useHeroLV > 1 or useBreakLV: GameWorld.DebugLog("²ÄÁÏ¿¨ÒÑÉý¼¶»òÍ»ÆÆÔÝʱÎÞ·¨ÉýÐÇ£¡useHeroLV=%s,useBreakLV=%s" % (useHeroLV, useBreakLV), playerID) return heroIpyData = IpyGameDataPY.GetIpyGameData("Hero", heroID) if not heroIpyData: return quality = heroIpyData.GetQuality() star = heroItem.GetUserAttr(ShareDefine.Def_IudetHeroStar) awakeLV = heroItem.GetUserAttr(ShareDefine.Def_IudetHeroAwakeLV) starMax = GetHeroStarMax(heroID, heroItem) GameWorld.DebugLog("heroID=%s,star=%s,quality=%s,awakeLV=%s,starMax=%s" % (heroID, star, quality, awakeLV, starMax), playerID) if star >= starMax: GameWorld.DebugLog("¸ÃÎ佫ÒÑÂúÐÇ£¡starMax=%s" % (starMax), playerID) return useStar = useItem.GetUserAttr(ShareDefine.Def_IudetHeroStar) addStar = useStar + 1 updStar = star + addStar GameWorld.DebugLog("Î佫ÉýÐÇ: itemIndex=%s,heroID=%s,star=%s,useStar=%s,addStar=%s,updStar=%s" % (itemIndex, heroID, star, useStar, addStar, updStar), playerID) ItemCommon.DelItem(curPlayer, useItem, useItem.GetCount(), False, "HeroStarUP") DoHeroUpdStar(curPlayer, heroItem, updStar) PlayerOnline.GetOnlinePlayer(curPlayer).OnHeroItemUpate(heroItem) # ÉýÐÇ # ¹Ì¶¨·µ»¹Ò»¸öDzɢ±¾Ìå²ÄÁÏ qualityIpyData = IpyGameDataPY.GetIpyGameData("HeroQuality", quality) if qualityIpyData: ratio = IpyGameDataPY.GetFuncCfg("HeroRebirth", 5) returnItemList = [] dismissReturnItems = qualityIpyData.GetDismissReturnItems() for itemID, itemCount in dismissReturnItems: returnCnt = max(1, int(itemCount * ratio / 100.0)) returnItemList.append([itemID, returnCnt]) returnItemExDict = {} __calcHeroQualityReturnItemEx(curPlayer, qualityIpyData, returnItemExDict) for key, itemCount in returnItemExDict.items(): itemID, isBind = key returnItemList.append([itemID, itemCount, isBind]) GameWorld.DebugLog("ÍÌÊɶîÍâ×Ü·µ»¹: %s" % returnItemList) ItemControler.GivePlayerItemOrMail(curPlayer, returnItemList, event=["HeroStarUPReturn", False, {}]) OpenServerActivity.UpdOSA_HeroTrainBillboard(curPlayer) # ÉýÐÇ return def GetHeroStarMax(heroID, heroItem=None): ## »ñÈ¡Î佫¿¨ÎïÆ·µ±Ç°×î´óÐǼ¶ # @param heroItem: ´«ÈëÎ佫ÎïÆ·Ê±£¬ÔòÈ¡±¾ÎïÆ·µ±Ç°¾õÐѶÔÓ¦µÄ×î´óÐǼ¶ heroIpyData = IpyGameDataPY.GetIpyGameData("Hero", heroID) if not heroIpyData: return 0 quality = heroIpyData.GetQuality() qualityIpyData = IpyGameDataPY.GetIpyGameData("HeroQuality", quality) if not qualityIpyData: return 0 InitStarUpper = qualityIpyData.GetInitStarUpper() awakeLV = 99999 if heroItem: awakeLV = heroItem.GetUserAttr(ShareDefine.Def_IudetHeroAwakeLV) if awakeLV <= 0: return InitStarUpper addStarUpper = 0 heroAwakeIpyDataList = IpyGameDataPY.GetIpyGameDataListNotLog("HeroAwake", heroID) if heroAwakeIpyDataList: for ipyData in heroAwakeIpyDataList: if ipyData.GetAwakeLV() > awakeLV: break #ipyData.GetUnlockTalentSlot() addStarUpper += ipyData.GetAddStarUpper() starMax = InitStarUpper + addStarUpper return starMax def DoHeroUpdStar(curPlayer, heroItem, updStar, isSync=True): ## Ö´ÐÐÎ佫ÐǼ¶¸üРheroID = heroItem.GetItemTypeID() versionStarMax = GetHeroStarMax(heroID) # °æ±¾ÀíÂÛ×î´óÐǼ¶ if updStar > versionStarMax: updStar = versionStarMax GameWorld.DebugLog("²»³¬¹ý°æ±¾×î´óÎ佫ÐǼ¶: heroID=%s,versionStarMax=%s" % (heroID, versionStarMax)) curStar = heroItem.GetUserAttr(ShareDefine.Def_IudetHeroStar) addStar = updStar - curStar item = heroItem.GetItem() item.SetUserAttr(ShareDefine.Def_IudetHeroStar, updStar) if addStar > 0: __DoHeroStarTalentUp(item, addStar) PlayerActivity.AddDailyTaskValue(curPlayer, ChConfig.DailyTask_HeroStarUP, addStar) PlayerTask.AddTaskValue(curPlayer, ChConfig.TaskType_HeroStarUP, addStar) PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_OSAHeroStarUP, addStar) if isSync: heroItem.Sync_Item() #starLVH = GetHeroBookStarLVH(curPlayer, heroID) #if updStar > starLVH: # SetHeroBookStarLVH(curPlayer, heroID, updStar) return def __DoHeroStarTalentUp(singleItem, addLV): ## Ö´ÐÐÎ佫ÐǼ¶Ì츳µÈ¼¶ÌáÉý heroID = singleItem.GetItemTypeID() commTalentSlot = IpyGameDataPY.GetFuncCfg("HeroStarTalent", 1) # ³£¹æÌ츳²Û¸öÊý talentMaxLV = IpyGameDataPY.GetFuncCfg("HeroStarTalent", 2) # ÿ¸öÌ츳×î´óµÈ¼¶ maxUnlockSlot = commTalentSlot # ×î´óÓÐЧµÄÒѽâËø²Ûλ awakeIpyDataList = IpyGameDataPY.GetIpyGameDataListNotLog("HeroAwake", heroID) if awakeIpyDataList: awakeLV = singleItem.GetUserAttr(ShareDefine.Def_IudetHeroAwakeLV) for ipyData in awakeIpyDataList[:awakeLV][::-1]: # µ¹Ðò±éÀú£¬µÚÒ»¸öÃüÖеľÍÊÇ×î´óµÄ unlockTalentSlot = ipyData.GetUnlockTalentSlot() if unlockTalentSlot and unlockTalentSlot : maxUnlockSlot = unlockTalentSlot break idCount = singleItem.GetUserAttrCount(ShareDefine.Def_IudetHeroTalentID) lvCount = singleItem.GetUserAttrCount(ShareDefine.Def_IudetHeroTalentIDLV) idList, lvList = [], [] # ¼Ç¼ÔÚÎïÆ·ÉϵÄÖµ£¬ÓÐ˳Ðò unfullLVIDList = [] # δÂú¼¶µÄÌ츳ID unfullLVIDListUnlock = [] # δÂú¼¶µÄÌ츳ID£¬½öÒѽâËø²Ûλ£¬ÖØÉú¿ÉÄܵ¼Ö¾õÐÑÒѽâËø²ÛλÔÝʱ±»Ëø×¡ haveUp = False for index in range(min(idCount, lvCount)): talentID = singleItem.GetUserAttrByIndex(ShareDefine.Def_IudetHeroTalentID, index) talentLV = singleItem.GetUserAttrByIndex(ShareDefine.Def_IudetHeroTalentIDLV, index) idList.append(talentID) lvList.append(talentLV) if talentLV < talentMaxLV: unfullLVIDList.append(talentID) if index < maxUnlockSlot: unfullLVIDListUnlock.append(talentID) if len(idList) < commTalentSlot: idList += [0] * (commTalentSlot - len(idList)) lvList += [0] * (commTalentSlot - len(lvList)) GameWorld.DebugLog("Ö´ÐÐÎ佫ÐǼ¶Ì츳µÈ¼¶ÌáÉý: addLV=%s" % addLV) GameWorld.DebugLog("µ±Ç°ÐǼ¶Ì츳: idList=%s,lvList=%s,maxUnlockSlot=%s" % (idList, lvList, maxUnlockSlot)) GameWorld.DebugLog("δÂú¼¶ÐǼ¶Ì츳ID: %s,unfullLVIDListUnlock=%s" % (unfullLVIDList, unfullLVIDListUnlock)) # ÓпÕÓà²Û룬ÓÅÏȸø¿ÕÓà²ÛλÌ츳£¬¶îÍâ½âËøµÄ²ÛλÊÇÐèÒªÏÈÑ¡ÔñµÄ£¬ËùÒÔÒ»¶¨²»Îª¿Õ£¬¹ÊÕâÀïÖ»Åжϳ£¹æ²Ûλ¼´¿É if 0 in idList: idWeightDict = {} talentWeightList = [] ipyDataMgr = IpyGameDataPY.IPY_Data() for index in range(ipyDataMgr.GetHeroTalentCount()): talentIpyData = ipyDataMgr.GetHeroTalentByIndex(index) talentID = talentIpyData.GetTalentID() if talentID in idList: # Ì츳ID²»¿ÉÖØ¸´ continue weight = talentIpyData.GetWashWeight() talentWeightList.append([weight, talentID]) idWeightDict[talentID] = weight GameWorld.DebugLog("³£¹æ¿Õ²ÛλÔö¼ÓÌ츳Êý£º%s" % addLV) for _ in range(addLV): if 0 not in idList: break randTalentID = GameWorld.GetResultByWeightList(talentWeightList) if not randTalentID: continue # ÒÆ³ýÈ·±£²»Öظ´ randWeightID = [idWeightDict.get(randTalentID, 0), randTalentID] if randWeightID in talentWeightList: talentWeightList.remove(randWeightID) zeroIndex = idList.index(0) idList[zeroIndex] = randTalentID lvList[zeroIndex] = 1 unfullLVIDList.append(randTalentID) unfullLVIDListUnlock.append(randTalentID) GameWorld.DebugLog("ÐÂÔöÐǼ¶Ì츳ID: %s" % (randTalentID)) addLV -= 1 haveUp = True # ʣϵĵȼ¶´ÎÊý¶ÔÒÑÓÐÌ츳½øÐÐÉý¼¶ if addLV > 0: for _ in range(addLV): if not unfullLVIDList: break # ÓÅÏÈËæ»úÒѽâËøµÄ randID = random.choice(unfullLVIDListUnlock) if unfullLVIDListUnlock else random.choice(unfullLVIDList) if randID not in idList: continue randIndex = idList.index(randID) idLV = lvList[randIndex] if idLV < talentMaxLV: idLV += 1 lvList[randIndex] = idLV GameWorld.DebugLog("Éý¼¶ÐǼ¶Ì츳ID: %s,idLV=%s,index=%s" % (randID, idLV, randIndex)) if idLV >= talentMaxLV: if randID in unfullLVIDList: unfullLVIDList.remove(randID) if randID in unfullLVIDListUnlock: unfullLVIDListUnlock.remove(randID) GameWorld.DebugLog(" ÒÆ³ýÂú¼¶ID: %s,unfullLVIDList=%s,unfullLVIDListUnlock=%s" % (randID, unfullLVIDList, unfullLVIDListUnlock)) haveUp = True if not haveUp: return GameWorld.DebugLog("¸üÐÂÐǼ¶Ì츳: idList=%s,lvList=%s" % (idList, lvList)) singleItem.ClearUserAttr(ShareDefine.Def_IudetHeroTalentID) singleItem.ClearUserAttr(ShareDefine.Def_IudetHeroTalentIDLV) for index, talentID in enumerate(idList): if not talentID: break singleItem.AddUserAttr(ShareDefine.Def_IudetHeroTalentID, talentID) singleItem.AddUserAttr(ShareDefine.Def_IudetHeroTalentIDLV, lvList[index]) return def GetHeroIDStar(curPlayer, heroID): ## »ñȡij¸öÎ佫IDµ±Ç°ÐǼ¶£¬Í¬Ê±´æÔÚ¶àÕÅ¿¨Ê±È¡×î´óµÄÐǼ¶ starMax = 0 curPack = curPlayer.GetItemManager().GetPack(ShareDefine.rptHero) for index in range(curPack.GetCount()): heroItem = curPack.GetAt(index) if not heroItem or heroItem.IsEmpty(): continue if heroID != heroItem.GetItemTypeID(): continue starMax = max(heroItem.GetUserAttr(ShareDefine.Def_IudetHeroStar), starMax) return starMax def GetHeroStarTotal(curPlayer): ## Î佫×ÜÐǼ¶ totalStar = 0 curPack = curPlayer.GetItemManager().GetPack(ShareDefine.rptHero) for index in range(curPack.GetCount()): heroItem = curPack.GetAt(index) if not heroItem or heroItem.IsEmpty(): continue totalStar += heroItem.GetUserAttr(ShareDefine.Def_IudetHeroStar) return totalStar def __CheckOSAHeroStar(curPlayer): ## ÏßÉÏbugÁÙʱ´¦Àí osaHeroStar = PlayerSuccess.GetSuccValue(curPlayer, ShareDefine.SuccType_OSAHeroStarUP, []) starTotal = GetHeroStarTotal(curPlayer) addStar = starTotal - osaHeroStar if addStar <= 0: return GameWorld.Log("ÉÏÏßÐÞÕýÇìµäÎ佫ÉýÐdzɾͽø¶È! addStar=%s,starTotal=%s" % (addStar, starTotal)) PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_OSAHeroStarUP, addStar) return #// B2 32 Îä½«Í»ÆÆ #tagCSHeroBreak # #struct tagCSHeroBreak #{ # tagHead Head; # WORD ItemIndex; //Î佫ÎïÆ·ËùÔÚÎ佫±³°üλÖÃË÷Òý #}; def OnHeroBreak(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) playerID = curPlayer.GetPlayerID() itemIndex = clientData.ItemIndex heroItem = GetHeroItem(curPlayer, itemIndex) if not heroItem: return heroID = heroItem.GetItemTypeID() heroIpyData = IpyGameDataPY.GetIpyGameData("Hero", heroID) if not heroIpyData: return quality = heroIpyData.GetQuality() heroLV = heroItem.GetUserAttr(ShareDefine.Def_IudetHeroLV) breakLV = heroItem.GetUserAttr(ShareDefine.Def_IudetHeroBreakLV) GameWorld.DebugLog("ÇëÇóÎä½«Í»ÆÆ: itemIndex=%s,heroID=%s,quality=%s,heroLV=%s,breakLV=%s" % (itemIndex, heroID, quality, heroLV, breakLV), playerID) ipyData = IpyGameDataPY.GetIpyGameData("HeroQualityBreak", quality, breakLV) if not ipyData: return UPLVNeed = ipyData.GetUPLVNeed() if heroLV < UPLVNeed: GameWorld.DebugLog("Î佫µÈ¼¶²»×㣬ÎÞ·¨Í»ÆÆ: heroLV=%s < %s" % (heroLV, UPLVNeed), playerID) return nextBreakLV = breakLV + 1 if not IpyGameDataPY.GetIpyGameData("HeroQualityBreak", quality, nextBreakLV): GameWorld.DebugLog("Í»ÆÆµÈ¼¶ÒÑÂú¼¶: quality=%s,breakLV=%s" % (quality, breakLV), playerID) return costItemList = ipyData.GetUPCostItemList() if not costItemList: return itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem) lackItemDict, delInfoDict = ItemCommon.GetCostItemIndexList(costItemList, itemPack) if lackItemDict: GameWorld.DebugLog("²ÄÁϲ»×㣬Î佫ÎÞ·¨Í»ÆÆ! quality=%s,breakLV=%s,lackItemDict=%s" % (quality, breakLV, lackItemDict), playerID) return ItemCommon.DelCostItem(curPlayer, itemPack, delInfoDict, "HeroBreak") GameWorld.DebugLog("Îä½«Í»ÆÆ: itemIndex=%s,heroID=%s,nextBreakLV=%s" % (itemIndex, heroID, nextBreakLV), playerID) SetHeroBreakLV(curPlayer, heroItem, nextBreakLV) PlayerOnline.GetOnlinePlayer(curPlayer).OnHeroItemUpate(heroItem) # Í»ÆÆ OpenServerActivity.UpdOSA_HeroTrainBillboard(curPlayer) # Í»ÆÆ return def SetHeroBreakLV(curPlayer, heroItem, breakLV, isSync=True): ## ÉèÖÃÎä½«Í»ÆÆµÈ¼¶ #heroID = heroItem.GetItemTypeID() item = heroItem.GetItem() item.SetUserAttr(ShareDefine.Def_IudetHeroBreakLV, breakLV) if isSync: heroItem.Sync_Item() #breakLVH = GetHeroBookBreakLVH(curPlayer, heroID) #if breakLV > breakLVH: # SetHeroBookBreakLVH(curPlayer, heroID, breakLV) return #// B2 33 Î佫¾õÐÑ #tagCSHeroAwake # #struct tagCSHeroAwake #{ # tagHead Head; # WORD ItemIndex; //Î佫ÎïÆ·ËùÔÚÎ佫±³°üλÖÃË÷Òý #}; def OnHeroAwake(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) playerID = curPlayer.GetPlayerID() itemIndex = clientData.ItemIndex heroItem = GetHeroItem(curPlayer, itemIndex) if not heroItem: return heroID = heroItem.GetItemTypeID() heroIpyData = IpyGameDataPY.GetIpyGameData("Hero", heroID) if not heroIpyData: return quality = heroIpyData.GetQuality() starLV = heroItem.GetUserAttr(ShareDefine.Def_IudetHeroStar) awakeLV = heroItem.GetUserAttr(ShareDefine.Def_IudetHeroAwakeLV) GameWorld.DebugLog("ÇëÇóÎ佫¾õÐÑ: itemIndex=%s,heroID=%s,quality=%s,awakeLV=%s,starLV=%s" % (itemIndex, heroID, quality, awakeLV, starLV), playerID) awakeLimitStar = IpyGameDataPY.GetFuncCfg("HeroStarTalent", 4) commTalentSlot = IpyGameDataPY.GetFuncCfg("HeroStarTalent", 1) # ³£¹æÌ츳²Û¸öÊý if starLV < awakeLimitStar or starLV < commTalentSlot: GameWorld.DebugLog("µ±Ç°ÐǼ¶²»¿É¾õÐÑ: starLV=%s < %s, %s" % (starLV, awakeLimitStar, commTalentSlot), playerID) return ipyData = IpyGameDataPY.GetIpyGameData("HeroQualityAwake", quality, awakeLV) if not ipyData: return nextAwakeLV = awakeLV + 1 if not IpyGameDataPY.GetIpyGameData("HeroQualityAwake", quality, nextAwakeLV): GameWorld.DebugLog("¾õÐѵȼ¶ÒÑÂú¼¶: quality=%s,awakeLV=%s" % (quality, awakeLV), playerID) return costItemInfo = ipyData.GetUPCostItem() if not costItemInfo: return costItemID, costItemCount = costItemInfo if not costItemID or not costItemCount: return 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 ItemCommon.ReduceItem(curPlayer, itemPack, itemIndexList, costItemCount, True, "HeroAwake") GameWorld.DebugLog("Î佫¾õÐÑ: itemIndex=%s,heroID=%s,nextAwakeLV=%s" % (itemIndex, heroID, nextAwakeLV), playerID) SetHeroAwakeLV(heroItem, nextAwakeLV) PlayerOnline.GetOnlinePlayer(curPlayer).OnHeroItemUpate(heroItem) # ¾õÐÑ OpenServerActivity.UpdOSA_HeroTrainBillboard(curPlayer) # ¾õÐÑ return def SetHeroAwakeLV(heroItem, awakeLV, isSync=True): ## ÉèÖÃÎ佫¾õÐѵȼ¶ item = heroItem.GetItem() item.SetUserAttr(ShareDefine.Def_IudetHeroAwakeLV, awakeLV) unlockTalentSlotByAwake(item) if isSync: heroItem.Sync_Item() return def unlockTalentSlotByAwake(singleItem): ## ¾õÐѽâËøÌ츳²Û heroID = singleItem.GetItemTypeID() awakeLV = singleItem.GetUserAttr(ShareDefine.Def_IudetHeroAwakeLV) awakeIpyDataList = IpyGameDataPY.GetIpyGameDataListNotLog("HeroAwake", heroID) if not awakeIpyDataList: return maxUnlockSlot = 0 for ipyData in awakeIpyDataList[:awakeLV][::-1]: # µ¹Ðò±éÀú£¬µÚÒ»¸öÃüÖеľÍÊÇ×î´óµÄ unlockTalentSlot = ipyData.GetUnlockTalentSlot() if unlockTalentSlot: maxUnlockSlot = unlockTalentSlot break if not maxUnlockSlot: return idCount = singleItem.GetUserAttrCount(ShareDefine.Def_IudetHeroTalentID) if idCount >= maxUnlockSlot: return commTalentSlot = IpyGameDataPY.GetFuncCfg("HeroStarTalent", 1) # ³£¹æÌ츳²Û¸öÊý if maxUnlockSlot <= commTalentSlot: return awakeRandCnt = singleItem.GetUserAttrCount(ShareDefine.Def_IudetHeroTalentIDAwakeRand) if awakeRandCnt: # ÒѾ­´æÔÚ¾õÐÑÌì¸³Ëæ»úÑ¡ÏÐèÒªÏÈÑ¡Ôñºó²ÅÄܼÌÐø return # Ëæ»ú¾õÐÑÌ츳ѡÏî idList = [] for index in range(idCount): talentID = singleItem.GetUserAttrByIndex(ShareDefine.Def_IudetHeroTalentID, index) idList.append(talentID) GameWorld.DebugLog("¾õÐѽâËøÌ츳²Û: awakeLV=%s,maxUnlockSlot=%s,idList=%s" % (awakeLV, maxUnlockSlot, idList)) idWeightDict = {} talentWeightList = [] ipyDataMgr = IpyGameDataPY.IPY_Data() for index in range(ipyDataMgr.GetHeroTalentCount()): talentIpyData = ipyDataMgr.GetHeroTalentByIndex(index) talentID = talentIpyData.GetTalentID() if talentID in idList: # Ì츳ID²»¿ÉÖØ¸´ continue weight = talentIpyData.GetAweakWeight() talentWeightList.append([weight, talentID]) idWeightDict[talentID] = weight randTalentCnt = IpyGameDataPY.GetFuncCfg("HeroStarTalent", 3) for _ in range(randTalentCnt): randTalentID = GameWorld.GetResultByWeightList(talentWeightList) if not randTalentID: continue # ÒÆ³ýÈ·±£²»Öظ´ randWeightID = [idWeightDict.get(randTalentID, 0), randTalentID] if randWeightID in talentWeightList: talentWeightList.remove(randWeightID) singleItem.AddUserAttr(ShareDefine.Def_IudetHeroTalentIDAwakeRand, randTalentID) GameWorld.DebugLog("Ëæ»ú¾õÐÑÌ츳ѡÏî: randTalentID=%s" % (randTalentID)) return #// B2 34 Î佫¾õÐÑÑ¡ÔñÌ츳 #tagCSHeroAwakeSelectTalent # #struct tagCSHeroAwakeSelectTalent #{ # tagHead Head; # WORD ItemIndex; //Î佫ÎïÆ·ËùÔÚÎ佫±³°üλÖÃË÷Òý # BYTE SelectIndex; //Ñ¡ÔñнâËø²ÛλµÄÌ츳Ë÷Òý #}; def OnHeroAwakeSelectTalent(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) itemIndex = clientData.ItemIndex selectIndex = clientData.SelectIndex doSelectAwakeTalent(curPlayer, itemIndex, selectIndex) return def doSelectAwakeTalent(curPlayer, itemIndex, selectIndex, isSync=True): playerID = curPlayer.GetPlayerID() heroItem = GetHeroItem(curPlayer, itemIndex) if not heroItem: return heroID = heroItem.GetItemTypeID() awakeRandCnt = heroItem.GetUserAttrCount(ShareDefine.Def_IudetHeroTalentIDAwakeRand) if not awakeRandCnt or selectIndex >= awakeRandCnt: GameWorld.DebugLog("²»´æÔڸþõÐÑÌì¸³Ëæ»úÑ¡Ïî! heroID=%s,selectIndex=%s,awakeRandCnt=%s" % (heroID, selectIndex, awakeRandCnt), playerID) return selectTalentID = heroItem.GetUserAttrByIndex(ShareDefine.Def_IudetHeroTalentIDAwakeRand, selectIndex) if not selectTalentID: return singleItem = heroItem.GetItem() idCount = singleItem.GetUserAttrCount(ShareDefine.Def_IudetHeroTalentID) lvCount = singleItem.GetUserAttrCount(ShareDefine.Def_IudetHeroTalentIDLV) idList, lvList = [], [] # ¼Ç¼ÔÚÎïÆ·ÉϵÄÖµ£¬ÓÐ˳Ðò for index in range(min(idCount, lvCount)): talentID = singleItem.GetUserAttrByIndex(ShareDefine.Def_IudetHeroTalentID, index) talentLV = singleItem.GetUserAttrByIndex(ShareDefine.Def_IudetHeroTalentIDLV, index) idList.append(talentID) lvList.append(talentLV) if selectTalentID in idList: GameWorld.ErrLog("Ñ¡ÔñÌ츳ID²»ÄÜÖØ¸´! heroID=%s,selectIndex=%s,selectTalentID=%s in %s" % (heroID, selectIndex, selectTalentID, idList), playerID) return commTalentSlot = IpyGameDataPY.GetFuncCfg("HeroStarTalent", 1) # ³£¹æÌ츳²Û¸öÊý talentMaxLV = IpyGameDataPY.GetFuncCfg("HeroStarTalent", 2) # ÿ¸öÌ츳×î´óµÈ¼¶ idCount = len(idList) GameWorld.DebugLog("Ñ¡ÔñÌ츳: heroID=%s,selectTalentID=%s,idList=%s,lvList=%s" % (heroID, selectTalentID, idList, lvList)) if idCount < commTalentSlot: idList += [0] * (commTalentSlot - idCount) lvList += [0] * (commTalentSlot - idCount) selectTalentLV = 1 GameWorld.DebugLog("³£¹æ²Ûλδȫ²¿½âËø£¬¾õÐѲÛλĬÈÏ1¼¶Ì츳") else: heroIpyData = IpyGameDataPY.GetIpyGameData("Hero", heroID) if not heroIpyData: return quality = heroIpyData.GetQuality() qualityIpyData = IpyGameDataPY.GetIpyGameData("HeroQuality", quality) if not qualityIpyData: return InitStarUpper = qualityIpyData.GetInitStarUpper() heroAwakeIpyDataList = IpyGameDataPY.GetIpyGameDataListNotLog("HeroAwake", heroID) if not heroAwakeIpyDataList: return preSlotStarMax = 0 # ÉÏÒ»µµ²Ûλ×î´óÐǼ¶ preSlotStarMax += InitStarUpper for ipyData in heroAwakeIpyDataList: if idCount < ipyData.GetUnlockTalentSlot(): break preSlotStarMax += ipyData.GetAddStarUpper() curStar = heroItem.GetUserAttr(ShareDefine.Def_IudetHeroStar) GameWorld.DebugLog("³£¹æ²ÛλÒÑÈ«²¿½âËø, idCount=%s,preSlotStarMax=%s,curStar=%s" % (idCount, preSlotStarMax, curStar)) overflowStar = curStar - preSlotStarMax # Òç³öÐǼ¶ = µ±Ç°ÐǼ¶ - ÉÏÒ»µµ²Ûλ×î´óÐǼ¶ selectTalentLV = max(1, min(overflowStar + 1, talentMaxLV)) # ±£µ×1¼¶ + Òç³öÐǼ¶ idList.append(selectTalentID) lvList.append(selectTalentLV) singleItem.ClearUserAttr(ShareDefine.Def_IudetHeroTalentIDAwakeRand) GameWorld.DebugLog("selectTalentID=%s,selectTalentLV=%s,idList=%s,lvList=%s" % (selectTalentID, selectTalentLV, idList, lvList)) singleItem.ClearUserAttr(ShareDefine.Def_IudetHeroTalentID) singleItem.ClearUserAttr(ShareDefine.Def_IudetHeroTalentIDLV) for index, talentID in enumerate(idList): singleItem.AddUserAttr(ShareDefine.Def_IudetHeroTalentID, talentID) singleItem.AddUserAttr(ShareDefine.Def_IudetHeroTalentIDLV, lvList[index]) unlockTalentSlotByAwake(singleItem) if isSync: heroItem.Sync_Item() PlayerOnline.GetOnlinePlayer(curPlayer).OnHeroItemUpate(heroItem) # Ñ¡ÔñÌ츳 return #// B2 35 Î佫ϴÁ¶ #tagCSHeroWash # #struct tagCSHeroWash #{ # tagHead Head; # WORD ItemIndex; //Î佫ÎïÆ·ËùÔÚÎ佫±³°üλÖÃË÷Òý # BYTE LockCnt; # BYTE LockTalentIndexs[LockCnt]; //Ëø¶¨Ì츳Ë÷ÒýÁбí # BYTE OPType; // ²Ù×÷ÀàÐÍ£º0-Ö´ÐÐÏ´Á¶£»1-Ìæ»»Ô­Ì츳£»2-±£ÁôÔ­Ì츳 #}; def OnHeroWash(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) itemIndex = clientData.ItemIndex lockTalentIndexs = clientData.LockTalentIndexs opType = clientData.OPType heroItem = GetHeroItem(curPlayer, itemIndex) if not heroItem: return if opType == 1: HeroTalentWashReplace(curPlayer, itemIndex, heroItem) elif opType == 2: heroItem.ClearUserAttr(ShareDefine.Def_IudetHeroTalentWashID) else: HeroTalentWash(curPlayer, itemIndex, heroItem, lockTalentIndexs) return def HeroTalentWash(curPlayer, itemIndex, heroItem, lockTalentIndexs): ## Î佫ϴÁ¶ heroID = heroItem.GetItemTypeID() GameWorld.DebugLog("Î佫ϴÁ¶: itemIndex=%s,heroID=%s,lockTalentIndexs=%s" % (itemIndex, heroID, lockTalentIndexs)) washIDCnt = heroItem.GetUserAttrCount(ShareDefine.Def_IudetHeroTalentWashID) if washIDCnt: GameWorld.ErrLog("Î佫ϴÁ¶½á¹ûδ´¦Àí£¬ÎÞ·¨Ï´Á¶! washIDCnt=%s" % washIDCnt) return washItemID = IpyGameDataPY.GetFuncCfg("HeroWash", 1) lockCostItemList = IpyGameDataPY.GetFuncEvalCfg("HeroWash", 2) if not lockCostItemList: return singleItem = heroItem.GetItem() idCount = singleItem.GetUserAttrCount(ShareDefine.Def_IudetHeroTalentID) for lockIndex in lockTalentIndexs[::-1]: if lockIndex >= idCount: lockTalentIndexs.remove(lockIndex) GameWorld.DebugLog("È¥³ý²»´æÔÚµÄËø¶¨Ë÷Òý: lockIndex=%s" % lockIndex) lockCnt = len(lockTalentIndexs) washCostItemCount = lockCostItemList[lockCnt] if len(lockCostItemList) > lockCnt else lockCostItemList[-1] GameWorld.DebugLog("washItemID=%s,washCostItemCount=%s,lockTalentIndexs=%s" % (washItemID, washCostItemCount, lockTalentIndexs)) itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem) hasEnough, washItemIndexList = ItemCommon.GetItem_FromPack_ByID(washItemID, itemPack, washCostItemCount) if not hasEnough: GameWorld.DebugLog("Ï´Á¶²ÄÁϲ»×㣬Î佫ÎÞ·¨Ï´Á¶! washItemID=%s,washCostItemCount=%s" % (washItemID, washCostItemCount)) return ItemCommon.ReduceItem(curPlayer, itemPack, washItemIndexList, washCostItemCount, True, "HeroTalentWash") washIDList = [] for index in range(idCount): if index in lockTalentIndexs: talentID = singleItem.GetUserAttrByIndex(ShareDefine.Def_IudetHeroTalentID, index) washIDList.append(talentID) else: washIDList.append(0) GameWorld.DebugLog("Ï´Á¶Ç°: %s" % (washIDList)) idWeightDict = {} talentWeightList = [] ipyDataMgr = IpyGameDataPY.IPY_Data() for index in range(ipyDataMgr.GetHeroTalentCount()): talentIpyData = ipyDataMgr.GetHeroTalentByIndex(index) talentID = talentIpyData.GetTalentID() if talentID in washIDList: # Ì츳ID²»¿ÉÖØ¸´ continue weight = talentIpyData.GetWashWeight() talentWeightList.append([weight, talentID]) idWeightDict[talentID] = weight for index, talentID in enumerate(washIDList): if talentID: continue randTalentID = GameWorld.GetResultByWeightList(talentWeightList) if not randTalentID: continue # ÒÆ³ýÈ·±£²»Öظ´ randWeightID = [idWeightDict.get(randTalentID, 0), randTalentID] if randWeightID in talentWeightList: talentWeightList.remove(randWeightID) washIDList[index] = randTalentID GameWorld.DebugLog("Ï´Á¶ºó: %s" % (washIDList)) singleItem.ClearUserAttr(ShareDefine.Def_IudetHeroTalentWashID) for talentID in washIDList: singleItem.AddUserAttr(ShareDefine.Def_IudetHeroTalentWashID, talentID) singleItem.ClearUserAttr(ShareDefine.Def_IudetHeroTalentWashLock) for index in lockTalentIndexs: singleItem.AddUserAttr(ShareDefine.Def_IudetHeroTalentWashLock, index) heroItem.Sync_Item() GameWorld.DebugLog("Î佫ϴÁ¶½á¹û! itemIndex=%s,heroID=%s,washIDList=%s,lockTalentIndexs=%s" % (itemIndex, heroID, washIDList, lockTalentIndexs)) OpenServerActivity.AddOSAValue(curPlayer, ShareDefine.Def_BT_OSA_HeroTrain, washCostItemCount) OpenServerActivity.UpdOSA_HeroTrainBillboard(curPlayer) # Ï´Á¶ return def HeroTalentWashReplace(curPlayer, itemIndex, heroItem): ## Î佫ϴÁ¶Ìæ»» heroID = heroItem.GetItemTypeID() singleItem = heroItem.GetItem() idCount = singleItem.GetUserAttrCount(ShareDefine.Def_IudetHeroTalentWashID) if not idCount: GameWorld.ErrLog("Î佫ûÓÐÏ´Á¶²»ÐèÒªÌæ»»! itemIndex=%s,heroID=%s" % (itemIndex, heroID)) return washIDList = [] singleItem.ClearUserAttr(ShareDefine.Def_IudetHeroTalentID) for index in range(idCount): talentID = singleItem.GetUserAttrByIndex(ShareDefine.Def_IudetHeroTalentWashID, index) washIDList.append(talentID) singleItem.AddUserAttr(ShareDefine.Def_IudetHeroTalentID, talentID) singleItem.ClearUserAttr(ShareDefine.Def_IudetHeroTalentWashID) heroItem.Sync_Item() GameWorld.DebugLog("Î佫ϴÁ¶Ìæ»»! itemIndex=%s,heroID=%s,washIDList=%s" % (itemIndex, heroID, washIDList)) PlayerOnline.GetOnlinePlayer(curPlayer).OnHeroItemUpate(heroItem) # Ìæ»»Ï´Á¶Ì츳 return #// B2 36 Î佫Ƥ·ô²Ù×÷ #tagCSHeroSkinOP # #struct tagCSHeroSkinOP #{ # tagHead Head; # DWORD HeroID; //Î佫ID # DWORD SkinID; //ʱװID # BYTE OPType; //²Ù×÷ 1-¼¤»î£»2-Ñ¡ÔñÐÎÏó£»3-ÉýÐÇ£»4-Ñ¡ÔñÊôÐÔ # WORD ItemIndex; //Î佫ÎïÆ·ËùÔÚÎ佫±³°üλÖÃË÷Òý£¬½öÅå´÷ʱÓÐЧ #}; def OnHeroSkinOP(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) heroID = clientData.HeroID skinID = clientData.SkinID opType = clientData.OPType itemIndex = clientData.ItemIndex heroIpyData = IpyGameDataPY.GetIpyGameData("Hero", heroID) if not heroIpyData: return skinIDList = heroIpyData.GetSkinIDList() if skinID not in skinIDList: GameWorld.DebugLog("²»´æÔÚ¸ÃÆ¤·ô! heroID=%s,skinID=%s not in %s" % (heroID, skinID, skinIDList)) return skinIndex = skinIDList.index(skinID) if opType == 1: ActiveHeroSkin(curPlayer, heroID, skinID) elif opType == 2: DoHeroWearSkin(curPlayer, itemIndex, skinIndex, False) elif opType == 3: DoHeroSkinStarUP(curPlayer, heroID, skinID) elif opType == 4: DoHeroWearSkin(curPlayer, itemIndex, skinIndex, True) return def DoHeroWearSkin(curPlayer, itemIndex, skinIndex, isSkinAttr): # @param isSkinAttr: ÊÇ·ñÊÇÑ¡ÔñÊôÐԵ쬷´Ö®ÔòΪѡÔñƤ·ôÐÎÏó heroItem = GetHeroItem(curPlayer, itemIndex) if not heroItem: return heroID = heroItem.GetItemTypeID() heroIpyData = IpyGameDataPY.GetIpyGameData("Hero", heroID) if not heroIpyData: return skinIDList = heroIpyData.GetSkinIDList() if skinIndex > 0: # 0µÄΪĬÈÏÆ¤·ô£¬²»×öÏÞÖÆ if skinIndex >= len(skinIDList): GameWorld.DebugLog("¸ÃÎ佫²»´æÔÚ¸ÃÆ¤·ô! heroID=%s,skinIndex=%s" % (heroID, skinIndex)) return skinID = skinIDList[skinIndex] if not GetHeroSkinState(curPlayer, skinID): GameWorld.DebugLog("¸ÃÎ佫Ƥ·ôδ½âËø! heroID=%s,skinIndex=%s" % (heroID, skinIndex)) return GameWorld.DebugLog("Çл»Î佫Ƥ·ô! heroID=%s,skinIndex=%s,isSkinAttr=%s" % (heroID, skinIndex, isSkinAttr)) item = heroItem.GetItem() if not isSkinAttr: item.SetUserAttr(ShareDefine.Def_IudetHeroSkin, skinIndex) else: # Ñ¡ÊôÐÔͬ²½ÐÞ¸ÄÐÎÏó item.SetUserAttr(ShareDefine.Def_IudetHeroSkin, skinIndex) item.SetUserAttr(ShareDefine.Def_IudetHeroSkinAttr, skinIndex) PlayerOnline.GetOnlinePlayer(curPlayer).OnHeroItemUpate(heroItem) # Çл»Æ¤·ôÊôÐÔ heroItem.Sync_Item() return True def GMSetHeroSkin(curPlayer, heroID, skinIndex, isActive=1): heroIpyData = IpyGameDataPY.GetIpyGameData("Hero", heroID) if not heroIpyData: return skinIDList = heroIpyData.GetSkinIDList() if not skinIDList or skinIndex >= len(skinIDList): return skinID = skinIDList[skinIndex] __onHeroSkinActive(curPlayer, heroID, skinID, isActive) return def ActiveHeroSkin(curPlayer, heroID, skinID): skinIpyData = IpyGameDataPY.GetIpyGameData("HeroSkinAttr", skinID) if not skinIpyData: return if GetHeroSkinState(curPlayer, skinID): GameWorld.DebugLog("¸ÃÎ佫Ƥ·ôÒѾ­¼¤»îÁË: heroID=%s,skinID=%s" % (heroID, skinID)) return needItemID = skinIpyData.GetNeedItemID() needItemCnt = 1 costItemIndexList, bindCnt, unBindCnt = ItemCommon.GetPackItemBindStateIndexInfo(curPlayer, needItemID, needItemCnt) lackCnt = needItemCnt - bindCnt - unBindCnt if lackCnt > 0: GameWorld.DebugLog("¼¤»îÎ佫ʱװÎïÆ·²»×ã! heroID=%s,needItemID=%s,needItemCnt=%s,lackCnt=%s" % (heroID, needItemID, needItemCnt, lackCnt)) return ItemCommon.DelCostItemByBind(curPlayer, costItemIndexList, bindCnt, unBindCnt, needItemCnt, "HeroSkin") GameWorld.DebugLog("¼¤»îÎ佫Ƥ·ô: heroID=%s,skinID=%s" % (heroID, skinID), curPlayer.GetPlayerID()) __onHeroSkinActive(curPlayer, heroID, skinID, 1) return def __onHeroSkinActive(curPlayer, heroID, skinID, isActive): SetHeroSkinState(curPlayer, skinID, isActive) Sync_HeroInfo(curPlayer, [heroID]) RefreshLordAttr(curPlayer) # ʱװ¼¤»î - È«ÌåÊôÐÔ return def DoHeroSkinStarUP(curPlayer, heroID, skinID): playerID = curPlayer.GetPlayerID() if not GetHeroSkinState(curPlayer, skinID): GameWorld.DebugLog("¸ÃÎ佫ʱװδ¼¤»î! heroID=%s,skinID=%s" % (heroID, skinID), playerID) return skinIpyData = IpyGameDataPY.GetIpyGameData("HeroSkinAttr", skinID) if not skinIpyData: return starMax = skinIpyData.GetStarMax() curStar = GetHeroSkinStar(curPlayer, skinID) if curStar >= starMax: GameWorld.DebugLog("Î佫ʱװÐǼ¶ÒÑÂú! heroID=%s,skinID=%s,curStar=%s >= %s" % (heroID, skinID, curStar, starMax), playerID) return needItemID = skinIpyData.GetNeedItemID() needItemCnt = 1 if not needItemID or not needItemCnt: return costItemIndexList, bindCnt, unBindCnt = ItemCommon.GetPackItemBindStateIndexInfo(curPlayer, needItemID, needItemCnt) lackCnt = needItemCnt - bindCnt - unBindCnt if lackCnt > 0: GameWorld.DebugLog("Î佫ʱװÉýÐÇÎïÆ·²»×ã! heroID=%s,skinID=%s,needItemID=%s,needItemCnt=%s,lackCnt=%s" % (heroID, skinID, needItemID, needItemCnt, lackCnt)) return ItemCommon.DelCostItemByBind(curPlayer, costItemIndexList, bindCnt, unBindCnt, needItemCnt, "Hero") nextStar = curStar + 1 GameWorld.DebugLog("Î佫ʱװÉýÐÇ! heroID=%s,skinID=%s,nextStar=%s" % (heroID, skinID, nextStar), playerID) SetHeroSkinStar(curPlayer, skinID, nextStar) Sync_HeroInfo(curPlayer, [heroID]) RefreshLordAttr(curPlayer) # ʱװÉýÐÇ - È«ÌåÊôÐÔ return def AutoChangeToSkinPoint(curPlayer, curItem, eventName): ## »ñµÃƤ·ôʱ×Ô¶¯×ª»¯ÎªÆ¤·ôË鯬 # @return: ÊÇ·ñ³É¹¦×ª»¯ itemID = curItem.GetItemTypeID() itemIDSkinIDDict = GetItemHeroSkinIDDict() if itemID not in itemIDSkinIDDict: #GameWorld.DebugLog("·ÇÎ佫Ƥ·ôÎïÆ·²»´¦Àí! itemID=%s not in %s" % (itemID, itemIDSkinIDDict)) return skinID = itemIDSkinIDDict[itemID] if not GetHeroSkinState(curPlayer, skinID): #GameWorld.DebugLog("¸ÃÎ佫Ƥ·ôδ¼¤»î²»´¦Àíת»¯: itemID=%s,skinID=%s" % (itemID, skinID)) return curStar = GetHeroSkinStar(curPlayer, skinID) ipyData = IpyGameDataPY.GetIpyGameData("HeroSkinAttr", skinID) if not ipyData: return starMax = ipyData.GetStarMax() if starMax and curStar < starMax: #GameWorld.DebugLog("Î佫Ƥ·ôδÂúÐÇÔݲ»×ª»¯! itemID=%s,skinID=%s,curStar=%s < %s" % (itemID, skinID, curStar, starMax)) return skinQuality = ipyData.GetSkinQuality() skinQualityPointDict = IpyGameDataPY.GetFuncEvalCfg("HeroSkin", 1, {}) if str(skinQuality) not in skinQualityPointDict: return changePoint = skinQualityPointDict[str(skinQuality)] itemCount = ItemControler.GetItemCount(curItem) addDataDict = {"ItemID":itemID, "ItemCount":itemCount, "SkinID":skinID} moneyType = ShareDefine.TYPE_Price_SkinPoint moneyValue = changePoint * itemCount GameWorld.DebugLog("Î佫Ƥ·ô²»ÐèÒªÔÙÉýÐÇÁË×Ô¶¯×ª»¯ÎªÆ¤·ôË鯬! itemID=%s,skinID=%s,skinQuality=%s,moneyValue=%s,itemCount=%s" % (itemID, skinID, skinQuality, moneyValue, itemCount)) if not PlayerControl.GiveMoney(curPlayer, moneyType, moneyValue, eventName, addDataDict, notifyAward=False): return curItem.Clear() if eventName: isBind = ItemControler.GetIsBindValue(srcSign=ChConfig.ItemSrcSign_HeroSkinChange) ItemControler.NotifyGiveAwardInfo(curPlayer, [], eventName, moneyInfo={moneyType:[moneyValue, isBind]}, dataEx=itemID) return True def GetItemHeroSkinIDDict(): ## »ñÈ¡ÎïÆ·ID¶ÔӦƤ·ôIDÐÅÏ¢ itemIDSkinIDDict = IpyGameDataPY.GetConfigEx("itemIDSkinIDDict") if not itemIDSkinIDDict: itemIDSkinIDDict = {} ipyDataMgr = IpyGameDataPY.IPY_Data() for index in range(ipyDataMgr.GetHeroSkinAttrCount()): ipyData = ipyDataMgr.GetHeroSkinAttrByIndex(index) skinID = ipyData.GetSkinID() skinItemID = ipyData.GetNeedItemID() itemIDSkinIDDict[skinItemID] = skinID IpyGameDataPY.SetConfigEx("itemIDSkinIDDict", itemIDSkinIDDict) GameWorld.DebugLog("¼ÓÔØÎïÆ·ID¶ÔÓ¦Î佫Ƥ·ôID: %s" % itemIDSkinIDDict) return itemIDSkinIDDict #// B2 37 Î佫ͼ¼ø¼¤»îÉý¼¶ #tagCSHeroBookUP # #struct tagCSHeroBookUP #{ # tagHead Head; # DWORD HeroID; //Î佫ID # WORD ItemIndex; //¹ØÁªÎ佫ÎïÆ·ËùÔÚÎ佫±³°üË÷Òý£¬¼¤»îʱ¿É²»Ó÷¢ # BYTE BookType; //ͼ¼ø¼¤»îÀàÐÍ£º 0-³õʼ¼¤»î£»1-ÐǼ¶Éý¼¶£»2-Í»ÆÆµÈ¼¶Éý¼¶ #}; def OnHeroBookUP(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) heroID = clientData.HeroID bookType = clientData.BookType if bookType == 1: pass #__doHeroBookStarLVUP(curPlayer, heroID) elif bookType == 2: pass #__doHeroBookBreakLVUP(curPlayer, heroID) else: __doHeroBookAct(curPlayer, heroID) return def GetHeroBookActCnt(curPlayer): ## »ñÈ¡Î佫ͼ¼øÒѼ¤»îÊýÁ¿ bookCnt = 0 ipyDataMgr = IpyGameDataPY.IPY_Data() for index in range(ipyDataMgr.GetHeroCount()): ipyData = ipyDataMgr.GetHeroByIndex(index) heroID = ipyData.GetHeroID() if not ipyData.GetPlayerCanUse(): continue if not GetHeroBookInitState(curPlayer, heroID): continue bookCnt += 1 return bookCnt def __doHeroBookAct(curPlayer, heroID): ## ͼ¼ø¼¤»î playerID = curPlayer.GetPlayerID() if GetHeroBookInitState(curPlayer, heroID): GameWorld.DebugLog("¸ÃÎ佫ͼ¼øÒѼ¤»î! heroID=%s" % heroID, playerID) return GameWorld.DebugLog("Î佫ͼ¼ø¼¤»î! heroID=%s" % heroID, playerID) heroIpyData = IpyGameDataPY.GetIpyGameData("Hero", heroID) if not heroIpyData: return quality = heroIpyData.GetQuality() qualityIpyData = IpyGameDataPY.GetIpyGameData("HeroQuality", quality) if not qualityIpyData: return if GetHeroActivite(curPlayer, heroID) != 1: GameWorld.DebugLog("Î佫δ»ñµÃ¹ý£¬²»¿É¼¤»îͼ¼ø! heroID=%s" % (heroID), playerID) return SetHeroBookInitState(curPlayer, heroID, 1) awardMoneyInfo = qualityIpyData.GetBookActAwardMoney() if awardMoneyInfo and len(awardMoneyInfo) == 2: moneyType, moneyValue = awardMoneyInfo if moneyType and moneyValue: PlayerControl.GiveMoney(curPlayer, moneyType, moneyValue, "HeroBookAct", notifyAward=True) Sync_HeroInfo(curPlayer, [heroID]) bookCnt = GetHeroBookActCnt(curPlayer) PlayerTask.UpdTaskValue(curPlayer, ChConfig.TaskType_HeroBook) PlayerSuccess.UptateSuccessProgress(curPlayer, ShareDefine.SuccType_OSAHeroBook, bookCnt) return #// B2 38 Îä½«Ëø¶¨ #tagCSHeroLock # #struct tagCSHeroLock #{ # tagHead Head; # WORD ItemIndex; //Î佫ÎïÆ·ËùÔÚÎ佫±³°üλÖÃË÷Òý # BYTE IsLock; //0-½âËø£»1-Ëø¶¨ #}; def OnHeroLock(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) itemIndex = clientData.ItemIndex isLock = clientData.IsLock heroItem = GetHeroItem(curPlayer, itemIndex) if not heroItem: return heroItem.SetIsLocked(1 if isLock else 0) return #// B2 39 Î佫֨Éú #tagCSHeroRebirth # #struct tagCSHeroRebirth #{ # tagHead Head; # WORD ItemIndex; //Î佫ÎïÆ·ËùÔÚÎ佫±³°üλÖÃË÷Òý # BYTE LVReset; //ÖØÖõȼ¶ # BYTE BreakReset; //ÖØÖÃÍ»ÆÆ # BYTE AwakeReset; //ÖØÖþõÐÑ #}; def OnHeroRebirth(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) itemIndex = clientData.ItemIndex lvReset = clientData.LVReset breakReset = clientData.BreakReset or lvReset # Í»ÆÆÊܵȼ¶ÏÞÖÆ£¬ËùÒԵȼ¶ÖØÖÃÍ»ÆÆ±ØÖØÖà awakeReset = clientData.AwakeReset heroItem = GetHeroItem(curPlayer, itemIndex) if not heroItem: return heroLV = heroItem.GetUserAttr(ShareDefine.Def_IudetHeroLV) breakLV = heroItem.GetUserAttr(ShareDefine.Def_IudetHeroBreakLV) awakeLV = heroItem.GetUserAttr(ShareDefine.Def_IudetHeroAwakeLV) if heroLV <= 1 and not breakLV and not awakeLV: GameWorld.DebugLog("¸ÃÎ佫δ½øÐйýµÈ¼¶Í»ÆÆ¾õÐÑÅàÑø£¬²»ÐèÒªÖØÉú! itemIndex=%s" % (itemIndex)) return if awakeReset and awakeLV: rebirthCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroAwakeRebirthCnt) rebirthCntMax = IpyGameDataPY.GetFuncCfg("HeroRebirth", 2) if rebirthCntMax and rebirthCnt >= rebirthCntMax: GameWorld.DebugLog("½ñÈÕ¾õÐѹýµÄÎ佫֨Éú´ÎÊýÒÑ´ïÉÏÏÞ! rebirthCnt=%s >= %s" % (rebirthCnt, rebirthCntMax)) return heroID = heroItem.GetItemTypeID() heroIpyData = IpyGameDataPY.GetIpyGameData("Hero", heroID) if not heroIpyData: return quality = heroIpyData.GetQuality() lvCostMoney = 0 breakCostMoney = 0 awakeCostMoney = 0 moneyType = IpyGameDataPY.GetFuncCfg("HeroRebirth", 1) if awakeReset and awakeLV: qualityAwakeIpyData = IpyGameDataPY.GetIpyGameDataNotLog("HeroQualityAwake", quality, awakeLV) awakeCostMoney = qualityAwakeIpyData.GetRebirthCostMoney() if qualityAwakeIpyData else 0 if lvReset: lvCostMoney = int(max(0, eval(IpyGameDataPY.GetFuncCompileCfg("HeroRebirth", 3)))) if breakReset: breakCostMoney = int(max(0, eval(IpyGameDataPY.GetFuncCompileCfg("HeroRebirth2", 1)))) costMoneyTotal = lvCostMoney + awakeCostMoney + breakCostMoney GameWorld.DebugLog("Î佫֨Éú: itemIndex=%s,heroID=%s,quality=%s,heroLV=%s,breakLV=%s,awakeLV=%s,costMoneyTotal=%s(lv:%s+b:%s+a:%s),lvReset=%s,breakReset=%s,awakeReset=%s" % (itemIndex, heroID, quality, heroLV, breakLV, awakeLV, costMoneyTotal, lvCostMoney, breakCostMoney, awakeCostMoney, lvReset, breakReset, awakeReset)) if moneyType and costMoneyTotal and not PlayerControl.HaveMoney(curPlayer, moneyType, costMoneyTotal): return # Ñé֤ͨ¹ý£¬¿ÉÒÔÖØÉú ratio = IpyGameDataPY.GetFuncCfg("HeroRebirth", 4) returnItemDict = {} if lvReset: __calcHeroLVReturnitem(quality, heroLV, returnItemDict, ratio) if breakReset: __calcHeroBreakReturnitem(quality, breakLV, returnItemDict, ratio) if awakeReset: __calcHeroAwakeReturnitem(quality, awakeLV, returnItemDict, ratio) if moneyType and costMoneyTotal and not PlayerControl.PayMoney(curPlayer, moneyType, costMoneyTotal, "HeroRebirth"): return # Ö´ÐÐÖØÉú item = heroItem.GetItem() if lvReset: item.SetUserAttr(ShareDefine.Def_IudetHeroLV, 1) if breakReset: item.SetUserAttr(ShareDefine.Def_IudetHeroBreakLV, 0) if awakeReset: item.SetUserAttr(ShareDefine.Def_IudetHeroAwakeLV, 0) heroItem.Sync_Item() if returnItemDict: returnItemList = [[k, v] for k, v in returnItemDict.items()] ItemControler.GivePlayerItemOrMail(curPlayer, returnItemList, event=["HeroRebirth", False, {}]) if awakeReset and awakeLV: rebirthCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroAwakeRebirthCnt) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HeroAwakeRebirthCnt, rebirthCnt + 1) Sync_PlayerHeroInfo(curPlayer) PlayerOnline.GetOnlinePlayer(curPlayer).OnHeroItemUpate(heroItem) # ÖØÉú return def __calcHeroLVReturnitem(quality, heroLV, returnItemDict, ratio): ## ¼ÆËãÎ佫µÈ¼¶·µ»¹ returnDict = {} for retLV in range(1, heroLV): qualityLVIpyData = IpyGameDataPY.GetIpyGameData("HeroQualityLV", quality, retLV) if not qualityLVIpyData: continue costItemInfo = qualityLVIpyData.GetUPCostItem() if not costItemInfo: continue costItemID, costItemCount = costItemInfo costItemCount = max(1, int(costItemCount * ratio / 100.0)) returnItemDict[costItemID] = returnItemDict.get(costItemID, 0) + costItemCount returnDict[costItemID] = returnDict.get(costItemID, 0) + costItemCount GameWorld.DebugLog(" µÈ¼¶·µ»¹: quality=%s,heroLV=%s,ratio=%s,%s,×Ü%s" % (quality, heroLV, ratio, returnDict, returnItemDict)) return def __calcHeroBreakReturnitem(quality, breakLV, returnItemDict, ratio): # ¼ÆËãÎä½«Í»ÆÆ·µ»¹ returnDict = {} for retBreakLV in range(0, breakLV): qualityBreakIpyData = IpyGameDataPY.GetIpyGameData("HeroQualityBreak", quality, retBreakLV) if not qualityBreakIpyData: continue costItemList = qualityBreakIpyData.GetUPCostItemList() if not costItemList: continue for costItemID, costItemCount in costItemList: costItemCount = max(1, int(costItemCount * ratio / 100.0)) returnItemDict[costItemID] = returnItemDict.get(costItemID, 0) + costItemCount returnDict[costItemID] = returnDict.get(costItemID, 0) + costItemCount GameWorld.DebugLog(" Í»ÆÆ·µ»¹: quality=%s,breakLV=%s,ratio=%s,%s,×Ü%s" % (quality, breakLV, ratio, returnDict, returnItemDict)) return def __calcHeroAwakeReturnitem(quality, awakeLV, returnItemDict, ratio): # ¼ÆËãÎ佫¾õÐÑ·µ»¹ returnDict = {} for retAwakeLV in range(0, awakeLV): qualityAwakeIpyData = IpyGameDataPY.GetIpyGameData("HeroQualityAwake", quality, retAwakeLV) if not qualityAwakeIpyData: continue costItemInfo = qualityAwakeIpyData.GetUPCostItem() if not costItemInfo: continue costItemID, costItemCount = costItemInfo costItemCount = max(1, int(costItemCount * ratio / 100.0)) returnItemDict[costItemID] = returnItemDict.get(costItemID, 0) + costItemCount returnDict[costItemID] = returnDict.get(costItemID, 0) + costItemCount GameWorld.DebugLog(" ¾õÐÑ·µ»¹: quality=%s,awakeLV=%s,ratio=%s,%s,×Ü%s" % (quality, awakeLV, ratio, returnDict, returnItemDict)) return #// B2 40 Î佫Dzɢ #tagCSHeroDismiss # #struct tagCSHeroDismiss #{ # tagHead Head; # WORD Count; # WORD ItemIndexList[Count]; // Î佫ÎïÆ·ËùÔÚÎ佫±³°üλÖÃË÷ÒýÁбí #}; def OnHeroDismiss(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) itemIndexList = clientData.ItemIndexList GameWorld.DebugLog("Î佫Dzɢ: itemIndexList=%s" % itemIndexList) ratio = IpyGameDataPY.GetFuncCfg("HeroRebirth", 5) dismissItemList = [] returnItemDict = {} returnItemExDict = {} curPack = curPlayer.GetItemManager().GetPack(ShareDefine.rptHero) for itemIndex in itemIndexList: if itemIndex < 0 or itemIndex >= curPack.GetCount(): continue heroItem = curPack.GetAt(itemIndex) if not heroItem or heroItem.IsEmpty(): continue awakeLV = heroItem.GetUserAttr(ShareDefine.Def_IudetHeroAwakeLV) if awakeLV: GameWorld.DebugLog("¾õÐѹýµÄÎ佫ÐèÏÈÖØÉúºó²Å¿ÉDzɢ! itemIndex=%s,awakeLV=%s" % (itemIndex, awakeLV)) continue if heroItem.GetIsLocked(): GameWorld.DebugLog("Ëø¶¨µÄÎ佫ÎÞ·¨Ç²É¢! itemIndex=%s" % (itemIndex)) continue lineupCount = heroItem.GetUserAttrCount(ShareDefine.Def_IudetHeroLineup) if lineupCount: lineupValueList = [heroItem.GetUserAttrByIndex(ShareDefine.Def_IudetHeroLineup, lpIndex) for lpIndex in range(lineupCount)] GameWorld.DebugLog("ÉÏÕóÖеÄÎ佫ÎÞ·¨Ç²É¢! itemIndex=%s,lineupValueList=%s" % (itemIndex, lineupValueList)) continue heroID = heroItem.GetItemTypeID() effPresetIDList = GetHeroEffPresetIDList(heroItem) if effPresetIDList: GameWorld.DebugLog("ÉúЧÖеĿ¨ÅÆÎÞ·¨Ç²É¢! itemIndex=%s,heroID=%s,effPresetIDList=%s" % (itemIndex, heroID, effPresetIDList)) continue heroIpyData = IpyGameDataPY.GetIpyGameData("Hero", heroID) if not heroIpyData: continue quality = heroIpyData.GetQuality() heroLV = heroItem.GetUserAttr(ShareDefine.Def_IudetHeroLV) breakLV = heroItem.GetUserAttr(ShareDefine.Def_IudetHeroBreakLV) heroStar = heroItem.GetUserAttr(ShareDefine.Def_IudetHeroStar) qualityIpyData = IpyGameDataPY.GetIpyGameData("HeroQuality", quality) if not qualityIpyData: continue GameWorld.DebugLog("Dzɢ: itemIndex=%s,heroID=%s,quality=%s,heroLV=%s,breakLV=%s,heroStar=%s" % (itemIndex, heroID, quality, heroLV, breakLV, heroStar)) dismissReturnItems = qualityIpyData.GetDismissReturnItems() for itemID, itemCount in dismissReturnItems: starRetCnt = max(1, int((heroStar + 1) * itemCount * ratio / 100.0)) returnItemDict[itemID] = returnItemDict.get(itemID, 0) + starRetCnt GameWorld.DebugLog(" ÐǼ¶·µ»¹: quality=%s,heroStar=%s,ratio=%s,%s,×Ü%s" % (quality, heroStar, ratio, dismissReturnItems, returnItemDict)) __calcHeroLVReturnitem(quality, heroLV, returnItemDict, ratio) __calcHeroBreakReturnitem(quality, breakLV, returnItemDict, ratio) __calcHeroQualityReturnItemEx(curPlayer, qualityIpyData, returnItemExDict) dismissItemList.append([itemIndex, heroItem]) if not dismissItemList: return for itemIndex, heroItem in dismissItemList: ItemCommon.DelItem(curPlayer, heroItem, heroItem.GetCount(), False, "HeroDismiss") if returnItemDict: returnItemList = [[k, v] for k, v in returnItemDict.items()] for key, itemCount in returnItemExDict.items(): itemID, isBind = key returnItemList.append([itemID, itemCount, isBind]) GameWorld.DebugLog("Dzɢ×Ü·µ»¹: %s" % returnItemList) ItemControler.GivePlayerItemOrMail(curPlayer, returnItemList, event=["HeroDismiss", False, {}]) return def __calcHeroQualityReturnItemEx(curPlayer, qualityIpyData, returnItemExDict): ## ÆäËû¹¦ÄܶîÍâ·µ»¹ returnItemsEx = qualityIpyData.GetReturnItemsEx() if not returnItemsEx: return # ºìÑÕÌØÊâЧ¹û: Dzɢ/ÍÌÊɶîÍâ·µ»¹°Ù·Ö±È isBind = ItemControler.GetIsBindValue(srcSign=ChConfig.ItemSrcSign_BeautyEff) retPer = PlayerBeauty.GetBeautyEffInfo(curPlayer, PlayerBeauty.EffType_HeroItemExPer)[0] for itemID, itemCount in returnItemsEx: if not retPer: break key = (itemID, isBind) retCnt = max(1, int(math.ceil(itemCount * retPer / 100.0))) returnItemExDict[key] = returnItemExDict.get(key, 0) + retCnt GameWorld.DebugLog(" ºìÑÕ·µ»¹: retPer=%s,%s,×Ü%s" % (retPer, returnItemsEx, returnItemExDict)) # ³ÆºÅÌØÊâЧ¹û: Dzɢ/ÍÌÊɶîÍâ·µ»¹°Ù·Ö±È isBind = ItemControler.GetIsBindValue(srcSign=ChConfig.ItemSrcSign_TitleEff) retPer = PlayerHJG.GetTitleEffInfo(curPlayer, PlayerHJG.TitleEff_HeroItemExPer)[0] for itemID, itemCount in returnItemsEx: if not retPer: break key = (itemID, isBind) retCnt = max(1, int(math.ceil(itemCount * retPer / 100.0))) returnItemExDict[key] = returnItemExDict.get(key, 0) + retCnt GameWorld.DebugLog(" ³ÆºÅ·µ»¹: retPer=%s,%s,×Ü%s" % (retPer, returnItemsEx, returnItemExDict)) return #// B4 12 Õ½¶·ÕóÈÝÔ¤Éè±£´æ #tagCSHeroPresetSave # #struct tagCSHeroPresetPos #{ # WORD ItemIndex; //Î佫ÎïÆ·ËùÔÚÎ佫±³°üλÖÃË÷Òý # BYTE PosNum; //1~nÉÏÕóλÖñàºÅ #}; # #struct tagCSHeroPresetSave #{ # tagHead Head; # BYTE PresetID; //ÕóÈÝ·½°¸Ô¤ÉèID # BYTE PosCnt; # tagCSHeroPresetPos HeroPosList[PosCnt]; // ±£´æµÄÕóÈÝ£¬Ö»·¢ËÍ×îÖÕµÄÕóÈÝÎ佫λÖü´¿É #}; def OnHeroPresetSave(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) presetID = clientData.PresetID shapeType = 0#clientData.ShapeType heroPosList = clientData.HeroPosList itemIndexPosDict = {} for posInfo in heroPosList: posNum = posInfo.PosNum itemIndex = posInfo.ItemIndex itemIndexPosDict[itemIndex] = posNum DoSaveHeroPreset(curPlayer, presetID, itemIndexPosDict, shapeType) return def DoSaveHeroPreset(curPlayer, presetID, itemIndexPosDict, shapeType=0): if not PlayerPreset.GetFuncPresetIDState(curPlayer, presetID, ShareDefine.FuncPreset_Hero): GameWorld.DebugLog("¸ÃÎ佫ÕóÈÝÔ¤Éè²»¿ÉÓÃ! presetID=%s" % presetID) return heroPosDict = {} indexList = [] for itemIndex, posNum in itemIndexPosDict.items(): if itemIndex in indexList: # µ¥Î佫ֻÄÜÒ»¸öλÖã¬Ò»¸öλÖÃÖ»ÄܶÔӦΨһÎ佫µ¥Î» continue indexList.append(itemIndex) heroPosDict[posNum] = itemIndex GameWorld.DebugLog("±£´æÎ佫ԤÉèÕóÈÝ: presetID=%s, %s" % (presetID, heroPosDict), curPlayer.GetPlayerID()) curPack = curPlayer.GetItemManager().GetPack(ShareDefine.rptHero) # Ö±½ÓÖØÖþÉÕóÐÍ delCount = 0 syncItemDict = {} for index in range(curPack.GetCount()): heroItem = curPack.GetAt(index) if not heroItem or heroItem.IsEmpty(): continue lineupCount = heroItem.GetUserAttrCount(ShareDefine.Def_IudetHeroLineup) if not lineupCount: continue item = heroItem.GetItem() for lpIndex in range(lineupCount)[::-1]: lineupValue = item.GetUserAttrByIndex(ShareDefine.Def_IudetHeroLineup, lpIndex) if GetLineupValue(lineupValue)[0] != presetID: continue item.DelUserAttr(ShareDefine.Def_IudetHeroLineup, lineupValue) delCount += 1 if delCount >= ShareDefine.LineupObjMax: break syncItemDict[index] = heroItem # ¸üÐÂÐÂÕóÐÍ heroIDList = [] heroItemDict = {} for posNum, itemIndex in heroPosDict.items(): if itemIndex < 0 or itemIndex >= curPack.GetCount(): continue heroItem = curPack.GetAt(itemIndex) if not heroItem or heroItem.IsEmpty(): continue itemID = heroItem.GetItemTypeID() if itemID in heroIDList: GameWorld.DebugLog("ͬ¸öÎ佫ֻÄÜÉÏÕóÒ»¸ö! itemIndex=%s,itemID=%s" % (itemIndex, itemID)) continue heroIDList.append(itemID) item = heroItem.GetItem() lineupValue = ComLineupValue(presetID, shapeType, posNum) item.AddUserAttr(ShareDefine.Def_IudetHeroLineup, lineupValue) if itemIndex not in syncItemDict: syncItemDict[itemIndex] = heroItem heroItemDict[itemIndex] = posNum # Ô¼¶¨ËùÓб³°üÓÉǰ¶Ë×ÔÐÐÅÅÐò for syncItem in syncItemDict.values(): syncItem.Sync_Item() PlayerOnline.GetOnlinePlayer(curPlayer).UpdHeroItemPreset(presetID, heroItemDict, shapeType) return def ComLineupValue(lineupID, shapeType, posNum): return lineupID * 10000 + shapeType * 100 + posNum def GetLineupValue(lineupValue): lineupID = lineupValue / 10000 shapeType = lineupValue % 10000 / 100 posNum = lineupValue % 100 return lineupID, shapeType, posNum #def ResetHeroPack(curPlayer): # tick = GameWorld.GetGameWorld().GetTick() # curPlayer.SetResetItemTick(0) # ItemControler.ResetItem(curPlayer, ShareDefine.rptHero, 0, 0, tick) # return def GetLineupRecommendAward(curPlayer, recommendID, index): ## ÁìÈ¡ÕóÈÝÍÆ¼ö½±Àø index = GameWorld.ToIntDef(index) awardState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroRecommend % recommendID) if awardState & pow(2, index): GameWorld.DebugLog("ÕóÈÝÍÆ¼ö½±ÀøÒÑÁìÈ¡! recommendID=%s,index=%s" % (recommendID, index)) return ipyData = IpyGameDataPY.GetIpyGameData("LineupRecommend", recommendID) if not ipyData: return heroIDList = ipyData.GetHeroIDList() if index >= len(heroIDList): return heroID = heroIDList[index] heroIpyData = IpyGameDataPY.GetIpyGameData("Hero", heroID) if not heroIpyData: return quality = heroIpyData.GetQuality() qualityIpyData = IpyGameDataPY.GetIpyGameData("HeroQuality", quality) if not qualityIpyData: return awardMoneyInfo = qualityIpyData.GetRecommendAwardMoney() if not awardMoneyInfo or len(awardMoneyInfo) != 2: return moneyType, moneyValue = awardMoneyInfo if not GetHeroActivite(curPlayer, heroID): GameWorld.DebugLog("Î佫δ»ñµÃ¹ý£¬²»¿É¼¤»îÕóÈÝÍÆ¼ö! heroID=%s" % (heroID)) return awardState |= pow(2, index) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HeroRecommend % recommendID, awardState) GameWorld.DebugLog("ÕóÈÝÍÆ¼öÁì½±! recommendID=%s,index=%s,heroID=%s,awardState=%s" % (recommendID, index, heroID, awardState)) PlayerControl.GiveMoney(curPlayer, moneyType, moneyValue, "LineupRecommend", notifyAward=True) Sync_LineupRecommendInfo(curPlayer, [recommendID]) return def GetHeroFatesState(curPlayer, fatesID): # ËÞÔµID״̬: 0-δ¼¤»î£»1-ÒѼ¤»î info = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroFatesInfo % fatesID) return info % 10 def SetHeroFatesState(curPlayer, fatesID, state): info = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroFatesInfo % fatesID) info = info / 10 * 10 + min(state, 9) info = PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HeroFatesInfo % fatesID, info) return info def GetHeroFatesLV(curPlayer, fatesID): # ËÞÔµIDµÈ¼¶ info = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroFatesInfo % fatesID) return info / 10 def SetHeroFatesLV(curPlayer, fatesID, lv): info = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroFatesInfo % fatesID) info = lv * 10 + info % 10 info = PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HeroFatesInfo % fatesID, info) return info #// B2 41 Î佫ËÞÔµ #tagCSHeroFates # #struct tagCSHeroFates #{ # tagHead Head; # BYTE FatesID; // ËÞÔµID # BYTE OPType; // 0-¼¤»îÁì½±£»1-Éý¼¶ # BYTE IndexCnt; # WORD ItemIndexList[IndexCnt]; // Éý¼¶Ê±ÏûºÄµÄ²ÄÁÏ¿¨ÔÚÎ佫±³°üË÷ÒýÁÐ±í£¬Éý¼¶Ê±²Å·¢ #}; def OnHeroFates(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) fatesID = clientData.FatesID opType = clientData.OPType itemIndexList = clientData.ItemIndexList if opType == 1: __onHeroFatesLVUP(curPlayer, fatesID, itemIndexList) else: __onHeroFatesActivite(curPlayer, fatesID) return def __onHeroFatesActivite(curPlayer, fatesID): ## ËÞÔµ¼¤»î if GetHeroFatesState(curPlayer, fatesID): GameWorld.DebugLog("ËÞÔµ×éºÏÒѾ­¼¤»îÁË! fatesID=%s" % fatesID) return ipyData = IpyGameDataPY.GetIpyGameData("HeroFates", fatesID) if not ipyData: return heroIDList = ipyData.GetHeroIDList() for heroID in heroIDList: if not GetHeroActivite(curPlayer, heroID): GameWorld.DebugLog("ÓÐÎ佫δ»ñµÃ¹ý£¬²»¿É¼¤»îËÞÔµ! fatesID=%s,heroID=%s,heroIDList=%s" % (fatesID, heroID, heroIDList)) return GameWorld.DebugLog("¼¤»îËÞÔµ! fatesID=%s,heroIDList=%s" % (fatesID, heroIDList)) SetHeroFatesState(curPlayer, fatesID, 1) itemList = ipyData.GetAwardItemList() ItemControler.GivePlayerItemOrMail(curPlayer, itemList, event=["HeroFates", False, {}]) Sync_HeroFatesInfo(curPlayer, [fatesID]) return def __onHeroFatesLVUP(curPlayer, fatesID, useIndexList): if not GetHeroFatesState(curPlayer, fatesID): GameWorld.DebugLog("ËÞÔµ×éºÏδ¼¤»î! fatesID=%s" % fatesID) return ipyData = IpyGameDataPY.GetIpyGameData("HeroFates", fatesID) if not ipyData: return fatesQuality = ipyData.GetFatesQuality() heroIDList = ipyData.GetHeroIDList() fatesNextLV = GetHeroFatesLV(curPlayer, fatesID) + 1 GameWorld.DebugLog("ËÞÔµÉý¼¶: fatesID=%s,fatesQuality=%s,fatesNextLV=%s,heroIDList=%s,useIndexList=%s" % (fatesID, fatesQuality, fatesNextLV, heroIDList, useIndexList)) qualityLVIpyData = IpyGameDataPY.GetIpyGameData("HeroFatesQualityLV", fatesQuality, fatesNextLV) if not qualityLVIpyData: return needStarTotal = qualityLVIpyData.GetNeedStarTotal() needHeroCnt = qualityLVIpyData.GetNeedHeroCnt() needQuality = qualityLVIpyData.GetNeedQuality() costItemList = [] heroStarDict = {} olPlayer = PlayerOnline.GetOnlinePlayer(curPlayer) curPack = curPlayer.GetItemManager().GetPack(ShareDefine.rptHero) for index in range(curPack.GetCount()): heroItem = curPack.GetAt(index) if not heroItem or heroItem.IsEmpty(): continue heroID = heroItem.GetItemTypeID() # ²ÄÁÏ¿¨ if index in useIndexList: if __checkHeroFatesLVUPItem(olPlayer, needQuality, index, heroItem, heroID): costItemList.append(heroItem) if heroID not in heroIDList: continue if heroID not in heroStarDict: heroStarDict[heroID] = 0 star = heroItem.GetUserAttr(ShareDefine.Def_IudetHeroStar) if star <= heroStarDict[heroID]: continue heroStarDict[heroID] = star nowStarTotal = sum(heroStarDict.values()) if nowStarTotal < needStarTotal: GameWorld.DebugLog(" µ±Ç°×ÜÐǼ¶²»×ã: nowStarTotal=%s < %s, heroStarDict=%s" % (nowStarTotal, needStarTotal, heroStarDict)) return GameWorld.DebugLog(" µ±Ç°×ÜÐǼ¶: nowStarTotal=%s,needStarTotal=%s,heroStarDict=%s" % (nowStarTotal, needStarTotal, heroStarDict)) if len(costItemList) < needHeroCnt: GameWorld.DebugLog(" ¿ÉÓòÄÁÏ¿¨²»×ã: %s < %s" % (len(costItemList), needHeroCnt)) return GameWorld.DebugLog(" ËÞÔµÉý¼¶! needHeroCnt=%s" % needHeroCnt) for heroItem in costItemList[:needHeroCnt]: ItemCommon.DelItem(curPlayer, heroItem, heroItem.GetCount(), False, "HeroFatesLVUP") SetHeroFatesLV(curPlayer, fatesID, fatesNextLV) Sync_HeroFatesInfo(curPlayer, [fatesID]) RefreshLordAttr(curPlayer) # ËÞÔµ return def __checkHeroFatesLVUPItem(olPlayer, needQuality, itemIndex, heroItem, heroID): ## ¼ì²éËÞÔµ²ÄÁÏ¿¨¿É·ñʹÓà heroIpyData = IpyGameDataPY.GetIpyGameData("Hero", heroID) if not heroIpyData: return quality = heroIpyData.GetQuality() if quality != needQuality: GameWorld.DebugLog(" ÓëËÞÔµËùÐèÆ·Öʲ»Í¬µÄ¿¨ÎÞ·¨Ê¹ÓÃ: itemIndex=%s,heroID=%s,quality=%s != %s" % (itemIndex, heroID, quality, needQuality)) return #δÉúЧ¡¢Î´ÉÏÕó¡¢Î´Ëø¶¨¡¢Î´½øÐйýÉý¼¶¡¢Í»ÆÆ¡¢ÉýÐÇ¡¢¾õÐÑ heroLV = heroItem.GetUserAttr(ShareDefine.Def_IudetHeroLV) breakLV = heroItem.GetUserAttr(ShareDefine.Def_IudetHeroBreakLV) starLV = heroItem.GetUserAttr(ShareDefine.Def_IudetHeroStar) awakeLV = heroItem.GetUserAttr(ShareDefine.Def_IudetHeroAwakeLV) if heroLV > 1 or breakLV or starLV or awakeLV: GameWorld.DebugLog(" Éý¼¶Í»ÆÆÉýÐǾõÐѹýµÄÎ佫ÎÞ·¨Ê¹ÓÃ! itemIndex=%s,heroLV=%s,breakLV=%s,starLV=%s,awakeLV=%s" % (itemIndex, heroLV, breakLV, starLV, awakeLV)) return if heroItem.GetIsLocked(): GameWorld.DebugLog(" Ëø¶¨µÄÎ佫ÎÞ·¨Ê¹ÓÃ! itemIndex=%s" % (itemIndex)) return lineupCount = heroItem.GetUserAttrCount(ShareDefine.Def_IudetHeroLineup) if lineupCount: lineupValueList = [heroItem.GetUserAttrByIndex(ShareDefine.Def_IudetHeroLineup, lpIndex) for lpIndex in range(lineupCount)] GameWorld.DebugLog(" ÉÏÕóÖеÄÎ佫ÎÞ·¨Ê¹ÓÃ! itemIndex=%s,lineupValueList=%s" % (itemIndex, lineupValueList)) return heroID = heroItem.GetItemTypeID() effPresetIDList = GetHeroEffPresetIDList(heroItem) if effPresetIDList: GameWorld.DebugLog(" ÉúЧÖеĿ¨ÅÆÎÞ·¨Ê¹ÓÃ! itemIndex=%s,heroID=%s,effPresetIDList=%s" % (itemIndex, heroID, effPresetIDList)) return return True def RefreshLordAttr(curPlayer): ## Ë¢ÐÂÖ÷¹«ÊôÐÔ CalcHeroAddAttr(curPlayer) PlayerOnline.GetOnlinePlayer(curPlayer).RefreshRoleAttr() return def CalcHeroAddAttr(curPlayer): ## ¼ÆËãÎ佫¶ÔÖ÷¹«Ôö¼ÓµÄÊôÐÔ skinAttrDict = {} fatesAttrDict = {} playerID = curPlayer.GetID() ipyDataMgr = IpyGameDataPY.IPY_Data() # Î佫ʱװ for index in range(ipyDataMgr.GetHeroSkinAttrCount()): ipyData = ipyDataMgr.GetHeroSkinAttrByIndex(index) skinID = ipyData.GetSkinID() if not GetHeroSkinState(curPlayer, skinID): continue skinStar = GetHeroSkinStar(curPlayer, skinID) attrIDList = ipyData.GetRoleAttrIDList() attrValueList = ipyData.GetRoleAttrValueList() perStarAddList = ipyData.GetRoleAttrPerStarAddList() for i in range(min(len(attrIDList), len(attrValueList))): attrID = attrIDList[i] attrValuePerStar = perStarAddList[i] if len(perStarAddList) > i else 0 attrValue = attrValueList[i] + attrValuePerStar * skinStar skinAttrDict[attrID] = skinAttrDict.get(attrID, 0) + attrValue GameWorld.DebugLog("ʱװÊôÐÔ: %s" % skinAttrDict, playerID) PlayerOnline.GetOnlinePlayer(curPlayer).SetCalcAttr(ChConfig.Def_CalcAttr_HeroSkin, skinAttrDict) # ËÞÔµ for index in range(ipyDataMgr.GetHeroFatesCount()): ipyData = ipyDataMgr.GetHeroFatesByIndex(index) fatesID = ipyData.GetFatesID() if not GetHeroFatesState(curPlayer, fatesID): continue fatesLV = GetHeroFatesLV(curPlayer, fatesID) if fatesLV <= 0: continue attrIDList = ipyData.GetAttrIDList() lvAttrValueList = ipyData.GetLVAttrValueList() for i in range(min(len(attrIDList), len(lvAttrValueList))): attrID = attrIDList[i] attrValuePerLV = lvAttrValueList[i] attrValue = attrValuePerLV * fatesLV fatesAttrDict[attrID] = fatesAttrDict.get(attrID, 0) + attrValue GameWorld.DebugLog("ËÞÔµÊôÐÔ: %s" % fatesAttrDict, playerID) PlayerOnline.GetOnlinePlayer(curPlayer).SetCalcAttr(ChConfig.Def_CalcAttr_HeroFates, fatesAttrDict) return def Sync_HeroInfo(curPlayer, heroIDList=None): if heroIDList != None: syncHeroIDList = heroIDList else: syncHeroIDList = [] ipyDataMgr = IpyGameDataPY.IPY_Data() for index in range(ipyDataMgr.GetHeroCount()): ipyData = ipyDataMgr.GetHeroByIndex(index) if not ipyData.GetPlayerCanUse(): continue syncHeroIDList.append(ipyData.GetHeroID()) if not syncHeroIDList: return syncInfoList = [] for heroID in syncHeroIDList: heroIpyData = IpyGameDataPY.GetIpyGameData("Hero", heroID) if not heroIpyData: continue if heroIDList == None and not curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroBook % heroID): continue skinIDList = heroIpyData.GetSkinIDList() hero = ChPyNetSendPack.tagSCHero() hero.HeroID = heroID hero.BookInitState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroBook % heroID) % 10 hero.SkinList = [] for skinID in skinIDList[1:]: # µÚ1¸öĬÈϼ¤»îµÄ²»Í¬²½ skin = ChPyNetSendPack.tagSCHeroSkin() skin.SkinID = skinID skin.State = GetHeroSkinState(curPlayer, skinID) skin.Star = GetHeroSkinStar(curPlayer, skinID) hero.SkinList.append(skin) hero.SkinCnt = len(hero.SkinList) syncInfoList.append(hero) if not syncInfoList: return clientPack = ChPyNetSendPack.tagSCHeroInfo() clientPack.HeroInfoList = syncInfoList clientPack.HeroCnt = len(clientPack.HeroInfoList) NetPackCommon.SendFakePack(curPlayer, clientPack) return def Sync_HeroPreset(curPlayer, heroPresetID=None): olPlayer = PlayerOnline.GetOnlinePlayer(curPlayer) if heroPresetID: syncIDList = [heroPresetID] else: syncIDList = olPlayer.GetHeroPresetIDList() presetList = [] for heroPresetID in syncIDList: heroPreset = olPlayer.GetHeroPreset(heroPresetID) if not heroPreset: continue posNumItemIndexDict = {v:k for k, v in heroPreset.heroItemDict.items()} heroItemIndexList = [] # ËùÔÚÎ佫±³°üË÷Òý+1Áбí [վλ1ÎïÆ·Ë÷Òý+1, վλ2, ...]£¬Õ¾Î»ÎÞÎ佫ʱΪ0 for posNum in range(1, 1 + ShareDefine.LineupObjMax): if posNum in posNumItemIndexDict: heroItemIndexList.append(posNumItemIndexDict[posNum] + 1) else: heroItemIndexList.append(0) preset = ChPyNetSendPack.tagSCHeroPreset() preset.PresetID = heroPresetID #preset.ShapeType = heroPreset.shapeType preset.HeroItemIndexList = heroItemIndexList preset.HeroCnt = len(preset.HeroItemIndexList) presetList.append(preset) if not presetList: return clientPack = ChPyNetSendPack.tagSCHeroPresetInfo() clientPack.PresetList = presetList clientPack.PresetCnt = len(clientPack.PresetList) NetPackCommon.SendFakePack(curPlayer, clientPack) return def Sync_PlayerHeroInfo(curPlayer): ## Î佫¹«¹²ÐÅÏ¢ clientPack = ChPyNetSendPack.tagSCPlayerHeroInfo() clientPack.AwakeRebirthCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroAwakeRebirthCnt) NetPackCommon.SendFakePack(curPlayer, clientPack) return def Sync_LineupRecommendInfo(curPlayer, syncIDList=None): recommendList = [] ipyDataMgr = IpyGameDataPY.IPY_Data() for index in range(ipyDataMgr.GetLineupRecommendCount()): ipyData = ipyDataMgr.GetLineupRecommendByIndex(index) recommendID = ipyData.GetRecommendID() awardState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroRecommend % recommendID) if syncIDList != None: if recommendID not in syncIDList: continue elif not awardState: continue recommend = ChPyNetSendPack.tagSCLineupRecommend() recommend.RecommendID = recommendID recommend.AwardState = awardState recommendList.append(recommend) if not recommendList: return clientPack = ChPyNetSendPack.tagSCLineupRecommendInfo() clientPack.RecommendList = recommendList clientPack.Count = len(clientPack.RecommendList) NetPackCommon.SendFakePack(curPlayer, clientPack) return def Sync_HeroFatesInfo(curPlayer, syncIDList=None): fatesList = [] ipyDataMgr = IpyGameDataPY.IPY_Data() for index in range(ipyDataMgr.GetHeroFatesCount()): ipyData = ipyDataMgr.GetHeroFatesByIndex(index) fatesID = ipyData.GetFatesID() state = GetHeroFatesState(curPlayer, fatesID) if syncIDList != None: if fatesID not in syncIDList: continue elif not state: continue fates = ChPyNetSendPack.tagSCHeroFates() fates.FatesID = fatesID fates.State = state fates.FatesLV = GetHeroFatesLV(curPlayer, fatesID) fatesList.append(fates) if not fatesList: return clientPack = ChPyNetSendPack.tagSCHeroFatesInfo() clientPack.FatesList = fatesList clientPack.Count = len(clientPack.FatesList) NetPackCommon.SendFakePack(curPlayer, clientPack) return