Ошибка Degree_Tracker в Last Exception: кто виноват и что делать
Спойлер: за все годы моей игры была лишь одна поломка сейва. Да, связанная с degree_tracker.py.
В Last Exception можно увидеть разные сообщения об ошибке, но все из них либо имеют эту строчку:
Last Module Called: degree_tracker.py
либо упоминают университетские файлы (чаще всего в career_base.py):

*Эту информацию можно найти в Pretty Error CallStack файла Last Exception*
Такой тип ошибок чаще возникает на более поздних этапах прогрессии как следствие сломанного degree_tracker.
Так что это за ошибки, из-за чего они возникают и как с ними бороться?
P.S. многабукав, я провела полноценное исследование.
Что за Degree Tracker?
Про трэкеры
Трэкеры нужны, чтобы корректно обрабатывать ситуации и процессы. Они цепляются к симу, накапливают данные, за которые отвечают, и преобразовывают их в зависимости от этапа того или иного процесса.
Например, для ведения беременности симу назначается pregnancy tracker. В нем хранится информация о том, есть ли беременность, сколько детей, кто родители и так далее. Этот же трэкер вызывает функции для вычисления генетики, рождения детей и очистки статуса беременности.
Как видите, беременность не ограничивается мудлетом, настроением и растущим животом. Без трэкера никакой прогрессии и не было бы.
А что с университетом?
Трэкер университета управляет зачислением, успеваемостью, завершением семестра, получением диплома, отчислением и прочими процессами, включая служебные.

Он также прикрепляется к каждому симу, и всю информацию о его студенческой жизни можно получить через трэкер.
Казалось бы, ничего особенного. Но это лишь на первый взгляд.
Почему происходят ошибки?
Причина возникновения
Ответ прост и сложен одновременно: потеря данных.
Как это обычно (к сожалению) бывает, проблема не воспроизводится в 100% случаев, а потому установить и устранить первоисточник поломок очень трудно.
Говоря кратко, в какой-то момент трэкер теряет данные о студенческой жизни. На панели сима все выглядит нормально, но это лишь статические данные. В процессах вместо необходимых структур – пустота, тот самый NoneType, который присутствует в ошибках Например:
Last Module Called: degree_tracker.py
Last Function Called: enroll
Error message: Exception in Sim Timeline: Exception running Element (AttributeError: 'NoneType' object has no attribute '__name__'), CategoryID: degree_tracker:2265
А присутствует он потому, что трэкер не в курсе, что данные могут быть утеряны. Предполагается, что при наличии трэкера на симе у него инициализированы необходимые данные об университете, и к их полям и функциям происходит вызов. Вот только, и правда, какое поле "имя" может быть у отсутствующего объекта?

