From bd9dce2d66b5086712596b8dac6d9116be65bafd Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期四, 11 十二月 2025 16:53:47 +0800
Subject: [PATCH] 129 【战斗】战斗系统-服务端(去除常规功能封包对象池使用;)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_MainLevel.py |  243 ++++++++++++++++++++++++-----------------------
 1 files changed, 124 insertions(+), 119 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 60ad60c..79adaa7 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
@@ -20,19 +20,21 @@
 import TurnAttack
 import ShareDefine
 import IpyGameDataPY
+import PlayerSuccess
 import PlayerControl
 import PlayerActivity
 import ChPyNetSendPack
 import ItemControler
 import IPY_GameWorld
 import NetPackCommon
+import PlayerBeauty
 import PlayerArena
+import PlayerLLMJ
 import ItemCommon
 import PlayerTask
 import NPCCommon
 import BattleObj
 import ChEquip
-import ObjPool
 
 import random
 
@@ -80,17 +82,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:
+            TurnAttack.GetMainFightMgr(curPlayer).mjExp += mjEx
+            
     __doMainDrop(curPlayer, killObjList)
     return
 
@@ -114,12 +122,18 @@
     # 其他战利品掉落
     bootyDropNeedDict = IpyGameDataPY.GetFuncEvalCfg("MainBootyDrop", 1, {})
     bootyDropCntDict = IpyGameDataPY.GetFuncEvalCfg("MainBootyDrop", 2, {})
-    for itemID, dropUpper in DailyBootyUpperList:
+    for itemID, baseUpper in DailyBootyUpperList:
         if spaceCount <= 0:
             GameWorld.DebugLog("掉落背包已满!", playerID)
             break
-        if dropUpper <= 0:
+        if baseUpper <= 0:
             continue
+        dropUpper = baseUpper
+        addPer = 0
+        addPer += PlayerBeauty.GetBeautyEffInfo(curPlayer, PlayerBeauty.EffType_BootyPer)[0] # 战利品上限提高百分比
+        if addPer:
+            dropUpper = int(baseUpper * (100 + addPer) / 100.0)
+            GameWorld.DebugLog("红颜提高战利品掉落上限: itemID=%s,baseUpper=%s,addPer=%s,dropUpper=%s" % (itemID, baseUpper, addPer, dropUpper))
         todyDropCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_BootyDropToday % itemID)
         if todyDropCnt >= dropUpper:
             GameWorld.DebugLog("战利品已达今日掉落上限! itemID=%s,todyDropCnt=%s >= %s" % (itemID, todyDropCnt, dropUpper), playerID)
@@ -145,6 +159,7 @@
                 curMoney = PlayerControl.GetMoney(curPlayer, ShareDefine.TYPE_Price_ArenaTicket)
                 storeMax = PlayerArena.GetArenaTicketStoreMax(curPlayer)
                 if curMoney >= storeMax:
+                    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_UnXiantaoCntBooty % itemID, 0)
                     GameWorld.DebugLog("挑战券已达存储上限! itemID=%s,curMoney=%s >= %s" % (itemID, curMoney, storeMax), playerID)
                     continue
                 
@@ -184,28 +199,9 @@
     ## 主线掉落装备
     playerID = curPlayer.GetPlayerID()
     unXiantaoCntEquip = PlayerControl.GetUnXiantaoCntEquip(curPlayer)
-    bossTypeDropInfo = IpyGameDataPY.GetFuncCfg("MainEquipDrop", 1) # 每消耗X个战锤掉落一件装备
-    fightPoint = max(curPlayer.GetFightPoint(), 1) # 消耗倍率也是掉落倍率
-    dropEquipCnt = 0
-    objDropCntDict = {}
-    for tagObj in killObjList:
-        tagID = tagObj.GetID()
-        npcID = tagObj.GetNPCID()
-        if not npcID:
-            continue
-        npcData = NPCCommon.GetNPCDataPy(npcID)
-        if not npcData:
-            continue
-        bossType = npcData.GetBossType()
-        if bossType not in bossTypeDropInfo:
-            continue
-        dropCnt = GameWorld.GetResultByRandomList(bossTypeDropInfo[bossType])
-        if not dropCnt:
-            continue
-        dropCnt *= fightPoint # 多倍掉落
-        objDropCntDict[tagID] = [tagObj, dropCnt, bossType]
-        dropEquipCnt += dropCnt
-        
+    dropOneNeed = IpyGameDataPY.GetFuncCfg("MainEquipDrop", 1) # 每消耗X个战锤掉落一件装备
+    dropEquipCnt = unXiantaoCntEquip / dropOneNeed
+    
     if dropEquipCnt <= 0:
         GameWorld.DebugLog("主线暂不能掉落! unXiantaoCntEquip=%s,dropEquipCnt=%s" % (unXiantaoCntEquip, dropEquipCnt), playerID)
         return
@@ -219,23 +215,26 @@
     ipyData = IpyGameDataPY.GetIpyGameData("TreeLV", treeLV)
     if not ipyData:
         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
