Перейти к контенту

Скриптование


Svoboда

Рекомендуемые сообщения

(изменено)

Вопрос №1:

Объекты созданные так:

    for a=1,65535,1 do
    local obj = alife():object(a)
        if obj then

проходят проверки:

1. IsStalker(obj)

2. obj:alive()

При попытке получить используемый бронежилет

local outfitMain = obj:get_current_outfit()

получаю ошибку:

[error]Arguments : LUA error: ....t.a.l.k.e.r\gamedata\scripts\sak_off_corpses.script:629: attempt to call method 'get_current_outfit' (a nil value)

При попытке пройтись по инвентарю с помощью

obj:inventory_for_each(function(item) local section = item:section() end)

ошибка:

[error]Arguments : LUA error: ....t.a.l.k.e.r\gamedata\scripts\sak_off_corpses.script:353: attempt to call method 'inventory_for_each' (a nil value)

c iterate_inventory() - аналогично...

 

Что делать? Это obj не правильный ? :)

 

P.S. Пробовал также использовать item_in_slot(6) - тот же результат. Я так понимаю, что эта функция только для ГГ.

 

Вопрос №2:

функция cost() возвращает значение с учётом condition() или нужно делать так: cost() * condition() ?

 

P.P.S. Как я понял - зря я парюсь с определением текущего бронежилета у непися, если, как я понял, у непися какой визуал - такой и бронежилет и в рюкзаке у него нету этого самого текущего броневизуала вообще :rolleyes:

Изменено пользователем sapsan

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

Подскажите, кто знает:

1. как узнать использован ли в данный момент оптический прицел главным героем ?

2. как убрать/вернуть весь индикаторный худ как по клавишам "серый минус"/"серый плюс" ?

 

malandrinus, это для ТЧ.

1. оружие с оптическим прицелом в состоянии прицеливания.

2. level.hide_indicators()/level.show_indicators() эквивалентны -/+, hud_weapon on/off убирает руки с оружием, hud_info on/off не заметил изменений на экране, а остальное не пробовал из-за ненадобности.

Изменено пользователем sapsan

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

Ещё вопрос по худу - как узнать был ли убран худ пользователём с помощью "-"? Если нет явного способа, то можно ли сделать это неявно - проверкой наличия какого-то стандартного элемента худа (например миникарты)?

 

Проверил с помощью проверки на наличие часов:

get_hud():GetCustomStatic("hud_show_time")

так они всегда присутствуют...

 

malandrinus, а сам элемент есть такой ? "hud_show_time" - это в Солянке часы выводятся...

Код

        local guiHidedManually = not cs
        get_console():execute("load ~#I#: guiHidedManually="..tostring(guiHidedManually))
        get_console():execute("load ~#I#: cs:wnd():IsEnabled()="..tostring(cs:wnd():IsEnabled()))
        get_console():execute("load ~#I#: cs:wnd():IsShown()="..tostring(cs:wnd():IsShown()))
        get_console():execute("load ~#I#: cs:wnd():GetWidth()="..tostring(cs:wnd():GetWidth()))
        get_console():execute("load ~#I#: cs:wnd():GetHeight()="..tostring(cs:wnd():GetHeight()))
        get_console():execute("load ~#I#: cs:wnd():GetTextX()="..tostring(cs:wnd():GetTextX()))
        get_console():execute("load ~#I#: cs:wnd():GetTextY()="..tostring(cs:wnd():GetTextY()))

всегда возвращает:

! Cannot find saved game ~#i#: guihidedmanually=false
! Cannot find saved game ~#i#: cs:wnd():isenabled()=true
! Cannot find saved game ~#i#: cs:wnd():isshown()=true
! Cannot find saved game ~#i#: cs:wnd():getwidth()=98
! Cannot find saved game ~#i#: cs:wnd():getheight()=19
! Cannot find saved game ~#i#: cs:wnd():gettextx()=22
! Cannot find saved game ~#i#: cs:wnd():gettexty()=1

Изменено пользователем sapsan

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

Подскажите, как выбросить предмет из тайника или трупа ?

Для живых неписей нормально работает npc:drop_item(obj).

Пока просто сохраняю пакет объекта, удаляю объект, создаю его рядом и восстанавливаю пакет.

 

Trapper023, нет, нужно выбрасывать именно из тайников и "готовых" трупов.

 

Министр, нашел.

 

P.S. Это нужно как раз для аналогичной ситуации. Только после переспавна я запускал таймер, который делал подрыв чуть позже. За это время предметы успевают выйти в онлайн и улететь от взрыва по-настоящему.

 

Министр, о смене parent_id тоже думал, но не знаю как это сделать. Возможно достаточно изменить его и чуть координаты выбрасываемого объекта.

Изменено пользователем sapsan

Поделиться этим сообщением


Ссылка на сообщение
Столкнулся с проблемой.

Имею 5 предметов с префиксом в имени test_имя_итема. В игре мне их нужно удалить, юзал такую функцию, ибо у этих предметов нет стори_айди:

function delete_npc() --делет нпс'а\объекта по строке
    for a=10,65635,1 do
    local obj=alife():object(a)
        if obj and string.find(obj:name(),"test_af") then
        alife():release(obj,true)
        end
    end
end

Но дублировать её для моих пяти предметов я не хочу. Вопрос: как удалить их по префиксу test?

P.S. Если можно ответьте с примером пожалуйста.

Вот так:

function delete_npc() --делет нпс'а\объекта по строке
    local sim = alife()
    local string_find = string.find
    local obj
    for a = 1, 65534 do
        obj = sim:object(a)
        if obj and string_find(obj:name(), "^test_") then
            sim:release(obj, true)
        end
    end
end

 

Диапазон должен быть от 1 до 65534 (0 это ГГ, а 65535 - земля в случае определение хозяина объекта)

По работе со строками поищи информацию о регулярных вырежениях в Lua.

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

Вопрос по биндерам.

Прикрутил биндер к тайникам, прописав им в секцию [inventory_box]

script_binding      = bind_inventory_box.init

function init(obj)
    local new_binder = inventory_box_binder(obj)
    obj:bind_object(new_binder)
end

class "inventory_box_binder" (object_binder)
function inventory_box_binder:__init(obj) super(obj)
end 

function inventory_box_binder:hit_callback(obj, amount, local_direction, who, bone_index)
    get_console():execute("load ~~~ inventory_box_binder:hit_callback clsid:"--[[..obj:clsid()..", name: "..obj:name()..", section: "..obj:section()]])
end

 

Стреляю, бросаю гранаты - в консоль ничего не попадает. В чем косяк ? :russian_ru:

Изменено пользователем sapsan

Поделиться этим сообщением


Ссылка на сообщение

gruber, malandrinus, мысли о нематериальности тайников были, но надежда держалась до последнего...

 

Другой вопрос - как красиво поймать атаку монстра на актора ?

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

Не подскажете как получить имя переменной как строку ?

Хочу усовершенствовать функцию дампа таблицы, чтобы она выводила имя таблицы, которая передается для вывода дампа.

 

Наверное проще добавить второй параметр и при вызове копипастить переменную-таблицу в него как строку по типу amk.dump_table(tbl, "tbl")

Изменено пользователем sapsan

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

Скорее всего у ГГ есть эта инфопорция:

not has_alife_info("yan_scientist_return_to_bunker")

Изменено пользователем sapsan

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

Пробую заставить говорить фразы неписей, когда они занимаются мародёрством, как в ЗП, но говорят они только после того, как подберут предмет и идут обратно. Наверное схема мародерства (в watcher_act.script) делает непися "занятым" и он не хочет проигрывать звук. Как "расслабить" схему, чтобы неписи могли произносить фразы ?

 

P.S. Для фраз использую xr_sound.script, sound_theme.script и script_sound.ltx. Диалоги таким способом озвучиваются нормально.

 

Добавлено через 128 мин.:

Куфзук, да, именно так. Так может у ГГ уже есть вторая инфопорция ?

Изменено пользователем sapsan

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

Каким образом сделать ГГ временно невидимым для врагов, но чтобы он не становился нейтралом к ним и не урезать дальность видимости у врагов ?

Пробовал исключать ГГ из врагов с помощью enable_memory_object. Может не там ставил (в хр_мотиваторе и хр_комбат), но не помогло.

 

Jurok, а это не приведет к тому, что непись не будет вступать в бой и с другими своими врагами когда его главным врагом является ГГ ?

Изменено пользователем sapsan

Поделиться этим сообщением


Ссылка на сообщение

Доброго времени суток.

 

Есть ли способ у убитого сталкера обратно включить фонарик ?

Специально убрал удаление фонарика у сталкеров -- в трупе вижу "очки".

Добавил код в хвост функции death_manager.on_death

    local torch = npc:object("device_torch")
    get_console():execute("load ~~~ [death_manager] "..npc:name().." torch "..tostring(torch ~= nil))
    if torch then
        torch:enable_attachable_item(true)
    end

 

Не срабатывает.

 

Поделиться этим сообщением


Ссылка на сообщение
sapsan, и не сработает, т.к. схема sr_light дефолтно обрабатывается всегда и для всех неписей (и трупов тоже) и именно у трупов всегда фонарик гасится, даже если ты его "ручками" пытаешься включать.

В схему влез, у трупа фонарик не тушится и схема не дёргается. В xr_motivator:death_callback вызов схемы убрал. Похоже, что у трупов все аттачи "отваливаются" и не работают.

Поделиться этим сообщением


Ссылка на сообщение

По хит_калбеку - что на Солянке, что на чистой (4, 6 патчи) - результат как у @proper70. Тоесть при смерти от единичного выстрела в голову - информации нет, при стрельбе в тело без моментальной смерти - есть.

@Artos, возможно, что твои чудо-добавки делают игру корректнее ?

  • Нравится 2

Поделиться этим сообщением


Ссылка на сообщение

@Карлан, сначала сохраняй размер таблицы, а уже потом - значения. Так же и читай - сначала читай сохраненный размер, а потом уже нужное количество раз читай значения. И тебе действительно нужна таблица с подтаблицами, а не просто таблица с парами ключ-значение ?
Лучше опиши задачу вообще, а потом уже твои способы решения.

  • Нравится 1

Поделиться этим сообщением


Ссылка на сообщение

@Карлан, если функции вида

function load_table(name)
	local var = load_variable(name)
	if var then return unpack_array_from_string(var) end
	return {}
end

function save_table(name,tbl)
	save_variable(name, pack_array_to_string(tbl))
end

тогда они обработают хоть всю твою таблицу любой вложенности. Разве что в Солянке они сейчас не такие, как были в чистом АМК. Ну и до Солянки они некорректно работали с булевыми значениями. Если таблица не большая, тогда можешь взять эти функции и вызываемые ими "подфункции" из последней Солянки и паковать хоть всю таблицу разом.

Поделиться этим сообщением


Ссылка на сообщение

@Карлан, ну тогда формируй таблицу только с теми значениями, которые должны сохраниться, и сохраняй посредством save_table, а после чтения в обратном порядке вноси в основную таблицу.

Поделиться этим сообщением


Ссылка на сообщение

@Artos, а разве хранилище само не конвертирует таблицы в строки и обратно для "удобства пользования" ?

P.S. Не изучал пока...

Поделиться этим сообщением


Ссылка на сообщение

"Удобства использования" все же имеют границы, за пределами которых начинаются неудобства.

Тоесть обычное преобразование таблицы в строку и обратно выходит за границы удобств ?

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

@Dennis_Chikin, это проще, чем писать менеджер сохранения таблицы в виде простых типов.


тебе же уже не раз написано, что исходная таблица в данном случае содержит такое кол-во данных, что при переводе в строку (сериализации) кол-во байт строки превышает 8 кБ

Где это написано ? От автора вопроса уточнения не было. И его сообщение я трактую однозначно - он сохраняет много преобразованных в строки таблиц, а не одну огромную таблицу с подтаблицами. Было лишь твоё предположение о последнем варианте. И если оно верно - это проблема автора вопроса, а не баг в хранилище. Если же не верно - вероятно он замучил хранилище до выявления бага. Почему бы не подождать уточнения от него самого, а не тыкать друг в друга авторитетными гипотезами ?
 

простейшая модификация оригинала

:good2:



Оставляю вас далее строить свои домысли и погадалки...

И ушел он в обнимку со своим домыслом... :crazy:

Изменено пользователем sapsan
  • Нравится 1
  • Не нравится 1

Поделиться этим сообщением


Ссылка на сообщение
  • Недавно просматривали   1 пользователь

AMK-Team.ru

×
×
  • Создать...