*Да, я вставляю скрины для интересующихся*
И да, я читала код, прежде чем написать эту статью. Надеюсь, никто не удивлен.
Факторы риска
Пока что невозможно установить точную причину потери данных. Система университета достаточно хрупкая, и потому в некоторых случаях информация корраптится и удаляется.
С этим мы ничего поделать не можем, но стоит держать в уме, что потеря данных не происходит абсолютно случайно. Ниже я разберу основные факторы, повышающие вероятность возникновения ошибок.
1. Читы
Абсолютное большинство проблем связано именно с читами университета, включая зачисление, выдачу дипломов, завершение семестра и так далее.
А все потому, что все читы проверяют и изменяют статус зачисления (set_enrollment_status). К примеру:
— university.enroll чит:
if self._enrollment_status != EnrollmentStatus.PROBATION:
self._set_enrollment_status(EnrollmentStatus.ENROLLED)
— university.finish_term чит:
if self._current_credits >= self.CREDITS_REQUIRED:
self._set_enrollment_status(EnrollmentStatus.GRADUATED)
— university.graduate чит:
self._set_enrollment_status(EnrollmentStatus.GRADUATED)
И так далее :)
Вот только при потере данных статус зачисления пропадает и становится тем самым NoneType, который вы часто встречаете в описании ошибки трэкера.
Это заметила не только я, но и другие моддеры. Скрины и имена называть не буду. это нарушает правила. Приведу лишь перевод обсуждения.
А: Прогресс в университете включает в себя зачисление. Читы для поступления так же опасны, как и читы для завершения университета. Также опасно зачислить сима в одном сейве, а потом переехать с ним в другой сейв – игра потеряет данные о прогрессии. Это происходит не с каждым симом, но если ошибка возникнет, то она не прекратит появляться, пока вы ее не исправите.
Б: Я подозреваю, что причиной ошибок от читов может быть изменение статуса зачисления в университет (enrollment_status_change). <...> Я [в своих модах] не вмешиваюсь в статус зачисления симов, поэтому не думаю, что мои моды могут вызывать ошибку трэкера в Last Exception.
Как видите, последствия читов сохраняются при симе и в других сейвах. По этой причине ошибки могут быть не только с вашими симами, но и со скачанными. В общем-то, все в том же сервере есть краткий алгоритм поиска причины:
А: Прочитать ошибку. Разобраться, использовались ли читы. Если да, то использовать фикс (о нем ниже). Если нет, проверить, нет ли в багаже симов диплома. Если все еще нет, то проверить, есть ли скачанные симы.
Так что использование чужих симов с дипломами, которые были получены через читы, тоже рискованно.
2. Ошибки прогрессии в университете
Выше в обсуждении упоминается физический диплом как фактор риска. Это действительно так: если в багаже сима находится диплом, то при утрате данных он потеряет корректную привязку к симу и постоянно будет напоминать о своем существовании ошибкой.
Аналогичная проблема возникает и с другими взаимодействиями с университетом. Например:
— Письмо о поступлении попало в багаж к другому симу
— Письмо о поступлении читает другой сим
— Поступивший сим, не закончивший обучение, переезжает в другой сейв (и теряет прогрессию как следствие)
3. Некоторые моды
Из прочих факторов – это влияние некоторых модов для университета (например, КЦ читы для него) или же старый Life Decider от Kawaii Stacie (впрочем, само использование модов от этого автора – огромный риск).
А вот что НЕ является фактором риска – это получение диплома через черту характера. Это присвоение результата без затрагивания системы университета, и оно работает также, как и добавление любых других черт через читы. Например, таким образом написан мод Instant CAS Story от Chingyu/Vicky Sims. Это также обсуждалось между моддерами:
А: В таком случае трэкер должен быть пуст, да
Б: Черты характера даже никак не привязаны к трэкеру, в тюнинге
В: Это так
Чем опасны ошибки?
Ну хорошо, а почему нельзя это просто игнорировать?
Во-первых, НИКАКУЮ ошибку КЦ нельзя игнорировать. Повторяться не буду, можете прочитать другую мою статью.
Во-вторых, это не просто случайная разовая ошибка – это ошибка таймлайна. Таймлайн – это глобальный процесс, на который, как на временную шкалу, наносятся события и подпроцессы всей игры. Можете представить, как игра себя чувствует, если в процесс планирования всей игры постоянно вклинивается поломанный код и не дает завершить какой-то этап. А поломка таймлайна ведет к поломке всего сейва.
В-третьих, это просто назойливо. Эти ошибки трэкера будут сыпаться и сыпаться, ваша игра будет зависать (привет ошибкам таймлайна), пока вы не разберетесь с проблемой.
Оно вам надо?
Как бороться?
Окей, что происходит и почему, тоже разобрались, а что делать-то?
Если дело в модах – либо убираете их, либо не пользуетесь той частью, что связана с университетом (как те же университетские читы от КЦ).
Если проблема в дипломе или письме от университета, попробуйте их вытащить из инвентаря сима.
Если проблема с самими симами, но вы совсем недавно использовали читы, то откатите сейв, – это легче всего.
Если же это невозможно или не подходит вам, то соберите всех, кому диплом был выдан читами, кто переезжал из прошлого сохранения, кто был скачан с дипломом. И...
Убейте и воскресите.
Это работает, потому что при смерти у сима происходит очищение данных, включая застрявший и поломанный трэкер университета.
Легче всего это сделать с читами КЦ. Но есть и другой метод:
1. Собрать всех проблемных симов в одну семью.
2. Зачислить их всех в университет без использования читов.
3. Перейти в управление мирами и вернуться обратно к этой семье.
4. Вы получите уведомление, что симы завалили это семестр и числятся на испытательном сроке.
5. После этого бросьте университет за каждого сима.
Честно, лучше использовать первый вариант. Он легче и надежнее. Но просто привожу вам полную информацию из саппорта сервера КЦ. К слову, там случаев с ошибками университета более тысячи, и они всегда советуют решать проблему так, как я описала.
На крайний случай вы можете просто удалить проблемного сима, если он вам не очень-то и нужен.
Превентивные меры
Из вышесказанного следуют очевидные советы, как снизить вероятность ошибки:
1. Не используйте читы.
2. Не качайте симов с дипломами, если только не сказано, что они были получены без читов или же добавлением черты университета.
3. Не давайте симам, не являющимися студентами, притрагиваться к диплому, поступлению в университет и прочим процессам.
4. Не храните диплом и письмо в багаже, особенно если вы собираетесь переезжать с симом в новый сейв.
5. Старайтесь не переезжать в новый сейв со студентами: пусть они либо закончат учебу, либо начнут ее в новом сейве.
6. Не используйте моды (или их модули), которые известны своими поломками, связанными с университетом.
Если же вам прям НУЖНО присвоить кому-то диплом, не играя в университете, то сделайте это через черту характера, а не через читы университета.
Надеюсь, для вас это было полезно! :)