Скриптование - Страница 251 - Скрипты / конфиги / движок - AMK Team
Перейти к контенту

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

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

Скажите пожалуйста, как по нет-пакету получить имя профиля сталкера?

и можно ли его получить так:

 

 

function get_npc_character(p_obj)
if p_obj then
local params = read_stalker_params(p_obj)
character_profile = params.character_profile
return character_profile
end
end

 Или вот так:

 

 

function get_npc_name(p_obj_id)
local obj = alife():object(p_obj_id)
if not obj then return "none" end
stpk:w_begin(0)
stpk:r_seek(2)
obj:STATE_Write(stpk)
local game_vertex_id = stpk:r_u16()
local distance = stpk:r_float()
local direct_control = stpk:r_s32()
local level_vertex_id = stpk:r_s32()
local object_flags = stpk:r_s32()
local character_profile = stpk:r_stringZ()
if not character_profile then return "none" end
return character_profile
end

level.prefetch_sound() в SOC вообще работает ?

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

Но результатов от того, что он там делал - не вижу.

Кажется да, в ТЧ не работает. Проверял на чистой версии 1.004

 

! Cannot find saved game ~#i#:#timer [load_sound] send [esc_lager1] time 151900.640625
! Cannot find saved game ~#i#:#timer [load_sound] send [esc_lager2] time 76861.28125
! Cannot find saved game ~#i#:#timer [load_sound] send [esc_lager3] time 6158.66796875
! Cannot find saved game ~#i#:#timer [load_sound] send [esc_lager4] time 6098.7456054688
! Cannot find saved game ~#i#:#timer [load_sound] send [esc_lager5] time 49973.76953125
! Cannot find saved game ~#i#:#timer [load_sound] send [esc_lager6] time 5801.388671875
! Cannot find saved game ~#i#:#timer [load_sound] send [esc_lager7] time 5827.8383789063
! Cannot find saved game ~#i#:#timer [load_sound] send [esc_wolf] time 51055.2109375
! Cannot find saved game ~#i#:#timer [load_sound] send [esc_specnaz1] time 120311.9296875
! Cannot find saved game ~#i#:#timer [load_sound] send [esc_specnaz2] time 6131.2065429688
! Cannot find saved game ~#i#:#timer [load_sound] send [esc_specnaz3] time 6202.162109375
! Cannot find saved game ~#i#:#timer [load_sound] send [esc_specnaz4] time 6135.0942382813
! Cannot find saved game ~#i#:#timer [load_sound] send [esc_specnaz5] time 6163.4208984375
! Cannot find saved game ~#i#:#timer [load_sound] send [esc_specnaz6] time 6137.5444335938
! Cannot find saved game ~#i#:#timer [load_sound] send [esc_blokpost_soldier1] time 120561.21875
! Cannot find saved game ~#i#:#timer [load_sound] send [esc_blokpost_soldier2] time 6199.7275390625
! Cannot find saved game ~#i#:#timer [load_sound] send [esc_blokpost_soldier3] time 7081.654296875
! Cannot find saved game ~#i#:#timer [load_sound] send [esc_blokpost_soldier4] time 6173.3525390625
! Cannot find saved game ~#i#:#timer [load_sound] send [esc_blokpost_soldier5] time 6077.3876953125
! Cannot find saved game ~#i#:#timer [load_sound] send [esc_blokpost_soldier6] time 6117.654296875
! Cannot find saved game ~#i#:#timer [load_sound] send [esc_blokpost_soldier7] time 6213.7060546875
! Cannot find saved game ~#i#:#timer [load_sound] send [esc_blokpost_soldier8] time 6071.0737304688
! Cannot find saved game ~#i#:#timer [load_sound] send [esc_blokpost_soldier9] time 6168.5727539063
! Cannot find saved game ~#i#:#timer [load_sound] send [esc_blokpost_commander] time 6136.7456054688
! Cannot find saved game ~#i#:#timer [load_sound] send [esc_shustryi] time 5780.669921875

 

 

 

 

! Cannot find saved game ~#i#:#timer [prefetch_sounds] send [end] time 8899533
! Cannot find saved game ~#i#:#timer [load_sound] send [esc_lager1] time 215009.796875
! Cannot find saved game ~#i#:#timer [load_sound] send [esc_lager2] time 37829.171875
! Cannot find saved game ~#i#:#timer [load_sound] send [esc_lager3] time 81040.7421875
! Cannot find saved game ~#i#:#timer [load_sound] send [esc_lager4] time 7518.0048828125
! Cannot find saved game ~#i#:#timer [load_sound] send [esc_lager5] time 5922.2114257813
! Cannot find saved game ~#i#:#timer [load_sound] send [esc_lager6] time 59345.6171875
! Cannot find saved game ~#i#:#timer [load_sound] send [esc_lager7] time 5590.4750976563
! Cannot find saved game ~#i#:#timer [load_sound] send [esc_wolf] time 5426.0971679688
! Cannot find saved game ~#i#:#timer [load_sound] send [esc_specnaz1] time 93804.1171875
! Cannot find saved game ~#i#:#timer [load_sound] send [esc_specnaz2] time 5843.2153320313
! Cannot find saved game ~#i#:#timer [load_sound] send [esc_specnaz3] time 5842.4467773438
! Cannot find saved game ~#i#:#timer [load_sound] send [esc_specnaz4] time 5840.8466796875
! Cannot find saved game ~#i#:#timer [load_sound] send [esc_specnaz5] time 5830.0473632813
! Cannot find saved game ~#i#:#timer [load_sound] send [esc_specnaz6] time 5896.013671875
! Cannot find saved game ~#i#:#timer [load_sound] send [esc_blokpost_soldier1] time 49885.50390625
! Cannot find saved game ~#i#:#timer [load_sound] send [esc_blokpost_soldier2] time 5872.9169921875
! Cannot find saved game ~#i#:#timer [load_sound] send [esc_blokpost_soldier3] time 6959.5307617188
! Cannot find saved game ~#i#:#timer [load_sound] send [esc_blokpost_soldier4] time 6058.220703125
! Cannot find saved game ~#i#:#timer [load_sound] send [esc_blokpost_soldier5] time 5916.9033203125
! Cannot find saved game ~#i#:#timer [load_sound] send [esc_blokpost_soldier6] time 5829.4350585938
! Cannot find saved game ~#i#:#timer [load_sound] send [esc_blokpost_soldier7] time 5931.599609375
! Cannot find saved game ~#i#:#timer [load_sound] send [esc_blokpost_soldier8] time 5905.4916992188
! Cannot find saved game ~#i#:#timer [load_sound] send [esc_blokpost_soldier9] time 5933.857421875
! Cannot find saved game ~#i#:#timer [load_sound] send [esc_blokpost_commander] time 5909.751953125
! Cannot find saved game ~#i#:#timer [load_sound] send [esc_shustryi] time 5658.0590820313

 

 

звуки грузились через npc:add_sound() ?

 

Вообще, если взять какую-то тушку, и скормить ей ВСЕ - будет вполне себе кэширование.

