insurgencyCampaignSvc.py (8869B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\services\insurgencyCampaignSvc.py 2 import uthread2 3 from caching import Memoize 4 from characterdata import factions 5 from localization import GetByLabel 6 from player_messaging.client.ui_message import prompt_player_fsd_dialog 7 if False: 8 from typing import Optional, List 9 from carbon.common.script.sys.service import Service 10 from pirateinsurgency.campaignClientSnapshot import CampaignClientSnapshot 11 from pirateinsurgency.const import CAMPAIGN_STATE_FORECASTING, CAMPAIGN_STATE_ACTIVE, CAMPAIGN_STATE_PIRATE_WIN, CAMPAIGN_STATE_ANTIPIRATE_WIN, CAMPAIGN_STATE_NO_WINNER 12 from eve.common.script.util import notificationconst 13 LOCAL_CAMPAIGN_UNKNOWN = 'LOCAL_CAMPAIGN_UNKNOWN' 14 15 class InsurgencyCampaignSvc(Service): 16 __guid__ = 'svc.insurgencyCampaignSvc' 17 __displayname__ = 'Insurgency Campaign client service' 18 __startupdependencies__ = [] 19 __notifyevents__ = ['OnSessionChanged', 20 'OnInsurgencyCampaignStartedForLocation', 21 'OnInsurgencyCampaignUpdatedForLocation', 22 'OnInsurgencyCampaignEndingForLocation', 23 'OnInsurgencyStateChangedForFaction', 24 'OnSystemFullyCorruptedForFaction', 25 'OnSystemFullySuppressedForFaction', 26 'OnEnterSpace'] 27 _localCampaignSnapshot = LOCAL_CAMPAIGN_UNKNOWN 28 29 def __init__(self): 30 super(InsurgencyCampaignSvc, self).__init__() 31 self.GetCurrentCampaignSnapshots_Memoized.clear_memoized() 32 33 def OnSessionChanged(self, isremote, session, change): 34 if 'solarsystemid2' in change: 35 self._localCampaignSnapshot = LOCAL_CAMPAIGN_UNKNOWN 36 37 def _LocalCampaignSnapshotLock(self): 38 return self.LockedService('LocalCampaignSnapshot') 39 40 def GetLocalCampaignSnapshot(self): 41 if self._localCampaignSnapshot is LOCAL_CAMPAIGN_UNKNOWN: 42 with self._LocalCampaignSnapshotLock(): 43 if self._localCampaignSnapshot is LOCAL_CAMPAIGN_UNKNOWN: 44 self.LogInfo('GetLocalCampaignSnapshot - _localCampaignSnapshot is unknown - asking the server') 45 solarsystemID, campaignSnapshot = sm.RemoteSvc('insurgencySolarsystem').GetLocalCampaignClientSnapshot() 46 if solarsystemID != session.solarsystemid2: 47 solarsystemID, campaignSnapshot = sm.RemoteSvc('insurgencySolarsystem').GetLocalCampaignClientSnapshot() 48 if solarsystemID == session.solarsystemid2: 49 self._localCampaignSnapshot = campaignSnapshot 50 return self._localCampaignSnapshot 51 52 def OnInsurgencyCampaignStartedForLocation(self, campaignSnapshot): 53 self.GetCurrentCampaignSnapshots_Memoized.clear_memoized() 54 with self._LocalCampaignSnapshotLock(): 55 if session.solarsystemid2 not in campaignSnapshot.coveredSolarsystemIDs: 56 return 57 self.LogWarn('insurgencyCampaignSvc.OnInsurgencyCampaignStartedForLocation', campaignSnapshot) 58 self._localCampaignSnapshot = campaignSnapshot 59 sm.ScatterEvent('OnInsurgencyCampaignStartedForLocation_Local', campaignSnapshot) 60 self.ShowInsurgencyCampaignStartedForLocation() 61 62 def OnInsurgencyCampaignUpdatedForLocation(self, campaignSnapshot): 63 self.GetCurrentCampaignSnapshots_Memoized.clear_memoized() 64 with self._LocalCampaignSnapshotLock(): 65 if session.solarsystemid2 not in campaignSnapshot.coveredSolarsystemIDs: 66 return 67 self.LogWarn('insurgencyCampaignSvc.OnInsurgencyCampaignUpdatedForLocation', campaignSnapshot) 68 self._localCampaignSnapshot = campaignSnapshot 69 sm.ScatterEvent('OnInsurgencyCampaignUpdatedForLocation_Local', campaignSnapshot) 70 self.ShowInsurgencyCampaignUpdatedForLocation(campaignSnapshot) 71 72 def OnInsurgencyCampaignEndingForLocation(self, solarsystemID): 73 self.GetCurrentCampaignSnapshots_Memoized.clear_memoized() 74 with self._LocalCampaignSnapshotLock(): 75 if session.solarsystemid2 != solarsystemID: 76 return 77 self.LogWarn('insurgencyCampaignSvc.OnInsurgencyCampaignEndingForLocation') 78 self._localCampaignSnapshot = None 79 sm.ScatterEvent('OnInsurgencyCampaignEndingForLocation_Local') 80 self.ShowInsurgencyCampaignEndingForLocation() 81 82 def GetCurrentCampaignSnapshots(self): 83 snapshots = sm.RemoteSvc('insurgencySolarsystem').GetAllVisibleCampaigns() 84 return snapshots 85 86 @Memoize(0.5) 87 def GetCurrentCampaignSnapshots_Memoized(self): 88 return self.GetCurrentCampaignSnapshots() 89 90 def GetSolarsystemPirateFactionForCampaign(self, solarSystemID): 91 for campaign in self.GetCurrentCampaignSnapshots_Memoized(): 92 if solarSystemID in campaign.coveredSolarsystemIDs: 93 return campaign.pirateFactionID 94 95 def IsInsurgencyOriginSolarsystemID(self, solarSystemID): 96 for campaign in self.GetCurrentCampaignSnapshots_Memoized(): 97 if campaign.originSolarsystemID == solarSystemID: 98 return True 99 100 return False 101 102 def GetActiveFobStructureIdAndSystemIdForFaction(self, factionID): 103 for campaign in self.GetCurrentCampaignSnapshots_Memoized(): 104 if campaign.pirateFactionID == factionID and campaign.fsmState in (CAMPAIGN_STATE_FORECASTING, CAMPAIGN_STATE_ACTIVE, CAMPAIGN_STATE_PIRATE_WIN): 105 return (campaign.structureID, campaign.originSolarsystemID) 106 107 return (None, None) 108 109 def OnInsurgencyStateChangedForFaction(self, campaignState, pirateFactionID, originSolarsystemID): 110 if campaignState == CAMPAIGN_STATE_FORECASTING: 111 sm.GetService('notificationSvc').MakeAndScatterNotification(notificationconst.notificationTypeInsurgencyStarting, data={'pirateFactionID': pirateFactionID, 112 'originSolarsystemID': originSolarsystemID}) 113 elif campaignState == CAMPAIGN_STATE_ACTIVE: 114 sm.GetService('notificationSvc').MakeAndScatterNotification(notificationconst.notificationTypeInsurgencyStarted, data={'pirateFactionID': pirateFactionID}) 115 elif campaignState == CAMPAIGN_STATE_PIRATE_WIN: 116 sm.GetService('notificationSvc').MakeAndScatterNotification(notificationconst.notificationTypeInsurgencyEndedPiratesWin, data={'pirateFactionID': pirateFactionID}) 117 elif campaignState == CAMPAIGN_STATE_ANTIPIRATE_WIN: 118 sm.GetService('notificationSvc').MakeAndScatterNotification(notificationconst.notificationTypeInsurgencyEndedAntiPiratesWin, data={'pirateFactionID': pirateFactionID}) 119 elif campaignState == CAMPAIGN_STATE_NO_WINNER: 120 sm.GetService('notificationSvc').MakeAndScatterNotification(notificationconst.notificationTypeInsurgencyEndedNoOneWins, data={'pirateFactionID': pirateFactionID}) 121 122 def OnSystemFullyCorruptedForFaction(self, solarsystemID, pirateFactionID, piratePoints, pointsRequired): 123 sm.GetService('notificationSvc').MakeAndScatterNotification(notificationconst.notificationTypeInsurgencyStage5Corruption, data={'solarSystemID': solarsystemID, 124 'pirateFactionID': pirateFactionID, 125 'numberOfCorruptedSystems': piratePoints, 126 'totalNumberOfSystems': pointsRequired}) 127 128 def OnSystemFullySuppressedForFaction(self, solarsystemID, antipiratePoints, pointsRequired): 129 sm.GetService('notificationSvc').MakeAndScatterNotification(notificationconst.notificationTypeInsurgencyStage5Suppression, data={'solarSystemID': solarsystemID, 130 'numberOfSuppressedSystems': antipiratePoints, 131 'totalNumberOfSystems': pointsRequired}) 132 133 def OnEnterSpace(self): 134 uthread2.call_after_wallclocktime_delay(self.ShowActiveInsurgencyNotification, 4) 135 136 def ShowActiveInsurgencyNotification(self): 137 snapshot = self.GetLocalCampaignSnapshot() 138 if snapshot is not None: 139 if snapshot.fsmState == CAMPAIGN_STATE_ACTIVE: 140 pirateFaction = factions.get_faction_name(snapshot.pirateFactionID) 141 prompt_player_fsd_dialog('CustomNotify', {'notify': GetByLabel('UI/PirateInsurgencies/Notifications/InsurgencyNotification', pirateFaction=pirateFaction)}) 142 143 def ShowInsurgencyCampaignStartedForLocation(self): 144 prompt_player_fsd_dialog('CustomNotify', {'notify': GetByLabel('UI/PirateInsurgencies/Notifications/InsurgencyStartingInLocation')}) 145 146 def ShowInsurgencyCampaignUpdatedForLocation(self, campaign): 147 if campaign.fsmState == CAMPAIGN_STATE_ACTIVE: 148 prompt_player_fsd_dialog('CustomNotify', {'notify': GetByLabel('UI/PirateInsurgencies/Notifications/InsurgencyStartedInLocation')}) 149 150 def ShowInsurgencyCampaignEndingForLocation(self): 151 prompt_player_fsd_dialog('CustomNotify', {'notify': GetByLabel('UI/PirateInsurgencies/Notifications/InsurgencyEndedInLocation')})