From 6b3b8976f49b47754a57cc710bf20a0682a80f78 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期四, 30 十月 2025 17:09:48 +0800
Subject: [PATCH] 129 【战斗】战斗系统-服务端(修复主线拾取掉落战利品为绑定的bug;)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_MainLevel.py |   94 +++++++++++++++++++++++++++++++++++++----------
 1 files changed, 74 insertions(+), 20 deletions(-)

diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_MainLevel.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_MainLevel.py
index 123be33..28e5a25 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_MainLevel.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_MainLevel.py
@@ -21,10 +21,13 @@
 import ShareDefine
 import IpyGameDataPY
 import PlayerControl
+import PlayerActivity
 import ChPyNetSendPack
 import ItemControler
 import IPY_GameWorld
 import NetPackCommon
+import PlayerArena
+import PlayerLLMJ
 import ItemCommon
 import PlayerTask
 import NPCCommon
@@ -78,17 +81,23 @@
 def __doKillAward(curPlayer, atkObj, killObjList):
     ## 计算击杀奖励
     if not killObjList:
-        GameWorld.DebugLog("没有击杀不需要处理!")
+        #GameWorld.DebugLog("没有击杀不需要处理主线奖励!")
         return
     # 结算经验
     unXiantaoCntExp = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_UnXiantaoCntExp)
     if unXiantaoCntExp:
         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_UnXiantaoCntExp, 0)
         perExp = IpyGameDataPY.GetFuncCfg("Mainline", 1) # 每个战锤增加经验
-        totalExp = unXiantaoCntExp * perExp
-        GameWorld.DebugLog("增加经验: totalExp=%s,unXiantaoCntExp=%s" % (totalExp, unXiantaoCntExp))
-        PlayerControl.PlayerControl(curPlayer).AddExp(totalExp, ShareDefine.Def_ViewExpType_KillNPC)
-        
+        baseExp = unXiantaoCntExp * perExp
+        mjExPer, exRemain = PlayerLLMJ.GetAddExpPerInfo(curPlayer)
+        mjEx = min(int(baseExp * mjExPer / 100.0), exRemain)
+        totalExp = baseExp + mjEx
+        GameWorld.DebugLog("增加经验: totalExp=%s,unXiantaoCntExp=%s,baseExp=%s,mjEx=%s,mjExPer=%s,exRemain=%s" 
+                           % (totalExp, unXiantaoCntExp, baseExp, mjEx, mjExPer, exRemain))
+        finalAddExp = PlayerControl.PlayerControl(curPlayer).AddExp(totalExp, ShareDefine.Def_ViewExpType_KillNPC)
+        if mjEx and finalAddExp:
+            PlayerLLMJ.AddExpEx(curPlayer, mjEx)
+            
     __doMainDrop(curPlayer, killObjList)
     return
 
@@ -130,6 +139,22 @@
         if dropBootyCnt <= 0:
             continue
         
+        itemData = GameWorld.GetGameData().GetItemByTypeID(itemID)
+        if not itemData:
+            continue
+        
+        # 判断挑战券
+        if itemData.GetType() == ChConfig.Def_ItemType_AutoUseMoney:
+            curEff = itemData.GetEffectByIndex(0)
+            effID = curEff.GetEffectID()
+            moneyType = curEff.GetEffectValue(1)
+            if effID == ChConfig.Def_Effect_ItemGiveMoney and moneyType == ShareDefine.TYPE_Price_ArenaTicket:
+                curMoney = PlayerControl.GetMoney(curPlayer, ShareDefine.TYPE_Price_ArenaTicket)
+                storeMax = PlayerArena.GetArenaTicketStoreMax(curPlayer)
+                if curMoney >= storeMax:
+                    GameWorld.DebugLog("挑战券已达存储上限! itemID=%s,curMoney=%s >= %s" % (itemID, curMoney, storeMax), playerID)
+                    continue
+                
         dropCntRange = bootyDropCntDict[itemID]
         if not isinstance(dropCntRange, (list, tuple)) or len(dropCntRange) != 2:
             continue
