NovaBryan/EVE_Dump
Log | Files | 📦 下载最新源码 (.zip) | Refs | README

enlistCont.py (14021B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\shared\factionalWarfare\enlistmentFlow\enlistCont.py
      2 import uthread2
      3 from carbonui import TextAlign
      4 from carbonui.text.styles import TextBody
      5 from carbonui.button.group import ButtonGroup, ButtonSizeMode
      6 from carbonui.control.button import Button
      7 from carbonui.primitives.containerAutoSize import ContainerAutoSize
      8 import carbonui.const as uiconst
      9 from carbonui.primitives.sprite import Sprite
     10 import eve.client.script.ui.shared.factionalWarfare.enlistmentFlow.enlistmentUtil as enlistmentUtil
     11 from eve.client.script.ui import eveColor
     12 from eve.client.script.ui.control.infoIcon import MoreInfoIconBeta
     13 from eve.client.script.ui.shared.theatersOfWar.util import open_fw_window
     14 from eve.common.script.sys import idCheckers
     15 from eve.common.script.sys.idCheckers import IsPlayerCorporation
     16 from eve.common.script.util.facwarCommon import IsPirateFWFaction
     17 from factionwarfare.client.enlistmentChecks import EnlistmentChecksObject
     18 from jobboard.client import get_fw_enlistment_job, job_board_signals
     19 from localization import GetByLabel
     20 import eve.common.lib.appConst as appConst
     21 import factionwarfare.client.enrollmentConst as enrollmentConst
     22 
     23 class EnlistCont(ContainerAutoSize):
     24     default_name = 'enlistCont'
     25     default_align = uiconst.TOBOTTOM
     26     default_alignMode = uiconst.TOTOP
     27     default_minHeight = 130
     28     __notifyevents__ = ['OnSessionChanged', 'OnEnlistmentStateUpdated_Local']
     29 
     30     def ApplyAttributes(self, attributes):
     31         super(EnlistCont, self).ApplyAttributes(attributes)
     32         self.factionID = None
     33         self.currentLoadingID = 0
     34         self.warningChecks = EnlistmentChecksObject()
     35         self.facWarSvc = sm.GetService('facwar')
     36         self.warningsCont = ContainerAutoSize(name='warningsCont', parent=self, align=uiconst.TOTOP, padBottom=10)
     37         self.btnCont = ContainerAutoSize(name='btnCont', parent=self, align=uiconst.TOTOP)
     38         self.enlistBtns = ButtonGroup(parent=self.btnCont, align=uiconst.CENTERTOP, orientation=uiconst.Axis.VERTICAL, button_size_mode=ButtonSizeMode.EQUAL, padLeft=20, padRight=20)
     39         sm.RegisterNotify(self)
     40         job_board_signals.on_tracked_jobs_changed.connect(self.OnTrackedJobsChanged)
     41 
     42     def Close(self):
     43         job_board_signals.on_tracked_jobs_changed.disconnect(self.OnTrackedJobsChanged)
     44         super(EnlistCont, self).Close()
     45 
     46     def LoadEnlist(self, factionID):
     47         loadingID = self.currentLoadingID + 1
     48         self.currentLoadingID = loadingID
     49         self.warningsCont.Flush()
     50         self.enlistBtns.Flush()
     51         self.factionID = factionID
     52         warningsToAdd = []
     53         btnsToAdd = []
     54         if session.warfactionid:
     55             if session.warfactionid != self.factionID:
     56                 warningsToAdd = self._GetWarningsToLoad()
     57             btnsToAdd += self._GetAlreadyListedBtns()
     58         else:
     59             warningsToAdd = self._GetWarningsToLoad()
     60             btnsToAdd += self._GetNotEnlistedBtns()
     61         if self.currentLoadingID != loadingID:
     62             return
     63         for warningID in warningsToAdd:
     64             self._AddWarning(warningID)
     65 
     66         for btnData in btnsToAdd:
     67             self._AddButton(btnData)
     68 
     69     def _GetAlreadyListedBtns(self):
     70         btnsToAdd = []
     71         inThisFaction = session.warfactionid and session.warfactionid == self.factionID
     72         if inThisFaction:
     73             btnsToAdd += self._GetRetireBtns()
     74         elif self.factionID in self.facWarSvc.GetCurrentStationFactionIDs():
     75             btnsToAdd.append(BtnToAddData('UI/FactionWarfare/Enlistment/JoinNow', None, True))
     76         else:
     77             btnsToAdd.append(BtnToAddData('UI/FactionWarfare/Enlistment/InitiateEnlistment', self.InitiateEnlistment, True))
     78         return btnsToAdd
     79 
     80     def _GetRetireBtns(self):
     81         btnsToAdd = []
     82         if idCheckers.IsNPC(session.corpid) and session.warfactionid:
     83             btnsToAdd.append(BtnToAddData('UI/FactionWarfare/Retire', enlistmentUtil.Retire))
     84         elif sm.GetService('fwEnlistmentSvc').IsEnlistedDirectly():
     85             btnsToAdd.append(BtnToAddData('UI/FactionWarfare/Retire', enlistmentUtil.RemoveDirectEnlistment))
     86         else:
     87             hasReqCorporationRole = session.corprole & appConst.corpRoleDirector == appConst.corpRoleDirector
     88             if hasReqCorporationRole:
     89                 factionalWarStatus = self.facWarSvc.GetCorpFactionalWarStatus()
     90                 fwStatus = factionalWarStatus.status
     91                 if fwStatus == appConst.facwarCorporationActive:
     92                     if session.allianceid:
     93                         btnsToAdd.append(BtnToAddData('UI/FactionWarfare/RetireAlliance', enlistmentUtil.RetireAlliance))
     94                     else:
     95                         btnsToAdd.append(BtnToAddData('UI/FactionWarfare/RetireCorporation', enlistmentUtil.RetireCorp))
     96                 elif fwStatus == appConst.facwarCorporationLeaving:
     97                     btnsToAdd.append(BtnToAddData('UI/FactionWarfare/CancelRetirement', enlistmentUtil.CancelRetirement))
     98         return btnsToAdd
     99 
    100     def _AddButton(self, btnData):
    101 
    102         def CallFuncAndReload(*args):
    103             btnData.func()
    104             self.LoadEnlist(self.factionID)
    105 
    106         b = Button(parent=self.enlistBtns, align=uiconst.TOTOP, label=GetByLabel(btnData.labelPath), func=CallFuncAndReload, hint=btnData.hint)
    107         if btnData.isDisabled:
    108             b.Disable()
    109         return b
    110 
    111     def _GetNotEnlistedBtns(self):
    112         btnsToAdd = []
    113         if self.warningChecks.HasCorpApplicationPendingWithFactionWarning(self.factionID):
    114             hasReqCorporationRole = session.corprole & appConst.corpRoleDirector == appConst.corpRoleDirector
    115             if hasReqCorporationRole:
    116                 btnsToAdd.append(BtnToAddData('UI/FactionWarfare/WithdrawApplication', self.CancelApplication))
    117         elif self.warningChecks.HasCorpApplicationPendingWithDifferentFactionWarning(self.factionID):
    118             pass
    119         elif not self.warningChecks.HasWrongLocationWarning(self.factionID):
    120             btnsToAdd += self._AddEnlistButtons()
    121         else:
    122             btnsToAdd += self._AddInitiateEnlistmentBtn()
    123         return btnsToAdd
    124 
    125     def JoinMilitia(self, *args):
    126         uthread2.StartTasklet(self.JoinMilitia_thread)
    127 
    128     def JoinMilitia_thread(self, *args):
    129         warFactionnIdBefore = session.warfactionid
    130         self.facWarSvc.JoinFactionAsCharacter(self.factionID, session.warfactionid)
    131         if not warFactionnIdBefore:
    132             for x in xrange(3):
    133                 if session.warfactionid:
    134                     if IsPirateFWFaction(session.warfactionid):
    135                         sm.GetService('cmd').OpenInsurgencyDashboard()
    136                     else:
    137                         open_fw_window(faction_id=session.warfactionid)
    138                     break
    139                 uthread2.sleep(1)
    140 
    141     def EnlistDirectly(self, *args):
    142         warFactionIdBefore = session.warfactionid
    143         sm.GetService('fwEnlistmentSvc').OnEnlistMeDirectly(self.factionID)
    144         if not warFactionIdBefore and session.warfactionid:
    145             if IsPirateFWFaction(session.warfactionid):
    146                 sm.GetService('cmd').OpenInsurgencyDashboard()
    147             else:
    148                 open_fw_window(faction_id=session.warfactionid)
    149 
    150     def _AddEnlistButtons(self):
    151         hasReqCorporationRole = session.corprole & appConst.corpRoleDirector == appConst.corpRoleDirector
    152         hasReqAllianceRole = hasReqCorporationRole and session.allianceid and sm.GetService('alliance').GetAlliance().executorCorpID == session.corpid
    153         characterBtnDisabled = self.IsButtonDisabled()
    154         charEnlistmentFunc = self.JoinMilitia
    155         if IsPlayerCorporation(session.corpid):
    156             charEnlistmentFunc = self.EnlistDirectly
    157             characterBtnDisabled = characterBtnDisabled or bool(self.warningChecks.HasDisallowedByCorpWarning(self.factionID))
    158         btnsToAdd = []
    159         btnsToAdd.append(BtnToAddData('UI/FactionWarfare/EnlistMe', charEnlistmentFunc, characterBtnDisabled))
    160         if hasReqCorporationRole:
    161             btnsToAdd.append(BtnToAddData('UI/FactionWarfare/EnlistCorporation', lambda *args: self.facWarSvc.JoinFactionAsCorporation(self.factionID, session.warfactionid), not hasReqCorporationRole))
    162         if hasReqAllianceRole:
    163             btnsToAdd.append(BtnToAddData('UI/FactionWarfare/EnlistAlliance', lambda *args: self.facWarSvc.JoinFactionAsAlliance(self.factionID, session.warfactionid), not hasReqAllianceRole))
    164         return btnsToAdd
    165 
    166     def _AddInitiateEnlistmentBtn(self):
    167         job = get_fw_enlistment_job(self.factionID)
    168         if job and job.is_tracked:
    169             buttonDisabled = True
    170         else:
    171             buttonDisabled = self.IsButtonDisabled()
    172         btnData = BtnToAddData('UI/FactionWarfare/Enlistment/InitiateEnlistment', self.InitiateEnlistment, buttonDisabled)
    173         jumpsToNearestStation, nearestStationID = self.facWarSvc.GetNearestFactionWarfareStationData(preferredFaction=self.factionID)
    174         if nearestStationID and session.stationid != nearestStationID:
    175             stationAndJumps = GetByLabel('UI/Corporations/CorpUIHome/StationAndJumps', station=nearestStationID, jumpCount=jumpsToNearestStation, jumps=jumpsToNearestStation)
    176             hint = '%s<br>%s' % (GetByLabel('UI/Agency/FactionWarfare/nearestMilitiaOffice'), stationAndJumps)
    177             btnData.hint = hint
    178         return [btnData]
    179 
    180     def IsButtonDisabled(self):
    181         buttonDisabled = self.warningChecks.HasAlreadyInFwWarning(self.factionID) or self.warningChecks.HasDisallowedByCorpWarning(self.factionID) or self.warningChecks.HasStandingWarning(self.factionID) or self.warningChecks.HasCooldownWarning(self.factionID)
    182         return buttonDisabled
    183 
    184     def LoadCharBtnTooltip(self, tooltipPanel, factionID, *args):
    185         tooltipPanel.state = uiconst.UI_NORMAL
    186         factionName = cfg.eveowners.Get(factionID).name
    187         linkUrl = '<a href=localsvc:method=ShowCorpDetails>'
    188         characterHint = GetByLabel('UI/FactionWarfare/CorpRestrictionsPreventDirectEnrollment', factionName=factionName, urlStart=linkUrl, urlEnd='</a>')
    189         tooltipPanel.LoadGeneric1ColumnTemplate()
    190         tooltipPanel.AddLabelMedium(text=characterHint, wrapWidth=200, state=uiconst.UI_NORMAL)
    191 
    192     def CancelApplication(self, *args):
    193         enlistmentUtil.CancelApplication()
    194 
    195     def InitiateEnlistment(self, *args):
    196         job = get_fw_enlistment_job(self.factionID)
    197         if job is None:
    198             raise UserError('CustomNotify', {'notify': "Couldn't find the job to start"})
    199         if not job.is_tracked:
    200             job.toggle_tracked_by_player()
    201         else:
    202             job.add_tracked()
    203 
    204     def _GetWarningsToLoad(self):
    205         warningsToAdd = []
    206         warningChecks = self.warningChecks
    207         if warningChecks.HasCorpApplicationPendingWithFactionWarning(self.factionID):
    208             warningsToAdd.append(enrollmentConst.WARNING_PENDING_SAME_FACTION)
    209         elif warningChecks.HasCorpApplicationPendingWithDifferentFactionWarning(self.factionID):
    210             warningsToAdd.append(enrollmentConst.WARNING_PENDING_ANOTHER_FACTION)
    211         else:
    212             if warningChecks.HasAlreadyInFwWarning(self.factionID):
    213                 warningsToAdd.append(enrollmentConst.WARNING_ALREADY_IN_FW)
    214             if warningChecks.HasDisallowedByCorpWarning(self.factionID):
    215                 warningsToAdd.append(enrollmentConst.WARNING_DISALLOWED_BY_CORP)
    216             if warningChecks.HasStandingWarning(self.factionID):
    217                 warningsToAdd.append(enrollmentConst.WARNING_PENDING_STANDING)
    218             if warningChecks.HasTrackingThisFactionWarning(self.factionID) and warningChecks.HasWrongLocationWarning(self.factionID):
    219                 warningsToAdd.append(enrollmentConst.WARNING_TRACKING_SAME_FACTION)
    220             if warningChecks.HasTrackingAnotherFactionWarning(self.factionID):
    221                 warningsToAdd.append(enrollmentConst.WARNING_TRACKING_ANOTHER_FACTION)
    222             if warningChecks.HasWrongLocationWarning(self.factionID):
    223                 warningsToAdd.append(enrollmentConst.WARNING_PENDING_WRONG_LOCATION)
    224             if warningChecks.HasCooldownWarning(self.factionID):
    225                 warningsToAdd.append(enrollmentConst.WARNING_DIRECT_ENLISTMENT_COOLDOWN)
    226         return warningsToAdd
    227 
    228     def _AddWarning(self, warningValue):
    229         warningCont = ContainerAutoSize(parent=self.warningsCont, align=uiconst.TOTOP, alignMode=uiconst.CENTERTOP, minHeight=16, state=uiconst.UI_NORMAL, padTop=6)
    230         innerWarningCont = ContainerAutoSize(parent=warningCont, align=uiconst.CENTERTOP, alignMode=uiconst.TOPLEFT, state=uiconst.UI_NORMAL)
    231         icon = MoreInfoIconBeta(parent=innerWarningCont, align=uiconst.CENTERLEFT, circleColor=eveColor.WARNING_ORANGE, questionMarkTexturePath='res:/UI/Texture/Classes/Enlistment/attention.png', state=uiconst.UI_DISABLED)
    232         text = enlistmentUtil.GetTextForWarning(warningValue)
    233         TextBody(text=text, parent=innerWarningCont, align=uiconst.TOPLEFT, left=20, color=eveColor.WARNING_ORANGE, maxWidth=200)
    234         innerWarningCont.GetHint = lambda *args: self.GetWarningHint(warningValue)
    235 
    236     def GetWarningHint(self, warningValue):
    237         if warningValue == enrollmentConst.WARNING_PENDING_STANDING:
    238             if IsPirateFWFaction(self.factionID):
    239                 return GetByLabel('UI/FactionWarfare/Enlistment/WarningStandingPiratesLong')
    240         return enlistmentUtil.GetHintForWarning(warningValue)
    241 
    242     def OnSessionChanged(self, _isremote, _session, change):
    243         if 'stationid' in change:
    244             self.LoadEnlist(self.factionID)
    245 
    246     def OnTrackedJobsChanged(self, *args):
    247         self.LoadEnlist(self.factionID)
    248 
    249     def OnEnlistmentStateUpdated_Local(self, *args):
    250         self.LoadEnlist(self.factionID)
    251 
    252 
    253 class BtnToAddData(object):
    254 
    255     def __init__(self, labelPath, func, isDisabled = False, hint = ''):
    256         self.labelPath = labelPath
    257         self.func = func
    258         self.isDisabled = isDisabled
    259         self.hint = hint