From 09e53ea10631c31e091c2947fc05c56ffe954ba6 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期二, 02 七月 2019 16:55:52 +0800
Subject: [PATCH] Merge branch 'master' of http://192.168.0.87:10010/r/SnxxServerCode

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_CrossDemonKing.py |  166 ++++++++++++++++++++++++++++++++++---------------------
 1 files changed, 102 insertions(+), 64 deletions(-)

diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_CrossDemonKing.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_CrossDemonKing.py
index 996232d..2f6c81b 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_CrossDemonKing.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_CrossDemonKing.py
@@ -25,48 +25,45 @@
 import PlayerControl
 import ShareDefine
 import PyGameData
+import NPCCommon
 import ChConfig
 import ChItem
 
 FBDict_IsOver = 'FBDict_IsOver' #是否已结算, 结算时的tick
+FBDict_IsPlayerOver = 'IsPlayerOver_%s' #玩家是否已经结算掉落的,参数playerID
 
 g_ownerInfo = {} # 归属者信息 {funcLineID:[ownerID, ownerName], }
 
-def __SetDemonKingVisitState(curPlayer, mapID, lineID, state):
-    ipyData = IpyGameDataPY.GetIpyGameDataByCondition("FairyDomain", {"MapID":mapID, "LineID":lineID})
-    if not ipyData:
-        return False
-    eventID = ipyData.GetID()
-    if not PlayerFairyDomain.SetFairyDomainEventState(curPlayer, eventID, state):
-        return False
-    return True
+## 是否需要做进入副本通用检查条件逻辑,默认需要检查
+def OnNeedCheckCanEnterFBComm(curPlayer, mapID, lineID):
+    curState = PlayerFairyDomain.GetFairyDomainFBEventState(curPlayer, mapID, lineID)
+    return curState != PlayerFairyDomain.FDEventState_Visiting
 
 ## 是否能够通过活动查询进入
 def OnEnterFBEvent(curPlayer, mapID, lineID, tick):
-    if not __SetDemonKingVisitState(curPlayer, mapID, lineID, PlayerFairyDomain.FDEventState_Visiting):
-        return False
-    return True
+    curState = PlayerFairyDomain.GetFairyDomainFBEventState(curPlayer, mapID, lineID)
+    return curState in [PlayerFairyDomain.FDEventState_CanVisit, PlayerFairyDomain.FDEventState_Visiting]
 
-## 查询是否可以进入地图
-def OnChangeMapAsk(ask, tick):
-    return IPY_GameWorld.cmeAccept
+## 进入跨服副本注册数据前逻辑
+## @return: 是否可以注册前往跨服副本,次函数中可以写一些扣除消耗逻辑等
+def OnRegEnterCrossFB(curPlayer, mapID, lineID):
+    curState = PlayerFairyDomain.GetFairyDomainFBEventState(curPlayer, mapID, lineID)
+    if curState == PlayerFairyDomain.FDEventState_CanVisit:
+        return PlayerFairyDomain.SetFairyDomainFBEventState(curPlayer, mapID, lineID, PlayerFairyDomain.FDEventState_Visiting)
+    
+    if curState == PlayerFairyDomain.FDEventState_Visiting:
+        return True
+    
+    return False
 
-## 开启副本
-def OnOpenFB(tick):
-    return
-
-## 副本玩家进入点
-# @return posX, posY, 随机半径(可选)
-def OnGetFBEnterPos(curPlayer, mapID, lineId, ipyEnterPosInfo, tick):
-    return ipyEnterPosInfo
-
-def GetCurFBLineBOSSID(lineID=-1):
+def GetCurFBLineBOSSID(mapID=-1, lineID=-1):
     #该分线刷的BOSSID
+    if mapID == -1:
+        mapID = ChConfig.Def_FBMapID_CrossDemonKing if GameWorld.IsCrossServer() else ChConfig.Def_FBMapID_DemonKing
     if lineID == -1:
         lineID = GetCurFBFuncLineID()
-    if lineID == -1:
+    if mapID == -1 or lineID == -1:
         return 0
