From 82913849bb18101c411c39bd14df207f656dd49d Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期五, 13 十二月 2024 19:25:19 +0800
Subject: [PATCH] 10345 【英文】推金币优化(改为同步抽中位置编号)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py            |   19 +++------
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorld.py                  |   20 ++++++++++
 ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py                                 |   19 +++------
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerSuperDiscount.py |   18 ++++----
 4 files changed, 41 insertions(+), 35 deletions(-)

diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
index 0a6ecb5..427682f 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
@@ -48826,8 +48826,7 @@
 
 class  tagMCTuijinbiInfo(Structure):
     Head = tagHead()
-    DrawType = 0    #(BYTE DrawType)// 本次抽奖奖励类型,为0时表示非抽奖同步;1-金币;2-仙玉币;3-红包;4-超级奖励
-    DrawCount = 0    #(DWORD DrawCount)// 本次抽奖奖励数量
+    DrawNum = 0    #(BYTE DrawNum)// 本次抽中位置,为0时表示非抽奖同步
     PoolPrizeCnt = 0    #(BYTE PoolPrizeCnt)
     PoolPrizeList = list()    #(vector<tagMCTuijinbiPool> PoolPrizeList)// 台面奖池信息列表,每次都完整通知
     data = None
@@ -48841,8 +48840,7 @@
     def ReadData(self, _lpData, _pos=0, _Len=0):
         self.Clear()
         _pos = self.Head.ReadData(_lpData, _pos)
-        self.DrawType,_pos = CommFunc.ReadBYTE(_lpData, _pos)
-        self.DrawCount,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.DrawNum,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         self.PoolPrizeCnt,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         for i in range(self.PoolPrizeCnt):
             temPoolPrizeList = tagMCTuijinbiPool()
@@ -48855,8 +48853,7 @@
         self.Head.Clear()
         self.Head.Cmd = 0xAA
         self.Head.SubCmd = 0x05
-        self.DrawType = 0
-        self.DrawCount = 0
+        self.DrawNum = 0
         self.PoolPrizeCnt = 0
         self.PoolPrizeList = list()
         return
@@ -48865,7 +48862,6 @@
         length = 0
         length += self.Head.GetLength()
         length += 1
-        length += 4
         length += 1
         for i in range(self.PoolPrizeCnt):
             length += self.PoolPrizeList[i].GetLength()
@@ -48875,8 +48871,7 @@
     def GetBuffer(self):
         data = ''
         data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
-        data = CommFunc.WriteBYTE(data, self.DrawType)
-        data = CommFunc.WriteDWORD(data, self.DrawCount)
+        data = CommFunc.WriteBYTE(data, self.DrawNum)
         data = CommFunc.WriteBYTE(data, self.PoolPrizeCnt)
         for i in range(self.PoolPrizeCnt):
             data = CommFunc.WriteString(data, self.PoolPrizeList[i].GetLength(), self.PoolPrizeList[i].GetBuffer())
@@ -48885,15 +48880,13 @@
     def OutputString(self):
         DumpString = '''
                                 Head:%s,
-                                DrawType:%d,
-                                DrawCount:%d,
+                                DrawNum:%d,
                                 PoolPrizeCnt:%d,
                                 PoolPrizeList:%s
                                 '''\
                                 %(
                                 self.Head.OutputString(),
-                                self.DrawType,
-                                self.DrawCount,
+                                self.DrawNum,
                                 self.PoolPrizeCnt,
                                 "..."
                                 )
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
index 0a6ecb5..427682f 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -48826,8 +48826,7 @@
 
 class  tagMCTuijinbiInfo(Structure):
     Head = tagHead()
-    DrawType = 0    #(BYTE DrawType)// 本次抽奖奖励类型,为0时表示非抽奖同步;1-金币;2-仙玉币;3-红包;4-超级奖励
-    DrawCount = 0    #(DWORD DrawCount)// 本次抽奖奖励数量
+    DrawNum = 0    #(BYTE DrawNum)// 本次抽中位置,为0时表示非抽奖同步
     PoolPrizeCnt = 0    #(BYTE PoolPrizeCnt)
     PoolPrizeList = list()    #(vector<tagMCTuijinbiPool> PoolPrizeList)// 台面奖池信息列表,每次都完整通知
     data = None
