Aynekko писал: Подскажите по сейврестору. Не могу вычистить баг. Гранты у меня стреляют энтитей shock_beam. Если сохраниться в тот момент, когда энтитя летит в воздухе - после загрузке в консоль спамит сообщением:
Error: R_BeamComputePoint: Invalid entity 4095
Вот на видео, специально сделал медленную атаку: https://www.youtube.com/watch?v=IJnT4rOOF0A
Думаю, что это баг с сейврестором лучей, а не я накопипастил.
Сохраняемся во время полета прожектили, загружаемся и видим картину - лучи начинают крепиться к самой прожектили и ориджину карты.
Т.к. эту штуку я скопировал из опфора, я решил проверить, что происходит там. Так вот, если сохраниться во время летящей атаки шок-трупера, а потом загрузить игру - то будет вылет на рабочий стол. Сохранялка будет испорчена. Ксаш к счастью не крашится.
Я решил проверить вортигонтов на ксаше, ведь они тоже создают лучи. И получил ту же самую картину. Сохраняемся в самый момент атаки, когда создается и исчезается луч из его рук (буквально секундный промежуток). После загрузки вортигонт будет куда-то бежать, а луч будет тянуться из его рук в точку последней атаки (и так и не исчезнет).
Дальше собственно код прожектили, там все очень просто, поэтому я не пойму в чем проблема - больше склоняюсь к проблеме сейврестора в целом, т.к. опфор крашится, а вортигонт шалит.
Сохранялка на месте:
C++ Source Code:
1
BEGIN_DATADESC( CShock )
2
DEFINE_FIELD(m_pBeam, FIELD_CLASSPTR),
3
DEFINE_FIELD(m_pNoise, FIELD_CLASSPTR),
4
DEFINE_FIELD(m_pSprite, FIELD_CLASSPTR),
5
DEFINE_FUNCTION( Touch ),
6
DEFINE_FUNCTION( FlyThink ),
7
DEFINE_FUNCTION( CreateEffects ),
8
DEFINE_FUNCTION( ClearEffects ),
9
DEFINE_FUNCTION( UpdateOnRemove ),
10
END_DATADESC()
Создаются спрайт и лучи, оригинальный код из опфора:
Aynekko писал: созданный спрайт продублировался, а лучи начинают крепиться к самой прожектили и ориджину карты.
Ну вот тебе и ответ. Создаётся ещё один эффект, у которого поля энтить, к которым он должен крепиться невалидные. Поэтому опфор крэшится. А под обычной халфой такое же поведение, или только под ксаш-движком? Просто я не припомню, чтобы у меня хоть когда-то крэшился опфор.
Навскидку, вроде есть в коде ошибочка. В функции CreateEffects нет проверки, существуют ли изначально m_pSprite, m_pBeam, m_pNoise. В сейв они все пишутся, следовательно, восстанавливаются при ресторе. А EffectsCreated обнуляется, поэтому CreateEffects вызывается снова, и делает ещё по одной копии. Ну по идее они должны не клонироваться, а перезаписываться. Тем более, RelinkBeam для лучей вызывается. Надо бы мне самому проверить вортигонтов и оригинальный опфор под стим-халфой.
Добавлено 06-02-2021 в 15:59:
Цитата:
Aynekko писал: Но лучи все еще продолжают терять заданный аттачмент.
RelinkBeam с правильными указателями на энтитю-конец и энтитю-начало после рестора.
Добавил проверки вида "if (!m_pSprite) SpriteCreate", для лучей тоже. Впрочем, без изменений.
На данный момент имею вот что: https://youtu.be/Fu-hh4oH1tI
Стреляю, полет нормальный. Сохраняюсь, загружаюсь.
Оба луча (beam, noise) потеряли аттачменты и соединяются с прожектилей и ориджином карты (а не между аттачментами модели). Идет спам в консоль.
Снова сохраняюсь и загружаюсь. Лучи вообще исчезли. Спрайт благополучно долетает.
Кстати, спам прекратится, когда прожектиля долетит и исчезнет. То есть лучи видимо все еще как-то принадлежат ей.
Цитата:
Ku2zoff писал: Просто я не припомню, чтобы у меня хоть когда-то крэшился опфор.
Я проверял ванильный опфор в стиме. Нужно сохраниться в тот самый промежуток времени, когда шоктрупер выпустит прожектилю, но при этом она еще не достигнет своего места назначения. Тогда после загрузки такого сохранения будет вылет.
Цитата:
Ku2zoff писал: RelinkBeam с правильными указателями на энтитю-конец и энтитю-начало после рестора.
Тут не совсем понял. Релинкбим он же void, как ему указатели вписать?
Вообще, вынеси создание всех трёх эффектов куда-нибудь в CShock::Shoot, вызывается ведь всего один раз. А обновление эффектов
C++ Source Code:
if (m_pBeam)
{
тра-та-та
}
можно спокойно вызывать из тчинка. Удаление из тача. Наверное, никакая переменная EffectsCreated и не понадобится. Что за агарот-то нагородили те, кто кодил это типа опфоровское.
Если ничего не поможет - убери нафиг спрайт и лучи из сейвдаты. Пусть лучше они после рестора заново создаются и линкуются.
Это я добавил. Дело в том, что я использую флаг, в зависимости от которого задается размер и цвет прожектили (юзают разные монстры) но дело в том, что присвоение флага идет уже после спауна энтити. И в спауне флаг почему-то не проходит (выставлял алерты), зато проходит в think, которая запускается в спауне. Спрайт дублировался из-за того, что я забыл это добавить в сейврестор и оно обнулялось, и создавались новые эффекты