Все посты %s в %S - AMK Team
Перейти к контенту

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


Svoboда

Рекомендуемые сообщения

@TIGER_VLAD,

Да там всё просто.

На родительское окно лепишь статик с фоном бара (напр. красный) и задаешь ему позицию "Х" равную -(минус)ширина_бара

Т.е. изначально оно скрыто (скажем). По мере надобности меняем "Х" и двигаем этот дочерний статик относительно родительского так как нужно. То что выходит за пределы родителя видно не будет, а то что будет видно на родителе, то и будет тебе прогресс баром

Поделиться этим сообщением


Ссылка на сообщение
А по существу?

Приспособил свой "костыль" (раз уж так это называется) :)

 

CRAZY_STALKER666

Я всё же спрошу на всякий случай про твой вопрос http://www.amk-team.ru/forum/topic/6185-skriptovanie/page-402#entry1048162.

Тебе конечно ответили что именно нужно сделать.

Я только не понял, - ты хочешь узнать почему так? Или уже знаешь? Ну или, как вариант, не хочешь знать?

Изменено пользователем Nazgool

Поделиться этим сообщением


Ссылка на сообщение

@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

И это касается только данной функции. На самом деле тот код (мягко говоря) как-бы не очень ...
Пусть будет просто "не очень".

Изменено пользователем Nazgool
  • Спасибо 1
  • Нравится 1
  • Согласен 1

Поделиться этим сообщением


Ссылка на сообщение

@AndrewMor,

Пожалуйста. Вот только хоть убей, но поверить не смогу, что рассмотренная функция может работать правильно.
Видишь ли - из цикла for a = 1, 65534 do нет преждевременного выхода. Т.е. ни break-а, ни return-а.
И поэтому, ну такие уж законы lua, он отработает все 65534 раза.

И дай Бог, чтобы ты появился где-то в подземелье.
Иначе, как я уже говорил, 65534 раза будут спавнится арты. Же-е-е-есть.

 

Всго ID-шек в игре 65535. До этого было заспавнено N ID-шек (мобы, лут и т.д.) + 65534 твоих артов. Сколько будет?

Точно больше максимально возможного 65535.

 

Да и вообще. К тому коду очень много вопросов.

Изменено пользователем Nazgool

Поделиться этим сообщением


Ссылка на сообщение
Вот окончательный вариант

Говорю не для того чтобы обидеть, а только ради благих намерений.

Хотя и понимаю, что оными выстелена дорога в ад, поэтому как уж получиться.

 

Не раз уже говорил, и всегда недоумевал от столь бесполезного кода (и подобный встречается довольно часто) :

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
 
Изменено пользователем Nazgool
  • Согласен 2
  • Не согласен 1

Поделиться этим сообщением


Ссылка на сообщение

@WinCap

Параметр community может принимать ряд заранее известных строковых значений

Ну во-первых он может принимать "ряд" любых типов значений lua кроме nil. См. :

if community == nil then

Во-вторых. Где у тебя в коде написано, что "заранее известных" и тем более "строковых значений"?

Вот в моем варианте это всё предусмотрено. А покажи где у тебя?

Если он не определен, т.е. nil, в данном случае, наверное, это допустимо, и я определяю его сам.
...
То я просто обязан словить вылет и разобраться

В третьих (как и во-первых), если он не определен, или определен не так как ожидалось (т.е. это либо не строка, либо строка, которой нет в списке таблицы "community_condition"), то ту два варианта - либо определять значение "насильно" (как ты сдедал):

then community = "stalker"

Либо вылетать. Ты уж определись чего нужно-то.

Исходя из твоего кода выходит что первый вариант. Что собственно я сделал, чтобы не отходить от оригинала.
 
Так что твоё несогласие с моим вариантом считаю не достаточно (вернее совсем не) обоснованным.
 
P.S. Вольность типов, количества и значений переменных в lua несомненно делает его очень гибким. Но только не в "точных науках". Например мне приходилось, для исключения двусмысленности, создавать ряд сигнатурных функций.
Изменено пользователем Nazgool

Поделиться этим сообщением


Ссылка на сообщение

@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 и с "не той" сигнатурой.

А в оригинале такой нет.

Изменено пользователем Nazgool

Поделиться этим сообщением


Ссылка на сообщение

@UnLoaded

О чем вы говорите? Какая универсальная защита? Просто защита конкретной функции.

Коих создается великое множество. И лично мне не хочется несколько раз возвращаться к переписыванию одного и того кода по нескольку раз. Поэтому лично я поступил бы именно в таком духе. Ну написал бы несколько вспомогательных функций типа iff(cond, a, B) - (кодеры поймут что я имел в виду)

А насчет "медвежьей услуги". Я посчитал, что если напишу  :

-- тут что-то делать. лог, вылет, исправить или ничего не делать 

то, будет достаточно ясно. Видимо ошибался.

  • Нравится 1

Поделиться этим сообщением


Ссылка на сообщение

@UnLoaded, Нет, это не медвежья услуга, т.к. автор изначально хочет! чтобы при отсутствии значения бралось некое значение по умолчанию ("stalker")

Т.е. такое действие не побочный эффект, а сделано намеренно. Вот если бы в исходном коде не было :
if community == nil then community = "stalker" end

то и я бы написал :

... and community_condition[community]

Я всего-лишь подправил код так, чтобы исходная идея автора работала как можно надежнее.

Изменено пользователем Nazgool

Поделиться этим сообщением


Ссылка на сообщение

Jekyll

Я могу сейчас всё расписать от и до.
Только один вопрос - Почему именно до двадцати?

for t = 1,20 do

В чём сакральная задумка?

P.S. Нет, я и так вижу что человек не разбирается. Просто хотелось определиться что именно нужно.
P.P.S. А что это с редактором? Жесть какая-то при изменении. Но это в общем-то не особо важно.

Изменено пользователем Nazgool

Поделиться этим сообщением


Ссылка на сообщение

Не, всё нормально вроде. Но...

Ну не принято так что-ли. Ну когда много раз вызывают одно и то же, то как-бы принято кэшировать.

Не я же придумал.

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

 

Поделиться этим сообщением


Ссылка на сообщение
  • Недавно просматривали   0 пользователей

    • Ни один зарегистрированный пользователь не просматривает эту страницу.
×
×
  • Создать...