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

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

Тема для обсуждения скриптов всего и всех в серии игр 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
Ссылка на комментарий

Приветствую!

У меня такой вопросец, как сменить текстуру в статике, не создавая новый статик, помню что строение было вроде такого:

имя_статика:SetTexture

Заранее спасибо. :)

  • Нравится 1
  • Не нравится 1

https://www.youtube.com/embed/U0no-6tCxhU

Канал на "Трубе"

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

здравствуйте 

какой скрипт отвечает за поведение сталкера, после того как в него попадет пуля?

Чистил обработчик в xr_motivator келбек hit, но сталкеры все равно стреляют в ответ. 

И еще смотрел настройку логики через кастом дату, за реакцию на это отвечает секция hit и описание не совсем ясно помогите растолковать

Схема показывает, что происходит при нанесении повреждения NPC.


on_hit = hit
[hit]
on_info = {+info -info =func !func ~number} %+info -info =func% - эффекты, которые вызываются в случае, если NPC нанесён хит.
on_hit НЕ СРАБАТЫВАЕТ на звук выстрела, только на попадание по сталкеру! Это сделано, потому что выстрел в воздух в общем случае не должен восприниматься как агрессия (игрок отстреливает, скажем, собак, а на него срывается охрана).
Пример использования секции:
[logic]
...
on_hit = on_hit@agr_factory_hold_fake

[on_hit@agr_factory_hold_fake]
on_info = {=hit_by_actor} %+agr_krot_skirmish_start%

 

как понимать эту схему:

on_info = {+info -info =func !func ~number} %+info -info =func% - эффекты, которые вызываются в случае, если NPC нанесён хит.

И не ясно что присваивать в on_hit

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

wanes101, колбек на хит - это событие, которое выполнится, когда нпс уже получит хит, а сам хит обрабатывает движок.

Секция hit работает ровно также, только из логики.

on_info = {+info -info =func !func ~number} %+info -info =func% - эффекты, которые вызываются в случае, если NPC нанесён хит.

Это означает, что можно установит параметр, при помощи которого можно произвести какое-то действие (забрать\выдать инфопорцию, либо вызвать функцию), т.е. эффекты, они заключены в знаки процента, при этом можно задать дополнительные условия заключённые в фигурные скобки. Обо всём этом можно почитать на Wiki (ссылка у тебя есть).

В on_info по сути ничего не присваивается. Файлы ltx по своей структуре идентичны ini файлам, таким образом on_info это поле, а значение этому полю будет то, что ты пропишешь. В последствии вся логика будет распарсена скриптами, основные скрипты находятся в xr_logic.script.

P.S.Всё же ты немного промазал с темой, тебе прямая дорого в"ковырялку".

Изменено пользователем ColR_iT
Ссылка на комментарий

Доброго дня (ночи?). Возник такой вопрос — можно ли в Сталке точно определить какой вид камеры включен (скриптово). Т.е. вид от 1-го лица, от 3-го с фиксированой камерой или от 3-го со свободной камерой. Была попытка определить по разнице позиции актора и камеры.

        local cam_position = device().cam_pos
	local pos = db.actor: position()
	local third1 = cam_position:distance_to(pos)
	local thr1 = cam_position.y - pos.y

Единственне более-менее связаные параметры это координаты Y. Но эта связка работает ( third1 - thr1 = 0, вид от 1-го лица), если ГГ стоит. Но при ходьбе и беге камера (в голове) качается и расстояние между позицией ГГ (ногами) и позицией камеры (головы) меняется. Можно ли что-то сделать?

Изменено пользователем toxictrace
  • Нравится 1

Когда умрёшь, увидишь кнопки

"О'кей" и "Главное меню"
Под ними "Новая" и "Выход"

И неактивная "Назад"

 

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


local cam_position = device().cam_pos  --> Позиция камеры 
local pos          = db.actor:bone_position("bip01_head") --> Позиция головы игрока
local distance     = cam_position:distance_to(pos) --> Расстояние от камеры до головы ГГ

Не совсем понял как ты хочешь по разнице Y-ов определять что включён вид от 3-го лица с фиксированной или свободной камерой.

Как вариант настройки камеры от разного лица хранятся в файле system.ltx, actor_cam_look_ или как то так, найдёшь там вообщем. 

