Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import BigWorld
- from PlayerEvents import g_playerEvents
- from gui.ClientUpdateManager import g_clientUpdateManager
- from helpers import dependency
- from skeletons.gui.shared import IItemsCache
- import Account
- from personal_missions import g_cache
- STAT_DIFF_KEY = 'stats'
- INVENTORY_DIFF_KEY = 'inventory'
- _STAT_DIFF_FORMAT = STAT_DIFF_KEY + '.{0:>s}'
- CREDITS_DIFF_KEY = _STAT_DIFF_FORMAT.format('credits')
- BATTLES_SERIES_KEY = 'battlesSeries'
- ADV_BATTLES_SERIES_KEY = 'battlesSeriesAdv'
- BATTLES_KEY = 'battles'
- STATE_KEY = 'state'
- # automatically reset 279e personal missions progress in garage until mission condition is fullfilled.
- # For example Union-13:
- # PRIMARY CONDITION: Earn the Top Gun award twice within 10 battles.
- # SECONDARY CONDITION: Earn the Top Gun award three times within 10 battles.
- # Every time I don't get 6 kills, I want to reset the mission progress.
- # If I got 1 top gun, it should not reset until 10 battles are done or mission completed.
- class WBPMAutoReset:
- itemsCache = dependency.descriptor(IItemsCache)
- player = None
- canReset = True
- def __init__(self):
- self._initListeners()
- self._patchQuestResetter()
- def _patchQuestResetter(self):
- old_selectPersonalMissions = Account.PlayerAccount.selectPersonalMissions
- def new_selectPersonalMissions(self, personalMissionsIDs, questType, callback):
- old_selectPersonalMissions(self, personalMissionsIDs, questType, callback)
- Account.PlayerAccount.selectPersonalMissions = new_selectPersonalMissions
- def _initListeners(self):
- self.itemsCache.onSyncCompleted += self._onSyncCompleted
- g_playerEvents.onBattleResultsReceived += self._onBattleResultsReceived
- g_clientUpdateManager.addCallbacks({CREDITS_DIFF_KEY: self._onCreditsUpdate})
- # if ingame credit changes in garage, check missions, even if we left battle early
- def _onCreditsUpdate(self, _):
- self.canReset = True
- self._checkQuestState()
- # if we end game and come back to garage and sync tanks, check missions
- def _onSyncCompleted(self, *args):
- self._checkQuestState()
- # this event fires sometimes before battle ending
- def _onBattleResultsReceived(self, isPlayerVehicle, results):
- self.canReset = True
- def _checkbattlesSeriesHasOnlyFails(self, battlesSeries):
- battleSeriesHasOnlyFails = False
- if len(battlesSeries) > 0:
- battleSeriesHasOnlyFails = True
- for battle in battlesSeries:
- if battle:
- battleSeriesHasOnlyFails = False
- break
- return battleSeriesHasOnlyFails
- def _checkQuestState(self):
- questProgress = Account.g_accountRepository.questProgress
- if questProgress is None:
- return
- pmProgress = questProgress._QuestProgress__cache['pm2_progress']
- questsToReset = {}
- needReset = False
- for q in pmProgress:
- quest = pmProgress[q]
- print '--\t', q, quest
- questId = g_cache._PQCache__questUniqueIDToPotapovQuestID['%s_main' % q]
- mainConditionFailed = False
- advConditionFailed = False
- if BATTLES_SERIES_KEY in quest.keys():
- battlesSeriesKeys = quest[BATTLES_SERIES_KEY].keys()
- if BATTLES_KEY in battlesSeriesKeys:
- mainConditionFailed = self._checkbattlesSeriesHasOnlyFails(quest[BATTLES_SERIES_KEY][BATTLES_KEY])
- if mainConditionFailed:
- questsToReset[questId] = True
- needReset = True
- else:
- if STATE_KEY in battlesSeriesKeys and quest[BATTLES_SERIES_KEY][STATE_KEY] >= 5 and ADV_BATTLES_SERIES_KEY in quest.keys() and BATTLES_KEY in quest[ADV_BATTLES_SERIES_KEY].keys():
- advConditionFailed = self._checkbattlesSeriesHasOnlyFails(quest[ADV_BATTLES_SERIES_KEY][BATTLES_KEY])
- if advConditionFailed:
- questsToReset[questId] = True
- needReset = True
- print '>>', questId, 'main cond:', mainConditionFailed, 'adv cond:', advConditionFailed
- if needReset:
- self._resetQuest(questsToReset)
- else:
- print 'no need to reset quests:', questsToReset
- def _voidCallback(self, *args):
- pass
- def _resetQuest(self, questIds):
- if self.canReset:
- self.canReset = False
- print ('>> trying to reset quest:', questIds, questIds.keys())
- BigWorld.player().resetPersonalMissions(list(questIds.keys()), 2, self._voidCallback)
- print ('>> reset seems successful', list(questIds.keys()))
- else:
- print '>> reset quest blocked till next battle'
- wbPMAutoReset = WBPMAutoReset()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement