From 9ec66731c8a551035958aebe1fa974a140b99cf1 Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期三, 02 七月 2025 17:34:10 +0800 Subject: [PATCH] 129 【战斗】战斗系统-服务端(初版战斗,支持基础的三维属性战斗,支持简单的普攻技能、怒气技能、回血技能;主线章节关卡过关支持;阵容保存支持多阵容;) --- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHero.py | 150 ++++++++++++++++++++++++++++++++++++-------------- 1 files changed, 108 insertions(+), 42 deletions(-) diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHero.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHero.py index 0a0aee9..d842b7d 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHero.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHero.py @@ -43,8 +43,6 @@ singleItem.SetUserAttr(ShareDefine.Def_IudetHeroAwakeLV, 0) if singleItem.GetUserAttr(ShareDefine.Def_IudetHeroSkin): singleItem.SetUserAttr(ShareDefine.Def_IudetHeroSkin, 0) - if singleItem.GetUserAttr(ShareDefine.Def_IudetHeroPosNum): - singleItem.SetUserAttr(ShareDefine.Def_IudetHeroPosNum, 0) if singleItem.GetUserAttrCount(ShareDefine.Def_IudetHeroTalentID): singleItem.ClearUserAttr(ShareDefine.Def_IudetHeroTalentID) @@ -56,6 +54,8 @@ 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 @@ -192,6 +192,21 @@ 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) + #阵容类型*10000+阵型类型*100+位置编号 + if lineupValue / 10000 != lineupID: + continue + return lineupValue % 100 + return 0 + #// B2 30 武将升级 #tagCSHeroLVUP # #struct tagCSHeroLVUP @@ -239,8 +254,9 @@ 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) return def GetHeroLVMax(heroItem): @@ -353,8 +369,9 @@ __DoHeroStarTalentUp(item, addStar) heroItem.Sync_Item() - # 刷属性,之后扩展 - + # 刷属性 + if GetHeroLineupPosNum(heroItem, ShareDefine.Lineup_Main): + RefreshLordAttr(curPlayer) return def __DoHeroStarTalentUp(singleItem, addLV): @@ -496,8 +513,9 @@ GameWorld.DebugLog("武将突破: itemIndex=%s,heroID=%s,nextBreakLV=%s" % (itemIndex, heroID, nextBreakLV), playerID) SetHeroBreakLV(heroItem, nextBreakLV) - # 刷属性,之后扩展 - + # 刷属性 + if GetHeroLineupPosNum(heroItem, ShareDefine.Lineup_Main): + RefreshLordAttr(curPlayer) return def SetHeroBreakLV(heroItem, breakLV): @@ -555,8 +573,9 @@ GameWorld.DebugLog("武将觉醒: itemIndex=%s,heroID=%s,nextBreakLV=%s" % (itemIndex, heroID, nextAwakeLV), playerID) SetHeroAwakeLV(heroItem, nextAwakeLV) - # 刷属性,之后扩展 - + # 刷属性 + if GetHeroLineupPosNum(heroItem, ShareDefine.Lineup_Main): + RefreshLordAttr(curPlayer) return def SetHeroAwakeLV(heroItem, awakeLV): @@ -688,8 +707,9 @@ heroItem.Sync_Item() - # 刷属性,之后扩展 - + # 刷属性 + if GetHeroLineupPosNum(heroItem, ShareDefine.Lineup_Main): + RefreshLordAttr(curPlayer) return #// B2 35 武将洗炼 #tagCSHeroWash @@ -825,8 +845,9 @@ heroItem.Sync_Item() GameWorld.DebugLog("武将洗炼替换! itemIndex=%s,heroID=%s,washIDList=%s" % (itemIndex, heroID, washIDList)) - # 刷属性,之后扩展 - + # 刷属性 + if GetHeroLineupPosNum(heroItem, ShareDefine.Lineup_Main): + RefreshLordAttr(curPlayer) return #// B2 36 武将换肤 #tagCSHeroWearSkin @@ -860,7 +881,9 @@ heroItem.SetUserAttr(ShareDefine.Def_IudetHeroSkin, skinIndex) # 刷属性 - + if GetHeroLineupPosNum(heroItem, ShareDefine.Lineup_Main): + RefreshLordAttr(curPlayer) + return def ActiveHeroSkin(curPlayer, heroID, skinIndex, isActive=True): @@ -875,6 +898,8 @@ % (heroID, skinIndex, skinState, updState), curPlayer.GetPlayerID()) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HeroSkin % heroID, updState) Sync_HeroInfo(curPlayer, [heroID]) + + RefreshLordAttr(curPlayer) return #// B2 37 武将图鉴激活升级 #tagCSHeroBookUP @@ -926,6 +951,8 @@ PlayerControl.GiveMoney(curPlayer, moneyType, moneyValue, "HeroBookAct") Sync_HeroInfo(curPlayer, [heroID]) + + RefreshLordAttr(curPlayer) return def __doHeroBookStarLVUP(curPlayer, heroID, itemIndex): @@ -946,8 +973,7 @@ SetHeroBookStarLV(curPlayer, heroID, bookStar + 1) Sync_HeroInfo(curPlayer, [heroID]) - # 刷属性 - + RefreshLordAttr(curPlayer) return def __doHeroBookBreakLVUP(curPlayer, heroID, itemIndex): @@ -968,8 +994,7 @@ SetHeroBookBreakLV(curPlayer, heroID, bookBreakLV + 1) Sync_HeroInfo(curPlayer, [heroID]) - # 刷属性 - + RefreshLordAttr(curPlayer) return #// B2 38 武将锁定 #tagCSHeroLock @@ -990,24 +1015,26 @@ heroItem.SetIsLocked(1 if isLock else 0) return -#// B4 12 战斗阵型保存 #tagCSHeroBattlePosSave +#// B4 12 战斗阵容保存 #tagCSHeroLineupSave # -#struct tagCSHeroBattlePos +#struct tagCSHeroLineupPos #{ # WORD ItemIndex; //武将物品所在武将背包位置索引 # BYTE PosNum; //1~n上阵位置编号 #}; # -#struct tagCSHeroBattlePosSave +#struct tagCSHeroLineupSave #{ # tagHead Head; -# BYTE FuncType; //布阵功能类型:0-默认主阵型;其他待扩展,如某个活动的防守阵型 +# BYTE LineupID; //阵容ID:1-主阵容;其他待扩展,如某个防守阵容 +# BYTE ShapeType; //本阵容阵型,0为默认阵型,可扩展不同的阵型 # BYTE PosCnt; -# tagCSHeroBattlePos HeroPosList[PosCnt]; // 保存的阵型,只要发送最终的阵型武将位置即可 +# tagCSHeroLineupPos HeroPosList[PosCnt]; // 保存的阵容,只发送最终的阵容武将位置即可 #}; -def OnHeroBattlePosSave(index, clientData, tick): +def OnHeroLineupSave(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) - funcType = clientData.FuncType + lineupID = clientData.LineupID + shapeType = clientData.ShapeType heroPosList = clientData.HeroPosList heroPosDict = {} @@ -1021,40 +1048,61 @@ indexList.append(itemIndex) heroPosDict[posNum] = itemIndex - # 主阵型 - if funcType == 0: - MainBattlePosSave(curPlayer, heroPosDict) - - # 其他待扩展 - elif funcType == 1: - pass + if lineupID not in ShareDefine.LineupList: + GameWorld.DebugLog("不存在该阵容,无法保存! lineupID=%s" % lineupID) + return - return - -def MainBattlePosSave(curPlayer, heroPosDict): - GameWorld.DebugLog("保留主战斗阵型: %s" % heroPosDict, curPlayer.GetPlayerID()) + GameWorld.DebugLog("保存阵容: lineupID=%s, %s" % (lineupID, 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 - if not heroItem.GetUserAttr(ShareDefine.Def_IudetHeroPosNum): + lineupCount = heroItem.GetUserAttrCount(ShareDefine.Def_IudetHeroLineup) + if not lineupCount: continue item = heroItem.GetItem() - item.ClearUserAttr(ShareDefine.Def_IudetHeroPosNum) - + for lpIndex in range(lineupCount)[::-1]: + lineupValue = item.GetUserAttrByIndex(ShareDefine.Def_IudetHeroLineup, lpIndex) + #阵容类型*10000+阵型类型*100+位置编号 + if lineupValue / 10000 != lineupID: + continue + item.DelUserAttr(ShareDefine.Def_IudetHeroLineup, lineupValue) + delCount += 1 + if delCount >= ShareDefine.LineupObjMax: + break + syncItemDict[index] = heroItem + # 更新新阵型 + heroIDList = [] 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() - item.SetUserAttr(ShareDefine.Def_IudetHeroPosNum, posNum) + lineupValue = lineupID * 10000 + shapeType * 100 + posNum + item.AddUserAttr(ShareDefine.Def_IudetHeroLineup, lineupValue) + if itemIndex not in syncItemDict: + syncItemDict[itemIndex] = heroItem - ResetHeroPack(curPlayer) + # 主阵容修改时重整背包 + if lineupID == ShareDefine.Lineup_Main: + ResetHeroPack(curPlayer) + else: + for syncItem in syncItemDict.values(): + syncItem.Sync_Item() + + RefreshLordAttr(curPlayer) return def ResetHeroPack(curPlayer): @@ -1063,6 +1111,24 @@ ItemControler.ResetItem(curPlayer, ShareDefine.rptHero, 0, 0, tick) return +def RefreshLordAttr(curPlayer): + ## 刷新主公属性 + CalcHeroItemAddAttr(curPlayer) + return + +def CalcHeroItemAddAttr(curPlayer): + #allAttrListPet = [{} for _ in range(4)] + return + +def RefreshLineupHeroAttr(curPlayer): + ## 刷新阵容武将属性 + + # 计算阵容总战力 = 角色总战力为主阵容战力,需同步计算不同阵容战力 + return + +def CaclHeroCardAttr(): + return + def Sync_HeroInfo(curPlayer, heroIDList=None): if heroIDList != None: syncHeroIDList = heroIDList -- Gitblit v1.8.0