From 5ab23bf8c2f16b2ac19d76282ad9528fcb247005 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期二, 30 十月 2018 17:55:37 +0800
Subject: [PATCH] 4409 【后端】【1.2.0】装备合成、翅膀合成修改
---
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py | 19 ++++++
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py | 6 ++
PySysDB/PySysDBPY.h | 2
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py | 19 ++++++
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/Operate_ItemCompound.py | 79 +++++++++++++++++++++++--
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py | 1
6 files changed, 116 insertions(+), 10 deletions(-)
diff --git a/PySysDB/PySysDBPY.h b/PySysDB/PySysDBPY.h
index 7352d82..9805bdf 100644
--- a/PySysDB/PySysDBPY.h
+++ b/PySysDB/PySysDBPY.h
@@ -71,6 +71,7 @@
{
WORD _ID; //合成配置编号ID
list MakeID; //可合成的道具ID,多个则随机一个
+ BYTE IsFirstSuccMakeJobItem; //首次成功是否必出本职业
list UnfixedItemID; //不固定道具ID, 多个ID时则任意一种均可
BYTE UnfixedItemCount; //不固定道具消耗数量
list FixedItemID; //消耗固定道具ID, 多个ID时代表每个ID均需消耗
@@ -78,6 +79,7 @@
DWORD NeedMoney; // 消耗铜钱
WORD SuccessRate; // 成功率万分率
WORD SuccessRateMax; // 最大成功率万分率
+ list SuccessRateIncrease; //提高成功率道具, 道具ID|个数|提高的概率
BYTE AddonsCountMax; //最大可附加材料数, 增加概率用, 非必须, 0代表不可附加材料
char SysMark; //提示mark
BYTE SysMarkParamType; //系统提示参数组合类型
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py
index 88ad38f..4c5a166 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py
@@ -6174,6 +6174,8 @@
AddonsItemIndexCnt = 0 #(BYTE AddonsItemIndexCnt)// 附加物品在背包中索引个数
AddonsItemIndex = list() #(vector<BYTE> AddonsItemIndex)// 附加物品在背包的索引列表
AddonsItemCount = list() #(vector<BYTE> AddonsItemCount)// 附加物品在背包的索引对应扣除数量列表
+ RateIncreaseItemIndexCnt = 0 #(BYTE RateIncreaseItemIndexCnt)// 提升概率物品在背包中索引个数
+ RateIncreaseItemIndex = list() #(vector<BYTE> RateIncreaseItemIndex)// 提升概率物品在背包的索引列表
data = None
def __init__(self):
@@ -6202,6 +6204,10 @@
for i in range(self.AddonsItemIndexCnt):
value,_pos=CommFunc.ReadBYTE(_lpData,_pos)
self.AddonsItemCount.append(value)
+ self.RateIncreaseItemIndexCnt,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+ for i in range(self.RateIncreaseItemIndexCnt):
+ value,_pos=CommFunc.ReadBYTE(_lpData,_pos)
+ self.RateIncreaseItemIndex.append(value)
return _pos
def Clear(self):
@@ -6218,6 +6224,8 @@
self.AddonsItemIndexCnt = 0
self.AddonsItemIndex = list()
self.AddonsItemCount = list()
+ self.RateIncreaseItemIndexCnt = 0
+ self.RateIncreaseItemIndex = list()
return
def GetLength(self):
@@ -6232,6 +6240,8 @@
length += 1
length += 1 * self.AddonsItemIndexCnt
length += 1 * self.AddonsItemIndexCnt
+ length += 1
+ length += 1 * self.RateIncreaseItemIndexCnt
return length
@@ -6251,6 +6261,9 @@
data = CommFunc.WriteBYTE(data, self.AddonsItemIndex[i])
for i in range(self.AddonsItemIndexCnt):
data = CommFunc.WriteBYTE(data, self.AddonsItemCount[i])
+ data = CommFunc.WriteBYTE(data, self.RateIncreaseItemIndexCnt)
+ for i in range(self.RateIncreaseItemIndexCnt):
+ data = CommFunc.WriteBYTE(data, self.RateIncreaseItemIndex[i])
return data
def OutputString(self):
@@ -6264,7 +6277,9 @@
FixedItemIndex:%s,
AddonsItemIndexCnt:%d,
AddonsItemIndex:%s,
- AddonsItemCount:%s
+ AddonsItemCount:%s,
+ RateIncreaseItemIndexCnt:%d,
+ RateIncreaseItemIndex:%s
'''\
%(
self.Head.OutputString(),
@@ -6276,6 +6291,8 @@
"...",
self.AddonsItemIndexCnt,
"...",
+ "...",
+ self.RateIncreaseItemIndexCnt,
"..."
)
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 b1c19f3..2b1af98 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -3503,6 +3503,7 @@
Def_PDict_IsAddReviveTired = "IsAddReviveTired" # 死亡是否增加复活疲劳
Def_PDict_HadCompoundWing = "HadCompoundWing" # 是否合成过一代翅膀
+Def_PDict_FirstSuccMakeJobItem = "FirstSuccMakeJobItem_%s" # 首次合成成功给本职业物品记录,参数为(合成ID)
Def_PDict_DownloadAwardState = "DownloadAwardState" # 分支下载奖励状态 0-未领 1-已领
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
index 88ad38f..4c5a166 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
@@ -6174,6 +6174,8 @@
AddonsItemIndexCnt = 0 #(BYTE AddonsItemIndexCnt)// 附加物品在背包中索引个数
AddonsItemIndex = list() #(vector<BYTE> AddonsItemIndex)// 附加物品在背包的索引列表
AddonsItemCount = list() #(vector<BYTE> AddonsItemCount)// 附加物品在背包的索引对应扣除数量列表
+ RateIncreaseItemIndexCnt = 0 #(BYTE RateIncreaseItemIndexCnt)// 提升概率物品在背包中索引个数
+ RateIncreaseItemIndex = list() #(vector<BYTE> RateIncreaseItemIndex)// 提升概率物品在背包的索引列表
data = None
def __init__(self):
@@ -6202,6 +6204,10 @@
for i in range(self.AddonsItemIndexCnt):
value,_pos=CommFunc.ReadBYTE(_lpData,_pos)
self.AddonsItemCount.append(value)
+ self.RateIncreaseItemIndexCnt,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+ for i in range(self.RateIncreaseItemIndexCnt):
+ value,_pos=CommFunc.ReadBYTE(_lpData,_pos)
+ self.RateIncreaseItemIndex.append(value)
return _pos
def Clear(self):
@@ -6218,6 +6224,8 @@
self.AddonsItemIndexCnt = 0
self.AddonsItemIndex = list()
self.AddonsItemCount = list()
+ self.RateIncreaseItemIndexCnt = 0
+ self.RateIncreaseItemIndex = list()
return
def GetLength(self):
@@ -6232,6 +6240,8 @@
length += 1
length += 1 * self.AddonsItemIndexCnt
length += 1 * self.AddonsItemIndexCnt
+ length += 1
+ length += 1 * self.RateIncreaseItemIndexCnt
return length
@@ -6251,6 +6261,9 @@
data = CommFunc.WriteBYTE(data, self.AddonsItemIndex[i])
for i in range(self.AddonsItemIndexCnt):
data = CommFunc.WriteBYTE(data, self.AddonsItemCount[i])
+ data = CommFunc.WriteBYTE(data, self.RateIncreaseItemIndexCnt)
+ for i in range(self.RateIncreaseItemIndexCnt):
+ data = CommFunc.WriteBYTE(data, self.RateIncreaseItemIndex[i])
return data
def OutputString(self):
@@ -6264,7 +6277,9 @@
FixedItemIndex:%s,
AddonsItemIndexCnt:%d,
AddonsItemIndex:%s,
- AddonsItemCount:%s
+ AddonsItemCount:%s,
+ RateIncreaseItemIndexCnt:%d,
+ RateIncreaseItemIndex:%s
'''\
%(
self.Head.OutputString(),
@@ -6276,6 +6291,8 @@
"...",
self.AddonsItemIndexCnt,
"...",
+ "...",
+ self.RateIncreaseItemIndexCnt,
"..."
)
return DumpString
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/Operate_ItemCompound.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/Operate_ItemCompound.py
index 9e1cc88..2a65f95 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/Operate_ItemCompound.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/Operate_ItemCompound.py
@@ -49,6 +49,8 @@
# BYTE AddonsItemIndexCnt; // 附加物品在背包中索引个数
# BYTE AddonsItemIndex[AddonsItemIndexCnt]; // 附加物品在背包的索引列表
# BYTE AddonsItemCount[AddonsItemIndexCnt]; // 附加物品在背包的索引对应扣除数量列表
+# BYTE RateIncreaseItemIndexCnt; // 提升概率物品在背包中索引个数
+# BYTE RateIncreaseItemIndex[RateIncreaseItemIndexCnt]; // 提升概率物品在背包的索引列表
#};
def OnItemCompound(index, clientData, tick):
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
@@ -60,8 +62,9 @@
fixedItemIndexList = clientData.FixedItemIndex
addonsItemIndexList = clientData.AddonsItemIndex
addonsItemCountList = clientData.AddonsItemCount
- GameWorld.DebugLog("物品合成: ID=%s,compoundCnt=%s,unfixedItemIndexList=%s,fixedItemIndexList=%s,addonsItemIndexList=%s,addonsItemCountList=%s"
- % (compoundID, compoundCnt, unfixedItemIndexList, fixedItemIndexList, addonsItemIndexList, addonsItemCountList), playerID)
+ incRateItemIndexList = clientData.RateIncreaseItemIndex
+ GameWorld.DebugLog("物品合成: ID=%s,compoundCnt=%s,unfixedItemIndexList=%s,fixedItemIndexList=%s,addonsItemIndexList=%s,addonsItemCountList=%s,incRateItemIndexList=%s"
+ % (compoundID, compoundCnt, unfixedItemIndexList, fixedItemIndexList, addonsItemIndexList, addonsItemCountList, incRateItemIndexList), playerID)
ipyData = IpyGameDataPY.GetIpyGameData("ItemCompound", compoundID)
if not ipyData:
@@ -73,7 +76,17 @@
fixedItemIDList = ipyData.GetFixedItemID()
fixedItemCountList = ipyData.GetFixedItemCount()
- makeItemID = random.choice(makeIDList) # 从可合成物品列表里随机一个
+ isFirstSuccMakeJobItem = False
+ if ipyData.GetIsFirstSuccMakeJobItem() and not curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FirstSuccMakeJobItem % compoundID):
+ isFirstSuccMakeJobItem = True
+ makeItemID = 0
+ for jobItemID in makeIDList:
+ itemData = GameWorld.GetGameData().GetItemByTypeID(jobItemID)
+ if itemData and ItemCommon.CheckJob(curPlayer, itemData):
+ makeItemID = jobItemID
+ break
+ else:
+ makeItemID = random.choice(makeIDList) # 从可合成物品列表里随机一个
makeItemData = GameWorld.GetGameData().GetItemByTypeID(makeItemID)
if not makeItemData:
GameWorld.ErrLog("不存在该合成物品! makeItemID=%s" % makeItemID)
@@ -92,9 +105,10 @@
needMoney = ipyData.GetNeedMoney()
successRate = ipyData.GetSuccessRate()
successRateMax = ipyData.GetSuccessRateMax()
+ successRateIncrease = ipyData.GetSuccessRateIncrease()
addonsCountMax = ipyData.GetAddonsCountMax() # 可叠加的算叠加数量
# 可使用非固定道具 或 附加道具的 单次合成数默认为1
- if unfixedItemIDList or addonsCountMax > 0:
+ if unfixedItemIDList or addonsCountMax > 0 or incRateItemIndexList:
compoundCnt = 1
totalNeedMoney = needMoney * compoundCnt
@@ -141,6 +155,15 @@
return
addSuccRate, addSuccRateItemInfo = addSuccRateInfo
+ # 检查提升概率道具
+ incRateItemCostList, needIncRateItemCount, incRate = [], 0, 0
+ if successRateIncrease and len(successRateIncrease) == 3 and incRateItemIndexList:
+ incRateItemID, needIncRateItemCount, incRate = successRateIncrease
+ incRateItemInfo = __CheckIncRateItem(playerID, compoundID, itemPack, incRateItemIndexList, incRateItemID, needIncRateItemCount)
+ if not incRateItemInfo:
+ return
+ incRateItemCostList = incRateItemInfo
+
# 扣铜钱
PlayerControl.PayMoney(curPlayer, IPY_GameWorld.TYPE_Price_Silver_Money, totalNeedMoney, ChConfig.Def_Cost_ItemProduce,
{ChConfig.Def_Cost_Reason_SonKey:makeItemID, "CompoundCount":compoundCnt})
@@ -185,15 +208,21 @@
False, ChConfig.ItemDel_ItemCompound, drDict)
#makeItemBind = True if hasBind else makeItemBind #策划说附加材料不决定合成物品是否绑定
+ # 扣提升概率道具
+ if incRateItemCostList:
+ bindIncRateItemIndexList, unBindIncRateItemIndexList = incRateItemCostList
+ hasBind = ItemCommon.ReduceItem(curPlayer, itemPack, bindIncRateItemIndexList + unBindIncRateItemIndexList, needIncRateItemCount,
+ False, ChConfig.ItemDel_ItemCompound, drDict)
+
if compoundCnt == 1 and makeItemBind:
compoundBindCnt = 1
# 给合成物品
- totalSuccRate = successRate + addSuccRate
+ totalSuccRate = successRate + addSuccRate + incRate
if successRateMax:
totalSuccRate = min(successRateMax, totalSuccRate)
- GameWorld.DebugLog("合成成功率: successRate=%s,addSuccRate=%s,successRateMax=%s,totalSuccRate=%s"
- % (successRate, addSuccRate, successRateMax, totalSuccRate), playerID)
+ GameWorld.DebugLog("合成成功率: successRate=%s,addSuccRate=%s,incRate=%s,successRateMax=%s,totalSuccRate=%s"
+ % (successRate, addSuccRate, incRate, successRateMax, totalSuccRate), playerID)
# 首次合成一代翅膀成功率百分百
if makeItemData.GetType() == ChConfig.Def_ItemType_retWing and ItemCommon.GetWingLV(makeItemData) == 1:
if not curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HadCompoundWing):
@@ -210,7 +239,7 @@
# 不是百分百成功的记录合成流向
if successRate != maxRateValue:
drDict = {"PlayerID":curPlayer.GetPlayerID(), "AccID":curPlayer.GetAccID(), "ID":compoundID, "MakeItemID":makeItemID, "IsSuccess":canHappen,
- "RateInfo":{"totalSuccRate":"%s(%s+%s)" % (totalSuccRate, successRate, addSuccRate), "randValue":randValue, "maxRateValue":maxRateValue},
+ "RateInfo":{"totalSuccRate":"%s(%s+%s+%s)" % (totalSuccRate, successRate, addSuccRate, incRate), "randValue":randValue, "maxRateValue":maxRateValue},
"AddSuccRateItemInfo":addSuccRateItemInfo
}
DataRecordPack.SendEventPack("ItemCompound", drDict, curPlayer)
@@ -227,6 +256,10 @@
else:
PlayerControl.WorldNotify(0, msgMark, [curPlayer.GetName(), makeItemID, userData])
+ if isFirstSuccMakeJobItem:
+ PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FirstSuccMakeJobItem % compoundID, 1)
+ GameWorld.DebugLog("标记首次合成成功给本职业物品!", playerID)
+
# 通知合成成功
ItemCommon.SyncMakeItemAnswer(curPlayer, ShareDefine.Def_mitItemCompound, ChConfig.Def_ComposeState_Sucess, makeItemID)
#成功合成1个物品成就
@@ -468,6 +501,36 @@
return int(addTotalSuccRate), addSuccRateItemInfo
+def __CheckIncRateItem(playerID, compoundID, itemPack, incRateItemIndexList, incRateItemID, needIncRateItemCount):
+ ## 检查提升概率道具, 只要客户端提交的数据有不符合要求的,则直接返回 None
+ incRateItemTotalCount = 0
+ incRateItemCostList = [[], []] # [[绑定索引], [非绑定索引]]
+ maxPackCount = itemPack.GetCount()
+ for index in incRateItemIndexList:
+ if index >= maxPackCount:
+ GameWorld.Log("该物品格子索引不存在!无法合成!index=%s,maxPackCount=%s" % (index, maxPackCount), playerID)
+ return
+ curItem = itemPack.GetAt(index)
+ if not __CheckItemCanUseCompound(playerID, index, curItem):
+ GameWorld.Log("该物品不可使用!无法合成! ID=%s,index=%s" % (compoundID, index), playerID)
+ return
+ itemID = curItem.GetItemTypeID()
+ if itemID != incRateItemID:
+ GameWorld.Log("该物品不可用于提升合成目标物品概率!ID=%s,index=%s,itemID=%s != incRateItemID=%s"
+ % (compoundID, index, itemID, incRateItemID), playerID)
+ return
+
+ isBind = curItem.GetIsBind()
+ itemCount = curItem.GetCount()
+ incRateItemTotalCount += itemCount
+ incRateItemCostList[0].append(index) if isBind else incRateItemCostList[1].append(index)
+
+ if incRateItemTotalCount < needIncRateItemCount:
+ GameWorld.Log("提升概率消耗道具不足,无法合成!ID=%s,incRateItemID=%s,needIncRateItemCount=%s > incRateItemTotalCount=%s"
+ % (compoundID, incRateItemID, needIncRateItemCount, incRateItemTotalCount), playerID)
+ return
+
+ return incRateItemCostList
def __CheckItemCanUseCompound(playerID, index, curItem):
if not ItemCommon.CheckItemCanUse(curItem):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
index c638168..ff4ccf2 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
@@ -86,6 +86,7 @@
"ItemCompound":(
("WORD", "ID", 1),
("list", "MakeID", 0),
+ ("BYTE", "IsFirstSuccMakeJobItem", 0),
("list", "UnfixedItemID", 0),
("BYTE", "UnfixedItemCount", 0),
("list", "FixedItemID", 0),
@@ -93,6 +94,7 @@
("DWORD", "NeedMoney", 0),
("WORD", "SuccessRate", 0),
("WORD", "SuccessRateMax", 0),
+ ("list", "SuccessRateIncrease", 0),
("BYTE", "AddonsCountMax", 0),
("char", "SysMark", 0),
("BYTE", "SysMarkParamType", 0),
@@ -1172,6 +1174,7 @@
def __init__(self):
self.ID = 0
self.MakeID = []
+ self.IsFirstSuccMakeJobItem = 0
self.UnfixedItemID = []
self.UnfixedItemCount = 0
self.FixedItemID = []
@@ -1179,6 +1182,7 @@
self.NeedMoney = 0
self.SuccessRate = 0
self.SuccessRateMax = 0
+ self.SuccessRateIncrease = []
self.AddonsCountMax = 0
self.SysMark = ""
self.SysMarkParamType = 0
@@ -1186,6 +1190,7 @@
def GetID(self): return self.ID # 合成配置编号ID
def GetMakeID(self): return self.MakeID # 可合成的道具ID,多个则随机一个
+ def GetIsFirstSuccMakeJobItem(self): return self.IsFirstSuccMakeJobItem # 首次成功是否必出本职业
def GetUnfixedItemID(self): return self.UnfixedItemID # 不固定道具ID, 多个ID时则任意一种均可
def GetUnfixedItemCount(self): return self.UnfixedItemCount # 不固定道具消耗数量
def GetFixedItemID(self): return self.FixedItemID # 消耗固定道具ID, 多个ID时代表每个ID均需消耗
@@ -1193,6 +1198,7 @@
def GetNeedMoney(self): return self.NeedMoney # 消耗铜钱
def GetSuccessRate(self): return self.SuccessRate # 成功率万分率
def GetSuccessRateMax(self): return self.SuccessRateMax # 最大成功率万分率
+ def GetSuccessRateIncrease(self): return self.SuccessRateIncrease # 提高成功率道具, 道具ID|个数|提高的概率
def GetAddonsCountMax(self): return self.AddonsCountMax # 最大可附加材料数, 增加概率用, 非必须, 0代表不可附加材料
def GetSysMark(self): return self.SysMark # 提示mark
def GetSysMarkParamType(self): return self.SysMarkParamType # 系统提示参数组合类型
--
Gitblit v1.8.0