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

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


Svoboда

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

(изменено)

TRAMP14 посмотри как реализован вывод на худ часов: http://www.amk-team.ru/forum/index.php?sho...st&p=219306 и сделай по аналогии.

 

Byurrer, что именно ты хочешь сделать? Ты просишь помощи, но не говоришь сути, сложно понять тебя без экстрасенсорных способностей! Объясни хотя бы это

есть идейка как реарганизовать под специальный приемник ...
в чем заключается "специальность" твоего приемника? Изменено пользователем Куфзук

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


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

ВСЕХ с наступающим Новым Годом! :ny_smile:

TRAMP14, вот смотри, приблизительно, код будет выглядеть вот так:

local function counting_kits(item)
    if item:name() == "medkit" or item:name() == "medkit_army" or item:name() == "medkit_scientic" then
        number_of_kits = number_of_kits + 1
    end
end

local number_of_kits = 0
function all_kits (actor, npc)
    actor:inventory_for_each(counting_kits)
    return number_of_kits
end

Вызывать нужно функцию all_kits. НО! Если вешать на апдейт для актора, то это не гуд! Считай каждый вызов апдейта, а это где-то каждые 40 мс, будет происходить подсчет аптечек в его инвентаре. Лично я стараюся без КРАЙНЕЙ надобности его не нагружать. Но решать тебе!

P.S. Код набросал на работе, поэтому если что не так, пусть меня поправят.

 

1. Функция all_kits, считает колличество аптечек в инвентаре у актора (сумма будет общей, т.е. обычные+армейские+научные). Как это происходит:

Локальная функция counting_kits получает в качестве параметра, объект возвращаемый функцией inventory_for_each (это стандартная функция ПЫСов).

Переменная number_of_kits будет хранить в себе то самое колличество аптечек.

Функция inventory_for_each перебирает все предметы в инвентаре, кроме тех, что находяться в невидимых слотах (нож, бинокль, болт, фонарик и ПДА). Про эту функцию можешь почитать сдесь: Описание класса game_object. В качестве параметра ей будет передаваться локальная функия counting_kits.

 

Т.е. когда ты вызовишь функцию all_kits, начнет работать функция inventory_for_each, перебирая в инвенторе все предметы. Когда она найдет первый предмет, она передаст его в качестве параметра функции counting_kits. Она же, в свою очередь, будет сравнивать имя этого предмета с именем одной из аптечек, если это аптечка, то переменная number_of_kits увеличиться на один. И так далее, пока не переберуться все предметы. В итоге у тебя будет возвращено общее колличество аптечек.

 

2. Таймер нужно где-то запустить! Если ты хочешь выводить колличество аптечек на худ, то тебе нужно вешать на апдейт.

Изменено пользователем Куфзук

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


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

_Призрак_, так я что, я ничего! Просто на сколько я понял TRAMP14 он хочет выводить колличество имеющихся аптечек в инвенторе на худ. Если функцию повесить на

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

 

TRAMP14, в инструкции вывода часов на худ, присутствует вот такая строка:

msg = string.format(" %02d:%02d\n", time_h, time_m)

Вместо того, что в скобках напиши переменную number_of_kits.

Т.е. функция должна выглядеть

function show_time()
    local hud = get_hud()
    local cs = hud:GetCustomStatic("hud_show_time")
    if cs == nil then
        hud:AddCustomStatic("hud_time_static", true)
        hud:AddCustomStatic("hud_show_time", true)
        cs = hud:GetCustomStatic("hud_show_time")
    end

    local number_of_kits = all_kits (db.actor)

    msg = string.format(number_of_kits)

    if cs ~= nil then cs:wnd():SetText(msg) end
end

Нужно передать в эту функцию number_of_kits, а не просто прописать!!!

 

Если ошибся, пусть меня поправят!

Изменено пользователем Куфзук

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


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

TRAMP14, нет! В одном файле размести три функции: counting_kits, all_kits и show_time. В апдейте нужно вызывать show_time, как в инструкции "выводим часы на худ".

Только имеет смысл переименовать функцию show_time, например в show_all_kits.

ВАЖНО! Я не проверял работоспособность! Приду домой проверю и отпишусь в ЛС.

ОЧЕНЬ ВАЖНО! Не стоит останавливаться на достигнутом! TRAMP14, выучить луа ты сможешь! Но важно панять и функции которые использует STALKER, начни отсюда: Справочник по функциям и классам

Изменено пользователем Куфзук

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


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

Всем доброго утра! И разумеется с наступающим Новым Годом!

В начале страницы шла речь о том, чтобы вывести на худ колличество аптечек. Так вот собственно эта реализация:

Скрипт подсчета - мой, а вот вывод пришлось позаимствовать у

steelrat, Выводим часы на HUD

Итак! В папке scripts создаем файл ваше_название_скрипта.script и вписываем в него следующие строки:

local function counting_kits(item)
    local section = item:section()
    if section == "medkit" or section == "medkit_army" or section == "medkit_scientic" then
        number_of_kits = number_of_kits + 1
    end
end

function all_kits ()
    number_of_kits = 0
    db.actor:inventory_for_each(counting_kits)
    return number_of_kits
end

function output_kits_to_hud()
    local hud = get_hud()
    local cs = hud:GetCustomStatic("hud_show_time")
    if cs == nil then
        hud:AddCustomStatic("hud_time_static", true)
        hud:AddCustomStatic("hud_show_time", true)
        cs = hud:GetCustomStatic("hud_show_time")
    end

    msg = string.format("%s", all_kits())
    
    if cs ~= nil then cs:wnd():SetText(msg) end
end

После, в файл ui_custom_msgs.xml в папке config/ui/ дописываем следующее:

<hud_time_static  x="852" y="17" width="156" height="52">
     <text complex_mode="0" x="65" y="0" font="letterica16" r="255" g="255" b="255" a="130">st_pda_total</text>
     <texture>ui_hud_frame_clock</texture>
</hud_time_static>
<hud_show_time x="862" y="38" width="156" height="52">
     <text x="0" y="0" font="graffiti19" r="255" g="255" b="255" a="140" align="c"/>
</hud_show_time>

Затем в файл bind_stalker.script дописываем после

function actor_binder:update(delta)
    object_binder.update(self, delta)

строку

ваше_название_скрипта.output_kits_to_hud()

 

ЗАМЕЧАНИЕ! Принцип вывода на худ не мой, а steelrata.

Описание алгоритма есть парой постами выше.

Выводить на худ можно количество чего угодно лежащего в инвенторе. В строке

if section == "medkit" or section == "medkit_army" or section == "medkit_scientic" then

вместо аптечек вписываем нужную секцию.

Выражаю свою благодарнось malandrinus, за помощь в отладке скрипта.

Изменено пользователем Куфзук

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


Ссылка на сообщение
TRAMP14, почитай тему. Вылет происходит из-за не правильного! написании логики. Перепроверь.

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


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

ZeeK, вот как это сделано у АМК:

local points={
    {
        position={x=-24.2727108001709,y=-12.1660995483398,z=-100.200202941895},
        gv=0,
        lv=73868
        },
    {
        position={x=159.56,y=4.72,z=88.60},
        gv=155,
        lv=463808
        },
    {
        position={x=-4.11,y=2.90,z=108.09},
        gv=85,
        lv=272619
        }
}

function spawn_star(actor,npc,p1,p2)
    local a = points[math.random(table.getn(points))]
    local obj = alife():create("amk_af_night_star", vector():set(a.position.x,a.position.y,a.position.z), a.lv, a.gv)
    if (obj) then
        if is_debug==true then add_spot_on_map(obj.id, "red_location", "art") end
    end
    local m_where 
    if news_main then
        m_where = news_main.get_point_description("l01_escape", vector():set(a.position.x,a.position.y,a.position.z))
    else
        m_where = "Здесь, на Кордоне"
    end
    db.actor:give_talk_message(m_where.." скорее всего поискать стоит. Где-то там он, точно говорю.", "ui\\ui_iconstotal", Frect():set(0,0,10,10), "simple_answer_item")
end

 

 

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

znachara, что ты делаешь? Ни в одном из оригиналов STALKERa, ни в одном модов который у меня имеется, текстура inv_fon, не используется! :ny_huh:

 

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

