From 59557612e1f6c0237742f681748920b17f5e0e91 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期五, 11 四月 2025 16:31:10 +0800
Subject: [PATCH] 10367 【越南】【英语】【BT】【砍树】仙盟攻城战-服务端(增加圣泉抽奖;积分总榜增加轮次积分明细记录;优化活动相关榜单排序规则,支持战斗阶段每分钟统计最新积分情况;优化轮次结算汇总信息;轮次支持升降级;)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActFamilyGCZ.py |  144 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 144 insertions(+), 0 deletions(-)

diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActFamilyGCZ.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActFamilyGCZ.py
index 4c3d753..c060da6 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActFamilyGCZ.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActFamilyGCZ.py
@@ -45,6 +45,9 @@
 AtkType_SkillArea, # 技能群攻 3
 ) = range(1, 1 + 3)
 
+# 圣泉过关标记物品ID
+SQPass_ItemID = 2000000000
+
 def GetRoundState(state):
     ## 获取轮次、状态信息
     if state < 10 or state == FamilyGCZState_Award:
@@ -145,6 +148,7 @@
         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FamilyGCZFamilyID, familyID)
         if state:
             Sync_FamilyGCZPlayerInfo(curPlayer)
+            Sync_FamilyGCZSQInfo(curPlayer)
         return
     
     GameWorld.DebugLog("仙盟攻城战活动玩家重置! zoneID=%s,actID=%s,playerZoneID=%s,playerActID=%s" 
@@ -175,6 +179,17 @@
     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FamilyGCZEnergyTime, 0)
     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FamilyGCZAwardState, 0)
     
+    # 重置圣泉
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FamilyGCZSQLayer, 0)
+    gridCntMax = 0
+    ipyDataMgr = IpyGameDataPY.IPY_Data()
+    for index in range(ipyDataMgr.GetCrossActFamilyGCZSQCount()):
+        ipyData = ipyDataMgr.GetCrossActFamilyGCZSQByIndex(index)
+        gridCntMax = max(0, ipyData.GetGridCnt())
+    for gridNum in range(1, gridCntMax + 1):
+        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FamilyGCZSQGridItemID % gridNum, 0)
+        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FamilyGCZSQGridItemCnt % gridNum, 0)
+        
 #    # 回收道具
 #    for itemID in IpyGameDataPY.GetFuncEvalCfg("LianqiUseItem", 5):
 #        ItemControler.RecycleItem(curPlayer, itemID, "ActLianqiRecycleItem")
@@ -182,7 +197,9 @@
     if state:
         maxEnergy = IpyGameDataPY.GetFuncCfg("FamilyGCZEnergy", 1)
         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FamilyGCZEnergy, maxEnergy)
+        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FamilyGCZSQLayer, 1)
         Sync_FamilyGCZPlayerInfo(curPlayer)
+        Sync_FamilyGCZSQInfo(curPlayer)
         
     return True
 
@@ -514,6 +531,111 @@
     ItemControler.GivePlayerItemOrMail(curPlayer, awardItemList, event=["FamilyGCZAward", True, drDict])
     return
 
