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

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

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

 

upd: да, оно еще и с  ошибкой.

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

Прошу помощи. Сам в скриптах не силён.

Есть функция проигрывания звукового файла:

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

function CSurgeManager:play_siren_sound()
	local snd_obj=self.blowout_sounds["siren"]
	local snd_position
	if snd_obj ~= nil and snd_obj:playing() then
		snd_obj:stop()
	end
	if(level.name()=="zaton") then
		snd_position=vector():set(115,8,184)
	elseif(level.name()=="jupiter") then
		snd_position=vector():set(-50,16,198)
	else
		snd_position=vector():set(147,15,-187)
	end
	if snd_obj ~= nil then
		snd_obj:play_at_pos(db.actor, snd_position)
		snd_obj.volume = 1
		--self.debugMessages[12]:SetText("playing: "..tostring(id))
	end
end

 

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

Ссылка на комментарий
function CSurgeManager:play_siren_sound()
	local snd_obj=self.blowout_sounds["siren"]

В таком виде "извне" уже недоступно. Править саму функцию.

А поскольку сделано "псевдообъектом" - то еще и его куда-то вытягивать.

 

Проще написать свое.

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

Есть способ отловить какой скрипт вызывает вылет? Адаптирую улучшенный ai к правленому движку, ловлю вылет, раньше такого не видел.
 

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

FATAL ERROR
 
[error]Expression    : !m_error_code
[error]Function      : raii_guard::~raii_guard
[error]File          : ..\xrServerEntities\script_storage.cpp
[error]Line          : 540
[error]Description   : game_object:id() threw an exception

 

Ссылка на комментарий
15 hours ago, vampirnik77 said:

разве эти два условия не равносильны?

 

Строго говоря, эти условия не равнозначны. Однако, второе является избыточным, так как либо равно true (и таким образом не влияет на результат вне зависимости от значения p[2]), либо совпадает с первым, когда p[2] равно nil (поскольку в этом случае p[2] эквивалентно false), и соответственно тоже не влияет на результат. Зачем это сделано трудно предположить. Версия, что автор этого кода не знал об особенностях Lua и перестраховывался отпадает, поскольку избыточное условие стоит вторым и значит проверяется после первого и значит никак не страхует от проверки в первом условии потенциального значения nil.

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

Ссылка на комментарий
5 hours ago, vampirnik77 said:

Есть способ отловить какой скрипт вызывает вылет?

Если вылет вызван скриптом, то при вылете будет показан стек Lua и соответственно сбойный скрипт. Если этого нет, то напрашивается вывод, что сбой вызван не скриптом.

  • Спасибо 1
 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

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

Решил попробовать восстановить в ЗП конструкцию тайников как в ТЧ/ЧН, в общем такая проблема: н своей локации поставил рестриктор:

[logic]
active = sr_idle@start

[sr_idle@start]
on_actor_inside = sr_idle@nil %=give_treasure(esc_treasure_1)%

[sr_idle@nil]

Условие: при входе в рестриктор получаем информацию о тайнике, при входе в рестриктор - вылет

stack trace:
001B:049CB7D0 lua.JIT.1.1.4.dll, lua_yield()

 

Как я понимаю - ошибка скриптов, вот функция выдачи тайника

function give_treasure(treasure_id)
	if treasures[treasure_id] ~= nil then
		if treasures[treasure_id].active ~= true then
			treasures[treasure_id]:give_treasure()
		else
			local active_treasure = get_active_treasure_by_target(treasures[treasure_id].target)
			abort("Unable to give treasure [%s] because inventory box is already in use by treasure [%s]", treasure_id, active_treasure)
		end
	else
		abort("There is no treasure with id [%s]", treasure_id)
	end
end
function get_active_treasure_by_target(target)
	for k,v in pairs(treasure_by_target[target]) do
		if v.active == true then
			return v.section
		end
	end
	return "nil"
end

PS: inventory box с названием "esc_treasure_1" на локацию добавил, также прописал ему story_id

PS 2: Без story_id ничего не происходит, ни вылета - ни выдачи

"Люди — животные, не имеющие ни страха, ни уважения, ни сочувствия. Лишь только блеск выгоды в глазах" © Алексей Шевцов

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

OC: Windows 10 Home, Видеокарта: NVIDIA GeForce GTX 1050 TI 4ГБ, Процессор: Intel Core i3 7100 3900 МГц 2 ядра, RAM(ОЗУ): 8ГБ DDR4, ROM(ПЗУ): 1ТБ

 

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

esc_treasure_1 - это имя тайника, ID, StoryID ?

И имя тайника/бокса и Story_ID тайника/бокса(одновременно), как я понимаю проблема в этом?