Там есть такой параметр как максимальное удаление\приближение камеры к игроку (на +\-) 

Настрой эти параметры так чтобы от 3-го лица с фиксированной камерой приближение было одно (например от 2 до 5 метров или ровно 5-5 чтобы камера всегда в одном месте висела), а со свободной другое (от 5\6 и больше).

Что то вроде этого. Тогда уже через distance определяй как далеко от игрока находится камера и соответственно для какого вида это расстояние приемлимо. 

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

Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О

Мастер аномалий на свою заднюю точку.

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

Другой вопрос — нажали клавишу, надо проверить, висит на ней в user.ltx нужное мне действие или нет?

Когда умрёшь, увидишь кнопки

"О'кей" и "Главное меню"
Под ними "Новая" и "Выход"

И неактивная "Назад"

 

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

Здравствуйте.

Есть ли проверки на то, существует ли парт-тексутра(определённая область в текстуре, которая записывается в .xml - "научного" названия не знаю, называю так)?

Нужно мне это для такой ситуации: если есть текстура с определённым именем (она будет в размерах больше), то загрузить её. Если нет, то загрузить текстуру другую (меньшего размера). Текстуры подгружаю в GUI.

Работы на Artstationhttps://www.artstation.com/artist/stalker_lom

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

@Сталкер Лом, глянь скрипты ui_save_dialog\ui_load_dialog.script
Это скрипты сохранения\загрузки и там показан пример проверки наличия текстуры в папке с сейвами.
Делай по аналогии для своего скрипта проверку что такой файл существует. 

Само собой это при условии что ты знаешь название текстуры. 

 

По парт-текстуру первый раз слышу или не понял что это такое.

  • Нравится 1

Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О

Мастер аномалий на свою заднюю точку.

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

Здравствуйте.

Есть функция kоторая возвращает название комбинезона kak string.
Проблема в том что я этот string хочу проверить по таблице.

group_1 = {soldier_outfit_grey = true, soldier_outfit_brown = true, ... etc.}

local get_visual = get_visual.main(obj)
if group_1[get_visual] then
-//kod//--
end

Проблема в том что, так построений if даже не стартует, как будто не распознает аргумент.
Но, если я построю if таким образом.

group_1 = {soldier_outfit_grey = true, soldier_outfit_brown = true, ... etc.}

local get_visual = get_visual.main(obj)
if get_visual == "soldier_outfit_grey" then
-//kod//--
end

To сравнение удается, то есть, это не nil и название комбинезона фактически находится в get_visual.

Какие-то советы, что делаю не так?

Я читал lua tutorial и там сказано что это правильный способ чтобы сравнивать string со значениями в таблице но у меня как то не выходит.

Изменено пользователем Reisen
Ссылка на комментарий

Я бы тебе посоветовал использовать разные названия для переменных и для скриптов (get_visual)

А вот я без особых надежд взял и изменил название на

 local get_oname = get_visual.main(obj)

и сразу же заработало...

Я на это потратил больше дня а надо было название взят другое, что самое смешное это такая нубовская ошибка, везде по голове молотком стучат  чтобы этого не делать.

Reisen, попробуй так сделать:

На будущие постараюсь помнить что есть еще такой способ.

 

Спасибо за помощь, надо мне было сразу же сюда писать, а не голову ламать часами.

Изменено пользователем Reisen
  • Нравится 1
Ссылка на комментарий

Интересно, на сколько я неправильно понимаю, что здесь что-то не так (amk-мод, amk.script):

function fill_item_packet(ret,stpk,updpk)

stpk:w_float(ret.condition)

updpk:w_u8(ret.updnum_items)

updpk:w_float(ret.updpos.x)

updpk:w_float(ret.updpos.y)

updpk:w_float(ret.updpos.z)

readvu8uN(updpk,ret.updcse_alife_item__unk1_q8v4)

readvu8uN(updpk,ret.updcse_alife_item__unk2_q8v3)

readvu8uN(updpk,ret.updcse_alife_item__unk3_q8v3)

return ret

end

Но ведь ни у кого ж ни разу не вылетало ?

Изменено пользователем Dennis_Chikin
Ссылка на комментарий

