#!/usr/bin/python # -*- coding: GBK -*- #------------------------------------------------------------------------------- # ##@package Player.PlayerFeastTravel # # @todo:½ÚÈÕÓÎÀú # @author hxp # @date 2021-02-01 # @version 1.0 # # ÏêϸÃèÊö: ½ÚÈÕÓÎÀú # #------------------------------------------------------------------------------- #"""Version = 2021-02-01 15:00""" #------------------------------------------------------------------------------- import PyGameData import ShareDefine import PlayerControl import IpyGameDataPY import ItemControler import ChPyNetSendPack import IPY_GameWorld import NetPackCommon import GameWorld import ChConfig def OnPlayerLogin(curPlayer): isReset = __CheckPlayerFeastTravelAction(curPlayer) if not isReset: actInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_FeastTravel, {}) # »î¶¯ÖÐͬ²½»î¶¯ÐÅÏ¢ if actInfo.get(ShareDefine.ActKey_State): Sync_FeastTravelActionInfo(curPlayer) Sync_FeastTravelPlayerInfo(curPlayer) return def RefreshFeastTravelActionInfo(): ## ÊÕµ½GameServerͬ²½µÄ»î¶¯ÐÅÏ¢£¬Ë¢Ð»ÐÅÏ¢ playerManager = GameWorld.GetPlayerManager() for index in xrange(playerManager.GetPlayerCount()): curPlayer = playerManager.GetPlayerByIndex(index) if not GameWorld.IsNormalPlayer(curPlayer): continue __CheckPlayerFeastTravelAction(curPlayer) return def __CheckPlayerFeastTravelAction(curPlayer): ## ¼ì²éÍæ¼Ò»î¶¯ÐÅÏ¢ playerID = curPlayer.GetPlayerID() actInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_FeastTravel, {}) actID = actInfo.get(ShareDefine.ActKey_ID, 0) state = actInfo.get(ShareDefine.ActKey_State, 0) playerActID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FeastTravelID) # Íæ¼ÒÉíÉϵĻID # »î¶¯ID ÏàͬµÄ»°²»´¦Àí if actID == playerActID: GameWorld.DebugLog("½ÚÈÕÓÎÀú»î¶¯ID²»±ä£¬²»´¦Àí£¡", curPlayer.GetPlayerID()) return GameWorld.DebugLog("½ÚÈÕÓÎÀú»î¶¯ÖØÖÃ! actID=%s,playerActID=%s,state=%s" % (actID, playerActID, state), playerID) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FeastTravelID, actID) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FeastTravelPoint, 0) if not state: return templateID = __GetTravelTemplateID() ipyMgr = IpyGameDataPY.IPY_Data() # ÖØÖÃÓÎÀúÈÎÎñÏà¹Ø for index in xrange(ipyMgr.GetActFeastTravelTaskCount()): taskIpyData = ipyMgr.GetActFeastTravelTaskByIndex(index) taskID = taskIpyData.GetTraveTasklD() PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FeastTravelValue % taskID, 0) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FeastTravelCount % taskID, 0) # ÖØÖÃÓÎÀú½±Àø for index in xrange(ipyMgr.GetActFeastTravelAwardCount()): awardIpyData = ipyMgr.GetActFeastTravelAwardByIndex(index) if templateID != awardIpyData.GetTemplatelD(): continue recordIndex = awardIpyData.GetRecordIndex() PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FeastTravelAwardCount % recordIndex, 0) Sync_FeastTravelActionInfo(curPlayer) Sync_FeastTravelPlayerInfo(curPlayer) return True def __GetTravelTemplateID(): actInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_FeastTravel, {}) if not actInfo: return if not actInfo.get(ShareDefine.ActKey_State): return cfgID = actInfo.get(ShareDefine.ActKey_CfgID) ipyData = IpyGameDataPY.GetIpyGameData("ActFeastTravel", cfgID) if not ipyData: return worldLV = actInfo.get(ShareDefine.ActKey_WorldLV) templateID = GameWorld.GetDictValueByRangeKey(ipyData.GetTemplateIDInfo(), worldLV, 0) return templateID def AddFeastTravelTaskValue(curPlayer, taskID, addValue=1): ## Ôö¼ÓÓÎÀúÈÎÎñÍê³É½ø¶È actInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_FeastTravel, {}) if not actInfo: return if not actInfo.get(ShareDefine.ActKey_State): return ipyData = IpyGameDataPY.GetIpyGameData("ActFeastTravelTask", taskID) if not ipyData: return maxFinishCount = ipyData.GetFinishTimeMax() curFinishCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FeastTravelCount % taskID) if maxFinishCount and curFinishCount >= maxFinishCount: GameWorld.DebugLog("¸ÃÓÎÀúÈÎÎñÒÑ´ïµ½×î´óÍê³É´ÎÊý!taskID=%s,curFinishCount=%s" % (taskID, curFinishCount)) return curValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FeastTravelValue % taskID) updValue = curValue + addValue GameWorld.DebugLog("Ôö¼ÓÓÎÀú½ø¶È: taskID=%s,curValue=%s,addValue=%s,updValue=%s" % (taskID, curValue, addValue, updValue)) if maxFinishCount: maxValue = ipyData.GetFinishNeedValue() * maxFinishCount if updValue > maxValue: updValue = maxValue GameWorld.DebugLog(" ÐÞÕý½ø¶ÈÖµ²»³¬¹ý×î´ó¿ÉÍê³É´ÎÊýµÄ×ܽø¶ÈÖµ! maxFinishCount=%s,maxValue=%s,updValue=%s" % (maxFinishCount, maxValue, updValue)) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FeastTravelValue % taskID, updValue) updFinishCount = updValue / ipyData.GetFinishNeedValue() GameWorld.DebugLog(" curFinishCount=%s,updFinishCount=%s" % (curFinishCount, updFinishCount)) # Ôö¼ÓÍê³É´ÎÊý if updFinishCount > curFinishCount: PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FeastTravelCount % taskID, updFinishCount) addFinishCount = updFinishCount - curFinishCount addTravelPointTotal = addFinishCount * ipyData.GetAddTravelPoint() curTravelPoint = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FeastTravelPoint) updTravelPoint = curTravelPoint + addTravelPointTotal PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FeastTravelPoint, updTravelPoint) GameWorld.DebugLog(" Íê³ÉÓÎÀú: addFinishCount=%s,addTravelPointTotal=%s,curTravelPoint=%s,updTravelPoint=%s" % (addFinishCount, addTravelPointTotal, curTravelPoint, updTravelPoint)) Sync_FeastTravelPlayerInfo(curPlayer, taskID, -1) # ²»Í¨Öª½±Àø return True def GetFeastTravelAward(curPlayer, index): ## ½ÚÈÕÓÎÀúÁì½± templateID = __GetTravelTemplateID() if not templateID: return ipyDataList = IpyGameDataPY.GetIpyGameDataList("ActFeastTravelAward", templateID) if not ipyDataList: return findIpyData = None for ipyData in ipyDataList: if index == ipyData.GetRecordIndex(): findIpyData = ipyData break if not findIpyData: return getCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FeastTravelAwardCount % index) getCountMax = findIpyData.GetAwardCountMax() if getCountMax and getCount >= getCountMax: GameWorld.DebugLog(" ½ÚÈÕÓÎÀúÁì½±ÒÑ´ï×î´óÁìÈ¡´ÎÊý! templateID=%s,index=%s,getCount=%s >= getCountMax=%s" % (templateID, index, getCount, getCountMax)) return curPoint = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FeastTravelPoint) singleNeedPoint = findIpyData.GetNeedTravelPoint() canUsePoint = curPoint - getCount * singleNeedPoint if canUsePoint < singleNeedPoint: GameWorld.DebugLog(" ½ÚÈÕÓÎÀúÁì½±ÓÎÀúÖµ²»×ã! templateID=%s,index=%s,curPoint=%s,getCount=%s,canUsePoint=%s < singleNeedPoint=%s" % (templateID, index, curPoint, getCount, canUsePoint, singleNeedPoint)) return awardList = findIpyData.GetTravelAwardInfo() if not awardList: return if not ItemControler.CheckPackSpaceEnough(curPlayer, awardList): return updGetCount = getCount + 1 PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FeastTravelAwardCount % index, updGetCount) GameWorld.DebugLog(" ½ÚÈÕÓÎÀúÁì½±! templateID=%s,index=%s,curPoint=%s,getCount=%s,canUsePoint=%s,singleNeedPoint=%s,updGetCount=%s" % (templateID, index, curPoint, getCount, canUsePoint, singleNeedPoint, updGetCount)) for itemID, itemCnt, isAuctionItem in awardList: ItemControler.GivePlayerItem(curPlayer, itemID, itemCnt, isAuctionItem, [IPY_GameWorld.rptItem], event=["FeastTravel", False, {}]) Sync_FeastTravelPlayerInfo(curPlayer, -1, index) # ²»Í¨ÖªÈÎÎñ return def Sync_FeastTravelPlayerInfo(curPlayer, taskID=None, awardIndex=None): ## ֪ͨ»î¶¯Íæ¼ÒÐÅÏ¢ # @param taskID: None-֪ͨȫ²¿£»>=0-µ¥¸ö֪ͨ£»-1-²»Í¨Öª syncTaskIDList = [] if taskID == None: ipyMgr = IpyGameDataPY.IPY_Data() for index in xrange(ipyMgr.GetActFeastTravelTaskCount()): taskIpyData = ipyMgr.GetActFeastTravelTaskByIndex(index) syncTaskIDList.append(taskIpyData.GetTraveTasklD()) elif taskID >= 0: syncTaskIDList = [taskID] syncAwardIndexList = [] if awardIndex == None: templateID = __GetTravelTemplateID() if templateID: awardIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActFeastTravelAward", templateID) if awardIpyDataList: syncAwardIndexList = [awardIpyData.GetRecordIndex() for awardIpyData in awardIpyDataList] elif awardIndex >= 0: syncAwardIndexList = [awardIndex] playerPack = ChPyNetSendPack.tagMCFeastTravelPlayerInfo() playerPack.TravelPoint = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FeastTravelPoint) playerPack.TravelPlayerTaskList = [] for taskID in syncTaskIDList: taskInfo = ChPyNetSendPack.tagMCFeastTravelPlayerTask() taskInfo.TravelTaskID = taskID taskInfo.TravelValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FeastTravelValue % taskID) taskInfo.FinishCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FeastTravelCount % taskID) playerPack.TravelPlayerTaskList.append(taskInfo) playerPack.TravelPlayerTaskCount = len(playerPack.TravelPlayerTaskList) playerPack.TravelPlayerAwardList = [] for awardIndex in syncAwardIndexList: awardInfo = ChPyNetSendPack.tagMCFeastTravelPlayerAward() awardInfo.AwardIndex = awardIndex awardInfo.GetAwardCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FeastTravelAwardCount % awardIndex) playerPack.TravelPlayerAwardList.append(awardInfo) playerPack.TravelPlayerAwardCount = len(playerPack.TravelPlayerAwardList) NetPackCommon.SendFakePack(curPlayer, playerPack) return def Sync_FeastTravelActionInfo(curPlayer): ## ֪ͨ»î¶¯ÐÅÏ¢ actInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_FeastTravel, {}) if not actInfo: return if not actInfo.get(ShareDefine.ActKey_State): return cfgID = actInfo.get(ShareDefine.ActKey_CfgID) ipyData = IpyGameDataPY.GetIpyGameData("ActFeastTravel", cfgID) if not ipyData: return worldLV = actInfo.get(ShareDefine.ActKey_WorldLV) templateID = GameWorld.GetDictValueByRangeKey(ipyData.GetTemplateIDInfo(), worldLV, 0) if not templateID: return startDateStr, endDateStr = GameWorld.GetOperationActionDateStr(ipyData) actPack = ChPyNetSendPack.tagMCFeastTravelInfo() actPack.Clear() actPack.StartDate = startDateStr actPack.EndtDate = endDateStr actPack.LimitLV = ipyData.GetLVLimit() actPack.ResetType = ipyData.GetResetType() actPack.TravelTaskList = [] ipyMgr = IpyGameDataPY.IPY_Data() for index in xrange(ipyMgr.GetActFeastTravelTaskCount()): taskIpyData = ipyMgr.GetActFeastTravelTaskByIndex(index) taskInfo = ChPyNetSendPack.tagMCFeastTravelTask() taskInfo.TravelTaskID = taskIpyData.GetTraveTasklD() taskInfo.FinishNeedValue = taskIpyData.GetFinishNeedValue() taskInfo.FinishTimeMax = taskIpyData.GetFinishTimeMax() taskInfo.AddTravelPoint = taskIpyData.GetAddTravelPoint() actPack.TravelTaskList.append(taskInfo) actPack.TravelTaskCount = len(actPack.TravelTaskList) awardIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActFeastTravelAward", templateID) actPack.TravelAwardList = [] for awardIpyData in awardIpyDataList: awardInfo = ChPyNetSendPack.tagMCFeastTravelAward() awardInfo.AwardIndex = awardIpyData.GetRecordIndex() awardInfo.NeedTravelPoint = awardIpyData.GetNeedTravelPoint() awardInfo.AwardCountMax = awardIpyData.GetAwardCountMax() awardInfo.AwardItemList = [] for itemID, itemCount, isAuctionItem in awardIpyData.GetTravelAwardInfo(): itemInfo = ChPyNetSendPack.tagMCFeastTravelAwardItem() itemInfo.ItemID = itemID itemInfo.ItemCount = itemCount itemInfo.IsBind = isAuctionItem awardInfo.AwardItemList.append(itemInfo) awardInfo.AwardItemCount = len(awardInfo.AwardItemList) actPack.TravelAwardList.append(awardInfo) actPack.TravelAwardCount = len(actPack.TravelAwardList) NetPackCommon.SendFakePack(curPlayer, actPack) return