Вопрос: Как определить нахождение предмета на поясе? |
Ответ: Достаточно долго бытовало мнение, что определить предмет на поясе невозможно. Теоретически так оно и есть, так как слот belt нигде не отслеживается. Но благодаря ПЫСам, которые наконец соизволили объяснить, пусть не прямой, а косвеный, но всётаки способ определения нахождения предмета на поясе. Давайте сначала разберём как мы это будем делать, чтобы в дальнейшем не было глупых вопросов. Итак, мы имеем инвентарь актора. Чтобы определить список всего инвентаря, который имеется у актора в наличии, нужно использовать метод db.actor:inventory_for_each(ScanInventory) Где ScanInventory --имя функции которая вызывается для каждого объекта инвентаря. Спросите, и как же мы определим какие предметы из них на поясе, а какие нет?! Вот это я щас и попытаюсь описать. Массив инвентаря актора состоит из нескольких субмассивов, которые запрашиваются в фиксированном порядке. А порядок здесь такой: 1. Массив рюкзака. 2. Массив пояса. 3. Первый слот. 4. Второй слот. и т. д. Чтобы при итерации всего списка инвентаря выудить именно массив пояса, нужно определить последний элемент в массиве рюкзака и ближайший элемент в одном из слотов. Предметы находящиеся между ними и будут являться предметами навешанными на пояс belt. Если с предметами находяшимися в слотах проблем нет, их определение свободно производится через проверку нахождения онных в слотах по их нумерации. То с последним предметом в рюкзаке немного сложнее, тут нету никаких особенных данных различающих их от предметов на поясе. Но... В связи с тем, что подбираемые или заспавненные предметы в инвентарь, добавляются именно в конец массива рюкзака, можно определять путём спавна/удаления предмета разделителя, по которому мы и будем узнавать конец массива рюкзака. Тоесть порядок действий такой: 1. Спавним предмет-разделитель в инвентарь актора. 2. Производим итерацию предметов инвентаря. 3. Как только итератор дойдёт до предмета-разделителя включаем ключ добавления инвентаря во внешнюю таблицу. 4. После включения ключа, следующие предметы после разделителя будут добавляться в таблицу. 5. По мере добавления, производим проверку на нахождение онных в одном из слотов. И как только один из них окажется предметом находящемся в слоте, завершаем пополнение таблицы. После всех этих действий, внешняя таблица будет содержать только список предметов находящихся на поясе. Вот собственно и весь принцип. Итак создаём в скриптах новый файл с именем bind_belt.script, и вставляем в него код: Создаём объект в конфигах (файл config/misc/items.ltx) с именем секции [separator]: Затем в файле bind_stalker.script производим пропись всех нужных привязок функций: 1. Функция actor_binder:info_callback(npc, info_id): вписываем в конец тела функции: bind_belt.InventoryInfo(info_id) 2. Функция actor_binder:on_item_take (obj): вписываем в конец тела функции: bind_belt.TakeAndDrop(obj) 3. Функция actor_binder:on_item_drop (obj) вписываем в конец тела функции: bind_belt.TakeAndDrop(obj) 4. Функция actor_binder:update(delta) вписываем в конец тела функции: bind_belt.IterateInventory() Вот собственно и всё. |
[Наверх]
(просмотров: 2108)
|