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