ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActivity.py
@@ -29,6 +29,7 @@
import PyGameData
import GameFuncComm
import EventShell
import PlayerTJG
import PlayerPet
import datetime
import time
@@ -629,74 +630,108 @@
#struct    tagCMActivityPlaceStart
#{
#    tagHead        Head;
#    BYTE        RewardEndType;    //是否结算探索,后端处理奖励后自动启动下一次放置探索;0-无结算启动,1-倒计时结束结算,2-快速结算;
#};
def OnActivityPlaceStart(index, clientData, tick):
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    rewardEndType = clientData.RewardEndType
    
    maxRewardCount = IpyGameDataPY.GetFuncCfg("ActivityPlace", 4) # 最大累计放置奖励次数
    remainCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ActivityPlaceRemainCount)
    rewardCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ActivityPlaceRewardCount)
    maxRewardCount = IpyGameDataPY.GetFuncCfg("ActivityPlace", 4) # 最大累计放置奖励次数
    if rewardCount >= maxRewardCount:
        GameWorld.ErrLog("活跃放置奖励累计次数已达上限,无法启动")
    maxCanStartCount = maxRewardCount - remainCount - rewardCount
    if maxCanStartCount <= 0:
        GameWorld.DebugLog("活跃放置奖励累计次数已达上限,无法启动!remainCount=%s + rewardCount=%s >= maxRewardCount=%s"
                           % (remainCount, rewardCount, maxRewardCount))
        return
    costPoint = IpyGameDataPY.GetFuncCfg("ActivityPlace", 2) # 单次放置消耗的活跃点数
    canUseActivityPoint = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ActivityCanCostTotalPoint)
    pointCanUseCount = canUseActivityPoint / costPoint
    startCount = min(maxCanStartCount, pointCanUseCount)
    if startCount <= 0:
        GameWorld.DebugLog("可用活跃不足,无法添加次数启动!canUseActivityPoint=%s,costPoint=%s" % (canUseActivityPoint, costPoint))
        return
    
    placeState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ActivityPlaceState)
    updRemainCount = remainCount + startCount
    GameWorld.DebugLog("添加活跃放置次数: startCount=%s,rewardCount=%s,remainCount=%s,updRemainCount=%s"
                       % (startCount, rewardCount, remainCount, updRemainCount))
    
    endCount, nextStartReduceSeconds = 1, 0
    costPointTotal = costPoint * startCount
    CostActivityPoint(curPlayer, costPointTotal)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ActivityPlaceRemainCount, updRemainCount)
    
    # 无结算启动
    if rewardEndType == 0:
        if placeState:
            GameWorld.DebugLog("已在放置探索中!")
            return
        __DoActivityPlaceStart(curPlayer)
    # 倒计时结束结算
    elif rewardEndType == 1:
        if not placeState:
            GameWorld.DebugLog("非放置探索中,无法结算!")
            return
        startTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ActivityPlaceStartTime)
        if not startTime:
            return
        needSeconds = IpyGameDataPY.GetFuncCfg("ActivityPlace", 3) # 单次放置奖励持续时间,秒
    if not remainCount:
        curTime = int(time.time())
        passTime = curTime - startTime
        if passTime < needSeconds:
            GameWorld.DebugLog("探索时间未到,无法结算! curTime=%s,startTime=%s,passTime=%s < %s" % (curTime, startTime, passTime, needSeconds))
            return
        endCount = passTime / needSeconds
        nextStartReduceSeconds = passTime % needSeconds
        __DoActivityPlaceRewardEnd(curPlayer, endCount, nextStartReduceSeconds)
    # 快速结算
    elif rewardEndType == 2:
        if not placeState:
            GameWorld.DebugLog("非放置探索中,无法快速结算!")
            return
        costItemID, costGoldParper = IpyGameDataPY.GetFuncEvalCfg("ActivityPlace", 5)
        costItemCount = 1
        costItemIndexList, bindCnt, unBindCnt = ItemCommon.GetPackItemBindStateIndexInfo(curPlayer, costItemID, costItemCount)
        lackCnt = costItemCount - bindCnt - unBindCnt
        if lackCnt > 0:
            if not PlayerControl.PayMoney(curPlayer, IPY_GameWorld.TYPE_Price_Gold_Paper, costGoldParper, ChConfig.Def_Cost_ActivityPlace):
                return
        else:
            ItemCommon.DelCostItemByBind(curPlayer, costItemIndexList, bindCnt, unBindCnt, costItemCount, ChConfig.ItemDel_ActivityPlace)
        __DoActivityPlaceRewardEnd(curPlayer, endCount, nextStartReduceSeconds)
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ActivityPlaceStartTime, curTime)
        GameWorld.DebugLog("    没有剩余次数,更新启动时间: %s" % curTime)
        
    Sync_ActivityPlaceInfo(curPlayer)
    return
