hxp
2025-02-06 a90833bf05d8f4a338b0224a956a3794c106bb48
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerMineArea.py
@@ -27,9 +27,17 @@
import ShareDefine
import ItemCommon
import GameWorld
import time
# 聚宝盆默认最大进度
MineTreasureProgressMax = 100
# 刷新类型列表
RefreshTypeList = (
RefreshType_Comm, # 自己物品普通刷新 0
RefreshType_Super, # 自己物品超级刷新 1
RefreshType_Rob, # 抢劫周围玩家刷新 2
) = range(3)
def OnPlayerLogin(curPlayer):
    freeWorkerCount = 0
@@ -46,7 +54,7 @@
def PlayerOnDay(curPlayer):
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_MineHelpAwardCount, 0)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_MineWorkerEnergyUsed, 0)
    for refreshType in [0, 1]:
    for refreshType in RefreshTypeList:
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_MineRefreshCount % refreshType, 0)
    SyncPlayerMineAreaInfo(curPlayer)
    return
@@ -102,36 +110,62 @@
#
#{
#    tagHead        Head;
#    BYTE        IsSuper;    // 是否超级刷新
#    BYTE        RefreshType;    // 刷新类型:0-自己物品普通刷新;1-自己物品超级刷新;2-周围福地玩家列表刷新
#};
def OnMineItemRefresh(index, clientData, tick):
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    playerID = curPlayer.GetPlayerID()
    isSuper = clientData.IsSuper
    refreshType = clientData.RefreshType
    
    refreshType = str(1 if isSuper else 0)
    moneyType, moneyValue = 0, 0
    moneyDict = IpyGameDataPY.GetFuncEvalCfg("MineAreaRefresh", 1, {})
    if refreshType not in moneyDict:
        return
    moneyType, moneyValue = moneyDict[refreshType]
    if not PlayerControl.HaveMoney(curPlayer, moneyType, moneyValue):
        return
    if str(refreshType) in moneyDict:
        moneyType, moneyValue = moneyDict[str(refreshType)]
        if not PlayerControl.HaveMoney(curPlayer, moneyType, moneyValue):
            return
    costItemID, costItemCount = 0, 0
    refreshMaxDict = IpyGameDataPY.GetFuncEvalCfg("MineAreaRefresh", 2, {})
    refreshCountMax = refreshMaxDict.get(refreshType, 0)
    refreshCountMax = refreshMaxDict.get(str(refreshType), 0)
    refreshCountNow = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MineRefreshCount % refreshType)
    if refreshCountMax and refreshCountNow >= refreshCountMax:
        GameWorld.DebugLog("福地物品刷新次数已达今日上限! isSuper=%s,refreshCountNow=%s >= %s" % (isSuper, refreshCountNow, refreshCountMax), playerID)
        return
    PlayerControl.PayMoney(curPlayer, moneyType, moneyValue, "MineItemRefresh")
    if refreshCountMax:
        if refreshType == RefreshType_Super:
            employCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MineWorkerCount)
            employMax = len(IpyGameDataPY.GetFuncEvalCfg("MineAreaWorker", 3))
            if employCount < employMax:
                GameWorld.DebugLog("福地雇佣工人数未达到上限,不能使用雇佣道具进行超级刷新! employCount=%s < %s" % (employCount, employMax), playerID)
                return
            costItemID = IpyGameDataPY.GetFuncCfg("MineAreaWorker", 2)
            costItemCount = IpyGameDataPY.GetFuncCfg("MineAreaRefresh", 3)
            costItemIndexList, bindCnt, unBindCnt = ItemCommon.GetPackItemBindStateIndexInfo(curPlayer, costItemID, costItemCount)
            lackCnt = costItemCount - bindCnt - unBindCnt
            if lackCnt > 0:
                GameWorld.DebugLog("福地雇佣工人道具不足,无法超级刷新! costItemID=%s,costItemCount=%s,bindCnt=%s,unBindCnt=%s,lackCnt=%s"
                                   % (costItemID, costItemCount, bindCnt, unBindCnt, lackCnt))
                return
        else:
            GameWorld.DebugLog("福地物品刷新次数已达今日上限! refreshType=%s,refreshCountNow=%s >= %s" % (refreshType, refreshCountNow, refreshCountMax), playerID)
            return
    GameWorld.DebugLog("福地刷新: refreshType=%s,refreshCountNow=%s,moneyType=%s,moneyValue=%s,costItemID=%s,costItemCount=%s"
                       % (refreshType, refreshCountNow, moneyType, moneyValue, costItemID, costItemCount), playerID)
    if moneyType and moneyValue:
        PlayerControl.PayMoney(curPlayer, moneyType, moneyValue, "MineItemRefresh")
    if costItemID and costItemCount:
        delCnt = costItemCount
        ItemCommon.DelCostItemByBind(curPlayer, costItemIndexList, bindCnt, unBindCnt, delCnt, "MineItemRefresh")
    if refreshCountMax and refreshCountNow < refreshCountMax:
        refreshCountUpd = refreshCountNow + 1
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_MineRefreshCount % refreshType, refreshCountUpd)
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_MineRefreshCount % refreshType, refreshCountUpd)
        SyncPlayerMineAreaInfo(curPlayer)
        
    SendToGameServer_MineArea(curPlayer, "MineItemRefresh", [playerID, isSuper])
    if refreshType == RefreshType_Rob:
        SendToGameServer_MineArea(curPlayer, "MineRobRefresh", [])
    else:
        isSuper = 1 if refreshType == RefreshType_Super else 0
        SendToGameServer_MineArea(curPlayer, "MineItemRefresh", [playerID, isSuper])
    return
