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

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

Значит взялся я ремкомплекты "отсебятские" делать для ТЧ. Логика такая:

   +Юзаем комплект - в инвентарь спавнится открытый ремкомплект.

   +Юзаем открытый ремкомплект - открывается окно с вариантами "Починить" и "Закрыть".

 

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

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



--FUNCTION TO CHECK USED ITEM
function mod_func_check_used_item(obj)
	mod_dbg("something used")
	
    if(obj~=nil) then 
		local t_s_sect = obj:section()
		
		mod_dbg("cond now "..l_n_repairkit_cond)
		
		if(l_n_repairkit_cond==-1) then
			if(string.sub(t_s_sect,1,9)=="repairkit") then
				mod_func_respawn_kit(obj,true)
			elseif(string.sub(t_s_sect,1,16)=="opened_repairkit") then
				mod_func_respawn_kit(obj,true)
				
				local t_u_rep_act = ui_repairkit.mod_repair_action_ui(get_hud())
				level.start_stop_menu(t_u_rep_act, true)
			end
		end
    end
end









--REPAIR FUNCTION
function mod_func_repair_item(i_kit,n_slot)
	local t_i_repair = db.actor:item_in_slot(n_slot)
	
	local t_s_kittype = i_kit:section()
	
	local t_n_repairkit_cond = i_kit:condition()
	
	
	
	if(t_i_repair~=nil) then
		local t_s_sound = [[interface\inv_ruck]]   --предмет сильно сломан
		--[[interface\inv_belt]]     --звук пополнения
		
		local t_n_cond = t_i_repair:condition()
		local t_n_repaircond = 1-t_n_cond
		local t_n_newcond = 1
		
		if(t_n_cond>0.26) then
			if(n_slot==6) then
				t_s_sound = [[interface\inv_belt]]   --броня починена
			else
				t_s_sound = [[interface\inv_attach_addon]]   --предмет починен
			end
			
			if(t_n_repairkit_cond<t_n_repaircond) then
				t_n_newcond = t_n_cond+t_n_repairkit_cond
				t_n_repairkit_cond = 0
			else
				t_n_repairkit_cond = t_n_repairkit_cond-t_n_repaircond
			end
			
			t_i_repair:set_condition(t_n_newcond)
		end
		
		local snd_obj = xr_sound.get_safe_sound_object(t_s_sound)
		snd_obj:play_no_feedback(db.actor, sound_object.s2d, 0, vector(), 1.0)
	end
end









--SET NEW REPAIRKIT CONDITION
function mod_set_newkit_condition(n_id)
	local t_i_newkit = level.object_by_id(n_id)
	
	if(t_i_newkit~=nil) then
		t_i_newkit:set_condition(l_n_repairkit_cond)
	else
		l_i_mod_repairkit = nil
	end
	
	l_n_repairkit_cond = -1
end



