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

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

Доброго времени суток. Задался тут вопросом: а что в сталкере происходит после смерти актора? Чисто теоретически, ничего не изменяется, можно даже сделать сделать проверку на смерть и какие-то действия NPC, если проверка вернула true. Из этого вытекает вопрос: а можно ли сделать респавн актора без загрузки сохранений? Покопавшись в скриптах, я выяснил, что за создание актора отвечают функции add_actor в файле db.script, a также скрипт actor_proxy.script. Кроме того, в мультиплеере респавн актора возможен. Как он там реализован? Применим ли этот механизм к синглу? Команды alife():release по отношению к актору, даже метвому, не работает. Что произойдет ,если скриптово удалить актора, а затем заспавнит по координатам?

Ссылка на комментарий
22 часа назад, STALKER_Dragon сказал(а):

Что произойдет ,если скриптово удалить актора, а затем заспавнит по координатам?

А что мешает проверить?

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

naxac.gif

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

Помогите разобраться, а то я забуксовал на ровном месте. Дано: скрипт использования предметов со звуками. Мне нужно следующее: при использовании определённого предмета и наличии двух инфопоршней проигрывать звук и выполнять функцию из другого скрипта, если поршней нет - не играть звук и спавнить предмет обратно в инвентарь (он съедобный, на классе антирада). Вот скрипт в упрощённом виде:

Скрытый текст

 

local tSound ={
cocacola            = "scripts\\inv_drinking",
item              = "scripts\\inv_item" - предмет и звук для него
}

function using_items(obj)
   local sect = obj:section()
   local actor = db.actor
   if obj and tSound[obj:section()] then
      local snd = xr_sound.get_safe_sound_object(tSound[obj:section()])
      if snd then
      snd:play_no_feedback(db.actor, sound_object.s2d, 0, vector(), 2.0)
      end
   end
        if obj then if sect == "item" then
         if has_alife_info("info_1") and - поршень 1
            has_alife_info("info_2") then - поршень 2
            script.final_action() - выполнить функцию из другого скрипта
            end
         else
           amk.spawn_item_in_inv("item") - спавн обратно в инвентарь
         end
     end
end

Сейчас без наличия инфопоршней предмет просто "съедается" и звук всё равно проигрывается....

 

 

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

@Капрал Хикс убери end перед else, странно, что вылета нет, ибо их тут больше, чем надо, да и для else нет подходящего if. Если ты делаешь цепочку "если-иначе", то нужно писать так:

if condition then
	action1
else
	action2
end

Конечно у тебя предмет съедаться будет и не будет спавниться:)

А на счёт проигрываемого звука:

тебе его тоже нужно засунуть под проверку с инфопоршнями, ибо у тебя это выглядит так: если есть звук, то устанавливаем переменную и проигрываем этот звук. Тут же ожидать другого и невозможно)

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

@Капрал Хикс, что-то наподобие такого. Не идеально, но должно сработать.

Скрытый текст

function using_items(obj)
   local sect = obj:section()
   local actor = db.actor
    if obj and tSound[sect] then
       local snd = xr_sound.get_safe_sound_object(tSound[sect]) --* раз уж выше кэшировали.
        if sect == "item" then --* отсекаем предмет по секции
            if has_alife_info("info1") and has_alife_info("info_2") then --* проверяем поршни 
                script.final_action() -- выполнить функцию из другого скрипта
                snd:play_no_feedback(actor, sound_object.s2d, 0, vector(), 2.0) --* раз уж выше кешировали
            else
                amk.spawn_item_in_inv("item") --* иначе спавн обратно в инвентарь
            end
        else --* отрабатываем остальные элементы таблицы
            snd:play_no_feedback(actor, sound_object.s2d, 0, vector(), 2.0) --* раз уж выше кэшировали.
        end
    end
end

 

 

Вопрос к знатокам:

1. Насколько здесь необходимо вот это вот:

local snd =...
if snd then --* проверка на наличие звука???
	snd:play_no_feedback()
end

2. Потенциальную "дыру" при массовом использовании предметов и методе play_no_feedback только я вижу? play_at_pos с соответствующим обработчиком прерывания не разумнее ли использовать?

Изменено пользователем Купер
  • Полезно 1
Ссылка на комментарий

Вопрос к знатокам. Как очистить определенный инвентарный ящик по ID? То-есть, как, к примеру, определенным скриптом удалить все предметы из ящика в деревне новичков?

Ссылка на комментарий
2 часа назад, hArdplAyer22_22 сказал(а):

Как очистить определенный инвентарный ящик по ID?

Вот так можно -

Скрытый текст

function clear_box( box_id )  -- ID ящика, который нужно очистить
  for a = 1, 65535, 1 do
    local sobj = alife():object( a )
    if sobj and sobj.parent_id == box_id then
      alife():release( sobj, true )
    end
  end
end

 

Причём, неважно, в онлайне ящик или нет.

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

Нужно сделать проверку на наличие детектора "Отклик" в руках.

Это возможно?

 

active_item:section() == "detector_simple" не работает,

хотя active_item:section() == "wpn_pm" - вполне себе

 

Игра: ЧН (с OGSM)

 

