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

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

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

TREWKO,

level_name(level_id) - системное имя уровня по его номеру

level_id() - номер текущего уровня

switch_distance(<радиус>) - по идее установка радиуса переключения алайфа, но у меня не сработало, работало только изменение из конфига

 

Внятное имя уровня (не системное, а то, которое изображается на карте):

game.translate_string(string.lower(alife():level_name(level_id)))

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

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

Mechanic.92,

Как в ТЧ проверить, есть ли у актора кровотечение?

Читать сюда.

 

Я для кого тему делал?! :ny_z_9:

 

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

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

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

Привет всем. Скажите пожалуйста, почему неверна эта функция неверна:

function set_my_npc()
local soNPC = alife():story_object(006) --\берем волка
if soNPC then
local tT =  amk.read_stalker_params(soNPC)
if string.find(tT.custom,"esc_stone_lager") then  --\проверяем, есть ли непись на этом гулаге?
return 
end
tT.custom = "[smart_terrains]\nesc_stone_lager=true\n"
amk.write_stalker_params(tT,soNPC) --/ записываем
amk.add_spot_on_map(soNPC.id,"red_location", tT.custom) --\ставим метку на пда
local oNPC = level.object_by_id(soNPC.id)
if oNPC then
xr_gulag.resetJob(oNPC)
end
end
end

Я хотел, чтобы Волк пошел на гулаг esc_stone_lager. Вылета нету, но это действие гарантированно выносит непися в оффлайн. Как мне вернуть его в онлайн? Я пробовал switch_online(soNPC) - не выходит. Помогите пожалуйста.

 

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

Можно например назначить Волку иммунитеты от Сахарова. Или скриптом всё время биндить ему параметр health на 1.

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

Как их ему назначить?

Строгое предупреждение от модератора n6260
Через алл_спавн. В разделе даже есть статья о бесмертных НПС. Юзай поиск.

VODKA connected people...

aa074e181fba.jpg

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

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

Как это можно проверить для оффлайн-обьектов? или только если сталкер - gameobject (через итерацию инвентаря? или можно сразу проверить оружие в слотах 1 и 2 и если нет, то другого и не будет?) ?

 

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

(Неписи стреляют непрерывно, и у них вроде как не заканчивается, но подозреваю что есть какой-то ньюанс, который я упустил)

 

спасибо за внимание.

 

Сообщение от модератора n6260
Патронов у нпс должно быть больше чем на одну обойму. Хотя бы на один патрон. Иначе отстреляет обойму и все.

Строгое предупреждение от модератора n6260
Юзай заглавные буквы.
Ссылка на комментарий

Подскажите пожалуйста следующее: в теме "Справочник по функциям и классам" указано, что можно работать со слотами НПС,

но код вида

local PistolSlot = obj:item_in_slot(1)

local AutomaticSlot = obj:item_in_slot(2)

не срабатывает, ругается на item_in_slot:

[error]Expression : !m_error_code

[error]Function : raii_guard::~raii_guard

[error]File : D:\prog_repository\sources\trunk\xrServerEntities\script_storage.cpp

[error]Line : 748

[error]Description : l:\stalker-cop\gamedata\scripts\ts_mod_cop.script:230: attempt to call method 'item_in_slot' (a nil value)

 

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

    for a=1,65534,1 do    -- полный перебор
        local obj = alife():object(a)
        if obj then
            
            if  IsStalker(obj) and obj ~= db.actor and obj:alive()  and is_object_online(obj) then    --только сталкеры, живые и с gamedata
                
                local PistolSlot = obj:item_in_slot(1)        --ругается :(
                local AutomaticSlot = obj:item_in_slot(2)
                
                if (PistolSlot and PistolSlot:id() == nil) and (AutomaticSlot and AutomaticSlot:id() == nil) then 
            
                -- тут спавним оружие и патроны
                end
            end
        end
    end

Спасибо за внимание.

PS: забыл указать версию: Зов Припяти, 1.6.02

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

Tonny, вот, как проверить, есть ли оружие в 1 и во 2-ом слоте:

local weapon_1 = db.actor:item_in_slot(1)
local weapon_2 = db.actor:item_in_slot(2)
if (db.actor:active_slot()==1 and weapon_1) and (db.actor:active_slot()==2 and weapon_2) then
--\тут спавним оружие и патроны
end

Теперь под себя подгоняй.

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

Tonny,

[error]Description : l:\stalker-cop\gamedata\scripts\ts_mod_cop.script:230: attempt to call method 'item_in_slot' (a nil value

local obj = alife():object(a)
...
local PistolSlot = obj:item_in_slot(1)        --ругается :(

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

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

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

SkyLoader

Как раз была проблема в адаптпции под другого сталкера :)

 

malandrinus

Спасибо, понял, помогло.

 

Вопрос N3: Для серверных обьектов можно получить информацию о том, есть ли у них оружие?

Вопрос N4: Насколько понимаю, для функции alife():create всё равно - серверный обьект или клиентский, так как передаётся его id, которое одинаковое, так?

Вопрос N5: Можно ли перебрать клиентские обьекты менее ресурсоёмко, чем через перебор всех 65534 серверных? Т.е. не через for i = 1,65534 do ....

 

Спасибо за внимание.

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

Tonny,перебираешь серверные объекты. Если объект существует и является оружием и его parent_id равно id твоего npc,то значит у этого npc имеется оружие.

4.Так.

5.Обычно клиентские объекты перебирают так - for k,v in pairs(db.storage) do...

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

Tonny,

Вопрос N3: Для серверных обьектов можно получить информацию о том, есть ли у них оружие?

Вопрос N5: Можно ли перебрать клиентские обьекты менее ресурсоёмко, чем через перебор всех 65534 серверных? Т.е. не через for i = 1,65534 do ....

3) перебор с поиском по родительскому id, как выше подсказали. Можно и по-другому. К примеру, при переходе в оффлайн запоминать ствол в нетпакете серверного объекта. Или вообще сохранять там весь инвентарь. Однако зачем это надо? В оффлайне неписи воевать не могут. Для того, чтобы в оффлайне что-то происходило, надо писать это самому, как это сделано в АМК.

5) нет, если надо перебрать именно все, то иного способа нет. Но опять же, перебор всех объектов - крайне порочная практика. Годится только для стартовой инициализации, которая выполняется один раз или очень-очень редко. Если вдруг возникла необходимость перебрать все объекты, то либо для решаемой задачи производительность не важна, либо выбран неверный способ решения.

 

Charsi,

5.Обычно клиентские объекты перебирают так - for k,v in pairs(db.storage) do...

Так можно перебрать не все, а только те, у которых есть логика.

 

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

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

Возможно это обсуждалось, но я не нашёл.

по какой причине возникает этот лог:

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

87728-stalker.gif
Ссылка на комментарий

ФеНиКс, возможно, что ошибка в грамматике конфигов, ну и бывает в скриптах.

antreg, откуда ты знаешь, что только из за этого? Такой вылет может произойти везде.

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

ФеНиКс,

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

 

Если укажешь при каких обстоятельствах вылет и на какой версии ТЧ делаешь эксперименты, то будет более ясно. Предположительно, работаешь на чистом ТЧ без АМК. Очень характерный, в этом случае, вылет, если назначить торговцем простого НПС без присвоения ему класса трейдера и "нагрузить под завязку" хабаром и оружием.

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

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

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

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

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

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

Войти

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

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

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