@@ -203,6 +228,8 @@
         return
     GameWorld.DebugLog("主线掉落装备: unXiantaoCntEquip=%s,dropEquipCnt=%s,treeLV=%s,objDropCntDict=%s" 
                        % (unXiantaoCntEquip, dropEquipCnt, treeLV, objDropCntDict), playerID)
+    dropAppointEquipDict = IpyGameDataPY.GetFuncEvalCfg("MainDropAppoint", 1, {})
+    appointDropCntMax = max(dropAppointEquipDict) if dropAppointEquipDict else 0
     
     for tagID, dropInfo in objDropCntDict.items():
         tagObj, dropCnt, bossType = dropInfo
@@ -234,15 +261,30 @@
         for _ in range(dropCnt):
             if dropEquipCnt <= 0:
                 break
-            itemColor = GameWorld.GetResultByRandomList(colorRateList)
-            if not itemColor:
-                continue
-            equipIDList = NPCCommon.__GetEquipIDList(0, color=itemColor, placeList=ChConfig.Def_MainEquipPlaces, findType="MainEquipDrop")
-            if not equipIDList:
-                continue
-            randEquipID = random.choice(equipIDList)
             
-            curItem = ItemControler.GetOutPutItemObj(randEquipID, 1, False, curPlayer=curPlayer)
+            setAttrDict = None
+            appointDropEquipCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_AppointDropEquipCnt) + 1
+            if appointDropEquipCnt in dropAppointEquipDict:
+                appointInfo = dropAppointEquipDict[appointDropEquipCnt]
+                randEquipID = appointInfo[0]
+                equipLV = appointInfo[1] if len(appointInfo) > 1 else 0
+                appointID = appointInfo[2] if len(appointInfo) > 2 else 0
+                setAttrDict = {}
+                if equipLV > 0:
+                    setAttrDict["%s" % ShareDefine.Def_IudetItemLV] = equipLV
+                if appointID:
+                    setAttrDict[ShareDefine.Def_CItemKey_AppointID] = appointID
+                GameWorld.DebugLog("定制掉落第%s次: equipID=%s,setAttrDict=%s" % (appointDropEquipCnt, randEquipID, setAttrDict))
+            else:
+                itemColor = GameWorld.GetResultByRandomList(colorRateList)
+                if not itemColor:
+                    continue
+                equipIDList = NPCCommon.__GetEquipIDList(0, color=itemColor, placeList=ChConfig.Def_MainEquipPlaces, findType="MainEquipDrop")
+                if not equipIDList:
+                    continue
+                randEquipID = random.choice(equipIDList)
+                
+            curItem = ItemControler.GetOutPutItemObj(randEquipID, 1, False, curPlayer=curPlayer, setAttrDict=setAttrDict)
             if curItem == None:
                 continue
             curItem.SetIsBind(1) # 为1时代表是掉落
@@ -252,6 +294,8 @@
             
             dropEquipCnt -= 1
             
+            if appointDropEquipCnt <= appointDropCntMax:
+                PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_AppointDropEquipCnt, appointDropEquipCnt)
     return
 
 def GMTestKill(curPlayer, useXiantao):
@@ -413,14 +457,16 @@
     
     equipCnt = len(equipDict)
     unXiantaoCntEquip = PlayerControl.GetUnXiantaoCntEquip(curPlayer)
-    perEquipXiantao = unXiantaoCntEquip / float(equipCnt) if equipCnt > 1 else unXiantaoCntEquip
+    perEquipXiantao = unXiantaoCntEquip / float(equipCnt) if equipCnt > 1 else unXiantaoCntEquip # 均分支持小数
     decomposeMoney = max(1, moneyBase * perEquipXiantao) # 至少1个
