From 649b36b642546062ab5102b6225b9f78ea72309d Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期二, 04 十一月 2025 18:11:02 +0800
Subject: [PATCH] 129 【战斗】战斗系统-服务端(优化完整战报仅包含战斗相关封包,结算奖励相关如物品,经验,货币,挑战次数等统一放在战报数据B430后同步)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventShell.py |  211 +++++++++++-----------------------------------------
 1 files changed, 47 insertions(+), 164 deletions(-)

diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventShell.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventShell.py
index ac64644..e3a59b7 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventShell.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventShell.py
@@ -77,9 +77,7 @@
 import ItemControler
 import ItemCommon
 import ShareDefine
-import DataRecordPack
 import PlayerCoat
-import PlayerGatherSoul
 import PlayerRune
 import IpyGameDataPY
 import NPCCommon
@@ -133,10 +131,10 @@
 #@remarks 远程执行NPC功能
 def FuncDirectCall(curPlayer, responseType, funcAnswer, tick, clientData=None):
     #远程事件,状态统一判断
-    if not FunctionNPCCommon.CheckPlayerCanStateEvent(curPlayer):
-        #退出回包
-        SyncMakeItemRefuse(curPlayer, funcAnswer)
-        return
+    #if not FunctionNPCCommon.CheckPlayerCanStateEvent(curPlayer):
+    #    #退出回包
+    #    SyncMakeItemRefuse(curPlayer, funcAnswer)
+    #    return
     
     callFunc = GameWorld.GetExecFunc(EventSrc, "%s.%s"%(responseType, funcAnswer))
     
@@ -193,36 +191,6 @@
     return GameWorld.GetPsycoFunc(callFunc)(curPlayer, tick)
 
 #===============================================================================
-# //08 03 玩家购买物品#tagCBuyItemList
-# tagCBuyItemList       *   GettagCBuyItemList();
-# 
-# class   IPY_CBuyItemList
-# {
-# public:
-# 
-#    int      GetBuyItemIndex();
-#    //购买数量
-#    int      GetBuyCount();
-# };
-#===============================================================================
-##客户端封包响应//08 03 玩家购买物品#tagCBuyItemList
-#@param index 玩家索引
-#@param tick 时间戳
-#@return 返回值无意义
-#@remarks 客户端封包响应//08 03 玩家购买物品#tagCBuyItemList
-def BuyItem(index, tick):
-    #得到玩家的对象
-    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
-
-    result = FuncDirectCall(curPlayer, "FunctionNPCCommon", "BuyItem", tick)
-
-    if result:
-        PlayerControl.NotifyCode(curPlayer, "BuyResSucceed")
-        
-    return
-
-
-#===============================================================================
 # //A2 03 回购物品 #tagCMBuyItemBack
 # 
 # struct tagCMBuyItemBack
@@ -236,31 +204,8 @@
 #  @return None
 def BuyItemBack(index, clientPack, tick):
     #得到玩家的对象
-    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
-    FunctionNPCCommon.BuyItemBack(curPlayer, clientPack, tick)
-    return
-
-#===============================================================================
-# //08 06 卖物品#tagCPlayerSellItem
-# tagCPlayerSellItem       *   GettagCPlayerSellItem();
-# 
-# class   IPY_CPlayerSellItem
-# {
-# public:
-#    //背包类型
-#    int      GetPackType();
-#    //物品索引
-#    int      GetItemIndex();
-# };
-#===============================================================================
-##客户端封包响应//08 06 卖物品#tagCPlayerSellItem
-#@param index 玩家索引
-#@param tick 时间戳
-#@return 返回值无意义
-#@remarks 客户端封包响应//08 06 卖物品#tagCPlayerSellItem
-def SellItem(index, tick):
-    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
-    FuncDirectCall(curPlayer, "FunctionNPCCommon", "SellItem", tick)
+    #curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
+    #FunctionNPCCommon.BuyItemBack(curPlayer, clientPack, tick)
     return
 
 #===============================================================================
@@ -387,16 +332,16 @@
 #  @return 无返回值
 #  @remarks 07 3C通用背包操作#tagCBackpackOperate
 def BackpackOperate(index, tick):
-    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
-    sendPack = IPY_GameWorld.IPY_CBackpackOperate()
-    pack_SrcBackpack = sendPack.GetSrcBackpack()
-    pack_DesBackPack = sendPack.GetDesBackPack()
-    pack_SrcIndex = sendPack.GetSrcIndex()
-    pack_DestIndex = sendPack.GetDestIndex()
-    pack_ItemCount = sendPack.GetCount()
-    
-    FunctionNPCCommon.BackpackOperate(curPlayer, pack_SrcBackpack, pack_DesBackPack, 
-                                          pack_SrcIndex, pack_DestIndex, pack_ItemCount, tick)
+#    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
+#    sendPack = IPY_GameWorld.IPY_CBackpackOperate()
+#    pack_SrcBackpack = sendPack.GetSrcBackpack()
+#    pack_DesBackPack = sendPack.GetDesBackPack()
+#    pack_SrcIndex = sendPack.GetSrcIndex()
+#    pack_DestIndex = sendPack.GetDestIndex()
+#    pack_ItemCount = sendPack.GetCount()
+#    
+#    FunctionNPCCommon.BackpackOperate(curPlayer, pack_SrcBackpack, pack_DesBackPack, 
+#                                          pack_SrcIndex, pack_DestIndex, pack_ItemCount, tick)
     return
 #---------------------------------------------------------------------
 #===============================================================================
@@ -426,16 +371,13 @@
     # 符印交换
     if PlayerRune.SwitchRune(curPlayer, pack_SrcBackpack, pack_DesBackPack, pack_SrcIndex, pack_DestIndex):
         return
-    # 聚魂交换
-    if PlayerGatherSoul.SwitchGatherSoul(curPlayer, pack_SrcBackpack, pack_DesBackPack, pack_SrcIndex, pack_DestIndex):
-        return
     
     #时装
     if PlayerCoat.SwitchCoat(curPlayer, pack_SrcBackpack, pack_DesBackPack, pack_SrcIndex, pack_DestIndex):
         return
     
-    FunctionNPCCommon.PackItemExchange(curPlayer, pack_SrcBackpack, pack_DesBackPack, 
-                                          pack_SrcIndex, pack_DestIndex, tick)
+    #FunctionNPCCommon.PackItemExchange(curPlayer, pack_SrcBackpack, pack_DesBackPack, 
+    #                                      pack_SrcIndex, pack_DestIndex, tick)
     return
 
 #===============================================================================
@@ -455,104 +397,45 @@
     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
     pack = IPY_GameWorld.IPY_COpenPackCount()
     packType = pack.GetPackType()
-    if packType not in ChConfig.Def_Type_CanBuyPack_PlayerDict.keys():
-        return
-    
-    buyCount = pack.GetCount()
+    #buyCount = pack.GetCount()
+    __DoOpenPackCount(curPlayer, packType)
+    return
 
-    #已购买格子数
-    keyName = ChConfig.Def_Type_CanBuyPack_PlayerDict[packType][ChConfig.Def_PlayerPackDict_Index_Key]
-    curGridCnt = curPlayer.NomalDictGetProperty(keyName)  
-    
-    #默认格子数
-    initCnt = ItemCommon.GetPackInitCount(packType)
+def __DoOpenPackCount(curPlayer, packType):
+    costMoneyTypeDict = IpyGameDataPY.GetFuncEvalCfg("OpenPack", 1, {})
+    costMoneyValueDict = IpyGameDataPY.GetFuncEvalCfg("OpenPack", 2, {})
+    openGridListDict = IpyGameDataPY.GetFuncEvalCfg("OpenPack", 3, {})
+    if str(packType) not in costMoneyTypeDict or str(packType) not in costMoneyValueDict or str(packType) not in openGridListDict:
+        GameWorld.ErrLog("该背包不可购买! packType=%s" % packType)
+        return
+    moneyType = costMoneyTypeDict[str(packType)]
+    costValueList = costMoneyValueDict[str(packType)]
+    openGridList = openGridListDict[str(packType)]
     
     curPack = curPlayer.GetItemManager().GetPack(packType)
     curPackMaxCnt = curPack.GetMaxCount()
-    openAnonCnt =  initCnt + curGridCnt + buyCount
+    initCnt = ItemCommon.GetPackInitCount(packType)
+    alreadyOpenCnt = ItemCommon.GetPackOpenItemCnt(curPlayer, packType)
+    canOpenGridCnt = curPackMaxCnt - initCnt - alreadyOpenCnt
     
-    if curPackMaxCnt < openAnonCnt:
+    nextBuyCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_PackBuyCnt % packType) + 1
+    nextOpenCnt = openGridList[nextBuyCnt - 1] if len(openGridList) >= nextBuyCnt else openGridList[-1]
+    moneyCnt = costValueList[nextBuyCnt - 1] if len(costValueList) >= nextBuyCnt else costValueList[-1]
+    
+    if canOpenGridCnt < nextOpenCnt:
         #数量超过最大格子数
