From 632add2bff0c18c0a28438596be441428dd7889d Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期二, 09 九月 2025 19:34:03 +0800
Subject: [PATCH] 121 【武将】武将系统-服务端(升星材料卡有升级突破时限制升星;遣散增加返还比例设定;重生增加等级消耗、返还比例设定,重生导致觉醒已解锁槽位失效时该槽位天赋属性同步失效;)
---
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHero.py | 73 +++++++++++++++++-------------------
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerOnline.py | 35 +++++++++--------
2 files changed, 54 insertions(+), 54 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 54714df..d7a77ea 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHero.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHero.py
@@ -404,6 +404,11 @@
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:
@@ -419,22 +424,10 @@
useStar = useItem.GetUserAttr(ShareDefine.Def_IudetHeroStar)
addStar = useStar + 1
updStar = star + addStar
- useHeroLV = useItem.GetUserAttr(ShareDefine.Def_IudetHeroLV)
- useBreakLV = useItem.GetUserAttr(ShareDefine.Def_IudetHeroBreakLV)
- GameWorld.DebugLog("武将升星: itemIndex=%s,heroID=%s,star=%s,useStar=%s,addStar=%s,updStar=%s,useHeroLV=%s,useBreakLV=%s"
- % (itemIndex, heroID, star, useStar, addStar, updStar, useHeroLV, useBreakLV), playerID)
+ 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)
-
- returnItemDict = {}
- if useHeroLV > 1:
- __calcHeroLVReturnitem(quality, useHeroLV, returnItemDict)
- if useBreakLV:
- __calcHeroBreakReturnitem(quality, useBreakLV, returnItemDict)
- if returnItemDict:
- returnItemList = [[k, v] for k, v in returnItemDict.items()]
- ItemControler.GivePlayerItemOrMail(curPlayer, returnItemList, event=["HeroStarUP", False, {}])
-
return
def GetHeroStarMax(heroItem):
@@ -450,7 +443,7 @@
InitStarUpper = qualityIpyData.GetInitStarUpper()
addStarUpper = 0
- heroAwakeIpyDataList = IpyGameDataPY.GetIpyGameDataList("HeroAwake", heroID)
+ heroAwakeIpyDataList = IpyGameDataPY.GetIpyGameDataListNotLog("HeroAwake", heroID)
if heroAwakeIpyDataList:
awakeLV = heroItem.GetUserAttr(ShareDefine.Def_IudetHeroAwakeLV)
for ipyData in heroAwakeIpyDataList:
@@ -708,7 +701,7 @@
## 觉醒解锁天赋槽
heroID = singleItem.GetItemTypeID()
awakeLV = singleItem.GetUserAttr(ShareDefine.Def_IudetHeroAwakeLV)
- awakeIpyDataList = IpyGameDataPY.GetIpyGameDataList("HeroAwake", heroID)
+ awakeIpyDataList = IpyGameDataPY.GetIpyGameDataListNotLog("HeroAwake", heroID)
if not awakeIpyDataList:
return
maxUnlockSlot = 0
@@ -1154,24 +1147,24 @@
if not heroIpyData:
return
quality = heroIpyData.GetQuality()
- ipyData = IpyGameDataPY.GetIpyGameData("HeroQualityAwake", quality, awakeLV)
- if not ipyData:
- return
- costMoney = ipyData.GetRebirthCostMoney()
+ qualityAwakeIpyData = IpyGameDataPY.GetIpyGameDataNotLog("HeroQualityAwake", quality, awakeLV)
+ awakeCostMoney = qualityAwakeIpyData.GetRebirthCostMoney() if qualityAwakeIpyData else 0
moneyType = IpyGameDataPY.GetFuncCfg("HeroRebirth", 1)
- if moneyType and costMoney and not PlayerControl.HaveMoney(curPlayer, moneyType, costMoney):
+ lvCostMoney = int(eval(IpyGameDataPY.GetFuncCompileCfg("HeroRebirth", 3)))
+ costMoneyTotal = lvCostMoney + awakeCostMoney
+ GameWorld.DebugLog("武将重生: itemIndex=%s,heroID=%s,quality=%s,heroLV=%s,breakLV=%s,awakeLV=%s,costMoneyTotal=%s(%s+%s)"
+ % (itemIndex, heroID, quality, heroLV, breakLV, awakeLV, costMoneyTotal, lvCostMoney, awakeCostMoney))
+ if moneyType and costMoneyTotal and not PlayerControl.HaveMoney(curPlayer, moneyType, costMoneyTotal):
return
# 验证通过,可以重生
- GameWorld.DebugLog("武将重生: itemIndex=%s,heroID=%s,quality=%s,heroLV=%s,breakLV=%s,awakeLV=%s"
- % (itemIndex, heroID, quality, heroLV, breakLV, awakeLV))
-
+ ratio = IpyGameDataPY.GetFuncCfg("HeroRebirth", 4)
returnItemDict = {}
- __calcHeroLVReturnitem(quality, heroLV, returnItemDict)
- __calcHeroBreakReturnitem(quality, breakLV, returnItemDict)
- __calcHeroAwakeReturnitem(quality, awakeLV, returnItemDict)
+ __calcHeroLVReturnitem(quality, heroLV, returnItemDict, ratio)
+ __calcHeroBreakReturnitem(quality, breakLV, returnItemDict, ratio)
+ __calcHeroAwakeReturnitem(quality, awakeLV, returnItemDict, ratio)
- if moneyType and costMoney and not PlayerControl.PayMoney(curPlayer, moneyType, costMoney, "HeroRebirth"):
+ if moneyType and costMoneyTotal and not PlayerControl.PayMoney(curPlayer, moneyType, costMoneyTotal, "HeroRebirth"):
return
# 执行重生
@@ -1192,7 +1185,7 @@
return
-def __calcHeroLVReturnitem(quality, heroLV, returnItemDict):
+def __calcHeroLVReturnitem(quality, heroLV, returnItemDict, ratio):
## 计算武将等级返还
returnDict = {}
for retLV in range(1, heroLV):
@@ -1203,12 +1196,13 @@
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,%s,总%s" % (quality, heroLV, returnDict, returnItemDict))
+ GameWorld.DebugLog(" 等级返还: quality=%s,heroLV=%s,ratio=%s,%s,总%s" % (quality, heroLV, ratio, returnDict, returnItemDict))
return
-def __calcHeroBreakReturnitem(quality, breakLV, returnItemDict):
+def __calcHeroBreakReturnitem(quality, breakLV, returnItemDict, ratio):
# 计算武将突破返还
returnDict = {}
for retBreakLV in range(0, breakLV):
@@ -1219,12 +1213,13 @@
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,breakLV=%s,%s,总%s" % (quality, breakLV, returnDict, returnItemDict))
+ GameWorld.DebugLog(" 突破返还: quality=%s,breakLV=%s,ratio=%s,%s,总%s" % (quality, breakLV, ratio, returnDict, returnItemDict))
return
-def __calcHeroAwakeReturnitem(quality, awakeLV, returnItemDict):
+def __calcHeroAwakeReturnitem(quality, awakeLV, returnItemDict, ratio):
# 计算武将觉醒返还
returnDict = {}
for retAwakeLV in range(0, awakeLV):
@@ -1235,9 +1230,10 @@
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,%s,总%s" % (quality, awakeLV, returnDict, returnItemDict))
+ GameWorld.DebugLog(" 觉醒返还: quality=%s,awakeLV=%s,ratio=%s,%s,总%s" % (quality, awakeLV, ratio, returnDict, returnItemDict))
return
#// B2 40 武将遣散 #tagCSHeroDismiss
@@ -1253,6 +1249,7 @@
itemIndexList = clientData.ItemIndexList
GameWorld.DebugLog("武将遣散: itemIndexList=%s" % itemIndexList)
+ ratio = IpyGameDataPY.GetFuncCfg("HeroRebirth", 5)
dismissItemList = []
returnItemDict = {}
curPack = curPlayer.GetItemManager().GetPack(ShareDefine.rptHero)
@@ -1288,11 +1285,11 @@
GameWorld.DebugLog("遣散: 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
+ starRetCnt = max(1, int((heroStar + 1) * itemCount * ratio / 100.0))
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)
+ 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)
dismissItemList.append([itemIndex, heroItem])
if not dismissItemList:
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerOnline.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerOnline.py
index 8cd0020..63fdd02 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerOnline.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerOnline.py
@@ -498,21 +498,6 @@
selfAttrDict[int(k)] = v
heroSelfAttrInfo[heroID] = selfAttrDict
- # 星级天赋
- starTalentAttrDict = {}
- idCount = heroItem.GetUserAttrCount(ShareDefine.Def_IudetHeroTalentID)
- lvCount = heroItem.GetUserAttrCount(ShareDefine.Def_IudetHeroTalentIDLV)
- for aIndex in range(min(idCount, lvCount)):
- talentID = heroItem.GetUserAttrByIndex(ShareDefine.Def_IudetHeroTalentID, aIndex)
- talentLV = heroItem.GetUserAttrByIndex(ShareDefine.Def_IudetHeroTalentIDLV, aIndex)
- stIpyData = IpyGameDataPY.GetIpyGameData("HeroTalent", talentID)
- if not stIpyData:
- continue
- attrID = stIpyData.GetAttrID()
- attrValue = stIpyData.GetAttrValue() * talentLV
- starTalentAttrDict[attrID] = starTalentAttrDict.get(attrID, 0) + attrValue
- heroStarTalentInfo[heroID] = starTalentAttrDict
-
# 突破潜能
breakAttrDict = {}
breakIpyDataList = IpyGameDataPY.GetIpyGameDataList("HeroBreak", heroID)
@@ -532,12 +517,15 @@
heroBreakAttrInfo[heroID] = breakAttrDict
# 觉醒天赋
+ maxUnlockSlot = IpyGameDataPY.GetFuncCfg("HeroStarTalent", 1) # 常规天赋槽个数
awakeTalentAttrDict = {}
- awakeIpyDataList = IpyGameDataPY.GetIpyGameDataList("HeroAwake", heroID)
+ awakeIpyDataList = IpyGameDataPY.GetIpyGameDataListNotLog("HeroAwake", heroID)
if awakeIpyDataList:
for awakeIpyData in awakeIpyDataList:
if awakeIpyData.GetAwakeLV() > awakeLV:
break
+ unlockTalentSlot = awakeIpyData.GetUnlockTalentSlot()
+ maxUnlockSlot = max(maxUnlockSlot, unlockTalentSlot)
attrIDList = awakeIpyData.GetAttrIDList()
attrValueList = awakeIpyData.GetAttrValueList()
for aIndex in range(min(len(attrIDList), len(attrValueList))):
@@ -549,6 +537,21 @@
lineupHero.heroSkillIDList.append(skillID)
heroAwakeTalentInfo[heroID] = awakeTalentAttrDict
+ # 星级天赋
+ starTalentAttrDict = {}
+ idCount = heroItem.GetUserAttrCount(ShareDefine.Def_IudetHeroTalentID)
+ lvCount = heroItem.GetUserAttrCount(ShareDefine.Def_IudetHeroTalentIDLV)
+ for aIndex in range(min(idCount, lvCount, maxUnlockSlot)): # 重生导致已觉醒槽位失效时属性也无效
+ talentID = heroItem.GetUserAttrByIndex(ShareDefine.Def_IudetHeroTalentID, aIndex)
+ talentLV = heroItem.GetUserAttrByIndex(ShareDefine.Def_IudetHeroTalentIDLV, aIndex)
+ stIpyData = IpyGameDataPY.GetIpyGameData("HeroTalent", talentID)
+ if not stIpyData:
+ continue
+ attrID = stIpyData.GetAttrID()
+ attrValue = stIpyData.GetAttrValue() * talentLV
+ starTalentAttrDict[attrID] = starTalentAttrDict.get(attrID, 0) + attrValue
+ heroStarTalentInfo[heroID] = starTalentAttrDict
+
# 羁绊统计
for fetterID in heroIpyData.GetFetterIDList():
if fetterID not in fetterHeroInfo:
--
Gitblit v1.8.0