Скрипты |
Здравствуйте, гость ( Авторизация | Регистрация )
Сайт S.T.A.L.K.E.R. Inside / [ЗП] Параметры командной строки / Распаковщик ресурсов
Скрипты |
13.07.2009, 11:34
Сообщение
#41
|
|
Навий черны у ношьти Репутация: 377 Группа: Забанен Сообщений: 2210 Регистрация: 11.03.2009 |
FAQ Lua в X-Ray Список всех функций, переменных, классов и т.п. что используются в Сталкере находится по адресу: Код gamedata/scripts/lua_help.script Для получения файла надо распаковать игру. Можно скачать, в принципе Тут =>> Уроки Сообщение отредактировал RayTwitty - 09.06.2018, 20:23 -------------------- нарушение правил п. 7.2
|
 
|
|
|
|
20.07.2009, 01:53
Сообщение
#42
|
|
Почти Игрок Репутация: 4 Группа: Участник Сообщений: 20 Регистрация: 16.07.2009 |
Код у меня такой:
local object_s = alife():create("amk_kanistra",db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id()) local object_id = object_s.id local object_n = level.object_by_id(object_id) --local st = object_n:name() --узнаем имя, для проверки) --get_console():execute("object_n..name>>"..st) local boom = hit() boom.direction = vector():set(0,1,0) boom.impulse = 1000000 boom.draftsman = object_n boom.power = 1000 boom.type = hit.explosion if object_n then object_n:hit(boom) else --чтобы не было вылетов, выведем просто в консоль, что объекта нет get_console():execute("object_n..is..nill>>") end Если убрать там комменты, игра вылетит с таким логом: Expression : fatal error Function : CScriptEngine::lua_error File : E:\stalker\patch_1_0004\xr_3da\xrGame\script_engine.cpp Line : 73 Description : <no expression> Arguments : LUA error: ...s\s.t.a.l.k.e.r\gamedata\scripts\ui_main_menu.script:452: attempt to index local 'object_n' (a nil value) Отсюда следует, что object_n = nil ... Вместо вылетов поставил условие, чтобы не надоедало) Сообщение отредактировал jboo7 - 20.07.2009, 01:54 -------------------- "Everybody lies" - Doctor House
|
 
|
|
20.07.2009, 02:12
Сообщение
#43
|
|
Магистр Игры Репутация: 270 Группа: Участник Сообщений: 2620 Награды: 4 Регистрация: 26.03.2007 |
localobject_s = alife():create("amk_kanistra",db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id()) то есть канистру в инвентарь спавните. а разве level.object_by_id() что-нибудь возвращает для объектов в инвентаре, и присутсвует ли вообще эта канистра в игре как объект, который можно взорвать? попробуйте просто перед собой заспавнить в паре метров. Код local pos = db.actor:position()
local dir = db.actor:direction() pos = pos:add(dir:mul(5)) -- создаем предмет в 5 метрах прямо перед нами alife():create(чего_надо, pos, 1, db.actor:game_vertex_id()) |
 
|
|
20.07.2009, 02:46
Сообщение
#44
|
|
Почти Игрок Репутация: 4 Группа: Участник Сообщений: 20 Регистрация: 16.07.2009 |
По сути у тебя тоже самое, что и у меня. Чтобы заспавнить в инвентарь нужно писать так
alife():create("amk_kanistra", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id()) тогда канистра попадет в инвентарь. А так она спавнится под ногами у ГГ Сообщение отредактировал jboo7 - 20.07.2009, 02:47 -------------------- "Everybody lies" - Doctor House
|
 
|
|
20.07.2009, 08:28
Сообщение
#45
|
|
Опытный Игрок Репутация: 12 Группа: Участник Сообщений: 60 Регистрация: 24.06.2009 |
--local st = object_n:name() --узнаем имя, для проверки) --get_console():execute("object_n..name>>"..st) Измени и дополни вывод инфы local st = object_n:section_name() --узнаем имя, для проверки) get_console():execute("object_n..name>>"..tostring(st)) get_console():execute("object_id>>"..tostring(object_id)) и посмотри, что выдаст else --чтобы не было вылетов, выведем просто в консоль, что объекта нет get_console():execute("object_n..is..nill>>") А вот это отрабатывает в консоль? Если object_n nil то в логе будет такая запись.. -------------------- OGS Evolution Team
|
 
