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

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

@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
Ссылка на комментарий

@mortan, чтоб можно было разобрать через нет-пакеты свойства любого предмета. К примеру для показа простым наведением курсора какие именно патроны заряжены в конкретный ствол.
Мне нужно скриптовое решение, чтобы можно было и для ЧН адаптировать если надо. Правка движка ни разу не универсальный прием.

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

@TIGER_VLAD, Если используешь движок, где есть коллбэки на нажатие/удержание/отпускание клавиш (например, X-Ray extensions), то можно попробовать так:

[spoiler=noclip.script]

--[[ -------------------------------------------------------------------------------------------------------
-- File: 			noclip.script
-- Description: 	Noclip режим (режим свободного полета).
--]] -------------------------------------------------------------------------------------------------------
local debug_log = true 	-- Пишем лог? 	Да = true / Нет = false
local module_init = true
local module_name = script_name()
local function dbg_logf(fmt,...) if debug_log then log1(fmt,...) end end

noclip_active = true 	-- Вкл. = true / ВЫКЛ. = false
local distant_step = 1 	-- Кол-во метров, на который смещается камера в режиме NOclip.

-- Вкл./ВЫКЛ. режима NOclip. --
function noclip_ON_OFF()
	if (noclip_active == true) then
		dbg_logf("~~noclip  >>> OFF  ")
		noclip_active = false

		-- ВЫКЛ.режим бога. --
		local console = get_console()
		console:execute("g_god off")
	else
		dbg_logf("--noclip  >>> ON  ")
		noclip_active = true

		-- Вкл.режим бога. --
		local console = get_console()
		console:execute("g_god on")
	end
end

-- Коллбэк на удержание клавиши. --
function on_key_hold(key, bind)
	if (noclip_active == false) then return true end
	
	-- kR -- +1 метр к скорости! --
	if bind == key_bindings.kWPN_RELOAD then
		distant_step = distant_step + 1
	end
	
	-- kT -- -1 метр к скорости! --
	if bind == key_bindings.kWPN_FUNC then
		distant_step = distant_step - 1
		if distant_step <= 0 then
			distant_step = 1
		end
	end

	-- kW -- Вперед! --
	if bind == key_bindings.kFWD then
		local position 	= db.actor:position() 
		local direction = device().cam_dir
		db.actor:set_actor_position(position:mad(direction, distant_step))
	end

	-- kS -- Назад! --
	if bind == key_bindings.kBACK then
		local position 	= db.actor:position() 
		local direction = device().cam_dir
		db.actor:set_actor_position(position:mad(direction, (-distant_step)))
	end

	-- kA -- Стрейф влево! --
	if bind == key_bindings.kL_STRAFE then
		local position 	= db.actor:position() 
		local direction = device().cam_right
		db.actor:set_actor_position(position:mad(direction, (-distant_step)))
	end 

	-- kD -- Стрейф вправо! --
	if bind == key_bindings.kR_STRAFE then
		local position 	= db.actor:position() 
		local direction = device().cam_right
		db.actor:set_actor_position(position:mad(direction, distant_step))
	end

	-- kSpace -- Наверх! --
	if bind == key_bindings.kJUMP then
		local position 	= db.actor:position() 
		local direction = device().cam_top
		db.actor:set_actor_position(position:mad(direction, distant_step))
	end

	-- Left SHIFT 	-- Вниз! --
	if bind == key_bindings.kCROUCH_TOGGLE then
		local position 	= db.actor:position() 
		local direction = device().cam_top
		db.actor:set_actor_position(position:mad(direction, (-distant_step)))
	end

end

if module_init then
	dbg_logf("**DBG: LOADING MODULE: "..module_name..".script -- Ok. ")
end

 

 

 

Во время режима NOclip я включаю режим бога, чтоб гг не застрелили пока он летит до пункта назначения.

Клавишами R(по-умолчанию "Перезарядка") и T(у меня это = "Переключение на подствольник") регулирую скорость (а точнее, кол-во метров на которое смещается камера).

Клавиши: W,A,S,D - управление как обычно.

 

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

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

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

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

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

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

Войти

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

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

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