From d47077546e4948ae10be4859b9fb0953dc021d3a Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期五, 13 十二月 2024 17:57:32 +0800
Subject: [PATCH] 10345 【英文】推金币优化(改为后端处理)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py            |   68 +++++---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Tuijinbi.py       |   59 ++++++++
 ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py                                 |   68 +++++---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerSuperDiscount.py |  188 +++++++++++++++++++++-----
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py                   |    3 
 5 files changed, 294 insertions(+), 92 deletions(-)

diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
index d7ff35e..0a6ecb5 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
@@ -48785,11 +48785,11 @@
 #------------------------------------------------------
 # AA 05 推金币信息 #tagMCTuijinbiInfo
 
-class  tagMCTuijinbiMoney(Structure):
+class  tagMCTuijinbiPool(Structure):
     _pack_ = 1
     _fields_ = [
-                  ("MoneyType", c_ubyte),    
-                  ("MoneyValue", c_int),    
+                  ("PrizeType", c_ubyte),    # 台面奖励类型: 1-金币;2-仙玉币
+                  ("PrizeCount", c_int),    # 数量,每次都同步台面的总数量
                   ]
 
     def __init__(self):
@@ -48802,32 +48802,34 @@
         return _pos + self.GetLength()
 
     def Clear(self):
-        self.MoneyType = 0
-        self.MoneyValue = 0
+        self.PrizeType = 0
+        self.PrizeCount = 0
         return
 
     def GetLength(self):
-        return sizeof(tagMCTuijinbiMoney)
+        return sizeof(tagMCTuijinbiPool)
 
     def GetBuffer(self):
         return string_at(addressof(self), self.GetLength())
 
     def OutputString(self):
         DumpString = '''// AA 05 推金币信息 //tagMCTuijinbiInfo:
-                                MoneyType:%d,
-                                MoneyValue:%d
+                                PrizeType:%d,
+                                PrizeCount:%d
                                 '''\
                                 %(
-                                self.MoneyType,
-                                self.MoneyValue
+                                self.PrizeType,
+                                self.PrizeCount
                                 )
         return DumpString
 
 
 class  tagMCTuijinbiInfo(Structure):
     Head = tagHead()
-    AwardMoneyCount = 0    #(BYTE AwardMoneyCount)
-    AwardMoneyList = list()    #(vector<tagMCTuijinbiMoney> AwardMoneyList)// 累计获得货币信息列表
+    DrawType = 0    #(BYTE DrawType)// 本次抽奖奖励类型,为0时表示非抽奖同步;1-金币;2-仙玉币;3-红包;4-超级奖励
+    DrawCount = 0    #(DWORD DrawCount)// 本次抽奖奖励数量
+    PoolPrizeCnt = 0    #(BYTE PoolPrizeCnt)
+    PoolPrizeList = list()    #(vector<tagMCTuijinbiPool> PoolPrizeList)// 台面奖池信息列表,每次都完整通知
     data = None
 
     def __init__(self):
@@ -48839,11 +48841,13 @@
     def ReadData(self, _lpData, _pos=0, _Len=0):
         self.Clear()
         _pos = self.Head.ReadData(_lpData, _pos)
-        self.AwardMoneyCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
-        for i in range(self.AwardMoneyCount):
-            temAwardMoneyList = tagMCTuijinbiMoney()
-            _pos = temAwardMoneyList.ReadData(_lpData, _pos)
-            self.AwardMoneyList.append(temAwardMoneyList)
+        self.DrawType,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.DrawCount,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.PoolPrizeCnt,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.PoolPrizeCnt):
+            temPoolPrizeList = tagMCTuijinbiPool()
+            _pos = temPoolPrizeList.ReadData(_lpData, _pos)
+            self.PoolPrizeList.append(temPoolPrizeList)
         return _pos
 
     def Clear(self):
@@ -48851,36 +48855,46 @@
         self.Head.Clear()
         self.Head.Cmd = 0xAA
         self.Head.SubCmd = 0x05
-        self.AwardMoneyCount = 0
-        self.AwardMoneyList = list()
+        self.DrawType = 0
+        self.DrawCount = 0
+        self.PoolPrizeCnt = 0
+        self.PoolPrizeList = list()
         return
 
     def GetLength(self):
         length = 0
         length += self.Head.GetLength()
         length += 1
-        for i in range(self.AwardMoneyCount):
-            length += self.AwardMoneyList[i].GetLength()
+        length += 4
+        length += 1
+        for i in range(self.PoolPrizeCnt):
+            length += self.PoolPrizeList[i].GetLength()
 
         return length
 
     def GetBuffer(self):
         data = ''
         data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
-        data = CommFunc.WriteBYTE(data, self.AwardMoneyCount)
-        for i in range(self.AwardMoneyCount):
-            data = CommFunc.WriteString(data, self.AwardMoneyList[i].GetLength(), self.AwardMoneyList[i].GetBuffer())
+        data = CommFunc.WriteBYTE(data, self.DrawType)
+        data = CommFunc.WriteDWORD(data, self.DrawCount)
+        data = CommFunc.WriteBYTE(data, self.PoolPrizeCnt)
+        for i in range(self.PoolPrizeCnt):
+            data = CommFunc.WriteString(data, self.PoolPrizeList[i].GetLength(), self.PoolPrizeList[i].GetBuffer())
         return data
 
     def OutputString(self):
         DumpString = '''
                                 Head:%s,
-                                AwardMoneyCount:%d,
-                                AwardMoneyList:%s
+                                DrawType:%d,
+                                DrawCount:%d,
+                                PoolPrizeCnt:%d,
+                                PoolPrizeList:%s
                                 '''\
                                 %(
                                 self.Head.OutputString(),
-                                self.AwardMoneyCount,
+                                self.DrawType,
+                                self.DrawCount,
+                                self.PoolPrizeCnt,
                                 "..."
                                 )
         return DumpString
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
index 86c4180..2727e40 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -4309,6 +4309,9 @@
 # 至尊卡1折折扣,英文版专用
 Def_PDict_TuiJinbiBanTime = "TuiJinbiBanTime"  # 推金币超级推板购买时间戳
 Def_PDict_TuiJinbiMoney = "TuiJinbiMoney_%s"  # 推金币累计获得货币数,参数(货币类型)
+Def_PDict_TuiJinbiSign = "TuiJinbiSign"  # 玩家标记: 0-未标记;1-新玩家;2-老版本前端玩家
+Def_PDict_TuiJinbiCnt = "TuiJinbiCnt"  # 累计推金币次数
+Def_PDict_TuiJinbiPool = "TuiJinbiPool_%s"  # 推金币台面奖池奖励类型数,参数(奖励类型)
 
 # 成就 Def_PDictType_Success
 Def_PDict_Success_AwardRecord = "Succ_AwardRecord_%s" # 成就领奖记录,参数(key编号),按索引位存储0-未领,1-已领
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
index d7ff35e..0a6ecb5 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -48785,11 +48785,11 @@
 #------------------------------------------------------
 # AA 05 推金币信息 #tagMCTuijinbiInfo
 
-class  tagMCTuijinbiMoney(Structure):
+class  tagMCTuijinbiPool(Structure):
     _pack_ = 1
     _fields_ = [
-                  ("MoneyType", c_ubyte),    
-                  ("MoneyValue", c_int),    
+                  ("PrizeType", c_ubyte),    # 台面奖励类型: 1-金币;2-仙玉币
+                  ("PrizeCount", c_int),    # 数量,每次都同步台面的总数量
                   ]
 
     def __init__(self):
@@ -48802,32 +48802,34 @@
         return _pos + self.GetLength()
 
     def Clear(self):
-        self.MoneyType = 0
-        self.MoneyValue = 0
+        self.PrizeType = 0
+        self.PrizeCount = 0
         return
 
     def GetLength(self):
-        return sizeof(tagMCTuijinbiMoney)
+        return sizeof(tagMCTuijinbiPool)
 
     def GetBuffer(self):
         return string_at(addressof(self), self.GetLength())
 
     def OutputString(self):
         DumpString = '''// AA 05 推金币信息 //tagMCTuijinbiInfo:
-                                MoneyType:%d,
-                                MoneyValue:%d
+                                PrizeType:%d,
+                                PrizeCount:%d
                                 '''\
                                 %(
-                                self.MoneyType,
-                                self.MoneyValue
+                                self.PrizeType,
+                                self.PrizeCount
                                 )
         return DumpString
 
 
 class  tagMCTuijinbiInfo(Structure):
     Head = tagHead()
-    AwardMoneyCount = 0    #(BYTE AwardMoneyCount)
-    AwardMoneyList = list()    #(vector<tagMCTuijinbiMoney> AwardMoneyList)// 累计获得货币信息列表
+    DrawType = 0    #(BYTE DrawType)// 本次抽奖奖励类型,为0时表示非抽奖同步;1-金币;2-仙玉币;3-红包;4-超级奖励
+    DrawCount = 0    #(DWORD DrawCount)// 本次抽奖奖励数量
+    PoolPrizeCnt = 0    #(BYTE PoolPrizeCnt)
+    PoolPrizeList = list()    #(vector<tagMCTuijinbiPool> PoolPrizeList)// 台面奖池信息列表,每次都完整通知
     data = None
 
     def __init__(self):
@@ -48839,11 +48841,13 @@
     def ReadData(self, _lpData, _pos=0, _Len=0):
         self.Clear()
         _pos = self.Head.ReadData(_lpData, _pos)
-        self.AwardMoneyCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
-        for i in range(self.AwardMoneyCount):
-            temAwardMoneyList = tagMCTuijinbiMoney()
-            _pos = temAwardMoneyList.ReadData(_lpData, _pos)
-            self.AwardMoneyList.append(temAwardMoneyList)
+        self.DrawType,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.DrawCount,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.PoolPrizeCnt,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.PoolPrizeCnt):
+            temPoolPrizeList = tagMCTuijinbiPool()
+            _pos = temPoolPrizeList.ReadData(_lpData, _pos)
+            self.PoolPrizeList.append(temPoolPrizeList)
         return _pos
 
     def Clear(self):
@@ -48851,36 +48855,46 @@
         self.Head.Clear()
         self.Head.Cmd = 0xAA
         self.Head.SubCmd = 0x05
-        self.AwardMoneyCount = 0
-        self.AwardMoneyList = list()
+        self.DrawType = 0
+        self.DrawCount = 0
+        self.PoolPrizeCnt = 0
+        self.PoolPrizeList = list()
         return
 
     def GetLength(self):
         length = 0
         length += self.Head.GetLength()
         length += 1
-        for i in range(self.AwardMoneyCount):
-            length += self.AwardMoneyList[i].GetLength()
+        length += 4
+        length += 1
+        for i in range(self.PoolPrizeCnt):
+            length += self.PoolPrizeList[i].GetLength()
 
         return length
 
     def GetBuffer(self):
         data = ''
         data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
-        data = CommFunc.WriteBYTE(data, self.AwardMoneyCount)
-        for i in range(self.AwardMoneyCount):
-            data = CommFunc.WriteString(data, self.AwardMoneyList[i].GetLength(), self.AwardMoneyList[i].GetBuffer())
+        data = CommFunc.WriteBYTE(data, self.DrawType)
+        data = CommFunc.WriteDWORD(data, self.DrawCount)
+        data = CommFunc.WriteBYTE(data, self.PoolPrizeCnt)
+        for i in range(self.PoolPrizeCnt):
+            data = CommFunc.WriteString(data, self.PoolPrizeList[i].GetLength(), self.PoolPrizeList[i].GetBuffer())
         return data
 
     def OutputString(self):
         DumpString = '''
                                 Head:%s,
-                                AwardMoneyCount:%d,
-                                AwardMoneyList:%s
+                                DrawType:%d,
+                                DrawCount:%d,
+                                PoolPrizeCnt:%d,
+                                PoolPrizeList:%s
                                 '''\
                                 %(
                                 self.Head.OutputString(),
-                                self.AwardMoneyCount,
+                                self.DrawType,
+                                self.DrawCount,
+                                self.PoolPrizeCnt,
                                 "..."
                                 )
         return DumpString
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Tuijinbi.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Tuijinbi.py
new file mode 100644
index 0000000..3d56e4a
--- /dev/null
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Tuijinbi.py
@@ -0,0 +1,59 @@
+#!/usr/bin/python
+# -*- coding: GBK -*-
+#-------------------------------------------------------------------------------
+#
+##@package GM.Commands.Tuijinbi
+#
+# @todo:推金币
+# @author hxp
+# @date 2024-12-13
+# @version 1.0
+#
+# 详细描述: 推金币
+#
+#-------------------------------------------------------------------------------
+#"""Version = 2024-12-13 18:00"""
+#-------------------------------------------------------------------------------
+
+import GameWorld
+import PlayerControl
+import PlayerSuperDiscount
+import ChConfig
+
+## GM命令执行入口
+#  @param curPlayer 当前玩家
+#  @param msgList 参数列表
+#  @return None
+#  @remarks 函数详细说明.
+def OnExec(curPlayer, msgList):
+    
+    if not msgList:
+        GameWorld.DebugAnswer(curPlayer, "重置推金币: Tuijinbi 0 [新老玩家标记]")
+        GameWorld.DebugAnswer(curPlayer, "设置台面值: Tuijinbi p 类型 数量 类型 数量")
+        GameWorld.DebugAnswer(curPlayer, "新老玩家标记: 1-新玩家; 2-老玩家")
+        return
+    
+    value = msgList[0]
+    if value == 0:
+        sign = msgList[1] if len(msgList) > 1 else PlayerSuperDiscount.Sign_NewVerPlayer
+        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TuiJinbiSign, sign)
+        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TuiJinbiCnt, 0)
+        for moneyType in PlayerSuperDiscount.PrizeMoneyTypeList:
+            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TuiJinbiMoney % moneyType, 0)
+        for prizeType in [PlayerSuperDiscount.PrizeType_Gold, PlayerSuperDiscount.PrizeType_Xianyu]:
+            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TuiJinbiPool % prizeType, 0)
+        PlayerSuperDiscount.SyncTuijinbiInfo(curPlayer)
+        GameWorld.DebugAnswer(curPlayer, "重置推金币玩家标记:%s" % sign)
+    
+    elif value == "p":
+        setValueList = msgList[1:]
+        for index in range(len(setValueList) / 2):
+            prizeType = setValueList[index * 2]
+            prizeValue = setValueList[index * 2 + 1]
+            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TuiJinbiPool % prizeType, prizeValue)
+            GameWorld.DebugAnswer(curPlayer, "设置台面Type:%s,个数:%s" % (prizeType, prizeValue))
+        PlayerSuperDiscount.SyncTuijinbiInfo(curPlayer)
+                
+    return
+
+
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 ecbf8e8..4a39626 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerSuperDiscount.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerSuperDiscount.py
@@ -20,11 +20,47 @@
 import PlayerControl
 import ChPyNetSendPack
 import NetPackCommon
