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