UPD:

active_item:clsid() == clsid.device_detector_simple и active_item:clsid() == clsid.detector_simple_s тоже не работают.

Хотя например active_item:clsid() == clsid.wpn_pm_s проверку проходит

Все эти device_detector_simple, detector_simple_s и wpn_pm_s взяты из m_netpk.ltx

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

@hetrikWHY В ЗП есть метод active_detector. Используется аналогично методу active_item. Думаю он есть и в ЧН.@Norman Eisenherz Давным - давно, (может пол года назад) Когда я переносил сортировку инвентаря из DMX мода на ЗП (Используя только оригинальный движкок, аля челенж такой). Я делал так. Окно на рендер отправлял в текущем вызове. В основном XML инвентаря убирал фон, и рендерил его из фейкового окна. 

Скрытый текст

6 ГБ ОЗУ DDR3 1098 мГц (Разносорт)

Процессор Intel Xeon E5420 4/4 2.5 ГГц

Видеокарта Gigabyte GeForce GT 240 512 МБ GDDR5 (Samsung) DirectX v10.1

 

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

Привет! 

Задаю анимацию в path_look, проигрывается. Берём анимацию сидения на стуле. А как по высоте анимку подогнать под стул? 

Выходит что силячий нпс парит над стулом. Как ни ковырял координаты - все никак не выходит. Или высота строго задана в самой анимки и идёт отчёт высоты строго от вертекса на полу? 

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

@_Sk8_AsTeR_ 

Видимо проще подобрать стул под высоту анимации.

 

26.05.2021 в 05:21, Купер сказал(а):

Потенциальную "дыру"

А где ты ее увидел, эту дыру? Внутри play_no_feedback использует все то-же, что и play_at_pos, просто назначение ф-ций разное.

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

@AndreySol, отчасти гипотетическая, однако, вполне возможная ситуация: последовательное использование нескольких разно озвученных предметов + достаточная продолжительность самой озвучки. Что будет происходить со звуками?

 play_no_feedback  работает же по принципу "выстрелил - забыл": если звук запущен, он будет в любом случае проигран до конца.

Тот же play_at_pos, в свою очередь, позволяет проконтролировать наличие звука в игре. Т.е. что-то наподобие этого:

--* если старый звук играл, прерываем его воспроизведение.
if snd and snd:playing() then
	snd:stop()
end
--* далее по тексту: запускаем новый.

 

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

@Купер 

Ну так используй каждую ф-цию по назначению - и все будет как надо. Ведь play_no_feedback  для того и создана, чтоб запустить воспроизведение и забыть. И еще раз - загляни в исходники, в реализацию обоих ф-ций, сразу поймешь что и как...

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

@AndreySol, и я там увижу вполне очевидные вещи :biggrin:. Это больше к @Капрал Хикс-у на предмет обдумывания о целесообразности использования.

@_ХоЗаР_active_detector - нема такого в ЧН.

 

  • Полезно 1
Ссылка на комментарий
1 час назад, Купер сказал(а):

на предмет обдумывания о целесообразности использования.

Пока вполне подходит при употреблении многих предметов за раз.

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

Добрый день! 

Есть ли простой метод определить condition оружия для серверного объекта?

Что-то аналогичное клиентскому методу obj:condition()

Движок - ОП 2.1

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

@AndreySol Теоретически да. Делаю так:

Скрытый текст

 



function ph_test_netpk()
	local item, cl_sid, sect, pk, data
	for i = 1, 65534 do	-- Ищем вообще все существующие объекты в игре			
		item = alife():object(i) --получаем серверный объект			
		if item then				
			cls_id = item:clsid()
			sect=item:section_name()				
			if iAmWeapon[cls_id] and config:line_exist(sect, "ammo_class") then
					
					--НЕТ-ПАКЕТЫ					
					pk = get_netpk( item, 1 )
					if pk and pk:isOk() then
						data = pk:get()
						log("К="..data.condition)
					end	
					
			end			
		end	
	end --for	
	log("It's OK!")
end

 

 

 

Однако получаю вылет вот такой:

Скрытый текст

[06.06.21 16:42:30.497]  [LUA] SCRIPT RUNTIME ERROR
[06.06.21 16:42:30.497]  [LUA] z:\op21-repack\gamedata\scripts\m_netpk.script:1231: attempt to index local 'uppk' (a nil value)
[06.06.21 16:42:30.497]  
[06.06.21 16:42:30.497] FATAL ERROR
[06.06.21 16:42:30.497]  
[06.06.21 16:42:30.497] [error]Expression    : fatal error
[06.06.21 16:42:30.497] [error]Function      : CScriptEngine::lua_error
[06.06.21 16:42:30.497] [error]File          : script_engine.cpp
[06.06.21 16:42:30.497] [error]Line          : 79
[06.06.21 16:42:30.497] [error]Description   : <no expression>
[06.06.21 16:42:30.497] [error]Arguments     : LUA error: z:\op21-repack\gamedata\scripts\m_netpk.script:1231: attempt to index local 'uppk' (a nil value) 

 

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

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

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

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

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

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

Войти

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

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

AMK-Team.ru

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