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

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

@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
Ссылка на комментарий
Поэтому более надежный вариант можно было бы написать примерно так

Все пытаетесь универсальную защиту "от дурака" смастырить ? Так я Вам скажу, что дурак впиндюрит такое, что все эти защиты обделаются. Имхо, мое мнение: не надо дуракам программный код писать, а если очень хочется - пусть учится, как это правильно делать, и соответственно перестает быть дураком...

Да и такие способы защиты - если передали не верное community, то вернуть что-то от community = stalker - это чисто медвежья услуга. Пусть лучше писатель кода получит вылет, при тестировании, и будет вынужден найти ошибку и исправить ее, а не получить в виде этой самой медвежьей услуги левый результат.

Изменено пользователем UnLoaded
  • Нравится 1
  • Согласен 2
Ссылка на комментарий

@UnLoaded

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

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

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

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

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

  • Нравится 1
Ссылка на комментарий

 

 

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

Возьмем вариант с не валидным значением аргумента ф-ции "community". В local data в этом случае получим данные из community = stalker, следовательно код:

then

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

никогда не выполнится. Это по Вашему не медвежья услуга ?

Ссылка на комментарий

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

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

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

... and community_condition[community]

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

Изменено пользователем Nazgool
Ссылка на комментарий

Подскажите, пожалуйста что делает функция:

function k_predicate_s(obj_info)
return obj_info.profile_name == "esc_killer_specnaz"
end