-    mapID = ChConfig.Def_FBMapID_CrossDemonKing if GameWorld.IsCrossServer() else ChConfig.Def_FBMapID_DemonKing
     ipyData = IpyGameDataPY.GetIpyGameDataByCondition("FairyDomain", {"MapID":mapID, "LineID":lineID})
     if not ipyData:
         return 0
@@ -76,13 +73,13 @@
 def GetCurFBFuncLineID():
     ## 获取本线路功能线路ID
     if GameWorld.IsCrossServer():
-        return GameWorld.GetGameWorld().GetPropertyID() % 1000
+        return FBCommon.GetCrossDynamicLineMapFuncLineID()
     return GameWorld.GetGameWorld().GetPropertyID() - 1
 
 def GetCurFBLineZoneID():
     ## 获取本线路所属跨服分区
     if GameWorld.IsCrossServer():
-        return GameWorld.GetGameWorld().GetPropertyID() / 1000
+        return FBCommon.GetCrossDynamicLineMapZoneID()
     return 0
 
 ## 进副本
@@ -90,10 +87,16 @@
     playerID = curPlayer.GetPlayerID()
     zoneID = GetCurFBLineZoneID()
     funcLineID = GetCurFBFuncLineID()
-    bossID = GetCurFBLineBOSSID(funcLineID)
-    visitCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FairyDomainVisitCnt)
-    GameWorld.Log("DoEnterFB zoneID=%s,funcLineID=%s,bossID=%s,visitCount=%s" % (zoneID, funcLineID, bossID, visitCount), playerID)
+    bossID = GetCurFBLineBOSSID(lineID=funcLineID)
+    GameWorld.Log("DoEnterFB zoneID=%s,funcLineID=%s,bossID=%s" % (zoneID, funcLineID, bossID), playerID)
     PyGameData.g_fbPickUpItemDict.pop(playerID, 0)
+    if not GameWorld.IsCrossServer():
+        PlayerFairyDomain.SetFairyDomainFBEventState(curPlayer, ChConfig.Def_FBMapID_DemonKing, funcLineID, PlayerFairyDomain.FDEventState_Visiting)
+        
+    gameFB = GameWorld.GetGameFB()
+    ## 副本已经结束,但是没有结算掉落的玩家直接通知结束
+    if gameFB.GetGameFBDictByKey(FBDict_IsOver) and not gameFB.GetGameFBDictByKey(FBDict_IsPlayerOver % playerID):
+        __NotifyFBOver(curPlayer, 0)
     return
 
 ## 副本总逻辑计时器
@@ -109,6 +112,7 @@
 
 ## 关闭副本
 def OnCloseFB(tick):
+    global g_ownerInfo
     funcLineID = GetCurFBFuncLineID()
     g_ownerInfo.pop(funcLineID, None)
     GameWorld.GetGameWorld().SetPropertyID(0)
@@ -152,9 +156,11 @@
 
 ## 执行副本杀怪逻辑
 def __FBNPCOnKilled(curNPC, tick):
+    global g_ownerInfo
+    
     bossID = curNPC.GetNPCID()
     funcLineID = GetCurFBFuncLineID()
-    if bossID != GetCurFBLineBOSSID(funcLineID):
+    if bossID != GetCurFBLineBOSSID(lineID=funcLineID):
         return
     
     zoneID = GetCurFBLineZoneID()
@@ -182,15 +188,16 @@
         if not curPlayer:
             continue
         playerID = curPlayer.GetPlayerID()
+        gameFB.SetGameFBDict(FBDict_IsPlayerOver % playerID, 1)
         isOwner = playerID == ownerID
         if isOwner:
             ownerName = curPlayer.GetPlayerName()
         giveItemList = __GetDemonKingPrizeItemList(curPlayer, mapID, funcLineID, eventID, isOwner)
         GameWorld.Log("玩家奖励: %s" % giveItemList, playerID)
-        ChItem.DropItem(curPlayer, giveItemList, bossID, dropPosX, dropPosY, isOnlySelfSee=True, isDropDisperse=True)
+        ChItem.DoMapDropItem(curPlayer, giveItemList, bossID, dropPosX, dropPosY, isOnlySelfSee=True, isDropDisperse=True)
         #curPlayer.Sync_TimeTick(ChConfig.tttPickupItem, 0, ChConfig.Def_FBPickupItemTime, True)
         if not isCrossServer:
-            __SetDemonKingVisitState(curPlayer, mapID, funcLineID, PlayerFairyDomain.FDEventState_Visited)
+            PlayerFairyDomain.SetFairyDomainFBEventState(curPlayer, mapID, funcLineID, PlayerFairyDomain.FDEventState_Visited)
         else:
             serverGroupID = PlayerControl.GetPlayerServerGroupID(curPlayer)
             if serverGroupID not in serverGroupIDList:
@@ -206,7 +213,7 @@
 
 ## 结束跨服副本
 def OnEndCrossFB(curPlayer, mapID, lineID, exData):
-    __SetDemonKingVisitState(curPlayer, mapID, lineID, PlayerFairyDomain.FDEventState_Visited)
+    PlayerFairyDomain.SetFairyDomainFBEventState(curPlayer, mapID, lineID, PlayerFairyDomain.FDEventState_Visited)
     return
 
 def OnPickUpItem(curPlayer, curItem, tick):
@@ -246,11 +253,16 @@
     if not isItemAllPickUp:
         return
     
-    isPass = 1
+    __NotifyFBOver(curPlayer, 1)
+    return
+
+def __NotifyFBOver(curPlayer, isPass):
+    global g_ownerInfo
+    playerID = curPlayer.GetPlayerID()
     mapID = ChConfig.Def_FBMapID_CrossDemonKing if GameWorld.IsCrossServer() else ChConfig.Def_FBMapID_DemonKing
     funcLineID = GetCurFBFuncLineID()
     leaveTick = FBCommon.GetFBLineStepTime(mapID, funcLineID) * 1000
-    ownerID, ownerName = g_ownerInfo.pop(funcLineID, [0, ""])
+    ownerID, ownerName = g_ownerInfo.get(funcLineID, [0, ""])
     jsonItemList = PyGameData.g_fbPickUpItemDict.pop(playerID, [])
     overDict = {FBCommon.Over_ownerID:ownerID, FBCommon.Over_ownerName:ownerName, FBCommon.Over_itemInfo:jsonItemList}
     FBCommon.NotifyFBOver(curPlayer, mapID, funcLineID, isPass, overDict)
@@ -259,30 +271,44 @@
 
 ## 客户端进入自定义场景
 def OnEnterCustomScene(curPlayer, mapID, lineID):
-    __SetDemonKingVisitState(curPlayer, mapID, lineID, PlayerFairyDomain.FDEventState_Visiting)
+    PlayerFairyDomain.SetFairyDomainFBEventState(curPlayer, mapID, lineID, PlayerFairyDomain.FDEventState_Visiting)
     return
 
-## 客户端发送刷新自定义副本奖励
-def OnRefreshCustomFBPrize(curPlayer, mapID, lineID):
-    visitCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FairyDomainVisitCnt)
-    fakeImmortalCount = IpyGameDataPY.GetFuncCfg("FakeImmortalCount", 1)
-    if visitCount > fakeImmortalCount:
-        GameWorld.DebugLog("当前寻访次数不能获取自定义副本奖励!visitCount=%s" % visitCount)
-        return []
-    if not __SetDemonKingVisitState(curPlayer, mapID, lineID, PlayerFairyDomain.FDEventState_Visiting):
-        GameWorld.DebugLog("寻访状态异常不能获取自定义副本奖励!")
-        return []
-    ipyData = IpyGameDataPY.GetIpyGameDataByCondition("FairyDomain", {"MapID":mapID, "LineID":lineID})
+## 自定义场景副本击杀NPC
+def DoCustomScene_Player_KillNPC(curPlayer, curNPC, mapID, lineID):
+    
+    bossID = curNPC.GetNPCID()
+    funcLineID = lineID
+    curBossID = GetCurFBLineBOSSID(lineID=funcLineID)
+    curState = PlayerFairyDomain.GetFairyDomainFBEventState(curPlayer, mapID, lineID)
+    GameWorld.DebugLog("自定义场景击杀NPC: mapID=%s,lineID=%s,bossID=%s,curBossID=%s,eventState=%s" 
+                       % (mapID, lineID, bossID, curBossID, curState))
+    if bossID != curBossID:
+        return
+    
+    playerID = curPlayer.GetPlayerID()
+    ipyData = IpyGameDataPY.GetIpyGameDataByCondition("FairyDomain", {"MapID":mapID, "LineID":funcLineID})
     if not ipyData:
-        return []
+        return
     eventID = ipyData.GetID()
+    eventFBType = ipyData.GetEventFBType()
+    if eventFBType != PlayerFairyDomain.FDEventFBType_Client:
+        GameWorld.DebugLog("    非前端本,不能掉落!", playerID)
+        return
+    if curState != PlayerFairyDomain.FDEventState_Visiting:
+        GameWorld.DebugLog("    非寻访中,不能掉落!", playerID)
+        return
+    PlayerFairyDomain.SetFairyDomainFBEventState(curPlayer, mapID, funcLineID, PlayerFairyDomain.FDEventState_Visited)
+    PlayerControl.SetCustomMap(curPlayer, 0, 0)
+    
     isOwner = True
-    giveItemList = __GetDemonKingPrizeItemList(curPlayer, mapID, lineID, eventID, isOwner)
-    return giveItemList
-
-## 给自定义副本奖励后续处理
-def OnGiveCustomFBPrizeOK(curPlayer, mapID, lineID):
-    __SetDemonKingVisitState(curPlayer, mapID, lineID, PlayerFairyDomain.FDEventState_Visited)
+    giveItemList = __GetDemonKingPrizeItemList(curPlayer, mapID, funcLineID, eventID, isOwner)
+    NPCCommon.DoGiveItemByVirtualDrop(curPlayer, giveItemList, bossID)
+    
+    isPass = 1
+    overDict = {FBCommon.Over_ownerID:playerID, FBCommon.Over_ownerName:curPlayer.GetPlayerName(), 
+                FBCommon.Over_itemInfo:FBCommon.GetJsonItemList(giveItemList)}
+    FBCommon.NotifyFBOver(curPlayer, mapID, lineID, isPass, overDict)
     return
 
 def __GetDemonKingPrizeItemList(curPlayer, mapID, lineID, eventID, isOwner):
@@ -291,19 +317,31 @@
         return giveItemList
     
     # 没有定制奖励则取常规奖励
-    # {物品ID:[归属者获得个数饼图[[概率, 个数], ...], 非归属者获得个数饼图[[概率, 个数], ...], 是否拍品], ...}
+    # [[归属者随机次数, 非归属随机次数, [[权重,[物品ID,个数,是否拍品]], ...]], ...]
+    
     giveItemList = []
-    awardDict = FBCommon.GetFBLineReward(mapID, lineID)
-    for itemID, itemInfo in awardDict.items():
-        ownerCountRateList, notOwnerCountRateList, isAuctionItem = itemInfo
+    awardList = FBCommon.GetFBLineReward(mapID, lineID)
+    for awardInfo in awardList:
+        ownerCount, otherCount, itemWeightList = awardInfo
         if isOwner:
-            itemCount = GameWorld.GetResultByRandomList(ownerCountRateList)
+            if not ownerCount:
+                continue
+            randCount = ownerCount
         else:
-            itemCount = GameWorld.GetResultByRandomList(notOwnerCountRateList)
-        if not itemCount:
+            if not otherCount:
+                continue
+            randCount = otherCount
+        realWeightList = ItemCommon.GetWeightItemListByAlchemyDiffLV(curPlayer, itemWeightList, 1)
+        if not realWeightList:
             continue
-        giveItemList.append([itemID, itemCount, isAuctionItem])
         
+        for _ in xrange(randCount):
+            itemInfo = GameWorld.GetResultByWeightList(realWeightList)
+            itemID, itemCount, isAuctionItem = itemInfo
+            if not itemID:
+                continue
+            giveItemList.append([itemID, itemCount, isAuctionItem])
+            
     return giveItemList
 
 

--
Gitblit v1.8.0