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

[SoC] Ковыряемся в файлах


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

@Dennis_Chikin, в общем вышел из положения таким образом:

upd. Упс, меня уже опередили.

        ltx = ltx.. "[logic@" .. gname .. "_prayer" .. i .. "]\n" ..
                    "active              = walker@" .. gname .. "_prayer" .. i .. "\n" ..
                    "combat_ignore       = combat_ignore\n" ..
		    "on_hit		 = %+pri_monolith_base_attack_altar_zone%\n" ..
		    "on_death		 = %+pri_monolith_base_attack_altar_zone%\n" ..

                    "[walker@" .. gname .. "_prayer" .. i .. "]\n" ..
                    "path_walk           = prayer" .. i .. "_walk\n" ..
                    "path_look           = prayer_look" .. math.random(1, 2) .. "\n" ..
                    "danger              = danger@monolith\n" ..
                    "combat_ignore_cond  = {-pri_monolith_base_attack_altar_zone}\n"

З.Ы. И тем не менее, совершенно не понятно, как эта ошибка вылезла. На чистом ТЧ этой проблемы ведь нет. Может-ли это быть связано с правками, вносимыми в движок проектом X-Ray extensions?

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

aka Stalker_AleX333
 
Мои проекты  - ЯндексДиск   |   Я на Gamer-Mods.ru

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

, проверь. Логика у тебя неверная, твой on_hit/on_death вернет nil, вылета не будет, но и не произойдет ничего. Хотя у разрабов там тоже весьма все со странностями, видимо в разное время функции писали.

 

upd:

, тогда видимо я чего-то не уловил в xr_logic. Хотя надо еще в сторону оверрайда глянуть, т.к. в оригинале они по моему тоже стреляют.

 

upd2:

Проверил, косячит оверрайд, либо что-то еще мне неведомое, все устройство поведения на грани фантастики.

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

@Карлан, да вроде все работает. Опасности нет - НПС посидели на точках и ушли к костру "медитировать". Дал хит - лупят по ГГ в ответ.

aka Stalker_AleX333
 
Мои проекты  - ЯндексДиск   |   Я на Gamer-Mods.ru

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

@Dennis_Chikin@Карлан, вот смотрю я в rx_wmgr.script соляночный. Там вижу манипулирование какими-то запрятанными инвентарными ящиками и постоянный трансфер оружия между ящиком и неписем. И это все только для того, что бы у сталкеров спрятать оружие, что бы они свое единственное не продали?

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

И чтоб не выбирали "неправильное". Зачем оно так сделано - не знаю. Вообще, вся эта конструкция в том виде, в котором есть, скорее не работает, чем работает.


 

 

Проверил, косячит оверрайд,

 

Вчера ж обсуждали. Или позавчера. Читать-то его внутри схемы кто будет ?

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

@Dennis_Chikin, может кто-то задался тем-же вопросом, что и я, и сделал такое. Что бы неразумные неписи не продали хитрому Меченному единственный калаш. :) У меня, собственно говоря, этот вопрос возник потому, что я перенес в ОП-2 rx_wmgr из OGSE 0.6.9.3, в котором убрано все это манипулирование ящиками, и обнаружил вот такое вот поведение. Вот теперь думаю, что с этим делать. Объявить фичей или багом. :)

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

Но вообще - странный подход: спрашивают - "как сделать", ответ - "а у меня сделано".

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

А релиза пока нету.

 

А принцип описать хотя-бы коротко, раз уж сделано ? dc

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

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

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

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

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

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

 

Но еще раз тебе говорю, ты с флагами накосячил.
 

Вчера ж обсуждали. Или позавчера. Читать-то его внутри схемы кто будет ?

Да, я просто всегда считал что уж для сталкеров он работает, хотя себя вспомнить - ни разу не работал, у меня лично вообще на практике только дангер нормально отрабатывает. А разбираться во всей этой структуре долго и бесполезно, там действительно уже лучше все переписать, но без движка опять мартышкин труд будет.

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