|
|
20.07.2009, 08:42
Сообщение
#46
|
|
Репутация: 1 Группа: Только зарегистрировался Сообщений: 1 Регистрация: 20.07.2009 |
как написать скрипт следования nps за игроком
|
 
|
|
20.07.2009, 11:07
Сообщение
#47
|
|
Навий черны у ношьти Репутация: 377 Группа: Забанен Сообщений: 2210 Регистрация: 11.03.2009 |
andrey_chel_2905,
Изучайте тутор: -------------------- нарушение правил п. 7.2
|
 
|
|
20.07.2009, 12:01
Сообщение
#48
|
|
Почти Игрок Репутация: 4 Группа: Участник Сообщений: 20 Регистрация: 16.07.2009 |
--local st = object_n:name() --узнаем имя, для проверки) --get_console():execute("object_n..name>>"..st) Измени и дополни вывод инфы local st = object_n:section_name() --узнаем имя, для проверки) get_console():execute("object_n..name>>"..tostring(st)) get_console():execute("object_id>>"..tostring(object_id)) и посмотри, что выдаст Я попробую, но в принципе в этом нет смысла, потому что в логе написано, что object_n == nil. Для этого я и добавил там в условие else, чтобы узнать есть ли этот объект вообще. В общем оставил только незакомментеной строчку get_console():execute("object_id>>"..tostring(object_id)). id у неё есть какое-то... else --чтобы не было вылетов, выведем просто в консоль, что объекта нет get_console():execute("object_n..is..nill>>") А вот это отрабатывает в консоль? Если object_n nil то в логе будет такая запись.. Просто консоль попытается это воспринять как команда, но такой команды нет, поэтому, если зайти в консоль и если object_n == nil, то в консол красным будет выведена надпись "object_n..is..nill>>" При запуске того кода в консол выводится "object_n..is..nill>>". Сообщение отредактировал jboo7 - 20.07.2009, 12:13 -------------------- "Everybody lies" - Doctor House
|
 
|
|
20.07.2009, 12:56
Сообщение
#49
|
|
Опытный Игрок Репутация: 12 Группа: Участник Сообщений: 60 Регистрация: 24.06.2009 |
if object_n then object_n:hit(boom) else --чтобы не было вылетов, выведем просто в консоль, что объекта нет get_console():execute("object_n..is..nill>>") end Тогда не парься и давай хит прямо по object_s if object_s then object_s:hit(boom) else --чтобы не было вылетов, выведем просто в консоль, что объекта нет get_console():execute("object_s..is..nill>>") end -------------------- OGS Evolution Team
|
 
|
|
20.07.2009, 13:21
Сообщение
#50
|
|
Почти Игрок Репутация: 4 Группа: Участник Сообщений: 20 Регистрация: 16.07.2009 |
if object_n then object_n:hit(boom) else --чтобы не было вылетов, выведем просто в консоль, что объекта нет get_console():execute("object_n..is..nill>>") end Тогда не парься и давай хит прямо по object_s if object_s then object_s:hit(boom) else --чтобы не было вылетов, выведем просто в консоль, что объекта нет get_console():execute("object_s..is..nill>>") end После этого игра вылетает с таким логом Expression : fatal error Function : CScriptEngine::lua_error File : E:\stalker\patch_1_0004\xr_3da\xrGame\script_engine.cpp Line : 73 Description : <no expression> Arguments : LUA error: ...s\s.t.a.l.k.e.r\gamedata\scripts\ui_main_menu.script:464: attempt to call method 'hit' (a nil value) То есть у object_s нема метода hit(). И че делать?) -------------------- "Everybody lies" - Doctor House
|
 
|
|
21.07.2009, 18:24
Сообщение
#51
|
|
Почти Игрок Репутация: 4 Группа: Участник Сообщений: 20 Регистрация: 16.07.2009 |
Кто-то знает какого класса объект, возвращаемый alife():create()?
-------------------- "Everybody lies" - Doctor House
|
 