-        GameWorld.DebugLog("购买背包格子,数量超过最大格子数!packType=%s,buyCount=%s" % (packType, buyCount))
-        return
-   
-    isBuyOK, costMoneyList = DoOpenGrid(curPlayer, curGridCnt, packType, buyCount)
-    if not isBuyOK:
+        GameWorld.DebugLog("购买背包格子,数量超过最大格子数!packType=%s,initCnt=%s,alreadyOpenCnt=%s,已购买次数=%s,curPackMaxCnt=%s,canOpenGridCnt=%s < %s" 
+                           % (packType, initCnt, alreadyOpenCnt, nextBuyCnt - 1, curPackMaxCnt, canOpenGridCnt, nextOpenCnt))
         return
     
-    #fromIndex, toIndex =  curGridCnt + 1, curGridCnt + buyCount  
-#    GameWorld.Log("fromIndex=%s toIndex=%s"%(fromIndex, toIndex))
-    PlayerControl.NomalDictSetProperty(curPlayer, keyName, curGridCnt + buyCount)
+    infoDict = {"BuyCount":nextBuyCnt, ChConfig.Def_Cost_Reason_SonKey:packType}
+    if not PlayerControl.PayMoney(curPlayer, moneyType, moneyCnt, ChConfig.Def_Cost_BuyPack, infoDict, 1):
+        return
     
-    if packType == IPY_GameWorld.rptItem:
-        #背包刷新
-        PlayerControl.Init_ItemPack(curPlayer)
-        PlayerControl.NotifyCode(curPlayer, "GeRen_liubo_671654")
-        #PlayerControl.SyncOnLineTimeTotal(curPlayer)
-        #PlayerControl.SyncOnLineTimeLastOpenPack(curPlayer, packType)
-        
-        
-    elif packType == IPY_GameWorld.rptWarehouse:
-        #仓库刷新
-        PlayerControl.Init_Warehouse(curPlayer)
-            
-    else:
-        #收纳柜刷新
-        PlayerControl.Init_CabinetCountByType(curPlayer, packType)
-    
-    DataRecordPack.DR_OpenPackCount(curPlayer, packType, buyCount, curPlayer.NomalDictGetProperty(keyName))
-    
-    if costMoneyList:
-        #消费记录
-        for moneyType, money in costMoneyList:
-            GameWorld.Login_Interface_GoldRec(curPlayer, 0, 1, 'BuyPackGrid', moneyType, money)
-
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_PackBuyCnt % packType, nextBuyCnt)
+    PlayerControl.Init_PackCount(curPlayer, packType)
+    ItemCommon.SyncPackBuyCnt(curPlayer, packType)
     return
-
-##开启格子扣道具钻石
-# @param curPlayer 玩家对象
-# @param buyMoney 钻石消耗
-# @param packType 背包类型
-# @param curPack 物品管理器
-# @param buyPackMoneyType 货币类型
-# @param buyCount 购买格子数
-# @return None 是否购买成功, 玩家是否有钱款
-def DoOpenGrid(curPlayer, curGridCnt, packType, buyCount):
-    curPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
-    
-    itemId = IpyGameDataPY.GetFuncCfg('OpenBagItem')
-    itemCntFormula = IpyGameDataPY.GetFuncCompileCfg('OpenBagItem', 2)
-    buyMoney = IpyGameDataPY.GetFuncCfg('OpenBagItem', 3)
-    totalItemCnt = 0
-    for index in range(curGridCnt+1, curGridCnt + buyCount+1):
-        itemcnt = eval(itemCntFormula)
-        totalItemCnt += itemcnt
-    
-    hasEnough, indexList, findItemIsBind, lackCnt = ItemCommon.GetItem_FromPack_ByID_ExEx(itemId, curPack, totalItemCnt)
-    
-    needMoney = lackCnt * buyMoney if not hasEnough else 0
-        
-
-    # 需要付钱
-    costMoneyList = []
-    if needMoney > 0:
-        costMoneyList = PlayerControl.HaveMoneyEx(curPlayer, IPY_GameWorld.TYPE_Price_Gold_Paper, needMoney)
-        if costMoneyList == []:
-            #金钱不足
-            return False, costMoneyList
-    
-        #付款
-        for moneyType, moneyCnt in costMoneyList:
-            infoDict = {"BuyCount":buyCount, ChConfig.Def_Cost_Reason_SonKey:packType}
-            if not PlayerControl.PayMoney(curPlayer, moneyType, moneyCnt, ChConfig.Def_Cost_BuyPack, infoDict, 1):
-                return False, costMoneyList
-    
-    # 扣道具
-    delCnt = max(0, totalItemCnt - lackCnt) # 实际扣除的个数
-    if indexList:
-        ItemCommon.ReduceItem(curPlayer, curPack, indexList, delCnt, True)
-        
-    return True, costMoneyList
     
 #===============================================================================
 #//A2 04 请求打开远程仓库 #tagCMOpenLongWarehouse

--
Gitblit v1.8.0