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