From c80c8718c507a7e52f065eee9e35bb4f27573f48 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期五, 05 十二月 2025 11:07:07 +0800
Subject: [PATCH] 374 【活动内容】开服庆典-服务端

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/ServerDay.py                        |   25 +
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py                                  |   56 --
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py                              |  535 -----------------------
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTreasure.py                        |    7 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py                            |    3 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_Arena.py     |    2 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTree.py                            |    3 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_MainLevel.py |    3 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py                                |   85 ---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerGoldRush.py                        |    4 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py                              |   14 
 PySysDB/PySysDBPY.h                                                                                                 |   32 -
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py                         |    4 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py                                  |   39 +
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHorse.py                           |    2 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerPrestigeSys.py                     |    2 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_Tianzi.py    |    9 
 /dev/null                                                                                                           |  185 --------
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHero.py                            |    5 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_Zhanchui.py  |    3 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py                                |    2 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/OpenServerActivity.py                    |   71 +++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerSuccess.py                         |  159 ++++--
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py                    |    4 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py                                     |   40 -
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Success.py                          |    8 
 26 files changed, 307 insertions(+), 995 deletions(-)

diff --git a/PySysDB/PySysDBPY.h b/PySysDB/PySysDBPY.h
index d43d617..fadf0af 100644
--- a/PySysDB/PySysDBPY.h
+++ b/PySysDB/PySysDBPY.h
@@ -1324,15 +1324,6 @@
 	BYTE		SkillResist;	//是否技能抵抗
 };
 
-//Boss首杀
-
-struct tagBOSSFirstKill
-{
-	DWORD		_NPCID;	//ID
-	WORD		PerPlayerMoneyAward;	// 首杀全服玩家奖励灵石额度/人
-	list		PersonFirstKillAward;	// 个人首次击杀奖励 [[物品ID,个数,是否拍品], ...]
-};
-
 //NPC秀表
 
 struct tagNPCShow
@@ -1809,29 +1800,6 @@
 	BYTE		ChooseItemCount;	//选择个数
 	dict		LibItemInfo;	//物品编号对应物品信息 {物品编号:[物品ID,个数,是否拍品,可选次数], ...}  0不限次数
 	list		NotifyItemNumList;	//需要广播的编号列表
-};
-
-//BOSS复活活动时间表
-
-struct tagActBossReborn
-{
-	DWORD		_CfgID;	//配置ID
-	char		StartDate;	//开启日期
-	char		EndDate;	//结束日期
-	BYTE		ResetType;	//重置类型,0-0点重置;1-5点重置
-	WORD		LVLimit;	//限制等级
-	BYTE		TemplateID;	//模板编号
-};
-
-//BOSS复活表
-
-struct tagBossReborn
-{
-	BYTE		_TemplateID;	//模板ID
-	BYTE		_ID;	//活动条目ID
-	DWORD		TotalTimes;	//可完成的总次数,0表示不限次数
-	WORD		SingleTimes;	//单次领奖需要的次数
-	dict		Reward;	//奖励物品ID1
 };
 
 //多倍修行点活动时间表
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py
index 873f460..82998ef 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py
@@ -30,6 +30,7 @@
 import PlayerLLMJ
 import PlayerPrestigeSys
 import CrossServerPackLogic
+import PlayerSuccess
 import IpyGameDataPY
 import PlayerOnline
 import NPCCommon
@@ -1325,6 +1326,7 @@
         PlayerLLMJ.AddUseZhanchui(curPlayer, useZhanchui)
         PlayerPrestigeSys.AddRealmTaskValue(curPlayer, PlayerPrestigeSys.RealmTaskType_UseXiantao, useZhanchui)
         PlayerTask.AddTaskValue(curPlayer, ChConfig.TaskType_CutTree, useZhanchui)
+        PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_OSACutTree, useZhanchui)
         PlayerActivity.AddDailyTaskValue(curPlayer, ChConfig.DailyTask_CutTree, useZhanchui)
         
     # 历练秘境额外经验
@@ -1337,6 +1339,7 @@
     if killNPCCnt > 0:
         PlayerTask.AddTaskValue(curPlayer, ChConfig.TaskType_KillNPC, killNPCCnt)
         PlayerActivity.AddDailyTaskValue(curPlayer, ChConfig.DailyTask_KillNPC, killNPCCnt)
+        PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_OSAKillNPC, killNPCCnt)
         
     # 结算逻辑最后重置数据
     mainFightMgr.resetMainFightExDataRec()
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
index d35886c..c3336d1 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -3473,16 +3473,6 @@
 Def_PDict_CollectWordsExchangeCount = "CollectWordsCount_%s_%s"  # 兑换编号对应已兑换次数,参数(活动编号, 兑换编号)
 Def_PDict_CollectWordsGJSeconds = "CollectWordsGJSeconds_%s"  # 挂机未处理收益的秒数,参数(活动编号)
 
-#BOSS复活
-Def_PDict_BossRebornID = "BossRebornID"  # 玩家身上的BOSS复活活动ID,唯一标识,取活动开始日期time值
-Def_PDict_BossRebornTemplateID = "BossRebornTemplateID"  # 玩家身上的BOSS复活模板ID
-Def_PDict_BRActionCurTimes = "BRActionCurTimes_%s" #当前完成次数 参数BOSS复活活动ID
-Def_PDict_BRActionGotTimes = "BRActionGotTimes_%s" #当前已领次数 参数BOSS复活活动ID
-Def_PDict_BRActionWorldLV = "BRActionWorldLV" #BOSS复活活动开启时世界等级
-
-#Boss首杀
-Def_PDict_BossFirstKillState = "BossFirstKillState_%s" # boss首杀相关状态记录
-
 #限时抢购活动
 Def_PDict_FlashSaleID = "FlashSaleID_%s"  # 玩家身上的限时抢购活动ID,唯一标识,取活动开始日期time,参数(活动编号)
 Def_PDict_FlashSaleState = "FlashSaleState_%s"  # 玩家身上的限时抢购活动state,参数(活动编号)
@@ -3705,6 +3695,10 @@
 # 成就 Def_PDictType_Success
 Def_PDict_SuccessValue = "Succ_%s_%s" # 当前次数值,参数(成就类型、条件)
 Def_PDict_SuccessAward = "Succ_Award_%s" # 成就领奖记录,按成就ID位存储0-未领,1-已领,参数(key编号)
+
+# 开服庆典
+Def_PDict_OSACelebrationPoint = "OSACelebrationPoint" # 开服庆典累计积分
+Def_PDict_OSACelebrationAward = "OSACelebrationAward" # 开服庆典累计积分阶段奖励领奖状态,按积分排序后的索引位记录是否已领取
 
 # 通天令
 Def_PDict_TTL_StartTime = "TTL_StartTime" # 本轮通天令开始时间戳
@@ -4382,7 +4376,7 @@
 Def_GiveMoney_Warehouse, # 仓库
 Def_GiveMoney_SellPackItem, # 出售背包物品
 Def_GiveMoney_CollectNPC, # 采集NPC
-Def_GiveMoney_BossFirstKill, # Boss首杀
+Def_GiveMoney_20,
 Def_GiveMoney_21,
 Def_GiveMoney_Trade, # 交易
 Def_GiveMoney_23,
@@ -4417,7 +4411,6 @@
 Def_GiveMoney_Warehouse:"Warehouse",
 Def_GiveMoney_SellPackItem:"SellPackItem",
 Def_GiveMoney_CollectNPC:"CollectNPC",
-Def_GiveMoney_BossFirstKill:"BossFirstKill",
 Def_GiveMoney_Trade:"Trade",
 Def_GiveMoney_FreeGoods:"FreeGoods",
 Def_GiveMoney_BindJadeWheel:"BindJadeWheel",
@@ -4798,7 +4791,7 @@
 Def_RewardType_BeautyLVAward, # 红颜等级奖励 6
 Def_RewardType_DayRealmPoint, # 每日任务修行点奖励7
 Def_RewardType_FirstCharge, # 首充礼包奖励8
-Def_RewardType_MWSoulAward, # 法宝之魂奖励9 -废弃
+Def_RewardType_OSACelebrationPointAward, # 开服庆典积分阶段奖励 9
 Def_RewardType_FreeGoods, # 极品白拿10
 Def_RewardType_CostRebate, # 消费返利11
 Def_RewardType_BossReborn, # BOSS复活12
@@ -4873,27 +4866,6 @@
 Def_RewardType_ADAward, # 广告奖励 81
 Def_RewardType_TreeFreeTime, # 仙树免费减时 82
 )= range(83)
-
-#boss复活相关活动定义
-BossRebornActIDList = (
-Def_BRAct_VIPBOSS, #进入VIPboss副本 1
-Def_BRAct_GodArea, #进入古神禁地副本 2
-Def_BRAct_MoneyPray, #铜钱祈愿 3
-Def_BRAct_ExpPray, #经验祈愿 4
-Def_BRAct_Treasure, #极品寻宝 5
-Def_BRAct_WorldBOSS, #击杀世界boss获得掉落归属 6
-Def_BRAct_BOSSHome, #击杀boss之家获得掉落归属 7
-Def_BRAct_FMT, #挑战封魔坛BOSS 8
-Def_BRAct_RunTask, #完成仙盟跑环 9
-Def_BRAct_XJMJ, #完成仙界秘境 10
-Def_BRAct_KirinHome, #完成麒麟之府 11
-Def_BRAct_TowerSweep, #符印塔扫荡 12
-Def_BRAct_RuneTreasure,  #符印寻宝 13
-Def_BRAct_FairyDomain,  #缥缈仙域 14
-Def_BRAct_FamilyBoss,  #仙盟BOSS 15
-Def_BRAct_ActivityPlace,  #活跃放置 16
-Def_BRAct_JSTreasure,  #绝世寻宝 17
-) = range(1, 17+1)
 
 #全民来嗨活动定义(仙界盛典)
 PeoplePartyActIDList = (
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
index 470ff06..475dfb6 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
@@ -8961,62 +8961,6 @@
 
 
 #------------------------------------------------------
-# A9 01 获取Boss首杀奖励 #tagCGGetBossFirstKillAward
-
-class  tagCGGetBossFirstKillAward(Structure):
-    _pack_ = 1
-    _fields_ = [
-                  ("Cmd", c_ubyte),
-                  ("SubCmd", c_ubyte),
-                  ("NPCID", c_int),    
-                  ("AwardType", c_ubyte),    # 0-首杀红包奖励;1-个人首杀奖励
-                  ]
-
-    def __init__(self):
-        self.Clear()
-        self.Cmd = 0xA9
-        self.SubCmd = 0x01
-        return
-
-    def ReadData(self, stringData, _pos=0, _len=0):
-        self.Clear()
-        memmove(addressof(self), stringData[_pos:], self.GetLength())
-        return _pos + self.GetLength()
-
-    def Clear(self):
-        self.Cmd = 0xA9
-        self.SubCmd = 0x01
-        self.NPCID = 0
-        self.AwardType = 0
-        return
-
-    def GetLength(self):
-        return sizeof(tagCGGetBossFirstKillAward)
-
-    def GetBuffer(self):
-        return string_at(addressof(self), self.GetLength())
-
-    def OutputString(self):
-        DumpString = '''// A9 01 获取Boss首杀奖励 //tagCGGetBossFirstKillAward:
-                                Cmd:%s,
-                                SubCmd:%s,
-                                NPCID:%d,
-                                AwardType:%d
-                                '''\
-                                %(
-                                self.Cmd,
-                                self.SubCmd,
-                                self.NPCID,
-                                self.AwardType
-                                )
-        return DumpString
-
-
-m_NAtagCGGetBossFirstKillAward=tagCGGetBossFirstKillAward()
-ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCGGetBossFirstKillAward.Cmd,m_NAtagCGGetBossFirstKillAward.SubCmd))] = m_NAtagCGGetBossFirstKillAward
-
-
-#------------------------------------------------------
 # A9 07 点赞仙宫 #tagCGLikeXiangong
 
 class  tagCGLikeXiangong(Structure):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
index 502680d..94bbe03 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -28961,454 +28961,21 @@
 
 
 #------------------------------------------------------
-# AB 01 Boss首杀玩家奖励信息 #tagMCBossFirstKillStateInfo
+# AB 05 开服庆典信息 #tagSCOSACelebrationInfo
 
