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

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

Тема для обсуждения скриптов всего и всех в серии игр STALKER.


Задавая вопрос (!):
1. Внимательно изучите суть вопроса. Вопрос должен соответствовать выбранной Вами темы. Это поможет сохранить порядок и читабельность темы, а также облегчит поиск и понимание сего;
2. Изучите то, что уже есть в теме (пролистайте "руками", воспользуйтесь поиском на форуме);
3. Изучите информацию которая может вам помочь:

 
 

Stalkerin. Там есть много хороших статей касательно данной темы.
Уроки по модостроению. Есть рабочие примеры готовых скриптов различного назначения.

 

Справочное руководство по языку Lua 5.1
https://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual/ru
Справочник по функциям и классам. Собрано много информации по функциям и классам, не всем, но по основные сведения предоставлены.

4. Дабы не превращать обсуждение в "кашу" разной информативной направленности, задавайте несколько вопросов по порядку (в разных постах) после того, как получите ответ на предыдущий вопрос;
5. "Спасибо" и тому подобное - будьте так любезны в ПМ. Если не любите писать в ПМ, в конце вопроса напишите фразу: "Заранее спасибо!" - или что-то в этом духе;
6. ПОЖАЛУЙСТА! Указывайте, для какой игры Вам необходима информация (ТЧ, ЧН, ЗП), если стоит мод - укажите название мода;
7. Если Вы что-то сделали и результат не такой, какой Вами задумывался, то, пожалуйста, приводите коды которые Вы изменяли/писали целиком! Это поможет другим правильно ответить на Ваш вопрос, а также оградит Вас от лишней писанины.
8. Оформляйте сообщение. Пользуйтесь тегами для того, чтобы отделить код от текста. Пишите грамотно - ПОЛЬЗУЙТЕСЬ ЗНАКАМИ ПРЕПИНАНИЯ.
9. И помните: «Правильно заданный вопрос – половина ответа».

 

Какие вопросы следует задавать, а какие нет...

 

Задавайте вопросы, которые касаются непосредственно скриптов и их работы, т.е. Вы что-то делаете, а у Вас что-то не получается, при этом у Вас на руках должен быть хотя бы какой-то код, свидетельствующий о Вашей причастности к вопросу.

 

Вопросы которые будут удалятся, следовательно их задавать не нужно:
-- Где находится та или иная функция?
Для ответа используем поиск по словам среди файлов оригинальной игры или мода, если объект поиска относится к нему, при помощью программы, которая Вам наиболее симпатизирует;
-- Как сделать что-то/то-то?
С подобными вопросами, либо в "ковырялки", где Вам вероятнее всего так же не ответят, либо выдвигаем мысли, подкреплённые теорией, практикой (идеальный вариант) и здравым рассудком;
-- Вопросы со смыслом: "сделайте", "совместите" и подобными глаголами повелительного наклонения.
-- К тому же удалению будут подвергаться вопросы, в которых масштабно не используются теги, для отделения кода и цитат от основного текста, а также не вписан в спойлер код размером превышающие семь строк.
Ответ на возможно возникший вопрос: В какую тему можно обратиться по поводу логики и спавна объектов?
В тему "ковырялок" соответствующей версии игры, для которой Вы задаёте вопрос.

И последнее: очень рекомендовано к прочтению Правила форума
 


  • Спасибо 1
  • Полезно 2
Ссылка на комментарий

Доброго времени!

Задался вопросом, чтобы ставить мины противопехотные и/или противопехотные усиленные (при наличии их в рюкзаке) по направлению взгляда спереди.

За основу взял key_handlers.script из правки на установку турели  "Тайфун" Стрелка по направлению взгляда без выхода в меню по ESC (если не ошибаюсь от слава70).

Там присутствует следующее:

Скрытый текст

[DIK_keys.DIK_NUMPAD4]={
                    func=function()
                        local dir = db.actor:direction()
            local turret_fast = db.actor:object("strelok_turret")
            if turret_fast then
            amk.remove_item(turret_fast)
            local ap = db.actor:position()
            local lv = db.actor:level_vertex_id()
            local gv = db.actor:game_vertex_id()
            local turret = create_car("turret_to_strelok",xyz(ap.x+dir.x, ap.y, ap.z+dir.z), lv, gv, "scripts\\technics\\strelok_turret.ltx") --спереди
            map_spot(turret.id, "red_location", "Моя туррель")
            else
            meceniy_in_hell.horror_sound()
            end
            end
        },