По-моему получение айди объекта по его name было вырезано из ЗП - нужно прописывать StoryID

 

PS я пока что в скриптовании нуб :) Могу понять что в них написано, но не могу написать собственный

"Люди — животные, не имеющие ни страха, ни уважения, ни сочувствия. Лишь только блеск выгоды в глазах" © Алексей Шевцов

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

OC: Windows 10 Home, Видеокарта: NVIDIA GeForce GTX 1050 TI 4ГБ, Процессор: Intel Core i3 7100 3900 МГц 2 ядра, RAM(ОЗУ): 8ГБ DDR4, ROM(ПЗУ): 1ТБ

 

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

treasures[treasure_id].active в данном случае - из того, что мы здесь видим -  является попыткой извлечь что-то из nil.  Что предполагалось получить таким способом - сложно сказать.

 

Впрочем, для начала, еще интересно, ОТКУДА должно что-то вызываться в

on_actor_inside = sr_idle@nil %=give_treasure(esc_treasure_1)%

и есть ли оно ТАМ.

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

ОТКУДА должно что-то вызываться в

on_actor_inside = sr_idle@nil %=give_treasure(esc_treasure_1)%

и есть ли оно ТАМ.

При входе в один из space restrictor поставленных на локации, должно выскакивать смс "получена информация о тайнике" и в invertory box под названием "esc_treasure_1" должны заспавниться вещи прописанные в misc\treasure_manager.ltx(или из подключенного к нему файла)

[list_treasure_escape]
esc_treasure_1

[esc_treasure_1] 
target = esc_treasure_1
name = st_esc_cross_2
description = st_esc_cross_2_descr
items = medkit, 1, antirad, 1
condlist = {=actor_on_level(escape)} true, false

c592ef0841b585e1afdb2b072bbb8eca.png

 

Но при входе в это space restrictor происходит вылет stack trace, также он ИНОГДА происходит при обыске трупов - свидетельство того что возможно работает эта функция:

function use(npc)
	printf("treasure_manager: npc[%s] is used by actor", npc:name())
	local available_treasures = {}
	local selected_treasure = nil
	for k,v in pairs(treasures) do
