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

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

KD87, вообще мне нужно вызвать эту самую функцию через логику нпс. ins33 мне подсказал так:

[logic]
active = sr_idle@one

[sr_idle@one]
on_actor_inside = {+поршень} nil %=имя_скрипта.функция()%

Но у меня что-то не получилось ничего. Убежал на ДР. Как буду дома, конечно, перепроверю все еще раз. Написал так, для подстраховки.

Не соответствует правилам.

Ссылка на комментарий

Здравствуйте! Не знаю, куда лучше написать, поэтому написал сюда. Понадобилась Ваша помощь, т.к. сам не смог разобраться)

Ковыряю Народную Солянку в попытке сделать ОП-2. Впервые спавню скриптом квестовика. Он стоит в Баре, где Долговязый и Доцент.

Конфиг в character_desc_sniper.xml

    <specific_character id="kotobegemot" team_default = "1">
        <name>Котобегемот</name>
        <icon>ui_npc_snp_kotobegemot</icon>
        <bio>esc_wolf_bio</bio>

        <class>kotobegemot</class>
        <community>stalker</community> <terrain_sect>stalker_terrain</terrain_sect>
        
        <rank>434</rank>
        <reputation>5</reputation>
        <money min="600" max="2000" infinitive="0"/>
        
        <snd_config>characters_voice\human_01\stalker\</snd_config>
        <crouch_type>-1</crouch_type>

        <visual>snp\kotobegemot</visual>
        <supplies>
            [spawn] \n
            wpn_fn2000_paratrooper \n
            ammo_9x39_sp5 \n
        </supplies>

#include "gameplay\character_criticals_4.xml"

        <actor_dialog>snp_kotobegemot1</actor_dialog>   
        <actor_dialog>snp_kotobegemot2</actor_dialog>   
#include "gameplay\character_dialogs.xml"
        
    </specific_character>

Профиль в npc_new.xml

    <character id="kotobegemot">
        <class>kotobegemot</class>
    </character>
    <character id="kotobegemot_bar">
        <class>kotobegemot</class>
    </character>

Секция для спавна в spawn_sections.ltx

[kotobegemot]:stalker
$spawn                 = "respawn\kotobegemot"
character_profile    = kotobegemot
spec_rank = master
community = stalker
custom_data = scripts\snp\kotobegemot_bar.ltx

Ему прописана логика, как у Долговязого, сделаны точки way и look, добавлены в файл way_l05_bar.ltx и запакованы в алспаун. Вот его логика:

[logic]
active = walker

[walker]
path_walk = kotobegemot_bar_walk
path_look = kotobegemot_bar_look
meet = meet
danger = danger_ignore

[danger_ignore]
ignore_distance = 0

[meet]
use = true
use_wpn = true
meet_talk_enabled = true
;meet_state = 10|ward@doktor_hello|2|ward
;meet_state_wpn = 10|ward@doktor_hello|2|ward

Вобщем, все слизано с Долговязого.

Перс спавнится, говорит, отыгрывает все анимации, стоит на месте, никуда не уходит, вобщем, все работает как надо.

Но, когда я ухожу далеко, на свалку или ДТ, чтобы игра полностью забыла про бар и про него, а затем возвращаюсь, то перса нет на месте. Я путем экспериментов понял, что он просто не респавнится, когда движок очищает память, когда уходишь далеко и потом возвращаешься. Если уйти на ДТ, но недалеко и потом вернуться, то он на месте. Я все перпробовал: и диалоги отключал и уборщик отключал и визуал менял - все одно и то же - не респавнится.

Я заметил такой момент, что пока в логе не появляются вот эти строки:

sv reject. id_parent [1372][kotobegemot:kotobegemot1372] id_entity [23939][ammo_m209:ammo_m20923939] [112401]

sv reject. id_parent [1372][kotobegemot:kotobegemot1372] id_entity [15366][bandage:bandage15366] [112401]