Сделал примерно следующее:  (bomba_mina_n - противопехотная,  bomba_mina_b - противопехотная усиленная. Тут только пока про простую речь. Допилить на оба типа потом нет проблема.)

Скрытый текст

[DIK_keys.DIK_NUMPAD9]={
                    func=function()
                        local dir = db.actor:direction()
            local bomb_fast_n = db.actor:object("bomba_mina_n")
            if bomb_fast_n then
            amk.remove_item(bomb_fast_n)
            local ap = db.actor:position()
            local lv = db.actor:level_vertex_id()
            local gv = db.actor:game_vertex_id()
            local turret = create_car("bomba_mina_n",xyz(ap.x+dir.x, ap.y, ap.z+dir.z), lv, gv, "") --спереди
            
            else
            meceniy_in_hell.horror_sound()
            end
            end
        },

Так вот, что-то не фурычит... Можешь тыкнуть пальцем что не так делаю?
ЗЫ: указание на файл "scripts\\technics\\strelok_turret.ltx" убрал т.к. ИМХО для бомбы оно не к чему...

ЗЫЗЫ: что-то редактирование сообщения тут не нашел... Вот автор вышеупомянутой правки @слава70.

Voland-Li.gif

Страшно смотреть, как на жестком диске прямо на глазах уменьшается место.

Но еще страшнее смотреть, когда оно прямо на глазах увеличивается. :facepalm:

Вангую. Скоро попросят правку:"Меченый появляется на Кордоне. Телепорт к Монолиту. Загадывает Желание. THE END."

Ссылка на комментарий
Только что, Voland-Li сказал(а):

local turret = create_car

Полагаю, причина где-то тут

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine.

Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист.

AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD.

Ссылка на комментарий

@Zander_driver мм... ну да... Упустил этот момент...  Но в принципе переменная то локальная, пофигу ж как она там называется?

local bomb_fast_n = create_car("bomba_mina_n",xyz(ap.x+dir.x, ap.y, ap.z+dir.z), lv, gv, "") --спереди

Так чтоль?

Или вы имеете в виду, что не create_car а create ?

Ах, да... Реакции НОЛЬ на нажатие НУМПАД9...

1 час назад, Voland-Li сказал(а):

local bomb = create_car(

вот так точнее. 

Voland-Li.gif

Страшно смотреть, как на жестком диске прямо на глазах уменьшается место.

Но еще страшнее смотреть, когда оно прямо на глазах увеличивается. :facepalm:

Вангую. Скоро попросят правку:"Меченый появляется на Кордоне. Телепорт к Монолиту. Загадывает Желание. THE END."

Ссылка на комментарий

@Voland-Li 

Вы серьезно думаете, что ф-ция create_car может заспавнить любой объект? Мины, в ТЧ к примеру - это аномалии. Соответственно, надо создать объект, затем заполнить его нет-пакет необходимыми данными. А по названию ф-ции можно догадаться, что она спавнит что-то связанное с транспортом.

  • Спасибо 1
Ссылка на комментарий

@AndreySol понял... просто спавном не занимался ни разу... как говориться на новые грабли наступаю... За наводку спасибо.

ЗЫ: а на счет нулевой реакции на клавишу не подскажете ничего?

Voland-Li.gif

Страшно смотреть, как на жестком диске прямо на глазах уменьшается место.

Но еще страшнее смотреть, когда оно прямо на глазах увеличивается. :facepalm:

Вангую. Скоро попросят правку:"Меченый появляется на Кордоне. Телепорт к Монолиту. Загадывает Желание. THE END."

Ссылка на комментарий

@Colder , а "отсечку" сделать? :spiteful:

function take_item_from_box(box, box_story_id)
    local box_name = box:name()
    if (math.random() < 0.75) then --* вот туточки
--* Вариант 1: по имени
if not string.find(box_name, 'уникальная часть имени нашего рюкзака') 
and (math.random() < 0.75) then
--* Вариант 2: по секции
if box:section() ~= 'наименование секции нашего рюкзака'
and (math.random() < 0.75) then
    axr_sounds.play_sound([[weapons\generic_checkout]])
    mine_box = box
    mine_timer = time_global()+3000
end
end
end

 

  • Спасибо 1
  • Согласен 1
  • Полезно 2
Ссылка на комментарий

@Купер Спасибо большое! 

Добавил так:

    if not string.find(box_name, "active_ruck")
    and not string.find(box_name, "active_box")
    and not string.find(box_name, "active_system")
    and (math.random() < 0.75) then

Ещё бы добавить что бы с кусачками, снижался шанс заминировании тайника!

Ссылка на комментарий

Как проверить характеристику бронежилетая надетого на гг в скрипте? Например, мне нужно проверить радиозащиту, и если она меньше то прибавлять гг радиацию. И сходу следующий вопрос: как сделать бесконечный таймер, по истечении которого прибавлялась бы эта радиация? (Из этого всего знаю только как прибавить радиацию)

  • Нравится 1
Ссылка на комментарий
1 час назад, ARTLantist сказал(а):

Как проверить характеристику бронежилетая надетого на гг в скрипте?

Привет. Если я не перепутал что-нибудь, и если речь идет об оригинальном движке, то, как то так.

local outfit = db.actor:item_in_slot(6) -- получаем объект комбеза, если есть
if outfit then
  local ocond = outfit:condition() -- выясняем состояние комбеза
  local ltx = system_ini()
  local osec = outfit:section() -- выясняем секцию конфига надетого комбеза
  local rdef = ltx:r_float(osec, "radiation_protection") -- читаем, на сколько этот комбез защищает от радиации
  local real_def = rdef * ocond -- вычисляем действующую защиту с учетом износа
  if real_def < 0.5 then
    db.actor.radiation = 0.1 -- например так)
  end
