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

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

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

@phalcor 

У меня так работает:

    local pk = m_netpk.get(item, 1)
    if pk and pk:isOk() then
        local data = pk:get() -- читаем данные из нет-пакета
        if data and data.condition then

        end
    end

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

@AndreySol @vader_33 Проблема решилась только правкой m_netpk.script:

было: if stpk:r_elapsed()~=0 or uppk:r_elapsed()~=0 then (вот тут и выдавалась ошибка в момент исполнения команды data = pk:get() )

сделал ТАК: if stpk:r_elapsed()~=0 or (uppk and uppk:r_elapsed()~=0) then (добавил проверку на наличие этого uppk!) (Напомню текст ошибки: m_netpk.script:1231: attempt to index local 'uppk' (a nil value)  )

Всё отлично работает, остаётся лишь вопрос - а не приведёт ли это в дальнейшем к какой-то неочевидной сейчас большой проблеме? Кстати, как у вас в m_netpk.script в этом месте, есть ли проверка на наличие uppk?

 

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

Доброго времени! Есть вопрос по проигрыванию анимаций. Получилось НПС посадить на стул. НО с ними иногда происходят какие-то странности. НПС может либо сесть ровно в соответствии с подогнанными координатами, либо сесть мимо стула. Во втором случае если напугать НПС выстрелом под ноги, то он побегает и вернется, чтобы сесть на стул. И садится ровно. Есть мысли, что можно придумать? Есть варик, например, если НПС захочет проиграть определенный стейт, то перед этим заставить его сделать шаг вперед? Типа того, не знаю. То есть чтобы НПС перед тем как сесть (потенциально неправильно) сначала отошел от координат, чтобы затем вернулся и сел правильно.

Такая же ерунда, кстати, в Баре у ПЫСов. Все НПС, проигрывая анимацию о барной стойки, стоят чуть дальше чем нужно и опираются о пустоту. Если их напугать, то они возвращаются на место и проигрывают анимацию уже как положено.

Есть какие-нибудь мысли, как это пофиксить?

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

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

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

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

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

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

Войти

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

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

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