+
+#// C1 27 仙盟攻城战圣泉抽奖 #tagCMFamilyGCZSQ
+#
+#struct    tagCMFamilyGCZSQ
+#{
+#    tagHead        Head;
+#    BYTE        GridNum;    // 选中格子编号,1~n
+#};
+def OnFamilyGCZSQ(index, clientData, tick):
+    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
+    gridNum = clientData.GridNum
+    playerID = curPlayer.GetPlayerID()
+    
+    layerNum = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FamilyGCZSQLayer)
+    if not layerNum:
+        layerNum = 1
+        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FamilyGCZSQLayer, 1)
+        
+    ipyData = IpyGameDataPY.GetIpyGameData("CrossActFamilyGCZSQ", layerNum)
+    if not ipyData:
+        return
+    gridCnt = ipyData.GetGridCnt()
+    if gridNum < 1 or gridNum > gridCnt:
+        GameWorld.DebugLog("圣泉抽奖不存在该格子编号! layerNum=%s, gridNum=%s" % (layerNum, gridNum), playerID)
+        return
+    
+    if curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FamilyGCZSQGridItemID % gridNum):
+        Sync_FamilyGCZSQInfo(curPlayer, gridNum)
+        return
+    
+    costItemID = ipyData.GetCostItemID()
+    costItemCount = ipyData.GetCostItemCnt()
+    if not costItemID or not costItemCount:
+        return
+    
+    itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
+    hasEnough, itemIndexList = ItemCommon.GetItem_FromPack_ByID(costItemID, itemPack, costItemCount)
+    if not hasEnough:
+        GameWorld.DebugLog("圣泉抽奖道具不足! costItemID=%s, costItemCount=%s" % (costItemID, costItemCount), playerID)
+        return
+    
+    emptyCnt = 0    
+    for gNum in range(1, gridCnt + 1):
+        if curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FamilyGCZSQGridItemID % gNum):
+            continue
+        emptyCnt += 1
+        if emptyCnt > 1:
+            break
+        
+    if emptyCnt > 1:
+        isPass = GameWorld.CanHappen(ipyData.GetPassRate())
+    else:
+        isPass = 1
+        GameWorld.DebugLog("仙盟攻城战圣泉抽奖最后一格必过关! layerNum=%s" % layerNum, playerID)
+        
+    if not isPass:
+        randItem = GameWorld.GetResultByWeightList(ipyData.GetGridWeightItemList())
+        GameWorld.DebugLog("仙盟攻城战圣泉抽奖未过关! layerNum=%s,gridNum=%s,randItem=%s" % (layerNum, gridNum, randItem), playerID)
+        if not randItem:
+            return
+        itemID, itemCount = randItem
+        if not itemID or not itemCount:
+            return
+        
+        ItemCommon.ReduceItem(curPlayer, itemPack, itemIndexList, costItemCount, True, "FamilyGCZSQ")
+        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FamilyGCZSQGridItemID % gridNum, itemID)
+        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FamilyGCZSQGridItemCnt % gridNum, itemCount)
+        ItemControler.GivePlayerItemOrMail(curPlayer, [[itemID, itemCount]], event=["FamilyGCZSQGrid", False, {}])
+        Sync_FamilyGCZSQInfo(curPlayer, gridNum)
+        return
+    
+    # 过关
+    ItemCommon.ReduceItem(curPlayer, itemPack, itemIndexList, costItemCount, True, "FamilyGCZSQ")
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FamilyGCZSQGridItemID % gridNum, SQPass_ItemID)
+    passAwardItemList = ipyData.GetLayerAwardItemList() # 过关奖励
+    ItemControler.GivePlayerItemOrMail(curPlayer, passAwardItemList, event=["FamilyGCZSQPass", False, {}])
+    Sync_FamilyGCZSQInfo(curPlayer, gridNum)
+    GameWorld.DebugLog("仙盟攻城战圣泉抽奖过关! layerNum=%s,gridNum=%s,passAwardItemList=%s" 
+                       % (layerNum, gridNum, passAwardItemList), playerID)
+    
+    #重置格子记录
+    for gridNum in range(1, ipyData.GetGridCnt() + 1):
+        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FamilyGCZSQGridItemID % gridNum, 0)
+        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FamilyGCZSQGridItemCnt % gridNum, 0)
+        
+    nextLayerNum = layerNum + 1
+    #下一层
+    if IpyGameDataPY.GetIpyGameDataNotLog("CrossActFamilyGCZSQ", nextLayerNum):
+        GameWorld.DebugLog("    下一层! nextLayerNum=%s" % (nextLayerNum), playerID)
+        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FamilyGCZSQLayer, nextLayerNum)
+        Sync_FamilyGCZSQInfo(curPlayer)
+        return
+    
+    #通关,从头开始
+    weightItemList = ipyData.GetLayerWeightItemList() # 通关随机奖励
+    awardItemEx = GameWorld.GetResultByWeightList(weightItemList)
+    if awardItemEx and len(awardItemEx) == 2:
+        itemID, itemCount = awardItemEx
+        ItemControler.GivePlayerItemOrMail(curPlayer, [[itemID, itemCount]], event=["FamilyGCZSQPassAll", False, {}])
+        
+    GameWorld.DebugLog("    没有下一层了,从头开始! awardItemEx=%s" % str(awardItemEx), playerID)
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FamilyGCZSQLayer, 1)
+    Sync_FamilyGCZSQInfo(curPlayer)
+    return
+
 def Sync_FamilyGCZPlayerInfo(curPlayer):
     clientPack = ChPyNetSendPack.tagMCFamilyGCZPlayerInfo()
     clientPack.ContributionCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FamilyGCZContributionCnt)
@@ -523,3 +645,25 @@
     NetPackCommon.SendFakePack(curPlayer, clientPack)
     return
 
+def Sync_FamilyGCZSQInfo(curPlayer, gridNum=0):
+    layerNum = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FamilyGCZSQLayer)
+    ipyData = IpyGameDataPY.GetIpyGameData("CrossActFamilyGCZSQ", layerNum)
+    if not ipyData:
+        return
+    clientPack = ChPyNetSendPack.tagMCFamilyGCZSQInfo()
+    clientPack.SQLayer = layerNum
+    if gridNum:
+        syncGridList = [gridNum]
+    else:
+        syncGridList = range(1, ipyData.GetGridCnt() + 1)
+    clientPack.SQGridList = []
+    for gNum in syncGridList:
+        grid = ChPyNetSendPack.tagMCFamilyGCZSQGrid()
+        grid.GridNum = gNum
+        grid.ItemID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FamilyGCZSQGridItemID % gNum)
+        grid.ItemCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FamilyGCZSQGridItemCnt % gNum)
+        clientPack.SQGridList.append(grid)
+    clientPack.SQGirdCnt = len(clientPack.SQGridList)
+    NetPackCommon.SendFakePack(curPlayer, clientPack)
+    return
+

--
Gitblit v1.8.0