end

Надеюсь, пригодится для чего-нибудь :)

1 час назад, ARTLantist сказал(а):

как сделать бесконечный таймер, по истечении которого

Бесконечный, по истечении которого... почему-то мне кажется это словосочетание, странным.

В биндерах многих объектов (И актора, т.е. в bind_stalker, тоже), есть метод update. А туда передается, в качестве входящего аргумента, переменная delta.

Которая численно равна, количеству миллисекунд прошедших с прошлого вызова этого update. Может быть, это будет полезно для того, что на самом деле имелось в виду... А может быть, я "угадал" неправильно.

А вообще, смотри тут: https://www.amk-team.ru/forum/topic/7450-spravochnik-po-funkciyam-i-klassam/

Много полезного найдешь.

  • Согласен 1
  • Полезно 4

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine.

Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист.

AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD.

Ссылка на комментарий
17 минут назад, Zander_driver сказал(а):

 





local outfit = db.actor:item_in_slot(6) -- получаем объект комбеза, если есть
if outfit then
  local ocond = outfit:condition() -- выясняем состояние комбеза
  local ltx = system_ini()
  local osec = outfit:section() -- выясняем секцию конфига надетого комбеза
  local rdef = ltx:r_float(osec, "radiation_protection") -- читаем, на сколько этот комбез защищает от радиации
  local real_def = rdef * ocond -- вычисляем действующую защиту с учетом износа
  if real_def < 0.5 then
    db.actor.radiation = 0.1 -- например так)
  end
end

Надеюсь, пригодится для чего-нибудь :)

Бесконечный, по истечении которого... почему-то мне кажется это словосочетание, странным.

Извиняюсь, сам щас прочёл и не понял, что написал, заработался просто немного?

Я хотел сказать, один таймер, длинною, например, одну секунду, по истечении которой будет происходить функция и этот таймер будет запущен заново, и так бесконечно. Как-то так. 

А как правильно работать с этой delta? Уже долго голову ломаю, что это за переменная такая. Во многих модах её используют, а как она используется, разобраться никак не получается.

Изменено пользователем ARTLantist
Добавлено  Опричник,

Изучите "Правила цитирования". https://www.amk-team.ru/forum/topic/13514-obyavleniya/

Устное предупреждение.

Ссылка на комментарий

@Zander_driver, большое пребольшое спасибо, теперь понятно всё!

а как реализовать объединение и разъединение двух предметов в один, например, как сделано в Мизери с контейнерами артов? Мы наводим арт на контейнер и он туда кладётся. Потом нажимаем по контейнеру с артом ПКМ и у нас высвечивается окно "извлечь", нажимаем, и арт извлекается. Мне интересен именно такой способ, по большей части - как высветит это окно "извлечь".

Ссылка на комментарий

"Вывести окно извлечь" Если не ошибаюсь это движковая правка.

Скрытый текст