|
|
21.07.2009, 18:34
Сообщение
#52
|
|
Магистр Игры Репутация: 270 Группа: Участник Сообщений: 2620 Награды: 4 Регистрация: 26.03.2007 |
ссылку на game_object, надо полагать.
|
 
|
|
21.07.2009, 18:44
Сообщение
#53
|
|
Почти Игрок Репутация: 4 Группа: Участник Сообщений: 20 Регистрация: 16.07.2009 |
Тогда у него был метод hit(), но его у него нет. Еще варианты
-------------------- "Everybody lies" - Doctor House
|
 
|
|
21.07.2009, 20:38
Сообщение
#54
|
|
Опытный Игрок Репутация: 12 Группа: Участник Сообщений: 60 Регистрация: 24.06.2009 |
jboo7, самому докопаться до истины - "не наш метод"?? Ну ок, сделаю тебе полный "тутор по взрыву канистры". В картинках. С кодом.
Так как амк_канистры не нашёл, сделал пример на "Ниве", надеюсь, это-то сможешь поменять?? В файле ui_main_menu.script объявляем переменную в самом начале: local niva_id = 0 далее добавляем свои вызовы в function main_menu:OnKeyboard(dik, keyboard_action) - вешаем на F1 и F2 Код if dik == DIK_keys.DIK_F1 then if level.present() and (db.actor ~= nil) and db.actor:alive() then local console = get_console() console:execute("main_menu off") spawn_niva() end end if dik == DIK_keys.DIK_F2 then if level.present() and (db.actor ~= nil) and db.actor:alive() then local console = get_console() console:execute("main_menu off") boom_niva() end end в конце скрипта, собственно, "наше всё" Код function spawn_niva() local lvid, gvid = db.actor:level_vertex_id(),db.actor:game_vertex_id() local pos = db.actor:position() local dir = db.actor:direction() pos = pos:add(dir:mul(5)) local spawn_item = alife():create("vehicle_niva",pos,lvid, gvid) local niva_name = spawn_item:section_name() niva_id = spawn_item.id amk.logf("Марка и номер двигателя: "..tostring(niva_name).." "..tostring(spawn_item.id)) end function boom_niva() local obj_niva = level.object_by_id(niva_id) if obj_niva then local niva_pos = obj_niva:position() local niva_dist = niva_pos:distance_to(db.actor:position()) amk.logf("Номер авто в ГАИ: "..tostring(niva_id)) amk.logf("Позиция авто: "..tostring(niva_pos.x).." "..tostring(niva_pos.y).." "..tostring(niva_pos.z)) amk.logf("Расстояние до актора: "..tostring(niva_dist)) local boom = hit() boom.direction = vector():set(0,1,0) boom.impulse = 1 boom.draftsman = obj_niva boom.power = 10 boom.type = hit.explosion obj_niva:hit(boom) else amk.logf("Авто в ГАИ не зарегестировано!! Угнали??") end end Запускаем, проверяем, скриним Тыц на Esc и F1, опа, сработало! И в логе появилось ! Unknown command: :Марка и номер двигателя: vehicle_niva 41217 Отходим, шоб не долбануло... Тыц на Esc и F2, Бумс! Ну и на финал, лог ! Unknown command: :Номер авто в ГАИ: 41217 ! Unknown command: :Позиция авто: -119.96485137939 -8.2003936767578 -141.2625579834 ! Unknown command: :Расстояние до актора: 12.44276714325 Вывод в лог используется амк-шный, ибо удобен... если у тебя нет файла amk.script ( в чём я сомневаюсь), то вот используемые функции Код function logf( fmt, ... ) logf_console = get_console() logf = logf_main logf_main( fmt, ... ) end function logf_main( fmt, ... ) local c = select( "#", ... ) if c <= 0 then -- nothing to format logf_console:execute( ":" .. string.gsub( fmt, " ", "\160" ) ) else logf_console:execute( ":" .. string.gsub( string.format( fmt, ... ), " ", "\160" ) ) end end Вопросы?? Сообщение отредактировал Stalbar - 21.07.2009, 20:41 -------------------- OGS Evolution Team
|
 
