karavan
Не отвечают - значит а) не хотят, иль б) не могут, иль в) не имеют возможности ...
Скриптами многое можно делать ... Но мне, порой лень писать ответы или думать как ответить, т.к. вижу, что в вопросах почему-то постоянно ленятся дать достаточную информацию и контекст для ответа.
Банально вспоминаем/смотрим "ваш любимый" 'bind_stalker.script' и в нем всем известную 'function actor_binder:update(delta)':
Код:
...
-- Апдейт прятание оружия игрока во время диалога
if weapon_hide == true or self.object:is_talking() then
if self.weapon_hide == false then
self.object:hide_weapon()
self.weapon_hide = true
end
else
if self.weapon_hide == true then
self.object:restore_weapon()
self.weapon_hide = false
end
end
...
Смотрим в lua_help.script:
Код:
C++ class game_object {
...
function hide_weapon();
...
т.е. функция доступна гейм-объектам, а не только актору.
Пробуем на подходящем неписе - работает ли ...
P.S. функция работает для всех слотов.
Что мешает перед ней проверить активен ли 2-й слот у непися и после деактивации всех слотов дать команду на активацию 2-го слота, если тот был активен?
Или попроще - проверить активен ли 1-й и дать команду деактивировать слоты, если именно 1- активен! Включаем думалку и находим нужный вариант решения!
TheDoktor "Не могу открыть секцию *название секции*" т.е, у тя в игре прописан инклуд АКС74у, но самой секции нету. Нужно создать, или (как я понял) всунутый тобой АК надо переименовать в такое название.
TheDoktor
Тебе лог пишет: Can't open section 'wpn_ak74u'
Т.е. ругается на невозможность открыть (отсутствует!) секция ...
Под секциями в кодах подразумевается конструкция
Код:
[wpn_ak74u]
и все что за ней - ищи почему эта секция у тебя исчезла! (или некорректно запрашивается, что в данном случае невозможно, т.к. она есть в исходниках).
Наиболее вероятный вариант, ты или файл "w_ak74u.ltx" исключил из обработки или из него удалил секцию ...
TheDoktor ты вставил АК из Арсенала, так? Открой конфиг и погляди его название в квадратных скобочках. Если оно какое-либо другое, то переименуй на ту секцию, на которую жалуется.
добавлено спустя 3 минут
TheDoktor смотри конфиг автомата АКСу, как я понял ты вставил его из арсенала, и в связи с этим идет твоя проблема. В скобочках название например [wpn_aks74u_sk1] (пример), и если ты этим конфигом заменил стандартный конфиг, то соответсвенно игра не может считать название которое в логе, поэтому смени то что в скобках на то, на что жалуется.
Сообщение было успешно отредактировано АнархОПанк (15-05-2010 01:30 GMT3 часа, назад)
Artos Да ты прав. информации дал мало. Простите. Даю полную информацию:
Вот:
local snd_obj0 = xr_sound.get_safe_sound_object([[characters_voice\human_01\bandit\music\guitar_1]])
local snd_obj1 = xr_sound.get_safe_sound_object([[characters_voice\human_01\bandit\music\guitar_2]])
local snd_obj2 = xr_sound.get_safe_sound_object([[characters_voice\human_01\bandit\music\guitar_3]])
local snd_obj3 = xr_sound.get_safe_sound_object([[characters_voice\human_01\bandit\music\guitar_4]])
-- Активация/деактивация предмета в слоте 1
local device_active = false
function item_update(obj)
local item = db.actor:active_item()
if item and item:section() == "player_m" then
if not device_active then
device_active = true First_track() -- не биндится -- проигрывание происходит только один раз
end
elseif device_active then
device_active = false
if snd_obj0:playing() then --\ если звук играет то вырубить его
snd_obj0:stop()
elseif snd_obj1:playing() then --\ если звук играет то вырубить его
snd_obj1:stop()
elseif snd_obj2:playing() then --\ если звук играет то вырубить его
snd_obj2:stop()
elseif snd_obj3:playing() then --\ если звук играет то вырубить его
snd_obj3:stop()
end
end
end
function First_track()
local F=math.random(1,4)
if F==1 then
snd_obj0:play_at_pos(db.actor, vector():set(0,0,0), 0, sound_object.s2d)
elseif F==2 then
snd_obj1:play_at_pos(db.actor, vector():set(0,0,0), 0, sound_object.s2d)
elseif F==3 then
snd_obj2:play_at_pos(db.actor, vector():set(0,0,0), 0, sound_object.s2d)
elseif F==4 then
snd_obj3:play_at_pos(db.actor, vector():set(0,0,0), 0, sound_object.s2d)
end
end
Теперь вопросы:
1) Нужно что бы после проигрывания первого трека оружие (условное) в слоте 1 спряталось. Как реализовать?
2) Или после проигрывания первого (случайного) трека играл второй (случайный) трек. Как реализовать этот вариант? Пожалуйта помоги разобраться.
karavan
Далеко НЕ полная информация.
Как я понял, "function item_update(obj)"
- вызывается неким скриптом. Однократно? Периодически? с каким периодом?
- Что за аргумент "obj"? Рудимент?
- Говорил ранее о некоей неписи, а тут фигурирует актор. Так и должно?
- 1-й трек - это по счету 1-й иои по названию (snd_obj0)?
- Всего (по кол-ву) проигрываться должно два трека? или больше.
- 2-й трек проигрывается после убирания оружия или по какому-то иному событию/моменту?
Судя по твоему примеру кода - полная какофония ...
Сообщение было успешно отредактировано Artos (15-05-2010 02:21 GMT3 часа, назад)
Artos
Вобщем то да получается что не полная.
1)function item_update() -- стоит вызов в 'bind_stalker.script' в 'function actor_binder:update(delta)':
2)аргумент "obj" -- это просто были варианты с этим аргументом остался просто забыл удалить.
3)Убрать оружие нужно из первого слота у ГГ но после проигрывания первого (случайного) трека.
4) Проигрывание треков должно происходить постоянно при условии что оружие в первом слоте есть и оно активно.
Вобщем вот так. Еще раз напишу что нужно здеалть из этой какофонии.
1. Либо:
После проигрывания трека, который выбирается сучайным образом, нужно сделать оружие в первом слоте не активным (убрать оружие).
2. Либо:
После проигрывания трека, который выбирается сучайным образом, нужно включить следующий случайный трек. И так треки будут играть до безконечности пока юзер сам не решит убрать оружие (сделать неактивным).
И при первом и втором варинте решения условное оружие плеер должно оставаться в слоте 1 полюбому.
В моем корявом варианте выходит так, что при установке в слот 1 оружия "плеера" и при доставании его происходит проигрыш музыки, а при прятании оружия (плеер остается в слоте) музыка вырубается.
Если дождаться окончания трека (того который был выбран случайно), то следующий трек не начинает играть, а "плеер" активный.
Ну надеюсь теперь полная информация. :)
karavan
для варианта № 2 я бы так сделал:
не факт что тут все работоспособно... но проверка уже за тобой
Код:
local music={
[1]="characters_voice\\human_01\bandit\\music\guitar_1",
[2]="characters_voice\\human_01\\bandit\music\guitar_2",
[3]="characters_voice\\human_01\\bandit\music\guitar_3",
[4]="characters_voice\\human_01\\bandit\music\guitar_4"
}
local device_active = "stop"
function item_update()
local snd_obj= nil
local item = db.actor:active_item()
-- если нет активной вещи либо есть, но не та что нужно, то дальше не выполняем
if not (item and item:section() == "player_m") then
device_active = "stop" -- на случай убирания предмета из слота - флаг в дефолт
return end
-- если таки есть и флаг в дефолтном состоянии то...
if device_active=="stop" then
-- вызываем функцию проигрыватель и заодно получаем звуковой объект
snd_obj= this.First_track()
-- флаг переключаем дабы не вызывать функцию снова и снова
device_active = "start"
elseif device_active == "start" then
-- если флаг проигрыша трека включен, но звуковой объект уже доиграл
if not snd_obj:playing() then
-- то назначаем флагу дефолтное состояние - блок с First_track() снова становится доступным для активации
device_active="stop"
end
end
end
function First_track()
local F=math.random(1,4)
local snd_obj = sound_object(musik[F])
snd_obj:play_at_pos(db.actor, vector():set(0,0,0), 0, sound_object.s2d)
return snd_obj
end
насчет оружия не понял - оно тут причем?
плеер у тебя это как я понял активный предмет в слоте один(пистолетном) - а причем здесь прятание оружия?
Сообщение было успешно отредактировано erlik (15-05-2010 03:35 GMT3 часа, назад)
--/ Активация/деактивация предмета в слоте 1
local bDeviceActive = false --/ флаг: девайс активен и в 1-м слоте
local oSnd = nil
function item_update() --/ вызывается из 'bind_stalker.actor_binder:update(delta)'
local oActiveItem = db.actor:active_item()
if oActiveItem then --/ в руках ГГ есть предмет
if oActiveItem:section() == "player_m" then --/ активный предмет - девайс
local oPistol = db.actor:item_in_slot(1) --/ проверка: предмета в 1-м слоте
if oPistol and oPistol:id() == oActiveItem:id() then --/ в 1-м предмет и это девайс
bDeviceActive = true --/ флаг: девайс - в 1-м и он активен (в руках)
db.actor:hide_weapon() --/ убираем из рук оружие
end
Play_Random_Track() --/ вызываем зв.трек пока активен девайс
end
else --/ в руках нет предметов
bDeviceActive = false --/ сброс флага активного девайса
if oSnd and oSnd:playing() then --/ звук проигрывается
oSnd:stop() --/ выключить
end
end
end
function Play_Random_Track()
if not (oSnd and oSnd:playing()) then --/ проверка: звук НЕ проигрывается (ждем окочания)
local iRnd = math.random(1,4) --/ рандомный индекс для трека
sSound = "characters_voice\\human_01\\bandit\\music\\guitar_"..tostring(iRnd))
oSnd = xr_sound.get_safe_sound_object(sSound)
oSnd:play_at_pos(db.actor, vector():set(0,0,0), 0, sound_object.s2d)
end
end
Сообщение было успешно отредактировано Artos (15-05-2010 05:14 GMT3 часа, назад)
erlik
в твоем варианте (не вдавался в уже в алгоритм, т.к ничего не понял из фраз о плеере ...) есть оч.неприятных момент:
Условие: if not snd_obj:playing() then - приведет к вылету, т.к. после первого же вызова функции при наличии предмета будет взведен флаг в "start" и при последующем уже вызове (это же из биндера) если предмет не убран - неминуемо приведет к nil:playing() , т.к. уже не будет получен локальный snd_obj из выбора треков.
Коммент: "если флаг проигрыша трека включен, но звуковой объект уже доиграл" мне, непример, непонятет. Флаг взводится в любом случае, если есть "девайс" и был состоянии сброса. Каким образом у тебя доигрывание звука опрокидывает флаг - неясно?
Следует подстраховаться на этот случай:
if snd_obj and not snd_obj:playing() then
и в путях к звукам неполадки, пропушены обратные слеши ...
local music={
[1]="characters_voice\\human_01\\bandit\\music\\guitar_1",
[2]="characters_voice\\human_01\\bandit\\music\\guitar_2",
[3]="characters_voice\\human_01\\bandit\\music\\guitar_3",
[4]="characters_voice\\human_01\\bandit\\music\\guitar_4"
}
karavan
Даже не удивляюсь .
В твоем варианте и нерабочее - заработает и рабечее заглючит ...
Сообщение было успешно отредактировано Artos (15-05-2010 03:59 GMT3 часа, назад)
erlik
При первом апдейте переменной snd_obj присвоится значение. Всё нормально.
Но на следующем же апдейте, строкой
Код:
local snd_obj= nil
значение ставится в NIL, а функция будет уже работать через
Код:
elseif device_active == "start" then
где в строке
Код:
if not snd_obj:playing() then
есть эта переменная, которой присвоено NIL
Примерно должно быть так :
Код:
local device_active = true
local snd_obj
function item_update()
local item = db.actor:active_item()
if not (item and item:section() == "player_m") then
if snd_obj and snd_obj:playing() then
snd_obj:stop()
end
return
end
if device_active then
local F = math.random(1,4)
snd_obj = sound_object([[characters_voice\human_01\bandit\music\guitar_]]..F)
snd_obj:play_at_pos(db.actor, vector():set(0,0,0), 0, sound_object.s2d)
device_active = false
else
if not snd_obj:playing() then --тут уже NIL-а не будет
device_active = true
end
end
end
Сообщение было успешно отредактировано Gun12 (15-05-2010 04:34 GMT3 часа, назад)
erlik
Коммент: "если флаг проигрыша трека включен, но звуковой объект уже доиграл" мне, например, непонятен.
Флаг взводится в любом случае, если есть "девайс" и был состоянии сброса.
Каким образом у тебя доигрывание звука опрокидывает флаг - неясно?
Как только флаг будет взведен, то при последующем апдейте и вызове этой функции (это десятки милисекунд) НЕ будет вызова "First_track()", а значит "local snd_obj= nil" останется "nil"
Соответствено при обработке второй ветки:
...
local snd_obj= nil
...
elseif device_active == "start" then
if not snd_obj:playing() then
device_active="stop"
end
...
будет попытка вызова функции "playing()" применительно к nil-объекту => FATAL ERROR или зависание биндера.
karavan
Уже высказал мысль, о том, что помимо (не)исправного скрипта требуется еще нечто ...
"при доставании предмета начала играть музыка" - это уже нечто из другой оперы!
Сообщение было успешно отредактировано Artos (15-05-2010 04:44 GMT3 часа, назад)
karavan
В варианте "from Artos" нехватает задержки, т.к. если будет команда убрать оружие и начать играть, то на следующем апдейте при условии, что звук еще не начал играть - пройдет команда на его выключение -> звук вообще не заиграет. Т.о. следует ввести паузу/задержку, чтобы 1-й трек заиграл.
Если коды НЕ содержат ошибок (можно хоть скриптовым чекером проверить), то ЗАПУСКАТЬСЯ скрипт/функция обязаны!
Другой вопрос, что если внутри есть ошибки алгоритма или ошибки в обработке/аргументах (как уже выше показано на примере NIL:playing() ), то функция может или зависать или приводить к вылетам.
Во-втором случае следует смотреть лог и секцию FATAL ERROR.
В-первом, вводить технологические строки вывода в лог, позволяющие отследить прохождение цикла обработки и корректности завершения функции.
P.S. В моем варианте ТАЖЕ ошибка, обнови скрипт (правка выделена оранжевым)
Я вначале присвоил oSnd первый трек, но потом "сэкономил" и ...
Но вариант все одно требует доработки, т.к. - оружие будет убрано и ... требуется обратная команда, чтобы его можно было достать.
Сообщение было успешно отредактировано Artos (15-05-2010 05:20 GMT3 часа, назад)
karavan
О функции 'music_near' и ошибке вызова этой функции только ты нам поведать можешь ... тут не телепаты.
Да и ... как я понял тебе нужен именно вариант от erlik"а с подправленным кодом (вариант Gun12).
При чем тут убирание и 1-й слот - я тоже не понял.
Да и принудительное убирание тут врядли пройдет, т.к. если принудить убрать, то ... обратной функцией (restore_weapon() ) можно только принудить активировать, а это приводит к замкнутому циклу ...
В общем формулируй подробно что и как - тогда и придумать можно будет.
Сообщение было успешно отредактировано Artos (15-05-2010 05:57 GMT3 часа, назад)
Artos
Оружие в Слоте 1 имеет два состояния активное (в руках и в слоте) и не активное (в слоте).
Вобщем так:
У ГГ есть итем "Плеер", который купил у Сидора. Этот плеер может вставляться в слот 1. При вставлении в слот 1 и при вытаскивании его происходит его активация (находится в руках) и начинает играть музыка. Если нажать кнопку (кнопку "2" на клавиатуре) и убрать его (сделать не активным но в слоте 1 оставить) музыка (должна) прекращать играть. Если же плеер всевремя активный (как вытащенное оружие), то музыка играет не прерывно.
1) В варианте erlik"а после покупки и вставлени в слот Плеера музыка играет не прерывно, но при желании убрать (перевести в не активное состояние) музыка продолжает играть.
2) В моем варианте происходит только одинарное проигрывание и затихший Плеер находится в руках у ГГ, а нужно что бы он убрался после проигрывания.
З.Ы.: Да мутно все как-то.
добавлено спустя 26 минут
Ура!!! Разобрался, спасибо всем!
Сообщение было успешно отредактировано karavan (15-05-2010 06:35 GMT3 часа, назад)
karavan
Наличие предмета из слота 1 в руках ГГ (true/false):
Код:
db.actor:active_slot() == 1
Собственно сам предмет в слоте 1 и проверка на "что это на предмет":
Код:
local oItemInSlot1 = db.actor:item_in_slot(1)
if oItemInSlot1 and oItemInSlot1:section() == "player_m" then
...
Проверка активного предмета:
Код:
local oActiveItem = db.actor:active_item()
if oActiveItem and oActiveItem:section() == "player_m" then
...
Т.о. комбинацией этих проверок всегда можно определить, есть ли нужный предмет у ГГ, активен ли?
И если есть и активен - играть. Если не активен, и тем более его нет - то и не играть.
Это уже сделано в варианте Gun12, скомпилировавшего из всего приемлемый для тебя код.
Вот вариант, который обязан работать и немного экономит ресурсы, хотя и реакция запаздывания при доставнии/убирании может быть 1 сек:
Код:
local snd_stop = true
local snd_obj
local upd_timer = 0
function item_update()
if time_global() < upd_timer then return end
upd_timer = time_global() + 1000
local item = db.actor:active_item()
if not (item and item:section() == "player_m") then
if snd_obj and snd_obj:playing() then
snd_obj:stop()
end
return
end
if snd_stop then
snd_obj = sound_object("characters_voice\\human_01\\bandit\\music\\guitar_"..tostring(math.random(1,4)))
snd_obj:play_at_pos(db.actor, vector():set(0,0,0), 0, sound_object.s2d)
snd_stop = false
else
if snd_obj and not snd_obj:playing() then
snd_stop = true
end
end
end
" а нужно что бы он убрался после проигрывания" - а вот это ИМХО глупость! С каких это пор предмет закончив играть самоубирается из рук игрока??? На то у игрока и своя голова, чтобы самому это (не)делать!
Сообщение было успешно отредактировано Artos (15-05-2010 06:52 GMT3 часа, назад)
Вопрос №1
возможно ли заспавнить огромный камень??? (таковые в объектах есть, но какой им конфиг прописывать??)
Вопрос №2
возможно ли заспавнить, если не камень, то что-нибудь другое на высоте 5 метров от земли?
и при приближение к рестрикотору этот объект падал?
ну или проще задать точку спавна выше на 5 метров от земли и при входе в рестрикотор объект падал..
как это осуществить???
и желательно чтобы он мог скрыть под собой тело...
Обосную:
Я хочу заспавнить НПС в некой точке А и там же заспавнить рестрикотор, и при входе ГГ в рестрикотор заспавненый предмет на высоте 5 метров, упал и придавил НПС в точке А.
Я бы не стал, без необходимости, использовать tostring и tonumber.
(Хотя никто и не запрещает)
Просто знаю, что Lua сама прекрасно преобразовывает типы "строка"/"число" при проведении , соответственно, конкатенации и математических операций.
Можно убедиться :
Код:
local str = "5"
local num = 3
news_manager.send_tip(db.actor, "CONCAT -> "..str..num)
news_manager.send_tip(db.actor, "PLUS -> "..str + num)
Gun12
Спасибо за правки скрипта
Не подумал насчет nil - хотя изначально и выносил этот параметр за пределы скрипта - а потом зачем то все-так сунул его в тело функции...только вот вопрос - а почему у karavan'a не вылетело сразу? Николай ФеНиКс
А в какой папке есть ogf модель камня? Просто интересно - не находил...
скрипт спавна предмета на высоте (с зависанием его в воздухе) я выкладывал - смотри пред. страницы.
Если тебе нужно просто заспавнить предмет на высоте (с его падением)- добавляешь к координате y любое нужное значение. Сам не тестил - но должно получиться что предмет как бы падает с неба . Хотя черт его знает на самом деле как он будет падать (скорость, и пр. )
Если надо чтобы он сначала висел, а потом упал - нужен тот скрипт - а затем нужен будет второй - который изменит один флаг в состоянии объекта чтобы тот смог упасть.
насчет конфига - попробуй использовать обычный (с классом II_ATTCH - если скрипт не будет предмет держать в воздухе - значит придется другой класс использовать)
23 страница
Сообщение было успешно отредактировано erlik (15-05-2010 14:10 GMT3 часа, назад)
Эта тема закрыта, публикация новых сообщений недоступна.
Продолжая пользоваться сайтом, вы соглашаетесь с использованием файлов cookie. Страницы сайта могут содержать информацию, запрещенную для просмотра посетителям младше 18 лет. Авторское право на серию игр «S.T.A.L.K.E.R» и используемые в ней материалы принадлежит GSC Game World.