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

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

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

Expression : fatal error

Function : CScriptEngine::lua_error

File : E:\stalker\patch_1_0004\xr_3da\xrGame\script_engine.cpp

Line : 73

Description : <no expression>

Arguments : LUA error: ...ow of chernobyl\gamedata\scripts\bind_stalker.script:405: attempt to concatenate field '?' (a nil value)

Это на ЧАЭС 1.

 

 

 

Клиент: Синхронизация...

* phase time: 11 ms

* phase cmem: 285151 K

* [win32]: free[2174888 K], reserved[107276 K], committed[1912076 K]

* [ D3D ]: textures[1071362 K]

* [x-ray]: crt heap[285151 K], process heap[8507 K], game lua[3052 K], engine lua[218 K], render[931 K]

* [x-ray]: economy: strings[1895 K], smem[53698 K]

Expression : fatal error

Function : CScriptEngine::lua_error

File : E:\stalker\patch_1_0004\xr_3da\xrGame\script_engine.cpp

Line : 73

Description : <no expression>

Arguments : LUA error: ....r. - shadow of chernobyl\gamedata\scripts\_g.script:20: bad argument #2 to 'format' (string expected, got no value)

 

Вот такая ерунда при переходе на N-ную локацию.

Помогите пожалуйста!

 

[9549]

; cse_abstract properties

section_name = level_changer

name = level_changer_stancia_2_to_stancia

position = -40.413513183594,-0.028096795082092,55.799430847168

direction = -0.23880127072334,0,-0.97106844186783

 

; cse_alife_object properties

game_vertex_id = 2517

distance = 0

level_vertex_id = 66413

object_flags = 0xffffff3e

 

; cse_shape properties

shapes = shape0

shape0:type = box

shape0:axis_x = 15.4235229492188,0,0

shape0:axis_y = 0,15.0454006195068,0

shape0:axis_z = 0,0,5.50719976425171

shape0:offset = 0,0,0

 

; cse_alife_space_restrictor properties

restrictor_type = 3

 

; cse_alife_level_changer properties

dest_game_vertex_id = 2376

dest_level_vertex_id = 67229

dest_position = 135.100006103516,-0.101432323455811,-74.8999938964844

dest_direction = 0,0,0

dest_level_name = l12_stancia

 

 

 

[9550]

; cse_abstract properties

section_name = level_changer

name = level_changer_stancia_2_to_yantar_old

position = 844.41125488281,-0.097796887159348,463.79565429688

direction = -0.43719217181206,0,0.89936810731888

 

; cse_alife_object properties

game_vertex_id = 2650

distance = 0

level_vertex_id = 263841

object_flags = 0xffffff3e

story_id = 6013

 

; cse_shape properties

shapes = shape0

shape0:type = box

shape0:axis_x = 15.4235229492188,0,0

shape0:axis_y = 0,15.0454006195068,0

shape0:axis_z = 0,0,5.50719976425171

shape0:offset = 0,0,0

 

; cse_alife_space_restrictor properties

restrictor_type = 3

 

; cse_alife_level_changer properties

dest_game_vertex_id = 4339

dest_level_vertex_id = 4843

dest_position = -266,6.67631340026855,24

dest_direction = 0,0,0

dest_level_name = yantar_old

 

 

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

Привет. Пользовался поиском, не нашел того, что нужно.

Как узнать dest_game_vertex_id и dest_level_vertex_id?

как сделать сброс инвентаря при нажатия на кнопку в ЗП?

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

1) Нажатие кнопки где? Это имеет большое значение

2) Сам сброс реализовать технически не очень трудно, но тут тоже много параметров. Во первых сбрасывать куда - на землю или в отдельный рюкзачёк. И потом, там тоже есть свои тонкости.

Ну и в 3) За тебя это врятле кто сделает, это всё таки хоть и простое но уже требующее времени дело. Здесь тебе могут тока подсказать основные функции, а как их задействовать и откуда вызывать уже самому придётся разбираться.

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

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

Есть ли для оружия ф-ция, которая возвращает список патронов, которые можно для него использовать ? Или надо самому парсить ammo_class из соответствующего ltx-файла ?

*Shoker*,1)Кнопка на клаве.2)При нажатие кнопки зади ГГ спав рюкзака в котором будет весь инвентарь.

 

Будут дальше безграмотные и/или бессмысленные вопросы - сообщения будут удаляться. --/Artos

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

AndreySol, нет такой штатной функции дабы получать списое используемых оружием патронов.

 

student91122, если ты думаешь, что тут тебе напишут мод "Сбрасываемый рюкзак" - то заблуждаешься и, чем мусорить в топик, посмотри сам и по аналогии делай.

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

 

Добавлено через 4 мин.:

kota, как узнать координаты точки о которой ничего неизвестно?

Или в SDK обределяй точки для переходов или скриптами "аля-информер" смотри сам при заходе на требуемую локацию.

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

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

Такой вопрос: при попадании из оружия в радиоприемник требуется определить, с какого расстояния было осуществлено попадание. При расстоянии равном или больше 100 метров - выдать поршень. Кто-нибудь сталкивался?

Опять глюк, помогите пожалуйста.

Я ставлю на радар переход на нестандартную локацию, в моем случаи Х-8 и получаю вылет при загрузке игры, в начале при кешировании объектов без лога.