sv reject. id_parent [1372][kotobegemot:kotobegemot1372] id_entity [15540][yad:yad15540] [112401]

sv reject. id_parent [1372][kotobegemot:kotobegemot1372] id_entity [6668][bolt:bolt] [112401]

sv reject. id_parent [1372][kotobegemot:kotobegemot1372] id_entity [1375][wpn_fn2000_paratrooper:wpn_fn2000_paratrooper1375] [112401]

sv reject. id_parent [1372][kotobegemot:kotobegemot1372] id_entity [1374][ammo_9x39_sp5:ammo_9x39_sp51374] [112401]

sv reject. id_parent [1372][kotobegemot:kotobegemot1372] id_entity [1373][device_pda:device_pda1373] [112401]

- то перс стоит на месте даже если уйти на другую локу, но недалеко, чтобы он еще оставался в памяти. А если эти строки появились в логе - то его на месте не будет. И еще я заметил один момент:

По моему персу идет такой лог:

 

sv reject. id_parent [1372][kotobegemot:kotobegemot1372] id_entity [23939][ammo_m209:ammo_m20923939] [112401]

 

тогда как по всем остальным персам Бара идет вот такой лог:

 

sv reject. id_parent [13994][stalker_sakharov:dolgovazyi] id_entity [6167][bolt:bolt] [112337]

sv reject. id_parent [13165][stalker:bar_bar_drunk_dolg] id_entity [6291][bolt:bolt] [112401]

sv reject. id_parent [13537][stalker_trader:bar_dolg_petrenko] id_entity [15585][yad:yad15585] [112401]

 

т.е. везде стоит базовый класс непися, тогда как у меня стоит просто класс, как в конфиге, хотя в spawn_sections.ltx я присовил ему класс stalker, как это сделано по аналогии с другими персами. Поэтому я подозреваю, что я его не так прописал, из-за этого и проблема.

Подскажите мне, что я сделал не так? Я искал чисто скриптовый спавн неписей в скриптах НС, но не нашел, т.к. они практически все вынесены в алспаун. Можно ли корректно сделать чисто скриптовый спавн непися? Уж очень не хочется в алспаун лезть, чтобы при каждой правке НИ начинать)

 

_Призрак_, спасибо, все заработало)

Изменено пользователем proper70
Ссылка на комментарий

proper70

Тут может быть такой момент. У тебя в логике не прописано:

[smart_terrains]
none = true

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

Freedom

Ссылка на комментарий

Вот мой кусок из логики нпс, как видно при получении поршня {+hunter_talk_6}, проигрывается звук =play_sound(alex_54), далее он ждет 5 сек. и переходит на схему remark@suhoi_alarm_1.

[remark@hunter_4]
anim = wait
on_info = {+hunter_talk_6} %-hunter_talk_6 =play_sound(alex_54)%, %+new_restriktor%
on_timer = 5000 | remark@suhoi_alarm_1
meet = no_meet

Тут у меня проблемка, за эти 5 секунд, он проигрывает этот звук 2 раза, а то и 3 (т.к. продолжительтность его всего 1 сек.). Как сделать чтобы он проговорил его только один раз, а потом ждал 5 сек., а не повторял его в течении 5 секунд.

Делаю на Зов Припяти.

Не соответствует правилам.

Ссылка на комментарий

Итак, во-первых, _Призрак_, спасибо тебе за мотивацию :) Это я о получении левел вертекса по позиции. Хоть мне это и не нужно как то, но идет развитие идеи о получении таблицы лв из зоны, что мне нужно.

Ну а во-вторых, да, я смог получить лв по позиции без полного перебора на ТЧ. Перебор идет частичный. Расскажу о фактах про аи-сетку.

0. При проекции на плоскость XZ представляет собой ноды 0.7х0.7

1. Ноды (или лв) нумеруются с юга на север, с запада на восток.

2. Нулевой вертекс самый западный, однако не всегда самый южный.

3. Вертекс имеет координаты X и Z кратные 0.7 (размеру ноды).

