#!/usr/bin/python # -*- coding: GBK -*- #------------------------------------------------------------------------------- # ##@package Player.PlayerTree # # @todo:ÏÉÊ÷ # @author hxp # @date 2025-05-28 # @version 1.0 # # ÏêϸÃèÊö: ÏÉÊ÷ # #------------------------------------------------------------------------------- #"""Version = 2025-05-28 12:00""" #------------------------------------------------------------------------------- import GameWorld import ItemCommon import NetPackCommon import IpyGameDataPY import ChPyNetSendPack import PlayerControl import IPY_GameWorld import PlayerTask import ChConfig import time def OnPlayerLogin(curPlayer): treeLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreeLV) if not treeLV: PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreeLV, 1) RefreshTreeLVUPTime(curPlayer) SyncTreeInfo(curPlayer) return #// B2 23 ÏÉÊ÷Éý¼¶ #tagCMTreeLVUP # #struct tagCMTreeLVUP #{ # tagHead Head; # BYTE Type; // 0-¿ªÊ¼Éý¼¶£¨ÇëÇó¿Û³ýÏûºÄ£¬¿ªÊ¼Éý¼¶µ¹¼ÆÊ±£©£»1-Ö´ÐÐÉý¼¶£¨µ¹¼ÆÊ±Ê±¼äµ½ºó·¢Ë͸ÃÀàÐÍ£© #}; def OnTreeLVUP(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) upType = clientData.Type if upType == 1: if not DoTreeLVUP(curPlayer): SyncTreeInfo(curPlayer) return playerID = curPlayer.GetPlayerID() lvupState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreeLVUPState) if lvupState: GameWorld.DebugLog("ÏÉÊ÷ÒѾ­ÔÚÉý¼¶ÖÐ! lvupState=%s" % lvupState, playerID) return treeLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreeLV) ipyData = IpyGameDataPY.GetIpyGameData("TreeLV", treeLV) if not ipyData: return needMoney = ipyData.GetLVUPNeedMoney() nextTreeLV = treeLV + 1 nextIpyData = IpyGameDataPY.GetIpyGameDataNotLog("TreeLV", nextTreeLV) if needMoney <= 0 or not nextIpyData: GameWorld.DebugLog("ÏÉÊ÷ÒÑÂú¼¶! treeLV=%s" % treeLV, playerID) return moneyType = IpyGameDataPY.GetFuncCfg("TreeLVUP", 1) if not PlayerControl.PayMoney(curPlayer, moneyType, needMoney, "TreeLVUP", {"treeLV":treeLV}): return needTime = ipyData.GetLVUPNeedTime() PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreeLVUPState, 1) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreeLVUPRemainTime, needTime) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreeLVUPRefreshTime, int(time.time())) GameWorld.DebugLog("ÏÉÊ÷ÇëÇó¿ªÊ¼Éý¼¶! treeLV=%s,nextTreeLV=%s,needTime=%s" % (treeLV, nextTreeLV, needTime), playerID) 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) LVUPRemainTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreeLVUPRemainTime) if not lvupState or not LVUPRemainTime: return curTime = int(time.time()) lastRefreshTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreeLVUPRefreshTime) if not lastRefreshTime: lastRefreshTime = curTime passSeconds = max(0, curTime - lastRefreshTime) updLVUPRemainTime = max(0, LVUPRemainTime - passSeconds) treeLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreeLV) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreeLVUPRemainTime, updLVUPRemainTime) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreeLVUPRefreshTime, curTime) GameWorld.DebugLog("Ë¢ÐÂÏÉÊ÷Éý¼¶Ê£Óàʱ¼ä! updLVUPRemainTime=%s,treeLV=%s,LVUPRemainTime=%s,passSeconds=%s,lastRefreshTime=%s" % (updLVUPRemainTime, treeLV, LVUPRemainTime, passSeconds, lastRefreshTime), curPlayer.GetPlayerID()) return def ReduceTreeLVUPTime(curPlayer, reduceTime): ## ¼õÉÙÏÉÊ÷Éý¼¶Ê£Óàʱ¼ä£¬¿ÉÄÜÊÇʹÓõÀ¾ß»òÆäËû¹¦ÄÜµÈ RefreshTreeLVUPTime(curPlayer) 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), curPlayer.GetPlayerID()) return updLVUPRemainTime = max(0, LVUPRemainTime - reduceTime) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreeLVUPRemainTime, updLVUPRemainTime) GameWorld.DebugLog("¼õÉÙÏÉÊ÷Éý¼¶Ê£Óàʱ¼ä! updLVUPRemainTime=%s,LVUPRemainTime=%s,reduceTime=%s" % (updLVUPRemainTime, LVUPRemainTime, reduceTime), curPlayer.GetPlayerID()) SyncTreeInfo(curPlayer) return True def DoTreeLVUP(curPlayer): ## Ö´ÐÐÏÉÊ÷Éý¼¶ RefreshTreeLVUPTime(curPlayer) playerID = curPlayer.GetPlayerID() lvupState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreeLVUPState) if not lvupState: GameWorld.DebugLog("ÏÉÊ÷·ÇÉý¼¶ÖУ¬ÎÞ·¨Ö´ÐÐÉý¼¶! lvupState=%s" % lvupState, playerID) return LVUPRemainTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreeLVUPRemainTime) if LVUPRemainTime > 0: GameWorld.DebugLog("ÏÉÊ÷Éý¼¶Ê£Óàʱ¼äδµ½£¬ÎÞ·¨Ö´ÐÐÉý¼¶! LVUPRemainTime=%s" % LVUPRemainTime, playerID) return treeLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreeLV) updTreeLV = treeLV + 1 ipyData = IpyGameDataPY.GetIpyGameData("TreeLV", updTreeLV) if not ipyData: return PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreeLV, updTreeLV) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreeLVUPState, 0) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreeLVUPRemainTime, 0) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreeLVUPRefreshTime, 0) GameWorld.DebugLog("Ö´ÐÐÏÉÊ÷Éý¼¶! updTreeLV=%s" % updTreeLV, playerID) SyncTreeInfo(curPlayer) PlayerTask.UpdTaskValue(curPlayer, ChConfig.TaskType_TreeLV) return True def SyncTreeInfo(curPlayer): clientPack = ChPyNetSendPack.tagMCTreeInfo() clientPack.TreeLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreeLV) clientPack.LVUPState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreeLVUPState) clientPack.LVUPRemainTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreeLVUPRemainTime) NetPackCommon.SendFakePack(curPlayer, clientPack) return