Есть хороший метод - game.start_tutorial("название"), где "название" - имя тега из game_tutorials.xml и вытекающих из него файлов.
В game_tutorials.xml нашел только туториалы какие-то, и там путь только к звуку есть, а к видео не нашел...Я нашел, что видео воспроизводится из ui_movies.xml.game.start_tutorial() подойдет, чтоб вызвать видео из ui_movies.xml..Или какая функция будет вызывать видео?
Gun12 Не согласен (хотя могу ошибаться, анализировал 'навскидку"):
1. Я ввел доп.проверки, выполняющие роль 'защиты от дурака'.
'if arg ~= nil then' --/защита от 'отсутствия' аргумента на входе вызываемой функции
2. Проверка же 'if arg.n ~= 0 then' - ИМХО, необязательна, т.к. цикл 'for i=1, arg.n do' НЕ будет обрабатываться, если arg.n == 0.
[del]Т.о. твое предложение открывает **5001c54314580bda8be6**n bHas, (bHas and 1) or 0 --/>
else
oNPC:iterate_inventory(
function (dummy, oItem)
if oItem:section() == sSection then
iCnt = iCnt + 1
if iNum ~= 0 and iCnt >= iNum then --/ при iNum == 0 => подсчет всего кол-ва
return true, iCnt --/> NPC имеет N предметов
end
end
end
,nil)
end
end
return (iCnt > 0 and iCnt >= iNum), iCnt --/> имеет ли NPC N предметов, и сколько
end
[/code]
Особенность в том, что позволяет подсчитывать и получать значение общего кол-ва проверяемого предмета у НПС, а не 'не меньше ли?'.
Этот запрос возможен при вызове функции с iNum = 0, а проверка 'имеет ли 0 предметов' не имеет смысла (если не считать инверсию тоже полезным вариантом использования ф-ции).
#Artos :
'if arg ~= nil then' --/защита от 'отсутствия' аргумента на входе вызываемой функции
Так я и говорю, что такая запись "не поймёт" есть на входе аргументы или нет, т.к. проверяется arg - а это таблица, которая всегда существует, и мало того - в ней есть запись.
Gun12
Точно! Я ошибался. Зациклился с '(fmt,...)', с которой в свое время долго провозился, распарсивая выводы влоги ...
Ну тогда ... собственно первая строка/проверка опциональна, может и отсутствовать. Хотя чуть экономит тайминги.
Artos
насчет (fmt,...).
Пытаюсь слепить скрипт, и прикручиваю т**5001c54314580bda8be6**or
end
for i = 1, arg.n do
..............[/code]
Т.е. при вызове Has_N_Item(oNPC, a,b,c) таблица arg разбирается как и раньше.
При вызове Has_N_Item(a,b,c) естественно oNPC присваивается значение а, но чтобы это значение не "отрезало", если это не 'userdata', то "спасаем" его перекинув в таблицу argtable.insert (arg, 1, oNPC)
-------------------------------------
P.S.
local Result = Has_N_Item(nil, ...) --/ наиболее частый вариант по применению
Дело в том, что данный вариант кода позволяет НЕ! указывать NIL в начале, а вызывать как ранее.
отредактировал(а) Gun12: 24-06-2010 13:32 GMT3 час. Не стань номинантом премии Дарвина.
Gun12
Тоже над этим размышлял, но ...
Чаще требуется простая проверка на наличие предмета у ГГ или списка/таблицы. У других неписей такие проверки довольно редки.
Писать:
а) local Result = Has_N_Item(oNPC, ...)
б) local Result = Has_N_Item(db.actor, ...)
и) local Result = Has_N_Item(nil, ...)--/ наиболее частый вариант по применению
менее удобно, чем
а) local Result = Has_N_Item(...,oNPC)
б) local Result = Has_N_Item(...,db.actor)
и) local Result = Has_N_Item(...)--/ наиболее частый вариант по применению
Забывчивость к аргументам, к сожалению, нередка ... P.S.
данный вариант кода позволяет НЕ! указывать NIL в начале
это я увидел. Но ... (сложно сразу написать все мысли/аргументы) ... пока анализирую ...
- однотипность порядка аргументов немаловажный фактор, позволяющий избегать ошибок
Согласиcь, основным обязательным(!) аргументом является таблица/список/секция, и ставить вперед опциональные аргументы - как минимум, требует помнить специфику функции.
- на наиболее часто употребимых вариантах излишние проверки на тип аргументов - лишние тайминги.
*.skls файл зачем нужен? Я хочу востановить некоторые вырезанные анимки ну и вот получил такой файл а что дальше то делать, скажите плиз?
Я нифига не понял как пользоваться этой функцией, объясните пожалуйста, мне нужно чтобы она проверяла у ГГ например ак74.
--/ Проверка на наличие у непися/актора предмета
--/ Примеры вызова:
--/ Result = Has_N_Item("section")
--/ Result = Has_N_Item("section", 3, [oNPC])
--/ oNPC - game_object (опционален), при отсутствии - проверка по актору
function Has_N_Item(sSection,iNum, oNPC)
if not oNPC then oNPC = db.actor end
if not iNum then iNum = 1 end
local iCnt = 0
if oNPC and sSection then
oNPC:iterate_inventory(
function (dummy, oItem)
if oItem:section() == sSection then
iCnt = iCnt + 1
if iCnt >= iNum then
return true --/> NPC имеет N предметов
end
end
end
,nil)
end
return iCnt >= iNum --/> имеет ли NPC N предметов
end
отредактировал(а) Mehanik Yar: 24-06-2010 14:25 GMT3 час.
Mehanik Yar
Даже в школе вначале учатся читать/писать и считать, а уже потом изучают математику/алгебру ...
Какой смысл задавать обычному первокласcнику вопросы по алгебре, если он еще не все мат.действия знает, не говоря о таблице умножения? Есть ли смысл отвечать на его вопрос? Тем более это уже делалось только что?
Вначале задайся вопросами типа: "Что такое функция и аргументы и как этим пользоваться".
На последних страничках топика по этим вопросом немало написано.
Напоминаю недовольным, этот топик "Вопросы и Ответы" по теме модмейкерства. Т.е. о том как самому сделать 'то или это'. И не нужно это путать с: "Мне тут захотелось - сделайте мне!", т.е. кто-то должен все разжевать до состояния пюре и в ротик вложить "вопрошающему" ...
Не знаю как остальные - но я таких нахлебников, не утруждающих себя чтением и мышлением - игнорирую!
Я вот хотел заспавнить предмет НПС в инвентарь(Сид и ид НПС не известен), так вот подскажите, что там нужно сделать?Преребирать айди и получать ид НПС:local obj_id = obj.id или как?
Artos
Аргумент oNPC(как и его отсутствие) используется в не менее обязательном порядке.
(oNPC:iterate_inventory)
Так что от перемены мест слагаемых...
Лишние проверки, тайминги...
Я всё понимаю. Но это расплата за универсальность.
(А настолько ли они велики?)
Так что для себя хочу определиться в следующем:
Если писать код для удобства будуших мододелов - то делать универсально, чтобы избавить их от запоминания различных вариантов вызова.
Если писать для себя, то конечно нужно разделять вызовы, и стараться сокращать тайминги.
Второй вариант, конечно, более приемлем.
Тем более известно, что затраты на оптимизацию кода несоизмеримо велики по сравнению с реально полученной оптимизацией.
Есть в диалогах такая вещь как
Ну так вот функция проверки не для выдачи инфопоршня а для того чтобы условие выполнялось.
ладно не надо сам потыкаю, всеже методом тыка я электронике как то научился.
Gun12
Я для себя позиционирую подобные 'универсальные' коды для двух основных применений:
- (основной) Как универсальный вариант при черновом программировании и для отладки. Имея уже готовую отработанную многофункциональную функцию, можно с'экономить время на необходимости вникать в тонкости оптимизации и избегать описок/ошибок, что нередко при написании любого кода.
- (побочное) как универсальный учебник и исполнитель 'пожелалок', позволяющий дать рабочий вариант для различных вариаций (для молодых мододелов).
Примечание: Применение его в более серьезных случаях/модах считаю спорным. Для модов, которые требуют немало процессорных ресурсов, подобные конструкции все же часто далеки от оптималности и не так уж востребованы. Оптимальнее иметь десяток 'заточенных' функций, чем универсальную.
Т.к. у меня в настоящее время 'интерес' с учетом 'примечания' (делаю и Симбионы), то мне близок вариант универсальности с акцентом на оптимальность. :-)
Все же проще, чтобы уже и черновые коды были ... пооптимальнее.
(Ничего нет постояннее - чем временное)
Но это конечно уже субъективизм. Mehanik Yar
Кол-ва 'тыков' в электронике - имеют конечное значение, результат же чаще всего виден (сгорело/отвалилось/исказилось/...).
Кол-во вариаций в программировании, особенно при недостатке знаний/навыков - бесконечны, а результаты чаще всего не видны или не ясны.
Если не будешь учить/познавать - 'тыкаться' можно 'до старости' ...
Иносказательно:
Вот так: :obstenu: иногда с электроникой можно совладать,
а в программировании только так: :rtfm: (ковыряние конфигов - это не программирование скриптов!)
1.обязательно знать язык луа, чтобы шарить в скриптах?
2.где можно достать библиотеку тегов и как все-таки разобраться со скриптами новичку (очень хочу научиться сам в этом бреду.не собираюсь становиться глупым нахлебником.диалоги пишу обалденно)
терь есть проблема, просьба тож помочь. установил скрипт на спавн (скопировал, как мне посоветовали)
прописал его в диалоге... таких функций сделал две (для разных npc) и обе функции не работают (вернее спавн не происходит, но и вылетов нема.)
musnuk
1. Можно ли читать/писать - не зная языка?
Конечно нужно знать LUA, чтобы самому что-то делать/переделывать.
Если конечно все пожелалки заканчиваются на банальном копипасте и правке пары символов под себя - то ... это не 'шарить в скриптах'.
2. Тэги - это не к LUA. Это ты на xtml'ках зациклился.
Мануалы, синтаксис и пр. - в сети и на этом портале куча материала/ссылок.
3. И как ты представляешь себе ответ на твой вопрос по каким-то функциям, прописанных тобою куда-то и как-то?
Если не фантазировать, то можно только сказать:
"Допустил где-то какую-то ошибку или чего-то где-то недоделал.".
Тебе такой ответ нужен? Тогда потрудись задать вопрос так, чтобы на него можно было ответить.
musnuk
1) Да, что бы шарить в скриптах Сталкера и луа... нужно знать луа.
2) а) Тегов в Сталкере много, и не только для диалогов, но и для UI и др. Что мешает написать её самому, изучив их все по примеру из оригинала. Хотя польза от этого... сомнительная, я считаю.
б) Читать официальную справку на русском языке, а так же различные русскоязычные сайты. А ещё есть справочник от Gun12, который в незаконечном виде уже толще (и полезнее!) оригинальной справки.
Artos, да, именно названий.
отредактировал(а) Darien Fx: 24-06-2010 16:22 GMT3 час.
Darien Fx Поправка: 'Тэгов' в Сталкере как раз не очень много (хотя все относительно), много их 'названий'. Это (разные имена однотипных тэгов) считай те же переменные, которые после парсинга (разбора текста) используются скриптами/движком.
'название' тэга - как правило, значение переменной, которой оперирует скрипт/движок.
Но не путать с 'типами' тегов! Это уже собственно типы данных/переменных (строки/таблицы/...)
function npc_spaun()
alife():create("musnuk",vector():set(-220.73,-18.87,-151.811),34237,66)
end
function spaw_n_n() -
local a = vector() -- db.actor:position()
a.x = -220.21
a.y = -19.93
a.z = -158.98
alife():create("wpn_ak47",a,33447,47,65535)
end
в диалоге я их прописал, как spaun _npc.npc_spaun
и соответственно spaun _npc.spaw_n_n
musnuk
На первый взгляд - рабочие функции.
А вот вызываются ли из диалога или нет и что же происходит - это как раз то, что я называю: "Посмотреть результат выполнения написанного".
Сам я 'смотрю' в логах, написав нужный мне вывод в лог. Ты же, не имея пока(?) такой возможности, можешь использовать вывод через новостной модуль.
Добавив подобное:function npc_spaun()
news_manager.send_tip(db.actor, "Спавним musnuk", 0, "default", 8000)
local soObj = alife():create("musnuk",vector():set(-220.73,-18.87,-151.811),34237,66)
if soObj then --/ если объект заспавнен
news_manager.send_tip(db.actor, "musnuk - заспавнен!", 0, "default", 8000)
else --/ ошибка спавна
news_manager.send_tip(db.actor, "musnuk - НЕ заспавнен", 0, "default", 8000)
end
endТы получишь визуальные результаты работы кодов:
1. Если при диалоге ничего не проиcходит - значит не правильно прописал в диалоге.
2. Кроме первого сообщения нет второго - ошибка в спавне. Проверяй параметры.
3. Второе сообщение на экране подскажет что же произошло.
Если нет спавна - см.секцию и пр.условия.
условие появления диалога. нужно вот зачем, у НПСа диалог должен появиться в том случае если в данный момент есть у него нужные предметы, но если сделать это инфопоршнем то тогда возможен ведь такой случай, что подобрал скажем ПМ и выдался инфопоршень, но потом его можно выкинуть а инфопоршень ведь не исчезнет вроде как или исчезнет? Если не исчезнет то тогда подходим к НПСу у него появляется тот диалог что должен быть только если есть тот предмет так как дальше задействовывается функция передчи предмета от ГГ к НПСу а так как нет предмета то если в функции это не предусмотрено то игра вылетит.
musnuk alife():create("wpn_ak47",a,33447,47,65535) - последнее число указывает на id бота (или актора), которому будет спавниться вещь. Раз ты указываешь точку на земле, то выделенное оранжевым не нужно.