From c85a609a308ef971bc4774a5d4c9d7e3203f5708 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期五, 04 六月 2021 19:02:40 +0800
Subject: [PATCH] 8971 【主干】【BT2】仙玉和灵石增加支持负数

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py |   89 ++++++++++++++++++++++++++++++++++++--------
 1 files changed, 72 insertions(+), 17 deletions(-)

diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
index f683c33..a8fe4ce 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
@@ -2824,6 +2824,58 @@
     
     return 0
 
+def GetMoneyReal(curPlayer, moneyType):
+    ## 获取货币实际值,支持负值
+    moneyMinus = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MoneyMinus % moneyType)
+    if moneyMinus != 0:
+        return -moneyMinus
+    return GetMoney(curPlayer, moneyType)
+
+def SetMoney(curPlayer, moneyType, value):
+    ## 设置货币值,支持负值
+    if moneyType in ShareDefine.MoneyMinusRefreshDict:
+        moneyMinus = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MoneyMinus % moneyType)
+        if value < 0:
+            if moneyMinus != value:
+                SetMoneyMinus(curPlayer, moneyType, value)
+            value = 0
+        else:
+            if moneyMinus != 0:
+                SetMoneyMinus(curPlayer, moneyType, 0)
+                
+    #金子
+    if moneyType == IPY_GameWorld.TYPE_Price_Gold_Money:
+        curPlayer.SetGold(value)
+        
+    #金票
+    elif moneyType == IPY_GameWorld.TYPE_Price_Gold_Paper:
+        curPlayer.SetGoldPaper(value)
+        
+    #银子
+    elif moneyType == IPY_GameWorld.TYPE_Price_Silver_Money:
+        SetSilver(curPlayer, value)
+        
+    #银票
+    elif moneyType == IPY_GameWorld.TYPE_Price_Silver_Paper:
+        curPlayer.SetSilverPaper(value)
+        
+    #自定义货币
+    elif moneyType in ShareDefine.TYPE_Price_CurrencyDict:
+        SetPlayerCurrency(curPlayer, moneyType, value)
+        
+    return
+
+def SetMoneyMinus(curPlayer, moneyType, value):
+    value = abs(value) # 存值及通知使用正数
+    NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_MoneyMinus % moneyType, value)
+    #通知客户端
+    if moneyType not in ShareDefine.MoneyMinusRefreshDict:
+        return
+    refreshType = ShareDefine.MoneyMinusRefreshDict[moneyType]
+    if refreshType != None:
+        SendPropertyRefresh(curPlayer, refreshType, value)
+    return
+
 ## 获取玩家仓库金钱数
 #  @param curPlayer: 玩家实例
 #  @param moneyType: 金钱类型
@@ -2997,9 +3049,10 @@
 # @param costType ,消费点类型
 # @param infoDict ,扩展信息, 子消费对象可以通过设置ChConfig.Def_Cost_Reason_SonKey key值
 # @param quantity ,数量
+# @param isMinus ,是否允许扣成负值
 # @return 返回值真, 付款成功
 # @remarks 玩家付款
-def PayMoney(curPlayer, type_Price, price, costType=ChConfig.Def_Cost_Unknown, infoDict={}, quantity=1, costVIPGold= -1, isNotify=True):
+def PayMoney(curPlayer, type_Price, price, costType=ChConfig.Def_Cost_Unknown, infoDict={}, quantity=1, costVIPGold= -1, isNotify=True, isMinus=False):
     if price == 0:
         return True
     if price < 0:
@@ -3012,12 +3065,12 @@
         
     #金子支付
     if type_Price == IPY_GameWorld.TYPE_Price_Gold_Money:
-        curPlayerGold = curPlayer.GetGold()
-        if curPlayerGold < price:
+        curPlayerGold = GetMoneyReal(curPlayer, type_Price)
+        if curPlayerGold < price and not isMinus:
             NotifyCode(curPlayer, "GoldErr")
             return False
         updPlayerGold = curPlayerGold - price
-        curPlayer.SetGold(updPlayerGold)
+        SetMoney(curPlayer, type_Price, updPlayerGold)
         
         curBourseMoney = GetMoney(curPlayer, ShareDefine.TYPE_Price_BourseMoney)
         updBourseMoney = curBourseMoney
@@ -3027,18 +3080,20 @@
         #其他如果当前金子比交易额度还少,则强制调整交易额度为当前金子数(这种情况一般是非交易所消费的,需要同步扣除交易所可购买额度)
         elif updPlayerGold < updBourseMoney:
             updBourseMoney = updPlayerGold
+        updBourseMoney = max(0, updBourseMoney)
         if updBourseMoney != curBourseMoney:
             SetPlayerCurrency(curPlayer, ShareDefine.TYPE_Price_BourseMoney, updBourseMoney)
         infoDict["BourseMoney"] = updBourseMoney
         
     #金票支付
     elif type_Price == IPY_GameWorld.TYPE_Price_Gold_Paper:
-        curPlayerGoldPaper = curPlayer.GetGoldPaper()
-        if curPlayerGoldPaper < price:
+        curPlayerGoldPaper = GetMoneyReal(curPlayer, type_Price)
+        if curPlayerGoldPaper < price and not isMinus:
             NotifyCode(curPlayer, "GoldPaperErr")
             return False
-        curPlayer.SetGoldPaper(curPlayerGoldPaper - price)
-       
+        updGoldPaper = curPlayerGoldPaper - price
+        SetMoney(curPlayer, type_Price, updGoldPaper)
+        
     #银子支付
     elif type_Price == IPY_GameWorld.TYPE_Price_Silver_Money:
         curPlayerSilver = GetSilver(curPlayer)
@@ -3272,24 +3327,24 @@
         return True
         
     if priceType == IPY_GameWorld.TYPE_Price_Gold_Money:
-        if curPlayer.GetGold() + value > ChConfig.Def_PlayerTotalMoney_Gold:
+        updPlayerGold = GetMoneyReal(curPlayer, priceType) + value
+        if updPlayerGold > ChConfig.Def_PlayerTotalMoney_Gold:
             #超过金钱上限
             NotifyCode(curPlayer, "MoneyIsFull", [priceType])
             return
+        SetMoney(curPlayer, priceType, updPlayerGold)
         
-        curPlayer.SetGold(curPlayer.GetGold() + value)
+        if isGiveBourseMoney and updPlayerGold > 0:
+            GiveMoney(curPlayer, ShareDefine.TYPE_Price_BourseMoney, min(value, updPlayerGold))
+        addDataDict["BourseMoney"] = GetMoney(curPlayer, ShareDefine.TYPE_Price_BourseMoney)
         
-        if isGiveBourseMoney:
-            GiveMoney(curPlayer, ShareDefine.TYPE_Price_BourseMoney, value)
-            addDataDict["BourseMoney"] = GetMoney(curPlayer, ShareDefine.TYPE_Price_BourseMoney)
-            
     elif priceType == IPY_GameWorld.TYPE_Price_Gold_Paper:
-        if curPlayer.GetGoldPaper() + value > ChConfig.Def_PlayerTotalMoney_Gold:
+        updPlayerGoldPaper = GetMoneyReal(curPlayer, priceType)  + value
+        if updPlayerGoldPaper > ChConfig.Def_PlayerTotalMoney_Gold:
             #超过金钱上限
             NotifyCode(curPlayer, "MoneyIsFull", [priceType])
             return
-        
-        curPlayer.SetGoldPaper(curPlayer.GetGoldPaper() + value)
+        SetMoney(curPlayer, priceType, updPlayerGoldPaper)
         
     elif priceType == IPY_GameWorld.TYPE_Price_Silver_Money:
         # 金钱支持超过20亿, 暂不做上限控制

--
Gitblit v1.8.0