From 65a4c2029af3f70ce484a2eec167c50f227d7a5c Mon Sep 17 00:00:00 2001 From: xdh <xiefantasy@qq.com> Date: 星期一, 27 五月 2019 14:08:22 +0800 Subject: [PATCH] 6805 【后端】【2.0】副本前端化(封魔坛前期本) --- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFB.py | 181 ++++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 171 insertions(+), 10 deletions(-) diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFB.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFB.py index effb205..751177c 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFB.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFB.py @@ -32,13 +32,22 @@ import FBLogic import ChPyNetSendPack import NetPackCommon +import PlayerSuccess import ItemCommon import IpyGameDataPY import ShareDefine +import GameFuncComm +import FBHelpBattle +import SkillShell +import PyGameData +import NPCCommon import time import math #--------------------------------------------------------------------- +def OnLogin(curPlayer): + NotifyBuyFBBuffInfo(curPlayer) + return ## 玩家副本行为封包 A5 08 # @param playerIndex 玩家索引 @@ -236,12 +245,8 @@ # BYTE Cnt; // 扫荡次数 # BYTE IsFinish; // 是否立即完成; 0-否;1-花钱立即完成;2-客户端自行倒计时间到后发送2代表领取扫荡完成奖励 # DWORD DataEx; //附带信息 +# BYTE IsLittleHelper; // 是否小助手扫荡 #}; -## 玩家副本扫荡 -# @param playerIndex 玩家索引 -# @param clientData 客户端封包 -# @param tick 时间 -# @return None def OnPlayerFBWipeOut(playerIndex, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(playerIndex) @@ -255,13 +260,27 @@ #isFinish = clientData.IsFinish isFinish = 1 # 暂时默认1,之后有需要扫荡等待的再说 dataEx = clientData.DataEx + isLittleHelper = clientData.IsLittleHelper + if isLittleHelper: + if not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_LittleHelper): + GameWorld.DebugLog("玩家没有小助手功能权限!", curPlayer.GetPlayerID()) + return - if FBCommon.GetRecordMapID(GameWorld.GetMap().GetMapID()) == FBCommon.GetRecordMapID(mapID): - GameWorld.DebugLog("玩家在扫荡目标地图中,无法扫荡!mapID=%s" % mapID) + if cnt <= 0: return fbIpyData = FBCommon.GetFBIpyData(mapID) + if FBCommon.GetRecordMapID(GameWorld.GetMap().GetMapID()) == FBCommon.GetRecordMapID(mapID): + if fbIpyData and fbIpyData.GetDayTimes():#没有限制进入次数的不限制在目标地图扫荡 + GameWorld.DebugLog("玩家在扫荡目标地图中,无法扫荡!mapID=%s" % mapID) + return + + fbLineIpyData = FBCommon.GetFBLineIpyData(mapID, lineID) + if not fbLineIpyData: + GameWorld.DebugLog("找不到该副本线路,无法扫荡!mapID=%s, lineID=%s" % (mapID, lineID)) + return + if FBCommon.CheckCanEnterFBComm(curPlayer, mapID, lineID, fbIpyData, fbLineIpyData, cnt) != ShareDefine.EntFBAskRet_OK: return costMoneyList = [] @@ -277,9 +296,9 @@ % (mapID, lineID, curPlayer.GetLV(), sweepLVLimit), curPlayer.GetPlayerID()) return - #扫荡道具判断 + #扫荡道具判断,小助手不消耗扫荡道具 sweepItemID = fbLineIpyData.GetSweepItemID() - if sweepItemID: + if sweepItemID and not isLittleHelper: sweepItemCnt = fbLineIpyData.GetSweepCostCnt() sweepCostCnt = sweepItemCnt * cnt #isEnough, sweepCostindexList = ItemCommon.GetItem_FromPack_ByID(sweepItemID, itemPack, sweepCostCnt) @@ -320,6 +339,8 @@ if not FBLogic.OnPlayerFBSweepAsk(curPlayer, mapID, lineID, cnt, isFinish, dataEx): return + PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_FeastRedPack_FBSweep, 1, [mapID]) + #扣除扫荡道具 if sweepCostindexList and sweepCostCnt: ItemCommon.ReduceItem(curPlayer, itemPack, sweepCostindexList, sweepCostCnt, False, 'FBSweepCostItem') @@ -335,7 +356,12 @@ #增加副本进入次数 if fbIpyData and fbIpyData.GetDayTimes(): FBCommon.AddEnterFBCount(curPlayer, mapID, cnt) - + + helpIpyData = IpyGameDataPY.GetIpyGameData("FBHelpBattle", mapID, lineID) + if helpIpyData: + FBHelpBattle.SendGameServer_SweepCallHelpBattlePlayer(curPlayer, mapID, lineID) + return + #扫荡结果给奖励等 FBLogic.OnPlayerFBSweepResult(curPlayer, mapID, lineID, cnt, isFinish, dataEx) return @@ -427,5 +453,140 @@ FBLogic.OnClientStartFB(curPlayer, tick) return +#// A2 31 前端开始自定义场景 #tagCMClientStartCustomScene +# +#struct tagCMClientStartCustomScene +#{ +# tagHead Head; +# DWORD MapID; +# WORD FuncLineID; +#}; +def OnClientStartCustomScene(index, clientData, tick): + curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) + mapID = clientData.MapID + funcLineID = clientData.FuncLineID + DoEnterCustomScene(curPlayer, mapID, funcLineID, tick) + return +#// A2 33 前端退出自定义场景 #tagCMClientExitCustomScene +# +#struct tagCMClientExitCustomScene +#{ +# tagHead Head; +#}; +def OnClientExitCustomScene(index, clientData, tick): + curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) + DoExitCustomScene(curPlayer) + return +def DoEnterCustomScene(curPlayer, mapID, lineID, tick): + ## 进入自定义场景状态 + + resultPack = ChPyNetSendPack.tagMCStartCustomSceneResult() + resultPack.MapID = mapID + resultPack.FuncLineID = lineID + + #进入副本通用检查 + if mapID: + fbIpyData = FBCommon.GetFBIpyData(mapID) + fbLineIpyData = FBCommon.GetFBLineIpyData(mapID, lineID) + if PlayerControl.CheckMoveToFB(curPlayer, mapID, lineID, fbIpyData, fbLineIpyData, tick) != ShareDefine.EntFBAskRet_OK: + resultPack.Result = 0 + NetPackCommon.SendFakePack(curPlayer, resultPack) + PlayerControl.SetCustomMap(curPlayer, 0, 0) + return + + PlayerControl.SetPlayerSightLevel(curPlayer, curPlayer.GetID()) + + curPlayer.SetDict(ChConfig.Def_PlayerKey_ClientCustomScene, 1) # 由于前端不一定有发mapID,所以这里额外记录这个状态,不能直接用mapID判断 + PlayerControl.SetCustomMap(curPlayer, mapID, lineID) + GameWorld.Log("玩家开始自定义场景!mapID=%s,lineID=%s" % (mapID, lineID), curPlayer.GetPlayerID()) + if mapID: + FBLogic.OnEnterCustomScene(curPlayer, mapID, lineID) + + #通知进入状态 + resultPack.Result = 1 + NetPackCommon.SendFakePack(curPlayer, resultPack) + return + +def DoExitCustomScene(curPlayer): + ## 退出自定义场景状态 + PlayerControl.SetPlayerSightLevel(curPlayer, 0) + mapID = PlayerControl.GetCustomMapID(curPlayer) + lineID = PlayerControl.GetCustomLineID(curPlayer) + curPlayer.SetDict(ChConfig.Def_PlayerKey_ClientCustomScene, 0) + PlayerControl.SetCustomMap(curPlayer, 0, 0) + if mapID and FBCommon.GetCustomMapStep(curPlayer, mapID, lineID) != ChConfig.CustomMapStep_Over: + FBCommon.SetCustomMapStep(curPlayer, mapID, lineID, ChConfig.CustomMapStep_Over) + NPCCommon.ClearPriWoodPile(curPlayer) + GameWorld.Log("玩家退出自定义场景!", curPlayer.GetPlayerID()) + return + +#// B1 0A 副本购买buff #tagCMFBBuyBuff +#struct tagCMFBBuyBuff +#{ +# tagHead Head; +# DWORD MapID; +# WORD MoneyCnt; +#}; +def OnFBBuyBuff(playerIndex, clientData, tick): + curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(playerIndex) + playerID = curPlayer.GetPlayerID() + mapID = clientData.MapID + moneyCnt = clientData.MoneyCnt + ipyData = IpyGameDataPY.GetIpyGameData('FBBuyBuff', mapID, moneyCnt) + if not ipyData: + return + addBuffID = ipyData.GetBuffID() + curSkill = GameWorld.GetGameData().GetSkillBySkillID(addBuffID) + if not curSkill: + return + crossMapID = PlayerControl.GetCrossMapID(curPlayer) + if crossMapID and mapID !=crossMapID: + return + if not crossMapID and mapID != GameWorld.GetMap().GetMapID(): + return + + curTime = int(time.time()) + #判断CD + timeKey = (mapID, moneyCnt) + lastTime = PyGameData.g_fbBuyBuffTimeDict.get(playerID, {}).get(timeKey, 0) + if lastTime and curTime - lastTime < ipyData.GetBuffCD(): + GameWorld.DebugLog('副本购买buff CD未到 ') + return + + #扣钱 + infoDict = {"MapID":mapID, "addBuffID":addBuffID} + if not PlayerControl.PayMoney(curPlayer, IPY_GameWorld.TYPE_Price_Gold_Money, moneyCnt, ChConfig.Def_Cost_FBBuyBuff, infoDict): + return + if playerID not in PyGameData.g_fbBuyBuffTimeDict: + PyGameData.g_fbBuyBuffTimeDict[playerID] = {} + PyGameData.g_fbBuyBuffTimeDict[playerID][timeKey] = curTime + NotifyBuyFBBuffInfo(curPlayer) + if crossMapID: + msgDict = {"PlayerID":curPlayer.GetPlayerID(), "buffID":addBuffID} + GameWorld.SendMsgToCrossServer(ShareDefine.ClientServerMsg_AddBuff, msgDict) + GameWorld.DebugLog("跨服中请求复活, crossMapID=%s,msgDict=%s" % (crossMapID, msgDict), playerID) + return + + SkillShell.__DoLogic_AddBuff(curPlayer, curPlayer, curSkill, False, tick, 0, 0) + #SkillCommon.AddBuffBySkillType(curPlayer, addBuffID, tick) + return + +def NotifyBuyFBBuffInfo(curPlayer): + playerID = curPlayer.GetPlayerID() + buffTimeDict = PyGameData.g_fbBuyBuffTimeDict.get(playerID, {}) + if not buffTimeDict: + return + packData = ChPyNetSendPack.tagMCFBBuyBuffInfo() + packData.InfoList = [] + for timeKey, buyTime in buffTimeDict.items(): + mapID, moneyCnt = timeKey + timeInfo = ChPyNetSendPack.tagMCFBBuyBuffTime() + timeInfo.MapID = mapID + timeInfo.MoneyCnt = moneyCnt + timeInfo.BuyTime = buyTime + packData.InfoList.append(timeInfo) + packData.Cnt = len(packData.InfoList) + NetPackCommon.SendFakePack(curPlayer, packData) + return -- Gitblit v1.8.0