Кстати, о движках и не-движках, картинка.

 

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

Изменено пользователем Dennis_Chikin
  • Нравится 3
Ссылка на комментарий

Давно хотел, а сегодня наконец руки дошли.

Здорово! Рабочий вариант выложен будет?

 

Я еще чуть-чуть народ поинтригую, а потом тайну золотого ключа раскрою. Вообще не понимаю, почему это не сделали в 2008 году. Элементарно же. Легким движением руки.

Можно даже уже догадаться, просто зная, что факт имеет быть. dc

 

 

описание всех визуалов ТЧ(желательно с картинками)?

Есть для всех трёх игр подробное, на одном из порталов по сталкеру.

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

Небольшой апдейт о проблеме с секцией [hit@altar_monolith] логики НПС, в гулаге на Припяти, описаннго мной страницой ранее.

Вот, собственно, похоже и виновник, модифицированный xr_hit.script:

 

 

class "action_process_hit"

function action_process_hit:__init(obj, storage)
	self.object = obj
	self.st = storage
end

function action_process_hit:hit_callback(obj, amount, local_direction, who, bone_index)
	db.storage[self.object:id()].hit.bone_index = bone_index
	if amount == 0 and not(obj:invulnerable()) then
		-- FIXME if_then_else
--		printf("[%s] hit by [%s]: 0 damage, ignoring", obj:name(), if_then_else(who, who:name(), "<no one>"))
		return
	end
	if who then
		printf("[%s] hit by [%s]", obj:name(), who:name())
		db.storage[obj:id()].hit.who = who:id()
	else
		printf("[%s] hit by [Unknown]", victim:name())
		db.storage[obj:id()].hit.who = -1
	end
	if db.storage[self.object:id()].active_scheme then
		--printf("DEADLY HIT %s %s", amount, self.object.health)
		db.storage[self.object:id()].hit.deadly_hit = amount >= self.object.health*100

		if xr_logic.try_switch_to_another_section(obj, db.storage[self.object:id()].hit, db.actor) then
			db.storage[self.object:id()].hit.deadly_hit = false
			return
		end
		db.storage[self.object:id()].hit.deadly_hit = false
	end
end

----------------------------------------------------------------------------------------------------------------------
-- binder
----------------------------------------------------------------------------------------------------------------------
function add_to_binder(npc, ini, scheme, section, storage)
 	local new_action = this.action_process_hit(npc, storage)
	storage.action = new_action
end

function set_hit_checker(npc, ini, scheme, section)
	local st = xr_logic.assign_storage_and_bind(npc, ini, scheme, section)
	
	if not ini:section_exist(section) then
		abort("There is no section [%s] for npc [%s]", section, npc:name()) -- а вот и та самая часть
	end
	
	st.logic = xr_logic.cfg_get_switch_conditions(ini, section, npc)

	-- НЕ СТАВИТЬ hit callback напрямую - получаем его из motivator-а через
	-- event в подписанном на него action-е:
	--npc:set_callback(callback.hit, st.action.hit_callback, st.action)
	xr_logic.subscribe_action_for_events(npc, st, st.action)
end

function disable_scheme(npc, scheme)
	-- При отключении схемы, нужно снять подписку, чтобы hit callback перестал
	-- передаваться:
	-- npc:set_callback(callback.hit, nil)
	local st = db.storage[npc:id()][scheme]
	if st then
		xr_logic.unsubscribe_action_from_events(npc, st, st.action)
	end
end 

Честно говоря, уже и не помню, от чего мне достались данные правки. И есть ли в них смысл сейчас.

 

 

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

aka Stalker_AleX333
 
Мои проекты  - ЯндексДиск   |   Я на Gamer-Mods.ru

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

, интересно что за "модмейкер" его "модифицировал". В ТЧ не было никогда invulnerable.

 

