fix: add error handling and validation to LoadoutConfig.from_dict

- Added try/except with logging around from_dict
- Added validation for armor_plates to handle non-dict values
- Added error handling for Decimal/int conversions
- Better error messages to diagnose loading issues
This commit is contained in:
LemonNexus 2026-02-09 19:25:56 +00:00
parent d265bc2113
commit fa427188d9
1 changed files with 80 additions and 58 deletions

View File

@ -314,6 +314,7 @@ class LoadoutConfig:
@classmethod
def from_dict(cls, data: dict) -> "LoadoutConfig":
"""Create LoadoutConfig from dictionary."""
try:
decimal_fields = [
'weapon_damage', 'weapon_decay_pec', 'weapon_ammo_pec', 'weapon_dpp',
'armor_decay_pec', 'heal_cost_pec', 'heal_amount', 'protection_stab',
@ -324,13 +325,21 @@ class LoadoutConfig:
for field in decimal_fields:
if field in data:
try:
data[field] = Decimal(data[field])
except Exception as e:
logger.warning(f"Could not convert {field} to Decimal: {e}")
data[field] = Decimal("0")
# Handle integer fields
int_fields = ['weapon_id', 'armor_id', 'shots_per_hour', 'hits_per_hour', 'heals_per_hour']
for field in int_fields:
if field in data:
try:
data[field] = int(data[field])
except Exception as e:
logger.warning(f"Could not convert {field} to int: {e}")
data[field] = 0
# Handle attachment configs
if 'weapon_amplifier' in data and data['weapon_amplifier']:
@ -354,9 +363,18 @@ class LoadoutConfig:
else:
data['weapon_enhancers'] = []
# Handle armor plates
# Handle armor plates - with validation
if 'armor_plates' in data and data['armor_plates']:
data['armor_plates'] = {k: AttachmentConfig.from_dict(v) for k, v in data['armor_plates'].items()}
plates = {}
for k, v in data['armor_plates'].items():
try:
if isinstance(v, dict):
plates[k] = AttachmentConfig.from_dict(v)
else:
logger.warning(f"Invalid armor_plate value for {k}: {type(v)}")
except Exception as e:
logger.error(f"Error parsing armor_plate {k}: {e}")
data['armor_plates'] = plates
else:
data['armor_plates'] = {}
@ -383,6 +401,10 @@ class LoadoutConfig:
data['armor_set_name'] = '-- None --'
return cls(**data)
except Exception as e:
logger.error(f"Error in LoadoutConfig.from_dict: {e}")
logger.error(f"Data keys: {list(data.keys())}")
raise
# ============================================================================