-
Число публикаций
618 -
Регистрация
-
Последнее посещение
-
Дней в топе
1 -
AMKoin
37 [Подарить AMKoin]
Весь контент пользователя Nazgool
-
Язык Lua. Общие вопросы программирования
Nazgool ответил на тему форума автора Malandrinus в Скрипты / конфиги / движок
dsh Да для меня написать подобный код - не проблема. Печально только что никому сейчас это не нужно Да что там... давно уже никому не нужно. -
Не, всё нормально вроде. Но... Ну не принято так что-ли. Ну когда много раз вызывают одно и то же, то как-бы принято кэшировать. Не я же придумал. 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
-
Язык Lua. Общие вопросы программирования
Nazgool ответил на тему форума автора Malandrinus в Скрипты / конфиги / движок
Ну если так не подходит, то тогда (по степени сложности) нужно подумать над тем, чтобы переписать функцию '__index'. Как следующий в цепочке ивентов. Или тоже не вариант? -
Язык Lua. Общие вопросы программирования
Nazgool ответил на тему форума автора Malandrinus в Скрипты / конфиги / движок
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)) -
Язык Lua. Общие вопросы программирования
Nazgool ответил на тему форума автора Malandrinus в Скрипты / конфиги / движок
Dennis_Chikin Я хоть и ответил, но до чертиков в интересно, а что же такое случилось с lua, что в загалi возник такой вопрос? Это к чему? Ты (Dennis_Chikin) такой человек, что (все уже привыкли, что знаешь много) вроде такие вопросы от тебя слышать как-то... необычно что-ли? Ну как-то так выходит. -
Jekyll Я могу сейчас всё расписать от и до. Только один вопрос - Почему именно до двадцати? for t = 1,20 do В чём сакральная задумка? P.S. Нет, я и так вижу что человек не разбирается. Просто хотелось определиться что именно нужно. P.P.S. А что это с редактором? Жесть какая-то при изменении. Но это в общем-то не особо важно.
-
Язык Lua. Общие вопросы программирования
Nazgool ответил на тему форума автора Malandrinus в Скрипты / конфиги / движок
Доводилось использовать несколько версий 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". -
dPlayer Человек достаточно живучее существо (хотя хочется и отметить, что если бы у некоторых особей такое свойство отсутствовало, то мир бы только приобрёл от этого) Так что не переживай. Современная природа дает нам столько всякой гадости, о которой мы не догадываемся, что грунтовку можно считать растворителем этой гадости
-
@UnLoaded, Нет, это не медвежья услуга, т.к. автор изначально хочет! чтобы при отсутствии значения бралось некое значение по умолчанию ("stalker") Т.е. такое действие не побочный эффект, а сделано намеренно. Вот если бы в исходном коде не было : if community == nil then community = "stalker" end то и я бы написал : ... and community_condition[community] Я всего-лишь подправил код так, чтобы исходная идея автора работала как можно надежнее.
-
@UnLoaded, О чем вы говорите? Какая универсальная защита? Просто защита конкретной функции. Коих создается великое множество. И лично мне не хочется несколько раз возвращаться к переписыванию одного и того кода по нескольку раз. Поэтому лично я поступил бы именно в таком духе. Ну написал бы несколько вспомогательных функций типа iff(cond, a, - (кодеры поймут что я имел в виду) А насчет "медвежьей услуги". Я посчитал, что если напишу : -- тут что-то делать. лог, вылет, исправить или ничего не делать то, будет достаточно ясно. Видимо ошибался.
-
@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 и с "не той" сигнатурой. А в оригинале такой нет.
-
@WinCap, Ну во-первых он может принимать "ряд" любых типов значений lua кроме nil. См. : if community == nil then Во-вторых. Где у тебя в коде написано, что "заранее известных" и тем более "строковых значений"? Вот в моем варианте это всё предусмотрено. А покажи где у тебя? В третьих (как и во-первых), если он не определен, или определен не так как ожидалось (т.е. это либо не строка, либо строка, которой нет в списке таблицы "community_condition"), то ту два варианта - либо определять значение "насильно" (как ты сдедал): then community = "stalker" Либо вылетать. Ты уж определись чего нужно-то. Исходя из твоего кода выходит что первый вариант. Что собственно я сделал, чтобы не отходить от оригинала. Так что твоё несогласие с моим вариантом считаю не достаточно (вернее совсем не) обоснованным. P.S. Вольность типов, количества и значений переменных в lua несомненно делает его очень гибким. Но только не в "точных науках". Например мне приходилось, для исключения двусмысленности, создавать ряд сигнатурных функций.
-
Говорю не для того чтобы обидеть, а только ради благих намерений. Хотя и понимаю, что оными выстелена дорога в ад, поэтому как уж получиться. Не раз уже говорил, и всегда недоумевал от столь бесполезного кода (и подобный встречается довольно часто) : 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
-
Сын купил диск, и ему что-то не понравилось. Поэтому я зашел в гугл с вопросом, "как сделать чтобы..." Это было в 2008-м вроде. С тех пор... изучил Lua, файлы, структуру и возможности игры. Поучаствовал в разных проектах (глобальных и локальных), И ни разу не жалею, так как считаю что это не только игра. Это некое сито, сквозь которое просеилось всё лучшее что было в моддинге на тот момент. Талантливые люди, сумасшедшие (и несбыточные на тот момент) идеи, которые решались с таким энтузиазмом, который покроет все те фиксы, что решают ТЕ! проблемы на данный момент. Ностальжи как ни крути В общем спасибо всем. И с юбилеем конечно.
-
Язык Lua. Общие вопросы программирования
Nazgool ответил на тему форума автора Malandrinus в Скрипты / конфиги / движок
Это аналог require(module_name) из академического.. lua. Идет подгрузка модуля(файла) с именем module_name. -
@abramcumner, Да я бы я радостью отдал всё. Ну честно. Поверь. Да не фиг там прятать. Было бы только моё - отдал бы на другой же день. Меня держит только честь. Ну не могу я в принципе предать. Не моё это.У меня у самого руки чешутся отдать (и это кстати было моё убеждение). Но (укр) таке життя. Собака честь. УкраЇнці зрозуміють. Murarius Когда я прочитал Ваше сообщение http://www.amk-team.ru/forum/topic/13126-kurilka-programmistov/page-46#entry1066697 ... Нет. не так. Когда прочитал несколько первых строк Вашего сообщения ... и , не дочитав до конца я, воспринял всё сообщение "в штыки". И занял защитную позицию. И по инерции маховик репрессий покатился ... Извини дружище. Понял. Слава Богу не так как в истории, а вовремя Но потом, всё-таки здравый смысл (слава Богу ещё не покинул) заставил перечитать и понять. Ну в принципе я уже объяснил, что всё бы отдал ещё год назад (о Боже, а сколько назад всё это было сделано? - не помню) Но могу повторять в любой момент и в любом состоянии - честь превыше всего! (нужно было стать священником? ) TIGER_VLAD Після цього ти розумієшь що би я сказав, а ти би відповів
-
abramcumner , Murarius Вы, полагаю, очень хорошо умеете читать. Но, видать, внимать это не Ваша особенность Как-бы так случилось, что я простой исполнитель. Но есть вполне определённый руководитель проекта. И, есть всё-таки этика, следуя которой я не могу публиковать не согласованные с руководителем материалы. Это не закон. Это просто мои личные убеждения. А правильные они или нет - это не моя юрисдикция. Правила морали не позволяют мне опрелюднивать эти материалы. Решение полностью зависит от автора. Вы и так видите что случилось. А если хотите чего-то большего .. то за последние два или три часа что я тут ничего конкретного и зависящего от меня не слышал. Остальное читайте выше. О том что говорил Саша (Malandrinus) - ДА. Но я ещё раз повторяю. Это не моё решение! Я только подтверждаю то, что он это говорил. Я простой скриптёр, которому интересно развязывать задачи. В этом проекте было много задач. И я их развязал. С огромным удовольствием между прочим. Вот и всё. А Вы тут ту высокие материи. Ничего кроме скриптов с моей стороны. TIGER_VLAD Ріднесенька наша була і буде назавжди. Ти тільки десь поряд будь. А то я зникну як це буває в останній час
-
Я не для того чтобы было написано, а ради справедливости. Зашел случайно, Раз в N-месяцев. Почитал. И вот решил что есть что сказать. Я работаю (вернее работал) не для имиджа. И не для ... да придумывайте что хотите. Просто на тот момент было очень интересно. Но , (прошу прощения у Кarlan) - даже не знаю как сделать, чтобы все поняли, и не сказать лишнего. Попробую сказать как можно правильнее. Сначала для автора. Проект перешел границы личного с тех пор, как стал общедоступным. Саша (Malandrinus) предупреждал нас о всех последствиях. И вот они и во всей красе. Так что не то что (имхо) пора, а уже жизненно НЕОБХОДИМО открывать все карты И то, что было интересно для нас (домашнего использования) уже не интересно для комьюнити. Время идет. Кто-то придумывает что-то новое. Кто-то заглядывает на поколение вперед. Правда пока этого никто не понимает (как и мы думали в своё время). Кто-то уходит как я. Кто-то приходит. Это эволюция. И слава Богу что она есть. Так что, дружище, ты (если кто ещё не понял - Karlan) единственный распорядитель проекта. И только ты в праве решать как поступать. Моё мнение, надеюсь, для всех понятно. Слово за тобою. P.S. Далі любою для себе мовою. Karlan! Не важливо де ти загинешь. Важливо як. Прийшов час. Давай загинемо, як подобає чоловікам. Треба залишити по себе хоть щось. Раптом у нас попереду (це життя) вже нічого не буде (кожен день треба жити як останній), давай виборювати його до останньго. Треба вирішити правильно. І це буде словом мужа а не дитини. Так що вирішуй. Але правильно ---------------- Друже, Tiger Vlad бачу що ти тут, але мовчишь. Та інші також присутні. Але також мовчать.
-
@AndrewMor, Пожалуйста. Вот только хоть убей, но поверить не смогу, что рассмотренная функция может работать правильно. Видишь ли - из цикла for a = 1, 65534 do нет преждевременного выхода. Т.е. ни break-а, ни return-а. И поэтому, ну такие уж законы lua, он отработает все 65534 раза. И дай Бог, чтобы ты появился где-то в подземелье. Иначе, как я уже говорил, 65534 раза будут спавнится арты. Же-е-е-есть. Всго ID-шек в игре 65535. До этого было заспавнено N ID-шек (мобы, лут и т.д.) + 65534 твоих артов. Сколько будет? Точно больше максимально возможного 65535. Да и вообще. К тому коду очень много вопросов.
-
@mortan, Ну если человек после первого намека не понял где смотреть, то видимо нужно дать другой намек, а не тот же самый. Или просто объяснить, раз уж вовсе не понятно. @AndrewMor, Смотри. В actor_binder:net_spawn, при спавне ГГ вызывается функция add_arts() из кода, что ты показал. Посмотри на эту функцию. Что она делает. Построчно. local sim = alife() Кэшируется alife - видимо автор хочет активно использовать доступ к симуляции. local obj Понятно, сюда будет что-то записываться из кода этой функции ниже. for a = 1, 65534 do Так. Будут перебираться все объекты в игре не считая ГГ (зачем - пока не понятно. будем смотреть). obj = sim:object(a) 65534 раза получаем объект по ID. Ну допустим получили. И что-же с ним(и) будем делать дальше? if not levelsIgnoreArts[level.name()] then 65534 раза проверяем что локация, на которой в данное время находится ГГ не является подземной (полагаю). generate_arts() И если локация не подземная (упс, не повезло), то 65534 раза спавним артефакты. Теперь, когда функция разобрана, вернемся в начало. local sim = alife() Где используется переменная sim в этой функции? Нигде. Эту строку можно удалить. local obj и obj = sim:object(a) А где используется переменная obj? Нигде. Значит тоже удалить. И только участок кода с проверкой if not levelsIgnoreArts[level.name()] then является правильным. Только вот совершенно незачем повторят это 65534 раза. В итоге функция стала такой : function add_arts() if not levelsIgnoreArts[level.name()] then generate_arts() end end И это касается только данной функции. На самом деле тот код (мягко говоря) как-бы не очень ... Пусть будет просто "не очень".
-
Это конечно хорошо, но как говорят. - осведомлен значит вооружен. Жаль что так и не узнал, но если что, то ничего страшного. Смогу и голыми руками
-
@Serge!, О, раз уж пошла такая пьянка. Я во всём о чем был разговор особо не разбираюсь, а ты (мне кажется) знаешь о чем говоришь. Это я к чему? Чтобы говорить о формулировках, нужно знать о предмете разговора. В этом я, в отличии от тебя с Malandrinus-ом слаб. Так вот. Кто-нибудь. Ты или кто-то другой. Покажите мне (чтобы я знал) определение класса. Что это такое? Чтобы для меня это было раз и навсегда. P.S. А то я в lua леплю свой класс, и хочу чтобы он был похож на настоящий (из формулировки).
-
Даже не буду читать всё что выше. Вот мнение простого юзера. По мере продвижения по сюжету денег становиться всё больше и больше. При этом всяких там крутых артефактов, костюмов, стволов тоже находится всё больше. И потребность в трате денег уменьшается. Вывод. Что же нужно делать? 1. Крутые костюмы, стволы (а может и арты) портятся, и на их восстановление\боезапас нужно больше денег. 2. По мере прохождения денег становиться всё меньше и меньше 3. Крутые вещи найти нельзя, а можно только купить. Чем дальше тем дороже в купе с пунктом 1. ... 4. Можно придумывать ещё что-то. Знаю одно. Делать что-то нужно. Т.к. 2-3 лимона лимона в конце вроде и не плохо, но душу не греют. Незачем греть. Уже всё. Конец игры. И если так посмотреть, то и не нужно особо выдумывать каких-то схем. По любому из пунктов просто менять коэффициент и всё. И на движок легче, и "букофф" писать меньше.
-
@Serge!, Я вообще ни разу не программист, не теоретик и почти не практик. Так что терминология это не то что моё слабое место, а вообще - ей нет места Я говорю только с позиции "почти не практик". И она мне говорит то, о чем я напмсал выше. А спорить? Вроде говорят что в споре рождается истина? Как-то случается по жизни, что в споре рождаются либо враги, либо "підлабузники" (укр. - не могу подобрать слова лучше этого, уж извините). Так что спорить тоже бесполезно. Друзья всё равно не родяться, т.к. оные познаются только в беде. А этот спор уж никак не беда
-
По-моему бесполезный разговор. Кто-то определил, что в Срр класс - это какой-то там тип. В других языках - другое. Не важно. Всё сводится к тому, что класс - это некая общность объектов. И он может порождать другие общности или индивидуумы. И использовать при этом ООП. Не важно как это выглядит с точки зрения общепринятых канонов. Главное в том, что в lua это работает именно так как нужно. На lua можно написать класс собственным способом. С собственным ООП. Другими словами так как необходимо. Т.е. и с множественным наследованием, и с public\private данными. И ... (i love lua) много с чем. Да, в lua класс - это объект. Таблица с метатаблицей и т.д. но это всего лишь способ. И главное ведь не детали реализации, а выходной результат. И он есть.Такой как требуется. Что ещё нужно от lua? Я точно знаю что не нужно. Не нужно требовать от этого малыша слишком многого. По своим возможностям это и так ребенок-индиго.
УЧИМСЯ МОДДИНГУ
ИГРАЕМ В МОДЫ НА ТЧ
ИГРАЕМ В МОДЫ НА ЧН И ЗП
- [ЧН] 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
- ...и другие моды
ПОЛЕЗНОЕ И РАЗНОЕ