Скриптование - Страница 497 - Скрипты / конфиги / движок - AMK Team
Перейти к контенту

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

Тема для обсуждения скриптов всего и всех в серии игр STALKER.


Задавая вопрос (!):
1. Внимательно изучите суть вопроса. Вопрос должен соответствовать выбранной Вами темы. Это поможет сохранить порядок и читабельность темы, а также облегчит поиск и понимание сего;
2. Изучите то, что уже есть в теме (пролистайте "руками", воспользуйтесь поиском на форуме);
3. Изучите информацию которая может вам помочь:

 
 

Stalkerin. Там есть много хороших статей касательно данной темы.
Уроки по модостроению. Есть рабочие примеры готовых скриптов различного назначения.

 

Справочное руководство по языку Lua 5.1
https://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual/ru
Справочник по функциям и классам. Собрано много информации по функциям и классам, не всем, но по основные сведения предоставлены.

4. Дабы не превращать обсуждение в "кашу" разной информативной направленности, задавайте несколько вопросов по порядку (в разных постах) после того, как получите ответ на предыдущий вопрос;
5. "Спасибо" и тому подобное - будьте так любезны в ПМ. Если не любите писать в ПМ, в конце вопроса напишите фразу: "Заранее спасибо!" - или что-то в этом духе;
6. ПОЖАЛУЙСТА! Указывайте, для какой игры Вам необходима информация (ТЧ, ЧН, ЗП), если стоит мод - укажите название мода;
7. Если Вы что-то сделали и результат не такой, какой Вами задумывался, то, пожалуйста, приводите коды которые Вы изменяли/писали целиком! Это поможет другим правильно ответить на Ваш вопрос, а также оградит Вас от лишней писанины.
8. Оформляйте сообщение. Пользуйтесь тегами для того, чтобы отделить код от текста. Пишите грамотно - ПОЛЬЗУЙТЕСЬ ЗНАКАМИ ПРЕПИНАНИЯ.
9. И помните: «Правильно заданный вопрос – половина ответа».

 

Какие вопросы следует задавать, а какие нет...

 

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

 

Вопросы которые будут удалятся, следовательно их задавать не нужно:
-- Где находится та или иная функция?
Для ответа используем поиск по словам среди файлов оригинальной игры или мода, если объект поиска относится к нему, при помощью программы, которая Вам наиболее симпатизирует;
-- Как сделать что-то/то-то?
С подобными вопросами, либо в "ковырялки", где Вам вероятнее всего так же не ответят, либо выдвигаем мысли, подкреплённые теорией, практикой (идеальный вариант) и здравым рассудком;
-- Вопросы со смыслом: "сделайте", "совместите" и подобными глаголами повелительного наклонения.
-- К тому же удалению будут подвергаться вопросы, в которых масштабно не используются теги, для отделения кода и цитат от основного текста, а также не вписан в спойлер код размером превышающие семь строк.
Ответ на возможно возникший вопрос: В какую тему можно обратиться по поводу логики и спавна объектов?
В тему "ковырялок" соответствующей версии игры, для которой Вы задаёте вопрос.

И последнее: очень рекомендовано к прочтению Правила форума
 


  • Спасибо 1
  • Полезно 2
Ссылка на комментарий
https://www.amk-team.ru/forum/topic/6185-skriptovanie/

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

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

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

 

Всё бы ничего, но почему-то после использования закрытого ремкомплекта колбэк 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

@Full Noob

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

 

Свои работы и совместные проекты: ИнструментOGSM CSFinal StrokeHARDWARMOD

Полезное: модули АртосаXML парсер

@Kirgudu, не помогло. Один фиг дебаговые сообщения о юзе предмета перестают появляться после использования комплекта.

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 неделю бъюсь. Помогите плз.

Всем привет. Есть функция, которая при нажатии на кнопку на 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

 

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

@Баба ЯГА

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

 

  • Согласен 1
  • Полезно 1

Свои работы и совместные проекты: ИнструментOGSM CSFinal StrokeHARDWARMOD

Полезное: модули АртосаXML парсер

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 пользователей

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