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

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

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

 

 

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

 

Именно. Но переделать партикл - не в моей компетенции.

А от кости или от камеры работать - не прокатит. Нужно именно работать с координатами.


 

 

тогда просто сними координаты ГГ и в демо рекорде+rs_stats координаты снега и посчитай разницу. А при спавне будешь делать эту поправку.

 

Вроде так и делал. Но видимо у меня с математикой плохо ^_^

Не соответствует правилам.

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

А от кости или от камеры работать - не прокатит.

Еще как прокатит. У них также есть свои координаты.

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

 

 

У них также есть свои координаты.

Они мало отличны от позиции самого ГГ.

Тут проблема осовная вот какая - сам партикл по сути своей "кривой" - со смещенным центром отрисовки...

Не соответствует правилам.

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

 

 

править xr партиклов в партикл-эдиторе.

 

К сожалению использовать СДК возможности нет.

Не соответствует правилам.

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

 

CRAZY_STALKER666, с телефона модостроем занимаетесь? Если интернет не позволяет скачать 300 мб дефолтного СДК, возьмите собранный из исходников, он весит мегабайт 20 что ли сжатый.

 

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

Вопрос: как можно получить в скрипте значение консольной команды? Вот например, если в игре в консоли написать команду(напр. g_always_run), то мы получим текущее значение параметра(on/off или 0.0-1.0). А как получить это значение в скрипте?

 

update::

@Eugen81, Спасибо. Полезно). А возможно как-то проверить какая клавиша назначена на действие( например bind sprint_toggle kX)?

con:get_integer(...) - думаю не возвратит код клавиши X. Просто сейчас проверить не могу.  

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

@TIGER_VLAD, код клавиши по экшену:

local dik = bind_to_dik(key_bindings.kSPRINT_TOGGLE)

 

upd: пардон, эта функция из X-Ray Extensions, в чистом ТЧ только dik_to_bind есть.

Изменено пользователем naxac
  • Спасибо 1

Аддон для ОП-2.09.2: Яндекс/Google/GitHub

naxac.gif

Ссылка на комментарий
как мне сделать дубликат
Как тебе уже сказали - именно перебирать и переписывать каждое вложение.
Есть не мало вариантов функций сделать это.
Но при условии, что у тебя достаточно простая таблица.
Сделать полное копирование сложной таблицы (реально полное) проблематично.
(По крайней мере необходимости в этом не было, поэтому не делал. Да и не буду)
Поясню что я подразумеваю под простой сложной таблицей и почему проблематично.
Всё дело в ключах таблицы.
Если ключи НЕ объекты - то всё нормально.
Вот вариант копирования простой таблицы, в котором ключи не объекты, а строки или числа.
Если значением ключа будет таблица, то создается копия этой таблицы.
И так рекурсивно для всех степеней вложенности :

