From 6feb5f6c84521cab58c523d43ba8a8fc02a5029a Mon Sep 17 00:00:00 2001
From: xdh <xiefantasy@qq.com>
Date: 星期六, 13 四月 2019 17:22:00 +0800
Subject: [PATCH] 6485 【2.0】【后端】炼丹功能开发单
---
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerAttrFruit.py | 66 +++
/dev/null | 51 --
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini | 6
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/ClearFruitAttr.py | 2
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py | 68 +++
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py | 130 +++++-
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py | 105 ++---
PySysDB/PySysDBPY.h | 34
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerRefineStove.py | 395 +++++++++------------
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py | 68 +++
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py | 130 +++++-
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py | 12
12 files changed, 637 insertions(+), 430 deletions(-)
diff --git a/PySysDB/PySysDBPY.h b/PySysDB/PySysDBPY.h
index 34507c4..763aa91 100644
--- a/PySysDB/PySysDBPY.h
+++ b/PySysDB/PySysDBPY.h
@@ -234,7 +234,8 @@
{
DWORD _ID; //物品ID
BYTE FuncID; //所属功能ID
- WORD MaxUseCnt; //最大可使用数量
+ dict MaxUseCnt; //境界对应最大可使用数量
+ list AddItemInfo; //[增幅丹ID,单次物品数量,单次增加上限]
WORD RecycleMoney; //回收货币值
DWORD FightPowerEx; //附加战斗力
};
@@ -849,35 +850,34 @@
{
BYTE _StoveLV; //炼丹炉等级
DWORD UpNeedExp; //升下一级所需经验
- list AddAttrType; //等级加成属性类型
- list AddAttrNum; //等级加成属性值
};
//炼丹表
struct tagAlchemy
{
- WORD _AlchemyID; //炼丹编号
- dict Material; //所需所有材料和数量
+ DWORD _ID; //秘方唯一ID不可变更
+ DWORD AlchemItemID; //丹药物品ID
+ BYTE AlchemType; //秘方类型1-灵丹 2-仙丹
+ BYTE AlchemyQuality; //秘方品级
+ DWORD LearnNeedItemID; //丹方物品ID
+ BYTE LearnNeedAlchemLV; //丹方需要炼丹等级
+ WORD LearnNeedLuck; //丹方需要慧根
+ WORD NeedTime; //炼丹时间(秒)
WORD AlchemyExp; //炼丹获得经验值
- list AlchemyItem; //产出物品及数量及权重
- list SpecAlchemyID; //特殊炼丹ID组
- list AlchemyUp; //产出包含的进阶丹药
- BYTE NeedAlchemyLV; //所需炼丹等级
+ dict Material; //炼丹材料
};
-//炼丹特殊产出表
+//炼丹数量表
-struct tagAlchemySpec
+struct tagAlchemyResult
{
- WORD _SpecAlchemyID; //特殊炼丹ID
- DWORD MaterialID; //特殊材料ID
- BYTE MaterialCnt; //特殊材料ID消耗个数
- WORD AlchemyExp; //特殊材料经验
- list AlchemyItem; //产出物品及数量及权重
- BYTE NeedAlchemyLV; //所需炼丹等级
+ BYTE _AlchemyQuality; //丹方等级
+ DWORD LuckValue; //慧根
+ list CntRateList; //数量饼图
};
+
//BOSS信息表
struct tagBOSSInfo
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py
index 8f1ac92..e437179 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py
@@ -5584,6 +5584,58 @@
#------------------------------------------------------
+# A3 17 增加果实使用上限 #tagCMAddFruitUseLimit
+
+class tagCMAddFruitUseLimit(Structure):
+ _pack_ = 1
+ _fields_ = [
+ ("Cmd", c_ubyte),
+ ("SubCmd", c_ubyte),
+ ("ItemID", c_int), #果实物品ID
+ ]
+
+ def __init__(self):
+ self.Clear()
+ self.Cmd = 0xA3
+ self.SubCmd = 0x17
+ 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 = 0xA3
+ self.SubCmd = 0x17
+ self.ItemID = 0
+ return
+
+ def GetLength(self):
+ return sizeof(tagCMAddFruitUseLimit)
+
+ def GetBuffer(self):
+ return string_at(addressof(self), self.GetLength())
+
+ def OutputString(self):
+ DumpString = '''// A3 17 增加果实使用上限 //tagCMAddFruitUseLimit:
+ Cmd:%s,
+ SubCmd:%s,
+ ItemID:%d
+ '''\
+ %(
+ self.Cmd,
+ self.SubCmd,
+ self.ItemID
+ )
+ return DumpString
+
+
+m_NAtagCMAddFruitUseLimit=tagCMAddFruitUseLimit()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMAddFruitUseLimit.Cmd,m_NAtagCMAddFruitUseLimit.SubCmd))] = m_NAtagCMAddFruitUseLimit
+
+
+#------------------------------------------------------
# A3 07 过期物品续费 #tagCMItemRenew
class tagCMItemRenew(Structure):
@@ -10120,8 +10172,8 @@
_fields_ = [
("Cmd", c_ubyte),
("SubCmd", c_ubyte),
- ("RefineNum", c_ushort), # 配方编号
- ("UseRateItem", c_int), # 附加材料ID
+ ("AlchemyID", c_int), # 丹药ID
+ ("DoType", c_ubyte), # 0-学习 1-开始炼丹 2-停止炼丹 3-开炉取丹
]
def __init__(self):
@@ -10138,8 +10190,8 @@
def Clear(self):
self.Cmd = 0xA5
self.SubCmd = 0x76
- self.RefineNum = 0
- self.UseRateItem = 0
+ self.AlchemyID = 0
+ self.DoType = 0
return
def GetLength(self):
@@ -10152,14 +10204,14 @@
DumpString = '''// A5 76 玩家炼丹 //tagCMPlayerRefine:
Cmd:%s,
SubCmd:%s,
- RefineNum:%d,
- UseRateItem:%d
+ AlchemyID:%d,
+ DoType:%d
'''\
%(
self.Cmd,
self.SubCmd,
- self.RefineNum,
- self.UseRateItem
+ self.AlchemyID,
+ self.DoType
)
return DumpString
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
index 19eb427..cbc1371 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
@@ -12389,6 +12389,7 @@
_fields_ = [
("ItemID", c_int), #果实物品ID
("EatCnt", c_ushort), #已使用个数
+ ("AddItemCnt", c_int), #增幅丹使用个数
]
def __init__(self):
@@ -12403,6 +12404,7 @@
def Clear(self):
self.ItemID = 0
self.EatCnt = 0
+ self.AddItemCnt = 0
return
def GetLength(self):
@@ -12414,11 +12416,13 @@
def OutputString(self):
DumpString = '''// A3 39 玩家属性果实已使用个数信息//tagMCAttrFruitEatCntList:
ItemID:%d,
- EatCnt:%d
+ EatCnt:%d,
+ AddItemCnt:%d
'''\
%(
self.ItemID,
- self.EatCnt
+ self.EatCnt,
+ self.AddItemCnt
)
return DumpString
@@ -16160,20 +16164,15 @@
#------------------------------------------------------
# A3 BF 通知客户端炼丹炉信息 #tagMCPlayerStoveMsg
-class tagMCPlayerStoveMsg(Structure):
+class tagMCPlayerStoveInfo(Structure):
_pack_ = 1
_fields_ = [
- ("Cmd", c_ubyte),
- ("SubCmd", c_ubyte),
- ("StoveLV", c_ubyte), # 炼丹炉等级
- ("StoveExp", c_int), # 炼丹炉经验
- ("ItemID", c_int), # 合成物品id
+ ("AlchemyID", c_int), # 丹 ID
+ ("StartTime", c_int), # 开始炼的时间
]
def __init__(self):
self.Clear()
- self.Cmd = 0xA3
- self.SubCmd = 0xBF
return
def ReadData(self, stringData, _pos=0, _len=0):
@@ -16182,39 +16181,120 @@
return _pos + self.GetLength()
def Clear(self):
- self.Cmd = 0xA3
- self.SubCmd = 0xBF
- self.StoveLV = 0
- self.StoveExp = 0
- self.ItemID = 0
+ self.AlchemyID = 0
+ self.StartTime = 0
return
def GetLength(self):
- return sizeof(tagMCPlayerStoveMsg)
+ return sizeof(tagMCPlayerStoveInfo)
def GetBuffer(self):
return string_at(addressof(self), self.GetLength())
def OutputString(self):
DumpString = '''// A3 BF 通知客户端炼丹炉信息 //tagMCPlayerStoveMsg:
- Cmd:%s,
- SubCmd:%s,
- StoveLV:%d,
- StoveExp:%d,
- ItemID:%d
+ AlchemyID:%d,
+ StartTime:%d
'''\
%(
- self.Cmd,
- self.SubCmd,
+ self.AlchemyID,
+ self.StartTime
+ )
+ return DumpString
+
+
+class tagMCPlayerStoveMsg(Structure):
+ Head = tagHead()
+ StoveLV = 0 #(BYTE StoveLV)// 炼丹炉等级
+ StoveExp = 0 #(DWORD StoveExp)// 炼丹炉经验
+ ItemID = 0 #(DWORD ItemID)// 合成物品id
+ ItemCnt = 0 #(BYTE ItemCnt)// 丹药数量
+ StoveCnt = 0 #(WORD StoveCnt)// 丹药数量
+ InfoList = list() #(vector<tagMCPlayerStoveInfo> InfoList)
+ data = None
+
+ def __init__(self):
+ self.Clear()
+ self.Head.Cmd = 0xA3
+ self.Head.SubCmd = 0xBF
+ return
+
+ def ReadData(self, _lpData, _pos=0, _Len=0):
+ self.Clear()
+ _pos = self.Head.ReadData(_lpData, _pos)
+ self.StoveLV,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+ self.StoveExp,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+ self.ItemID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+ self.ItemCnt,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+ self.StoveCnt,_pos = CommFunc.ReadWORD(_lpData, _pos)
+ for i in range(self.StoveCnt):
+ temInfoList = tagMCPlayerStoveInfo()
+ _pos = temInfoList.ReadData(_lpData, _pos)
+ self.InfoList.append(temInfoList)
+ return _pos
+
+ def Clear(self):
+ self.Head = tagHead()
+ self.Head.Clear()
+ self.Head.Cmd = 0xA3
+ self.Head.SubCmd = 0xBF
+ self.StoveLV = 0
+ self.StoveExp = 0
+ self.ItemID = 0
+ self.ItemCnt = 0
+ self.StoveCnt = 0
+ self.InfoList = list()
+ return
+
+ def GetLength(self):
+ length = 0
+ length += self.Head.GetLength()
+ length += 1
+ length += 4
+ length += 4
+ length += 1
+ length += 2
+ for i in range(self.StoveCnt):
+ length += self.InfoList[i].GetLength()
+
+ return length
+
+ def GetBuffer(self):
+ data = ''
+ data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+ data = CommFunc.WriteBYTE(data, self.StoveLV)
+ data = CommFunc.WriteDWORD(data, self.StoveExp)
+ data = CommFunc.WriteDWORD(data, self.ItemID)
+ data = CommFunc.WriteBYTE(data, self.ItemCnt)
+ data = CommFunc.WriteWORD(data, self.StoveCnt)
+ for i in range(self.StoveCnt):
+ data = CommFunc.WriteString(data, self.InfoList[i].GetLength(), self.InfoList[i].GetBuffer())
+ return data
+
+ def OutputString(self):
+ DumpString = '''
+ Head:%s,
+ StoveLV:%d,
+ StoveExp:%d,
+ ItemID:%d,
+ ItemCnt:%d,
+ StoveCnt:%d,
+ InfoList:%s
+ '''\
+ %(
+ self.Head.OutputString(),
self.StoveLV,
self.StoveExp,
- self.ItemID
+ self.ItemID,
+ self.ItemCnt,
+ self.StoveCnt,
+ "..."
)
return DumpString
m_NAtagMCPlayerStoveMsg=tagMCPlayerStoveMsg()
-ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCPlayerStoveMsg.Cmd,m_NAtagMCPlayerStoveMsg.SubCmd))] = m_NAtagMCPlayerStoveMsg
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCPlayerStoveMsg.Head.Cmd,m_NAtagMCPlayerStoveMsg.Head.SubCmd))] = m_NAtagMCPlayerStoveMsg
#------------------------------------------------------
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini
index f03bd88..cbb88d8 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini
@@ -812,7 +812,7 @@
Writer = xdh
Releaser = xdh
RegType = 0
-RegisterPackCount = 2
+RegisterPackCount = 3
PacketCMD_1=0xA3
PacketSubCMD_1=0x2B
@@ -822,6 +822,10 @@
PacketSubCMD_2=0x2A
PacketCallFunc_2=OnRecycleAttrFruit
+PacketCMD_3=0xA3
+PacketSubCMD_3=0x17
+PacketCallFunc_3=OnAddFruitUseLimit
+
;开服活动
[OpenServerCampaign]
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
index b6fc629..9b78803 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -3468,6 +3468,8 @@
Def_PDict_AddPointValue = "AddPointValue_%s" # 已加属性点数, 参数(属性ID)
Def_PDict_AttrFruitEatCnt = "AttrFruitEatCnt_%s" # 已吃属性果实个数,参数为物品id
Def_PDict_AttrFruitAddValue = "AttrFruitAddValue_%s" # 已吃属性果实增加的属性,参数为物品id
+Def_PDict_AttrFruitAddItemCnt = "FruitAddItemCnt_%s" # 已吃增幅丹个数,参数为果实物品id
+
Def_PDict_NobleLV = "NobleLV" # 贵族等级, 0位为不同贵族模式版本切换标记位, 从1位开始表示每种等级贵族开通情况, 1-已开通过;9-永久
Def_PDict_NobleEndTime = "NobleEndTime_%s" # 贵族到期结束时间<单位s>, 参数为贵族等级, 从1开始
@@ -3829,9 +3831,11 @@
#炼丹炉
Def_PDict_AlchemyLV = "AlchemyLV" #炼丹等级
Def_PDict_AlchemyExp = "AlchemyExp" #炼丹经验
-Def_PDict_AlchemyCount = "AlchemyCount_%s" #特殊炼丹次数产出设定已累计次数, 参数(配方ID)
-Def_PDict_AlchemyCountSpec = "AlchemyCountSpec_%s" #特殊炼丹次数产出设定已累计次数, 参数(配方ID)
-Def_PDict_AlchemyOutputCount = "AlchemyOutputCount_%s" #炼丹特殊产出物品已产出次数,参数(物品ID)
+Def_PDict_AlchemyLearnState = "AlchemyLearnState%s" #丹方是否已学习
+Def_PDict_AlchemyItemID = "AlchemyItemID_%s" #炼丹中的丹药ID 参数丹药类型
+Def_PDict_AlchemyStartTime = "AlchemyStartTime_%s" #炼丹开始时间 参数丹药ID
+
+
Def_PDict_AlchemyPrayCnt = "AlchemyPrayCnt" #炼丹祈福次数
Def_PDict_GFPassiveIndex = "GFP_%s_%s" # 被动功法 页数-索引
@@ -4272,7 +4276,7 @@
Def_CalcAttrFunc_EquipOutOfPrint, # 绝版属性随等级变化 15
Def_CalcAttrFunc_Success, # 成就属性 16
Def_CalcAttrFunc_VIP, # VIP属性 17
-Def_CalcAttrFunc_Stove, # 炼丹炉 18
+Def_CalcAttrFunc_Stove, # 炼丹炉 18(废弃)
Def_CalcAttrFunc_FamilyTech, # 仙盟心法 19
Def_CalcAttrFunc_EquipDecompose, # 装备分解属性 20
Def_CalcAttrFunc_PetSoul, # 宠物魂石 21
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
index 8f1ac92..e437179 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
@@ -5584,6 +5584,58 @@
#------------------------------------------------------
+# A3 17 增加果实使用上限 #tagCMAddFruitUseLimit
+
+class tagCMAddFruitUseLimit(Structure):
+ _pack_ = 1
+ _fields_ = [
+ ("Cmd", c_ubyte),
+ ("SubCmd", c_ubyte),
+ ("ItemID", c_int), #果实物品ID
+ ]
+
+ def __init__(self):
+ self.Clear()
+ self.Cmd = 0xA3
+ self.SubCmd = 0x17
+ 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 = 0xA3
+ self.SubCmd = 0x17
+ self.ItemID = 0
+ return
+
+ def GetLength(self):
+ return sizeof(tagCMAddFruitUseLimit)
+
+ def GetBuffer(self):
+ return string_at(addressof(self), self.GetLength())
+
+ def OutputString(self):
+ DumpString = '''// A3 17 增加果实使用上限 //tagCMAddFruitUseLimit:
+ Cmd:%s,
+ SubCmd:%s,
+ ItemID:%d
+ '''\
+ %(
+ self.Cmd,
+ self.SubCmd,
+ self.ItemID
+ )
+ return DumpString
+
+
+m_NAtagCMAddFruitUseLimit=tagCMAddFruitUseLimit()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMAddFruitUseLimit.Cmd,m_NAtagCMAddFruitUseLimit.SubCmd))] = m_NAtagCMAddFruitUseLimit
+
+
+#------------------------------------------------------
# A3 07 过期物品续费 #tagCMItemRenew
class tagCMItemRenew(Structure):
@@ -10120,8 +10172,8 @@
_fields_ = [
("Cmd", c_ubyte),
("SubCmd", c_ubyte),
- ("RefineNum", c_ushort), # 配方编号
- ("UseRateItem", c_int), # 附加材料ID
+ ("AlchemyID", c_int), # 丹药ID
+ ("DoType", c_ubyte), # 0-学习 1-开始炼丹 2-停止炼丹 3-开炉取丹
]
def __init__(self):
@@ -10138,8 +10190,8 @@
def Clear(self):
self.Cmd = 0xA5
self.SubCmd = 0x76
- self.RefineNum = 0
- self.UseRateItem = 0
+ self.AlchemyID = 0
+ self.DoType = 0
return
def GetLength(self):
@@ -10152,14 +10204,14 @@
DumpString = '''// A5 76 玩家炼丹 //tagCMPlayerRefine:
Cmd:%s,
SubCmd:%s,
- RefineNum:%d,
- UseRateItem:%d
+ AlchemyID:%d,
+ DoType:%d
'''\
%(
self.Cmd,
self.SubCmd,
- self.RefineNum,
- self.UseRateItem
+ self.AlchemyID,
+ self.DoType
)
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 19eb427..cbc1371 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -12389,6 +12389,7 @@
_fields_ = [
("ItemID", c_int), #果实物品ID
("EatCnt", c_ushort), #已使用个数
+ ("AddItemCnt", c_int), #增幅丹使用个数
]
def __init__(self):
@@ -12403,6 +12404,7 @@
def Clear(self):
self.ItemID = 0
self.EatCnt = 0
+ self.AddItemCnt = 0
return
def GetLength(self):
@@ -12414,11 +12416,13 @@
def OutputString(self):
DumpString = '''// A3 39 玩家属性果实已使用个数信息//tagMCAttrFruitEatCntList:
ItemID:%d,
- EatCnt:%d
+ EatCnt:%d,
+ AddItemCnt:%d
'''\
%(
self.ItemID,
- self.EatCnt
+ self.EatCnt,
+ self.AddItemCnt
)
return DumpString
@@ -16160,20 +16164,15 @@
#------------------------------------------------------
# A3 BF 通知客户端炼丹炉信息 #tagMCPlayerStoveMsg
-class tagMCPlayerStoveMsg(Structure):
+class tagMCPlayerStoveInfo(Structure):
_pack_ = 1
_fields_ = [
- ("Cmd", c_ubyte),
- ("SubCmd", c_ubyte),
- ("StoveLV", c_ubyte), # 炼丹炉等级
- ("StoveExp", c_int), # 炼丹炉经验
- ("ItemID", c_int), # 合成物品id
+ ("AlchemyID", c_int), # 丹 ID
+ ("StartTime", c_int), # 开始炼的时间
]
def __init__(self):
self.Clear()
- self.Cmd = 0xA3
- self.SubCmd = 0xBF
return
def ReadData(self, stringData, _pos=0, _len=0):
@@ -16182,39 +16181,120 @@
return _pos + self.GetLength()
def Clear(self):
- self.Cmd = 0xA3
- self.SubCmd = 0xBF
- self.StoveLV = 0
- self.StoveExp = 0
- self.ItemID = 0
+ self.AlchemyID = 0
+ self.StartTime = 0
return
def GetLength(self):
- return sizeof(tagMCPlayerStoveMsg)
+ return sizeof(tagMCPlayerStoveInfo)
def GetBuffer(self):
return string_at(addressof(self), self.GetLength())
def OutputString(self):
DumpString = '''// A3 BF 通知客户端炼丹炉信息 //tagMCPlayerStoveMsg:
- Cmd:%s,
- SubCmd:%s,
- StoveLV:%d,
- StoveExp:%d,
- ItemID:%d
+ AlchemyID:%d,
+ StartTime:%d
'''\
%(
- self.Cmd,
- self.SubCmd,
+ self.AlchemyID,
+ self.StartTime
+ )
+ return DumpString
+
+
+class tagMCPlayerStoveMsg(Structure):
+ Head = tagHead()
+ StoveLV = 0 #(BYTE StoveLV)// 炼丹炉等级
+ StoveExp = 0 #(DWORD StoveExp)// 炼丹炉经验
+ ItemID = 0 #(DWORD ItemID)// 合成物品id
+ ItemCnt = 0 #(BYTE ItemCnt)// 丹药数量
+ StoveCnt = 0 #(WORD StoveCnt)// 丹药数量
+ InfoList = list() #(vector<tagMCPlayerStoveInfo> InfoList)
+ data = None
+
+ def __init__(self):
+ self.Clear()
+ self.Head.Cmd = 0xA3
+ self.Head.SubCmd = 0xBF
+ return
+
+ def ReadData(self, _lpData, _pos=0, _Len=0):
+ self.Clear()
+ _pos = self.Head.ReadData(_lpData, _pos)
+ self.StoveLV,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+ self.StoveExp,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+ self.ItemID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+ self.ItemCnt,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+ self.StoveCnt,_pos = CommFunc.ReadWORD(_lpData, _pos)
+ for i in range(self.StoveCnt):
+ temInfoList = tagMCPlayerStoveInfo()
+ _pos = temInfoList.ReadData(_lpData, _pos)
+ self.InfoList.append(temInfoList)
+ return _pos
+
+ def Clear(self):
+ self.Head = tagHead()
+ self.Head.Clear()
+ self.Head.Cmd = 0xA3
+ self.Head.SubCmd = 0xBF
+ self.StoveLV = 0
+ self.StoveExp = 0
+ self.ItemID = 0
+ self.ItemCnt = 0
+ self.StoveCnt = 0
+ self.InfoList = list()
+ return
+
+ def GetLength(self):
+ length = 0
+ length += self.Head.GetLength()
+ length += 1
+ length += 4
+ length += 4
+ length += 1
+ length += 2
+ for i in range(self.StoveCnt):
+ length += self.InfoList[i].GetLength()
+
+ return length
+
+ def GetBuffer(self):
+ data = ''
+ data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+ data = CommFunc.WriteBYTE(data, self.StoveLV)
+ data = CommFunc.WriteDWORD(data, self.StoveExp)
+ data = CommFunc.WriteDWORD(data, self.ItemID)
+ data = CommFunc.WriteBYTE(data, self.ItemCnt)
+ data = CommFunc.WriteWORD(data, self.StoveCnt)
+ for i in range(self.StoveCnt):
+ data = CommFunc.WriteString(data, self.InfoList[i].GetLength(), self.InfoList[i].GetBuffer())
+ return data
+
+ def OutputString(self):
+ DumpString = '''
+ Head:%s,
+ StoveLV:%d,
+ StoveExp:%d,
+ ItemID:%d,
+ ItemCnt:%d,
+ StoveCnt:%d,
+ InfoList:%s
+ '''\
+ %(
+ self.Head.OutputString(),
self.StoveLV,
self.StoveExp,
- self.ItemID
+ self.ItemID,
+ self.ItemCnt,
+ self.StoveCnt,
+ "..."
)
return DumpString
m_NAtagMCPlayerStoveMsg=tagMCPlayerStoveMsg()
-ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCPlayerStoveMsg.Cmd,m_NAtagMCPlayerStoveMsg.SubCmd))] = m_NAtagMCPlayerStoveMsg
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCPlayerStoveMsg.Head.Cmd,m_NAtagMCPlayerStoveMsg.Head.SubCmd))] = m_NAtagMCPlayerStoveMsg
#------------------------------------------------------
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/ClearFruitAttr.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/ClearFruitAttr.py
index d90846e..455a187 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/ClearFruitAttr.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/ClearFruitAttr.py
@@ -79,7 +79,7 @@
curPlayer.SetDict(attrKey, 0)
if isGiveFruitItem:
- giveFruitItemList.append([itemID, ipyData.GetMaxUseCnt()])
+ giveFruitItemList.append([itemID, PlayerAttrFruit.GetMaxEatCnt(curPlayer, itemID)])
PlayerAttrFruit.Sync_AttrFruitEatCnt(curPlayer)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/SetAlchemyCount.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/SetAlchemyCount.py
deleted file mode 100644
index 5307e56..0000000
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/SetAlchemyCount.py
+++ /dev/null
@@ -1,51 +0,0 @@
-#!/usr/bin/python
-# -*- coding: GBK -*-
-#-------------------------------------------------------------------------------
-#
-##@package GM.Commands.SetAlchemyCount
-#
-# @todo:设置炼丹次数
-# @author hxp
-# @date 2018-03-19
-# @version 1.0
-#
-# 详细描述: 设置炼丹次数
-#
-#-------------------------------------------------------------------------------
-#"""Version = 2018-03-19 19:30"""
-#-------------------------------------------------------------------------------
-
-import GameWorld
-import PlayerControl
-import IpyGameDataPY
-import ChConfig
-
-
-## 逻辑实现
-# @param curPlayer
-# @param cmdList 参数列表
-# @return None
-def OnExec(curPlayer, cmdList):
- if not cmdList:
- #GameWorld.DebugAnswer(curPlayer, "SetAlchemyCount 炼丹编号 次数 是否特殊炼丹")
- GameWorld.DebugAnswer(curPlayer, "SetAlchemyCount 所有炼丹次数")
- return
-
- SpecialAlchemyDictComm = IpyGameDataPY.GetFuncEvalCfg("SpecialAlchemy", 1)
- SpecialAlchemyDictSpec = IpyGameDataPY.GetFuncEvalCfg("SpecialAlchemy", 2)
-
- alchemyCount = cmdList[0]
- for alchemyID in SpecialAlchemyDictComm.keys():
- PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_AlchemyCount % alchemyID, alchemyCount)
- GameWorld.DebugAnswer(curPlayer, "设置普通炼丹次数,ID=%s,次数=%s" % (alchemyID, alchemyCount))
- for specID in SpecialAlchemyDictSpec.keys():
- PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_AlchemyCountSpec % specID, alchemyCount)
- GameWorld.DebugAnswer(curPlayer, "设置特殊炼丹次数,ID=%s,次数=%s" % (specID, alchemyCount))
-
- if alchemyCount == 0:
- outPutCountLimitDict = IpyGameDataPY.GetFuncEvalCfg("SpecialAlchemy", 3)
- for itemID in outPutCountLimitDict.keys():
- PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_AlchemyOutputCount % itemID, 0)
- GameWorld.DebugAnswer(curPlayer, "重置特殊物品产出次数: %s" % str(outPutCountLimitDict.keys()))
-
- return
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
index a00ba7b..db11233 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
@@ -205,7 +205,8 @@
"AttrFruit":(
("DWORD", "ID", 1),
("BYTE", "FuncID", 0),
- ("WORD", "MaxUseCnt", 0),
+ ("dict", "MaxUseCnt", 0),
+ ("list", "AddItemInfo", 0),
("WORD", "RecycleMoney", 0),
("DWORD", "FightPowerEx", 0),
),
@@ -698,27 +699,25 @@
"RefineStove":(
("BYTE", "StoveLV", 1),
("DWORD", "UpNeedExp", 0),
- ("list", "AddAttrType", 0),
- ("list", "AddAttrNum", 0),
),
"Alchemy":(
- ("WORD", "AlchemyID", 1),
- ("dict", "Material", 0),
+ ("DWORD", "ID", 1),
+ ("DWORD", "AlchemItemID", 0),
+ ("BYTE", "AlchemType", 0),
+ ("BYTE", "AlchemyQuality", 0),
+ ("DWORD", "LearnNeedItemID", 0),
+ ("BYTE", "LearnNeedAlchemLV", 0),
+ ("WORD", "LearnNeedLuck", 0),
+ ("WORD", "NeedTime", 0),
("WORD", "AlchemyExp", 0),
- ("list", "AlchemyItem", 0),
- ("list", "SpecAlchemyID", 0),
- ("list", "AlchemyUp", 0),
- ("BYTE", "NeedAlchemyLV", 0),
+ ("dict", "Material", 0),
),
- "AlchemySpec":(
- ("WORD", "SpecAlchemyID", 1),
- ("DWORD", "MaterialID", 0),
- ("BYTE", "MaterialCnt", 0),
- ("WORD", "AlchemyExp", 0),
- ("list", "AlchemyItem", 0),
- ("BYTE", "NeedAlchemyLV", 0),
+ "AlchemyResult":(
+ ("BYTE", "AlchemyQuality", 1),
+ ("DWORD", "LuckValue", 0),
+ ("list", "CntRateList", 0),
),
"BOSSInfo":(
@@ -1781,14 +1780,16 @@
def __init__(self):
self.ID = 0
self.FuncID = 0
- self.MaxUseCnt = 0
+ self.MaxUseCnt = {}
+ self.AddItemInfo = []
self.RecycleMoney = 0
self.FightPowerEx = 0
return
def GetID(self): return self.ID # 物品ID
def GetFuncID(self): return self.FuncID # 所属功能ID
- def GetMaxUseCnt(self): return self.MaxUseCnt # 最大可使用数量
+ def GetMaxUseCnt(self): return self.MaxUseCnt # 境界对应最大可使用数量
+ def GetAddItemInfo(self): return self.AddItemInfo # [增幅丹ID,单次物品数量,单次增加上限]
def GetRecycleMoney(self): return self.RecycleMoney # 回收货币值
def GetFightPowerEx(self): return self.FightPowerEx # 附加战斗力
@@ -2804,55 +2805,51 @@
def __init__(self):
self.StoveLV = 0
- self.UpNeedExp = 0
- self.AddAttrType = []
- self.AddAttrNum = []
+ self.UpNeedExp = 0
return
def GetStoveLV(self): return self.StoveLV # 炼丹炉等级
- def GetUpNeedExp(self): return self.UpNeedExp # 升下一级所需经验
- def GetAddAttrType(self): return self.AddAttrType # 等级加成属性类型
- def GetAddAttrNum(self): return self.AddAttrNum # 等级加成属性值
+ def GetUpNeedExp(self): return self.UpNeedExp # 升下一级所需经验
# 炼丹表
class IPY_Alchemy():
def __init__(self):
- self.AlchemyID = 0
- self.Material = {}
+ self.ID = 0
+ self.AlchemItemID = 0
+ self.AlchemType = 0
+ self.AlchemyQuality = 0
+ self.LearnNeedItemID = 0
+ self.LearnNeedAlchemLV = 0
+ self.LearnNeedLuck = 0
+ self.NeedTime = 0
self.AlchemyExp = 0
- self.AlchemyItem = []
- self.SpecAlchemyID = []
- self.AlchemyUp = []
- self.NeedAlchemyLV = 0
+ self.Material = {}
return
- def GetAlchemyID(self): return self.AlchemyID # 炼丹编号
- def GetMaterial(self): return self.Material # 所需所有材料和数量
+ def GetID(self): return self.ID # 秘方唯一ID不可变更
+ def GetAlchemItemID(self): return self.AlchemItemID # 丹药物品ID
+ def GetAlchemType(self): return self.AlchemType # 秘方类型1-灵丹 2-仙丹
+ def GetAlchemyQuality(self): return self.AlchemyQuality # 秘方品级
+ def GetLearnNeedItemID(self): return self.LearnNeedItemID # 丹方物品ID
+ def GetLearnNeedAlchemLV(self): return self.LearnNeedAlchemLV # 丹方需要炼丹等级
+ def GetLearnNeedLuck(self): return self.LearnNeedLuck # 丹方需要慧根
+ def GetNeedTime(self): return self.NeedTime # 炼丹时间(秒)
def GetAlchemyExp(self): return self.AlchemyExp # 炼丹获得经验值
- def GetAlchemyItem(self): return self.AlchemyItem # 产出物品及数量及权重
- def GetSpecAlchemyID(self): return self.SpecAlchemyID # 特殊炼丹ID组
- def GetAlchemyUp(self): return self.AlchemyUp # 产出包含的进阶丹药
- def GetNeedAlchemyLV(self): return self.NeedAlchemyLV # 所需炼丹等级
+ def GetMaterial(self): return self.Material # 炼丹材料
-# 炼丹特殊产出表
-class IPY_AlchemySpec():
+# 炼丹数量表
+class IPY_AlchemyResult():
def __init__(self):
- self.SpecAlchemyID = 0
- self.MaterialID = 0
- self.MaterialCnt = 0
- self.AlchemyExp = 0
- self.AlchemyItem = []
- self.NeedAlchemyLV = 0
+ self.AlchemyQuality = 0
+ self.LuckValue = 0
+ self.CntRateList = []
return
- def GetSpecAlchemyID(self): return self.SpecAlchemyID # 特殊炼丹ID
- def GetMaterialID(self): return self.MaterialID # 特殊材料ID
- def GetMaterialCnt(self): return self.MaterialCnt # 特殊材料ID消耗个数
- def GetAlchemyExp(self): return self.AlchemyExp # 特殊材料经验
- def GetAlchemyItem(self): return self.AlchemyItem # 产出物品及数量及权重
- def GetNeedAlchemyLV(self): return self.NeedAlchemyLV # 所需炼丹等级
+ def GetAlchemyQuality(self): return self.AlchemyQuality # 丹方等级
+ def GetLuckValue(self): return self.LuckValue # 慧根
+ def GetCntRateList(self): return self.CntRateList # 数量饼图
# BOSS信息表
class IPY_BOSSInfo():
@@ -4467,8 +4464,8 @@
self.ipyRefineStoveLen = len(self.ipyRefineStoveCache)
self.ipyAlchemyCache = self.__LoadFileData("Alchemy", IPY_Alchemy)
self.ipyAlchemyLen = len(self.ipyAlchemyCache)
- self.ipyAlchemySpecCache = self.__LoadFileData("AlchemySpec", IPY_AlchemySpec)
- self.ipyAlchemySpecLen = len(self.ipyAlchemySpecCache)
+ self.ipyAlchemyResultCache = self.__LoadFileData("AlchemyResult", IPY_AlchemyResult)
+ self.ipyAlchemyResultLen = len(self.ipyAlchemyResultCache)
self.ipyBOSSInfoCache = self.__LoadFileData("BOSSInfo", IPY_BOSSInfo)
self.ipyBOSSInfoLen = len(self.ipyBOSSInfoCache)
self.ipyElderGodAreaCache = self.__LoadFileData("ElderGodArea", IPY_ElderGodArea)
@@ -4921,8 +4918,8 @@
def GetRefineStoveByIndex(self, index): return self.ipyRefineStoveCache[index]
def GetAlchemyCount(self): return self.ipyAlchemyLen
def GetAlchemyByIndex(self, index): return self.ipyAlchemyCache[index]
- def GetAlchemySpecCount(self): return self.ipyAlchemySpecLen
- def GetAlchemySpecByIndex(self, index): return self.ipyAlchemySpecCache[index]
+ def GetAlchemyResultCount(self): return self.ipyAlchemyResultLen
+ def GetAlchemyResultByIndex(self, index): return self.ipyAlchemyResultCache[index]
def GetBOSSInfoCount(self): return self.ipyBOSSInfoLen
def GetBOSSInfoByIndex(self, index): return self.ipyBOSSInfoCache[index]
def GetElderGodAreaCount(self): return self.ipyElderGodAreaLen
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerAttrFruit.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerAttrFruit.py
index a4f10f9..5f9e96a 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerAttrFruit.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerAttrFruit.py
@@ -98,7 +98,7 @@
if not ipyData:
continue
- maxEatCnt = ipyData.GetMaxUseCnt()
+ maxEatCnt = GetMaxEatCnt(curPlayer, itemID)
eatCntKey = ChConfig.Def_PDict_AttrFruitEatCnt % itemID
limitType = Def_LimitType_Cnt
if limitType == Def_LimitType_Attr:
@@ -216,7 +216,7 @@
funcIndex = ipyData.GetFuncID()
limitType = Def_LimitType_Cnt
- maxEatCnt = ipyData.GetMaxUseCnt()
+ maxEatCnt = GetMaxEatCnt(curPlayer, itemID)
if funcIndex not in ShareDefine.Def_AttrFruitFuncList:
GameWorld.ErrLog("该属性果实功能未开放!funcIndex=%s"%funcIndex)
@@ -446,7 +446,7 @@
eatCntPack.Clear()
eatCntPack.ItemID = fruitItemID
eatCntPack.EatCnt = curPlayer.NomalDictGetProperty(eatCntKey)
- #eatCntPack.AddAttr = curPlayer.NomalDictGetProperty(addValueKey)
+ eatCntPack.AddItemCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_AttrFruitAddItemCnt % fruitItemID)
eatPack.EatCntList.append(eatCntPack)
eatPack.count = len(eatPack.EatCntList)
@@ -480,11 +480,7 @@
def IsFruitEatFull(curPlayer, itemID):
#使用次数是否已满
- ipyData = GetAttrFruitIpyData(itemID)
- if not ipyData:
- return
-
- maxEatCnt = ipyData.GetMaxUseCnt()
+ maxEatCnt = GetMaxEatCnt(curPlayer, itemID)
eatCntKey = ChConfig.Def_PDict_AttrFruitEatCnt % itemID
limitType = Def_LimitType_Cnt
if limitType == Def_LimitType_Attr:
@@ -492,4 +488,56 @@
eatCnt = curPlayer.NomalDictGetProperty(eatCntKey) # 已吃次数/属性值
if eatCnt >= maxEatCnt:
return True
- return
\ No newline at end of file
+ return
+
+def GetMaxEatCnt(curPlayer, itemID):
+ ##获取果实最大可用个数
+ ipyData = GetAttrFruitIpyData(itemID)
+ if not ipyData:
+ return 0
+ maxEatCntDict = ipyData.GetMaxUseCnt()
+ realmLV = curPlayer.GetOfficialRank()
+ orderList = sorted(maxEatCntDict.keys(), reverse=True)
+ maxEatCnt = 0
+ for order in orderList:
+ if realmLV >= order:
+ maxEatCnt = maxEatCntDict[order]
+ break
+ addItemUseCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_AttrFruitAddItemCnt % itemID)
+ if addItemUseCnt:
+ addItemInfo = ipyData.GetAddItemInfo()
+ if addItemInfo:
+ singleItemCnt, singleAddCnt = addItemInfo[1:]
+ maxEatCnt += (addItemUseCnt/singleItemCnt*singleAddCnt)
+ return maxEatCnt
+
+
+#// A3 17 增加果实使用上限 #tagCMAddFruitUseLimit
+#
+#struct tagCMAddFruitUseLimit
+#{
+# tagHead Head;
+# DWORD ItemID; //果实物品ID
+#};
+def OnAddFruitUseLimit(index, packData, tick):
+ curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
+ itemID = packData.ItemID
+ ipyData = GetAttrFruitIpyData(itemID)
+ if not ipyData:
+ return
+ addItemInfo = ipyData.GetAddItemInfo()
+ if not addItemInfo:
+ return
+ addItemUseCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_AttrFruitAddItemCnt % itemID)
+ needItemID, singleItemCnt, singleAddCnt = addItemInfo
+ if addItemUseCnt + singleItemCnt> ChConfig.Def_UpperLimit_DWord:
+ return
+ itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
+ enough, indexList, hasBind, lackCnt = ItemCommon.GetItem_FromPack_ByID_ExEx(needItemID, itemPack, singleItemCnt)
+ if not enough:
+ return
+ ItemCommon.ReduceItem(curPlayer, itemPack, indexList, singleItemCnt, False, "AddFruitUseLimit")
+ PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_AttrFruitAddItemCnt % itemID, addItemUseCnt+singleItemCnt)
+
+ Sync_AttrFruitEatCnt(curPlayer, [itemID])
+ return
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerRefineStove.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerRefineStove.py
index 3c5bf18..b6abbcf 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerRefineStove.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerRefineStove.py
@@ -6,13 +6,13 @@
##@package PlayerRefineStove
# @todo: 玩家炼丹炉
#
-# @author: sgj
-# @date 2017-11-07
+# @author: xdh
+# @date 2019-4-12
# @version 1.0
#
# @note:
#---------------------------------------------------------------------
-#"""Version = 2017-11-07 16:40"""
+#"""Version = 2019-4-12 16:40"""
#---------------------------------------------------------------------
import ChConfig
import GameWorld
@@ -35,6 +35,9 @@
import PlayerVip
import copy
+import time
+
+DefStoveTypeList = [1, 2] #1灵丹 2仙丹
##功能开启
@@ -44,24 +47,27 @@
Sycn_AlchemyMsg(curPlayer)
return True
+
##登录处理
def DoOnLogin(curPlayer, tick):
Sycn_AlchemyMsg(curPlayer)
Sycn_AlchemyPrayMsg(curPlayer)
return
+
def OnDay(curPlayer):
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_AlchemyPrayCnt, 0)
Sycn_AlchemyPrayMsg(curPlayer)
return
+
#// A5 76 玩家炼丹 #tagCMPlayerRefine
#
#struct tagCMPlayerRefine
#{
# tagHead Head;
-# WORD RefineNum; // 配方编号
-# DWORD UseRateItem; // 附加材料ID
+# DWORD AlchemyID; // 丹药ID
+# BYTE DoType; // 0-学习 1-开始炼丹 2-停止炼丹 3-开炉取丹
#};
def PlayerRefineItem(index, clientPack, tick):
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
@@ -70,193 +76,147 @@
GameWorld.DebugLog("炼丹炉功能未开启!", playerID)
return
- alchemyID = clientPack.RefineNum
- specID = clientPack.UseRateItem # 特殊炼丹ID
- GameWorld.DebugLog("玩家炼丹: alchemyID=%s,specID=%s" % (alchemyID, specID), playerID)
+ alchemyID = clientPack.AlchemyID
+ doType = clientPack.DoType
+ GameWorld.DebugLog("玩家炼丹: alchemyID=%s, doType=%s" % (alchemyID, doType), playerID)
alchemyIpyData = IpyGameDataPY.GetIpyGameData("Alchemy", alchemyID)
if not alchemyIpyData:
GameWorld.DebugLog("配方不存在!alchemyID=%s" % alchemyID, playerID)
return
-
- specAlchemyIpyData = None
- if specID:
- specAlchemyIDList = alchemyIpyData.GetSpecAlchemyID()
- if specID not in specAlchemyIDList:
- GameWorld.DebugLog("非法特殊配方!alchemyID=%s,specID=%s" % (alchemyID, specID), playerID)
- return
- specAlchemyIpyData = IpyGameDataPY.GetIpyGameData("AlchemySpec", specID)
- if not specAlchemyIpyData:
- GameWorld.DebugLog("特殊配方不存在!alchemyID=%s,specID=%s" % (alchemyID, specID), playerID)
- return
-
- # 等级判断
+ alchemType = alchemyIpyData.GetAlchemType()
+ alchemyItemID = alchemyIpyData.GetAlchemItemID()
+ hasLearn = GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_AlchemyLearnState, alchemyID)
alchemyLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_AlchemyLV)
- if alchemyLV < alchemyIpyData.GetNeedAlchemyLV():
- GameWorld.DebugLog("配方未开启!alchemyID=%s,needAlchemyLV=%s,curAlchemyLV=%s"
- % (alchemyID, alchemyIpyData.GetNeedAlchemyLV(), alchemyLV), playerID)
- return
- if specAlchemyIpyData:
- if alchemyLV < specAlchemyIpyData.GetNeedAlchemyLV():
- GameWorld.DebugLog("特殊配方未开启!alchemyID=%s,specID=%s,needAlchemyLV=%s,curAlchemyLV=%s"
- % (alchemyID, specID, specAlchemyIpyData.GetNeedAlchemyLV(), alchemyLV), playerID)
+ curAlchemyItemID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_AlchemyItemID % alchemType) #正在炼的丹
+ curLuckValue = curPlayer.GetLuckValue()
+ curTime = int(time.time())
+
+ if doType == 0:
+ if hasLearn:
+ GameWorld.DebugLog('丹方已学习!,不可重复学')
return
+ learnNeedAlchemLV = alchemyIpyData.GetLearnNeedAlchemLV()
+ if alchemyLV < learnNeedAlchemLV:
+ GameWorld.DebugLog('丹方学习需要炼丹等级 %s' % learnNeedAlchemLV)
+ return
+ learnNeedLuck = alchemyIpyData.GetLearnNeedLuck()
+ if curLuckValue < learnNeedLuck:
+ GameWorld.DebugLog('丹方学习需要慧根 %s' % learnNeedLuck)
+ return
+ learnNeedItemID = alchemyIpyData.GetLearnNeedItemID()
+ itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
+ enough, indexList, hasBind, lackCnt = ItemCommon.GetItem_FromPack_ByID_ExEx(learnNeedItemID, itemPack, 1)
+ if not enough:
+ return
+ ItemCommon.ReduceItem(curPlayer, itemPack, indexList, 1, False, "RefineStove")
+ GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_PDict_AlchemyLearnState, alchemyID, 1)
+ Sycn_AlchemyMsg(curPlayer, alchemyID, False)
+ elif doType == 1:
+ if not hasLearn:
+ GameWorld.DebugLog('丹方未学习!,不可炼丹')
+ return
+ if curAlchemyItemID:
+ GameWorld.DebugLog('当前丹类型已在炼丹中! curAlchemyItemID=%s' % curAlchemyItemID)
+ return
+ # 基础固定消耗
+ needMaterialDict = alchemyIpyData.GetMaterial()
+
+ itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
+ lackItemDict, delInfoDict = ItemCommon.GetCostItemIndexList(needMaterialDict, itemPack, False)
+ if lackItemDict:
+ GameWorld.DebugLog("配方材料不足!alchemyID=%s,needMaterialDict=%s,lackItemDict=%s,hasItemDict=%s"
+ % (alchemyItemID, needMaterialDict, lackItemDict, delInfoDict), playerID)
+ return
+ #扣消耗
+ ItemCommon.DelCostItem(curPlayer, itemPack, delInfoDict, ChConfig.ItemDel_Alchemy)
+ PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_AlchemyItemID % alchemType, alchemyItemID)
+ PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_AlchemyStartTime % alchemyID, curTime)
- alchemyItemList = specAlchemyIpyData.GetAlchemyItem()
- alchemyCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_AlchemyCountSpec % specID)
- SpecialAlchemyDict = IpyGameDataPY.GetFuncEvalCfg("SpecialAlchemy", 2)
- SpecialAlchemyCountItemDict = SpecialAlchemyDict.get(specID, {})
- else:
- alchemyItemList = alchemyIpyData.GetAlchemyItem()
- alchemyCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_AlchemyCount % alchemyID)
- SpecialAlchemyDict = IpyGameDataPY.GetFuncEvalCfg("SpecialAlchemy", 1)
- SpecialAlchemyCountItemDict = SpecialAlchemyDict.get(alchemyID, {})
+ Sycn_AlchemyMsg(curPlayer, alchemyID, False)
+ #日常任务
+ costItemCnt = sum(needMaterialDict.values())
+ PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_RefineStove, costItemCnt)
- updAlchemyCount = 0
- if SpecialAlchemyCountItemDict:
- nextAlchemyCount = alchemyCount + 1
- if nextAlchemyCount <= max(SpecialAlchemyCountItemDict):
- updAlchemyCount = nextAlchemyCount # 只要还没达到最大洗练次数特殊产出,则每次累加次数
- # 非特殊材料配方的情况下,达到指定次数则使用特殊次数指定产出库
- if nextAlchemyCount in SpecialAlchemyCountItemDict:
- alchemyItemList = SpecialAlchemyCountItemDict[nextAlchemyCount]
- GameWorld.DebugLog("炼丹次数特殊产出库: 炼丹编号=%s,特殊ID=%s,次数=%s,特殊产出库=%s"
- % (alchemyID, specID, nextAlchemyCount, alchemyItemList), playerID)
-
- # 去除限制产出的物品
- outPutCountLimitDict = IpyGameDataPY.GetFuncEvalCfg("SpecialAlchemy", 3)
- if outPutCountLimitDict:
- limitItemInfoList = []
- alchemyItemList = copy.copy(alchemyItemList)
- for itemInfo in alchemyItemList:
- itemID = itemInfo[1]
- if itemID not in outPutCountLimitDict:
- continue
- limitCount = outPutCountLimitDict[itemID]
- outputCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_AlchemyOutputCount % itemID)
- if outputCount >= limitCount:
- limitItemInfoList.append(itemInfo)
- GameWorld.DebugLog("已达到最大产出次数,从产出库中移除! alchemyItemList=%s,itemID=%s,outputCount=%s,limitCount=%s"
- % (alchemyItemList, itemID, outputCount, limitCount), playerID)
-
- for limitItemInfo in limitItemInfoList:
- alchemyItemList.remove(limitItemInfo)
-
- if not alchemyItemList:
- GameWorld.DebugLog("配方产出物品配置错误!alchemyID=%s,specID=%s" % (alchemyID, specID), playerID)
- return
-
- packSpace = ItemCommon.GetItemPackSpace(curPlayer, IPY_GameWorld.rptItem, 1)
- if not packSpace:
- PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_998371")
- return
-
- # 基础固定消耗
- needMaterialDict = alchemyIpyData.GetMaterial()
- # 特殊配方额外消耗
- if specAlchemyIpyData:
- needMaterialDict = copy.deepcopy(needMaterialDict)
- needMaterialDict[specAlchemyIpyData.GetMaterialID()] = specAlchemyIpyData.GetMaterialCnt()
-
- itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
- lackItemDict, delInfoDict = ItemCommon.GetCostItemIndexList(needMaterialDict, itemPack, False)
- if lackItemDict:
- GameWorld.DebugLog("配方材料不足!alchemyID=%s,specID=%s,needMaterialDict=%s,lackItemDict=%s,hasItemDict=%s"
- % (alchemyID, specID, needMaterialDict, lackItemDict, delInfoDict), playerID)
- return
-
- makeItemInfo = GameWorld.GetResultByWeightList(alchemyItemList)
- if not makeItemInfo:
- GameWorld.ErrLog("配方合成结果错误!alchemyID=%s,specID=%s" % (alchemyID, specID), playerID)
- return
- makeItemID, itemCount = makeItemInfo
- GameWorld.DebugLog("合成配方: alchemyID=%s,specID=%s,makeItemID=%s,itemCount=%s,alchemyItemList=%s"
- % (alchemyID, specID, makeItemID, itemCount, alchemyItemList), playerID)
- #检查按丹炉等级进阶的丹药
- makeItemID = __GetAlchemyUpItemID(makeItemID, alchemyLV, alchemyIpyData.GetAlchemyUp())
- makeItemData = GameWorld.GetGameData().GetItemByTypeID(makeItemID)
- if not makeItemData:
- return
-
- if updAlchemyCount:
- if specID:
- PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_AlchemyCountSpec % specID, updAlchemyCount)
+ elif doType == 2:
+ if curAlchemyItemID != alchemyItemID:
+ GameWorld.DebugLog('停止丹药ID错误 curAlchemyItemID=%s' % curAlchemyItemID)
+ return
+ PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_AlchemyItemID % alchemType, 0)
+ PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_AlchemyStartTime % alchemyID, 0)
+ Sycn_AlchemyMsg(curPlayer, alchemyID, False)
+ elif doType == 3:
+ if curAlchemyItemID != alchemyItemID:
+ GameWorld.DebugLog('开炉丹药ID错误 curAlchemyItemID=%s' % curAlchemyItemID)
+ return
+ startTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_AlchemyStartTime % alchemyID)
+ passTime = max(0, curTime - startTime)
+ if passTime < alchemyIpyData.GetNeedTime():
+ GameWorld.DebugLog('开炉丹药,时间未到 passTime=%s' % passTime)
+ return
+ #成功率
+ if alchemType == 2:
+ successRate = ShareDefine.Def_MaxRateValue #仙丹必定成功
else:
- PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_AlchemyCount % alchemyID, updAlchemyCount)
- GameWorld.DebugLog("更新炼丹次数累计: alchemyID=%s,特殊ID=%s,次数=%s" % (alchemyID, specID, updAlchemyCount), playerID)
+ #灵丹成功率公式 参数 curLuckValue:慧根 alchemyLV:炼丹等级 alchemyQuality:丹药等级 qualityNeedLuck:要求慧根
+ alchemyQuality = alchemyIpyData.GetAlchemyQuality()
+ qualityNeedLuck = IpyGameDataPY.GetFuncEvalCfg('alchemySuccess', 2, {}).get(alchemyQuality, 0)
+ successRate = eval(IpyGameDataPY.GetFuncCompileCfg('alchemySuccess'))
+ isSuccess = GameWorld.CanHappen(successRate)
+ resultCnt = 0 #丹药数量 0代表失败
+ if isSuccess:
+ needSpace = 1
+ packSpace = ItemCommon.GetItemPackSpace(curPlayer, IPY_GameWorld.rptItem, needSpace)
+ if needSpace > packSpace:
+ PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_998371")
+ return
+ ipyData = IpyGameDataPY.InterpolationSearch('AlchemyResult', 'LuckValue', curLuckValue, {'AlchemyQuality':alchemyIpyData.GetAlchemyQuality()})
+ if not ipyData:
+ GameWorld.ErrLog('AlchemyResult 配置错误 未找到该丹方数量 alchemyItemID=%s' % alchemyItemID, playerID)
+ return
+ resultCnt = GameWorld.GetResultByRandomList(ipyData.GetCntRateList())
+ if not resultCnt:
+ GameWorld.ErrLog('AlchemyResult 配置错误 未随机出该丹方数量alchemyItemID=%s' % alchemyItemID, playerID)
+ return
+ makeItemData = GameWorld.GetGameData().GetItemByTypeID(alchemyItemID)
+ if not makeItemData:
+ return
+ ItemControler.GivePlayerItem(curPlayer, alchemyItemID, resultCnt, 0, [IPY_GameWorld.rptItem],
+ event=[ChConfig.ItemGive_Refine, False, {}])
+ #紫色及以上全服广播
+ notifyColor = IpyGameDataPY.GetFuncCfg("AlchemyNotify", 1)
+ needNotifyItemIDList = IpyGameDataPY.GetFuncEvalCfg("AlchemyNotify", 2)
+ notNotifyItemIDList = IpyGameDataPY.GetFuncEvalCfg("AlchemyNotify", 3)
+ if alchemyItemID not in notNotifyItemIDList and (alchemyItemID in needNotifyItemIDList or makeItemData.GetItemColor() >= notifyColor):
+ PlayerControl.WorldNotify(0, "AchemyGreatSuccess", [curPlayer.GetPlayerName(), alchemyItemID])
+
+ #重置
+ PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_AlchemyItemID % alchemType, 0)
+ PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_AlchemyStartTime % alchemyID, 0)
+ #加经验
+ addExp = alchemyIpyData.GetAlchemyExp()
+ AddRefineExp(curPlayer, addExp, alchemyLV)
+ GameWorld.DebugLog('炼丹结果 alchemyItemID=%s,successRate=%s,isSuccess=%s,resultCnt=%s' % (alchemyItemID, successRate, isSuccess, resultCnt), playerID)
+
+ Sycn_AlchemyMsg(curPlayer, alchemyID, False, alchemyItemID, resultCnt)
+
+ #完成1次炼丹成就
+ PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_RefineItem, 1)
+ #完成1次X品质物品炼丹成就
+ #PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_RefineStoveColor, 1, [makeItemData.GetItemColor()])
+ #任务
+ #EventShell.EventRespons_RefineItem(curPlayer, alchemyIpyData.GetNeedAlchemyLV())
- #扣消耗
- delItemHasBind = ItemCommon.DelCostItem(curPlayer, itemPack, delInfoDict, ChConfig.ItemDel_Alchemy)
-
- #加经验
- addExp = alchemyIpyData.GetAlchemyExp()
- if specAlchemyIpyData:
- addExp += specAlchemyIpyData.GetAlchemyExp()
- AddRefineExp(curPlayer, addExp)
-
- #加产出次数
- if makeItemID in outPutCountLimitDict:
- outputCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_AlchemyOutputCount % makeItemID) + 1
- PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_AlchemyOutputCount % makeItemID, outputCount)
- GameWorld.DebugLog("更新炼丹产出特殊物品次数: makeItemID=%s,outputCount=%s" % (makeItemID, outputCount), playerID)
-
- #给物品
- notBindItemList = IpyGameDataPY.GetFuncEvalCfg("SpecialAlchemy", 4) # 固定不绑定的物品
- if makeItemID in notBindItemList:
- makeItemBind = False
- else:
- makeItemBind = delItemHasBind
- ItemControler.GivePlayerItem(curPlayer, makeItemID, itemCount, 0, [IPY_GameWorld.rptItem],
- event=[ChConfig.ItemGive_Refine, False, {}])
-
- Sycn_AlchemyMsg(curPlayer, makeItemID)
-
- #紫色及以上全服广播
- notifyColor = IpyGameDataPY.GetFuncCfg("AlchemyNotify", 1)
- needNotifyItemIDList = IpyGameDataPY.GetFuncEvalCfg("AlchemyNotify", 2)
- notNotifyItemIDList = IpyGameDataPY.GetFuncEvalCfg("AlchemyNotify", 3)
- if makeItemID not in notNotifyItemIDList and (makeItemID in needNotifyItemIDList or makeItemData.GetItemColor() >= notifyColor):
- PlayerControl.WorldNotify(0, "AchemyGreatSuccess", [curPlayer.GetPlayerName(), makeItemID])
-
- #完成1次炼丹成就
- PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_RefineItem, 1)
- #完成1次X品质物品炼丹成就
- PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_RefineStoveColor, 1, [makeItemData.GetItemColor()])
- #任务
- EventShell.EventRespons_RefineItem(curPlayer, alchemyIpyData.GetNeedAlchemyLV())
- #日常任务
- costItemCnt = sum(needMaterialDict.values())
- PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_RefineStove, costItemCnt)
- PlayerFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_RefineStove, 1)
- PlayerNewFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_RefineStove, 1)
- PlayerActLogin.AddLoginAwardActionCnt(curPlayer, ChConfig.Def_LoginAct_Alchemy, 1)
+ PlayerFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_RefineStove, 1)
+ PlayerNewFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_RefineStove, 1)
+ PlayerActLogin.AddLoginAwardActionCnt(curPlayer, ChConfig.Def_LoginAct_Alchemy, 1)
return
-def __GetAlchemyUpItemID(itemID, alchemyLV, alchemyUpCfg):
- #获取按丹炉等级进阶的丹药ID
- if not alchemyUpCfg:
- return itemID
- itemIDStr = str(itemID)
- upItemList = []
- for alchemyUpItemDict in alchemyUpCfg:
- if itemIDStr in alchemyUpItemDict:
- for upID, upLV in alchemyUpItemDict.items():
- upItemList.append([upLV, int(upID)])
-
- if not upItemList:
- return itemID
- upItemList.sort(reverse=True)
- for upLV, makeItemID in upItemList:
- if alchemyLV >= upLV:
- GameWorld.DebugLog(" 获得进阶丹药: itemID=%s to upItemID=%s" % (itemID, makeItemID))
- return makeItemID
- return itemID
-def AddRefineExp(curPlayer, addExp):
+def AddRefineExp(curPlayer, addExp, alchemyLV):
#增加炼丹炉经验
if addExp <= 0:
return
- alchemyLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_AlchemyLV)
alchemyExp = min(curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_AlchemyExp) + addExp, ShareDefine.Def_UpperLimit_DWord)
GameWorld.DebugLog("增加炼丹经验: alchemyLV=%s,addExp=%s,alchemyExp=%s" % (alchemyLV, addExp, alchemyExp), curPlayer.GetPlayerID())
@@ -282,34 +242,45 @@
GameWorld.DebugLog("升级后剩余经验: %s" % alchemyExp, curPlayer.GetPlayerID())
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_AlchemyLV, alchemyLV)
PlayerSuccess.UptateSuccessProgress(curPlayer, ShareDefine.SuccType_AlchemyLV, alchemyLV)
-
- RefreshStoveAttr(curPlayer)
-
- # 解锁广播
- ipyGameData = IpyGameDataPY.IPY_Data()
- for i in xrange(ipyGameData.GetAlchemyCount()):
- ipyData = ipyGameData.GetAlchemyByIndex(i)
- if alchemyLV == ipyData.GetNeedAlchemyLV():
- PlayerControl.WorldNotify(0, "FurnaceLVUp", [curPlayer.GetPlayerName(), alchemyLV, ipyData.GetAlchemyID()])
- break
-
return True
-def Sycn_AlchemyMsg(curPlayer, itemID=0):
+
+def Sycn_AlchemyMsg(curPlayer, alchemyID=0, isAll=True, itemID=0, itemCnt=0):
# 通知客户端炼丹炉信息
- if not itemID and not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_RefineStove):
+ if not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_RefineStove):
return
pack = ChPyNetSendPack.tagMCPlayerStoveMsg()
pack.StoveExp = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_AlchemyExp)
pack.StoveLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_AlchemyLV)
pack.ItemID = itemID
+ pack.ItemCnt = itemCnt
+ pack.InfoList = []
+ syncItemIDList = []
+ if isAll:
+ ipyMgr = IpyGameDataPY.IPY_Data()
+ for i in xrange(ipyMgr.GetAlchemyCount()):
+ ipyData = ipyMgr.GetAlchemyByIndex(i)
+ alchemyID = ipyData.GetID()
+ if GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_AlchemyLearnState, alchemyID):
+ syncItemIDList.append(alchemyID)
+ elif alchemyID and GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_AlchemyLearnState, alchemyID):
+ syncItemIDList = [alchemyID]
+
+ for alchemyID in syncItemIDList:
+ StoveInfo = ChPyNetSendPack.tagMCPlayerStoveInfo()
+ StoveInfo.AlchemyID = alchemyID
+ StoveInfo.StartTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_AlchemyStartTime % alchemyID)
+ pack.InfoList.append(StoveInfo)
+ pack.StoveCnt = len(pack.InfoList)
NetPackCommon.SendFakePack(curPlayer, pack)
return
+
def RefreshStoveAttr(curPlayer):
CalcStoveAttr(curPlayer)
PlayerControl.PlayerControl(curPlayer).RefreshPlayerAttrState()
return
+
def CalcStoveAttr(curPlayer):
# 果实加成
@@ -317,38 +288,7 @@
fightPowerEx = PlayerAttrFruit.CalcAttrFruitAddAtrr(curPlayer, allAttrYaoList, ShareDefine.Def_AttrFruitFunc_Stove)
PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_StoveYao, allAttrYaoList)
curPlayer.SetDict(ChConfig.Def_PlayerKey_MFPEx % ShareDefine.Def_MFPType_StoveYao, fightPowerEx)
-
- allAttrList = [{} for _ in range(4)]
- alchemyLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_AlchemyLV)
- stoveIpyData = IpyGameDataPY.GetIpyGameData("RefineStove", alchemyLV)
- if stoveIpyData:
- attrTypeList = stoveIpyData.GetAddAttrType()
- attrValueList = stoveIpyData.GetAddAttrNum()
- for i, attrID in enumerate(attrTypeList):
- PlayerControl.CalcAttrDict_Type(attrID, attrValueList[i], allAttrList)
-
- PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Stove, allAttrList)
return
-
-g_needAlchemyLVDict = {}
-def GetIsCanOutByAlchemyLV(curPlayer, itemID):
- #判断当前丹炉等级是否可产出该丹药
- global g_needAlchemyLVDict
- if not g_needAlchemyLVDict:
- ipyMgr = IpyGameDataPY.IPY_Data()
- for i in xrange(ipyMgr.GetAlchemyCount()):
- ipyData = ipyMgr.GetAlchemyByIndex(i)
- needAlchemyLV = ipyData.GetNeedAlchemyLV()
- itemList = ipyData.GetAlchemyItem()
- for itemInfo in itemList:
- g_needAlchemyLVDict[itemInfo[1]] = needAlchemyLV
- for i in xrange(ipyMgr.GetAlchemySpecCount()):
- ipyData = ipyMgr.GetAlchemySpecByIndex(i)
- needAlchemyLV = ipyData.GetNeedAlchemyLV()
- itemList = ipyData.GetAlchemyItem()
- for itemInfo in itemList:
- g_needAlchemyLVDict[itemInfo[1]] = needAlchemyLV
- return curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_AlchemyLV) >= g_needAlchemyLVDict.get(itemID, 0)
#// A5 14 祈福丹药 #tagCMPrayElixir
@@ -363,7 +303,7 @@
prayCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_AlchemyPrayCnt)
limitCnt = PlayerVip.GetPrivilegeValue(curPlayer, ChConfig.VIPPrivilege_PrayElixir)
if prayCnt >= limitCnt:
- GameWorld.DebugLog('今日祈福丹药次数已满!prayCnt=%s'%prayCnt)
+ GameWorld.DebugLog('今日祈福丹药次数已满!prayCnt=%s' % prayCnt)
return
packSpace = ItemCommon.GetItemPackSpace(curPlayer, IPY_GameWorld.rptItem, 1)
if not packSpace:
@@ -375,9 +315,9 @@
newItemInfoList = []
for itemInfo in alchemyItemList:
itemID = itemInfo[1]
- if not GetIsCanOutByAlchemyLV(curPlayer, itemID):
- #GameWorld.DebugLog('祈福丹药,炼丹等级未达到,移除产出库!itemID=%s'%itemID)
- continue
+# if not GetIsCanOutByAlchemyLV(curPlayer, itemID):
+# #GameWorld.DebugLog('祈福丹药,炼丹等级未达到,移除产出库!itemID=%s'%itemID)
+# continue
if PlayerAttrFruit.IsFruitEatFull(curPlayer, itemID):
#GameWorld.DebugLog('祈福丹药,使用次数已满,移除产出库!itemID=%s'%itemID)
continue
@@ -400,10 +340,9 @@
if not PlayerControl.PayMoney(curPlayer, IPY_GameWorld.TYPE_Price_Gold_Money, costMoney, ChConfig.Def_Cost_AlchemyPray):
return
#给物品
- ItemControler.GivePlayerItem(curPlayer, makeItemID, itemCount, 0, [IPY_GameWorld.rptItem],
+ ItemControler.GivePlayerItem(curPlayer, makeItemID, itemCount, 0, [IPY_GameWorld.rptItem],
event=[ChConfig.ItemGive_Refine, False, {}])
#GameWorld.DebugLog('makeItemID=%s,newItemInfoList=%s'%(makeItemID, newItemInfoList))
-
#紫色及以上全服广播
notifyColor = IpyGameDataPY.GetFuncCfg("AlchemyNotify", 1)
@@ -413,11 +352,13 @@
PlayerControl.WorldNotify(0, "BlastfurnaceBlessing", [curPlayer.GetPlayerName(), makeItemID])
#更新次数
- PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_AlchemyPrayCnt, prayCnt+1)
+ PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_AlchemyPrayCnt, prayCnt + 1)
Sycn_AlchemyPrayMsg(curPlayer, makeItemID)
return
+
def Sycn_AlchemyPrayMsg(curPlayer, itemID=0):
+ return
#祈福丹药结果
if not itemID and not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_RefineStove):
return
@@ -425,4 +366,4 @@
pack.PrayCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_AlchemyPrayCnt)
pack.ItemID = itemID
NetPackCommon.SendFakePack(curPlayer, pack)
- return
\ No newline at end of file
+ return
--
Gitblit v1.8.0