| | |
| | | import ChPyNetSendPack
|
| | | import NetPackCommon
|
| | | import PlayerControl
|
| | | import PlayerOnline
|
| | | import GameWorld
|
| | | import ChConfig
|
| | |
|
| | | import random
|
| | |
|
| | | |
| | | 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)
|
| | | 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())
|
| | | |
| | | lineupID = ShareDefine.Lineup_Main
|
| | | shapeType = 0
|
| | | for heroID, posNum in defaultHeroInfo.items():
|
| | | lineupValue = ComLineupValue(lineupID, shapeType, posNum)
|
| | | setAttrDict = {ShareDefine.Def_IudetHeroLineup:[lineupValue]}
|
| | | ItemControler.GivePlayerItem(curPlayer, heroID, 1, False, [ShareDefine.rptHero], setAttrDict=setAttrDict)
|
| | | |
| | | return
|
| | |
|
| | | def InitHeroItem(singleItem):
|
| | |
| | | return 0
|
| | | for lpIndex in range(lineupCount)[::-1]:
|
| | | lineupValue = heroItem.GetUserAttrByIndex(ShareDefine.Def_IudetHeroLineup, lpIndex)
|
| | | #阵容类型*10000+阵型类型*100+位置编号
|
| | | if lineupValue / 10000 != lineupID:
|
| | | lpID, _, posNum = GetLineupValue(lineupValue)
|
| | | if lpID != lineupID:
|
| | | continue
|
| | | return lineupValue % 100
|
| | | return posNum
|
| | | return 0
|
| | |
|
| | | #// B2 30 武将升级 #tagCSHeroLVUP
|
| | |
| | | if heroLV >= LVMax:
|
| | | GameWorld.DebugLog("该武将已满级!LVMax=%s" % (LVMax), playerID)
|
| | | return
|
| | | qualityIpyData = IpyGameDataPY.GetIpyGameData("HeroQuality", quality)
|
| | | if not qualityIpyData:
|
| | | qualityLVIpyData = IpyGameDataPY.GetIpyGameData("HeroQualityLV", quality, heroLV)
|
| | | if not qualityLVIpyData:
|
| | | return
|
| | | costItemInfo = qualityIpyData.GetUPCostItem()
|
| | | 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
|
| | |
| | | return
|
| | | ItemCommon.ReduceItem(curPlayer, itemPack, itemIndexList, costItemCount, True, "HeroLVUP")
|
| | |
|
| | | updHeroLV = heroLV + 1
|
| | | updHeroLV = nextHeroLV
|
| | | GameWorld.DebugLog("武将升级: itemIndex=%s,heroID=%s,updHeroLV=%s" % (itemIndex, heroID, updHeroLV), playerID)
|
| | | heroItem.SetUserAttr(ShareDefine.Def_IudetHeroLV, updHeroLV)
|
| | |
|
| | | # 刷属性
|
| | | if GetHeroLineupPosNum(heroItem, ShareDefine.Lineup_Main):
|
| | | RefreshLordAttr(curPlayer)
|
| | | PlayerOnline.GetOnlinePlayer(curPlayer).OnHeroItemUpate([itemIndex])
|
| | | return
|
| | |
|
| | | def GetHeroLVMax(heroItem):
|
| | |
| | | starMax = InitStarUpper + addStarUpper
|
| | | return starMax
|
| | |
|
| | | def DoHeroUpdStar(curPlayer, heroItem, updStar):
|
| | | def DoHeroUpdStar(curPlayer, heroItem, updStar, isSync=True):
|
| | | ## 执行武将星级更新
|
| | | curStar = heroItem.GetUserAttr(ShareDefine.Def_IudetHeroStar)
|
| | | addStar = updStar - curStar
|
| | |
| | | item.SetUserAttr(ShareDefine.Def_IudetHeroStar, updStar)
|
| | | if addStar > 0:
|
| | | __DoHeroStarTalentUp(item, addStar)
|
| | | heroItem.Sync_Item()
|
| | | if isSync:
|
| | | heroItem.Sync_Item()
|
| | |
|
| | | # 刷属性
|
| | | if GetHeroLineupPosNum(heroItem, ShareDefine.Lineup_Main):
|
| | | RefreshLordAttr(curPlayer)
|
| | | itemIndex = heroItem.GetItemPlaceIndex()
|
| | | PlayerOnline.GetOnlinePlayer(curPlayer).OnHeroItemUpate([itemIndex])
|
| | | return
|
| | |
|
| | | def __DoHeroStarTalentUp(singleItem, addLV):
|
| | |
| | | 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,breakLV=%s" |
| | | % (itemIndex, heroID, quality, breakLV), playerID)
|
| | | 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
|
| | | LVMax = ipyData.GetLVMax()
|
| | | if heroLV < LVMax:
|
| | | GameWorld.DebugLog("未满级,无法突破: heroLV=%s < %s" % (heroLV, LVMax), playerID)
|
| | | return
|
| | | nextBreakLV = breakLV + 1
|
| | | if not IpyGameDataPY.GetIpyGameData("HeroQualityBreak", quality, nextBreakLV):
|
| | |
| | | GameWorld.DebugLog("武将突破: itemIndex=%s,heroID=%s,nextBreakLV=%s" % (itemIndex, heroID, nextBreakLV), playerID)
|
| | | SetHeroBreakLV(heroItem, nextBreakLV)
|
| | |
|
| | | # 刷属性
|
| | | if GetHeroLineupPosNum(heroItem, ShareDefine.Lineup_Main):
|
| | | RefreshLordAttr(curPlayer)
|
| | | PlayerOnline.GetOnlinePlayer(curPlayer).OnHeroItemUpate([itemIndex])
|
| | | return
|
| | |
|
| | | def SetHeroBreakLV(heroItem, breakLV):
|
| | | def SetHeroBreakLV(heroItem, breakLV, isSync=True):
|
| | | ## 设置武将突破等级
|
| | | heroItem.SetUserAttr(ShareDefine.Def_IudetHeroBreakLV, breakLV)
|
| | | item = heroItem.GetItem()
|
| | | item.SetUserAttr(ShareDefine.Def_IudetHeroBreakLV, breakLV)
|
| | | if isSync:
|
| | | heroItem.Sync_Item()
|
| | | return
|
| | |
|
| | | #// B2 33 武将觉醒 #tagCSHeroAwake
|
| | |
| | | GameWorld.DebugLog("材料不足,武将无法觉醒! costItemID=%s, costItemCount=%s" % (costItemID, costItemCount))
|
| | | return
|
| | | ItemCommon.ReduceItem(curPlayer, itemPack, itemIndexList, costItemCount, True, "HeroAwake")
|
| | | GameWorld.DebugLog("武将觉醒: itemIndex=%s,heroID=%s,nextBreakLV=%s" % (itemIndex, heroID, nextAwakeLV), playerID)
|
| | | GameWorld.DebugLog("武将觉醒: itemIndex=%s,heroID=%s,nextAwakeLV=%s" % (itemIndex, heroID, nextAwakeLV), playerID)
|
| | | SetHeroAwakeLV(heroItem, nextAwakeLV)
|
| | |
|
| | | # 刷属性
|
| | | if GetHeroLineupPosNum(heroItem, ShareDefine.Lineup_Main):
|
| | | RefreshLordAttr(curPlayer)
|
| | | PlayerOnline.GetOnlinePlayer(curPlayer).OnHeroItemUpate([itemIndex])
|
| | | return
|
| | |
|
| | | def SetHeroAwakeLV(heroItem, awakeLV):
|
| | | def SetHeroAwakeLV(heroItem, awakeLV, isSync=True):
|
| | | ## 设置武将觉醒等级
|
| | | item = heroItem.GetItem()
|
| | | item.SetUserAttr(ShareDefine.Def_IudetHeroAwakeLV, awakeLV)
|
| | | unlockTalentSlotByAwake(item)
|
| | | heroItem.Sync_Item()
|
| | | if isSync:
|
| | | heroItem.Sync_Item()
|
| | | return
|
| | |
|
| | | def unlockTalentSlotByAwake(singleItem):
|
| | |
| | | #};
|
| | | def OnHeroAwakeSelectTalent(index, clientData, tick):
|
| | | curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
| | | playerID = curPlayer.GetPlayerID()
|
| | | 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
|
| | |
| | | for index, talentID in enumerate(idList):
|
| | | singleItem.AddUserAttr(ShareDefine.Def_IudetHeroTalentID, talentID)
|
| | | singleItem.AddUserAttr(ShareDefine.Def_IudetHeroTalentIDLV, lvList[index])
|
| | | |
| | | |
| | | unlockTalentSlotByAwake(singleItem)
|
| | |
|
| | | heroItem.Sync_Item()
|
| | | if isSync:
|
| | | heroItem.Sync_Item()
|
| | |
|
| | | # 刷属性
|
| | | if GetHeroLineupPosNum(heroItem, ShareDefine.Lineup_Main):
|
| | | RefreshLordAttr(curPlayer)
|
| | | PlayerOnline.GetOnlinePlayer(curPlayer).OnHeroItemUpate([itemIndex])
|
| | | return
|
| | |
|
| | | #// B2 35 武将洗炼 #tagCSHeroWash
|
| | |
| | | heroItem.Sync_Item()
|
| | | GameWorld.DebugLog("武将洗炼替换! itemIndex=%s,heroID=%s,washIDList=%s" % (itemIndex, heroID, washIDList))
|
| | |
|
| | | # 刷属性
|
| | | if GetHeroLineupPosNum(heroItem, ShareDefine.Lineup_Main):
|
| | | RefreshLordAttr(curPlayer)
|
| | | PlayerOnline.GetOnlinePlayer(curPlayer).OnHeroItemUpate([itemIndex])
|
| | | return
|
| | |
|
| | | #// B2 36 武将换肤 #tagCSHeroWearSkin
|
| | |
| | | return
|
| | | heroItem.SetUserAttr(ShareDefine.Def_IudetHeroSkin, skinIndex)
|
| | |
|
| | | # 刷属性
|
| | | if GetHeroLineupPosNum(heroItem, ShareDefine.Lineup_Main):
|
| | | RefreshLordAttr(curPlayer)
|
| | | |
| | | PlayerOnline.GetOnlinePlayer(curPlayer).OnHeroItemUpate([itemIndex])
|
| | | return
|
| | |
|
| | | def ActiveHeroSkin(curPlayer, heroID, skinIndex, isActive=True):
|
| | |
| | | def __doHeroBookStarLVUP(curPlayer, heroID, itemIndex):
|
| | | ## 图鉴星级升级
|
| | | playerID = curPlayer.GetPlayerID()
|
| | | if not GetHeroBookInitState(curPlayer, heroID):
|
| | | GameWorld.DebugLog("该武将图鉴未激活! heroID=%s" % heroID, playerID)
|
| | | return
|
| | | heroItem = GetHeroItem(curPlayer, itemIndex)
|
| | | if not heroItem:
|
| | | return
|
| | |
| | | def __doHeroBookBreakLVUP(curPlayer, heroID, itemIndex):
|
| | | ## 图鉴突破升级
|
| | | playerID = curPlayer.GetPlayerID()
|
| | | if not GetHeroBookInitState(curPlayer, heroID):
|
| | | GameWorld.DebugLog("该武将图鉴未激活! heroID=%s" % heroID, playerID)
|
| | | return
|
| | | heroItem = GetHeroItem(curPlayer, itemIndex)
|
| | | if not heroItem:
|
| | | return
|
| | |
| | | if not heroItem:
|
| | | return
|
| | | heroItem.SetIsLocked(1 if isLock else 0)
|
| | | return
|
| | |
|
| | | #// B2 39 武将重生 #tagCSHeroRebirth
|
| | | #
|
| | | #struct tagCSHeroRebirth
|
| | | #{
|
| | | # tagHead Head;
|
| | | # WORD ItemIndex; //武将物品所在武将背包位置索引
|
| | | #};
|
| | | def OnHeroRebirth(index, clientData, tick):
|
| | | curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
| | | itemIndex = clientData.ItemIndex
|
| | | 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 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()
|
| | | ipyData = IpyGameDataPY.GetIpyGameData("HeroQualityAwake", quality, awakeLV)
|
| | | if not ipyData:
|
| | | return
|
| | | costMoney = ipyData.GetRebirthCostMoney()
|
| | | moneyType = IpyGameDataPY.GetFuncCfg("HeroRebirth", 1)
|
| | | if moneyType and costMoney and not PlayerControl.HaveMoney(curPlayer, moneyType, costMoney):
|
| | | return
|
| | | |
| | | # 验证通过,可以重生
|
| | | GameWorld.DebugLog("武将重生: itemIndex=%s,heroID=%s,quality=%s,heroLV=%s,breakLV=%s,awakeLV=%s" |
| | | % (itemIndex, heroID, quality, heroLV, breakLV, awakeLV))
|
| | | |
| | | returnItemDict = {}
|
| | | __calcHeroLVReturnitem(quality, heroLV, returnItemDict)
|
| | | __calcHeroBreakReturnitem(quality, breakLV, returnItemDict)
|
| | | __calcHeroAwakeReturnitem(quality, awakeLV, returnItemDict)
|
| | | |
| | | if moneyType and costMoney and not PlayerControl.PayMoney(curPlayer, moneyType, costMoney, "HeroRebirth"):
|
| | | return
|
| | | |
| | | # 执行重生
|
| | | item = heroItem.GetItem()
|
| | | item.SetUserAttr(ShareDefine.Def_IudetHeroLV, 1)
|
| | | item.SetUserAttr(ShareDefine.Def_IudetHeroBreakLV, 0)
|
| | | 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 awakeLV:
|
| | | rebirthCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroAwakeRebirthCnt)
|
| | | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HeroAwakeRebirthCnt, rebirthCnt + 1)
|
| | | Sync_PlayerHeroInfo(curPlayer)
|
| | | |
| | | return
|
| | |
|
| | | def __calcHeroLVReturnitem(quality, heroLV, returnItemDict):
|
| | | ## 计算武将等级返还
|
| | | 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
|
| | | returnItemDict[costItemID] = returnItemDict.get(costItemID, 0) + costItemCount
|
| | | returnDict[costItemID] = returnDict.get(costItemID, 0) + costItemCount
|
| | | GameWorld.DebugLog(" 等级返还: quality=%s,heroLV=%s,%s,总%s" % (quality, heroLV, returnDict, returnItemDict))
|
| | | return
|
| | |
|
| | | def __calcHeroBreakReturnitem(quality, breakLV, returnItemDict):
|
| | | # 计算武将突破返还
|
| | | returnDict = {}
|
| | | for retBreakLV in range(0, breakLV):
|
| | | qualityBreakIpyData = IpyGameDataPY.GetIpyGameData("HeroQualityBreak", quality, retBreakLV)
|
| | | if not qualityBreakIpyData:
|
| | | continue
|
| | | costItemInfo = qualityBreakIpyData.GetUPCostItem()
|
| | | if not costItemInfo:
|
| | | continue
|
| | | costItemID, costItemCount = costItemInfo
|
| | | returnItemDict[costItemID] = returnItemDict.get(costItemID, 0) + costItemCount
|
| | | returnDict[costItemID] = returnDict.get(costItemID, 0) + costItemCount
|
| | | GameWorld.DebugLog(" 突破返还: quality=%s,breakLV=%s,%s,总%s" % (quality, breakLV, returnDict, returnItemDict))
|
| | | return
|
| | |
|
| | | def __calcHeroAwakeReturnitem(quality, awakeLV, returnItemDict):
|
| | | # 计算武将觉醒返还
|
| | | 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
|
| | | returnItemDict[costItemID] = returnItemDict.get(costItemID, 0) + costItemCount
|
| | | returnDict[costItemID] = returnDict.get(costItemID, 0) + costItemCount
|
| | | GameWorld.DebugLog(" 觉醒返还: quality=%s,awakeLV=%s,%s,总%s" % (quality, awakeLV, returnDict, returnItemDict))
|
| | | return
|
| | |
|
| | | #// B2 40 武将遣散 #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("武将遣散: itemIndexList=%s" % itemIndexList)
|
| | | |
| | | dismissItemList = []
|
| | | returnItemDict = {}
|
| | | 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("觉醒过的武将需先重生后才可遣散! 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()
|
| | | 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 = (heroStar + 1) * itemCount
|
| | | returnItemDict[itemID] = returnItemDict.get(itemID, 0) + starRetCnt
|
| | | GameWorld.DebugLog(" 星级返还: quality=%s,heroStar=%s,%s,总%s" % (quality, heroStar, dismissReturnItems, returnItemDict))
|
| | | __calcHeroLVReturnitem(quality, heroLV, returnItemDict)
|
| | | __calcHeroBreakReturnitem(quality, breakLV, returnItemDict)
|
| | | 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()]
|
| | | ItemControler.GivePlayerItemOrMail(curPlayer, returnItemList, event=["HeroDismiss", False, {}])
|
| | | |
| | | return
|
| | |
|
| | | #// B4 12 战斗阵容保存 #tagCSHeroLineupSave
|
| | |
| | | item = heroItem.GetItem()
|
| | | for lpIndex in range(lineupCount)[::-1]:
|
| | | lineupValue = item.GetUserAttrByIndex(ShareDefine.Def_IudetHeroLineup, lpIndex)
|
| | | #阵容类型*10000+阵型类型*100+位置编号
|
| | | if lineupValue / 10000 != lineupID:
|
| | | if GetLineupValue(lineupValue)[0] != lineupID:
|
| | | continue
|
| | | item.DelUserAttr(ShareDefine.Def_IudetHeroLineup, lineupValue)
|
| | | delCount += 1
|
| | |
| | |
|
| | | # 更新新阵型
|
| | | heroIDList = []
|
| | | heroItemDict = {}
|
| | | for posNum, itemIndex in heroPosDict.items():
|
| | | if itemIndex < 0 or itemIndex >= curPack.GetCount():
|
| | | continue
|
| | |
| | | continue
|
| | | heroIDList.append(itemID)
|
| | | item = heroItem.GetItem()
|
| | | lineupValue = lineupID * 10000 + shapeType * 100 + posNum
|
| | | lineupValue = ComLineupValue(lineupID, shapeType, posNum)
|
| | | item.AddUserAttr(ShareDefine.Def_IudetHeroLineup, lineupValue)
|
| | | if itemIndex not in syncItemDict:
|
| | | syncItemDict[itemIndex] = heroItem
|
| | | heroItemDict[itemIndex] = posNum
|
| | |
|
| | | # 主阵容修改时重整背包
|
| | | if lineupID == ShareDefine.Lineup_Main:
|
| | | ResetHeroPack(curPlayer)
|
| | | else:
|
| | | for syncItem in syncItemDict.values():
|
| | | syncItem.Sync_Item()
|
| | | |
| | | RefreshLordAttr(curPlayer)
|
| | | # 主阵容修改时重整背包,约定所有背包由前端自行排序
|
| | | #if lineupID == ShareDefine.Lineup_Main:
|
| | | # ResetHeroPack(curPlayer)
|
| | | #else:
|
| | | for syncItem in syncItemDict.values():
|
| | | syncItem.Sync_Item()
|
| | | |
| | | lineup = PlayerOnline.GetOnlinePlayer(curPlayer).GetLineup(lineupID)
|
| | | lineup.UpdLineup(heroItemDict, shapeType)
|
| | | return
|
| | |
|
| | | def ResetHeroPack(curPlayer):
|
| | | tick = GameWorld.GetGameWorld().GetTick()
|
| | | curPlayer.SetResetItemTick(0)
|
| | | ItemControler.ResetItem(curPlayer, ShareDefine.rptHero, 0, 0, tick)
|
| | | 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 RefreshLordAttr(curPlayer):
|
| | | ## 刷新主公属性
|
| | | CalcHeroItemAddAttr(curPlayer)
|
| | | CalcHeroAddAttr(curPlayer)
|
| | | PlayerOnline.GetOnlinePlayer(curPlayer).RefreshRoleAttr()
|
| | | return
|
| | |
|
| | | def CalcHeroItemAddAttr(curPlayer):
|
| | | #allAttrListPet = [{} for _ in range(4)]
|
| | | return
|
| | |
|
| | | def RefreshLineupHeroAttr(curPlayer):
|
| | | ## 刷新阵容武将属性
|
| | | def CalcHeroAddAttr(curPlayer):
|
| | | ## 计算武将对主公增加的属性
|
| | |
|
| | | # 计算阵容总战力 = 角色总战力为主阵容战力,需同步计算不同阵容战力
|
| | | return
|
| | |
|
| | | def CaclHeroCardAttr():
|
| | | heroBookAttrDict = {}
|
| | | playerID = curPlayer.GetID()
|
| | | |
| | | ipyDataMgr = IpyGameDataPY.IPY_Data()
|
| | | for index in range(ipyDataMgr.GetHeroCount()):
|
| | | ipyData = ipyDataMgr.GetHeroByIndex(index)
|
| | | heroID = ipyData.GetHeroID()
|
| | | if not GetHeroBookInitState(curPlayer, heroID):
|
| | | # 图鉴未激活
|
| | | continue
|
| | | quality = ipyData.GetQuality()
|
| | | qualityIpyData = IpyGameDataPY.GetIpyGameData("HeroQuality", quality)
|
| | | if not qualityIpyData:
|
| | | continue
|
| | | bookInitAddPer = qualityIpyData.GetBookInitAddPer()
|
| | | bookStarAddPer = qualityIpyData.GetBookStarAddPer()
|
| | | bookBreakLVAddPer = qualityIpyData.GetBookBreakLVAddPer()
|
| | | bookStar = GetHeroBookStarLV(curPlayer, heroID)
|
| | | bookBreakLV = GetHeroBookBreakLV(curPlayer, heroID)
|
| | | for attrPerID in ChConfig.BaseAttrPerIDList:
|
| | | addPer = bookInitAddPer + bookStar * bookStarAddPer + bookBreakLV * bookBreakLVAddPer
|
| | | heroBookAttrDict[attrPerID] = heroBookAttrDict.get(attrPerID, 0) + addPer
|
| | | |
| | | GameWorld.DebugLog("武将图鉴属性: %s" % heroBookAttrDict, playerID)
|
| | | PlayerOnline.GetOnlinePlayer(curPlayer).SetCalcAttr(ChConfig.Def_CalcAttr_HeroBook, heroBookAttrDict)
|
| | | return
|
| | |
|
| | | def Sync_HeroInfo(curPlayer, heroIDList=None):
|
| | |
| | | clientPack.HeroCnt = len(clientPack.HeroInfoList)
|
| | | NetPackCommon.SendFakePack(curPlayer, clientPack)
|
| | | return
|
| | |
|
| | | def Sync_Lineup(curPlayer, lineupID=None):
|
| | | if lineupID:
|
| | | syncIDList = [lineupID]
|
| | | else:
|
| | | syncIDList = ShareDefine.LineupList
|
| | | |
| | | lineupList = []
|
| | | olPlayer = PlayerOnline.GetOnlinePlayer(curPlayer)
|
| | | for lineupID in syncIDList:
|
| | | lineup = olPlayer.GetLineup(lineupID)
|
| | | if not lineup:
|
| | | continue
|
| | | |
| | | posNumItemIndexDict = {v:k for k, v in lineup.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)
|
| | | packLineup = ChPyNetSendPack.tagSCLineup()
|
| | | packLineup.LineupID = lineup.lineupID
|
| | | packLineup.ShapeType = lineup.shapeType
|
| | | packLineup.HeroItemIndexList = heroItemIndexList
|
| | | packLineup.HeroCnt = len(packLineup.HeroItemIndexList)
|
| | | lineupList.append(packLineup)
|
| | | |
| | | if not lineupList:
|
| | | return
|
| | | |
| | | clientPack = ChPyNetSendPack.tagSCLineupInfo()
|
| | | clientPack.LineupList = lineupList
|
| | | clientPack.LineupCnt = len(clientPack.LineupList)
|
| | | 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
|