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

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

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

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

 

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? Или не в ту сторону копать начал и описания от таких манипуляций я не получу?

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

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

Raisen

если мне помнится, там надо захватить его под скрипт.. Чтоб стейт отработал корректно...

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

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

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

ЗП, ЧН..

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

6 патч от Macron-а?

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

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

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

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

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

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

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

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

Войти

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

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

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