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

timer.py (9541B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\dynamicresources\client\ess\bracket\reserve_bank\timer.py
      2 from __future__ import division
      3 import datetime
      4 import math
      5 import datetimeutils
      6 import eveui
      7 import gametime
      8 import localization
      9 import mathext
     10 import threadutils
     11 import trinity
     12 import uthread2
     13 from carbonui import uiconst
     14 from carbonui.primitives.vectorlinetrace import DashedCircle
     15 from carbonui.uianimations import animations
     16 from eve.client.script.ui.control.donutSegment import DonutSegment
     17 from dynamicresources.client import color
     18 from dynamicresources.client.ess.bracket.space_container import EssSpaceContainer
     19 from dynamicresources.client.ess.bracket.timer_indicator import TimerIndicator
     20 from dynamicresources.client.service import get_dynamic_resource_service
     21 
     22 class ReserveBankTimer(object):
     23 
     24     def __init__(self, camera, ess_root_transform, offset_y = 0.0, scale = 1.0):
     25         self._camera = camera
     26         self._root_transform = ess_root_transform
     27         self._offset_y = offset_y
     28         self._scale = scale
     29         self._y_transform = trinity.EveTransform()
     30         self._y_transform.name = 'reserve_bank_timer'
     31         self._y_transform.translation = (0, self._offset_y, 0)
     32         self._root_transform.children.append(self._y_transform)
     33         self._space_cont = EssSpaceContainer(transform=self._y_transform, width=1024, height=1024, scale=scale)
     34         self._timer_indicator_transform = trinity.EveTransform()
     35         self._y_transform.children.append(self._timer_indicator_transform)
     36         self._timer_indicator = TimerIndicator(name='reserve_bank_timer_indicator', transform=self._timer_indicator_transform, width=512, height=512, scale=scale / 2.0, color=color.reserve_bank.rgba, on_update=self._on_timer_indicator_update, visible=False)
     37         service = get_dynamic_resource_service()
     38         reserve_bank_state = service.ess_state_provider.state.reserve_bank
     39         pulses_total = reserve_bank_state.pulses_total
     40         dash_size_factor = mathext.lerp(20.0, 10.0, mathext.clamp(pulses_total / 45.0, 0.0, 1.0))
     41         self._timer = DashedCircle(parent=self._space_cont.content, align=uiconst.CENTER, radius=464, lineWidth=48, dashCount=pulses_total, startAngle=0, range=math.pi * 2, startColor=color.reserve_bank.rgba, endColor=color.reserve_bank.rgba, dashSizeFactor=dash_size_factor, end=0.0, smoothScale=8)
     42         DashedCircle(parent=self._space_cont.content, align=uiconst.CENTER, radius=464, lineWidth=48, dashCount=pulses_total, startAngle=0, range=math.pi * 2, startColor=color.neutral.with_alpha(0.5).rgba, endColor=color.neutral.with_alpha(0.5).rgba, dashSizeFactor=dash_size_factor, smoothScale=8)
     43         self._payment_timer = DonutSegment(parent=self._space_cont.content, align=uiconst.CENTER, colorEnd=color.neutral.rgba, colorStart=color.neutral.rgba, lineWidth=8, startAngle=mathext.pi, radius=511, isClockwise=True)
     44         DonutSegment(parent=self._space_cont.content, align=uiconst.CENTER, colorEnd=color.neutral.with_alpha(0.5).rgba, colorStart=color.neutral.with_alpha(0.5).rgba, lineWidth=8, startAngle=mathext.pi, radius=511, isClockwise=True)
     45         self._start_timer_update_loop()
     46 
     47     def close(self):
     48         self._space_cont.Close()
     49         self._timer_indicator.Close()
     50         self._root_transform.children.fremove(self._y_transform)
     51 
     52     def play_enter_animation(self):
     53         animations.MorphScalar(self._space_cont, 'offset_y', startVal=-1000, endVal=0, duration=0.7, curveType=uiconst.ANIM_SMOOTH)
     54         animations.FadeTo(self._space_cont.content, startVal=0.0, endVal=1.0, duration=0.4, timeOffset=0.3)
     55         self._timer_indicator.show(time_offset=0.7)
     56 
     57     def play_exit_animation(self, sleep = False):
     58         self._timer_indicator.hide()
     59         animations.BlinkOut(self._space_cont, sleep=sleep)
     60 
     61     def play_pulse_animation(self, pulses_remaining, pulses_total, sleep = False):
     62         timer_progress = (pulses_remaining + 1) / pulses_total - 1.0 / pulses_total * 0.5
     63         center_angle = mathext.lerp(0, 360, timer_progress)
     64         total_gap_sweep = 360.0 / (self._timer.dashSizeFactor + 1.0)
     65         dash_sweep = (360.0 - total_gap_sweep) / pulses_total
     66         dash = DashedCircle(parent=self._space_cont.content, align=uiconst.CENTER, radius=464, lineWidth=48, dashCount=1, startAngle=math.radians(center_angle - dash_sweep / 2.0) - math.pi, range=math.radians(dash_sweep), startColor=color.white.rgba, endColor=color.white.rgba, dashSizeFactor=self._timer.dashSizeFactor, idx=0, opacity=0.0)
     67         animations.FadeOut(self._payment_timer, duration=0.3)
     68 
     69         def move_indicator():
     70             self._update_timer_indicator(pulses_remaining, pulses_total)
     71             self._timer_indicator.opacity = 0.0
     72             animations.FadeIn(self._timer_indicator, duration=0.2, timeOffset=0.8)
     73 
     74         animations.FadeOut(self._timer_indicator, duration=0.2, callback=move_indicator)
     75         animations.BlinkIn(dash, duration=0.2, sleep=True)
     76         animations.MorphScalar(self._payment_timer, 'end', startVal=1.0, endVal=self._pulse_progress_at(gametime.now_sim() + datetime.timedelta(seconds=0.5)), duration=0.8)
     77         animations.BlinkIn(self._payment_timer, duration=0.2)
     78         self._timer.end = pulses_remaining / pulses_total
     79         animations.FadeOut(dash, duration=0.5, sleep=sleep, callback=dash.Close)
     80         if sleep:
     81             uthread2.sleep(0.3)
     82 
     83     @threadutils.threaded
     84     def _start_timer_update_loop(self):
     85         service = get_dynamic_resource_service()
     86         reserve_bank_state = service.ess_state_provider.state.reserve_bank
     87         previous_pulses_remaining = reserve_bank_state.pulses_remaining
     88         pulses_total = reserve_bank_state.pulses_total
     89         while not self._timer.destroyed:
     90             reserve_bank_state = service.ess_state_provider.state.reserve_bank
     91             pulses_remaining = reserve_bank_state.pulses_remaining
     92             if not pulses_remaining:
     93                 eveui.wait_for_next_frame()
     94                 continue
     95             if previous_pulses_remaining != pulses_remaining:
     96                 self.play_pulse_animation(pulses_remaining, reserve_bank_state.pulses_total, sleep=True)
     97                 previous_pulses_remaining = pulses_remaining
     98             self._timer.end = pulses_remaining / pulses_total
     99             self._payment_timer.end = self._pulse_progress
    100             self._update_timer_indicator(pulses_remaining, pulses_total)
    101             eveui.wait_for_next_frame()
    102 
    103     def _update_timer_indicator(self, pulses_remaining, pulses_total):
    104         timer_progress = pulses_remaining / pulses_total
    105         total_gap_sweep = 360.0 / (self._timer.dashSizeFactor + 1.0)
    106         half_gap = total_gap_sweep / pulses_total / 2.0
    107         angle = math.radians(mathext.lerp(0, 360, timer_progress) - half_gap)
    108         radius = 0.905
    109         self._timer_indicator_transform.translation = (-mathext.cos(angle) * radius * self._scale / 2.0, 0, -mathext.sin(angle) * radius * self._scale / 2.0)
    110         distance = self._camera.distance_from_transform(self._timer_indicator_transform)
    111         distance_fraction = max(distance - 10000.0, 0.0) / 100000.0
    112         scale = mathext.lerp(self._scale / 2.0, self._scale + 18000.0, distance_fraction)
    113         self._timer_indicator.scale = scale
    114         self._timer_indicator.opacity = self._space_cont.content.opacity
    115 
    116     @property
    117     def _pulse_remaining_time(self):
    118         return self._pulse_remaining_time_at(gametime.now_sim())
    119 
    120     def _pulse_remaining_time_at(self, time):
    121         service = get_dynamic_resource_service()
    122         reserve_bank_state = service.ess_state_provider.state.reserve_bank
    123         pulses_remaining = reserve_bank_state.pulses_remaining
    124         if not pulses_remaining:
    125             return datetime.timedelta(seconds=0)
    126         pulse_interval = service.ess_settings.reserve_bank_pulse_interval
    127         last_pulse_start = reserve_bank_state.last_pulse_start
    128         remaining = last_pulse_start - time + pulse_interval
    129         if remaining.total_seconds() < 0:
    130             remaining = datetime.timedelta(seconds=0)
    131         return remaining
    132 
    133     @property
    134     def _pulse_progress(self):
    135         return self._pulse_progress_at(gametime.now_sim())
    136 
    137     def _pulse_progress_at(self, time):
    138         service = get_dynamic_resource_service()
    139         pulse_interval = service.ess_settings.reserve_bank_pulse_interval
    140         return self._pulse_remaining_time_at(time).total_seconds() / pulse_interval.total_seconds()
    141 
    142     @property
    143     def _total_remaining_time(self):
    144         service = get_dynamic_resource_service()
    145         reserve_bank_state = service.ess_state_provider.state.reserve_bank
    146         pulses_remaining = reserve_bank_state.pulses_remaining
    147         if not pulses_remaining:
    148             return datetime.timedelta(seconds=0)
    149         pulse_interval = service.ess_settings.reserve_bank_pulse_interval
    150         remaining = (pulses_remaining - 1) * pulse_interval + self._pulse_remaining_time
    151         if remaining.total_seconds() < 0:
    152             remaining = datetime.timedelta(seconds=0)
    153         return remaining
    154 
    155     def _on_timer_indicator_update(self, indicator):
    156         remaining = self._total_remaining_time
    157         filetime_remaining = datetimeutils.timedelta_to_filetime_delta(remaining)
    158         text = localization.formatters.FormatTimeIntervalShort(filetime_remaining, showFrom='minute')
    159         indicator.set_text(text)
    160         if remaining.total_seconds() <= 0.0:
    161             indicator.hide()
    162 
    163 
    164 from dynamicresources.client.ess.bracket.debug import __reload_update__