From b961d09f3d47773bc0ae6faaeda880ef4791419f Mon Sep 17 00:00:00 2001
From: xdh <xiefantasy@qq.com>
Date: 星期二, 12 三月 2019 09:53:37 +0800
Subject: [PATCH] 6307 【后端】【2.0】多套装备开发单(强化配置修改)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ChItem.py |  180 ++++++++++++++++++++++++++++++++++++++++++------------------
 1 files changed, 126 insertions(+), 54 deletions(-)

diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ChItem.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ChItem.py
index a17cfa3..8288db0 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ChItem.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ChItem.py
@@ -149,37 +149,37 @@
 #  @remarks 函数详细说明.
 def __DoPickup(curPlayer, mapItemID, tick, isGuard):
     
+    playerID = curPlayer.GetPlayerID()
+    mapItemManager = GameWorld.GetMapItemManager()
+    mapItem = mapItemManager.GetItemByID(mapItemID)
+    if mapItem == None or mapItem.IsEmpty():
+        GameWorld.Log("当前物品不存在或已经被回收,玩家拾取失败,mapItemID=%s" % mapItemID, playerID)
+        return
+    dropItemNPCID = GetMapItemUserDataValue(mapItem, ShareDefine.Def_MapItemInfo_NPCID)
+    
     #镖车中,无法拾取
     if not isGuard and curPlayer.GetPlayerVehicle() == IPY_GameWorld.pvTruck:
         PlayerControl.NotifyCode(curPlayer, "Old_hgg_21675")
-        #GameWorld.Log("使用交通工具时,无法拾取物品")
+        GameWorld.Log("使用交通工具时,无法拾取物品!mapItemID=%s,dropItemNPCID=%s" % (mapItemID, dropItemNPCID), playerID)
         return
     
     if curPlayer.GetHP() == 0:
         #玩家已经死亡
-        #GameWorld.Log("当前玩家已经死亡")
+        GameWorld.Log("玩家已死亡,无法拾取物品!mapItemID=%s,dropItemNPCID=%s" % (mapItemID, dropItemNPCID), playerID)
         return
     
-    mapItemManager = GameWorld.GetMapItemManager()
-    mapItem = mapItemManager.GetItemByID(mapItemID)
-
-    if mapItem == None or mapItem.IsEmpty():
-        GameWorld.Log("当前物品已经被回收,玩家拾取失败,mapItemID=%s" % mapItemID, curPlayer.GetPlayerID())
-        return
-
-    pickDist = GameWorld.GetDist(curPlayer.GetPosX(), curPlayer.GetPosY(), 
-                                    mapItem.GetPosX(), mapItem.GetPosY())
-    
+    posX, posY, itemPosX, itemPosY = curPlayer.GetPosX(), curPlayer.GetPosY(), mapItem.GetPosX(), mapItem.GetPosY()
+    pickDist = GameWorld.GetDist(posX, posY, itemPosX, itemPosY)
     # 守护拾取不验证拾取范围
     if not isGuard and pickDist > curPlayer.GetPickupDist():
         #距离过远, 不能捡起
         PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_805889")
-#        GameWorld.Log("当前距离过远, 玩家(%d,%d)-物品(%d,%d)"%(curPlayer.GetPosX(), curPlayer.GetPosY(),
-#                                                                                 mapItem.GetPosX(), mapItem.GetPosY()))
+        GameWorld.Log("当前距离过远, mapItemID=%s,dropItemNPCID=%s,玩家(%d,%d)-物品(%d,%d),pickDist=%s > playerPickupDist=%s" 
+                      % (mapItemID, dropItemNPCID, posX, posY, itemPosX, itemPosY, pickDist, curPlayer.GetPickupDist()), playerID)
         return
     
     #拾取判断
-    if not __CheckPickUpItemTime(curPlayer , mapItem , tick):
+    if not __CheckPickUpItemTime(curPlayer, mapItem, tick, mapItemID, dropItemNPCID):
         PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_913598")
         return
     
@@ -213,7 +213,7 @@
         singItem.Clear()
     #===============================================================================================
     # # (跨服掉落功勋物品, 不给实际物品,转化为功勋值)
-    # elif curEffID == ChConfig.Def_Effect_ItemGiveGongXun and GameWorld.IsMergeServer():
+    # elif curEffID == ChConfig.Def_Effect_ItemGiveGongXun and GameWorld.IsCrossServer():
     #    #=======================================================================
     #    # # 不需要队伍提示
     #    # if not isTeamNotify:
@@ -237,34 +237,39 @@
         #    # 队伍拾取装备时,先保存物品的xml属性,用于提示的xml显示
         #    itemMsgList = ItemCommon.GetItemXMLMsg(singItem)
         #=======================================================================