4. Если лв различаются только координатой У (на разной высоте), то нумерация чередуется (что нумеруется первым, верхний или нижний, мне пока не известно).

 

Повторюсь, это факты, так сделали GSC. Т.е. некая упорядоченность есть, и она никуда не девается при перекомпиляции карты, если аи-сетка не менялась.

Вот сама функция

local edir = vector():set(1,0,0)
function get_lv_by_pos(need_pos)
    local lv,tmp_lv = 0,0
    local pos = level.vertex_position(lv)
    local offset = ((need_pos.z > pos.z) and 1) or -1
    local dist = need_pos.x - pos.x
    while dist > 0.35 do
        lv = level.vertex_in_direction(lv,edir,dist)
        if lv == tmp_lv then
            lv = lv + offset
        else
            pos = level.vertex_position(lv)
            dist = need_pos.x - pos.x
        end
        tmp_lv = lv
    end
    offset = ((need_pos.z > pos.z) and 1) or -1
    dist = math.abs(need_pos.z - pos.z)
    local hight = math.abs(need_pos.y - pos.y)
    while dist > 0.35 or hight > 1 do
        lv = lv + offset
        pos = level.vertex_position(lv)
        dist = math.abs(need_pos.z - pos.z)
        hight = math.abs(need_pos.y - pos.y)
    end
    return lv
end

need_pos - позиция, по которой будет считаться вертекс

 

Исходя из фактов, задача сводилась к получению столбца, где содержится нужный нам лв. Точнее любого лв из одного столбца с нужным нам лв. Это делается в первом цикле. Во втором идет уже полный перебор до нужных нам значений. Некий брутфорс присутствует, но все же не пол миллиона вертексов сравнивать. На счет скорости выполнения, она дико разная, т.к. невозможно предсказать, сколько будет перебрано лв. Мои тесты

! Cannot find saved game ~~~ time 906.521301 lv 16215

! Cannot find saved game ~~~ time 30504.269531 lv 46570

! Cannot find saved game ~~~ time 675.549866 lv 246010

! Cannot find saved game ~~~ time 675.374878 lv 246010

! Cannot find saved game ~~~ time 2139.680420 lv 595088

! Cannot find saved game ~~~ time 2091.987061 lv 595088

! Cannot find saved game ~~~ time 2460.593506 lv 397579

 

Думаю, на худ даже выводить можно, хотя так лучше не экспериментировать :) Брался лв актора, получался всегда правильный. Если есть время и желание, можете протестировать у себя, результаты в ЛС.

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

  • Нравится 1

ТЧ 1.0004. SAP и Trans mod

github

Ссылка на комментарий

NaslednikTutti, тоже не стОит упорно оффтопить ... Для ковыряний в конфигах логики имеются целых три "Ковырялки" ...

И, если ковыряешь логику, то и включай в работу свою! Если твоя секция обрабатывает два события, то на каждом(!) апдейте секции эти события и будут обрабатываться.

Во-первых, таймер в 5 секунд включается не по получению инфопоршня, а сразу, по активизации этой секции.

Во-вторых, если инфопоршень был выдан в самом начале (при активизации секции) - то на каждом(!) апрейте схемы 'remark' будет вызываться функция запуска проигрывания твоего звука (play_sound).

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

Возвращаюсь к своему вопросу по поводу приаттачивания глушителя. Спасбо, Artos, функция m_netpk.do_switchings работает как надо и пистолетик возвращается с глушителем. Но есть один ньюанс. Я не могу отправить оружие в оффлайн, если оно находится в слоте. Приходится сперва делать дроп. Есть ли какой-нибудь способ вернуть оружие "с земли" в рюкзак? Или может есть другой способ скриптом приаттачить аддоны к оружию? (ЗП)

Ссылка на комментарий

правильно ли я спавню обьект,зону и обьект в зоне? Нужно для скрипта.

