Индивидуальность или универсальность?, Элемент для своей системы респауна\спауна\гуляния монстров. |
Здравствуйте, гость ( Вход | Регистрация )
Индивидуальность или универсальность?, Элемент для своей системы респауна\спауна\гуляния монстров. |
Oct 27 2011, 10:47
Сообщение
#1
|
|
Level 6 Класс: Друид Характер: Chaotic Neutral Раса: Гном |
Сейчас в нашем мультиплеерном модуле работает следующая система:
Есть одинаковые по физическим параметрам Creature Objects (существа). Одинаковые в смысле того, что являются копиями одного ResRef, расставленными по локациям своего обитания (обычно, более одного экземпляра на локацию). Каждое из этих существ совершают псевдо периодическое движение по маршруту WayPoint-ов WP_CreatureTag_##, причём, маршрут движения у каждого экземпляра свой, чтобы они не мешали друг другу и не скучивались в одном месте. Достигнуто это следующим образом: после выставления существа в тулсете но до выставления его вэйпоинтов к его тэгу дописывается индивидуальный постфикс. Проблемки? Ога. А именно: Захотелось мне добавить определённому типу монстров фит, хитпоинт, скил, дубину, поменять клыки, шкуру, название, скриптсэт, аппирэнс и т.д., для чего я, отредактировав его в тулсэте, нажимаю "Мгновенное обновление", ведь руками расставлять все 2054 экземпляра лень. Естественно, индивидуальные постфиксы слетают. И опять-таки, руками туеву хучу тэгов менять лень. Что делать? Есть решение? Да, вот оно: В OnSpawn скрипте существ прописал кусок, который смотрит, соответствует ли тэг экземпляра его ResRef-у (если нет, значит менялся вручную). Если да, то скрипт считает, сколько таких существ в облости (area). Если больше 1, то нужно ввести индивидуальность. Делаем ему NewTag, такой что NewTag = Tag + "##", где ## каким-либо оброзом вычесленная порядковый номер существа. Если таковая замена произошла, сигнализируем об этом локальными переменными существа, для верности переносим в WP_NewTag_01 (если такого нет и если локальные переменные существа велят ему быть, а локальные переменые области позволяют ему быть - создаём этот вэйпоинт) и пускаем "по этапу". (Естественно скрипт выполняется только для тех существ, которые были в модуле изначально или создавались с моей палитры моими скриптами. Энкаунтерные существа и саммоны игнорят этот кусок.) Всё ж нормально, не? Кое-какие моменты остаются: 1. А как порядковый-то номер вичислить? Дело в том, что OnSpawn запускается каждым существом отдельно, и каждое существо нумерует своих собратьев по-разному. Многие хотят быть первыми. Пытался применять различные способы: по тэгу ближайшего вэйпоинта, по LocalInt-счётчику области или модуля, но всё равно случается возникать близнецам с одинаковыми именами (тобишь, тэгами). 2. Что делать с существами, которые вместо WalkWaypoints() гуляют RendomWalk()? Как добавить индивидуальность им (а-ля "точки рандомволка существа01 должны лежать не далее, чем нДистанс от плэйсайбл01)? 3. Создал новый тип существ. Ладно, так уж и быть, расставил 99999 экземпляров через шифт по областям. А вот 999999999 (по Х штук на каждое существо) вэйпоинтов ставить лень - они все с разными тэгами к тому же. Ноль-первый создастся сам, и на него будут возвращаться после сражения все наши объекты. Но по возвращении будут стоять истуканами. Как бы скриптом сгенерить ещё парочку вэйпоинов, да так чтобы они не лежали в стене, в костре, в яме, под столом, на столе? Сообщение отредактировал Anakondar - Oct 27 2011, 11:41 |
Oct 28 2011, 19:49
Сообщение
#2
|
|
Level 6 Класс: Друид Характер: Chaotic Neutral Раса: Гном |
Цитата Полностью решает, ибо для этого придуман. Там нужно ставить специальный флаг на прерывание спелла, и тот самый x2_inc_spellhook (заранее включённый во все спеллы и абилки) не даст скастовать. Во-первых где там? Если в GetLocalString(GetModule(), "X2_S_UD_SPELLSCRIPT"), то я про то же и сказал, что могу поставить туда свою проверку, которая выполнится и "зарежет" каст, если необходимо. Но если моя проверка каст не зарезала, то эффект заклинания, а вместе с ним и стандартная проверка возымеют место. Но хотелось бы исключить стандартную проверку вообще. Цитата В спеллхуке полиморф можно по спеллид спалить. Полиморф - один из примеров (самый простейший), где юзается стандартный лошадиный инклудинг. Моя задача не столько изменить полиморф (их всего 3 штуки), сколько вычленить использование всех функций из стандартного лошадиного инклудинга. Цитата Или можно бить пушкой по воробьям: экспортировать разом в модуль все стандартные скрипты, использующие инклюду, и делать билд модуля только для компиляции, чем, собственно, вы и занимались в ручном режиме.) Опять-таки, цель всего этого дела как раз избежать нагромаждения такого большого количества изменённых стандартных скриптов (итак уже с диалоговыми проверками за 1000 кол-во перевалило). Было бы не плохо просто изменить один только спелхук или добавить один только юзер_дефенд_спел_скрипт, но это либо не помогает совсем, либо далеко от идеала.
Сообщение отредактировал Anakondar - Oct 28 2011, 19:55 |
Текстовая версия | Сейчас: 26th September 2024 - 16:59 |