From 5c8b87ef0812652af80655923ac5ca277b346f61 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期四, 12 三月 2026 18:38:57 +0800
Subject: [PATCH] 541 【幻境阁】新增称号加成效果-服务端

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Dingjunge.py                        |    4 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerBeauty.py                          |    5 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py                                   |    2 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_Dingjunge.py |   13 +++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHero.py                            |   23 ++++-
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_Zhanchui.py  |    7 +
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerOnline.py                          |    5 +
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py                                |   14 +++
 PySysDB/PySysDBPY.h                                                                                                 |    5 +
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/HJG.py                              |    8 -
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py                    |    2 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py                                     |    1 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHJG.py                             |  104 ++++++++++++++++++++++++++
 13 files changed, 173 insertions(+), 20 deletions(-)

diff --git a/PySysDB/PySysDBPY.h b/PySysDB/PySysDBPY.h
index c1542a9..ff5773e 100644
--- a/PySysDB/PySysDBPY.h
+++ b/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;	//效果每星成长
 };
 
 //形象表
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
index 7b5990c..17cf530 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/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)
 
 # 形象
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Dingjunge.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Dingjunge.py
index cb08d07..151f122 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Dingjunge.py
+++ b/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)
             
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/HJG.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/HJG.py
index 22c4c1a..5ab9503 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/HJG.py
+++ b/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)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_Dingjunge.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_Dingjunge.py
index f45f86a..a5d190e 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_Dingjunge.py
+++ b/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
 
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_Zhanchui.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_Zhanchui.py
index 5f19cd4..e7cd5d8 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_Zhanchui.py
+++ b/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
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
index b9d1d70..e71a47d 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
+++ b/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():
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerBeauty.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerBeauty.py
index 31a2aeb..d1a3b4f 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerBeauty.py
+++ b/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):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py
index cc038a9..b47dad3 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py
+++ b/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:
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHJG.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHJG.py
index 7ff73d0..4692c04 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHJG.py
+++ b/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:
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 3c974cf..751c96b 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHero.py
+++ b/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
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 cc59c81..aaf5e53 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerOnline.py
+++ b/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, {})
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py
index a6e1d69..b6ed785 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py
+++ b/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, ...}}

--
Gitblit v1.8.0