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

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

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

Как можно отследить выстрел из оружия?

1. Поставить движок OGSR.

2. Использовать в бинд_сталкере колбек on_actor_weapon_fire.

 

А скриптовый метод отлова выстрела делал много лет назад @*Shoker* (в сборочном цехе это его скрипт был) - только это по нынешним временам, люто древний костыль, который существенно грузит апдейт. Не рекомендую таким пользоваться. И полагаю, автор тоже давно не пользуется.

@aromatizer по теме есть что сказать? Или ты просто посты набиваешь.

  • Спасибо 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.

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

 

А можно ли "отследить" изменение переменной? 
Вот, к примеру, выполнить код, если переменная X уменьшилась, скажем, на 5. 

upd: 
Есть такой вот скрипт: 

Скрытый текст
local old_ai_id = 0
local check_ammo = false

function gun()
	local ai = db.actor:active_item()
	if ai then
		if ai:id()~=old_ai_id then
			old_ai_id = ai:id()
			if ai:section() == "оружие" then
				check_ammo = true
				on_change_wpn(ai)
			end
		end
	else
		if old_ai_id~=0 then old_ai_id=0 check_ammo=false end
	end
	if check_ammo then
		local curr_ammo = ai:get_ammo_in_magazine()
		if curr_ammo < ammo_old then
			ammo_old = curr_ammo
			if not level.main_input_receiver() then on_actor_shoot() end
		end
	end
end



function on_change_wpn( obj )
	ammo_old = obj:get_ammo_in_magazine()
end

function on_actor_shoot()
--тут что делать после выстрела
end

 

Он, в целом, работает - но проблема в том, что работает одноразово. Выстрелил  - сработало. Чтобы сработало ещё раз, нужно снять с себя оружие и повесить его обратно в слот. 

Намекните как править

God save Hatsune Miku!

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

upd: 

работать перестает после перезарядки оружия
Перезарядил, нужно вытащить из слота и поставить обратно.  печально. 

upd: нет, дело не в перезарядке, "ломается", когда истратил все патроны, т.е. когда колво-патронов становится равно 0

Или ,всё таки, в перезарядке

upd: 

разобрался

Если вдруг кому-то понадобится в будущем данный костыль, вот: 
*Отследить выстрел из оружия/отследить выстрел при стрельбе*

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

1. Основная функция, вешаем на апдейт: 

local check_ammo = false
local old_ai_id = 0
function gun()
	local ai = db.actor:active_item()
	if ai then
		if ai:id()~=old_ai_id then
			old_ai_id = ai:id()
			if ai:section() == "имя секции оружия" then
				check_ammo = true
				ammo_old = ai:get_ammo_in_magazine()
			end
		end
	else
		if old_ai_id~=0 then old_ai_id=0 check_ammo=false end
	end
	if check_ammo then
		local curr_ammo = ai:get_ammo_in_magazine()
		if curr_ammo < ammo_old then
			ammo_old = curr_ammo
			if not level.main_input_receiver() then on_actor_pay() end
		end
	end
end

2. Функция on_actor_pay():

function on_actor_pay()
-- тут код того, что вы хотите сделать при выстреле
this.start_timer() - запуск таймера
end

3. таймер: 

   function action_timer()
      old_ai_id = 0
   end
 
   function start_timer()
      local iTimer = time_global() + 1000
 
      local function check_timer()
         return time_global() > iTimer
      end
 
      level.add_call(check_timer, action_timer)
   end

Таймер нужен, чтобы присвоить переменной old_ai_id значение 0 через секунду. (этого времени хватает для "перезарядки" оружия) если присвоить переменной old_ai_id значение 0 до того, как оружие перезарядится - функция on_actor_pay() будет срабатывать много раз, пока оружие не перезарядится. Находясь в апдейте - это действительно много раз. 

4. функция preload(), тоже на апдейт:

function preload()
local ai = db.actor:active_item()
	if ai and ai:section() == "имя секции оружия" then
	local curr_ammo_preload = ai:get_ammo_in_magazine()
		if curr_ammo_preload == 0 then
		check_ammo = false
		old_ai_id = 0
		end
	end
end

Нужна для решения бага, который возникал в случае самовольной разрядки оружия, после которого функция "gun" переставала работать. 

 

upd: Да, костыль. Да, корявый. Да, нагружает апдейт.  Но это лучшее решение для тех, кто не хочет/не может качать, к примеру, ОГСР двиг, в котором, как сказал ранее товарищ @Zander_driver, есть для этого каллбек. 

  • Смешно 1