#// B0 32 福地工人雇佣 #tagCMMineWorkerEmploy
@@ -248,6 +282,17 @@
        PlayerActTask.AddActTaskValue(curPlayer, ChConfig.ActTaskType_MineAreaEndOther)
    return
#// B0 35 福地管家免费试用 #tagCMMineHouseKeeperFreeUse
#
#struct    tagCMMineHouseKeeperFreeUse
#{
#    tagHead        Head;
#};
def OnMineHouseKeeperFreeUse(index, clientData, tick):
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    OnActMineHousekeeper(curPlayer, 0)
    return
def OnMineTreasureByCTGID(curPlayer, ctgID):
    ## 充值激活聚宝盆
    treasureCTGIDList = IpyGameDataPY.GetFuncEvalCfg("MineAreaTreasure", 1)
@@ -263,6 +308,12 @@
        GameWorld.Log("激活福地聚宝盆: treasureType=%s,updState=%s" % (treasureType, updState), curPlayer.GetPlayerID())
        break
    
    keeperCTGIDList = IpyGameDataPY.GetFuncEvalCfg("MineAreaHousekeeper", 3)
    for keeperIndex, ctgIDList in enumerate(keeperCTGIDList, 1):
        if ctgID in ctgIDList:
            OnActMineHousekeeper(curPlayer, keeperIndex)
            break
    return
def OnAddMineTreasureProgress(curPlayer, robCount, isNotify=True):
@@ -326,13 +377,59 @@
    GameWorld.DebugLog("福地聚宝盆领奖! treasureType=%s,updAward=%s,awardItemList=%s" % (treasureType, updAward, awardItemList), playerID)
    return
def OnActMineHousekeeper(curPlayer, keeperIndex):
    ## 激活/增加自动管家时长
    # @param keeperIndex: 管家档位索引,0-免费,>0-付费档
    playerID = curPlayer.GetPlayerID()
    endTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MineHousekeeperEndTime)
    if keeperIndex == 0:
        if endTime:
            GameWorld.DebugLog("福地免费管家已领取过!", playerID)
            return
    openServerDayLimit = IpyGameDataPY.GetFuncCfg("MineAreaHousekeeper", 1)
    if openServerDayLimit:
        openServerDay = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_ServerDay) + 1
        if openServerDay <= openServerDayLimit:
            GameWorld.ErrLog("开服天未到,无法使用福地管家! keeperIndex=%s,openServerDay=%s <= %s"
                             % (keeperIndex, openServerDay, openServerDayLimit), playerID)
            return
    keeperDaysList = IpyGameDataPY.GetFuncEvalCfg("MineAreaHousekeeper", 2)
    if keeperIndex < 0 or keeperIndex >= len(keeperDaysList):
        return
    addDays = keeperDaysList[keeperIndex]
    addSeconds = addDays * 24 * 3600
    curTime = int(time.time())
    endTimeStr = GameWorld.ChangeTimeNumToStr(endTime) if endTime else ""
    GameWorld.DebugLog("激活福地管家: keeperIndex=%s,addDays=%s(%s)" % (keeperIndex, addDays, addSeconds), playerID)
    GameWorld.DebugLog("    管家到期时间: endTime=%s, %s" % (endTime, endTimeStr), playerID)
    if not endTime:
        updEndTime = curTime + addSeconds
        GameWorld.DebugLog("    激活管家", playerID)
    elif curTime >= endTime:
        updEndTime = curTime + addSeconds
        GameWorld.DebugLog("    已过期,重新激活管家", playerID)
    else:
        updEndTime = endTime + addSeconds
        GameWorld.DebugLog("    续费管家时长", playerID)
    GameWorld.DebugLog("    更新管家时长: updEndTime=%s, %s" % (updEndTime, GameWorld.ChangeTimeNumToStr(updEndTime)), playerID)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_MineHousekeeperEndTime, updEndTime)
    SyncPlayerMineAreaInfo(curPlayer)
    return
def SyncPlayerMineAreaInfo(curPlayer):
    clientPack = ChPyNetSendPack.tagMCPlayerMineAreaInfo()
    clientPack.WorkerCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MineWorkerCount)
    clientPack.EnergyUsed = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MineWorkerEnergyUsed)
    clientPack.HousekeeperEndTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MineHousekeeperEndTime)
    clientPack.HelpAwardCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MineHelpAwardCount)
    clientPack.RefreshCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MineRefreshCount % 0)
    clientPack.RefreshCountSuper = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MineRefreshCount % 1)
    clientPack.RefreshCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MineRefreshCount % RefreshType_Comm)
    clientPack.RefreshCountSuper = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MineRefreshCount % RefreshType_Super)
    clientPack.RefreshCountRob = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MineRefreshCount % RefreshType_Rob)
    
    treasureState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MineTreasureState)
    treasureAward = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MineTreasureAward)