Правила сайта FAQ Мини-чат
Для добавления необходима авторизация!
05.12.2016, Понедельник, 23:41


Страница 1 из 212»
Форум » S.T.A.L.K.E.R. - Моддинг » Разбираем S.T.A.L.K.E.R. » Уроки моддинга » Полезные функции (ТЧ)
Полезные функции
Сообщение #1
Полезные функции для мододелов

- Если у актора есть все поршни из списка:


- Какой то один поршень:


- ГГ находится на определенной локации (в нашем случае на Кордоне):


- В рюкзаке ГГ есть какая то вещь:


- На ГГ одет костюм, есть какое то оружие в руках и т.д (в нашем случае, если у ГГ в руках пистолет, то...):


- Выдача поршня:


- Выдача какого либо предмета (в данном случае, спавн в рюкзак к ГГ):


- Спавн какого либо предмета/сталкера и т.д по координатам:


- Смерть ГГ:


Со временем, при наличии этого самого времени, буду дополнять данную тему.
Если у вас, есть какие либо интересные ф-ии - выкладывайте.

Уважение: 477
Награды: 88
Облучение: 0%
Сообщение #2
Рандомный спавн обьекта в игре:



Рандомный спавн разных обьектов:



Вызов сообщения:



Переводим ГГ в другую группировку(здесь в монолит):

Удаляем НПС(или предмет) из игры:



Делаем НПС врагом:



Делаем НПС другом:


Если нужно удалить выданный инфопоршень:


Спавним труп НПС:



ГГ отдает предмет НПС


НПС отдает предмет ГГ

Веселый Роджер
Уважение: 479
Награды: 80
Сообщение #3
Quote (Frankenshtayn)
Удаляем НПС(или предмет) из игры:

Следует уточнить, что "удаление" должно производиться вне "видения" ГГ, т.е. при таком случае ГГ ДОЛЖЕН быть за пределами "аллайфа", который указан в соответствущем по названию файле. Иначе, фатальный вылет.
Как "инструмент", можно использовать принудительное удаление ГГ и из "сферы влияния" тем же "ручным" телепортом и небольшой паузой (хватает 2-3 сек.) Но (по моему жалкому опыту) тут надо "ковырять" bind_stalker.script, что очень чревато при наличии "шаловливых ручек", и писать функцию в скрипте. Если кому надо, вопрос отпишите в личку.
ЗЫ Кто-то придумает и более "изящный вариант".

Сообщение отредактировал Korpus - Суббота, 18.08.2012, 11:52


Уважение: 169
Награды: 31
Облучение: 0%
Сообщение #4
Есть пара очень полезных универсальных функций.
Я лох и подсмотрел их в Солянке, мож, они являются и функциями АМК.


Это, что бы проверять наличие НЕСКОЛЬКИХ и РАЗНЫХ предметов в рюкзаке ГГ



Это, что бы отдавать в НУЖНОМ количестве НУЖНЫЕ предметы.
Вставляется в скриптовый файл и оформляется по типу:



Отдача "этих" предметов без появления их в "торговле" оппонента - тупое отбирание их у ГГ.


ЗЫ... Ещё раз НАСТОЯТЕЛЬНО - эти "универсалки" должны "лежать" в конкретном скриптовом файле и все ссылки на них должны ТАК-ЖЕ "обзываться" по соответствию.
:)

Сообщение отредактировал Korpus - Суббота, 18.08.2012, 12:24


Уважение: 169
Награды: 31
Облучение: 0%
Сообщение #5
Вынос какой либо информации в другой файл (в нашем случае, имеем например кучу текстов, которые занимают кучу места в файле, тормозят и мешают ориентироваться в нем):


Уважение: 477
Награды: 88
Облучение: 0%
Сообщение #6
Quote (Korpus)
Следует уточнить, что "удаление" должно производиться вне "видения" ГГ

Не соглашусь, Саша... Удалять можно хоть стоя рядом, а вот то что я упустил, и что действительно важно: эту функцию нельзя вызывать из диалога с НПС которого пытаемся удалить!!!
Веселый Роджер
Уважение: 479
Награды: 80
Сообщение #7
Цитата (Frankenshtayn)
Не соглашусь, Саша...

Правильное уточнение, для этого тут и "собрались". :)
Я же отписал "свои впечатления" от конкретной ситуации с удалением НПС в ходе диалога с ним. Вот и "разобрали" некоторые тонкости. Ну... А про "остальное" как-то упустил, виноватьььь <_< Но, Вы же не дадите "расслабитьсО". :D
Для топика - функция вызова "звука в голове ГГ"


