From afd50c42da5cda925bdd8770a1d86ac79090b454 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期一, 29 十二月 2025 20:50:08 +0800
Subject: [PATCH] 121 【武将】武将系统-服务端(心愿修改支持心愿卡;)
---
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py | 19 ++
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py | 107 +++++++++++--
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py | 14 +
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTreasure.py | 310 +++++++++++++++++++++++++++-----------
PySysDB/PySysDBPY.h | 6
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py | 8
6 files changed, 344 insertions(+), 120 deletions(-)
diff --git a/PySysDB/PySysDBPY.h b/PySysDB/PySysDBPY.h
index 2d956fa..b82fc66 100644
--- a/PySysDB/PySysDBPY.h
+++ b/PySysDB/PySysDBPY.h
@@ -1558,9 +1558,10 @@
dict NotifyKeyDict; //广播key
BYTE AwardMoneyType; //额外奖励货币类型
WORD AwardMoneyValue; //单次奖励货币数
- BYTE WishOutput; //心愿产出规则
BYTE WishReset; //心愿重置规则
dict WishLibSelect; //心愿库选择数
+ dict WishLibPubFreeCnt; //心愿库公共免费次数
+ dict WishLibCard; //心愿库心愿卡
};
//寻宝产出库表
@@ -1589,7 +1590,8 @@
DWORD ItemID; //物品ID
DWORD ItemCount; //物品个数
DWORD ItemWeight; //物品权重
- BYTE WishOutCnt; //心愿产出次数
+ BYTE IsWishItem; //心愿可选
+ BYTE WishOutCnt; //心愿独立产出次数
};
//寻宝累计次数奖励表
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
index 95a71ac..48c2757 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -474,7 +474,6 @@
# 直接转换为对应数值的物品ID列表
Def_ItemID_GoldMoney = 1 # 直接给仙玉/元宝
Def_ItemID_SilverMoney = 22 # 直接给铜钱
-Def_ItemID_FamilyContribution = 26 # 直接给战盟贡献点
Def_ItemID_SP = 29 # 直接给sp
Def_ItemID_GoldPaper = 30 # 直接给绑玉/灵石
Def_ItemID_RealmPoint = 24 # 直接给修行点
@@ -491,7 +490,7 @@
Def_ItemID_GongdePoint = 530 # 直接给功德点
Def_ItemID_FamilyFlagWarPoint = 540 # 直接给万界积分
Def_ItemID_TongTianPoint = 720 # 直接给通天令经验点
-Def_TransformItemIDList = [Def_ItemID_FamilyContribution, Def_ItemID_SP, Def_ItemID_GoldPaper,
+Def_TransformItemIDList = [Def_ItemID_SP, Def_ItemID_GoldPaper,
Def_ItemID_RealmPoint, Def_ItemID_SilverMoney, Def_ItemID_BossReborn, Def_ItemID_Ysog,
Def_ItemID_SoulDust, Def_ItemID_SoulSplinters, Def_ItemID_SoulCore, Def_ItemID_Honor, Def_ItemID_GoldMoney,
Def_ItemID_FuncSysPrivilege, Def_ItemID_FCPartyPoint, Def_ItemID_BTGMPoint, Def_ItemID_GuShenMoney,
@@ -3286,7 +3285,10 @@
Def_PDict_TreasureLuck = "TreasureLuck_%s" # 寻宝当前幸运值, 参数(寻宝类型)
Def_PDict_TreasureCntAward = "TreasureCntAward_%s" # 累计寻宝次数对应物品奖励领奖状态, 参数(寻宝类型)
Def_PDict_TreasureGridCnt = "TreasureGridCnt_%s_%s" # 格子对应累计产出次数, 参数(寻宝类型, 格子编号)
-Def_PDict_TreasureWish = "TreasureWish_%s_%s_%s" # 心愿物品产出次数, 参数(寻宝类型, 库ID, 选择编号索引) WishID*100+已产出次数
+Def_PDict_TreasureWishSelect = "TreasureWSel_%s_%s_%s" # 心愿物品选择记录, 参数(寻宝类型, 库ID, index) 已选择心愿物品ID
+Def_PDict_TreasureWishOut = "TreasureWOut_%s_%s" # 心愿物品已产出次数, 参数(寻宝类型, WishID)
+Def_PDict_TreasureWishLibOut = "TreasureWLibOut_%s_%s" # 心愿物品库已产出总次数, 参数(寻宝类型, 库ID)
+Def_PDict_TreasureWishUseItem = "TreasureWUItem_%s_%s" # 心愿物品库是否已启用, 参数(寻宝类型, 库ID)
Def_Player_Dict_LastAutoOpenPackTick = "LastAutoOpenPackTick219_%s" #上一次自动购买的tick<背包类型>
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
index 07fd443..0c0a1e0 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
@@ -7290,6 +7290,8 @@
TreasureType = 0 #(BYTE TreasureType)//寻宝类型
WishCnt = 0 #(BYTE WishCnt)
WishIDList = list() #(vector<DWORD> WishIDList)// 选择的寻宝物品库中的数据ID,注意不是库ID
+ WishCardUseCnt = 0 #(BYTE WishCardUseCnt)
+ WishCardUseLibIDList = list() #(vector<WORD> WishCardUseLibIDList)// 使用心愿卡的库ID列表
data = None
def __init__(self):
@@ -7306,6 +7308,10 @@
for i in range(self.WishCnt):
value,_pos=CommFunc.ReadDWORD(_lpData,_pos)
self.WishIDList.append(value)
+ self.WishCardUseCnt,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+ for i in range(self.WishCardUseCnt):
+ value,_pos=CommFunc.ReadWORD(_lpData,_pos)
+ self.WishCardUseLibIDList.append(value)
return _pos
def Clear(self):
@@ -7316,6 +7322,8 @@
self.TreasureType = 0
self.WishCnt = 0
self.WishIDList = list()
+ self.WishCardUseCnt = 0
+ self.WishCardUseLibIDList = list()
return
def GetLength(self):
@@ -7324,6 +7332,8 @@
length += 1
length += 1
length += 4 * self.WishCnt
+ length += 1
+ length += 2 * self.WishCardUseCnt
return length
@@ -7334,6 +7344,9 @@
data = CommFunc.WriteBYTE(data, self.WishCnt)
for i in range(self.WishCnt):
data = CommFunc.WriteDWORD(data, self.WishIDList[i])
+ data = CommFunc.WriteBYTE(data, self.WishCardUseCnt)
+ for i in range(self.WishCardUseCnt):
+ data = CommFunc.WriteWORD(data, self.WishCardUseLibIDList[i])
return data
def OutputString(self):
@@ -7341,12 +7354,16 @@
Head:%s,
TreasureType:%d,
WishCnt:%d,
- WishIDList:%s
+ WishIDList:%s,
+ WishCardUseCnt:%d,
+ WishCardUseLibIDList:%s
'''\
%(
self.Head.OutputString(),
self.TreasureType,
self.WishCnt,
+ "...",
+ self.WishCardUseCnt,
"..."
)
return DumpString
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
index 7a7f487..b7fb943 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -8681,7 +8681,7 @@
_pack_ = 1
_fields_ = [
("WishID", c_ushort), # 寻宝物品库中的数据ID,注意不是库ID
- ("OutCnt", c_ubyte), # 做为心愿物品时已产出次数,有产出过的无法重新选择,未产出的可任意修改选择
+ ("OutCnt", c_ubyte), # 该心愿物品已产出次数
]
def __init__(self):
@@ -8712,6 +8712,77 @@
%(
self.WishID,
self.OutCnt
+ )
+ return DumpString
+
+
+class tagMCTreasureWishLib(Structure):
+ LibID = 0 #(WORD LibID)// 寻宝物品库ID
+ OutCntTotal = 0 #(WORD OutCntTotal)// 本库累计产出心愿总次数
+ IsUseWishCard = 0 #(BYTE IsUseWishCard)// 是否勾选了自动使用心愿卡
+ WishCnt = 0 #(BYTE WishCnt)
+ WishList = list() #(vector<tagMCTreasureWish> WishList)//已选心愿物品信息,只同步已选的
+ data = None
+
+ def __init__(self):
+ self.Clear()
+ return
+
+ def ReadData(self, _lpData, _pos=0, _Len=0):
+ self.Clear()
+ self.LibID,_pos = CommFunc.ReadWORD(_lpData, _pos)
+ self.OutCntTotal,_pos = CommFunc.ReadWORD(_lpData, _pos)
+ self.IsUseWishCard,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+ self.WishCnt,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+ for i in range(self.WishCnt):
+ temWishList = tagMCTreasureWish()
+ _pos = temWishList.ReadData(_lpData, _pos)
+ self.WishList.append(temWishList)
+ return _pos
+
+ def Clear(self):
+ self.LibID = 0
+ self.OutCntTotal = 0
+ self.IsUseWishCard = 0
+ self.WishCnt = 0
+ self.WishList = list()
+ return
+
+ def GetLength(self):
+ length = 0
+ length += 2
+ length += 2
+ length += 1
+ length += 1
+ for i in range(self.WishCnt):
+ length += self.WishList[i].GetLength()
+
+ return length
+
+ def GetBuffer(self):
+ data = ''
+ data = CommFunc.WriteWORD(data, self.LibID)
+ data = CommFunc.WriteWORD(data, self.OutCntTotal)
+ data = CommFunc.WriteBYTE(data, self.IsUseWishCard)
+ data = CommFunc.WriteBYTE(data, self.WishCnt)
+ for i in range(self.WishCnt):
+ data = CommFunc.WriteString(data, self.WishList[i].GetLength(), self.WishList[i].GetBuffer())
+ return data
+
+ def OutputString(self):
+ DumpString = '''
+ LibID:%d,
+ OutCntTotal:%d,
+ IsUseWishCard:%d,
+ WishCnt:%d,
+ WishList:%s
+ '''\
+ %(
+ self.LibID,
+ self.OutCntTotal,
+ self.IsUseWishCard,
+ self.WishCnt,
+ "..."
)
return DumpString
@@ -8764,8 +8835,8 @@
TreasureCntAward = 0 #(DWORD TreasureCntAward)//累计寻宝次数对应奖励领奖状态,按奖励记录索引二进制记录是否已领取
GridLimitCnt = 0 #(BYTE GridLimitCnt)
GridLimitCntList = list() #(vector<tagMCTreasureGridLimit> GridLimitCntList)//有限制抽取次数的格子次数信息
- WishCnt = 0 #(BYTE WishCnt)
- WishList = list() #(vector<tagMCTreasureWish> WishList)//心愿物品信息
+ WishLibCnt = 0 #(BYTE WishLibCnt)
+ WishLibList = list() #(vector<tagMCTreasureWishLib> WishLibList)//心愿库信息
data = None
def __init__(self):
@@ -8785,11 +8856,11 @@
temGridLimitCntList = tagMCTreasureGridLimit()
_pos = temGridLimitCntList.ReadData(_lpData, _pos)
self.GridLimitCntList.append(temGridLimitCntList)
- self.WishCnt,_pos = CommFunc.ReadBYTE(_lpData, _pos)
- for i in range(self.WishCnt):
- temWishList = tagMCTreasureWish()
- _pos = temWishList.ReadData(_lpData, _pos)
- self.WishList.append(temWishList)
+ self.WishLibCnt,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+ for i in range(self.WishLibCnt):
+ temWishLibList = tagMCTreasureWishLib()
+ _pos = temWishLibList.ReadData(_lpData, _pos)
+ self.WishLibList.append(temWishLibList)
return _pos
def Clear(self):
@@ -8801,8 +8872,8 @@
self.TreasureCntAward = 0
self.GridLimitCnt = 0
self.GridLimitCntList = list()
- self.WishCnt = 0
- self.WishList = list()
+ self.WishLibCnt = 0
+ self.WishLibList = list()
return
def GetLength(self):
@@ -8817,8 +8888,8 @@
for i in range(self.GridLimitCnt):
length += self.GridLimitCntList[i].GetLength()
length += 1
- for i in range(self.WishCnt):
- length += self.WishList[i].GetLength()
+ for i in range(self.WishLibCnt):
+ length += self.WishLibList[i].GetLength()
return length
@@ -8833,9 +8904,9 @@
data = CommFunc.WriteBYTE(data, self.GridLimitCnt)
for i in range(self.GridLimitCnt):
data = CommFunc.WriteString(data, self.GridLimitCntList[i].GetLength(), self.GridLimitCntList[i].GetBuffer())
- data = CommFunc.WriteBYTE(data, self.WishCnt)
- for i in range(self.WishCnt):
- data = CommFunc.WriteString(data, self.WishList[i].GetLength(), self.WishList[i].GetBuffer())
+ data = CommFunc.WriteBYTE(data, self.WishLibCnt)
+ for i in range(self.WishLibCnt):
+ data = CommFunc.WriteString(data, self.WishLibList[i].GetLength(), self.WishLibList[i].GetBuffer())
return data
def OutputString(self):
@@ -8848,8 +8919,8 @@
TreasureCntAward:%d,
GridLimitCnt:%d,
GridLimitCntList:%s,
- WishCnt:%d,
- WishList:%s
+ WishLibCnt:%d,
+ WishLibList:%s
'''\
%(
self.TreasureType,
@@ -8860,7 +8931,7 @@
self.TreasureCntAward,
self.GridLimitCnt,
"...",
- self.WishCnt,
+ self.WishLibCnt,
"..."
)
return DumpString
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
index a0fed3a..b929606 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
@@ -1267,9 +1267,10 @@
("dict", "NotifyKeyDict", 0),
("BYTE", "AwardMoneyType", 0),
("WORD", "AwardMoneyValue", 0),
- ("BYTE", "WishOutput", 0),
("BYTE", "WishReset", 0),
("dict", "WishLibSelect", 0),
+ ("dict", "WishLibPubFreeCnt", 0),
+ ("dict", "WishLibCard", 0),
),
"TreasureHouse":(
@@ -1292,6 +1293,7 @@
("DWORD", "ItemID", 0),
("DWORD", "ItemCount", 0),
("DWORD", "ItemWeight", 0),
+ ("BYTE", "IsWishItem", 0),
("BYTE", "WishOutCnt", 0),
),
@@ -4019,9 +4021,10 @@
def GetNotifyKeyDict(self): return self.attrTuple[18] # 广播key dict
def GetAwardMoneyType(self): return self.attrTuple[19] # 额外奖励货币类型 BYTE
def GetAwardMoneyValue(self): return self.attrTuple[20] # 单次奖励货币数 WORD
- def GetWishOutput(self): return self.attrTuple[21] # 心愿产出规则 BYTE
- def GetWishReset(self): return self.attrTuple[22] # 心愿重置规则 BYTE
- def GetWishLibSelect(self): return self.attrTuple[23] # 心愿库选择数 dict
+ def GetWishReset(self): return self.attrTuple[21] # 心愿重置规则 BYTE
+ def GetWishLibSelect(self): return self.attrTuple[22] # 心愿库选择数 dict
+ def GetWishLibPubFreeCnt(self): return self.attrTuple[23] # 心愿库公共免费次数 dict
+ def GetWishLibCard(self): return self.attrTuple[24] # 心愿库心愿卡 dict
# 寻宝产出库表
class IPY_TreasureHouse():
@@ -4054,7 +4057,8 @@
def GetItemID(self): return self.attrTuple[2] # 物品ID DWORD
def GetItemCount(self): return self.attrTuple[3] # 物品个数 DWORD
def GetItemWeight(self): return self.attrTuple[4] # 物品权重 DWORD
- def GetWishOutCnt(self): return self.attrTuple[5] # 心愿产出次数 BYTE
+ def GetIsWishItem(self): return self.attrTuple[5] # 心愿可选 BYTE
+ def GetWishOutCnt(self): return self.attrTuple[6] # 心愿独立产出次数 BYTE
# 寻宝累计次数奖励表
class IPY_TreasureCntAward():
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTreasure.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTreasure.py
index e66e055..1ad87c8 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTreasure.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTreasure.py
@@ -17,6 +17,7 @@
import GameWorld
import PlayerRune
+import IPY_GameWorld
import IpyGameDataPY
import FormulaControl
import ChPyNetSendPack
@@ -82,14 +83,21 @@
# 每日心愿重置
wishLibSelect = ipyData.GetWishLibSelect()
wishReset = ipyData.GetWishReset()
- if wishReset == 1:
- for libIDStr, wishCnt in wishLibSelect.items():
- for wishIndex in range(wishCnt):
- wishID, outCnt = GetWishInfo(curPlayer, treasureType, libIDStr, wishIndex)
- SetWishInfo(curPlayer, treasureType, libIDStr, wishIndex, wishID, 0)
- GameWorld.DebugLog("寻宝每日心愿重置: treasureType=%s,libID=%s,wishIndex=%s,wishID=%s,昨日心愿产出次数=%s"
- % (treasureType, libIDStr, wishIndex, wishID, outCnt))
-
+ if wishReset == 1 and wishLibSelect:
+ for libIDStr in wishLibSelect.keys():
+ libID = int(libIDStr)
+ libItemList = IpyGameDataPY.GetIpyGameDataList("TreasureItemLib", libID)
+ if not libItemList:
+ continue
+ for libItem in libItemList:
+ wishID = libItem.GetID()
+ outCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreasureWishOut % (treasureType, wishID))
+ if not outCnt:
+ continue
+ PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreasureWishOut % (treasureType, wishID), 0)
+ GameWorld.DebugLog("寻宝每日心愿重置: treasureType=%s,libID=%s,wishID=%s,昨日心愿产出次数=%s" % (treasureType, libID, wishID, outCnt))
+ PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreasureWishLibOut % (treasureType, libID), 0)
+
if syncTypeList:
Sync_TreasureInfo(curPlayer, syncTypeList)
return
@@ -124,17 +132,6 @@
return True
return False
-def GetWishInfo(curPlayer, treasureType, libID, wishIndex):
- ## 心愿信息
- # @return: 心愿ID, 已产出次数
- info = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreasureWish % (treasureType, libID, wishIndex))
- wishID, outCnt = info / 100, info % 100
- return wishID, outCnt
-def SetWishInfo(curPlayer, treasureType, libID, wishIndex, wishID, outCnt):
- info = wishID * 100 + min(outCnt, 99)
- info = PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreasureWish % (treasureType, libID, wishIndex), info)
- return info
-
#// A5 69 寻宝心愿物品选择 #tagCSTreasureWishSelect
#
#struct tagCSTreasureWishSelect
@@ -142,17 +139,20 @@
# tagHead Head;
# BYTE TreasureType; //寻宝类型
# BYTE WishCnt;
-# WORD WishIDList[WishCnt]; // 选择的寻宝物品库中的数据ID,注意不是库ID
+# DWORD WishIDList[WishCnt]; // 选择的寻宝物品库中的数据ID,注意不是库ID
+# BYTE WishCardUseCnt;
+# WORD WishCardUseLibIDList[WishCardUseCnt]; // 使用心愿卡的库ID列表
#};
def OnTreasureWishSelect(index, clientData, tick):
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
treasureType = clientData.TreasureType
reqSelectWishIDList = clientData.WishIDList
+ wishCardUseLibIDList = clientData.WishCardUseLibIDList
setIpyData = IpyGameDataPY.GetIpyGameData("TreasureSet", treasureType)
if not setIpyData:
return
- wishLibSelect = setIpyData.GetWishLibSelect()
+ wishLibSelect = setIpyData.GetWishLibSelect()
if not wishLibSelect:
GameWorld.DebugLog("该寻宝类型没有心愿物品功能! treasureType=%s" % (treasureType))
return
@@ -168,7 +168,7 @@
return
itemID = libItemIpyData.GetItemID()
- if not libItemIpyData.GetWishOutCnt():
+ if not libItemIpyData.GetIsWishItem():
GameWorld.DebugLog("非心愿物品,不可选择! wishID=%s" % (wishID))
return
@@ -189,36 +189,47 @@
GameWorld.DebugLog("需要激活本体的武将未激活不可选择!itemID=%s" % itemID)
return
- GameWorld.DebugLog("重选心愿库对应ID汇总: %s" % selectLibItemDict)
- hisOutDict = {} # 历史选择已产出过的心愿物品记录 {wishID:outCnt, ...}
- for libIDStr, wishCnt in wishLibSelect.items():
- libID = int(libIDStr)
- selectLibWishIDList = selectLibItemDict.get(libID, [])
- if selectLibWishIDList and len(selectLibWishIDList) != wishCnt:
- GameWorld.DebugLog("选择心愿库的物品数量与设定的心愿物品数量不一致!libID=%s,wishCnt=%s,selectCnt=%s,%s"
- % (libID, wishCnt, len(selectLibWishIDList), selectLibWishIDList))
- return
-
- for wishIndex in range(wishCnt):
- wishID, outCnt = GetWishInfo(curPlayer, treasureType, libID, wishIndex)
- if not outCnt:
- continue
- if wishID not in selectLibWishIDList:
- GameWorld.DebugLogEx("已经产出过的心愿物品不可从选择中去除! outCnt=%s,wishID=%s not in %s", outCnt, wishID, selectLibWishIDList)
+ # 公共次数模式,不限制切换
+ if setIpyData.GetWishLibPubFreeCnt():
+ # 无限制,直接保存
+ pass
+
+ # 独立次数模式,有产出后的心愿物品无法切换
+ else:
+ GameWorld.DebugLog("重选心愿库对应ID汇总: %s" % selectLibItemDict)
+ for libIDStr, wishCnt in wishLibSelect.items():
+ libID = int(libIDStr)
+ selectLibWishIDList = selectLibItemDict.get(libID, [])
+ if selectLibWishIDList and len(selectLibWishIDList) != wishCnt:
+ GameWorld.DebugLog("选择心愿库的物品数量与设定的心愿物品数量不一致!libID=%s,wishCnt=%s,selectCnt=%s,%s"
+ % (libID, wishCnt, len(selectLibWishIDList), selectLibWishIDList))
return
- hisOutDict[wishID] = outCnt
- GameWorld.DebugLog("历史已产出心愿ID次数: %s" % hisOutDict)
+ libItemList = IpyGameDataPY.GetIpyGameDataList("TreasureItemLib", libID)
+ if not libItemList:
+ return
+ for libItem in libItemList:
+ wishID = libItem.GetID()
+ outCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreasureWishOut % (treasureType, wishID))
+ if not outCnt:
+ continue
+ if wishID not in selectLibWishIDList:
+ GameWorld.DebugLogEx("已经产出过的心愿物品不可从选择中去除! outCnt=%s,wishID=%s not in %s", outCnt, wishID, selectLibWishIDList)
+ return
+
# 验证通过,保存
for libIDStr, wishCnt in wishLibSelect.items():
libID = int(libIDStr)
wishIDList = selectLibItemDict.get(libID, [])
for wishIndex in range(wishCnt):
wishID = wishIDList[wishIndex] if len(wishIDList) > wishIndex else 0
- outCnt = hisOutDict.get(wishID, 0)
- SetWishInfo(curPlayer, treasureType, libID, wishIndex, wishID, outCnt)
- GameWorld.DebugLog("保存心愿选择: libID=%s,wishIndex=%s,wishID=%s,outCnt=%s" % (libID, wishIndex, wishID, outCnt))
+ PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreasureWishSelect % (treasureType, libIDStr, wishIndex), wishID)
+ GameWorld.DebugLog("保存心愿选择: libID=%s,wishIndex=%s,wishID=%s" % (libID, wishIndex, wishID))
+ isUse = 1 if libID in wishCardUseLibIDList else 0
+ PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreasureWishUseItem % (treasureType, libID), isUse)
+ GameWorld.DebugLog("保存心愿卡是否使用: libID=%s,isUse=%s" % (libID, isUse))
+
Sync_TreasureInfo(curPlayer, [treasureType])
return
@@ -394,37 +405,72 @@
gridItemInfoDict = ipyData.GetGridItemInfo() # 格子对应物品信息 {"格子编号":[物品ID, 数量], ...}
gridLibInfoDict = ipyData.GetGridLibInfo() # 格子编号对应库ID {"编号":物品库ID, ...}
- # 心愿
- canOutWishDict = {} # 还可产出的心愿物品 {libID:{wishID:[wishIndex, canOut], ...}, ...}
- wishOutputRule = setIpyData.GetWishOutput() # 心愿产出规则:心愿产出完毕后: 0 - 可继续产出该库物品; 1 - 不可再产出该库物品
- wishLibSelect = setIpyData.GetWishLibSelect()
+ # 心愿设定
+ wishLibSelect = setIpyData.GetWishLibSelect() # {"心愿库":可选择物品数, ...}
+ wishPubFreeCntDict = setIpyData.GetWishLibPubFreeCnt() # 心愿库公共免费次数 {"心愿库":免费次数, ...}
+ wishPubCardDict = setIpyData.GetWishLibCard() # 心愿库公共次数心愿卡 {"心愿库":心愿卡ID, ...}
+
+ # 心愿优先产出相关
+ preOutWishDict = {} # 心愿物品预计产出数{libID:预计优先产出数, ...}
+ retOutWishDict = {} # 心愿物品实际产出数{libID:{wishID:实际优先产出数, ...}, ...}
+ selectWishIDDict = {} # 库当前对应选择的心愿物品 {libID:[wishID, ...], ...}
+
+ # 公共心愿
+ canFreeOutWishLibDict = {} # 心愿物品库公共还可免费产出数 {libID:还可免费产出数, ...}
+ wishCardItemLibDict = {} # 公共心愿次数心愿卡背包物品 {libID:wishCardItem, ...}
+
+ # 独立心愿
+ canFreeOutWishIDict = {} # 心愿物品独立还可免费产出数 {wishID:还可免费产出数, ...}
+
for libIDStr, selectCnt in wishLibSelect.items():
libID = int(libIDStr)
+
+ if wishPubFreeCntDict:
+ outTotal = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreasureWishLibOut % (treasureType, libID))
+ freeCnt = wishPubFreeCntDict.get(libIDStr, 0)
+ canFreeOut = freeCnt - outTotal
+ if canFreeOut > 0:
+ canFreeOutWishLibDict[libID] = canFreeOut
+
for wishIndex in range(selectCnt):
- wishID, outCnt = GetWishInfo(curPlayer, treasureType, libID, wishIndex)
+ wishID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreasureWishSelect % (treasureType, libIDStr, wishIndex))
if not wishID:
continue
libItemIpyData = IpyGameDataPY.GetIpyGameDataByCondition("TreasureItemLib", {"ID":wishID}, False)
if not libItemIpyData:
continue
- outCntLimit = libItemIpyData.GetWishOutCnt()
- if not outCntLimit:
+ if not libItemIpyData.GetIsWishItem():
# 非心愿物品
continue
- if libID not in canOutWishDict:
- canOutWishDict[libID] = {}
- if outCnt >= outCntLimit:
- # 该心愿物品产出次数已用完
- continue
- libWishCanOutDict = canOutWishDict[libID]
- canOut = outCntLimit - outCnt
- libWishCanOutDict[wishID] = [wishIndex, canOut]
- if wishLibSelect:
- if not canOutWishDict:
- GameWorld.DebugLog("心愿物品还未选择!", playerID)
- else:
- GameWorld.DebugLog("已选的还可产出的心愿库对应WishID还可产出次数: %s" % canOutWishDict, playerID)
+ # 公共次数
+ if wishPubFreeCntDict:
+ useWishItemState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreasureWishUseItem % (treasureType, libID))
+ if not useWishItemState:
+ # 未启用该库心愿视为未选择
+ continue
+ if libID not in selectWishIDDict:
+ selectWishIDDict[libID] = []
+ selectWishIDList = selectWishIDDict[libID]
+ selectWishIDList.append(wishID)
+
+ # 独立次数
+ else:
+ if libID not in selectWishIDDict:
+ selectWishIDDict[libID] = []
+ selectWishIDList = selectWishIDDict[libID]
+ selectWishIDList.append(wishID)
+
+ outCntLimit = libItemIpyData.GetWishOutCnt()
+ outCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreasureWishOut % (treasureType, wishID))
+ canFreeOut = outCntLimit - outCnt
+ if canFreeOut <= 0:
+ continue
+ canFreeOutWishIDict[wishID] = canFreeOut
+
+ if wishLibSelect:
+ GameWorld.DebugLog("本次可优先产出的心愿库物品: %s, 免费次数:%s" % (selectWishIDDict, canFreeOutWishLibDict), playerID)
+
# 单抽产出优先级: 幸运物品 > 必出 > 保底 > 普通
# 连抽没有优先级限制,只要满足条件即可产出
getGridResult = []
@@ -482,16 +528,19 @@
GameWorld.DebugLog(" 幸运物品已经出过,不再重复产出! gridNum=%s in %s" % (gridNum, getGridResult))
continue
- # 心愿产出限制
+ # 心愿库物品,检查心愿预产出
gridNumStr = str(gridNum)
wishLibID = 0
- if wishLibSelect and gridNumStr in gridLibInfoDict and gridLibInfoDict[gridNumStr] in canOutWishDict:
+ if wishLibSelect and gridNumStr in gridLibInfoDict and str(gridLibInfoDict[gridNumStr]) in wishLibSelect:
wishLibID = gridLibInfoDict[gridNumStr]
- if wishOutputRule == 1: # 心愿物品产出完毕后,不可再产出该库物品,该模式下,未选择心愿的,也视为无可产出的心愿物品
- if not canOutWishDict[wishLibID]:
- GameWorld.DebugLog(" 没有可产出的心愿物品,不产出! gridNum=%s,wishLibID=%s" % (gridNum, wishLibID), playerID)
- continue
-
+ if wishPubFreeCntDict:
+ # 公共心愿默认均可正常产出,只是处理是否优先产出心愿
+ __prePubWishOut(curPlayer, treasureType, gridNum, wishLibID, selectWishIDDict, wishPubFreeCntDict,
+ preOutWishDict, canFreeOutWishLibDict, wishPubCardDict, wishCardItemLibDict)
+ #else:
+ # # 非公共的暂不支持,后续有需要再处理
+ # return
+
if not gridNum:
continue
@@ -526,7 +575,6 @@
treasureResult = []
randItemIDDict = IpyGameDataPY.GetFuncEvalCfg("TreasureSet", 2)
- wishAddOutDict = {} # 本次心愿物品预计增加产出 {wishID:addOut, ...}
for gridNum in getGridResult:
gridNum = str(gridNum)
if gridNum in gridItemInfoDict:
@@ -556,7 +604,6 @@
if not libItemList:
return
- libWishCanOutDict = canOutWishDict.get(libID, {})
wishWeightList = [] # 心愿物品权重
itemWeightList = []
for libItem in libItemList:
@@ -567,11 +614,18 @@
if not __checkItemCanTreasure(curPlayer, treasureType, itemID):
continue
itemWeightList.append([itemWeight, [itemID, itemCount]])
- if curID in libWishCanOutDict:
- _, canOut = libWishCanOutDict[curID]
- if canOut - wishAddOutDict.get(curID, 0) > 0:
- wishWeightList.append([itemWeight, [itemID, itemCount, curID]])
-
+
+ # 公共次数
+ if wishPubFreeCntDict:
+ selectWishIDList = selectWishIDDict.get(libID, [])
+ if curID not in selectWishIDList:
+ continue
+ preOutWishCnt = preOutWishDict.get(libID, 0)
+ if preOutWishCnt <= 0:
+ continue
+ preOutWishDict[libID] = preOutWishCnt - 1
+ wishWeightList.append([itemWeight, [itemID, itemCount, curID]])
+
if not itemWeightList:
GameWorld.ErrLog("寻宝随机格子没有可随机的物品!treasureType=%s,treasureIndex=%s,gridNum=%s,libID=%s"
% (treasureType, treasureIndex, gridNum, libID), playerID)
@@ -579,8 +633,12 @@
# 优先产出选择的心愿物品
if wishWeightList:
itemID, itemCount, curID = GameWorld.GetResultByWeightList(wishWeightList)
- wishAddOutDict[curID] = wishAddOutDict.get(curID, 0) + 1
GameWorld.DebugLog("优先产出心愿物品: gridNum=%s,libID=%s,wishID=%s,itemID=%s" % (gridNum, libID, curID, itemID), playerID)
+ if libID not in retOutWishDict:
+ retOutWishDict[libID] = {}
+ retOutWishIDDict = retOutWishDict[libID]
+ retOutWishIDDict[curID] = retOutWishIDDict.get(curID, 0) + 1 # 累加实际优先产出
+
else:
itemID, itemCount = GameWorld.GetResultByWeightList(itemWeightList)
else:
@@ -618,16 +676,30 @@
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreasureCountEx % (treasureType), treasureCountEx)
GameWorld.DebugLog("更新第x次x抽次数: treasureIndex=%s,curIndexCount=%s,maxIndexCount=%s,treasureCountEx=%s" % (treasureIndex, curIndexCount, maxIndexCount, treasureCountEx), playerID)
# 心愿产出次数
- for curID, addOut in wishAddOutDict.items():
- for libID, libWishCanOutDict in canOutWishDict.items():
- if curID not in libWishCanOutDict:
- continue
- wishIndex, canOut = libWishCanOutDict[curID]
- wishID, outCnt = GetWishInfo(curPlayer, treasureType, libID, wishIndex)
- updOut = outCnt + addOut
- SetWishInfo(curPlayer, treasureType, libID, wishIndex, wishID, updOut)
- GameWorld.DebugLog("更新心愿物品已产出次数: libID=%s,wishIndex=%s,wishID=%s,updOut=%s" % (libID, wishIndex, wishID, updOut), playerID)
+ for libID, retOutWishIDDict in retOutWishDict.items():
+ retOutTotal = 0
+ for wishID, retOutCnt in retOutWishIDDict.items():
+ retOutTotal += retOutCnt
+ outCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreasureWishOut % (treasureType, wishID))
+ updOutCnt = outCnt + retOutCnt
+ PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreasureWishOut % (treasureType, wishID), updOutCnt)
+ GameWorld.DebugLog("更新心愿物品优先产出次数: libID=%s,wishID=%s,retOutCnt=%s,updOutCnt=%s" % (libID, wishID, retOutCnt, updOutCnt), playerID)
+ outTotal = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreasureWishLibOut % (treasureType, libID))
+ updOutTotal = outTotal + retOutTotal
+ PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreasureWishLibOut % (treasureType, libID), updOutTotal)
+ GameWorld.DebugLog("更新心愿库物品累计优先产出次数: libID=%s,retOutTotal=%s,updOutTotal=%s" % (libID, retOutTotal, updOutTotal), playerID)
+
+ canFreeCnt = canFreeOutWishLibDict.get(libID, 0)
+ costWishCardCnt = retOutTotal - canFreeCnt
+ if costWishCardCnt > 0 and libID in wishCardItemLibDict:
+ wishCardItem = wishCardItemLibDict[libID]
+ cardItemID = wishCardItem.GetItemTypeID() if wishCardItem else 0
+ costWishCardCnt = min(costWishCardCnt, ItemControler.GetItemCount(wishCardItem))
+ GameWorld.DebugLog("扣除心愿卡个数: cardItemID=%s,costWishCardCnt=%s" % (cardItemID, costWishCardCnt), playerID)
+ if wishCardItem:
+ ItemCommon.DelItem(curPlayer, wishCardItem, costWishCardCnt)
+
addScoreType = setIpyData.GetAwardMoneyType() # 额外奖励货币类型
addScore = setIpyData.GetAwardMoneyValue() # 单次奖励货币数
if addScoreType and addScore:
@@ -693,6 +765,53 @@
NetPackCommon.SendFakePack(curPlayer, sendPack)
Sync_TreasureInfo(curPlayer, [treasureType])
+ return
+
+def __prePubWishOut(curPlayer, treasureType, gridNum, wishLibID, selectWishIDDict, wishPubFreeCntDict, preOutWishDict,
+ canFreeOutWishLibDict, wishPubCardDict, wishCardItemLibDict):
+ ## 公共心愿产出预处理
+
+ playerID = curPlayer.GetPlayerID()
+ selectWishIDList = selectWishIDDict.get(wishLibID, [])
+ if not selectWishIDList:
+ GameWorld.DebugLog(" 公共心愿未选择心愿物品,走默认随机规则", playerID)
+ return
+
+ preOutTotal = preOutWishDict.get(wishLibID, 0)
+ canFreeCnt = canFreeOutWishLibDict.get(wishLibID, 0)
+ GameWorld.DebugLog(" 公共免费心愿次数! gridNum=%s,wishLibID=%s,preOutTotal=%s,canFreeCnt=%s"
+ % (gridNum, wishLibID, preOutTotal, canFreeCnt), playerID)
+
+ if preOutTotal >= canFreeCnt:
+ if not curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreasureWishUseItem % (treasureType, wishLibID)):
+ GameWorld.DebugLog(" 玩家心愿卡未启用,走默认随机规则! gridNum=%s,wishLibID=%s" % (gridNum, wishLibID), playerID)
+ return
+
+ wishCardID = wishPubCardDict.get(str(wishLibID), 0)
+ if not wishCardID:
+ GameWorld.DebugLog(" 该库没有心愿卡配置,走默认随机规则! gridNum=%s,wishLibID=%s" % (gridNum, wishLibID), playerID)
+ return
+
+ if wishLibID not in wishCardItemLibDict:
+ wishCardItem = ItemCommon.FindItemInPackByItemID(curPlayer, wishCardID, IPY_GameWorld.rptItem)
+ if not wishCardItem:
+ GameWorld.DebugLog(" 玩家没有对应心愿卡物品,走默认随机规则! gridNum=%s,wishLibID=%s,wishCardID=%s"
+ % (gridNum, wishLibID, wishCardID), playerID)
+ return
+ wishCardItemLibDict[wishLibID] = wishCardItem
+ wishCardItem = wishCardItemLibDict[wishLibID]
+ cardItemCount = ItemControler.GetItemCount(wishCardItem)
+ canOutTotal = canFreeCnt + cardItemCount
+ if preOutTotal >= canOutTotal:
+ GameWorld.DebugLog(" 心愿卡个数预产出已消耗完,走默认随机规则! gridNum=%s,wishLibID=%s,wishCardID=%s"
+ % (gridNum, wishLibID, wishCardID), playerID)
+ return
+ GameWorld.DebugLog(" 心愿卡个数还可产出! gridNum=%s,wishLibID=%s,wishCardID=%s,cardItemCount=%s"
+ % (gridNum, wishLibID, wishCardID, cardItemCount), playerID)
+ else:
+ GameWorld.DebugLog(" 公共心愿还有免费次数强制消耗次数", playerID)
+
+ preOutWishDict[wishLibID] = preOutTotal + 1
return
def GetHeroCallCnt(curPlayer):
@@ -854,16 +973,25 @@
tTypeInfo.GridLimitCntList.append(gridLimit)
tTypeInfo.GridLimitCnt = len(tTypeInfo.GridLimitCntList)
+ tTypeInfo.WishLibList = []
wishLibSelect = setIpyData.GetWishLibSelect()
for libIDStr, wishCnt in wishLibSelect.items():
libID = int(libIDStr)
+ wishLib = ChPyNetSendPack.tagMCTreasureWishLib()
+ wishLib.LibID = libID
+ wishLib.OutCntTotal = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreasureWishLibOut % (tType, libID))
+ wishLib.IsUseWishCard = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreasureWishUseItem % (tType, libID))
+ wishLib.WishList = []
for wishIndex in range(wishCnt):
- wishID, outCnt = GetWishInfo(curPlayer, tType, libID, wishIndex)
+ wishID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreasureWishSelect % (tType, libID, wishIndex))
wish = ChPyNetSendPack.tagMCTreasureWish()
wish.WishID = wishID
- wish.OutCnt = outCnt
- tTypeInfo.WishList.append(wish)
- tTypeInfo.WishCnt = len(tTypeInfo.WishList)
+ wish.OutCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreasureWishOut % (tType, wishID))
+ wishLib.WishList.append(wish)
+ wishLib.WishCnt = len(wishLib.WishList)
+
+ tTypeInfo.WishLibList.append(wishLib)
+ tTypeInfo.WishLibCnt = len(tTypeInfo.WishLibList)
treasureInfoPack.TreasuerInfoList.append(tTypeInfo)
treasureInfoPack.InfoCount = len(treasureInfoPack.TreasuerInfoList)
--
Gitblit v1.8.0