From cc912d58ed06ee42583a997318677bb25148b991 Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期六, 11 一月 2020 21:40:20 +0800 Subject: [PATCH] 8346 【恺英】【后端】协助系统(缥缈讨伐妖魔组队副本进入条件改为验证缥缈事件;奖励改为掉落模式) --- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_KillDevil.py | 126 ++++++++++++++++++++++++++++++++---------- 1 files changed, 96 insertions(+), 30 deletions(-) diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_KillDevil.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_KillDevil.py index 053fdda..781c707 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_KillDevil.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_KillDevil.py @@ -16,12 +16,16 @@ #------------------------------------------------------------------------------- import FBCommon -import EventShell +import NPCCommon +import PyGameData import PlayerAssist -import GameWorldProcess -import NPCCustomRefresh +import IpyGameDataPY import ItemControler +import GameWorldProcess +import PlayerFairyDomain +import NPCCustomRefresh import IPY_GameWorld +import ItemCommon import GameWorld import ChConfig @@ -54,15 +58,13 @@ if curPlayer.GetTeamLV() != IPY_GameWorld.tmlLeader: return True - taskID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_PiaomiaoMaxGradeTaskID) - curMission = curPlayer.FindMission(taskID) - if curMission == None: - GameWorld.DebugLog("没有该副本任务,无法进入!taskID=%s" % taskID) - return False - missionState = curMission.GetMissionState() - if missionState != IPY_GameWorld.msProcessing: - GameWorld.DebugLog("该副本任务非进行中,无法进入!taskID=%s,missionState=%s" % (taskID, missionState)) - return False + ipyData = IpyGameDataPY.GetIpyGameDataByCondition('FairyDomain', {'MapID':mapID, 'LineID':lineID}) + if not ipyData: + return + fdeventID = ipyData.GetID() + if not PlayerFairyDomain.SetFairyDomainEventState(curPlayer, fdeventID, PlayerFairyDomain.FDEventState_Visiting): + GameWorld.DebugLog("设置事件寻访中失败,可能没有该事件! fdeventID=%s" % fdeventID) + return return True @@ -171,15 +173,16 @@ if tick - GameWorld.GetGameFB().GetFBStepTick() < fbCfg[Def_FightTime] * 1000: return - __DoKillDevilOver(False, tick) + __DoKillDevilOver(tick) return ## 副本关闭 def __ProcessCloseFB(tick): mapID = GameWorld.GetMap().GetMapID() fbCfg = FBCommon.GetFBLineStepTime(mapID) + closeTime = ChConfig.Def_FBPickupItemTime + fbCfg[Def_ExitTime] * 1000 # 间隔未到 - if tick - GameWorld.GetGameFB().GetFBStepTick() < fbCfg[Def_ExitTime] * 1000: + if tick - GameWorld.GetGameFB().GetFBStepTick() < closeTime: return GameWorldProcess.CloseFB(tick) @@ -196,21 +199,27 @@ gameFB.SetGameFBDict(FBDict_KillNPCCount % npcID, gameFB.GetGameFBDictByKey(FBDict_KillNPCCount % npcID) + 1) FBCommon.NotifyCopyMapPlayerFBHelp(tick, DoFBHelp, 0) - __DoKillDevilOver(True, tick) + __DoKillDevilOver(tick, curNPC) return -def __DoKillDevilOver(isPass, tick): +def __DoKillDevilOver(tick, curNPC=None): # 战斗超时 gameFB = GameWorld.GetGameFB() if gameFB.GetFBStep() == FB_Step_Over: return FBCommon.SetFBStep(FB_Step_Over, tick) + isPass = curNPC != None + lineID = 0 mapID = FBCommon.GetRecordMapID(GameWorld.GetMap().GetMapID()) + ipyData = IpyGameDataPY.GetIpyGameDataByCondition('FairyDomain', {'MapID':mapID, 'LineID':lineID}) + fdeventID = ipyData.GetID() + GameWorld.DebugLog("副本结算: isPass=%s" % (isPass)) + noAssistPlayerID, assistMoneyType, assistPlayerMoneyDict = PlayerAssist.OnFBAssistOver(isPass, mapID) exitTime = FBCommon.GetFBLineStepTime(mapID)[Def_ExitTime] * 1000 rewardInfo = FBCommon.GetFBLineReward(mapID, 0) - noAssistItemList, assistItemList = ([], []) if not rewardInfo else rewardInfo + assistItemList = [] if not rewardInfo else rewardInfo playerManager = GameWorld.GetMapCopyPlayerManager() playerCount = playerManager.GetPlayerCount() @@ -220,28 +229,85 @@ continue playerID = curPlayer.GetPlayerID() - overDict = {FBCommon.Over_dataMapID:mapID, FBCommon.Over_isPass: int(isPass)} + overDict = {} if isPass and noAssistPlayerID: - itemList = [] if playerID == noAssistPlayerID: - itemList = noAssistItemList - EventShell.EventRespons_FBEvent(curPlayer, "fb_pass_%s" % mapID) - + bossID = curNPC.GetNPCID() + dropPosX, dropPosY = curNPC.GetPosX(), curNPC.GetPosY() + isOnlySelfSee = False + isDropDisperse = True + dropItemMapInfo = [dropPosX, dropPosY, isOnlySelfSee, isDropDisperse] + jsonItemList, totalExp, totalMoney = NPCCommon.GiveKillNPCDropPrize(curPlayer, mapID, {bossID:1}, dropItemMapInfo=dropItemMapInfo) + if not jsonItemList: + # 没有掉落时直接通知结算,防止卡副本 + curPlayer.Sync_TimeTick(IPY_GameWorld.tttLeaveMap, 0, exitTime, True) + FBCommon.NotifyFBOver(curPlayer, mapID, lineID, isPass, overDict) + else: + PlayerFairyDomain.SetFairyDomainEventState(curPlayer, fdeventID, PlayerFairyDomain.FDEventState_Visited) + curPlayer.Sync_TimeTick(ChConfig.tttPickupItem, 0, ChConfig.Def_FBPickupItemTime, True) + continue + elif playerID in assistPlayerMoneyDict: addAssistMoney = assistPlayerMoneyDict[playerID] - itemList = assistItemList - overDict.update({FBCommon.Over_isAssist:1, FBCommon.Over_money:FBCommon.GetJsonMoneyList({assistMoneyType:addAssistMoney})}) - overDict[FBCommon.Over_itemInfo] = FBCommon.GetJsonItemList(itemList) + overDict.update({FBCommon.Over_isAssist:1, FBCommon.Over_itemInfo:FBCommon.GetJsonItemList(assistItemList), + FBCommon.Over_money:FBCommon.GetJsonMoneyList({assistMoneyType:addAssistMoney})}) + ItemControler.GivePlayerItemOrMail(curPlayer, assistItemList) - if itemList: - ItemControler.GivePlayerItemOrMail(curPlayer, itemList) - - GameWorld.DebugLog("overDict=%s" % overDict, playerID) - FBCommon.Notify_FB_Over(curPlayer, overDict) + else: + pass + curPlayer.Sync_TimeTick(IPY_GameWorld.tttLeaveMap, 0, exitTime, True) + FBCommon.NotifyFBOver(curPlayer, mapID, lineID, isPass, overDict) return +def OnPickUpItem(curPlayer, curItem, tick): + mapItemType = curItem.GetType() + if mapItemType == ChConfig.Def_ItemType_Money: + return + playerID = curPlayer.GetID() + isEquip = ItemCommon.CheckItemIsEquip(curItem) + jsonItem = ItemCommon.GetJsonItem(curItem) + if playerID in PyGameData.g_fbPickUpItemDict: + if isEquip: + PyGameData.g_fbPickUpItemDict[playerID].append(jsonItem) + else: + isIn = False + for itemInfo in PyGameData.g_fbPickUpItemDict[playerID]: + if itemInfo["ItemID"] == jsonItem["ItemID"] and itemInfo.get("IsBind") == jsonItem.get("IsBind"): + itemInfo["Count"] = itemInfo.get("Count", 1) + jsonItem.get("Count", 1) + isIn = True + break + if not isIn: + PyGameData.g_fbPickUpItemDict[playerID].append(jsonItem) + else: + PyGameData.g_fbPickUpItemDict[playerID] = [jsonItem] + + playerItemCount = 0 + mapItemManager = GameWorld.GetMapItemManager() + for index in xrange(mapItemManager.GetMapItemCount()): + mapItem = mapItemManager.GetMapItemByIndex(index) + if not mapItem or mapItem.IsEmpty(): + continue + + # 还有属于自己的东西没捡不通知结束 + if mapItem.GetOwnerID() == curPlayer.GetPlayerID(): + playerItemCount += 1 + + isItemAllPickUp = (playerItemCount <= 1) + if not isItemAllPickUp: + return + + isPass = 1 + lineID = 0 + mapID = FBCommon.GetRecordMapID(GameWorld.GetMap().GetMapID()) + leaveTick = FBCommon.GetFBLineStepTime(mapID)[Def_ExitTime] * 1000 + jsonItemList = PyGameData.g_fbPickUpItemDict.get(playerID, []) + curPlayer.Sync_TimeTick(IPY_GameWorld.tttLeaveMap, 0, leaveTick, True) + overDict = {FBCommon.Over_itemInfo:jsonItemList} + FBCommon.NotifyFBOver(curPlayer, mapID, lineID, isPass, overDict) + return + ## 检查是否可攻击, 主判定不可攻击的情况,其他逻辑由外层决定 def CheckCanAttackTagObjInFB(attacker, defender): return GameWorld.GetGameFB().GetFBStep() == FB_Step_Fight -- Gitblit v1.8.0