Не стоит воспринимать мои же "мысли и знания", как "что-то этакое". Пробуйте, это работает. Я сужу не, как спец и программер, а как "представитель группировки от сохи" А ОНО и в правду, "работает". Есть куча литературы по языку ЛУА, там много полезного, хотя и полно "дезинформации" - я только после года "возни" и отмахиваний от "первоисточников" всё же ОПЯТЬ прихожу к выводу, что УЧИТЬСЯ надо сначала "азбуке", а потом уже "терзать" внешние эффекты. Ну... У нас же всегда - "хочется быстрее и всего". А когда "влезешь", то захочется "ещё больше". А ТАМ, извините, ЗНАТЬ надо и НИкТО не подскажет - "сам плавай". :)

Сообщение отредактировал Korpus - Воскресенье, 19.08.2012, 07:04


Уважение: 169
Награды: 31
Облучение: 0%
Сообщение #8
Цитата (Frankenshtayn)
Удалять можно хоть стоя рядом

Ну если перевести НПС сначала в оффлайн, то с ним можно кучу всяких непотребностей сделать :D
В том числе и удаление. Однако я пока не видел нормальной вменяемой ф-ии на перевод...
ЗЫ: Либо можно поступить как например я делал с телепортами - т.е при спавне ТП пишем его на пстор актора, затем при удалении обращаемся туда же и удаляем. Т.е ТП удаляется в онлайне и ты можешь в это время на него даже смотреть.
ЗЗЫ: На НПС я этот способ не пробовал - не было пока нужды в удалении :)

Уважение: 477
Награды: 88
Облучение: 0%
Сообщение #9
Quote (volazar)
Однако я пока не видел нормальной вменяемой ф-ии на перевод...

Если я правильно помню, то возможность перевода НПС в оффлайн через отдельное поле логики появилась только в ЗП. В логике это выглядит так:
Code
on_offline = {-jup_b19_yar_enemy_or_dead} %+jup_b19_yar_enemy_or_dead%


Т.е. здесь видно, что поддерживается кондлист и выполнение "эффектов".
Соответственно в xr_logic.script появилась и часть кода, обрабатывающая это поле:

Code
if ini:line_exist(section, "on_offline") then
l.on_offline_condlist = xr_logic.parse_condlist(npc, section, "on_offline", utils.cfg_get_string(ini, section, "on_offline", npc, false, "", "nil"))
else
l.on_offline_condlist =  xr_logic.parse_condlist(npc, st.section_logic, "on_offline", utils.cfg_get_string(ini, st.section_logic, "on_offline", npc, false, "", "nil"))
end


В ТЧ или ЧН такой поддержки нет, но наверное можно и сделать, я не знаю…. А можно поступить проще, ну например перевести НПС в оффлайн по ранению:

Возьмем Кордон( Бедный Волк, опять будем экспериментироать на нем :D ) и «лезем» в логику Волка по пути config\misc\gulag_escape.ltx

Находим:

Code
; Волк
[logic@esc_lager_volk]
active = walker@esc_lager_volk_walker1
on_death = death@wolf


Добавляем:

Code
on_hit = hit@wolf


И в конце логики секцию хита:

Code
[hit@wolf]
on_info = %=pashel_v_offline(esc_wolf)%


Чтобы он действительно туда пошел, открываем xr_effects.script и добавляем туда функцию:

Code
function pashel_v_offline(actor, npc)
     if npc == nil or npc:alive () == false then return end
     local sim = alife ()
     if sim ~= nil then
        sim:set_switch_online  (npc:id (), false)
        sim:set_switch_offline (npc:id (), true)
     end
end

Всё. Запускаем игру, получаем от Волка ПМ, стреляем в ногу (главное ранить, а не убить) и Волк исчез, только метка осталась. Таким образом можно переводить НПС в оффлайн с любой секции его логики.
Веселый Роджер
Уважение: 479
Награды: 80
Сообщение #10
Теперь понятна разгадка из ТТ 2. Когда ты стреляешь в НПС, а из него типа лезут жуки :D
Спасибо за пример!

Хм, а если по сиду? Без прописки логики?
Code
function pashel_v_offline(actor, npc)     
local sim = alife()     
local npc = sim:story_object(111)
        if npc then
          sim:set_switch_online (npc:id (), false)     
          sim:set_switch_offline (npc:id (), true)     
        end
end


Надо будет попробовать завтра.

Уважение: 477
Награды: 88
Облучение: 0%
Сообщение #11
Quote (volazar)
Хм, а если по сиду? Без прописки логики?

Володя, я не пробовал, но думаю можно.
Веселый Роджер
Уважение: 479
Награды: 80
Сообщение #12
Удаление любого онлайнового/оффлайнового объекта из игры. Во время удаления можно хоть плясать рядом с ним:


