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

validator.py (9458B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\abyss\common\validator.py
      2 import abc
      3 from abyss.common import TIER_0_DEMO
      4 from abyss.const import get_all_abyss_system_ids
      5 from abyss.common import suspicion
      6 from abyss.common.constants import FILAMENT_PROXIMITY_RESTRICTION_LIST_ID
      7 from abyss.error import Error
      8 from ccpProfile import TimedFunction
      9 from eve.common.lib.appConst import maxStargateJumpingDistance
     10 import evetypes
     11 import gametime
     12 import inventorycommon.const as invconst
     13 from eve.common.script.sys.idCheckers import IsVoidSpaceSystem
     14 from eveuniverse.solar_systems import is_abyssal_filament_restricted
     15 
     16 class BaseValidator(object):
     17     __metaclass__ = abc.ABCMeta
     18 
     19     def __init__(self, game_mode):
     20         self._errors = []
     21         self.game_mode = game_mode
     22 
     23     @property
     24     def errors(self):
     25         return self._errors
     26 
     27     def add_error(self, error, *args):
     28         if isinstance(error, Error):
     29             for e, args in error.errors:
     30                 self.add_error(e, *args)
     31 
     32         else:
     33             self._errors.append((error, args))
     34 
     35     @TimedFunction('abyss::common::validate_jump')
     36     def validate_jump(self):
     37         self._errors = []
     38         self.perform_base_validation_checks()
     39         self.perform_jump_validation_checks()
     40         if self._errors:
     41             self.raise_errors()
     42 
     43     @TimedFunction('abyss::common::validate_deploy')
     44     def validate_deploy(self):
     45         self._errors = []
     46         self.perform_base_validation_checks()
     47         self.perform_deploy_validation_checks()
     48         if self._errors:
     49             self.raise_errors()
     50 
     51     @abc.abstractmethod
     52     def raise_errors(self):
     53         pass
     54 
     55     @abc.abstractmethod
     56     def get_session(self):
     57         pass
     58 
     59     @abc.abstractmethod
     60     def get_ship_item(self):
     61         pass
     62 
     63     @abc.abstractmethod
     64     def get_solar_system_security_level(self):
     65         pass
     66 
     67     @abc.abstractmethod
     68     def is_cloaked(self):
     69         pass
     70 
     71     @abc.abstractmethod
     72     def is_invulnerable(self):
     73         pass
     74 
     75     @abc.abstractmethod
     76     def is_in_banned_system(self):
     77         pass
     78 
     79     @abc.abstractmethod
     80     def is_in_active_encounter(self):
     81         pass
     82 
     83     @abc.abstractmethod
     84     def is_in_force_field(self):
     85         pass
     86 
     87     @abc.abstractmethod
     88     def is_pvp_timer_active(self):
     89         pass
     90 
     91     @abc.abstractmethod
     92     def is_self_destructing(self):
     93         pass
     94 
     95     @abc.abstractmethod
     96     def is_tethered(self):
     97         pass
     98 
     99     @abc.abstractmethod
    100     def is_warping(self):
    101         pass
    102 
    103     @abc.abstractmethod
    104     def is_warp_scrambled(self):
    105         pass
    106 
    107     @abc.abstractmethod
    108     def get_closest_of_type(self, types):
    109         pass
    110 
    111     @abc.abstractmethod
    112     def get_key_item(self):
    113         pass
    114 
    115     @abc.abstractmethod
    116     def get_key_tier(self):
    117         pass
    118 
    119     @abc.abstractmethod
    120     def is_blocked_by_dungeon(self):
    121         pass
    122 
    123     @abc.abstractmethod
    124     def is_item_reachable(self, item):
    125         pass
    126 
    127     @abc.abstractmethod
    128     def is_safety_green(self):
    129         pass
    130 
    131     @abc.abstractmethod
    132     def get_distance_to_entrance(self):
    133         pass
    134 
    135     @abc.abstractmethod
    136     def get_gate_id(self):
    137         pass
    138 
    139     @abc.abstractmethod
    140     def get_ships(self):
    141         pass
    142 
    143     @abc.abstractmethod
    144     def is_entrance_gate_open(self):
    145         pass
    146 
    147     @abc.abstractmethod
    148     def is_in_same_fleet(self):
    149         pass
    150 
    151     def is_in_secure_system(self):
    152         max_tier = self.get_max_tier_in_system()
    153         if max_tier == suspicion.FILAMENT_ACTIVATION_NOT_ALLOWED:
    154             return True
    155         if max_tier != 0:
    156             return False
    157         try:
    158             return self.get_key_tier() > 0
    159         except Exception:
    160             return False
    161 
    162     def get_max_tier_in_system(self):
    163         return suspicion.get_max_allowed_tier_by_security_level(self.get_solar_system_security_level())
    164 
    165     def is_suspicious(self):
    166         max_tier = self.get_max_tier_in_system()
    167         if max_tier == suspicion.FILAMENT_ACTIVATION_NOT_ALLOWED:
    168             return False
    169         return self.get_key_tier() > self.get_max_tier_in_system()
    170 
    171     def is_docked(self):
    172         session = self.get_session()
    173         return session.structureid or session.stationid
    174 
    175     def is_blocked_by_safety(self):
    176         return self.is_suspicious() and self.is_safety_green()
    177 
    178     def has_entered(self):
    179         ships = self.get_ships()
    180         return ships is not None and self.get_ship_item().itemID in self.get_ships()
    181 
    182     def is_encounter_full(self):
    183         ships = self.get_ships()
    184         return ships is not None and len(ships) >= self.game_mode.max_players
    185 
    186     def perform_base_validation_checks(self):
    187         if self.is_in_secure_system():
    188             self.add_error(Error.VERY_SECURE_SYSTEM_DISALLOWED)
    189         if self.is_in_banned_system():
    190             self.add_error(Error.CONGESTION_BAN)
    191         if self._is_in_void_space():
    192             self.add_error(Error.VOID_SPACE_DISALLOWED)
    193         self._validate_ship()
    194         if self.is_docked():
    195             self.add_error(Error.SHIP_IS_DOCKED)
    196         if self.is_cloaked():
    197             self.add_error(Error.SHIP_IS_CLOAKED)
    198         if self.is_invulnerable():
    199             self.add_error(Error.SHIP_IS_INVULNERABLE)
    200         if self.is_in_active_encounter():
    201             self.add_error(Error.ABYSS_CONTENT_ACTIVE)
    202         if self.is_in_force_field():
    203             self.add_error(Error.SHIP_IN_FORCE_FIELD)
    204         if self.is_pvp_timer_active():
    205             self.add_error(Error.PVP_TIMER_ACTIVE)
    206         if self.is_self_destructing():
    207             self.add_error(Error.SHIP_IS_SELF_DESTRUCTING)
    208         if self.is_tethered():
    209             self.add_error(Error.SHIP_IS_TETHERED)
    210         if self.is_warping():
    211             self.add_error(Error.SHIP_IN_WARP)
    212         if self.is_warp_scrambled():
    213             self.add_error(Error.SHIP_IS_WARP_SCRAMBLED)
    214         if self._is_in_abyss_system():
    215             self.add_error(Error.IN_ABYSS_SYSTEM)
    216         if self._is_session_change_in_progress():
    217             self.add_error(Error.SESSION_CHANGE_IN_PROGRESS)
    218         if self._is_in_banned_system():
    219             self.add_error(Error.IN_BANNED_SYSTEM)
    220 
    221     def perform_deploy_validation_checks(self):
    222         self._validate_fleet_required()
    223         self._validate_key()
    224         self._validate_proximity()
    225         if self.is_blocked_by_dungeon():
    226             self.add_error(Error.SHIP_IN_DUNGEON)
    227         if self.is_blocked_by_safety():
    228             self.add_error(Error.SAFETY_ENGAGED)
    229 
    230     def perform_jump_validation_checks(self):
    231         self._is_close_enough_to_entrance()
    232         if self.game_mode.is_locked_to_creator and not self.is_in_same_fleet():
    233             self.add_error(Error.SHIP_NOT_IN_SAME_FLEET)
    234         if not self.is_entrance_gate_open():
    235             self.add_error(Error.ENTRANCE_CLOSED)
    236         if self.has_entered():
    237             self.add_error(Error.SHIP_HAS_ENTERED)
    238         if self.is_encounter_full():
    239             self.add_error(Error.MAX_ENTERED)
    240 
    241     def _is_close_enough_to_entrance(self):
    242         try:
    243             distance = self.get_distance_to_entrance()
    244             if distance > maxStargateJumpingDistance:
    245                 self.add_error(Error.PROXIMITY_ENTRANCE, maxStargateJumpingDistance)
    246         except Exception:
    247             self.add_error(Error.ENTRANCE_MISSING)
    248 
    249     def _is_in_abyss_system(self):
    250         system_id = self.get_session().solarsystemid2
    251         return system_id in get_all_abyss_system_ids()
    252 
    253     def _is_in_void_space(self):
    254         system_id = self.get_session().solarsystemid2
    255         return IsVoidSpaceSystem(system_id)
    256 
    257     def _is_session_change_in_progress(self):
    258         session = self.get_session()
    259         return session.nextSessionChange > gametime.GetSimTime()
    260 
    261     def _is_in_banned_system(self):
    262         system_id = self.get_session().solarsystemid2
    263         return is_abyssal_filament_restricted(system_id)
    264 
    265     def _validate_ship(self):
    266         try:
    267             ship = self.get_ship_item()
    268         except Error as error:
    269             self.add_error(error)
    270             return
    271 
    272         if not self.game_mode.is_ship_allowed(ship.typeID):
    273             self.add_error(self.game_mode.ship_restriction_error_id)
    274 
    275     def _validate_key(self):
    276         try:
    277             key = self.get_key_item()
    278         except Error as error:
    279             self.add_error(error)
    280             return
    281 
    282         if key.groupID != invconst.groupAbyssalKeys:
    283             self.add_error(Error.INVALID_KEY_TYPE)
    284         if key.ownerID != self.get_session().charid:
    285             self.add_error(Error.INVALID_OWNER)
    286         if not self.is_item_reachable(key):
    287             self.add_error(Error.ITEM_NOT_REACHABLE, key.typeID)
    288         if key.stacksize < self.game_mode.key_stack_size:
    289             self.add_error(Error.INVALID_KEY_AMOUNT, self.game_mode.key_stack_size)
    290 
    291     def _validate_proximity(self):
    292         if self.is_demo_filament():
    293             return
    294         restricted_types = evetypes.GetTypeIDsByListID(FILAMENT_PROXIMITY_RESTRICTION_LIST_ID)
    295         closest_type_id = self.get_closest_of_type(restricted_types)
    296         if closest_type_id is not None:
    297             self.add_error(Error.PROXIMITY_RESTRICTION, closest_type_id)
    298 
    299     def _validate_fleet_required(self):
    300         if not self.game_mode.is_fleet_required:
    301             return
    302         session = self.get_session()
    303         if not session.fleetid:
    304             self.add_error(Error.SHIP_NOT_IN_FLEET)
    305 
    306     def is_demo_filament(self):
    307         return self.get_key_tier() == TIER_0_DEMO