10033 【后端】仙树升级系统及砍树产出规则(增加使用仙树升级减时道具,支持自动购买;)
| | |
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | # B2 24 使用仙树升级减时物品 #tagCMUseTreeLVUPTimeItem
|
| | |
|
| | | class tagCMUseTreeLVUPTimeItem(Structure):
|
| | | _pack_ = 1
|
| | | _fields_ = [
|
| | | ("Cmd", c_ubyte),
|
| | | ("SubCmd", c_ubyte),
|
| | | ("UseCount", c_int), # 使用个数
|
| | | ("IsAutoBuy", c_ubyte), # 不足个数是否自动购买
|
| | | ]
|
| | |
|
| | | def __init__(self):
|
| | | self.Clear()
|
| | | self.Cmd = 0xB2
|
| | | self.SubCmd = 0x24
|
| | | 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 = 0xB2
|
| | | self.SubCmd = 0x24
|
| | | self.UseCount = 0
|
| | | self.IsAutoBuy = 0
|
| | | return
|
| | |
|
| | | def GetLength(self):
|
| | | return sizeof(tagCMUseTreeLVUPTimeItem)
|
| | |
|
| | | def GetBuffer(self):
|
| | | return string_at(addressof(self), self.GetLength())
|
| | |
|
| | | def OutputString(self):
|
| | | DumpString = '''// B2 24 使用仙树升级减时物品 //tagCMUseTreeLVUPTimeItem:
|
| | | Cmd:%s,
|
| | | SubCmd:%s,
|
| | | UseCount:%d,
|
| | | IsAutoBuy:%d
|
| | | '''\
|
| | | %(
|
| | | self.Cmd,
|
| | | self.SubCmd,
|
| | | self.UseCount,
|
| | | self.IsAutoBuy
|
| | | )
|
| | | return DumpString
|
| | |
|
| | |
|
| | | m_NAtagCMUseTreeLVUPTimeItem=tagCMUseTreeLVUPTimeItem()
|
| | | ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMUseTreeLVUPTimeItem.Cmd,m_NAtagCMUseTreeLVUPTimeItem.SubCmd))] = m_NAtagCMUseTreeLVUPTimeItem
|
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | # B3 17 情戒解锁 #tagCMLoveRingUnlock
|
| | |
|
| | | class tagCMLoveRingUnlock(Structure):
|
| | |
| | | Writer = hxp
|
| | | Releaser = hxp
|
| | | RegType = 0
|
| | | RegisterPackCount = 3
|
| | | RegisterPackCount = 4
|
| | |
|
| | | PacketCMD_1=0xB2
|
| | | PacketSubCMD_1=0x21
|
| | |
| | | PacketSubCMD_3=0x23
|
| | | PacketCallFunc_3=OnTreeLVUP
|
| | |
|
| | | PacketCMD_4=0xB2
|
| | | PacketSubCMD_4=0x24
|
| | | PacketCallFunc_4=OnUseTreeLVUPTimeItem
|
| | |
|
| | | ;福地
|
| | | [PlayerMineArea]
|
| | | ScriptName = Player\PlayerMineArea.py
|
| | |
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | # B2 24 使用仙树升级减时物品 #tagCMUseTreeLVUPTimeItem
|
| | |
|
| | | class tagCMUseTreeLVUPTimeItem(Structure):
|
| | | _pack_ = 1
|
| | | _fields_ = [
|
| | | ("Cmd", c_ubyte),
|
| | | ("SubCmd", c_ubyte),
|
| | | ("UseCount", c_int), # 使用个数
|
| | | ("IsAutoBuy", c_ubyte), # 不足个数是否自动购买
|
| | | ]
|
| | |
|
| | | def __init__(self):
|
| | | self.Clear()
|
| | | self.Cmd = 0xB2
|
| | | self.SubCmd = 0x24
|
| | | 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 = 0xB2
|
| | | self.SubCmd = 0x24
|
| | | self.UseCount = 0
|
| | | self.IsAutoBuy = 0
|
| | | return
|
| | |
|
| | | def GetLength(self):
|
| | | return sizeof(tagCMUseTreeLVUPTimeItem)
|
| | |
|
| | | def GetBuffer(self):
|
| | | return string_at(addressof(self), self.GetLength())
|
| | |
|
| | | def OutputString(self):
|
| | | DumpString = '''// B2 24 使用仙树升级减时物品 //tagCMUseTreeLVUPTimeItem:
|
| | | Cmd:%s,
|
| | | SubCmd:%s,
|
| | | UseCount:%d,
|
| | | IsAutoBuy:%d
|
| | | '''\
|
| | | %(
|
| | | self.Cmd,
|
| | | self.SubCmd,
|
| | | self.UseCount,
|
| | | self.IsAutoBuy
|
| | | )
|
| | | return DumpString
|
| | |
|
| | |
|
| | | m_NAtagCMUseTreeLVUPTimeItem=tagCMUseTreeLVUPTimeItem()
|
| | | ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMUseTreeLVUPTimeItem.Cmd,m_NAtagCMUseTreeLVUPTimeItem.SubCmd))] = m_NAtagCMUseTreeLVUPTimeItem
|
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | # B3 17 情戒解锁 #tagCMLoveRingUnlock
|
| | |
|
| | | class tagCMLoveRingUnlock(Structure):
|
| | |
| | | GameWorld.DebugAnswer(curPlayer, "放入物品失败!")
|
| | | return
|
| | |
|
| | | setAttrDict = {ShareDefine.Def_CItemKey_AppointID:appointID}
|
| | | setAttrDict = {ShareDefine.Def_CItemKey_AppointID:appointID} if appointID else {}
|
| | |
|
| | | # 拍品
|
| | | if auctionGroup > 0:
|
| | |
| | | SyncTreeInfo(curPlayer)
|
| | | return
|
| | |
|
| | | #// B2 24 使用仙树升级减时物品 #tagCMUseTreeLVUPTimeItem
|
| | | #
|
| | | #struct tagCMUseTreeLVUPTimeItem
|
| | | #{
|
| | | # tagHead Head;
|
| | | # DWORD UseCount; // 使用个数
|
| | | # BYTE IsAutoBuy; // 不足个数是否自动购买
|
| | | #};
|
| | | def OnUseTreeLVUPTimeItem(index, clientData, tick):
|
| | | curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
| | | useCount = clientData.UseCount
|
| | | isAutoBuy = clientData.IsAutoBuy
|
| | | |
| | | playerID = curPlayer.GetPlayerID()
|
| | | lvupState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreeLVUPState)
|
| | | LVUPRemainTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreeLVUPRemainTime)
|
| | | if not lvupState or not LVUPRemainTime:
|
| | | GameWorld.DebugLog("仙树非升级中或剩余时间为0,不需要减少时间! lvupState=%s,LVUPRemainTime=%s" |
| | | % (lvupState, LVUPRemainTime), playerID)
|
| | | return
|
| | | |
| | | costItemID, reduceSeconds = IpyGameDataPY.GetFuncEvalCfg("TreeLVUP", 2)
|
| | | GameWorld.DebugLog("使用仙树升级减时物品! costItemID=%s,reduceSeconds=%s,useCount=%s" % (costItemID, reduceSeconds, useCount), playerID)
|
| | | if not costItemID or not useCount:
|
| | | return
|
| | | |
| | | costItemIndexList, bindCnt, unBindCnt = ItemCommon.GetPackItemBindStateIndexInfo(curPlayer, costItemID, useCount)
|
| | | lackCnt = useCount - bindCnt - unBindCnt
|
| | | if lackCnt > 0 and not isAutoBuy:
|
| | | GameWorld.DebugLog("消耗道具不足! costItemID=%s,useCount=%s,bindCnt=%s,unBindCnt=%s,lackCnt=%s" |
| | | % (costItemID, useCount, bindCnt, unBindCnt, lackCnt), playerID)
|
| | | return
|
| | | |
| | | delCnt = useCount
|
| | | if lackCnt > 0:
|
| | | moneyType = IPY_GameWorld.TYPE_Price_Gold_Money
|
| | | lackCost = ItemCommon.GetAutoBuyItemNeedGold({costItemID:lackCnt})
|
| | | if lackCost <= 0:
|
| | | return
|
| | | GameWorld.DebugLog("自动购买道具: lackCnt=%s,moneyType=%s,lackCost=%s" % (lackCnt, moneyType, lackCost), playerID)
|
| | | infoDict = {ChConfig.Def_Cost_Reason_SonKey:costItemID}
|
| | | if not PlayerControl.PayMoney(curPlayer, moneyType, lackCost, ChConfig.Def_Cost_BuyStoreItem, infoDict):
|
| | | return
|
| | | delCnt -= lackCnt
|
| | | |
| | | # 扣除消耗
|
| | | if delCnt:
|
| | | ItemCommon.DelCostItemByBind(curPlayer, costItemIndexList, bindCnt, unBindCnt, delCnt, "TreeLVUPTimeItem")
|
| | | |
| | | reduceTime = reduceSeconds * useCount
|
| | | ReduceTreeLVUPTime(curPlayer, reduceTime)
|
| | | return
|
| | |
|
| | | def RefreshTreeLVUPTime(curPlayer):
|
| | | ## 刷新仙树升级剩余时间
|
| | | lvupState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreeLVUPState)
|