-            
+        
         curItemCount = singItem.GetCount()
         curItemID = singItem.GetItemTypeID()
         curItemIsBind = singItem.GetIsBind()
         
         isPutInTemp = curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_PickupItemPutInTemp)
         packIndex = ShareDefine.rptTempItem if isPutInTemp else IPY_GameWorld.rptItem
+        packIndex = ChConfig.GetItemPackType(singItem.GetType(), packIndex)
         
         # 是否可放入
         if not itemControl.CanPutInItem(packIndex, curItemID, curItemCount, curItemIsBind):
             PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_676165", [packIndex])
+            GameWorld.Log("拾取物品无法放入背包!mapItemID=%s,dropItemNPCID=%s,curItemID=%s,packIndex=%s" 
+                          % (mapItemID, dropItemNPCID, curItemID, packIndex), curPlayer.GetPlayerID())
             return
     
         # 副本拾取物品
         FBLogic.OnFBPickUpItem(curPlayer, singItem, tick)
         
-        dropItemNPCID = GetMapItemUserDataValue(mapItem, ShareDefine.Def_MapItemInfo_NPCID)
         equipInfo = [singItem.GetEquipPlace(), ItemCommon.GetItemClassLV(singItem), singItem.GetItemColor(), 
                      singItem.GetItemQuality(), singItem.GetUserData()]
         if not itemControl.PutInItem(packIndex, singItem, event=[ChConfig.ItemGive_Pickup, False, {"NPCID":dropItemNPCID}]):
             #物品不能放入
             #PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_676165", [packIndex])
+            GameWorld.ErrLog("拾取物品放入背包失败!mapItemID=%s,dropItemNPCID=%s,curItemID=%s,packIndex=%s" 
+                             % (mapItemID, dropItemNPCID, curItemID, packIndex), curPlayer.GetPlayerID())
             return
 
         if dropItemNPCID:
+            serverGroupID = PlayerControl.GetPlayerServerGroupID(curPlayer)
             mapID = GameWorld.GetGameWorld().GetMapID()
             NPCCommon.SendGameServerGoodItemRecord(mapID, dropItemNPCID, curPlayer.GetName(), 
-                                                   curPlayer.GetPlayerID(), curItemID, equipInfo)
+                                                   curPlayer.GetPlayerID(), curItemID, equipInfo, serverGroupID)
             
         # 不需要队伍提示
         #=======================================================================
@@ -340,7 +345,7 @@
         mapID = curPlayer.GetMapID()
         fbIpyData = FBCommon.GetFBIpyData(mapID)
         if fbIpyData and not fbIpyData.GetGuardPick():
-            GameWorld.DebugLog("该地图守护无法拾取物品! mapID=%s" % mapID, curPlayer.GetPlayerID())
+            GameWorld.Log("该地图守护无法拾取物品! mapID=%s" % mapID, curPlayer.GetPlayerID())
             return
         
 #    #单人副本一键拾取
@@ -348,14 +353,18 @@
 #        SingleFBTPickUP(curPlayer, mapItemID, tick)
 #        return
     
+    if not mapItemIDList:
+        GameWorld.ErrLog("没有指定要拾取的地图物品ID!", curPlayer.GetPlayerID())
+        return
+    
     succMapItemIDList = [] # 成功拾取的地图物品
     for mapItemID in mapItemIDList:
         if __DoPickup(curPlayer, mapItemID, tick, isGuard):
             succMapItemIDList.append(mapItemID)
             
-    GameWorld.DebugLog("请求拾取物品, isGuard=%s, MapItemID=%s, SuccMapItemID=%s" 
-                       % (isGuard, mapItemIDList, succMapItemIDList), curPlayer.GetPlayerID())
-    
+    if succMapItemIDList:
+        GameWorld.Log("成功拾取地图物品, succMapItemIDList=%s" % (succMapItemIDList), curPlayer.GetPlayerID())
+        
     # 守护拾取的,附加同步守护拾取结果
     if isGuard and succMapItemIDList:
         guradPickupSucc = ChPyNetSendPack.tagMCGuradPickupItemSucc()
@@ -562,13 +571,20 @@
     maxCnt = ItemCommon.GetCanUseCountDaily(curItem)
     if maxCnt <= 0:
         return -1
+    curItemID = curItem.GetItemTypeID()
+    useCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ItemUseCntToday % curItemID)
+    for itemIDList in IpyGameDataPY.GetFuncEvalCfg('ShareUseCntItem'):
+        if curItemID not in itemIDList:
+            continue
+        for itemID in itemIDList:
+            if itemID == curItemID:
+                continue
+            useCnt += curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ItemUseCntToday % itemID)
     
