From 84f9abc7067dde4e6b504a1ba2e9f0600a6de46b Mon Sep 17 00:00:00 2001
From: hch <305670599@qq.com>
Date: 星期二, 12 三月 2019 20:58:56 +0800
Subject: [PATCH] 4042 【后端】【2.0】邮件包含附件时不能删除邮件 -  服务端添加防范

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py |   70 +++++++++++++++++++++++------------
 1 files changed, 46 insertions(+), 24 deletions(-)

diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py
index f388d6c..db1f752 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py
@@ -52,7 +52,9 @@
 import PlayerMagicWeapon
 import PlayerBossReborn
 import PlayerFairyCeremony
+import PlayerNewFairyCeremony
 import PlayerWeekParty
+import PlayerActLogin
 import FamilyRobBoss
 import IpyGameDataPY
 import PlayerState
@@ -493,7 +495,7 @@
         
         if ItemCommon.GetIsEquip(itemData):
             for _ in xrange(itemCount):
-                curItem = ItemControler.GetOutPutItemObj(itemID, isBind=isBind)
+                curItem = ItemControler.GetOutPutItemObj(itemID)
                 if curItem:
                     needSpace += 1
                     prizeItemList.append(curItem)
@@ -508,7 +510,19 @@
         
     ## 直接掉地板上
     if dropItemMapInfo:
-        dropPosX, dropPosY, isOnlySelfSee = dropItemMapInfo
+        dropPosX, dropPosY, isOnlySelfSee = dropItemMapInfo[:3]
+        isDropDisperse = dropItemMapInfo[3] if len(dropItemMapInfo) > 3 else False # 堆叠的物品是否散开掉落
+        if isDropDisperse:
+            dropItemList = []
+            for itemInfo in prizeItemList:
+                if isinstance(itemInfo, list):
+                    itemID, itemCount, isBind = itemInfo
+                    for _ in xrange(itemCount):
+                        dropItemList.append([itemID, 1, isBind])
+                else:
+                    dropItemList.append(itemInfo)
+        else:
+            dropItemList = prizeItemList
         index = 0
         playerID = curPlayer.GetPlayerID()
         gameMap = GameWorld.GetMap()
@@ -520,14 +534,14 @@
                 #玩家不可移动这个点
                 continue
             
-            if index > len(prizeItemList) - 1:
+            if index > len(dropItemList) - 1:
                 break
             
-            curItem = prizeItemList[index]
+            curItem = dropItemList[index]
             index += 1
             if isinstance(curItem, list):
                 itemID, itemCount, isBind = curItem
-                curItem = ItemControler.GetOutPutItemObj(itemID, itemCount, isBind)
+                curItem = ItemControler.GetOutPutItemObj(itemID, itemCount, False)
                 
             if not curItem:
                 continue
@@ -555,7 +569,7 @@
         for prizeItem in prizeItemList:
             if isinstance(prizeItem, list):
                 itemID, itemCount, isBind = prizeItem
-                ItemControler.GivePlayerItem(curPlayer, itemID, itemCount, isBind, [IPY_GameWorld.rptItem], 
+                ItemControler.GivePlayerItem(curPlayer, itemID, itemCount, 0, [IPY_GameWorld.rptItem], 
                                              event=event)
             else:
                 ItemControler.DoLogic_PutItemInPack(curPlayer, prizeItem, event=event)
@@ -2113,8 +2127,8 @@
     GameWorld.DebugLog("Boss状态变更: bossID=%s,isAlive=%s,dataMapID=%s,realMapID=%s,copyMapID=%s" 
                        % (bossID, isAlive, dataMapID, realMapID, copyMapID))
     if not isAlive:
-        if dataMapID in ChConfig.Def_CrossZoneTableName:
-            tableName = ChConfig.Def_CrossZoneTableName[dataMapID]
+        if dataMapID in ChConfig.Def_CrossZoneMapTableName:
+            tableName = ChConfig.Def_CrossZoneMapTableName[dataMapID]
             realMapID = GameWorld.GetGameWorld().GetRealMapID()
             copyMapID = GameWorld.GetGameWorld().GetCopyMapID()
             zoneIpyData = IpyGameDataPY.GetIpyGameData(tableName, realMapID, dataMapID, copyMapID)
@@ -2140,6 +2154,7 @@
         dataDict = {"objID":npcID, "bossID":npcID, "touchCnt":newCnt,
                     "AccID":curPlayer.GetAccID(), "PlayerID":curPlayer.GetPlayerID()}
         DataRecordPack.SendEventPack("AddKillBossCnt", dataDict, curPlayer)
+        PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_FeastRedPack_KillBoss, 1, [limitIndex])
         
     if isCrossServer:
         return