+    bossTypeList = []
+    bossTypeDropRateDict = {}
+    for tagObj in killObjList:
+        npcID = tagObj.GetNPCID()
+        if not npcID:
+            continue
+        npcData = NPCCommon.GetNPCDataPy(npcID)
+        if not npcData:
+            continue
+        bossType = npcData.GetBossType()
+        bossTypeList.append(bossType)
+        
+        if bossType in bossTypeDropRateDict:
+            continue
+        
         if hasattr(ipyData, "GetEquipColorRateList%s" % bossType):
             equipColorRateList = getattr(ipyData, "GetEquipColorRateList%s" % bossType)()
         else:
             equipColorRateList = ipyData.GetEquipColorRateList()
-            
-        GameWorld.DebugLog("tagID=%s,bossType=%s,dropCnt=%s,treeLV=%s,equipColorRateList=%s" 
-                           % (tagID, bossType, dropCnt, treeLV, equipColorRateList), playerID)
-        if not equipColorRateList:
-            continue
-        
         totalRate = 0
         colorRateList = []
         for equipColor, colorRate in enumerate(equipColorRateList, 1):
@@ -243,52 +242,62 @@
                 continue
             totalRate += colorRate
             colorRateList.append([totalRate, equipColor])
-            
         #maxRate = 10000
         #if totalRate != maxRate:
-        #    GameWorld.SendGameError("GameWarning", "CutTreeTotalRateError:%s!=%s,treeLV=%s" % (totalRate, maxRate, treeLV))    
-        if not colorRateList:
-            return
-        GameWorld.DebugLog("    colorRateList=%s,totalRate=%s" % (colorRateList, totalRate), playerID)
+        #    GameWorld.SendGameError("GameWarning", "CutTreeTotalRateError:%s!=%s,treeLV=%s" % (totalRate, maxRate, treeLV))
+        bossTypeDropRateDict[bossType] = colorRateList
+        GameWorld.DebugLog("bossType=%s,treeLV=%s,totalRate=%s,equipColorRateList=%s,colorRateList=%s," 
+                           % (bossType, treeLV, totalRate, equipColorRateList, colorRateList), playerID)
         
-        for _ in range(dropCnt):
-            if dropEquipCnt <= 0:
-                break
-            
-            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:
+    bossTypeList.sort(reverse=True) # 按bossType优先掉落
+    GameWorld.DebugLog("主线掉落装备: unXiantaoCntEquip=%s,dropEquipCnt=%s,treeLV=%s,bossTypeList=%s" 
+                       % (unXiantaoCntEquip, dropEquipCnt, treeLV, bossTypeList), playerID)
+    dropAppointEquipDict = IpyGameDataPY.GetFuncEvalCfg("MainDropAppoint", 1, {})
+    appointDropCntMax = max(dropAppointEquipDict) if dropAppointEquipDict else 0
+    
+    for index in range(dropEquipCnt):
+        bossType = bossTypeList[index % len(bossTypeList)]
+        if bossType not in bossTypeDropRateDict:
+            continue
+        colorRateList = bossTypeDropRateDict.get(bossType, [])
+        GameWorld.DebugLog("bossType=%s,colorRateList=%s,totalRate=%s" % (bossType, colorRateList, totalRate), playerID)
+        
+        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
-            curItem.SetIsBind(1) # 为1时代表是掉落
-            #GameWorld.DebugLog("掉落装备: randEquipID=%s,%s" % (randEquipID, curItem.GetGUID()), playerID)
-            if not ItemControler.DoLogic_PutItemInPack(curPlayer, curItem, packIndexList=[IPY_GameWorld.rptIdentify]):
+            equipIDList = NPCCommon.__GetEquipIDList(0, color=itemColor, placeList=ChConfig.Def_MainEquipPlaces, findType="MainEquipDrop")
+            if not equipIDList:
                 continue
+            randEquipID = random.choice(equipIDList)
             
-            dropEquipCnt -= 1
-            
-            if appointDropEquipCnt <= appointDropCntMax:
-                PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_AppointDropEquipCnt, appointDropEquipCnt)
+        curItem = ItemControler.GetOutPutItemObj(randEquipID, 1, False, curPlayer=curPlayer, setAttrDict=setAttrDict)
+        if curItem == None:
+            continue
+        curItem.SetIsBind(1) # 为1时代表是掉落
+        #GameWorld.DebugLog("掉落装备: randEquipID=%s,%s" % (randEquipID, curItem.GetGUID()), playerID)
+        if not ItemControler.DoLogic_PutItemInPack(curPlayer, curItem, packIndexList=[IPY_GameWorld.rptIdentify]):
+            continue
+        
+        unXiantaoCntEquip -= dropOneNeed
+        PlayerControl.SetUnXiantaoCntEquip(curPlayer, unXiantaoCntEquip)
+        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_UnXiantaoCntEquip, unXiantaoCntEquip)
+        
+        if appointDropEquipCnt <= appointDropCntMax:
+            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_AppointDropEquipCnt, appointDropEquipCnt)
     return
 
 def GMTestKill(curPlayer, useXiantao):
@@ -424,6 +433,7 @@
     ChEquip.RefreshRoleEquipAttr(curPlayer)
     
     PlayerTask.UpdTaskValue(curPlayer, ChConfig.TaskType_EquipColor)
