Запись объекта в сейв при сохранении игры
|
|
Den_spb | Дата: Вторник, 28.08.2012, 23:19 | Сообщение # 1 |
Создатель сайта
Группа: Администраторы
Сообщений: 1598
Статус: Offline
| Сообщения перенесены в отдельную тему.
|
|
| |
Vital | Дата: Вторник, 28.08.2012, 23:19 | Сообщение # 2 |
Группа: Проверенные
Сообщений: 206
Статус: Offline
| Хотел спросить, давно уже думал над одним вопросом: Вот код Code :Fence wait 0 if player.Defined(0) jf @Fence if and not actor.Dead($PLAYER_ACTOR) not actor.Driving($PLAYER_ACTOR) 0AB0: key_pressed 0x33 jf @Fence model.Load(1468) 038B: load_requested_models 04C4: store_coords_to 1@ 2@ 3@ from_actor $PLAYER_ACTOR with_offset 0.0 3.0 0.0 02CE: 3@ = ground_z_at 1@ 2@ 3@ object.Create(4@,1468,1@,2@,3@) model.Destroy(1468) 5@ = actor.Angle($PLAYER_ACTOR) object.Angle(4@) = 5@ object.KeepInMemory(4@,1) wait 500 jump @Fence end_thread
Если я оставляю объект в памяти и затем создаю новый с такой же переменной, не будет ли это ошибкой? Не вылетит ли от этого игра? Или всё же лучше использовать массив?
SCRIPTER
|
|
| |
Den_spb | Дата: Вторник, 28.08.2012, 23:19 | Сообщение # 3 |
Создатель сайта
Группа: Администраторы
Сообщений: 1598
Статус: Offline
| Quote (Vital) Если я оставляю объект в памяти и затем создаю новый с такой же переменной, не будет ли это ошибкой? Не вылетит ли от этого игра? Хэндл объекта записывается в переменную только "для справки". Если хэндл не нужен (над объектом не будут производиться действия), то в переменную можно спокойно записать любое другое число. А что значит "сохранить объект в памяти"? Зачем ты это делаешь?
|
|
| |
Vital | Дата: Вторник, 28.08.2012, 23:20 | Сообщение # 4 |
Группа: Проверенные
Сообщений: 206
Статус: Offline
| Den_spb, насколько я знаю (и пару раз пробовал), это значит, что объект будет оставаться на месте, как было бы при создании объекта в Map Editor. В коде разных скриптов по созданию объектов (где можно установить позицию, угол поворота и т.д. и сохранить объект на месте) присутствует этот опкод. Я опробовал его с объектом 1468: он сохраняется, даже если отойти далеко, но пока я ещё не проверял, появляется ли он после загрузки сохранения (если сохранить игру, когда объект создан). Но когда он разрушен (это ограда), то он больше не появляется, что странно. Дополняю: объект сохраняется вместе с игрой. Если сохранить игру, когда создан объект, а затем загрузить её, объект остаётся на своём месте. P.S. Хочу знать лишь, не будет ли конфликтов с переменными, потому как игра оставляет в памяти объект, но затем создаёт ещё объекты с такими же переменными, что и первый, и каждый из них остаётся в памяти.
SCRIPTER
Сообщение отредактировал Vital - Вторник, 28.08.2012, 22:29 |
|
| |
Den_spb | Дата: Вторник, 28.08.2012, 23:20 | Сообщение # 5 |
Создатель сайта
Группа: Администраторы
Сообщений: 1598
Статус: Offline
| По идее объект и так должен оставаться на месте, если только не была выполнена команда снятия флага уникальности (remove references). Также объекты, созданные скриптом, записываются в сейв при сохранении игры. Если удалить скрипт и запустить сохранение, то объект всё равно появится на соответствующем месте.
|
|
| |
Vital | Дата: Вторник, 28.08.2012, 23:20 | Сообщение # 6 |
Группа: Проверенные
Сообщений: 206
Статус: Offline
| Den_spb, то есть использование keep in memory необязательно? Значит, можно перезаписывать объект (точнее, его переменную) каждый раз, когда мы создаём новый объект, и всё останется на своих местах? Хм...зачем же тогда этот опкод... Я сейчас попробую полазить в интернете, посмотрю, что же всё-таки даёт этот опкод (0550). Спасибо за ответ.
SCRIPTER
|
|
| |
Den_spb | Дата: Вторник, 28.08.2012, 23:20 | Сообщение # 7 |
Создатель сайта
Группа: Администраторы
Сообщений: 1598
Статус: Offline
| Quote (Vital) P.S. Хочу знать лишь, не будет ли конфликтов с переменными, потому как игра оставляет в памяти объект, но затем создаёт ещё объекты с такими же переменными, что и первый, и каждый из них остаётся в памяти. Переменные не связаны с физическими объектами - это всего лишь ячейки памяти для хранения чисел (хэндл объекта - это тоже число). Поэтому снова повторяю - никаких конфликтов здесь быть не может. Единственное, что следует учитывать - так как объекты записываются в сейв, то в скриптах перед созданием объекта нужно проверять, не был ли создан данный объект ранее. Иначе при каждом сохранении игры объект будет клонироваться.
|
|
| |
Vital | Дата: Вторник, 28.08.2012, 23:20 | Сообщение # 8 |
Группа: Проверенные
Сообщений: 206
Статус: Offline
| Den_spb, объект создаёт сам игрок, он не появляется автоматически, поэтому клонирование невозможно. По крайней мере, проверка показала, что при загрузке игры, где был создана одна ограда (т.е., объект) у неё не наблюдается признаков клонирования, а разбивание ограды только подтверждает это (кол-во обломков соответствует разбиванию единичного экземпляра). Попробую что-нибудь раскопать относительно 0550.
SCRIPTER
|
|
| |
Den_spb | Дата: Вторник, 28.08.2012, 23:20 | Сообщение # 9 |
Создатель сайта
Группа: Администраторы
Сообщений: 1598
Статус: Offline
| Насколько помню, с ломающимися объектами история другая. Если сломать ломающийся объект и сохранить игру, то в сейв он записан не будет. А может быть и целые ломающиеся объекты в сейв не записываются, не только сломанные. Это можно проверить экспериментами.
Сообщение отредактировал Den_spb - Вторник, 28.08.2012, 22:52 |
|
| |
Vital | Дата: Вторник, 28.08.2012, 23:21 | Сообщение # 10 |
Группа: Проверенные
Сообщений: 206
Статус: Offline
| Den_spb, это так, сломанный объект не сохраняется (что, кстати, даёт возможность сделать прикольные вещи в миссиях). Провёл эксперимент: если не использовать keep in memory, то объект сохраняется с сейвом и остаётся после загрузки (и как обычно, не остаётся сломанный объект). Странно, в чём же тогда разница...
SCRIPTER
Сообщение отредактировал Vital - Вторник, 28.08.2012, 22:54 |
|
| |
Den_spb | Дата: Вторник, 28.08.2012, 23:21 | Сообщение # 11 |
Создатель сайта
Группа: Администраторы
Сообщений: 1598
Статус: Offline
| Глянул устройство 0550 - опкод работает с иммунитетами объекта.
|
|
| |
Vital | Дата: Вторник, 28.08.2012, 23:21 | Сообщение # 12 |
Группа: Проверенные
Сообщений: 206
Статус: Offline
| Den_spb, спасибо, что посмотрел, а то у меня IDA не хотел работать, да и знаний в этой программе у меня, честно говоря, ноль. Но в интернете пусто, если и есть что, то говорится о том, что опкод якобы сохраняет объект в памяти. Никаких иммунитетов у объекта я не заметил, он так же ломается, как и обычный объект. Возможно, описание опкода неверное.
SCRIPTER
|
|
| |