-class  tagMCBossFirstKillState(Structure):
-    _pack_ = 1
-    _fields_ = [
-                  ("NPCID", c_int),    
-                  ("FKState", c_int),    # 玩家该boss首杀相关状态,按位存:个位-玩家是否击杀过,十位-是否已领取首杀全服奖励,百位-是否已领取个人首杀奖励
-                  ]
-
-    def __init__(self):
-        self.Clear()
-        return
-
-    def ReadData(self, stringData, _pos=0, _len=0):
-        self.Clear()
-        memmove(addressof(self), stringData[_pos:], self.GetLength())
-        return _pos + self.GetLength()
-
-    def Clear(self):
-        self.NPCID = 0
-        self.FKState = 0
-        return
-
-    def GetLength(self):
-        return sizeof(tagMCBossFirstKillState)
-
-    def GetBuffer(self):
-        return string_at(addressof(self), self.GetLength())
-
-    def OutputString(self):
-        DumpString = '''// AB 01 Boss首杀玩家奖励信息 //tagMCBossFirstKillStateInfo:
-                                NPCID:%d,
-                                FKState:%d
-                                '''\
-                                %(
-                                self.NPCID,
-                                self.FKState
-                                )
-        return DumpString
-
-
-class  tagMCBossFirstKillStateInfo(Structure):
-    Head = tagHead()
-    BossCount = 0    #(BYTE BossCount)
-    FirstKillStateList = list()    #(vector<tagMCBossFirstKillState> FirstKillStateList)
-    data = None
-
-    def __init__(self):
-        self.Clear()
-        self.Head.Cmd = 0xAB
-        self.Head.SubCmd = 0x01
-        return
-
-    def ReadData(self, _lpData, _pos=0, _Len=0):
-        self.Clear()
-        _pos = self.Head.ReadData(_lpData, _pos)
-        self.BossCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
-        for i in range(self.BossCount):
-            temFirstKillStateList = tagMCBossFirstKillState()
-            _pos = temFirstKillStateList.ReadData(_lpData, _pos)
-            self.FirstKillStateList.append(temFirstKillStateList)
-        return _pos
-
-    def Clear(self):
-        self.Head = tagHead()
-        self.Head.Clear()
-        self.Head.Cmd = 0xAB
-        self.Head.SubCmd = 0x01
-        self.BossCount = 0
-        self.FirstKillStateList = list()
-        return
-
-    def GetLength(self):
-        length = 0
-        length += self.Head.GetLength()
-        length += 1
-        for i in range(self.BossCount):
-            length += self.FirstKillStateList[i].GetLength()
-
-        return length
-
-    def GetBuffer(self):
-        data = ''
-        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
-        data = CommFunc.WriteBYTE(data, self.BossCount)
-        for i in range(self.BossCount):
-            data = CommFunc.WriteString(data, self.FirstKillStateList[i].GetLength(), self.FirstKillStateList[i].GetBuffer())
-        return data
-
-    def OutputString(self):
-        DumpString = '''
-                                Head:%s,
-                                BossCount:%d,
-                                FirstKillStateList:%s
-                                '''\
-                                %(
-                                self.Head.OutputString(),
-                                self.BossCount,
-                                "..."
-                                )
-        return DumpString
-
-
-m_NAtagMCBossFirstKillStateInfo=tagMCBossFirstKillStateInfo()
-ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCBossFirstKillStateInfo.Head.Cmd,m_NAtagMCBossFirstKillStateInfo.Head.SubCmd))] = m_NAtagMCBossFirstKillStateInfo
-
-
-#------------------------------------------------------
-# AB 03 Boss复活玩家活动信息 #tagMCBossRebornPlayerInfo
-
-class  tagMCBossRebornData(Structure):
-    _pack_ = 1
-    _fields_ = [
-                  ("ActID", c_ubyte),    #活动ID
-                  ("CurTimes", c_ushort),    #已完成次数
-                  ("GotTimes", c_ushort),    #已领取次数
-                  ]
-
-    def __init__(self):
-        self.Clear()
-        return
-
-    def ReadData(self, stringData, _pos=0, _len=0):
-        self.Clear()
-        memmove(addressof(self), stringData[_pos:], self.GetLength())
-        return _pos + self.GetLength()
-
-    def Clear(self):
-        self.ActID = 0
-        self.CurTimes = 0
-        self.GotTimes = 0
-        return
-
-    def GetLength(self):
-        return sizeof(tagMCBossRebornData)
-
-    def GetBuffer(self):
-        return string_at(addressof(self), self.GetLength())
-
-    def OutputString(self):
-        DumpString = '''// AB 03 Boss复活玩家活动信息 //tagMCBossRebornPlayerInfo:
-                                ActID:%d,
-                                CurTimes:%d,
-                                GotTimes:%d
-                                '''\
-                                %(
-                                self.ActID,
-                                self.CurTimes,
-                                self.GotTimes
-                                )
-        return DumpString
-
-
-class  tagMCBossRebornPlayerInfo(Structure):
-    Head = tagHead()
-    Count = 0    #(BYTE Count)//活动个数
-    DataList = list()    #(vector<tagMCBossRebornData> DataList)
-    data = None
-
-    def __init__(self):
-        self.Clear()
-        self.Head.Cmd = 0xAB
-        self.Head.SubCmd = 0x03
-        return
-
-    def ReadData(self, _lpData, _pos=0, _Len=0):
-        self.Clear()
-        _pos = self.Head.ReadData(_lpData, _pos)
-        self.Count,_pos = CommFunc.ReadBYTE(_lpData, _pos)
-        for i in range(self.Count):
-            temDataList = tagMCBossRebornData()
-            _pos = temDataList.ReadData(_lpData, _pos)
-            self.DataList.append(temDataList)
-        return _pos
-
-    def Clear(self):
-        self.Head = tagHead()
-        self.Head.Clear()
-        self.Head.Cmd = 0xAB
-        self.Head.SubCmd = 0x03
-        self.Count = 0
-        self.DataList = list()
-        return
-
-    def GetLength(self):
-        length = 0
-        length += self.Head.GetLength()
-        length += 1
-        for i in range(self.Count):
-            length += self.DataList[i].GetLength()
-
-        return length
-
-    def GetBuffer(self):
-        data = ''
-        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
-        data = CommFunc.WriteBYTE(data, self.Count)
-        for i in range(self.Count):
-            data = CommFunc.WriteString(data, self.DataList[i].GetLength(), self.DataList[i].GetBuffer())
-        return data
-
-    def OutputString(self):
-        DumpString = '''
-                                Head:%s,
-                                Count:%d,
-                                DataList:%s
-                                '''\
-                                %(
-                                self.Head.OutputString(),
-                                self.Count,
-                                "..."
-                                )
-        return DumpString
-
-
-m_NAtagMCBossRebornPlayerInfo=tagMCBossRebornPlayerInfo()
-ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCBossRebornPlayerInfo.Head.Cmd,m_NAtagMCBossRebornPlayerInfo.Head.SubCmd))] = m_NAtagMCBossRebornPlayerInfo
-
-
-#------------------------------------------------------
-# AB 04 Boss复活活动信息 #tagMCBossRebornInfo
-
-class  tagMCBossRebornAwardItem(Structure):
-    _pack_ = 1
-    _fields_ = [
-                  ("ItemID", c_int),    
-                  ("ItemCount", c_ushort),    
-                  ("IsBind", c_ubyte),    
-                  ]
-
-    def __init__(self):
-        self.Clear()
-        return
-
-    def ReadData(self, stringData, _pos=0, _len=0):
-        self.Clear()
-        memmove(addressof(self), stringData[_pos:], self.GetLength())
-        return _pos + self.GetLength()
-
-    def Clear(self):
-        self.ItemID = 0
-        self.ItemCount = 0
-        self.IsBind = 0
-        return
-
-    def GetLength(self):
-        return sizeof(tagMCBossRebornAwardItem)
-
-    def GetBuffer(self):
-        return string_at(addressof(self), self.GetLength())
-
-    def OutputString(self):
-        DumpString = '''// AB 04 Boss复活活动信息 //tagMCBossRebornInfo:
-                                ItemID:%d,
-                                ItemCount:%d,
-                                IsBind:%d
-                                '''\
-                                %(
-                                self.ItemID,
-                                self.ItemCount,
-                                self.IsBind
-                                )
-        return DumpString
-
-
-class  tagMCBossRebornTaskInfo(Structure):
-    TaskID = 0    #(BYTE TaskID)// id
-    TotalTimes = 0    #(BYTE TotalTimes)// 可完成总次数,0表示不限次数
-    SingleTimes = 0    #(BYTE SingleTimes)// 单次领奖需要次数
-    AwardItemCount = 0    #(BYTE AwardItemCount)// 奖励物品数
-    AwardItem = list()    #(vector<tagMCBossRebornAwardItem> AwardItem)// 奖励物品信息
-    data = None
-
-    def __init__(self):
-        self.Clear()
-        return
-
-    def ReadData(self, _lpData, _pos=0, _Len=0):
-        self.Clear()
-        self.TaskID,_pos = CommFunc.ReadBYTE(_lpData, _pos)
-        self.TotalTimes,_pos = CommFunc.ReadBYTE(_lpData, _pos)
-        self.SingleTimes,_pos = CommFunc.ReadBYTE(_lpData, _pos)
-        self.AwardItemCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
-        for i in range(self.AwardItemCount):
-            temAwardItem = tagMCBossRebornAwardItem()
-            _pos = temAwardItem.ReadData(_lpData, _pos)
-            self.AwardItem.append(temAwardItem)
-        return _pos
-
-    def Clear(self):
-        self.TaskID = 0
-        self.TotalTimes = 0
-        self.SingleTimes = 0
-        self.AwardItemCount = 0
-        self.AwardItem = list()
-        return
-
-    def GetLength(self):
-        length = 0
-        length += 1
-        length += 1
-        length += 1
-        length += 1
-        for i in range(self.AwardItemCount):
-            length += self.AwardItem[i].GetLength()
-
-        return length
-
-    def GetBuffer(self):
-        data = ''
-        data = CommFunc.WriteBYTE(data, self.TaskID)
-        data = CommFunc.WriteBYTE(data, self.TotalTimes)
-        data = CommFunc.WriteBYTE(data, self.SingleTimes)
-        data = CommFunc.WriteBYTE(data, self.AwardItemCount)
-        for i in range(self.AwardItemCount):
-            data = CommFunc.WriteString(data, self.AwardItem[i].GetLength(), self.AwardItem[i].GetBuffer())
-        return data
-
-    def OutputString(self):
-        DumpString = '''
-                                TaskID:%d,
-                                TotalTimes:%d,
-                                SingleTimes:%d,
-                                AwardItemCount:%d,
-                                AwardItem:%s
-                                '''\
-                                %(
-                                self.TaskID,
-                                self.TotalTimes,
-                                self.SingleTimes,
-                                self.AwardItemCount,
-                                "..."
-                                )
-        return DumpString
-
-
-class  tagMCBossRebornInfo(Structure):
-    Head = tagHead()
-    StartDate = ""    #(char StartDate[10])// 开始日期 y-m-d
-    EndtDate = ""    #(char EndtDate[10])// 结束日期 y-m-d
-    ResetType = 0    #(BYTE ResetType)// 重置类型,0-0点重置;1-5点重置
-    LimitLV = 0    #(WORD LimitLV)// 限制等级
-    TaskCnt = 0    #(BYTE TaskCnt)
-    TaskInfo = list()    #(vector<tagMCBossRebornTaskInfo> TaskInfo)
-    data = None
-
-    def __init__(self):
-        self.Clear()
-        self.Head.Cmd = 0xAB
-        self.Head.SubCmd = 0x04
-        return
-
-    def ReadData(self, _lpData, _pos=0, _Len=0):
-        self.Clear()
-        _pos = self.Head.ReadData(_lpData, _pos)
-        self.StartDate,_pos = CommFunc.ReadString(_lpData, _pos,10)
-        self.EndtDate,_pos = CommFunc.ReadString(_lpData, _pos,10)
-        self.ResetType,_pos = CommFunc.ReadBYTE(_lpData, _pos)
-        self.LimitLV,_pos = CommFunc.ReadWORD(_lpData, _pos)
-        self.TaskCnt,_pos = CommFunc.ReadBYTE(_lpData, _pos)
-        for i in range(self.TaskCnt):
-            temTaskInfo = tagMCBossRebornTaskInfo()
-            _pos = temTaskInfo.ReadData(_lpData, _pos)
-            self.TaskInfo.append(temTaskInfo)
-        return _pos
-
-    def Clear(self):
-        self.Head = tagHead()
-        self.Head.Clear()
-        self.Head.Cmd = 0xAB
-        self.Head.SubCmd = 0x04
-        self.StartDate = ""
-        self.EndtDate = ""
-        self.ResetType = 0
-        self.LimitLV = 0
-        self.TaskCnt = 0
-        self.TaskInfo = list()
-        return
-
-    def GetLength(self):
-        length = 0
-        length += self.Head.GetLength()
-        length += 10
-        length += 10
-        length += 1
-        length += 2
-        length += 1
-        for i in range(self.TaskCnt):
-            length += self.TaskInfo[i].GetLength()
-
-        return length
-
-    def GetBuffer(self):
-        data = ''
-        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
-        data = CommFunc.WriteString(data, 10, self.StartDate)
-        data = CommFunc.WriteString(data, 10, self.EndtDate)
-        data = CommFunc.WriteBYTE(data, self.ResetType)
-        data = CommFunc.WriteWORD(data, self.LimitLV)
-        data = CommFunc.WriteBYTE(data, self.TaskCnt)
-        for i in range(self.TaskCnt):
-            data = CommFunc.WriteString(data, self.TaskInfo[i].GetLength(), self.TaskInfo[i].GetBuffer())
-        return data
-
-    def OutputString(self):
-        DumpString = '''
-                                Head:%s,
-                                StartDate:%s,
-                                EndtDate:%s,
-                                ResetType:%d,
-                                LimitLV:%d,
-                                TaskCnt:%d,
-                                TaskInfo:%s
-                                '''\
-                                %(
-                                self.Head.OutputString(),
-                                self.StartDate,
-                                self.EndtDate,
-                                self.ResetType,
-                                self.LimitLV,
-                                self.TaskCnt,
-                                "..."
-                                )
-        return DumpString
-
-
-m_NAtagMCBossRebornInfo=tagMCBossRebornInfo()
-ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCBossRebornInfo.Head.Cmd,m_NAtagMCBossRebornInfo.Head.SubCmd))] = m_NAtagMCBossRebornInfo
-
-
-#------------------------------------------------------
-# AB 19 炼制奖励信息 #tagMCRefineGiftInfo
-
-class  tagMCRefineGiftInfo(Structure):
+class  tagSCOSACelebrationInfo(Structure):
     _pack_ = 1
     _fields_ = [
                   ("Cmd", c_ubyte),
                   ("SubCmd", c_ubyte),
-                  ("ExpRefineStartTime", c_int),    # 经验炼制活动开始时间
-                  ("MoneyRefineStartTime", c_int),    # 金币炼制活动开始时间
-                  ("ExpRefineCnt", c_ubyte),    # 经验已炼制次数
-                  ("MoneyRefineCnt", c_ubyte),    # 金币已炼制次数
+                  ("PointTotal", c_int),    # 累计庆典积分
+                  ("PointAward", c_int),    # 积分阶段奖励记录,按阶段积分排序后索引二进制存储是否已领取
                   ]
 
     def __init__(self):
         self.Clear()
         self.Cmd = 0xAB