-    itemID = curItem.GetItemTypeID()
-    useCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ItemUseCntToday % itemID)
     canUseCnt = max(0, maxCnt - useCnt)
     
     if canUseCnt <= 0:
-        GameWorld.DebugLog("已达到今日使用次数上限!itemID=%s,useCnt=%s,maxCnt=%s" % (itemID, useCnt, maxCnt))
+        GameWorld.DebugLog("已达到今日使用次数上限!itemID=%s,useCnt=%s,maxCnt=%s" % (curItemID, useCnt, maxCnt))
         #PlayerControl.NotifyCode(curPlayer, notifyMark, [itemID])
         
     #GameWorld.DebugLog("物品ID(%s)今日已使用次数(%s), maxCnt=%s" % (itemID, useCnt, maxCnt))
@@ -689,7 +705,8 @@
                            ChConfig.Def_ItemType_GiveMoney:"Item_GiveMoney",         # 给人物金钱
                            ChConfig.Def_ItemType_AddLimitBuff:"Item_Add_LimitingBuff",         # 给限时buff物品
                            ChConfig.Def_ItemType_AddExpBuff:"Item_Add_LimitingBuff",         # 给限时buff物品
-                           ChConfig.Def_ItemType_ResetAttrPoint:"Item_ResetAttrPoint"    #单个属性点重置
+                           ChConfig.Def_ItemType_ResetAttrPoint:"Item_ResetAttrPoint",    #单个属性点重置
+                           ChConfig.Def_ItemType_AddCrossRealmPKCnt:"Item_AddCrossRealmPKCnt"    #增加跨服PK次数
                            } 
     
     #根据物品效果使用{物品效果ID:call的py名}
@@ -704,7 +721,10 @@
                             ChConfig.Def_Effect_ResetBossKillCnt:"Item_ResetBossKillCnt", # 重置boss击杀疲劳
                             ChConfig.Def_Effect_AddFBCnt:"Item_AddFBCnt", # 增加副本可进入次数
                             ChConfig.Def_Effect_AddKillBossCnt:"Item_AddKillBossCnt", # 增加BOSS可击杀次数
-                            #ChConfig.Def_PhoneVip_EffID:"Item_AddPhoneVip", # 手机VIP物品卡
+                            ChConfig.Def_Effect_AddMagicWeaponUpExp:"Item_AddMagicWeaponUpExp", # 增加法宝升星经验
+                            ChConfig.Def_Effect_ChatBubbleBox:"Item_ChatBubbleBox", # 激活聊天气泡框
+                            ChConfig.Def_Effect_ItemGiveWeekPartyPoint:"Item_WeekPartyPoint", # 增加活动巡礼积分
+                            ChConfig.Def_Effect_ItemGiveWeekPartyPoint1:"Item_WeekPartyPoint", # 增加活动巡礼积分
                             #ChConfig.Def_Effect_AddZhenQiByTimes:"Item_AddZhenQiByTimes", # 增加真气按一天使用次数减少
                             #ChConfig.Def_Effect_AddPrestige:"Item_AddPrestige",  # 给人物威望
                             #ChConfig.Def_Effect_FamilyImpeach:"Item_FamilyImpeach",  # 弹劾符
@@ -1190,46 +1210,53 @@
 #  @param tick 当前时间
 #  @return True or False
 #  @remarks 函数详细说明.
-def __CheckPickUpItemTime(curPlayer , mapItem , tick):
+def __CheckPickUpItemTime(curPlayer, mapItem, tick, mapItemID, dropItemNPCID):
     #判断物品保护时间
     #玩家击杀掉落的
     if mapItem.GetRemainTick(tick) == 0:
         return True
-    itemOwnerType =  mapItem.GetOwnerType()
+    itemOwnerType = mapItem.GetOwnerType()
+    playerID = curPlayer.GetPlayerID()
+    ownerID = mapItem.GetOwnerID()
     
     #所有人都可以拾取的物品
     if itemOwnerType == ChConfig.Def_NPCHurtTypeAll:
         return True
     #个人物品
     elif itemOwnerType == ChConfig.Def_NPCHurtTypePlayer:
-        if mapItem.GetOwnerID() != curPlayer.GetPlayerID():
-            #GameWorld.Log("该物品不属于你,不能拾取1")
+        if ownerID != playerID:
+            GameWorld.Log("玩家没有归属权,不能拾取! mapItemID=%s,dropItemNPCID=%s,ownerID=%s" 
+                          % (mapItemID, dropItemNPCID, ownerID), playerID)
             return False
     #队伍物品
     elif itemOwnerType == ChConfig.Def_NPCHurtTypeTeam:
         curTeam = curPlayer.GetTeam()
         if curTeam == None:
-            #GameWorld.Log("该物品不属于你,不能拾取2")
+            GameWorld.Log("没有队伍不能拾取归属队伍物品! mapItemID=%s,dropItemNPCID=%s,ownerID=%s" 
+                          % (mapItemID, dropItemNPCID, ownerID), playerID)
             return False
-        if curTeam.GetTeamID() != mapItem.GetOwnerID():
-            #GameWorld.Log("该物品不属于你,不能拾取3")
+        if curTeam.GetTeamID() != ownerID:
+            GameWorld.Log("队伍没有归属权,不能拾取! mapItemID=%s,dropItemNPCID=%s,ownerID=%s,curTeamID=%s" 
+                          % (mapItemID, dropItemNPCID, ownerID, curTeam.GetTeamID()), playerID)
             return False
     #阵营物品
     elif itemOwnerType == ChConfig.Def_NPCHurtTypeFaction:
-        if mapItem.GetOwnerID() != curPlayer.GetFaction():
-            #GameWorld.Log("该物品不属于你,不能拾取5")
+        if ownerID != curPlayer.GetFaction():
+            GameWorld.Log("阵营没有归属权,不能拾取! mapItemID=%s,dropItemNPCID=%s,ownerID=%s,curFaction=%s" 
+                          % (mapItemID, dropItemNPCID, ownerID, curPlayer.GetFaction()), playerID)
             return False
     #特殊玩家ID归属
     elif itemOwnerType == ChConfig.Def_NPCHurtTypeSpecial:
         ownerIDList = GetMapItemUserDataValue(mapItem, ShareDefine.Def_MapItemInfo_SpecOwner, [])
-        if curPlayer.GetPlayerID() not in ownerIDList:
-            #GameWorld.Log("该物品不属于你,不能拾取6! ownerIDList=%s" % ownerIDList, curPlayer.GetPlayerID())
+        if playerID not in ownerIDList:
+            GameWorld.Log("玩家没有归属权,不能拾取! mapItemID=%s,dropItemNPCID=%s,ownerIDList=%s" 
+                          % (mapItemID, dropItemNPCID, ownerIDList), playerID)
             return False
     #仙盟归属
     elif itemOwnerType == ChConfig.Def_NPCHurtTypeFamily:
-        if mapItem.GetOwnerID() != curPlayer.GetFamilyID():
-            #GameWorld.Log("该物品不属于你仙盟的,不能拾取7! ownerFamilyID=%s,curFamilyID=%s" 
-            #              % (mapItem.GetOwnerID(), curPlayer.GetFamilyID()), curPlayer.GetPlayerID())
+        if ownerID != curPlayer.GetFamilyID():
+            GameWorld.Log("仙盟没有归属权,不能拾取! mapItemID=%s,dropItemNPCID=%s,ownerID=%s,curFamilyID=%s" 
+                          % (mapItemID, dropItemNPCID, ownerID, curPlayer.GetFamilyID()), playerID)
             return False
         
     return True
@@ -1503,12 +1530,45 @@
         GameWorld.DebugLog("    物品无法使用!")
         return
     
+    # 使用拍品
+    if not curItem.GetIsBind():
+        DoLogic_PlayerUseAuctionItem(curPlayer, curItem)
+        return
+    
     if useCnt <= 0:
         useCnt = curItem.GetCount()
         GameWorld.DebugLog("    没指定使用个数,默认使用全部=%s" % useCnt)
         
     __DoLogic_PlayerUseItemSelf(curPlayer, itemIndex, tick, useCnt, exData)
 
+    return
+
+def DoLogic_PlayerUseAuctionItem(curPlayer, curItem):
+    ## 玩家使用拍品
+    playerID = curPlayer.GetPlayerID()
+    itemID = curItem.GetItemTypeID()
+        
+    curItem.SetIsBind(1) # 设置为非拍品
+    curItem.ClearUserAttr(ShareDefine.Def_IudetAuctionItemCreateTime)
+    GameWorld.DebugLog("玩家使用拍品: itemID=%s" % (itemID), playerID)
+    
+    if ItemCommon.GetIsEquip(curItem):
+        # 生成传奇属性
+        legendAttrInfo = ItemControler.GetAddEquipLegendAttr(curItem, curPlayer)
+        if not legendAttrInfo:
+            GameWorld.ErrLog("使用装备拍品没有传奇属性!itemID=%s" % (itemID), playerID)
+            return
+        attrIDList, attrValueList = legendAttrInfo
+        # 传奇属性
+        if attrIDList and attrValueList and len(attrIDList) == len(attrValueList):
+            curItem.ClearUserAttr(ShareDefine.Def_IudetLegendAttrID)
+            curItem.ClearUserAttr(ShareDefine.Def_IudetLegendAttrValue)
+            for i, attrID in enumerate(attrIDList):
+                value = attrValueList[i]
+                curItem.AddUserAttr(ShareDefine.Def_IudetLegendAttrID, attrID)
+                curItem.AddUserAttr(ShareDefine.Def_IudetLegendAttrValue, value)
+        ItemCommon.MakeEquipGS(curItem)
+        
     return
 
 #---------------------------------------------------------------------
