| | |
| | | def OnPlayerLogin(curPlayer):
|
| | | Sync_HeroInfo(curPlayer)
|
| | | Sync_PlayerHeroInfo(curPlayer)
|
| | | Sync_LineupRecommendInfo(curPlayer)
|
| | | return
|
| | |
|
| | | def OnPlayerFirstLogin(curPlayer):
|
| | |
| | | return 0
|
| | | InitStarUpper = qualityIpyData.GetInitStarUpper()
|
| | |
|
| | | awakeLV = heroItem.GetUserAttr(ShareDefine.Def_IudetHeroAwakeLV)
|
| | | if not awakeLV:
|
| | | return InitStarUpper
|
| | | |
| | | addStarUpper = 0
|
| | | heroAwakeIpyDataList = IpyGameDataPY.GetIpyGameDataListNotLog("HeroAwake", heroID)
|
| | | if heroAwakeIpyDataList:
|
| | | awakeLV = heroItem.GetUserAttr(ShareDefine.Def_IudetHeroAwakeLV)
|
| | | for ipyData in heroAwakeIpyDataList:
|
| | | if ipyData.GetAwakeLV() > awakeLV:
|
| | | break
|
| | |
| | | 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)
|
| | |
| | | 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" % (idList, lvList))
|
| | | GameWorld.DebugLog("未满级星级天赋ID: %s" % unfullLVIDList)
|
| | | GameWorld.DebugLog("当前星级天赋: idList=%s,lvList=%s,maxUnlockSlot=%s" % (idList, lvList, maxUnlockSlot))
|
| | | GameWorld.DebugLog("未满级星级天赋ID: %s,unfullLVIDListUnlock=%s" % (unfullLVIDList, unfullLVIDListUnlock))
|
| | |
|
| | | # 有空余槽位,优先给空余槽位天赋,额外解锁的槽位是需要先选择的,所以一定不为空,故这里只判断常规槽位即可
|
| | | if 0 in idList:
|
| | |
| | | idList[zeroIndex] = randTalentID
|
| | | lvList[zeroIndex] = 1
|
| | | unfullLVIDList.append(randTalentID)
|
| | | unfullLVIDListUnlock.append(randTalentID)
|
| | | GameWorld.DebugLog("新增星级天赋ID: %s" % (randTalentID))
|
| | | addLV -= 1
|
| | | haveUp = True
|
| | |
| | | for _ in range(addLV):
|
| | | if not unfullLVIDList:
|
| | | break
|
| | | randID = random.choice(unfullLVIDList)
|
| | | # 优先随机已解锁的
|
| | | randID = random.choice(unfullLVIDListUnlock) if unfullLVIDListUnlock else random.choice(unfullLVIDList)
|
| | | if randID not in idList:
|
| | | unfullLVIDList.remove(randID)
|
| | | continue
|
| | | randIndex = idList.index(randID)
|
| | | idLV = lvList[randIndex]
|
| | |
| | | GameWorld.DebugLog("升级星级天赋ID: %s,idLV=%s,index=%s" % (randID, idLV, randIndex))
|
| | |
|
| | | if idLV >= talentMaxLV:
|
| | | unfullLVIDList.remove(randID)
|
| | | GameWorld.DebugLog(" 移除未满级ID: %s,unfullLVIDList=%s" % (randID, unfullLVIDList))
|
| | | 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 awardMoneyInfo and len(awardMoneyInfo) == 2:
|
| | | moneyType, moneyValue = awardMoneyInfo
|
| | | if moneyType and moneyValue:
|
| | | PlayerControl.GiveMoney(curPlayer, moneyType, moneyValue, "HeroBookAct")
|
| | | PlayerControl.GiveMoney(curPlayer, moneyType, moneyValue, "HeroBookAct", notifyAward=True)
|
| | |
|
| | | Sync_HeroInfo(curPlayer, [heroID])
|
| | |
|
| | |
| | | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HeroAwakeRebirthCnt, rebirthCnt + 1)
|
| | | Sync_PlayerHeroInfo(curPlayer)
|
| | |
|
| | | PlayerOnline.GetOnlinePlayer(curPlayer).OnHeroItemUpate([itemIndex])
|
| | | return
|
| | |
|
| | | def __calcHeroLVReturnitem(quality, heroLV, returnItemDict, ratio):
|
| | |
| | | for syncItem in syncItemDict.values():
|
| | | syncItem.Sync_Item()
|
| | |
|
| | | lineup = PlayerOnline.GetOnlinePlayer(curPlayer).GetLineup(lineupID)
|
| | | lineup = PlayerOnline.GetOnlinePlayer(curPlayer).GetLineup(lineupID, False)
|
| | | lineup.UpdLineup(heroItemDict, shapeType)
|
| | | return
|
| | |
|
| | |
| | | # 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 GetHeroActivite(curPlayer, heroID) != 1:
|
| | | 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 RefreshLordAttr(curPlayer):
|
| | | ## 刷新主公属性
|
| | |
| | | for index in range(ipyDataMgr.GetHeroCount()):
|
| | | ipyData = ipyDataMgr.GetHeroByIndex(index)
|
| | | heroID = ipyData.GetHeroID()
|
| | | if not ipyData.GetPlayerCanUse():
|
| | | continue
|
| | | if not GetHeroBookInitState(curPlayer, heroID):
|
| | | # 图鉴未激活
|
| | | continue
|
| | |
| | | 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:
|
| | |
| | | lineupList = []
|
| | | olPlayer = PlayerOnline.GetOnlinePlayer(curPlayer)
|
| | | for lineupID in syncIDList:
|
| | | lineup = olPlayer.GetLineup(lineupID)
|
| | | lineup = olPlayer.GetLineup(lineupID, False)
|
| | | if not lineup:
|
| | | continue
|
| | |
|
| | |
| | | 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
|