Перейти к контенту

Скриптование


Svoboда

Рекомендуемые сообщения

AK74

Ты спавнишь скелета как физ объект или как монстра? Если как монстра то у меня к тебе очень много вопросов

Freedom

Поделиться этим сообщением


Ссылка на сообщение

Я так понял что функция у тебя работает только один раз а потом не работает? Если да то вот готовый вариант:

local stope = false
function testych()
    local npc = level.object_by_id(id)
    local PosActor = db.actor:position()
     if npc and IsStalker(npc) and npc:alive() and npc.health > 0.1 then
         if npc:position():distance_to(PosActor) < 4 then
             if not stope then
                 news_manager.send_tip(db.actor, "Эй, чоё встал!?.", 0, "stalker", 7000)
              stope = true
                end
             else
          stope = false
               if npc:position():distance_to(PosActor) > 4 and stope then
        stope = false
            end
        end
    end
end

Неуверен что работает но думаю что ты понял фишку

Изменено пользователем _Призрак_

Freedom

Поделиться этим сообщением


Ссылка на сообщение

malandrinus

Да ты совершенно прав. В игре почему-то поменяли Y и Z местами. Только интересно почему?

Freedom

Поделиться этим сообщением


Ссылка на сообщение

по идее можно сделать так - в бинд_сталкере на он_итем дроп пишел скрипт на удаление ак74 и на спавн абакана по координатам актора. На он_итем_тэйк пишем скрипт на удаление абакана и на спавн ак74 в рюкзак актору

Freedom

Поделиться этим сообщением


Ссылка на сообщение

Вот что написанно у сингапура в журнале по этому поводу:

Исправлено!

Достаточно долго бытовало мнение, что определить предмет на поясе невозможно. Теоретически так оно и есть, так как слот belt нигде не отслеживается. Но благодаря ПЫСам, которые наконец соизволили объяснить, пусть не прямой, а косвеный, но всётаки способ определения нахождения предмета на поясе. Давайте сначала разберём как мы это будем делать, чтобы в дальнейшем не было глупых вопросов.

Итак, мы имеем инвентарь актора. Чтобы определить список всего инвентаря, который имеется у актора в наличии, нужно использовать метод db.actor:inventory_for_each(ScanInventory)

Где ScanInventory --имя функции которая вызывается для каждого объекта инвентаря.

Спросите, и как же мы определим какие предметы из них на поясе, а какие нет?! Вот это я щас и попытаюсь описать. Массив инвентаря актора состоит из нескольких субмассивов, которые запрашиваются в фиксированном порядке. А порядок здесь такой:

1. Массив рюкзака.

2. Массив пояса.

3. Первый слот.

4. Второй слот.

и т. д.

 

Чтобы при итерации всего списка инвентаря выудить именно массив пояса, нужно определить последний элемент в массиве рюкзака и ближайший элемент в одном из слотов. Предметы находящиеся между ними и будут являться предметами навешанными на пояс belt.

Если с предметами находяшимися в слотах проблем нет, их определение свободно производится через проверку нахождения онных в слотах по их нумерации. То с последним предметом в рюкзаке немного сложнее, тут нету никаких особенных данных различающих их от предметов на поясе. Но...

В связи с тем, что подбираемые или заспавненные предметы в инвентарь, добавляются именно в конец массива рюкзака, можно определять путём спавна/удаления предмета разделителя, по которому мы и будем узнавать конец массива рюкзака.

Тоесть порядок действий такой:

1. Спавним предмет-разделитель в инвентарь актора.

2. Производим итерацию предметов инвентаря.

3. Как только итератор дойдёт до предмета-разделителя включаем ключ добавления инвентаря во внешнюю таблицу.

4. После включения ключа, следующие предметы после разделителя будут добавляться в таблицу.

5. По мере добавления, производим проверку на нахождение онных в одном из слотов. И как только один из них окажется предметом находящемся в слоте, завершаем пополнение таблицы.

После всех этих действий, внешняя таблица будет содержать только список предметов находящихся на поясе.

 

Вот собственно и весь принцип.

 

Итак создаём в скриптах новый файл с именем bind_belt.script, и вставляем в него код:

 

Код:

belt = {} --//внешняя таблица пояса

 

local separator = nil --//переменная для сохранения userdata разделителя

local del_separator = false --//ключь удаления разделителя

local start_add_belt = false --//ключь начала заполнения таблицы db.belt

local open_inventory = false --//ключь открытия/закрытия инвентаря

local stop_update = false

local start_function = true

 

--основная функция итерации инвентаря

--(привязана к функции update() в файле bind_stalker.script)

function IterateInventory()

if stop_update then return end

 

--//удаление всех случайно-сохранённых разделителей

if start_function then

db.actor:inventory_for_each(function(item)

if item:section() == "separator" then

alife():release(item, true)

end

end)

separator = nil

del_separator = false

start_function = false

end

 

--//удаление разделителя (третий цикл)

if del_separator and separator then

this.DeleteSeparator()

stop_update = true

return

end

 

--//итерация инвентаря (второй цикл)

if separator then

db.belt = {}

db.actor:inventory_for_each(ScanInventory)

del_separator = true

start_add_belt = false

else

 

--//спавн разделителя (первый цикл)

separator = alife():create("separator", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())

end

end

 

--функция удаления разделителя

function DeleteSeparator()

alife():release(separator, true)

separator = nil

del_separator = false

end

 

--функция сканирования инвентаря

function ScanInventory(item)

local section = item:section()

 

if start_add_belt and not DetermineSlot(item:id()) then

if not db.belt[section] then

db.belt[section] = 1

else

db.belt[section] = db.belt[section] + 1

end

end

 

if item:section() == "separator" then

start_add_belt = true

end

end

 

--функция определения привязки объекта к одному из слотов

function DetermineSlot(item_id)

for i=0, 12 do

local obj = db.actor:item_in_slot( i )

if obj and obj:id() == item_id then

return true

end

end

return false

end

 

--функция запуска обновления таблицы при закрытии инвентаря

--(привязана к колбэку info_callback() в файле bind_stalker.script)

function InventoryInfo(info)

if info == "ui_inventory" or info == "ui_car_body" or info == "ui_trade" then

open_inventory = true

if separator then

this.DeleteSeparator()

end

elseif info == "ui_inventory_hide" or info == "ui_car_body_hide" or info == "ui_trade_hide" then

open_inventory = false

stop_update = false

end

end

 

--функция запуска обновления таблицы при взятии/выбрасывании предметов.

--(привязана к колбэкам on_item_take() и on_item_drop () в файле bind_stalker.script)

function TakeAndDrop(item)

if item:section() == "separator" then return end

 

if not open_inventory then

if separator then

this.DeleteSeparator()

end

stop_update = false

end

end

 

 

Создаём объект в конфигах (файл config/misc/items.ltx) с именем секции [separator]:

 

Код:

[separator]:identity_immunities

GroupControlSection = spawn_group

discovery_dependency =

$spawn = ""

$prefetch = 32

class = II_BANDG

cform = skeleton

visual = equipments\item_bandage.ogf

description =

inv_name =

inv_name_short =

inv_weight = 0

inv_grid_width = 0

inv_grid_height = 0

inv_grid_x = 0

inv_grid_y = 0

eat_health = 0

eat_satiety = 0

eat_power = 0

eat_radiation = 0

wounds_heal_perc = 0

eat_portions_num = 1

cost = 0

animation_slot = 4

 

 

Затем в файле 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()

 

Вот собственно и всё.

 

Freedom

Поделиться этим сообщением


Ссылка на сообщение

Вот в этом моде есть пда - скрипт называется огсм_нотепад. Копия правда не очень точная, но функции пда выполняет

Изменено пользователем _Призрак_

Freedom

Поделиться этим сообщением


Ссылка на сообщение

у тебя написано: если нет поршня и актор имеет обджект (неодетым, а в инвенторе) то тогда убиваем

Freedom

Поделиться этим сообщением


Ссылка на сообщение

Jurok

Нужно сделать так:

function start_mod()

if dont_has_info("maior_barsakov_info") and db.actor:object("specops_outfit") == nil then

db.actor:kill(db.actor)

end

end

Freedom

Поделиться этим сообщением


Ссылка на сообщение

ZeeK

Был такой вылет когда не правильно сделал сам квест

 

Куфзук

Это когда она будет выводится неправильно? Что можно сделать с аптечкой - использовать и выкинуть. Повесить на колбеки эти нужно эту функуцию. Ну еще нужно чтобы скрипт обрабатывал инвентарь при создании игры. Когда же будет показываться неправильное кол-во аптечек

Freedom

Поделиться этим сообщением


Ссылка на сообщение

Меня вот интересует вопрос - как сделать так чтобы НПС после нападения на него, возвращался на точку и ему можно было прописать анимацию стаяния и target? Что то типа ремарка только с возможностью возвращаться на точку

Freedom

Поделиться этим сообщением


Ссылка на сообщение

У луа_чекера есть такой грешок - он показывает ошибок больше чем есть. У меня бывало в скрипте по 50 ошибок - исправил 5-6 и луа чекер ни одной не нашел.

Freedom

Поделиться этим сообщением


Ссылка на сообщение

Это смотря какие ты ошибки сделал. Если ты написал вместо create - reate то луа чекер даже не заикнется. А если ты end пропустишь то он ругнется. Чекер указывает только на синтаксические ошибки

Freedom

Поделиться этим сообщением


Ссылка на сообщение

TRAMP14

Функция работать не будет так как откуда у тебя появится obj? Расшифровываю:

local obj = obj:section()

1. Эта строка может привести луа в бешенство. Лучше назови переменную obj_section

2. Для понятия представим что у тебя написанно local obj1 = obj:section()

Откуда ты берешь obj? У тебя функция не принимает каких либо переменных, да и в скрипте ты этот obj никак не определяешь. Поэтому переменная obj1 всегда будет выдавать nil

3. Почему у тебя левел_вертикс =1? Разве так можно?

Да и скрипт твой читерский - у тебя получится что ты аптечку использовал и у тебя сразу появляется еще одна в рюкзаке. А действие аптечки идет.

 

З.Ы. По твоей функции видно что ты, так и быть не первый день скриптишь, а второй. Не обольщайся

А то что у тебя игра стала вылетать - это обычное дело.

Изменено пользователем _Призрак_

Freedom

Поделиться этим сообщением


Ссылка на сообщение

Логики капм в зове припяти нет. Нужно создавать анимпоинт, и ставить НПС такую логику что бы он шел к этому анимпоинту. Точнее сказатт не могу, ищи в алл спавне и файлаХ с логикой слово анимпоинт

Freedom

Поделиться этим сообщением


Ссылка на сообщение

Ремарк не желательно использовать долгое время. Ремарк можно использовать для связки. Даже Архара это говорил

Freedom

Поделиться этим сообщением


Ссылка на сообщение

TRAMP14

Чаще всего это рудименты. Тот код который планировалось использовать раньше, но не использовали, а убрать забыли. Или это отладочная информация. Я думаю в твоем коде именно она и есть.

 

mma

Для подсказок самому себе пишут

this.test() --вызываем бредовую функцию

Изменено пользователем _Призрак_

Freedom

Поделиться этим сообщением


Ссылка на сообщение
  • Недавно просматривали   0 пользователей

    • Ни один зарегистрированный пользователь не просматривает эту страницу.
×
×
  • Создать...