Я не смотрел скрипт АМК, поэтому не знаю что делает функция readvu8uN но в остальном тут не должно быть ошибок. Но вообще для работы с нэт-пакетами лучше использовать скрипт m_netpk (или как то так, ещё может m_net_utils.script называться) из Simbion Mod-а (потому что на форуме будет проблематично его найти)

Там очень удобная библиотека функций для работы с нэт-пакетами. Ну или найди последние посты xStream-а в которых как раз обсуждались нэт-пакеты.  

 

Собстно вбей в поиск по этой теме m_netpk и найдёшь тут один из вариантов (если ещё нету более новых)

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

Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О

Мастер аномалий на свою заднюю точку.

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

Удобная, но неторопливая. Кстати, на яндексе отдача файлов в очередной раз сдохла.

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

@Dennis_Chikin, как говорится, спешка нужна при ловле блох. При работе с нет-пакетами торопливость  противопоказана. ;-)

 

Обновил и сам модуль и ссылку: m_netpk от 03.09.2013

 

Ну а по твоему вопросу: не было вылетов потому, что а) данный код не был востребован и б) искажение данных нет-пакета не всегда приводит к вылетам. Вспомни т.н. "рельсы", когда модели убитых монстров растягивались на пол локации.

Отсутствие фатальной ошибки (вылета) нередко годами скрывает наличие ошибки, а в amk.script немало таких огрех и др. рудиментов...

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

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

"Вспомни т.н. "рельсы", когда модели убитых монстров растягивались на пол локации."

 

Кстати, а что это вообще было ?

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

Ну так кратко уже упомянул: "б) искажение данных нет-пакета"

Если не сильно углубляться в дебри, то "рельсы" возникают из-за:

1.В АМК-моде имеются динамические рестрикторы (например аномалии), которые  спавнятся в процессе игры и удаляются из игры.

2. Объекты в игре зависимы от рестрикторов и имеются т.н. "out_restrictions" и "in_restrictions", которые прописываются движком в нет-пакеты объектов.

3.(!) Чтобы при удалении рестриктора(ов) не возникало вылетов из-за "хвостов" в нет-пакетах, в АМК-моде имеются зачистки рестрикторов в нет-пакетах (см. on_register иль net_destroy), для чего считываются нет-пакеты и => crvu32u16u2={}.

4. При смерти монстров/сталкеров их объект получает физическую оболочку (phisic_shell) и в нет-пакете меняется структура(расширяется). В параметре 'skeleton_flags' изменяются значения битов, появляются дополнительные параметры/значения скелета/костей (bones).

Именно это и приводит к искажению пакетов, т.к. упрощенное (неверное!) чтение и запись искажает значения... Порою это приводит к вылетам иль "битым сэйвам", порой остается незаметным, а порою измененные величины векторов превращают трупы во что угодно, в том числе и "рельсы", вытягивая в том иль ином направлении.

Примечание: Чтобы изменить требуемый параметр приходится считывать весь(!) нет-пакет объекта и его (пере)записывать, заменяя требуемое значение, а в АМК-моде (amk.script) это делается даже одновременно с двумя типами пакетов ("state" и "update"), и любой сбой при чтении приводит к непредсказуемости. 

 

Подобные косяки могут быть и с предметами, т.к. алгоритм чтения/записи параметров секции cse_alife_object_physic, как и cse_ph_skeleton, кастрирован (упрощен).

Немало и других некорректных частей в алгоритмах нет-пакетов в amk.script.

Изменено пользователем Artos
  • Нравится 2

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

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

Доброго времени всем суток.

Возможно в ЗП проверить принадлежит ли данный смарт определенной группировке, так как ЧН?

ПИС функция ЧН не работает, что надо поменять?

 

 

function smart_captured_by_faction(actor , obj, p)
        local smart_name = p[1]
        local faction_name = p[2]

        if smart_name == nil or faction_name == nil then
         abort("Wrong parameters")
        end

        local smrt = sim_board.get_sim_board().smarts_by_names[smart_name]
        if smrt == nil then
         abort("Smart name [%s] doesn't exist.", smart_name)
        end

        if smrt.player_name == faction_name then
         return true
        end
        return false
end 

 

 

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

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

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

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

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

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

Войти

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

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

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