IPB

Помощь по разделу

Сайт S.T.A.L.K.E.R. Inside / [ЗП] Параметры командной строки / Распаковщик ресурсов

>

Скрипты

 
 Орион
сообщение 13.07.2009, 11:34
Сообщение #41


Навий черны у ношьти
***************

Группа: Забанен
Сообщений: 2210
Регистрация: 11.03.2009
Из: Лиманск
Пользователь №: 10251




FAQ

Lua в X-Ray

Список всех функций, переменных, классов и т.п. что используются в Сталкере находится по адресу:
Код
gamedata/scripts/lua_help.script

Для получения файла надо распаковать игру. Можно скачать, в принципе (IMG:style_emoticons/default/smile.gif) Тут =>>Ссылко<<=
Уроки

Пример создания непися скриптами ЛУА. Автор: меченый(стрелок)
Скриптинг на инсайде



Сообщение отредактировал RayTwitty - 09.06.2018, 20:23
Перейти в начало страницы
 
 
 
Ответов
 jboo7
сообщение 20.07.2009, 01:53
Сообщение #42


Почти Игрок
**

Группа: Участник
Сообщений: 20
Регистрация: 16.07.2009
Из: Мертвый город
Пользователь №: 11317



Код у меня такой:

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
Перейти в начало страницы
 
 
 HikeR
сообщение 20.07.2009, 02:12
Сообщение #43


Магистр Игры
****************

Группа: Участник
Сообщений: 2620
Регистрация: 26.03.2007
Из: Великий Новгород
Пользователь №: 5660



Цитата(jboo7 @ 20.07.2009, 02:53) *
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())
Перейти в начало страницы
 
 
 jboo7
сообщение 20.07.2009, 02:46
Сообщение #44


Почти Игрок
**

Группа: Участник
Сообщений: 20
Регистрация: 16.07.2009
Из: Мертвый город
Пользователь №: 11317



По сути у тебя тоже самое, что и у меня. Чтобы заспавнить в инвентарь нужно писать так

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
Перейти в начало страницы
 
 
 Stalbar
сообщение 20.07.2009, 08:28
Сообщение #45


Опытный Игрок
****

Группа: Участник
Сообщений: 60
Регистрация: 24.06.2009
Пользователь №: 11166



Цитата(jboo7 @ 20.07.2009, 05:53) *
--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))


и посмотри, что выдаст

Цитата(jboo7 @ 20.07.2009, 05:53) *
else --чтобы не было вылетов, выведем просто в консоль, что объекта нет
get_console():execute("object_n..is..nill>>")

А вот это отрабатывает в консоль? Если object_n nil то в логе будет такая запись..
Перейти в начало страницы
 
 
 andrey_chel_2905
сообщение 20.07.2009, 08:42
Сообщение #46





Группа: Только зарегистрировался
Сообщений: 1
Регистрация: 20.07.2009
Пользователь №: 11348



как написать скрипт следования nps за игроком
Перейти в начало страницы
 
 
 Орион
сообщение 20.07.2009, 11:07
Сообщение #47


Навий черны у ношьти
***************

Группа: Забанен
Сообщений: 2210
Регистрация: 11.03.2009
Из: Лиманск
Пользователь №: 10251



andrey_chel_2905,
Изучайте тутор: http://sdk.stalker-game.com/ru/index.php?t...D0%BA%D0%B0_NPC
Перейти в начало страницы
 
 
 jboo7
сообщение 20.07.2009, 12:01
Сообщение #48


Почти Игрок
**

Группа: Участник
Сообщений: 20
Регистрация: 16.07.2009
Из: Мертвый город
Пользователь №: 11317



Цитата(Stalbar @ 20.07.2009, 08:28) *
Цитата(jboo7 @ 20.07.2009, 05:53) *
--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 у неё есть какое-то...

Цитата(Stalbar @ 20.07.2009, 08:28) *
Цитата(jboo7 @ 20.07.2009, 05:53) *
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
Перейти в начало страницы
 
 
 Stalbar
сообщение 20.07.2009, 12:56
Сообщение #49


Опытный Игрок
****

Группа: Участник
Сообщений: 60
Регистрация: 24.06.2009
Пользователь №: 11166



Цитата(jboo7 @ 20.07.2009, 05:53) *
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
Перейти в начало страницы
 
 
 jboo7
сообщение 20.07.2009, 13:21
Сообщение #50


Почти Игрок
**

Группа: Участник
Сообщений: 20
Регистрация: 16.07.2009
Из: Мертвый город
Пользователь №: 11317



Цитата(Stalbar @ 20.07.2009, 12:56) *
Цитата(jboo7 @ 20.07.2009, 05:53) *
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


После этого игра вылетает с таким логом(IMG:http://www.gameru.net/forum/style_emoticons/default/smile.gif) (IMG:http://www.gameru.net/forum/style_emoticons/default/smile.gif) (IMG:http://www.gameru.net/forum/style_emoticons/default/smile.gif) (IMG:http://www.gameru.net/forum/style_emoticons/default/smile.gif) (IMG:http://www.gameru.net/forum/style_emoticons/default/smile.gif) (IMG:http://www.gameru.net/forum/style_emoticons/default/smile.gif) (IMG:http://www.gameru.net/forum/style_emoticons/default/smile.gif) (IMG:http://www.gameru.net/forum/style_emoticons/default/smile.gif) (IMG:http://www.gameru.net/forum/style_emoticons/default/smile.gif) (IMG:http://www.gameru.net/forum/style_emoticons/default/smile.gif)

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(). И че делать?)
Перейти в начало страницы
 
 
 jboo7
