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

Nazgool

Жители
  • Число публикаций

    618
  • Регистрация

  • Последнее посещение

  • Дней в топе

    1
  • AMKoin

    37 [Подарить AMKoin]

Весь контент пользователя Nazgool

  1. Nazgool

    Скриптование

    Одному ключу можно присвоить только одно значение. И как же то, что мы уже разобрали ? -----|----------| pos |-15.300880| -----|----------| И всё. В 'pos' записана только координата 'x' Значит и 'ps' будет иметь значение ..... какое?
  2. Nazgool

    Скриптование

    Нужно в доки добавить новое определение. Давай разбирать local ps = pos_tbl[set_0 .. math.random(1,4)]["pos"] Выходит, что 'ps' это значения поля таблицы 'pos_tbl[какая-то_рандомная]' с индексом ['pos'] А что у тебя записано в этом поле? Скажем таблица 'pos_tbl[какая-то_рандомная]' это 'set_01'
  3. Nazgool

    Скриптование

    @Kober(BRUC), Уже теплее Итак, ты пишешь : ps[1],ps[2] Т.е. подразумеваешь, что 'ps' таблица, и получаешь значения полей [1] и [2]. А что же у тебя всё-таки 'ps'? Таблица или не таблица?
  4. Nazgool

    Скриптование

    @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(...)
  5. Nazgool

    Скриптование

    Об этом я хотел сказать чуть позже. После того как с основами построения таблиц и обращения к полям всё станет ясно. Ну чтобы не вываливать всё сразу.
  6. Nazgool

    Скриптование

    @Kober(BRUC), С одним разобрались ) Теперь смотри на это : vector():set(ps) и разберись что такое 'ps' Только не спеши. Мы все понимаем что ты хотел сделать, но получилось не так. Подсказка если перевести 'fieldsep', то выйдет 'разделитель полей' таблицы. Т.е. либо запятая, либо точка с запятой. И теперь посмотри какие поля у тебя в таблицах 'set_0*'
  7. Nazgool

    Скриптование

    @Kober(BRUC), Разберись, какие значения операндов в set_0 .. math.random(1,4) abramcumner Решения давать не хорошо Человек хочет свое делать. А как он будет делать, если пока не понимает основ? Там же ещё ошибки есть.
  8. Да тут и дискутировать особо не о чем. Только теория. Практическое использование подобного не встречал, да и на граблей на этой основе тоже. Это так, из раздела "Занимательная наука" ))
  9. Говорим про 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 - как совершенно определенный тип значения
  10. Позволю и себе высказать мнение о проверке на 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". Так вариантов для прокола станет намного меньше.
  11. Да нормально воспринимается и первый и второй вариант. Тут смотря кто как воспринимает. Думаю что если Lua позволяет такую "вольность" в синтаксисе, то каждый и выбирает для себя наиболее приемлемый вариант. Скорость Lua достаточно высока чтобы не обращать внимания на создание в стеке таких локальных переменных. А если учитывать что в Сталкере компилируется в luajit, то и подавно. И в конце концов Lua это высокоуровневый язык, и следить из lua скриптов что там делается на уровне стека и дальше - это "ниже его достоиства" Если кто-то слишком заботиться о скорости, то пусть пишет код на С. А кто умеет писать быстро на Lua, тот напишет как нужно. Тут скорее всего всё упирается в квалификацию скриптера. Если скриптер образованный, то ему по силам прочитать любой вариант кода. Ну а если нет, то ... как там Ленин говорил? Учиться?
  12. Это вопрос решался (и решился) достаточно давно. Поищите сами, ну или я найду дам ссылку на посты мои (про 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 года прошло
  13. Nazgool

    Скриптование

    Хочу кое-что добавить
  14. Marafon6540 С вероятностью 60% вызовется функция actor_in_zone
  15. Nazgool

    Скриптование

    Ок. Подготовлю выложу.Ведь я так понимаю, что нужно и расписать всё "по понятиям" Вроде готово. Как-то так
  16. Nazgool

    Скриптование

    Ну это кому и как приятнее будет. Winsor, в принципе уже основное определил. Нужно сделать прокси таблицу в которой хранить ссылку на реальную таблицу. В этой прокси таблице завести уникальные поля, случайный доступ к которым будет максимально исключен. В таких полях можно хранить всякие служебные данные, как например длина таблицы. Также нужно определить для прокси и метатаблицу с полями (как минимум) __index и __newindex. В __newindex сделать слежение за размером таблицы при добавлении\удалении полей. Объявлять таблицу нужно с использованием специальной обёртки. эта обертка, при объявлении таблицы, присвоит переменной значение не реальной, а прокси-таблицы. Теперь при обращении к созданной таблице (а реально к прокси) каждый раз будет вызываться метаметод, так как таких полей в проски, к которым вы обращаетесь нет (на уникальные ключи попасть будет крайне сложно). Но тут минусы не ограничиваются Для работы с такими таблицами нужно "научить понимать их" соответствующие функции. А именно : все из библиотеки "table" pairs ipairs next rawget rawset unpack getmetatable setmetatable В принципе там изменить быстрее чем говорить об этом Ну и последнее. Я это уже давно написал и пользуюсь. Так что если нужно, то поделюсь примером.
  17. Nazgool

    Скриптование

    @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)
  18. Поскольку Сталкер работает с кодировкой ANSI, и последовательность символов в этой кодировке вполне линейна (кроме символов 'Ё' - 'ё'), то функции 'lower' и 'upper' можно записать альтернативно : Ну например так : Ну а подключать можно по-разноному. Как *script, или как *.lua, или ... да мало ли кому как нужно. Что значит какая? Первая ссылка это учебник по lua 5.1 плюс некоторые моменты про lua 5.2 А вторая - справочник по lua 5.1 взятый из руссифицированной сборки LuaForWindows. Обе пока актуальны. Не, ну это уже ... сами назовите как-нибудь. Написать выходит ерунда. Главное правильно презентовапть. Да-а-а. Напиши, отдай, а теперь ещё разжуй и вообще "сделай всё за меня". Так что-ли?
  19. Nazgool

    Ищу файлы / моды / аддоны

    BFG Тут очень похоже на программирование. Переменная объявлена. Из названия темы "Ищу файлы / моды / аддоны" ключевое слово "Ищу". А её значение "Папку bin 6 патч". Т.е. "Ищу папку bin 6 патч". Так, в принципе, и следовало написать, но в таком варианте даже интереснее
  20. Nazgool

    Скриптование

    @UnLoaded, Мало информации. Эти binder-ы у тебя по-порядку срабатывают? Это я к чему? Вот есть у тебя 20 binder-ов. Как ты знаешь что отработали все 20, а не какой-то 2 раза, а какой-то ни разу? Другими словами, можно как-то понять, когда нужно выводить максимальное значение?
  21. @Maksim-modmeiker, А как вообще ГГ начинает курить? Ты выбираешь пункт в меню типа , - "Покурить". Или ГГ начинает курить автоматически через какое-то время? Или ещё как-то? Как?
  22. Nazgool

    Скриптование

    Даже обидно как-то. Ну ладно, допустим я этого никогда не знал. И решил проверить. Написал бы что-то вроде : function f(...) print(arg and arg.n) end f(1,2,3) И в SciTE (читать стандартном lua) действительно увидел бы таблицу 'arg' с тремя полями. Но вот запустив этот же код в игре (print у меня работает как log), напечатало бы 'nil' Почему и сказал
  23. Nazgool

    Скриптование

    @-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 не работает. Поэтому таблицу с переменным количеством аргументов нужно определять самому. В принципе это можно считать подводным камнем )).
  24. Nazgool

    Скриптование

    @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 метров качать как-то не хочется, поэтому что за инфопорции, где и когда выдаются, и вообще систему не знаю.
  25. Nazgool

    Скриптование

    Понял про что ты. Ну тогда coroutine это не то, что тебе нужно
×
×
  • Создать...