@@ -2151,7 +2166,9 @@
         PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_WorldBOSS)
         PlayerBossReborn.AddBossRebornActionCnt(curPlayer, ChConfig.Def_BRAct_WorldBOSS, 1)
         PlayerFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_WorldBoss, 1)
+        PlayerNewFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_WorldBoss, 1)
         PlayerWeekParty.AddWeekPartyActionCnt(curPlayer, ChConfig.Def_WPAct_WorldBOSS, 1)
+        PlayerActLogin.AddLoginAwardActionCnt(curPlayer, ChConfig.Def_LoginAct_WorldBOSS, 1)
         
     if mapID == ChConfig.Def_FBMapID_BossHome:
         #BOSS之家
@@ -2161,6 +2178,7 @@
         PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_BOSSHome)
         PlayerBossReborn.AddBossRebornActionCnt(curPlayer, ChConfig.Def_BRAct_BOSSHome, 1)
         PlayerFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_BossHome, 1)
+        PlayerNewFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_BossHome, 1)
         PlayerWeekParty.AddWeekPartyActionCnt(curPlayer, ChConfig.Def_WPAct_BOSSHome, 1)
     return
     
@@ -3013,6 +3031,10 @@
         #    GameWorld.DebugLog("伤血玩家血量为0,清除该伤血!playerID=%s" % hurtID)
         #    return True
         
+        if hurtPlayer.GetInitOK() and not hurtPlayer.GetVisible():
+            GameWorld.DebugLog("伤血玩家不可见,清除该伤血!playerID=%s" % hurtID)
+            return True
+        
         if not self.GetIsInRefreshPoint(hurtPlayer.GetPosX(), hurtPlayer.GetPosY(), refreshPoint):
             GameWorld.DebugLog("伤血玩家不在boss范围里,清除该伤血!playerID=%s" % hurtID)
             return True
@@ -3046,6 +3068,10 @@
                     #GameWorld.DebugLog("队员不在本线路,不计!playerID=%s" % playerID)
                     continue
                 
+                if curTeamPlayer.GetInitOK() and not curTeamPlayer.GetVisible():
+                    #GameWorld.DebugLog("队员不可见,不计!playerID=%s" % playerID)
+                    continue
+                
                 if curTeamPlayer.GetHP() <= 0 or curTeamPlayer.GetPlayerAction() == IPY_GameWorld.paDie:
                     deadTime = curTeamPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_DeadTime)
                     if time.time() - deadTime >= IpyGameDataPY.GetFuncCfg("BossHurtValue", 1):
@@ -3063,7 +3089,7 @@
                     teamHurtPlayerIDList.append(playerID)
                     
         if not teamHurtPlayerIDList:
-            GameWorld.DebugLog("伤血队伍没有活着的队员在boss区域内,清除该伤血!teamID=%s,mapTeamPlayerIDList=%s" % (teamID, mapTeamPlayerIDList))
+            GameWorld.DebugLog("伤血队伍没有符合条件的队员在boss区域内,清除该伤血!teamID=%s,mapTeamPlayerIDList=%s" % (teamID, mapTeamPlayerIDList))
         return teamHurtPlayerIDList
     
     def RefreshHurtList(self, tick, refreshInterval=3000):
@@ -4167,7 +4193,7 @@
             index += 1
             itemCnt = moneyValue if itemID == moneyID else 1
             isBind = dropItemBindDict.get(itemID, 1)