def __DoActivityPlaceRewardEnd(curPlayer, endCount, nextStartReduceSeconds):
#// B0 28 活跃放置快速完成 #tagCMActivityPlaceQuickFinish
#
#struct    tagCMActivityPlaceQuickFinish
#{
#    tagHead        Head;
#};
def OnActivityPlaceQuickFinish(index, clientData, tick):
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    remainCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ActivityPlaceRemainCount)
    if not remainCount:
        GameWorld.DebugLog("没有剩余活跃放置次数,无法快速完成!")
        return
    costItemID, costGoldParper = IpyGameDataPY.GetFuncEvalCfg("ActivityPlace", 5)
    costItemCount = 1 # 默认扣一个
    endCount = 1 # 只快速结算一次
    costItemIndexList, bindCnt, unBindCnt = ItemCommon.GetPackItemBindStateIndexInfo(curPlayer, costItemID, costItemCount)
    lackCnt = costItemCount - bindCnt - unBindCnt
    if lackCnt > 0:
        if not PlayerControl.PayMoney(curPlayer, IPY_GameWorld.TYPE_Price_Gold_Paper, costGoldParper, ChConfig.Def_Cost_ActivityPlace):
            return
    else:
        ItemCommon.DelCostItemByBind(curPlayer, costItemIndexList, bindCnt, unBindCnt, costItemCount, ChConfig.ItemDel_ActivityPlace)
    __DoActivityPlaceRewardEnd(curPlayer, endCount)
    return
def ProcessActivityPlace(curPlayer):
    ## 活跃放置定时处理
    remainCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ActivityPlaceRemainCount)
    if remainCount <= 0:
        #GameWorld.DebugLog("没有剩余放置次数不处理!")
        return
    curTime = int(time.time())
    startTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ActivityPlaceStartTime)
    if not startTime:
        startTime = curTime
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ActivityPlaceStartTime, curTime)
    needSeconds = IpyGameDataPY.GetFuncCfg("ActivityPlace", 3) # 单次放置奖励持续时间,秒
    passTime = curTime - startTime
    if passTime < needSeconds:
        #GameWorld.DebugLog("探索时间未到,不结算! curTime=%s,startTime=%s,passTime=%s < %s" % (curTime, startTime, passTime, needSeconds))
        return
    endCount = passTime / needSeconds
    nextStartReduceSeconds = passTime % needSeconds
    __DoActivityPlaceRewardEnd(curPlayer, endCount, nextStartReduceSeconds)
    return
def __DoActivityPlaceRewardEnd(curPlayer, endCount, nextStartReduceSeconds=0):
    ## 放置活跃奖励结算
    
    if not endCount:
    remainCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ActivityPlaceRemainCount)
    endCount = min(endCount, remainCount)
    if endCount <= 0:
        return
    if PlayerTJG.GetIsTJG(curPlayer):
        return
    countDataDict = {}
    lvDataDict = {}
    ipyDataMgr = IpyGameDataPY.IPY_Data()
@@ -719,36 +754,24 @@
    if not lvRewardIpyData:
        lvRewardIpyData = lvDataDict[lvList[-1]]
        
    costPoint = IpyGameDataPY.GetFuncCfg("ActivityPlace", 2) # 单次放置消耗的活跃点数
    maxRewardCount = IpyGameDataPY.GetFuncCfg("ActivityPlace", 4) # 最大累计放置奖励次数
    maxAppointCount = max(countDataDict) # 最大定制奖励次数
    rewardCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ActivityPlaceRewardCount)
    rewardTotalCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ActivityPlaceRewardTotalCount)
    
    isStop = False
    rewardItemDict = {}
    GameWorld.DebugLog("结算放置活跃奖励: rewardCount=%s,endCount=%s,maxRewardCount=%s,maxAppointCount=%s" % (rewardCount, endCount, maxRewardCount, maxAppointCount))
    for endIndex in xrange(endCount):
        #GameWorld.DebugLog("endIndex=%s" % endIndex)
    GameWorld.DebugLog("结算放置活跃奖励: remainCount=%s,rewardCount=%s,endCount=%s,maxAppointCount=%s" % (remainCount, rewardCount, endCount, maxAppointCount))
    for _ in xrange(endCount):
        
        # 超过1次的需要补扣活跃消耗
        if endCount > 1 and endIndex != 0:
            if not CostActivityPoint(curPlayer, costPoint):
                isStop = True
                GameWorld.DebugLog("    可消耗的活跃不足,无法继续结算奖励!")
                break
        rewardIpyData = None
        rewardTotalCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ActivityPlaceRewardTotalCount)
        
        # 加奖励次数
        remainCount -= 1
        rewardCount += 1
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ActivityPlaceRewardCount, rewardCount)
        if rewardTotalCount < maxAppointCount:
            rewardTotalCount += 1
            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ActivityPlaceRewardTotalCount, rewardTotalCount)
            if rewardTotalCount in countDataDict:
                rewardIpyData = countDataDict[rewardTotalCount]
                #GameWorld.DebugLog("    取定制次数奖励")
                #GameWorld.DebugLog("    取定制次数奖励: rewardTotalCount=%s" % rewardTotalCount)
                
        if not rewardIpyData:
            rewardIpyData = lvRewardIpyData