+    mjExPer, exRemain = PlayerLLMJ.GetAddDecomposePer(curPlayer)
+    mjEx = int(decomposeMoney * mjExPer / 100.0)
     GameWorld.DebugLog("unXiantaoCntEquip=%s,equipCnt=%s,perEquipXiantao=%s,equipIndexList=%s" 
                        % (unXiantaoCntEquip, equipCnt, perEquipXiantao, equipDict.keys()), playerID)
-    GameWorld.DebugLog("moneyBase=%s,decomposeMoney=%s" % (moneyBase, decomposeMoney), playerID)
+    GameWorld.DebugLog("moneyBase=%s,decomposeMoney=%s,mjExPer=%s,exRemain=%s,mjEx=%s" % (moneyBase, decomposeMoney, mjExPer, exRemain, mjEx), playerID)
     
     moneyTotal = 0
-    
+    mjExTotal = 0
     decomposeCnt = 0
     decomposeIndexList = []
     for itemIndex in itemIndexList:
@@ -429,8 +475,13 @@
         curEquip = equipDict[itemIndex]
         
         moneyTotal += decomposeMoney
-        GameWorld.DebugLog("    itemIndex=%s,moneyBase=%s,perEquipXiantao=%s,decomposeMoney=%s,总:%s" 
-                           % (itemIndex, moneyBase, perEquipXiantao, decomposeMoney, moneyTotal), playerID)
+        if mjEx > 0:
+            mjEx = min(mjEx, exRemain)
+            exRemain -= mjEx
+            moneyTotal += mjEx
+            mjExTotal += mjEx
+        GameWorld.DebugLog("    itemIndex=%s,moneyBase=%s,perEquipXiantao=%s,decomposeMoney=%s,mjEx=%s,exRemain=%s,总:%s" 
+                           % (itemIndex, moneyBase, perEquipXiantao, decomposeMoney, mjEx, exRemain, moneyTotal), playerID)
         
         ItemCommon.DelItem(curPlayer, curEquip, curEquip.GetCount(), True, ChConfig.ItemDel_EquipDecompose)
         decomposeIndexList.append(itemIndex)
@@ -442,10 +493,12 @@
     
     moneyTotal = int(round(moneyTotal)) # 四舍五入取整
     unXiantaoCntEquip = PlayerControl.SetUnXiantaoCntEquip(curPlayer, unXiantaoCntEquip)
-    GameWorld.DebugLog("moneyTotal=%s,unXiantaoCntEquip=%s" % (moneyTotal, unXiantaoCntEquip), playerID)
-            
+    GameWorld.DebugLog("moneyTotal=%s,mjExTotal=%s,unXiantaoCntEquip=%s" % (moneyTotal, mjExTotal, unXiantaoCntEquip), playerID)
+    
     PlayerControl.GiveMoney(curPlayer, moneyType, moneyTotal, "DecomposeMainEquip", isSysHint=False)
+    PlayerLLMJ.AddExpDecompose(curPlayer, mjExTotal)
     PlayerTask.AddTaskValue(curPlayer, ChConfig.TaskType_EquipDecompose, decomposeCnt)
+    PlayerActivity.AddDailyTaskValue(curPlayer, ChConfig.DailyTask_EquipDecompose, decomposeCnt)
     return
 
 def __doPickupMainItem(curPlayer, itemIndexList):
@@ -468,6 +521,7 @@
             continue
         itemID = curItem.GetItemTypeID()
         item = curItem.GetItem()
+        item.SetIsBind(0) # 拾取时重置,取源SingleItem修改不通知
         itemCount = ItemControler.GetItemCount(curItem)
         GameWorld.DebugLog("主线物品拾取: itemIndex=%s,itemID=%s,itemCount=%s" % (itemIndex, itemID, itemCount), playerID)
         if not itemControl.PutInItem(IPY_GameWorld.rptItem, item):

--
Gitblit v1.8.0