God save Hatsune Miku!

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

upd: 2. Функция on_actor_pay(). (та, что выше, рассчитана для оружия, в котором всего один патрон, эта - подойдет для любого) 

function on_actor_pay()
local curr_ammo_yes = db.actor:active_item():get_ammo_in_magazine()
=============================================--свой код писать только ниже этой полоски
-- тут код того, что вы хотите сделать при выстреле
=============================================--свой код писать только выше этой полоски
if curr_ammo_yes== 0 then
start_timer()
end
end

 

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

God save Hatsune Miku!

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

Всем привет. Решил тут прикрутить-таки звуки приветствия и прощания Сахарову для ТЧ, на манер ЧН...

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

--дописано

 yan_professor_hello                        = {min_snd = 1, max_snd = 1, rnd = 100, prior = 5, rnd_id = id(), into_id = id(), max_ids = {}},
 yan_professor_goodbye                          = {min_snd = 1, max_snd = 1, rnd = 100, prior = 5, rnd_id = id(), into_id = id(), max_ids = {}},

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

--дописано

[yan_professor_hello_rnd]
yan_general_ecolog = 0,scenario\yantar\yan_sakharov_meet_

[yan_professor_goodbye_rnd]
yan_general_ecolog = 0,scenario\yantar\yan_sakharov_meet_bye_

Соотв. звуки добавлены в нужную папку.

А вот с файлом логики Сахарова у меня непонятки.

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

[logic]
active = walker@yan_start
actor_dialogs = actor_dialogs
combat_ignore = combat_ignore
trade = misc\trade_ecolog.ltx
inv_max_weight = 10000

[walker@yan_start]
path_walk = yan_ucheniy_walk_talk
path_look = yan_ucheniy_look_talk
combat_ignore_cond = always
on_info = {-yantar_kruglov_phrase_2 +yantar_scientists_talk} remark@yan_professor_talk_1
on_info2 = {+yantar_kruglov_phrase_2} walker@yan_1
danger = danger_condition@yan_ecolog
def_state_standing = yan_professor_wait
def_state_moving1 = yan_professor_walk
def_state_moving2 = yan_professor_walk
def_state_moving3 = yan_professor_walk
meet = no_meet

[remark@yan_professor_talk_1]
snd = yantar_professor_to_kruglov_1
anim = yan_professor_wait
target = logic@scientist_out_rest, yan_scientist
on_timer = 5000 | %+yantar_kruglov_phrase_1%
on_info = {+yantar_professor_phrase_2} remark@yan_professor_talk_2
combat_ignore_cond = always
danger = danger_condition@yan_ecolog
meet = no_meet

[remark@yan_professor_talk_2]
snd = yantar_professor_to_kruglov_2
anim = yan_professor_wait
target = logic@scientist_out_rest, yan_scientist
on_timer = 5000 | walker@yan_1 %+yantar_kruglov_phrase_2%
combat_ignore_cond = always
danger = danger_condition@yan_ecolog
meet = no_meet

[walker@yan_1]
path_walk = yan_ucheniy_walk
path_look = yan_ucheniy_look
combat_ignore_cond = always
on_info = {+yan_actor_talk_ucheniy} walker@yan_2
on_info2 = {+yan_find_scientist_done} walker@scientist_quest_good    
danger = danger_condition@yan_ecolog
def_state_standing = yan_professor_wait
def_state_moving1 = yan_professor_walk
def_state_moving2 = yan_professor_walk
def_state_moving3 = yan_professor_walk
meet = meet@yan_general_scientist_1

;Дописано
on_actor_dist_le = 2 | remark@yan_professor_hello
on_actor_dist_ge = 4 | remark@yan_professor_goodbye

[walker@scientist_quest_good]
path_walk = yan_ucheniy_walk_talk
path_look = yan_ucheniy_look_talk
combat_ignore_cond = always
on_info = {+yantar_scientist_talk_helmet} remark@talk_about_helmet
danger = danger_condition@yan_ecolog
def_state_standing = yan_professor_wait
def_state_moving1 = yan_professor_walk
def_state_moving2 = yan_professor_walk
def_state_moving3 = yan_professor_walk
meet = meet@yan_general_scientist_1

;Дописано
on_actor_dist_le = 2 | remark3@yan_professor_hello
on_actor_dist_ge = 4 | remark3@yan_professor_goodbye

[remark@talk_about_helmet]
snd = yantar_professor_radiation_quest_2
anim = yan_professor_wait
target = logic@scientist_out_rest, yan_scientist
meet = no_meet
combat_ignore_cond = always
on_signal = sound_end | walker@go_to_room %-yantar_scientist_talk_helmet%
danger = danger_condition@yan_ecolog