function spawn_in_zone(obj,x,y,z,lv,gv)
    local spawn_sect = obj --секция кого спаунить
    local zone_obj = alife():create("space_restrictor",vector():set(x,y,z),lv,gv) --спавн зоны в которой спаунить.
    local zone = db.zone_by_name[zone_obj:id()] --узнаём id заспавненной зоны
    alife():create( spawn_sect,zone:position(),zone:level_vertex_id(),zone:game_vertex_id()) --спавним предмет в зоне
end

Изменено пользователем panzyuza
Ссылка на комментарий

Не совсем правильно. При спавне чего-либо клиентский объект будет доступен только на следующем апдейте, поэтому я бы заменил вот это:

alife():create( spawn_sect,zone:position(),zone:level_vertex_id(),zone:game_vertex_id()) --спавним предмет в

на вот это

alife():create( obj, zone_obj.position, zone_obj.m_level_vertex_id, zone_obj.m_game_vertex_id)

Ссылка на комментарий

Вот я заспавнил нового непися бандита и актор спавнится с ним рядом, как прописать чтобы непись не стрелял в актора, но срелял в сталкеров и считался враждебным

Ссылка на комментарий
Shredder: Есть ли какой-нибудь способ вернуть оружие "с земли" в рюкзак?

Не ленись и смотри уже готовое в модах. Способов не мало, хотя все имеют те или иные недостатки.

Простейший: дропнув оружие, тут же (на следующем апдейте) возвращай его актору и оно даже опять в слоте может оказаться.

Строка: oWeapon:transfer_item(oWeapon, oActor) - вернет оружие, хотя в логе движек и ругнется информативно, что мол нет "владельца" у передаваемого предмета.

 

panzyuza, совершенно даже неверно ...

Как уже частично сказал Shredder, тебе не будет доступен гейм-об'ект рестриктора сразу же в функции спавна, а будет доступен даже не на следующем апдейте, а тогда, когда будет проинициализирован в своем биндере и заспавнится методом 'net_spawn'.

Но не в этом суть, тебе нужно понимать что тебе нужно сделать и какими средствами этого достигнуть, а не пытаться копипастить, подставляя похожие по смыслу функции.

1. "Заспавнить зону" - хм, странное определение для спавна рестриктора, ну да ладно ... Спавнишь то ты его вначале верно (через 'create'), но упускаешь то, что при спавне таким образом все подобные об'екты НЕ имеют шейпов (shape), т.е. по сути представляют собою точку. И чтобы это было действительно зоной - тебе потребуются манипуляции с нет-пакетом, чтобы задать шейпы, тем самым задав площадь/радиус/об'ем ...

2. Спавн предмета "в зоне" ничем не отличается от спавна "вне зоны", т.е. в любом случае ты задаешь коодинаты для спавна предмета. И, если у тебя есть координаты спавна самой зоны - ну так и используй их же, чтобы спавнить в это же место и предмет. Для чего ты устраиваешь заморочку с гейм-об'ектом рестриктора? (не ясно)

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий
Artos, данная заморочка нужна для более глобальных идей. Просто пока пробую различные методы и черпаю информацию сам для себя. Суть данной заморочки в создании альтернативы тайников игры(ТЧ). Спавним набор предметов в зоне, ставим метку на рестриктор. Вот как привязать предметы к зоне - не знаю. Что бы в случае только их взятия снималась метка и данная зона удалялась. Код пока похож на стандартный treasure_manager. Что бы не было возни с ящиками и прочим.
Ссылка на комментарий

Как сделать чтобы враг главного героя например бандит не стрелял в него, но оставался враждебным, и отстреливал других врагов

 

Во-первых, этот топик не для подобных вопросов и потрудись подбирать соответствующую тему.

Во-вторых, есть такое "ругательное" слово 'логика', которой и ты должен руководствоваться и обучить твоих "враждебных" неписей ...

но все это уже не в этом топике. --/Artos