+import ItemControler
+import IPY_GameWorld
 import ShareDefine
 import ChConfig
+import random
 import time
 
+PrizeType_Gold = 1 # 金币 = 10万铜钱
+PrizeType_Xianyu = 2 # 仙玉币 = 10仙玉
+PrizeType_Redpack = 3 # 红包
+PrizeType_Super = 4 # 超级奖励
+
+PrizeMoneyTypeList = [1, 2, 3] # 本功能可产出的货币类型
+
+Sign_NewVerPlayer = 1 # 新版本后端处理玩家 
+Sign_OldVerPlayer = 2 # 老版本前端处理玩家 
+
+def __InitOldPlayerTjb(curPlayer):
+    ## 老玩家推金币默认奖池处理
+    if curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TuiJinbiSign):
+        #GameWorld.DebugLog("推金币玩家标记已处理: %s" % curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TuiJinbiSign), curPlayer.GetPlayerID())
+        return
+    sign = Sign_NewVerPlayer
+    for moneyType in PrizeMoneyTypeList:
+        if curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TuiJinbiMoney % moneyType):
+            sign = Sign_OldVerPlayer # 有实际获得过奖励视为老玩家
+            break
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TuiJinbiSign, sign)
+    if sign != Sign_OldVerPlayer:
+        return
+    # 给老玩家初始台面
+    initPrizeList = IpyGameDataPY.GetFuncEvalCfg("EnSuperDiscount", 5)
+    for prizeType, prizeCount in initPrizeList:
+        if curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TuiJinbiPool % prizeType):
+            continue
+        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TuiJinbiPool % prizeType, prizeCount)
+    GameWorld.Log("推金币老玩家设置初始台面数据: %s" % str(initPrizeList), curPlayer.GetPlayerID())
+    return
+
 def OnPlayerLogin(curPlayer):
+    __InitOldPlayerTjb(curPlayer)
     SyncTuijinbiInfo(curPlayer)
     return
 
@@ -79,62 +115,138 @@
 #struct     tagCMTuijinbi
 #{
 #    tagHead        Head;
-#    BYTE        OpType;    // 操作类型: 0-抽奖;1-获得金币;2-激活至尊卡
-#    DWORD        Value1;    // 类型1时为货币类型
-#    DWORD        Value2;    // 类型1时为货币数值
+#    BYTE        OpType;    // 操作类型: 0-抽奖;1-获得奖励;2-激活至尊卡
+#    DWORD        Value1;    // 类型1时为奖励类型
+#    DWORD        Value2;    // 类型1时为奖励数值
 #};
 def OnTuijinbi(index, clientData, tick):
     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