Уважение: 477
Награды: 88
Облучение: 0%
Сообщение #13
Цитата (volazar)
Удаление любого онлайнового/оффлайнового объекта из игры. Во время удаления можно хоть плясать рядом с ним:

Ф-ия которая будет все делать:
Код
function remove_obj(name)
local obj
for a=1,65535 do
obj = alife():object(a)
if obj and string.find(obj:name(),name) then
alife():release(obj, true)
end
end
end

Само удаление, например нескольких сталкеров/монстров:
Код
function remove_freaks()
local tbl_remove = { "bloodsucker_1", "bloodsucker_2"}
for _, v in pairs (tbl_remove) do
remove_obj(v)
end
end

remove_obj - ф-ия в которую передаем данные для удаления.

Если же удаляем кого то одного - цикл и таблица не нужны.

Напишите пожалуйста где в этой ф-ции вставлять id НПСа
И про это:

Цитата (volazar)
Если же удаляем кого то одного - цикл и таблица не нужны.

подробней если можно

Сообщение отредактировал Graff46 - Понедельник, 08.04.2013, 18:47


Уважение: 0
Награды: 0
Облучение: 0%
Сообщение #14
Цитата (Graff46)
где в этой ф-ции вставлять id НПСа

Функция работает по секции из конфига/алл спавна. Зачем вам парится с id?

Цитата (Graff46)
подробней если можно

Цикл и таблица нужны если удаляемых объектов много. Необязательно тогда писать по 1 ф-ии на каждый удаляемый объект. Пишется таблица с нужным кол-ом объектов, затем она прогоняется через цикл. Т.е каждый объект, друг за другом будет передан в значение ф-ии remove_obj(name), которая и удалит.

Если нужно удалить кого то одного, можно поступить например так:
Код
function remove_freaks()   
     remove_obj("object")   
end

Либо из любого другого скрипта передать значение:
Код
file.remove_obj("object")

Уважение: 477
Награды: 88
Облучение: 0%
Сообщение #15
Я просто в этом деле недавно, а если по сути, мне надо Шустрого перевести в офф, удалить и сразу заспавнить в другом месте.
Цитата (volazar)
Функция работает по секции из конфига/алл спавна. Зачем вам парится с id?

Что бы привязать ф-цию к определённому НПС (в моём случае esc_shustryi).

За пояснение циклов и таблиц большое спасибо!

Сообщение отредактировал Graff46 - Понедельник, 08.04.2013, 20:58


Уважение: 0
Награды: 0
Облучение: 0%
Сообщение #16
Цитата (Graff46)
а если по сути, мне надо Шустрого перевести в офф и сразу заспавнить в другом месте.

Посмотрите 9 сообщение данной темы, пристального внимания заслуживает ф-ия pashel_v_offline(actor, npc).
Как вызывать, думаю решите :)
Либо удаляете шустрого, а затем спавните там, где нужно.
Если удаление производится в зоне оффлайна - то можете использовать обычный alife():release.
Если ГГ рядом с удаляемым объектом, то передаете значение так: remove_obj("esc_shustry").

Уважение: 477
Награды: 88
Облучение: 0%
Сообщение #17
[code]function l01_escape()
alife(): create("esc_shustryi",vector():set(-203.73789978027,-19.908451080322,-136.2032623291),49134,57)
end [code]

пишит лог: Arguments : Can't open section 'esc_shustryi'
Это я дурак или section это ни есть esc_shustry

Сообщение отредактировал Graff46 - Среда, 17.04.2013, 02:02


Уважение: 0
Награды: 0
Облучение: 0%
Сообщение #18
Graff46, Варианты:
1) Неправильное имя секции.
2) Отсутствующая секция.
Если секции нет, то создайте ее. И уже по ней спавните шустрого.

Уважение: 477
Награды: 88
Облучение: 0%
Сообщение #19
Graff46, удалился нормально? Дело в том, что если спавнить скриптом, необходимо в функцию вставлять имя секции из spawn_sections(gamedata\config\creatures)... Поэтому вариант "2" от Володи_Волозара верен, т.к. такой секции там нет. Попробуй в этот файл (spawn_sections) в самый низ добавить:
Код
[esc_shustryi]:stalker
$spawn     = "respawn\esc_shustryi"
character_profile    = esc_shustryi
spec_rank = regular
community = stalker
Веселый Роджер
Уважение: 479
Награды: 80
Сообщение #20
А есть ли функция для перевода НПС находящегося в оффлайне в онлайн?

Уважение: 0
Награды: 0
Облучение: 0%
Форум » S.T.A.L.K.E.R. - Моддинг » Разбираем S.T.A.L.K.E.R. » Уроки моддинга » Полезные функции (ТЧ)
Страница 1 из 212»
Поиск: