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

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

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

Подскажите, что не правильно сделано:

 

local con = get_console()


local ren = con:get_string("renderer")
if ren = renderer_r2 then
    news_manager.send_tip(db.actor, "%c[0,0,255,25]рендер р2", nil, nil, 20000)
end

 

 

Какая ошибка - в логе не указывается.

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

Stiingray, неправильно написано условие.

if ren == "renderer_r2" then 

В логе должно быть как минимум то, что файл скрипта невалидный. Используй для проверки синтаксиса script Syntax Checker.

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

Gun12, только сейчас добрался до твоего 2-го экономного варианта конвертации таблиц в строку (первый работает без проблем). Сначала не мог понять, почему пропускаются проверки элементов извлеченных таблиц, вроде бы внешний вид такой же, как и до преобразования в строку... Оказалось, на выходе toTable получаем стринги (как я понял). Наверное, где-то не хватает tonumber или ещё чего. Подскажи, плиз.

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

Да, действительно я забыл про tonumber.

Найди в функции toTable :

 

for m in v:gmatch('%S+') do
    t2[k[n]] = to10(m)
    n = n+1
end

 

и замени на :

 

for m in v:gmatch('%S+') do
    local x = to10(m)
    t2[k[n]] = tonumber(x)
    n = n+1
end

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

Gun12, я уже пробовал вставлять tonumber, но на выходе большие числа были не те, что записывались в строку. Если я всё правильно вставил, то последнее твоё решение не помогло. Может дело во втором аргументе в tonumber(x, y) ?

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

Не нужен там никакой второй аргумент. У меня всё работает.

Можешь показать свою таблицу? Или дай несколько чисел, которые не правильно переводятся.

 

Да, ещё найди и замени вот ещё что (там лишнее поле создаётся) :

 

for i = 0, 9 do
    t100['0'..i] = char(240+i)
end

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

Gun12, попробовал поставить девятку. Результат не изменился. К примеру загоняю в строку: table1 = { [1]={id=5000,s=1,art=100} }. На выходе имеем: { [1]={id=800,s=1,art=160} }

Может конечно это у меня что-то не так сростается... но 1-й вариант ведь работает... В любом случае спасибо за помощь!

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

Твоя таблица у меня работает нормально.

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

Отправил тебе ЛС. Смотри там.

--------

Ага, таки ты всё-таки наисправлял... Пожалуйста.

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

Stiingray, неправильно написано условие.if ren == "renderer_r2" then 

В логе должно быть как минимум то, что файл скрипта невалидный. Используй для проверки синтаксиса script Syntax Checker.

Спасибо, исправил.

 

Теперь появилась другая проблема, когда назначаю данную проверку на нажатие клавиши в меню, то сообщение почему-то не выводится:

 

 

if level.present() and (db.actor ~= nil) and db.actor:alive() then

            if dik == DIK_keys.DIK_NUMPAD1 then

                 local con = get_console()

local ren = con:get_string("renderer")

if ren == renderer_r2 then

     news_manager.send_tip(db.actor, "%c[0,0,255,25] р2", nil, nil, 20000)

end

            end

        end

 

 

 

Но, без проверки условия значение ren выводится:

 

if level.present() and (db.actor ~= nil) and db.actor:alive() then

            if dik == DIK_keys.DIK_NUMPAD2 then

                local con = get_console()

local ren = con:get_string("renderer")

     news_manager.send_tip(db.actor, "%c[25,240,25,25] рендер "..ren.."", nil, nil, 20000)

            end

        end

 

 

ЗЫ Проверял Script syntax checker'ом

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

Stiingray, и что же ты исправил, если ошибка, на которую тебе указали так и осталась?

Данной условие:

if ren == renderer_r2 then
никогда не выполниться, т.к. ты пытаешь сравнить строку в переменной ren со значением nil, которое присвоено переменной renderer_r2. Поэтому сообщение и не выводится.

 

Теперь о менее приятном:

Во-первых, цитировать посты полностью не нужно, достаточно просто указать ник.

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

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

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

Решил вернуть имена и описания для каждого тайника (как это было в ТЧ): в trasure_mananger.script заменил в функции CTreasureManager:give_treasure(treasure_id, spawn) локальную local text = "Тайник\\n%c[255,155,238,23]" на local text = "%c[255,238,155,23]"..game.translate_string(self.name).."\\n".."%c[default]"..game.translate_string(self.description).

После функцию function CTreasureManager:__init()

function CTreasureManager:__init()


    self.name = utils.cfg_get_string(ini, section, "name", nil, true, "")
    self.description = utils.cfg_get_string(ini, section, "description", nil, true, "")
    self.items_spawned = false
    self.check_time = nil
    self.secrets = {}
    self.secret_restrs = {}
    self.items_from_secrets = {}
end

 

Добавил файл-описания st_trasure.xml из ТЧ и сделал чтоб его читала игра, но при начале новой игры получаю вылет:

 

FATAL ERROR

[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.k.e.r. - Зов Припяти\gamedata\scripts\utils.script:170: attempt to concatenate local 'section' (a nil value)


stack trace:

001B:69737365 nvd3dum.dll

 

Как я понял, нужно для каждого тайника в st_trasure.xml нужно создать секцию описания name и description? Или не в ту сторону копать начал и описания от таких манипуляций я не получу?

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

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

На сколько я понял, ты ничего не понял.

self.name = utils.cfg_get_string(ini, section, "name", nil, true, "")

self.description = utils.cfg_get_string(ini, section, "description", nil, true, "")

Вылет происходит из-за того, что ты передаёшь в функцию cfg_get_string первые два аргумента, которые не определены, другими словами их значения nil, о чём, собственно, в логе и сказано. Поэтому, если со скриптами не дружишь, то методом тыка можно долго добиваться результата.
Ссылка на комментарий

Работает ли в Сталкере библиотека ввода-вывода io?

 

Не уверен, но кажется только в ЗП.

ColR_iT

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

Пробую положить npc в анимацию после попадания.

B xr_motivator.script после function motivator_binder:hit_callback(obj, amount, local_direction, who, bone_index)callstack() поместил свой код.
.

if (bone_index == 15 or bone_index == 19) then 	--// попаданиe в кости головы.
local math = math
local rnd = math.random(1,10)
local say = ""
	
	if rnd <= 7 then   --// 70%  will result in heavy injury (Health reduced with script to 0.10%).
	obj.health =- 0.9
	say = "Heavy Injury"
--//state_mgr.set_state(obj, "wounded_heavy_3")
		obj:play_cycle("idle_to_wounded_1")

		elseif rnd == 8 or rnd == 9 then  --// 20% chance it will result in temporary stun (Play sitting/sleeping animation). 
		say = "Temporary Stun"
--//state_mgr.set_state(obj, "sit_ass")
		obj:play_cycle("idle_to_wounded_0")

		elseif rnd == 10 then  --// 10% chance it will just bounce off.
		say = "Ricochet"
	end
	news_manager.send_tip(db.actor, say, nil, nil, 2000)
end

Пробовал со state_mgr.set_state(obj, "sit_ass"), анимация начинает играть но быстро прерываетсям, наверное покрывается со state с более высоким приоритетом.
Тоже самое с obj:play_cycle("idle_to_wounded_0"), начинает играть и быстро прекращается.

 

Но если убрать все вражеские отношения (Чтобы враги не отвлекались) и стрельнут по npc  то анимация будет проигриватся корректно и раз положены в анимацию npc  в ней и останется.
Eсть ли какой то способ чтобы npc остался в этой анимации и не прерывал ее.

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

Не особо понимаю что значит "захватить его под скрипт", какие то примеры этого захвата под скрипт? И если можна так объяснить как для очень нового, я со скриптами от нескольких дней только знакомлюсь.

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

Тебе нужно добавить схему поведения. Или, возможно, допилить схему xr_wounded, чтобы она заработала так, как тебе нужно. Примеров таких схем в самой игре предостаточно, но если ты со скриптами несколько дней, то сложновато будет.

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

Речь была про функцию io...

ЗП, ЧН..

ТЧ, только в правленой версии...

6 патч от Macron-а?

Железо: Intel Core i5 9400F / 16Gb DDR4 2400MHz / SSD NVMe M.2 Samsung 970 EVO Plus 256Gb / GF GTX 1050Ti 4Gb Ось: Win10x64

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

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

Что-то никак не могу найти, "то ли лыжи не едут, то ли..."  :)

В общем, можно ли проверить существование файла и папки?

userbar368.png

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

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

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

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

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

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

Войти

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

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

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