TRAMP14, у меня код работает, могу видюшку снять. Делал на полностью пустых локациях от KostyaV.

Изменено пользователем Куфзук

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


Ссылка на сообщение
speczadanie, те детекторы которые были сделаны ПЫСами реализованы через движок. Все, что я нашел поиском по ключевому слову "detector", это схему на определение опасной границы уровня, плюс некие мелочи, по поводу звуков и тому бодобного. Поэтому, юзай то, что тебе предложил Garry_Galler. Или объясни подробнее, что тебе нужно. Возможно тепе не предется реализовывать целую схему, а лишь нужно будет воспользоваться парой функциями.

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


Ссылка на сообщение
@"StreloK", могу предположить, что это не есть ошибка, а лишь непонятный косяк вызваный вот этим:
p0:links = p1(0)

напиши вместо этого так:
p0:links = p1(1)

и я уверен на 99% что у НПС появится дар "ходить". :)

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


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

TRAMP14, по поводу функции, у тебя и правда не совсем все правильно. Самый главный вопрос - откуда у тебя obj? _Призрак_ сказал верно, у тебя при использовании подобной функции будет ругань:

attempt to index local 'obj' (a nil value)

Так что тебе нужно либо в скрипте определить что такое этот obj, либо передоть его в эту функцию как параметр:

function item(obj)

Ребята действительно правы, не доконца понятно, для чего тебе эта функция нужна?

Если просто синтаксически исправить тебе функцию, то вот:

function item(obj)
local obj = obj:section()
if obj == "medkit" then 
alife():create("medkit", db.actor():position(), db.actor:level_vertex_id, db.actor:game_vertex_id(), db.actor:id())
end
end

но в таком случае тебе нужно передать в функцию параметр obj.

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


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

Якут, вот тебе скриншот всех сидячих анимаций на стуле в ЗП:

1389085b1259t.jpg

Находятся они в файле stalker_smart_cover_animation.omf

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


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

ФеНиКс, сделать можно! Синхронизировать сложно, хотя...

И что тебе не понятно по точкам путей?

Вот давай разберемся!

[mil_freedom_sniper_defense_look3]

points = p0,p1,p2 здесь пишем все точки, которые будут у нас в нашем пути, т.е. здесь три

p0:name = wp00 первая точка пути. wp00 - это имя пути. Здесь можно задавать флаги, такие как: a - анимация передвижения в эту точку, p - вероятность остановиться в этой точке, sig - установить сигнал по прибытию в точку

p0:flags = 0x1

p0:position = -20.9435977935791,-9.3701057434082,-42.9284133911133

p0:game_vertex_id = 1592

p0:level_vertex_id = 286124

p0:links = p1(1) следующая точка пути

 

p1:name = wp01

p1:flags = 0x1

p1:position = -13.237771987915,-8.33596229553223,-11.7740716934204

p1:game_vertex_id = 1593

p1:level_vertex_id = 293730

p1:links = p2(1)

 

p2:name = wp02

p2:flags = 0x1

p2:position = -1.6784291267395,-8.71416282653809,-7.24800872802734

p2:game_vertex_id = 1585

p2:level_vertex_id = 306093

Точки нужно задавать заранее в all.spawn, динамически, на сколько мне известно - нельзя. Про flags точно не знаю, поэтому сказать не могу, абы не запутать.

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


Ссылка на сообщение
Disord, глянь, вот тут про смарттерейны не только с чем, но и как их жевать :) >>Click Me<< там пять частей, но почитать стоит. ;)

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


Ссылка на сообщение
(изменено)
mma, ты знаешь, если БТР должен был появиться на склоне, то вероятно он ПОД ним. Попробуй заспавнить его на ровной поверхности и припиши к координате Z (средняя) плюс пять метров, на всякий случай. :) Изменено пользователем Куфзук

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


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

AKKK1, а без помощи функций АМК можно продемонстрировать? Уж очень было бы полезным... :blush:

 

// Из ф-ий АМК там используется только разбор нет-пакета непися. Эта штука достаточна "объемная", лучше самому в скриптах АМК посмотреть. Министр.