Вопрос по net-пакетам. По какому смещению находится таблица in-рестрикторов для класса cse_alife_human_stalker?

Капрал Хикс, повесь в биндер объекта hit_callback. В вызываемой функции считай расстояние. Как-то так, я думаю:

function generic_physics_binder:hit_callback(obj, amount, local_direction, who, bone_index)
     local dist = self.object:position():distance_to(who:position())
     if dist > 100 then
          db.actor:give_info_portion(...)
     end
end

 

Добавлено через 5 мин.:

Полтергейст, а оно разное от объекта к объекту. Зависит от наличия/отсутствия строковых параметров у объекта - кастом дата, character_profile и т.д. Разбирай пакет полностью.

Капрал Хикс, можно сделать через логику для радио.

Вот это пишешь в логику:

on_hit = hit
[hit]
on_info = {=chek_dictance} %+infoportion%

Где:

chek_dictance - функция в файле xr_condition следующего вида:

function chek_dictance ()
    local sid = 4 -- это Шустырй, нужно поставить свой story_id в секцию спавна радио и прописать его сюда
    local object = alife():story_object(sid)
    local object_pos = object.position()
    return actor_pos:distance_to_sqr(object_pos) >= 10000
end

infoportion - инфопоршен, который будет выдан, если функция chek_dictance вернет true.

Есть еще более простое решение (штатной логикой) по выдаче инфопоршня при попадании актором в приемник:

on_hit = hit
[hit]
on_actor_dist_ge_nvis = 100 | %+my_infoportion%

- этот вариант проще.

Инфопоршень будет выдан если приемник получит повреждение и актор ближе 100м, хотя ... хит может быть и не от актора.

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

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

Извините, что встреваю...

Можно попробовать применить и такой вариант (если работаешь на ЗП).

on_hit = hit
[hit]
on_info = {=hit_by_actor =dist_to_actor_ge(100)} %+my_infoportion%
 

Поправьте, если ошибаюсь.

 

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

⠀

KD87

а оно разное от объекта к объекту. Зависит от наличия/отсутствия строковых параметров у объекта - кастом дата, character_profile и т.д. Разбирай пакет полностью.

У меня чистая игра 1.0006, могу ли я использовать parse_stalker_packet из amk.script для разбора пакетов? В AMK в se_stalker после чтения/записи онлайн работ идёт чтение/запись числа, а в чистой 1.0006 вместо них идёт 2 bool значения.

Вот сама функция:

function parse_stalker_packet(ret,stpk,updpk,size)
     parse_human_packet(ret,stpk,updpk)
     parse_skeleton_packet(ret,stpk,updpk)
     ret.hellodlg=updpk:r_stringZ()
     ret.stunk1={}
     for i=stpk:r_tell(),size-1,1 do
         table.insert(ret.stunk1,[b]stpk:r_u8()[/b])
     end
     return ret
end

 

 

Выделенный жирным фрагмент отвечает за считывания этих чисел (уже не помню, сколько их там), или это что-то другое?

 

Штатная функция самой игры ( alife():remove_all_restrictions(se_obj, 2)) не работает - просто виснет.

Изменено пользователем Полтергейст

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

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

1. Выделенный тобою фрагмент из АМК-кода не относится к требуемому тебе. Это всего лишь неопределенный остаток байтов (stunk) от основной части пакета, который АМК-код не разбирает, а оставляет бинарным куском.

2. Тебе требуется брать параметры dynamic_out_restrictions и dynamic_in_restrictions из секции cse_alife_creature_abstract пакета.

В АМК-варианте это в функции parse_creature_packet и параметры обзываются: crvu32u16u1 и crvu32u16u2 .

Так что получив таблицу из parse_stalker_packet, бери эти параметры из нее.

 

Но имей ввиду, запихивать или очищаять"ручками" рестрикторы серверному объекту следует и аккуратно и в случае реальной необходимости, а не абы ...

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

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

Полтергейст, формат нет-пакетов одинаковый в патчах 1.0002-1.0006, можешь использовать функции амк.

Неудивительно, что виснет. Первый аргумент метода - id объекта, а не он сам. Также есть еще метод remove_all_restrictions() для клиентского объекта. Правда, в таком случае удаляются и out-рестрикторы.

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

Jurok, не уверен на 100%, но ... врядли предложенный тобою вариант будет применим именно к приемнику или ему подобному объекту.

Особенность в том, что hit_by_actor работает с забинденными объектами, точнее с теми что зарегистрированны в db.storage, куда всякая всячина не заносится ... и соответственно не имеет таблички hit

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

Artos

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

В том и странность: функция remove_all_restrictions виснет, но если удалять отдельно каждый рестриктор через alife():remove_in_restriction(...), то всё нормально. Для клиентского объекта функция add_restrictions тоже виснет, в то время, как alife():add_in_restriction(...) работает как надо.

 

KD87

Дело в том, что удаление рестрикторов я делаю в функции net_destroy. Если я вызову remove_all_restrictions(), то ничего не произойдёт - игра просто напишет, что объект, для которого эта функция вызвана, не найден.

Изменено пользователем Полтергейст

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

Попробуй хотя бы через увод непися в оффлайн чистить ему рестрикторы.

А вообще занимаемся погадалками-предполагалками ... Или опиши более информативно ситуацию или ... гадай самостоятельно.

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

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

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

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

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

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

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

Войти

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

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

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