SoC. Один из методов спавна — различия между версиями
Материал из S.T.A.L.K.E.R. Inside Wiki
(→Нюансы) |
RedPython (обсуждение | вклад) м (restored) |
||
Строка 1: | Строка 1: | ||
− | + | == Суть идеи == | |
+ | Создание на лету рабочих аномалий, вертолётов, переходов между уровнями, рестрикторов, точек воспроизводства и других объектов, конструктор которых задаёт не все необходимые для полноценного функционирования параметры. | ||
− | + | Идея проста. | |
+ | |||
+ | <code lua>1) Создаём объект стандартным методом: | ||
+ | local obj = alife():create(...) | ||
+ | |||
+ | 2) Создаём экземпляр класса net_packet: | ||
+ | local packet = net_packet() | ||
+ | |||
+ | 3) Сохраняем состояние объекта в пакет: | ||
+ | obj:STATE_Write(packet) | ||
+ | |||
+ | 4) Считываем _все_ сохраняемые свойства в переменные: | ||
+ | local property1 = packet:r_u32() | ||
+ | ... | ||
+ | local propertyN = packet:r_float() | ||
+ | |||
+ | 5) Записываем эти переменные опять, меняя или дополняя необходимые параметры: | ||
+ | packet:w_u32(property1) | ||
+ | ... | ||
+ | propertyN = new_value | ||
+ | packet:w_float(propertyN) | ||
+ | |||
+ | 6) Считываем модифицированное состояние объекта: | ||
+ | packet:r_seek(0) | ||
+ | obj:STATE_Read(packet, packet:w_tell()) | ||
+ | |||
+ | </code> | ||
+ | |||
+ | Где брать список сохраняемых параметров и их размеры? Самый верный способ - дизассемблирование методов STATE_Write и STATE_Read всех классов вида CSE_ALife... в xrGame.dll. Более простой - смотреть методы state_read "классов" cse_alife_... в acdc.pl (это альтернативный редактор all.spawn). | ||
+ | Но там могут быть ошибки. | ||
+ | |||
+ | Внизу вы найдете пример кода, который скриптом создаёт рабочую электру и вертолёт (у ног игрока и на 50 метров выше игрока соответственно). | ||
+ | |||
+ | Лучше всего смотреть на Кордоне. Вертолёт ни на что не реагирует, но это нормально. Ему нужно либо логику через custom_data прописывать, либо ручками дёргать управляющие методы. | ||
+ | |||
+ | == Нюансы == | ||
+ | 1) Для некоторых типов объектов желательно дёргать UPDATE_Write/UPDATE_Read. Смотрите в том же '''acdc.pl''' методы update_read (если есть). | ||
+ | |||
+ | 2) Стоит попробовать поиграться с аномалиями, которые создаются при активации артефактов. Если у них таймер не внешний, то есть шанс регулировки времени жизни. Ссылку на серверный объект можно получить через биндер, например. | ||
==Ссылки и дополнительный материал== | ==Ссылки и дополнительный материал== |
Текущая версия на 15:43, 21 мая 2011
Суть идеи
Создание на лету рабочих аномалий, вертолётов, переходов между уровнями, рестрикторов, точек воспроизводства и других объектов, конструктор которых задаёт не все необходимые для полноценного функционирования параметры.
Идея проста.
1) Создаём объект стандартным методом:
local obj = alife():create(...)
2) Создаём экземпляр класса net_packet:
local packet = net_packet()
3) Сохраняем состояние объекта в пакет:
obj:STATE_Write(packet)
4) Считываем _все_ сохраняемые свойства в переменные:
local property1 = packet:r_u32()
...
local propertyN = packet:r_float()
5) Записываем эти переменные опять, меняя или дополняя необходимые параметры:
packet:w_u32(property1)
...
propertyN = new_value
packet:w_float(propertyN)
6) Считываем модифицированное состояние объекта:
packet:r_seek(0)
obj:STATE_Read(packet, packet:w_tell())
Где брать список сохраняемых параметров и их размеры? Самый верный способ - дизассемблирование методов STATE_Write и STATE_Read всех классов вида CSE_ALife... в xrGame.dll. Более простой - смотреть методы state_read "классов" cse_alife_... в acdc.pl (это альтернативный редактор all.spawn). Но там могут быть ошибки.
Внизу вы найдете пример кода, который скриптом создаёт рабочую электру и вертолёт (у ног игрока и на 50 метров выше игрока соответственно).
Лучше всего смотреть на Кордоне. Вертолёт ни на что не реагирует, но это нормально. Ему нужно либо логику через custom_data прописывать, либо ручками дёргать управляющие методы.
Нюансы
1) Для некоторых типов объектов желательно дёргать UPDATE_Write/UPDATE_Read. Смотрите в том же acdc.pl методы update_read (если есть).
2) Стоит попробовать поиграться с аномалиями, которые создаются при активации артефактов. Если у них таймер не внешний, то есть шанс регулировки времени жизни. Ссылку на серверный объект можно получить через биндер, например.
Ссылки и дополнительный материал
- Дополнительные ссылки
- Дополнительная инфа
ACDC - сборщик-разборщик двух секций в all.spawn, но подсекцию M_UPDATE он не обрабатывает пока. Вырос из автоматического обработчика.
Made by Bardak
Added by Loxotron