@@ -768,13 +791,17 @@
            if itemID:
                rewardItemDict[itemID] = rewardItemDict.get(itemID, 0) + 1
                
        GameWorld.DebugLog("    rewardCount=%s,rewardTotalCount=%s, %s" % (rewardCount, rewardTotalCount, rewardItemDict))
        if rewardCount >= maxRewardCount:
            isStop = True
            GameWorld.DebugLog("    放置活跃奖励次数已达上限!rewardCount=%s" % rewardCount)
            break
        GameWorld.DebugLog("    remainCount=%s,rewardCount=%s,rewardTotalCount=%s, %s" % (remainCount, rewardCount, rewardTotalCount, rewardItemDict))
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ActivityPlaceRemainCount, remainCount)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ActivityPlaceRewardCount, rewardCount)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ActivityPlaceRewardTotalCount, rewardTotalCount)
    if remainCount > 0:
        nextStartTime = int(time.time()) - nextStartReduceSeconds
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ActivityPlaceStartTime, nextStartTime)
        GameWorld.DebugLog("    还有剩余次数,更新启动时间: %s, nextStartReduceSeconds=%s" % (nextStartTime, nextStartReduceSeconds))
    # 存储奖励
    rewardItemCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ActivityPlaceRewardItem)
    for i in xrange(rewardItemCount):
@@ -794,28 +821,8 @@
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ActivityPlaceRewardItem, rewardItemCount)
        #GameWorld.DebugLog("    新增探索奖励: itemID=%s,itemCount=%s,rewardItemCount=%s" % (itemID, itemCount, rewardItemCount))
        
    if isStop:
        GameWorld.DebugLog("    停止探索!")
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ActivityPlaceState, 0)
    else:
        __DoActivityPlaceStart(curPlayer, nextStartReduceSeconds)
    Sync_ActivityPlaceInfo(curPlayer)
    return
def __DoActivityPlaceStart(curPlayer, reduceSeconds=0):
    costPoint = IpyGameDataPY.GetFuncCfg("ActivityPlace", 2) # 单次放置消耗的活跃点数
    canUseActivityPoint = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ActivityCanCostTotalPoint)
    if canUseActivityPoint < costPoint:
        GameWorld.DebugLog("活跃度不足,无法启动放置探索!canUseActivityPoint=%s" % canUseActivityPoint)
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ActivityPlaceState, 0)
        return
    startTime = int(time.time()) - reduceSeconds
    GameWorld.DebugLog("    启动新一轮放置探索!reduceSeconds=%s" % reduceSeconds)
    CostActivityPoint(curPlayer, costPoint)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ActivityPlaceState, 1)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ActivityPlaceStartTime, startTime)
    return True
def GetActivityPlaceReward(curPlayer):
    ## 领取活跃放置奖励
@@ -855,8 +862,8 @@
        itemCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ActivityPlaceRewardItemCount % i)
        rewardItemInfo.append([itemID, itemCount])
    placeInfo = ChPyNetSendPack.tagMCActivityPlaceInfo()
    placeInfo.PlaceState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ActivityPlaceState)
    placeInfo.StartTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ActivityPlaceStartTime)
    placeInfo.PlaceCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ActivityPlaceRemainCount)
    placeInfo.RewardCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ActivityPlaceRewardCount)
    placeInfo.RewardInfo = str(rewardItemInfo)
    placeInfo.RewardLen = len(placeInfo.RewardInfo)