-    playerID = curPlayer.GetPlayerID()
     opType = clientData.OpType
     value1 = clientData.Value1
     value2 = clientData.Value2
     
     if opType == 0:
-        # 直接扣除次数,仅作为记录用,抽奖逻辑前端自己控制
-        PlayerControl.PayMoney(curPlayer, ShareDefine.TYPE_Price_Tuijinbi, 1, isNotify=False)
+        __DoDraw(curPlayer)
         
     elif opType == 1:
-        moneyType = value1
-        moneyValue = value2
-        moneyUpperLimitDict = IpyGameDataPY.GetFuncEvalCfg("EnSuperDiscount", 3, {})
-        if moneyType not in moneyUpperLimitDict:
-            GameWorld.DebugLog("推金币没有配置获得该货币奖励上限! moneyType=%s" % moneyType, playerID)
-            return
-        moneyUpperLimit = moneyUpperLimitDict[moneyType]
-        moneyTotal = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TuiJinbiMoney % moneyType)
-        updMoneyTotal = min(moneyTotal + moneyValue, moneyUpperLimit, ChConfig.Def_UpperLimit_DWord)
-        giveMoney = updMoneyTotal - moneyTotal
-        if giveMoney <= 0:
-            GameWorld.ErrLog("推金币已达奖励上限! moneyType=%s,moneyTotal=%s" % (moneyType, moneyTotal), playerID)
-            return
-        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TuiJinbiMoney % moneyType, updMoneyTotal)
-        GameWorld.DebugLog("更新推金币奖励: moneyType=%s,moneyValue=%s,giveMoney=%s,updMoneyTotal=%s" 
-                           % (moneyType, moneyValue, giveMoney, updMoneyTotal), playerID)
-        PlayerControl.GiveMoney(curPlayer, moneyType, giveMoney, "Tuijinbi")
-        SyncTuijinbiInfo(curPlayer)
+        __DoGivePrize(curPlayer, value1, value2)
         
     elif opType == 2:
         __DoActiveSuperDiscount(curPlayer)
         
     return
 
-def SyncTuijinbiInfo(curPlayer):
-    awardMoneyList = []
-    moneyUpperLimitDict = IpyGameDataPY.GetFuncEvalCfg("EnSuperDiscount", 3, {})
-    for moneyType in moneyUpperLimitDict.keys():
-        moneyTotal = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TuiJinbiMoney % moneyType)
-        if not moneyTotal:
-            continue
-        moneyInfo = ChPyNetSendPack.tagMCTuijinbiMoney()
-        moneyInfo.MoneyType = moneyType
-        moneyInfo.MoneyValue = moneyTotal
-        awardMoneyList.append(moneyInfo)
-    if not awardMoneyList:
+def __DoDraw(curPlayer):
+    ## 抽奖
+    
+    if not PlayerControl.HaveMoney(curPlayer, ShareDefine.TYPE_Price_Tuijinbi, 1):
         return