@@ -48841,8 +48840,7 @@
     def ReadData(self, _lpData, _pos=0, _Len=0):
         self.Clear()
         _pos = self.Head.ReadData(_lpData, _pos)
-        self.DrawType,_pos = CommFunc.ReadBYTE(_lpData, _pos)
-        self.DrawCount,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.DrawNum,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         self.PoolPrizeCnt,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         for i in range(self.PoolPrizeCnt):
             temPoolPrizeList = tagMCTuijinbiPool()
@@ -48855,8 +48853,7 @@
         self.Head.Clear()
         self.Head.Cmd = 0xAA
         self.Head.SubCmd = 0x05
-        self.DrawType = 0
-        self.DrawCount = 0
+        self.DrawNum = 0
         self.PoolPrizeCnt = 0
         self.PoolPrizeList = list()
         return
@@ -48865,7 +48862,6 @@
         length = 0
         length += self.Head.GetLength()
         length += 1
-        length += 4
         length += 1
         for i in range(self.PoolPrizeCnt):
             length += self.PoolPrizeList[i].GetLength()
@@ -48875,8 +48871,7 @@
     def GetBuffer(self):
         data = ''
         data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
-        data = CommFunc.WriteBYTE(data, self.DrawType)
-        data = CommFunc.WriteDWORD(data, self.DrawCount)
+        data = CommFunc.WriteBYTE(data, self.DrawNum)
         data = CommFunc.WriteBYTE(data, self.PoolPrizeCnt)
         for i in range(self.PoolPrizeCnt):
             data = CommFunc.WriteString(data, self.PoolPrizeList[i].GetLength(), self.PoolPrizeList[i].GetBuffer())
@@ -48885,15 +48880,13 @@
     def OutputString(self):
         DumpString = '''
                                 Head:%s,
-                                DrawType:%d,
-                                DrawCount:%d,
+                                DrawNum:%d,
                                 PoolPrizeCnt:%d,
                                 PoolPrizeList:%s
                                 '''\
                                 %(
                                 self.Head.OutputString(),
-                                self.DrawType,
-                                self.DrawCount,
+                                self.DrawNum,
                                 self.PoolPrizeCnt,
                                 "..."
                                 )
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorld.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorld.py
index 4c9ab35..edea7e9 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorld.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorld.py
@@ -1686,6 +1686,26 @@
         plusPieList.append((specRate, info))
     return plusPieList
 
+## 从列表中产生物品,[[几率,object], ....], 万分率
+#  @param itemList 待选列表
+#  @return 抽中索引, 抽中元素           索引-1代表没有抽中
+def GetResultIndexByRandomList(randList):
+    if not randList:
+        return -1, None
+    randRate = random.randint(0, randList[-1][0])
+    for index in range(0, len(randList)):
+        element = randList[index]
+        if not element:
+            continue
+        
+        cmpRate = element[0]
+        if randRate > cmpRate:
+            continue
+        
+        return index, element[1]
+    
+    return -1, None
+
 ## 从列表中产生物品,[[几率,object], ....],万分率
 #  @param itemList 待选列表
 #  @return object
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerSuperDiscount.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerSuperDiscount.py
index 4a39626..df08891 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerSuperDiscount.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerSuperDiscount.py
@@ -152,12 +152,12 @@
     GameWorld.DebugLog("推金币抽奖: playerSign=%s,tuijinbiCnt=%s,prizeRateList=%s" % (playerSign, tuijinbiCnt, prizeRateList), playerID)
     
     addPoolPrizeInfo = {} # 增加台面奖池信息
-    drawInfo = GameWorld.GetResultByRandomList(prizeRateList)
+    drawIndex, drawInfo = GameWorld.GetResultIndexByRandomList(prizeRateList)
     if playerSign == Sign_NewVerPlayer and not tuijinbiCnt: # 新版本玩家首次推
         for _ in range(100):
             if drawInfo and drawInfo[0] in [PrizeType_Gold, PrizeType_Xianyu]: # 首次只能产出金币或仙玉币
                 break
