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

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

Тема для обсуждения скриптов всего и всех в серии игр 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
Ссылка на комментарий
https://www.amk-team.ru/forum/topic/6185-skriptovanie/

Мало информации.

Эти binder-ы у тебя по-порядку срабатывают?

Это я к чему? Вот есть у тебя 20 binder-ов. Как ты знаешь что отработали все 20, а не какой-то 2 раза, а какой-то ни разу?

Другими словами, можно как-то понять, когда нужно выводить максимальное значение?

@UnLoaded, нужные объекты (биндеры) занеси в таблицу и каждый акторский (например) апдейт проходись по ним и находи максимальное значение. После каждой итерации сбрасывай его в 0.

 

Про другой момент уже сказал Nazgool - у каждого объекта своя частота обновления. Например, у монстров она достаточно низкая, так еще и зависит от расстояния до актора (чем дальше - тем медленнее).

Telegram-канал RayTwitty Space

Требуется из строки вида, например, «aaa_bbb_ccc_ddd» вытащить подстроку от первого символа и до последнего подчёркивания включительно, то есть «aaa_bbb_ccc_», и присвоить это значение переменной средствами сталкеровского Lua.

 

просто Lua это сделать просто, вот так, например,

string.sub (str,1,string.len(str)-string.find (string.reverse (str),"_")+1)

 

а присвоить "сталкеровской переменной" можно попробовать вот так:

local str = "aaa_bbb_ccc_ddd"

local sep = '_'

local new_str = string.sub (str,1,string.len(str)-string.find (string.reverse (str),sep)+1)

 

разделитель (sep) может быть любой.

 

Согласен, примерно так же я сделал это в первую очередь.

Но не хотелось оставлять столь монструозное выражение, поэтому и спросил про регулярки.

Собственно, @Карлан и @Shredder дали выше исчерпывающий ответ.

Kirgudu

Изменено пользователем Kirgudu
  • Согласен 1

Необходимо для ф-ции SetColor(DWORD color) получить DWORD-значение имея четыре значения r, g, b и a. Помню, где-то видел вроде ф-цию, но не могу найти. Подскажите.

Добрый день!
Как можно с помощью скрипта забиндить определенную анимацию у ГГ?

Например: чтобы как в CS:GO ГГ при нажатии клавиши "T" воспроизводил анимацию "игры" с оружием (когда он рожок достает)

@madrazor, в проекте X-Ray Extensions есть функция для проигрывания худовых анимаций. Там же есть каллбэк для актера на нажатие клавиш.

Аддон для ОП-2.09.2: Яндекс/Google/GitHub/Тема на AP-PRO

naxac.gif

Хотел бы получить помощь по спейсрестикторам. Скопирил файл с некоего сайта, как спавнить (СР).

----------
-- чтение формы из нет-пакета
----------
function r_shape(packet)
local s
local st = {}
st.count = packet:r_u8()
st.shapes = {}
for i=1, st.count do
s = {}
s.type = packet:r_u8()
if s.type == 0 then
s.center = packet:r_vec3()
s.radius = packet:r_float()
else
s.axis_x = packet:r_vec3()
s.axis_y = packet:r_vec3()
s.axis_z = packet:r_vec3()
s.offset = packet:r_vec3()
end
st.shapes = s
end
return st
end

----------
-- запись формы в нет-пакет
----------
function w_shape(packet, st)
local s
packet:w_u8(st.count)
for i=1, st.count do
s = st.shapes
packet:w_u8(s.type)
if s.type == 0 then
packet:w_vec3(s.center)
packet:w_float(s.radius)
else
packet:w_vec3(s.axis_x)
packet:w_vec3(s.axis_y)
packet:w_vec3(s.axis_z)
packet:w_vec3(s.offset)
end
end
end

----------
-- перепаковка нет-пакета созданного скриптом рестрикта
----------
function rewrite_restrictor(se_obj, custom, radius)
local packet = net_packet()
se_obj:STATE_Write(packet)
local game_vertex_id = packet:r_u16()
local distance = packet:r_float()
local direct_control = packet:r_s32()
local level_vertex_id = packet:r_s32()
local object_flags = packet:r_s32()
local custom_data = packet:r_stringZ()
local story_id = packet:r_s32()
local spawn_story_id = packet:r_s32()
local shape = r_shape(packet)
local restrictor_type = packet:r_u8()

custom_data = custom
shape = {}
shape.count = 1
shape.shapes = {}
shape.shapes[1] = {}
shape.shapes[1].type = 0
shape.shapes[1].center = vector():set(0,0,0)
shape.shapes[1].radius = radius