--[[
		printf("found treasure %s", tostring(v.section))
		-- Проверить доступность по кондлисту.
		printf("    condlist %s", tostring(xr_logic.pick_section_from_condlist(db.actor, npc, v.condlist)))
		-- Проверить доступность по рангу.
		printf("    rank %s", tostring(v:check_rank_and_community(npc)))
		-- Проверить не выдан ли он уже.
		printf("    active %s", tostring(v.active))
		-- Проверить не выдан ли другой тайник на этот же таргет.
		printf("    used %s", tostring(v:check_for_used_target()))
		printf("    cost=%d", v.treasure_cost)
]]
		if xr_logic.pick_section_from_condlist(db.actor, npc, v.condlist) == "true" and
			v:check_rank_and_community(npc) == true and v.active ~= true and v:check_for_used_target() == true and (v.treasure_cost==0) then	-- 24.04.08
			table.insert(available_treasures, v)
		end
	end
	if #available_treasures == 0 or math.random(100) > 20 then
		return
	end
	selected_treasure = available_treasures[math.random(1, #available_treasures)]
	selected_treasure:give_treasure()
end

 

"Люди — животные, не имеющие ни страха, ни уважения, ни сочувствия. Лишь только блеск выгоды в глазах" © Алексей Шевцов

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

OC: Windows 10 Home, Видеокарта: NVIDIA GeForce GTX 1050 TI 4ГБ, Процессор: Intel Core i3 7100 3900 МГц 2 ядра, RAM(ОЗУ): 8ГБ DDR4, ROM(ПЗУ): 1ТБ

 

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

PS: как известно все команды в логике space restrictor  юзаются из функций в xr_effects.script

Команда give_treasure в xr_effects.script

function give_treasure (actor, npc, p)
	if p == nil then abort("Required parameter is [NIL]") end
	for k,v in pairs(p) do
		treasure_manager.give_treasure(v)
	end
end

 

  • Сомнительно 1

"Люди — животные, не имеющие ни страха, ни уважения, ни сочувствия. Лишь только блеск выгоды в глазах" © Алексей Шевцов

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

OC: Windows 10 Home, Видеокарта: NVIDIA GeForce GTX 1050 TI 4ГБ, Процессор: Intel Core i3 7100 3900 МГц 2 ядра, RAM(ОЗУ): 8ГБ DDR4, ROM(ПЗУ): 1ТБ

 

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

Гм, ну тогда надо смотреть, как (чем) заполняется treasures[]

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

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

Знакомый  играет в ПВМ и у него то ли баг, то ли еще что, но квестовый персонаж (торговец) стал вржадебным, как то можно его "помирить" с гг, скриптово конечно?

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

как то можно его "помирить" с гг, скриптово конечно?

set_goodwill_ex(int<who_id>, int<to_whom_id>, int<goodwill>) - устанавливает отношения между персонажами. Это в X-Ray extensions

 

relation_registry.set_community_goodwill ("military", db.actor:id (), 1500)  -- прибавить 1500 к дружелюбности военных к ГГ.

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

В скрипте по спавну левелЧанжеров есть такой код:

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

if shape_type == 0 then
            -- sphere
            local center         = packet:r_vec3()
            local radius         = packet:r_float()
        else
            -- box
            local axis_x_x = packet:r_float()
            local axis_x_y = packet:r_float()
            local axis_x_z = packet:r_float()
            local axis_y_x = packet:r_float()
            local axis_y_y = packet:r_float()
            local axis_y_z = packet:r_float()
            local axis_z_x = packet:r_float()
            local axis_z_y = packet:r_float()
            local axis_z_z = packet:r_float()
            local offset_x = packet:r_float()
            local offset_y = packet:r_float()
            local offset_z = packet:r_float()
        end
    end

 

Меня интересует бокс и что это за способ его задания по осям, ообенно вот это: ось xx, xy, x, y  ??

 

Картинка

Добавлено  HellRatz,

Объединил.

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

@Graff46 Смысл указывать 12 ребер, для построения куба, когда можно задать куб  3 сторонами по осям и диагоналями. Не здесь ли порылся чернобыльский пёс ?

Рисунок красивый.

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

"Кругом зомби.....у меня кончаются патроны...."

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

Смысл указывать 12 ребер

Мне надо понять как строится куб по рёбрам! Я то привык по крестьянски по 6 вершинам. Если можно с картинками.

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

Хай, пиплы. Возникла проблема с логикой. Как правильно сделать, что-бы НПС становлися враждебным при наличии поршня + переходил на другую схему логики? У меня получилось так:
 

[logic]
active = walker@stay_at_position
danger = danger_ignore

[danger_ignore]
ignore_distance = 5

[walker@stay_at_position]
path_walk = jup_zubr_kvest2_stay_at_position_walk
path_look = jup_zubr_kvest2_stay_at_position_look
corpse_detection_enabled = false
gather_items_enabled = false
help_wounded_enabled = false
on_info = {+zamok_otkaz_ot_oplati} walker@logic2 %=actor_enemy%

[walker@logic2]
corpse_detection_enabled = false
gather_items_enabled = false
help_wounded_enabled = false

Но в итоге получаю это: 
 

[error]Expression    : !m_error_code
[error]Function      : raii_guard::~raii_guard
[error]File          : ..\xrServerEntities\script_storage.cpp
[error]Line          : 748
[error]Description   : ...k.e.r the stumbling block\gamedata\scripts\_g.script:479: bad argument #2 to 'format' (string expected, got nil)

Помогите, я уже 3 дня ломаю голову, как сделать этот чертов момент(через сквад нельзя - спавн нпс идет не через него, а заменить тоже нельзя - сама задумка сюжета не получится).

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

Хай, пиплы. Возникла проблема с логикой. Как правильно сделать, что-бы НПС становлися враждебным при наличии поршня + переходил на другую схему логики? У меня получилось так:
 


[logic]
active = walker@stay_at_position
danger = danger_ignore

[danger_ignore]
ignore_distance = 5

[walker@stay_at_position]
path_walk = jup_zubr_kvest2_stay_at_position_walk
path_look = jup_zubr_kvest2_stay_at_position_look
corpse_detection_enabled = false
gather_items_enabled = false
help_wounded_enabled = false
on_info = {+zamok_otkaz_ot_oplati} walker@logic2 %=actor_enemy%

[walker@logic2]
corpse_detection_enabled = false
gather_items_enabled = false
help_wounded_enabled = false

Но в итоге получаю это: 
 


[error]Expression    : !m_error_code
[error]Function      : raii_guard::~raii_guard
[error]File          : ..\xrServerEntities\script_storage.cpp
[error]Line          : 748
[error]Description   : ...k.e.r the stumbling block\gamedata\scripts\_g.script:479: bad argument #2 to 'format' (string expected, got nil)

Помогите, я уже 3 дня ломаю голову, как сделать этот чертов момент(через сквад нельзя - спавн нпс идет не через него, а заменить тоже нельзя - сама задумка сюжета не получится).

Судя по логу ошибка расшифровывается следующим образом: в _g.script в строке 479 конфликтует второй аргумент функции (я полагаю), в этом моменте скрипт ожидает строчное значение,  а на деле получает пустое(nil)

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

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

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

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

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

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

Войти

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

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

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

AMK-Team.ru

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