-
Число публикаций
618 -
Регистрация
-
Последнее посещение
-
Дней в топе
1 -
AMKoin
37 [Подарить AMKoin]
Весь контент пользователя Nazgool
-
Одному ключу можно присвоить только одно значение. И как же то, что мы уже разобрали ? -----|----------| pos |-15.300880| -----|----------| И всё. В 'pos' записана только координата 'x' Значит и 'ps' будет иметь значение ..... какое?
-
Нужно в доки добавить новое определение. Давай разбирать local ps = pos_tbl[set_0 .. math.random(1,4)]["pos"] Выходит, что 'ps' это значения поля таблицы 'pos_tbl[какая-то_рандомная]' с индексом ['pos'] А что у тебя записано в этом поле? Скажем таблица 'pos_tbl[какая-то_рандомная]' это 'set_01'
-
@Kober(BRUC), Уже теплее Итак, ты пишешь : ps[1],ps[2] Т.е. подразумеваешь, что 'ps' таблица, и получаешь значения полей [1] и [2]. А что же у тебя всё-таки 'ps'? Таблица или не таблица?
-
@Kober(BRUC), Ты немного не понял. Я говорил А про сепараторы - это было для того, чтобы ты понял как определить где же поля. Хорошо. Давай разбирать. Но прежде, как правильно сказал abramcumner, прочитай. Вот на русском http://www.lua.ru/doc/2.5.7.html set_01 = {lvid=261995, gvid=187, pos = -15.300880,5.824976,292.832062} Ищем разделители. У тебя это запятые (но могут быть и точки с запятой). Значит у тебя будет 5 полей : lvid=261995 gvid=187 pos = -15.300880 5.824976 292.832062 Ты уже почитал доки ( ) и знаешь, что поля записываются как пара "ключ=значение" Разберем эти поля: ключ | значение | -----|----------| lvid | 261995 | -----|----------| gvid | 187 | -----|----------| pos |-15.300880| -----|----------| | 5.824976 | -----|----------| |292.832060| ----------------- Как видишь в последних двух случаях ключи не указаны, но после прочтения доков ты моментально поймешь, что ключи будут инициализированы самой lua автоматически, по правилам индексированного массива. А именно: -----|----------| [1] | 5.824976 | -----|----------| [2] |292.832060| ----------------- А теперь повторюсь : в выражении vector():set(ps) и с какими аргументами сколько аргументов передаются при вызове метода vector():set(...)
-
Об этом я хотел сказать чуть позже. После того как с основами построения таблиц и обращения к полям всё станет ясно. Ну чтобы не вываливать всё сразу.
-
@Kober(BRUC), С одним разобрались ) Теперь смотри на это : vector():set(ps) и разберись что такое 'ps' Только не спеши. Мы все понимаем что ты хотел сделать, но получилось не так. Подсказка если перевести 'fieldsep', то выйдет 'разделитель полей' таблицы. Т.е. либо запятая, либо точка с запятой. И теперь посмотри какие поля у тебя в таблицах 'set_0*'
-
@Kober(BRUC), Разберись, какие значения операндов в set_0 .. math.random(1,4) abramcumner Решения давать не хорошо Человек хочет свое делать. А как он будет делать, если пока не понимает основ? Там же ещё ошибки есть.
-
Язык Lua. Общие вопросы программирования
Nazgool ответил на тему форума автора Malandrinus в Скрипты / конфиги / движок
Да тут и дискутировать особо не о чем. Только теория. Практическое использование подобного не встречал, да и на граблей на этой основе тоже. Это так, из раздела "Занимательная наука" )) -
Язык Lua. Общие вопросы программирования
Nazgool ответил на тему форума автора Malandrinus в Скрипты / конфиги / движок
Говорим про nil, а Desertir напомнил про неэквивалентность. Вот я и вспомнил, хотя уже когда-то писал: Запись : function x() return end не эквивалентна : function y() return nil end Вроде бы и одинаковы : print(x()==nil) --> true print(y()==nil) --> true Но : print(select('#', x())) --> 0 print(select('#', y())) --> 1 в первом случае void, во втором nil - как совершенно определенный тип значения -
Язык Lua. Общие вопросы программирования
Nazgool ответил на тему форума автора Malandrinus в Скрипты / конфиги / движок
Позволю и себе высказать мнение о проверке на nil в примере Kober(BRUC). Считаю что такая проверка абсолютно бесполезна. Ну хорошо. db.actor не nil. Остается 7 типов значений (перечислять не буду) Как это поможет, если db.actor окажется, например, числом? К этому числу будет применен метод position, ну или какой другой. Результат всё равно не изменить. Крах. Тут просто, видимо, разработчики предполагали что при наявности actor-a в таблице db обязательно будет создано поле actor, и его значением обязательно будут данные actor-а. Значит достаточно проверить: есть данные этого поля - есть actor нет данных - нет actor-а Поэтому руководствуясь "пишем в коде то, чего требуем", для этого случая достаточно проверки if db.actor then ... Именно это и требуется - проверка на то, что там есть реальные(не nil, а прицепом и не false) данные. Другое дело, когда очень хочется сравнить с чем-то, то вместо сравнения с nil, гораздо полезнее поставить сравнение с типом "userdata". Так вариантов для прокола станет намного меньше. -
Да нормально воспринимается и первый и второй вариант. Тут смотря кто как воспринимает. Думаю что если Lua позволяет такую "вольность" в синтаксисе, то каждый и выбирает для себя наиболее приемлемый вариант. Скорость Lua достаточно высока чтобы не обращать внимания на создание в стеке таких локальных переменных. А если учитывать что в Сталкере компилируется в luajit, то и подавно. И в конце концов Lua это высокоуровневый язык, и следить из lua скриптов что там делается на уровне стека и дальше - это "ниже его достоиства" Если кто-то слишком заботиться о скорости, то пусть пишет код на С. А кто умеет писать быстро на Lua, тот напишет как нужно. Тут скорее всего всё упирается в квалификацию скриптера. Если скриптер образованный, то ему по силам прочитать любой вариант кода. Ну а если нет, то ... как там Ленин говорил? Учиться?
-
Это вопрос решался (и решился) достаточно давно. Поищите сами, ну или я найду дам ссылку на посты мои (про coroutine) и её возможности и Artos-а о реализации этой возможности. Речь идет о распределении с помощью coroutine по времени или объеме обрабатываемых данных. Будь то массовый спавн, перебор for i=1, какое-то очень большое число, или ещё что-то тяжелое, всё это распределяется на выбранное время, кол-во апдейтов, объем информации...или как-то ещё. ..... Ссылку на пост Artos-a нашел http://www.amk-team.ru/forum/index.php?showtopic=11584&page=6#entry641931 О. а вот что и я накалякал http://www.amk-team.ru/forum/index.php?showtopic=7450&page=16#entry622983 Всего 4 года прошло
-
Хочу кое-что добавить
-
[SoC] Ковыряемся в файлах
Nazgool ответил на тему форума автора Halford в Скрипты / конфиги / движок
Marafon6540 С вероятностью 60% вызовется функция actor_in_zone -
Ок. Подготовлю выложу.Ведь я так понимаю, что нужно и расписать всё "по понятиям" Вроде готово. Как-то так
-
Ну это кому и как приятнее будет. Winsor, в принципе уже основное определил. Нужно сделать прокси таблицу в которой хранить ссылку на реальную таблицу. В этой прокси таблице завести уникальные поля, случайный доступ к которым будет максимально исключен. В таких полях можно хранить всякие служебные данные, как например длина таблицы. Также нужно определить для прокси и метатаблицу с полями (как минимум) __index и __newindex. В __newindex сделать слежение за размером таблицы при добавлении\удалении полей. Объявлять таблицу нужно с использованием специальной обёртки. эта обертка, при объявлении таблицы, присвоит переменной значение не реальной, а прокси-таблицы. Теперь при обращении к созданной таблице (а реально к прокси) каждый раз будет вызываться метаметод, так как таких полей в проски, к которым вы обращаетесь нет (на уникальные ключи попасть будет крайне сложно). Но тут минусы не ограничиваются Для работы с такими таблицами нужно "научить понимать их" соответствующие функции. А именно : все из библиотеки "table" pairs ipairs next rawget rawset unpack getmetatable setmetatable В принципе там изменить быстрее чем говорить об этом Ну и последнее. Я это уже давно написал и пользуюсь. Так что если нужно, то поделюсь примером.
-
@FonSwong, Оператор # может применяться к любой таблице. Если в таблице есть индексированная часть, то оператор определит её размер. В твоём случае ключами таблицы являются ID, которые не создают индексированного массива. Т.е. ключи таблицы не соответствуют порядку ключей массива 1,2,3,4,5,6, ... и т.д. по порядку. А что-то вроде 1523, 907, 23120 и т.п. Поэтому когда ты определяешь длину массива оператором #, то длина будет равна нулю (если конечно не будет ID с номером 1). А math.random не понимает единственного аргумента 0. Если первым аргументом задан 0 (являющийся началом интервала случайных чисел), то должен быть задан и второй аргумент, обозначающий конец этого интервала. Отсюда и ошибка - bad argument #1 to 'random' (interval is empty)
-
Поскольку Сталкер работает с кодировкой ANSI, и последовательность символов в этой кодировке вполне линейна (кроме символов 'Ё' - 'ё'), то функции 'lower' и 'upper' можно записать альтернативно : Ну например так : Ну а подключать можно по-разноному. Как *script, или как *.lua, или ... да мало ли кому как нужно. Что значит какая? Первая ссылка это учебник по lua 5.1 плюс некоторые моменты про lua 5.2 А вторая - справочник по lua 5.1 взятый из руссифицированной сборки LuaForWindows. Обе пока актуальны. Не, ну это уже ... сами назовите как-нибудь. Написать выходит ерунда. Главное правильно презентовапть. Да-а-а. Напиши, отдай, а теперь ещё разжуй и вообще "сделай всё за меня". Так что-ли?
-
BFG Тут очень похоже на программирование. Переменная объявлена. Из названия темы "Ищу файлы / моды / аддоны" ключевое слово "Ищу". А её значение "Папку bin 6 патч". Т.е. "Ищу папку bin 6 патч". Так, в принципе, и следовало написать, но в таком варианте даже интереснее
-
@UnLoaded, Мало информации. Эти binder-ы у тебя по-порядку срабатывают? Это я к чему? Вот есть у тебя 20 binder-ов. Как ты знаешь что отработали все 20, а не какой-то 2 раза, а какой-то ни разу? Другими словами, можно как-то понять, когда нужно выводить максимальное значение?
-
[SoC] Ковыряемся в файлах
Nazgool ответил на тему форума автора Halford в Скрипты / конфиги / движок
@Maksim-modmeiker, А как вообще ГГ начинает курить? Ты выбираешь пункт в меню типа , - "Покурить". Или ГГ начинает курить автоматически через какое-то время? Или ещё как-то? Как? -
Даже обидно как-то. Ну ладно, допустим я этого никогда не знал. И решил проверить. Написал бы что-то вроде : function f(...) print(arg and arg.n) end f(1,2,3) И в SciTE (читать стандартном lua) действительно увидел бы таблицу 'arg' с тремя полями. Но вот запустив этот же код в игре (print у меня работает как log), напечатало бы 'nil' Почему и сказал
-
@-StalkMen-, А чего сразу подводные? Тут надводные Как Lua поймет что такое 'arg' в выражении 'unpack(arg)' ? Сначала нужно эту переменную определить function bind_function(func,...) local arg = {...} return function () return func(unpack(arg)) end end То же самое нужно сделать и в функции 'bind_member' Сразу отвечу на возможный следующий вопрос. Стандартная переменная 'arg' в Lua vs STALKER не работает. Поэтому таблицу с переменным количеством аргументов нужно определять самому. В принципе это можно считать подводным камнем )).
-
@Maxwel, Исправь пока в 209-й строке elseif info_id == "ui_car_body_hide" and used_box then на elseif carbody_addons and info_id == "ui_car_body_hide" and used_box then И посмотри что будет 250 метров качать как-то не хочется, поэтому что за инфопорции, где и когда выдаются, и вообще систему не знаю.
-
Понял про что ты. Ну тогда coroutine это не то, что тебе нужно
УЧИМСЯ МОДДИНГУ
ИГРАЕМ В МОДЫ НА ТЧ
ИГРАЕМ В МОДЫ НА ЧН И ЗП
- [ЧН] OGSM CS 1.8 CE Fixes
- [ЧН] HARDWARMOD 3.2
- [ЗП] The Long Road
- [ЧН] New vision of War
- [ЧН] Old Good Stalker Mod - Clear Sky
- [ЗП] Unofficial Patch
- [ЗП] Смерти вопреки
- [ЗП] Контракт на хорошую жизнь
- [ЗП] Shoker Weapon Mod 2.1
- [ЗП] Hardcore pack for SGM 2.2
- [ЗП] Контракт Синдиката
- [ЗП] Клондайк 2.0
- ...и другие моды
ПОЛЕЗНОЕ И РАЗНОЕ