|
|
21.07.2009, 21:33
Сообщение
#55
|
|
Почти Игрок Репутация: 4 Группа: Участник Сообщений: 20 Регистрация: 16.07.2009 |
Без сомнений всё подробно описал, респект)
Но вопрос только один: почему level.object_by_id амк_канистру не находит?.. -------------------- "Everybody lies" - Doctor House
|
 
|
|
21.07.2009, 21:56
Сообщение
#56
|
|
Опытный Игрок Репутация: 12 Группа: Участник Сообщений: 60 Регистрация: 24.06.2009 |
Без сомнений всё подробно описал, респект) Но вопрос только один: почему level.object_by_id амк_канистру не находит?.. А откуда уверенность, что не находит? Судя по вашему коду, там проверки на это нет... Я видел только попытки получить name неверным методом (--local st = object_n:name() --узнаем имя, для проверки)), а проверку того, что же всё-таки содержится в object_n я не видел. Собственно, весь пример выше и нужен был только для "показа" переменных. -------------------- OGS Evolution Team
|
 
|
|
21.07.2009, 22:03
Сообщение
#57
|
|
Почти Игрок Репутация: 4 Группа: Участник Сообщений: 20 Регистрация: 16.07.2009 |
CODE if object_n then object_n:hit(boom) else get_console():execute("object_n..is..nill>>") end А это разве не проверка в моем коде на существование объекта? -------------------- "Everybody lies" - Doctor House
|
 
|
|
21.07.2009, 22:26
Сообщение
#58
|
|
Опытный Игрок Репутация: 12 Группа: Участник Сообщений: 60 Регистрация: 24.06.2009 |
jboo7, тогда пожалуйста, по порядку Весь код, что приведён в первом сообщении на этой странице - он откуда? Как вызывается? Этот код из одной функции, или из нескольких?
-------------------- OGS Evolution Team
|
 
|
|
21.07.2009, 22:38
Сообщение
#59
|
|
Почти Игрок Репутация: 4 Группа: Участник Сообщений: 20 Регистрация: 16.07.2009 |
Две функции, думаю не стоит рассказывать как я их вызываю)
CODE function main_menu:spawn(n) local object_s = alife():create("amk_kanistra",db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id()) local object_id = object_s.id object_n = level.object_by_id(object_id) end function main_menu:explode() local boom = hit() boom.direction = vector():set(1,0,0) boom.impulse = 1000000 boom.draftsman = object_n boom.power = 1000 boom.type = hit.explosion if object_n then object_n:hit(boom) else get_console():execute("object_n..is..nil>") end end Тут все понятно, но в object_n пусто... -------------------- "Everybody lies" - Doctor House
|
 
|
|
21.07.2009, 22:48
Сообщение
#60
|
|
Опытный Геймер Репутация: 147 Группа: Участник Сообщений: 182 Регистрация: 08.09.2008 |
Две функции, думаю не стоит рассказывать как я их вызываю) function main_menu:spawn(n) local object_s = alife():create("amk_kanistra", ...) local object_id = object_s.id object_n = level.object_by_id(object_id) end Тут все понятно, но в object_n пусто... В этой функции вы пытаетесь получить клиентский объект сразу после создания. Его еще нет в игре, так как в онлайн он еще не перешел. Поэтому там и пусто. Лучше запомнить object_id и по нему получить клиентский объект в explode() То есть как-то так CODE local object_id function main_menu:spawn(n) local object_s = alife():create("amk_kanistra",db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id()) object_id = object_s.id end function main_menu:explode() local boom = hit() boom.direction = vector():set(1,0,0) boom.impulse = 1000000 boom.draftsman = object_n boom.power = 1000 boom.type = hit.explosion local object_n = level.object_by_id(object_id) if object_n then object_n:hit(boom) else get_console():execute("object_n..is..nil>") end end Сообщение отредактировал Kolmogor - 21.07.2009, 22:53 |
 
|
|
21.07.2009, 23:10
Сообщение
#61
|
|
Почти Игрок Репутация: 4 Группа: Участник Сообщений: 20 Регистрация: 16.07.2009 |
Kolmogor, спасибо большое) Это действительно помогло) Не думал, что все так просто, одну строку перенести в другое место
-------------------- "Everybody lies" - Doctor House
|
 
|
|
Текстовая версия | Сейчас: 26.04.2024, 06:18 |