function mod_func_respawn_kit(obj,open)
	l_n_repairkit_cond = obj:condition()
	
	local t_s_sect = obj:section()
	
	if(open==true) then
		t_s_sect = "opened_"..t_s_sect
	end
				
	l_i_mod_repairkit = alife():create(t_s_sect, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
	level.client_spawn_manager():add(l_i_mod_repairkit, -1, mod_set_newkit_condition)
end


 

 

Простите я забыл в спойлер код запихнуть, но сайт мне не позволяет отредактировать :D

Ах да забыл! Вот это написано ещё в самом начале (чтобы не было лишних вопросов):

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

function mod_dbg(fmt,...)
	local con = get_console()
	con:execute(string.gsub(string.format(fmt,...), " ", "_"))
	con:execute("flush")
end

l_i_mod_repairkit = nil
l_n_repairkit_cond = -1

 

 

Добавлено  Опричник,

Портянки под спойлер. Кнопка с "Глазом" на панели инструментов.

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

Методом тыка выяснил, что проблему вызывает колбэк на вход в онлайн комплекта:

level.client_spawn_manager():add(l_i_mod_repairkit, -1, mod_set_newkit_condition)

Видимо я не правильно записал сам колбэк? Не понимаю что не так.

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

Методом тыка выяснил, что проблему вызывает колбэк на вход в онлайн комплекта:

Ну так выясняй дальше, у тебя в ф-ции кэллбэка всего 7 строк кода. Закомментил одну - проверил, и так пока не найдешь ошибку.

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

@AndreySol, не помогло. Я закомментил весь колбэк, но ничего не поменялось. Спасает только закомменчивание самой строчки "заведения" колбэка, но мне без него никак, так как при попытке сделать set_condition происходит краш:

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

[error]Expression    : fatal error
[error]Function      : CScriptEngine::lua_error
[error]File          : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cpp
[error]Line          : 73
[error]Description   : <no expression>
[error]Arguments     : LUA error: ...l.k.e.r\gamedata\scripts\secretsmod_functions.script:123: attempt to call method 'set_condition' (a nil value)

 

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

так как при попытке сделать set_condition происходит краш:

А ты уверен что имеется такая экспортирования ф-ция: "set_condition"? 

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

@AndreySol, всмысле? Если ты имеешь в виду "а можно ли НЕ на оружии применить set_condition", то я отвечу: да, можно. Только что поменял запуск функции спавна открытого комплекта на простой obj:set_condition(0.5). Это сработало.

Если имелось в виду "можно ли получить condition НЕ оружия и перенести на другое НЕ оружие", то я уверен, что да (но это не точно). Но я попробовал написать так:

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

l_i_mod_repairkit = alife():create(t_s_sect, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
l_i_mod_repairkit:set_condition(0.5)

 

Результат можешь почитать в моём предыдущем посте.

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

Сильно пахнет маразмом. Появилась кое-какая мысль и я решил попробовать в конец колбэка на выход в онлайн дописать level.client_spawn_manager():remove(n_id,-1)

Получил довольно экзотический вылет:

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

stack trace:

0023:03C9D16A xrGame.dll
 
[error][     183]    : Невозможно создать файл, так как он уже существует.

 

Ещё эксперементировал с вторым ИД (который -1 сейчас). Пробовал и 0 и db.actor:id() (вроде что 0 что актор ид одинаковые насколько я знаю, но я так на всякий).

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

Всем добрый день. Вопрос по restriction_stock. Возможно ли к фиксированной InvMax добавлять числовые значения, полученные из функции через массив. Т.е имеем функцию проверки, одет ли костюм и если да, то какой. Отсюда находим кол-во дополнительного места для рюкзака и прибавляем к InvMax. Или же нужно оперировать в самой функции restriction_of_stock(ItemObj,Fix)?(Где я и застрял, т.к. при каждом вызове функции InvMax постоянно увеличивается). Моих знаний здесь не хватает... 

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

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

Здрасьте.

 

ТЧ 1.0006.

Есть мод с выводом статиков на HUD. Требуется поймать начало/конец катсцены и нажатие клавиш [Num +/-], чтобы временно скрыть статики. Как отследить указанные события? Может, есть проверка вроде hud_off() == true/false или отслеживание действия level.hide_indicators?

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

Шпаргалка

Ссылка на комментарий
3 часа назад, Norman Eisenherz сказал:

Требуется поймать начало/конец катсцены

Любая кат-сцена откуда-то запускается, из логики какого-то объекта. Там и добавь скрытие индикаторов.

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

[COP] Мне нужно создать скрипт для поиска рандомного пустого смарта.Уже 3 неделю бъюсь. Помогите плз.

Добавлено  Murarius,

Перемещено.

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

Всем привет. Есть функция, которая при нажатии на кнопку на gui начинает выполнять много других весёлых функций (с вероятностью 0,8 телепортировать актора в нужное место, после чего высчитывать вероятность, за сколько он до этого места "добрался"; с вероятностью 0,2 забрасывать его по другим координатам, где его ждут бандиты. Вдовесок - затемнение экрана, перемотка времени, сообщения о том, что актор добрался за N часов и т.п.

 

Практически всё работает хорошо, но, как говорится, есть нюанс: 
1) Иногда актора просто телепортирует в локацию (куда выставлена вероятность 0,8) без сообщения и без перемотки времени; 
2) Иногда эктора телепортирует в нужную локацию, но приходят два сообщения (например, "вы добрались за 2 часа" и "вы добрались за 3 часа") и время отматывается ажно на 5 часов вперёдт.

Вопрос: как это можно пофиксить? Я не ахти какой скриптер, так что, пожалуйста, подскажите, может, я что-то не дописал или ошибся в расчётах вероятности. Заранее спасибо!

 

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

function ui_map:button3_button_clicked()
if math.random(1,100) < 80 then
xr_effects.teleport_actor(nil, nil, {"way_to_f","look_to_f"})
level.add_pp_effector("black.ppe", 150, false)
if math.random(1,10) <= 3 then
news_manager.send_tip(db.actor, "arrived_to_farm_1_hour", 0, "default", 5000)
xr_effects.forward_game_time(nil, nil, {1}) 
end
if math.random(1,10) < 6 then
news_manager.send_tip(db.actor, "arrived_to_farm_2_hour", 0, "default", 5000)
xr_effects.forward_game_time(nil, nil, {2}) 
end
if math.random(1,10) >= 6 then
news_manager.send_tip(db.actor, "arrived_to_farm_3_hour", 0, "default", 5000)
xr_effects.forward_game_time(nil, nil, {3}) 
end
else
xr_effects.teleport_actor(nil, nil, {"random_event_vodokachka_way","random_event_vodokachka_look"})
news_manager.send_tip(db.actor, "arrived_to_vodokachka", 0, "default", 5000)
level.add_pp_effector("black.ppe", 150, false)
xr_effects.forward_game_time(nil, nil, {4})
end
self:HideDialog()
end

 

Ссылка на комментарий
3 hours ago, Дмитрий Зверев said:

1) Иногда актора просто телепортирует в локацию (куда выставлена вероятность 0,8) без сообщения и без перемотки времени; 

Это потому что все 3 условия для сообщения отдельно вычисляют "вероятность". Може так выйти что не одно не сработает.

3 hours ago, Дмитрий Зверев said:

2) Иногда эктора телепортирует в нужную локацию, но приходят два сообщения (например, "вы добрались за 2 часа" и "вы добрались за 3 часа") и время отматывается ажно на 5 часов вперёдт.

А это уже потому что с таким кодом может сработать больше одного условия для сообщения.

 

Исправленный пример:

Spoiler

function ui_map:button3_button_clicked()
	if math.random(1,100) < 80 then
		xr_effects.teleport_actor(nil, nil, {"way_to_f","look_to_f"})
		level.add_pp_effector("black.ppe", 150, false)

		local rnd = math.random(1,10)	-- считаем "вероятность" один раз

		if rnd <= 3 then
		news_manager.send_tip(db.actor, "arrived_to_farm_1_hour", 0, "default", 5000)
		xr_effects.forward_game_time(nil, nil, {1}) 
		elseif rnd < 6 then
		news_manager.send_tip(db.actor, "arrived_to_farm_2_hour", 0, "default", 5000)
		xr_effects.forward_game_time(nil, nil, {2}) 
		elseif rnd >= 6 then
		news_manager.send_tip(db.actor, "arrived_to_farm_3_hour", 0, "default", 5000)
		xr_effects.forward_game_time(nil, nil, {3}) 
		end

	else
		xr_effects.teleport_actor(nil, nil, {"random_event_vodokachka_way","random_event_vodokachka_look"})
		news_manager.send_tip(db.actor, "arrived_to_vodokachka", 0, "default", 5000)
		level.add_pp_effector("black.ppe", 150, false)
		xr_effects.forward_game_time(nil, nil, {4})
	end

	self:HideDialog()
end

 

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

Мужики! Вот, проигрывается , для примера, любой звук:

local path = "characters_voice\\human_03\\stalker\\talk\\labux\\labux_28" -- string
local so = sound_object( path ) -- userdata
local pso = so:play_no_feedback(db.actor, sound_object.s2d, 0, vector(), 1.0) -- nil

ВОПРОС: как узнать, что этот звук в данный момент проигрывается и остановить его принудительно?

Что-то типа -->

если звук SO сейчас проигрывается то ОСТАНОВИТЬ проигрывание

Типа такого, но так, естественно, не работает...

if so:playing() then so:stop() end

 

Мы, вчера, соседям сказали, что материализация - состоялась, чтобы ваш авторитет не уронить. Вот, мол, было изваяние, а теперь - стала Марья Ивановна. Многие верят ... ©

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

@Баба ЯГА

local pso = so:play(db.actor, 0, sound_object.s2d) if pso:playing() then pso:stop() end


local pso = so:play(db.actor, 0, sound_object.s2d)
if pso:playing() then pso:stop() end

 

не пойдёт, pso возвращает nil , увы. Я написал это в первом своём посте, так не будет работать.

Мы, вчера, соседям сказали, что материализация - состоялась, чтобы ваш авторитет не уронить. Вот, мол, было изваяние, а теперь - стала Марья Ивановна. Многие верят ... ©

Ссылка на комментарий
9 часов назад, Баба ЯГА сказал:

Я написал это в первом своём посте, так не будет работать.

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

  • Спасибо 1
Ссылка на комментарий
4 часа назад, abramcumner сказал:

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

Да, ты прав, прошу прощения, я не заметил что в моём случае play_no_feedback, а в его - play. В любом случае, проблема решена ещё вчера двумя разными способа. Всем спасибо! Вопрос снимается.

Мы, вчера, соседям сказали, что материализация - состоялась, чтобы ваш авторитет не уронить. Вот, мол, было изваяние, а теперь - стала Марья Ивановна. Многие верят ... ©

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

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

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

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

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

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

Войти

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

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

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