2 a1batross: я вообще не собирался никуда лезть. Митторн зачем-то показал мне багфикс и пролетарское чутье сразу же забило тревогу - тут что-то не так. Если вы в чём-то не уверены - всегда же можно написать приватку или спросить прямо здесь в теме. Самая главная гадость, это когда вы что-то меняете, но при этом не имеет ни малейшего представления, где это потом может вылезти. Причём вылезает оно через полгода и уже ни с чем не ассоциируется. Расскажу недавний поучительный случай. Я в прошлом месяце писал конвертор карт из Q1, H2, HL, BSP2, BSP31 -> XashNT. В какой-то момент обратил внимание, что с карт пропали некоторые ротатабли на Dm-Knot. Т.к. я в этот момент уже вовсю переписывал рендерер, то решил, что они просто перестали отображаться. Но потом, я дописал рендеринг мира, а ротатабли так и не появились, причём на ощупь их тоже не было. Достал бэкапы, начал сравнивать. Баг возник в тот момент, когда я в конверторе карт энтити не просто пересохранял в новый формат, а парсил как в компиляторах и потом вызывал UnparseEntities. И я тут же всё понял. Там односвязный список, энтити парсятся в прямом порядке, а сохраняются в обратном. Вас никогда не удивляло, что в описании энтити класснейм то в самом верху, то в самом низу?
Это вот оно самое, тянется еще с кваки. Причём впрямую зависит от того, сколько раз были вызваны компиляторы. Даже если один и тот же компилер вызвать несколько раз, строки снова пересортируются. Переделал список энтить на двусвязный список, но баг не исчез. Дело в том, что по большому счёту порядок следования полей весьма критичен лишь в очень немногих случаях.
Одним из таких случаев является поле spawnorigin у ротатабли. Обычный оригин показывает место такой секретной комнатки, куда ротатабля помещается для корректного освещения радом, а в игре она появляется по месту спавноригина.
Нетрудно догадаться, что здесь двойная ошибка - прямая зависимость от порядка следования полей, особая расстановка порядка в FGD, зависимость от того прошла карта полный цикл компиляции или нет и самое интересное - был ли запущен hlcsg с параметром -onlyents. После первого запуска ротатабли исчезнут, после второго вернутся. Вообщем такое адское нагромождение UB.
То есть тут надо во первых сохранить энтити всегда в одном и том же порядке следования полей. Во вторых нивелировать зависимость у ротатабли от порядка их вызова. И такого говна со времён кваки тянется предостаточно, никто это не то что не фиксит, а даже не подозревает про его наличие.