Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Скрипты
GAMEINATOR forums > S.T.A.L.K.E.R. > Мастерская: создание модов для S.T.A.L.K.E.R.
Страницы: 1, 2, 3, 4, 5, 6
HikeR
ссылку на game_object, надо полагать.
jboo7
Тогда у него был метод hit(), но его у него нет. Еще вариантыsmile.gif
Stalbar
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


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

А откуда уверенность, что не находит? Судя по вашему коду, там проверки на это нет... Я видел только попытки получить name неверным методом (--local st = object_n:name() --узнаем имя, для проверки)), а проверку того, что же всё-таки содержится в object_n я не видел. Собственно, весь пример выше и нужен был только для "показа" переменных.
jboo7
CODE
if object_n then
object_n:hit(boom)
else
get_console():execute("object_n..is..nill>>")
end


А это разве не проверка в моем коде на существование объекта?
Stalbar
jboo7, тогда пожалуйста, по порядку smile.gif Весь код, что приведён в первом сообщении на этой странице - он откуда? Как вызывается? Этот код из одной функции, или из нескольких?
jboo7
Две функции, думаю не стоит рассказывать как я их вызываю)

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
Цитата(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

jboo7
Kolmogor, спасибо большое) Это действительно помогло) Не думал, что все так просто, одну строку перенести в другое местоsmile.gif
HikeR
Цитата(Kolmogor @ 21.07.2009, 23:48) *
Вэтой функции вы пытаетесь получить клиентский объект сразу после создания. Его еще нет в игре, так как в онлайн он еще не перешел.

кстати, может кто скажет, почему цикл while с ожиданием наступления момента появления объекта в онлайне сразу после создания обычно вызывает краш?
и есть ли какой-то аналог ф-ии wait(столько-то-секунд), которую можно использовать?

просто была такая же заморочка.
iterate_inventory(... -- перебираю инвентарь
alife():release(... -- убираю некоторый объект
iterate_inventory(... -- опять перебираю, а объект все еще есть.

если добавить проверку вида
while true do
if not is_object_online(obj_id) then break end
end

то вываливаюсь, а по идее цикл должен был крутится пока этот obj_id не перестанет отзываться.
Stalbar
HikeR, насчёт аналога - не подскажу, но может попробовать такую конструкцию?
В начале скрипта поставить что-то типа

local flag = true

Затем, после того как "alife():release(... -- убираю некоторый объект", в цикле ставить проверку, наподобие

while flag == true do
if "убитый_объект" ~= nil then flag = true else flag = false end
end
Kolmogor
Цитата(HikeR @ 22.07.2009, 00:33) *
просто была такая же заморочка.
iterate_inventory(... -- перебираю инвентарь
alife():release(... -- убираю некоторый объект
iterate_inventory(... -- опять перебираю, а объект все еще есть.

Думаю дело в этом:
alife():release(...) убивает серверный объект
iterate_inventory(...) итерирует по клиентским
А синхронизация серверных и клиентских произойдет не раньше следующего actor_binder:update.
PATRON
А можно как-то, зная название обьекта, и не спавня его(так как он в игре уже есть как онлайн), ударить по нему хитом?
Вот например удаление долговца:
Код
function udar_nishtak()
    for a=10,65635,1 do
    local obj=alife():object(a)
        if obj and string.find(obj:name(),"dolg_regular") then
        alife():release(obj,true)
        end
    end
end

А вот кто-нибудь может переделать этот код, чтобы получилось что-то вроде:
Код
function udar_nishtak()
    for a=10,65635,1 do
    local obj=alife():object(a)
        if obj and string.find(obj:name(),"dolg_regular") then
        Какой код нужно поставить сюда, для хита?
        end
    end
end
vintprog
А кто знает как удалить все миссии действия в скриптах.
И начать делать миссии и всякое с нуля? rolleyes.gif
Kolmogor
Цитата(PATRON @ 22.07.2009, 11:43) *
А можно как-то, зная название обьекта, и не спавня его(так как он в игре уже есть как онлайн), ударить по нему хитом?

выше был пример взрыва бочки. Её взрывали нанося хит.
Разницы между бочкой и долговцем в этом случае никакой
Stalbar
Цитата(Kolmogor @ 22.07.2009, 16:00) *
Цитата(PATRON @ 22.07.2009, 11:43) *
А можно как-то, зная название обьекта, и не спавня его(так как он в игре уже есть как онлайн), ударить по нему хитом?

выше был пример взрыва бочки. Её взрывали нанося хит.
Разницы между бочкой и долговцем в этом случае никакой

Можно дополнить? smile.gif В примере выше использовался тип повреждения hit.explosion... Надо-ли говорить, что тип не один? Есть несколько типов - можете найти примеры использования в оригинальных скриптах и наносить объекту хит, наиболее подходящий для ситуации.
HikeR
Цитата(Stalbar @ 22.07.2009, 10:09) *
но может попробовать такую конструкцию?

она по сути повторяет тот же while true...
Цитата(Kolmogor @ 22.07.2009, 10:26) *
А синхронизация серверных и клиентских произойдет не раньше следующего actor_binder:update.

ахха, то есть минимальный момент времени, который нужно подождать - 1FPS. вопрос в том, как именно нужно ждать ;)
просто есть подозрение, что любой цикл приостанавливает выполнение скрипта, и при определенной задержке, то есть при отсутсвии возврата, игра крешится, специально либо из-за рассинхронизации.
а вешать на апдейт разовую ф-ию как-то не хочется.
Kolmogor
Цитата(Stalbar @ 22.07.2009, 15:32) *
Можно дополнить? smile.gif В примере выше использовался тип повреждения hit.explosion... Надо-ли говорить, что тип не один? Есть несколько типов - можете найти примеры использования в оригинальных скриптах и наносить объекту хит, наиболее подходящий для ситуации.

есть еще
hit.burn
hit.chemical_burn
hit.fire_wound
hit.radiation
hit.shock
hit.strike
hit.telepatic
hit.wound
Использовать так же как и hit.explosion. Эти значения взял из файла lua_help.script. Там же можно найти и много другой полезной информации. Ну а какой наиболее подходящий Вам виднее

Цитата(HikeR @ 22.07.2009, 16:02) *
ахха, то есть минимальный момент времени, который нужно подождать - 1FPS. вопрос в том, как именно нужно ждать wink.gif
просто есть подозрение, что любой цикл приостанавливает выполнение скрипта, и при определенной задержке, то есть при отсутсвии возврата, игра крешится, специально либо из-за рассинхронизации.
а вешать на апдейт разовую ф-ию как-то не хочется.

Как обойтись без влезания в апдейт я не знаю.
Можно еще правда set_fastcall попытаться приспособить(по использованию в скриптах чем-то напоминает апдейт smile.gif ). Когда нужно - установить, а после срабатывания сбросить.

Ну и кстати с циклом по идее вылета не должно быть. просто по идее биндер должен зависнуть и все smile.gif (то есть перестать срабатывать функции биндера). В АМК например, это зависание отлавливается и игра специально крешится. А можно лог вылета, если сохранился
HikeR
Цитата(Kolmogor @ 22.07.2009, 22:31) *
Можноеще правда set_fastcall попытаться приспособить

смотрел на это дело, но издалека, надо попробовать.
Цитата(Kolmogor @ 22.07.2009, 22:31) *
А можно лог вылета, если сохранился

у меня имеется некоторая трабла в виде установленной семерки, которая падает в синий экран при краше сталкера, а ребутить машину ночью никак нельзя. как-нить на днях выложу, если еще интересно будет.
Stalbar
Вопрос - кто-нибудь знает, как прочитать последнюю строку консоли в запущенной игре?
jboo7
В lua_help.script есть класс CConsole.

CODE
C++ class CConsole {
function execute_script(string);
function get_string(string);
function execute(string);
function get_bool(CConsole*, string);
function get_float(CConsole*, string);
function get_integer(CConsole*, string);
function get_token(string);
function show();
function hide();
};


Может get_string() что-то даст, по названию как ни какsmile.gif
Stalbar
Да, это я видел, даже пробовал вытащить именно через get_console:get_string(), что-то пока не получается. Поэтому и спросил, может кто подтолкнёт.. smile.gif
jboo7
get_string определенно не то, что нужно, потому что она возвращает значение в строке любой консольной команды, переданой в качестве параметра...

local str = get_console():get_string("rs_stats")

в итоге в str будет "on" или "off"

и разницы между get_string и get_token не нашел...
dry.gif
kutuzvden
Здрасте. Мб не совсем в тему, но все таки. Подскажите плиз, где находится в сталкере скрипт, отвечающий за голод, а то я в скриптах не бум бум-хочу сделать аналогичный скрипт по примеру голода. И еще: где и что нужно написать, чтоб игра обращалась к этому скрипту?
jboo7
Stalbar, может попробуешь сохранять лог-игры, когда нужно во время её работы, и просто читать от туда последнюю строку?smile.gif
Stalbar
jboo7, флушить лог можно, но как добиться, чтобы это происходило именно в момент появления там нужной мне строки???? smile.gif Хотя, если по этому условию можно флушить лог, то тогда мне и лог совсем не нужен smile.gif Мне нужно отловить именно появление определённой строки в логе, вернее в консоли.
Kolmogor
Цитата(Stalbar @ 23.07.2009, 14:54) *
Мне нужно отловить именно появление определённой строки в логе, вернее в консоли.

А какая задача вообще стоит? Зачем пытаешься строку в консоли отловить? Может необязательно строку в консоли отлавливать, может по-другому можно?
Stalbar
Цитата(Kolmogor @ 23.07.2009, 21:18) *
А какая задача вообще стоит? Зачем пытаешься строку в консоли отловить? Может необязательно строку в консоли отлавливать, может по-другому можно?

При активации артефакта под названием "мина" рождается аномалия "минное поле" smile.gif Движок на это непотребство реагирует выдачей в консоль 2 строк такого вида:
artefact [af_mine31076] spawned a zone [zone_mine_field] at [92.799683]
- !!!processing_enabled ->destroy_queue.push_back af_mine31076[31076] frame [18310]

Вот хочу попытаться отловить не факт перемещения игроком в активный слот айтема (он его может покрутить в руках и назад в рюкзак сунуть), а именно момент активации мины, после которого движок выдаёт в консоль вышеприведённые строки. Также очень хочется отловить момент "сработки" минного поля, как вот это реализовать - я пока в глубоких раздумьях... Если по варианту активации мины есть решение, но очень "некрасивое", я бы сказал, хотелось бы более элегантного, то по вопросу срабатывания минного поля мыслей пока никаких нет. Совсем. sad.gif
Kolmogor
Цитата(Stalbar @ 23.07.2009, 18:47) *
Вот хочу попытаться отловить не факт перемещения игроком в активный слот айтема (он его может покрутить в руках и назад в рюкзак сунуть), а именно момент активации мины, после которого движок выдаёт в консоль вышеприведённые строки.

При активации мины артефакт пропадает? Тогда это отлавливается как и использование предмета: в on_item_drop запоминаем ид, и в апдейт проверяем наличие объекта с таким ид - если объекта нет - значит заюзали
Stalbar
Цитата(Kolmogor @ 24.07.2009, 03:24) *
При активации мины артефакт пропадает? Тогда это отлавливается как и использование предмета: в on_item_drop запоминаем ид, и в апдейт проверяем наличие объекта с таким ид - если объекта нет - значит заюзали

Ну вот что-то наподобие сейчас и используется, только отслеживается появление аномалии, а не использование артефакта, потому как аномалии всё равно все "на учёте" и появление новой нужно фиксировать. А вот момент срабатывания уже самой аномалии на сегодняшний момент вижу только как проверку по нанесению хита какому-либо объекту в известной позиции (радиус аномалии). Пока больше никаких вариантов по этой проблеме у меня нет.
kutuzvden
Ау... Ответьте.
ДмитрийТ
Цитата(kutuzvden @ 24.07.2009, 01:07) *
Ау... Ответьте.

В ЛС
IG-2007
Цитата(Stalbar @ 24.07.2009, 00:46) *
А вот момент срабатывания уже самой аномалии на сегодняшний момент вижу только как проверку по нанесению хита какому-либо объекту в известной позиции (радиус аномалии). Пока больше никаких вариантов по этой проблеме у меня нет.

Можно определять не срабатывание аномалии, а вхождение в область её действия. В ЧН так отслеживалось наступание ГГ на мины.
Stalbar
Цитата(IG-2007 @ 24.07.2009, 13:36) *
Можно определять не срабатывание аномалии, а вхождение в область её действия. В ЧН так отслеживалось наступание ГГ на мины.

Ну да, значит "рою" в правильном направлении smile.gif Спасибо!
IG-2007
Цитата(Stalbar @ 24.07.2009, 11:13) *
Ну да, значит "рою" в правильном направлении smile.gif Спасибо!

Да, не за что smile.gif
Можно ещё в моде ZEN-а посмотреть, там было минирование. Он долго мучался с повторным срабатыванием мин, но потом, вроде бы, победил. Так что, там должно быть реализовано отслеживание срабатывания и не только для ГГ.
Stalbar
Цитата(IG-2007 @ 24.07.2009, 15:55) *
Можно ещё в моде ZEN-а посмотреть, там было минирование. Он долго мучался с повторным срабатыванием мин, но потом, вроде бы, победил. Так что, там должно быть реализовано отслеживание срабатывания и не только для ГГ.

Там просто заносились все новые минные поля в табличку и спустя энное кол-во часов убирались. Все. И сработавшие и не сработавшие.
vintprog
Ребята может кто подсказать несколько функцый:
1) как спавнить npc с хендлом и по этому хендлу менять его пармметры?
2) как дать npc-у оружие и.т.д.
3) как заставить npc стрелять без перерывов например с ak
4) как заставить npc идти на опредиленые координаты
5) как уничтожить npc
HikeR
vintprog, начните с вики для начала.
bill_gates
Люди, помогите! Как можно реализовать таймер через скрипт? Чтобы таймер запускался в игровом времени через функцию (например, вызываемую диалогом) и по истечении времени, на которое он был поставлен он должен выполнять определенную функцию. Например, чтобы после диалога с npc через 10 минут игрового времени актору выдавался инфопоршень. Как запускать функции из диалога и т.д. я знаю, но вот как сделать таймер не пойму. В amk и ogsm модах есть функция g_start_timer. Пробовал через нее - ничего не выходит(((
Stalbar
Цитата(bill_gates @ 10.08.2009, 17:52) *
В amk и ogsm модах есть функция g_start_timer. Пробовал через нее - ничего не выходит(((

Т.е. пробовал "выдёргивать" только эту функцию, или в самих модах пробовал запускать свой таймер? Не получается - игра крэшится с ошибкой, или просто ничего не происходит? Конкретизируй проблему smile.gif
bill_gates
Все! Я разобрался наконец. Просто я забывал добавить имя таймера в функцию __do_timer_action. Теперь все работает.
Nekt
kutuzvden на сколько помнится даже опроса на сколько голоден нету, как у здоровья.
Так-что ...
Хотя если кто знает, функцию опроса можете просветить человека.
Lance
На днях тут пришла идея с ЛЦУ для оружия.
И вот что заинтересовало:
Чисто теоретически, можно ли написать такой скрипт, чтобы при переключении на оружие с ЛЦУ, прицел менялся на динамический прицел-точку как в режиме без оружия?
Орион
Lance, Можно, но очень много мороки с проверками фова, враг/невраг и состояние оружия)Скрипт будет очень громоздким и мб просадку фпс даст хорошую. Но в теории - реально smile.gif
Lance
да враг/невраг ненадо совсем, т.к. тупо красная точка, цвет не меняет...
Хм. ну если идея кому понравилась, я моделькой лцу снабжу за написаный скрипт) т.к. пока самому луа учить времени нет.
jboo7
Можно как-то организовать респаун долговцев на кордоне?
jocker_27
Комрады, а можно (чисто теоретически) привязать alife к мультиплееру?
Орион
jocker_27, Нет, невозможно.
123456
Люди, нужна помощь!
Как в ТЧ в ДМ называются и вызываются функции fraglist и playerlist ??
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.