| | |
| | | import NetPackCommon
|
| | | import PlayerControl
|
| | | import PlayerOnline
|
| | | import PlayerPreset
|
| | | import PlayerTask
|
| | | import GameWorld
|
| | | import ChConfig
|
| | |
| | | return
|
| | | GameWorld.DebugLog("初始化新手武将: %s" % defaultHeroInfo, curPlayer.GetPlayerID())
|
| | |
|
| | | lineupID = ShareDefine.Lineup_Main
|
| | | presetID = 1 # 默认预设1
|
| | | shapeType = 0
|
| | | for heroID, posNum in defaultHeroInfo.items():
|
| | | lineupValue = ComLineupValue(lineupID, shapeType, posNum)
|
| | | lineupValue = ComLineupValue(presetID, shapeType, posNum)
|
| | | setAttrDict = {ShareDefine.Def_IudetHeroLineup:[lineupValue]}
|
| | | ItemControler.GivePlayerItem(curPlayer, heroID, 1, False, [ShareDefine.rptHero], setAttrDict=setAttrDict)
|
| | |
|
| | |
| | | return
|
| | | return heroItem
|
| | |
|
| | | def GetHeroLineupPosNum(heroItem, lineupID=ShareDefine.Lineup_Main):
|
| | | ## 获取英雄所在阵型站位
|
| | | # @param lineupID: 阵型ID,默认主阵型
|
| | | # @return: 0-没有在该阵型;>0-在该阵型中的站位编号
|
| | | lineupCount = heroItem.GetUserAttrCount(ShareDefine.Def_IudetHeroLineup)
|
| | | if not lineupCount:
|
| | | return 0
|
| | | for lpIndex in range(lineupCount)[::-1]:
|
| | | lineupValue = heroItem.GetUserAttrByIndex(ShareDefine.Def_IudetHeroLineup, lpIndex)
|
| | | lpID, _, posNum = GetLineupValue(lineupValue)
|
| | | if lpID != lineupID:
|
| | | continue
|
| | | return posNum
|
| | | return 0
|
| | |
|
| | | def InMainLineup(heroItem):
|
| | | ## 是否在主阵容中
|
| | | for lpIndex in range(heroItem.GetUserAttrCount(ShareDefine.Def_IudetHeroLineup)):
|
| | | lineupValue = heroItem.GetUserAttrByIndex(ShareDefine.Def_IudetHeroLineup, lpIndex)
|
| | | if GetLineupValue(lineupValue)[0] == ShareDefine.Lineup_Main:
|
| | | return True
|
| | | return False
|
| | | 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
|
| | | #
|
| | |
| | | ratio = IpyGameDataPY.GetFuncCfg("HeroRebirth", 5)
|
| | | dismissItemList = []
|
| | | returnItemDict = {}
|
| | | olPlayer = PlayerOnline.GetOnlinePlayer(curPlayer)
|
| | | curPack = curPlayer.GetItemManager().GetPack(ShareDefine.rptHero)
|
| | | for itemIndex in itemIndexList:
|
| | | if itemIndex < 0 or itemIndex >= curPack.GetCount():
|
| | |
| | | GameWorld.DebugLog("上阵中的武将无法遣散! itemIndex=%s,lineupValueList=%s" % (itemIndex, lineupValueList))
|
| | | continue
|
| | | heroID = heroItem.GetItemTypeID()
|
| | | _, effItemIndex, _ = olPlayer.GetHeroEffectiveCard(heroID)
|
| | | if itemIndex == effItemIndex:
|
| | | GameWorld.DebugLog("生效中的卡牌无法遣散! itemIndex=%s,heroID=%s,effItemIndex=%s" % (itemIndex, heroID, effItemIndex))
|
| | | 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:
|
| | |
| | |
|
| | | return
|
| | |
|
| | | #// B4 12 战斗阵容保存 #tagCSHeroLineupSave
|
| | | #// B4 12 战斗阵容预设保存 #tagCSHeroPresetSave
|
| | | #
|
| | | #struct tagCSHeroLineupPos
|
| | | #struct tagCSHeroPresetPos
|
| | | #{
|
| | | # WORD ItemIndex; //武将物品所在武将背包位置索引
|
| | | # BYTE PosNum; //1~n上阵位置编号
|
| | | #};
|
| | | #
|
| | | #struct tagCSHeroLineupSave
|
| | | #struct tagCSHeroPresetSave
|
| | | #{
|
| | | # tagHead Head;
|
| | | # BYTE LineupID; //阵容ID:1-主阵容;其他待扩展,如某个防守阵容
|
| | | # BYTE ShapeType; //本阵容阵型,0为默认阵型,可扩展不同的阵型
|
| | | # BYTE PresetID; //阵容方案预设ID
|
| | | # BYTE PosCnt;
|
| | | # tagCSHeroLineupPos HeroPosList[PosCnt]; // 保存的阵容,只发送最终的阵容武将位置即可
|
| | | # tagCSHeroPresetPos HeroPosList[PosCnt]; // 保存的阵容,只发送最终的阵容武将位置即可
|
| | | #};
|
| | | def OnHeroLineupSave(index, clientData, tick):
|
| | | def OnHeroPresetSave(index, clientData, tick):
|
| | | curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
| | | lineupID = clientData.LineupID
|
| | | shapeType = clientData.ShapeType
|
| | | presetID = clientData.PresetID
|
| | | shapeType = 0#clientData.ShapeType
|
| | | heroPosList = clientData.HeroPosList
|
| | |
|
| | | heroPosDict = {}
|
| | |
| | | indexList.append(itemIndex)
|
| | | heroPosDict[posNum] = itemIndex
|
| | |
|
| | | if lineupID not in ShareDefine.LineupList:
|
| | | GameWorld.DebugLog("不存在该阵容,无法保存! lineupID=%s" % lineupID)
|
| | | if not PlayerPreset.GetFuncPresetIDState(curPlayer, presetID, ShareDefine.FuncPreset_Hero):
|
| | | GameWorld.DebugLog("该武将阵容预设不可用! presetID=%s" % presetID)
|
| | | return
|
| | |
|
| | | GameWorld.DebugLog("保存阵容: lineupID=%s, %s" % (lineupID, heroPosDict), curPlayer.GetPlayerID())
|
| | | GameWorld.DebugLog("保存武将预设阵容: presetID=%s, %s" % (presetID, heroPosDict), curPlayer.GetPlayerID())
|
| | | curPack = curPlayer.GetItemManager().GetPack(ShareDefine.rptHero)
|
| | | # 直接重置旧阵型
|
| | | delCount = 0
|
| | |
| | | item = heroItem.GetItem()
|
| | | for lpIndex in range(lineupCount)[::-1]:
|
| | | lineupValue = item.GetUserAttrByIndex(ShareDefine.Def_IudetHeroLineup, lpIndex)
|
| | | if GetLineupValue(lineupValue)[0] != lineupID:
|
| | | if GetLineupValue(lineupValue)[0] != presetID:
|
| | | continue
|
| | | item.DelUserAttr(ShareDefine.Def_IudetHeroLineup, lineupValue)
|
| | | delCount += 1
|
| | |
| | | continue
|
| | | heroIDList.append(itemID)
|
| | | item = heroItem.GetItem()
|
| | | lineupValue = ComLineupValue(lineupID, shapeType, posNum)
|
| | | lineupValue = ComLineupValue(presetID, 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()
|
| | |
|
| | | olPlayer = PlayerOnline.GetOnlinePlayer(curPlayer)
|
| | | lineup = olPlayer.GetLineup(lineupID, False)
|
| | | lineup.UpdLineup(heroItemDict, shapeType)
|
| | | |
| | | # 主阵容调整,重载生效的卡牌
|
| | | if lineupID == ShareDefine.Lineup_Main:
|
| | | for exclusiveMapID in ChConfig.ExclusiveBatAttrMapIDList:
|
| | | exclusiveLineup = olPlayer.GetLineup(lineupID, False, exclusiveMapID=exclusiveMapID)
|
| | | exclusiveLineup.UpdLineup(heroItemDict, shapeType)
|
| | | PlayerOnline.reloadEffHeroCard(curPlayer, olPlayer)
|
| | | PlayerOnline.GetOnlinePlayer(curPlayer).UpdHeroItemPreset(presetID, heroItemDict, shapeType)
|
| | | return
|
| | |
|
| | | def ComLineupValue(lineupID, shapeType, posNum): return lineupID * 10000 + shapeType * 100 + posNum
|
| | |
| | | return
|
| | |
|
| | | heroID = heroItem.GetItemTypeID()
|
| | | _, effItemIndex, _ = olPlayer.GetHeroEffectiveCard(heroID)
|
| | | if itemIndex == effItemIndex:
|
| | | GameWorld.DebugLog(" 生效中的卡牌无法使用! itemIndex=%s,heroID=%s,effItemIndex=%s" % (itemIndex, heroID, effItemIndex))
|
| | | effPresetIDList = GetHeroEffPresetIDList(heroItem)
|
| | | if effPresetIDList:
|
| | | GameWorld.DebugLog(" 生效中的卡牌无法使用! itemIndex=%s,heroID=%s,effPresetIDList=%s" % (itemIndex, heroID, effPresetIDList))
|
| | | return
|
| | |
|
| | | return True
|
| | |
| | | NetPackCommon.SendFakePack(curPlayer, clientPack)
|
| | | return
|
| | |
|
| | | def Sync_Lineup(curPlayer, lineupID=None):
|
| | | if lineupID:
|
| | | syncIDList = [lineupID]
|
| | | else:
|
| | | syncIDList = ShareDefine.LineupList
|
| | | |
| | | lineupList = []
|
| | | def Sync_HeroPreset(curPlayer, heroPresetID=None):
|
| | | olPlayer = PlayerOnline.GetOnlinePlayer(curPlayer)
|
| | | for lineupID in syncIDList:
|
| | | lineup = olPlayer.GetLineup(lineupID, False)
|
| | | if not lineup:
|
| | | 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 lineup.heroItemDict.items()}
|
| | | 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)
|
| | | packLineup = ChPyNetSendPack.tagSCLineup()
|
| | | packLineup.LineupID = lineup.lineupID
|
| | | packLineup.ShapeType = lineup.shapeType
|
| | | packLineup.HeroItemIndexList = heroItemIndexList
|
| | | packLineup.HeroCnt = len(packLineup.HeroItemIndexList)
|
| | | lineupList.append(packLineup)
|
| | | preset = ChPyNetSendPack.tagSCHeroPreset()
|
| | | preset.PresetID = heroPresetID
|
| | | #preset.ShapeType = heroPreset.shapeType
|
| | | preset.HeroItemIndexList = heroItemIndexList
|
| | | preset.HeroCnt = len(preset.HeroItemIndexList)
|
| | | presetList.append(preset)
|
| | |
|
| | | if not lineupList:
|
| | | if not presetList:
|
| | | return
|
| | |
|
| | | clientPack = ChPyNetSendPack.tagSCLineupInfo()
|
| | | clientPack.LineupList = lineupList
|
| | | clientPack.LineupCnt = len(clientPack.LineupList)
|
| | | clientPack = ChPyNetSendPack.tagSCHeroPresetInfo()
|
| | | clientPack.PresetList = presetList
|
| | | clientPack.PresetCnt = len(clientPack.PresetList)
|
| | | NetPackCommon.SendFakePack(curPlayer, clientPack)
|
| | | return
|
| | |
|