Изменено пользователем Artos
Ссылка на комментарий
panzyuza, чтобы замахиваться на глобальные идеи стОит озаботиться навыками не только по банальным функциям и пр. ... Однако замечу, все подобные изыскания все же следует вначале читать и пробовать "у себя" и самому, и уж если чего не получается - тогда и задавать вопросы, а не заранее ... по каждой предполагалке. Чрезмерное кол-во банальных вопросов и засоряет тему и скорее отвращает от желания давать ответы по существу, а не отписки. ИМХО.

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

Как правильно пользоватсья этйо функцией?

    function enable_attachable_item(boolean)

И как она вообще работает?

Ссылка на комментарий

Еще раз привет! В алспауне есть параметр direction. Как я понял, он разворачивает объект относительно сетки координат при спавне. А можно ли как-то задавать этот параметр через нетпакет при скриптовом спавне? Мне нужно разворачивать рюкзаки-тайники в пространстве. Для актора есть функция set_actor_direction, а для объектов, так понимаю, нету...

 

ЗЫ: Пример задавания story_id при скриптовом спавне я нашел в НС:

local obj = alife():create("mil_trader_gavr",vector():set(25.325489,-8.35158157,-17.512226425),330707,1587)
local params=amk.read_stalker_params(obj)
params.sid=9623
amk.write_stalker_params(params,obj)

а вот direction - не нашел...

Ссылка на комментарий

iDreD, чем тебе готовые примеры из игры/модов не устраивают иль чего не понятно?

Например, в том же sr_light.script фонарик приаттачивается "ко лбу" иль наоборот убирается (гасится) у непсией ( torch:enable_attachable_item(true|false) ) .

Ну а в state_mgr_animstation.script показано как убираются предметы из рук или наоборот.

Функция то простейшая и чего ее расписывать/раз'яснять? Ну а "как работает" - это тебе и врядли нужно и к тем у кого сырцы движка имеются ...

 

proper70, ты правильно понял, что параметр direction разворачивает об'ект спавна в пространстве, однако огорчу в отношении именно тайников/инвентори-боксов - вот их нет-пакетами развернуть без танцев с бубном не получится. Поясню:

Ранее, тут уже расписывал про модуль работы с нет-пакетами (m_netpk.script), который может корректно работать с практически со всеми параметрами нет-пакетов об'ектов, в том числе и с частью пакета 'abstract', но при условии, что у серверного об'екта доступен конструктор его класса и в частности метод STATE_Write, чтобы в него можно было добавить одну строку кода.

В общем почитай краткое описание m_netpk и поэкспериментируй с не-ящиками, ну а если уж очень приспичило - то или движек править или создавать свой скриптовый класс рюкзачков-тайничков и уже ими рулить через скриптовой конструктор.

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

Здравствуйте, возникло два вопроса по таймерам амк:

1)как получит значение нужного мне таймера(по имени)?Т.е ухзнать, сколько осталось времени до конца работы?

2)Слышал о проблеме игрового месяца с таймерами амк, что это, и как ее исправить?

 

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

Заранее спасибо.

Ссылка на комментарий

Вампир35

1. Никак не получить, т.к. АМК-таймеры не имеют соответствующего интерфейса по доступу к ним. Ну а кто патался написать ... вероятно понимал, что проще и лучше написать свои таймеры заново, чем вставлять костыли "одряхлевшему" коду.

2. А не слышал о проблеме 2000-го года? Того же порядка, т.е. в принятом формате параметра не хватает разрядности и в какой-то момент наступает "переполнение"/сброс.

В АМК-тайрах используется 32-х битный таймер game.time() и кол-во разрядов хватает на ... немного меньше месяца игрового времени. Далее наступает обнуление бахового времени и все "новые" таймеры будут заведомо с меньшим временем, чем те, которые были до "часа Х".

Лечить таймеры в общем-то бессмысленно, т.к. эта ошибка присуща не только им а имеется во многих кодах игры и следует глобально поменять использование game.time() на 64-х битный вариант game.CTime()

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

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

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

Войти
  • Недавно просматривали   0 пользователей

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