Элементарно же. Легким движением руки.

Вроде-бы не только я тут описывал как это сделать. Причем даже не одним способом, но самый простой это как объем в АМК. Только на пороге перегруза актора чем-то действительно перегружать.

 

А еще проще ? Кстати, ты вообще обратил внимание на цифры на картинке ? dc

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

@Карлан, надо было мне просто повнимательнее почитать код. Это наработки кого-то из наших форумчан, я лишь кое-что изменил под свои нужды. Суть - временное бессмертие НПС. Устанавливаемое и снимаемое через логику. Основной скрипт:

 

 

function is_need_invulnerability(npc) 
                  local npc_st = db.storage[npc:id()] 
                  local invulnerability = utils.cfg_get_string(npc_st.ini, npc_st.active_section, "invulnerable", npc, false, "", nil) 

                  if invulnerability == nil then 
                   return false 
                  end 

                  invulnerability = xr_logic.parse_condlist(npc, "invulnerability", "invulnerability", invulnerability) 

                  return xr_logic.pick_section_from_condlist(db.actor, npc, invulnerability) == "true" 
end 

-- Вызывается на переключении на новую секцию. Производит вычитывание настроек из текущей секции
function reset_invulnerability(npc, ini, section) 
                  local invulnerability = is_need_invulnerability(npc) 

                  printf("RESET INVULNERABILITY. npc[%s] = [%s]", npc:name(), tostring(invulnerability)) 
                  if npc:invulnerable() ~= invulnerability then 
                   npc:invulnerable(invulnerability) 
                  end 
end 
function disable_invulnerability(npc) 
                  printf("DISABLE INVULNERABILITY. npc[%s] = [false]", npc:name()) 
                  npc:invulnerable(false) 
end 

function update_invulnerability(npc) 
                  local invulnerability = is_need_invulnerability(npc) 

                  if npc:invulnerable() ~= invulnerability then 
                   printf("UPDATE INVULNERABILITY. npc[%s] = [%s]", npc:name(), tostring(invulnerability)) 
                   npc:invulnerable(invulnerability) 
                  end 
end 

 

 

aka Stalker_AleX333
 
Мои проекты  - ЯндексДиск   |   Я на Gamer-Mods.ru

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

А при чем здесь модификации, если при формировании динамического ltx идет ссылка на секцию, которой в этом ltx и рядом не стояло ? Просто либо монолитовцы реагируют на дэнжер/видят врага, и срываются в бой, игнорируя любую логику, либо получат хит, и радостно виснут.

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

@Dennis_Chikin, хз. Никогда не вдавался в подробности того, что ПЫС творили с логикой НПС в своих гулагах. Во всяком случае удаление

if not ini:section_exist(section) then
    abort("There is no section [%s] for npc [%s]", section, npc:name())
end 

"решает" проблему.

Изменено пользователем Stalker_AleX333
Добавлено Kirgudu,

Нарушение пункта 2.0 Правил форума.

Устное предупреждение.

  • Нравится 1

aka Stalker_AleX333
 
Мои проекты  - ЯндексДиск   |   Я на Gamer-Mods.ru

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

Замечательно. Прячем проблему, которую в свое время кто-то нашел и вытащил на свет, обратно. И считаем, что ее решили. А если будет вылетать "по стеку" или вообще без лога, то всегда можно посоветовать "добавить памяти" или "не лезь своими кривыми руками в мой совершенно безглючный мод".

 

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

Изменено пользователем Dennis_Chikin
  • Согласен 2
Ссылка на комментарий

Извините за нубский вопрос, но какая консольная команда отвечает за дальность прорисовки теней на R2?

Тыкните носом где есть описания консольным командам. :russian_ru:

И еще, может у кого завалялся патчер для exe-шника который изменяет размер карты теней на -smap4096.

NL-Vincenz.gif

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

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

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

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

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

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

Войти

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

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

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