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__