NaslednikTutti 1 Опубликовано 4 Августа 2012 Поделиться Опубликовано 4 Августа 2012 KD87, вообще мне нужно вызвать эту самую функцию через логику нпс. ins33 мне подсказал так: [logic] active = sr_idle@one [sr_idle@one] on_actor_inside = {+поршень} nil %=имя_скрипта.функция()% Но у меня что-то не получилось ничего. Убежал на ДР. Как буду дома, конечно, перепроверю все еще раз. Написал так, для подстраховки. Не соответствует правилам. Ссылка на комментарий
proper70 74 Опубликовано 4 Августа 2012 Поделиться Опубликовано 4 Августа 2012 (изменено) Здравствуйте! Не знаю, куда лучше написать, поэтому написал сюда. Понадобилась Ваша помощь, т.к. сам не смог разобраться) Ковыряю Народную Солянку в попытке сделать ОП-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, как это сделано по аналогии с другими персами. Поэтому я подозреваю, что я его не так прописал, из-за этого и проблема. Подскажите мне, что я сделал не так? Я искал чисто скриптовый спавн неписей в скриптах НС, но не нашел, т.к. они практически все вынесены в алспаун. Можно ли корректно сделать чисто скриптовый спавн непися? Уж очень не хочется в алспаун лезть, чтобы при каждой правке НИ начинать) _Призрак_, спасибо, все заработало) Изменено 5 Августа 2012 пользователем proper70 Ссылка на комментарий
_Призрак_ 11 Опубликовано 4 Августа 2012 Поделиться Опубликовано 4 Августа 2012 proper70 Тут может быть такой момент. У тебя в логике не прописано: [smart_terrains] none = true Поэтому вполне вероятно что когда он спавнится, он работает по своей логике, т.к. например все смарты забиты. А потом какой то смарт освобождается и он уходит туда. Пропиши этот параметр в логику Freedom Ссылка на комментарий
ins33 16 Опубликовано 5 Августа 2012 Поделиться Опубликовано 5 Августа 2012 (изменено) NaslednikTutti, Это логика для рестраикса. Изменено 5 Августа 2012 пользователем ins33 Ссылка на комментарий
NaslednikTutti 1 Опубликовано 5 Августа 2012 Поделиться Опубликовано 5 Августа 2012 Вот мой кусок из логики нпс, как видно при получении поршня {+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 секунд. Делаю на Зов Припяти. Не соответствует правилам. Ссылка на комментарий
Desertir 202 Опубликовано 5 Августа 2012 Поделиться Опубликовано 5 Августа 2012 Итак, во-первых, _Призрак_, спасибо тебе за мотивацию Это я о получении левел вертекса по позиции. Хоть мне это и не нужно как то, но идет развитие идеи о получении таблицы лв из зоны, что мне нужно. Ну а во-вторых, да, я смог получить лв по позиции без полного перебора на ТЧ. Перебор идет частичный. Расскажу о фактах про аи-сетку. 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 Ссылка на комментарий
Artos 99 Опубликовано 6 Августа 2012 Поделиться Опубликовано 6 Августа 2012 NaslednikTutti, тоже не стОит упорно оффтопить ... Для ковыряний в конфигах логики имеются целых три "Ковырялки" ... И, если ковыряешь логику, то и включай в работу свою! Если твоя секция обрабатывает два события, то на каждом(!) апдейте секции эти события и будут обрабатываться. Во-первых, таймер в 5 секунд включается не по получению инфопоршня, а сразу, по активизации этой секции. Во-вторых, если инфопоршень был выдан в самом начале (при активизации секции) - то на каждом(!) апрейте схемы 'remark' будет вызываться функция запуска проигрывания твоего звука (play_sound). Т.о. если захотелось чтобы звук проигрывался один раз - то или в своей функции проигрывания звука отсекай повторные вызовы/проигрыши или переключайся на новую секцию, где нет вызова уже проигрываемого звука ... "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Shredder 49 Опубликовано 6 Августа 2012 Поделиться Опубликовано 6 Августа 2012 Возвращаюсь к своему вопросу по поводу приаттачивания глушителя. Спасбо, Artos, функция m_netpk.do_switchings работает как надо и пистолетик возвращается с глушителем. Но есть один ньюанс. Я не могу отправить оружие в оффлайн, если оно находится в слоте. Приходится сперва делать дроп. Есть ли какой-нибудь способ вернуть оружие "с земли" в рюкзак? Или может есть другой способ скриптом приаттачить аддоны к оружию? (ЗП) Ссылка на комментарий
panzyuza 41 Опубликовано 6 Августа 2012 Поделиться Опубликовано 6 Августа 2012 (изменено) правильно ли я спавню обьект,зону и обьект в зоне? Нужно для скрипта. 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 Изменено 6 Августа 2012 пользователем panzyuza AVS_LOCATION_MOD Ссылка на комментарий
Shredder 49 Опубликовано 6 Августа 2012 Поделиться Опубликовано 6 Августа 2012 Не совсем правильно. При спавне чего-либо клиентский объект будет доступен только на следующем апдейте, поэтому я бы заменил вот это: 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) Ссылка на комментарий
zitulok 0 Опубликовано 6 Августа 2012 Поделиться Опубликовано 6 Августа 2012 Вот я заспавнил нового непися бандита и актор спавнится с ним рядом, как прописать чтобы непись не стрелял в актора, но срелял в сталкеров и считался враждебным Ссылка на комментарий
Artos 99 Опубликовано 6 Августа 2012 Поделиться Опубликовано 6 Августа 2012 (изменено) Shredder: Есть ли какой-нибудь способ вернуть оружие "с земли" в рюкзак? Не ленись и смотри уже готовое в модах. Способов не мало, хотя все имеют те или иные недостатки. Простейший: дропнув оружие, тут же (на следующем апдейте) возвращай его актору и оно даже опять в слоте может оказаться. Строка: oWeapon:transfer_item(oWeapon, oActor) - вернет оружие, хотя в логе движек и ругнется информативно, что мол нет "владельца" у передаваемого предмета. panzyuza, совершенно даже неверно ... Как уже частично сказал Shredder, тебе не будет доступен гейм-об'ект рестриктора сразу же в функции спавна, а будет доступен даже не на следующем апдейте, а тогда, когда будет проинициализирован в своем биндере и заспавнится методом 'net_spawn'. Но не в этом суть, тебе нужно понимать что тебе нужно сделать и какими средствами этого достигнуть, а не пытаться копипастить, подставляя похожие по смыслу функции. 1. "Заспавнить зону" - хм, странное определение для спавна рестриктора, ну да ладно ... Спавнишь то ты его вначале верно (через 'create'), но упускаешь то, что при спавне таким образом все подобные об'екты НЕ имеют шейпов (shape), т.е. по сути представляют собою точку. И чтобы это было действительно зоной - тебе потребуются манипуляции с нет-пакетом, чтобы задать шейпы, тем самым задав площадь/радиус/об'ем ... 2. Спавн предмета "в зоне" ничем не отличается от спавна "вне зоны", т.е. в любом случае ты задаешь коодинаты для спавна предмета. И, если у тебя есть координаты спавна самой зоны - ну так и используй их же, чтобы спавнить в это же место и предмет. Для чего ты устраиваешь заморочку с гейм-об'ектом рестриктора? (не ясно) Изменено 6 Августа 2012 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
panzyuza 41 Опубликовано 6 Августа 2012 Поделиться Опубликовано 6 Августа 2012 Artos, данная заморочка нужна для более глобальных идей. Просто пока пробую различные методы и черпаю информацию сам для себя. Суть данной заморочки в создании альтернативы тайников игры(ТЧ). Спавним набор предметов в зоне, ставим метку на рестриктор. Вот как привязать предметы к зоне - не знаю. Что бы в случае только их взятия снималась метка и данная зона удалялась. Код пока похож на стандартный treasure_manager. Что бы не было возни с ящиками и прочим. AVS_LOCATION_MOD Ссылка на комментарий
zitulok 0 Опубликовано 6 Августа 2012 Поделиться Опубликовано 6 Августа 2012 (изменено) Как сделать чтобы враг главного героя например бандит не стрелял в него, но оставался враждебным, и отстреливал других врагов Во-первых, этот топик не для подобных вопросов и потрудись подбирать соответствующую тему. Во-вторых, есть такое "ругательное" слово 'логика', которой и ты должен руководствоваться и обучить твоих "враждебных" неписей ... но все это уже не в этом топике. --/Artos Изменено 6 Августа 2012 пользователем Artos Ссылка на комментарий
Artos 99 Опубликовано 6 Августа 2012 Поделиться Опубликовано 6 Августа 2012 panzyuza, чтобы замахиваться на глобальные идеи стОит озаботиться навыками не только по банальным функциям и пр. ... Однако замечу, все подобные изыскания все же следует вначале читать и пробовать "у себя" и самому, и уж если чего не получается - тогда и задавать вопросы, а не заранее ... по каждой предполагалке. Чрезмерное кол-во банальных вопросов и засоряет тему и скорее отвращает от желания давать ответы по существу, а не отписки. ИМХО. "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
iDreD 5 Опубликовано 6 Августа 2012 Поделиться Опубликовано 6 Августа 2012 Как правильно пользоватсья этйо функцией? function enable_attachable_item(boolean) И как она вообще работает? Работа в Sculptris 3D [туториал] Страничка на Проза.ру Ссылка на комментарий
proper70 74 Опубликовано 7 Августа 2012 Поделиться Опубликовано 7 Августа 2012 Еще раз привет! В алспауне есть параметр 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 - не нашел... Ссылка на комментарий
Artos 99 Опубликовано 7 Августа 2012 Поделиться Опубликовано 7 Августа 2012 (изменено) iDreD, чем тебе готовые примеры из игры/модов не устраивают иль чего не понятно? Например, в том же sr_light.script фонарик приаттачивается "ко лбу" иль наоборот убирается (гасится) у непсией ( torch:enable_attachable_item(true|false) ) . Ну а в state_mgr_animstation.script показано как убираются предметы из рук или наоборот. Функция то простейшая и чего ее расписывать/раз'яснять? Ну а "как работает" - это тебе и врядли нужно и к тем у кого сырцы движка имеются ... proper70, ты правильно понял, что параметр direction разворачивает об'ект спавна в пространстве, однако огорчу в отношении именно тайников/инвентори-боксов - вот их нет-пакетами развернуть без танцев с бубном не получится. Поясню: Ранее, тут уже расписывал про модуль работы с нет-пакетами (m_netpk.script), который может корректно работать с практически со всеми параметрами нет-пакетов об'ектов, в том числе и с частью пакета 'abstract', но при условии, что у серверного об'екта доступен конструктор его класса и в частности метод STATE_Write, чтобы в него можно было добавить одну строку кода. В общем почитай краткое описание m_netpk и поэкспериментируй с не-ящиками, ну а если уж очень приспичило - то или движек править или создавать свой скриптовый класс рюкзачков-тайничков и уже ими рулить через скриптовой конструктор. Изменено 7 Августа 2012 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Kondr48 314 Опубликовано 7 Августа 2012 Поделиться Опубликовано 7 Августа 2012 Здравствуйте, возникло два вопроса по таймерам амк: 1)как получит значение нужного мне таймера(по имени)?Т.е ухзнать, сколько осталось времени до конца работы? 2)Слышал о проблеме игрового месяца с таймерами амк, что это, и как ее исправить? Добавлено через 21 мин.: Заранее спасибо. Ссылка на комментарий
Artos 99 Опубликовано 7 Августа 2012 Поделиться Опубликовано 7 Августа 2012 Вампир35 1. Никак не получить, т.к. АМК-таймеры не имеют соответствующего интерфейса по доступу к ним. Ну а кто патался написать ... вероятно понимал, что проще и лучше написать свои таймеры заново, чем вставлять костыли "одряхлевшему" коду. 2. А не слышал о проблеме 2000-го года? Того же порядка, т.е. в принятом формате параметра не хватает разрядности и в какой-то момент наступает "переполнение"/сброс. В АМК-тайрах используется 32-х битный таймер game.time() и кол-во разрядов хватает на ... немного меньше месяца игрового времени. Далее наступает обнуление бахового времени и все "новые" таймеры будут заведомо с меньшим временем, чем те, которые были до "часа Х". Лечить таймеры в общем-то бессмысленно, т.к. эта ошибка присуща не только им а имеется во многих кодах игры и следует глобально поменять использование game.time() на 64-х битный вариант game.CTime() "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти