Advertisement
avogatro

fixed world of tanks mod : reset personal mission for obj 279 early, version 1.1

Apr 10th, 2023 (edited)
965
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.90 KB | Gaming | 0 0
  1. import BigWorld
  2. from PlayerEvents import g_playerEvents
  3. from gui.ClientUpdateManager import g_clientUpdateManager
  4. from helpers import dependency
  5. from skeletons.gui.shared import IItemsCache
  6. import Account
  7. from personal_missions import g_cache
  8.  
  9. STAT_DIFF_KEY = 'stats'
  10. INVENTORY_DIFF_KEY = 'inventory'
  11. _STAT_DIFF_FORMAT = STAT_DIFF_KEY + '.{0:>s}'
  12. CREDITS_DIFF_KEY = _STAT_DIFF_FORMAT.format('credits')
  13. BATTLES_SERIES_KEY = 'battlesSeries'
  14. ADV_BATTLES_SERIES_KEY = 'battlesSeriesAdv'
  15. BATTLES_KEY = 'battles'
  16. STATE_KEY = 'state'
  17.  
  18. # automatically reset 279e personal missions progress in garage until mission condition is fullfilled.
  19. # For example Union-13:
  20. #  PRIMARY CONDITION: Earn the Top Gun award twice within 10 battles.
  21. #  SECONDARY CONDITION: Earn the Top Gun award three times within 10 battles.
  22.  
  23. # Every time I don't get 6 kills, I want to reset the mission progress.
  24. # If I got 1 top gun, it should not reset until 10 battles are done or mission completed.
  25.  
  26.  
  27. class WBPMAutoReset:
  28.     itemsCache = dependency.descriptor(IItemsCache)
  29.     player = None
  30.     canReset = True
  31.  
  32.     def __init__(self):
  33.         self._initListeners()
  34.         self._patchQuestResetter()
  35.  
  36.     def _patchQuestResetter(self):
  37.         old_selectPersonalMissions = Account.PlayerAccount.selectPersonalMissions
  38.  
  39.         def new_selectPersonalMissions(self, personalMissionsIDs, questType, callback):
  40.             old_selectPersonalMissions(self, personalMissionsIDs, questType, callback)
  41.  
  42.         Account.PlayerAccount.selectPersonalMissions = new_selectPersonalMissions
  43.  
  44.     def _initListeners(self):
  45.         self.itemsCache.onSyncCompleted += self._onSyncCompleted
  46.         g_playerEvents.onBattleResultsReceived += self._onBattleResultsReceived
  47.         g_clientUpdateManager.addCallbacks({CREDITS_DIFF_KEY: self._onCreditsUpdate})
  48.  
  49.     # if ingame credit changes in garage, check missions, even if we left battle early
  50.     def _onCreditsUpdate(self, _):
  51.         self.canReset = True
  52.         self._checkQuestState()
  53.  
  54.     # if we end game and come back to garage and sync tanks, check missions
  55.     def _onSyncCompleted(self, *args):
  56.         self._checkQuestState()
  57.  
  58.     # this event fires sometimes before battle ending
  59.     def _onBattleResultsReceived(self, isPlayerVehicle, results):
  60.         self.canReset = True
  61.  
  62.     def _checkbattlesSeriesHasOnlyFails(self, battlesSeries):
  63.         battleSeriesHasOnlyFails = False
  64.         if len(battlesSeries) > 0:
  65.             battleSeriesHasOnlyFails = True
  66.             for battle in battlesSeries:
  67.                 if battle:
  68.                     battleSeriesHasOnlyFails = False
  69.                 break
  70.         return battleSeriesHasOnlyFails
  71.  
  72.     def _checkQuestState(self):
  73.         questProgress = Account.g_accountRepository.questProgress
  74.         if questProgress is None:
  75.             return
  76.    
  77.         pmProgress = questProgress._QuestProgress__cache['pm2_progress']
  78.         questsToReset = {}
  79.         needReset = False
  80.         for q in pmProgress:
  81.             quest = pmProgress[q]
  82.             print '--\t', q, quest
  83.             questId = g_cache._PQCache__questUniqueIDToPotapovQuestID['%s_main' % q]
  84.             mainConditionFailed = False
  85.             advConditionFailed = False
  86.             if BATTLES_SERIES_KEY in quest.keys():
  87.                 battlesSeriesKeys = quest[BATTLES_SERIES_KEY].keys()
  88.                 if BATTLES_KEY in battlesSeriesKeys:
  89.                     mainConditionFailed = self._checkbattlesSeriesHasOnlyFails(quest[BATTLES_SERIES_KEY][BATTLES_KEY])
  90.                     if mainConditionFailed:
  91.                         questsToReset[questId] = True
  92.                         needReset = True
  93.                     else:
  94.                         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():
  95.                             advConditionFailed = self._checkbattlesSeriesHasOnlyFails(quest[ADV_BATTLES_SERIES_KEY][BATTLES_KEY])
  96.                             if advConditionFailed:
  97.                                 questsToReset[questId] = True
  98.                                 needReset = True
  99.             print '>>', questId, 'main cond:', mainConditionFailed, 'adv cond:', advConditionFailed
  100.  
  101.         if needReset:
  102.             self._resetQuest(questsToReset)
  103.         else:
  104.             print 'no need to reset quests:', questsToReset
  105.  
  106.  
  107.     def _voidCallback(self, *args):
  108.         pass
  109.  
  110.     def _resetQuest(self, questIds):
  111.         if self.canReset:
  112.             self.canReset = False
  113.             print ('>> trying to reset quest:', questIds, questIds.keys())
  114.             BigWorld.player().resetPersonalMissions(list(questIds.keys()), 2, self._voidCallback)
  115.             print ('>> reset seems successful', list(questIds.keys()))
  116.         else:
  117.             print '>> reset quest blocked till next battle'
  118.  
  119.  
  120. wbPMAutoReset = WBPMAutoReset()
  121.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement