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

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


Svoboда

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

TRAMP14, тебе же выше писали, если ты хочешь сравнить объект по секции (тип данных string), то сравнивать нужно так:

local obj = db.actor:item_in_slot(6)
local obj_section = obj:section()
if obj_section == "stalker_outfit" then

, если ты напишешь так:

obj = db.actor:item_in_slot(6)
if obj_section  then

, то ты просто проверишь, есть ли вообще, что нибудь в слоте! И таким образом ты можешь делать все, что позволяет класс, к которому принадлежит этот объект. obj - это экземпляр класса. Например, Карась - это экзепляр класса Рыба, а Щука - это уже другой экземпляр, того же класса! :)

Через экземпляр класса ты можешь получить его имя:

local obj_name = obj:name()

, уникальный идентификатор объекта:

local obj_id = obj:id()

, позицию:

local obj_position = obj:position()

, гейм вертекс:

local obj_gv = obj:game_vertex_id()

и так далее и тому подобное.

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


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

TRAMP14, данная функция db.actor:object("skaner") - вернет экземпляр класса из инвентаря по секции skaner, и если его нет, то что-то можно будет сделать. Синтаксически это правильно, но работать будет, если это уместно применить!

В теме "справочник по функциям и классам" вот, что написано по поводу этой функции:

game_object* object(string) - возвращает объект из инвентаря по секции
, т.е. ты получишь тоже самое, что и local obj = db.actor:item_in_slot(6), только разница в том, что первый раз ты получаешь объект из инвентаря, а во втором из слота. Изменено пользователем Куфзук

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


Ссылка на сообщение
TRAMP14, таким образом ты получишь позицию актора, но только координаты, левел и гейм вертексы нужно находить отдельно. Присваеваешь переменной:
local actor_position = db.actor:position()

и можешь манипулировать. Например так:

local actor_position = db.actor:position()
if actor_position.x > 100 then

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

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


Ссылка на сообщение
(изменено)
amik, (да и для других тоже будет полезным) от себя могу добавить, что радиус смарта или, по другому, гулага - не на что не влияет, лично я его ставлю в две еденицы. Раньше, в более ранних билдах, гулаг "захватывал" НПС под свою логику и дальность "захвата" был именно радиус, сейчас же это делается иначе. Изменено пользователем Куфзук

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


Ссылка на сообщение
@"StreloK", ну для начала скажу, что инфопоршни доступны только для actora. Ну а вообще, тебе как это сделать нужно, какая ситуация?

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


Ссылка на сообщение
:offtopic:=VENOM=, а почему в ЛС? Я думаю очень многим она будет по душе.

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


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

Knyaz, так же как в ЧН не выйдет. Этой фичи в ТЧ просто напросто нет. Можно что-то подобное смастерить, если очень точно и тчательно покопаться и настроить логику.

AKKK1,

Смарткаверы - это спаун объект, который управляет анимациями NPC. Используется для создания сценок со сложной анимацией.
Определение ПЫСов. Изменено пользователем Куфзук

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


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

Для Prozone97

Капрал Хикс, позволь тебя поправить, хотя даже не поправить, а дополнить.

Чтобы рестриктор больше не проверял наличие в нем актора, нужно поставить перед выдачей инфопоршна nil, вот так:

[logic]
active = sr_idle
[sr_idle]
on_actor_inside = nil %+if_actor_inside%

вместо выдачи инфопоршна (%+if_actor_inside%), можно выполнить функцию:

[sr_idle]
on_actor_inside = nil %=if_actor_inside%

функция if_actor_inside должна находиться в файле xr_effects.script.

Можно конечно произвести проверку и скриптово, но это сложнее и проверка будет выполняться всегда (хотя действие выполнится один раз), поскольку вызов функции придется вешать на апдейт актора.

 

Что касаеться выполнения функции при получении какого либо предмета. Приблизительно так:

В файле bind_stalker.script найти вот такую функцию function actor_binder:on_item_take (obj) и дописать в нее проверку, по такому типу:

if obj:section() == "obj_section" and db.actor:dont_has_info("condition_info") then
    -- action
    db.actor:give_info_portion("condition_info")
end

где:

obj_section - имя секции проверяемого предмета (например для АК-74 это wpn_ak74. Имя секции смотрим в конфиге предмета).

action - вызов твоей функции.

condition_info - инфопоршень, который ограничевает проверку на один раз. Т.е. получается, что если инфопоршня нет, производим провеку и выдаем инфопоршень, чтобы более действие не выполнялося.

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

Оговорочка: это будет происходить, если актор подберет предмет сам (с земли, с ящика и т.д.), при трансфере, другими словами, при передачи предмета от кого-то к актору - это не сработает.

Чтобы впринципе проверить наличие предмета в инвенторе, можно сделать так:

function check_actor_inventory ()
    actor = db.actor
    if actor and actor:object("item_section")  ~= nil then
        -- action
    end
end

здесь:

item_section - имя секции проверяемого предмета

action - действия если предмет есть.

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

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


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

Prozone97, да и всем кому интересно.

Вот скриптовая функция для проверки нахождения ГГ в определенной области:

function distance_to_point (lname, pos_x, pos_y, pos_z, dist)
    local actor = db.actor
-- определим текущую локацию, дабы не определять гейм и левел вертексы, хотя можно и их
    local lev_name = level.name()
-- зададим точке наши координаты
    local point = vector:set(pos_x, pos_y, pos_z)
-- проверим существует ли актор и находится ли он на нужной локации
    if actor and lev_name == lname then
    -- определим координаты актора
        local actor_pos = actor:position()
    -- чтобы сэконимить ресурсы ПК проверим квадрат расстояния между ГГ и точкой 
        if point:distance_to_sqr(actor_pos) <= dist*dist then
            return true
        end
        return false
    end
end

Вызов функции следующий

if distance_to_point ("l01_escape", -210.632614135742, -20.050708770752, -142.461120605469, 10) then

l01_escape - имя уровня на котором нужно проверить вхождение ГГ в область

координаты ставим свои, я поставил координаты места спавна Волка

10 - расстояние до нужной точки. Поскольку вероятность того, что ГГ пройдет именно через точку - очень низкая, то используем область, радиус которой и определяет параметр dist

P.S. Если где-то ошибся поправьте пожалуйста.

Спасибо Charsi за указаные ошибки.

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

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


Ссылка на сообщение
Виталкер, возможно ты и прописал логику как у Лиса, но ты не прописал параметры как у Лиса, а именно здоровье. В секции спавна твоего НПС пропиши ему здоровье ниже порогового значения в логике, например, как у Лиса:
health = 0.280000001192093

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


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

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


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

desert, боюся тебя огорчить, но это скрипт самого ремонта и тут совершенно непонятно где, как и самое главное сколько раз используеться этот код.

 

antreg, что у тебя не получается? Почитай вот эту статью: combat_ignore

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

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


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

Tris, panzyuza, Artos. Вы знаете - [known_info], действительно очень хорошо справляеться с тем, чтобы выдавать актору инфопоршни, непонятно почему, но это факт...

Хотя почему не понятно:

function loadInfo(npc, char_ini)
    -- Загрузка из кастом даты
    if char_ini:section_exist("known_info") then
        local n = char_ini:line_count("known_info")
        local result, id, value = 0,"",""
    
        for i=0,n-1 do
            result, id, value = char_ini:r_line("known_info",i,"","")

            give_npc_info(npc, id)
        end
    end
    
    
    -- Загрузка из генератора.
    local community_info = info_by_community[npc:character_community()]
    if community_info == nil then
        return
    end
    
    local rank = ranks.get_obj_rank_name(npc)
    local rank_info = info_by_rank[rank]
    if rank_info == nil then
        return
    end

    local tt = {}
    -- оставляем инфопоршны, которые есть и там и там.
    for k,v in pairs(community_info) do
        for kk,vv in pairs(rank_info) do
            if v == vv then
                -- Добавляем в список доступных знаний
                table.insert(tt, v)
                break
            end
        end    
    end
    
    local size = table.getn(tt)
    for k = 1,math.min(size,3) do    
        if math.random(100) >= 60 then
            local ii = tt[math.random(size)]
            give_npc_info(npc, ii)
        end
    end
end

function give_npc_info(npc, info)
    -- Даем НПС инфопоршны
    npc:give_info_portion(info)

    -- Проверяем есть ли озвученная история на этот инфопоршн, и если есть
    -- добавляем ее тоже
    if sound_theme.theme[info] ~= nil then
        if db.story_by_id[npc:id()] == nil then
            db.story_by_id[npc:id()] = {}
        end
        
        table.insert(db.story_by_id[npc:id()], info)
    end
end

Функция give_npc_info, выдает параметру npc инфопоршень, по всей видимости, если НПС не жив, в качестве этого параметра выступает actor.

Есть еще один вариант - это секция on_use:

on_use = use
[use]
on_info = %+infoportion%

но инфопоршень будет выдан даже если вы соберетесь поговорить с этим НПС.

Изменено пользователем ColR_iT
  • Спасибо 1

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


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

Строгое предупреждение от модератора ColR_iT
abramcumner, если ты считаешь себя сильно взрослым и тебе кажется, что все вокруг ниже тебя, то будь любезен не будь выскочкой.

Твоя цитата:

Без проблем, сынок. Чем бы дитя не тешилось
не делает тебе чести - это раз, а во вторых - это нарушение правил (пункт 2.1 действующих правил форума).

 

Что касается твоих, как ты утверждаешь, цитирую: "дополнений/исправлений" - является далеко не дополнением и, уж тем более, не исправлением.

Вставлять свои "пять копеек" в ответ другого пользователя - не есть правила хорошего тона (о правилах форума речь не идет), поэтому если в чем-то не согласен - приводи факты и доказательства, а не поверхностные домыслы о том, как тебе это кажется. Потому как, судя из твоих слов, цитирую:

В ЗП story_id из нет-пакета вообще не используется...
можно сделать вывод, что ты не очень-то и понимаешь о чем идет речь, следовательно твои ответы трактуются как ... правильно - ложные, а как следствие - бесполезные убеждения, которые расцениваются как флуд.

 

И исходя из всего этого, позволь мне тебя поздравить и наградить!

Вот и награда: режим Reed Only на срок до трех суток.

 

Спасибо за внимание.

 

P.S. Все эти "дополнения" и остальные посты связанные с этим - потерты.

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


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

amik.

1. Радио.

Я сталкивался с подобным вопросом и решение его существует...

Дело в том, что для подобной логики, объект должен быть physic_destroyable_object, почему так - я не знаю, но это так.

Еще один нюанс: вот это:

snd = $no_sound

вероятнее всего выдаст тебе ошибку, поскольку сюда необходимо писать не сами файлы, а звуковую схему из файла sound_theme.script, тебя должно интересовать ph_snd_themes. Если ты заглянешь туда, тебе сразу станет все предельно ясно, как и что в таком случае писать...

Хорошим вариантом будет добавить свою звуковую тему, которая бы включала в себя звук какого-нибудь "шипения", мол после выстрела радио поломалось и зашипело :)

Готовая схема будет выглядеть так:

[logic]
active = ph_sound
on_hit = hit

[hit]
on_info = %+mil_priemnik_off%

[ph_sound]
snd = radio_music
looped = true
on_info = {+mil_priemnik_off}| ph_sound@end

[ph_sound@end]
snd = silence
on_signal = sound_end| nil

где silence - твоя звуковая сехма.

 

2. Охранник.

Здесь не до конца ясно, что значит "не слушает команду path_walk"?

Чего ты ждешь от этой схемы?

Подозреваю, что она работает так, как нужно, смотри:[logic]

;ты ставишь активную схему walker1

active = walker1

;задаешь реакцию на опасность

danger = danger_ignore

;meet = meet

 

[danger_ignore]

ignore_distance = 0

 

;активная схема

[walker1]

;задаешь точки в которых будет стоять и куда смотреть

path_walk = walk_soldier_bodyguard1

path_look = look_soldier_bodyguard

;игнорируем бой, причем всегда.

combat_ignore_cond = always

;по истечении 50 секунд переходим на схему remark1

on_game_timer = 50 | remark1

 

;перешли на схему

[remark1]

;path_walk = walk_soldier_bodyguard1

;path_look = look_soldier_bodyguard

;anim = guard

;куда смотрим - не понятно, вычисляется автоматически

target = nil

;как встречаем ГГ

meet = meet

 

;секция реакции на гг

[meet]

;анимация в зависимости от расстояния до актора (если ближе 5 метров отыгрываем guard) (актор без оружия)

meet_state = 5|guard

;тоже самое, только если актор с оружием в руках

meet_state_wpn = 5|threat_fire

;на кого смотрим (ближе 5 метров - на актора)(актор без оружия)

victim = 5|actor

;тоже самое, только ГГ с оружием в руках

victim_wpn = 5|actor

;возможно ли заюзать персонажа

use = true

use_wpn = true

Получается, что НПС стоит на точке walk_soldier_bodyguard1, после 50 секунд, он переходит на схему remark1, после срабатывает какой-нибудь денжер, а дальше все... перехода на схему walker1 ведь нету, после универсального комбата, НПС вернется к последней активной схеме, а это будет remark1.

Так что все так, как ты сделал...

Самым простейшим вариантом возврата НПС на свое место, является следующая схема:

[logic]
active = walker1

[walker1]
path_walk = walk_soldier_bodyguard1
path_look = look_soldier_bodyguard

По идее этого должно быть достаточно.

 

 

Спустя некоторое время...

У тебя точки path_look и path_walk не синхронизированы. Т.е. для того чтобы НПС понимал куда ему нужно смотреть в какой-то конкретной точке, нужна их синхронизация, которая осуществляется при помощи flags.

У тебя выходит, что точка look_soldier_bodyguard не привязана не к какой точке пути. А еще у тебя сами точки пути не связаны. Поэтому сделай так:

[look_soldier_bodyguard]
points = p0
p0:name = wp00
p0:flags = 0x1
p0:position = -138.841918945313,-25.439302444458,-355.694732666016
p0:game_vertex_id = 19
p0:level_vertex_id = 116593


[walk_soldier_bodyguard1]
points = p0,p1
p0:name = wp00
p0:flags = 0x1
p0:position = -135.914733886719,-25.439302444458,-359.351440429688
p0:game_vertex_id = 19
p0:level_vertex_id = 116591
p1:links = p1(1)

p1:name = wp01
p1:position = -136.714736938477,-25.439302444458,-359.351440429688
p1:game_vertex_id = 319
p1:level_vertex_id = 102988
p1:links = p0(1)

таким образом, когда НПС будет в первой точке wp00 пути walk_soldier_bodyguard1 он с вероятностью 100%, в течении 5 секунд бедет смотреть в эту точку, дальше перейдет на на точку wp01, после развернется и пойдет назад в точку wp00 и так далее по кругу.

 

По поводу combat.

Нет, этого не произойдет...

Секция [combat] задает параметры боя, например можно выдать инфопоршень или запустить какую-либо функцию (но только из файла xr_effects.script). Также можно задать режим боя, таковых три:

- движковый бой (стоит по умолчанию);

- combat_type = {возможны условия перехода на данный режим боя} camper - по камперски;

- - по монолитовски.

Ах, да! Забыл про четвертый:

- combat_type = {также возможны условия} zombied - как зомби (анимации здесь не при чем).

Как ведет себя та или иная схема, я не проверял.

Изменено пользователем ColR_iT
дополнил...

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


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

amik, да, я понял, что ты имеешь ввиду.

К сожалению мне не встречались случаи, чтобы в секции [combat] было переключение на другую схему. Повторюсь, что данная схема лишь задает тип боя (см. выше), также можно сделать выдачу инфопорции или вызов функции когда НПС срывается в бой, например так:

[logic]
on_combat = combat
[combat]
on_info = %+infoportion%

.

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


Ссылка на сообщение
FLIKER, а у тебя смарт с одной работой? Если нет, то для работы "пожарника" в файле gulag_xxx.script в функцию load_job нужно писать условие приёма на данную работу. Вот на примере работы Шустрого:
t = { section = "logic@esc_lager_kamp1",
            idle = 0,
            prior = 16, state = {2},
            online = true,
            in_rest = "", out_rest = "",
            predicate = function(obj_info)
                            return obj_info.profile_name == "esc_shustryi"
                        end
        }
        table.insert(sj, t)

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


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

FLIKER, постой, ты хочешь сказать, что в смарте три работы часовых и ты хочешь, чтобы они сидели у костра? По моему ты переоценил возможности движка Сталкера...

Логику kamp, что ты написал в custom_data твоего НПС, он будет использоваться лишь в том случае, если не попадет под гулаг по тем или иным причинам.

 

Добавлено спустя некоторое время...

В нем три работы guard...
Ты бы определился 3 или 4...

В общем из предоставленной тобой информации, могу посоветовать изменить логику одному НПС так:

[smart_terrains]
none = true

[logic]
active = kamp

[kamp]
center_point = ds_lager_kamp_1
radius = 3

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

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


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

Строгое предупреждение от модератора ColR_iT
Вечер добрый, Дамы и Господа!

Я смотрю меня тут ждали...

Ну что же, дядяСаша...

Опишу еще раз то, что тебе все хором сказали:

Если ты чего-то не понимаешь - это не значит, что это бред! Можно было бы и задуматься над тем, что для других статьи на Wiki, почему-то не кажутся "рисовкой", как ты сумел выразиться, а для тебя это оказалось пустой писаниной. Ответ на этот вопрос прост - ты пытаешься прыгнуть выше своей головы! Многие собственноручно заползали на эту высоту и никому не показалось, что статьи от создателей игры, как то вяло реализуют их идеи. То что там написано это всего лишь инструмент для реализации твоих идей, если конечно ты сумеешь воспользоваться данным инструментом...

По поводу твоего варианта массовки: если ты считаешь эти "танцы с бубном" "примитивным" вариантом, то ты в принципе не умеешь задаваться целью ставить вопрос, а следовательно и задачу, - правильно!

Вот исходя из этого делай выводы, если, опять же таки, ты их правильно сделаешь... Правда делать это тебе придется наедине... надеюсь дней пяти будет достаточно.

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


Ссылка на сообщение
Лёха_тц, в принципе так же как и остальные, вот только наличие 20 и более таких массивных объектов на одной локации, может привести к заметным лагам. При всём этом, есть большие минусы, один из которых - пользование этих объектов НПС, они не будут на них заходить (в случае с вышкой), поскольку на них отсутствует АИ сетка. Также, обязательным условием спавна, является наличие в модели хотя бы одной кости (подозреваю, что ты используешь сталкер_контент для СДК).

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


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

    Ни один зарегистрированный пользователь не просматривает эту страницу.

AMK-Team.ru

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