function start_repair_out(cond,num)
    local itm = db.actor:item_in_slot(num)
    local kit = kits[num]
    local s = cond-2
    local sect = obj:section()
    local name = tostring(system_ini():r_string(obj:section(),"inv_name_short"))

    if itm ~= nil then
    axr_effects_data.devices_anim()
    alife():release(alife():object(itm:id()), true)
    axr_sounds.play_sound([[item_sounds\inv_repair_sewing]])

    send_tip("%c[d_green]"..game.translate_string("st_dis_text_7").." "..game.translate_string(tostring(name)))
    create_repkit(kit..s)
    else
    send_tip("[d_red]Разбор невозможен!\\nОтсутствует объект для разбора!")
    create_repkit(kit..cond)
end
end

Парни помогите вывести Сообщение разобраного обьекта!

Сообщение не приходит а вылетает с "attempt to index global 'obj' (a nil value)"

Ссылка на комментарий
4 часа назад, Colder сказал(а):

local sect = obj:section()
    local name = tostring(system_ini():r_string(obj:section(),"inv_name_short"))

obj:section() Это что и откуда? мне не понятно и движку тоже, вот он и ругается

 

Скрытый текст

function start_repair_out(cond,num)
	local itm = db.actor:item_in_slot(num)
	local kit = kits[num]
	local s = cond-2
	local sect = itm:section()
	local name = tostring(system_ini():r_string(sect,"inv_name_short"))

	if itm ~= nil then
		axr_effects_data.devices_anim()
		alife():release(alife():object(itm:id()), true)
		axr_sounds.play_sound([[item_sounds\inv_repair_sewing]])
		send_tip("%c[d_green]"..game.translate_string("st_dis_text_7").." "..game.translate_string(tostring(name)))
		create_repkit(kit..s)
	else
		send_tip("[d_red]Разбор невозможен!\\nОтсутствует объект для разбора!")
		create_repkit(kit..cond)
	end

 

так попробуй

  • Спасибо 1
Ссылка на комментарий

Да работает спасибо!

@ted.80 А нет! Не работает!

Скрытый текст

Arguments     : LUA error: ...ü ×åðíîáûëÿ\gamedata\scripts\bind_stalker_ext.script:62: attempt to index global 'axr_sewing' (a nil value)

Когда обьекта в слоте нету

Ругаеться на сам скрипт

Ой не то вот вылет Arguments     : LUA error: ... - Òåíü ×åðíîáûëÿ\gamedata\scripts\axr_sewing.script:39: attempt to index local 'itm' (a nil value)

69 строка "

if itm ~= nil then

"

  • Нравится 2
Ссылка на комментарий
Только что, DMT сказал(а):

заданных размеров бокс, защищающий от выброса ?

Вообще-то, это зависит от местной реализации выброса в "там, о чем вы спрашиваете"

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine.

Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист.

AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD.

Ссылка на комментарий
3 минуты назад, Zander_driver сказал(а):

Вообще-то, это зависит от местной реализации выброса в "там, о чем вы спрашиваете"

Маленькое уточнение: вопрос о том, как вкрутить спавн бокса в оригинал ЗП.

Ссылка на комментарий

К посту.

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

Детский сад, штаны на лямках. Но... вот из принципа! :biggrin:

Вызвали мы функцию start_repair_out(cond,num) . Отлично. А дальше... А дальше пытаемся получить секцию и инвентарное наименование для объекта... 

local sect = itm:section()

local name = tostring(system_ini():r_string(sect,"inv_name_short"))

которого в слоте нет :biggrin:

Идеологически верное решение:

Скрытый текст

function start_repair_out(cond,num)
    local itm = db.actor:item_in_slot(num)
	local kit = kits[num]
    if itm ~= nil then
        local s = cond-2
        local sect = itm:section()
        local name = tostring(system_ini():r_string(sect,"inv_name_short"))
        ...
    else
        ...
    end
end

 

 

  • Нравится 1
  • Смешно 1
Ссылка на комментарий
3 часа назад, Купер сказал(а):

И ведь не поправит никто. Все сидят

Ну откуда же нам знать - может, у человека этот obj глобальный. Там еще неплохо бы убедиться, что это именно клиентский объект получен, т.к. емнип, у серверных это читается через section_name(), а :section() - для клиентских.

А во-вторых, @ted.80  - как раз на один такой пример указал, там уже и ежики догадаются )
По-хорошему - неплохо бы  _в начале_  функции проверять даже наличие и тип переданных  в нее параметров.
И на время отладки - все это в лог выводить. 
Мало ли - может передается совсем не то, что ожидается. 

  • Согласен 2

След от кругов на воде - это тоже след (с)

Ссылка на комментарий

Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

Войти
  • Недавно просматривали   1 пользователь

×
×
  • Создать...