Nazgool 251 Опубликовано 15 Октября 2016 @TIGER_VLAD, Да там всё просто. На родительское окно лепишь статик с фоном бара (напр. красный) и задаешь ему позицию "Х" равную -(минус)ширина_бара Т.е. изначально оно скрыто (скажем). По мере надобности меняем "Х" и двигаем этот дочерний статик относительно родительского так как нужно. То что выходит за пределы родителя видно не будет, а то что будет видно на родителе, то и будет тебе прогресс баром Поделиться этим сообщением Ссылка на сообщение
Nazgool 251 Опубликовано 16 Ноября 2016 (изменено) А по существу? Приспособил свой "костыль" (раз уж так это называется) CRAZY_STALKER666 Я всё же спрошу на всякий случай про твой вопрос http://www.amk-team.ru/forum/topic/6185-skriptovanie/page-402#entry1048162. Тебе конечно ответили что именно нужно сделать. Я только не понял, - ты хочешь узнать почему так? Или уже знаешь? Ну или, как вариант, не хочешь знать? Изменено 16 Ноября 2016 пользователем Nazgool Поделиться этим сообщением Ссылка на сообщение
Nazgool 251 Опубликовано 4 Декабря 2016 (изменено) @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()] then65534 раза проверяем что локация, на которой в данное время находится ГГ не является подземной (полагаю).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 И это касается только данной функции. На самом деле тот код (мягко говоря) как-бы не очень ...Пусть будет просто "не очень". Изменено 4 Декабря 2016 пользователем Nazgool 1 1 1 Поделиться этим сообщением Ссылка на сообщение
Nazgool 251 Опубликовано 4 Декабря 2016 (изменено) @AndrewMor, Пожалуйста. Вот только хоть убей, но поверить не смогу, что рассмотренная функция может работать правильно.Видишь ли - из цикла for a = 1, 65534 do нет преждевременного выхода. Т.е. ни break-а, ни return-а.И поэтому, ну такие уж законы lua, он отработает все 65534 раза. И дай Бог, чтобы ты появился где-то в подземелье.Иначе, как я уже говорил, 65534 раза будут спавнится арты. Же-е-е-есть. Всго ID-шек в игре 65535. До этого было заспавнено N ID-шек (мобы, лут и т.д.) + 65534 твоих артов. Сколько будет? Точно больше максимально возможного 65535. Да и вообще. К тому коду очень много вопросов. Изменено 4 Декабря 2016 пользователем Nazgool Поделиться этим сообщением Ссылка на сообщение
Nazgool 251 Опубликовано 9 Апреля 2017 (изменено) Вот окончательный вариант Говорю не для того чтобы обидеть, а только ради благих намерений. Хотя и понимаю, что оными выстелена дорога в ад, поэтому как уж получиться. Не раз уже говорил, и всегда недоумевал от столь бесполезного кода (и подобный встречается довольно часто) : 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 Изменено 9 Апреля 2017 пользователем Nazgool 2 1 Поделиться этим сообщением Ссылка на сообщение
Nazgool 251 Опубликовано 13 Апреля 2017 (изменено) @WinCap, Параметр community может принимать ряд заранее известных строковых значений Ну во-первых он может принимать "ряд" любых типов значений lua кроме nil. См. : if community == nil then Во-вторых. Где у тебя в коде написано, что "заранее известных" и тем более "строковых значений"? Вот в моем варианте это всё предусмотрено. А покажи где у тебя? Если он не определен, т.е. nil, в данном случае, наверное, это допустимо, и я определяю его сам. ... То я просто обязан словить вылет и разобраться В третьих (как и во-первых), если он не определен, или определен не так как ожидалось (т.е. это либо не строка, либо строка, которой нет в списке таблицы "community_condition"), то ту два варианта - либо определять значение "насильно" (как ты сдедал): then community = "stalker" Либо вылетать. Ты уж определись чего нужно-то. Исходя из твоего кода выходит что первый вариант. Что собственно я сделал, чтобы не отходить от оригинала. Так что твоё несогласие с моим вариантом считаю не достаточно (вернее совсем не) обоснованным. P.S. Вольность типов, количества и значений переменных в lua несомненно делает его очень гибким. Но только не в "точных науках". Например мне приходилось, для исключения двусмысленности, создавать ряд сигнатурных функций. Изменено 13 Апреля 2017 пользователем Nazgool Поделиться этим сообщением Ссылка на сообщение
Nazgool 251 Опубликовано 15 Апреля 2017 (изменено) @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 и с "не той" сигнатурой. А в оригинале такой нет. Изменено 15 Апреля 2017 пользователем Nazgool Поделиться этим сообщением Ссылка на сообщение
Nazgool 251 Опубликовано 15 Апреля 2017 @UnLoaded, О чем вы говорите? Какая универсальная защита? Просто защита конкретной функции. Коих создается великое множество. И лично мне не хочется несколько раз возвращаться к переписыванию одного и того кода по нескольку раз. Поэтому лично я поступил бы именно в таком духе. Ну написал бы несколько вспомогательных функций типа iff(cond, a, - (кодеры поймут что я имел в виду) А насчет "медвежьей услуги". Я посчитал, что если напишу : -- тут что-то делать. лог, вылет, исправить или ничего не делать то, будет достаточно ясно. Видимо ошибался. 1 Поделиться этим сообщением Ссылка на сообщение
Nazgool 251 Опубликовано 16 Апреля 2017 (изменено) @UnLoaded, Нет, это не медвежья услуга, т.к. автор изначально хочет! чтобы при отсутствии значения бралось некое значение по умолчанию ("stalker") Т.е. такое действие не побочный эффект, а сделано намеренно. Вот если бы в исходном коде не было : if community == nil then community = "stalker" end то и я бы написал : ... and community_condition[community] Я всего-лишь подправил код так, чтобы исходная идея автора работала как можно надежнее. Изменено 16 Апреля 2017 пользователем Nazgool Поделиться этим сообщением Ссылка на сообщение
Nazgool 251 Опубликовано 30 Июля 2017 (изменено) Jekyll Я могу сейчас всё расписать от и до. Только один вопрос - Почему именно до двадцати? for t = 1,20 do В чём сакральная задумка? P.S. Нет, я и так вижу что человек не разбирается. Просто хотелось определиться что именно нужно. P.P.S. А что это с редактором? Жесть какая-то при изменении. Но это в общем-то не особо важно. Изменено 30 Июля 2017 пользователем Nazgool Поделиться этим сообщением Ссылка на сообщение
Nazgool 251 Опубликовано 6 Декабря 2017 Не, всё нормально вроде. Но... Ну не принято так что-ли. Ну когда много раз вызывают одно и то же, то как-бы принято кэшировать. Не я же придумал. 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 Поделиться этим сообщением Ссылка на сообщение