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

X-Ray extensions

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

Я перешел на сборку макрона r232a пока ее хватает, не внимательно прочтал по началу ридмик нанобота что там это отключено и убил много времени на отладку скриптов, палить ахтора mine:explose(db.actor) чет мне не поравилось...

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

возможно с помощью данной функции скриптово открыть окно торговли? (вызвав в диалоге с тем, с кем нужно открыть торговлю). Если да, то как? 

CUIDialogWnd*<trade_wnd> get_trade_wnd()

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

God save Hatsune Miku!

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

@Labadal , 

  local wnd = level.get_trade_wnd()
  if wnd and wnd:IsShown() then
    level.start_stop_menu(wnd, true)
  end
	
Изменено пользователем naxac

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

naxac.gif

Ссылка на комментарий
2 минуты назад, naxac сказал:

@Labadal , 

 

  local wnd = level.get_trade_wnd()   if wnd and wnd:IsShown() then     level.start_stop_menu(wnd, true)   end

  local wnd = level.get_trade_wnd()
	  if wnd and wnd:IsShown() then
	    level.start_stop_menu(wnd, true)
	  end
	

 

Вызываю функцию из диалога, ничего не происходит, есть идеи? 

@naxac Попробовал так:

function trade_init()
  local wnd = level.get_trade_wnd()
  if wnd and wnd:IsShown() then
    level.start_stop_menu(wnd, true)
  end
end

При вызове из диалога - ничего не происходит. Полагаю, что IsShown() - проверка открыто окно или нет. Если правильно полагаю, тогда понятно почему ничего не происходит, ведь в момент вызова торговля не открыта. 
Попробовал так: 

function trade_init()
  local wnd = level.get_talk_wnd()
  if wnd and wnd:IsShown() then
    level.start_stop_menu(level.get_trade_wnd(), true)
  end
end

То есть проверяю открыто ли в данный момент окно разговора, чтобы вызвать торговлю, и при вызове ловлю следующий вылет:

Скрытый текст
Expression    : assertion failed
Function      : CUIWindow::SetParent
File          : E:\stalker\sources\trunk\xr_3da\xrGame\ui\UIWindow.cpp
Line          : 634
Description   : !(m_pParentWnd && m_pParentWnd->IsChild(this))

 

На этом идеи кончились, в какую сторону думать?

God save Hatsune Miku!

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

@Labadal но ведь одно окно открыто - окно диалога. Думаю, его нужно закрыть, а потом открывать другое.

 Моя нычкаНычка в арендованном у Опричника холодильнике  

Мы хорошие ребята, жаль патронов маловато:):ukostra:

UriZzz.gif

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

@UriZzz Думаешь, перед открытием окна торговли из окна диалога мне необходимо закрыть окно диалога? 

God save Hatsune Miku!

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

@Labadal подозреваю.

Вряд-ли получится открыть второе, если открыто первое.

 Моя нычкаНычка в арендованном у Опричника холодильнике  

Мы хорошие ребята, жаль патронов маловато:):ukostra:

UriZzz.gif

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

@UriZzz не-а, в любом случае ловлю вылет

Скрытый текст
Expression    : assertion failed
Function      : CUIWindow::SetParent
File          : E:\stalker\sources\trunk\xr_3da\xrGame\ui\UIWindow.cpp
Line          : 634
Description   : !(m_pParentWnd && m_pParentWnd->IsChild(this))

 

 

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

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

В файлах talk.xml и talk_16.xml   найти тег  button и вписать в конце тега accel="Ваша клавиша".

 А затем, замечательной функцией, имеющейся в X-Ray extensions, имитирующей события нажатия кнопки send_event_key_press(int<DIK_keys>) можно открыть торговлю, вызвав функцию через диалог. 
 

level.send_event_key_press(DIK_keys.DIK_mouse4)

 

И что самое замечательное, почему-то если назначить кнопку mouse4 (другие mouse кнопки не пробовал) - то при попытке отрыть торговлю, самому нажав клавишу mouse4 - торговля не откроется, но если открывать вышеуказанной функцией - то откроется. То есть, можно исключить открытие торговли актором у других нпс, которым ты не хочешь выдавать возможность торговли.

God save Hatsune Miku!

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

Всем привет, у меня такой вопрос. 
Допустим, есть некая функция: 

function f_name()
local target = level.get_target_obj()
   if target and IsStalker(target) then
   local name = target:chracter_name()
   end
end

То есть, в переменную target мы поместили игровой объект и если этот объект - Сталкер, мы получаем его имя. Если вызывать из апдейта биндсталкер, все работает прекрасно,
но если вызывать из 

файл: xr_motivator.script
функция: function motivator_binder:death_callback(victim, who)

То сама функция level.get_target_obj() работает как-то через раз. 


То есть, вызывая свою функцию из xr_motivator.script я подразумеваю, что она будет воспроизводиться всякий раз, когда гг убьёт непися. Так вот, при каждом убийстве непися актором, мне нужно получать имя убитого нпс.  Но level.get_target_obj() в этом случае работает через раз, один раз возвращает объект и его имя, а другой - ничего. 
 

что подскажете, господа? 

God save Hatsune Miku!

Ссылка на комментарий
7 минут назад, Labadal сказал:

Но level.get_target_obj() в этом случае работает через раз

Эта функция возвращает объект, на который смотрит ГГ. С учетом того, что пули в сталкере летят с вполне ограниченной скоростью, на момент смерти НПСа, ГГ вполне может смотреть уже мимо, т.к. некая доля секунды с момента выстрела пройдет. Поэтому и "через раз". ГГ мог вообще гранату бросать за угол не глядя, что вам тогда вернет get_target_obj ? ничего, естественно.

Только непонятно, зачем такие сложности с get_target_obj и чего ради.

10 минут назад, Labadal сказал:
function motivator_binder:death_callback(victim, who)

Почему бы не взять непися прямо отсюда?

motivator_binder это как бы биндер нпс. И у него-то ссылка на забинденный объект, (self.object) всегда в наличии.

  • Спасибо 1
  • Полезно 1

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine.

Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист.

AMD Ryzen 9 7950X (16 ядер, 5.7ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD.

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

@Zander_driver 

43 минуты назад, Zander_driver сказал:

ГГ мог вообще гранату бросать за угол не глядя, что вам тогда вернет get_target_obj ? ничего, естественно.

А существует возможность сделать проверку, что нпс умер именно от гранаты?

God save Hatsune Miku!

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

В xray extensions есть before_hit коллбек или как он там называется. Вот в нем сохраняй, чем был нанесен последний хит и используй это в death_callback.

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

@Labadal там структура имеется, в которой есть соответствующие id. Возможно даже клиентские объекты, я уже не помню подробностей.

@Labadal вот пример, где получается секция патронов, которыми был нанесен хит неписю 

https://github.com/dsh2dsh/op2ogse/blob/c9346e998b0ae700b20fb56f697a7d6be04213a0/gamedata/scripts/ogse_hitfx.script#L66

когда я ещё XE использовал.

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

@dsh Слушай, а ведь в мультиплеере, при убийстве показывает кого и из чего убил, нельзя использовать это, для определения оружия (или хотя бы типа хита), которым был убит нпс?

God save Hatsune Miku!

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

Если я изменил в движке xrgame.dll (забиндил некоторые кнопки), как мне потом объединить его с XRE? 

Upd:  я хочу перейти на движок 1.0007 со своими некоторыми правками, можно ли на него накатить XRE? Вот конкретней, что мне нужен.

God save Hatsune Miku!

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

Если я изменил в движке xrgame.dll (забиндил некоторые кнопки), как мне потом объединить его с XRE? 

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

 

2 часа назад, Labadal сказал:

Upd:  я хочу перейти на движок 1.0007 со своими некоторыми правками, можно ли на него накатить XRE?

Нельзя, все байты другие. Разбираясь в хексе и зная нужное место из 1.0006, иногда можно найти аналогичное место в 1.0007 и вручную заменить конкретный байт для конкретной правки, если сильно повезет. Но вообще, кто компилирует движки из исходников обычно находят правки на разных репозиториях исходников, уже поправленных кем-то или делают сами.

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

@macron А причем тут хекс? XRE ведь на ассемблере?

А, все, дошло)

Может, есть какой-то другой способ забиндить 6 кнопок, чтобы их можно было изменять в меню и остаться на XRE?

 

God save Hatsune Miku!

Ссылка на комментарий
26.08.2021 в 09:19, Labadal сказал:

Может, есть какой-то другой способ забиндить 6 кнопок,

Если шаришь в скриптах, то на  XRE как-то можно скриптово кнопки биндить. Так, например, в OLR 2.5 клаксон работает.

 

26.08.2021 в 09:19, Labadal сказал:

чтобы их можно было изменять в меню

Ну это вообще "жырнота".

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

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

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

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

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

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

Войти

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

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

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

AMK-Team.ru

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