[walker@go_to_room]
path_walk = yan_general_scientist_room_walk
path_look = yan_general_scientist_room_look
on_signal = make_helmet | remark@make_helmet
combat_ignore_cond = always
danger = danger_condition@yan_ecolog
meet = no_meet
def_state_standing = yan_professor_wait
def_state_moving1 = yan_professor_walk
def_state_moving2 = yan_professor_walk
def_state_moving3 = yan_professor_walk

[remark@make_helmet]
anim = mode_shlem
target = 920
combat_ignore_cond = always
on_signal = action_end | walker@go_to_actor
danger = danger_condition@yan_ecolog
meet = no_meet

[walker@go_to_actor]
path_walk = yan_ucheniy_walk_talk
path_look = yan_ucheniy_look_talk
combat_ignore_cond = always
on_info = {+yan_kill_brain_task_start} walker@yan_2
danger = danger_condition@yan_ecolog
def_state_standing = yan_professor_wait
def_state_moving1 = yan_professor_walk
def_state_moving2 = yan_professor_walk
def_state_moving3 = yan_professor_walk
meet = meet@yan_general_scientist_1

;Дописано
on_actor_dist_le = 2 | remark3@yan_professor_hello
on_actor_dist_ge = 4 | remark3@yan_professor_goodbye

[walker@yan_2]
path_walk = yan_ucheniy_walk_talk
path_look = yan_ucheniy_look_talk
combat_ignore_cond = always
on_info = {-yan_actor_talk_ucheniy} walker@yan_1
on_info2 = {+yantar_scientist_talk_helmet} remark@talk_about_helmet
meet = meet@yan_general_scientist_1
danger = danger_condition@yan_ecolog
def_state_standing = yan_professor_wait
def_state_moving1 = yan_professor_walk
def_state_moving2 = yan_professor_walk
def_state_moving3 = yan_professor_walk

[meet@yan_general_scientist]
meet_state     = 2 | yan_professor_wait@yantar_professor_talk_1
meet_state_wpn     = 2 | yan_professor_wait@yantar_professor_talk_1
victim         = 2 | actor
victim_wpn     = nil
use             = true
use_wpn         = false

[meet@yan_general_scientist_1]
meet_state     = 1 | yan_professor_wait@yantar_professor_talk_1
meet_state_wpn     = 1 | yan_professor_wait@yantar_professor_talk_1
victim         = 1 | actor
victim_wpn     = nil
use             = true
use_wpn         = false
abuse = false
precond = usability

[meet@no_talk]
meet_state     = 1 | yan_professor_wait@yantar_professor_talk_1
meet_state_wpn     = 1 | yan_professor_wait@yantar_professor_talk_1
victim         = 1 | actor
victim_wpn     = nil
use             = false
use_wpn         = false
abuse = false

[danger_condition@yan_ecolog]
ignore_distance = 0

[actor_dialogs]
id = yantar_general_ucheniy_talk_start,yantar_general_ucheniy_talk_end

[combat_ignore]
combat_ignore_cond = always

;Дописано

[remark@yan_professor_hello]
anim = yan_professor_wait
snd = yan_professor_hello
on_signal = sound_end | walker@yan_1

[remark@yan_professor_goodbye]
anim = yan_professor_wait
snd = yan_professor_goodbye
on_signal = sound_end | walker@yan_1

[remark2@yan_professor_hello]
anim = yan_professor_wait
snd = yan_professor_hello
on_signal = sound_end | walker@yan_2

[remark2@yan_professor_goodbye]
anim = yan_professor_wait
snd = yan_professor_goodbye
on_signal = sound_end | walker@yan_2

[remark3@yan_professor_hello]
anim = yan_professor_wait
snd = yan_professor_hello
on_signal = sound_end | walker@scientist_quest_good

[remark3@yan_professor_goodbye]
anim = yan_professor_wait
snd = yan_professor_goodbye
on_signal = sound_end | walker@scientist_quest_good

В общем, при приближении ближе 2 метров по идее должен здороваться, при удалении более чем на 4 метра прощаться. Но работает только прощание изредка и то при этом, Сахарова можно поймать при подходе к столу так, что будет звучать только рандомное прощание. Где я с логикой накосячил?

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

@Colder , что-то вроде такого (если вызывать из логики)

function some_monster_inside(actor, rest)
  local obj 
  for k,v in pairs(db.storage) do
    obj = level.object_by_id(k)
    if obj and alife():object(k) and IsMonster(obj) then
      if rest:inside(obj:position()) then
        return true
      end
    end
  end
  return false
end
Изменено пользователем naxac
  • Спасибо 1

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

naxac.gif

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

Подскажите, пожалуйста, есть ли способ вывести систему репутации на худ и представить её в виде шкалы, где плохая репутация окрашивается в красный, хорошая в зеленый соответственно? Возможно что-то подобное уже было реализовано, если да, то прошу оповестить.

 

Платформа ТЧ.

 

https://infamous.fandom.com/wiki/Karma?file=Meter.jpg

 

540?cb=20110510160814

 

P.S. В скриншотах показываю как в идеале должно это выглядить. Игра на скрине, если что, игра Infamous.

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

Создал фриплейный старт игры https://yadi.sk/i/ya2rFPr8BFbS-A

 

Пытаюсь заспавнить предметы в инвентарь так:

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

Сама кнопка

 

function ui_main_menu_new:novice_on_start()
    local console = get_console()
    console:execute("g_game_difficulty gd_novice")
    self:StartGame()
    start_game_novice()
end

 

Функция

 

function start_game_novice()

local spawn_items = {

    "wpn_pm",
    "medkit",
    "conserva",
    "zvezda_2",
    "bandage"

}

    for i = 1,2 do
    table.insert(spawn_items, "ammo_9x18_fmj")
end
    local k,v = 0,0
    for k,v in pairs(spawn_items) do
    alife():create(v,
    db.actor:position(),
    db.actor:level_vertex_id(),
    db.actor:game_vertex_id(),
    db.actor:id())
end
end

Может кто подсказать как все таки заспавнить предметы.

 

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

function start_game_novice()
    local ini = ini_file("misc\\items_link.ltx")
    if not ini then ini=system_ini() end
    if ini:section_exist("generic_list") then
    local n = ini:line_count("generic_list")
    local key = math.random(0,n-1)
    local result, item, num = ini:r_line("generic_list",key,"","")
    return item, num
end
end

 

в ltx

[generic_list]
wpn_pm = 0.7

Тоже не выходит

Ссылка на комментарий
7 часов назад, Colder сказал:

скрипт отлова мини-карты?

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

function init_minimap()
  local wnd = get_main_window()
  minimap_static = wnd:GetStatic( "minimap" )
  back_static    = wnd:GetStatic( "minimap:background" )
  frame_static   = wnd:GetStatic( "minimap:level_frame" )
  compass_static = wnd:GetStatic( "minimap:compass" )
end

 

P.S Можешь посмотреть тут еще https://github.com/dsh2dsh/op2ogse/blob/master/gamedata/scripts/dsh/dsh_ui_minimap.script#L94

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

Здравствуйте, не могу разобраться как работает модуль m_netpk от Artos'a, хочу попробовать как в примере переместить вентилятор из бункера на тумбочку в лагере новичков, но не чего не происходит.

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

И всё-таки что за ерунда с вылетом вида:

stack trace:

0023:05175AF0 xrGame.dll
[error][      87]    : Параметр задан неверно.

Делаем квиксейв клавишей F6, при попытке загрузиться с него клавишей F7 (или другой назначенной) - вылет выше, при попытке загрузиться с него из меню - всё грузится нормально...

 

Ссылка на комментарий
1 час назад, Капрал Хикс сказал:

Параметр задан неверно

Ну вот очень знакомые слова. Значит где-то встречал. Здесь видел или себя, но у себя я всегда назначаю клавиши F5/F8. Если такой вылет и был у меня, то либо вначале игры на базовых настойках, либо он возможен на моих тоже...

Здесь могла быть ваша реклама.

Ссылка на комментарий
7 часов назад, mole venomous сказал:

Ну вот очень знакомые слова.

Страница 556 этой темы, я уже сталкивался с подобным и мне помогли, а тут опять эта ерунда вылезла.

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

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

Может такое быть, что вылет вида: 

stack trace:

0023:05175AF0 xrGame.dll
[error][      87]    : Параметр задан неверно.

вызван тем, что какой-то из скриптов сохранён в формате UTF-8, а не ANSI? Я просто не знаю, на что подумать ещё.

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

Приветствую всех! Созрело несколько вопросов, на которые (хотя бы на некоторые) хотелось бы получить ответ, либо же дельный совет.

 

1. Подскажите как в главном меню можно изменить разрешение видео с 1024х768 на 1920х1080 без правок двига?

2. Как можно сменить имя и иконку гг по ходу игры?