+    
+    playerID = curPlayer.GetPlayerID()
+    prizeSetList = IpyGameDataPY.GetFuncEvalCfg("PushCoin", 1) # 奖池 [[类型, 概率, 数量], ...]
+    prizeRateList = []
+    for setInfo in prizeSetList:
+        prizeRateList.append([setInfo[1], [setInfo[0], setInfo[2]]])
+    playerSign = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TuiJinbiSign)
+    tuijinbiCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TuiJinbiCnt)
+    GameWorld.DebugLog("推金币抽奖: playerSign=%s,tuijinbiCnt=%s,prizeRateList=%s" % (playerSign, tuijinbiCnt, prizeRateList), playerID)
+    
+    addPoolPrizeInfo = {} # 增加台面奖池信息
+    drawInfo = GameWorld.GetResultByRandomList(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)
+            
+        # 首次附加默认初始奖励
+        initPrizeList = IpyGameDataPY.GetFuncEvalCfg("EnSuperDiscount", 5)
+        for prizeType, prizeCnt in initPrizeList:
+            addPoolPrizeInfo[prizeType] = prizeCnt
+        GameWorld.DebugLog("新手首次推额外奖励: %s" % addPoolPrizeInfo, playerID)
+        
+    if not drawInfo or len(drawInfo) != 2:
+        return
+    drawType, drawCount = drawInfo
+    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)
+        if randMoney and len(randMoney) == 2:
+            __GiveMoney(curPlayer, randMoney[0], randMoney[1], True)
+            
+    # 超级奖励
+    elif drawType == PrizeType_Super:
+        randPrizeList = IpyGameDataPY.GetFuncEvalCfg("PushCoin", 2)
+        randPrize = random.choice(randPrizeList)
+        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)
+        addPoolPrizeInfo[drawType] = addPoolPrizeInfo.get(drawType, 0) + drawCount
+            
+    for prizeType, addCnt in addPoolPrizeInfo.items():
+        curCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TuiJinbiPool % prizeType)
+        updCnt = curCnt + addCnt
+        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TuiJinbiPool % prizeType, updCnt)
+        GameWorld.DebugLog("推金币更新台面: prizeType=%s,curCnt=%s,addCnt=%s,updCnt=%s" % (prizeType, curCnt, addCnt, updCnt), playerID)
+        
+    tuijinbiCnt += 1
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TuiJinbiCnt, tuijinbiCnt)
+    GameWorld.DebugLog("更新累计推金币次数: %s" % (tuijinbiCnt), playerID)
+    SyncTuijinbiInfo(curPlayer, drawType, drawCount)
+    return
+
+def __DoGivePrize(curPlayer, prizeType, prizeCount):
+    if prizeType not in [PrizeType_Gold, PrizeType_Xianyu]:
+        return
+    curCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TuiJinbiPool % prizeType)
+    giveCnt = min(prizeCount, curCnt)
+    if not giveCnt:
+        return
+    updCnt = curCnt - giveCnt
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TuiJinbiPool % prizeType, updCnt)
+    GameWorld.DebugLog("掉落更新台面: prizeType=%s,prizeCount=%s,curCnt=%s,giveCnt=%s,updCnt=%s" 
+                       % (prizeType, prizeCount, curCnt, giveCnt, updCnt), curPlayer.GetPlayerID())
+    if prizeType == PrizeType_Gold:
+        __GiveMoney(curPlayer, IPY_GameWorld.TYPE_Price_Silver_Money, 100000 * giveCnt)
+    elif prizeType == PrizeType_Xianyu:
+        __GiveMoney(curPlayer, IPY_GameWorld.TYPE_Price_Gold_Money, 10 * giveCnt)
+    SyncTuijinbiInfo(curPlayer)
+    return
+
+def __GiveMoney(curPlayer, moneyType, moneyValue, notifyAward=False):
+    moneyTotal = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TuiJinbiMoney % moneyType)
+    updMoneyTotal = min(moneyTotal + moneyValue, ChConfig.Def_UpperLimit_DWord)
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TuiJinbiMoney % moneyType, updMoneyTotal)
+    GameWorld.DebugLog("更新推金币累计奖励货币: moneyType=%s,moneyValue=%s,updMoneyTotal=%s" 
+                       % (moneyType, moneyValue, updMoneyTotal), curPlayer.GetPlayerID())
+    PlayerControl.GiveMoney(curPlayer, moneyType, moneyValue, "Tuijinbi")
+    if notifyAward:
+        ItemControler.NotifyGiveAwardInfo(curPlayer, [], "Tuijinbi", moneyInfo={moneyType:moneyValue})
+    return
+
+def SyncTuijinbiInfo(curPlayer, drawType=0, drawCount=0):
+    poolPrizeList = [] # 台面信息
+    for prizeType in [PrizeType_Gold, PrizeType_Xianyu]:
+        prizeCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TuiJinbiPool % prizeType)
+        if not prizeCount:
+            continue
+        poolInfo = ChPyNetSendPack.tagMCTuijinbiPool()
+        poolInfo.PrizeType = prizeType
+        poolInfo.PrizeCount = prizeCount
+        poolPrizeList.append(poolInfo)
+        
     clientPack = ChPyNetSendPack.tagMCTuijinbiInfo()
-    clientPack.AwardMoneyList = awardMoneyList
-    clientPack.AwardMoneyCount = len(clientPack.AwardMoneyList)
+    clientPack.DrawType = drawType
+    clientPack.DrawCount = drawCount
+    clientPack.PoolPrizeList = poolPrizeList
+    clientPack.PoolPrizeCnt = len(clientPack.PoolPrizeList)
     NetPackCommon.SendFakePack(curPlayer, clientPack)
     return
 

--
Gitblit v1.8.0