+    PlayerSuccess.UpdateEquipSuccess(curPlayer)
     return
 
 def __doDecomposeMainEquip(curPlayer, itemIndexList):
@@ -433,57 +443,51 @@
     if not moneyType or not moneyBase:
         return
     
-    equipDict = {}
-    IdentifyPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptIdentify)
-    for index in range(IdentifyPack.GetCount()):
-        curEquip = IdentifyPack.GetAt(index)
-        if not ItemCommon.CheckItemCanUse(curEquip):
-            #GameWorld.DebugLog("物品为空或不可用: index=%s" % index, playerID)
-            continue
-        if not ItemCommon.GetIsMainEquip(curEquip):
-            #GameWorld.DebugLog("非主线装备: index=%s" % index, playerID)
-            continue
-        equipDict[index] = curEquip
-            
-    if not equipDict:
-        return
-    
-    equipCnt = len(equipDict)
-    unXiantaoCntEquip = PlayerControl.GetUnXiantaoCntEquip(curPlayer)
-    perEquipXiantao = unXiantaoCntEquip / float(equipCnt) if equipCnt > 1 else unXiantaoCntEquip
-    decomposeMoney = max(1, moneyBase * perEquipXiantao) # 至少1个
-    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)
+    decomposeMoney = moneyBase
+    mjExPer, exRemain = PlayerLLMJ.GetAddDecomposePer(curPlayer)
+    mjEx = int(decomposeMoney * mjExPer / 100.0)
+    GameWorld.DebugLog("moneyType=%s,moneyBase=%s,mjExPer=%s,exRemain=%s,mjEx=%s" % (moneyType, moneyBase, mjExPer, exRemain, mjEx), playerID)
     
     moneyTotal = 0
-    
+    mjExTotal = 0
     decomposeCnt = 0
-    decomposeIndexList = []
+    
+    IdentifyPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptIdentify)
     for itemIndex in itemIndexList:
-        if itemIndex not in equipDict:
+        if itemIndex < 0 or itemIndex >= IdentifyPack.GetCount():
             continue
-        curEquip = equipDict[itemIndex]
+        curEquip = IdentifyPack.GetAt(itemIndex)
+        if not ItemCommon.CheckItemCanUse(curEquip):
+            GameWorld.DebugLog("物品为空或不可用: itemIndex=%s" % itemIndex, playerID)
+            continue
+        
+        if not ItemCommon.GetIsMainEquip(curEquip):
+            GameWorld.DebugLog("非主线装备: itemIndex=%s" % itemIndex, playerID)
+            continue
         
         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,decomposeMoney=%s,mjEx=%s,exRemain=%s,总:%s" 
+                           % (itemIndex, decomposeMoney, mjEx, exRemain, moneyTotal), playerID)
         
         ItemCommon.DelItem(curPlayer, curEquip, curEquip.GetCount(), True, ChConfig.ItemDel_EquipDecompose)
-        decomposeIndexList.append(itemIndex)
         decomposeCnt += 1
-        unXiantaoCntEquip -= perEquipXiantao
         
     if not moneyTotal:
         return
     
     moneyTotal = int(round(moneyTotal)) # 四舍五入取整
-    unXiantaoCntEquip = PlayerControl.SetUnXiantaoCntEquip(curPlayer, unXiantaoCntEquip)
-    GameWorld.DebugLog("moneyTotal=%s,unXiantaoCntEquip=%s" % (moneyTotal, unXiantaoCntEquip), playerID)
-            
+    GameWorld.DebugLog("moneyTotal=%s,mjExTotal=%s" % (moneyTotal, mjExTotal), 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)
+    PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_OSAEquipDecompose, decomposeCnt)
     return
 
 def __doPickupMainItem(curPlayer, itemIndexList):
@@ -506,6 +510,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):
@@ -520,11 +525,10 @@
         syncItemIDList = GetBootyItemIDList()
     else:
         syncItemIDList = [itemID]
-    poolMgr = ObjPool.GetPoolMgr()
-    clientPack = poolMgr.acquire(ChPyNetSendPack.tagSCDropBootyInfo)
+    clientPack = ChPyNetSendPack.tagSCDropBootyInfo()
     clientPack.DropBootyList = []
     for itemID in syncItemIDList:
-        dropBooty = poolMgr.acquire(ChPyNetSendPack.tagSCDropBooty)
+        dropBooty = ChPyNetSendPack.tagSCDropBooty()
         dropBooty.ItemID = itemID
         dropBooty.TodayDropCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_BootyDropToday % itemID)
         clientPack.DropBootyList.append(dropBooty)
@@ -532,9 +536,10 @@
     NetPackCommon.SendFakePack(curPlayer, clientPack)
     return
 
-def OnTurnFightOver(curPlayer, turnFight, mapID, funcLineID, overMsg):
+def OnTurnFightOver(turnFight, mapID, funcLineID, overMsg):
     ## 回合战斗结束
     
+    curPlayer = turnFight.curPlayer
     if not curPlayer:
         return
     

--
Gitblit v1.8.0