-        self.SubCmd = 0x19
+        self.SubCmd = 0x05
         return
 
     def ReadData(self, stringData, _pos=0, _len=0):
@@ -29418,105 +28985,35 @@
 
     def Clear(self):
         self.Cmd = 0xAB
-        self.SubCmd = 0x19
-        self.ExpRefineStartTime = 0
-        self.MoneyRefineStartTime = 0
-        self.ExpRefineCnt = 0
-        self.MoneyRefineCnt = 0
+        self.SubCmd = 0x05
+        self.PointTotal = 0
+        self.PointAward = 0
         return
 
     def GetLength(self):
-        return sizeof(tagMCRefineGiftInfo)
+        return sizeof(tagSCOSACelebrationInfo)
 
     def GetBuffer(self):
         return string_at(addressof(self), self.GetLength())
 
     def OutputString(self):
-        DumpString = '''// AB 19 炼制奖励信息 //tagMCRefineGiftInfo:
+        DumpString = '''// AB 05 开服庆典信息 //tagSCOSACelebrationInfo:
                                 Cmd:%s,
                                 SubCmd:%s,
-                                ExpRefineStartTime:%d,
-                                MoneyRefineStartTime:%d,
-                                ExpRefineCnt:%d,
-                                MoneyRefineCnt:%d
+                                PointTotal:%d,
+                                PointAward:%d
                                 '''\
                                 %(
                                 self.Cmd,
                                 self.SubCmd,
-                                self.ExpRefineStartTime,
-                                self.MoneyRefineStartTime,
-                                self.ExpRefineCnt,
-                                self.MoneyRefineCnt
+                                self.PointTotal,
+                                self.PointAward
                                 )
         return DumpString
 
 
-m_NAtagMCRefineGiftInfo=tagMCRefineGiftInfo()
-ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCRefineGiftInfo.Cmd,m_NAtagMCRefineGiftInfo.SubCmd))] = m_NAtagMCRefineGiftInfo
-
-
-#------------------------------------------------------
-# AC 08 boss复活点数通知 #tagGCBossRebornPoint
-
-class  tagGCBossRebornPoint(Structure):
-    _pack_ = 1
-    _fields_ = [
-                  ("Cmd", c_ubyte),
-                  ("SubCmd", c_ubyte),
-                  ("Point", c_int),    # 复活点数
-                  ("TotalPoint", c_int),    # 复活总点数
-                  ("RebornCnt", c_ushort),    # 今日已复活次数
-                  ("TotalRebornCnt", c_ushort),    # 每日可复活总次数,0为不限制
-                  ]
-
-    def __init__(self):
-        self.Clear()
-        self.Cmd = 0xAC
-        self.SubCmd = 0x08
-        return
-
-    def ReadData(self, stringData, _pos=0, _len=0):
-        self.Clear()
-        memmove(addressof(self), stringData[_pos:], self.GetLength())
-        return _pos + self.GetLength()
-
-    def Clear(self):
-        self.Cmd = 0xAC
-        self.SubCmd = 0x08
-        self.Point = 0
-        self.TotalPoint = 0
-        self.RebornCnt = 0
-        self.TotalRebornCnt = 0
-        return
-
-    def GetLength(self):
-        return sizeof(tagGCBossRebornPoint)
-
-    def GetBuffer(self):
-        return string_at(addressof(self), self.GetLength())
-
-    def OutputString(self):
-        DumpString = '''// AC 08 boss复活点数通知 //tagGCBossRebornPoint:
-                                Cmd:%s,
-                                SubCmd:%s,
-                                Point:%d,
-                                TotalPoint:%d,
-                                RebornCnt:%d,
-                                TotalRebornCnt:%d
-                                '''\
-                                %(
-                                self.Cmd,
-                                self.SubCmd,
-                                self.Point,
-                                self.TotalPoint,
-                                self.RebornCnt,
-                                self.TotalRebornCnt
-                                )
-        return DumpString
-
-
-m_NAtagGCBossRebornPoint=tagGCBossRebornPoint()
-ChNetPackDict[eval("0x%02x%02x"%(m_NAtagGCBossRebornPoint.Cmd,m_NAtagGCBossRebornPoint.SubCmd))] = m_NAtagGCBossRebornPoint
+m_NAtagSCOSACelebrationInfo=tagSCOSACelebrationInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagSCOSACelebrationInfo.Cmd,m_NAtagSCOSACelebrationInfo.SubCmd))] = m_NAtagSCOSACelebrationInfo
 
 
 #------------------------------------------------------
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/ServerDay.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/ServerDay.py
index 84e07aa..f2f77e6 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/ServerDay.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/ServerDay.py
@@ -15,8 +15,11 @@
 #"""Version = 2025-11-25 19:30"""
 #-------------------------------------------------------------------------------
 
+import ChConfig
 import GameWorld
 import ShareDefine
+import PlayerControl
+import OpenServerActivity
 import GameWorldEvent
 import PlayerSignDay
 import GameFuncComm
@@ -30,12 +33,24 @@
     if not cmdList:
         GameWorld.DebugAnswer(curPlayer, "设置开服天: ServerDay 第几天")
         GameWorld.DebugAnswer(curPlayer, "重置开服天: ServerDay 1")
+        GameWorld.DebugAnswer(curPlayer, "重置庆典奖: ServerDay osa")
+        GameWorld.DebugAnswer(curPlayer, "设置庆典分: ServerDay osa 累计积分")
+        GameWorld.DebugAnswer(curPlayer, "重置开服天时会重置开服冲榜、庆典奖励")
         __printServerDay(curPlayer)
         return
     
     value = cmdList[0]
     
-    if value <= 1:
+    if value == "osa":
+        point = cmdList[1] if len(cmdList) > 1 else 0
+        if point <= 0:
+            __clearOSACelebration(curPlayer)
+        else:
+            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_OSACelebrationPoint, point)
+            OpenServerActivity.SyncOSACelebrationInfo(curPlayer)
+            GameWorld.DebugAnswer(curPlayer, "开服庆典累计积分: %s" % point)
+        return
+    elif value <= 1:
         __clearOpenServerDay(curPlayer)
     elif value > 1:
         __setOpenServerDay(curPlayer, value)
@@ -61,6 +76,7 @@
     DBDataMgr.GetEventTrigMgr().SetValue(ShareDefine.Def_IsMixServer, 0)
     DBDataMgr.GetEventTrigMgr().SetValue(ShareDefine.Def_MixServerDay, 0)
     DBDataMgr.GetEventTrigMgr().SetValue(ShareDefine.Def_OSAAwardState, 0)
+    __clearOSACelebration(curPlayer)
     
     curTime = int(time.time())
     GameWorldEvent.SetInitOpenServerTime(curTime)
@@ -68,6 +84,13 @@
     PlayerSignDay.ResetDaySign(curPlayer)
     return
 
+def __clearOSACelebration(curPlayer):
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_OSACelebrationPoint, 0)
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_OSACelebrationAward, 0)
+    OpenServerActivity.SyncOSACelebrationInfo(curPlayer)
+    GameWorld.DebugAnswer(curPlayer, "重置开服庆典")
+    return
+
 def __setOpenServerDay(curPlayer, serverDay):
     DBDataMgr.GetEventTrigMgr().SetValue(ShareDefine.Def_ServerDay, serverDay - 1)
     return
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Success.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Success.py
index 718f47b..9d55295 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Success.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Success.py
@@ -40,15 +40,17 @@
         succType = msgList[1] if len(msgList) > 1 else 0
         addValue = msgList[2] if len(msgList) > 2 else 1
         conds = msgList[3:]
-        GameWorld.DebugAnswer(curPlayer, "增加成就进度: T:%s,V:%s,C:%s" % (succType, addValue, conds))
-        PlayerSuccess.DoAddSuccessProgress(curPlayer, succType, addValue, conds)
+        PlayerSuccess.DoAddSuccessProgress(curPlayer, succType, addValue, conds, delayCalc=False)
+        curValue = PlayerSuccess.GetSuccValue(curPlayer, succType, conds)
+        GameWorld.DebugAnswer(curPlayer, "增加成就进度: T:%s,A:%s,V:%s,C:%s," % (succType, addValue, curValue, conds))
     # 更新进度
     elif cmdType == "u":
         succType = msgList[1] if len(msgList) > 1 else 0
         newCnt = msgList[2] if len(msgList) > 2 else 1
         conds = msgList[3:]
-        GameWorld.DebugAnswer(curPlayer, "更新成就进度: T:%s,V:%s,C:%s" % (succType, addValue, conds))
         PlayerSuccess.UptateSuccessProgress(curPlayer, succType, newCnt, conds)
+        curValue = PlayerSuccess.GetSuccValue(curPlayer, succType, conds)
+        GameWorld.DebugAnswer(curPlayer, "更新成就进度: T:%s,V:%s,C:%s" % (succType, curValue, conds))
     return
 
 def __DoResetSuccess(curPlayer, msgList, resetValue=True):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_Arena.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_Arena.py
index bbd865c..c1697cc 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_Arena.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_Arena.py
@@ -21,6 +21,7 @@
 import ShareDefine
 import PlayerControl
 import IpyGameDataPY
+import PlayerSuccess
 import PlayerActivity
 import PlayerBillboard
 import PlayerViewCache
@@ -71,6 +72,7 @@
         return
     
     PlayerTask.AddTaskValue(curPlayer, ChConfig.TaskType_ArenaBattle)
+    PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_OSAArenaBattle, 1)
     
     return True, funcLineID
 
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_MainLevel.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_MainLevel.py
index fc4121a..ad97def 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_MainLevel.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_MainLevel.py
@@ -20,6 +20,7 @@
 import TurnAttack
 import ShareDefine
 import IpyGameDataPY
+import PlayerSuccess
 import PlayerControl
 import PlayerActivity
 import ChPyNetSendPack
@@ -433,6 +434,7 @@
     ChEquip.RefreshRoleEquipAttr(curPlayer)
     
     PlayerTask.UpdTaskValue(curPlayer, ChConfig.TaskType_EquipColor)
+    PlayerSuccess.UpdateEquipSuccess(curPlayer)
     return
 
 def __doDecomposeMainEquip(curPlayer, itemIndexList):
@@ -486,6 +488,7 @@
     PlayerLLMJ.AddExpDecompose(curPlayer, mjExTotal)
     PlayerTask.AddTaskValue(curPlayer, ChConfig.TaskType_EquipDecompose, decomposeCnt)
     PlayerActivity.AddDailyTaskValue(curPlayer, ChConfig.DailyTask_EquipDecompose, decomposeCnt)
+    PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_OSAEquipDecompose, decomposeCnt)
     return
 
 def __doPickupMainItem(curPlayer, itemIndexList):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_Tianzi.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_Tianzi.py
index 0914eab..e63e88a 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_Tianzi.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_Tianzi.py
@@ -20,6 +20,7 @@
 import GameWorld
 import ItemControler
 import PlayerControl
+import PlayerSuccess
 import PlayerBillboard
 import ChPyNetSendPack
 import NetPackCommon
@@ -82,7 +83,6 @@
         GameWorld.DebugLog("非今日天子考验! mapID=%s,funcLineID=%s != %s,bossID=%s" % (mapID, funcLineID, lineID, bossID))
         return
     
-    PlayerTask.AddTaskValue(curPlayer, ChConfig.TaskType_FBTianzi)
     return True, funcLineID
 
 def GetFBNPCInitAttr(turnFight, npcObj):
@@ -196,6 +196,7 @@
     FBCommon.AddEnterFBCount(curPlayer, mapID)
     ItemControler.GivePlayerItemOrMail(curPlayer, itemList, event=["Tianzi", False, {}], isNotifyAward=False)
     SyncTianziInfo(curPlayer, lineID, bossID)
+    __onFBTianzi(curPlayer)
     return
 
 def __getTianziAwardList(todayHurt, bossID, sweepCnt=1):
@@ -252,8 +253,14 @@
     overDict = {FBCommon.Over_itemInfo:FBCommon.GetJsonItemList(itemList), FBCommon.Over_isSweep:1, 
                 "totalHurt":todayHurtTotal, "todayHurtTotal":todayHurtTotal}
     FBCommon.NotifyFBOver(curPlayer, mapID, lineID, isPass, overDict)
+    __onFBTianzi(curPlayer)
     return True
 
+def __onFBTianzi(curPlayer):
+    PlayerTask.AddTaskValue(curPlayer, ChConfig.TaskType_FBTianzi)
+    PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_OSAFBTianzi, 1)
+    return
+
 def SyncTianziInfo(curPlayer, lineID=None, bossID=None):
     if lineID == None:
         lineID, bossID = GetTianziTodayInfo(curPlayer)
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 976a785..f79961a 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
@@ -19,6 +19,8 @@
 import ItemControler
 import PlayerBeauty
 import FBCommon
+import PlayerSuccess
+import ShareDefine
 import PlayerTask
 import ChConfig
 
@@ -55,6 +57,7 @@
     ItemControler.GivePlayerItemOrMail(curPlayer, itemList, event=["Zhanchui", False, {}], isNotifyAward=False)
     
     PlayerTask.UpdTaskValue(curPlayer, ChConfig.TaskType_FBZhanchui)
+    PlayerSuccess.UptateSuccessProgress(curPlayer, ShareDefine.SuccType_OSAFBZhanchui, funcLineID)
     return
     
 def OnPlayerFBSweepAsk(curPlayer, mapID, lineID, sweepCnt, dataEx):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
index 4f9b678..2f037f2 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
@@ -1082,12 +1082,6 @@
                         ("BYTE", "SkillResist", 0),
                         ),
 
-                "BOSSFirstKill":(
-                        ("DWORD", "NPCID", 1),
-                        ("WORD", "PerPlayerMoneyAward", 0),
-                        ("list", "PersonFirstKillAward", 0),
-                        ),
-
                 "NPCShow":(
                         ("DWORD", "NPCID", 1),
                         ("DWORD", "MapID", 1),
@@ -1456,23 +1450,6 @@
                         ("BYTE", "ChooseItemCount", 0),
                         ("dict", "LibItemInfo", 0),
                         ("list", "NotifyItemNumList", 0),
-                        ),
-
-                "ActBossReborn":(
-                        ("DWORD", "CfgID", 1),
-                        ("char", "StartDate", 0),
-                        ("char", "EndDate", 0),
-                        ("BYTE", "ResetType", 0),
-                        ("WORD", "LVLimit", 0),
-                        ("BYTE", "TemplateID", 0),
-                        ),
-
-                "BossReborn":(
-                        ("BYTE", "TemplateID", 1),
-                        ("BYTE", "ID", 1),
-                        ("DWORD", "TotalTimes", 0),
-                        ("WORD", "SingleTimes", 0),
-                        ("dict", "Reward", 0),
                         ),
 
                 "ActRealmPoint":(
@@ -3752,17 +3729,6 @@
     def GetCanAssist(self): return self.attrTuple[8] # 是否可协助 BYTE
     def GetSkillResist(self): return self.attrTuple[9] # 是否技能抵抗 BYTE
 
-# Boss首杀
-class IPY_BOSSFirstKill():
-    
-    def __init__(self):
-        self.attrTuple = None
-        return
-        
-    def GetNPCID(self): return self.attrTuple[0] # ID DWORD
-    def GetPerPlayerMoneyAward(self): return self.attrTuple[1] #  首杀全服玩家奖励灵石额度/人 WORD
-    def GetPersonFirstKillAward(self): return self.attrTuple[2] #  个人首次击杀奖励 [[物品ID,个数,是否拍品], ...] list
-
 # NPC秀表
 class IPY_NPCShow():
     
@@ -4312,33 +4278,6 @@
     def GetChooseItemCount(self): return self.attrTuple[3] # 选择个数 BYTE
     def GetLibItemInfo(self): return self.attrTuple[4] # 物品编号对应物品信息 {物品编号:[物品ID,个数,是否拍品,可选次数], ...}  0不限次数 dict
     def GetNotifyItemNumList(self): return self.attrTuple[5] # 需要广播的编号列表 list
-
-# BOSS复活活动时间表
-class IPY_ActBossReborn():
-    
-    def __init__(self):
-        self.attrTuple = None
-        return
-        
-    def GetCfgID(self): return self.attrTuple[0] # 配置ID DWORD
-    def GetStartDate(self): return self.attrTuple[1] # 开启日期 char
-    def GetEndDate(self): return self.attrTuple[2] # 结束日期 char
-    def GetResetType(self): return self.attrTuple[3] # 重置类型,0-0点重置;1-5点重置 BYTE
-    def GetLVLimit(self): return self.attrTuple[4] # 限制等级 WORD
-    def GetTemplateID(self): return self.attrTuple[5] # 模板编号 BYTE
-
-# BOSS复活表
-class IPY_BossReborn():
-    
-    def __init__(self):
-        self.attrTuple = None
-        return
-        
-    def GetTemplateID(self): return self.attrTuple[0] # 模板ID BYTE
-    def GetID(self): return self.attrTuple[1] # 活动条目ID BYTE
-    def GetTotalTimes(self): return self.attrTuple[2] # 可完成的总次数,0表示不限次数 DWORD
-    def GetSingleTimes(self): return self.attrTuple[3] # 单次领奖需要的次数 WORD
-    def GetReward(self): return self.attrTuple[4] # 奖励物品ID1 dict
 
 # 多倍修行点活动时间表
 class IPY_ActRealmPoint():
@@ -5675,7 +5614,6 @@
         self.__LoadFileData("DailyTask", onlyCheck)
         self.__LoadFileData("DailyLivenessReward", onlyCheck)
         self.__LoadFileData("BOSSInfo", onlyCheck)
-        self.__LoadFileData("BOSSFirstKill", onlyCheck)
         self.__LoadFileData("NPCShow", onlyCheck)
         self.__LoadFileData("MapRefreshNPC", onlyCheck)
         self.__LoadFileData("RuneCompound", onlyCheck)
@@ -5712,8 +5650,6 @@
         self.__LoadFileData("CrossActFamilyGCZSQ", onlyCheck)
         self.__LoadFileData("ActGodGift", onlyCheck)
         self.__LoadFileData("ActGodGiftAward", onlyCheck)
-        self.__LoadFileData("ActBossReborn", onlyCheck)
-        self.__LoadFileData("BossReborn", onlyCheck)
         self.__LoadFileData("ActRealmPoint", onlyCheck)
         self.__LoadFileData("TrialExchange", onlyCheck)
         self.__LoadFileData("AllPeopleParty", onlyCheck)
@@ -6699,13 +6635,6 @@
         self.CheckLoadData("BOSSInfo")
         return self.ipyBOSSInfoCache[index]
 
-    def GetBOSSFirstKillCount(self):
-        self.CheckLoadData("BOSSFirstKill")
-        return self.ipyBOSSFirstKillLen
-    def GetBOSSFirstKillByIndex(self, index):
-        self.CheckLoadData("BOSSFirstKill")
-        return self.ipyBOSSFirstKillCache[index]
-
     def GetNPCShowCount(self):
         self.CheckLoadData("NPCShow")
         return self.ipyNPCShowLen
@@ -6957,20 +6886,6 @@
     def GetActGodGiftAwardByIndex(self, index):
         self.CheckLoadData("ActGodGiftAward")
         return self.ipyActGodGiftAwardCache[index]
-
-    def GetActBossRebornCount(self):
-        self.CheckLoadData("ActBossReborn")
-        return self.ipyActBossRebornLen
-    def GetActBossRebornByIndex(self, index):
-        self.CheckLoadData("ActBossReborn")
-        return self.ipyActBossRebornCache[index]
-
-    def GetBossRebornCount(self):
-        self.CheckLoadData("BossReborn")
-        return self.ipyBossRebornLen
-    def GetBossRebornByIndex(self, index):
-        self.CheckLoadData("BossReborn")
-        return self.ipyBossRebornCache[index]
 
     def GetActRealmPointCount(self):
         self.CheckLoadData("ActRealmPoint")
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py
index 7cf92c1..cedcfe7 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py
@@ -41,9 +41,7 @@
 import NetPackCommon
 import FBCommon
 import PlayerPrestigeSys
-import GY_Query_BossFirstKill
 import FormulaControl
-import PlayerBossReborn
 import PlayerCrossYaomoBoss
 import PlayerActCollectWords
 import PlayerTongTianLing
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
index 5646fef..4f620fd 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
@@ -53,7 +53,6 @@
 import PlayerCrossChampionship
 import GameFuncComm
 import PlayerFamilyTaofa
-import PlayerBossReborn
 import PlayerWeekParty
 import PlayerFeastWeekParty
 import PlayerFeastLogin
@@ -80,7 +79,6 @@
 import PlayerActManyDayRecharge
 import PlayerActSingleRecharge
 import PlayerSpringSale
-import GY_Query_BossFirstKill
 import PlayerCrossYaomoBoss
 import PlayerLuckyCloudBuy
 import PlayerLuckyTreasure
@@ -89,6 +87,7 @@
 import PlayerFuncSysPrivilege
 import PlayerActTurntable
 import PlayerTongTianLing
+import OpenServerActivity
 import CrossRealmPlayer
 import ChNetSendPack
 import PlayerArena
@@ -617,8 +616,6 @@
     #PassiveBuffEffMng.OnLoginGFPassive(curPlayer)
     # 极品白拿
     PlayerFreeGoods.OnLogin(curPlayer)
-    # BOSS复活活动
-    PlayerBossReborn.OnLogin(curPlayer)
     # 周狂欢活动
     PlayerWeekParty.OnLogin(curPlayer)
     # 购买次数礼包活动
@@ -664,8 +661,6 @@
     PlayerFB.OnLogin(curPlayer)
     #技能专精信息
     #SkillShell.NotifyElementSkillInfo(curPlayer)
-    #Boss首杀
-    GY_Query_BossFirstKill.OnPlayerLogin(curPlayer)
     #通天令
     PlayerTongTianLing.OnPlayerLogin(curPlayer)
     #创角奖励
@@ -735,6 +730,7 @@
         PlayerLLMJ.OnPlayerLogin(curPlayer)
         PlayerBeauty.OnPlayerLogin(curPlayer)
         PlayerTravel.OnPlayerLogin(curPlayer)
+        OpenServerActivity.OnPlayerLogin(curPlayer)
         
         # 上线查询一次充值订单
         # curPlayer.SendDBQueryRecharge() 不查了,由在线轮询触发即可
@@ -3194,6 +3190,9 @@
     # 领取分包下载奖励
     elif rewardType == ChConfig.Def_RewardType_DownLoad:
         GetDownloadAward(curPlayer, dataEx)
+    # 开服庆典积分阶段奖励 
+    elif rewardType == ChConfig.Def_RewardType_OSACelebrationPointAward:
+        OpenServerActivity.GetOSACelebrationPointAward(curPlayer, dataEx)
         
         
     # 每日免费直购礼包
@@ -3220,9 +3219,6 @@
     # 领取单笔累充领取
     elif rewardType == ChConfig.Def_RewardType_SingleRecharge:
         PlayerActSingleRecharge.OnGetSingleRechargeAward(curPlayer, dataEx, dataExStr)
-    # 领取boss复活活动奖励
-    elif rewardType == ChConfig.Def_RewardType_BossReborn:
-        PlayerBossReborn.GetBossRebornActionAward(curPlayer, dataEx)
     # 领取许愿池奖励
     elif rewardType == ChConfig.Def_RewardType_WishingWell:
         PlayerWishingWell.DoGetWishingAward(curPlayer)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/OpenServerActivity.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/OpenServerActivity.py
index 253c496..14bc9b8 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/OpenServerActivity.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/OpenServerActivity.py
@@ -19,10 +19,15 @@
 import ShareDefine
 import GameFuncComm
 import IpyGameDataPY
-import PlayerBillboard
 import PlayerTreasure
+import PlayerBillboard
+import ChPyNetSendPack
 import PlayerControl
+import NetPackCommon
+import ItemControler
 import GameWorld
+import ChConfig
+import ObjPool
 
 # 开服冲榜类型对应功能ID
 OSAFuncIDDict = {
@@ -97,3 +102,67 @@
             PlayerBillboard.DoGiveBillboardAwardByMail(osaType, "OSAHeroCall", billboardAwardDict, "OSAHeroCall")
             
     return
+
+
+## ------------------------------------------- 开服庆典 ---------------------------------------------
+
+def OnPlayerLogin(curPlayer):
+    SyncOSACelebrationInfo(curPlayer)
+    return
+
+def GetOSACelebrationState(curPlayer):
+    ## 玩家是否在开服庆典活动中
+    # @return: 0-未开启;1-活动中;2-结束显示期;3-结束关闭期
+    funcID = ShareDefine.GameFuncID_OSA_Celebration
+    if not GameFuncComm.GetFuncCanUse(curPlayer, funcID):
+        #GameWorld.DebugLog("开服庆典功能未开启! funcID=%s" % (funcID))
+        return 0
+    endDay = IpyGameDataPY.GetFuncCfg("OSACelebration", 1)
+    serverDay = DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_ServerDay) + 1
+    if serverDay <= endDay:
+        #GameWorld.DebugLog("开服庆典活动中! serverDay=%s,endDay=%s" % (serverDay, endDay))
+        return 1
+    if serverDay == (endDay + 1):
+        #GameWorld.DebugLog("开服庆典结算中! serverDay=%s,endDay=%s" % (serverDay, endDay))
+        return 2
+    #GameWorld.DebugLog("开服庆典已结束! serverDay=%s,endDay=%s" % (serverDay, endDay))
+    return 3
+
+def AddOSACelebrationPoint(curPlayer, addPoint):
+    ## 庆典累计积分
+    curPoint = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_OSACelebrationPoint)
+    updPoint = PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_OSACelebrationPoint, curPoint + addPoint)
+    GameWorld.DebugLog("增加开服庆典积分: addPoint=%s,curPoint=%s,updPoint=%s" % (addPoint, curPoint, updPoint))
+    SyncOSACelebrationInfo(curPlayer)
+    return
+
+def GetOSACelebrationPointAward(curPlayer, awardPoint):
+    ## 领取开服庆典累计积分阶段奖励
+    curPoint = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_OSACelebrationPoint)
+    if curPoint < awardPoint:
+        GameWorld.DebugLog("累计开服庆典积分不足: curPoint=%s < %s" % (curPoint, awardPoint))
+        return
+    awardDict = IpyGameDataPY.GetFuncEvalCfg("OSACelebration", 2, {}) # {"累计积分":[[物品ID,个数], ...], ...}
+    pointKeyList = [int(p) for p in awardDict.keys()]
+    pointKeyList.sort()
+    if awardPoint not in pointKeyList:
+        GameWorld.DebugLog("不存在该开服庆典积分阶段奖励: awardPoint=%s not in %s" % (awardPoint, pointKeyList))
+        return
+    index = pointKeyList.index(awardPoint)
+    awardState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_OSACelebrationAward)
+    if awardState&pow(2, index):
+        GameWorld.DebugLog("该开服庆典积分阶段奖励已领取: awardPoint=%s,index=%s,awardState=%s" % (awardPoint, index, awardState))
+        return
+    updState = PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_OSACelebrationAward, awardState|pow(2, index))
+    itemList = awardDict[str(awardPoint)]
+    GameWorld.DebugLog("领取开服庆典积分阶段奖励: awardPoint=%s,index=%s,awardState=%s,updState=%s,itemList=%s" % (awardPoint, index, awardState, updState, itemList))
+    ItemControler.GivePlayerItemOrMail(curPlayer, itemList, event=["OSACelebration", False, {}])
+    SyncOSACelebrationInfo(curPlayer)
+    return
+
+def SyncOSACelebrationInfo(curPlayer):
+    clientPack = ObjPool.GetPoolMgr().acquire(ChPyNetSendPack.tagSCOSACelebrationInfo)
+    clientPack.PointTotal = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_OSACelebrationPoint)
+    clientPack.PointAward = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_OSACelebrationAward)
+    NetPackCommon.SendFakePack(curPlayer, clientPack)
+    return
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerBossReborn.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerBossReborn.py
deleted file mode 100644
index ab42ae1..0000000
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerBossReborn.py
+++ /dev/null
@@ -1,290 +0,0 @@
-#!/usr/bin/python
-# -*- coding: GBK -*-
-#-------------------------------------------------------------------------------
-#
-#-------------------------------------------------------------------------------
-#
-##@package Player.PlayerBossReborn
-#
-# @todo:BOSS复活
-# @author xdh
-# @date 2018-07-12 16:50
-# @version 1.0
-#
-#
-# 详细描述: BOSS复活
-#
-#---------------------------------------------------------------------
-"""Version = 2018-07-12 16:50"""
-#---------------------------------------------------------------------
-
-import IPY_GameWorld
-import GameWorld
-import ChConfig
-import IpyGameDataPY
-import PlayerControl
-import ItemControler
-import ChPyNetSendPack
-import NetPackCommon
-import ShareDefine
-import PyGameData
-import ItemCommon
-
-
-def OnLogin(curPlayer):
-    isReset = __CheckPlayerBossRebornAction(curPlayer)
-    if not isReset:
-        actCostRebateInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_BossReborn, {})
-        # 活动中同步活动信息
-        if actCostRebateInfo.get(ShareDefine.ActKey_State):
-            SyncBossRebornInfo(curPlayer)
-            SyncBossRebornPlayerInfo(curPlayer)
-    return
-
-
-def RefreshOperationAction_BossReborn():
-    playerManager = GameWorld.GetPlayerManager()
-    for i in xrange(playerManager.GetPlayerCount()):
-        curPlayer = playerManager.GetPlayerByIndex(i)
-        if not GameWorld.IsNormalPlayer(curPlayer):
-            continue
-        __CheckPlayerBossRebornAction(curPlayer)
-    return
-
-
-def __CheckPlayerBossRebornAction(curPlayer):
-    ## 检查玩家BOSS复活活动数据信息
-    playerID = curPlayer.GetPlayerID()
-    
-    actBossRebornInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_BossReborn, {})
-    bossRebornID = actBossRebornInfo.get(ShareDefine.ActKey_ID, 0)
-    state = actBossRebornInfo.get(ShareDefine.ActKey_State, 0)
-    cfgID = actBossRebornInfo.get(ShareDefine.ActKey_CfgID, 0)
-    
-    playerBossRebornID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_BossRebornID)  # 玩家身上的活动ID
-    
-    # 活动ID 相同的话不处理
-    if bossRebornID == playerBossRebornID:
-        #GameWorld.DebugLog("BOSS复活活动ID不变,不处理!", curPlayer.GetPlayerID())
-        return
-    actWorldLV = actBossRebornInfo.get(ShareDefine.ActKey_WorldLV, 0)
-    playerWorldLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_BRActionWorldLV)
-    
-    templateID = 0
-    if cfgID:
-        actBossIpyData = IpyGameDataPY.GetIpyGameData("ActBossReborn", cfgID)
-        templateID = 0 if not actBossIpyData else actBossIpyData.GetTemplateID()
-    playerTemplateID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_BossRebornTemplateID)
-    
-    GameWorld.DebugLog("BOSS复活重置! costRebateID=%s,playerCostRebateID=%s,state=%s,templateID=%s,playerTemplateID=%s" 
-                       % (bossRebornID, playerBossRebornID, state, templateID, playerTemplateID), playerID)
-    
-    # 未领取的奖励邮件发放
-    __SendBossRebornMail(curPlayer, playerTemplateID, playerWorldLV)
-    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_BRActionWorldLV, actWorldLV)
-    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_BossRebornID, bossRebornID)
-    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_BossRebornTemplateID, templateID)
-    for brid in ChConfig.BossRebornActIDList:
-        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_BRActionCurTimes % brid, 0)
-        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_BRActionGotTimes % brid, 0)
-        
-    SyncBossRebornInfo(curPlayer)
-    SyncBossRebornPlayerInfo(curPlayer)
-    return True
-
-
-def __SendBossRebornMail(curPlayer, playerTemplateID, playerWorldLV):
-    # 未领取的奖励邮件发放
-    ipyDataList = IpyGameDataPY.GetIpyGameDataByCondition("BossReborn", {'TemplateID':playerTemplateID}, True)
-    if not ipyDataList:
-        return
-    
-    totalItemDict = {}
-    for ipyData in ipyDataList:
-        brid = ipyData.GetID()
-        singleTimes = ipyData.GetSingleTimes()
-        curTimes = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_BRActionCurTimes % brid)
-        gotTimes = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_BRActionGotTimes % brid)
-        canGotCnt = (curTimes - gotTimes) / singleTimes
-        if not canGotCnt:
-            continue
-        itemDict = __GetAwardItem(curPlayer, ipyData, playerWorldLV, canGotCnt)
-        GameWorld.AddDictValue(totalItemDict, itemDict)
-    
-    #去掉复活点道具
-    totalItemDict.pop(ChConfig.Def_ItemID_BossReborn, 0)
-    if not totalItemDict:
-        return
-    totalItemList = [[itemID, itemCnt, 1] for itemID, itemCnt in totalItemDict.items()]
-    PlayerControl.SendMailByKey('BossFHUnGetMail', [curPlayer.GetID()], totalItemList)
-    return
-
-
-def AddBossRebornActionCnt(curPlayer, actionID, addCnt=1):
-    '''增加boss复活相关活动完成次数'''
-    #判断活动是否开启
-    actBossRebornInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_BossReborn, {})
-    state = actBossRebornInfo.get(ShareDefine.ActKey_State, 0)
-    if not state:
-        return
-    playerTemplateID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_BossRebornTemplateID)
-    ipyData = IpyGameDataPY.GetIpyGameData('BossReborn', playerTemplateID, actionID)
-    if not ipyData:
-        return
-    totalTimes = ipyData.GetTotalTimes()
-    curTimes = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_BRActionCurTimes % actionID)
-    addCnt = addCnt if totalTimes == 0 else min(totalTimes - curTimes, addCnt)
-    if addCnt <= 0:
-        return
-    
-    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_BRActionCurTimes % actionID, curTimes + addCnt)
-    
-    SyncBossRebornPlayerInfo(curPlayer, actionID)
-    return
-
-
-def GetBossRebornActionAward(curPlayer, actionID):
-    '''领取boss复活活动奖励'''
-    playerTemplateID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_BossRebornTemplateID)
-    ipyData = IpyGameDataPY.GetIpyGameData('BossReborn', playerTemplateID, actionID)
-    if not ipyData:
-        return
-    singleTimes = ipyData.GetSingleTimes()
-    curTimes = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_BRActionCurTimes % actionID)
-    gotTimes = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_BRActionGotTimes % actionID)
-    if curTimes - gotTimes < singleTimes:
-        return
-    playerWorldLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_BRActionWorldLV)
-    #给奖励
-    awardDict = __GetAwardItem(curPlayer, ipyData, playerWorldLV)
-    # 检查背包
-    needSpace = len(awardDict)
-    packSpace = ItemCommon.GetItemPackSpace(curPlayer, IPY_GameWorld.rptItem, needSpace)
-    if needSpace > packSpace:
-        PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_998371")
-        return
-    #更新次数 每次领奖只领一次
-    newGotTimes = gotTimes + singleTimes
-    
-    #GameWorld.Log('  actionID=%s,curTimes=%s,gotTimes=%s,singleTimes=%s,newGotTimes=%s'%(actionID, curTimes, gotTimes,singleTimes, newGotTimes))
-    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_BRActionGotTimes % actionID, newGotTimes)
-    for itemID, itemCnt in awardDict.items():
-        ItemControler.GivePlayerItem(curPlayer, itemID, itemCnt, 0, [IPY_GameWorld.rptItem])
-    SyncBossRebornPlayerInfo(curPlayer, actionID)
-    return
-
-
-def __GetAwardItem(curPlayer, ipyData, worldLV, times=1):
-    awardDict = {}
-
-    awardList = GameWorld.GetDictValueByRangeKey(ipyData.GetReward(), worldLV, [])
-    for itemID, itemCnt, isbind in awardList:
-        if not itemID or not itemCnt:
-            continue
-        awardDict[itemID] = awardDict.get(itemID, 0) + itemCnt * times
-        
-    return awardDict
-
-
-def SyncBossRebornPlayerInfo(curPlayer, actID=-1):
-    #通知当前次数、已领次数 
-    packData = ChPyNetSendPack.tagMCBossRebornPlayerInfo()
-    packData.DataList = []
-    if actID != -1:
-        syneActIDList = [actID]
-    else:
-        syneActIDList = []
-        ipyMgr = IpyGameDataPY.IPY_Data()
-        for i in xrange(ipyMgr.GetBossRebornCount()):
-            ipyData = ipyMgr.GetBossRebornByIndex(i)
-            syneActIDList.append(ipyData.GetID())
-     
-    for actid in syneActIDList:
-        curTimes = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_BRActionCurTimes % actid)
-        gotTimes = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_BRActionGotTimes % actid)
-        tiemInfo = ChPyNetSendPack.tagMCBossRebornData()
-        tiemInfo.ActID = actid
-        tiemInfo.CurTimes = curTimes
-        tiemInfo.GotTimes = gotTimes
-        packData.DataList.append(tiemInfo)
-    
-    packData.Count = len(packData.DataList)
-    NetPackCommon.SendFakePack(curPlayer, packData)
-    return
-
-
-def SyncBossRebornInfo(curPlayer):
-    actBossRebornInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_BossReborn, {})
-    state = actBossRebornInfo.get(ShareDefine.ActKey_State, 0)
-    cfgID = actBossRebornInfo.get(ShareDefine.ActKey_CfgID, 0)
-    if not state or not cfgID:
-        return
-    actBossIpyData = IpyGameDataPY.GetIpyGameData("ActBossReborn", cfgID)
-    if not actBossIpyData:
-        return
-    templateID = actBossIpyData.GetTemplateID()
-    if not templateID:
-        return
-    ipyDataList = IpyGameDataPY.GetIpyGameDataByCondition("BossReborn", {'TemplateID':templateID}, True)
-    if not ipyDataList:
-        return
-    worldLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_BRActionWorldLV)
-    startDateStr, endDateStr = GameWorld.GetOperationActionDateStr(actBossIpyData)
-    actInfo = ChPyNetSendPack.tagMCBossRebornInfo()
-    actInfo.Clear()
-    actInfo.StartDate = startDateStr
-    actInfo.EndtDate = endDateStr
-    actInfo.ResetType = actBossIpyData.GetResetType()
-    actInfo.LimitLV = actBossIpyData.GetLVLimit()
-    actInfo.TaskInfo = []
-    for ipyData in ipyDataList:
-        taskInfo = ChPyNetSendPack.tagMCBossRebornTaskInfo()
-        taskInfo.TaskID = ipyData.GetID()
-        taskInfo.TotalTimes = ipyData.GetTotalTimes()
-        taskInfo.SingleTimes = ipyData.GetSingleTimes()
-        taskInfo.AwardItem = []
-        awardList = GameWorld.GetDictValueByRangeKey(ipyData.GetReward(), worldLV, [])
-        for itemID, itemCnt, isBind in awardList:
-            awardItem = ChPyNetSendPack.tagMCBossRebornAwardItem()
-            awardItem.ItemID = itemID
-            awardItem.ItemCount = itemCnt
-            awardItem.IsBind = isBind
-            taskInfo.AwardItem.append(awardItem)
-        taskInfo.AwardItemCount = len(taskInfo.AwardItem)
-        actInfo.TaskInfo.append(taskInfo)
-    actInfo.TaskCnt = len(actInfo.TaskInfo)
-    NetPackCommon.SendFakePack(curPlayer, actInfo)
-    return
-
-def DoBossRebornActionBossOnKilledLogic(npcRankHurtMgr):
-    ## boss复活活动boss被击杀
-    #  @param rankHurtList: NPCHurtMgr.PlayerRankHurtList
-    
-    npcID = npcRankHurtMgr.npcID
-    
-    GameWorld.Log("Boss复活活动boss被击杀: npcID=%s" % (npcID))
-    rankItemDict = IpyGameDataPY.GetFuncEvalCfg("BossRebornServerBoss", 2) # {名次:[[物品ID,个数,是否拍品], ...], ...}
-    
-    for index in xrange(npcRankHurtMgr.GetHurtCount()):
-        rank = index + 1
-        hurtObj = npcRankHurtMgr.GetHurtAt(index)
-        if hurtObj.GetValueType() != ChConfig.Def_NPCHurtTypePlayer:
-            continue
-        playerID = hurtObj.GetValueID()
-        rankItemList = GameWorld.GetOrderValueByDict(rankItemDict, rank)
-        GameWorld.Log("    排行玩家奖励: rank=%s,rankItemList=%s" % (rank, rankItemList), playerID)
-        if not rankItemList:
-            continue
-        paramList = [npcID, rank]
-        PlayerControl.SendMailByKey("BossRebornActionBossRank", [playerID], rankItemList, paramList)
-        
-    entireMailItemList = IpyGameDataPY.GetFuncEvalCfg("BossRebornServerBoss", 1) # [[物品ID,个数,是否拍品], ...]
-    if entireMailItemList:
-        getDays, limitLV, limitLVType = IpyGameDataPY.GetFuncEvalCfg("BossRebornServerBoss", 4)
-        paramList = [npcID]
-        #删除旧版发送邮件,如果功能还有需要,可使用新版本发送邮件 PlayerMail
-        
-    return
-
-
-
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
index d2e7ce2..8ed50d0 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
@@ -3018,9 +3018,12 @@
     
     PlayerTask.AddTaskValue(curPlayer, ChConfig.TaskType_GetMoney, value, [priceType])
     PlayerActivity.AddDailyTaskValue(curPlayer, ChConfig.DailyTask_GetMoney, value, [priceType])
+    PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_OSAGetMoney, value, [priceType])
     
     if priceType == ShareDefine.TYPE_Price_FamilyCoin:
         PlayerFamily.AddFamilyContrib(curPlayer, value) # 公会币同步增加公会贡献
+    elif priceType == ShareDefine.TYPE_Price_OSAPoint:
+        OpenServerActivity.AddOSACelebrationPoint(curPlayer, value)
         
     if priceType not in [IPY_GameWorld.TYPE_Price_Gold_Money, IPY_GameWorld.TYPE_Price_Gold_Paper, ShareDefine.TYPE_Price_PayCoin] \
         and giveType == ChConfig.Def_GiveMoney_Unknown:
@@ -4331,6 +4334,7 @@
         PlayerBillboard.UpdatePlayerBillboard(curPlayer, ShareDefine.Def_BT_MainLevel, lvID)
         PlayerTask.UpdTaskValue(curPlayer, ChConfig.TaskType_MainLevel)
         PlayerSuccess.UptateSuccessProgress(curPlayer, ShareDefine.SuccType_MainLevel, lvID)
+        PlayerSuccess.UptateSuccessProgress(curPlayer, ShareDefine.SuccType_OSAMainLevel, lvID)
         if OpenServerActivity.GetOSAState(curPlayer, ShareDefine.Def_BT_OSA_MainLevel) == 1:
             PlayerBillboard.UpdatePlayerBillboard(curPlayer, ShareDefine.Def_BT_OSA_MainLevel, lvID)
     return value
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 4eea7a3..9a38213 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py
@@ -56,7 +56,6 @@
 import PlayerActTurntable
 import PlayerActBuyOne
 import PlayerSpringSale
-import PlayerBossReborn
 import PlayerWeekParty
 import PlayerFeastWeekParty
 import PlayerFeastLogin
@@ -898,9 +897,6 @@
                 
             elif actionName == ShareDefine.OperationActionName_SpringSale:
                 PlayerSpringSale.RefreshSpringSaleActionInfo(actNum)
-
-            elif actionName == ShareDefine.OperationActionName_BossReborn:
-                PlayerBossReborn.RefreshOperationAction_BossReborn()
                 
             elif actionName == ShareDefine.OperationActionName_FlashGiftbag:
                 PlayerFlashGiftbag.RefreshFlashGiftbagActionInfo(actNum)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerGoldRush.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerGoldRush.py
index 556531d..57af109 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerGoldRush.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerGoldRush.py
@@ -20,6 +20,7 @@
 import NetPackCommon
 import IpyGameDataPY
 import ItemControler
+import PlayerSuccess
 import ChPyNetSendPack
 import PlayerActivity
 import PlayerControl
@@ -318,6 +319,7 @@
                        % (updWorkerCnt, realNeedSeconds, GameWorld.ChangeTimeNumToStr(endTime), campInfo))
     
     PlayerTask.AddTaskValue(curPlayer, ChConfig.TaskType_GoldRush, 1)
+    PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_OSAGoldRush, 1)
     return
 
 def GetWorkerTotal(curPlayer):
@@ -415,6 +417,8 @@
     SyncGoldRushInfo(curPlayer)
     
     PlayerTask.UpdTaskValue(curPlayer, ChConfig.TaskType_GoldRushWorkers)
+    workersTotal = GetWorkerTotal(curPlayer)
+    PlayerSuccess.UptateSuccessProgress(curPlayer, ShareDefine.SuccType_OSAGoldRushWorkers, workersTotal)
     return
 
 #// B0 38 淘金仓库领奖 #tagCSGoldRushWarehouseAward
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 0b32d31..19a0800 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHero.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHero.py
@@ -20,6 +20,7 @@
 import IpyGameDataPY
 import IPY_GameWorld
 import ItemControler
+import PlayerSuccess
 import ChPyNetSendPack
 import PlayerActivity
 import NetPackCommon
@@ -355,6 +356,7 @@
     
     PlayerActivity.AddDailyTaskValue(curPlayer, ChConfig.DailyTask_HeroLVUP, 1)
     PlayerTask.AddTaskValue(curPlayer, ChConfig.TaskType_HeroLVUP)
+    PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_OSAHeroLVUP, 1)
     return
 
 def GetHeroLVMax(heroItem):
@@ -475,6 +477,7 @@
         __DoHeroStarTalentUp(item, addStar)
         PlayerActivity.AddDailyTaskValue(curPlayer, ChConfig.DailyTask_HeroStarUP, addStar)
         PlayerTask.AddTaskValue(curPlayer, ChConfig.TaskType_HeroStarUP, addStar)
+        PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_OSAHeroStarUP, addStar)
         
     if isSync:
         heroItem.Sync_Item()
@@ -1105,7 +1108,9 @@
     
     RefreshLordAttr(curPlayer)
     
+    bookCnt = GetHeroBookActCnt(curPlayer)
     PlayerTask.UpdTaskValue(curPlayer, ChConfig.TaskType_HeroBook)
+    PlayerSuccess.UptateSuccessProgress(curPlayer, ShareDefine.SuccType_OSAHeroBook, bookCnt)
     return
 
 def __doHeroBookStarLVUP(curPlayer, heroID):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHorse.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHorse.py
index 729cf68..3b19ad1 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHorse.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHorse.py
@@ -20,6 +20,7 @@
 import ShareDefine
 import NetPackCommon
 import PlayerControl
+import PlayerSuccess
 import ChPyNetSendPack
 import IPY_GameWorld
 import IpyGameDataPY
@@ -122,6 +123,7 @@
         RefreshHorseAttr(curPlayer)
         
     PlayerTask.AddTaskValue(curPlayer, ChConfig.TaskType_HorseLVUP, costItemCount)
+    PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_OSAHorseLVUP, costItemCount)
     return
 
 #// B2 02 坐骑进阶 #tagCSHorseClassUP
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerPrestigeSys.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerPrestigeSys.py
index b5d3d0a..4ce1459 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerPrestigeSys.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerPrestigeSys.py
@@ -29,6 +29,7 @@
 import PlayerTongTianLing
 import PlayerTask
 import PlayerOnline
+import PlayerSuccess
 
 #------------------------------------------------------------------------------
 
@@ -264,6 +265,7 @@
     SyncRealmInfo(curPlayer, taskIDList=syncTaskIDList)
     PlayerTongTianLing.AddTongTianTaskValue(curPlayer, ChConfig.TTLTaskType_RealmUp, 1)
     PlayerTask.UpdTaskValue(curPlayer, ChConfig.TaskType_RealmLV)
+    PlayerSuccess.UptateSuccessProgress(curPlayer, ShareDefine.SuccType_OSARealmLV, nextRealmLv)
     #更新排行榜
     PlayerBillboard.UpdateRealmBillboard(curPlayer)
     return True
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerSuccess.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerSuccess.py
index 7469282..209a64b 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerSuccess.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerSuccess.py
@@ -20,7 +20,9 @@
 import ShareDefine
 import NetPackCommon
 import PlayerControl
+import OpenServerActivity
 import ChPyNetSendPack
+import IPY_GameWorld
 import ItemControler
 import IpyGameDataPY
 import PyGameData
@@ -47,72 +49,119 @@
     SyncSuccessAwardRecord(curPlayer)
     return
 
-def ResetSuccessByType(curPlayer, succType, ignoreFinish=True):
+def ResetSuccessByTypes(curPlayer, succTypeList, ignoreFinish=True, isNotify=True):
+    ## 重置成就
+    for succType in succTypeList:
+        ResetSuccessByType(curPlayer, succType, ignoreFinish, isNotify)
+    return
+
+def ResetSuccessByType(curPlayer, succType, ignoreFinish=True, isNotify=True):
     #重置某类型成就进度,一般用于先重置次数再重新计数,或者活动类
     ipyDataList = IpyGameDataPY.GetIpyGameDataListNotLog("Success", succType)
     if not ipyDataList:
         return
+    succIDList = []
+    syncTypeCondList = []
     for ipyData in ipyDataList:
         succID = ipyData.GetSuccID()
         if ignoreFinish and GetSuccHasGot(curPlayer, succID):
             continue
         conds = ipyData.GetCondition()
         SetSuccValue(curPlayer, succType, conds, 0)
+        SetSuccHasGot(curPlayer, succID, 0)
+        succIDList.append(succID)
+        if [succType, conds] not in syncTypeCondList:
+            syncTypeCondList.append([succType, conds])
+    if isNotify:
+        succIDList and SyncSuccessAwardRecord(curPlayer, succIDList, True)
+        syncTypeCondList and SyncSuccessInfo(curPlayer, syncTypeCondList, True)
     return
 
-#def UpdateSuccessProgressByConditions(curPlayer, successType, conditionCountDict):
-#    ## 根据多种条件更新进度,如装备多品质的
-#    ipyDataList = IpyGameDataPY.GetIpyGameDataListNotLog("Success", successType)
-#    if not ipyDataList:
-#        return
-#    updIDList = []
-#    updsuccDataList = []
-#    updConditionDict = {}
-#    
-#    for condition, newCount in conditionCountDict.items():
-#        addCondList = [] # 不同的成就ID条件可能相同,只是最大进度不同,故传入的条件计数针对相同成就条件只能累加一次
-#        for ipyData in ipyDataList:
-#            succID = ipyData.GetSuccID()
-#            conds = ipyData.GetCondition()
-#            needCnt = ipyData.GetNeedCnt()
-#            
-#            tupleCond = tuple(conds) # 作为字典key用
-#            
-#            if tupleCond not in updConditionDict:
-#                updConditionDict[tupleCond] = [conds, 0, 0] # [条件, 更新值, 最大进度值]
-#            updInfo = updConditionDict[tupleCond]
-#            if updInfo[2] < needCnt:
-#                updInfo[2] = needCnt
-#                
-#            if not __CheckCanAddSuccess(curPlayer, ipyData, list(condition)):
-#                continue
-#            
-#            if succID not in updIDList:
-#                updIDList.append(succID)
-#                updsuccDataList.append(ipyData)
-#                
-#            if tupleCond not in addCondList:
-#                addCondList.append(tupleCond)
-#                updConditionDict[tupleCond][1] = updConditionDict[tupleCond][1] + newCount # 更新进度值
-#                
-#    # 没有找到更新目标不处理
-#    #GameWorld.DebugLog("    updConditionDict=%s" % updConditionDict)
-#    #GameWorld.DebugLog("    updIDList=%s" % updIDList)
-#    if not updIDList:
-#        return
-#    
-#    # 先更新成就记录值后再判断完成与否
-#    for cond, updCnt, maxCnt in updConditionDict.values():
-#        if not updCnt:
-#            continue
-#        updCnt = min(maxCnt, updCnt)
-#        if GetSuccValue(curPlayer, successType, cond) == updCnt:
-#            continue
-#        SetSuccValue(curPlayer, successType, cond, updCnt)
-#    SyncSuccessInfo(curPlayer, syncTypeCondList)
-#    return
+def UpdateEquipSuccess(curPlayer):
+    # 装备相关成就
+    
+    colorCountDict = {}
+    equipPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptEquip)
+    for equipPlace in ChConfig.Def_MainEquipPlaces:
+        equipIndex = equipPlace - 1
+        if equipIndex < 0 or equipIndex >= equipPack.GetCount():
+            continue
+        curEquip = equipPack.GetAt(equipIndex)
+        if not curEquip or curEquip.IsEmpty():
+            continue
+        itemColor = curEquip.GetItemColor()
+        condKey = (itemColor, )
+        colorCountDict[condKey] = colorCountDict.get(condKey, 0) + 1
+        
+    UpdateSuccessProgressByConditions(curPlayer, ShareDefine.SuccType_OSAEquipColor, colorCountDict)
+    return
+
+def UpdateSuccessProgressByConditions(curPlayer, successType, conditionCountDict):
+    ## 根据多种条件更新进度,如装备多品质的
+    # @param conditionCountDict: 条件对应件数,条件需用元组为key {(c, ...):cnt, ..}
+    if successType in ShareDefine.OSASuccTypeList:
+        if OpenServerActivity.GetOSACelebrationState(curPlayer) != 1:
+            return
+    ipyDataList = IpyGameDataPY.GetIpyGameDataListNotLog("Success", successType)
+    if not ipyDataList:
+        return
+    
+    updIDList = []
+    updsuccDataList = []
+    updConditionDict = {}
+    
+    for condition, newCount in conditionCountDict.items():
+        addCondList = [] # 不同的成就ID条件可能相同,只是最大进度不同,故传入的条件计数针对相同成就条件只能累加一次
+        for ipyData in ipyDataList:
+            succID = ipyData.GetSuccID()
+            conds = ipyData.GetCondition()
+            needCnt = ipyData.GetNeedCnt()
+            
+            tupleCond = tuple(conds) # 作为字典key用
+            
+            if tupleCond not in updConditionDict:
+                updConditionDict[tupleCond] = [conds, 0, 0] # [条件, 更新值, 最大进度值]
+            updInfo = updConditionDict[tupleCond]
+            if updInfo[2] < needCnt:
+                updInfo[2] = needCnt
+                
+            if not __CheckCanAddSuccess(curPlayer, ipyData, list(condition)):
+                continue
+            
+            if succID not in updIDList:
+                updIDList.append(succID)
+                updsuccDataList.append(ipyData)
+                
+            if tupleCond not in addCondList:
+                addCondList.append(tupleCond)
+                updConditionDict[tupleCond][1] = updConditionDict[tupleCond][1] + newCount # 更新进度值
+                
+    # 没有找到更新目标不处理
+    #GameWorld.DebugLog("    conditionCountDict=%s" % conditionCountDict)
+    #GameWorld.DebugLog("    updConditionDict=%s" % updConditionDict)
+    #GameWorld.DebugLog("    updIDList=%s" % updIDList)
+    if not updIDList:
+        return
+    
+    # 先更新成就记录值后再判断完成与否
+    syncTypeCondList = []
+    for conds, updCnt, maxCnt in updConditionDict.values():
+        if not updCnt:
+            continue
+        updCnt = min(maxCnt, updCnt)
+        if GetSuccValue(curPlayer, successType, conds) == updCnt:
+            continue
+        SetSuccValue(curPlayer, successType, conds, updCnt)
+        if [successType, conds] not in syncTypeCondList:
+            syncTypeCondList.append([successType, conds])
+    #GameWorld.DebugLog("    syncTypeCondList=%s" % syncTypeCondList)
+    syncTypeCondList and SyncSuccessInfo(curPlayer, syncTypeCondList, True)
+    return
 
 def UptateSuccessProgress(curPlayer, successType, newCnt, condition=[]):
+    if successType in ShareDefine.OSASuccTypeList:
+        if OpenServerActivity.GetOSACelebrationState(curPlayer) != 1:
+            return
     ipyDataList = IpyGameDataPY.GetIpyGameDataListNotLog("Success", successType)
     if not ipyDataList:
         return
@@ -226,7 +275,9 @@
         return
     if successType not in ShareDefine.SuccessTypeList:
         return
-    
+    if successType in ShareDefine.OSASuccTypeList:
+        if OpenServerActivity.GetOSACelebrationState(curPlayer) != 1:
+            return
     ipyDataList = IpyGameDataPY.GetIpyGameDataListNotLog("Success", successType)
     if not ipyDataList:
         GameWorld.DebugLog("找不到成就数据successType=%s" % successType)
@@ -274,7 +325,7 @@
     needCnt = ipyData.GetNeedCnt()
     curValue = GetSuccValue(curPlayer, succType, conds)
     if curValue < needCnt:
-        GameWorld.DebugLog("该成就未完成! succID=%s,curValue=%s < %s" % (succID, curValue, needCnt))
+        GameWorld.DebugLog("该成就未完成! succID=%s,succType=%s,conds=%s,curValue=%s < %s" % (succID, succType, conds, curValue, needCnt))
         return
     
     SetSuccHasGot(curPlayer, succID)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTreasure.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTreasure.py
index f711016..5ca8203 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTreasure.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTreasure.py
@@ -26,6 +26,7 @@
 import PlayerActLunhuidian
 import PlayerActYunshi
 import PlayerActivity
+import PlayerSuccess
 import OpenServerActivity
 import PlayerBillboard
 import ShareDefine
@@ -445,9 +446,11 @@
         
     if treasureType in TreasureType_HeroCallList:
         PlayerActivity.AddDailyTaskValue(curPlayer, ChConfig.DailyTask_HeroCall, treasureCount)
+        heroCallCnt = GetHeroCallCnt(curPlayer)
         if OpenServerActivity.GetOSAState(curPlayer, ShareDefine.Def_BT_OSA_HeroCall) == 1:
-            PlayerBillboard.UpdatePlayerBillboard(curPlayer, ShareDefine.Def_BT_OSA_HeroCall, GetHeroCallCnt(curPlayer))
-            
+            PlayerBillboard.UpdatePlayerBillboard(curPlayer, ShareDefine.Def_BT_OSA_HeroCall, heroCallCnt)
+        PlayerSuccess.UptateSuccessProgress(curPlayer, ShareDefine.SuccType_OSAHeroCall, heroCallCnt)
+        
     PlayerActLunhuidian.AddLunhuidianValue(curPlayer, PlayerActLunhuidian.AwardType_Treasure, treasureType, treasureCount)
     
     # 给物品
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTree.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTree.py
index 24f9521..cf3c585 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTree.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTree.py
@@ -23,6 +23,8 @@
 import PlayerGoldInvest
 import PlayerControl
 import IPY_GameWorld
+import PlayerSuccess
+import ShareDefine
 import PlayerTask
 import ChConfig
 
@@ -289,6 +291,7 @@
     SyncTreeInfo(curPlayer)
     
     PlayerTask.UpdTaskValue(curPlayer, ChConfig.TaskType_TreeLV)
+    PlayerSuccess.UptateSuccessProgress(curPlayer, ShareDefine.SuccType_OSATreeLV, updTreeLV)
     return True
 
 def SyncTreeInfo(curPlayer):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_BossFirstKill.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_BossFirstKill.py
deleted file mode 100644
index bfc728f..0000000
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_BossFirstKill.py
+++ /dev/null
@@ -1,185 +0,0 @@
-#!/usr/bin/python
-# -*- coding: GBK -*-
-#-------------------------------------------------------------------------------
-#
-##@package Player.RemoteQuery.GY_Query_BossFirstKill
-#
-# @todo:Boss首杀
-# @author hxp
-# @date 2019-09-20
-# @version 1.0
-#
-# 详细描述: Boss首杀
-#
-#-------------------------------------------------------------------------------
-#"""Version = 2019-09-20 14:00"""
-#-------------------------------------------------------------------------------
-
-import ChConfig
-import GameWorld
-import PlayerControl
-import IpyGameDataPY
-import IPY_GameWorld
-import ItemControler
-import ChPyNetSendPack
-import NetPackCommon
-import ShareDefine
-import ItemCommon
-
-# boss首杀状态位定义
-(
-BossFKState_IsKill, # 是否已经击杀过该boss
-BossFKState_PubAward, # 是否领取过全服首杀奖励
-BossFKState_PriAward, # 是否领取过个人首杀奖励
-) = range(3)
-
-def OnPlayerLogin(curPlayer):
-    maxBossFKDay = IpyGameDataPY.GetFuncCfg("OSCBossFirstKill", 1)
-    openServerDay = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_ServerDay) + 1
-    if openServerDay > maxBossFKDay:
-        return
-        
-    Sync_BossFirstKillState(curPlayer)
-    return
-
-def SetPlayerFirstKillBoss(curPlayer, bossID):
-    fkState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_BossFirstKillState % bossID)
-    if GameWorld.GetDataByDigitPlace(fkState, BossFKState_IsKill):
-        GameWorld.DebugLog("已经击杀过该boss!")
-        return
-    updFKState = GameWorld.ChangeDataByDigitPlace(fkState, BossFKState_IsKill, 1)
-    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_BossFirstKillState % bossID, updFKState)
-    GameWorld.DebugLog("设置首杀过该boss: bossID=%s,fkState=%s,updFKState=%s" % (bossID, fkState, updFKState))
-    Sync_BossFirstKillState(curPlayer, [bossID])
-    return
-
-#------------------------------------------------------------------------------ 
-## 跨服赛报名调用接口
-#  @param query_Type 请求类型
-#  @param query_ID 请求的玩家ID
-#  @param packCMDList 发包命令
-#  @param tick 当前时间
-#  @return "True" or "False" or ""
-#  @remarks 函数详细说明.
-def DoLogic(query_Type, query_ID, packCMDList, tick): 
-    return
-
-
-#------------------------------------------------------------------------------ 
-## 执行结果
-#  @param curPlayer 发出请求的玩家
-#  @param callFunName 功能名称
-#  @param funResult 查询的结果
-#  @param tick 当前时间
-#  @return None
-#  @remarks 函数详细说明.
-def DoResult(curPlayer, callFunName, funResult, tick):
-    bossID, awardType = eval(funResult)
-    GameWorld.DebugLog("GY_Query_BossFirstKill bossID=%s, awardType=%s" % (bossID, awardType), curPlayer.GetPlayerID())
-    if not curPlayer:
-        return
-    
-    ipyData = IpyGameDataPY.GetIpyGameDataNotLog("BOSSFirstKill", bossID)
-    if not ipyData:
-        return
-    
-    if awardType == 0:
-        __DoGiveBossFirstKill_PubAward(curPlayer, bossID, ipyData)
-    elif awardType == 1:
-        __DoGiveBossFirstKill_PriAward(curPlayer, bossID, ipyData)
-        
-    return
-
-def __DoGiveBossFirstKill_PubAward(curPlayer, bossID, ipyData):
-    ## 首杀全服公共奖励
-    
-    bitIndex = BossFKState_PubAward
-    fkState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_BossFirstKillState % bossID)
-    if GameWorld.GetDataByDigitPlace(fkState, bitIndex):
-        GameWorld.DebugLog("已经领取过该首杀全服奖励!fkState=%s,bitIndex=%s" % (fkState, bitIndex))
-        return
-    updFKState = GameWorld.ChangeDataByDigitPlace(fkState, bitIndex, 1)
-    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_BossFirstKillState % bossID, updFKState)
-    GameWorld.DebugLog("更新Boss首杀全服奖励领奖记录!fkState=%s,bitIndex=%s,updFKState=%s" 
-                       % (fkState, bitIndex, updFKState))
-    
-    awardGoldPaper = ipyData.GetPerPlayerMoneyAward()
-    addDataDict = {"bossID":bossID}
-    PlayerControl.GiveMoney(curPlayer, IPY_GameWorld.TYPE_Price_Gold_Paper, awardGoldPaper, ChConfig.Def_GiveMoney_BossFirstKill, addDataDict)
-    ItemControler.NotifyGiveAwardInfo(curPlayer, [], "BossFirstKill", moneyInfo={IPY_GameWorld.TYPE_Price_Gold_Paper:awardGoldPaper})
-    Sync_BossFirstKillState(curPlayer, [bossID]) 
-    return
-
-def __DoGiveBossFirstKill_PriAward(curPlayer, bossID, ipyData):
-    ## 个人首杀奖励
-    
-    fkState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_BossFirstKillState % bossID)
-    if not GameWorld.GetDataByDigitPlace(fkState, BossFKState_IsKill):
-        GameWorld.DebugLog("还未击杀过该boss,无法领取个人首杀奖励!fkState=%s,bitIndex=%s" % (fkState, BossFKState_IsKill))
-        return
-    
-    awardItemList = ipyData.GetPersonFirstKillAward()
-    needSpace = len(awardItemList)
-    emptySpace = ItemCommon.GetItemPackSpace(curPlayer, IPY_GameWorld.rptItem, needSpace)
-    if emptySpace < needSpace:
-        PlayerControl.NotifyCode(curPlayer, "GeRen_lhs_202580")
-        return
-    
-    bitIndex = BossFKState_PriAward
-    if GameWorld.GetDataByDigitPlace(fkState, bitIndex):
-        GameWorld.DebugLog("已经领取过该个人首杀奖励!fkState=%s,bitIndex=%s" % (fkState, bitIndex))
-        return
-    updFKState = GameWorld.ChangeDataByDigitPlace(fkState, bitIndex, 1)
-    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_BossFirstKillState % bossID, updFKState)
-    GameWorld.DebugLog("更新Boss首杀个人奖励领奖记录!fkState=%s,bitIndex=%s,updFKState=%s" 
-                       % (fkState, bitIndex, updFKState))
-    
-    for itemID, itemCount, isAuctionItem in awardItemList:
-        ItemControler.GivePlayerItem(curPlayer, itemID, itemCount, isAuctionItem, [IPY_GameWorld.rptItem])
-    ItemControler.NotifyGiveAwardInfo(curPlayer, awardItemList, "BossFirstKill")
-    
-    Sync_BossFirstKillState(curPlayer, [bossID])
-    return
-
-def Sync_BossFirstKillState(curPlayer, syncBossIDList=None, isForce=False):
-    if syncBossIDList == None:
-        syncBossIDList = []
-        ipyDataMgr = IpyGameDataPY.IPY_Data()
-        for index in xrange(ipyDataMgr.GetBOSSFirstKillCount()):
-            ipyData = ipyDataMgr.GetBOSSFirstKillByIndex(index)
-            syncBossIDList.append(ipyData.GetNPCID())
-            
-    firstKillStateList = []
-    for bossID in syncBossIDList:
-        fkState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_BossFirstKillState % bossID)
-        if not fkState and not isForce:
-            continue
-        fkStatePack = ChPyNetSendPack.tagMCBossFirstKillState()
-        fkStatePack.NPCID = bossID
-        fkStatePack.FKState = fkState
-        firstKillStateList.append(fkStatePack)
-        
-    if not firstKillStateList:
-        return
-    
-    clientPack = ChPyNetSendPack.tagMCBossFirstKillStateInfo()
-    clientPack.FirstKillStateList = firstKillStateList
-    clientPack.BossCount = len(clientPack.FirstKillStateList)
-    NetPackCommon.SendFakePack(curPlayer, clientPack)
-    return
-
-def OnGMResetBossFirstKillState(curPlayer):
-    syncBossIDList = []
-    ipyDataMgr = IpyGameDataPY.IPY_Data()
-    for index in xrange(ipyDataMgr.GetBOSSFirstKillCount()):
-        ipyData = ipyDataMgr.GetBOSSFirstKillByIndex(index)
-        bossID = ipyData.GetNPCID()
-        fkState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_BossFirstKillState % bossID)
-        if not fkState:
-            continue
-        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_BossFirstKillState % bossID, 0)
-        syncBossIDList.append(bossID)
-    Sync_BossFirstKillState(curPlayer, syncBossIDList, isForce=True)
-    return
-
-    
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
index daa6765..0117513 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
@@ -254,7 +254,6 @@
 OperationActionName_ExpRate = "ActExpRate" # 多倍经验活动
 OperationActionName_CostRebate = "ActCostRebate" # 消费返利活动
 OperationActionName_SpringSale = "ActSpringSale" # 限时特惠活动
-OperationActionName_BossReborn = "ActBossReborn" # BOSS复活活动
 OperationActionName_FlashGiftbag = "ActFlashGiftbag" # 限时礼包活动
 OperationActionName_DailyGiftbag = "ActDailyGiftbag" # 每日礼包活动
 OperationActionName_FairyCeremony = "ActFairyCeremony" # 仙界盛典活动
@@ -293,7 +292,7 @@
                                 ]
 #所有的运营活动列表,含节日活动
 OperationActionNameList = [OperationActionName_ExpRate, OperationActionName_CostRebate, 
-                           OperationActionName_BossReborn,OperationActionName_SpringSale, 
+                           OperationActionName_SpringSale, 
                            OperationActionName_FlashGiftbag, OperationActionName_FairyCeremony,
                            OperationActionName_RealmPoint, OperationActionName_FlashSale,
                            OperationActionName_WishingWell, OperationActionName_TotalRecharge,
@@ -312,7 +311,7 @@
 #需要记录开启活动时的世界等级的运营活动
 NeedWorldLVOperationActNameList = [OperationActionName_FairyCeremony, OperationActionName_WishingWell, 
                                    OperationActionName_NewFairyCeremony, OperationActionName_FlashSale,
-                                   OperationActionName_BossReborn, OperationActionName_TotalRecharge,
+                                   OperationActionName_TotalRecharge,
                                    OperationActionName_CostRebate, OperationActionName_FlashGiftbag,
                                    OperationActionName_SpringSale, OperationActionName_LuckyTreasure,
                                    OperationActionName_DailyGiftbag, OperationActionName_GrowupBuy,
@@ -696,7 +695,8 @@
 CDBPlayerRefresh_GoldRushEnergy, # 淘金令 285
 CDBPlayerRefresh_ArenaTicket, # 挑战券 286
 CDBPlayerRefresh_TehuiPoint, # 特惠印绶 287
-) = range(146, 288)
+CDBPlayerRefresh_OSAPoint, # 开服庆典积分 288
+) = range(146, 289)
 
 TYPE_Price_Gold_Paper_Money = 5    # 金钱类型,(先用礼券,再用金子)
 TYPE_Price_FamilyExp = 6 # 战盟经验
@@ -739,12 +739,14 @@
 TYPE_Price_GoldRushEnergy = 52    # 淘金令体力
 TYPE_Price_ArenaTicket = 53    # 演武场挑战券
 TYPE_Price_TehuiPoint = 54    # 特惠印绶
+TYPE_Price_OSAPoint = 55    # 开服庆典积分
 TYPE_Price_PayCoinDay = 98    # 代币时效,每日过天重置
 TYPE_Price_PayCoin = 99    # 代币
 
 #key可用于遍历所有货币,value仅GM相关会用到
 MoneyNameDict = {
-                 1:"金币", 15:"公会贡献币", 41:"战锤", 42:"将星玉髓", 43:"将魂", 51:"招募积分", 52:"淘金令", 53:"挑战券", 54:"特惠印绶",
+                 1:"金币", 15:"公会贡献币", 41:"战锤", 42:"将星玉髓", 43:"将魂", 51:"招募积分", 52:"淘金令", 53:"挑战券", 54:"特惠印绶", 
+                 55:"可用开服庆典积分",
                  98:"代币时效", 99:"代币"
                  }
 #MoneyNameDict = {
@@ -769,6 +771,7 @@
                            TYPE_Price_GoldRushEnergy:CDBPlayerRefresh_GoldRushEnergy,
                            TYPE_Price_ArenaTicket:CDBPlayerRefresh_ArenaTicket,
                            TYPE_Price_TehuiPoint:CDBPlayerRefresh_TehuiPoint,
+                           TYPE_Price_OSAPoint:CDBPlayerRefresh_OSAPoint,
                            TYPE_Price_PayCoinDay:CDBPlayerRefresh_PayCoinDay,
                            #TYPE_Price_Rune:CDBPlayerRefresh_Rune,
                            #TYPE_Price_RuneSplinters:CDBPlayerRefresh_RuneSplinters,
@@ -809,6 +812,7 @@
 GameFuncID_Travel = 44          # 游历
 GameFuncID_OSA_MainLevel = 45   # 开服关卡榜
 GameFuncID_OSA_HeroCall = 46    # 开服招募榜
+GameFuncID_OSA_Celebration = 47 # 开服庆典
 
 # 以下为暂时无用的
 GameFuncID_Pet = -1             # 宠物,灵宠 6
@@ -915,7 +919,7 @@
                                 Def_UniversalGameRecType_28,
                                 Def_UniversalGameRecType_BossInfo,  # boss信息29
                                 Def_UniversalGameRecType_CrossBossInfo,  # 跨服boss信息 30
-                                Def_UniversalGameRecType_BossFirstKill, # boss首杀 31
+                                Def_UniversalGameRecType_31,
                                 Def_UniversalGameRecType_CrossCollect,  # 跨服采集记录信息 32             
                                 Def_UniversalGameRecType_CrossChampionshipGroup, # 跨服排位争霸赛分组信息 33
                                 Def_UniversalGameRecType_CrossChampionshipGuess, # 跨服排位争霸赛竞猜记录信息 34
@@ -1393,7 +1397,28 @@
 # 成就类型定义
 SuccessTypeList = (
 SuccType_MainLevel, # 通过主线关卡xxx 1
-) = range(1, 1 + 1)
+SuccType_OSAMainLevel, # 开服庆典 - 通过主线关卡xxx 2
+SuccType_OSACutTree, # 消耗X个战锤  3
+SuccType_OSARealmLV, # 官职达到X级 4
+SuccType_OSATreeLV, # 仙树达到X级 5
+SuccType_OSAEquipColor, # 穿戴x件x品质及以上装备 6
+SuccType_OSAHorseLVUP, # 坐骑升级x次 7
+SuccType_OSAHeroLVUP, # 武将升级X次 8
+SuccType_OSAHeroStarUP, # 武将升星x次 9
+SuccType_OSAHeroCall, # 武将招募x次 10
+SuccType_OSAHeroBook, # 武将图鉴激活x个  11
+SuccType_OSAArenaBattle, # 演武场战斗x次 12
+SuccType_OSAFBZhanchui, # 白骨盈野击败xx 13
+SuccType_OSAFBTianzi, # 挑战天子的考验x次 14
+SuccType_OSAGoldRush, # 淘金采集x次 15
+SuccType_OSAGoldRushWorkers, # 拥有x名监工 16
+SuccType_OSAKillNPC, # 击败X只怪物 17
+SuccType_OSAEquipDecompose, # 分解装备x次 18
+SuccType_OSAGetMoney, # 累计获得xx货币 19
+) = range(1, 1 + 19)
+
+# 开服庆典成就类型
+OSASuccTypeList = range(SuccType_OSAMainLevel, SuccType_OSAGetMoney + 1)
 
 # 不向下适配检查的成就类型(指相对较高成就条件不会增加较低成就条件的进度)
 UnDownCheckSuccessTypeList = []

--
Gitblit v1.8.0