hxp
2026-03-12 5c8b87ef0812652af80655923ac5ca277b346f61
541 【幻境阁】新增称号加成效果-服务端
13个文件已修改
193 ■■■■ 已修改文件
PySysDB/PySysDBPY.h 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Dingjunge.py 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/HJG.py 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_Dingjunge.py 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_Zhanchui.py 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerBeauty.py 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHJG.py 104 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHero.py 23 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerOnline.py 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PySysDB/PySysDBPY.h
@@ -235,6 +235,7 @@
    list        BookActAwardMoney;    // 图鉴激活奖励货币 类型|值
    list        DismissReturnItems;    // 遣散每星返还道具 [[物品ID,个数], ...]
    list        BeautyReturnItems;    // 红颜效果返还道具基数 [[物品ID,个数], ...]
    list        TitleReturnItems;    // 称号效果返还道具基数 [[物品ID,个数], ...]
    list        RecommendAwardMoney;    // 阵容推荐激活奖励货币 类型|值
};
@@ -410,6 +411,10 @@
    list        AttrIDList;    //属性ID列表
    list        InitAttrValueList;    //初始属性值列表
    list        AttrPerStarAddList;    //每星加成值列表
    BYTE        EffType;    //天赋效果类型
    DWORD        EffTypeValue;    //效果类型值
    DWORD        EffValue;    //效果初始值
    DWORD        EffPerStarAdd;    //效果每星成长
};
//形象表
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -3458,6 +3458,7 @@
# 称号
Def_PDict_TitleState = "TitleState_%s"  # 称号状态,参数(key编号)
Def_PDict_TitleEndTime = "TitleEndTime_%s"  # 称号到期时间戳,0为永久,参数(称号ID)
Def_PDict_TitleGoldRewardTime = "TitleGRewardTime_%s"  # 称号每日俸禄上次发放时间戳,参数(称号ID)
Def_PDict_TitleStar = "TitleStar_%s"  # 称号星级,参数(称号ID)
# 形象
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Dingjunge.py
@@ -52,8 +52,8 @@
    else:
        todayLineID = value1
        highestLineID = paramList[1] if len(paramList) > 1 else None
        if not todayLineID:
            todayLineID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_DJGLineID)
        #if not todayLineID:
        #    todayLineID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_DJGLineID)
        if not highestLineID:
            highestLineID = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FBPassLineID % mapID)
            
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/HJG.py
@@ -44,7 +44,7 @@
    value1 = msgList[0]
    
    # 删除称号
    if value1 == "t1":
    if value1 == "t0":
        titleID = msgList[1] if len(msgList) > 1 else 0
        if not titleID:
            for index in range(ipyDataMgr.GetTitleCount()):
@@ -52,8 +52,7 @@
                titleID = ipyData.GetTitleID()
                if not GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_TitleState, titleID):
                    continue
                GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_PDict_TitleState, titleID, 0)
                PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TitleEndTime % titleID, 0)
                PlayerHJG.DelTitle(curPlayer, titleID, False)
                PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TitleStar % titleID, 0)
                syncTitleIDList.append(titleID)
        else:
@@ -61,8 +60,7 @@
            if not ipyData:
                GameWorld.DebugAnswer(curPlayer, "该称号不存在:%s" % titleID)
                return
            GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_PDict_TitleState, titleID, 0)
            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TitleEndTime % titleID, 0)
            PlayerHJG.DelTitle(curPlayer, titleID, False)
            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TitleStar % titleID, 0)
            syncTitleIDList.append(titleID)
        GameWorld.DebugAnswer(curPlayer, "删除称号:%s" % syncTitleIDList)
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_Dingjunge.py
@@ -25,7 +25,10 @@
import IpyGameDataPY
import NetPackCommon
import PlayerOnline
import PlayerHJG
import ChConfig
import math
# 自动选择排序优先级索引
(
@@ -220,7 +223,7 @@
        awardIpyData = quickIpyData
    if not awardIpyData:
        return
    awardItemList = awardIpyData.GetQuickAwardList()
    quickAwardList = awardIpyData.GetQuickAwardList()
    
    # 设置起始层关卡
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_DJGLineID, todayLineID)
@@ -229,6 +232,14 @@
    GivePassLayerEff(curPlayer, addEffCnt)
    SyncDingjungeInfo(curPlayer)
    
    awardItemList = []
    isBind = ItemControler.GetIsBindValue(srcSign=ChConfig.ItemSrcSign_TitleEff)
    djgPer = PlayerHJG.GetTitleEffInfo(curPlayer, PlayerHJG.TitleEff_DingjungeQuickPer)[0]
    for itemID, itemCount in quickAwardList:
        awardItemList.append([itemID, itemCount])
        if djgPer:
            itemCountEx = int(math.ceil(itemCount * djgPer / 100.0))
            awardItemList.append([itemID, itemCountEx, isBind])
    ItemControler.GivePlayerItemOrMail(curPlayer, awardItemList, event=["Dingjunge", False, {}])
    return
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_Zhanchui.py
@@ -23,6 +23,7 @@
import PlayerSuccess
import ShareDefine
import PlayerTask
import PlayerHJG
import ChConfig
def OnTurnFightRequest(curPlayer, mapID, funcLineID, tagType, tagID, valueList):
@@ -80,6 +81,12 @@
        itemList += [[exItemID, exItemCount, isBind]] # 标记是红颜效果额外获得的
        GameWorld.DebugLog("红颜额外增加扫荡物品奖励: exItemID=%s, exItemCount=%s, itemList=%s" % (exItemID, exItemCount, itemList))
        
    isBind = ItemControler.GetIsBindValue(srcSign=ChConfig.ItemSrcSign_TitleEff)
    exItemCount, exItemID = PlayerHJG.GetTitleEffInfo(curPlayer, PlayerHJG.TitleEff_FBZhanchuiItemEx) # 扫荡额外物品奖励
    if exItemCount and exItemID:
        itemList += [[exItemID, exItemCount, isBind]] # 标记是称号效果额外获得的
        GameWorld.DebugLog("称号额外增加扫荡物品奖励: exItemID=%s, exItemCount=%s, itemList=%s" % (exItemID, exItemCount, itemList))
    ItemControler.GivePlayerItemOrMail(curPlayer, itemList, event=["Zhanchui", False, {}], isNotifyAward=False)
    
    isPass = 1
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
@@ -239,6 +239,7 @@
                        ("list", "BookActAwardMoney", 0),
                        ("list", "DismissReturnItems", 0),
                        ("list", "BeautyReturnItems", 0),
                        ("list", "TitleReturnItems", 0),
                        ("list", "RecommendAwardMoney", 0),
                        ),
@@ -389,6 +390,10 @@
                        ("list", "AttrIDList", 0),
                        ("list", "InitAttrValueList", 0),
                        ("list", "AttrPerStarAddList", 0),
                        ("BYTE", "EffType", 0),
                        ("DWORD", "EffTypeValue", 0),
                        ("DWORD", "EffValue", 0),
                        ("DWORD", "EffPerStarAdd", 0),
                        ),
                "Model":(
@@ -2048,7 +2053,8 @@
    def GetBookActAwardMoney(self): return self.attrTuple[7] #  图鉴激活奖励货币 类型|值 list
    def GetDismissReturnItems(self): return self.attrTuple[8] #  遣散每星返还道具 [[物品ID,个数], ...] list
    def GetBeautyReturnItems(self): return self.attrTuple[9] #  红颜效果返还道具基数 [[物品ID,个数], ...] list
    def GetRecommendAwardMoney(self): return self.attrTuple[10] #  阵容推荐激活奖励货币 类型|值 list
    def GetTitleReturnItems(self): return self.attrTuple[10] #  称号效果返还道具基数 [[物品ID,个数], ...] list
    def GetRecommendAwardMoney(self): return self.attrTuple[11] #  阵容推荐激活奖励货币 类型|值 list
# 武将品质突破表
class IPY_HeroQualityBreak():
@@ -2257,7 +2263,11 @@
    def GetStarMax(self): return self.attrTuple[6] # 最高星级 BYTE
    def GetAttrIDList(self): return self.attrTuple[7] # 属性ID列表 list
    def GetInitAttrValueList(self): return self.attrTuple[8] # 初始属性值列表 list
    def GetAttrPerStarAddList(self): return self.attrTuple[9] # 每星加成值列表 list
    def GetAttrPerStarAddList(self): return self.attrTuple[9] # 每星加成值列表 list
    def GetEffType(self): return self.attrTuple[10] # 天赋效果类型 BYTE
    def GetEffTypeValue(self): return self.attrTuple[11] # 效果类型值 DWORD
    def GetEffValue(self): return self.attrTuple[12] # 效果初始值 DWORD
    def GetEffPerStarAdd(self): return self.attrTuple[13] # 效果每星成长 DWORD
# 形象表
class IPY_Model():
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerBeauty.py
@@ -590,14 +590,13 @@
    # 保存计算值
    GameWorld.DebugLog("红颜属性: %s" % attrDict, playerID)
    GameWorld.DebugLog("红颜效果: %s" % effTypeDict, playerID)
    PyGameData.g_beautyEffTypeDict[playerID] = effTypeDict
    PlayerOnline.GetOnlinePlayer(curPlayer).SetCalcAttr(ChConfig.Def_CalcAttr_Beauty, attrDict)
    PlayerOnline.GetOnlinePlayer(curPlayer).SetCalcAttr(ChConfig.Def_CalcAttr_Beauty, attrDict, effTypeDict)
    return
def GetBeautyEffInfo(curPlayer, effType):
    ## 获取红颜特殊效果信息
    # @return: effValue, effTypeValue
    effTypeDict = PyGameData.g_beautyEffTypeDict.get(curPlayer.GetPlayerID(), {})
    effTypeDict = PlayerOnline.GetOnlinePlayer(curPlayer).GetCalcSpecInfo(ChConfig.Def_CalcAttr_Beauty)
    return effTypeDict.get(effType, [0, 0])
def SyncBeautyInfo(curPlayer, beautyIDList=None, skinIDList=None):
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py
@@ -50,6 +50,7 @@
import PlayerHero
import PlayerTree
import PlayerLLMJ
import PlayerHJG
import DBDataMgr
import datetime
@@ -288,6 +289,7 @@
    PlayerLLMJ.PlayerOnDay(curPlayer)
    FunctionNPCCommon.ShopItemOnDay(curPlayer)
    OpenServerActivity.PlayerOnDay(curPlayer)
    PlayerHJG.PlayerOnDay(curPlayer)
    
    # 特殊时间点X点过天
    #elif onEventType == ShareDefine.Def_OnEventTypeEx:
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHJG.py
@@ -26,6 +26,7 @@
import NetPackCommon
import PlayerFace
import PlayerHero
import PlayerMail
import ChConfig
import random
@@ -36,6 +37,14 @@
HJGType_FacePic = 3
HJGType_ChatBox = 4
HJGType_Title = 5
# 称号效果类型
(
TitleEff_FBZhanchuiItemEx, # 1.白骨盈野扫荡额外物品奖励      TypeValue:物品ID  Value:数量
TitleEff_DayGold, # 2.每天俸禄元宝数量      Value:元宝数量
TitleEff_HeroItemExPer, # 3.遣散/吞噬武将额外返还      Value:百分比
TitleEff_DingjungeQuickPer, # 4. 定军阁速战获取奖励提高百分比      Value:百分比
) = range(1, 1 + 4)
def OnPlayerLogin(curPlayer):
    SyncTitleInfo(curPlayer)
@@ -49,6 +58,10 @@
    OnMinuteModel(curPlayer)
    PlayerFace.OnMinute(curPlayer)
    PlayerChatBox.OnMinute(curPlayer)
    return
def PlayerOnDay(curPlayer):
    OnDayTitle(curPlayer)
    return
#// B2 25 幻境阁操作 #tagCSHJGOP
@@ -134,6 +147,7 @@
    
    playerID = curPlayer.GetPlayerID()
    attrDict = {}
    titleEffDict = {}
    
    ipyDataMgr = IpyGameDataPY.IPY_Data()
    # 称号
@@ -153,6 +167,19 @@
            perStarAdd = perStarAddList[aIndex] if len(perStarAddList) > aIndex else 0
            attrValue = initValue + perStarAdd * star
            attrDict[attrID] = attrDict.get(attrID, 0) + attrValue
        # 特殊效果
        effType = ipyData.GetEffType()
        effTypeValue = ipyData.GetEffTypeValue()
        effValue = ipyData.GetEffValue()
        effPerStarAdd = ipyData.GetEffPerStarAdd()
        if effType:
            effValue = effValue + effPerStarAdd * star
            if effType not in titleEffDict:
                titleEffDict[effType] = [0, effTypeValue]
            titleEffDict[effType][0] = titleEffDict[effType][0] + effValue
            #GameWorld.DebugLog("称号特殊效果: titleID=%s,effType=%s,star=%s,%s" % (titleID, effType, star, titleEffDict), playerID)
    #GameWorld.DebugLog("幻境阁累加称号,总属性: %s" % attrDict)
    
    # 形象
@@ -234,9 +261,83 @@
    # 保存计算值
    GameWorld.DebugLog("幻境阁属性: %s" % attrDict, playerID)
    PlayerOnline.GetOnlinePlayer(curPlayer).SetCalcAttr(ChConfig.Def_CalcAttr_HJG, attrDict)
    PlayerOnline.GetOnlinePlayer(curPlayer).SetCalcSpecInfo("Title", titleEffDict)
    return
## ----------------------------------------- 称号 --------------------------------------------------
def GetTitleEffInfo(curPlayer, effType):
    ## 获取称号特殊效果信息
    # @return: effValue, effTypeValue
    titleEffDict = PlayerOnline.GetOnlinePlayer(curPlayer).GetCalcSpecInfo("Title")
    return titleEffDict.get(effType, [0, 0])
def __GiveTitleGoldSalary(curPlayer, ipyData):
    ## 给称号每日俸禄 - 邮件发放
    if not ipyData:
        return
    titleID = ipyData.GetTitleID()
    effType = ipyData.GetEffType()
    if effType != TitleEff_DayGold:
        #GameWorld.DebugLog("非俸禄效果称号不处理! titleID=%s" % titleID)
        return
    if not GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_TitleState, titleID):
        #GameWorld.DebugLog("未激活俸禄效果称号不处理! titleID=%s" % titleID)
        return
    playerID = curPlayer.GetPlayerID()
    curTime = int(time.time())
    lastRewardTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TitleGoldRewardTime % titleID)
    if not lastRewardTime:
        lastRewardTime = curTime - 3600 * 24 # 未发放过的设置为昨天,让今天也可以发放
        #GameWorld.DebugLog("从未发放过该称号俸禄")
    endTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TitleEndTime % titleID)
    calcTime = curTime if (not endTime or endTime > curTime) else endTime
    rewardDays = GameWorld.GetDiff_Day(calcTime, lastRewardTime)
    GameWorld.DebugLog("俸禄称号可发放天数: %s,titleID=%s,lastRewardTime=%s,calcTime=%s,endTime=%s"
                       % (rewardDays, titleID, GameWorld.ChangeTimeNumToStr(lastRewardTime), GameWorld.ChangeTimeNumToStr(calcTime),
                          GameWorld.ChangeTimeNumToStr(endTime)), playerID)
    if rewardDays <= 0:
        #GameWorld.DebugLog("不用发放称号每日俸禄: titleID=%s" % (titleID), playerID)
        return
    moneyItemID = ItemCommon.GetMoneyItemID(IPY_GameWorld.TYPE_Price_Gold_Money)
    if not moneyItemID:
        return
    star = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TitleStar % titleID)
    effValue = ipyData.GetEffValue()
    effPerStarAdd = ipyData.GetEffPerStarAdd()
    goldOneDay = effValue + effPerStarAdd * star
    giveGold = int(goldOneDay * rewardDays)
    mailItemList = [[moneyItemID, giveGold]]
    GameWorld.DebugLog("邮件发放称号每日俸禄! titleID=%s,rewardDays=%s,goldOneDay=%s, %s" % (titleID, rewardDays, goldOneDay, mailItemList), playerID)
    updRewardTime = curTime
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TitleGoldRewardTime % titleID, updRewardTime)
    if rewardDays > 1:
        PlayerMail.SendMailByKey("TitleGoldSalaryDays", playerID, mailItemList, [titleID, rewardDays], limitDays=3)
    else:
        PlayerMail.SendMailByKey("TitleGoldSalaryDay", playerID, mailItemList, [titleID], limitDays=3)
    return
def OnDayTitle(curPlayer):
    ipyDataMgr = IpyGameDataPY.IPY_Data()
    for index in range(ipyDataMgr.GetTitleCount()):
        ipyData = ipyDataMgr.GetTitleByIndex(index)
        titleID = ipyData.GetTitleID()
        if not GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_TitleState, titleID):
            # 未激活的不处理
            continue
        __GiveTitleGoldSalary(curPlayer, ipyData) # 过天发放
    return
def OnMinuteTitle(curPlayer):
    curTime = int(time.time())
@@ -315,6 +416,7 @@
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TitleEndTime % titleID, updEndTime)
    RefreshHJGAttr(curPlayer)
    SyncTitleInfo(curPlayer, [titleID])
    __GiveTitleGoldSalary(curPlayer, ipyData) # 激活发放
    return True
def DelTitle(curPlayer, titleID, isRefreshAttr=True, notifyMail=""):
@@ -325,8 +427,10 @@
    if not GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_TitleState, titleID):
        return
    GameWorld.Log("删除称号: titleID=%s,notifyMail=%s" % (titleID, notifyMail), playerID)
    __GiveTitleGoldSalary(curPlayer, ipyData) # 过期补发
    GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_PDict_TitleState, titleID, 0)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TitleEndTime % titleID, 0)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TitleGoldRewardTime % titleID, 0)
    # 星级不重置,重新激活后再次生效
    
    if PlayerControl.GetTitleID(curPlayer) == titleID:
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHero.py
@@ -30,10 +30,12 @@
import PlayerPreset
import PlayerBeauty
import PlayerTask
import PlayerHJG
import GameWorld
import ChConfig
import random
import math
    
def PlayerOnDay(curPlayer):
    if curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroAwakeRebirthCnt):
@@ -1499,21 +1501,32 @@
def __calcHeroQualityReturnItemEx(curPlayer, qualityIpyData, returnItemExDict):
    ## 其他功能额外返还
    
    # 红颜特殊效果
    # 红颜特殊效果: 遣散/吞噬额外返还百分比
    beautyReturnItems = qualityIpyData.GetBeautyReturnItems()
    if beautyReturnItems:
        isBind = ItemControler.GetIsBindValue(srcSign=ChConfig.ItemSrcSign_BeautyEff)
        retPer = PlayerBeauty.GetBeautyEffInfo(curPlayer, PlayerBeauty.EffType_HeroItemExPer)[0] # 红颜遣散/吞噬额外返还百分比
        retPer = PlayerBeauty.GetBeautyEffInfo(curPlayer, PlayerBeauty.EffType_HeroItemExPer)[0]
        for itemID, itemCount in beautyReturnItems:
            if not retPer:
                break
            key = (itemID, isBind)
            retCnt = max(1, int(round(itemCount * retPer / 100.0)))
            retCnt = max(1, int(math.ceil(itemCount * retPer / 100.0)))
            returnItemExDict[key] = returnItemExDict.get(key, 0) + retCnt
        GameWorld.DebugLog("    红颜返还: retPer=%s,%s,总%s" % (retPer, beautyReturnItems, returnItemExDict))
        
    # 称号特殊效果
    # 称号特殊效果: 遣散/吞噬额外返还百分比
    titleReturnItems = qualityIpyData.GetTitleReturnItems()
    if titleReturnItems:
        isBind = ItemControler.GetIsBindValue(srcSign=ChConfig.ItemSrcSign_TitleEff)
        retPer = PlayerHJG.GetTitleEffInfo(curPlayer, PlayerHJG.TitleEff_HeroItemExPer)[0]
        for itemID, itemCount in titleReturnItems:
            if not retPer:
                break
            key = (itemID, isBind)
            retCnt = max(1, int(math.ceil(itemCount * retPer / 100.0)))
            returnItemExDict[key] = returnItemExDict.get(key, 0) + retCnt
        GameWorld.DebugLog("    称号返还: retPer=%s,%s,总%s" % (retPer, titleReturnItems, returnItemExDict))
    return
#// B4 12 战斗阵容预设保存 #tagCSHeroPresetSave
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerOnline.py
@@ -235,6 +235,11 @@
    def GetCalcSpecInfo(self, calcIndex, presetID=0):
        calcKey = (calcIndex, presetID) if presetID else calcIndex
        return self._calcSpecEffDict.get(calcKey, {})
    def SetCalcSpecInfo(self, calcKey, specEffInfo, presetID=0):
        # @param calcKey: 与calcIndex公用,只是使用其他自定义key,一般用于同个属性功能点,但是又需要区分不同的子功能点时可用
        calcKey = (calcKey, presetID) if presetID else calcKey
        self._calcSpecEffDict[calcKey] = specEffInfo
        return
    def GetCalcAttr(self, calcIndex, presetID=0):
        calcKey = (calcIndex, presetID) if presetID else calcIndex
        return self._calcAttrDict.get(calcKey, {})
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py
@@ -48,8 +48,6 @@
g_arenaPlayerMatchDict = {} # 本服竞技场玩家匹配记录缓存 {playerID:[tagPlayerID, ...], ...}
g_qunyingPlayerMatchDict = {} # 群英榜玩家匹配记录缓存,该功能允许重复的机器人ID,所以记录匹配名次 {playerID:[rank, ...], ...}
g_beautyEffTypeDict = {} # 红颜特殊效果缓存 {playerID:{effType:[effValue, effTypeValue], ...}, ...}
g_mapIDTxtInfo = {} # MapID.txt 加载的信息
g_realmDiffPlayerDict = {} # 境界难度玩家信息 {realm:[playerID, ...], ...}
g_realmDiffNPCRefresh = {} # {(lineID, realm):{refreshID:tagNPCRefresh, ...}}