function table.copy (tab)
    assert(type(tab) == 'table' , [[bad argument #1 to 'table.copy' => table expected, got ]] .. type(tab))
    
    local function tcopy(src)
        if type(src) ~= 'table' then
            return src
        end
            
        local new = {}
        
        for k, v in pairs(src) do
            new[k] = tcopy(v)
        end
        
        return new
    end
        
    return tcopy(tab)
end

 

Вот сложнее вариант.

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

function table.copy (tab, meta)
    assert(type(tab) == 'table' , [[bad argument #1 to 'table.copy' => table expected, got ]] .. type(tab))
        
    local function tcopy(src, meta)
        if type(src) ~= 'table' then
            return src
        end
            
        local new = {}
        
        for k, v in pairs(src) do
            new[k] = tcopy(v, meta)
        end
        
        if meta then
            setmetatable(new, tcopy(getmetatable(src), meta))
        end
        
        return new
    end
        
    return tcopy(tab, meta)
end

 

И вот теперь про самый сложный вариант и про "проблематично".
А если ключем будет таблица (не буду брать функции, потоки и тем более userdat-у).
По аналогии нужно копировать и эту таблицу-ключ.
Для этого нужно изменить :

new[k] = tcopy(v, meta)
-- на
new[tcopy(k, meta)] = tcopy(v, meta)

 

НО. При этом будет создана новая ключ-таблица, для которой не назначено никакого идентефикатора.
Т.е. она будет анонимна. Я вот о чем :

 
Например есть такой код :
t = {b=3}
x = {a=1, [t]=2}

y = table.copy(x)
Вариант с кодом - new[k] = tcopy(v)
В "new[k]"  будет использована ссылка на таблицу с именем "t".
Поэтому можно увидеть :
print(y[t]) --> 2
Но если использовать вариант с - new[tcopy(k, meta)] = tcopy(v, meta), то :
print(y[t]) --> nil
Обращаясь y[t] мы обращаемся к полю таблицы, именем которого является объект!!! с именем "t" .
Но в ключе была создана новая таблица(объект) - new[tcopy(k, meta)] - которая уже не является таблицей с именем "t".
Поэтому print(y[t]) --> nil - Действительно, ключ был переписан новым безымянным объектом.
 
Т.е. такое копирование ограничивает функционал, т.к. теперь нет поля y[t], к которому можно было просто обратиться.
И можно ли назвать подобное копирование копированием?
А если таких ключей множество, то при переборе for k, v in pairs как определить что этот ключ-таблица "k" именно то что нам нужно, если они все безымянны?
В функции копирования создавать сопоставления? Теоретически можно. А практически нужно?

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

То есть, в последнем случае, можно будет максимум сравнить? Ни использовать ни прочитать(без сравнения) нельзя будет?

Недоработка самого Lua?

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

То есть, в последнем случае, можно будет максимум сравнить? Ни использовать ни прочитать(без сравнения) нельзя будет?

Недоработка самого Lua?

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

Точно такой же проблемы можно добиться и с обычными числами. Создадим таблицу x вида x = {obj_id=32451}, где obj_id - это ид клиентского объекта.

 

Что надо сделать при создании дубликата этой таблицы? Должны ли мы просто создать y = {obj_id=32451}? Но тогда код

level.object(y.obj_id).unload_magazine() будет разряжать магазин у объекта из таблицы x.

 

Или надо заспавнить новый объект и тогда таблица y будут выглядеть y = {obj_id=2456} и магазины будут разряжаться у разных объектов.

А если obj_id сделать ключом, то естественно в таблице y не найдется запись с ключом 32451.

Ровно тоже самое проделал Nazgool с таблицами-ключами - он спавнил новые таблицы и старые ключи в новой таблице естественно не находились.

 

Или на самом деле это инвентарь НПЦ и надо создать еще одного НПЦ, а у него будет совсем другое содержимое инвентаря :)

 

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

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

Такой вопрос, если я использовал один раз функцию:

function copy_tbl(tbl)
local tbl2 = {}
	for k, v in pairs(tbl) do
		table.insert(tbl2, v)
	end
	return tbl2
end

То при повторном её вызове создастся уже новый объект-таблица, или же эта функция при повторном использовании вернёт уже ссылку на ту таблицу что была создана при 1 её вызове?

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

Тогда уж for i=1,#t - если, конечно, массив заполнен правильно и кол-во элементов в нём достаточно для того, чтобы заморачиваться скоростью.

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

@Kirgudu, Про оператор "#" я не так давно уже рассказывал. Это не надежно.

Поэтому всё-таки стоит пользоваться специально созданными для этого функциями ipairs и table.insert(remove)

Напомню

 

local t = {nil,nil,3}

for i = 1, #t do
    print(t[i])
end

--> nil
--> nil
--> 3

for i, v in ipairs(t) do
    print(i,v) --> ничего не печатает
end 
И хотя я считаю что работа оператора # более правильная, чем ipairs (как ни крути, но это массив. есть ключи 1.2.3 и есть соответствующее им lua-значения), он не гарантирует всегда правильной работы.
Но разработчики считают что nil не должен быть значением, поэтому пусть так и будет.
А в специальных случаях (как то мой пример выше) никто не запретит пользоваться # :)

 

 

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

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

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

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

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

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

Войти

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

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

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