Но я не разобрался, что должно быть в параметрах. Там в скриптике была попытка сделать тупо (вместо prefetch в preload() было тупо add_sound по всем подкаталогам, но оно грузит только первый, от остальных отказывается.

Кэширование пытался сделать через level.prefetch_sound, потом попробовал через db.actor:add_sound(), но там во втором случае вообще ничего не происходило, т.к. даже по вермени проходило всег 0,3 сек. против 9 сек через level.prefetch_sound. Больше не копал.

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

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

Подозреваю, что для второго варианта должны быть какие-то "идеологически правильные" id.

Wookie, для класса io существует метод lines, принимающий в качестве аргумента имя файла, и возвращает функцию итератор, которая при вызове возвращает по одной строку из указанного файла, как только достигнет конца файла - вернёт nil, при этом файл будет закрыт.
Точно не помню, но кажется можно вызывать и без аргумента, в таком случае будет обрабатываться стандартный поток ввода, по окончании итерации ничего закрываться не будет.

for line in io.lines("filenNme") do ... end

Это работает на чистом Lua, но и на ЗП должно работать.

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

Всем привет. Можете подсказать, у меня ничего не получается. Я пытаюсь сделать удаление заспавненного скриптом телепорта, при поднятии предмета. Подскажите пожалуйста что и куда прописывать нужно. Заранее благодарен.

 

Функцию checking_taken_item я изучил он делает все, спавнит нпс и т.д. НО никак я с ее помощью не могу удалить телепорт заспавненный скриптом вот моя функция удаления телепорта:

function delete_teleport_kastet(story_id)   local se_obj = alife():story_object(97125)    if se_obj then       alife():release(se_obj)       news_manager.send_tip(db.actor, "Телепорт отключен", nil, nil, 30000)    endendfunction checking_taken_item77(obj)   if obj:section()=="quest_case_kastet" then delete_teleport_kastet(obj) endend

 

 

Извиняюсь но спойлер что то не работает.

 

Удивительно, но работает не только спойлер, но и остальные теги.

ColR_iT

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

Вот моя функция спавна телепорта:

function spawn_tele_kastet1()

local se_obj = alife():create("m_teleport_esc_kastet1",vector():set(-4.934,0.633,267.286),272133,183)

local t = amk.get_anomaly_data(se_obj)

t.sid = 97128

amk.set_anomaly_data(t, se_obj)

end

 

И еще, в функции что я писал выше я сделал опечатку, там СИД не 97125 а 97 128.

Как удалить телепорт подскажите пожалуйста.

Небольшой вопрос. Какая функция лучше для определения текущей игровой локации на апдейте? Проверять локации через level.name()== "l01_escape" или может по alife():level_name("l01_escape")?

Первой конечно. Вторая используется по-другому: alife():level_name(level_id), где level_id можно получить несколькими способами, один из них:
game_graph():vertex(obj:game_vertex_id()):level_id()

В arhara_dialog.skript телепорт удаляется через такую функцию:

function delete_teleport_baza_vxod(story_id)
   local se_obj = alife():story_object(17000)
   if se_obj then
    alife():release(se_obj)
    news_manager.send_tip(db.actor, "Телепорт на входе в базу отключен", nil, nil, 30000)
   end
end

function checking_taken_item45(obj)
   if obj:section()=="kluch_dell_teleport" then delete_teleport_baza_vxod(obj)
   end
end

Я делаю такую же функцию, но у меня телепорт не удаляется. Подскажите пожалуйста может быть я что то не так делаю?

P.S. Вот моя функция СПАВНА телепорта :

function spawn_tele_kastet2()
   local se_obj = alife():create("m_teleport_esc_kastet2",vector():set(21.189,0.585,256.948),299742,182)
   local t = amk.get_anomaly_data(se_obj)
   t.sid = 97129
   amk.set_anomaly_data(t, se_obj)
end

 

Используй тег [cоdе] для выделения кода в тесте.

В шапке об этом написано. В следующий раз удалю пост.

ColR_iT

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

Есть вылет:

FATAL ERROR
 
[error]Expression    : fatal error
[error]Function      : CScriptEngine::lua_error
[error]File          : E:\priquel\sources\engine\xrServerEntities\script_engine.cpp
[error]Line          : 180
[error]Description   : <no expression>
[error]Arguments     : LUA error: ...stalker clear sky\gamedata\scripts\os_respawn.script:49: attempt to call method 'alive' (a nil value)
 
 
stack trace:

Вот фрагмент из os_respawn:

local obj = alife():object(k)  --получаем объект по его Id
        local name = oldstory.get_npc_character(obj) --тут получаем имя профиля сталкера(100% работает)
        if obj and name==p_name then  -- if obj это типа проверка что obj не равен nil?
Вылет >       if obj:alive() then   --по вылету выходит, что не может применить alive к obj = nil ? 
                cnt = cnt+1
            else
И что же тут не так?

Странно как-то. Должно работать. Попробуй так:

 

if obj.alive and obj:alive() then
  cnt = cnt + 1

 

 

Возможно obj не имеет метода alive, т.е. это какой-то объект, который живым быть не может, автомат например. Хотя тогда бы и лог другой был. Ещё функцию oldstory.get_npc_character показал бы.

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

Давно со скриптами сталкера не работал, мозги немного заплыли жиром.

Хочу попробовать "грубо" реализовать тело игрока от первого лица через физ объект с анимациями, но для этого нужно решить некоторые проблемы, в частности ни у кого нет идей каким образом можно двигать физ. объект (коллизия у него будет отключена) 

вместе с игроком? Функции телепортации для физ. объектов вроде как нету, пока рассматриваю вариант пытаться двигать объект за игроком через физику, но это будет то ещё извращение. 

Работаю на ЧН, но сойдёт и ЗП вариант.

 

Как вариант - посмотри реализацию грави-пушки.

ColR_iT

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

А подскажите плз, можно ли сделать так, чтобы каждый раз при заходе на уровень (для ЗП) один раз выполнялся определенный скрипт. Пробовал по вот этому методу http://www.amk-team.ru/forum/index.php?act=findpost&pid=472142, но наверное в ЗП это не работает, у меня не получилось.

Подскажите, пожалуйста.
Ситуация такая: нужно сохранять 2 таблицы:
table1 = {[1] = {id_a=<1..65535>, numb=<1..8>, id_b=<1..65535>}, [2] = {id_a=<1..65535>, numb=<1..8>, id_b=<1..65535>} ...}
table2 = {[1] = {id=<1..65535>, c=<1..1000> }, [2] = {id=<1..65535>, c=<1..1000> } ...}
Запас по числу элементов [1],[2]... желательно 40+.
Пробовал использовать функции amk.save_table, amk.load_table. Я так понимаю, они переводят таблицы в строку, затем обратно.
По мере заполнения таблиц получаю либо зависание при сохранении, либо вылет при попытке загрузки (чаще).
С нет-пакетами знаком плохо.
Может есть другие готовые и более подходящие функции для хранения таблиц? Или можно на упомянутых как-то по-другому организовать таблицы (разбить, исключить подтаблицы...)?
Или, если единственный вариант - разбираться с нет-пакетами, - подскажите, какие функции и где (из каких модов) посмотреть.
Спасибо.

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

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

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

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

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

Войти

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

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

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