packet:w_u16(game_vertex_id)
packet:w_float(distance)
packet:w_s32(direct_control)
packet:w_s32(level_vertex_id)
packet:w_s32(object_flags)
packet:w_stringZ(custom_data)
packet:w_s32(story_id)
packet:w_s32(spawn_story_id)
w_shape(packet, shape)
packet:w_u8(restrictor_type)
se_obj:STATE_Read(packet, packet:w_tell() - packet:r_tell())
end

 

Изменено пользователем nego

Одна голова хорошо, а две лучше. А вот три, это уже змей Горыныч.

 

 

Хотел бы получить помощь по спейсрестикторам

Ну так и чего тебе надобно конкретно ?

Спавню спейсрестиктор, но доходя до нужной точки не получаю инфопоршень. Такое чувство, что рестиктор не спавница.

function create_asb_restr()

local se_obj = alife():create("space_restrictor", vector():set(30.895565032959,-11.312034225464, 385.34494018555), 335849, 1814)
local custom = "[logic]\cfg = scripts\res_point_1.ltx"
rewrite_restrictor(se_obj, custom, 3.0)
end

логика
[logic]
active = sr_idleone

[sr_idleone]
on_actor_inside = {+start_as_zapis} nil %+ok_zapis_as%

 

 

после выдачи поршня должен выдаваться квест.

Одна голова хорошо, а две лучше. А вот три, это уже змей Горыныч.

@nego, спавн рестра правильный. Логика тоже...Но!

[sr_idle@one]

Вот так по уму надо писать...ибо секция логики должна быть sr_idle.

К тому же не вижу смысла в one, секция то у тебя одна. Двигло и так поймет))

Изменено пользователем _Val_

   УРАГАН.png

                 Краткий гид по моду Тайные Тропы 2

                                      ПАРТИКЛЫ TERRA

 

 

 

 

 

"[logic]\cfg = scripts\res_point_1.ltx"

Да и тут похоже ошибка: перенос строки будет кажись так "\n", а у тебя просто слэш.

@UnLoaded, это вроде как не перенос, хотя в ЛУА я дуб дубом))

Вот так короче - да...

local custom = "[logic]\ncfg = scripts\\restr.ltx"

   УРАГАН.png

                 Краткий гид по моду Тайные Тропы 2

                                      ПАРТИКЛЫ TERRA

 

 

 

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

Вот есть у нас произвольно когда-то созданный серверный объект (или его ид... не суть важно же?), ему может быть есть а может быть нету клиентского соответствия. И как только вдруг, кто-то где-то неизвестно зачем его удалил, то вызываем свои действия.

Пока самый производительный вариант какой приходит в голову - держать "в кармане" табличку с ид тех серверных объектов, для которых меня интересует отслеживать их существование/удаление. И на апдейте получать эти объекты alife():object(id) и по ряду признаков проверять что это все еще они, а не какие то другие.

Но вариант этот мягко говоря не очень... есть другие варианты?

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

Я понял что моя старая подпись что-то нарушает. Удалил все ссылки.

Он точно только в нужном мне случае вызывается?

 

Еще такой вдогонку вопрос.

У сталкеров-нпс есть obj:on_register(), и obj:on_spawn()

у монстров только obj:on_register()

 

В чем смысловое/функциональное различие?

  • Полезно 1

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

Я понял что моя старая подпись что-то нарушает. Удалил все ссылки.

@Zander_driver, в ХЕ есть коллбек на удаление объекта через alife():release(). Возможно это то, что тебе нужно.

Telegram-канал RayTwitty Space

@Zander_driver, можно для объекта алайфа переопределить методы create и release своими функциями, в которые, например, добавить триггеры соответствующих событий.

local sim = alife()

sim._create = sim.create
sim.create = function(self, section,...)
	get_console():execute("load ~sim~create:"..section)
	return sim._create(self, section,...)
end

sim._release = sim.release
sim.release = function(self, sobj)
	get_console():execute("load ~sim~release:"..sobj:section_name())
	sim._release(self, sobj)
end

_G.alife = function() return sim end

 

 

  • Полезно 1

:offtopic:

@nego, кстати...к слову пришлось.

У тов. @Charsi в подписи есть плагин Луа для Нотепад++. А в этом плагине есть функция проверки синтаксиса. Так вот она четко показывает ошибку в функции спавна рестра.

 

invalid escape sequence near '\c'

 

Пишем \ncfg, проверяем...О чудо!

 

Syntax OK!

   УРАГАН.png

                 Краткий гид по моду Тайные Тропы 2

                                      ПАРТИКЛЫ TERRA

 

 

 

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

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

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

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

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

Войти

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

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

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