@@ -1770,8 +1830,10 @@
         curMapItem.SetOwnerType(ownerType)
         curMapItem.SetOwnerID(ownerID)
         
-    #GameWorld.DebugLog("AddMapDropItem ID=%s,ownerType=%s,ownerID=%s,GetDropTick=%s,isBind=%s" 
-    #                   % (curMapItem.GetID(), ownerType, ownerID, curMapItem.GetDropTick(), curItem.GetIsBind()))
+    if dropNPCID:
+        itemNoteDict = ItemCommon.GetItemNoteDict(curItem, curItem.GetCount())
+        GameWorld.Log("AddMapDropItem mapItemID=%s,ownerType=%s,ownerID=%s,mapItemDataStr=%s,itemNoteDict=%s" 
+                      % (curMapItem.GetID(), curMapItem.GetOwnerType(), curMapItem.GetOwnerID(), itemDataStr, itemNoteDict))
     return curMapItem
 
 def GetMapDropItemDataStr(curItem, effIndex=0, ownerInfo=[], dropNPCID=0, isOnlySelfSee=False):
@@ -1846,10 +1908,10 @@
     #===========================================================================
            
     # 套装
-    if equipData.isSuite:
-        curItem.SetIsSuite(equipData.isSuite)
-    if equipData.suiteLV:
-        curItem.SetUserAttr(ShareDefine.Def_IudetSuiteLV, equipData.suiteLV)
+    #if equipData.isSuite:
+    #    curItem.SetIsSuite(equipData.isSuite)
+    #if equipData.suiteLV:
+    #    curItem.SetUserAttr(ShareDefine.Def_IudetSuiteLV, equipData.suiteLV)
     # 物品来源
     if equipData.source:
         curItem.SetUserAttr(ShareDefine.Def_IudetSource, equipData.source)
@@ -1982,14 +2044,12 @@
 #            makeItemID = int(itemDictData['ItemID'])
 #            itemCount = 1
 #            itemDictData['IsBind'] = isBind
-#            if not ItemControler.GivePlayerEquip(curPlayer, itemDictData, False, 
-#                                                 [IPY_GameWorld.rptItem]):
+#            if not ItemControler.GivePlayerEquip(curPlayer, itemDictData):
 #                GameWorld.ErrLog("使用特殊运营物品 给予定制物品失败")
 #                return
 #        else:
 #            #给予物品
-#            if not ItemControler.GivePlayerItem(curPlayer, newItemId, itemCount, isBind, 
-#                                         [IPY_GameWorld.rptItem], False):
+#            if not ItemControler.GivePlayerItem(curPlayer, newItemId, itemCount, 0, [IPY_GameWorld.rptItem]):
 #                GameWorld.ErrLog("使用特殊运营物品 给予普通物品失败")
 #                return
 #        #PlayerControl.NotifyCode(curPlayer, "ObtainRes01", [makeItemID, itemCount])
@@ -2047,6 +2107,18 @@
         return
     #先删原物品再给新物品
     ItemCommon.DelItem(curPlayer, timeOutItem, 1, False, "RenewItem")
-    ItemControler.GivePlayerItem(curPlayer, changeItemID, 1, True, [IPY_GameWorld.rptItem])
+    ItemControler.GivePlayerItem(curPlayer, changeItemID, 1, 0, [IPY_GameWorld.rptItem])
     PlayerControl.NotifyCode(curPlayer, 'Guardian_ContinuePay')
-    return
\ No newline at end of file
+    return
+
+#// A3 08 物品过期 #tagCMItemTimeout
+#
+#struct    tagCMItemTimeout
+#
+#{
+#    tagHead        Head;
+#    BYTE        PackType;        //背包类型
+#    BYTE        ItemIndex;        //物品在背包中索引
+#};
+def OnItemTimeout(index, clientData, tick):
+    return

--
Gitblit v1.8.0