и далее по скрипту:

		t = { section = "logic@esc_killer1_raid",
			idle = 0,
			prior = 8, state = {4},
			online = true,
			predicate = k_predicate_s,
			in_rest = "", out_rest = ""
Ссылка на комментарий

 

 

что делает функция

Так, ты сам уже нашел, что она делает - задает условие принятия неписей на работу в гулаге. Т.е. на эту работу("logic@esc_killer1_raid") будет назначен только тот непись, у которого профиль в конфиге - "esc_killer_specnaz".

Ссылка на комментарий
Т.е. на эту работу

Я так понимаю, будет заспавнен вояка спецназовец во время нападения наймов на деревню новичков ?

 

P.S. Имеется мод (ТЧ Complete). Там, если вынести КПП около деревни новичков, происходит респаун вояк (появляется спецназ). Хотел перенести себе в мод. Сравнивал all.spawn - отличий (по неписям) не нашёл. Единственное в gulag_escape.script отличия по тем строчкам из прошлого поста. Подскажите как реализовать. 

Изменено пользователем Space.Marine
Ссылка на комментарий
Понадобилось заспавнить немного лута на локе (сверх того, что расставлено через сдк), но у способа через скрипт (alife():create) есть недостаток - предмет оказывается на ближайшей аи-ноде, что делает невозможным спавнить данным методом на крышах и т.п. В сдк просто - выключил у предмета "used ai locations", и всё нормально.
 
Немного поизучал, что от чего зависит, и в итоге добавил "self:use_ai_locations(false)" в se_item.script (на примере se_eatable (ЗП) - аптечки, еда):
function se_eatable:on_register()
    ...
    self:use_ai_locations(false)
end

После этого предмет остаётся в нужных координатах, и остаётся там при сейв / лоаде / онлайн / оффлайн. И всё же в скриптах разбираюсь самую малость, и хотелось узнать от знающих людей - правильное ли такое решение и не будет потом багов?

 

Ссылка на комментарий

 

 

правильное ли такое решение и не будет потом багов?

Разве не понятно, что таким образом ты отключил привязку к AI-сетке у ВСЕХ "eatable" объектов. Багов скорее всего не будет, не думаю что этот флаг("used ai locations") критичен для "eatable" хлама, но кто его знает что об этом движок думает ?

А вообще, на мой взгляд, правильнее будет сбрасывать этот флаг для поля "object_flags"(правкой нет-пакета, вроде доступ к этому полю есть) при спавне конкретного объекта.

  • Согласен 1
Ссылка на комментарий

@h0N0r, выше @UnLoaded правильно написал - абсолютно незачем устанавливать этот флаг сразу для всех объектов определённого типа.

Но и в net-пакеты в твоём случае залезать тоже нет необходимости, так как, судя по успешному использованию функции use_ai_locations, делаешь ты это на платформе ЗП.

Поэтому используй её и дальше, только не глобально, а сразу после спавна того предмета, для которого ты хочешь отключить привязку к AI-сетке. Примерно так:

local s_obj = alife():create(section, position, lvid, gvid, pid)
local se_item = alife():object(s_obj.id)
se_item:use_ai_locations(false)
Можно и через net-пакеты, конечно, но в случае ЗП проще воспользоваться готовой функцией. Изменено пользователем Kirgudu
  • Согласен 1
  • Полезно 1
Ссылка на комментарий

 

 

Можно и через net-пакеты, конечно, но в случае ЗП проще воспользоваться готовой функцией.

Не спорю, ни грамма - если ф-ция работает без дрюканья нет-пакетов. то я только ЗА...

Ссылка на комментарий

Внезапный такой вопрос: у кого в модах в ПДА накапливается МНОГО выполненных квестов - это у всех при переключении на их показ АДСКИЕ тормоза, или это у меня что-то локальное ?

 

Если не только у меня - кто-то пробовал с этим бороться ?

Ссылка на комментарий

 

 

АДСКИЕ тормоза

 

Ну, не сказать, что бы адские, но тормозит, да.

 

 

 

кто-то пробовал с этим бороться ?

 

Я решил просто циклические задания, коих больше всего, вынести из заданий вообще.

Ссылка на комментарий

Всем привет. Словил себя на том, что много трачу времени на перемещение по локации тестируя что-то. Решил сделать что-то похожее на Noclip режим(режим свободного полета). 

Код:

 

function noclip_upd()
local position = db.actor:position() 
local direction = device().cam_dir 

        if noclip_active == true then
                  local v = vector()
                  v.x = position.x + direction.x          --или просто v= position:add(direction)
                  v.y = position.y + direction.y 
                  v.z = position.z + direction.z 

                  db.actor:set_actor_position(v)
        end
end

 


Вроде бы все работает,

. Но мне так и не удалось изменить скорость полета и еще заметил, что скорость зависит от фпс ( на краях карты скорость больше). Пробовал вектор умножать/делить на delta - получаю очень большую скорость. На delta * 0.001 - получаю
Также пробовал изменять длину вектора или сделать длину единичной с помощью методов vector:set_length(n) и vector:normalize()  , вот
Что подскажете сделать, как решить проблему?
Изменено пользователем TIGER_VLAD
  • Нравится 1
Ссылка на комментарий

@TIGER_VLAD, может, так?

local delta = 0.05  -- подобрать опытным путём: чем больше, тем быстрее
function noclip_upd()
  if noclip_active == true then
    local position = db.actor:position() 
    local direction = device().cam_dir
    db.actor:set_actor_position( position:add( direction:mul( delta ) ) )
  end
end

 

  • Спасибо 1
  • Нравится 1
  • Согласен 2

Аддон для ОП-2.09.2: Яндекс/Google/GitHub

naxac.gif

Ссылка на комментарий

Кому не сложно, подскажите нубу, как в ЗП получить ID любого предмета, на который указывает игровой курсор, в инвентаре актора или обшариваемого NPC/монстра.

Ссылка на комментарий

@naxac, Да пробовал уже так. Вот так этот код работает

. Получается, что ГГ летит не по направлению взгляда ( То есть я например повернул камеру влево/вправо где-то на 20-30 градусов, а направление не меняется, стоит мне повернуть больше и только тогда направление меняется). Думаю сам телепорт(db.actor:set_actor_position) актора нужно как то привязать к аргументу delta метода update, так как скорость телепорта зависит от фпс. На видео видно, что скорость на краях локации сильно увеличивается.

 

local delta = 0.05 -- подобрать опытным путём: чем больше, тем быстрее

 пробовал от 0.5 - 0.00005 все равно скорость большая

Изменено пользователем TIGER_VLAD
Ссылка на комментарий
@TIGER_VLAD, ну естественно скорость зависит от фпс, т.е. от частоты выполнения апдейта. Ведь ты же на каждом апдейте меняешь позицию. Умножай дельту на кол-во секунд, прошедших с прошлого апдейта, что-ли. Текущее время в миллисекундах возвращает time_global(). На каждом апдейте его сохрани, вычти из него предыдущее значение, раздели на кол-во миллисекунд в секунде и умножь на дельту. В этом случае, дельтой будет задаваться скорость в секунду реального времени. Как-то так.
  • Спасибо 1
Ссылка на комментарий

Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

Войти
  • Недавно просматривали   0 пользователей

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

AMK-Team.ru

×
×
  • Создать...