-            drawInfo = GameWorld.GetResultByRandomList(prizeRateList)
+            drawIndex, drawInfo = GameWorld.GetResultIndexByRandomList(prizeRateList)
             
         # 首次附加默认初始奖励
         initPrizeList = IpyGameDataPY.GetFuncEvalCfg("EnSuperDiscount", 5)
@@ -168,13 +168,14 @@
     if not drawInfo or len(drawInfo) != 2:
         return
     drawType, drawCount = drawInfo
+    GameWorld.DebugLog("抽到: drawIndex=%s,drawInfo=%s,drawType=%s,drawCount=%s" % (drawIndex, drawInfo, drawType, drawCount), playerID)
     PlayerControl.PayMoney(curPlayer, ShareDefine.TYPE_Price_Tuijinbi, 1, isNotify=False)    
     
     # 红包,直接给奖励
     if drawType == PrizeType_Redpack:
         randMoneyList = IpyGameDataPY.GetFuncEvalCfg("PushCoin", 3)
         randMoney = random.choice(randMoneyList)
-        GameWorld.DebugLog("抽到红包直接给: %s" % str(randMoney), playerID)
+        GameWorld.DebugLog("红包直接给: %s" % str(randMoney), playerID)
         if randMoney and len(randMoney) == 2:
             __GiveMoney(curPlayer, randMoney[0], randMoney[1], True)
             
@@ -182,12 +183,12 @@
     elif drawType == PrizeType_Super:
         randPrizeList = IpyGameDataPY.GetFuncEvalCfg("PushCoin", 2)
         randPrize = random.choice(randPrizeList)
-        GameWorld.DebugLog("抽到超级奖励: %s" % str(randPrize), playerID)
+        GameWorld.DebugLog("超级奖励: %s" % str(randPrize), playerID)
         if randPrize and len(randPrize) == 2:
             randPrizeType, randValue = randPrize
             addPoolPrizeInfo[randPrizeType] = addPoolPrizeInfo.get(randPrizeType, 0) + randValue
     else:
-        GameWorld.DebugLog("抽到: drawType=%s,drawCount=%s" % (drawType, drawCount), playerID)
+        GameWorld.DebugLog("添加奖池: drawType=%s,drawCount=%s" % (drawType, drawCount), playerID)
         addPoolPrizeInfo[drawType] = addPoolPrizeInfo.get(drawType, 0) + drawCount
             
     for prizeType, addCnt in addPoolPrizeInfo.items():
@@ -199,7 +200,7 @@
     tuijinbiCnt += 1
     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TuiJinbiCnt, tuijinbiCnt)
     GameWorld.DebugLog("更新累计推金币次数: %s" % (tuijinbiCnt), playerID)
-    SyncTuijinbiInfo(curPlayer, drawType, drawCount)
+    SyncTuijinbiInfo(curPlayer, drawIndex + 1)
     return
 
 def __DoGivePrize(curPlayer, prizeType, prizeCount):
@@ -231,7 +232,7 @@
         ItemControler.NotifyGiveAwardInfo(curPlayer, [], "Tuijinbi", moneyInfo={moneyType:moneyValue})
     return
 
-def SyncTuijinbiInfo(curPlayer, drawType=0, drawCount=0):
+def SyncTuijinbiInfo(curPlayer, drawNum=0):
     poolPrizeList = [] # 台面信息
     for prizeType in [PrizeType_Gold, PrizeType_Xianyu]:
         prizeCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TuiJinbiPool % prizeType)
@@ -243,8 +244,7 @@
         poolPrizeList.append(poolInfo)
         
     clientPack = ChPyNetSendPack.tagMCTuijinbiInfo()
-    clientPack.DrawType = drawType
-    clientPack.DrawCount = drawCount
+    clientPack.DrawNum = drawNum
     clientPack.PoolPrizeList = poolPrizeList
     clientPack.PoolPrizeCnt = len(clientPack.PoolPrizeList)
     NetPackCommon.SendFakePack(curPlayer, clientPack)

--
Gitblit v1.8.0