Jump to content

Nazgool

Жители
  • Content Count

    618
  • Joined

  • Last visited

  • Days Won

    1

Nazgool last won the day on March 9 2014

Nazgool had the most liked content!

Community Reputation

246

About Nazgool

  • Birthday 10/04/1972

Контакты

  • Сайт
    http://
  • ICQ
    589382181

Информация

  • Реальное имя
    Сергей
  • Город
    Киевская обл. г.Мироновка
  • Интересы
    Lua

Recent Profile Visitors

1,239 profile views
  1. dsh Да для меня написать подобный код - не проблема. Печально только что никому сейчас это не нужно Да что там... давно уже никому не нужно.
  2. Не, всё нормально вроде. Но... Ну не принято так что-ли. Ну когда много раз вызывают одно и то же, то как-бы принято кэшировать. Не я же придумал. function sad_predateli_pda() local actor = db.actor if actor ~= nil and actor:object("sad_mudak_pda") ~= nil and not actor:has_info("sad_predateli_info") then actor:give_info_portion("sad_predateli_info") end end
  3. Ну если так не подходит, то тогда (по степени сложности) нужно подумать над тем, чтобы переписать функцию '__index'. Как следующий в цепочке ивентов. Или тоже не вариант?
  4. dsh Всё просто кажется сложным. На самом деле обычно не хватает времени разобраться. А дела обстоят так. Действительно, у таблицы 'db' существует метаблица, которая посредством метаметода '__index' ссылается на глобальную таблицу '_G'. Поэтому совершенно естественно, что при запросе несуществующего поля таблицы 'db', поиск поля с таким именем происходит в таблице, на которую указывает '__index'. Т.е. в таблице '_G' И это не прихоть игры, таковы законы Lua. Любой модуль (module) при указании 'package.seeall' будет искать "недостающие" поля в таблице '_G'. И избавиться от такого поведения (как вы говорите) можно совершенно стандартными способами Lua. Для это существую стандартные функции Lua - rawget и rawset. Т.е. давайте перепишем Ваш пример так: rawset(db, 'actor_test',nil) _G.actor_test = "shit" И теперь напечатайте: log3( "dsh: actor_test = %s", tostring( rawget(db.actor_test))
  5. Dennis_Chikin Я хоть и ответил, но до чертиков в интересно, а что же такое случилось с lua, что в загалi возник такой вопрос? Это к чему? Ты (Dennis_Chikin) такой человек, что (все уже привыкли, что знаешь много) вроде такие вопросы от тебя слышать как-то... необычно что-ли? Ну как-то так выходит.
  6. Jekyll Я могу сейчас всё расписать от и до. Только один вопрос - Почему именно до двадцати? for t = 1,20 do В чём сакральная задумка? P.S. Нет, я и так вижу что человек не разбирается. Просто хотелось определиться что именно нужно. P.P.S. А что это с редактором? Жесть какая-то при изменении. Но это в общем-то не особо важно.
  7. Доводилось использовать несколько версий lua ТЧ а также стандартные 5.1 - 5.3 Различий не замечал. А записи абсолютно эквивалентны. "k" и "v" (да как угодно их называй) - это локальные переменные внутри цикла. Функция "pairs (t)" в любой версии (по крайней мере использованных мною) возвращает три значения - функцию next, таблицу t и nil. Т.е. for k, v in pairs(t) do можно переписать как: for k, v in next,t,nil do И теперь видно, что мы имеем дело с функцией "next" Т.е. твой вопрос переадресовывается от функции "pairs" к функции "next" Впрочем и за next-ом различных версий я тоже ничего криминального не замечал, т.е. она как возвращала два значения, так и возвращает. Те самые "k" и "v" . А как ты их будешь использовать - это сугубо твоё дело. Хоть "k" и "_" , хоть "_" и "v" , хоть только "k".
  8. dPlayer Человек достаточно живучее существо (хотя хочется и отметить, что если бы у некоторых особей такое свойство отсутствовало, то мир бы только приобрёл от этого) Так что не переживай. Современная природа дает нам столько всякой гадости, о которой мы не догадываемся, что грунтовку можно считать растворителем этой гадости
  9. @UnLoaded, Нет, это не медвежья услуга, т.к. автор изначально хочет! чтобы при отсутствии значения бралось некое значение по умолчанию ("stalker") Т.е. такое действие не побочный эффект, а сделано намеренно. Вот если бы в исходном коде не было : if community == nil then community = "stalker" end то и я бы написал : ... and community_condition[community] Я всего-лишь подправил код так, чтобы исходная идея автора работала как можно надежнее.
  10. @UnLoaded, О чем вы говорите? Какая универсальная защита? Просто защита конкретной функции. Коих создается великое множество. И лично мне не хочется несколько раз возвращаться к переписыванию одного и того кода по нескольку раз. Поэтому лично я поступил бы именно в таком духе. Ну написал бы несколько вспомогательных функций типа iff(cond, a, - (кодеры поймут что я имел в виду) А насчет "медвежьей услуги". Я посчитал, что если напишу : -- тут что-то делать. лог, вылет, исправить или ничего не делать то, будет достаточно ясно. Видимо ошибался.
  11. @WinCap, Я понял о чем ты говоришь. Да, если ты используешь подобную функцию ограничено, и уверен что в будущем её не будут вызывать больше ниоткуда, что может привести к передаче "не тех" аргументов то можно оставить и так. Тогда, учитывая твоё объяснение, и запись : if community == nil then community = "stalker" end можно сократить до : community = community or "stalker" Но твоё объяснение всё равно не делает функцию абсолютно "безопасной". Твой код полностью опирается на данные таблицы community_condition. Поэтому нужно следить за тем, чтобы после добавления какой-либо группировки, не забыть прописать её и в этой таблице тоже. А сколько подобных таблиц может быть в файлах? И о всех нужно помнить? Поверь, такие мелочи со временем приводят к долгому и нудному обслуживанию кода. Вот ты сам говоришь, что функция character_community не возвращает "абы какие" значения. Т.е. программист позаботился о том, чтобы функция работала как можно надежнее. В твоей же функции, имхо, всё-равно остаются эти два слабых места. Первое - я бы никогда не был уверен на 100% что придут именно те аргументы. Второе - даже если придут "те", то я не был уверен на 100% что они обязательно будут в таблице character_community. Поэтому более надежный вариант можно было бы написать примерно так : function set_weapon_drop_condition(item, community) local data = type(community_condition) == 'table' and community_condition[community or "stalker"] -- я тут всё в кучу собрал, но можно и раздельно ошибки отлавливать if not (type(item) == 'userdata' and type(item.set_condition) == 'function' and type(data) == 'table' and type(data.min) == 'number' and type(data.max) == 'number') then return -- тут что-то делать. лог, вылет, исправить или ничего не делать end local condition = math.random(data.min, data.max) / 100 item:set_condition(condition) end Этот вариант закрашить можно только передав юзердату, которая также имеет метод set_condition и с "не той" сигнатурой. А в оригинале такой нет.
  12. @WinCap, Ну во-первых он может принимать "ряд" любых типов значений lua кроме nil. См. : if community == nil then Во-вторых. Где у тебя в коде написано, что "заранее известных" и тем более "строковых значений"? Вот в моем варианте это всё предусмотрено. А покажи где у тебя? В третьих (как и во-первых), если он не определен, или определен не так как ожидалось (т.е. это либо не строка, либо строка, которой нет в списке таблицы "community_condition"), то ту два варианта - либо определять значение "насильно" (как ты сдедал): then community = "stalker" Либо вылетать. Ты уж определись чего нужно-то. Исходя из твоего кода выходит что первый вариант. Что собственно я сделал, чтобы не отходить от оригинала. Так что твоё несогласие с моим вариантом считаю не достаточно (вернее совсем не) обоснованным. P.S. Вольность типов, количества и значений переменных в lua несомненно делает его очень гибким. Но только не в "точных науках". Например мне приходилось, для исключения двусмысленности, создавать ряд сигнатурных функций.
  13. Говорю не для того чтобы обидеть, а только ради благих намерений. Хотя и понимаю, что оными выстелена дорога в ад, поэтому как уж получиться. Не раз уже говорил, и всегда недоумевал от столь бесполезного кода (и подобный встречается довольно часто) : if community == nil then community = "stalker" end Что такого полезного тут проверяется? Что значение "community" не "nil"? Ну хорошо. Оно не "nil". А, скажем, "false". И что тогда будет? community_condition[community].min будет фактически равно community_condition[false].min К чему это приведет? Рассказывать, думаю, не нужно. Да, значения не то что нужно, а просто необходимо проверять! НО! Делать это максимально полезным что ли. В данном случае сам код подсказывает как это сделать У тебя уже есть таблица "community_condition", в которой заданы поля, ключи которой и определяют весь необходимый диапазон значений переменной "community" Поэтому сделав : community = community_condition[community] and community or "stalker" Решаются абсолютно все проблемы как с типом, так и со значением переменной "community". Ну или на любителя (эквивалент предыдущему коду): if not community_condition[community] then community = "stalker" end
  14. Сын купил диск, и ему что-то не понравилось. Поэтому я зашел в гугл с вопросом, "как сделать чтобы..." Это было в 2008-м вроде. С тех пор... изучил Lua, файлы, структуру и возможности игры. Поучаствовал в разных проектах (глобальных и локальных), И ни разу не жалею, так как считаю что это не только игра. Это некое сито, сквозь которое просеилось всё лучшее что было в моддинге на тот момент. Талантливые люди, сумасшедшие (и несбыточные на тот момент) идеи, которые решались с таким энтузиазмом, который покроет все те фиксы, что решают ТЕ! проблемы на данный момент. Ностальжи как ни крути В общем спасибо всем. И с юбилеем конечно.
  15. Это аналог require(module_name) из академического.. lua. Идет подгрузка модуля(файла) с именем module_name.

AMK-Team.ru

×
×
  • Create New...