Изменено пользователем Министр

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


Ссылка на сообщение
antreg, в чистом 1004 этого нет. Но есть мод который реализует такую возможность Схема "Компаньоны".

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


Ссылка на сообщение
antreg, да не надо там не какого апдейта. AKKK1, между прочем, очень дельную вещь подсказал, лично я возму ее на заметку. Спасибо! Припиши объекту, с которым ты хочешь говорить, логику которую он предложил. Еденственный нюанс - этот предмет, должен быть заспавнен! Конечно, если ты хочешь поговорить с забором, к примеру, это будет проблематично! Но и это можно обыграть! Взгляни на объекты, которые находятся по этому адресу meshes\physics\equipment_cache. Эти объекты невидимы. Выбери подходящий и пробуй!

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


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

@"StreloK", а попробуй сделать так:

Mob_camp

 

Механика:

1. Сидит на позиции, смотрит в точку

2. Можно задать несколько позиций и время смены позиции.

3. Перемещается между позициями бегом

4. При виде врага переходит под универсальную схему (комбат/паника и т.д)

5. Задаются минимальная и максимальная дистанции от врага до текущей camp-позиции

6. Если враг уходит далеко - монстр возвращается на позицию

 

Использование:

 

[logic]

active = mob_camp

 

[mob_camp]

path_look = way_look

path_home = way_home

time_change_point = 30000

home_min_radius = 20

home_max_radius = 50

skip_transfer_enemy – если прописать в кастом дату, то монстр не будет принимать врага от друших монстров, если его увидит (для этого нужно всех монстров в разные group разнести)

 

Описание параметров:

path_home - путь, состоящий из точек, в которых будет находиться монстр

 

path_look - путь, состоящий из точек, в которые будет смотреть монстр

time_change_point - время изменения текущей camp-точки (по-умолчанию10000), мс

home_min_radius - минимальный радиус от врага до camp-точки (по-умолчанию 30), м

home_max_radius - максимальный радиус от врага до camp-точки (по-умолчанию 40), м

 

Особенности:

Минимальный и максимальный радиус необходимы для игнорирования врага, если он убежал далеко и для возврата на текущую позицию. Учитывается дистанция от врага до текущей позиции. Если дистанция меньше home_min_radius - атакуем врага, пока враг не исчезнет или дистанция не будет больше home_max_radius.

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

Выбор текущей позиции производится случайным образом

Индексы точек пути для path_home и path_look должны совпадать (т.е. монстр сидит во второй точке path_home и смотрит во вторую точку path_look)

 

Единственным необходимым параметром является path_look

Если не установлен path_home, в качестве кемперской точки учитывается позиция и нода объекта на спауне.

 

Для того чтобы монстр смотрел в разные точки на кемпер-позиции, path_look может состоять из нескольких точек.

 

Обязательные требования:

home_min_radius < home_max_radius

Количество точек путей path_look и path_home должно быть равным

P.S. Mob_Camp можно использовать как альтернативу к монстрам под рестрикторами

 

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


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

Да-да! И меня тоже интересует вопрос antreg! Я уже задал подобный в теме "Ковыряемся в файлах", там мне сказали, что !возможно! они отслеживаються движково, для ограничения/разрешения. Лично по рестрикторам в кострах, абсолютно ничего не нашел. Единственное оправдание наличия "пустых" рестрикторов, я нашел на Wiki: >>Click Me<< Там, в условиях переключения схем от одной к другой есть такие строки:

on_actor_in_zone = restrictor_name | scheme – если актер в зоне, (указывается имя рестриктора)
, т.е. выходит, что для такого случая логика для рестриктора не нужна!?

А для костров, могу предположить, что они нужны, чтобы НПС не лезли в них, чего-то типа денжер зон. :)

Удаление zone_flame_small удалит у тебя огонь как явление, т.е. партикл, а lights_hanging_lamp - свет вокруго него. По всей видимости взаимодействие между этими объектами происходит, непосредственно, при помощи движка.

Изменено пользователем Куфзук

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


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

TRAMP14, object:section() и obj:section() одно и тоже!

Что значит правильно? Что ты хочешь сделать?

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


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

AMK-Team.ru

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