-            curItem = self.__CreateDropItem(curNPC, itemID, itemCnt, isBind)
+            curItem = self.__CreateDropItem(curNPC, itemID, itemCnt, isBind, dropPlayer)
             if not curItem:
                 continue
             self.__MapCreateItem(curItem, resultX, resultY, ChConfig.Def_NPCHurtTypePlayer, ownerID)
@@ -4255,7 +4281,7 @@
                 itemCnt = moneyValue if itemID == moneyID else 1
                 isBind = dropIDBindDict.get(itemID, 1)
             
-            curItem = self.__CreateDropItem(curNPC, itemID, itemCnt, isBind)
+            curItem = self.__CreateDropItem(curNPC, itemID, itemCnt, isBind, dropPlayer)
             if not curItem:
                 continue
             
@@ -4270,8 +4296,7 @@
                 curItem.SetUserAttr(ShareDefine.Def_IudetSource, ShareDefine.Item_Source_VirtualItemDrop)
                 dropItemDataStr = ChItem.GetMapDropItemDataStr(curItem)
                 #可以放入背包
-                if ItemControler.DoLogic_PutItemInPack(ownerPlayer, curItem, True, True,
-                                                       event=["NPCDrop", False, {"npcID":npcID}]):
+                if ItemControler.DoLogic_PutItemInPack(ownerPlayer, curItem, event=["NPCDrop", False, {"npcID":npcID}]):
                     #通知客户端
                     self.SendVirtualItemDrop(ownerPlayer, itemID, resultX, resultY, dropItemDataStr)
                     
@@ -5023,6 +5048,7 @@
         else:
             if curNPC.GetLV()>=curPlayer.GetLV() - IpyGameDataPY.GetFuncCfg('DailyQuestKillMonster'):
                 PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_KillNPC)
+            PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_FeastRedPack_KillSpecificNPC, 1, [npcID])
             
         if ChConfig.IsGameBoss(curNPC):
             OnPlayerKillBoss(curPlayer, npcID, mapID, False)
@@ -5163,7 +5189,7 @@
         #===========================================================================================
         
         # 在地上添加物品(统一接口)
-        dropNPCID = 0 if not curNPC.GetIsBoss() else curNPCID
+        dropNPCID = 0 if not ChConfig.IsGameBoss(curNPC) else curNPCID
         specOwnerIDList = self.__AllKillerDict.keys() if (len(self.__AllKillerDict) > 1 or dropType == ChConfig.Def_NPCHurtTypeSpecial) else []
         curMapItem = ChItem.AddMapDropItem(posX, posY, curItem, ownerInfo=[dropType, ownerID, specOwnerIDList], dropNPCID=dropNPCID)
         
@@ -5178,18 +5204,14 @@
         #self.__SetItemProtect(curMapItem, dropType, ownerID)
         return
     
-    def __CreateDropItem(self, curNPC, itemID, count, isBind):
+    def __CreateDropItem(self, curNPC, itemID, count, isBind, dropPlayer):
         ## 创建掉落的物品
-        curItem = ItemControler.GetOutPutItemObj(itemID)
+        if not isBind and not IpyGameDataPY.GetIpyGameDataNotLog("AuctionItem", itemID):
+            isBind = 1
+        isAuctionItem = not isBind
+        curItem = ItemControler.GetOutPutItemObj(itemID, count, isAuctionItem, curPlayer=dropPlayer)
         if not curItem:
             return
-        
-        curMapID = GameWorld.GetMap().GetMapID()
-        curMapID = FBCommon.GetRecordMapID(curMapID)
-        
-        # 掉落数量
-        curItem.SetCount(count)
-        curItem.SetIsBind(isBind)
         return curItem
     
 #---------------------------------------------------------------------
@@ -5435,7 +5457,7 @@
     giveItemList = collectNPCIpyData.GetCollectAward()
     if giveItemList:
         itemID, itemCount, isBind = giveItemList
-        ItemControler.GivePlayerItem(curPlayer, itemID, itemCount, isBind, [IPY_GameWorld.rptItem])
+        ItemControler.GivePlayerItem(curPlayer, itemID, itemCount, 0, [IPY_GameWorld.rptItem])
         
     #采集成就
     PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_Collect, collectCnt, [npcID])

--
Gitblit v1.8.0