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

shipSkinStateController.py (5929B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\cosmetics\client\shipSkinStateController.py
      2 import uthread2
      3 from carbon.client.script.environment.AudioUtil import PlaySound
      4 from carbonui import uiconst
      5 from cosmetics.client.messengers.cosmetics.ship.shipSkinStateNoticeMessenger import ShipSkinStateNoticeMessenger
      6 from cosmetics.client.messengers.cosmetics.ship.shipSkinStateRequestMessenger import ShipSkinStateRequestsMessenger
      7 from cosmetics.client.ships.skins.live_data.ship_skin_state import ShipSkinState
      8 from cosmetics.common.ships.skins.static_data.component import ComponentsDataLoader
      9 from cosmetics.common.ships.skins.static_data.skin_type import ShipSkinType
     10 from cosmetics.client.ships.ship_skin_signals import *
     11 from cosmetics.client.ships.ship_skin_svc_signals import *
     12 from logging import getLogger
     13 logger = getLogger(__name__)
     14 _UPDATE_TIMEOUT_SECONDS = 3
     15 
     16 class ShipSkinStateController(object):
     17 
     18     def __init__(self, public_gateway):
     19         self._cache = {}
     20         self._cached_waiting_list = {}
     21         self._notice_messenger = ShipSkinStateNoticeMessenger(public_gateway)
     22         self._request_messenger = ShipSkinStateRequestsMessenger(public_gateway)
     23         on_skin_state_set_internal.connect(self._on_skin_state_set)
     24         on_skin_state_set_all_in_bubble_internal.connect(self._on_skin_state_set_all_in_bubble)
     25 
     26     def shutdown(self):
     27         on_skin_state_set_internal.disconnect(self._on_skin_state_set)
     28         on_skin_state_set_all_in_bubble_internal.disconnect(self._on_skin_state_set_all_in_bubble)
     29 
     30     def on_character_changed(self):
     31         self.flush_cache()
     32         ComponentsDataLoader.load_components_data()
     33 
     34     def flush_cache(self):
     35         self._cache = {}
     36         self._cached_waiting_list = {}
     37 
     38     def _cache_state(self, skin_state):
     39         ship_id = skin_state.ship_instance_id
     40         old_skin_state = self._cache.get(ship_id, None)
     41         if ship_id in self._cached_waiting_list:
     42             self._cancel_wait(ship_id)
     43         if old_skin_state != skin_state:
     44             self._cache[ship_id] = skin_state
     45             logger.info('SKIN STATES - caching skin state %s' % skin_state)
     46             self._notify_of_skin_change(ship_id, skin_state, old_skin_state)
     47         else:
     48             on_skin_state_reapplied(ship_id)
     49 
     50     def _notify_of_skin_change(self, ship_id, skin_state, old_skin_state):
     51         on_skin_state_set(ship_id, skin_state)
     52         current_ship_id = session.shipid
     53         if current_ship_id and current_ship_id == ship_id:
     54             if skin_state.skin_type == ShipSkinType.FIRST_PARTY_SKIN:
     55                 skin_id = skin_state.skin_data.skin_id
     56             elif skin_state.skin_type == ShipSkinType.NO_SKIN:
     57                 skin_id = 0
     58             elif skin_state.skin_type == ShipSkinType.THIRD_PARTY_SKIN:
     59                 skin_id = 0
     60             else:
     61                 skin_id = 0
     62             if old_skin_state is not None:
     63                 PlaySound(uiconst.SOUND_ADD_OR_USE)
     64             sm.ScatterEvent('OnCurrentShipSkinChange', ship_id, skin_id)
     65 
     66     def get_cached_skin_state(self, ship_instance_id, character_id):
     67         cached_state = self._cache.get(ship_instance_id, None)
     68         logger.info('SKIN STATES - requested cached state for %s, got %s' % (ship_instance_id, cached_state))
     69         if not cached_state:
     70             self._wait_for_notice(ship_instance_id, character_id)
     71         return cached_state
     72 
     73     def get_skin_state(self, ship_instance_id, character_id, force_refresh = False):
     74         if ship_instance_id not in self._cache or force_refresh:
     75             skin_state = self._request_messenger.get_request(ship_instance_id)
     76             if skin_state is None:
     77                 logger.error('Failed to get SKIN state for ship %s, character %s', ship_instance_id, character_id)
     78                 return
     79             self._cache_state(skin_state)
     80         return self._cache[ship_instance_id]
     81 
     82     def get_all_skin_states_in_bubble(self):
     83         skin_states = self._request_messenger.get_all_in_bubble_request()
     84         result = {}
     85         for skin_state in skin_states:
     86             self._cache_state(skin_state)
     87             result[skin_state.ship_instance_id] = skin_state
     88 
     89         return result
     90 
     91     def _on_skin_state_set(self, skin_state):
     92         self._cache_state(skin_state)
     93 
     94     def _on_skin_state_set_all_in_bubble(self, skin_states):
     95         for skin_state in skin_states:
     96             self._cache_state(skin_state)
     97 
     98     def _wait_for_notice(self, ship_instance_id, character_id):
     99         if ship_instance_id in self._cached_waiting_list:
    100             char_id, _ = self._cached_waiting_list[ship_instance_id]
    101             if character_id != char_id:
    102                 self._cancel_wait(ship_instance_id)
    103             else:
    104                 return
    105         self._cached_waiting_list[ship_instance_id] = (character_id, uthread2.StartTasklet(self._wait_thread, ship_instance_id, character_id))
    106 
    107     def _wait_thread(self, ship_instance_id, character_id):
    108         logger.info('SKIN STATES - Starting wait for skin state for ship id %s' % ship_instance_id)
    109         uthread2.SleepSim(_UPDATE_TIMEOUT_SECONDS)
    110         logger.info('SKIN STATES - Waiting is over, forcing request for skin state for ship id %s' % ship_instance_id)
    111         self._end_wait(ship_instance_id)
    112         self.get_skin_state(ship_instance_id, character_id, force_refresh=True)
    113 
    114     def _cancel_wait(self, ship_instance_id):
    115         if ship_instance_id in self._cached_waiting_list:
    116             logger.info('SKIN STATES - Cancelled wait for skin state for ship id %s' % ship_instance_id)
    117             self._end_wait(ship_instance_id)
    118 
    119     def _end_wait(self, ship_instance_id):
    120         if ship_instance_id in self._cached_waiting_list:
    121             char_id, thread = self._cached_waiting_list[ship_instance_id]
    122             if thread is not None:
    123                 thread.kill()
    124             self._cached_waiting_list.pop(ship_instance_id)