сообщение 21.07.2009, 18:24
Сообщение #51


Почти Игрок
**

Группа: Участник
Сообщений: 20
Регистрация: 16.07.2009
Из: Мертвый город
Пользователь №: 11317



Кто-то знает какого класса объект, возвращаемый alife():create()?
Перейти в начало страницы
 
 
 HikeR
сообщение 21.07.2009, 18:34
Сообщение #52


Магистр Игры
****************

Группа: Участник
Сообщений: 2620
Регистрация: 26.03.2007
Из: Великий Новгород
Пользователь №: 5660



ссылку на game_object, надо полагать.
Перейти в начало страницы
 
 
 jboo7
сообщение 21.07.2009, 18:44
Сообщение #53


Почти Игрок
**

Группа: Участник
Сообщений: 20
Регистрация: 16.07.2009
Из: Мертвый город
Пользователь №: 11317



Тогда у него был метод hit(), но его у него нет. Еще варианты(IMG:http://www.gameru.net/forum/style_emoticons/default/smile.gif)
Перейти в начало страницы
 
 
 Stalbar
сообщение 21.07.2009, 20:38
Сообщение #54


Опытный Игрок
****

Группа: Участник
Сообщений: 60
Регистрация: 24.06.2009
Пользователь №: 11166



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


Запускаем, проверяем, скриним

(IMG:http://img.gameru.net/th/05729.jpg)

Тыц на Esc и F1, опа, сработало!

(IMG:http://img.gameru.net/th/a2a89.jpg)

И в логе появилось ! Unknown command: :Марка и номер двигателя: vehicle_niva 41217

Отходим, шоб не долбануло...

(IMG:http://img.gameru.net/th/b8c4c.jpg)

Тыц на Esc и F2, Бумс!

(IMG:http://img.gameru.net/th/7732c.jpg)

Ну и на финал, лог

! 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
Перейти в начало страницы
 
 
 jboo7
сообщение 21.07.2009, 21:33
Сообщение #55


Почти Игрок
**

Группа: Участник
Сообщений: 20
Регистрация: 16.07.2009
Из: Мертвый город
Пользователь №: 11317



Без сомнений всё подробно описал, респект)
Но вопрос только один: почему level.object_by_id амк_канистру не находит?..
Перейти в начало страницы
 
 
 Stalbar
сообщение 21.07.2009, 21:56
Сообщение #56


Опытный Игрок
****

Группа: Участник
Сообщений: 60
Регистрация: 24.06.2009
Пользователь №: 11166



Цитата(jboo7 @ 22.07.2009, 01:33) *
Без сомнений всё подробно описал, респект)
Но вопрос только один: почему level.object_by_id амк_канистру не находит?..

А откуда уверенность, что не находит? Судя по вашему коду, там проверки на это нет... Я видел только попытки получить name неверным методом (--local st = object_n:name() --узнаем имя, для проверки)), а проверку того, что же всё-таки содержится в object_n я не видел. Собственно, весь пример выше и нужен был только для "показа" переменных.
Перейти в начало страницы
 
 
 jboo7
сообщение 21.07.2009, 22:03
Сообщение #57


Почти Игрок
**

Группа: Участник
Сообщений: 20
Регистрация: 16.07.2009
Из: Мертвый город
Пользователь №: 11317



CODE
if object_n then
object_n:hit(boom)
else
get_console():execute("object_n..is..nill>>")
end


А это разве не проверка в моем коде на существование объекта?
Перейти в начало страницы
 
 
 Stalbar
сообщение 21.07.2009, 22:26
Сообщение #58


Опытный Игрок
****

Группа: Участник
Сообщений: 60
Регистрация: 24.06.2009
Пользователь №: 11166



jboo7, тогда пожалуйста, по порядку (IMG:http://www.gameru.net/forum/style_emoticons/default/smile.gif) Весь код, что приведён в первом сообщении на этой странице - он откуда? Как вызывается? Этот код из одной функции, или из нескольких?
Перейти в начало страницы
 
 
 jboo7
сообщение 21.07.2009, 22:38
Сообщение #59


Почти Игрок
**

Группа: Участник
Сообщений: 20
Регистрация: 16.07.2009
Из: Мертвый город
Пользователь №: 11317



Две функции, думаю не стоит рассказывать как я их вызываю)

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 пусто...
Перейти в начало страницы
 
 
 Kolmogor
сообщение 21.07.2009, 22:48
Сообщение #60


Опытный Геймер
*******

Группа: Участник
Сообщений: 182
Регистрация: 08.09.2008
Пользователь №: 8878



Цитата(jboo7 @ 21.07.2009, 23:38) *
Две функции, думаю не стоит рассказывать как я их вызываю)

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
Перейти в начало страницы
 
 
 jboo7
сообщение 21.07.2009, 23:10
Сообщение #61


Почти Игрок
**

Группа: Участник
Сообщений: 20
Регистрация: 16.07.2009
Из: Мертвый город
Пользователь №: 11317



Kolmogor, спасибо большое) Это действительно помогло) Не думал, что все так просто, одну строку перенести в другое место(IMG:http://www.gameru.net/forum/style_emoticons/default/smile.gif)
Перейти в начало страницы
 
 
 
 

 
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 

Текстовая версия Сейчас: 21.06.2018, 12:52