From 32f4634e85aa6a476ee6e911cc5a81a64c912bd6 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期三, 20 九月 2023 17:52:44 +0800
Subject: [PATCH] 9943 【主干】【BT0.1】货币A补
---
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/FunctionNPCCommon.py | 5 +
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini | 6 +
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py | 60 +++++++++++++++
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py | 34 ++++++++
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py | 60 +++++++++++++++
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py | 48 +++++++++++-
6 files changed, 207 insertions(+), 6 deletions(-)
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py
index 4a1280f..ffcc7ac 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py
@@ -4775,6 +4775,66 @@
#------------------------------------------------------
+# A1 20 货币兑换 #tagCMMoneyExchange
+
+class tagCMMoneyExchange(Structure):
+ _pack_ = 1
+ _fields_ = [
+ ("Cmd", c_ubyte),
+ ("SubCmd", c_ubyte),
+ ("SrcMoneyType", c_ubyte), # 源货币类型
+ ("TagMoneyType", c_ubyte), # 目标货币类型
+ ("ExchangeValue", c_int), # 兑换数量(消耗源货币的数量)
+ ]
+
+ def __init__(self):
+ self.Clear()
+ self.Cmd = 0xA1
+ self.SubCmd = 0x20
+ return
+
+ def ReadData(self, stringData, _pos=0, _len=0):
+ self.Clear()
+ memmove(addressof(self), stringData[_pos:], self.GetLength())
+ return _pos + self.GetLength()
+
+ def Clear(self):
+ self.Cmd = 0xA1
+ self.SubCmd = 0x20
+ self.SrcMoneyType = 0
+ self.TagMoneyType = 0
+ self.ExchangeValue = 0
+ return
+
+ def GetLength(self):
+ return sizeof(tagCMMoneyExchange)
+
+ def GetBuffer(self):
+ return string_at(addressof(self), self.GetLength())
+
+ def OutputString(self):
+ DumpString = '''// A1 20 货币兑换 //tagCMMoneyExchange:
+ Cmd:%s,
+ SubCmd:%s,
+ SrcMoneyType:%d,
+ TagMoneyType:%d,
+ ExchangeValue:%d
+ '''\
+ %(
+ self.Cmd,
+ self.SubCmd,
+ self.SrcMoneyType,
+ self.TagMoneyType,
+ self.ExchangeValue
+ )
+ return DumpString
+
+
+m_NAtagCMMoneyExchange=tagCMMoneyExchange()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMMoneyExchange.Cmd,m_NAtagCMMoneyExchange.SubCmd))] = m_NAtagCMMoneyExchange
+
+
+#------------------------------------------------------
# A1 01 玩家电脑信息 #tagCMPCInfo
class tagCMPCInfo(Structure):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini
index 35f59c9..aa26923 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini
@@ -414,7 +414,7 @@
Writer = hxp
Releaser = hxp
RegType = 0
-RegisterPackCount = 24
+RegisterPackCount = 25
PacketCMD_1 = 0xA5
PacketSubCMD_1 = 0x04
@@ -512,6 +512,10 @@
PacketSubCMD_24=0x21
PacketCallFunc_24=OnChangeJob
+PacketCMD_25=0xA1
+PacketSubCMD_25=0x20
+PacketCallFunc_25=OnMoneyExchange
+
;购买相关的
[BuySomething]
ScriptName = Event\EventSrc\Operate_PlayerBuyZhenQi.py
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
index 4a1280f..ffcc7ac 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
@@ -4775,6 +4775,66 @@
#------------------------------------------------------
+# A1 20 货币兑换 #tagCMMoneyExchange
+
+class tagCMMoneyExchange(Structure):
+ _pack_ = 1
+ _fields_ = [
+ ("Cmd", c_ubyte),
+ ("SubCmd", c_ubyte),
+ ("SrcMoneyType", c_ubyte), # 源货币类型
+ ("TagMoneyType", c_ubyte), # 目标货币类型
+ ("ExchangeValue", c_int), # 兑换数量(消耗源货币的数量)
+ ]
+
+ def __init__(self):
+ self.Clear()
+ self.Cmd = 0xA1
+ self.SubCmd = 0x20
+ return
+
+ def ReadData(self, stringData, _pos=0, _len=0):
+ self.Clear()
+ memmove(addressof(self), stringData[_pos:], self.GetLength())
+ return _pos + self.GetLength()
+
+ def Clear(self):
+ self.Cmd = 0xA1
+ self.SubCmd = 0x20
+ self.SrcMoneyType = 0
+ self.TagMoneyType = 0
+ self.ExchangeValue = 0
+ return
+
+ def GetLength(self):
+ return sizeof(tagCMMoneyExchange)
+
+ def GetBuffer(self):
+ return string_at(addressof(self), self.GetLength())
+
+ def OutputString(self):
+ DumpString = '''// A1 20 货币兑换 //tagCMMoneyExchange:
+ Cmd:%s,
+ SubCmd:%s,
+ SrcMoneyType:%d,
+ TagMoneyType:%d,
+ ExchangeValue:%d
+ '''\
+ %(
+ self.Cmd,
+ self.SubCmd,
+ self.SrcMoneyType,
+ self.TagMoneyType,
+ self.ExchangeValue
+ )
+ return DumpString
+
+
+m_NAtagCMMoneyExchange=tagCMMoneyExchange()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMMoneyExchange.Cmd,m_NAtagCMMoneyExchange.SubCmd))] = m_NAtagCMMoneyExchange
+
+
+#------------------------------------------------------
# A1 01 玩家电脑信息 #tagCMPCInfo
class tagCMPCInfo(Structure):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/FunctionNPCCommon.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/FunctionNPCCommon.py
index 1baa9a2..9925c55 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/FunctionNPCCommon.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/FunctionNPCCommon.py
@@ -756,7 +756,10 @@
beforeMoney = PlayerControl.GetMoney(curPlayer, priceType)
infoDict = {"TotalItemList":totalItemList, "ClientBuyCount":clientBuyCount, "ShopType":shopType,
"ShopItemIndex":itemIndex, ChConfig.Def_Cost_Reason_SonKey:mainItemID}
- PlayerControl.PayMoney(curPlayer, priceType, itemPrice, ChConfig.Def_Cost_BuyStoreItem, infoDict, clientBuyCount)
+ if not PlayerControl.PayMoney(curPlayer, priceType, itemPrice, ChConfig.Def_Cost_BuyStoreItem, infoDict, clientBuyCount):
+ GameWorld.ErrLog("购买商城物品实际扣除货币时失败: itemIndex=%s,clientBuyCount=%s,priceType=%s,itemPrice=%s"
+ % (itemIndex, clientBuyCount, priceType, itemPrice))
+ return
afterMoney = PlayerControl.GetMoney(curPlayer, priceType)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
index 6f2ab3a..5f7dd80 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
@@ -262,6 +262,40 @@
return
+#// A1 20 货币兑换 #tagCMMoneyExchange
+#
+#struct tagCMMoneyExchange
+#{
+# tagHead Head;
+# BYTE SrcMoneyType; // 源货币类型
+# BYTE TagMoneyType; // 目标货币类型
+# DWORD ExchangeValue; // 兑换数量(消耗源货币的数量)
+#};
+def OnMoneyExchange(index, clientData, tick):
+ curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
+ srcMoneyType = clientData.SrcMoneyType
+ tagMoneyType = clientData.TagMoneyType
+ exchangeValue = clientData.ExchangeValue
+
+ exchangeMoneyInfo = IpyGameDataPY.GetFuncEvalCfg("EqualValueMoney", 1, {})
+ if str(srcMoneyType) not in exchangeMoneyInfo:
+ return
+ exchangeInfo = exchangeMoneyInfo[str(srcMoneyType)]
+ if tagMoneyType != exchangeInfo[0]:
+ return
+ multiple = exchangeInfo[1]
+ if exchangeValue <= 0:
+ return
+
+ if not PlayerControl.PayMoney(curPlayer, srcMoneyType, exchangeValue, "MoneyExchange"):
+ return
+
+ tagMoneyAdd = exchangeValue * multiple
+ PlayerControl.GiveMoney(curPlayer, tagMoneyType, tagMoneyAdd, "MoneyExchange")
+ GameWorld.Log("货币兑换: srcMoneyType=%s,exchangeValue=%s,tagMoneyType=%s,tagMoneyAdd=%s"
+ % (srcMoneyType, exchangeValue, tagMoneyType, tagMoneyAdd), curPlayer.GetPlayerID())
+ return
+
#// A1 21 转职业 #tagCMChangeJob
#
#struct tagCMChangeJob
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 fa809f8..3f8a707 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
@@ -3016,14 +3016,41 @@
GameWorld.Log("付费金钱异常 TYPE_Price = %s" % (TYPE_Price), curPlayer.GetPlayerID())
return False
+ if needMoneyCount < Price:
+ lackPrice = Price - needMoneyCount # 还缺多少钱
+ tagMoneyInfo = GetEqualMoneyInfo(TYPE_Price, lackPrice)
+ if tagMoneyInfo:
+ tagMoneyType, tagMoneyValue = tagMoneyInfo
+ if HaveMoney(curPlayer, tagMoneyType, tagMoneyValue, False):
+ GameWorld.DebugLog("HaveMoney可使用等价货币补足扣除: TYPE_Price=%s, Price=%s, lackPrice=%s, tagMoneyType=%s, tagMoneyValue=%s"
+ % (TYPE_Price, Price, lackPrice, tagMoneyType, tagMoneyValue), curPlayer.GetPlayerID())
+ return True
+
#---钱不够 返回假如果需要提示的话 提示信息---
if needMoneyCount < Price:
if needNotify and notifyCode:
NotifyCode(curPlayer, notifyCode)
+ GameWorld.DebugLog("货币不足: TYPE_Price=%s, Price=%s, curMoneyCount=%s" % (TYPE_Price, Price, needMoneyCount))
return False
return True
+def GetEqualMoneyInfo(moneyType, needValue):
+ equalMoneyInfo = IpyGameDataPY.GetFuncEvalCfg("EqualValueMoney", 2, {})
+ if str(moneyType) not in equalMoneyInfo:
+ return
+ tagMoneyType = equalMoneyInfo[str(moneyType)]
+ exchangeMoneyInfo = IpyGameDataPY.GetFuncEvalCfg("EqualValueMoney", 1, {})
+ if str(tagMoneyType) not in exchangeMoneyInfo:
+ return
+ exchangeInfo = exchangeMoneyInfo[str(tagMoneyType)]
+ if moneyType != exchangeInfo[0]:
+ return
+ multiple = exchangeInfo[1]
+ tagMoneyValue = int(math.ceil(needValue / float(multiple)))
+ #GameWorld.DebugLog("等价货币信息: moneyType=%s,needValue=%s,multiple=%s,tagMoneyType=%s,tagMoneyValue=%s"
+ # % (moneyType, needValue, multiple, tagMoneyType, tagMoneyValue))
+ return tagMoneyType, tagMoneyValue
#---------------------------------------------------------------------
##玩家是否有钱款
@@ -3086,6 +3113,7 @@
if price < 0:
GameWorld.Log('###---扣钱异常 = %s' % (price), curPlayer.GetPlayerID())
return False
+ lostMoney = price
#20190917 恢复绑玉
# if type_Price == IPY_GameWorld.TYPE_Price_Gold_Paper:
@@ -3143,19 +3171,31 @@
elif type_Price in ShareDefine.TYPE_Price_CurrencyDict:
curCurrency = GetPlayerCurrency(curPlayer, type_Price)
if curCurrency < price:
- return False
+ lostMoney = curCurrency
+ lackPrice = price - curCurrency # 还缺多少钱
+ tagMoneyInfo = GetEqualMoneyInfo(type_Price, lackPrice)
+ if tagMoneyInfo:
+ tagMoneyType, tagMoneyValue = tagMoneyInfo
+ if not PayMoney(curPlayer, tagMoneyType, tagMoneyValue, costType, infoDict, quantity, costVIPGold, isNotify, isMinus):
+ #GameWorld.Log("等价货币也不足")
+ return False
+ GameWorld.Log("等价货币补足扣除: type_Price%s, price=%s, curCurrency=%s, lackPrice=%s, tagMoneyType=%s, tagMoneyValue=%s"
+ % (type_Price, price, curCurrency, lackPrice, tagMoneyType, tagMoneyValue), curPlayer.GetPlayerID())
+ else:
+ #GameWorld.Log("没有等价货币,无法扣除")
+ return False
#有足够的钱支付
- SetPlayerCurrency(curPlayer, type_Price, curCurrency - price)
+ SetPlayerCurrency(curPlayer, type_Price, curCurrency - lostMoney)
else:
GameWorld.Log("付费金钱异常 type_Price = %s" % (type_Price), curPlayer.GetPlayerID())
return False
#付款以后后续操作
- __PayMoneyAfter(curPlayer, type_Price, price, costType, infoDict, quantity, costVIPGold)
+ __PayMoneyAfter(curPlayer, type_Price, lostMoney, costType, infoDict, quantity, costVIPGold)
#通知客户端失去金钱
if isNotify:
- NotifyCode(curPlayer, "LostMoney", [type_Price, price])
+ NotifyCode(curPlayer, "LostMoney", [type_Price, lostMoney])
return True
## 付款以后后续操作
--
Gitblit v1.8.0