3. Есть ли способ вывести на худ переработанную карму (репутацию) гг и представить ее в числовом виде (то есть, допустим, при обыске персонажа карма уменьшается, на худ приходит уведомление + число на худе уменьшается на 5 показателей)?

4. Как можно вывести иконку гг на худ и сделать ее динамической (то есть настроить сменяемость картинок таким образом, чтобы получилась анимация (примерно как в 1 думе)).

5. Есть ли способ вывода любого изображения на сам худ инвентаря? (Допустим, на место где указано имя и иконка гг)

6. Также интересует момент с выводом абсолютно рандомной динамической картинки на карту пда, чтобы, допустим, закрасить недоступные локации, а потом эти картинки убрать.

7. Существует ли на чистом тч нормальный пак с анимациями применения предметов из инвентаря. Интересует именно в высоком разрешении анимации, допустим, как от LADS, но на чистой ТЧ.

8. Прошу скинуть скрипты на тч, которые не дают игроку открыть пда, инвентарь и диалоговое окно.

 

Платформа разработки, соответственно, ТЧ.

 

Заранее спасибо!

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

Новые окна в интерфейсе:

1. Позади существующих окон или в свободной области, авто-скрытие вместе с HUD: get_hud():Add/RemoveCustomStatic(имя), где имя – ссылка на XML-описание окна или хотя бы пустышки в [config\ui\ui_custom_msgs.xml].

2. Поверх существующих окон, скрывать вручную (в катсценах по инфо-поршням или привязкой к [scripts\xr_effects.script] disable_ui, при использовании оптики через апдейт и т. д.): get_hud():Add/RemoveDialogToRender(cuiw), где cuiw – окно класса CUIWindow или любого из дочерних классов со скриптовым описанием. Вариант: level.add/remove_dialog_to_render(cuiw). Обязательно сохранять такие окна в переменные и чистить их в actor_binder:net_destroy(), если окна могут быть открытыми при перезагрузке (включая смерть при открытом инвентаре).

3. Привязкой к движковым окнам – например, к инвентарю: инфо-поршень ui_inventory + inv = level.main_input_receiver(), затем inv:AttachChild(cuiw). При перезагрузке хотя бы закрывать дочерние окна, а лучше удалять при каждом выходе из инвентаря.

 

Варианты анимации текстур:

1. Цикл с запуском от случайного кадра: текстовый файл с именем текстуры, расширением SEQ и описанием "кадров/с имя имя …" Образец – анимированный указатель мыши. Можно ставить несколько одинаковых кадров для вывода дольше секунды или с долями, вроде "2 кадра в секунду + 3 копии = 1,5 секунды на кадр".

2. Анимация с набором кадров в общей текстуре: XML-описание под заголовком <a_static> (не везде работает) или скриптовый вызов InitAnimStatic(окно, родитель). Образец – анимированные кольца и кубики в заголовках "Энциклопедии".

3. Теги анимации light_anim и xform_anim в XML-описании – мигание с циклом 1 или 2 секунды, поворот на месте, масштаб ±. Список доступных вариантов – [gamedata\lanims.xr].

4. Скриптовая замена текстуры окна по таймеру с привязкой к time_global() через апдейт.

 

Способ запретить диалог или инвентарь, ЕМНИП, в чистом ТЧ только один: отследить любое окно через апдейт level.main_input_receiver() ~= nil или отдельно по инфо-поршням ui_trade / ui_inventory / ui_talk / ui_pda, после чего закрыть окно wnd = level.main_input_receiver() через level.start_stop_menu(wnd) или wnd:GetHolder():start_stop_menu(wnd). Скрипт реагирует на событие вывода окна, так что долю секунды будет и само окно, и взаимодействие с ним.

 

Для закрашивания области карты с учетом перемещения можно, разве что, создать метку level.map_add_object_spot(id, имя, "") с непрозрачной текстурой, но это еще надо сослаться на id какого-то объекта – можно на id рестриктора, если область с логикой, вроде аномалии, тайника или зоны "убрать оружие".

  • Полезно 2
  • Сомнительно 1

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

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

@Rod_K 

Практически все ваши хотелки - только под правку движка, некоторые частично можно реализовать скриптовыми кривыми костылями(уже примерно написал NE). Если вы надеетесь на чудо, что кто-то вам щас вынет зайчика из шляпы - забудьте.

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

@Rod_K Половину списка можно сделать и без правок движка( мб и больше ),ноо,в исходя из данных вопросов,  ПОКА ЧТО не в твоём случае

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

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

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

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

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

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

Войти

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

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

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

AMK-Team.ru

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