From 58f628394a10840d21b06bb6a165756a064d9714 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期四, 06 二月 2025 17:03:10 +0800
Subject: [PATCH] 10385 【越南】【英语】【BT】【砍树】福地新增鼠管及优化-服务端

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerMineArea.py |  139 +++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 118 insertions(+), 21 deletions(-)

diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerMineArea.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerMineArea.py
index a2fc6a3..066946b 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerMineArea.py
+++ b/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)

--
Gitblit v1.8.0